PageSourceSearch

https://www.uebergewicht-vorbeugen.de/_assets/0d62e471502069609893ac92d8c0f2d5/JavaScript/main.js?1789545311

js uebergewicht-vorbeugen.de collected 2026-09-24 19:22:51 UTC 1,640,732 bytes, 51,680 lines download raw bytes

1(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
2"use strict";
3
4var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
5Object.defineProperty(exports, "__esModule", {
6  value: true
7});
8exports.Form = void 0;
9var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
10var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
11var Form = exports.Form = /*#__PURE__*/function () {
12  function Form() {
13    (0, _classCallCheck2["default"])(this, Form);
14  }
15  return (0, _createClass2["default"])(Form, [{
16    key: "initialize",
17    value: function initialize() {
18      function rememberElement(el) {
19        if (!el.id) el.id = 'solr-focus-' + Date.now();
20        sessionStorage.setItem('solrLastFocus', '#' + el.id);
21      }
22
23      // focus on page load
24      var lastFocusSelector = sessionStorage.getItem('solrLastFocus');
25      if (lastFocusSelector) {
26        var el = document.querySelector(lastFocusSelector);
27        if (el) {
28          el.focus({
29            preventScroll: false
30          });
31          sessionStorage.removeItem('solrLastFocus');
32        }
33      }
34      var solrRoot = document.querySelector('.tx_solr');
35      if (!solrRoot) return;
36
37      // results-per-page select
38      solrRoot.querySelectorAll('select[name="tx_solr[resultsPerPage]"]').forEach(function (select) {
39        select.addEventListener('change', function () {
40          rememberElement(select);
41        });
42      });
43
44      // sorting dropdown
45      solrRoot.querySelectorAll('#tx-solr-sorting .dropdown-menu a').forEach(function (link) {
46        link.addEventListener('click', function () {
47          var _link$closest;
48          var toggle = (_link$closest = link.closest('#tx-solr-sorting')) === null || _link$closest === void 0 ? void 0 : _link$closest.querySelector('.dropdown-toggle');
49          if (toggle) rememberElement(toggle);
50        });
51      });
52    }
53  }]);
54}();
55
56},{"@babel/runtime/helpers/classCallCheck":13,"@babel/runtime/helpers/createClass":14,"@babel/runtime/helpers/interopRequireDefault":19}],2:[function(require,module,exports){
57"use strict";
58
59var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
60Object.defineProperty(exports, "__esModule", {
61  value: true
62});
63exports.ShareFlyOut = void 0;
64var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
65var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
66var ShareFlyOut = exports.ShareFlyOut = /*#__PURE__*/function () {
67  function ShareFlyOut() {
68    (0, _classCallCheck2["default"])(this, ShareFlyOut);
69  }
70  return (0, _createClass2["default"])(ShareFlyOut, [{
71    key: "initialize",
72    value: function initialize() {
73      var checkbox = document.getElementById('check');
74      var button = document.getElementById('button');
75      checkbox.addEventListener('change', function () {
76        if (checkbox.checked) {
77          button.title = "Social Media Links verbergen";
78        } else {
79          button.title = "Social Media Links anzeigen";
80        }
81      });
82    }
83  }]);
84}();
85
86},{"@babel/runtime/helpers/classCallCheck":13,"@babel/runtime/helpers/createClass":14,"@babel/runtime/helpers/interopRequireDefault":19}],3:[function(require,module,exports){
87"use strict";
88
89Object.defineProperty(exports, "__esModule", {
90  value: true
91});
92exports.swiperConfig = void 0;
93var swiperConfig = exports.swiperConfig = {
94  // Optional parameters
95  loop: true,
96  autoplay: {
97    delay: 5000
98  },
99  // If we need pagination
100  pagination: {
101    el: '.swiper-pagination',
102    clickable: true
103  },
104  // Navigation arrows
105  navigation: {
106    nextEl: '.swiper-button-next, .swiper-next',
107    prevEl: '.swiper-button-prev, .swiper-prev',
108    pausePlayButton: '.swiper-button-play-pause'
109  },
110  // Accessibility
111  a11y: {
112    prevSlideMessage: 'Vorherige Slide',
113    nextSlideMessage: 'Nächste Slide',
114    firstSlideMessage: 'Dies ist die erste Slide',
115    lastSlideMessage: 'Dies ist die letzte Slide',
116    paginationBulletMessage: 'Gehe zu Slide {{index}}',
117    slideLabelMessage: 'Slide {{index}} von {{slidesLength}}'
118  }
119};
120
121},{}],4:[function(require,module,exports){
122"use strict";
123
124var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
125Object.defineProperty(exports, "__esModule", {
126  value: true
127});
128exports.WcoSwiperSliderExtended = void 0;
129var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
130var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
131var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
132var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
133var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
134var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
135var _wcoSwiperSlider = require("@wco/wco-swiper-slider");
136function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
137function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
138function _superPropGet(t, o, e, r) { var p = (0, _get2["default"])((0, _getPrototypeOf2["default"])(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; }
139var WcoSwiperSliderExtended = exports.WcoSwiperSliderExtended = /*#__PURE__*/function (_WcoSwiperSlider) {
140  function WcoSwiperSliderExtended() {
141    (0, _classCallCheck2["default"])(this, WcoSwiperSliderExtended);
142    return _callSuper(this, WcoSwiperSliderExtended, arguments);
143  }
144  (0, _inherits2["default"])(WcoSwiperSliderExtended, _WcoSwiperSlider);
145  return (0, _createClass2["default"])(WcoSwiperSliderExtended, [{
146    key: "initialize",
147    value: function initialize() {
148      var _this = this;
149      var init = function init() {
150        var containers = document.querySelectorAll(_this.queryString);
151        containers.forEach(function (container) {
152          if (!container.classList.contains('swiper')) {
153            container.classList.add('swiper');
154          }
155        });
156        if (document.querySelector(_this.queryString)) {
157          if (_this.config.navigation.pausePlayButton) {
158            if (Array.isArray(_this.slider)) {
159              _this.slider.forEach(function (slider) {
160                _this.initPausePlayButton(slider);
161              });
162            } else if (_this.slider && _this.slider.el) {
163              _this.initPausePlayButton(_this.slider);
164            }
165            _this.playPauseButtons = document.querySelectorAll(_this.config.navigation.pausePlayButton);
166          }
167          if (_this.config.navigation.nextEl && _this.config.navigation.prevEl) {
168            var nextButtons = document.querySelectorAll(_this.config.navigation.nextEl);
169            nextButtons.forEach(function (nextBtn) {
170              nextBtn.addEventListener('click', function () {
171                var swiperContainer = nextBtn.closest('.swiper');
172                if (swiperContainer) {
173                  var swiperWrapper = swiperContainer.querySelector('.swiper-wrapper');
174                  if (swiperWrapper) {
175                    var swiperSlides = swiperWrapper.querySelectorAll('.swiper-slide');
176                    WcoSwiperSliderExtended.setLiveRegion(swiperSlides, swiperWrapper);
177                  }
178                }
179              });
180            });
181            var prevButtons = document.querySelectorAll(_this.config.navigation.prevEl);
182            prevButtons.forEach(function (prevBtn) {
183              prevBtn.addEventListener('click', function () {
184                var swiperContainer = prevBtn.closest('.swiper');
185                if (swiperContainer) {
186                  var swiperWrapper = swiperContainer.querySelector('.swiper-wrapper');
187                  if (swiperWrapper) {
188                    var swiperSlides = swiperWrapper.querySelectorAll('.swiper-slide');
189                    WcoSwiperSliderExtended.setLiveRegion(swiperSlides, swiperWrapper);
190                  }
191                }
192              });
193            });
194          }
195          var paginationBullets = document.querySelectorAll('.swiper-pagination-bullet');
196          paginationBullets.forEach(function (bullet) {
197            bullet.addEventListener('keydown', function (e) {
198              if (e.key === ' ') {
199                e.preventDefault();
200                bullet.click();
201              }
202            });
203          });
204        }
205        var updateSlideLinks = function updateSlideLinks(slider) {
206          var swiperSlides = slider.el.querySelectorAll('.swiper-slide');
207          swiperSlides.forEach(function (slide) {
208            var links = slide.querySelectorAll('a');
209            links.forEach(function (link) {
210              link.setAttribute('tabindex', slide.classList.contains('swiper-slide-active') ? '0' : '-1');
211            });
212          });
213        };
214        if (Array.isArray(_this.slider)) {
215          _this.slider.forEach(function (slider) {
216            updateSlideLinks(slider);
217            slider.on('slideChangeTransitionEnd', function () {
218              updateSlideLinks(slider);
219            });
220          });
221        } else if (_this.slider && _this.slider.el) {
222          updateSlideLinks(_this.slider);
223          _this.slider.on('slideChangeTransitionEnd', function () {
224            updateSlideLinks(_this.slider);
225          });
226        }
227      };
228      _superPropGet(WcoSwiperSliderExtended, "initialize", this, 3)([]);
229      if (document.readyState === 'loading') {
230        document.addEventListener('DOMContentLoaded', init);
231      } else {
232        init();
233      }
234    }
235  }, {
236    key: "initPausePlayButton",
237    value: function initPausePlayButton(slider) {
238      var pausePlayButton = slider.el.querySelector(this.config.navigation.pausePlayButton);
239      if (pausePlayButton) {
240        pausePlayButton.addEventListener('click', function () {
241          return WcoSwiperSliderExtended.togglePausePlayButton(slider, pausePlayButton);
242        });
243        pausePlayButton.addEventListener('keypress', function (e) {
244          if (e.key === 'Enter' || e.key === ' ') {
245            e.preventDefault();
246            WcoSwiperSliderExtended.togglePausePlayButton(slider, pausePlayButton);
247          }
248        });
249      }
250    }
251  }], [{
252    key: "togglePausePlayButton",
253    value: function togglePausePlayButton(slider, pausePlayButton) {
254      slider.el.classList.toggle("pause");
255      if (slider.el.classList.contains("pause")) {
256        slider.autoplay.stop();
257        pausePlayButton.setAttribute('aria-pressed', 'true');
258      } else {
259        slider.autoplay.start();
260        pausePlayButton.setAttribute('aria-pressed', 'false');
261      }
262    }
263  }, {
264    key: "setLiveRegion",
265    value: function setLiveRegion(swiperSlides, swiperWrapper) {
266      swiperSlides.forEach(function (swiperSlide) {
267        if (swiperWrapper.closest('.swiper-container').classList.contains("pause")) {
268          setTimeout(function () {
269            if (swiperSlide.classList.contains('swiper-slide-active')) {
270              swiperSlide.setAttribute('aria-live', 'polite');
271            } else {
272              swiperSlide.setAttribute('aria-live', 'off');
273            }
274          }, 100);
275        } else {
276          swiperSlide.setAttribute('aria-live', 'off');
277        }
278      });
279    }
280  }]);
281}(_wcoSwiperSlider.WcoSwiperSlider);
282
283},{"@babel/runtime/helpers/classCallCheck":13,"@babel/runtime/helpers/createClass":14,"@babel/runtime/helpers/get":16,"@babel/runtime/helpers/getPrototypeOf":17,"@babel/runtime/helpers/inherits":18,"@babel/runtime/helpers/interopRequireDefault":19,"@babel/runtime/helpers/possibleConstructorReturn":20,"@wco/wco-swiper-slider":92}],5:[function(require,module,exports){
284"use strict";
285
286var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
287Object.defineProperty(exports, "__esModule", {
288  value: true
289});
290exports.BackToTop = void 0;
291var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
292var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
293//** jQuery Scroll to Top Control script- (c) Dynamic Drive DHTML code library: http://www.dynamicdrive.com.
294//** Available/ usage terms at http://www.dynamicdrive.com (March 30th, 09')
295//** v1.1 (April 7th, 09'):
296//** 1) Adds ability to scroll to an absolute position (from top of page) or specific element on the page instead.
297//** 2) Fixes scroll animation not working in Opera.
298var BackToTop = exports.BackToTop = /*#__PURE__*/function () {
299  function BackToTop() {
300    (0, _classCallCheck2["default"])(this, BackToTop);
301  }
302  return (0, _createClass2["default"])(BackToTop, [{
303    key: "initialize",
304    value: function initialize() {
305      var scrolltotop = {
306        //startline: Integer. Number of pixels from top of doc scrollbar is scrolled before showing control
307        //scrollto: Keyword (Integer, or "Scroll_to_Element_ID"). How far to scroll document up when control is clicked on (0=top).
308        setting: {
309          startline: 100,
310          scrollto: 0,
311          scrollduration: 1000,
312          fadeduration: [500, 100]
313        },
314        controlHTML: '<i class="fa fa-chevron-up"></i>',
315        //HTML for control, which is auto wrapped in DIV w/ ID="topcontrol"
316        controlattrs: {
317          offsetx: 5,
318          offsety: 5,
319          zIndex: 1
320        },
321        //offset of control relative to right/ bottom of window corner
322        anchorkeyword: '#top',
323        //Enter href value of HTML anchors on the page that should also act as "Scroll Up" links
324        state: {
325          isvisible: false,
326          shouldvisible: false
327        },
328        containerElement: false,
329        scrollup: function scrollup() {
330          if (!this.cssfixedsupport)
331            //if control is positioned using JavaScript
332            this.$control.css({
333              opacity: 0
334            }); //hide control immediately after clicking it
335          var dest = isNaN(this.setting.scrollto) ? this.setting.scrollto : parseInt(this.setting.scrollto);
336          var tempDest = jQuery('#' + dest);
337          if (typeof dest == "string" && tempDest.length == 1)
338            //check element set by string exists
339            dest = tempDest.offset().top;else dest = 0;
340          this.$body.animate({
341            scrollTop: dest
342          }, this.setting.scrollduration, function () {
343            var main = document.querySelector('main');
344            if (main) {
345              main.focus({
346                preventScroll: true
347              });
348            }
349          });
350        },
351        keepfixed: function keepfixed() {
352          var $window = jQuery(window);
353          var controlx = $window.scrollLeft() + $window.width() - this.$control.width() - this.controlattrs.offsetx;
354          var controly = $window.scrollTop() + $window.height() - this.$control.height() - this.controlattrs.offsety;
355          this.$control.css({
356            left: controlx + 'px',
357            top: controly + 'px'
358          });
359        },
360        togglecontrol: function togglecontrol() {
361          var scrolltop = jQuery(window).scrollTop();
362          if (!this.cssfixedsupport) this.keepfixed();
363          this.state.shouldvisible = scrolltop >= this.setting.startline;
364          if (this.state.shouldvisible && !this.state.isvisible) {
365            this.$control.stop().animate({
366              opacity: 1
367            }, this.setting.fadeduration[0]).attr("aria-hidden", "false").attr("tabindex", "0");
368            this.state.isvisible = true;
369          } else if (this.state.shouldvisible == false && this.state.isvisible) {
370            this.$control.stop().animate({
371              opacity: 0
372            }, this.setting.fadeduration[1]).attr("aria-hidden", "true").attr("tabindex", "-1");
373            this.state.isvisible = false;
374          }
375        },
376        init: function init($) {
377          var $canvasContainer = $('body > div[canvas="container"]');
378          var mainobj = scrolltotop;
379          var iebrws = document.all;
380          var target = $(window);
381          if ($canvasContainer.length >= 1) {
382            // mainobj.$body = $canvasContainer;
383            // target = $canvasContainer;
384            // mainobj.controlattrs.offsetx = 25;
385          } else {
386            mainobj.$body = window.opera ? document.compatMode == "CSS1Compat" ? $('html') : $('body') : $('html,body');
387          }
388          mainobj.$body = window.opera ? document.compatMode == "CSS1Compat" ? $('html') : $('body') : $('html,body');
389          mainobj.cssfixedsupport = !iebrws || iebrws && document.compatMode == "CSS1Compat" && window.XMLHttpRequest; //not IE or IE7+ browsers in standards mode
390          mainobj.$control = $('<div id="topcontrol">' + mainobj.controlHTML + '</div>').css({
391            position: mainobj.cssfixedsupport ? 'fixed' : 'absolute',
392            bottom: mainobj.controlattrs.offsety,
393            right: mainobj.controlattrs.offsetx,
394            zIndex: 20,
395            opacity: 0,
396            cursor: 'pointer'
397          }).attr({
398            title: 'nach oben',
399            'aria-label': 'zurück nach oben',
400            'aria-hidden': 'true',
401            role: 'button',
402            tabindex: '-1'
403          }).click(function () {
404            mainobj.scrollup();
405            return false;
406          }).keydown(function (event) {
407            if (event.key === "Enter") {
408              mainobj.scrollup();
409              return false;
410            }
411          }).appendTo('body');
412          if (document.all && !window.XMLHttpRequest && mainobj.$control.text() != '')
413            //loose check for IE6 and below, plus whether control contains any text
414            mainobj.$control.css({
415              width: mainobj.$control.width()
416            }); //IE6- seems to require an explicit width on a DIV containing text
417          mainobj.togglecontrol();
418          $('a[href="' + mainobj.anchorkeyword + '"]').click(function () {
419            mainobj.scrollup();
420            return false;
421          });
422          target.bind('scroll resize', function (e) {
423            mainobj.togglecontrol();
424          });
425        }
426      };
427      scrolltotop.init($);
428    }
429  }]);
430}();
431
432},{"@babel/runtime/helpers/classCallCheck":13,"@babel/runtime/helpers/createClass":14,"@babel/runtime/helpers/interopRequireDefault":19}],6:[function(require,module,exports){
433"use strict";
434
435var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
436Object.defineProperty(exports, "__esModule", {
437  value: true
438});
439exports.CardGame = void 0;
440var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
441var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
442var _isotopeLayout = _interopRequireDefault(require("isotope-layout"));
443var CardGame = exports.CardGame = /*#__PURE__*/function () {
444  function CardGame() {
445    (0, _classCallCheck2["default"])(this, CardGame);
446    //Categorys
447    this.categorys = [{
448      name: 'Bewegungsspiele',
449      "class": 'bewegungsspiele',
450      iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Bewegungsspiele.svg',
451      iconAlt: 'Icon Person bewegt sich'
452    }, {
453      name: 'Spiel und Spaß',
454      "class": 'spiel-spass',
455      iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Spiel-und-Spass.svg',
456      iconAlt: 'Icon Zwei Emojis lächeln'
457    }, {
458      name: 'Entspannung fühlen',
459      "class": 'entspannung-fuehlen',
460      iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Entspannung-fuehlen.svg',
461      iconAlt: 'Icon Yin und Yang'
462    }, {
463      name: 'Den Körper fühlen',
464      "class": 'koerper-fuehlen',
465      iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Den-Koerper-fuehlen.svg',
466      iconAlt: 'Icon Mensch mit ausgestreckten Armen'
467    }, {
468      name: 'Gut für den Rücken',
469      "class": 'gut-fuer-ruecken',
470      iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Gut-fuer-den-Ruecken.svg',
471      iconAlt: 'Icon Mensch hält Rücken'
472    }, {
473      name: 'Kraft für den Bauch',
474      "class": 'kraft-fuer-bauch',
475      iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Kraft-fuer-den-Bauch.svg',
476      iconAlt: 'Icon Bauch'
477    }, {
478      name: 'Kopf und Nacken',
479      "class": 'kopf-nacken',
480      iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Kopf-und-Nacken.svg',
481      iconAlt: 'Icon Mensch hält seinen Kopf'
482    }, {
483      name: 'Nacken lockern',
484      "class": 'nacken-lockern',
485      iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Nacken-Lockern.svg',
486      iconAlt: 'Icon Kopf und Schultern von Mensch'
487    }, {
488      name: 'Starke Beine',
489      "class": 'starke-beine',
490      iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Starke-Beine.svg',
491      iconAlt: 'Icon Bein'
492    }, {
493      name: 'Starke Füsse',
494      "class": 'starke-fuesse',
495      iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Starke-Fuesse.svg',
496      iconAlt: 'Icon Fuß'
497    }, {
498      name: 'Kraft für die Arme',
499      "class": 'kraft-fuer-arme',
500      iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Kraft-fuer-die-Arme.svg',
501      iconAlt: 'Icon Arm von Mensch'
502    }, {
503      name: 'Kraft in den Schultern',
504      "class": 'kraft-in-schultern',
505      iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Kraft-in-den-Schultern.svg',
506      iconAlt: 'Icon Mensch streckt Arme nach oben'
507    }, {
508      name: 'Koordination',
509      "class": 'koordination',
510      iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Koordination.svg',
511      iconAlt: 'Icon Mensch bewegt sich'
512    }, {
513      name: 'Gleichgewicht',
514      "class": 'gleichgewicht',
515      iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Gleichgewicht.svg',
516      iconAlt: 'Icon Mensch hält Gleichgewicht'
517    }, {
518      name: 'Oberkörper dehnen',
519      "class": 'oberkoerper-dehnen',
520      iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Oberkoerper-dehnen.svg',
521      iconAlt: 'Icon Mensch dehnt Oberkörper'
522    }, {
523      name: 'Rücken und Beine dehnen',
524      "class": 'ruecken-beine-dehnen',
525      iconPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Icon-Ruecken-und-Beine-dehnen.svg',
526      iconAlt: 'Icon Mensch dehnt Beine'
527    }];
528
529    //Cards
530    this.cards = [{
531      category: 'Bewegungsspiele',
532      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Fang-mal.jpg',
533      imgAlt: 'Frau und Mädchen werfen sich etwas zu',
534      headline: 'Fang mal!',
535      id: 'bewegungsspiele-1',
536      text: "<ul>\n                        <li>2 Personen stehen sich gegen\xFCber</li>\n                        <li>Gegenstand mit beiden H\xE4nden werfen und wieder fangen</li>\n                    </ul>",
537      additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n                                    <ol>\n                                        <li>Einh\xE4ndig werfen und fangen</li>\n                                        <li>Einh\xE4ndig werfen und fangen mit Handwechsel\n                                            <ul>\n                                                <li>Ansage der Fanghand durch die werfende Person</li>\n                                                <li>Geschlossene Augen beim Fangen: Augen \xF6ffnen auf Zuruf der werfen\xADden Person</li>\n                                            </ul>\n                                        </li>\n                                    </ol>"
538    }, {
539      category: 'Bewegungsspiele',
540      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Spieglein-Spieglein.jpg',
541      imgAlt: 'Junge und Mädchen stehen sich gegenüber und Heben die Hand',
542      headline: 'Spieglein, Spieglein ...',
543      id: 'bewegungsspiele-2',
544      text: "<ul>\n                        <li>2 Personen stehen sich gegen\xFCber</li>\n                        <li>Person 1 ist der \u201ESpiegel\u201C und macht die Bewegungen von Person 2 seitenverkehrt nach</li>\n                        <li>Dann wechseln</li>\n                    </ul>",
545      additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n                                    <ol>\n                                        <li>Bewegungsbeispiele: Hand heben, Haare k\xE4mmen, an die Nase fassen, Arm ausstrecken, seitliche Schritte</li>\n                                        <li>Nur bestimmte K\xF6rperteile bewegen, z.B. Arme oder Beine</li>\n                                    </ol>"
546    }, {
547      category: 'Spiel und Spaß',
548      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Welches-Tier-bin-ich.jpg',
549      imgAlt: 'Mädchen immitiert ein Tier',
550      headline: 'Welches Tier bin ich?',
551      id: 'spiel-spass-1',
552      text: "<ul>\n                        <li>Person 1 stellt durch Bewegungen und ohne Worte ein Tier dar, bis Person 2 es err\xE4t</li>\n                        <li>Dann wechseln</li>\n                    </ul>",
553      additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n                                    <ol>\n                                        <li>Gegenst\xE4nde darstellen und erraten (z.B. Baum)</li>\n                                        <li>Bei Nichterraten eine Bewegung ausf\xFChren, z.B. 10-mal auf der Stelle h\xFCpfen</li>\n                                    </ol>"
554    }, {
555      category: 'Spiel und Spaß',
556      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Was-mache-ich.jpg',
557      imgAlt: 'Junge immitiert Bogenschießen',
558      headline: 'Was mache ich?',
559      id: 'spiel-spass-2',
560      text: "<ul>\n                        <li>Person 1 ahmt eine Sportart nach (z.B. Bogenschie\xDFen), bis Person 2 sie err\xE4t</li>\n                        <li>Dann wechseln</li>\n                    </ul>",
561      additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n                                    <ol>\n                                        <li>Ideen f\xFCr Sportarten: Skilanglauf, Tennis, Schwimmen, Basketball, Fu\xDFball</li>\n                                        <li>f)\tBei mehreren Personen:\n                                            <ul>\n                                                <li>Eine Person ahmt eine Sportart nach, mehrere Personen raten</li>\n                                                <li>Mehrere Personen ahmen eine Sportart nach, eine Person r\xE4t</li>\n                                            </ul>\n                                        </li>\n                                    </ol>"
562    }, {
563      category: 'Entspannung fühlen',
564      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Anspannen-entspannen.jpg',
565      imgAlt: 'Mann spannt seinen Körper an',
566      headline: 'Anspannen - entspannen',
567      id: 'entspannung-fuehlen-1',
568      text: "<ul>\n                        <li>Aufrecht stehen, Arme angewinkelt nah am K\xF6rper, H\xE4nde zu F\xE4usten ballen, Gesicht anspannen, bis 10 z\xE4hlen (dabei weiteratmen!), entspannen</li>\n                        <li>3-mal wiederholen</li>\n                    </ul>",
569      additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n                                    <ol>\n                                        <li>\xDCbung im Sitzen ausf\xFChren: Oberk\xF6rper bleibt aufrecht und angespannt, Arme liegen angewinkelt auf dem Tisch oder auf den Oberschenkeln</li>\n                                    </ol>"
570    }, {
571      category: 'Entspannung fühlen',
572      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Einatmen-ausatmen.jpg',
573      imgAlt: 'Mann atmet ein',
574      headline: 'Einatmen - ausatmen',
575      id: 'entspannung-fuehlen-2',
576      text: "<ul>\n                        <li>Aufrecht stehen</li>\n                        <li>Eine Hand auf den Oberbauch, eine Hand auf den unteren Bauch legen, tief ein- und wieder ausatmen</li>\n                        <li>5- bis 10-mal wiederholen</li>\n                    </ul>",
577      additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n                                    <ol>\n                                        <li>Ein- und Ausatmen in den Bauch (deutliches Heben und Senken der Bauchdecke) </li>\n                                        <li>\xDCbung im Sitzen ausf\xFChren</li>\n                                    </ol>"
578    }, {
579      category: 'Den Körper fühlen',
580      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Pizza-backen.jpg',
581      imgAlt: 'Mädchen massiert Frau am Rücken',
582      headline: 'Pizza backen',
583      id: 'koerper-fuehlen-1',
584      text: "<ul>\n                        <li>Person 1 steht aufrecht hinter der sitzenden Person 2</li>\n                        <li>Person 1 ahmt das Kneten eines Pizzateigs auf dem R\xFCcken von Person 2 nach</li>\n                        <li>Dann wechseln</li>\n                    </ul>",
585      additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n                                    <ol>\n                                        <li>Weitere Ideen: Ausrollen oder Belegen eines Pizzateigs, Schneiden von Gem\xFCse</li>\n                                    </ol>"
586    }, {
587      category: 'Den Körper fühlen',
588      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Abklopfen.jpg',
589      imgAlt: 'Mädchen Klopft seinen Arm ab',
590      headline: 'Abklopfen',
591      id: 'koerper-fuehlen-2',
592      text: "<ul>\n                        <li>Aufrecht sitzen, linken Arm ausstrecken und mit der rechten Handfl\xE4che von der Hand bis zur Schulter abklopfen und wieder zur\xFCck, dann Arm wechseln</li>\n                        <li>2-mal pro Seite</li>\n                    </ul>",
593      additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n                                    <ol>\n                                        <li>Mit kleinem Ball unter leichtem Druck \xFCber den Arm rollen</li>\n                                        <li>Andere K\xF6rperteile abklopfen, z.B. Oberschenkel</li>\n                                    </ol>"
594    }, {
595      category: 'Gut für den Rücken',
596      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Blitzhacker.jpg',
597      imgAlt: 'Junge und Frau sitzen gegenüber un hacken mit den Händen',
598      headline: 'Blitzhacker',
599      id: 'gut-fuer-ruecken-1',
600      text: "<ul>\n                        <li>2 Personen sitzen sich gegen\xFCber, Arme angewinkelt</li>\n                        <li>Mit den Unterarmen auf und ab \"hacken\", Oberarme bleiben am K\xF6rper, bis 10 z\xE4hlen</li>\n                        <li>2- bis 3-mal wiederholen</li>\n                    </ul>",
601      additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n                                    <ol>\n                                        <li>Hacker im Stehen ausf\xFChren</li>\n                                        <li>Hoch-Tief-Bewegungen mit unterschiedlicher Geschwindigkeit\xAD</li>\n                                    </ol>"
602    }, {
603      category: 'Gut für den Rücken',
604      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Tauchgang.jpg',
605      imgAlt: 'Mädchen sitz auf Stuh und berührt Zehen',
606      headline: 'Tauchgang',
607      id: 'gut-fuer-ruecken-2',
608      text: "<ul>\n                        <li>Aufrecht sitzen, den Oberk\xF6rper langsam nach vorn beugen, bis die Finger an den F\xFC\xDFen sind</li>\n                        <li>Wirbel f\xFCr Wirbel wieder aufrichten</li>\n                        <li>5-mal wiederholen</li>\n                    </ul>",
609      additionalInformation: ''
610    }, {
611      category: 'Kraft für den Bauch',
612      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Oberkoerper-drehen.jpg',
613      imgAlt: 'Mädchen sitzt auf Stuhl und dehnt Oberkörper',
614      headline: 'Oberkörper drehen',
615      id: 'kraft-fuer-bauch-1',
616      text: "<ul>\n                        <li>Aufrecht sitzen, Arme in Schulterh\xF6he anwinkeln und Oberk\xF6rper nach rechts und links drehen (die H\xFCfte bleibt stabil!)</li>\n                        <li>10-mal wiederholen</li>\n                    </ul>",
617      additionalInformation: ''
618    }, {
619      category: 'Kraft für den Bauch',
620      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Hueftkreisen.jpg',
621      imgAlt: 'Frau lässt die Hüften kreisen',
622      headline: 'Hüftkreisen',
623      id: 'kraft-fuer-bauch-2',
624      text: "<ul>\n                        <li>Aufrecht stehen, Knie leicht gebeugt, H\xE4nde auf den H\xFCften</li>\n                        <li>Die H\xFCften kreisen, 10-mal gegen den Uhrzeigersinn, dann andersherum</li>\n                    </ul>",
625      additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n                                    <ol>\n                                        <li>Arme beim Kreisen seitlich in H\xFCfth\xF6he anheben</li>\n                                    </ol>"
626    }, {
627      category: 'Kopf und Nacken',
628      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Schultern-abhoeren-.jpg',
629      imgAlt: 'Junge Sitzt auf Stuhl und neigt den Kopf',
630      headline: 'Schultern abhören',
631      id: 'kopf-nacken-1',
632      text: "<ul>\n                        <li>Aufrecht sitzen, Arme locker, linkes Ohr zur linken Schulter neigen, rechter Arm zieht aktiv zum Boden</li>\n                        <li>Bis 10 z\xE4hlen, l\xF6sen, entspannen und Seite wechseln</li>\n                        <li>3-mal je Seite</li>\n                    </ul>",
633      additionalInformation: ''
634    }, {
635      category: 'Kopf und Nacken',
636      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Starker-Nacken.jpg',
637      imgAlt: 'Frau sitzt auf Stuhl und streckt die Arme',
638      headline: 'Starker Nacken',
639      id: 'kopf-nacken-2',
640      text: "<ul>\n                        <li>Aufrecht sitzen, H\xE4nde hinter dem Kopf verschr\xE4nken</li>\n                        <li>H\xE4nde dr\xFCcken leicht gegen den Kopf, Nacken und Kopf bleiben gerade, bis 10 z\xE4hlen, l\xF6sen</li>\n                        <li>5-mal wiederholen</li>\n                    </ul>",
641      additionalInformation: ''
642    }, {
643      category: 'Nacken lockern',
644      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Schulterblick.jpg',
645      imgAlt: 'Mädchen sitzt auf Stuhl und lockert Nacken',
646      headline: 'Schulterblick',
647      id: 'nacken-lockern-1',
648      text: "<ul>\n                        <li>Aufrecht sitzen, Blick nach vorn</li>\n                        <li>Kopf langsam nach rechts drehen, dann nach links, der Blick geht jeweils \xFCber die Schulter</li>\n                        <li>5-mal wiederholen</li>\n                    </ul>",
649      additionalInformation: ''
650    }, {
651      category: 'Nacken lockern',
652      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Doppelkinn.jpg',
653      imgAlt: 'Mann sitzt auf Stuhl und beugt das Kinn',
654      headline: 'Doppelkinn',
655      id: 'nacken-lockern-2',
656      text: "<ul>\n                        <li>Aufrecht sitzen, Kinn in Richtung Brust, dann leicht nach hinten bewegen, Blick nach unten, Nacken strecken</li>\n                        <li>Bis 10 z\xE4hlen, Kopf anheben, Anspannung l\xF6sen</li>\n                        <li>5-mal wiederholen</li>\n                    </ul>",
657      additionalInformation: ''
658    }, {
659      category: 'Starke Beine',
660      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Hinsetzen-und-aufstehen.jpg',
661      imgAlt: 'Junge und Mann stehen von Bank auf',
662      headline: 'Hinsetzen und aufstehen',
663      id: 'starke-beine-1',
664      text: "<ul>\n                        <li>Aufrecht vor der Bank stehen, Oberk\xF6rper vorneigen und langsam hinsetzen, R\xFCcken aufrichten, wieder aufstehen</li>\n                        <li>Bis 10 z\xE4hlen, Kopf anheben, Anspannung l\xF6sen</li>\n                        <li>5- bis 10-mal wiederholen</li>\n                    </ul>",
665      additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n                                    <ol>\n                                        <li>Arme beim Aufstehen lang nach vorne strecken (F\xFC\xDFe in Schrittstellung)</li>\n                                        <li>Arme beim Aufstehen auf den Oberschenkeln abst\xFCtzen (F\xFC\xDFe parallel)\xAD</li>\n                                    </ol>"
666    }, {
667      category: 'Starke Beine',
668      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Marschieren.jpg',
669      imgAlt: 'Mädchen maschiert',
670      headline: 'Marschieren',
671      id: 'starke-beine-2',
672      text: "<ul>\n                        <li>Aufrecht stehen, Arme locker</li>\n                        <li>Abwechselnd die Knie anheben und auf der Stelle gehen, Arme schwingen gegengleich vor und zur\xFCck</li>\n                        <li>10-mal je Bein</li>\n                    </ul>",
673      additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n                                    <ol>\n                                        <li>Eine Strecke von 10 Schritten vorw\xE4rtsgehen</li>\n                                        <li>R\xFCckw\xE4rtsmarschieren\xAD</li>\n                                    </ol>"
674    }, {
675      category: 'Starke Füsse',
676      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Auf-Zehenspitzen.jpg',
677      imgAlt: 'Mädchen läuft auf Zehenspitzen',
678      headline: 'Auf Zehenspitzen',
679      id: 'starke-fuesse-1',
680      text: "<ul>\n                        <li>Aufrecht stehen, F\xFC\xDFe h\xFCftbreit</li>\n                        <li>Arme leicht zur Seite strecken, auf die Zehenspitzen stellen und jeweils 10 Schritte vor und zur\xFCck gehen</li>\n                        <li>2- bis 3-mal wiederholen</li>\n                    </ul>",
681      additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n                                    <ol>\n                                        <li>Auf den Zehenspitzen r\xFCckw\xE4rtsgehen</li>\n                                        <li>Eine mit Kreide aufgezeichnete oder gepflasterte Linie entlanggehen</li>\n                                    </ol>"
682    }, {
683      category: 'Starke Füsse',
684      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Fersen-lauf.jpg',
685      imgAlt: 'Junge läuft auf Fersen',
686      headline: 'Fersenlauf',
687      id: 'starke-fuesse-2',
688      text: "<ul>\n                        <li>Aufrecht stehen, F\xFC\xDFe h\xFCftbreit, Arme leicht zur Seite strecken</li>\n                        <li>Auf die Fersen stellen, Zehen anziehen und jeweils 10 Schritte vor und zur\xFCck gehen</li>\n                        <li>2- bis 3-mal wiederholen</li>\n                    </ul>",
689      additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n                                    <ol>\n                                        <li>Auf den Fersen r\xFCckw\xE4rtsgehen</li>\n                                        <li>Eine mit Kreide aufgezeichnete oder gepflasterte Linie entlanggehen</li>\n                                    </ol>"
690    }, {
691      category: 'Kraft für die Arme',
692      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Heben-und-halten.jpg',
693      imgAlt: 'Mädchen und Frau heben Dinge hoch',
694      headline: 'Heben und halten',
695      id: 'kraft-fuer-arme-1',
696      text: "<ul>\n                        <li>Aufrecht stehen, Arme ausstrecken und mit beiden H\xE4nden einen Gegenstand 5- bis 10-mal auf Schulterh\xF6he anheben, langsam wieder zur\xFCck, entspannen</li>\n                        <li>5-mal wiederholen</li>\n                    </ul>",
697      additionalInformation: "<h5>
697Welche M\xF6glichkeiten gibt es?</h5>\n                                    <ol>\n                                        <li>Gegenstand mit nur einer Hand anheben</li>\n                                        <li>Gegenst\xE4nde rechts und links im Wechsel anheben</li>\n                                    </ol>"
698    }, {
699      category: 'Kraft für die Arme',
700      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Liegestuetz-im-Stehen.jpg',
701      imgAlt: 'Mädchen und Mann machen Liegestütze an einem Baum',
702      headline: 'Liegestütz im Stehen',
703      id: 'kraft-fuer-arme-2',
704      text: "<ul>\n                        <li>Eine Arml\xE4nge vor einen Baum (oder eine Wand) stellen, H\xE4nde in Schulterh\xF6he aufsetzen</li>\n                        <li>Arme beugen, Kopf in Richtung Baum, wegdr\xFCcken</li>\n                        <li>5-mal wiederholen</li>\n                    </ul>",
705      additionalInformation: ''
706    }, {
707      category: 'Kraft in den Schultern',
708      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Schultern-heben.jpg',
709      imgAlt: 'Frau hebt ihre Schultern',
710      headline: 'Schultern heben',
711      id: 'kraft-in-schultern-1',
712      text: "<ul>\n                        <li>Aufrecht stehen, Arme locker</li>\n                        <li>Schultern Richtung Ohren anheben, Hals bleibt gerade, bis 10 z\xE4hlen, entspannen</li>\n                        <li>5-mal wiederholen</li>\n                    </ul>",
713      additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n                                    <ol>\n                                        <li>\xDCbung im Sitzen durchf\xFChren</li>\n                                    </ol>"
714    }, {
715      category: 'Kraft in den Schultern',
716      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Windmuehle.jpg',
717      imgAlt: 'Mädchen und Mann machen mit dem Armen eine Windmühle',
718      headline: 'Windmühle',
719      id: 'kraft-in-schultern-2',
720      text: "<ul>\n                        <li>Aufrecht stehen, Arme locker</li>\n                        <li>Linken Arm nach oben, rechten Arm nach unten strecken, von vorn nach hinten kreisen</li>\n                        <li>In beide Richtungen 5- bis 10-mal kreisen</li>\n                    </ul>",
721      additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n                                    <ol>\n                                        <li>Beim Schulterkreisen Arme locker seitlich herunterh\xE4ngen lassen</li>\n                                    </ol>"
722    }, {
723      category: 'Koordination',
724      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Werfen-und-fangen.jpg',
725      imgAlt: 'Junge wirft etwas hoch',
726      headline: 'Werfen und fangen',
727      id: 'koordination',
728      text: "<ul>\n                        <li>Aufrecht stehen</li>\n                        <li>Einen leichten Gegenstand hochwerfen und mit derselben Hand wieder auffangen, dann wechseln</li>\n                        <li>5-mal je Hand</li>\n                    </ul>",
729      additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n                                    <ol>\n                                        <li>Gegenstand nach oben werfen, dann Handfl\xE4che nach unten drehen und Gegenstand von oben greifen</li>\n                                    </ol>"
730    }, {
731      category: 'Koordination',
732      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Flugbahn.jpg',
733      imgAlt: 'Junge wirft etwas zu einem Mann',
734      headline: 'Flugbahn',
735      id: 'koordination',
736      text: "<ul>\n                        <li>2 Personen stehen mit dem R\xFCcken zueinander, 2 bis 3 Schritte Abstand</li>\n                        <li>Person 1 wirft den Gegenstand nach hinten, Person 2 f\xE4ngt ihn auf und wirft ihn zur\xFCck</li>\n                        <li>5-mal wiederholen</li>\n                    </ul>",
737      additionalInformation: "<h5>
737Welche M\xF6glichkeiten gibt es?</h5>\n                                    <ol>\n                                        <li>Auf Zuruf werfen, z.B. \u201EFang!\u201C</li>\n                                        <li>Auf \u201E1, 2, 3\u201C zuwerfen</li>\n                                    </ol>"
738    }, {
739      category: 'Gleichgewicht',
740      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Gaenseschritte.jpg',
741      imgAlt: 'Frau geht in Gänseschritten',
742      headline: 'Gänseschritte',
743      id: 'gleichgewicht-1',
744      text: "<ul>\n                        <li>Aufrecht stehen, Knie leicht gebeugt, Arme seitlich ausstrecken</li>\n                        <li>Einen Fu\xDF vor den anderen setzen, Ferse direkt an Fu\xDFspitze, 10 Schritte vor, 10 zur\xFCck</li>\n                        <li>3-mal wiederholen</li>\n                    </ul>",
745      additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n                                    <ol>\n                                        <li>R\xFCckw\xE4rtsgehen</li>\n                                        <li>Eine mit Kreide aufgezeichnete oder gepflasterte Linie entlanggehen</li>\n                                    </ol>"
746    }, {
747      category: 'Gleichgewicht',
748      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Auf-einem-Bein-stehen.jpg',
749      imgAlt: 'Mädchen steht auf einem Bein',
750      headline: 'Auf einem Bein stehen',
751      id: 'gleichgewicht-2',
752      text: "<ul>\n                        <li>Aufrecht stehen, rechtes Bein mit angezogener Fu\xDFspitze seitlich nach oben heben, bis 10 z\xE4hlen, entspannen, dann Seitenwechsel</li>\n                        <li>3-mal je Bein</li>\n                    </ul>",
753      additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n                                    <ol>\n                                        <li>Bein im H\xFCftgelenk vor- und zur\xFCck\xADpendeln</li>\n                                        <li>Mit dem angehobenen Fu\xDF eine 8 zeichnen</li>\n                                    </ol>"
754    }, {
755      category: 'Oberkörper dehnen',
756      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Schultern-dehnen.jpg',
757      imgAlt: 'Frau dehnt ihre Schultern',
758      headline: 'Schultern dehnen',
759      id: 'oberkoerper-dehnen-1',
760      text: "<ul>\n                        <li>Linken Arm \xFCber rechte Schulter f\xFChren und mit rechter Hand gegen linken Ellenbogen dr\xFCcken, bis die Dehnung sp\xFCrbar ist, bis 10 z\xE4hlen, dann l\xF6sen</li>\n                        <li>2- bis 3-mal je Arm</li>\n                    </ul>",
761      additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n                                    <ol>\n                                        <li>\xDCbung im Sitzen ausf\xFChren</li>\n                                    </ol>"
762    }, {
763      category: 'Oberkörper dehnen',
764      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Seiten-dehnen.jpg',
765      imgAlt: 'Mädchen dehnt ihre Seiten',
766      headline: 'Seiten dehnen',
767      id: 'oberkoerper-dehnen-1',
768      text: "<ul>\n                        <li>Arme \xFCber den Kopf strecken, Handfl\xE4chen zusammen, Oberk\xF6rper nach rechts beugen, bis 10 z\xE4hlen, aufrichten und l\xF6sen</li>\n                        <li>2- bis 3-mal je Seite</li>\n                    </ul>",
769      additionalInformation: "<h5>Welche M\xF6glichkeiten gibt es?</h5>\n                                    <ol>\n                                        <li>\xDCbung im Sitzen ausf\xFChren</li>\n                                    </ol>"
770    }, {
771      category: 'Rücken und Beine dehnen',
772      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Ruecken-dehnen.jpg',
773      imgAlt: 'Mädchen dehnt ihren Rücken',
774      headline: 'Rücken dehnen',
775      id: 'ruecken-beine-dehnen-1',
776      text: "<ul>\n                        <li>Aufrecht sitzen, H\xE4nde verschr\xE4nken</li>\n                        <li>Handfl\xE4chen nach au\xDFen drehen, Arme ausstrecken, Oberk\xF6rper langsam nach vorn neigen, bis 10 z\xE4hlen, aufrichten</li>\n                        <li>2- bis 3-mal wiederholen</li>\n                    </ul>",
777      additionalInformation: ''
778    }, {
779      category: 'Rücken und Beine dehnen',
780      imgPath: '/fileadmin/user_upload/kinderuebergewicht/bilder/2_content/kartenspiel_wer_hat_den_muskelkater/Kartenspiel-Muskelkater-Beine-dehnen.jpg',
781      imgAlt: 'Frau dehnt ihre',
782      headline: 'Beine dehnen',
783      id: 'ruecken-beine-dehnen-2',
784      text: "<ul>\n                        <li>Aufrecht sitzen, ein Bein nach vorn strecken, Ferse aufsetzen, Fu\xDFspitze anziehen oder strecken, bis 10 z\xE4hlen, entspannen</li>\n                        <li>2- bis 3-mal je Bein</li>\n                    </ul>",
785      additionalInformation: ''
786    }];
787
788    //Columns
789    this.cardContainer = document.querySelector('.cardgame .grid');
790  }
791
792  //Render cards
793  return (0, _createClass2["default"])(CardGame, [{
794    key: "renderCards",
795    value: function renderCards(cardArray) {
796      var _this = this;
797      if (!this.cardContainer) {
798        return;
799      }
800      cardArray.forEach(function (card) {
801        var cardElement = document.createElement('div');
802        var category = _this.categorys.filter(function (category) {
803          return category.name === card.category;
804        })[0];
805        cardElement.classList.add('grid-item', category["class"], 'game-card');
806        cardElement.innerHTML = "\n            <div class=\"card\" role=\"button\" tabindex=\"0\">\n                <div class=\"front\" style=\"--position: 3\">\n                    <div class=\"card-header\">\n                        <h4>".concat(category.name, "</h4>\n                        <img src=\"").concat(category.iconPath, "\" alt=\"").concat(category.iconAlt, "\" width=\"30px\" height=\"30px\">\n                    </div>\n                    <img class=\"card-img\" src=\"").concat(card.imgPath, "\" alt=\"").concat(card.imgAlt, "\">\n                    <h3>").concat(card.headline, "</h3>\n                </div>\n            </div>\n            <div class=\"modal hidden\" tabindex=\"-1\" role=\"dialog\">\n                <div class=\"modal-dialog\" role=\"document\">\n                    <div class=\"modal-content\">\n                        <div class=\"modal-header\">\n                            <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Kartenansicht Schlie\xDFen\" tabindex=\"0\">\n                                <span aria-hidden=\"true\">&times;</span>\n                            </button>\n                        </div>\n                        <div class=\"modal-body\">\n                            <div class=\"card\" role=\"button\">\n                                <div class=\"front\" style=\"--position: 3\">\n                                    <div class=\"card-header\">\n                                        <h4>").concat(category.name, "</h4>\n                                        <img src=\"").concat(category.iconPath, "\" alt=\"").concat(category.iconAlt, "\" width=\"30px\" height=\"30px\">\n                                    </div>\n                                    <img class=\"card-img\" src=\"").concat(card.imgPath, "\" alt=\"").concat(card.imgAlt, "\">\n                                    <h3>").concat(card.headline, "</h3>\n                                </div>\n                            </div>\n                            <div class=\"card\" role=\"button\">\n                                <div class=\"back\" style=\"--position: 3\">\n                                    <div class=\"card-header\">\n                                        <h4>").concat(category.name, "</h4>\n                                        <img src=\"").concat(category.iconPath, "\" alt=\"").concat(category.iconAlt, "\" width=\"30px\" height=\"30px\">\n                                    </div>\n                                    <img class=\"card-img\" src=\"").concat(card.imgPath, "\" alt=\"").concat(card.imgAlt, "\">\n                                    <h5>").concat(card.headline, "</h5>\n                                    ").concat(card.text, "\n                                </div>\n                            </div>\n                            <div class=\"additional-information\">\n                                ").concat(card.additionalInformation, "\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        ");
807        _this.cardContainer.append(cardElement);
808      });
809    }
810  }, {
811    key: "initialize",
812    value: function initialize() {
813      if (!this.cardContainer) {
814        return;
815      }
816      this.renderCards(this.cards);
817      var gridElem = this.cardContainer;
818      var isFilterActive = false;
819
820      //Open Modal on click
821      document.querySelectorAll('.card').forEach(function (card) {
822        function handleCardAction() {
823          card.nextElementSibling.classList.toggle('hidden');
824
825          // Add Offset
826          var offset = Math.round(gridElem.getBoundingClientRect().top) * -1;
827          var modalDialog = card.parentElement.querySelector('.modal-dialog');
828          if (offset <= 0) {
829            modalDialog.style.cssText = '--offset: 0px';
830          } else {
831            modalDialog.style.cssText = "--offset: ".concat(offset, "px");
832          }
833
834          // Add Offset
835          if (isFilterActive) {
836            gridElem.style.cssText = "--modal-height: ".concat(modalDialog.clientHeight + 50, "px");
837          }
838        }
839
840        // Event listener for click
841        card.addEventListener('click', handleCardAction);
842
843        // Event listener for keydown
844        card.addEventListener('keydown', function (event) {
845          if (event.key === 'Enter' || event.keyCode === 13) {
846            handleCardAction();
847          }
848        });
849      });
850
851      //Hide modal on close
852      document.querySelectorAll('.cardgame .modal button').forEach(function (button) {
853        button.addEventListener('click', function () {
854          var modal = button.closest('.modal');
855          modal.classList.toggle('hidden');
856          if (isFilterActive) {
857            gridElem.style.cssText = "--modal-height: auto";
858          }
859        });
860      });
861
862      //Check if filter is active
863      var buttonGroup = document.querySelector('.filter-button-group');
864      if (buttonGroup) {
865        buttonGroup.childNodes.forEach(function (button) {
866          button.addEventListener('click', function (event) {
867            if (button.getAttribute('data-filter') === '*') {
868              isFilterActive = false;
869            } else {
870              isFilterActive = true;
871            }
872          });
873        });
874      }
875
876      // Initialize Isotope
877      var iso = new _isotopeLayout["default"](gridElem, {
878        itemSelector: '.grid-item',
879        layoutMode: 'fitRows'
880      });
881
882      // Filtering functionality
883      if (buttonGroup) {
884        buttonGroup.addEventListener('click', function (event) {
885          if (!matchesSelector(event.target, 'button')) return;
886          var filterValue = event.target.getAttribute('data-filter');
887          iso.arrange({
888            filter: filterValue
889          });
890
891          // Handle active state of buttons
892          var buttons = buttonGroup.querySelectorAll('button');
893          buttons.forEach(function (button) {
894            button.classList.remove('is-checked');
895          });
896          event.target.classList.add('is-checked');
897        });
898      }
899
900      // Helper function for event delegation
901      function matchesSelector(elem, selector) {
902        var fn = elem.matches || elem.msMatchesSelector || elem.webkitMatchesSelector;
903        if (fn) {
904          return fn.call(elem, selector);
905        } else {
906          return false;
907        }
908      }
909    }
910  }]);
911}();
912
913},{"@babel/runtime/helpers/classCallCheck":13,"@babel/runtime/helpers/createClass":14,"@babel/runtime/helpers/interopRequireDefault":19,"isotope-layout":32}],7:[function(require,module,exports){
914"use strict";
915
916var _backToTop = require("./back-to-top");
917var _cardGame = require("./cardGame");
918var _mainNav = require("./mainNav");
919var _WcoSwiperSliderExtended = require("./SwiperSlider/WcoSwiperSliderExtended");
920var _SwiperConfig = require("./SwiperSlider/SwiperConfig");
921var _responsiveImagemap = require("./responsiveImagemap");
922var _topOffCanvasSearch = require("./topOffCanvasSearch");
923var _wcoMediaconsent = require("@wco/wco-mediaconsent");
924var _wcoBmiCalculator = require("@wco/wco-bmi-calculator");
925var _wcoBzgaMethodenfinder = require("@wco/wco-bzga-methodenfinder");
926var _ShareFlyOut = require("./ShareFlyOut");
927var _wcoBitvForms = require("@wco/wco-bitv-forms");
928var _Form = require("./Form");
929/**
930 * Load jQuery into global `$` for plugin usage
931 * @type {jQuery}
932 */
933window.$ = window.jQuery = require('jquery');
934require('@accessible360/accessible-slick'); // Carousel plugin
935require('bootstrap'); // Bootstrap
936require('superfish');
937require('devbridge-autocomplete'); // jquery-autocomplete
938
939new _WcoSwiperSliderExtended.WcoSwiperSliderExtended('.swiper-container', _SwiperConfig.swiperConfig).initialize();
940$(document).ready(function () {
941  new _backToTop.BackToTop().initialize();
942  new _mainNav.MainNav().initialize();
943  new _responsiveImagemap.ResponsiveImagemap().initialize();
944  new _topOffCanvasSearch.TopOffCanvasSearch().initialize();
945  new _wcoMediaconsent.WcoMediaconsent().initialize();
946  new _wcoBmiCalculator.WcoBmiCalculator().initialize();
947  new _ShareFlyOut.ShareFlyOut().initialize();
948  new _wcoBitvForms.WcoBitvForm().initialize();
949  new _Form.Form().initialize();
950  new _wcoBzgaMethodenfinder.WcoBzgaMethodenfinder().initialize();
951  new _cardGame.CardGame().initialize();
952});
953
954},{"./Form":1,"./ShareFlyOut":2,"./SwiperSlider/SwiperConfig":3,"./SwiperSlider/WcoSwiperSliderExtended":4,"./back-to-top":5,"./cardGame":6,"./mainNav":8,"./responsiveImagemap":9,"./topOffCanvasSearch":10,"@accessible360/accessible-slick":11,"@wco/wco-bitv-forms":44,"@wco/wco-bmi-calculator":51,"@wco/wco-bzga-methodenfinder":58,"@wco/wco-mediaconsent":81,"bootstrap":26,"devbridge-autocomplete":28,"jquery":38,"superfish":43}],8:[function(require,module,exports){
955"use strict";
956
957var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
958Object.defineProperty(exports, "__esModule", {
959  value: true
960});
961exports.MainNav = void 0;
962var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
963var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
964var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
965var MainNav = exports.MainNav = /*#__PURE__*/function () {
966  function MainNav() {
967    (0, _classCallCheck2["default"])(this, MainNav);
968    (0, _defineProperty2["default"])(this, "keyboardClose", false);
969  }
970  return (0, _createClass2["default"])(MainNav, [{
971    key: "initialize",
972    value: function initialize() {
973      var _this = this;
974      var $nav = $('#mainNav');
975      var navContainer = document.querySelector('.navbar-mainnavigation');
976      if ($nav.length === 0) return;
977      $nav.superfish({
978        delay: 0,
979        speed: 'fast',
980        speedOut: 1
981      });
982      this.syncAriaExpanded($nav);
983      this.addEscapeKeyListener($nav, navContainer);
984
985      // Sperre aufheben (Maus)
986      $nav.find('> li').on('mouseenter', function () {
987        _this.keyboardClose = false;
988        if (navContainer) navContainer.classList.remove('dropdown-closed');
989      });
990
991      // Sperre aufheben (Tastatur)
992      $nav.on('keydown', function (e) {
993        if (e.key !== 'Tab') return;
994        _this.keyboardClose = false;
995        if (navContainer) {
996          navContainer.classList.remove('dropdown-closed');
997        }
998      });
999      if (navContainer) {
1000        navContainer.addEventListener('mouseleave', function () {
1001          _this.keyboardClose = false;
1002          navContainer.classList.remove('dropdown-closed');
1003        });
1004        document.addEventListener('mousedown', function () {
1005          _this.keyboardClose = false;
1006          navContainer.classList.remove('dropdown-closed');
1007        });
1008      }
1009    }
1010  }, {
1011    key: "syncAriaExpanded",
1012    value: function syncAriaExpanded($nav) {
1013      $nav.find('> li').each(function (index, li) {
1014        var $li = $(li);
1015        var $link = $li.children('a').first();
1016        if ($link.length === 0) return;
1017        $link.attr('aria-expanded', 'false');
1018        var observer = new MutationObserver(function () {
1019          var isOpen = $li.hasClass('sfHover');
1020          $link.attr('aria-expanded', isOpen ? 'true' : 'false');
1021        });
1022        observer.observe(li, {
1023          attributes: true,
1024          attributeFilter: ['class']
1025        });
1026      });
1027    }
1028  }, {
1029    key: "addEscapeKeyListener",
1030    value: function addEscapeKeyListener($nav, navContainer) {
1031      var _this2 = this;
1032      document.addEventListener('keydown', function (event) {
1033        if (event.key === 'Escape' || event.key === 'Esc') {
1034          var $openLi = $nav.find('> li.sfHover');
1035          if ($openLi.length > 0) {
1036            event.preventDefault();
1037
1038            // Merken, dass Dropdown geschlossen wurde
1039            // Anschließendes Tab darf es nicht sofort wieder öffnen
1040            _this2.keyboardClose = true;
1041            if (navContainer) {
1042              navContainer.classList.add('dropdown-closed');
1043            }
1044            var focusInsideSubmenu = $openLi.find('a:focus').length > 0;
1045            if (focusInsideSubmenu) {
1046              var $triggerLink = $openLi.children('a').first();
1047              if ($triggerLink.length > 0) {
1048                // Fokus zurück auf trigger link
1049                $triggerLink.focus();
1050                $nav.superfish('hide', true);
1051                $openLi.removeClass('sfHover');
1052              }
1053            } else {
1054              $nav.superfish('hide', true);
1055              $openLi.removeClass('sfHover');
1056            }
1057          }
1058        }
1059      });
1060    }
1061  }]);
1062}();
1063
1064},{"@babel/runtime/helpers/classCallCheck":13,"@babel/runtime/helpers/createClass":14,"@babel/runtime/helpers/
1064defineProperty":15,"@babel/runtime/helpers/interopRequireDefault":19}],9:[function(require,module,exports){
1065"use strict";
1066
1067var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
1068Object.defineProperty(exports, "__esModule", {
1069  value: true
1070});
1071exports.ResponsiveImagemap = void 0;
1072var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
1073var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
1074var ResponsiveImagemap = exports.ResponsiveImagemap = /*#__PURE__*/function () {
1075  function ResponsiveImagemap() {
1076    (0, _classCallCheck2["default"])(this, ResponsiveImagemap);
1077  }
1078  return (0, _createClass2["default"])(ResponsiveImagemap, [{
1079    key: "initialize",
1080    value: function initialize() {
1081      //  $('img[usemap]').rwdImageMaps();
1082      $('#Bewegungszeiten area').on('click', function () {
1083        $($(this).attr('href')).find('.collapse').collapse('show');
1084      });
1085    }
1086  }]);
1087}();
1088
1089},{"@babel/runtime/helpers/classCallCheck":13,"@babel/runtime/helpers/createClass":14,"@babel/runtime/helpers/interopRequireDefault":19}],10:[function(require,module,exports){
1090"use strict";
1091
1092var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
1093Object.defineProperty(exports, "__esModule", {
1094  value: true
1095});
1096exports.TopOffCanvasSearch = void 0;
1097var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
1098var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
1099var TopOffCanvasSearch = exports.TopOffCanvasSearch = /*#__PURE__*/function () {
1100  function TopOffCanvasSearch() {
1101    (0, _classCallCheck2["default"])(this, TopOffCanvasSearch);
1102  }
1103  return (0, _createClass2["default"])(TopOffCanvasSearch, [{
1104    key: "initialize",
1105    value: function initialize() {
1106      $('.top-search-toggle').on('click', function (event) {
1107        // Stop default action and bubbling
1108        event.stopPropagation();
1109        event.preventDefault();
1110        $(".top-off-canvas-search").toggleClass('slideOpen');
1111        $(".top-off-canvas-search").slideToggle();
1112        if ($(".top-off-canvas-search").hasClass('slideOpen')) {
1113          $(".top-off-canvas-search .tx-solr-q").focus();
1114        }
1115      });
1116      $(".top-off-canvas-search .close-search").on("click", function () {
1117        $(".top-off-canvas-search").removeClass('slideOpen');
1118        $(".top-off-canvas-search").slideUp();
1119      });
1120      $('.top-off-canvas-search .input-group-addon.search-button').on('click', function (event) {
1121        $(this).parents('form').submit();
1122      });
1123    }
1124  }]);
1125}();
1126
1127},{"@babel/runtime/helpers/classCallCheck":13,"@babel/runtime/helpers/createClass":14,"@babel/runtime/helpers/interopRequireDefault":19}],11:[function(require,module,exports){
1128/*
1129       (accessible)
1130     _ _      _       _
1131 ___| (_) ___| | __  (_)___
1132/ __| | |/ __| |/ /  | / __|
1133\__ \ | | (__|   < _ | \__ \
1134|___/_|_|\___|_|\_(_)/ |___/
1135                   |__/
1136
1137 Version: [email protected]
1138  Author: Jason Webb (Accessible360)
1139 Website: https://accessible360.com
1140    Docs: https://accessible360.github.io/accessible-slick
1141    Repo: https://github.com/Accessible360/accessible-slick
1142  Issues: https://github.com/Accessible360/accessible-slick/issues
1143
1144 */
1145/* global window, document, define, jQuery, setInterval, clearInterval */
1146;(function(factory) {
1147    'use strict';
1148    if (typeof define === 'function' && define.amd) {
1149        define(['jquery'], factory);
1150    } else if (typeof exports !== 'undefined') {
1151        module.exports = factory(require('jquery'));
1152    } else {
1153        factory(jQuery);
1154    }
1155
1156}(function($) {
1157    'use strict';
1158    var Slick = window.Slick || {};
1159
1160    Slick = (function() {
1161
1162        var instanceUid = 0;
1163
1164        function Slick(element, settings) {
1165
1166            var _ = this, dataSettings;
1167
1168            _.defaults = {
1169                adaptiveHeight: false,
1170                appendArrows: $(element),
1171                appendDots: $(element),
1172                arrows: true,
1173                arrowsPlacement: null,
1174                asNavFor: null,
1175                prevArrow: '<button class="slick-prev" type="button">'
1176                            + '<span class="slick-prev-icon" aria-hidden="true"></span>'
1177                            + '<span class="slick-sr-only">Previous</span>'
1178                         + '</button>',
1179                nextArrow: '<button class="slick-next" type="button">'
1180                            + '<span class="slick-next-icon" aria-hidden="true"></span>'
1181                            + '<span class="slick-sr-only">Next</span>'
1182                         + '</button>',
1183                autoplay: false,
1184                autoplaySpeed: 3000,
1185                centerMode: false,
1186                centerPadding: '50px',
1187                cssEase: 'ease',
1188                customPaging: function(slider, i) {
1189                    return $('<button type="button">'
1190                                + '<span class="slick-dot-icon" aria-hidden="true"></span>'
1191                                + '<span class="slick-sr-only">Go to slide ' + (i+1) + '</span>'
1192                            + '</button>');
1193                },
1194                dots: false,
1195                dotsClass: 'slick-dots',
1196                draggable: true,
1197                easing: 'linear',
1198                edgeFriction: 0.35,
1199                fade: false,
1200                infinite: true,
1201                initialSlide: 0,
1202                instructionsText: null,
1203                lazyLoad: 'ondemand',
1204                mobileFirst: false,
1205                playIcon: '<span class="slick-play-icon" aria-hidden="true"></span>',
1206                pauseIcon: '<span class="slick-pause-icon" aria-hidden="true"></span>',
1207                pauseOnHover: true,
1208                pauseOnFocus: true,
1209                pauseOnDotsHover: false,
1210                regionLabel: 'carousel',
1211                respondTo: 'window',
1212                responsive: null,
1213                rows: 1,
1214                rtl: false,
1215                slide: '',
1216                slidesPerRow: 1,
1217                slidesToShow: 1,
1218                slidesToScroll: 1,
1219                speed: 500,
1220                swipe: true,
1221                swipeToSlide: false,
1222                touchMove: true,
1223                touchThreshold: 5,
1224                useAutoplayToggleButton: true,
1225                useCSS: true,
1226                useGroupRole: true,
1227                useTransform: true,
1228                variableWidth: false,
1229                vertical: false,
1230                verticalSwiping: false,
1231                waitForAnimate: true,
1232                zIndex: 1000
1233            };
1234
1235            _.initials = {
1236                animating: false,
1237                dragging: false,
1238                autoPlayTimer: null,
1239                currentDirection: 0,
1240                currentLeft: null,
1241                currentSlide: 0,
1242                direction: 1,
1243                $dots: null,
1244                $instructionsText: null,
1245                listWidth: null,
1246                listHeight: null,
1247                loadIndex: 0,
1248                $nextArrow: null,
1249                $pauseButton: null,
1250                $pauseIcon: null,
1251                $playIcon: null,
1252                $prevArrow: null,
1253                scrolling: false,
1254                slideCount: null,
1255                slideWidth: null,
1256                $slideTrack: null,
1257                $slides: null,
1258                sliding: false,
1259                slideOffset: 0,
1260                swipeLeft: null,
1261                swiping: false,
1262                $list: null,
1263                touchObject: {},
1264                transformsEnabled: false,
1265                unslicked: false
1266            };
1267
1268            $.extend(_, _.initials);
1269
1270            _.activeBreakpoint = null;
1271            _.animType = null;
1272            _.animProp = null;
1273            _.breakpoints = [];
1274            _.breakpointSettings = [];
1275            _.cssTransitions = false;
1276            _.focussed = false;
1277            _.interrupted = false;
1278            _.hidden = 'hidden';
1279            _.paused = true;
1280            _.positionProp = null;
1281            _.respondTo = null;
1282            _.rowCount = 1;
1283            _.shouldClick = true;
1284            _.$slider = $(element);
1285            _.$slidesCache = null;
1286            _.transformType = null;
1287            _.transitionType = null;
1288            _.visibilityChange = 'visibilitychange';
1289            _.windowWidth = 0;
1290            _.windowTimer = null;
1291
1292            dataSettings = $(element).data('slick') || {};
1293
1294            _.options = $.extend({}, _.defaults, settings, dataSettings);
1295
1296            _.currentSlide = _.options.initialSlide;
1297
1298            _.originalSettings = _.options;
1299
1300            if (typeof document.mozHidden !== 'undefined') {
1301                _.hidden = 'mozHidden';
1302                _.visibilityChange = 'mozvisibilitychange';
1303            } else if (typeof document.webkitHidden !== 'undefined') {
1304                _.hidden = 'webkitHidden';
1305                _.visibilityChange = 'webkitvisibilitychange';
1306            }
1307
1308            _.autoPlay = $.proxy(_.autoPlay, _);
1309            _.autoPlayClear = $.proxy(_.autoPlayClear, _);
1310            _.autoPlayIterator = $.proxy(_.autoPlayIterator, _);
1311            _.autoPlayToggleHandler = $.proxy(_.autoPlayToggleHandler, _);
1312            _.changeSlide = $.proxy(_.changeSlide, _);
1313            _.clickHandler = $.proxy(_.clickHandler, _);
1314            _.selectHandler = $.proxy(_.selectHandler, _);
1315            _.setPosition = $.proxy(_.setPosition, _);
1316            _.swipeHandler = $.proxy(_.swipeHandler, _);
1317            _.dragHandler = $.proxy(_.dragHandler, _);
1318
1319            _.instanceUid = instanceUid++;
1320
1321            // A simple way to check for HTML strings
1322            // Strict HTML recognition (must start with <)
1323            // Extracted from jQuery v1.11 source
1324            _.htmlExpr = /^(?:\s*(<[\w\W]+>)[^>]*)$/;
1325
1326
1327            _.registerBreakpoints();
1328            _.init(true);
1329
1330        }
1331
1332        return Slick;
1333
1334    }());
1335
1336    Slick.prototype.addSlide = Slick.prototype.slickAdd = function(markup, index, addBefore) {
1337
1338        var _ = this;
1339
1340        if (typeof(index) === 'boolean') {
1341            addBefore = index;
1342            index = null;
1343        } else if (index < 0 || (index >= _.slideCount)) {
1344            return false;
1345        }
1346
1347        _.unload();
1348
1349        if (typeof(index) === 'number') {
1350            if (index === 0 && _.$slides.length === 0) {
1351                $(markup).appendTo(_.$slideTrack);
1352            } else if (addBefore) {
1353                $(markup).insertBefore(_.$slides.eq(index));
1354            } else {
1355                $(markup).insertAfter(_.$slides.eq(index));
1356            }
1357        } else {
1358            if (addBefore === true) {
1359                $(markup).prependTo(_.$slideTrack);
1360            } else {
1361                $(markup).appendTo(_.$slideTrack);
1362            }
1363        }
1364
1365        _.$slides = _.$slideTrack.children(this.options.slide);
1366
1367        _.$slideTrack.children(this.options.slide).detach();
1368
1369        _.$slideTrack.append(_.$slides);
1370
1371        _.$slides.each(function(index, element) {
1372            $(element).attr('data-slick-index', index);
1373            $(element).attr('role', 'group');
1374            $(element).attr('aria-label', 'slide ' + index);
1375        });
1376
1377        _.$slidesCache = _.$slides;
1378
1379        _.reinit();
1380
1381    };
1382
1383    Slick.prototype.animateHeight = function() {
1384        var _ = this;
1385        if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) {
1386            var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true);
1387            _.$list.animate({
1388                height: targetHeight
1389            }, _.options.speed);
1390        }
1391    };
1392
1393    Slick.prototype.animateSlide = function(targetLeft, callback) {
1394
1395        var animProps = {},
1396            _ = this;
1397
1398        _.animateHeight();
1399
1400        if (_.options.rtl === true && _.options.vertical === false) {
1401            targetLeft = -targetLeft;
1402        }
1403        if (_.transformsEnabled === false) {
1404            if (_.options.vertical === false) {
1405                _.$slideTrack.animate({
1406                    left: targetLeft
1407                }, _.options.speed, _.options.easing, callback);
1408            } else {
1409                _.$slideTrack.animate({
1410                    top: targetLeft
1411                }, _.options.speed, _.options.easing, callback);
1412            }
1413
1414        } else {
1415
1416            if (_.cssTransitions === false) {
1417                if (_.options.rtl === true) {
1418                    _.currentLeft = -(_.currentLeft);
1419                }
1420                $({
1421                    animStart: _.currentLeft
1422                }).animate({
1423                    animStart: targetLeft
1424                }, {
1425                    duration: _.options.speed,
1426                    easing: _.options.easing,
1427                    step: function(now) {
1428                        now = Math.ceil(now);
1429                        if (_.options.vertical === false) {
1430                            animProps[_.animType] = 'translate(' +
1431                                now + 'px, 0px)';
1432                            _.$slideTrack.css(animProps);
1433                        } else {
1434                            animProps[_.animType] = 'translate(0px,' +
1435                                now + 'px)';
1436                            _.$slideTrack.css(animProps);
1437                        }
1438                    },
1439                    complete: function() {
1440                        if (callback) {
1441                            callback.call();
1442                        }
1443                    }
1444                });
1445
1446            } else {
1447
1448                _.applyTransition();
1449                targetLeft = Math.ceil(targetLeft);
1450
1451                if (_.options.vertical === false) {
1452                    animProps[_.animType] = 'translate3d(' + targetLeft + 'px, 0px, 0px)';
1453                } else {
1454                    animProps[_.animType] = 'translate3d(0px,' + targetLeft + 'px, 0px)';
1455                }
1456                _.$slideTrack.css(animProps);
1457
1458                if (callback) {
1459                    setTimeout(function() {
1460
1461                        _.disableTransition();
1462
1463                        callback.call();
1464                    }, _.options.speed);
1465                }
1466
1467            }
1468
1469        }
1470
1471    };
1472
1473    Slick.prototype.getNavTarget = function() {
1474
1475        var _ = this,
1476            asNavFor = _.options.asNavFor;
1477
1478        if ( asNavFor && asNavFor !== null ) {
1479            asNavFor = $(asNavFor).not(_.$slider);
1480        }
1481
1482        return asNavFor;
1483
1484    };
1485
1486    Slick.prototype.asNavFor = function(index) {
1487
1488        var _ = this,
1489            asNavFor = _.getNavTarget();
1490
1491        if ( asNavFor !== null && typeof asNavFor === 'object' ) {
1492            asNavFor.each(function() {
1493                var target = $(this).slick('getSlick');
1494                if(!target.unslicked) {
1495                    target.slideHandler(index, true);
1496                }
1497            });
1498        }
1499
1500    };
1501
1502    Slick.prototype.applyTransition = function(slide) {
1503
1504        var _ = this,
1505            transition = {};
1506
1507        if (_.options.fade === false) {
1508            transition[_.transitionType] = _.transformType + ' ' + _.options.speed + 'ms ' + _.options.cssEase;
1509        } else {
1510            transition[_.transitionType] = 'opacity ' + _.options.speed + 'ms ' + _.options.cssEase;
1511        }
1512
1513        if (_.options.fade === false) {
1514            _.$slideTrack.css(transition);
1515        } else {
1516            _.$slides.eq(slide).css(transition);
1517        }
1518
1519    };
1520
1521    Slick.prototype.autoPlay = function() {
1522
1523        var _ = this;
1524
1525        _.autoPlayClear();
1526
1527        if ( _.slideCount > _.options.slidesToShow ) {
1528            _.autoPlayTimer = setInterval( _.autoPlayIterator, _.options.autoplaySpeed );
1529        }
1530
1531    };
1532
1533    Slick.prototype.autoPlayClear = function() {
1534
1535        var _ = this;
1536
1537        if (_.autoPlayTimer) {
1538            clearInterval(_.autoPlayTimer);
1539        }
1540
1541    };
1542
1543    Slick.prototype.autoPlayIterator = function() {
1544
1545        var _ = this,
1546            slideTo = _.currentSlide + _.options.slidesToScroll;
1547
1548        if ( !_.paused && !_.interrupted && !_.focussed ) {
1549
1550            if ( _.options.infinite === false ) {
1551
1552                if ( _.direction === 1 && ( _.currentSlide + 1 ) === ( _.slideCount - 1 )) {
1553                    _.direction = 0;
1554                }
1555
1556                else if ( _.direction === 0 ) {
1557
1558                    slideTo = _.currentSlide - _.options.slidesToScroll;
1559
1560                    if ( _.currentSlide - 1 === 0 ) {
1561                        _.direction = 1;
1562                    }
1563
1564                }
1565
1566            }
1567
1568            _.slideHandler( slideTo );
1569
1570        }
1571
1572    };
1573
1574    Slick.prototype.autoPlayToggleHandler = function() {
1575        var _ = this;
1576
1577        if(_.paused) {
1578            _.$playIcon.css('display', 'none');
1579            _.$pauseIcon.css('display', 'inline');
1580
1581            _.$pauseButton.find('.slick-play-text').attr('style', 'display: none');
1582            _.$pauseButton.find('.slick-pause-text').removeAttr('style');
1583
1584            _.slickPlay();
1585        } else {
1586            _.$playIcon.css('display', 'inline');
1587            _.$pauseIcon.css('display', 'none');
1588
1589            _.$pauseButton.find('.slick-play-text').removeAttr('style');
1590            _.$pauseButton.find('.slick-pause-text').attr('style', 'display: none');
1591
1592            _.slickPause();
1593        }
1594    };
1595
1596    Slick.prototype.buildArrows = function() {
1597
1598        var _ = this;
1599
1600        if (_.options.arrows === true ) {
1601
1602            _.$prevArrow = $(_.options.prevArrow).addClass('slick-arrow');
1603            _.$nextArrow = $(_.options.nextArrow).addClass('slick-arrow');
1604
1605            if( _.slideCount > _.options.slidesToShow ) {
1606
1607                if (_.htmlExpr.test(_.options.prevArrow)) {
1608                    if(_.options.arrowsPlacement != null) {
1609                        switch(_.options.arrowsPlacement) {
1610                            case 'beforeSlides':
1611                            case 'split':
1612                                console.log('test');
1613                                _.$prevArrow.prependTo(_.options.appendArrows);
1614                                break;
1615
1616                            case 'afterSlides':
1617                                _.$prevArrow.appendTo(_.options.appendArrows);
1618                                break;
1619                        }
1620
1621                    } else {
1622                        _.$prevArrow.prependTo(_.options.appendArrows);
1623                    }
1624                }
1625
1626                if (_.htmlExpr.test(_.options.nextArrow)) {
1627                    if(_.options.arrowsPlacement != null) {
1628                        switch(_.options.arrowsPlacement) {
1629                            case 'beforeSlides':
1630                                console.log('test2');
1631                                _.$prevArrow.after(_.$nextArrow);
1632                                break;
1633
1634                            case 'afterSlides':
1635                            case 'split':
1636                                _.$nextArrow.appendTo(_.options.appendArrows);
1637                        }
1638                    } else {
1639                       _.$nextArrow.appendTo(_.options.appendArrows);
1640                    }
1641                }
1642
1643                if (_.options.infinite !== true) {
1644                    _.$prevArrow
1645                        .addClass('slick-disabled')
1646                        .prop('disabled', true);
1647                }
1648
1649            } else {
1650
1651                _.$prevArrow.add( _.$nextArrow )
1652
1653                    .addClass('slick-hidden')
1654                    .prop('disabled', true);
1655            }
1656
1657        }
1658
1659    };
1660
1661    Slick.prototype.buildDots = function() {
1662
1663        var _ = this,
1664            i, dot;
1665
1666        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {
1667
1668            _.$slider.addClass('slick-dotted');
1669
1670            dot = $('<ul />').addClass(_.options.dotsClass);
1671
1672            for (i = 0; i <= _.getDotCount(); i += 1) {
1673                dot.append($('<li />').append(_.options.customPaging.call(this, _, i)));
1674            }
1675
1676            _.$dots = dot.appendTo(_.options.appendDots);
1677
1678            _.$dots.find('li').first().addClass('slick-active');
1679
1680        }
1681
1682    };
1683
1684    Slick.prototype.buildOut = function() {
1685
1686        var _ = this;
1687
1688        _.$slides =
1689            _.$slider
1690                .children( _.options.slide + ':not(.slick-cloned)')
1691                .addClass('slick-slide');
1692
1693        _.slideCount = _.$slides.length;
1694
1695        _.$slides.each(function(index, element) {
1696            $(element)
1697                .attr('data-slick-index', index)
1698                .data('originalStyling', $(element).attr('style') || '');
1699
1700            if(_.options.useGroupRole) {
1701                $(element)
1702                    .attr('role', 'group')
1703                    .attr('aria-label', 'slide ' + (index + 1));
1704            }
1705        });
1706
1707        _.$slider.addClass('slick-slider');
1708
1709        _.$slider.attr('role', 'region');
1710        _.$slider.attr('aria-label', _.options.regionLabel);
1711
1712        _.$slideTrack = (_.slideCount === 0) ?
1713            $('<div class="slick-track"/>').appendTo(_.$slider) :
1714            _.$slides.wrapAll('<div class="slick-track"/>').parent();
1715
1716        _.$list = _.$slideTrack.wrap(
1717            '<div class="slick-list"/>').parent();
1718        _.$slideTrack.css('opacity', 0);
1719
1720        if (_.options.centerMode === true || _.options.swipeToSlide === true) {
1721            _.options.slidesToScroll = 1;
1722        }
1723
1724        $('img[data-lazy]', _.$slider).not('[src]').addClass('slick-loading');
1725
1726        _.setupInfinite();
1727
1728        _.buildArrows();
1729
1730        _.buildDots();
1731
1732        _.updateDots();
1733
1734
1735        _.setSlideClasses(typeof _.currentSlide === 'number' ? _.currentSlide : 0);
1736
1737        if (_.options.draggable === true) {
1738            _.$list.addClass('draggable');
1739        }
1740
1741        if ( _.options.autoplay && _.options.useAutoplayToggleButton ) {
1742            _.$pauseIcon = $(_.options.pauseIcon).attr('aria-hidden', true);
1743            _.$playIcon = $(_.options.playIcon).attr('aria-hidden', true);
1744
1745            _.$pauseButton = $('<button type="button" class="slick-autoplay-toggle-button">');
1746            _.$pauseButton.append(_.$pauseIcon);
1747            _.$pauseButton.append(_.$playIcon.css('display', 'none'));
1748            _.$pauseButton.append($('<span class="slick-pause-text slick-sr-only">Pause</span>'));
1749            _.$pauseButton.append($('<span class="slick-play-text slick-sr-only" style="display: none">Play</span>'));
1750
1751            _.$pauseButton.prependTo(_.$slider);
1752        }
1753
1754        if((_.options.instructionsText != null && _.options.instructionsText != '')) {
1755            _.$instructionsText = $('<p class="slick-instructions slick-sr-only">' + _.options.instructionsText + '</p>');
1756            _.$instructionsText.prependTo(_.$slider);
1757        }
1758
1759    };
1760
1761    Slick.prototype.buildRows = function() {
1762
1763        var _ = this, a, b, c, newSlides, numOfSlides, originalSlides,slidesPerSection;
1764
1765        newSlides = document.createDocumentFragment();
1766        originalSlides = _.$slider.children();
1767
1768        if(_.options.rows > 0) {
1769
1770            slidesPerSection = _.options.slidesPerRow * _.options.rows;
1771            numOfSlides = Math.ceil(
1772                originalSlides.length / slidesPerSection
1773            );
1774
1775            for(a = 0; a < numOfSlides; a++){
1776                var slide = document.createElement('div');
1777                for(b = 0; b < _.options.rows; b++) {
1778                    var row = document.createElement('div');
1779                    for(c = 0; c < _.options.slidesPerRow; c++) {
1780                        var target = (a * slidesPerSection + ((b * _.options.slidesPerRow) + c));
1781                        if (originalSlides.get(target)) {
1782                            row.appendChild(originalSlides.get(target));
1783                        }
1784                    }
1785                    slide.appendChild(row);
1786                }
1787                newSlides.appendChild(slide);
1788            }
1789
1790            _.$slider.empty().append(newSlides);
1791            _.$slider.children().children().children()
1792                .css({
1793                    'width':(100 / _.options.slidesPerRow) + '%',
1794                    'display': 'inline-block'
1795                });
1796
1797        }
1798
1799    };
1800
1801    Slick.prototype.checkResponsive = function(initial, forceUpdate) {
1802
1803        var _ = this,
1804            breakpoint, targetBreakpoint, respondToWidth, triggerBreakpoint = false;
1805        var sliderWidth = _.$slider.width();
1806        var windowWidth = window.innerWidth || $(window).width();
1807
1808        if (_.respondTo === 'window') {
1809            respondToWidth = windowWidth;
1810        } else if (_.respondTo === 'slider') {
1811            respondToWidth = sliderWidth;
1812        } else if (_.respondTo === 'min') {
1813            respondToWidth = Math.min(windowWidth, sliderWidth);
1814        }
1815
1816        if ( _.options.responsive &&
1817            _.options.responsive.length &&
1818            _.options.responsive !== null) {
1819
1820            targetBreakpoint = null;
1821
1822            for (breakpoint in _.breakpoints) {
1823                if (_.breakpoints.hasOwnProperty(breakpoint)) {
1824                    if (_.originalSettings.mobileFirst === false) {
1825                        if (respondToWidth < _.breakpoints[breakpoint]) {
1826                            targetBreakpoint = _.breakpoints[breakpoint];
1827                        }
1828                    } else {
1829                        if (respondToWidth > _.breakpoints[breakpoint]) {
1830                            targetBreakpoint = _.breakpoints[breakpoint];
1831                        }
1832                    }
1833                }
1834            }
1835
1836            if (targetBreakpoint !== null) {
1837                if (_.activeBreakpoint !== null) {
1838                    if (targetBreakpoint !== _.activeBreakpoint || forceUpdate) {
1839                        _.activeBreakpoint =
1840                            targetBreakpoint;
1841                        if (_.breakpointSettings[targetBreakpoint] === 'unslick') {
1842                            _.unslick(targetBreakpoint);
1843                        } else {
1844                            _.options = $.extend({}, _.originalSettings,
1845                                _.breakpointSettings[
1846                                    targetBreakpoint]);
1847                            if (initial === true) {
1848                                _.currentSlide = _.options.initialSlide;
1849                            }
1850                            _.refresh(initial);
1851                        }
1852                        triggerBreakpoint = targetBreakpoint;
1853                    }
1854                } else {
1855                    _.activeBreakpoint = targetBreakpoint;
1856                    if (_.breakpointSettings[targetBreakpoint] === 'unslick') {
1857                        _.unslick(targetBreakpoint);
1858                    } else {
1859                        _.options = $.extend({}, _.originalSettings,
1860                            _.breakpointSettings[
1861                                targetBreakpoint]);
1862                        if (initial === true) {
1863                            _.currentSlide = _.options.initialSlide;
1864                        }
1865                        _.refresh(initial);
1866                    }
1867                    triggerBreakpoint = targetBreakpoint;
1868                }
1869            } else {
1870                if (_.activeBreakpoint !== null) {
1871                    _.activeBreakpoint = null;
1872                    _.options = _.originalSettings;
1873                    if (initial === true) {
1874                        _.currentSlide = _.options.initialSlide;
1875                    }
1876                    _.refresh(initial);
1877                    triggerBreakpoint = targetBreakpoint;
1878                }
1879            }
1880
1881            // only trigger breakpoints during an actual break. not on initialize.
1882            if( !initial && triggerBreakpoint !== false ) {
1883                _.$slider.trigger('breakpoint', [_, triggerBreakpoint]);
1884            }
1885        }
1886
1887    };
1888
1889    Slick.prototype.changeSlide = function(event, dontAnimate) {
1890
1891        var _ = this,
1892            $target = $(event.currentTarget),
1893            indexOffset, slideOffset, unevenOffset;
1894
1895        // If target is a link, prevent default action.
1896        if($target.is('a')) {
1897            event.preventDefault();
1898        }
1899
1900        // If target is not the <li> element (ie: a child), find the <li>.
1901        if(!$target.is('li')) {
1902            $target = $target.closest('li');
1903        }
1904
1905        unevenOffset = (_.slideCount % _.options.slidesToScroll !== 0);
1906        indexOffset = unevenOffset ? 0 : (_.slideCount - _.currentSlide) % _.options.slidesToScroll;
1907
1908        switch (event.data.message) {
1909
1910            case 'previous':
1911                slideOffset = indexOffset === 0 ? _.options.slidesToScroll : _.options.slidesToShow - indexOffset;
1912                if (_.slideCount > _.options.slidesToShow) {
1913                    _.slideHandler(_.currentSlide - slideOffset, false, dontAnimate);
1914                }
1915                break;
1916
1917            case 'next':
1918                slideOffset = indexOffset === 0 ? _.options.slidesToScroll : indexOffset;
1919                if (_.slideCount > _.options.slidesToShow) {
1920                    _.slideHandler(_.currentSlide + slideOffset, false, dontAnimate);
1921                }
1922                break;
1923
1924            case 'index':
1925                var index = event.data.index === 0 ? 0 :
1926                    event.data.index || $target.index() * _.options.slidesToScroll;
1927
1928                _.slideHandler(_.checkNavigable(index), false, dontAnimate);
1929                $target.children().trigger('focus');
1930                break;
1931
1932            default:
1933                return;
1934        }
1935
1936    };
1937
1938    Slick.prototype.checkNavigable = function(index) {
1939
1940        var _ = this,
1941            navigables, prevNavigable;
1942
1943        navigables = _.getNavigableIndexes();
1944        prevNavigable = 0;
1945        if (index > navigables[navigables.length - 1]) {
1946            index = navigables[navigables.length - 1];
1947        } else {
1948            for (var n in navigables) {
1949                if (index < navigables[n]) {
1950                    index = prevNavigable;
1951                    break;
1952                }
1953                prevNavigable = navigables[n];
1954            }
1955        }
1956
1957        return index;
1958    };
1959
1960    Slick.prototype.cleanUpEvents = function() {
1961
1962        var _ = this;
1963
1964        if(_.options.autoplay && _.options.useAutoplayToggleButton) {
1965            _.$pauseButton.off('click.slick', _.autoPlayToggleHandler);
1966        }
1967
1968        if (_.options.dots && _.$dots !== null) {
1969
1970            $('li', _.$dots)
1971                .off('click.slick', _.changeSlide)
1972                .off('mouseenter.slick', $.proxy(_.interrupt, _, true))
1973                .off('mouseleave.slick', $.proxy(_.interrupt, _, false));
1974        }
1975
1976        _.$slider.off('focus.slick blur.slick');
1977
1978        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {
1979            _.$prevArrow && _.$prevArrow.off('click.slick', _.changeSlide);
1980            _.$nextArrow && _.$nextArrow.off('click.slick', _.changeSlide);
1981        }
1982
1983        _.$list.off('touchstart.slick mousedown.slick', _.swipeHandler);
1984        _.$list.off('touchmove.slick mousemove.slick', _.swipeHandler);
1985        _.$list.off('touchend.slick mouseup.slick', _.swipeHandler);
1986        _.$list.off('touchcancel.slick mouseleave.slick', _.swipeHandler);
1987
1988        _.$list.off('click.slick', _.clickHandler);
1989
1990        $(document).off(_.visibilityChange, _.visibility);
1991
1992        _.cleanUpSlideEvents();
1993
1994        $(window).off('orientationchange.slick.slick-' + _.instanceUid, _.orientationChange);
1995
1996        $(window).off('resize.slick.slick-' + _.instanceUid, _.resize);
1997
1998        $('[draggable!=true]', _.$slideTrack).off('dragstart', _.preventDefault);
1999
2000        $(window).off('load.slick.slick-' + _.instanceUid, _.setPosition);
2001
2002    };
2003
2004    Slick.prototype.cleanUpSlideEvents = function() {
2005
2006        var _ = this;
2007
2008        _.$list.off('mouseenter.slick', $.proxy(_.interrupt, _, true));
2009        _.$list.off('mouseleave.slick', $.proxy(_.interrupt, _, false));
2010
2011    };
2012
2013    Slick.prototype.cleanUpRows = function() {
2014
2015        var _ = this, originalSlides;
2016
2017        if(_.options.rows > 0) {
2018            originalSlides = _.$slides.children().children();
2019            originalSlides.removeAttr('style');
2020            _.$slider.empty().append(originalSlides);
2021        }
2022
2023    };
2024
2025    Slick.prototype.clickHandler = function(event) {
2026
2027        var _ = this;
2028
2029        if (_.shouldClick === false) {
2030            event.stopImmediatePropagation();
2031            event.stopPropagation();
2032            event.preventDefault();
2033        }
2034
2035    };
2036
2037    Slick.prototype.destroy = function(refresh) {
2038
2039        var _ = this;
2040
2041        _.autoPlayClear();
2042
2043        _.touchObject = {};
2044
2045        _.cleanUpEvents();
2046
2047        $('.slick-cloned', _.$slider).detach();
2048
2049        if(_.options.autoplay && _.options.useAutoplayToggleButton) {
2050            _.$pauseButton.remove();
2051        }
2052
2053        if (_.$dots) {
2054            _.$dots.remove();
2055        }
2056
2057        if ( _.$prevArrow && _.$prevArrow.length ) {
2058
2059            _.$prevArrow
2060                .removeClass('slick-disabled slick-arrow slick-hidden')
2061                .prop('disabled', false)
2062                .css('display','');
2063
2064            if ( _.htmlExpr.test( _.options.prevArrow )) {
2065                _.$prevArrow.remove();
2066            }
2067        }
2068
2069        if ( _.$nextArrow && _.$nextArrow.length ) {
2070
2071            _.$nextArrow
2072                .removeClass('slick-disabled slick-arrow slick-hidden')
2073                .prop('disabled', false)
2074                .css('display','');
2075
2076            if ( _.htmlExpr.test( _.options.nextArrow )) {
2077                _.$nextArrow.remove();
2078            }
2079        }
2080
2081
2082        if (_.$slides) {
2083
2084            _.$slides
2085                .removeClass('slick-slide slick-active slick-center slick-visible slick-current')
2086                .removeAttr('aria-hidden')
2087                .removeAttr('data-slick-index')
2088                .each(function(){
2089                    $(this).attr('style', $(this).data('originalStyling'));
2090                });
2091
2092            _.$slideTrack.children(this.options.slide).detach();
2093
2094            _.$slideTrack.detach();
2095
2096            _.$list.detach();
2097
2098            _.$slider.append(_.$slides);
2099        }
2100
2101        _.cleanUpRows();
2102
2103        _.$slider.removeClass('slick-slider');
2104        _.$slider.removeClass('slick-initialized');
2105        _.$slider.removeClass('slick-dotted');
2106
2107        _.unslicked = true;
2108
2109        if(!refresh) {
2110            _.$slider.trigger('destroy', [_]);
2111        }
2112
2113    };
2114
2115    Slick.prototype.disableTransition = function(slide) {
2116
2117        var _ = this,
2118            transition = {};
2119
2120        transition[_.transitionType] = '';
2121
2122        if (_.options.fade === false) {
2123            _.$slideTrack.css(transition);
2124        } else {
2125            _.$slides.eq(slide).css(transition);
2126        }
2127
2128    };
2129
2130    Slick.prototype.fadeSlide = function(slideIndex, callback) {
2131
2132        var _ = this;
2133
2134        if (_.cssTransitions === false) {
2135
2136            _.$slides.eq(slideIndex).css({
2137                zIndex: _.options.zIndex
2138            });
2139
2140            _.$slides.eq(slideIndex).animate({
2141                opacity: 1
2142            }, _.options.speed, _.options.easing, callback);
2143
2144        } else {
2145
2146            _.applyTransition(slideIndex);
2147
2148            _.$slides.eq(slideIndex).css({
2149                opacity: 1,
2150                zIndex: _.options.zIndex
2151            });
2152
2153            if (callback) {
2154                setTimeout(function() {
2155
2156                    _.disableTransition(slideIndex);
2157
2158                    callback.call();
2159                }, _.options.speed);
2160            }
2161
2162        }
2163
2164    };
2165
2166    Slick.prototype.fadeSlideOut = function(slideIndex) {
2167
2168        var _ = this;
2169
2170        if (_.cssTransitions === false) {
2171
2172            _.$slides.eq(slideIndex).animate({
2173                opacity: 0,
2174                zIndex: _.options.zIndex - 2
2175            }, _.options.speed, _.options.easing);
2176
2177        } else {
2178
2179            _.applyTransition(slideIndex);
2180
2181            _.$slides.eq(slideIndex).css({
2182                opacity: 0,
2183                zIndex: _.options.zIndex - 2
2184            });
2185
2186        }
2187
2188    };
2189
2190    Slick.prototype.filterSlides = Slick.prototype.slickFilter = function(filter) {
2191
2192        var _ = this;
2193
2194        if (filter !== null) {
2195
2196            _.$slidesCache = _.$slides;
2197
2198            _.unload();
2199
2200            _.$slideTrack.children(this.options.slide).detach();
2201
2202            _.$slidesCache.filter(filter).appendTo(_.$slideTrack);
2203
2204            _.reinit();
2205
2206        }
2207
2208    };
2209
2210    Slick.prototype.focusHandler = function() {
2211
2212        var _ = this;
2213
2214        // If any child element receives focus within the slider we need to pause the autoplay
2215        _.$slider
2216            .off('focus.slick blur.slick')
2217            .on(
2218                'focus.slick',
2219                '*',
2220                function(event) {
2221                    var $sf = $(this);
2222
2223                    setTimeout(function() {
2224                        if( _.options.pauseOnFocus ) {
2225                            if ($sf.is(':focus')) {
2226                                _.focussed = true;
2227                                _.autoPlay();
2228                            }
2229                        }
2230                    }, 0);
2231                }
2232            ).on(
2233                'blur.slick',
2234                '*',
2235                function(event) {
2236                    var $sf = $(this);
2237
2238                    // When a blur occurs on any elements within the slider we become unfocused
2239                    if( _.options.pauseOnFocus ) {
2240                        _.focussed = false;
2241                        _.autoPlay();
2242                    }
2243                }
2244            );
2245    };
2246
2247    Slick.prototype.getCurrent = Slick.prototype.slickCurrentSlide = function() {
2248
2249        var _ = this;
2250        return _.currentSlide;
2251
2252    };
2253
2254    Slick.prototype.getDotCount = function() {
2255
2256        var _ = this;
2257
2258        var breakPoint = 0;
2259        var counter = 0;
2260        var pagerQty = 0;
2261
2262        if (_.options.infinite === true) {
2263            if (_.slideCount <= _.options.slidesToShow) {
2264                 ++pagerQty;
2265            } else {
2266                while (breakPoint < _.slideCount) {
2267                    ++pagerQty;
2268                    breakPoint = counter + _.options.slidesToScroll;
2269                    counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;
2270                }
2271            }
2272        } else if (_.options.centerMode === true) {
2273            pagerQty = _.slideCount;
2274        } else if(!_.options.asNavFor) {
2275            pagerQty = 1 + Math.ceil((_.slideCount - _.options.slidesToShow) / _.options.slidesToScroll);
2276        }else {
2277            while (breakPoint < _.slideCount) {
2278                ++pagerQty;
2279                breakPoint = counter + _.options.slidesToScroll;
2280                counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;
2281            }
2282        }
2283
2284        return pagerQty - 1;
2285
2286    };
2287
2288    Slick.prototype.getLeft = function(slideIndex) {
2289
2290        var _ = this,
2291            targetLeft,
2292            verticalHeight,
2293            verticalOffset = 0,
2294            targetSlide,
2295            coef;
2296
2297        _.slideOffset = 0;
2298        verticalHeight = _.$slides.first().outerHeight(true);
2299
2300        if (_.options.infinite === true) {
2301            if (_.slideCount > _.options.slidesToShow) {
2302                _.slideOffset = (_.slideWidth * _.options.slidesToShow) * -1;
2303                coef = -1
2304
2305                if (_.options.vertical === true && _.options.centerMode === true) {
2306                    if (_.options.slidesToShow === 2) {
2307                        coef = -1.5;
2308                    } else if (_.options.slidesToShow === 1) {
2309                        coef = -2
2310                    }
2311                }
2312                verticalOffset = (verticalHeight * _.options.slidesToShow) * coef;
2313            }
2314            if (_.slideCount % _.options.slidesToScroll !== 0) {
2315                if (slideIndex + _.options.slidesToScroll > _.slideCount && _.slideCount > _.options.slidesToShow) {
2316                    if (slideIndex > _.slideCount) {
2317                        _.slideOffset = ((_.options.slidesToShow - (sl
2317ideIndex - _.slideCount)) * _.slideWidth) * -1;
2318                        verticalOffset = ((_.options.slidesToShow - (slideIndex - _.slideCount)) * verticalHeight) * -1;
2319                    } else {
2320                        _.slideOffset = ((_.slideCount % _.options.slidesToScroll) * _.slideWidth) * -1;
2321                        verticalOffset = ((_.slideCount % _.options.slidesToScroll) * verticalHeight) * -1;
2322                    }
2323                }
2324            }
2325        } else {
2326            if (slideIndex + _.options.slidesToShow > _.slideCount) {
2327                _.slideOffset = ((slideIndex + _.options.slidesToShow) - _.slideCount) * _.slideWidth;
2328                verticalOffset = ((slideIndex + _.options.slidesToShow) - _.slideCount) * verticalHeight;
2329            }
2330        }
2331
2332        if (_.slideCount <= _.options.slidesToShow) {
2333            _.slideOffset = 0;
2334            verticalOffset = 0;
2335        }
2336
2337        if (_.options.centerMode === true && _.slideCount <= _.options.slidesToShow) {
2338            _.slideOffset = ((_.slideWidth * Math.floor(_.options.slidesToShow)) / 2) - ((_.slideWidth * _.slideCount) / 2);
2339        } else if (_.options.centerMode === true && _.options.infinite === true) {
2340            _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2) - _.slideWidth;
2341        } else if (_.options.centerMode === true) {
2342            _.slideOffset = 0;
2343            _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2);
2344        }
2345
2346        if (_.options.vertical === false) {
2347            targetLeft = ((slideIndex * _.slideWidth) * -1) + _.slideOffset;
2348        } else {
2349            targetLeft = ((slideIndex * verticalHeight) * -1) + verticalOffset;
2350        }
2351
2352        if (_.options.variableWidth === true) {
2353
2354            if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) {
2355                targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex);
2356            } else {
2357                targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow);
2358            }
2359
2360            if (_.options.rtl === true) {
2361                if (targetSlide[0]) {
2362                    targetLeft = (_.$slideTrack.width() - targetSlide[0].offsetLeft - targetSlide.width()) * -1;
2363                } else {
2364                    targetLeft =  0;
2365                }
2366            } else {
2367                targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0;
2368            }
2369
2370            if (_.options.centerMode === true) {
2371                if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) {
2372                    targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex);
2373                } else {
2374                    targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow + 1);
2375                }
2376
2377                if (_.options.rtl === true) {
2378                    if (targetSlide[0]) {
2379                        targetLeft = (_.$slideTrack.width() - targetSlide[0].offsetLeft - targetSlide.width()) * -1;
2380                    } else {
2381                        targetLeft =  0;
2382                    }
2383                } else {
2384                    targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0;
2385                }
2386
2387                targetLeft += (_.$list.width() - targetSlide.outerWidth()) / 2;
2388            }
2389        }
2390
2391        return targetLeft;
2392
2393    };
2394
2395    Slick.prototype.getOption = Slick.prototype.slickGetOption = function(option) {
2396
2397        var _ = this;
2398
2399        return _.options[option];
2400
2401    };
2402
2403    Slick.prototype.getNavigableIndexes = function() {
2404
2405        var _ = this,
2406            breakPoint = 0,
2407            counter = 0,
2408            indexes = [],
2409            max;
2410
2411        if (_.options.infinite === false) {
2412            max = _.slideCount;
2413        } else {
2414            breakPoint = _.options.slidesToScroll * -1;
2415            counter = _.options.slidesToScroll * -1;
2416            max = _.slideCount * 2;
2417        }
2418
2419        while (breakPoint < max) {
2420            indexes.push(breakPoint);
2421            breakPoint = counter + _.options.slidesToScroll;
2422            counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;
2423        }
2424
2425        return indexes;
2426
2427    };
2428
2429    Slick.prototype.getSlick = function() {
2430
2431        return this;
2432
2433    };
2434
2435    Slick.prototype.getSlideCount = function() {
2436
2437        var _ = this,
2438            slidesTraversed, swipedSlide, swipeTarget, centerOffset;
2439
2440        centerOffset = _.options.centerMode === true ? Math.floor(_.$list.width() / 2) : 0;
2441        swipeTarget = (_.swipeLeft * -1) + centerOffset;
2442
2443        if (_.options.swipeToSlide === true) {
2444
2445            _.$slideTrack.find('.slick-slide').each(function(index, slide) {
2446
2447                var slideOuterWidth, slideOffset, slideRightBoundary;
2448                slideOuterWidth = $(slide).outerWidth();
2449                slideOffset = slide.offsetLeft;
2450                if (_.options.centerMode !== true) {
2451                    slideOffset += (slideOuterWidth / 2);
2452                }
2453
2454                slideRightBoundary = slideOffset + (slideOuterWidth);
2455
2456                if (swipeTarget < slideRightBoundary) {
2457                    swipedSlide = slide;
2458                    return false;
2459                }
2460            });
2461
2462            slidesTraversed = Math.abs($(swipedSlide).attr('data-slick-index') - _.currentSlide) || 1;
2463
2464            return slidesTraversed;
2465
2466        } else {
2467            return _.options.slidesToScroll;
2468        }
2469
2470    };
2471
2472    Slick.prototype.goTo = Slick.prototype.slickGoTo = function(slide, dontAnimate) {
2473
2474        var _ = this;
2475
2476        _.changeSlide({
2477            data: {
2478                message: 'index',
2479                index: parseInt(slide)
2480            }
2481        }, dontAnimate);
2482
2483    };
2484
2485    Slick.prototype.init = function(creation) {
2486
2487        var _ = this;
2488
2489        if (!$(_.$slider).hasClass('slick-initialized')) {
2490
2491            $(_.$slider).addClass('slick-initialized');
2492
2493            _.buildRows();
2494            _.buildOut();
2495            _.setProps();
2496            _.startLoad();
2497            _.loadSlider();
2498            _.initializeEvents();
2499            _.updateArrows();
2500            _.updateDots();
2501            _.checkResponsive(true);
2502            _.focusHandler();
2503
2504        }
2505
2506        if (creation) {
2507            _.$slider.trigger('init', [_]);
2508        }
2509
2510        if ( _.options.autoplay ) {
2511
2512            _.paused = false;
2513            _.autoPlay();
2514
2515        }
2516
2517        _.updateSlideVisibility();
2518
2519        if(_.options.accessibility != undefined) {
2520            console.warn('accessibility setting is no longer supported.')
2521        }
2522
2523        if(_.options.focusOnChange != undefined) {
2524            console.warn('focusOnChange is no longer supported.');
2525        }
2526
2527        if(_.options.focusOnSelect != undefined) {
2528            console.warn('focusOnSelect is no longer supported.');
2529        }
2530
2531    };
2532
2533    Slick.prototype.initArrowEvents = function() {
2534
2535        var _ = this;
2536
2537        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {
2538            _.$prevArrow
2539               .off('click.slick')
2540               .on('click.slick', {
2541                    message: 'previous'
2542               }, _.changeSlide);
2543            _.$nextArrow
2544               .off('click.slick')
2545               .on('click.slick', {
2546                    message: 'next'
2547               }, _.changeSlide);
2548        }
2549
2550    };
2551
2552    Slick.prototype.initDotEvents = function() {
2553
2554        var _ = this;
2555
2556        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {
2557            $('li', _.$dots).on('click.slick', {
2558                message: 'index'
2559            }, _.changeSlide);
2560        }
2561
2562        if (_.options.dots === true && _.options.pauseOnDotsHover === true && _.slideCount > _.options.slidesToShow) {
2563
2564            $('li', _.$dots)
2565                .on('mouseenter.slick', $.proxy(_.interrupt, _, true))
2566                .on('mouseleave.slick', $.proxy(_.interrupt, _, false));
2567
2568        }
2569
2570    };
2571
2572    Slick.prototype.initSlideEvents = function() {
2573
2574        var _ = this;
2575
2576        if ( _.options.pauseOnHover ) {
2577
2578            _.$list.on('mouseenter.slick', $.proxy(_.interrupt, _, true));
2579            _.$list.on('mouseleave.slick', $.proxy(_.interrupt, _, false));
2580
2581        }
2582
2583    };
2584
2585    Slick.prototype.initializeEvents = function() {
2586
2587        var _ = this;
2588
2589        _.initArrowEvents();
2590
2591        _.initDotEvents();
2592        _.initSlideEvents();
2593
2594        if(_.options.autoplay && _.options.useAutoplayToggleButton) {
2595            _.$pauseButton.on('click.slick', _.autoPlayToggleHandler);
2596        }
2597
2598        _.$list.on('touchstart.slick mousedown.slick', {
2599            action: 'start'
2600        }, _.swipeHandler);
2601        _.$list.on('touchmove.slick mousemove.slick', {
2602            action: 'move'
2603        }, _.swipeHandler);
2604        _.$list.on('touchend.slick mouseup.slick', {
2605            action: 'end'
2606        }, _.swipeHandler);
2607        _.$list.on('touchcancel.slick mouseleave.slick', {
2608            action: 'end'
2609        }, _.swipeHandler);
2610
2611        _.$list.on('click.slick', _.clickHandler);
2612
2613        $(document).on(_.visibilityChange, $.proxy(_.visibility, _));
2614
2615        $(window).on('orientationchange.slick.slick-' + _.instanceUid, $.proxy(_.orientationChange, _));
2616
2617        $(window).on('resize.slick.slick-' + _.instanceUid, $.proxy(_.resize, _));
2618
2619        $('[draggable!=true]', _.$slideTrack).on('dragstart', _.preventDefault);
2620
2621        $(window).on('load.slick.slick-' + _.instanceUid, _.setPosition);
2622        $(_.setPosition);
2623
2624    };
2625
2626    Slick.prototype.initUI = function() {
2627
2628        var _ = this;
2629
2630        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {
2631
2632            _.$prevArrow.show();
2633            _.$nextArrow.show();
2634
2635        }
2636
2637        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {
2638
2639            _.$dots.show();
2640
2641        }
2642
2643    };
2644
2645    Slick.prototype.lazyLoad = function() {
2646
2647        var _ = this,
2648            loadRange, cloneRange, rangeStart, rangeEnd;
2649
2650        function loadImages(imagesScope) {
2651
2652            $('img[data-lazy]', imagesScope).each(function() {
2653
2654                var image = $(this),
2655                    imageSource = $(this).attr('data-lazy'),
2656                    imageSrcSet = $(this).attr('data-srcset'),
2657                    imageSizes  = $(this).attr('data-sizes') || _.$slider.attr('data-sizes'),
2658                    imageToLoad = document.createElement('img');
2659
2660                imageToLoad.onload = function() {
2661
2662                    image
2663                        .animate({ opacity: 0 }, 100, function() {
2664
2665                            if (imageSrcSet) {
2666                                image
2667                                    .attr('srcset', imageSrcSet );
2668
2669                                if (imageSizes) {
2670                                    image
2671                                        .attr('sizes', imageSizes );
2672                                }
2673                            }
2674
2675                            image
2676                                .attr('src', imageSource)
2677                                .animate({ opacity: 1 }, 200, function() {
2678                                    image
2679                                        .removeAttr('data-lazy data-srcset data-sizes')
2680                                        .removeClass('slick-loading');
2681                                });
2682                            _.$slider.trigger('lazyLoaded', [_, image, imageSource]);
2683                        });
2684
2685                };
2686
2687                imageToLoad.onerror = function() {
2688
2689                    image
2690                        .removeAttr( 'data-lazy' )
2691                        .removeClass( 'slick-loading' )
2692                        .addClass( 'slick-lazyload-error' );
2693
2694                    _.$slider.trigger('lazyLoadError', [ _, image, imageSource ]);
2695
2696                };
2697
2698                imageToLoad.src = imageSource;
2699
2700            });
2701
2702        }
2703
2704        if (_.options.centerMode === true) {
2705            if (_.options.infinite === true) {
2706                rangeStart = _.currentSlide + (_.options.slidesToShow / 2 + 1);
2707                rangeEnd = rangeStart + _.options.slidesToShow + 2;
2708            } else {
2709                rangeStart = Math.max(0, _.currentSlide - (_.options.slidesToShow / 2 + 1));
2710                rangeEnd = 2 + (_.options.slidesToShow / 2 + 1) + _.currentSlide;
2711            }
2712        } else {
2713            rangeStart = _.options.infinite ? _.options.slidesToShow + _.currentSlide : _.currentSlide;
2714            rangeEnd = Math.ceil(rangeStart + _.options.slidesToShow);
2715            if (_.options.fade === true) {
2716                if (rangeStart > 0) rangeStart--;
2717                if (rangeEnd <= _.slideCount) rangeEnd++;
2718            }
2719        }
2720
2721        loadRange = _.$slider.find('.slick-slide').slice(rangeStart, rangeEnd);
2722
2723        if (_.options.lazyLoad === 'anticipated') {
2724            var prevSlide = rangeStart - 1,
2725                nextSlide = rangeEnd,
2726                $slides = _.$slider.find('.slick-slide');
2727
2728            for (var i = 0; i < _.options.slidesToScroll; i++) {
2729                if (prevSlide < 0) prevSlide = _.slideCount - 1;
2730                loadRange = loadRange.add($slides.eq(prevSlide));
2731                loadRange = loadRange.add($slides.eq(nextSlide));
2732                prevSlide--;
2733                nextSlide++;
2734            }
2735        }
2736
2737        loadImages(loadRange);
2738
2739        if (_.slideCount <= _.options.slidesToShow) {
2740            cloneRange = _.$slider.find('.slick-slide');
2741            loadImages(cloneRange);
2742        } else
2743        if (_.currentSlide >= _.slideCount - _.options.slidesToShow) {
2744            cloneRange = _.$slider.find('.slick-cloned').slice(0, _.options.slidesToShow);
2745            loadImages(cloneRange);
2746        } else if (_.currentSlide === 0) {
2747            cloneRange = _.$slider.find('.slick-cloned').slice(_.options.slidesToShow * -1);
2748            loadImages(cloneRange);
2749        }
2750
2751    };
2752
2753    Slick.prototype.loadSlider = function() {
2754
2755        var _ = this;
2756
2757        _.setPosition();
2758
2759        _.$slideTrack.css({
2760            opacity: 1
2761        });
2762
2763        _.$slider.removeClass('slick-loading');
2764
2765        _.initUI();
2766
2767        if (_.options.lazyLoad === 'progressive') {
2768            _.progressiveLazyLoad();
2769        }
2770
2771    };
2772
2773    Slick.prototype.next = Slick.prototype.slickNext = function() {
2774
2775        var _ = this;
2776
2777        _.changeSlide({
2778            data: {
2779                message: 'next'
2780            }
2781        });
2782
2783    };
2784
2785    Slick.prototype.orientationChange = function() {
2786
2787        var _ = this;
2788
2789        _.checkResponsive();
2790        _.setPosition();
2791
2792    };
2793
2794    Slick.prototype.pause = Slick.prototype.slickPause = function() {
2795
2796        var _ = this;
2797
2798        _.autoPlayClear();
2799        _.paused = true;
2800
2801    };
2802
2803    Slick.prototype.play = Slick.prototype.slickPlay = function() {
2804
2805        var _ = this;
2806
2807        _.autoPlay();
2808        _.options.autoplay = true;
2809        _.paused = false;
2810        _.focussed = false;
2811        _.interrupted = false;
2812
2813    };
2814
2815    Slick.prototype.postSlide = function(index) {
2816
2817        var _ = this;
2818
2819        if( !_.unslicked ) {
2820
2821            _.$slider.trigger('afterChange', [_, index]);
2822
2823            _.animating = false;
2824
2825            if (_.slideCount > _.options.slidesToShow) {
2826                _.setPosition();
2827            }
2828
2829            _.swipeLeft = null;
2830
2831            if ( _.options.autoplay ) {
2832                _.autoPlay();
2833            }
2834
2835            _.updateSlideVisibility();
2836
2837        }
2838
2839    };
2840
2841    Slick.prototype.prev = Slick.prototype.slickPrev = function() {
2842
2843        var _ = this;
2844
2845        _.changeSlide({
2846            data: {
2847                message: 'previous'
2848            }
2849        });
2850
2851    };
2852
2853    Slick.prototype.preventDefault = function(event) {
2854
2855        event.preventDefault();
2856
2857    };
2858
2859    Slick.prototype.progressiveLazyLoad = function( tryCount ) {
2860
2861        tryCount = tryCount || 1;
2862
2863        var _ = this,
2864            $imgsToLoad = $( 'img[data-lazy]', _.$slider ),
2865            image,
2866            imageSource,
2867            imageSrcSet,
2868            imageSizes,
2869            imageToLoad;
2870
2871        if ( $imgsToLoad.length ) {
2872
2873            image = $imgsToLoad.first();
2874            imageSource = image.attr('data-lazy');
2875            imageSrcSet = image.attr('data-srcset');
2876            imageSizes  = image.attr('data-sizes') || _.$slider.attr('data-sizes');
2877            imageToLoad = document.createElement('img');
2878
2879            imageToLoad.onload = function() {
2880
2881                if (imageSrcSet) {
2882                    image
2883                        .attr('srcset', imageSrcSet );
2884
2885                    if (imageSizes) {
2886                        image
2887                            .attr('sizes', imageSizes );
2888                    }
2889                }
2890
2891                image
2892                    .attr( 'src', imageSource )
2893                    .removeAttr('data-lazy data-srcset data-sizes')
2894                    .removeClass('slick-loading');
2895
2896                if ( _.options.adaptiveHeight === true ) {
2897                    _.setPosition();
2898                }
2899
2900                _.$slider.trigger('lazyLoaded', [ _, image, imageSource ]);
2901                _.progressiveLazyLoad();
2902
2903            };
2904
2905            imageToLoad.onerror = function() {
2906
2907                if ( tryCount < 3 ) {
2908
2909                    /**
2910                     * try to load the image 3 times,
2911                     * leave a slight delay so we don't get
2912                     * servers blocking the request.
2913                     */
2914                    setTimeout( function() {
2915                        _.progressiveLazyLoad( tryCount + 1 );
2916                    }, 500 );
2917
2918                } else {
2919
2920                    image
2921                        .removeAttr( 'data-lazy' )
2922                        .removeClass( 'slick-loading' )
2923                        .addClass( 'slick-lazyload-error' );
2924
2925                    _.$slider.trigger('lazyLoadError', [ _, image, imageSource ]);
2926
2927                    _.progressiveLazyLoad();
2928
2929                }
2930
2931            };
2932
2933            imageToLoad.src = imageSource;
2934
2935        } else {
2936
2937            _.$slider.trigger('allImagesLoaded', [ _ ]);
2938
2939        }
2940
2941    };
2942
2943    Slick.prototype.refresh = function( initializing ) {
2944
2945        var _ = this, currentSlide, lastVisibleIndex;
2946
2947        lastVisibleIndex = _.slideCount - _.options.slidesToShow;
2948
2949        // in non-infinite sliders, we don't want to go past the
2950        // last visible index.
2951        if( !_.options.infinite && ( _.currentSlide > lastVisibleIndex )) {
2952            _.currentSlide = lastVisibleIndex;
2953        }
2954
2955        // if less slides than to show, go to start.
2956        if ( _.slideCount <= _.options.slidesToShow ) {
2957            _.currentSlide = 0;
2958
2959        }
2960
2961        currentSlide = _.currentSlide;
2962
2963        _.destroy(true);
2964
2965        $.extend(_, _.initials, { currentSlide: currentSlide });
2966
2967        _.init();
2968
2969        if( !initializing ) {
2970
2971            _.changeSlide({
2972                data: {
2973                    message: 'index',
2974                    index: currentSlide
2975                }
2976            }, false);
2977
2978        }
2979
2980    };
2981
2982    Slick.prototype.registerBreakpoints = function() {
2983
2984        var _ = this, breakpoint, currentBreakpoint, l,
2985            responsiveSettings = _.options.responsive || null;
2986
2987        if ( $.type(responsiveSettings) === 'array' && responsiveSettings.length ) {
2988
2989            _.respondTo = _.options.respondTo || 'window';
2990
2991            for ( breakpoint in responsiveSettings ) {
2992
2993                l = _.breakpoints.length-1;
2994
2995                if (responsiveSettings.hasOwnProperty(breakpoint)) {
2996                    currentBreakpoint = responsiveSettings[breakpoint].breakpoint;
2997
2998                    // loop through the breakpoints and cut out any existing
2999                    // ones with the same breakpoint number, we don't want dupes.
3000                    while( l >= 0 ) {
3001                        if( _.breakpoints[l] && _.breakpoints[l] === currentBreakpoint ) {
3002                            _.breakpoints.splice(l,1);
3003                        }
3004                        l--;
3005                    }
3006
3007                    _.breakpoints.push(currentBreakpoint);
3008                    _.breakpointSettings[currentBreakpoint] = responsiveSettings[breakpoint].settings;
3009
3010                }
3011
3012            }
3013
3014            _.breakpoints.sort(function(a, b) {
3015                return ( _.options.mobileFirst ) ? a-b : b-a;
3016            });
3017
3018        }
3019
3020    };
3021
3022    Slick.prototype.reinit = function() {
3023
3024        var _ = this;
3025
3026        _.$slides =
3027            _.$slideTrack
3028                .children(_.options.slide)
3029                .addClass('slick-slide');
3030
3031        _.slideCount = _.$slides.length;
3032
3033        if (_.currentSlide >= _.slideCount && _.currentSlide !== 0) {
3034            _.currentSlide = _.currentSlide - _.options.slidesToScroll;
3035        }
3036
3037        if (_.slideCount <= _.options.slidesToShow) {
3038            _.currentSlide = 0;
3039        }
3040
3041        _.registerBreakpoints();
3042
3043        _.setProps();
3044        _.setupInfinite();
3045        _.buildArrows();
3046        _.updateArrows();
3047        _.initArrowEvents();
3048        _.buildDots();
3049        _.updateDots();
3050        _.initDotEvents();
3051        _.cleanUpSlideEvents();
3052        _.initSlideEvents();
3053
3054        _.checkResponsive(false, true);
3055
3056        _.setSlideClasses(typeof _.currentSlide === 'number' ? _.currentSlide : 0);
3057
3058        _.setPosition();
3059        _.focusHandler();
3060
3061        _.paused = !_.options.autoplay;
3062        _.autoPlay();
3063
3064        _.$slider.trigger('reInit', [_]);
3065
3066    };
3067
3068    Slick.prototype.resize = function() {
3069
3070        var _ = this;
3071
3072        if ($(window).width() !== _.windowWidth) {
3073            clearTimeout(_.windowDelay);
3074            _.windowDelay = window.setTimeout(function() {
3075                _.windowWidth = $(window).width();
3076                _.checkResponsive();
3077                if( !_.unslicked ) { _.setPosition(); }
3078            }, 50);
3079        }
3080    };
3081
3082    Slick.prototype.removeSlide = Slick.prototype.slickRemove = function(index, removeBefore, removeAll) {
3083
3084        var _ = this;
3085
3086        if (typeof(index) === 'boolean') {
3087            removeBefore = index;
3088            index = removeBefore === true ? 0 : _.slideCount - 1;
3089        } else {
3090            index = removeBefore === true ? --index : index;
3091        }
3092
3093        if (_.slideCount < 1 || index < 0 || index > _.slideCount - 1) {
3094            return false;
3095        }
3096
3097        _.unload();
3098
3099        if (removeAll === true) {
3100            _.$slideTrack.children().remove();
3101        } else {
3102            _.$slideTrack.children(this.options.slide).eq(index).remove();
3103        }
3104
3105        _.$slides = _.$slideTrack.children(this.options.slide);
3106
3107        _.$slideTrack.children(this.options.slide).detach();
3108
3109        _.$slideTrack.append(_.$slides);
3110
3111        _.$slidesCache = _.$slides;
3112
3113        _.reinit();
3114
3115    };
3116
3117    Slick.prototype.setCSS = function(position) {
3118
3119        var _ = this,
3120            positionProps = {},
3121            x, y;
3122
3123        if (_.options.rtl === true) {
3124            position = -position;
3125        }
3126        x = _.positionProp == 'left' ? Math.ceil(position) + 'px' : '0px';
3127        y = _.positionProp == 'top' ? Math.ceil(position) + 'px' : '0px';
3128
3129        positionProps[_.positionProp] = position;
3130
3131        if (_.transformsEnabled === false) {
3132            _.$slideTrack.css(positionProps);
3133        } else {
3134            positionProps = {};
3135            if (_.cssTransitions === false) {
3136                positionProps[_.animType] = 'translate(' + x + ', ' + y + ')';
3137                _.$slideTrack.css(positionProps);
3138            } else {
3139                positionProps[_.animType] = 'translate3d(' + x + ', ' + y + ', 0px)';
3140                _.$slideTrack.css(positionProps);
3141            }
3142        }
3143
3144    };
3145
3146    Slick.prototype.setDimensions = function() {
3147
3148        var _ = this;
3149
3150        if (_.options.vertical === false) {
3151            if (_.options.centerMode === true) {
3152                _.$list.css({
3153                    padding: ('0px ' + _.options.centerPadding)
3154                });
3155            }
3156        } else {
3157            _.$list.height(_.$slides.first().outerHeight(true) * _.options.slidesToShow);
3158            if (_.options.centerMode === true) {
3159                _.$list.css({
3160                    padding: (_.options.centerPadding + ' 0px')
3161                });
3162            }
3163        }
3164
3165        _.listWidth = _.$list.width();
3166        _.listHeight = _.$list.height();
3167
3168
3169        if (_.options.vertical === false && _.options.variableWidth === false) {
3170            _.slideWidth = Math.ceil(_.listWidth / _.options.slidesToShow);
3171            _.$slideTrack.width(Math.ceil((_.slideWidth * _.$slideTrack.children('.slick-slide').length)));
3172
3173        } else if (_.options.variableWidth === true) {
3174            _.$slideTrack.width(5000 * _.slideCount);
3175        } else {
3176            _.slideWidth = Math.ceil(_.listWidth);
3177            _.$slideTrack.height(Math.ceil((_.$slides.first().outerHeight(true) * _.$slideTrack.children('.slick-slide').length)));
3178        }
3179
3180        var offset = _.$slides.first().outerWidth(true) - _.$slides.first().width();
3181        if (_.options.variableWidth === false) _.$slideTrack.children('.slick-slide').width(_.slideWidth - offset);
3182
3183    };
3184
3185    Slick.prototype.setFade = function() {
3186
3187        var _ = this,
3188            targetLeft;
3189
3190        _.$slides.each(function(index, element) {
3191            targetLeft = (_.slideWidth * index) * -1;
3192            if (_.options.rtl === true) {
3193                $(element).css({
3194                    position: 'relative',
3195                    right: targetLeft,
3196                    top: 0,
3197                    zIndex: _.options.zIndex - 2,
3198                    opacity: 0
3199                });
3200            } else {
3201                $(element).css({
3202                    position: 'relative',
3203                    left: targetLeft,
3204                    top: 0,
3205                    zIndex: _.options.zIndex - 2,
3206                    opacity: 0
3207                });
3208            }
3209        });
3210
3211        _.$slides.eq(_.currentSlide).css({
3212            zIndex: _.options.zIndex - 1,
3213            opacity: 1
3214        });
3215
3216    };
3217
3218    Slick.prototype.setHeight = function() {
3219
3220        var _ = this;
3221
3222        if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) {
3223            var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true);
3224            _.$list.css('height', targetHeight);
3225        }
3226
3227    };
3228
3229    Slick.prototype.setOption =
3230    Slick.prototype.slickSetOption = function() {
3231
3232        /**
3233         * accepts arguments in format of:
3234         *
3235         *  - for changing a single option's value:
3236         *     .slick("setOption", option, value, refresh )
3237         *
3238         *  - for changing a set of responsive options:
3239         *     .slick("setOption", 'responsive', [{}, ...], refresh )
3240         *
3241         *  - for updating multiple values at once (not responsive)
3242         *     .slick("setOption", { 'option': value, ... }, refresh )
3243         */
3244
3245        var _ = this, l, item, option, value, refresh = false, t
3245ype;
3246
3247        if( $.type( arguments[0] ) === 'object' ) {
3248
3249            option =  arguments[0];
3250            refresh = arguments[1];
3251            type = 'multiple';
3252
3253        } else if ( $.type( arguments[0] ) === 'string' ) {
3254
3255            option =  arguments[0];
3256            value = arguments[1];
3257            refresh = arguments[2];
3258
3259            if ( arguments[0] === 'responsive' && $.type( arguments[1] ) === 'array' ) {
3260
3261                type = 'responsive';
3262
3263            } else if ( typeof arguments[1] !== 'undefined' ) {
3264
3265                type = 'single';
3266
3267            }
3268
3269        }
3270
3271        if ( type === 'single' ) {
3272
3273            _.options[option] = value;
3274
3275
3276        } else if ( type === 'multiple' ) {
3277
3278            $.each( option , function( opt, val ) {
3279
3280                _.options[opt] = val;
3281
3282            });
3283
3284
3285        } else if ( type === 'responsive' ) {
3286
3287            for ( item in value ) {
3288
3289                if( $.type( _.options.responsive ) !== 'array' ) {
3290
3291                    _.options.responsive = [ value[item] ];
3292
3293                } else {
3294
3295                    l = _.options.responsive.length-1;
3296
3297                    // loop through the responsive object and splice out duplicates.
3298                    while( l >= 0 ) {
3299
3300                        if( _.options.responsive[l].breakpoint === value[item].breakpoint ) {
3301
3302                            _.options.responsive.splice(l,1);
3303
3304                        }
3305
3306                        l--;
3307
3308                    }
3309
3310                    _.options.responsive.push( value[item] );
3311
3312                }
3313
3314            }
3315
3316        }
3317
3318        if ( refresh ) {
3319
3320            _.unload();
3321            _.reinit();
3322
3323        }
3324
3325    };
3326
3327    Slick.prototype.setPosition = function() {
3328
3329        var _ = this;
3330
3331        _.setDimensions();
3332
3333        _.setHeight();
3334
3335        if (_.options.fade === false) {
3336            _.setCSS(_.getLeft(_.currentSlide));
3337        } else {
3338            _.setFade();
3339        }
3340
3341        _.$slider.trigger('setPosition', [_]);
3342
3343    };
3344
3345    Slick.prototype.setProps = function() {
3346
3347        var _ = this,
3348            bodyStyle = document.body.style;
3349
3350        _.positionProp = _.options.vertical === true ? 'top' : 'left';
3351
3352        if (_.positionProp === 'top') {
3353            _.$slider.addClass('slick-vertical');
3354        } else {
3355            _.$slider.removeClass('slick-vertical');
3356        }
3357
3358        if (bodyStyle.WebkitTransition !== undefined ||
3359            bodyStyle.MozTransition !== undefined ||
3360            bodyStyle.msTransition !== undefined) {
3361            if (_.options.useCSS === true) {
3362                _.cssTransitions = true;
3363            }
3364        }
3365
3366        if ( _.options.fade ) {
3367            if ( typeof _.options.zIndex === 'number' ) {
3368                if( _.options.zIndex < 3 ) {
3369                    _.options.zIndex = 3;
3370                }
3371            } else {
3372                _.options.zIndex = _.defaults.zIndex;
3373            }
3374        }
3375
3376        if (bodyStyle.OTransform !== undefined) {
3377            _.animType = 'OTransform';
3378            _.transformType = '-o-transform';
3379            _.transitionType = 'OTransition';
3380            if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false;
3381        }
3382        if (bodyStyle.MozTransform !== undefined) {
3383            _.animType = 'MozTransform';
3384            _.transformType = '-moz-transform';
3385            _.transitionType = 'MozTransition';
3386            if (bodyStyle.perspectiveProperty === undefined && bodyStyle.MozPerspective === undefined) _.animType = false;
3387        }
3388        if (bodyStyle.webkitTransform !== undefined) {
3389            _.animType = 'webkitTransform';
3390            _.transformType = '-webkit-transform';
3391            _.transitionType = 'webkitTransition';
3392            if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false;
3393        }
3394        if (bodyStyle.msTransform !== undefined) {
3395            _.animType = 'msTransform';
3396            _.transformType = '-ms-transform';
3397            _.transitionType = 'msTransition';
3398            if (bodyStyle.msTransform === undefined) _.animType = false;
3399        }
3400        if (bodyStyle.transform !== undefined && _.animType !== false) {
3401            _.animType = 'transform';
3402            _.transformType = 'transform';
3403            _.transitionType = 'transition';
3404        }
3405        _.transformsEnabled = _.options.useTransform && (_.animType !== null && _.animType !== false);
3406    };
3407
3408
3409    Slick.prototype.setSlideClasses = function(index) {
3410
3411        var _ = this,
3412            centerOffset, allSlides, indexOffset, remainder;
3413
3414        allSlides = _.$slider
3415            .find('.slick-slide')
3416            .removeClass('slick-active slick-center slick-current')
3417            .attr('aria-hidden', 'true')
3418            .attr('aria-label', function() {
3419                return $(this).attr('aria-label').replace(' (centered)', '');
3420            });
3421
3422        _.$slides
3423            .eq(index)
3424            .addClass('slick-current');
3425
3426        if (_.options.centerMode === true) {
3427
3428            var evenCoef = _.options.slidesToShow % 2 === 0 ? 1 : 0;
3429
3430            centerOffset = Math.floor(_.options.slidesToShow / 2);
3431
3432            if (_.options.infinite === true) {
3433
3434                if (index >= centerOffset && index <= (_.slideCount - 1) - centerOffset) {
3435                    _.$slides
3436                        .slice(index - centerOffset + evenCoef, index + centerOffset + 1)
3437                        .addClass('slick-active')
3438                        .removeAttr('aria-hidden');
3439
3440                } else {
3441
3442                    indexOffset = _.options.slidesToShow + index;
3443                    allSlides
3444                        .slice(indexOffset - centerOffset + 1 + evenCoef, indexOffset + centerOffset + 2)
3445                        .addClass('slick-active')
3446                        .removeAttr('aria-hidden');
3447
3448                }
3449
3450                if (index === 0) {
3451
3452                    allSlides
3453                        .eq( _.options.slidesToShow + _.slideCount + 1 )
3454                        .addClass('slick-center')
3455                        .attr('aria-label', function() {
3456                            return $(this).attr('aria-label') + ' (centered)';
3457                        });
3458
3459                } else if (index === _.slideCount - 1) {
3460
3461                    allSlides
3462                        .eq(_.options.slidesToShow)
3463                        .addClass('slick-center')
3464                        .attr('aria-label', function() {
3465                            return $(this).attr('aria-label') + ' (centered)';
3466                        });
3467
3468                }
3469
3470            }
3471
3472            _.$slides
3473                .eq(index)
3474                .addClass('slick-center')
3475                .attr('aria-label', function() {
3476                    return $(this).attr('aria-label') + ' (centered)';
3477                });
3478
3479        } else {
3480
3481            if (index >= 0 && index <= (_.slideCount - _.options.slidesToShow)) {
3482
3483                _.$slides
3484                    .slice(index, index + _.options.slidesToShow)
3485                    .addClass('slick-active')
3486                    .removeAttr('aria-hidden');
3487
3488            } else if (allSlides.length <= _.options.slidesToShow) {
3489
3490                allSlides
3491                    .addClass('slick-active')
3492                    .removeAttr('aria-hidden');
3493
3494            } else {
3495
3496                remainder = _.slideCount % _.options.slidesToShow;
3497                indexOffset = _.options.infinite === true ? _.options.slidesToShow + index : index;
3498
3499                if (_.options.slidesToShow == _.options.slidesToScroll && (_.slideCount - index) < _.options.slidesToShow) {
3500
3501                    allSlides
3502                        .slice(indexOffset - (_.options.slidesToShow - remainder), indexOffset + remainder)
3503                        .addClass('slick-active')
3504                        .removeAttr('aria-hidden');
3505
3506                } else {
3507
3508                    allSlides
3509                        .slice(indexOffset, indexOffset + _.options.slidesToShow)
3510                        .addClass('slick-active')
3511                        .removeAttr('aria-hidden');
3512
3513                }
3514
3515            }
3516
3517        }
3518
3519        if (_.options.lazyLoad === 'ondemand' || _.options.lazyLoad === 'anticipated') {
3520            _.lazyLoad();
3521        }
3522    };
3523
3524    Slick.prototype.setupInfinite = function() {
3525
3526        var _ = this,
3527            i, slideIndex, infiniteCount;
3528
3529        if (_.options.fade === true) {
3530            _.options.centerMode = false;
3531        }
3532
3533        if (_.options.infinite === true && _.options.fade === false) {
3534
3535            slideIndex = null;
3536
3537            if (_.slideCount > _.options.slidesToShow) {
3538
3539                if (_.options.centerMode === true) {
3540                    infiniteCount = _.options.slidesToShow + 1;
3541                } else {
3542                    infiniteCount = _.options.slidesToShow;
3543                }
3544
3545                for (i = _.slideCount; i > (_.slideCount -
3546                        infiniteCount); i -= 1) {
3547                    slideIndex = i - 1;
3548                    $(_.$slides[slideIndex]).clone(true).attr('id', '')
3549                        .attr('data-slick-index', slideIndex - _.slideCount)
3550                        .prependTo(_.$slideTrack).addClass('slick-cloned');
3551                }
3552                for (i = 0; i < infiniteCount  + _.slideCount; i += 1) {
3553                    slideIndex = i;
3554                    $(_.$slides[slideIndex]).clone(true).attr('id', '')
3555                        .attr('data-slick-index', slideIndex + _.slideCount)
3556                        .appendTo(_.$slideTrack).addClass('slick-cloned');
3557                }
3558                _.$slideTrack.find('.slick-cloned').find('[id]').each(function() {
3559                    $(this).attr('id', '');
3560                });
3561
3562            }
3563
3564        }
3565
3566    };
3567
3568    Slick.prototype.interrupt = function( toggle ) {
3569
3570        var _ = this;
3571
3572        if( !toggle ) {
3573            _.autoPlay();
3574        }
3575        _.interrupted = toggle;
3576
3577    };
3578
3579    Slick.prototype.selectHandler = function(event) {
3580
3581        var _ = this;
3582
3583        var targetElement =
3584            $(event.target).is('.slick-slide') ?
3585                $(event.target) :
3586                $(event.target).parents('.slick-slide');
3587
3588        var index = parseInt(targetElement.attr('data-slick-index'));
3589
3590        if (!index) index = 0;
3591
3592        if (_.slideCount <= _.options.slidesToShow) {
3593
3594            _.slideHandler(index, false, true);
3595            return;
3596
3597        }
3598
3599        _.slideHandler(index);
3600
3601    };
3602
3603    Slick.prototype.slideHandler = function(index, sync, dontAnimate) {
3604
3605        var targetSlide, animSlide, oldSlide, slideLeft, targetLeft = null,
3606            _ = this, navTarget;
3607
3608        sync = sync || false;
3609
3610        if (_.animating === true && _.options.waitForAnimate === true) {
3611            return;
3612        }
3613
3614        if (_.options.fade === true && _.currentSlide === index) {
3615            return;
3616        }
3617
3618        if (sync === false) {
3619            _.asNavFor(index);
3620        }
3621
3622        targetSlide = index;
3623        targetLeft = _.getLeft(targetSlide);
3624        slideLeft = _.getLeft(_.currentSlide);
3625
3626        _.currentLeft = _.swipeLeft === null ? slideLeft : _.swipeLeft;
3627
3628        if (_.options.infinite === false && _.options.centerMode === false && (index < 0 || index > _.getDotCount() * _.options.slidesToScroll)) {
3629            if (_.options.fade === false) {
3630                targetSlide = _.currentSlide;
3631                if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) {
3632                    _.animateSlide(slideLeft, function() {
3633                        _.postSlide(targetSlide);
3634                    });
3635                } else {
3636                    _.postSlide(targetSlide);
3637                }
3638            }
3639            return;
3640        } else if (_.options.infinite === false && _.options.centerMode === true && (index < 0 || index > (_.slideCount - _.options.slidesToScroll))) {
3641            if (_.options.fade === false) {
3642                targetSlide = _.currentSlide;
3643                if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) {
3644                    _.animateSlide(slideLeft, function() {
3645                        _.postSlide(targetSlide);
3646                    });
3647                } else {
3648                    _.postSlide(targetSlide);
3649                }
3650            }
3651            return;
3652        }
3653
3654        if ( _.options.autoplay ) {
3655            clearInterval(_.autoPlayTimer);
3656        }
3657
3658        if (targetSlide < 0) {
3659            if (_.slideCount % _.options.slidesToScroll !== 0) {
3660                animSlide = _.slideCount - (_.slideCount % _.options.slidesToScroll);
3661            } else {
3662                animSlide = _.slideCount + targetSlide;
3663            }
3664        } else if (targetSlide >= _.slideCount) {
3665            if (_.slideCount % _.options.slidesToScroll !== 0) {
3666                animSlide = 0;
3667            } else {
3668                animSlide = targetSlide - _.slideCount;
3669            }
3670        } else {
3671            animSlide = targetSlide;
3672        }
3673
3674        _.animating = true;
3675
3676        _.$slider.trigger('beforeChange', [_, _.currentSlide, animSlide]);
3677
3678        oldSlide = _.currentSlide;
3679        _.currentSlide = animSlide;
3680
3681        _.setSlideClasses(_.currentSlide);
3682
3683        if ( _.options.asNavFor ) {
3684
3685            navTarget = _.getNavTarget();
3686            navTarget = navTarget.slick('getSlick');
3687
3688            if ( navTarget.slideCount <= navTarget.options.slidesToShow ) {
3689                navTarget.setSlideClasses(_.currentSlide);
3690            }
3691
3692        }
3693
3694        _.updateDots();
3695        _.updateArrows();
3696
3697        if (_.options.fade === true) {
3698            if (dontAnimate !== true) {
3699
3700                _.fadeSlideOut(oldSlide);
3701
3702                _.fadeSlide(animSlide, function() {
3703                    _.postSlide(animSlide);
3704                });
3705
3706            } else {
3707                _.postSlide(animSlide);
3708            }
3709            _.animateHeight();
3710            return;
3711        }
3712
3713        if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) {
3714            _.animateSlide(targetLeft, function() {
3715                _.postSlide(animSlide);
3716            });
3717        } else {
3718            _.postSlide(animSlide);
3719        }
3720
3721    };
3722
3723    Slick.prototype.startLoad = function() {
3724
3725        var _ = this;
3726
3727        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {
3728
3729            _.$prevArrow.hide();
3730            _.$nextArrow.hide();
3731
3732        }
3733
3734        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {
3735
3736            _.$dots.hide();
3737
3738        }
3739
3740        _.$slider.addClass('slick-loading');
3741
3742    };
3743
3744    Slick.prototype.swipeDirection = function() {
3745
3746        var xDist, yDist, r, swipeAngle, _ = this;
3747
3748        xDist = _.touchObject.startX - _.touchObject.curX;
3749        yDist = _.touchObject.startY - _.touchObject.curY;
3750        r = Math.atan2(yDist, xDist);
3751
3752        swipeAngle = Math.round(r * 180 / Math.PI);
3753        if (swipeAngle < 0) {
3754            swipeAngle = 360 - Math.abs(swipeAngle);
3755        }
3756
3757        if ((swipeAngle <= 45) && (swipeAngle >= 0)) {
3758            return (_.options.rtl === false ? 'left' : 'right');
3759        }
3760        if ((swipeAngle <= 360) && (swipeAngle >= 315)) {
3761            return (_.options.rtl === false ? 'left' : 'right');
3762        }
3763        if ((swipeAngle >= 135) && (swipeAngle <= 225)) {
3764            return (_.options.rtl === false ? 'right' : 'left');
3765        }
3766        if (_.options.verticalSwiping === true) {
3767            if ((swipeAngle >= 35) && (swipeAngle <= 135)) {
3768                return 'down';
3769            } else {
3770                return 'up';
3771            }
3772        }
3773
3774        return 'vertical';
3775
3776    };
3777
3778    Slick.prototype.swipeEnd = function(event) {
3779
3780        var _ = this,
3781            slideCount,
3782            direction;
3783
3784        _.dragging = false;
3785        _.swiping = false;
3786
3787        if (_.scrolling) {
3788            _.scrolling = false;
3789            return false;
3790        }
3791
3792        _.interrupted = false;
3793        _.shouldClick = ( _.touchObject.swipeLength > 10 ) ? false : true;
3794
3795        if ( _.touchObject.curX === undefined ) {
3796            return false;
3797        }
3798
3799        if ( _.touchObject.edgeHit === true ) {
3800            _.$slider.trigger('edge', [_, _.swipeDirection() ]);
3801        }
3802
3803        if ( _.touchObject.swipeLength >= _.touchObject.minSwipe ) {
3804
3805            direction = _.swipeDirection();
3806
3807            switch ( direction ) {
3808
3809                case 'left':
3810                case 'down':
3811
3812                    slideCount =
3813                        _.options.swipeToSlide ?
3814                            _.checkNavigable( _.currentSlide + _.getSlideCount() ) :
3815                            _.currentSlide + _.getSlideCount();
3816
3817                    _.currentDirection = 0;
3818
3819                    break;
3820
3821                case 'right':
3822                case 'up':
3823
3824                    slideCount =
3825                        _.options.swipeToSlide ?
3826                            _.checkNavigable( _.currentSlide - _.getSlideCount() ) :
3827                            _.currentSlide - _.getSlideCount();
3828
3829                    _.currentDirection = 1;
3830
3831                    break;
3832
3833                default:
3834
3835
3836            }
3837
3838            if( direction != 'vertical' ) {
3839
3840                _.slideHandler( slideCount );
3841                _.touchObject = {};
3842                _.$slider.trigger('swipe', [_, direction ]);
3843
3844            }
3845
3846        } else {
3847
3848            if ( _.touchObject.startX !== _.touchObject.curX ) {
3849
3850                _.slideHandler( _.currentSlide );
3851                _.touchObject = {};
3852
3853            }
3854
3855        }
3856
3857    };
3858
3859    Slick.prototype.swipeHandler = function(event) {
3860
3861        var _ = this;
3862
3863        if ((_.options.swipe === false) || ('ontouchend' in document && _.options.swipe === false)) {
3864            return;
3865        } else if (_.options.draggable === false && event.type.indexOf('mouse') !== -1) {
3866            return;
3867        }
3868
3869        _.touchObject.fingerCount = event.originalEvent && event.originalEvent.touches !== undefined ?
3870            event.originalEvent.touches.length : 1;
3871
3872        _.touchObject.minSwipe = _.listWidth / _.options
3873            .touchThreshold;
3874
3875        if (_.options.verticalSwiping === true) {
3876            _.touchObject.minSwipe = _.listHeight / _.options
3877                .touchThreshold;
3878        }
3879
3880        switch (event.data.action) {
3881
3882            case 'start':
3883                _.swipeStart(event);
3884                break;
3885
3886            case 'move':
3887                _.swipeMove(event);
3888                break;
3889
3890            case 'end':
3891                _.swipeEnd(event);
3892                break;
3893
3894        }
3895
3896    };
3897
3898    Slick.prototype.swipeMove = function(event) {
3899
3900        var _ = this,
3901            edgeWasHit = false,
3902            curLeft, swipeDirection, swipeLength, positionOffset, touches, verticalSwipeLength;
3903
3904        touches = event.originalEvent !== undefined ? event.originalEvent.touches : null;
3905
3906        if (!_.dragging || _.scrolling || touches && touches.length !== 1) {
3907            return false;
3908        }
3909
3910        curLeft = _.getLeft(_.currentSlide);
3911
3912        _.touchObject.curX = touches !== undefined ? touches[0].pageX : event.clientX;
3913        _.touchObject.curY = touches !== undefined ? touches[0].pageY : event.clientY;
3914
3915        _.touchObject.swipeLength = Math.round(Math.sqrt(
3916            Math.pow(_.touchObject.curX - _.touchObject.startX, 2)));
3917
3918        verticalSwipeLength = Math.round(Math.sqrt(
3919            Math.pow(_.touchObject.curY - _.touchObject.startY, 2)));
3920
3921        if (!_.options.verticalSwiping && !_.swiping && verticalSwipeLength > 4) {
3922            _.scrolling = true;
3923            return false;
3924        }
3925
3926        if (_.options.verticalSwiping === true) {
3927            _.touchObject.swipeLength = verticalSwipeLength;
3928        }
3929
3930        swipeDirection = _.swipeDirection();
3931
3932        if (event.originalEvent !== undefined && _.touchObject.swipeLength > 4) {
3933            _.swiping = true;
3934            event.preventDefault();
3935        }
3936
3937        positionOffset = (_.options.rtl === false ? 1 : -1) * (_.touchObject.curX > _.touchObject.startX ? 1 : -1);
3938        if (_.options.verticalSwiping === true) {
3939            positionOffset = _.touchObject.curY > _.touchObject.startY ? 1 : -1;
3940        }
3941
3942
3943        swipeLength = _.touchObject.swipeLength;
3944
3945        _.touchObject.edgeHit = false;
3946
3947        if (_.options.infinite === false) {
3948            if ((_.currentSlide === 0 && swipeDirection === 'right') || (_.currentSlide >= _.getDotCount() && swipeDirection === 'left')) {
3949                swipeLength = _.touchObject.swipeLength * _.options.edgeFriction;
3950                _.touchObject.edgeHit = true;
3951            }
3952        }
3953
3954        if (_.options.vertical === false) {
3955            _.swipeLeft = curLeft + swipeLength * positionOffset;
3956        } else {
3957            _.swipeLeft = curLeft + (swipeLength * (_.$list.height() / _.listWidth)) * positionOffset;
3958        }
3959        if (_.options.verticalSwiping === true) {
3960            _.swipeLeft = curLeft + swipeLength * positionOffset;
3961        }
3962
3963        if (_.options.fade === true || _.options.touchMove === false) {
3964            return false;
3965        }
3966
3967        if (_.animating === true) {
3968            _.swipeLeft = null;
3969            return false;
3970        }
3971
3972        _.setCSS(_.swipeLeft);
3973
3974    };
3975
3976    Slick.prototype.swipeStart = function(event) {
3977
3978        var _ = this,
3979            touches;
3980
3981        _.interrupted = true;
3982
3983        if (_.touchObject.fingerCount !== 1 || _.slideCount <= _.options.slidesToShow) {
3984            _.touchObject = {};
3985            return false;
3986        }
3987
3988        if (event.originalEvent !== undefined && event.originalEvent.touches !== undefined) {
3989            touches = event.originalEvent.touches[0];
3990        }
3991
3992        _.touchObject.startX = _.touchObject.curX = touches !== undefined ? touches.pageX : event.clientX;
3993        _.touchObject.startY = _.touchObject.curY = touches !== undefined ? touches.pageY : event.clientY;
3994
3995        _.dragging = true;
3996
3997    };
3998
3999    Slick.prototype.unfilterSlides = Slick.prototype.slickUnfilter = function() {
4000
4001        var _ = this;
4002
4003        if (_.$slidesCache !== null) {
4004
4005            _.unload();
4006
4007            _.$slideTrack.children(this.options.slide).detach();
4008
4009            _.$slidesCache.appendTo(_.$slideTrack);
4010
4011            _.reinit();
4012
4013        }
4014
4015    };
4016
4017    Slick.prototype.unload = function() {
4018
4019        var _ = this;
4020
4021        $('.slick-cloned', _.$slider).remove();
4022
4023        if (_.$dots) {
4024            _.$dots.remove();
4025        }
4026
4027        if (_.$prevArrow && _.htmlExpr.test(_.options.prevArrow)) {
4028            _.$prevArrow.remove();
4029        }
4030
4031        if (_.$nextArrow && _.htmlExpr.test(_.options.nextArrow)) {
4032            _.$nextArrow.remove();
4033        }
4034
4035        _.$slides
4036            .removeClass('slick-slide slick-active slick-visible slick-current')
4037            .attr('aria-hidden', 'true')
4038            .css('width', '');
4039
4040    };
4041
4042    Slick.prototype.unslick = function(fromBreakpoint) {
4043
4044        var _ = this;
4045        _.$slider.trigger('unslick', [_, fromBreakpoint]);
4046        _.destroy();
4047
4048    };
4049
4050    Slick.prototype.updateArrows = function() {
4051
4052        var _ = this,
4053            centerOffset;
4054
4055        centerOffset = Math.floor(_.options.slidesToShow / 2);
4056
4057        if ( _.options.arrows === true &&
4058            _.slideCount > _.options.slidesToShow &&
4059            !_.options.infinite ) {
4060
4061            _.$prevArrow.removeClass('slick-disabled').prop('disabled', false);
4062            _.$nextArrow.removeClass('slick-disabled').prop('disabled', false);
4063
4064            if (_.currentSlide === 0) {
4065
4066                _.$prevArrow.addClass('slick-disabled').prop('disabled', true);
4067                _.$nextArrow.removeClass('slick-disabled').prop('disabled', false);
4068
4069            } else if (_.currentSlide >= _.slideCount - _.options.slidesToShow && _.options.centerMode === false) {
4070
4071                _.$nextArrow.addClass('slick-disabled').prop('disabled', true);
4072                _.$prevArrow.removeClass('slick-disabled').prop('disabled', false);
4073
4074            } else if (_.currentSlide >= _.slideCount - 1 && _.options.centerMode === true) {
4075
4076                _.$nextArrow.addClass('slick-disabled').prop('disabled', true);
4077                _.$prevArrow.removeClass('slick-disabled').prop('disabled', false);
4078
4079            }
4080
4081        }
4082
4083    };
4084
4085    Slick.prototype.updateDots = function() {
4086
4087        var _ = this;
4088
4089        if (_.$dots !== null) {
4090
4091            _.$dots
4092                .find('li')
4093                    .removeClass('slick-active')
4094                    .find('button')
4095                        .removeAttr('aria-current')
4096                        .end()
4097                    .end();
4098
4099            _.$dots
4100                .find('li')
4101                .eq(Math.floor(_.currentSlide / _.options.slidesToScroll))
4102                    .addClass('slick-active')
4103                    .find('button')
4104                        .attr('aria-current', true)
4105                        .end()
4106                    .end();
4107
4108        }
4109
4110    };
4111
4112    Slick.prototype.updateSlideVisibility = function() {
4113        var _ = this;
4114
4115        _.$slideTrack
4116            .find('.slick-slide')
4117                .attr('aria-hidden', 'true')
4118                .find('a, input, button, select')
4119                    .attr('tabindex', '-1');
4120
4121        _.$slideTrack
4122            .find('.slick-active')
4123                .removeAttr('aria-hidden')
4124                .find('a, input, button, select')
4125                    .removeAttr('tabindex');
4126    }
4127
4128    Slick.prototype.visibility = function() {
4129
4130        var _ = this;
4131
4132        if ( _.options.autoplay ) {
4133
4134            if ( document[_.hidden] ) {
4135
4136                _.interrupted = true;
4137
4138            } else {
4139
4140                _.interrupted = false;
4141
4142            }
4143
4144        }
4145
4146    };
4147
4148    $.fn.slick = function() {
4149        var _ = this,
4150            opt = arguments[0],
4151            args = Array.prototype.slice.call(arguments, 1),
4152            l = _.length,
4153            i,
4154            ret;
4155        for (i = 0; i < l; i++) {
4156            if (typeof opt == 'object' || typeof opt == 'undefined')
4157                _[i].slick = new Slick(_[i], opt);
4158            else
4159                ret = _[i].slick[opt].apply(_[i].slick, args);
4160            if (typeof ret != 'undefined') return ret;
4161        }
4162        return _;
4163    };
4164
4165}));
4166
4167},{"jquery":38}],12:[function(require,module,exports){
4168function _assertThisInitialized(e) {
4169  if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
4170  return e;
4171}
4172module.exports = _assertThisInitialized, module.exports.__esModule = true, module.exports["default"] = module.exports;
4173},{}],13:[function(require,module,exports){
4174function _classCallCheck(a, n) {
4175  if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function");
4176}
4177module.exports = _classCallCheck, module.exports.__esModule = true, module.exports["default"] = module.exports;
4178},{}],14:[function(require,module,exports){
4179var toPropertyKey = require("./toPropertyKey.js");
4180function _defineProperties(e, r) {
4181  for (var t = 0; t < r.length; t++) {
4182    var o = r[t];
4183    o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, toPropertyKey(o.key), o);
4184  }
4185}
4186function _createClass(e, r, t) {
4187  return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", {
4188    writable: !1
4189  }), e;
4190}
4191module.exports = _createClass, module.exports.__esModule = true, module.exports["default"] = module.exports;
4192},{"./toPropertyKey.js":24}],15:[function(require,module,exports){
4193var toPropertyKey = require("./toPropertyKey.js");
4194function _defineProperty(e, r, t) {
4195  return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
4196    value: t,
4197    enumerable: !0,
4198    configurable: !0,
4199    writable: !0
4200  }) : e[r] = t, e;
4201}
4202module.exports = _defineProperty, module.exports.__esModule = true, module.exports["default"] = module.exports;
4203},{"./toPropertyKey.js":24}],16:[function(require,module,exports){
4204var superPropBase = require("./superPropBase.js");
4205function _get() {
4206  return module.exports = _get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) {
4207    var p = superPropBase(e, t);
4208    if (p) {
4209      var n = Object.getOwnPropertyDescriptor(p, t);
4210      return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value;
4211    }
4212  }, module.exports.__esModule = true, module.exports["default"] = module.exports, _get.apply(null, arguments);
4213}
4214module.exports = _get, module.exports.__esModule = true, module.exports["default"] = module.exports;
4215},{"./superPropBase.js":22}],17:[function(require,module,exports){
4216function _getPrototypeOf(t) {
4217  return module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) {
4218    return t.__proto__ || Object.getPrototypeOf(t);
4219  }, module.exports.__esModule = true, module.exports["default"] = module.exports, _getPrototypeOf(t);
4220}
4221module.exports = _getPrototypeOf, module.exports.__esModule = true, module.exports["default"] = module.exports;
4222},{}],18:[function(require,module,exports){
4223var setPrototypeOf = require("./setPrototypeOf.js");
4224function _inherits(t, e) {
4225  if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function");
4226  t.prototype = Object.create(e && e.prototype, {
4227    constructor: {
4228      value: t,
4229      writable: !0,
4230      configurable: !0
4231    }
4232  }), Object.defineProperty(t, "prototype", {
4233    writable: !1
4234  }), e && setPrototypeOf(t, e);
4235}
4236module.exports = _inherits, module.exports.__esModule = true, module.exports["default"] = module.exports;
4237},{"./setPrototypeOf.js":21}],19:[function(require,module,exports){
4238function _interopRequireDefault(e) {
4239  return e && e.__esModule ? e : {
4240    "default": e
4241  };
4242}
4243module.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports["default"] = module.exports;
4244},{}],20:[function(require,module,exports){
4245var _typeof = require("./typeof.js")["default"];
4246var assertThisInitialized = require("./assertThisInitialized.js");
4247function _possibleConstructorReturn(t, e) {
4248  if (e && ("object" == _typeof(e) || "function" == typeof e)) return e;
4249  if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined");
4250  return assertThisInitialized(t);
4251}
4252module.exports = _possibleConstructorReturn, module.exports.__esModule = true, module.exports["default"] = module.exports;
4253},{"./assertThisInitialized.js":12,"./typeof.js":25}],21:[function(require,module,exports){
4254function _setPrototypeOf(t, e) {
4255  return module.exports = _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {
4256    return t.__proto__ = e, t;
4257  }, module.exports.__esModule = true, module.exports["default"] = module.exports, _setPrototypeOf(t, e);
4258}
4259module.exports = _setPrototypeOf, module.exports.__esModule = true, module.exports["default"] = module.exports;
4260},{}],22:[function(require,module,exports){
4261var getPrototypeOf = require("./getPrototypeOf.js");
4262function _superPropBase(t, o) {
4263  for (; !{}.hasOwnProperty.call(t, o) && null !== (t = getPrototypeOf(t)););
4264  return t;
4265}
4266module.exports = _superPropBase, module.exports.__esModule = true, module.exports["default"] = module.exports;
4267},{"./getPrototypeOf.js":17}],23:[function(require,module,exports){
4268var _typeof = require("./typeof.js")["default"];
4269function toPrimitive(t, r) {
4270  if ("object" != _typeof(t) || !t) return t;
4271  var e = t[Symbol.toPrimitive];
4272  if (void 0 !== e) {
4273    var i = e.call(t, r || "default");
4274    if ("object" != _typeof(i)) return i;
4275    throw new TypeError("@@toPrimitive must return a primitive value.");
4276  }
4277  return ("string" === r ? String : Number)(t);
4278}
4279module.exports = toPrimitive, module.exports.__esModule = true, module.exports["default"] = module.exports;
4280},{"./typeof.js":25}],24:[function(require,module,exports){
4281var _typeof = require("./typeof.js")["default"];
4282var toPrimitive = require("./toPrimitive.js");
4283function toPropertyKey(t) {
4284  var i = toPrimitive(t, "string");
4285  return "symbol" == _typeof(i) ? i : i + "";
4286}
4287module.exports = toPropertyKey, module.exports.__esModule = true, module.exports["default"] = module.exports;
4288},{"./toPrimitive.js":23,"./typeof.js":25}],25:[function(require,module,exports){
4289function _typeof(o) {
4290  "@babel/helpers - typeof";
4291
4292  return module.exports = _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
4293    return typeof o;
4294  } : function (o) {
4295    return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
4296  }, module.exports.__esModule = true, module.exports["default"] = module.exports, _typeof(o);
4297}
4298module.exports = _typeof, module.exports.__esModule = true, module.exports["default"] = module.exports;
4299},{}],26:[function(require,module,exports){
4300/*!
4301  * Bootstrap v4.6.2 (https://getbootstrap.com/)
4302  * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4303  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4304  */
4305(function (global, factory) {
4306  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery'), require('popper.js')) :
4307  typeof define === 'function' && define.amd ? define(['exports', 'jquery', 'popper.js'], factory) :
4308  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.bootstrap = {}, global.jQuery, global.Popper));
4309})(this, (function (exports, $, Popper) { 'use strict';
4310
4311  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
4312
4313  var $__default = /*#__PURE__*/_interopDefaultLegacy($);
4314  var Popper__default = /*#__PURE__*/_interopDefaultLegacy(Popper);
4315
4316  function _defineProperties(target, props) {
4317    for (var i = 0; i < props.length; i++) {
4318      var descriptor = props[i];
4319      descriptor.enumerable = descriptor.enumerable || false;
4320      descriptor.configurable = true;
4321      if ("value" in descriptor) descriptor.writable = true;
4322      Object.defineProperty(target, descriptor.key, descriptor);
4323    }
4324  }
4325
4326  function _createClass(Constructor, protoProps, staticProps) {
4327    if (protoProps) _defineProperties(Constructor.prototype, protoProps);
4328    if (staticProps) _defineProperties(Constructor, staticProps);
4329    Object.defineProperty(Constructor, "prototype", {
4330      writable: false
4331    });
4332    return Constructor;
4333  }
4334
4335  function _extends() {
4336    _extends = Object.assign ? Object.assign.bind() : function (target) {
4337      for (var i = 1; i < arguments.length; i++) {
4338        var source = arguments[i];
4339
4340        for (var key in source) {
4341          if (Object.prototype.hasOwnProperty.call(source, key)) {
4342            target[key] = source[key];
4343          }
4344        }
4345      }
4346
4347      return target;
4348    };
4349    return _extends.apply(this, arguments);
4350  }
4351
4352  function _inheritsLoose(subClass, superClass) {
4353    subClass.prototype = Object.create(superClass.prototype);
4354    subClass.prototype.constructor = subClass;
4355
4356    _setPrototypeOf(subClass, superClass);
4357  }
4358
4359  function _setPrototypeOf(o, p) {
4360    _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {
4361      o.__proto__ = p;
4362      return o;
4363    };
4364    return _setPrototypeOf(o, p);
4365  }
4366
4367  /**
4368   * --------------------------------------------------------------------------
4369   * Bootstrap (v4.6.2): util.js
4370   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4371   * --------------------------------------------------------------------------
4372   */
4373  /**
4374   * Private TransitionEnd Helpers
4375   */
4376
4377  var TRANSITION_END = 'transitionend';
4378  var MAX_UID = 1000000;
4379  var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
4380
4381  function toType(obj) {
4382    if (obj === null || typeof obj === 'undefined') {
4383      return "" + obj;
4384    }
4385
4386    return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
4387  }
4388
4389  function getSpecialTransitionEndEvent() {
4390    return {
4391      bindType: TRANSITION_END,
4392      delegateType: TRANSITION_END,
4393      handle: function handle(event) {
4394        if ($__default["default"](event.target).is(this)) {
4395          return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params
4396        }
4397
4398        return undefined;
4399      }
4400    };
4401  }
4402
4403  function transitionEndEmulator(duration) {
4404    var _this = this;
4405
4406    var called = false;
4407    $__default["default"](this).one(Util.TRANSITION_END, function () {
4408      called = true;
4409    });
4410    setTimeout(function () {
4411      if (!called) {
4412        Util.triggerTransitionEnd(_this);
4413      }
4414    }, duration);
4415    return this;
4416  }
4417
4418  function setTransitionEndSupport() {
4419    $__default["default"].fn.emulateTransitionEnd = transitionEndEmulator;
4420    $__default["default"].event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();
4421  }
4422  /**
4423   * Public Util API
4424   */
4425
4426
4427  var Util = {
4428    TRANSITION_END: 'bsTransitionEnd',
4429    getUID: function getUID(prefix) {
4430      do {
4431        // eslint-disable-next-line no-bitwise
4432        prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here
4433      } while (document.getElementById(prefix));
4434
4435      return prefix;
4436    },
4437    getSelectorFromElement: function getSelectorFromElement(element) {
4438      var selector = element.getAttribute('data-target');
4439
4440      if (!selector || selector === '#') {
4441        var hrefAttr = element.getAttribute('href');
4442        selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : '';
4443      }
4444
4445      try {
4446        return document.querySelector(selector) ? selector : null;
4447      } catch (_) {
4448        return null;
4449      }
4450    },
4451    getTransitionDurationFromElement: function getTransitionDurationFromElement(element) {
4452      if (!element) {
4453        return 0;
4454      } // Get transition-duration of the element
4455
4456
4457      var transitionDuration = $__default["default"](element).css('transition-duration');
4458      var transitionDelay = $__default["default"](element).css('transition-delay');
4459      var floatTransitionDuration = parseFloat(transitionDuration);
4460      var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
4461
4462      if (!floatTransitionDuration && !floatTransitionDelay) {
4463        return 0;
4464      } // If multiple durations are defined, take the first
4465
4466
4467      transitionDuration = transitionDuration.split(',')[0];
4468      transitionDelay = transitionDelay.split(',')[0];
4469      return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
4470    },
4471    reflow: function reflow(element) {
4472      return element.offsetHeight;
4473    },
4474    triggerTransitionEnd: function triggerTransitionEnd(element) {
4475      $__default["default"](element).trigger(TRANSITION_END);
4476    },
4477    supportsTransitionEnd: function supportsTransitionEnd() {
4478      return Boolean(TRANSITION_END);
4479    },
4480    isElement: function isElement(obj) {
4481      return (obj[0] || obj).nodeType;
4482    },
4483    typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {
4484      for (var property in configTypes) {
4485        if (Object.prototype.hasOwnProperty.call(configTypes, property)) {
4486          var expectedTypes = configTypes[property];
4487          var value = config[property];
4488          var valueType = value && Util.isElement(value) ? 'element' : toType(value);
4489
4490          if (!new RegExp(expectedTypes).test(valueType)) {
4491            throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\"."));
4492          }
4493        }
4494      }
4495    },
4496    findShadowRoot: function findShadowRoot(element) {
4497      if (!document.documentElement.attachShadow) {
4498        return null;
4499      } // Can find the shadow root otherwise it'll return the document
4500
4501
4502      if (typeof element.getRootNode === 'function') {
4503        var root = element.getRootNode();
4504        return root instanceof ShadowRoot ? root : null;
4505      }
4506
4507      if (element instanceof ShadowRoot) {
4508        return element;
4509      } // when we don't find a shadow root
4510
4511
4512      if (!element.parentNode) {
4513        return null;
4514      }
4515
4516      return Util.findShadowRoot(element.parentNode);
4517    },
4518    jQueryDetection: function jQueryDetection() {
4519      if (typeof $__default["default"] === 'undefined') {
4520        throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.');
4521      }
4522
4523      var version = $__default["default"].fn.jquery.split(' ')[0].split('.');
4524      var minMajor = 1;
4525      var ltMajor = 2;
4526      var minMinor = 9;
4527      var minPatch = 1;
4528      var maxMajor = 4;
4529
4530      if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >
4530= maxMajor) {
4531        throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');
4532      }
4533    }
4534  };
4535  Util.jQueryDetection();
4536  setTransitionEndSupport();
4537
4538  /**
4539   * Constants
4540   */
4541
4542  var NAME$a = 'alert';
4543  var VERSION$a = '4.6.2';
4544  var DATA_KEY$a = 'bs.alert';
4545  var EVENT_KEY$a = "." + DATA_KEY$a;
4546  var DATA_API_KEY$7 = '.data-api';
4547  var JQUERY_NO_CONFLICT$a = $__default["default"].fn[NAME$a];
4548  var CLASS_NAME_ALERT = 'alert';
4549  var CLASS_NAME_FADE$5 = 'fade';
4550  var CLASS_NAME_SHOW$7 = 'show';
4551  var EVENT_CLOSE = "close" + EVENT_KEY$a;
4552  var EVENT_CLOSED = "closed" + EVENT_KEY$a;
4553  var EVENT_CLICK_DATA_API$6 = "click" + EVENT_KEY$a + DATA_API_KEY$7;
4554  var SELECTOR_DISMISS = '[data-dismiss="alert"]';
4555  /**
4556   * Class definition
4557   */
4558
4559  var Alert = /*#__PURE__*/function () {
4560    function Alert(element) {
4561      this._element = element;
4562    } // Getters
4563
4564
4565    var _proto = Alert.prototype;
4566
4567    // Public
4568    _proto.close = function close(element) {
4569      var rootElement = this._element;
4570
4571      if (element) {
4572        rootElement = this._getRootElement(element);
4573      }
4574
4575      var customEvent = this._triggerCloseEvent(rootElement);
4576
4577      if (customEvent.isDefaultPrevented()) {
4578        return;
4579      }
4580
4581      this._removeElement(rootElement);
4582    };
4583
4584    _proto.dispose = function dispose() {
4585      $__default["default"].removeData(this._element, DATA_KEY$a);
4586      this._element = null;
4587    } // Private
4588    ;
4589
4590    _proto._getRootElement = function _getRootElement(element) {
4591      var selector = Util.getSelectorFromElement(element);
4592      var parent = false;
4593
4594      if (selector) {
4595        parent = document.querySelector(selector);
4596      }
4597
4598      if (!parent) {
4599        parent = $__default["default"](element).closest("." + CLASS_NAME_ALERT)[0];
4600      }
4601
4602      return parent;
4603    };
4604
4605    _proto._triggerCloseEvent = function _triggerCloseEvent(element) {
4606      var closeEvent = $__default["default"].Event(EVENT_CLOSE);
4607      $__default["default"](element).trigger(closeEvent);
4608      return closeEvent;
4609    };
4610
4611    _proto._removeElement = function _removeElement(element) {
4612      var _this = this;
4613
4614      $__default["default"](element).removeClass(CLASS_NAME_SHOW$7);
4615
4616      if (!$__default["default"](element).hasClass(CLASS_NAME_FADE$5)) {
4617        this._destroyElement(element);
4618
4619        return;
4620      }
4621
4622      var transitionDuration = Util.getTransitionDurationFromElement(element);
4623      $__default["default"](element).one(Util.TRANSITION_END, function (event) {
4624        return _this._destroyElement(element, event);
4625      }).emulateTransitionEnd(transitionDuration);
4626    };
4627
4628    _proto._destroyElement = function _destroyElement(element) {
4629      $__default["default"](element).detach().trigger(EVENT_CLOSED).remove();
4630    } // Static
4631    ;
4632
4633    Alert._jQueryInterface = function _jQueryInterface(config) {
4634      return this.each(function () {
4635        var $element = $__default["default"](this);
4636        var data = $element.data(DATA_KEY$a);
4637
4638        if (!data) {
4639          data = new Alert(this);
4640          $element.data(DATA_KEY$a, data);
4641        }
4642
4643        if (config === 'close') {
4644          data[config](this);
4645        }
4646      });
4647    };
4648
4649    Alert._handleDismiss = function _handleDismiss(alertInstance) {
4650      return function (event) {
4651        if (event) {
4652          event.preventDefault();
4653        }
4654
4655        alertInstance.close(this);
4656      };
4657    };
4658
4659    _createClass(Alert, null, [{
4660      key: "VERSION",
4661      get: function get() {
4662        return VERSION$a;
4663      }
4664    }]);
4665
4666    return Alert;
4667  }();
4668  /**
4669   * Data API implementation
4670   */
4671
4672
4673  $__default["default"](document).on(EVENT_CLICK_DATA_API$6, SELECTOR_DISMISS, Alert._handleDismiss(new Alert()));
4674  /**
4675   * jQuery
4676   */
4677
4678  $__default["default"].fn[NAME$a] = Alert._jQueryInterface;
4679  $__default["default"].fn[NAME$a].Constructor = Alert;
4680
4681  $__default["default"].fn[NAME$a].noConflict = function () {
4682    $__default["default"].fn[NAME$a] = JQUERY_NO_CONFLICT$a;
4683    return Alert._jQueryInterface;
4684  };
4685
4686  /**
4687   * Constants
4688   */
4689
4690  var NAME$9 = 'button';
4691  var VERSION$9 = '4.6.2';
4692  var DATA_KEY$9 = 'bs.button';
4693  var EVENT_KEY$9 = "." + DATA_KEY$9;
4694  var DATA_API_KEY$6 = '.data-api';
4695  var JQUERY_NO_CONFLICT$9 = $__default["default"].fn[NAME$9];
4696  var CLASS_NAME_ACTIVE$3 = 'active';
4697  var CLASS_NAME_BUTTON = 'btn';
4698  var CLASS_NAME_FOCUS = 'focus';
4699  var EVENT_CLICK_DATA_API$5 = "click" + EVENT_KEY$9 + DATA_API_KEY$6;
4700  var EVENT_FOCUS_BLUR_DATA_API = "focus" + EVENT_KEY$9 + DATA_API_KEY$6 + " " + ("blur" + EVENT_KEY$9 + DATA_API_KEY$6);
4701  var EVENT_LOAD_DATA_API$2 = "load" + EVENT_KEY$9 + DATA_API_KEY$6;
4702  var SELECTOR_DATA_TOGGLE_CARROT = '[data-toggle^="button"]';
4703  var SELECTOR_DATA_TOGGLES = '[data-toggle="buttons"]';
4704  var SELECTOR_DATA_TOGGLE$4 = '[data-toggle="button"]';
4705  var SELECTOR_DATA_TOGGLES_BUTTONS = '[data-toggle="buttons"] .btn';
4706  var SELECTOR_INPUT = 'input:not([type="hidden"])';
4707  var SELECTOR_ACTIVE$2 = '.active';
4708  var SELECTOR_BUTTON = '.btn';
4709  /**
4710   * Class definition
4711   */
4712
4713  var Button = /*#__PURE__*/function () {
4714    function Button(element) {
4715      this._element = element;
4716      this.shouldAvoidTriggerChange = false;
4717    } // Getters
4718
4719
4720    var _proto = Button.prototype;
4721
4722    // Public
4723    _proto.toggle = function toggle() {
4724      var triggerChangeEvent = true;
4725      var addAriaPressed = true;
4726      var rootElement = $__default["default"](this._element).closest(SELECTOR_DATA_TOGGLES)[0];
4727
4728      if (rootElement) {
4729        var input = this._element.querySelector(SELECTOR_INPUT);
4730
4731        if (input) {
4732          if (input.type === 'radio') {
4733            if (input.checked && this._element.classList.contains(CLASS_NAME_ACTIVE$3)) {
4734              triggerChangeEvent = false;
4735            } else {
4736              var activeElement = rootElement.querySelector(SELECTOR_ACTIVE$2);
4737
4738              if (activeElement) {
4739                $__default["default"](activeElement).removeClass(CLASS_NAME_ACTIVE$3);
4740              }
4741            }
4742          }
4743
4744          if (triggerChangeEvent) {
4745            // if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input
4746            if (input.type === 'checkbox' || input.type === 'radio') {
4747              input.checked = !this._element.classList.contains(CLASS_NAME_ACTIVE$3);
4748            }
4749
4750            if (!this.shouldAvoidTriggerChange) {
4751              $__default["default"](input).trigger('change');
4752            }
4753          }
4754
4755          input.focus();
4756          addAriaPressed = false;
4757        }
4758      }
4759
4760      if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) {
4761        if (addAriaPressed) {
4762          this._element.setAttribute('aria-pressed', !this._element.classList.contains(CLASS_NAME_ACTIVE$3));
4763        }
4764
4765        if (triggerChangeEvent) {
4766          $__default["default"](this._element).toggleClass(CLASS_NAME_ACTIVE$3);
4767        }
4768      }
4769    };
4770
4771    _proto.dispose = function dispose() {
4772      $__default["default"].removeData(this._element, DATA_KEY$9);
4773      this._element = null;
4774    } // Static
4775    ;
4776
4777    Button._jQueryInterface = function _jQueryInterface(config, avoidTriggerChange) {
4778      return this.each(function () {
4779        var $element = $__default["default"](this);
4780        var data = $element.data(DATA_KEY$9);
4781
4782        if (!data) {
4783          data = new Button(this);
4784          $element.data(DATA_KEY$9, data);
4785        }
4786
4787        data.shouldAvoidTriggerChange = avoidTriggerChange;
4788
4789        if (config === 'toggle') {
4790          data[config]();
4791        }
4792      });
4793    };
4794
4795    _createClass(Button, null, [{
4796      key: "VERSION",
4797      get: function get() {
4798        return VERSION$9;
4799      }
4800    }]);
4801
4802    return Button;
4803  }();
4804  /**
4805   * Data API implementation
4806   */
4807
4808
4809  $__default["default"](document).on(EVENT_CLICK_DATA_API$5, SELECTOR_DATA_TOGGLE_CARROT, function (event) {
4810    var button = event.target;
4811    var initialButton = button;
4812
4813    if (!$__default["default"](button).hasClass(CLASS_NAME_BUTTON)) {
4814      button = $__default["default"](button).closest(SELECTOR_BUTTON)[0];
4815    }
4816
4817    if (!button || button.hasAttribute('disabled') || button.classList.contains('disabled')) {
4818      event.preventDefault(); // work around Firefox bug #1540995
4819    } else {
4820      var inputBtn = button.querySelector(SELECTOR_INPUT);
4821
4822      if (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))) {
4823        event.preventDefault(); // work around Firefox bug #1540995
4824
4825        return;
4826      }
4827
4828      if (initialButton.tagName === 'INPUT' || button.tagName !== 'LABEL') {
4829        Button._jQueryInterface.call($__default["default"](button), 'toggle', initialButton.tagName === 'INPUT');
4830      }
4831    }
4832  }).on(EVENT_FOCUS_BLUR_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, function (event) {
4833    var button = $__default["default"](event.target).closest(SELECTOR_BUTTON)[0];
4834    $__default["default"](button).toggleClass(CLASS_NAME_FOCUS, /^focus(in)?$/.test(event.type));
4835  });
4836  $__default["default"](window).on(EVENT_LOAD_DATA_API$2, function () {
4837    // ensure correct active class is set to match the controls' actual values/states
4838    // find all checkboxes/readio buttons inside data-toggle groups
4839    var buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLES_BUTTONS));
4840
4841    for (var i = 0, len = buttons.length; i < len; i++) {
4842      var button = buttons[i];
4843      var input = button.querySelector(SELECTOR_INPUT);
4844
4845      if (input.checked || input.hasAttribute('checked')) {
4846        button.classList.add(CLASS_NAME_ACTIVE$3);
4847      } else {
4848        button.classList.remove(CLASS_NAME_ACTIVE$3);
4849      }
4850    } // find all button toggles
4851
4852
4853    buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE$4));
4854
4855    for (var _i = 0, _len = buttons.length; _i < _len; _i++) {
4856      var _button = buttons[_i];
4857
4858      if (_button.getAttribute('aria-pressed') === 'true') {
4859        _button.classList.add(CLASS_NAME_ACTIVE$3);
4860      } else {
4861        _button.classList.remove(CLASS_NAME_ACTIVE$3);
4862      }
4863    }
4864  });
4865  /**
4866   * jQuery
4867   */
4868
4869  $__default["default"].fn[NAME$9] = Button._jQueryInterface;
4870  $__default["default"].fn[NAME$9].Constructor = Button;
4871
4872  $__default["default"].fn[NAME$9].noConflict = function () {
4873    $__default["default"].fn[NAME$9] = JQUERY_NO_CONFLICT$9;
4874    return Button._jQueryInterface;
4875  };
4876
4877  /**
4878   * Constants
4879   */
4880
4881  var NAME$8 = 'carousel';
4882  var VERSION$8 = '4.6.2';
4883  var DATA_KEY$8 = 'bs.carousel';
4884  var EVENT_KEY$8 = "." + DATA_KEY$8;
4885  var DATA_API_KEY$5 = '.data-api';
4886  var JQUERY_NO_CONFLICT$8 = $__default["default"].fn[NAME$8];
4887  var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key
4888
4889  var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key
4890
4891  var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch
4892
4893  var SWIPE_THRESHOLD = 40;
4894  var CLASS_NAME_CAROUSEL = 'carousel';
4895  var CLASS_NAME_ACTIVE$2 = 'active';
4896  var CLASS_NAME_SLIDE = 'slide';
4897  var CLASS_NAME_RIGHT = 'carousel-item-right';
4898  var CLASS_NAME_LEFT = 'carousel-item-left';
4899  var CLASS_NAME_NEXT = 'carousel-item-next';
4900  var CLASS_NAME_PREV = 'carousel-item-prev';
4901  var CLASS_NAME_POINTER_EVENT = 'pointer-event';
4902  var DIRECTION_NEXT = 'next';
4903  var DIRECTION_PREV = 'prev';
4904  var DIRECTION_LEFT = 'left';
4905  var DIRECTION_RIGHT = 'right';
4906  var EVENT_SLIDE = "slide" + EVENT_KEY$8;
4907  var EVENT_SLID = "slid" + EVENT_KEY$8;
4908  var EVENT_KEYDOWN = "keydown" + EVENT_KEY$8;
4909  var EVENT_MOUSEENTER = "mouseenter" + EVENT_KEY$8;
4910  var EVENT_MOUSELEAVE = "mouseleave" + EVENT_KEY$8;
4911  var EVENT_TOUCHSTART = "touchstart" + EVENT_KEY$8;
4912  var EVENT_TOUCHMOVE = "touchmove" + EVENT_KEY$8;
4913  var EVENT_TOUCHEND = "touchend" + EVENT_KEY$8;
4914  var EVENT_POINTERDOWN = "pointerdown" + EVENT_KEY$8;
4915  var EVENT_POINTERUP = "pointerup" + EVENT_KEY$8;
4916  var EVENT_DRAG_START = "dragstart" + EVENT_KEY$8;
4917  var EVENT_LOAD_DATA_API$1 = "load" + EVENT_KEY$8 + DATA_API_KEY$5;
4918  var EVENT_CLICK_DATA_API$4 = "click" + EVENT_KEY$8 + DATA_API_KEY$5;
4919  var SELECTOR_ACTIVE$1 = '.active';
4920  var SELECTOR_ACTIVE_ITEM = '.active.carousel-item';
4921  var SELECTOR_ITEM = '.carousel-item';
4922  var SELECTOR_ITEM_IMG = '.carousel-item img';
4923  var SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev';
4924  var SELECTOR_INDICATORS = '.carousel-indicators';
4925  var SELECTOR_DATA_SLIDE = '[data-slide], [data-slide-to]';
4926  var SELECTOR_DATA_RIDE = '[data-ride="carousel"]';
4927  var Default$7 = {
4928    interval: 5000,
4929    keyboard: true,
4930    slide: false,
4931    pause: 'hover',
4932    wrap: true,
4933    touch: true
4934  };
4935  var DefaultType$7 = {
4936    interval: '(number|boolean)',
4937    keyboard: 'boolean',
4938    slide: '(boolean|string)',
4939    pause: '(string|boolean)',
4940    wrap: 'boolean',
4941    touch: 'boolean'
4942  };
4943  var PointerType = {
4944    TOUCH: 'touch',
4945    PEN: 'pen'
4946  };
4947  /**
4948   * Class definition
4949   */
4950
4951  var Carousel = /*#__PURE__*/function () {
4952    function Carousel(element, config) {
4953      this._items = null;
4954      this._interval = null;
4955      this._activeElement = null;
4956      this._isPaused = false;
4957      this._isSliding = false;
4958      this.touchTimeout = null;
4959      this.touchStartX = 0;
4960      this.touchDeltaX = 0;
4961      this._config = this._getConfig(config);
4962      this._element = element;
4963      this._indicatorsElement = this._element.querySelector(SELECTOR_INDICATORS);
4964      this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;
4965      this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent);
4966
4967      this._addEventListeners();
4968    } // Getters
4969
4970
4971    var _proto = Carousel.prototype;
4972
4973    // Public
4974    _proto.next = function next() {
4975      if (!this._isSliding) {
4976        this._slide(DIRECTION_NEXT);
4977      }
4978    };
4979
4980    _proto.nextWhenVisible = function nextWhenVisible() {
4981      var $element = $__default["default"](this._element); // Don't call next when the page isn't visible
4982      // or the carousel or its parent isn't visible
4983
4984      if (!document.hidden && $element.is(':visible') && $element.css('visibility') !== 'hidden') {
4985        this.next();
4986      }
4987    };
4988
4989    _proto.prev = function prev() {
4990      if (!this._isSliding) {
4991        this._slide(DIRECTION_PREV);
4992      }
4993    };
4994
4995    _proto.pause = function pause(event) {
4996      if (!event) {
4997        this._isPaused = true;
4998      }
4999
5000      if (this._element.querySelector(SELECTOR_NEXT_PREV)) {
5001        Util.triggerTransitionEnd(this._element);
5002        this.cycle(true);
5003      }
5004
5005      clearInterval(this._interval);
5006      this._interval = null;
5007    };
5008
5009    _proto.cycle = function cycle(event) {
5010      if (!event) {
5011        this._isPaused = false;
5012      }
5013
5014      if (this._interval) {
5015        clearInterval(this._interval);
5016        this._interval = null;
5017      }
5018
5019      if (this._config.interval && !this._isPaused) {
5020        this._updateInterval();
5021
5022        this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);
5023      }
5024    };
5025
5026    _proto.to = function to(index) {
5027      var _this = this;
5028
5029      this._activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM);
5030
5031      var activeIndex = this._getItemIndex(this._activeElement);
5032
5033      if (index > this._items.length - 1 || index < 0) {
5034        return;
5035      }
5036
5037      if (this._isSliding) {
5038        $__default["default"](this._element).one(EVENT_SLID, function () {
5039          return _this.to(index);
5040        });
5041        return;
5042      }
5043
5044      if (activeIndex === index) {
5045        this.pause();
5046        this.cycle();
5047        return;
5048      }
5049
5050      var direction = index > activeIndex ? DIRECTION_NEXT : DIRECTION_PREV;
5051
5052      this._slide(direction, this._items[index]);
5053    };
5054
5055    _proto.dispose = function dispose() {
5056      $__default["default"](this._element).off(EVENT_KEY$8);
5057      $__default["default"].removeData(this._element, DATA_KEY$8);
5058      this._items = null;
5059      this._config = null;
5060      this._element = null;
5061      this._interval = null;
5062      this._isPaused = null;
5063      this._isSliding = null;
5064      this._activeElement = null;
5065      this._indicatorsElement = null;
5066    } // Private
5067    ;
5068
5069    _proto._getConfig = function _getConfig(config) {
5070      config = _extends({}, Default$7, config);
5071      Util.typeCheckConfig(NAME$8, config, DefaultType$7);
5072      return config;
5073    };
5074
5075    _proto._handleSwipe = function _handleSwipe() {
5076      var absDeltax = Math.abs(this.touchDeltaX);
5077
5078      if (absDeltax <= SWIPE_THRESHOLD) {
5079        return;
5080      }
5081
5082      var direction = absDeltax / this.touchDeltaX;
5083      this.touchDeltaX = 0; // swipe left
5084
5085      if (direction > 0) {
5086        this.prev();
5087      } // swipe right
5088
5089
5090      if (direction < 0) {
5091        this.next();
5092      }
5093    };
5094
5095    _proto._addEventListeners = function _addEventListeners() {
5096      var _this2 = this;
5097
5098      if (this._config.keyboard) {
5099        $__default["default"](this._element).on(EVENT_KEYDOWN, function (event) {
5100          return _this2._keydown(event);
5101        });
5102      }
5103
5104      if (this._config.pause === 'hover') {
5105        $__default["default"](this._element).on(EVENT_MOUSEENTER, function (event) {
5106          return _this2.pause(event);
5107        }).on(EVENT_MOUSELEAVE, function (event) {
5108          return _this2.cycle(event);
5109        });
5110      }
5111
5112      if (this._config.touch) {
5113        this._addTouchEventListeners();
5114      }
5115    };
5116
5117    _proto._addTouchEventListeners = function _addTouchEventListeners() {
5118      var _this3 = this;
5119
5120      if (!this._touchSupported) {
5121        return;
5122      }
5123
5124      var start = function start(event) {
5125        if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {
5126          _this3.touchStartX = event.originalEvent.clientX;
5127        } else if (!_this3._pointerEvent) {
5128          _this3.touchStartX = event.originalEvent.touches[0].clientX;
5129        }
5130      };
5131
5132      var move = function move(event) {
5133        // ensure swiping with one touch and not pinching
5134        _this3.touchDeltaX = event.originalEvent.touches && event.originalEvent.touches.length > 1 ? 0 : event.originalEvent.touches[0].clientX - _this3.touchStartX;
5135      };
5136
5137      var end = function end(event) {
5138        if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {
5139          _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX;
5140        }
5141
5142        _this3._handleSwipe();
5143
5144        if (_this3._config.pause === 'hover') {
5145          // If it's a touch-enabled device, mouseenter/leave are fired as
5146          // part of the mouse compatibility events on first tap - the carousel
5147          // would stop cycling until user tapped out of it;
5148          // here, we listen for touchend, explicitly pause the carousel
5149          // (as if it's the second time we tap on it, mouseenter compat event
5150          // is NOT fired) and after a timeout (to allow for mouse compatibility
5151          // events to fire) we explicitly restart cycling
5152          _this3.pause();
5153
5154          if (_this3.touchTimeout) {
5155            clearTimeout(_this3.touchTimeout);
5156          }
5157
5158          _this3.touchTimeout = setTimeout(function (event) {
5159            return _this3.cycle(event);
5160          }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval);
5161        }
5162      };
5163
5164      $__default["default"](this._element.querySelectorAll(SELECTOR_ITEM_IMG)).on(EVENT_DRAG_START, function (e) {
5165        return e.preventDefault();
5166      });
5167
5168      if (this._pointerEvent) {
5169        $__default["default"](this._element).on(EVENT_POINTERDOWN, function (event) {
5170          return start(event);
5171        });
5172        $__default["default"](this._element).on(EVENT_POINTERUP, function (event) {
5173          return end(event);
5174        });
5175
5176        this._element.classList.add(CLASS_NAME_POINTER_EVENT);
5177      } else {
5178        $__default["default"](this._element).on(EVENT_TOUCHSTART, function (event) {
5179          return start(event);
5180        });
5181        $__default["default"](this._element).on(EVENT_TOUCHMOVE, function (event) {
5182          return move(event);
5183        });
5184        $__default["default"](this._element).on(EVENT_TOUCHEND, function (event) {
5185          return end(event);
5186        });
5187      }
5188    };
5189
5190    _proto._keydown = function _keydown(event) {
5191      if (/input|textarea/i.test(event.target.tagName)) {
5192        return;
5193      }
5194
5195      switch (event.which) {
5196        case ARROW_LEFT_KEYCODE:
5197          event.preventDefault();
5198          this.prev();
5199          break;
5200
5201        case ARROW_RIGHT_KEYCODE:
5202          event.preventDefault();
5203          this.next();
5204          break;
5205      }
5206    };
5207
5208    _proto._getItemIndex = function _getItemIndex(element) {
5209      this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(SELECTOR_ITEM)) : [];
5210      return this._items.indexOf(element);
5211    };
5212
5213    _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {
5214      var isNextDirection = direction === DIRECTION_NEXT;
5215      var isPrevDirection = direction === DIRECTION_PREV;
5216
5217      var activeIndex = this._getItemIndex(activeElement);
5218
5219      var lastItemIndex = this._items.length - 1;
5220      var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;
5221
5222      if (isGoingToWrap && !this._config.wrap) {
5223        return activeElement;
5224      }
5225
5226      var delta = direction === DIRECTION_PREV ? -1 : 1;
5227      var itemIndex = (activeIndex + delta) % this._items.length;
5228      return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];
5229    };
5230
5231    _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {
5232      var targetIndex = this._getItemIndex(relatedTarget);
5233
5234      var fromIndex = this._getItemIndex(this._element.querySelector(SELECTOR_ACTIVE_ITEM));
5235
5236      var slideEvent = $__default["default"].Event(EVENT_SLIDE, {
5237        relatedTarget: relatedTarget,
5238        direction: eventDirectionName,
5239        from: fromIndex,
5240        to: targetIndex
5241      });
5242      $__default["default"](this._element).trigger(slideEvent);
5243      return slideEvent;
5244    };
5245
5246    _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {
5247      if (this._indicatorsElement) {
5248        var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(SELECTOR_ACTIVE$1));
5249        $__default["default"](indicators).removeClass(CLASS_NAME_ACTIVE$2);
5250
5251        var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];
5252
5253        if (nextIndicator) {
5254          $__default["default"](nextIndicator).addClass(CLASS_NAME_ACTIVE$2);
5255        }
5256      }
5257    };
5258
5259    _proto._updateInterval = function _updateInterval() {
5260      var element = this._activeElement || this._element.querySelector(SELECTOR_ACTIVE_ITEM);
5261
5262      if (!element) {
5263        return;
5264      }
5265
5266      var elementInterval = parseInt(element.getAttribute('data-interval'), 10);
5267
5268      if (elementInterval) {
5269        this._config.defaultInterval = this._config.defaultInterval || this._config.interval;
5270        this._config.interval = elementInterval;
5271      } else {
5272        this._config.interval = this._config.defaultInterval || this._config.interval;
5273      }
5274    };
5275
5276    _proto._slide = function _slide(direction, element) {
5277      var _this4 = this;
5278
5279      var activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM);
5280
5281      var activeElementIndex = this._getItemIndex(activeElement);
5282
5283      var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);
5284
5285      var nextElementIndex = this._getItemIndex(nextElement);
5286
5287      var isCycling = Boolean(this._interval);
5288      var directionalClassName;
5289      var orderClassName;
5290      var eventDirectionName;
5291
5292      if (direction === DIRECTION_NEXT) {
5293        directionalClassName = CLASS_NAME_LEFT;
5294        orderClassName = CLASS_NAME_NEXT;
5295        eventDirectionName = DIRECTION_LEFT;
5296      } else {
5297        directionalClassName = CLASS_NAME_RIGHT;
5298        orderClassName = CLASS_NAME_PREV;
5299        eventDirectionName = DIRECTION_RIGHT;
5300      }
5301
5302      if (nextElement && $__default["default"](nextElement).hasClass(CLASS_NAME_ACTIVE$2)) {
5303        this._isSliding = false;
5304        return;
5305      }
5306
5307      var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);
5308
5309      if (slideEvent.isDefaultPrevented()) {
5310        return;
5311      }
5312
5313      if (!activeElement || !nextElement) {
5314        // Some weirdness is happening, so we bail
5315        return;
5316      }
5317
5318      this._isSliding = true;
5319
5320      if (isCycling) {
5321        this.pause();
5322      }
5323
5324      this._setActiveIndicatorElement(nextElement);
5325
5326      this._activeElement = nextElement;
5327      var slidEvent = $__default["default"].Event(EVENT_SLID, {
5328        relatedTarget: nextElement,
5329        direction: eventDirectionName,
5330        from: activeElementIndex,
5331        to: nextElementIndex
5332      });
5333
5334      if ($__default["default"](this._element).hasClass(CLASS_NAME_SLIDE)) {
5335        $__default["default"](nextElement).addClass(orderClassName);
5336        Util.reflow(nextElement);
5337        $__default["default"](activeElement).addClass(directionalClassName);
5338        $__default["default"](nextElement).addClass(directionalClassName);
5339        var transitionDuration = Util.getTransitionDurationFromElement(activeElement);
5340        $__default["default"](activeElement).one(Util.TRANSITION_END, function () {
5341          $__default["default"](nextElement).removeClass(directionalClassName + " " + orderClassName).addClass(CLASS_NAME_ACTIVE$2);
5342          $__default["default"](activeElement).removeClass(CLASS_NAME_ACTIVE$2 + " " + orderClassName + " " + directionalClassName);
5343          _this4._isSliding = false;
5344          setTimeout(function () {
5345            return $__default["default"](_this4._element).trigger(slidEvent);
5346          }, 0);
5347        }).emulateTransitionEnd(transitionDuration);
5348      } else {
5349        $__default["default"](activeElement).removeClass(CLASS_NAME_ACTIVE$2);
5350        $__default["default"](nextElement).addClass(CLASS_NAME_ACTIVE$2);
5351        this._isSliding = false;
5352        $__default["default"](this._element).trigger(slidEvent);
5353      }
5354
5355      if (isCycling) {
5356        this.cycle();
5357      }
5358    } // Static
5359    ;
5360
5361    Carousel._jQueryInterface = function _jQueryInterface(config) {
5362      return this.each(function () {
5363        var data = $__default["default"](this).data(DATA_KEY$8);
5364
5365        var _config = _extends({}, Default$7, $__default["default"](this).data());
5366
5367        if (typeof config === 'object') {
5368          _config = _extends({}, _config, config);
5369        }
5370
5371        var action = typeof config === 'string' ? config : _config.slide;
5372
5373        if (!data) {
5374          data = new Carousel(this, _config);
5375          $__default["default"](this).data(DATA_KEY$8, data);
5376        }
5377
5378        if (typeof config === 'number') {
5379          data.to(config);
5380        } else if (typeof action === 'string') {
5381          if (typeof data[action] === 'undefined') {
5382            throw new TypeError("No method named \"" + action + "\"");
5383          }
5384
5385          data[action]();
5386        } else if (_config.interval && _config.ride) {
5387          data.pause();
5388          data.cycle();
5389        }
5390      });
5391    };
5392
5393    Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {
5394      var selector = Util.getSelectorFromElement(this);
5395
5396      if (!selector) {
5397        return;
5398      }
5399
5400      var target = $__default["default"](selector)[0];
5401
5402      if (!target || !$__default["default"](target).hasClass(CLASS_NAME_CAROUSEL)) {
5403        return;
5404      }
5405
5406      var config = _extends({}, $__default["default"](target).data(), $__default["default"](this).data());
5407
5408      var slideIndex = this.getAttribute('data-slide-to');
5409
5410      if (slideIndex) {
5411        config.interval = false;
5412      }
5413
5414      Carousel._jQueryInterface.call($__default["default"](target), config);
5415
5416      if (slideIndex) {
5417        $__default["default"](target).data(DATA_KEY$8).to(slideIndex);
5418      }
5419
5420      event.preventDefault();
5421    };
5422
5423    _createClass(Carousel, null, [{
5424      key: "VERSION",
5425      get: function get() {
5426        return VERSION$8;
5427      }
5428    }, {
5429      key: "Default",
5430      get: function get() {
5431        return Default$7;
5432      }
5433    }]);
5434
5435    return Carousel;
5436  }();
5437  /**
5438   * Data API implementation
5439   */
5440
5441
5442  $__default["default"](document).on(EVENT_CLICK_DATA_API$4, SELECTOR_DATA_SLIDE, Carousel._dataApiClickHandler);
5443  $__default["default"](window).on(EVENT_LOAD_DATA_API$1, function () {
5444    var carousels = [].slice.call(document.querySelectorAll(SELECTOR_DATA_RIDE));
5445
5446    for (var i = 0, len = carousels.length; i < len; i++) {
5447      var $carousel = $__default["default"](carousels[i]);
5448
5449      Carousel._jQueryInterface.call($carousel, $carousel.data());
5450    }
5451  });
5452  /**
5453   * jQuery
5454   */
5455
5456  $__default["default"].fn[NAME$8] = Carousel._jQueryInterface;
5457  $__default["default"].fn[NAME$8].Constructor = Carousel;
5458
5459  $__default["default"].fn[NAME$8].noConflict = function () {
5460    $__default["default"].fn[NAME$8] = JQUERY_NO_CONFLICT$8;
5461    return Carousel._jQueryInterface;
5462  };
5463
5464  /**
5465   * Constants
5466   */
5467
5468  var NAME$7 = 'collapse';
5469  var VERSION$7 = '4.6.2';
5470  var DATA_KEY$7 = 'bs.collapse';
5471  var EVENT_KEY$7 = "." + DATA_KEY$7;
5472  var DATA_API_KEY$4 = '.data-api';
5473  var JQUERY_NO_CONFLICT$7 = $__default["default"].fn[NAME$7];
5474  var CLASS_NAME_SHOW$6 = 'show';
5475  var CLASS_NAME_COLLAPSE = 'collapse';
5476  var CLASS_NAME_COLLAPSING = 'collapsing';
5477  var CLASS_NAME_COLLAPSED = 'collapsed';
5478  var DIMENSION_WIDTH = 'width';
5479  var DIMENSION_HEIGHT = 'height';
5480  var EVENT_SHOW$4 = "show" + EVENT_KEY$7;
5481  var EVENT_SHOWN$4 = "shown" + EVENT_KEY$7;
5482  var EVENT_HIDE$4 = "hide" + EVENT_KEY$7;
5483  var EVENT_HIDDEN$4 = "hidden" + EVENT_KEY$7;
5484  var EVENT_CLICK_DATA_API$3 = "click" + EVENT_KEY$7 + DATA_API_KEY$4;
5485  var SELECTOR_ACTIVES = '.show, .collapsing';
5486  var SELECTOR_DATA_TOGGLE$3 = '[data-toggle="collapse"]';
5487  var Default$6 = {
5488    toggle: true,
5489    parent: ''
5490  };
5491  var DefaultType$6 = {
5492    toggle: 'boolean',
5493    parent: '(string|element)'
5494  };
5495  /**
5496   * Class definition
5497   */
5498
5499  var Collapse = /*#__PURE__*/function () {
5500    function Collapse(element, config) {
5501      this._isTransitioning = false;
5502      this._element = element;
5503      this._config = this._getConfig(config);
5504      this._triggerArray = [].slice.call(document.querySelectorAll("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]")));
5505      var toggleList = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE$3));
5506
5507      for (var i = 0, len = toggleList.length; i < len; i++) {
5508        var elem = toggleList[i];
5509        var selector = Util.getSelectorFromElement(elem);
5510        var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {
5511          return foundElem === element;
5512        });
5513
5514        if (selector !== null && filterElement.length > 0) {
5515          this._selector = selector;
5516
5517          this._triggerArray.push(elem);
5518        }
5519      }
5520
5521      this._parent = this._config.parent ? this._getParent() : null;
5522
5523      if (!this._config.parent) {
5524        this._addAriaAndCollapsedClass(this._element, this._triggerArray);
5525      }
5526
5527      if (this._config.toggle) {
5528        this.toggle();
5529      }
5530    } // Getters
5531
5532
5533    var _proto = Collapse.prototype;
5534
5535    // Public
5536    _proto.toggle = function toggle() {
5537      if ($__default["default"](this._element).hasClass(CLASS_NAME_SHOW$6)) {
5538        this.hide();
5539      } else {
5540        this.show();
5541      }
5542    };
5543
5544    _proto.show = function show() {
5545      var _this = this;
5546
5547      if (this._isTransitioning || $__default["default"](this._element).hasClass(CLASS_NAME_SHOW$6)) {
5548        return;
5549      }
5550
5551      var actives;
5552      var activesData;
5553
5554      if (this._parent) {
5555        actives = [].slice.call(this._parent.querySelectorAll(SELECTOR_ACTIVES)).filter(function (elem) {
5556          if (typeof _this._config.parent === 'string') {
5557            return elem.getAttribute('data-parent') === _this._config.parent;
5558          }
5559
5560          return elem.classList.contains(CLASS_NAME_COLLAPSE);
5561        });
5562
5563        if (actives.length === 0) {
5564          actives = null;
5565        }
5566      }
5567
5568      if (actives) {
5569        activesData = $__default["default"](actives).not(this._selector).data(DATA_KEY$7);
5570
5571        if (activesData && activesData._isTransitioning) {
5572          return;
5573        }
5574      }
5575
5576      var startEvent = $__default["default"].Event(EVENT_SHOW$4);
5577      $__default["default"](this._element).trigger(startEvent);
5578
5579      if (startEvent.isDefaultPrevented()) {
5580        return;
5581      }
5582
5583      if (actives) {
5584        Collapse._jQueryInterface.call($__default["default"](actives).not(this._selector), 'hide');
5585
5586        if (!activesData) {
5587          $__default["default"](actives).data(DATA_KEY$7, null);
5588        }
5589      }
5590
5591      var dimension = this._getDimension();
5592
5593      $__default["default"](this._element).removeClass(CLASS_NAME_COLLAPSE).addClass(CLASS_NAME_COLLAPSING);
5594      this._element.style[dimension] = 0;
5595
5596      if (this._triggerArray.length) {
5597        $__default["default"](this._triggerArray).removeClass(CLASS_NAME_COLLAPSED).attr('aria-expanded', true);
5598      }
5599
5600      this.setTransitioning(true);
5601
5602      var complete = function complete() {
5603        $__default["default"](_this._element).removeClass(CLASS_NAME_COLLAPSING).addClass(CLASS_NAME_COLLAPSE + " " + CLASS_NAME_SHOW$6);
5604        _this._element.style[dimension] = '';
5605
5606        _this.setTransitioning(false);
5607
5608        $__default["default"](_this._element).trigger(EVENT_SHOWN$4);
5609      };
5610
5611      var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
5612      var scrollSize = "scroll" + capitalizedDimension;
5613      var transitionDuration = Util.getTransitionDurationFromElement(this._element);
5614      $__default["default"](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
5615      this._element.style[dimension] = this._element[scrollSize] + "px";
5616    };
5617
5618    _proto.hide = function hide() {
5619      var _this2 = this;
5620
5621      if (this._isTransitioning || !$__default["default"](this._element).hasClass(CLASS_NAME_SHOW$6)) {
5622        return;
5623      }
5624
5625      var startEvent = $__default["default"].Event(EVENT_HIDE$4);
5626      $__default["default"](this._element).trigger(startEvent);
5627
5628      if (startEvent.isDefaultPrevented()) {
5629        return;
5630      }
5631
5632      var dimension = this._getDimension();
5633
5634      this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px";
5635      Util.reflow(this._element);
5636      $__default["default"](this._element).addClass(CLASS_NAME_COLLAPSING).removeClass(CLASS_NAME_COLLAPSE + " " + CLASS_NAME_SHOW$6);
5637      var triggerArrayLength = this._triggerArray.length;
5638
5639      if (triggerArrayLength > 0) {
5640        for (var i = 0; i < triggerArrayLength; i++) {
5641          var trigger = this._triggerArray[i];
5642          var selector = Util.getSelectorFromElement(trigger);
5643
5644          if (selector !== null) {
5645            var $elem = $__default["default"]([].slice.call(document.querySelectorAll(selector)));
5646
5647            if (!$elem.hasClass(CLASS_NAME_SHOW$6)) {
5648              $__default["default"](trigger).addClass(CLASS_NAME_COLLAPSED).attr('aria-expanded', false);
5649            }
5650          }
5651        }
5652      }
5653
5654      this.setTransitioning(true);
5655
5656      var complete = function complete() {
5657        _this2.setTransitioning(false);
5658
5659        $__default["default"](_this2._element).removeClass(CLASS_NAME_COLLAPSING).addClass(CLASS_NAME_COLLAPSE).trigger(EVENT_HIDDEN$4);
5660      };
5661
5662      this._element.style[dimension] = '';
5663      var transitionDuration = Util.getTransitionDurationFromElement(this._element);
5664      $__default["default"](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
5665    };
5666
5667    _proto.setTransitioning = function setTransitioning(isTransitioning) {
5668      this._isTransitioning = isTransitioning;
5669    };
5670
5671    _proto.dispose = function dispose() {
5672      $__default["default"].removeData(this._element, DATA_KEY$7);
5673      this._config = null;
5674      this._parent = null;
5675      this._element = null;
5676      this._triggerArray = null;
5677      this._isTransitioning = null;
5678    } // Private
5679    ;
5680
5681    _proto._getConfig = function _getConfig(config) {
5682      config = _extends({}, Default$6, config);
5683      config.toggle = Boolean(config.toggle); // Coerce string values
5684
5685      Util.typeCheckConfig(NAME$7, config, DefaultType$6);
5686      return config;
5687    };
5688
5689    _proto._getDimension = function _getDimension() {
5690      var hasWidth = $__default["default"](this._element).hasClass(DIMENSION_WIDTH);
5691      return hasWidth ? DIMENSION_WIDTH : DIMENSION_HEIGHT;
5692    };
5693
5694    _proto._getParent = function _getParent() {
5695      var _this3 = this;
5696
5697      var parent;
5698
5699      if (Util.isElement(this._config.parent)) {
5700        parent = this._config.parent; // It's a jQuery object
5701
5702        if (typeof this._config.parent.jquery !== 'undefined') {
5703          parent = this._config.parent[0];
5704        }
5705      } else {
5706        parent = document.querySelector(this._config.parent);
5707      }
5708
5709      var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]";
5710      var children = [].slice.call(parent.querySelectorAll(selector));
5711      $__default["default"](children).each(function (i, element) {
5712        _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
5713      });
5714      return parent;
5715    };
5716
5717    _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
5718      var isOpen = $__default["default"](element).hasClass(CLASS_NAME_SHOW$6);
5719
5720      if (triggerArray.length) {
5721        $__default["default"](triggerArray).toggleClass(CLASS_NAME_COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
5722      }
5723    } // Static
5724    ;
5725
5726    Collapse._getTargetFromElement = function _getTargetFromElement(element) {
5727      var selector = Util.getSelectorFromElement(element);
5728      return selector ? document.querySelector(selector) : null;
5729    };
5730
5731    Collapse._jQueryInterface = function _jQueryInterface(config) {
5732      return this.each(function () {
5733        var $element = $__default["default"](this);
5734        var data = $element.data(DATA_KEY$7);
5735
5736        var _config = _extends({}, Default$6, $element.data(), typeof config === 'object' && config ? config : {});
5737
5738        if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) {
5739          _config.toggle = false;
5740        }
5741
5742        if (!data) {
5743          data = new Collapse(this, _config);
5744          $element.data(DATA_KEY$7, data);
5745        }
5746
5747        if (typeof config === 'string') {
5748          if (typeof data[config] === 'undefined') {
5749            throw new TypeError("No method named \"" + config + "\"");
5750          }
5751
5752          data[config]();
5753        }
5754      });
5755    };
5756
5757    _createClass(Collapse, null, [{
5758      key: "VERSION",
5759      get: function get() {
5760        return VERSION$7;
5761      }
5762    }, {
5763      key: "Default",
5764      get: function get() {
5765        return Default$6;
5766      }
5767    }]);
5768
5769    return Collapse;
5770  }();
5771  /**
5772   * Data API implementation
5773   */
5774
5775
5776  $__default["default"](document).on(EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {
5777    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
5778    if (event.currentTarget.tagName === 'A') {
5779      event.preventDefault();
5780    }
5781
5782    var $trigger = $__default["default"](this);
5783    var selector = Util.getSelectorFromElement(this);
5784    var selectors = [].slice.call(document.querySelectorAll(selector));
5785    $__default["default"](selectors).each(function () {
5786      var $target = $__default["default"](this);
5787      var data = $target.data(DATA_KEY$7);
5788      var config = data ? 'toggle' : $trigger.data();
5789
5790      Collapse._jQueryInterface.call($target, config);
5791    });
5792  });
5793  /**
5794   * jQuery
5795   */
5796
5797  $__default["default"].fn[NAME$7] = Collapse._jQueryInterface;
5798  $__default["default"].fn[NAME$7].Constructor = Collapse;
5799
5800  $__default["default"].fn[NAME$7].noConflict = function () {
5801    $__default["default"].fn[NAME$7] = JQUERY_NO_CONFLICT$7;
5802    return Collapse._jQueryInterface;
5803  };
5804
5805  /**
5806   * Constants
5807   */
5808
5809  var NAME$6 = 'dropdown';
5810  var VERSION$6 = '4.6.2';
5811  var DATA_KEY$6 = 'bs.dropdown';
5812  var EVENT_KEY$6 = "." + DATA_KEY$6;
5813  var DATA_API_KEY$3 = '.data-api';
5814  var JQUERY_NO_CONFLICT$6 = $__default["default"].fn[NAME$6];
5815  var ESCAPE_KEYCODE$1 = 27; // KeyboardEvent.which value for Escape (Esc) key
5816
5817  var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key
5818
5819  var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key
5820
5821  var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key
5822
5823  var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key
5824
5825  var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)
5826
5827  var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE$1);
5828  var CLASS_NAME_DISABLED$1 = 'disabled';
5829  var CLASS_NAME_SHOW$5 = 'show';
5830  var CLASS_NAME_DROPUP = 'dropup';
5831  var CLASS_NAME_DROPRIGHT = 'dropright';
5832  var CLASS_NAME_DROPLEFT = 'dropleft';
5833  var CLASS_NAME_MENURIGHT = 'dropdown-menu-right';
5834  var CLASS_NAME_POSITION_STATIC = 'position-static';
5835  var EVENT_HIDE$3 = "hide" + EVENT_KEY$6;
5836  var EVENT_HIDDEN$3 = "hidden" + EVENT_KEY$6;
5837  var EVENT_SHOW$3 = "show" + EVENT_KEY$6;
5838  var EVENT_SHOWN$3 = "shown" + EVENT_KEY$6;
5839  var EVENT_CLICK = "click" + EVENT_KEY$6;
5840  var EVENT_CLICK_DATA_API$2 = "click" + EVENT_KEY$6 + DATA_API_KEY$3;
5841  var EVENT_KEYDOWN_DATA_API = "keydown" + EVENT_KEY$6 + DATA_API_KEY$3;
5842  var EVENT_KEYUP_DATA_API = "keyup" + EVENT_KEY$6 + DATA_API_KEY$3;
5843  var SELECTOR_DATA_TOGGLE$2 = '[data-toggle="dropdown"]';
5844  var SELECTOR_FORM_CHILD = '.dropdown form';
5845  var SELECTOR_MENU = '.dropdown-menu';
5846  var SELECTOR_NAVBAR_NAV = '.navbar-nav';
5847  var SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
5848  var PLACEMENT_TOP = 'top-start';
5849  var PLACEMENT_TOPEND = 'top-end';
5850  var PLACEMENT_BOTTOM = 'bottom-start';
5851  var PLACEMENT_BOTTOMEND = 'bottom-end';
5852  var PLACEMENT_RIGHT = 'right-start';
5853  var PLACEMENT_LEFT = 'left-start';
5854  var Default$5 = {
5855    offset: 0,
5856    flip: true,
5857    boundary: 'scrollParent',
5858    reference: 'toggle',
5859    display: 'dynamic',
5860    popperConfig: null
5861  };
5862  var DefaultType$5 = {
5863    offset: '(number|string|function)',
5864    flip: 'boolean',
5865    boundary: '(string|element)',
5866    reference: '(string|element)',
5867    display: 'string',
5868    popperConfig: '(null|object)'
5869  };
5870  /**
5871   * Class definition
5872   */
5873
5874  var Dropdown = /*#__PURE__*/function () {
5875    function Dropdown(element, config) {
5876      this._element = element;
5877      this._popper = null;
5878      this._config = this._getConfig(config);
5879      this._menu = this._getMenuElement();
5880      this._inNavbar = this._detectNavbar();
5881
5882      this._addEventListeners();
5883    } // Getters
5884
5885
5886    var _proto = Dropdown.prototype;
5887
5888    // Public
5889    _proto.toggle = function toggle() {
5890      if (this._element.disabled || $__default["default"](this._element).hasClass(CLASS_NAME_DISABLED$1)) {
5891        return;
5892      }
5893
5894      var isActive = $__default["default"](this._menu).hasClass(CLASS_NAME_SHOW$5);
5895
5896      Dropdown._clearMenus();
5897
5898      if (isActive) {
5899        return;
5900      }
5901
5902      this.show(true);
5903    };
5904
5905    _proto.show = function show(usePopper) {
5906      if (usePopper === void 0) {
5907        usePopper = false;
5908      }
5909
5910      if (this._element.disabled || $__default["default"](this._element).hasClass(CLASS_NAME_DISABLED$1) || $__default["default"](this._menu).hasClass(CLASS_NAME_SHOW$5)) {
5911        return;
5912      }
5913
5914      var relatedTarget = {
5915        relatedTarget: this._element
5916      };
5917      var showEvent = $__default["default"].Event(EVENT_SHOW$3, relatedTarget);
5918
5919      var parent = Dropdown._getParentFromElement(this._element);
5920
5921      $__default["default"](parent).trigger(showEvent);
5922
5923      if (showEvent.isDefaultPrevented()) {
5924        return;
5925      } // Totally disable Popper for Dropdowns in Navbar
5926
5927
5928      if (!this._inNavbar && usePopper) {
5929        // Check for Popper dependency
5930        if (typeof Popper__default["default"] === 'undefined') {
5931          throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)');
5932        }
5933
5934        var referenceElement = this._element;
5935
5936        if (this._config.reference === 'parent') {
5937          referenceElement = parent;
5938        } else if (Util.isElement(this._config.reference)) {
5939          referenceElement = this._config.reference; // Check if it's jQuery element
5940
5941          if (typeof this._config.reference.jquery !== 'undefined') {
5942            referenceElement = this._config.reference[0];
5943          }
5944        } // If boundary is not `scrollParent`, then set position to `static`
5945        // to allow the menu to "escape" the scroll parent's boundaries
5946        // https://github.com/twbs/bootstrap/issues/24251
5947
5948
5949        if (this._config.boundary !== 'scrollParent') {
5950          $__default["default"](parent).addClass(CLASS_NAME_POSITION_STATIC);
5951        }
5952
5953        this._popper = new Popper__default["default"](referenceElement, this._menu, this._getPopperConfig());
5954      } // If this is a touch-enabled device we add extra
5955      // empty mouseover listeners to the body's immediate children;
5956      // only needed because of broken event delegation on iOS
5957      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
5958
5959
5960      if ('ontouchstart' in document.documentElement && $__default["default"](parent).closest(SELECTOR_NAVBAR_NAV).length === 0) {
5961        $__default["default"](document.body).children().on('mouseover', null, $__default["default"].noop);
5962      }
5963
5964      this._element.focus();
5965
5966      this._element.setAttribute('aria-expanded', true);
5967
5968      $__default["default"](this._menu).toggleClass(CLASS_NAME_SHOW$5);
5969      $__default["default"](parent).toggleClass(CLASS_NAME_SHOW$5).trigger($__default["default"].Event(EVENT_SHOWN$3, relatedTarget));
5970    };
5971
5972    _proto.hide = function hide() {
5973      if (this._element.disabled || $__default["default"](this._element).hasClass(CLASS_NAME_DISABLED$1) || !$__default["default"](this._menu).hasClass(CLASS_NAME_SHOW$5)) {
5974        return;
5975      }
5976
5977      var relatedTarget = {
5978        relatedTarget: this._element
5979      };
5980      var hideEvent = $__default["default"].Event(EVENT_HIDE$3, relatedTarget);
5981
5982      var parent = Dropdown._getParentFromElement(this._element);
5983
5984      $__default["default"](parent).trigger(hideEvent);
5985
5986      if (hideEvent.isDefaultPrevented()) {
5987        return;
5988      }
5989
5990      if (this._popper) {
5991        this._popper.destroy();
5992      }
5993
5994      $__default["default"](this._menu).toggleClass(CLASS_NAME_SHOW$5);
5995      $__default["default"](parent).toggleClass(CLASS_NAME_SHOW$5).trigger($__default["default"].Event(EVENT_HIDDEN$3, relatedTarget));
5996    };
5997
5998    _proto.dispose = function dispose() {
5999      $__default["default"].removeData(this._element, DATA_KEY$6);
6000      $__default["default"](this._element).off(EVENT_KEY$6);
6001      this._element = null;
6002      this._menu = null;
6003
6004      if (this._popper !== null) {
6005        this._popper.destroy();
6006
6007        this._popper = null;
6008      }
6009    };
6010
6011    _proto.update = function update() {
6012      this._inNavbar = this._detectNavbar();
6013
6014      if (this._popper !== null) {
6015        this._popper.scheduleUpdate();
6016      }
6017    } // Private
6018    ;
6019
6020    _proto._addEventListeners = function _addEventListeners() {
6021      var _this = this;
6022
6023      $__default["default"](this._element).on(EVENT_CLICK, function (event) {
6024        event.preventDefault();
6025        event.stopPropagation();
6026
6027        _this.toggle();
6028      });
6029    };
6030
6031    _proto._getConfig = function _getConfig(config) {
6032      config = _extends({}, this.constructor.Default, $__default["default"](this._element).data(), config);
6033      Util.typeCheckConfig(NAME$6, config, this.constructor.DefaultType);
6034      return config;
6035    };
6036
6037    _proto._getMenuElement = function _getMenuElement() {
6038      if (!this._menu) {
6039        var parent = Dropdown._getParentFromElement(this._element);
6040
6041        if (parent) {
6042          this._menu = parent.querySelector(SELECTOR_MENU);
6043        }
6044      }
6045
6046      return this._menu;
6047    };
6048
6049    _proto._getPlacement = function _getPlacement() {
6050      var $parentDropdown = $__default["default"](this._element.parentNode);
6051      var placement = PLACEMENT_BOTTOM; // Handle dropup
6052
6053      if ($parentDropdown.hasClass(CLASS_NAME_DROPUP)) {
6054        placement = $__default["default"](this._menu).hasClass(CLASS_NAME_MENURIGHT) ? PLACEMENT_TOPEND : PLACEMENT_TOP;
6055      } else if ($parentDropdown.hasClass(CLASS_NAME_DROPRIGHT)) {
6056        placement = PLACEMENT_RIGHT;
6057      } else if ($parentDropdown.hasClass(CLASS_NAME_DROPLEFT)) {
6058        placement = PLACEMENT_LEFT;
6059      } else if ($__default["default"](this._menu).hasClass(CLASS_NAME_MENURIGHT)) {
6060        placement = PLACEMENT_BOTTOMEND;
6061      }
6062
6063      return placement;
6064    };
6065
6066    _proto._detectNavbar = function _detectNavbar() {
6067      return $__default["default"](this._element).closest('.navbar').length > 0;
6068    };
6069
6070    _proto._getOffset = function _getOffset() {
6071      var _this2 = this;
6072
6073      var offset = {};
6074
6075      if (typeof this._config.offset === 'function') {
6076        offset.fn = function (data) {
6077          data.offsets = _extends({}, data.offsets, _this2._config.offset(data.offsets, _this2._element));
6078          return data;
6079        };
6080      } else {
6081        offset.offset = this._config.offset;
6082      }
6083
6084      return offset;
6085    };
6086
6087    _proto._getPopperConfig = function _getPopperConfig() {
6088      var popperConfig = {
6089        placement: this._getPlacement(),
6090        modifiers: {
6091          offset: this._getOffset(),
6092          flip: {
6093            enabled: this._config.flip
6094          },
6095          preventOverflow: {
6096            boundariesElement: this._config.boundary
6097          }
6098        }
6099      }; // Disable Popper if we have a static display
6100
6101      if (this._config.display === 'static') {
6102        popperConfig.modifiers.applyStyle = {
6103          enabled: false
6104        };
6105      }
6106
6107      return _extends({}, popperConfig, this._config.popperConfig);
6108    } // Static
6109    ;
6110
6111    Dropdown._jQueryInterface = function _jQueryInterface(config) {
6112      return this.each(function () {
6113        var data = $__default["default"](this).data(DATA_KEY$6);
6114
6115        var _config = typeof config === 'object' ? config : null;
6116
6117        if (!data) {
6118          data = new Dropdown(this, _config);
6119          $__default["default"](this).data(DATA_KEY$6, data);
6120        }
6121
6122        if (typeof config === 'string') {
6123          if (typeof data[config] === 'undefined') {
6124            throw new TypeError("No method named \"" + config + "\"");
6125          }
6126
6127          data[config]();
6128        }
6129      });
6130    };
6131
6132    Dropdown._clearMenus = function _clearMenus(event) {
6133      if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {
6134        return;
6135      }
6136
6137      var toggles = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE$2));
6138
6139      for (var i = 0, len = toggles.length; i < len; i++) {
6140        var parent = Dropdown._getParentFromElement(toggles[i]);
6141
6142        var context = $__default["default"](toggles[i]).data(DATA_KEY$6);
6143        var relatedTarget = {
6144          relatedTarget: toggles[i]
6145        };
6146
6147        if (event && event.type === 'click') {
6148          relatedTarget.clickEvent = event;
6149        }
6150
6151        if (!context) {
6152          continue;
6153        }
6154
6155        var dropdownMenu = context._menu;
6156
6157        if (!$__default["default"](parent).hasClass(CLASS_NAME_SHOW$5)) {
6158          continue;
6159        }
6160
6161        if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $__default["default"].contains(parent, event.target)) {
6162          continue;
6163        }
6164
6165        var hideEvent = $__default["default"].Event(EVENT_HIDE$3, relatedTarget);
6166        $__default["default"](parent).trigger(hideEvent);
6167
6168        if (hideEvent.isDefaultPrevented()) {
6169          continue;
6170        } // If this is a touch-enabled device we remove the extra
6171        // empty mouseover listeners we added for iOS support
6172
6173
6174        if ('ontouchstart' in document.documentElement) {
6175          $__default["default"](document.body).children().off('mouseover', null, $__default["default"].noop);
6176        }
6177
6178        toggles[i].setAttribute('aria-expanded', 'false');
6179
6180        if (context._popper) {
6181          context._popper.destroy();
6182        }
6183
6184        $__default["default"](dropdownMenu).removeClass(CLASS_NAME_SHOW$5);
6185        $__default["default"](parent).removeClass(CLASS_NAME_SHOW$5).trigger($__default["default"].Event(EVENT_HIDDEN$3, relatedTarget));
6186      }
6187    };
6188
6189    Dropdown._getParentFromElement = function _getParentFromElement(element) {
6190      var parent;
6191      var selector = Util.getSelectorFromElement(element);
6192
6193      if (selector) {
6194        parent = document.querySelector(selector);
6195      }
6196
6197      return parent || element.parentNode;
6198    } // eslint-disable-next-line complexity
6199    ;
6200
6201    Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {
6202      // If not input/textarea:
6203      //  - And not a key in REGEXP_KEYDOWN => not a dropdown command
6204      // If input/textarea:
6205      //  - If space key => not a dropdown command
6206      //  - If key is other than escape
6207      //    - If key is not up or down => not a dropdown command
6208      //    - If trigger inside the menu =>
6208 not a dropdown command
6209      if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE$1 && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $__default["default"](event.target).closest(SELECTOR_MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {
6210        return;
6211      }
6212
6213      if (this.disabled || $__default["default"](this).hasClass(CLASS_NAME_DISABLED$1)) {
6214        return;
6215      }
6216
6217      var parent = Dropdown._getParentFromElement(this);
6218
6219      var isActive = $__default["default"](parent).hasClass(CLASS_NAME_SHOW$5);
6220
6221      if (!isActive && event.which === ESCAPE_KEYCODE$1) {
6222        return;
6223      }
6224
6225      event.preventDefault();
6226      event.stopPropagation();
6227
6228      if (!isActive || event.which === ESCAPE_KEYCODE$1 || event.which === SPACE_KEYCODE) {
6229        if (event.which === ESCAPE_KEYCODE$1) {
6230          $__default["default"](parent.querySelector(SELECTOR_DATA_TOGGLE$2)).trigger('focus');
6231        }
6232
6233        $__default["default"](this).trigger('click');
6234        return;
6235      }
6236
6237      var items = [].slice.call(parent.querySelectorAll(SELECTOR_VISIBLE_ITEMS)).filter(function (item) {
6238        return $__default["default"](item).is(':visible');
6239      });
6240
6241      if (items.length === 0) {
6242        return;
6243      }
6244
6245      var index = items.indexOf(event.target);
6246
6247      if (event.which === ARROW_UP_KEYCODE && index > 0) {
6248        // Up
6249        index--;
6250      }
6251
6252      if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {
6253        // Down
6254        index++;
6255      }
6256
6257      if (index < 0) {
6258        index = 0;
6259      }
6260
6261      items[index].focus();
6262    };
6263
6264    _createClass(Dropdown, null, [{
6265      key: "VERSION",
6266      get: function get() {
6267        return VERSION$6;
6268      }
6269    }, {
6270      key: "Default",
6271      get: function get() {
6272        return Default$5;
6273      }
6274    }, {
6275      key: "DefaultType",
6276      get: function get() {
6277        return DefaultType$5;
6278      }
6279    }]);
6280
6281    return Dropdown;
6282  }();
6283  /**
6284   * Data API implementation
6285   */
6286
6287
6288  $__default["default"](document).on(EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$2, Dropdown._dataApiKeydownHandler).on(EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown._dataApiKeydownHandler).on(EVENT_CLICK_DATA_API$2 + " " + EVENT_KEYUP_DATA_API, Dropdown._clearMenus).on(EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {
6289    event.preventDefault();
6290    event.stopPropagation();
6291
6292    Dropdown._jQueryInterface.call($__default["default"](this), 'toggle');
6293  }).on(EVENT_CLICK_DATA_API$2, SELECTOR_FORM_CHILD, function (e) {
6294    e.stopPropagation();
6295  });
6296  /**
6297   * jQuery
6298   */
6299
6300  $__default["default"].fn[NAME$6] = Dropdown._jQueryInterface;
6301  $__default["default"].fn[NAME$6].Constructor = Dropdown;
6302
6303  $__default["default"].fn[NAME$6].noConflict = function () {
6304    $__default["default"].fn[NAME$6] = JQUERY_NO_CONFLICT$6;
6305    return Dropdown._jQueryInterface;
6306  };
6307
6308  /**
6309   * Constants
6310   */
6311
6312  var NAME$5 = 'modal';
6313  var VERSION$5 = '4.6.2';
6314  var DATA_KEY$5 = 'bs.modal';
6315  var EVENT_KEY$5 = "." + DATA_KEY$5;
6316  var DATA_API_KEY$2 = '.data-api';
6317  var JQUERY_NO_CONFLICT$5 = $__default["default"].fn[NAME$5];
6318  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
6319
6320  var CLASS_NAME_SCROLLABLE = 'modal-dialog-scrollable';
6321  var CLASS_NAME_SCROLLBAR_MEASURER = 'modal-scrollbar-measure';
6322  var CLASS_NAME_BACKDROP = 'modal-backdrop';
6323  var CLASS_NAME_OPEN = 'modal-open';
6324  var CLASS_NAME_FADE$4 = 'fade';
6325  var CLASS_NAME_SHOW$4 = 'show';
6326  var CLASS_NAME_STATIC = 'modal-static';
6327  var EVENT_HIDE$2 = "hide" + EVENT_KEY$5;
6328  var EVENT_HIDE_PREVENTED = "hidePrevented" + EVENT_KEY$5;
6329  var EVENT_HIDDEN$2 = "hidden" + EVENT_KEY$5;
6330  var EVENT_SHOW$2 = "show" + EVENT_KEY$5;
6331  var EVENT_SHOWN$2 = "shown" + EVENT_KEY$5;
6332  var EVENT_FOCUSIN = "focusin" + EVENT_KEY$5;
6333  var EVENT_RESIZE = "resize" + EVENT_KEY$5;
6334  var EVENT_CLICK_DISMISS$1 = "click.dismiss" + EVENT_KEY$5;
6335  var EVENT_KEYDOWN_DISMISS = "keydown.dismiss" + EVENT_KEY$5;
6336  var EVENT_MOUSEUP_DISMISS = "mouseup.dismiss" + EVENT_KEY$5;
6337  var EVENT_MOUSEDOWN_DISMISS = "mousedown.dismiss" + EVENT_KEY$5;
6338  var EVENT_CLICK_DATA_API$1 = "click" + EVENT_KEY$5 + DATA_API_KEY$2;
6339  var SELECTOR_DIALOG = '.modal-dialog';
6340  var SELECTOR_MODAL_BODY = '.modal-body';
6341  var SELECTOR_DATA_TOGGLE$1 = '[data-toggle="modal"]';
6342  var SELECTOR_DATA_DISMISS$1 = '[data-dismiss="modal"]';
6343  var SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
6344  var SELECTOR_STICKY_CONTENT = '.sticky-top';
6345  var Default$4 = {
6346    backdrop: true,
6347    keyboard: true,
6348    focus: true,
6349    show: true
6350  };
6351  var DefaultType$4 = {
6352    backdrop: '(boolean|string)',
6353    keyboard: 'boolean',
6354    focus: 'boolean',
6355    show: 'boolean'
6356  };
6357  /**
6358   * Class definition
6359   */
6360
6361  var Modal = /*#__PURE__*/function () {
6362    function Modal(element, config) {
6363      this._config = this._getConfig(config);
6364      this._element = element;
6365      this._dialog = element.querySelector(SELECTOR_DIALOG);
6366      this._backdrop = null;
6367      this._isShown = false;
6368      this._isBodyOverflowing = false;
6369      this._ignoreBackdropClick = false;
6370      this._isTransitioning = false;
6371      this._scrollbarWidth = 0;
6372    } // Getters
6373
6374
6375    var _proto = Modal.prototype;
6376
6377    // Public
6378    _proto.toggle = function toggle(relatedTarget) {
6379      return this._isShown ? this.hide() : this.show(relatedTarget);
6380    };
6381
6382    _proto.show = function show(relatedTarget) {
6383      var _this = this;
6384
6385      if (this._isShown || this._isTransitioning) {
6386        return;
6387      }
6388
6389      var showEvent = $__default["default"].Event(EVENT_SHOW$2, {
6390        relatedTarget: relatedTarget
6391      });
6392      $__default["default"](this._element).trigger(showEvent);
6393
6394      if (showEvent.isDefaultPrevented()) {
6395        return;
6396      }
6397
6398      this._isShown = true;
6399
6400      if ($__default["default"](this._element).hasClass(CLASS_NAME_FADE$4)) {
6401        this._isTransitioning = true;
6402      }
6403
6404      this._checkScrollbar();
6405
6406      this._setScrollbar();
6407
6408      this._adjustDialog();
6409
6410      this._setEscapeEvent();
6411
6412      this._setResizeEvent();
6413
6414      $__default["default"](this._element).on(EVENT_CLICK_DISMISS$1, SELECTOR_DATA_DISMISS$1, function (event) {
6415        return _this.hide(event);
6416      });
6417      $__default["default"](this._dialog).on(EVENT_MOUSEDOWN_DISMISS, function () {
6418        $__default["default"](_this._element).one(EVENT_MOUSEUP_DISMISS, function (event) {
6419          if ($__default["default"](event.target).is(_this._element)) {
6420            _this._ignoreBackdropClick = true;
6421          }
6422        });
6423      });
6424
6425      this._showBackdrop(function () {
6426        return _this._showElement(relatedTarget);
6427      });
6428    };
6429
6430    _proto.hide = function hide(event) {
6431      var _this2 = this;
6432
6433      if (event) {
6434        event.preventDefault();
6435      }
6436
6437      if (!this._isShown || this._isTransitioning) {
6438        return;
6439      }
6440
6441      var hideEvent = $__default["default"].Event(EVENT_HIDE$2);
6442      $__default["default"](this._element).trigger(hideEvent);
6443
6444      if (!this._isShown || hideEvent.isDefaultPrevented()) {
6445        return;
6446      }
6447
6448      this._isShown = false;
6449      var transition = $__default["default"](this._element).hasClass(CLASS_NAME_FADE$4);
6450
6451      if (transition) {
6452        this._isTransitioning = true;
6453      }
6454
6455      this._setEscapeEvent();
6456
6457      this._setResizeEvent();
6458
6459      $__default["default"](document).off(EVENT_FOCUSIN);
6460      $__default["default"](this._element).removeClass(CLASS_NAME_SHOW$4);
6461      $__default["default"](this._element).off(EVENT_CLICK_DISMISS$1);
6462      $__default["default"](this._dialog).off(EVENT_MOUSEDOWN_DISMISS);
6463
6464      if (transition) {
6465        var transitionDuration = Util.getTransitionDurationFromElement(this._element);
6466        $__default["default"](this._element).one(Util.TRANSITION_END, function (event) {
6467          return _this2._hideModal(event);
6468        }).emulateTransitionEnd(transitionDuration);
6469      } else {
6470        this._hideModal();
6471      }
6472    };
6473
6474    _proto.dispose = function dispose() {
6475      [window, this._element, this._dialog].forEach(function (htmlElement) {
6476        return $__default["default"](htmlElement).off(EVENT_KEY$5);
6477      });
6478      /**
6479       * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API`
6480       * Do not move `document` in `htmlElements` array
6481       * It will remove `EVENT_CLICK_DATA_API` event that should remain
6482       */
6483
6484      $__default["default"](document).off(EVENT_FOCUSIN);
6485      $__default["default"].removeData(this._element, DATA_KEY$5);
6486      this._config = null;
6487      this._element = null;
6488      this._dialog = null;
6489      this._backdrop = null;
6490      this._isShown = null;
6491      this._isBodyOverflowing = null;
6492      this._ignoreBackdropClick = null;
6493      this._isTransitioning = null;
6494      this._scrollbarWidth = null;
6495    };
6496
6497    _proto.handleUpdate = function handleUpdate() {
6498      this._adjustDialog();
6499    } // Private
6500    ;
6501
6502    _proto._getConfig = function _getConfig(config) {
6503      config = _extends({}, Default$4, config);
6504      Util.typeCheckConfig(NAME$5, config, DefaultType$4);
6505      return config;
6506    };
6507
6508    _proto._triggerBackdropTransition = function _triggerBackdropTransition() {
6509      var _this3 = this;
6510
6511      var hideEventPrevented = $__default["default"].Event(EVENT_HIDE_PREVENTED);
6512      $__default["default"](this._element).trigger(hideEventPrevented);
6513
6514      if (hideEventPrevented.isDefaultPrevented()) {
6515        return;
6516      }
6517
6518      var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
6519
6520      if (!isModalOverflowing) {
6521        this._element.style.overflowY = 'hidden';
6522      }
6523
6524      this._element.classList.add(CLASS_NAME_STATIC);
6525
6526      var modalTransitionDuration = Util.getTransitionDurationFromElement(this._dialog);
6527      $__default["default"](this._element).off(Util.TRANSITION_END);
6528      $__default["default"](this._element).one(Util.TRANSITION_END, function () {
6529        _this3._element.classList.remove(CLASS_NAME_STATIC);
6530
6531        if (!isModalOverflowing) {
6532          $__default["default"](_this3._element).one(Util.TRANSITION_END, function () {
6533            _this3._element.style.overflowY = '';
6534          }).emulateTransitionEnd(_this3._element, modalTransitionDuration);
6535        }
6536      }).emulateTransitionEnd(modalTransitionDuration);
6537
6538      this._element.focus();
6539    };
6540
6541    _proto._showElement = function _showElement(relatedTarget) {
6542      var _this4 = this;
6543
6544      var transition = $__default["default"](this._element).hasClass(CLASS_NAME_FADE$4);
6545      var modalBody = this._dialog ? this._dialog.querySelector(SELECTOR_MODAL_BODY) : null;
6546
6547      if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
6548        // Don't move modal's DOM position
6549        document.body.appendChild(this._element);
6550      }
6551
6552      this._element.style.display = 'block';
6553
6554      this._element.removeAttribute('aria-hidden');
6555
6556      this._element.setAttribute('aria-modal', true);
6557
6558      this._element.setAttribute('role', 'dialog');
6559
6560      if ($__default["default"](this._dialog).hasClass(CLASS_NAME_SCROLLABLE) && modalBody) {
6561        modalBody.scrollTop = 0;
6562      } else {
6563        this._element.scrollTop = 0;
6564      }
6565
6566      if (transition) {
6567        Util.reflow(this._element);
6568      }
6569
6570      $__default["default"](this._element).addClass(CLASS_NAME_SHOW$4);
6571
6572      if (this._config.focus) {
6573        this._enforceFocus();
6574      }
6575
6576      var shownEvent = $__default["default"].Event(EVENT_SHOWN$2, {
6577        relatedTarget: relatedTarget
6578      });
6579
6580      var transitionComplete = function transitionComplete() {
6581        if (_this4._config.focus) {
6582          _this4._element.focus();
6583        }
6584
6585        _this4._isTransitioning = false;
6586        $__default["default"](_this4._element).trigger(shownEvent);
6587      };
6588
6589      if (transition) {
6590        var transitionDuration = Util.getTransitionDurationFromElement(this._dialog);
6591        $__default["default"](this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);
6592      } else {
6593        transitionComplete();
6594      }
6595    };
6596
6597    _proto._enforceFocus = function _enforceFocus() {
6598      var _this5 = this;
6599
6600      $__default["default"](document).off(EVENT_FOCUSIN) // Guard against infinite focus loop
6601      .on(EVENT_FOCUSIN, function (event) {
6602        if (document !== event.target && _this5._element !== event.target && $__default["default"](_this5._element).has(event.target).length === 0) {
6603          _this5._element.focus();
6604        }
6605      });
6606    };
6607
6608    _proto._setEscapeEvent = function _setEscapeEvent() {
6609      var _this6 = this;
6610
6611      if (this._isShown) {
6612        $__default["default"](this._element).on(EVENT_KEYDOWN_DISMISS, function (event) {
6613          if (_this6._config.keyboard && event.which === ESCAPE_KEYCODE) {
6614            event.preventDefault();
6615
6616            _this6.hide();
6617          } else if (!_this6._config.keyboard && event.which === ESCAPE_KEYCODE) {
6618            _this6._triggerBackdropTransition();
6619          }
6620        });
6621      } else if (!this._isShown) {
6622        $__default["default"](this._element).off(EVENT_KEYDOWN_DISMISS);
6623      }
6624    };
6625
6626    _proto._setResizeEvent = function _setResizeEvent() {
6627      var _this7 = this;
6628
6629      if (this._isShown) {
6630        $__default["default"](window).on(EVENT_RESIZE, function (event) {
6631          return _this7.handleUpdate(event);
6632        });
6633      } else {
6634        $__default["default"](window).off(EVENT_RESIZE);
6635      }
6636    };
6637
6638    _proto._hideModal = function _hideModal() {
6639      var _this8 = this;
6640
6641      this._element.style.display = 'none';
6642
6643      this._element.setAttribute('aria-hidden', true);
6644
6645      this._element.removeAttribute('aria-modal');
6646
6647      this._element.removeAttribute('role');
6648
6649      this._isTransitioning = false;
6650
6651      this._showBackdrop(function () {
6652        $__default["default"](document.body).removeClass(CLASS_NAME_OPEN);
6653
6654        _this8._resetAdjustments();
6655
6656        _this8._resetScrollbar();
6657
6658        $__default["default"](_this8._element).trigger(EVENT_HIDDEN$2);
6659      });
6660    };
6661
6662    _proto._removeBackdrop = function _removeBackdrop() {
6663      if (this._backdrop) {
6664        $__default["default"](this._backdrop).remove();
6665        this._backdrop = null;
6666      }
6667    };
6668
6669    _proto._showBackdrop = function _showBackdrop(callback) {
6670      var _this9 = this;
6671
6672      var animate = $__default["default"](this._element).hasClass(CLASS_NAME_FADE$4) ? CLASS_NAME_FADE$4 : '';
6673
6674      if (this._isShown && this._config.backdrop) {
6675        this._backdrop = document.createElement('div');
6676        this._backdrop.className = CLASS_NAME_BACKDROP;
6677
6678        if (animate) {
6679          this._backdrop.classList.add(animate);
6680        }
6681
6682        $__default["default"](this._backdrop).appendTo(document.body);
6683        $__default["default"](this._element).on(EVENT_CLICK_DISMISS$1, function (event) {
6684          if (_this9._ignoreBackdropClick) {
6685            _this9._ignoreBackdropClick = false;
6686            return;
6687          }
6688
6689          if (event.target !== event.currentTarget) {
6690            return;
6691          }
6692
6693          if (_this9._config.backdrop === 'static') {
6694            _this9._triggerBackdropTransition();
6695          } else {
6696            _this9.hide();
6697          }
6698        });
6699
6700        if (animate) {
6701          Util.reflow(this._backdrop);
6702        }
6703
6704        $__default["default"](this._backdrop).addClass(CLASS_NAME_SHOW$4);
6705
6706        if (!callback) {
6707          return;
6708        }
6709
6710        if (!animate) {
6711          callback();
6712          return;
6713        }
6714
6715        var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);
6716        $__default["default"](this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);
6717      } else if (!this._isShown && this._backdrop) {
6718        $__default["default"](this._backdrop).removeClass(CLASS_NAME_SHOW$4);
6719
6720        var callbackRemove = function callbackRemove() {
6721          _this9._removeBackdrop();
6722
6723          if (callback) {
6724            callback();
6725          }
6726        };
6727
6728        if ($__default["default"](this._element).hasClass(CLASS_NAME_FADE$4)) {
6729          var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);
6730
6731          $__default["default"](this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);
6732        } else {
6733          callbackRemove();
6734        }
6735      } else if (callback) {
6736        callback();
6737      }
6738    } // ----------------------------------------------------------------------
6739    // the following methods are used to handle overflowing modals
6740    // todo (fat): these should probably be refactored out of modal.js
6741    // ----------------------------------------------------------------------
6742    ;
6743
6744    _proto._adjustDialog = function _adjustDialog() {
6745      var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
6746
6747      if (!this._isBodyOverflowing && isModalOverflowing) {
6748        this._element.style.paddingLeft = this._scrollbarWidth + "px";
6749      }
6750
6751      if (this._isBodyOverflowing && !isModalOverflowing) {
6752        this._element.style.paddingRight = this._scrollbarWidth + "px";
6753      }
6754    };
6755
6756    _proto._resetAdjustments = function _resetAdjustments() {
6757      this._element.style.paddingLeft = '';
6758      this._element.style.paddingRight = '';
6759    };
6760
6761    _proto._checkScrollbar = function _checkScrollbar() {
6762      var rect = document.body.getBoundingClientRect();
6763      this._isBodyOverflowing = Math.round(rect.left + rect.right) < window.innerWidth;
6764      this._scrollbarWidth = this._getScrollbarWidth();
6765    };
6766
6767    _proto._setScrollbar = function _setScrollbar() {
6768      var _this10 = this;
6769
6770      if (this._isBodyOverflowing) {
6771        // Note: DOMNode.style.paddingRight returns the actual value or '' if not set
6772        //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set
6773        var fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT));
6774        var stickyContent = [].slice.call(document.querySelectorAll(SELECTOR_STICKY_CONTENT)); // Adjust fixed content padding
6775
6776        $__default["default"](fixedContent).each(function (index, element) {
6777          var actualPadding = element.style.paddingRight;
6778          var calculatedPadding = $__default["default"](element).css('padding-right');
6779          $__default["default"](element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this10._scrollbarWidth + "px");
6780        }); // Adjust sticky content margin
6781
6782        $__default["default"](stickyContent).each(function (index, element) {
6783          var actualMargin = element.style.marginRight;
6784          var calculatedMargin = $__default["default"](element).css('margin-right');
6785          $__default["default"](element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this10._scrollbarWidth + "px");
6786        }); // Adjust body padding
6787
6788        var actualPadding = document.body.style.paddingRight;
6789        var calculatedPadding = $__default["default"](document.body).css('padding-right');
6790        $__default["default"](document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px");
6791      }
6792
6793      $__default["default"](document.body).addClass(CLASS_NAME_OPEN);
6794    };
6795
6796    _proto._resetScrollbar = function _resetScrollbar() {
6797      // Restore fixed content padding
6798      var fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT));
6799      $__default["default"](fixedContent).each(function (index, element) {
6800        var padding = $__default["default"](element).data('padding-right');
6801        $__default["default"](element).removeData('padding-right');
6802        element.style.paddingRight = padding ? padding : '';
6803      }); // Restore sticky content
6804
6805      var elements = [].slice.call(document.querySelectorAll("" + SELECTOR_STICKY_CONTENT));
6806      $__default["default"](elements).each(function (index, element) {
6807        var margin = $__default["default"](element).data('margin-right');
6808
6809        if (typeof margin !== 'undefined') {
6810          $__default["default"](element).css('margin-right', margin).removeData('margin-right');
6811        }
6812      }); // Restore body padding
6813
6814      var padding = $__default["default"](document.body).data('padding-right');
6815      $__default["default"](document.body).removeData('padding-right');
6816      document.body.style.paddingRight = padding ? padding : '';
6817    };
6818
6819    _proto._getScrollbarWidth = function _getScrollbarWidth() {
6820      // thx d.walsh
6821      var scrollDiv = document.createElement('div');
6822      scrollDiv.className = CLASS_NAME_SCROLLBAR_MEASURER;
6823      document.body.appendChild(scrollDiv);
6824      var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;
6825      document.body.removeChild(scrollDiv);
6826      return scrollbarWidth;
6827    } // Static
6828    ;
6829
6830    Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {
6831      return this.each(function () {
6832        var data = $__default["default"](this).data(DATA_KEY$5);
6833
6834        var _config = _extends({}, Default$4, $__default["default"](this).data(), typeof config === 'object' && config ? config : {});
6835
6836        if (!data) {
6837          data = new Modal(this, _config);
6838          $__default["default"](this).data(DATA_KEY$5, data);
6839        }
6840
6841        if (typeof config === 'string') {
6842          if (typeof data[config] === 'undefined') {
6843            throw new TypeError("No method named \"" + config + "\"");
6844          }
6845
6846          data[config](relatedTarget);
6847        } else if (_config.show) {
6848          data.show(relatedTarget);
6849        }
6850      });
6851    };
6852
6853    _createClass(Modal, null, [{
6854      key: "VERSION",
6855      get: function get() {
6856        return VERSION$5;
6857      }
6858    }, {
6859      key: "Default",
6860      get: function get() {
6861        return Default$4;
6862      }
6863    }]);
6864
6865    return Modal;
6866  }();
6867  /**
6868   * Data API implementation
6869   */
6870
6871
6872  $__default["default"](document).on(EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {
6873    var _this11 = this;
6874
6875    var target;
6876    var selector = Util.getSelectorFromElement(this);
6877
6878    if (selector) {
6879      target = document.querySelector(selector);
6880    }
6881
6882    var config = $__default["default"](target).data(DATA_KEY$5) ? 'toggle' : _extends({}, $__default["default"](target).data(), $__default["default"](this).data());
6883
6884    if (this.tagName === 'A' || this.tagName === 'AREA') {
6885      event.preventDefault();
6886    }
6887
6888    var $target = $__default["default"](target).one(EVENT_SHOW$2, function (showEvent) {
6889      if (showEvent.isDefaultPrevented()) {
6890        // Only register focus restorer if modal will actually get shown
6891        return;
6892      }
6893
6894      $target.one(EVENT_HIDDEN$2, function () {
6895        if ($__default["default"](_this11).is(':visible')) {
6896          _this11.focus();
6897        }
6898      });
6899    });
6900
6901    Modal._jQueryInterface.call($__default["default"](target), config, this);
6902  });
6903  /**
6904   * jQuery
6905   */
6906
6907  $__default["default"].fn[NAME$5] = Modal._jQueryInterface;
6908  $__default["default"].fn[NAME$5].Constructor = Modal;
6909
6910  $__default["default"].fn[NAME$5].noConflict = function () {
6911    $__default["default"].fn[NAME$5] = JQUERY_NO_CONFLICT$5;
6912    return Modal._jQueryInterface;
6913  };
6914
6915  /**
6916   * --------------------------------------------------------------------------
6917   * Bootstrap (v4.6.2): tools/sanitizer.js
6918   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
6919   * --------------------------------------------------------------------------
6920   */
6921  var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href'];
6922  var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
6923  var DefaultWhitelist = {
6924    // Global attributes allowed on any supplied element below.
6925    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
6926    a: ['target', 'href', 'title', 'rel'],
6927    area: [],
6928    b: [],
6929    br: [],
6930    col: [],
6931    code: [],
6932    div: [],
6933    em: [],
6934    hr: [],
6935    h1: [],
6936    h2: [],
6937    h3: [],
6938    h4: [],
6939    h5: [],
6940    h6: [],
6941    i: [],
6942    img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],
6943    li: [],
6944    ol: [],
6945    p: [],
6946    pre: [],
6947    s: [],
6948    small: [],
6949    span: [],
6950    sub: [],
6951    sup: [],
6952    strong: [],
6953    u: [],
6954    ul: []
6955  };
6956  /**
6957   * A pattern that recognizes a commonly useful subset of URLs that are safe.
6958   *
6959   * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
6960   */
6961
6962  var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i;
6963  /**
6964   * A pattern that matches safe data URLs. Only matches image, video and audio types.
6965   *
6966   * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
6967   */
6968
6969  var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i;
6970
6971  function allowedAttribute(attr, allowedAttributeList) {
6972    var attrName = attr.nodeName.toLowerCase();
6973
6974    if (allowedAttributeList.indexOf(attrName) !== -1) {
6975      if (uriAttrs.indexOf(attrName) !== -1) {
6976        return Boolean(SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue));
6977      }
6978
6979      return true;
6980    }
6981
6982    var regExp = allowedAttributeList.filter(function (attrRegex) {
6983      return attrRegex instanceof RegExp;
6984    }); // Check if a regular expression validates the attribute.
6985
6986    for (var i = 0, len = regExp.length; i < len; i++) {
6987      if (regExp[i].test(attrName)) {
6988        return true;
6989      }
6990    }
6991
6992    return false;
6993  }
6994
6995  function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
6996    if (unsafeHtml.length === 0) {
6997      return unsafeHtml;
6998    }
6999
7000    if (sanitizeFn && typeof sanitizeFn === 'function') {
7001      return sanitizeFn(unsafeHtml);
7002    }
7003
7004    var domParser = new window.DOMParser();
7005    var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');
7006    var whitelistKeys = Object.keys(whiteList);
7007    var elements = [].slice.call(createdDocument.body.querySelectorAll('*'));
7008
7009    var _loop = function _loop(i, len) {
7010      var el = elements[i];
7011      var elName = el.nodeName.toLowerCase();
7012
7013      if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {
7014        el.parentNode.removeChild(el);
7015        return "continue";
7016      }
7017
7018      var attributeList = [].slice.call(el.attributes); // eslint-disable-next-line unicorn/prefer-spread
7019
7020      var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []);
7021      attributeList.forEach(function (attr) {
7022        if (!allowedAttribute(attr, whitelistedAttributes)) {
7023          el.removeAttribute(attr.nodeName);
7024        }
7025      });
7026    };
7027
7028    for (var i = 0, len = elements.length; i < len; i++) {
7029      var _ret = _loop(i);
7030
7031      if (_ret === "continue") continue;
7032    }
7033
7034    return createdDocument.body.innerHTML;
7035  }
7036
7037  /**
7038   * Constants
7039   */
7040
7041  var NAME$4 = 'tooltip';
7042  var VERSION$4 = '4.6.2';
7043  var DATA_KEY$4 = 'bs.tooltip';
7044  var EVENT_KEY$4 = "." + DATA_KEY$4;
7045  var JQUERY_NO_CONFLICT$4 = $__default["default"].fn[NAME$4];
7046  var CLASS_PREFIX$1 = 'bs-tooltip';
7047  var BSCLS_PREFIX_REGEX$1 = new RegExp("(^|\\s)" + CLASS_PREFIX$1 + "\\S+", 'g');
7048  var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'];
7049  var CLASS_NAME_FADE$3 = 'fade';
7050  var CLASS_NAME_SHOW$3 = 'show';
7051  var HOVER_STATE_SHOW = 'show';
7052  var HOVER_STATE_OUT = 'out';
7053  var SELECTOR_TOOLTIP_INNER = '.tooltip-inner';
7054  var SELECTOR_ARROW = '.arrow';
7055  var TRIGGER_HOVER = 'hover';
7056  var TRIGGER_FOCUS = 'focus';
7057  var TRIGGER_CLICK = 'click';
7058  var TRIGGER_MANUAL = 'manual';
7059  var AttachmentMap = {
7060    AUTO: 'auto',
7061    TOP: 'top',
7062    RIGHT: 'right',
7063    BOTTOM: 'bottom',
7064    LEFT: 'left'
7065  };
7066  var Default$3 = {
7067    animation: true,
7068    template: '<div class="tooltip" role="tooltip">' + '<div class="arrow"></div>' + '<div class="tooltip-inner"></div></div>',
7069    trigger: 'hover focus',
7070    title: '',
7071    delay: 0,
7072    html: false,
7073    selector: false,
7074    placement: 'top',
7075    offset: 0,
7076    container: false,
7077    fallbackPlacement: 'flip',
7078    boundary: 'scrollParent',
7079    customClass: '',
7080    sanitize: true,
7081    sanitizeFn: null,
7082    whiteList: DefaultWhitelist,
7083    popperConfig: null
7084  };
7085  var DefaultType$3 = {
7086    animation: 'boolean',
7087    template: 'string',
7088    title: '(string|element|function)',
7089    trigger: 'string',
7090    delay: '(number|object)',
7091    html: 'boolean',
7092    selector: '(string|boolean)',
7093    placement: '(string|function)',
7094    offset: '(number|string|function)',
7095    container: '(string|element|boolean)',
7096    fallbackPlacement: '(string|array)',
7097    boundary: '(string|element)',
7098    customClass: '(string|function)',
7099    sanitize: 'boolean',
7100    sanitizeFn: '(null|function)',
7101    whiteList: 'object',
7102    popperConfig: '(null|object)'
7103  };
7104  var Event$1 = {
7105    HIDE: "hide" + EVENT_KEY$4,
7106    HIDDEN: "hidden" + EVENT_KEY$4,
7107    SHOW: "show" + EVENT_KEY$4,
7108    SHOWN: "shown" + EVENT_KEY$4,
7109    INSERTED: "inserted" + EVENT_KEY$4,
7110    CLICK: "click" + EVENT_KEY$4,
7111    FOCUSIN: "focusin" + EVENT_KEY$4,
7112    FOCUSOUT: "focusout" + EVENT_KEY$4,
7113    MOUSEENTER: "mouseenter" + EVENT_KEY$4,
7114    MOUSELEAVE: "mouseleave" + EVENT_KEY$4
7115  };
7116  /**
7117   * Class definition
7118   */
7119
7120  var Tooltip = /*#__PURE__*/function () {
7121    function Tooltip(element, config) {
7122      if (typeof Popper__default["default"] === 'undefined') {
7123        throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)');
7124      } // Private
7125
7126
7127      this._isEnabled = true;
7128      this._timeout = 0;
7129      this._hoverState = '';
7130      this._activeTrigger = {};
7131      this._popper = null; // Protected
7132
7133      this.element = element;
7134      this.config = this._getConfig(config);
7135      this.tip = null;
7136
7137      this._setListeners();
7138    } // Getters
7139
7140
7141    var _proto = Tooltip.prototype;
7142
7143    // Public
7144    _proto.enable = function enable() {
7145      this._isEnabled = true;
7146    };
7147
7148    _proto.disable = function disable() {
7149      this._isEnabled = false;
7150    };
7151
7152    _proto.toggleEnabled = function toggleEnabled() {
7153      this._isEnabled = !this._isEnabled;
7154    };
7155
7156    _proto.toggle = function toggle(event) {
7157      if (!this._isEnabled) {
7158        return;
7159      }
7160
7161      if (event) {
7162        var dataKey = this.constructor.DATA_KEY;
7163        var context = $__default["default"](event.currentTarget).data(dataKey);
7164
7165        if (!context) {
7166          context = new this.constructor(event.currentTarget, this._getDelegateConfig());
7167          $__default["default"](event.currentTarget).data(dataKey, context);
7168        }
7169
7170        context._activeTrigger.click = !context._activeTrigger.click;
7171
7172        if (context._isWithActiveTrigger()) {
7173          context._enter(null, context);
7174        } else {
7175          context._leave(null, context);
7176        }
7177      } else {
7178        if ($__default["default"](this.getTipElement()).hasClass(CLASS_NAME_SHOW$3)) {
7179          this._leave(null, this);
7180
7181          return;
7182        }
7183
7184        this._enter(null, this);
7185      }
7186    };
7187
7188    _proto.dispose = function dispose() {
7189      clearTimeout(this._timeout);
7190      $__default["default"].removeData(this.element, this.constructor.DATA_KEY);
7191      $__default["default"](this.element).off(this.constructor.EVENT_KEY);
7192      $__default["default"](this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler);
7193
7194      if (this.tip) {
7195        $__default["default"](this.tip).remove();
7196      }
7197
7198      this._isEnabled = null;
7199      this._timeout = null;
7200      this._hoverState = null;
7201      this._activeTrigger = null;
7202
7203      if (this._popper) {
7204        this._popper.destroy();
7205      }
7206
7207      this._popper = null;
7208      this.element = null;
7209      this.config = null;
7210      this.tip = null;
7211    };
7212
7213    _proto.show = function show() {
7214      var _this = this;
7215
7216      if ($__default["default"](this.element).css('display') === 'none') {
7217        throw new Error('Please use show on visible elements');
7218      }
7219
7220      var showEvent = $__default["default"].Event(this.constructor.Event.SHOW);
7221
7222      if (this.isWithContent() && this._isEnabled) {
7223        $__default["default"](this.element).trigger(showEvent);
7224        var shadowRoot = Util.findShadowRoot(this.element);
7225        var isInTheDom = $__default["default"].contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element);
7226
7227        if (showEvent.isDefaultPrevented() || !isInTheDom) {
7228          return;
7229        }
7230
7231        var tip = this.getTipElement();
7232        var tipId = Util.getUID(this.constructor.NAME);
7233        tip.setAttribute('id', tipId);
7234        this.element.setAttribute('aria-describedby', tipId);
7235        this.setContent();
7236
7237        if (this.config.animation) {
7238          $__default["default"](tip).addClass(CLASS_NAME_FADE$3);
7239        }
7240
7241        var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;
7242
7243        var attachment = this._getAttachment(placement);
7244
7245        this.addAttachmentClass(attachment);
7246
7247        var container = this._getContainer();
7248
7249        $__default["default"](tip).data(this.constructor.DATA_KEY, this);
7250
7251        if (!$__default["default"].contains(this.element.ownerDocument.documentElement, this.tip)) {
7252          $__default["default"](tip).appendTo(container);
7253        }
7254
7255        $__default["default"](this.element).trigger(this.constructor.Event.INSERTED);
7256        this._popper = new Popper__default["default"](this.element, tip, this._getPopperConfig(attachment));
7257        $__default["default"](tip).addClass(CLASS_NAME_SHOW$3);
7258        $__default["default"](tip).addClass(this.config.customClass); // If this is a touch-enabled device we add extra
7259        // empty mouseover listeners to the body's immediate children;
7260        // only needed because of broken event delegation on iOS
7261        // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
7262
7263        if ('ontouchstart' in document.documentElement) {
7264          $__default["default"](document.body).children().on('mouseover', null, $__default["default"].noop);
7265        }
7266
7267        var complete = function complete() {
7268          if (_this.config.animation) {
7269            _this._fixTransition();
7270          }
7271
7272          var prevHoverState = _this._hoverState;
7273          _this._hoverState = null;
7274          $__default["default"](_this.element).trigger(_this.constructor.Event.SHOWN);
7275
7276          if (prevHoverState === HOVER_STATE_OUT) {
7277            _this._leave(null, _this);
7278          }
7279        };
7280
7281        if ($__default["default"](this.tip).hasClass(CLASS_NAME_FADE$3)) {
7282          var transitionDuration = Util.getTransitionDurationFromElement(this.tip);
7283          $__default["default"](this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
7284        } else {
7285          complete();
7286        }
7287      }
7288    };
7289
7290    _proto.hide = function hide(callback) {
7291      var _this2 = this;
7292
7293      var tip = this.getTipElement();
7294      var hideEvent = $__default["default"].Event(this.constructor.Event.HIDE);
7295
7296      var complete = function complete() {
7297        if (_this2._hoverState !== HOVER_STATE_SHOW && tip.parentNode) {
7298          tip.parentNode.removeChild(tip);
7299        }
7300
7301        _this2._cleanTipClass();
7302
7303        _this2.element.removeAttribute('aria-describedby');
7304
7305        $__default["default"](_this2.element).trigger(_this2.constructor.Event.HIDDEN);
7306
7307        if (_this2._popper !== null) {
7308          _this2._popper.destroy();
7309        }
7310
7311        if (callback) {
7312          callback();
7313        }
7314      };
7315
7316      $__default["default"](this.element).trigger(hideEvent);
7317
7318      if (hideEvent.isDefaultPrevented()) {
7319        return;
7320      }
7321
7322      $__default["default"](tip).removeClass(CLASS_NAME_SHOW$3); // If this is a touch-enabled device we remove the extra
7323      // empty mouseover listeners we added for iOS support
7324
7325      if ('ontouchstart' in document.documentElement) {
7326        $__default["default"](document.body).children().off('mouseover', null, $__default["default"].noop);
7327      }
7328
7329      this._activeTrigger[TRIGGER_CLICK] = false;
7330      this._activeTrigger[TRIGGER_FOCUS] = false;
7331      this._activeTrigger[TRIGGER_HOVER] = false;
7332
7333      if ($__default["default"](this.tip).hasClass(CLASS_NAME_FADE$3)) {
7334        var transitionDuration = Util.getTransitionDurationFromElement(tip);
7335        $__default["default"](tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
7336      } else {
7337        complete();
7338      }
7339
7340      this._hoverState = '';
7341    };
7342
7343    _proto.update = function update() {
7344      if (this._popper !== null) {
7345        this._popper.scheduleUpdate();
7346      }
7347    } // Protected
7348    ;
7349
7350    _proto.isWithContent = function isWithContent() {
7351      return Boolean(this.getTitle());
7352    };
7353
7354    _proto.addAttachmentClass = function addAttachmentClass(attachment) {
7355      $__default["default"](this.getTipElement()).addClass(CLASS_PREFIX$1 + "-" + attachment);
7356    };
7357
7358    _proto.getTipElement = function getTipElement() {
7359      this.tip = this.tip || $__default["default"](this.config.template)[0];
7360      return this.tip;
7361    };
7362
7363    _proto.setContent = function setContent() {
7364      var tip = this.getTipElement();
7365      this.setElementContent($__default["default"](tip.querySelectorAll(SELECTOR_TOOLTIP_INNER)), this.getTitle());
7366      $__default["default"](tip).removeClass(CLASS_NAME_FADE$3 + " " + CLASS_NAME_SHOW$3);
7367    };
7368
7369    _proto.setElementContent = function setElementContent($element, content) {
7370      if (typeof content === 'object' && (content.nodeType || content.jquery)) {
7371        // Content is a DOM node or a jQuery
7372        if (this.config.html) {
7373          if (!$__default["default"](content).parent().is($element)) {
7374            $element.empty().append(content);
7375          }
7376        } else {
7377          $element.text($__default["default"](content).text());
7378        }
7379
7380        return;
7381      }
7382
7383      if (this.config.html) {
7384        if (this.config.sanitize) {
7385          content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn);
7386        }
7387
7388        $element.html(content);
7389      } else {
7390        $element.text(content);
7391      }
7392    };
7393
7394    _proto.getTitle = function getTitle() {
7395      var title = this.element.getAttribute('data-original-title');
7396
7397      if (!title) {
7398        title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;
7399      }
7400
7401      return title;
7402    } // Private
7403    ;
7404
7405    _proto._getPopperConfig = function _getPopperConfig(attachment) {
7406      var _this3 = this;
7407
7408      var defaultBsConfig = {
7409        placement: attachment,
7410        modifiers: {
7411          offset: this._getOffset(),
7412          flip: {
7413            behavior: this.config.fallbackPlacement
7414          },
7415          arrow: {
7416            element: SELECTOR_ARROW
7417          },
7418          preventOverflow: {
7419            boundariesElement: this.config.boundary
7420          }
7421        },
7422        onCreate: function onCreate(data) {
7423          if (data.originalPlacement !== data.placement) {
7424            _this3._handlePopperPlacementChange(data);
7425          }
7426        },
7427        onUpdate: function onUpdate(data) {
7428          return _this3._handlePopperPlacementChange(data);
7429        }
7430      };
7431      return _extends({}, defaultBsConfig, this.config.popperConfig);
7432    };
7433
7434    _proto._getOffset = function _getOffset() {
7435      var _this4 = this;
7436
7437      var offset = {};
7438
7439      if (typeof this.config.offset === 'function') {
7440        offset.fn = function (data) {
7441          data.offsets = _extends({}, data.offsets, _this4.config.offset(data.offsets, _this4.element));
7442          return data;
7443        };
7444      } else {
7445        offset.offset = this.config.offset;
7446      }
7447
7448      return offset;
7449    };
7450
7451    _proto._getContainer = function _getContainer() {
7452      if (this.config.container === false) {
7453        return document.body;
7454      }
7455
7456      if (Util.isElement(this.config.container)) {
7457        return $__default["default"](this.config.container);
7458      }
7459
7460      return $__default["default"](document).find(this.config.container);
7461    };
7462
7463    _proto._getAttachment = function _getAttachment(placement) {
7464      return AttachmentMap[placement.toUpperCase()];
7465    };
7466
7467    _proto._setListeners = function _setListeners() {
7468      var _this5 = this;
7469
7470      var triggers = this.config.trigger.split(' ');
7471      triggers.forEach(function (trigger) {
7472        if (trigger === 'click') {
7473          $__default["default"](_this5.element).on(_this5.constructor.Event.CLICK, _this5.config.selector, function (event) {
7474            return _this5.toggle(event);
7475          });
7476        } else if (trigger !== TRIGGER_MANUAL) {
7477          var eventIn = trigger === TRIGGER_HOVER ? _this5.constructor.Event.MOUSEENTER : _this5.constructor.Event.FOCUSIN;
7478          var eventOut = trigger === TRIGGER_HOVER ? _this5.constructor.Event.MOUSELEAVE : _this5.constructor.Event.FOCUSOUT;
7479          $__default["default"](_this5.element).on(eventIn, _this5.config.selector, function (event) {
7480            return _this5._enter(event);
7481          }).on(eventOut, _this5.config.selector, function (event) {
7482            return _this5._leave(event);
7483          });
7484        }
7485      });
7486
7487      this._hideModalHandler = function () {
7488        if (_this5.element) {
7489          _this5.hide();
7490        }
7491      };
7492
7493      $__default["default"](this.element).closest('.modal').on('hide.bs.modal', this._hideModalHandler);
7494
7495      if (this.config.selector) {
7496        this.config = _extends({}, this.config, {
7497          trigger: 'manual',
7498          selector: ''
7499        });
7500      } else {
7501        this._fixTitle();
7502      }
7503    };
7504
7505    _proto._fixTitle = function _fixTitle() {
7506      var titleType = typeof this.element.getAttribute('data-original-title');
7507
7508      if (this.element.getAttribute('title') || titleType !== 'string') {
7509        this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');
7510        this.element.setAttribute('title', '');
7511      }
7512    };
7513
7514    _proto._enter = function _enter(event, context) {
7515      var dataKey = this.constructor.DATA_KEY;
7516      context = context || $__default["default"](event.currentTarget).data(dataKey);
7517
7518      if (!context) {
7519        context = new this.constructor(event.currentTarget, this._getDelegateConfig());
7520        $__default["default"](event.currentTarget).data(dataKey, context);
7521      }
7522
7523      if (event) {
7524        context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;
7525      }
7526
7527      if ($__default["default"](context.getTipElement()).hasClass(CLASS_NAME_SHOW$3) || context._hoverState === HOVER_STATE_SHOW) {
7528        context._hoverState = HOVER_STATE_SHOW;
7529        return;
7530      }
7531
7532      clearTimeout(context._timeout);
7533      context._hoverState = HOVER_STATE_SHOW;
7534
7535      if (!context.config.delay || !context.config.delay.show) {
7536        context.show();
7537        return;
7538      }
7539
7540      context._timeout = setTimeout(function () {
7541        if (context._hoverState === HOVER_STATE_SHOW) {
7542          context.show();
7543        }
7544      }, context.config.delay.show);
7545    };
7546
7547    _proto._leave = function _leave(event, context) {
7548      var dataKey = this.constructor.DATA_KEY;
7549      context = context || $__default["default"](event.currentTarget).data(dataKey);
7550
7551      if (!context) {
7552        context = new this.constructor(event.currentTarget, this._getDelegateConfig());
7553        $__default["default"](event.currentTarget).data(dataKey, context);
7554      }
7555
7556      if (event) {
7557        context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = false;
7558      }
7559
7560      if (context._isWithActiveTrigger()) {
7561        return;
7562      }
7563
7564      clearTimeout(context._timeout);
7565      context._hoverState = HOVER_STATE_OUT;
7566
7567      if (!context.config.delay || !context.config.delay.hide) {
7568        context.hide();
7569        return;
7570      }
7571
7572      context._timeout = setTimeout(function () {
7573        if (context._hoverState === HOVER_STATE_OUT) {
7574          context.hide();
7575        }
7576      }, context.config.delay.hide);
7577    };
7578
7579    _proto._isWithActiveTrigger = function _isWithActiveTrigger() {
7580      for (var trigger in this._activeTrigger) {
7581        if (this._activeTrigger[trigger]) {
7582          return true;
7583        }
7584      }
7585
7586      return false;
7587    };
7588
7589    _proto._getConfig = function _getConfig(config) {
7590      var dataAttributes = $__default["default"](this.element).data();
7591      Object.keys(dataAttributes).forEach(function (dataAttr) {
7592        if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {
7593          delete dataAttributes[dataAttr];
7594        }
7595      });
7596      config = _extends({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {});
7597
7598      if (typeof config.delay === 'number') {
7599        config.delay = {
7600          show: config.delay,
7601          hide: config.delay
7602        };
7603      }
7604
7605      if (typeof config.title === 'number') {
7606        config.title = config.title.toString();
7607      }
7608
7609      if (typeof config.content === 'number') {
7610        config.content = config.content.toString();
7611      }
7612
7613      Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType);
7614
7615      if (config.sanitize) {
7616        config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn);
7617      }
7618
7619      return config;
7620    };
7621
7622    _proto._getDelegateConfig = function _getDelegateConfig() {
7623      var config = {};
7624
7625      if (this.config) {
7626        for (var key in this.config) {
7627          if (this.constructor.Default[key] !== this.config[key]) {
7628            config[key] = this.config[key];
7629          }
7630        }
7631      }
7632
7633      return config;
7634    };
7635
7636    _proto._cleanTipClass = function _cleanTipClass() {
7637      var $tip = $__default["default"](this.getTipElement());
7638      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX$1);
7639
7640      if (tabClass !== null && tabClass.length) {
7641        $tip.removeClass(tabClass.join(''));
7642      }
7643    };
7644
7645    _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {
7646      this.tip = popperData.instance.popper;
7647
7648      this._cleanTipClass();
7649
7650      this.addAttachmentClass(this._getAttachment(popperData.placement));
7651    };
7652
7653    _proto._fixTransition = function _fixTransition() {
7654      var tip = this.getTipElement();
7655      var initConfigAnimation = this.config.animation;
7656
7657      if (tip.getAttribute('x-placement') !== null) {
7658        return;
7659      }
7660
7661      $__default["default"](tip).removeClass(CLASS_NAME_FADE$3);
7662      this.config.animation = false;
7663      this.hide();
7664      this.show();
7665      this.config.animation = initConfigAnimation;
7666    } // Static
7667    ;
7668
7669    Tooltip._jQueryInterface = function _jQueryInterface(config) {
7670      return this.each(function () {
7671        var $element = $__default["default"](this);
7672        var data = $element.data(DATA_KEY$4);
7673
7674        var _config = typeof config === 'object' && config;
7675
7676        if (!data && /dispose|hide/.test(config)) {
7677          return;
7678        }
7679
7680        if (!data) {
7681          data = new Tooltip(this, _config);
7682          $element.data(DATA_KEY$4, data);
7683        }
7684
7685        if (typeof config === 'string') {
7686          if (typeof data[config] === 'undefined') {
7687            throw new TypeError("No method named \"" + config + "\"");
7688          }
7689
7690          data[config]();
7691        }
7692      });
7693    };
7694
7695    _createClass(Tooltip, null, [{
7696      key: "VERSION",
7697      get: function get() {
7698        return VERSION$4;
7699      }
7700    }, {
7701      key: "Default",
7702      get: function get() {
7703        return Default$3;
7704      }
7705    }, {
7706      key: "NAME",
7707      get: function get() {
7708        return NAME$4;
7709      }
7710    }, {
7711      key: "DATA_KEY",
7712      get: function get() {
7713        return DATA_KEY$4;
7714      }
7715    }, {
7716      key: "Event",
7717      get: function get() {
7718        return Event$1;
7719      }
7720    }, {
7721      key: "EVENT_KEY",
7722      get: function get() {
7723        return EVENT_KEY$4;
7724      }
7725    }, {
7726      key: "DefaultType",
7727      get: function get() {
7728        return DefaultType$3;
7729      }
7730    }]);
7731
7732    return Tooltip;
7733  }();
7734  /**
7735   * jQuery
7736   */
7737
7738
7739  $__default["default"].fn[NAME$4] = Tooltip._jQueryInterface;
7740  $__default["default"].fn[NAME$4].Constructor = Tooltip;
7741
7742  $__default["default"].fn[NAME$4].noConflict = function () {
7743    $__default["default"].fn[NAME$4] = JQUERY_NO_CONFLICT$4;
7744    return Tooltip._jQueryInterface;
7745  };
7746
7747  /**
7748   * Constants
7749   */
7750
7751  var NAME$3 = 'popover';
7752  var VERSION$3 = '4.6.2';
7753  var DATA_KEY$3 = 'bs.popover';
7754  var EVENT_KEY$3 = "." + DATA_KEY$3;
7755  var JQUERY_NO_CONFLICT$3 = $__default["default"].fn[NAME$3];
7756  var CLASS_PREFIX = 'bs-popover';
7757  var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g');
7758  var CLASS_NAME_FADE$2 = 'fade';
7759  var CLASS_NAME_SHOW$2 = 'show';
7760  var SELECTOR_TITLE = '.popover-header';
7761  var SELECTOR_CONTENT = '.popover-body';
7762
7763  var Default$2 = _extends({}, Tooltip.Default, {
7764    placement: 'right',
7765    trigger: 'click',
7766    content: '',
7767    template: '<div class="popover" role="tooltip">' + '<div class="arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div></div>'
7768  });
7769
7770  var DefaultType$2 = _extends({}, Tooltip.DefaultType, {
7771    content: '(string|element|function)'
7772  });
7773
7774  var Event = {
7775    HIDE: "hide" + EVENT_KEY$3,
7776    HIDDEN: "hidden" + EVENT_KEY$3,
7777    SHOW: "show" + EVENT_KEY$3,
7778    SHOWN: "shown" + EVENT_KEY$3,
7779    INSERTED: "inserted" + EVENT_KEY$3,
7780    CLICK: "click" + EVENT_KEY$3,
7781    FOCUSIN: "focusin" + EVENT_KEY$3,
7782    FOCUSOUT: "focusout" + EVENT_KEY$3,
7783    MOUSEENTER: "mouseenter" + EVENT_KEY$3,
7784    MOUSELEAVE: "mouseleave" + EVENT_KEY$3
7785  };
7786  /**
7787   * Class definition
7788   */
7789
7790  var Popover = /*#__PURE__*/function (_Tooltip) {
7791    _inheritsLoose(Popover, _Tooltip);
7792
7793    function Popover() {
7794      return _Tooltip.apply(this, arguments) || this;
7795    }
7796
7797    var _proto = Popover.prototype;
7798
7799    // Overrides
7800    _proto.isWithContent = function isWithContent() {
7801      return this.getTitle() || this._getContent();
7802    };
7803
7804    _proto.addAttachmentClass = function addAttachmentClass(attachment) {
7805      $__default["default"](this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment);
7806    };
7807
7808    _proto.getTipElement = function getTipElement() {
7809      this.tip = this.tip || $__default["default"](this.config.template)[0];
7810      return this.tip;
7811    };
7812
7813    _proto.setContent = function setContent() {
7814      var $tip = $__default["default"](this.getTipElement()); // We use append for html objects to maintain js events
7815
7816      this.setElementContent($tip.find(SELECTOR_TITLE), this.getTitle());
7817
7818      var content = this._getContent();
7819
7820      if (typeof content === 'function') {
7821        content = content.call(this.element);
7822      }
7823
7824      this.setElementContent($tip.find(SELECTOR_CONTENT), content);
7825      $tip.removeClass(CLASS_NAME_FADE$2 + " " + CLASS_NAME_SHOW$2);
7826    } // Private
7827    ;
7828
7829    _proto._getContent = function _getContent() {
7830      return this.element.getAttribute('data-content') || this.config.content;
7831    };
7832
7833    _proto._cleanTipClass = function _cleanTipClass() {
7834      var $tip = $__default["default"](this.getTipElement());
7835      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);
7836
7837      if (tabClass !== null && tabClass.length > 0) {
7838        $tip.removeClass(tabClass.join(''));
7839      }
7840    } // Static
7841    ;
7842
7843    Popover._jQueryInterface = function _jQueryInterface(config) {
7844      return this.each(function () {
7845        var data = $__default["default"](this).data(DATA_KEY$3);
7846
7847        var _config = typeof config === 'object' ? config : null;
7848
7849        if (!data && /dispose|hide/.test(config)) {
7850          return;
7851        }
7852
7853        if (!data) {
7854          data = new Popover(this, _config);
7855          $__default["default"](this).data(DATA_KEY$3, data);
7856        }
7857
7858        if (typeof config === 'string') {
7859          if (typeof data[config] === 'undefined') {
7860            throw new TypeError("No method named \"" + config + "\"");
7861          }
7862
7863          data[config]();
7864        }
7865      });
7866    };
7867
7868    _createClass(Popover, null, [{
7869      key: "VERSION",
7870      get: // Getters
7871      function get() {
7872        return VERSION$3;
7873      }
7874    }, {
7875      key: "Default",
7876      get: function get() {
7877        return Default$2;
7878      }
7879    }, {
7880      key: "NAME",
7881      get: function get() {
7882        return NAME$3;
7883      }
7884    }, {
7885      key: "DATA_KEY",
7886      get: function get() {
7887        return DATA_KEY$3;
7888      }
7889    }, {
7890      key: "Event",
7891      get: function get() {
7892        return Event;
7893      }
7894    }, {
7895      key: "EVENT_KEY",
7896      get: function get() {
7897        return EVENT_KEY$3;
7898      }
7899    }, {
7900      key: "DefaultType",
7901      get: function get() {
7902        return DefaultType$2;
7903      }
7904    }]);
7905
7906    return Popover;
7907  }(Tooltip);
7908  /**
7909   * jQuery
7910   */
7911
7912
7913  $__default["default"].fn[NAME$3] = Popover._jQueryInterface;
7914  $__default["default"].fn[NAME$3].Constructor = Popover;
7915
7916  $__default["default"].fn[NAME$3].noConflict = function () {
7917    $__default["default"].fn[NAME$3] = JQUERY_NO_CONFLICT$3;
7918    return Popover._jQueryInterface;
7919  };
7920
7921  /**
7922   * Constants
7923   */
7924
7925  var NAME$2 = 'scrollspy';
7926  var VERSION$2 = '4.6.2';
7927  var DATA_KEY$2 = 'bs.scrollspy';
7928  var EVENT_KEY$2 = "." + DATA_KEY$2;
7929  var DATA_API_KEY$1 = '.data-api';
7930  var JQUERY_NO_CONFLICT$2 = $__default["default"].fn[NAME$2];
7931  var CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';
7932  var CLASS_NAME_ACTIVE$1 = 'active';
7933  var EVENT_ACTIVATE = "activate" + EVENT_KEY$2;
7934  var EVENT_SCROLL = "scroll" + EVENT_KEY$2;
7935  var EVENT_LOAD_DATA_API = "load" + EVENT_KEY$2 + DATA_API_KEY$1;
7936  var METHOD_OFFSET = 'offset';
7937  var METHOD_POSITION = 'position';
7938  var SELECTOR_DATA_SPY = '[data-spy="scroll"]';
7939  var SELECTOR_NAV_LIST_GROUP$1 = '.nav, .list-group';
7940  var SELECTOR_NAV_LINKS = '.nav-link';
7941  var SELECTOR_NAV_ITEMS = '.nav-item';
7942  var SELECTOR_LIST_ITEMS = '.list-group-item';
7943  var SELECTOR_DROPDOWN$1 = '.dropdown';
7944  var SELECTOR_DROPDOWN_ITEMS = '.dropdown-item';
7945  var SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';
7946  var Default$1 = {
7947    offset: 10,
7948    method: 'auto',
7949    target: ''
7950  };
7951  var DefaultType$1 = {
7952    offset: 'number',
7953    method: 'string',
7954    target: '(string|element)'
7955  };
7956  /**
7957   * Class definition
7958   */
7959
7960  var ScrollSpy = /*#__PURE__*/function () {
7961    function ScrollSpy(element, config) {
7962      var _this = this;
7963
7964      this._element = element;
7965      this._scrollElement = element.tagName === 'BODY' ? window : element;
7966      this._config = this._getConfig(config);
7967      this._selector = this._config.target + " " + SELECTOR_NAV_LINKS + "," + (this._config.target + " " + SELECTOR_LIST_ITEMS + ",") + (this._config.target + " " + SELECTOR_DROPDOWN_ITEMS);
7968      this._offsets = [];
7969      this._targets = [];
7970      this._activeTarget = null;
7971      this._scrollHeight = 0;
7972      $__default["default"](this._scrollElement).on(EVENT_SCROLL, function (event) {
7973        return _this._process(event);
7974      });
7975      this.refresh();
7976
7977      this._process();
7978    } // Getters
7979
7980
7981    var _proto = ScrollSpy.prototype;
7982
7983    // Public
7984    _proto.refresh = function refresh() {
7985      var _this2 = this;
7986
7987      var autoMethod = this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION;
7988      var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;
7989      var offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0;
7990      this._offsets = [];
7991      this._targets = [];
7992      this._scrollHeight = this._getScrollHeight();
7993      var targets = [].slice.call(document.querySelectorAll(this._selector));
7994      targets.map(function (element) {
7995        var target;
7996        var targetSelector = Util.getSelectorFromElement(element);
7997
7998        if (targetSelector) {
7999          target = document.querySelector(targetSelector);
8000        }
8001
8002        if (target) {
8003          var targetBCR = target.getBoundingClientRect();
8004
8005          if (targetBCR.width || targetBCR.height) {
8006            // TODO (fat): remove sketch reliance on jQuery position/offset
8007            return [$__default["default"](target)[offsetMethod]().top + offsetBase, targetSelector];
8008          }
8009        }
8010
8011        return null;
8012      }
8012).filter(Boolean).sort(function (a, b) {
8013        return a[0] - b[0];
8014      }).forEach(function (item) {
8015        _this2._offsets.push(item[0]);
8016
8017        _this2._targets.push(item[1]);
8018      });
8019    };
8020
8021    _proto.dispose = function dispose() {
8022      $__default["default"].removeData(this._element, DATA_KEY$2);
8023      $__default["default"](this._scrollElement).off(EVENT_KEY$2);
8024      this._element = null;
8025      this._scrollElement = null;
8026      this._config = null;
8027      this._selector = null;
8028      this._offsets = null;
8029      this._targets = null;
8030      this._activeTarget = null;
8031      this._scrollHeight = null;
8032    } // Private
8033    ;
8034
8035    _proto._getConfig = function _getConfig(config) {
8036      config = _extends({}, Default$1, typeof config === 'object' && config ? config : {});
8037
8038      if (typeof config.target !== 'string' && Util.isElement(config.target)) {
8039        var id = $__default["default"](config.target).attr('id');
8040
8041        if (!id) {
8042          id = Util.getUID(NAME$2);
8043          $__default["default"](config.target).attr('id', id);
8044        }
8045
8046        config.target = "#" + id;
8047      }
8048
8049      Util.typeCheckConfig(NAME$2, config, DefaultType$1);
8050      return config;
8051    };
8052
8053    _proto._getScrollTop = function _getScrollTop() {
8054      return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;
8055    };
8056
8057    _proto._getScrollHeight = function _getScrollHeight() {
8058      return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
8059    };
8060
8061    _proto._getOffsetHeight = function _getOffsetHeight() {
8062      return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;
8063    };
8064
8065    _proto._process = function _process() {
8066      var scrollTop = this._getScrollTop() + this._config.offset;
8067
8068      var scrollHeight = this._getScrollHeight();
8069
8070      var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();
8071
8072      if (this._scrollHeight !== scrollHeight) {
8073        this.refresh();
8074      }
8075
8076      if (scrollTop >= maxScroll) {
8077        var target = this._targets[this._targets.length - 1];
8078
8079        if (this._activeTarget !== target) {
8080          this._activate(target);
8081        }
8082
8083        return;
8084      }
8085
8086      if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
8087        this._activeTarget = null;
8088
8089        this._clear();
8090
8091        return;
8092      }
8093
8094      for (var i = this._offsets.length; i--;) {
8095        var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);
8096
8097        if (isActiveTarget) {
8098          this._activate(this._targets[i]);
8099        }
8100      }
8101    };
8102
8103    _proto._activate = function _activate(target) {
8104      this._activeTarget = target;
8105
8106      this._clear();
8107
8108      var queries = this._selector.split(',').map(function (selector) {
8109        return selector + "[data-target=\"" + target + "\"]," + selector + "[href=\"" + target + "\"]";
8110      });
8111
8112      var $link = $__default["default"]([].slice.call(document.querySelectorAll(queries.join(','))));
8113
8114      if ($link.hasClass(CLASS_NAME_DROPDOWN_ITEM)) {
8115        $link.closest(SELECTOR_DROPDOWN$1).find(SELECTOR_DROPDOWN_TOGGLE$1).addClass(CLASS_NAME_ACTIVE$1);
8116        $link.addClass(CLASS_NAME_ACTIVE$1);
8117      } else {
8118        // Set triggered link as active
8119        $link.addClass(CLASS_NAME_ACTIVE$1); // Set triggered links parents as active
8120        // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
8121
8122        $link.parents(SELECTOR_NAV_LIST_GROUP$1).prev(SELECTOR_NAV_LINKS + ", " + SELECTOR_LIST_ITEMS).addClass(CLASS_NAME_ACTIVE$1); // Handle special case when .nav-link is inside .nav-item
8123
8124        $link.parents(SELECTOR_NAV_LIST_GROUP$1).prev(SELECTOR_NAV_ITEMS).children(SELECTOR_NAV_LINKS).addClass(CLASS_NAME_ACTIVE$1);
8125      }
8126
8127      $__default["default"](this._scrollElement).trigger(EVENT_ACTIVATE, {
8128        relatedTarget: target
8129      });
8130    };
8131
8132    _proto._clear = function _clear() {
8133      [].slice.call(document.querySelectorAll(this._selector)).filter(function (node) {
8134        return node.classList.contains(CLASS_NAME_ACTIVE$1);
8135      }
8135).forEach(function (node) {
8136        return node.classList.remove(CLASS_NAME_ACTIVE$1);
8137      });
8138    } // Static
8139    ;
8140
8141    ScrollSpy._jQueryInterface = function _jQueryInterface(config) {
8142      return this.each(function () {
8143        var data = $__default["default"](this).data(DATA_KEY$2);
8144
8145        var _config = typeof config === 'object' && config;
8146
8147        if (!data) {
8148          data = new ScrollSpy(this, _config);
8149          $__default["default"](this).data(DATA_KEY$2, data);
8150        }
8151
8152        if (typeof config === 'string') {
8153          if (typeof data[config] === 'undefined') {
8154            throw new TypeError("No method named \"" + config + "\"");
8155          }
8156
8157          data[config]();
8158        }
8159      });
8160    };
8161
8162    _createClass(ScrollSpy, null, [{
8163      key: "VERSION",
8164      get: function get() {
8165        return VERSION$2;
8166      }
8167    }, {
8168      key: "Default",
8169      get: function get() {
8170        return Default$1;
8171      }
8172    }]);
8173
8174    return ScrollSpy;
8175  }();
8176  /**
8177   * Data API implementation
8178   */
8179
8180
8181  $__default["default"](window).on(EVENT_LOAD_DATA_API, function () {
8182    var scrollSpys = [].slice.call(document.querySelectorAll(SELECTOR_DATA_SPY));
8183    var scrollSpysLength = scrollSpys.length;
8184
8185    for (var i = scrollSpysLength; i--;) {
8186      var $spy = $__default["default"](scrollSpys[i]);
8187
8188      ScrollSpy._jQueryInterface.call($spy, $spy.data());
8189    }
8190  });
8191  /**
8192   * jQuery
8193   */
8194
8195  $__default["default"].fn[NAME$2] = ScrollSpy._jQueryInterface;
8196  $__default["default"].fn[NAME$2].Constructor = ScrollSpy;
8197
8198  $__default["default"].fn[NAME$2].noConflict = function () {
8199    $__default["default"].fn[NAME$2] = JQUERY_NO_CONFLICT$2;
8200    return ScrollSpy._jQueryInterface;
8201  };
8202
8203  /**
8204   * Constants
8205   */
8206
8207  var NAME$1 = 'tab';
8208  var VERSION$1 = '4.6.2';
8209  var DATA_KEY$1 = 'bs.tab';
8210  var EVENT_KEY$1 = "." + DATA_KEY$1;
8211  var DATA_API_KEY = '.data-api';
8212  var JQUERY_NO_CONFLICT$1 = $__default["default"].fn[NAME$1];
8213  var CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu';
8214  var CLASS_NAME_ACTIVE = 'active';
8215  var CLASS_NAME_DISABLED = 'disabled';
8216  var CLASS_NAME_FADE$1 = 'fade';
8217  var CLASS_NAME_SHOW$1 = 'show';
8218  var EVENT_HIDE$1 = "hide" + EVENT_KEY$1;
8219  var EVENT_HIDDEN$1 = "hidden" + EVENT_KEY$1;
8220  var EVENT_SHOW$1 = "show" + EVENT_KEY$1;
8221  var EVENT_SHOWN$1 = "shown" + EVENT_KEY$1;
8222  var EVENT_CLICK_DATA_API = "click" + EVENT_KEY$1 + DATA_API_KEY;
8223  var SELECTOR_DROPDOWN = '.dropdown';
8224  var SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';
8225  var SELECTOR_ACTIVE = '.active';
8226  var SELECTOR_ACTIVE_UL = '> li > .active';
8227  var SELECTOR_DATA_TOGGLE = '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]';
8228  var SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
8229  var SELECTOR_DROPDOWN_ACTIVE_CHILD = '> .dropdown-menu .active';
8230  /**
8231   * Class definition
8232   */
8233
8234  var Tab = /*#__PURE__*/function () {
8235    function Tab(element) {
8236      this._element = element;
8237    } // Getters
8238
8239
8240    var _proto = Tab.prototype;
8241
8242    // Public
8243    _proto.show = function show() {
8244      var _this = this;
8245
8246      if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $__default["default"](this._element).hasClass(CLASS_NAME_ACTIVE) || $__default["default"](this._element).hasClass(CLASS_NAME_DISABLED) || this._element.hasAttribute('disabled')) {
8247        return;
8248      }
8249
8250      var target;
8251      var previous;
8252      var listElement = $__default["default"](this._element).closest(SELECTOR_NAV_LIST_GROUP)[0];
8253      var selector = Util.getSelectorFromElement(this._element);
8254
8255      if (listElement) {
8256        var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE;
8257        previous = $__default["default"].makeArray($__default["default"](listElement).find(itemSelector));
8258        previous = previous[previous.length - 1];
8259      }
8260
8261      var hideEvent = $__default["default"].Event(EVENT_HIDE$1, {
8262        relatedTarget: this._element
8263      });
8264      var showEvent = $__default["default"].Event(EVENT_SHOW$1, {
8265        relatedTarget: previous
8266      });
8267
8268      if (previous) {
8269        $__default["default"](previous).trigger(hideEvent);
8270      }
8271
8272      $__default["default"](this._element).trigger(showEvent);
8273
8274      if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {
8275        return;
8276      }
8277
8278      if (selector) {
8279        target = document.querySelector(selector);
8280      }
8281
8282      this._activate(this._element, listElement);
8283
8284      var complete = function complete() {
8285        var hiddenEvent = $__default["default"].Event(EVENT_HIDDEN$1, {
8286          relatedTarget: _this._element
8287        });
8288        var shownEvent = $__default["default"].Event(EVENT_SHOWN$1, {
8289          relatedTarget: previous
8290        });
8291        $__default["default"](previous).trigger(hiddenEvent);
8292        $__default["default"](_this._element).trigger(shownEvent);
8293      };
8294
8295      if (target) {
8296        this._activate(target, target.parentNode, complete);
8297      } else {
8298        complete();
8299      }
8300    };
8301
8302    _proto.dispose = function dispose() {
8303      $__default["default"].removeData(this._element, DATA_KEY$1);
8304      this._element = null;
8305    } // Private
8306    ;
8307
8308    _proto._activate = function _activate(element, container, callback) {
8309      var _this2 = this;
8310
8311      var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? $__default["default"](container).find(SELECTOR_ACTIVE_UL) : $__default["default"](container).children(SELECTOR_ACTIVE);
8312      var active = activeElements[0];
8313      var isTransitioning = callback && active && $__default["default"](active).hasClass(CLASS_NAME_FADE$1);
8314
8315      var complete = function complete() {
8316        return _this2._transitionComplete(element, active, callback);
8317      };
8318
8319      if (active && isTransitioning) {
8320        var transitionDuration = Util.getTransitionDurationFromElement(active);
8321        $__default["default"](active).removeClass(CLASS_NAME_SHOW$1).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
8322      } else {
8323        complete();
8324      }
8325    };
8326
8327    _proto._transitionComplete = function _transitionComplete(element, active, callback) {
8328      if (active) {
8329        $__default["default"](active).removeClass(CLASS_NAME_ACTIVE);
8330        var dropdownChild = $__default["default"](active.parentNode).find(SELECTOR_DROPDOWN_ACTIVE_CHILD)[0];
8331
8332        if (dropdownChild) {
8333          $__default["default"](dropdownChild).removeClass(CLASS_NAME_ACTIVE);
8334        }
8335
8336        if (active.getAttribute('role') === 'tab') {
8337          active.setAttribute('aria-selected', false);
8338        }
8339      }
8340
8341      $__default["default"](element).addClass(CLASS_NAME_ACTIVE);
8342
8343      if (element.getAttribute('role') === 'tab') {
8344        element.setAttribute('aria-selected', true);
8345      }
8346
8347      Util.reflow(element);
8348
8349      if (element.classList.contains(CLASS_NAME_FADE$1)) {
8350        element.classList.add(CLASS_NAME_SHOW$1);
8351      }
8352
8353      var parent = element.parentNode;
8354
8355      if (parent && parent.nodeName === 'LI') {
8356        parent = parent.parentNode;
8357      }
8358
8359      if (parent && $__default["default"](parent).hasClass(CLASS_NAME_DROPDOWN_MENU)) {
8360        var dropdownElement = $__default["default"](element).closest(SELECTOR_DROPDOWN)[0];
8361
8362        if (dropdownElement) {
8363          var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(SELECTOR_DROPDOWN_TOGGLE));
8364          $__default["default"](dropdownToggleList).addClass(CLASS_NAME_ACTIVE);
8365        }
8366
8367        element.setAttribute('aria-expanded', true);
8368      }
8369
8370      if (callback) {
8371        callback();
8372      }
8373    } // Static
8374    ;
8375
8376    Tab._jQueryInterface = function _jQueryInterface(config) {
8377      return this.each(function () {
8378        var $this = $__default["default"](this);
8379        var data = $this.data(DATA_KEY$1);
8380
8381        if (!data) {
8382          data = new Tab(this);
8383          $this.data(DATA_KEY$1, data);
8384        }
8385
8386        if (typeof config === 'string') {
8387          if (typeof data[config] === 'undefined') {
8388            throw new TypeError("No method named \"" + config + "\"");
8389          }
8390
8391          data[config]();
8392        }
8393      });
8394    };
8395
8396    _createClass(Tab, null, [{
8397      key: "VERSION",
8398      get: function get() {
8399        return VERSION$1;
8400      }
8401    }]);
8402
8403    return Tab;
8404  }();
8405  /**
8406   * Data API implementation
8407   */
8408
8409
8410  $__default["default"](document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
8411    event.preventDefault();
8412
8413    Tab._jQueryInterface.call($__default["default"](this), 'show');
8414  });
8415  /**
8416   * jQuery
8417   */
8418
8419  $__default["default"].fn[NAME$1] = Tab._jQueryInterface;
8420  $__default["default"].fn[NAME$1].Constructor = Tab;
8421
8422  $__default["default"].fn[NAME$1].noConflict = function () {
8423    $__default["default"].fn[NAME$1] = JQUERY_NO_CONFLICT$1;
8424    return Tab._jQueryInterface;
8425  };
8426
8427  /**
8428   * Constants
8429   */
8430
8431  var NAME = 'toast';
8432  var VERSION = '4.6.2';
8433  var DATA_KEY = 'bs.toast';
8434  var EVENT_KEY = "." + DATA_KEY;
8435  var JQUERY_NO_CONFLICT = $__default["default"].fn[NAME];
8436  var CLASS_NAME_FADE = 'fade';
8437  var CLASS_NAME_HIDE = 'hide';
8438  var CLASS_NAME_SHOW = 'show';
8439  var CLASS_NAME_SHOWING = 'showing';
8440  var EVENT_CLICK_DISMISS = "click.dismiss" + EVENT_KEY;
8441  var EVENT_HIDE = "hide" + EVENT_KEY;
8442  var EVENT_HIDDEN = "hidden" + EVENT_KEY;
8443  var EVENT_SHOW = "show" + EVENT_KEY;
8444  var EVENT_SHOWN = "shown" + EVENT_KEY;
8445  var SELECTOR_DATA_DISMISS = '[data-dismiss="toast"]';
8446  var Default = {
8447    animation: true,
8448    autohide: true,
8449    delay: 500
8450  };
8451  var DefaultType = {
8452    animation: 'boolean',
8453    autohide: 'boolean',
8454    delay: 'number'
8455  };
8456  /**
8457   * Class definition
8458   */
8459
8460  var Toast = /*#__PURE__*/function () {
8461    function Toast(element, config) {
8462      this._element = element;
8463      this._config = this._getConfig(config);
8464      this._timeout = null;
8465
8466      this._setListeners();
8467    } // Getters
8468
8469
8470    var _proto = Toast.prototype;
8471
8472    // Public
8473    _proto.show = function show() {
8474      var _this = this;
8475
8476      var showEvent = $__default["default"].Event(EVENT_SHOW);
8477      $__default["default"](this._element).trigger(showEvent);
8478
8479      if (showEvent.isDefaultPrevented()) {
8480        return;
8481      }
8482
8483      this._clearTimeout();
8484
8485      if (this._config.animation) {
8486        this._element.classList.add(CLASS_NAME_FADE);
8487      }
8488
8489      var complete = function complete() {
8490        _this._element.classList.remove(CLASS_NAME_SHOWING);
8491
8492        _this._element.classList.add(CLASS_NAME_SHOW);
8493
8494        $__default["default"](_this._element).trigger(EVENT_SHOWN);
8495
8496        if (_this._config.autohide) {
8497          _this._timeout = setTimeout(function () {
8498            _this.hide();
8499          }, _this._config.delay);
8500        }
8501      };
8502
8503      this._element.classList.remove(CLASS_NAME_HIDE);
8504
8505      Util.reflow(this._element);
8506
8507      this._element.classList.add(CLASS_NAME_SHOWING);
8508
8509      if (this._config.animation) {
8510        var transitionDuration = Util.getTransitionDurationFromElement(this._element);
8511        $__default["default"](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
8512      } else {
8513        complete();
8514      }
8515    };
8516
8517    _proto.hide = function hide() {
8518      if (!this._element.classList.contains(CLASS_NAME_SHOW)) {
8519        return;
8520      }
8521
8522      var hideEvent = $__default["default"].Event(EVENT_HIDE);
8523      $__default["default"](this._element).trigger(hideEvent);
8524
8525      if (hideEvent.isDefaultPrevented()) {
8526        return;
8527      }
8528
8529      this._close();
8530    };
8531
8532    _proto.dispose = function dispose() {
8533      this._clearTimeout();
8534
8535      if (this._element.classList.contains(CLASS_NAME_SHOW)) {
8536        this._element.classList.remove(CLASS_NAME_SHOW);
8537      }
8538
8539      $__default["default"](this._element).off(EVENT_CLICK_DISMISS);
8540      $__default["default"].removeData(this._element, DATA_KEY);
8541      this._element = null;
8542      this._config = null;
8543    } // Private
8544    ;
8545
8546    _proto._getConfig = function _getConfig(config) {
8547      config = _extends({}, Default, $__default["default"](this._element).data(), typeof config === 'object' && config ? config : {});
8548      Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
8549      return config;
8550    };
8551
8552    _proto._setListeners = function _setListeners() {
8553      var _this2 = this;
8554
8555      $__default["default"](this._element).on(EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, function () {
8556        return _this2.hide();
8557      });
8558    };
8559
8560    _proto._close = function _close() {
8561      var _this3 = this;
8562
8563      var complete = function complete() {
8564        _this3._element.classList.add(CLASS_NAME_HIDE);
8565
8566        $__default["default"](_this3._element).trigger(EVENT_HIDDEN);
8567      };
8568
8569      this._element.classList.remove(CLASS_NAME_SHOW);
8570
8571      if (this._config.animation) {
8572        var transitionDuration = Util.getTransitionDurationFromElement(this._element);
8573        $__default["default"](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
8574      } else {
8575        complete();
8576      }
8577    };
8578
8579    _proto._clearTimeout = function _clearTimeout() {
8580      clearTimeout(this._timeout);
8581      this._timeout = null;
8582    } // Static
8583    ;
8584
8585    Toast._jQueryInterface = function _jQueryInterface(config) {
8586      return this.each(function () {
8587        var $element = $__default["default"](this);
8588        var data = $element.data(DATA_KEY);
8589
8590        var _config = typeof config === 'object' && config;
8591
8592        if (!data) {
8593          data = new Toast(this, _config);
8594          $element.data(DATA_KEY, data);
8595        }
8596
8597        if (typeof config === 'string') {
8598          if (typeof data[config] === 'undefined') {
8599            throw new TypeError("No method named \"" + config + "\"");
8600          }
8601
8602          data[config](this);
8603        }
8604      });
8605    };
8606
8607    _createClass(Toast, null, [{
8608      key: "VERSION",
8609      get: function get() {
8610        return VERSION;
8611      }
8612    }, {
8613      key: "DefaultType",
8614      get: function get() {
8615        return DefaultType;
8616      }
8617    }, {
8618      key: "Default",
8619      get: function get() {
8620        return Default;
8621      }
8622    }]);
8623
8624    return Toast;
8625  }();
8626  /**
8627   * jQuery
8628   */
8629
8630
8631  $__default["default"].fn[NAME] = Toast._jQueryInterface;
8632  $__default["default"].fn[NAME].Constructor = Toast;
8633
8634  $__default["default"].fn[NAME].noConflict = function () {
8635    $__default["default"].fn[NAME] = JQUERY_NO_CONFLICT;
8636    return Toast._jQueryInterface;
8637  };
8638
8639  exports.Alert = Alert;
8640  exports.Button = Button;
8641  exports.Carousel = Carousel;
8642  exports.Collapse = Collapse;
8643  exports.Dropdown = Dropdown;
8644  exports.Modal = Modal;
8645  exports.Popover = Popover;
8646  exports.Scrollspy = ScrollSpy;
8647  exports.Tab = Tab;
8648  exports.Toast = Toast;
8649  exports.Tooltip = Tooltip;
8650  exports.Util = Util;
8651
8652  Object.defineProperty(exports, '__esModule', { value: true });
8653
8654}));
8655
8656
8657},{"jquery":38,"popper.js":42}],27:[function(require,module,exports){
8658/**
8659 * matchesSelector v2.0.2
8660 * matchesSelector( element, '.selector' )
8661 * MIT license
8662 */
8663
8664/*jshint browser: true, strict: true, undef: true, unused: true */
8665
8666( function( window, factory ) {
8667  /*global define: false, module: false */
8668  'use strict';
8669  // universal module definition
8670  if ( typeof define == 'function' && define.amd ) {
8671    // AMD
8672    define( factory );
8673  } else if ( typeof module == 'object' && module.exports ) {
8674    // CommonJS
8675    module.exports = factory();
8676  } else {
8677    // browser global
8678    window.matchesSelector = factory();
8679  }
8680
8681}( window, function factory() {
8682  'use strict';
8683
8684  var matchesMethod = ( function() {
8685    var ElemProto = window.Element.prototype;
8686    // check for the standard method name first
8687    if ( ElemProto.matches ) {
8688      return 'matches';
8689    }
8690    // check un-prefixed
8691    if ( ElemProto.matchesSelector ) {
8692      return 'matchesSelector';
8693    }
8694    // check vendor prefixes
8695    var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];
8696
8697    for ( var i=0; i < prefixes.length; i++ ) {
8698      var prefix = prefixes[i];
8699      var method = prefix + 'MatchesSelector';
8700      if ( ElemProto[ method ] ) {
8701        return method;
8702      }
8703    }
8704  })();
8705
8706  return function matchesSelector( elem, selector ) {
8707    return elem[ matchesMethod ]( selector );
8708  };
8709
8710}));
8711
8712},{}],28:[function(require,module,exports){
8713/**
8714*  Ajax Autocomplete for jQuery, version 1.4.11
8715*  (c) 2017 Tomas Kirda
8716*
8717*  Ajax Autocomplete for jQuery is freely distributable under the terms of an MIT-style license.
8718*  For details, see the web site: https://github.com/devbridge/jQuery-Autocomplete
8719*/
8720
8721/*jslint  browser: true, white: true, single: true, this: true, multivar: true */
8722/*global define, window, document, jQuery, exports, require */
8723
8724// Expose plugin as an AMD module if AMD loader is present:
8725(function (factory) {
8726    "use strict";
8727    if (typeof define === 'function' && define.amd) {
8728        // AMD. Register as an anonymous module.
8729        define(['jquery'], factory);
8730    } else if (typeof exports === 'object' && typeof require === 'function') {
8731        // Browserify
8732        factory(require('jquery'));
8733    } else {
8734        // Browser globals
8735        factory(jQuery);
8736    }
8737}(function ($) {
8738    'use strict';
8739
8740    var
8741        utils = (function () {
8742            return {
8743                escapeRegExChars: function (value) {
8744                    return value.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&");
8745                },
8746                createNode: function (containerClass) {
8747                    var div = document.createElement('div');
8748                    div.className = containerClass;
8749                    div.style.position = 'absolute';
8750                    div.style.display = 'none';
8751                    return div;
8752                }
8753            };
8754        }()),
8755
8756        keys = {
8757            ESC: 27,
8758            TAB: 9,
8759            RETURN: 13,
8760            LEFT: 37,
8761            UP: 38,
8762            RIGHT: 39,
8763            DOWN: 40
8764        },
8765
8766        noop = $.noop;
8767
8768    function Autocomplete(el, options) {
8769        var that = this;
8770
8771        // Shared variables:
8772        that.element = el;
8773        that.el = $(el);
8774        that.suggestions = [];
8775        that.badQueries = [];
8776        that.selectedIndex = -1;
8777        that.currentValue = that.element.value;
8778        that.timeoutId = null;
8779        that.cachedResponse = {};
8780        that.onChangeTimeout = null;
8781        that.onChange = null;
8782        that.isLocal = false;
8783        that.suggestionsContainer = null;
8784        that.noSuggestionsContainer = null;
8785        that.options = $.extend(true, {}, Autocomplete.defaults, options);
8786        that.classes = {
8787            selected: 'autocomplete-selected',
8788            suggestion: 'autocomplete-suggestion'
8789        };
8790        that.hint = null;
8791        that.hintValue = '';
8792        that.selection = null;
8793
8794        // Initialize and set options:
8795        that.initialize();
8796        that.setOptions(options);
8797    }
8798
8799    Autocomplete.utils = utils;
8800
8801    $.Autocomplete = Autocomplete;
8802
8803    Autocomplete.defaults = {
8804            ajaxSettings: {},
8805            autoSelectFirst: false,
8806            appendTo: 'body',
8807            serviceUrl: null,
8808            lookup: null,
8809            onSelect: null,
8810            width: 'auto',
8811            minChars: 1,
8812            maxHeight: 300,
8813            deferRequestBy: 0,
8814            params: {},
8815            formatResult: _formatResult,
8816            formatGroup: _formatGroup,
8817            delimiter: null,
8818            zIndex: 9999,
8819            type: 'GET',
8820            noCache: false,
8821            onSearchStart: noop,
8822            onSearchComplete: noop,
8823            onSearchError: noop,
8824            preserveInput: false,
8825            containerClass: 'autocomplete-suggestions',
8826            tabDisabled: false,
8827            dataType: 'text',
8828            currentRequest: null,
8829            triggerSelectOnValidInput: true,
8830            preventBadQueries: true,
8831            lookupFilter: _lookupFilter,
8832            paramName: 'query',
8833            transformResult: _transformResult,
8834            showNoSuggestionNotice: false,
8835            noSuggestionNotice: 'No results',
8836            orientation: 'bottom',
8837            forceFixPosition: false
8838    };
8839
8840    function _lookupFilter(suggestion, originalQuery, queryLowerCase) {
8841        return suggestion.value.toLowerCase().indexOf(queryLowerCase) !== -1;
8842    };
8843
8844    function _transformResult(response) {
8845        return typeof response === 'string' ? $.parseJSON(response) : response;
8846    };
8847
8848    function _formatResult(suggestion, currentValue) {
8849        // Do not replace anything if the current value is empty
8850        if (!currentValue) {
8851            return suggestion.value;
8852        }
8853
8854        var pattern = '(' + utils.escapeRegExChars(currentValue) + ')';
8855
8856        return suggestion.value
8857            .replace(new RegExp(pattern, 'gi'), '<strong>$1<\/strong>')
8858            .replace(/&/g, '&amp;')
8859            .replace(/</g, '&lt;')
8860            .replace(/>/g, '&gt;')
8861            .replace(/"/g, '&quot;')
8862            .replace(/&lt;(\/?strong)&gt;/g, '<$1>');
8863    };
8864
8865    function _formatGroup(suggestion, category) {
8866        return '<div class="autocomplete-group">' + category + '</div>';
8867    };
8868
8869    Autocomplete.prototype = {
8870
8871        initialize: function () {
8872            var that = this,
8873                suggestionSelector = '.' + that.classes.suggestion,
8874                selected = that.classes.selected,
8875                options = that.options,
8876                container;
8877
8878            that.element.setAttribute('autocomplete', 'off');
8879
8880            // html() deals with many types: htmlString or Element or Array or jQuery
8881            that.noSuggestionsContainer = $('<div class="autocomplete-no-suggestion"></div>')
8882                                          .html(this.options.noSuggestionNotice).get(0);
8883
8884            that.suggestionsContainer = Autocomplete.utils.createNode(options.containerClass);
8885
8886            container = $(that.suggestionsContainer);
8887
8888            container.appendTo(options.appendTo || 'body');
8889
8890            // Only set width if it was provided:
8891            if (options.width !== 'auto') {
8892                container.css('width', options.width);
8893            }
8894
8895            // Listen for mouse over event on suggestions list:
8896            container.on('mouseover.autocomplete', suggestionSelector, function () {
8897                that.activate($(this).data('index'));
8898            });
8899
8900            // Deselect active element when mouse leaves suggestions container:
8901            container.on('mouseout.autocomplete', function () {
8902                that.selectedIndex = -1;
8903                container.children('.' + selected).removeClass(selected);
8904            });
8905
8906            // Listen for click event on suggestions list:
8907            container.on('click.autocomplete', suggestionSelector, function () {
8908                that.select($(this).data('index'));
8909            });
8910
8911            container.on('click.autocomplete', function () {
8912                clearTimeout(that.blurTimeoutId);
8913            })
8914
8915            that.fixPositionCapture = function () {
8916                if (that.visible) {
8917                    that.fixPosition();
8918                }
8919            };
8920
8921            $(window).on('resize.autocomplete', that.fixPositionCapture);
8922
8923            that.el.on('keydown.autocomplete', function (e) { that.onKeyPress(e); });
8924            that.el.on('keyup.autocomplete', function (e) { that.onKeyUp(e); });
8925            that.el.on('blur.autocomplete', function () { that.onBlur(); });
8926            that.el.on('focus.autocomplete', function () { that.onFocus(); });
8927            that.el.on('change.autocomplete', function (e) { that.onKeyUp(e); });
8928            that.el.on('input.autocomplete', function (e) { that.onKeyUp(e); });
8929        },
8930
8931        onFocus: function () {
8932            var that = this;
8933
8934            if (that.disabled) {
8935                return;
8936            }
8937
8938            that.fixPosition();
8939
8940            if (that.el.val().length >= that.options.minChars) {
8941                that.onValueChange();
8942            }
8943        },
8944
8945        onBlur: function () {
8946            var that = this,
8947                options = that.options,
8948                value = that.el.val(),
8949                query = that.getQuery(value);
8950
8951            // If user clicked on a suggestion, hide() will
8952            // be canceled, otherwise close suggestions
8953            that.blurTimeoutId = setTimeout(function () {
8954                that.hide();
8955
8956                if (that.selection && that.currentValue !== query) {
8957                    (options.onInvalidateSelection || $.noop).call(that.element);
8958                }
8959            }, 200);
8960        },
8961
8962        abortAjax: function () {
8963            var that = this;
8964            if (that.currentRequest) {
8965                that.currentRequest.abort();
8966                that.currentRequest = null;
8967            }
8968        },
8969
8970        setOptions: function (suppliedOptions) {
8971            var that = this,
8972                options = $.extend({}, that.options, suppliedOptions);
8973
8974            that.isLocal = Array.isArray(options.lookup);
8975
8976            if (that.isLocal) {
8977                options.lookup = that.verifySuggestionsFormat(options.lookup);
8978            }
8979
8980            options.orientation = that.validateOrientation(options.orientation, 'bottom');
8981
8982            // Adjust height, width and z-index:
8983            $(that.suggestionsContainer).css({
8984                'max-height': options.maxHeight + 'px',
8985                'width': options.width + 'px',
8986                'z-index': options.zIndex
8987            });
8988
8989            this.options = options;
8990        },
8991
8992
8993        clearCache: function () {
8994            this.cachedResponse = {};
8995            this.badQueries = [];
8996        },
8997
8998        clear: function () {
8999            this.clearCache();
9000            this.currentValue = '';
9001            this.suggestions = [];
9002        },
9003
9004        disable: function () {
9005            var that = this;
9006            that.disabled = true;
9007            clearTimeout(that.onChangeTimeout);
9008            that.abortAjax();
9009        },
9010
9011        enable: function () {
9012            this.disabled = false;
9013        },
9014
9015        fixPosition: function () {
9016            // Use only when container has already its content
9017
9018            var that = this,
9019                $container = $(that.suggestionsContainer),
9020                containerParent = $container.parent().get(0);
9021            // Fix position automatically when appended to body.
9022            // In other cases force parameter must be given.
9023            if (containerParent !== document.body && !that.options.forceFixPosition) {
9024                return;
9025            }
9026
9027            // Choose orientation
9028            var orientation = that.options.orientation,
9029                containerHeight = $container.outerHeight(),
9030                height = that.el.outerHeight(),
9031                offset = that.el.offset(),
9032                styles = { 'top': offset.top, 'left': offset.left };
9033
9034            if (orientation === 'auto') {
9035                var viewPortHeight = $(window).height(),
9036                    scrollTop = $(window).scrollTop(),
9037                    topOverflow = -scrollTop + offset.top - containerHeight,
9038                    bottomOverflow = scrollTop + viewPortHeight - (offset.top + height + containerHeight);
9039
9040                orientation = (Math.max(topOverflow, bottomOverflow) === topOverflow) ? 'top' : 'bottom';
9041            }
9042
9043            if (orientation === 'top') {
9044                styles.top += -containerHeight;
9045            } else {
9046                styles.top += height;
9047            }
9048
9049            // If container is not positioned to body,
9050            // correct its position using offset parent offset
9051            if(containerParent !== document.body) {
9052                var opacity = $container.css('opacity'),
9053                    parentOffsetDiff;
9054
9055                    if (!that.visible){
9056                        $container.css('opacity', 0).show();
9057                    }
9058
9059                parentOffsetDiff = $container.offsetParent().offset();
9060                styles.top -= parentOffsetDiff.top;
9061                styles.top += containerParent.scrollTop;
9062                styles.left -= parentOffsetDiff.left;
9063
9064                if (!that.visible){
9065                    $container.css('opacity', opacity).hide();
9066                }
9067            }
9068
9069            if (that.options.width === 'auto') {
9070                styles.width = that.el.outerWidth() + 'px';
9071            }
9072
9073            $container.css(styles);
9074        },
9075
9076        isCursorAtEnd: function () {
9077            var that = this,
9078                valLength = that.el.val().length,
9079                selectionStart = that.element.selectionStart,
9080                range;
9081
9082            if (typeof selectionStart === 'number') {
9083                return selectionStart === valLength;
9084            }
9085            if (document.selection) {
9086                range = document.selection.createRange();
9087                range.moveStart('character', -valLength);
9088                return valLength === range.text.length;
9089            }
9090            return true;
9091        },
9092
9093        onKeyPress: function (e) {
9094            var that = this;
9095
9096            // If suggestions are hidden and user presses arrow down, display suggestions:
9097            if (!that.disabled && !that.visible && e.which === keys.DOWN && that.currentValue) {
9098                that.suggest();
9099                return;
9100            }
9101
9102            if (that.disabled || !that.visible) {
9103                return;
9104            }
9105
9106            switch (e.which) {
9107                case keys.ESC:
9108                    that.el.val(that.currentValue);
9109                    that.hide();
9110                    break;
9111                case keys.RIGHT:
9112                    if (that.hint && that.options.onHint && that.isCursorAtEnd()) {
9113                        that.selectHint();
9114                        break;
9115                    }
9116                    return;
9117                case keys.TAB:
9118                    if (that.hint && that.options.onHint) {
9119                        that.selectHint();
9120                        return;
9121                    }
9122                    if (that.selectedIndex === -1) {
9123                        that.hide();
9124                        return;
9125                    }
9126                    that.select(that.selectedIndex);
9127                    if (that.options.tabDisabled === false) {
9128                        return;
9129                    }
9130                    break;
9131                case keys.RETURN:
9132                    if (that.selectedIndex === -1) {
9133                        that.hide();
9134                        return;
9135                    }
9136                    that.select(that.selectedIndex);
9137                    break;
9138                case keys.UP:
9139                    that.moveUp();
9140                    break;
9141                case keys.DOWN:
9142                    that.moveDown();
9143                    break;
9144                default:
9145                    return;
9146            }
9147
9148            // Cancel event if function did not return:
9149            e.stopImmediatePropagation();
9150            e.preventDefault();
9151        },
9152
9153        onKeyUp: function (e) {
9154            var that = this;
9155
9156            if (that.disabled) {
9157                return;
9158            }
9159
9160            switch (e.which) {
9161                case keys.UP:
9162                case keys.DOWN:
9163                    return;
9164            }
9165
9166            clearTimeout(that.onChangeTimeout);
9167
9168            if (that.currentValue !== that.el.val()) {
9169                that.findBestHint();
9170                if (that.options.deferRequestBy > 0) {
9171                    // Defer lookup in case when value changes very quickly:
9172                    that.onChangeTimeout = setTimeout(function () {
9173                        that.onValueChange();
9174                    }, that.options.deferRequestBy);
9175                } else {
9176                    that.onValueChange();
9177                }
9178            }
9179        },
9180
9181        onValueChange: function () {
9182            if (this.ignoreValueChange) {
9183                this.ignoreValueChange = false;
9184                return;
9185            }
9186
9187            var that = this,
9188                options = that.options,
9189                value = that.el.val(),
9190                query = that.getQuery(value);
9191
9192            if (that.selection && that.currentValue !== query) {
9193                that.selection = null;
9194                (options.onInvalidateSelection || $.noop).call(that.element);
9195            }
9196
9197            clearTimeout(that.onChangeTimeout);
9198            that.currentValue = value;
9199            that.selectedIndex = -1;
9200
9201            // Check existing suggestion for the match before proceeding:
9202            if (options.triggerSelectOnValidInput && that.isExactMatch(query)) {
9203                that.select(0);
9204                return;
9205            }
9206
9207            if (query.length < options.minChars) {
9208                that.hide();
9209            } else {
9210                that.getSuggestions(query);
9211            }
9212        },
9213
9214        isExactMatch: function (query) {
9215            var suggestions = this.suggestions;
9216
9217            return (suggestions.length === 1 && suggestions[0].value.toLowerCase() === query.toLowerCase());
9218        },
9219
9220        getQuery: function (value) {
9221            var delimiter = this.options.delimiter,
9222                parts;
9223
9224            if (!delimiter) {
9225                return value;
9226            }
9227            parts = value.split(delimiter);
9228            return $.trim(parts[parts.length - 1]);
9229        },
9230
9231        getSuggestionsLocal: function (query) {
9232            var that = this,
9233                options = that.options,
9234                queryLowerCase = query.toLowerCase(),
9235                filter = options.lookupFilter,
9236                limit = parseInt(options.lookupLimit, 10),
9237                data;
9238
9239            data = {
9240                suggestions: $.grep(options.lookup, function (suggestion) {
9241                    return filter(suggestion, query, queryLowerCase);
9242                })
9243            };
9244
9245            if (limit && data.suggestions.length > limit) {
9246                data.suggestions = data.suggestions.slice(0, limit);
9247            }
9248
9249            return data;
9250        },
9251
9252        getSuggestions: function (q) {
9253            var response,
9254                that = this,
9255                options = that.options,
9256                serviceUrl = options.serviceUrl,
9257                params,
9258                cacheKey,
9259                ajaxSettings;
9260
9261            options.params[options.paramName] = q;
9262
9263            if (options.onSearchStart.call(that.element, options.params) === false) {
9264                return;
9265            }
9266
9267            params = options.ignoreParams ? null : options.params;
9268
9269            if ($.isFunction(options.lookup)){
9270                options.lookup(q, function (data) {
9271                    that.suggestions = data.suggestions;
9272                    that.suggest();
9273                    options.onSearchComplete.call(that.element, q, data.suggestions);
9274                });
9275                return;
9276            }
9277
9278            if (that.isLocal) {
9279                response = that.getSuggestionsLocal(q);
9280            } else {
9281                if ($.isFunction(serviceUrl)) {
9282                    serviceUrl = serviceUrl.call(that.element, q);
9283                }
9284                cacheKey = serviceUrl + '?' + $.param(params || {});
9285                response = that.cachedResponse[cacheKey];
9286            }
9287
9288            if (response && Array.isArray(response.suggestions)) {
9289                that.suggestions = response.suggestions;
9290                that.suggest();
9291                options.onSearchComplete.call(that.element, q, response.suggestions);
9292            } else if (!that.isBadQuery(q)) {
9293                that.abortAjax();
9294
9295                ajaxSettings = {
9296                    url: serviceUrl,
9297                    data: params,
9298                    type: options.type,
9299                    dataType: options.dataType
9300                };
9301
9302                $.extend(ajaxSettings, options.ajaxSettings);
9303
9304                that.currentRequest = $.ajax(ajaxSettings).done(function (data) {
9305                    var result;
9306                    that.currentRequest = null;
9307                    result = options.transformResult(data, q);
9308                    that.processResponse(result, q, cacheKey);
9309                    options.onSearchComplete.call(that.element, q, result.suggestions);
9310                }).fail(function (jqXHR, textStatus, errorThrown) {
9311                    options.onSearchError.call(that.element, q, jqXHR, textStatus, errorThrown);
9312                });
9313            } else {
9314                options.onSearchComplete.call(that.element, q, []);
9315            }
9316        },
9317
9318        isBadQuery: function (q) {
9319            if (!this.options.preventBadQueries){
9320                return false;
9321            }
9322
9323            var badQueries = this.badQueries,
9324                i = badQueries.length;
9325
9326            while (i--) {
9327                if (q.indexOf(badQueries[i]) === 0) {
9328                    return true;
9329                }
9330            }
9331
9332            return false;
9333        },
9334
9335        hide: function () {
9336            var that = this,
9337                container = $(that.suggestionsContainer);
9338
9339            if ($.isFunction(that.options.onHide) && that.visible) {
9340                that.options.onHide.call(that.element, container);
9341            }
9342
9343            that.visible = false;
9344            that.selectedIndex = -1;
9345            clearTimeout(that.onChangeTimeout);
9346            $(that.suggestionsContainer).hide();
9347            that.signalHint(null);
9348        },
9349
9350        suggest: function () {
9351            if (!this.suggestions.length) {
9352                if (this.options.showNoSuggestionNotice) {
9353                    this.noSuggestions();
9354                } else {
9355                    this.hide();
9356                }
9357                return;
9358            }
9359
9360            var that = this,
9361                options = that.options,
9362                groupBy = options.groupBy,
9363                formatResult = options.formatResult,
9364                value = that.getQuery(that.currentValue),
9365                className = that.classes.suggestion,
9366                classSelected = that.classes.selected,
9367                container = $(that.suggestionsContainer),
9368                noSuggestionsContainer = $(that.noSuggestionsContainer),
9369                beforeRender = options.beforeRender,
9370                html = '',
9371                category,
9372                formatGroup = function (suggestion, index) {
9373                        var currentCategory = suggestion.data[groupBy];
9374
9375                        if (category === currentCategory){
9376                            return '';
9377                        }
9378
9379                        category = currentCategory;
9380
9381                        return options.formatGroup(suggestion, category);
9382                    };
9383
9384            if (options.triggerSelectOnValidInput && that.isExactMatch(value)) {
9385                that.select(0);
9386                return;
9387            }
9388
9389            // Build suggestions inner HTML:
9390            $.each(that.suggestions, function (i, suggestion) {
9391                if (groupBy){
9392                    html += formatGroup(suggestion, value, i);
9393                }
9394
9395                html += '<div class="' + className + '" data-index="' + i + '">' + formatResult(suggestion, value, i) + '</div>';
9396            });
9397
9398            this.adjustContainerWidth();
9399
9400            noSuggestionsContainer.detach();
9401            container.html(html);
9402
9403            if ($.isFunction(beforeRender)) {
9404                beforeRender.call(that.element, container, that.suggestions);
9405            }
9406
9407            that.fixPosition();
9408            container.show();
9409
9410            // Select first value by default:
9411            if (options.autoSelectFirst) {
9412                that.selectedIndex = 0;
9413                container.scrollTop(0);
9414                container.children('.' + className).first().addClass(classSelected);
9415            }
9416
9417            that.visible = true;
9418            that.findBestHint();
9419        },
9420
9421        noSuggestions: function() {
9422             var that = this,
9423                 beforeRender = that.options.beforeRender,
9424                 container = $(that.suggestionsContainer),
9425                 noSuggestionsContainer = $(that.noSuggestionsContainer);
9426
9427            this.adjustContainerWidth();
9428
9429            // Some explicit steps. Be careful here as it easy to get
9430            // noSuggestionsContainer removed from DOM if not detached properly.
9431            noSuggestionsContainer.detach();
9432
9433            // clean suggestions if any
9434            container.empty();
9435            container.append(noSuggestionsContainer);
9436
9437            if ($.isFunction(beforeRender)) {
9438                beforeRender.call(that.element, container, that.suggestions);
9439            }
9440
9441            that.fixPosition();
9442
9443            container.show();
9444            that.visible = true;
9445        },
9446
9447        adjustContainerWidth: function() {
9448            var that = this,
9449                options = that.options,
9450                width,
9451                container = $(that.suggestionsContainer);
9452
9453            // If width is auto, adjust width before displaying suggestions,
9454            // because if instance was created before input had width, it will be zero.
9455            // Also it adjusts if input width has changed.
9456            if (options.width === 'auto') {
9457                width = that.el.outerWidth();
9458                container.css('width', width > 0 ? width : 300);
9459            } else if(options.width === 'flex') {
9460                // Trust the source! Unset the width property so it will be the max length
9461                // the containing elements.
9462                container.css('width', '');
9463            }
9464        },
9465
9466        findBestHint: function () {
9467            var that = this,
9468                value = that.el.val().toLowerCase(),
9469                bestMatch = null;
9470
9471            if (!value) {
9472                return;
9473            }
9474
9475            $.each(that.suggestions, function (i, suggestion) {
9476                var foundMatch = suggestion.value.toLowerCase().indexOf(value) === 0;
9477                if (foundMatch) {
9478                    bestMatch = suggestion;
9479                }
9480                return !foundMatch;
9481            });
9482
9483            that.signalHint(bestMatch);
9484        },
9485
9486        signalHint: function (suggestion) {
9487            var hintValue = '',
9488                that = this;
9489            if (suggestion) {
9490                hintValue = that.currentValue + suggestion.value.substr(that.currentValue.length);
9491            }
9492            if (that.hintValue !== hintValue) {
9493                that.hintValue = hintValue;
9494                that.hint = suggestion;
9495                (this.options.onHint || $.noop)(hintValue);
9496            }
9497        },
9498
9499        verifySuggestionsFormat: function (suggestions) {
9500            // If suggestions is string array, convert them to supported format:
9501            if (suggestions.length && typeof suggestions[0] === 'string') {
9502                return $.map(suggestions, function (value) {
9503                    return { value: value, data: null };
9504                });
9505            }
9506
9507            return suggestions;
9508        },
9509
9510        validateOrientation: function(orientation, fallback) {
9511            orientation = $.trim(orientation || '').toLowerCase();
9512
9513            if($.inArray(orientation, ['auto', 'bottom', 'top']) === -1){
9514                orientation = fallback;
9515            }
9516
9517            return orientation;
9518        },
9519
9520        processResponse: function (result, originalQuery, cacheKey) {
9521            var that = this,
9522                options = that.options;
9523
9524            result.suggestions = that.verifySuggestionsFormat(result.suggestions);
9525
9526            // Cache results if cache is not disabled:
9527            if (!options.noCache) {
9528                that.cachedResponse[cacheKey] = result;
9529                if (options.preventBadQueries && !result.suggestions.length) {
9530                    that.badQueries.push(originalQuery);
9531                }
9532            }
9533
9534            // Return if originalQuery is not matching current query:
9535            if (originalQuery !== that.getQuery(that.currentValue)) {
9536                return;
9537            }
9538
9539            that.suggestions = result.suggestions;
9540            that.suggest();
9541        },
9542
9543        activate: function (index) {
9544            var that = this,
9545                activeItem,
9546                selected = that.classes.selected,
9547                container = $(that.suggestionsContainer),
9548                children = container.find('.' + that.classes.suggestion);
9549
9550            container.find('.' + selected).removeClass(selected);
9551
9552            that.selectedIndex = index;
9553
9554            if (that.selectedIndex !== -1 && children.length > that.selectedIndex) {
9555                activeItem = children.get(that.selectedIndex);
9556                $(activeItem).addClass(selected);
9557                return activeItem;
9558            }
9559
9560            return null;
9561        },
9562
9563        selectHint: function () {
9564            var that = this,
9565                i = $.inArray(that.hint, that.suggestions);
9566
9567            that.select(i);
9568        },
9569
9570        select: function (i) {
9571            var that = this;
9572            that.hide();
9573            that.onSelect(i);
9574        },
9575
9576        moveUp: function () {
9577            var that = this;
9578
9579            if (that.selectedIndex === -1) {
9580                return;
9581            }
9582
9583            if (that.selectedIndex === 0) {
9584                $(that.suggestionsContainer).children('.' + that.classes.suggestion).first().removeClass(that.classes.selected);
9585                that.selectedIndex = -1;
9586                that.ignoreValueChange = false;
9587                that.el.val(that.currentValue);
9588                that.findBestHint();
9589                return;
9590            }
9591
9592            that.adjustScroll(that.selectedIndex - 1);
9593        },
9594
9595        moveDown: function () {
9596            var that = this;
9597
9598            if (that.selectedIndex === (that.suggestions.length - 1)) {
9599                return;
9600            }
9601
9602            that.adjustScroll(that.selectedIndex + 1);
9603        },
9604
9605        adjustScroll: function (index) {
9606            var that = this,
9607                activeItem = that.activate(index);
9608
9609            if (!activeItem) {
9610                return;
9611            }
9612
9613            var offsetTop,
9614                upperBound,
9615                lowerBound,
9616                heightDelta = $(activeItem).outerHeight();
9617
9618            offsetTop = activeItem.offsetTop;
9619            upperBound = $(that.suggestionsContainer).scrollTop();
9620            lowerBound = upperBound + that.options.maxHeight - heightDelta;
9621
9622            if (offsetTop < upperBound) {
9623                $(that.suggestionsContainer).scrollTop(offsetTop);
9624            } else if (offsetTop > lowerBound) {
9625                $(that.suggestionsContainer).scrollTop(offsetTop - that.options.maxHeight + heightDelta);
9626            }
9627
9628            if (!that.options.preserveInput) {
9629                // During onBlur event, browser will trigger "change" event,
9630                // because value has changed, to avoid side effect ignore,
9631                // that event, so that correct suggestion can be selected
9632                // when clicking on suggestion with a mouse
9633                that.ignoreValueChange = true;
9634                that.el.val(that.getValue(that.suggestions[index].value));
9635            }
9636
9637            that.signalHint(null);
9638        },
9639
9640        onSelect: function (index) {
9641            var that = this,
9642                onSelectCallback = that.options.onSelect,
9643                suggestion = that.suggestions[index];
9644
9645            that.currentValue = that.getValue(suggestion.value);
9646
9647            if (that.currentValue !== that.el.val() && !that.options.preserveInput) {
9648                that.el.val(that.currentValue);
9649            }
9650
9651            that.signalHint(null);
9652            that.suggestions = [];
9653            that.selection = suggestion;
9654
9655            if ($.isFunction(onSelectCallback)) {
9656                onSelectCallback.call(that.element, suggestion);
9657            }
9658        },
9659
9660        getValue: function (value) {
9661            var that = this,
9662                delimiter = that.options.delimiter,
9663                currentValue,
9664                parts;
9665
9666            if (!delimiter) {
9667                return value;
9668            }
9669
9670            currentValue = that.currentValue;
9671            parts = currentValue.split(delimiter);
9672
9673            if (parts.length === 1) {
9674                return value;
9675            }
9676
9677            return currentValue.substr(0, currentValue.length - parts[parts.length - 1].length) + value;
9678        },
9679
9680        dispose: function () {
9681            var that = this;
9682            that.el.off('.autocomplete').removeData('autocomplete');
9683            $(window).off('resize.autocomplete', that.fixPositionCapture);
9684            $(that.suggestionsContainer).remove();
9685        }
9686    };
9687
9688    // Create chainable jQuery plugin:
9689    $.fn.devbridgeAutocomplete = function (options, args) {
9690        var dataKey = 'autocomplete';
9691        // If function invoked without argument return
9692        // instance of the first matched element:
9693        if (!arguments.length) {
9694            return this.first().data(dataKey);
9695        }
9696
9697        return this.each(function () {
9698            var inputElement = $(this),
9699                instance = inputElement.data(dataKey);
9700
9701            if (typeof options === 'string') {
9702                if (instance && typeof instance[options] === 'function') {
9703                    instance[options](args);
9704                }
9705            } else {
9706                // If instance already exists, destroy it:
9707                if (instance && instance.dispose) {
9708                    instance.dispose();
9709                }
9710                instance = new Autocomplete(this, options);
9711                inputElement.data(dataKey, instance);
9712            }
9713        });
9714    };
9715
9716    // Don't overwrite if it already exists
9717    if (!$.fn.autocomplete) {
9718        $.fn.autocomplete = $.fn.devbridgeAutocomplete;
9719    }
9720}));
9721
9722},{"jquery":38}],29:[function(require,module,exports){
9723/**
9724 * EvEmitter v1.1.0
9725 * Lil' event emitter
9726 * MIT License
9727 */
9728
9729/* jshint unused: true, undef: true, strict: true */
9730
9731( function( global, factory ) {
9732  // universal module definition
9733  /* jshint strict: false */ /* globals define, module, window */
9734  if ( typeof define == 'function' && define.amd ) {
9735    // AMD - RequireJS
9736    define( factory );
9737  } else if ( typeof module == 'object' && module.exports ) {
9738    // CommonJS - Browserify, Webpack
9739    module.exports = factory();
9740  } else {
9741    // Browser globals
9742    global.EvEmitter = factory();
9743  }
9744
9745}( typeof window != 'undefined' ? window : this, function() {
9746
9747"use strict";
9748
9749function EvEmitter() {}
9750
9751var proto = EvEmitter.prototype;
9752
9753proto.on = function( eventName, listener ) {
9754  if ( !eventName || !listener ) {
9755    return;
9756  }
9757  // set events hash
9758  var events = this._events = this._events || {};
9759  // set listeners array
9760  var listeners = events[ eventName ] = events[ eventName ] || [];
9761  // only add once
9762  if ( listeners.indexOf( listener ) == -1 ) {
9763    listeners.push( listener );
9764  }
9765
9766  return this;
9767};
9768
9769proto.once = function( eventName, listener ) {
9770  if ( !eventName || !listener ) {
9771    return;
9772  }
9773  // add event
9774  this.on( eventName, listener );
9775  // set once flag
9776  // set onceEvents hash
9777  var onceEvents = this._onceEvents = this._onceEvents || {};
9778  // set onceListeners object
9779  var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};
9780  // set flag
9781  onceListeners[ listener ] = true;
9782
9783  return this;
9784};
9785
9786proto.off = function( eventName, listener ) {
9787  var listeners = this._events && this._events[ eventName ];
9788  if ( !listeners || !listeners.length ) {
9789    return;
9790  }
9791  var index = listeners.indexOf( listener );
9792  if ( index != -1 ) {
9793    listeners.splice( index, 1 );
9794  }
9795
9796  return this;
9797};
9798
9799proto.emitEvent = function( eventName, args ) {
9800  var listeners = this._events && this._events[ eventName ];
9801  if ( !listeners || !listeners.length ) {
9802    return;
9803  }
9804  // copy over to avoid interference if .off() in listener
9805  listeners = listeners.slice(0);
9806  args = args || [];
9807  // once stuff
9808  var onceListeners = this._onceEvents && this._onceEvents[ eventName ];
9809
9810  for ( var i=0; i < listeners.length; i++ ) {
9811    var listener = listeners[i]
9812    var isOnce = onceListeners && onceListeners[ listener ];
9813    if ( isOnce ) {
9814      // remove listener
9815      // remove before trigger to prevent recursion
9816      this.off( eventName, listener );
9817      // unset once flag
9818      delete onceListeners[ listener ];
9819    }
9820    // trigger listener
9821    listener.apply( this, args );
9822  }
9823
9824  return this;
9825};
9826
9827proto.allOff = function() {
9828  delete this._events;
9829  delete this._onceEvents;
9830};
9831
9832return EvEmitter;
9833
9834}));
9835
9836},{}],30:[function(require,module,exports){
9837/**
9838 * Fizzy UI utils v2.0.7
9839 * MIT license
9840 */
9841
9842/*jshint browser: true, undef: true, unused: true, strict: true */
9843
9844( function( window, factory ) {
9845  // universal module definition
9846  /*jshint strict: false */ /*globals define, module, require */
9847
9848  if ( typeof define == 'function' && define.amd ) {
9849    // AMD
9850    define( [
9851      'desandro-matches-selector/matches-selector'
9852    ], function( matchesSelector ) {
9853      return factory( window, matchesSelector );
9854    });
9855  } else if ( typeof module == 'object' && module.exports ) {
9856    // CommonJS
9857    module.exports = factory(
9858      window,
9859      require('desandro-matches-selector')
9860    );
9861  } else {
9862    // browser global
9863    window.fizzyUIUtils = factory(
9864      window,
9865      window.matchesSelector
9866    );
9867  }
9868
9869}( window, function factory( window, matchesSelector ) {
9870
9871'use strict';
9872
9873var utils = {};
9874
9875// ----- extend ----- //
9876
9877// extends objects
9878utils.extend = function( a, b ) {
9879  for ( var prop in b ) {
9880    a[ prop ] = b[ prop ];
9881  }
9882  return a;
9883};
9884
9885// ----- modulo ----- //
9886
9887utils.modulo = function( num, div ) {
9888  return ( ( num % div ) + div ) % div;
9889};
9890
9891// ----- makeArray ----- //
9892
9893var arraySlice = Array.prototype.slice;
9894
9895// turn element or nodeList into an array
9896utils.makeArray = function( obj ) {
9897  if ( Array.isArray( obj ) ) {
9898    // use object if already an array
9899    return obj;
9900  }
9901  // return empty array if undefined or null. #6
9902  if ( obj === null || obj === undefined ) {
9903    return [];
9904  }
9905
9906  var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';
9907  if ( isArrayLike ) {
9908    // convert nodeList to array
9909    return arraySlice.call( obj );
9910  }
9911
9912  // array of single index
9913  return [ obj ];
9914};
9915
9916// ----- removeFrom ----- //
9917
9918utils.removeFrom = function( ary, obj ) {
9919  var index = ary.indexOf( obj );
9920  if ( index != -1 ) {
9921    ary.splice( index, 1 );
9922  }
9923};
9924
9925// ----- getParent ----- //
9926
9927utils.getParent = function( elem, selector ) {
9928  while ( elem.parentNode && elem != document.body ) {
9929    elem = elem.parentNode;
9930    if ( matchesSelector( elem, selector ) ) {
9931      return elem;
9932    }
9933  }
9934};
9935
9936// ----- getQueryElement ----- //
9937
9938// use element as selector string
9939utils.getQueryElement = function( elem ) {
9940  if ( typeof elem == 'string' ) {
9941    return document.querySelector( elem );
9942  }
9943  return elem;
9944};
9945
9946// ----- handleEvent ----- //
9947
9948// enable .ontype to trigger from .addEventListener( elem, 'type' )
9949utils.handleEvent = function( event ) {
9950  var method = 'on' + event.type;
9951  if ( this[ method ] ) {
9952    this[ method ]( event );
9953  }
9954};
9955
9956// ----- filterFindElements ----- //
9957
9958utils.filterFindElements = function( elems, selector ) {
9959  // make array of elems
9960  elems = utils.makeArray( elems );
9961  var ffElems = [];
9962
vendor: 5,583 bytes, lines 9963-10175
9963  elems.forEach( function( elem ) {
9964    // check that elem is an actual element
9965    if ( !( elem instanceof HTMLElement ) ) {
9966      return;
9967    }
9968    // add elem if no selector
9969    if ( !selector ) {
9970      ffElems.push( elem );
9971      return;
9972    }
9973    // filter & find items if we have a selector
9974    // filter
9975    if ( matchesSelector( elem, selector ) ) {
9976      ffElems.push( elem );
9977    }
9978    // find children
9979    var childElems = elem.querySelectorAll( selector );
9980    // concat childElems to filterFound array
9981    for ( var i=0; i < childElems.length; i++ ) {
9982      ffElems.push( childElems[i] );
9983    }
9984  });
9985
9986  return ffElems;
9987};
9988
9989// ----- debounceMethod ----- //
9990
9991utils.debounceMethod = function( _class, methodName, threshold ) {
9992  threshold = threshold || 100;
9993  // original method
9994  var method = _class.prototype[ methodName ];
9995  var timeoutName = methodName + 'Timeout';
9996
9997  _class.prototype[ methodName ] = function() {
9998    var timeout = this[ timeoutName ];
9999    clearTimeout( timeout );
10000
10001    var args = arguments;
10002    var _this = this;
10003    this[ timeoutName ] = setTimeout( function() {
10004      method.apply( _this, args );
10005      delete _this[ timeoutName ];
10006    }, threshold );
10007  };
10008};
10009
10010// ----- docReady ----- //
10011
10012utils.docReady = function( callback ) {
10013  var readyState = document.readyState;
10014  if ( readyState == 'complete' || readyState == 'interactive' ) {
10015    // do async to allow for other scripts to run. metafizzy/flickity#441
10016    setTimeout( callback );
10017  } else {
10018    document.addEventListener( 'DOMContentLoaded', callback );
10019  }
10020};
10021
10022// ----- htmlInit ----- //
10023
10024// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/
10025utils.toDashed = function( str ) {
10026  return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {
10027    return $1 + '-' + $2;
10028  }).toLowerCase();
10029};
10030
10031var console = window.console;
10032/**
10033 * allow user to initialize classes via [data-namespace] or .js-namespace class
10034 * htmlInit( Widget, 'widgetName' )
10035 * options are parsed from data-namespace-options
10036 */
10037utils.htmlInit = function( WidgetClass, namespace ) {
10038  utils.docReady( function() {
10039    var dashedNamespace = utils.toDashed( namespace );
10040    var dataAttr = 'data-' + dashedNamespace;
10041    var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );
10042    var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );
10043    var elems = utils.makeArray( dataAttrElems )
10044      .concat( utils.makeArray( jsDashElems ) );
10045    var dataOptionsAttr = dataAttr + '-options';
10046    var jQuery = window.jQuery;
10047
10048    elems.forEach( function( elem ) {
10049      var attr = elem.getAttribute( dataAttr ) ||
10050        elem.getAttribute( dataOptionsAttr );
10051      var options;
10052      try {
10053        options = attr && JSON.parse( attr );
10054      } catch ( error ) {
10055        // log error, do not initialize
10056        if ( console ) {
10057          console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +
10058          ': ' + error );
10059        }
10060        return;
10061      }
10062      // initialize
10063      var instance = new WidgetClass( elem, options );
10064      // make available via $().data('namespace')
10065      if ( jQuery ) {
10066        jQuery.data( elem, namespace, instance );
10067      }
10068    });
10069
10070  });
10071};
10072
10073// -----  ----- //
10074
10075return utils;
10076
10077}));
10078
10079},{"desandro-matches-selector":27}],31:[function(require,module,exports){
10080/*!
10081 * getSize v2.0.3
10082 * measure size of elements
10083 * MIT license
10084 */
10085
10086/* jshint browser: true, strict: true, undef: true, unused: true */
10087/* globals console: false */
10088
10089( function( window, factory ) {
10090  /* jshint strict: false */ /* globals define, module */
10091  if ( typeof define == 'function' && define.amd ) {
10092    // AMD
10093    define( factory );
10094  } else if ( typeof module == 'object' && module.exports ) {
10095    // CommonJS
10096    module.exports = factory();
10097  } else {
10098    // browser global
10099    window.getSize = factory();
10100  }
10101
10102})( window, function factory() {
10103'use strict';
10104
10105// -------------------------- helpers -------------------------- //
10106
10107// get a number from a string, not a percentage
10108function getStyleSize( value ) {
10109  var num = parseFloat( value );
10110  // not a percent like '100%', and a number
10111  var isValid = value.indexOf('%') == -1 && !isNaN( num );
10112  return isValid && num;
10113}
10114
10115function noop() {}
10116
10117var logError = typeof console == 'undefined' ? noop :
10118  function( message ) {
10119    console.error( message );
10120  };
10121
10122// -------------------------- measurements -------------------------- //
10123
10124var measurements = [
10125  'paddingLeft',
10126  'paddingRight',
10127  'paddingTop',
10128  'paddingBottom',
10129  'marginLeft',
10130  'marginRight',
10131  'marginTop',
10132  'marginBottom',
10133  'borderLeftWidth',
10134  'borderRightWidth',
10135  'borderTopWidth',
10136  'borderBottomWidth'
10137];
10138
10139var measurementsLength = measurements.length;
10140
10141function getZeroSize() {
10142  var size = {
10143    width: 0,
10144    height: 0,
10145    innerWidth: 0,
10146    innerHeight: 0,
10147    outerWidth: 0,
10148    outerHeight: 0
10149  };
10150  for ( var i=0; i < measurementsLength; i++ ) {
10151    var measurement = measurements[i];
10152    size[ measurement ] = 0;
10153  }
10154  return size;
10155}
10156
10157// -------------------------- getStyle -------------------------- //
10158
10159/**
10160 * getStyle, get style of element, check for Firefox bug
10161 * https://bugzilla.mozilla.org/show_bug.cgi?id=548397
10162 */
10163function getStyle( elem ) {
10164  var style = getComputedStyle( elem );
10165  if ( !style ) {
10166    logError( 'Style returned ' + style +
10167      '. Are you running this code in a hidden iframe on Firefox? ' +
10168      'See https://bit.ly/getsizebug1' );
10169  }
10170  return style;
10171}
10172
10173// -------------------------- setup -------------------------- //
10174
10175var isSetup = false;
vendor: 4,966 bytes, lines 10176-10350
10176
10177var isBoxSizeOuter;
10178
10179/**
10180 * setup
10181 * check isBoxSizerOuter
10182 * do on first getSize() rather than on page load for Firefox bug
10183 */
10184function setup() {
10185  // setup once
10186  if ( isSetup ) {
10187    return;
10188  }
10189  isSetup = true;
10190
10191  // -------------------------- box sizing -------------------------- //
10192
10193  /**
10194   * Chrome & Safari measure the outer-width on style.width on border-box elems
10195   * IE11 & Firefox<29 measures the inner-width
10196   */
10197  var div = document.createElement('div');
10198  div.style.width = '200px';
10199  div.style.padding = '1px 2px 3px 4px';
10200  div.style.borderStyle = 'solid';
10201  div.style.borderWidth = '1px 2px 3px 4px';
10202  div.style.boxSizing = 'border-box';
10203
10204  var body = document.body || document.documentElement;
10205  body.appendChild( div );
10206  var style = getStyle( div );
10207  // round value for browser zoom. desandro/masonry#928
10208  isBoxSizeOuter = Math.round( getStyleSize( style.width ) ) == 200;
10209  getSize.isBoxSizeOuter = isBoxSizeOuter;
10210
10211  body.removeChild( div );
10212}
10213
10214// -------------------------- getSize -------------------------- //
10215
10216function getSize( elem ) {
10217  setup();
10218
10219  // use querySeletor if elem is string
10220  if ( typeof elem == 'string' ) {
10221    elem = document.querySelector( elem );
10222  }
10223
10224  // do not proceed on non-objects
10225  if ( !elem || typeof elem != 'object' || !elem.nodeType ) {
10226    return;
10227  }
10228
10229  var style = getStyle( elem );
10230
10231  // if hidden, everything is 0
10232  if ( style.display == 'none' ) {
10233    return getZeroSize();
10234  }
10235
10236  var size = {};
10237  size.width = elem.offsetWidth;
10238  size.height = elem.offsetHeight;
10239
10240  var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';
10241
10242  // get all measurements
10243  for ( var i=0; i < measurementsLength; i++ ) {
10244    var measurement = measurements[i];
10245    var value = style[ measurement ];
10246    var num = parseFloat( value );
10247    // any 'auto', 'medium' value will be 0
10248    size[ measurement ] = !isNaN( num ) ? num : 0;
10249  }
10250
10251  var paddingWidth = size.paddingLeft + size.paddingRight;
10252  var paddingHeight = size.paddingTop + size.paddingBottom;
10253  var marginWidth = size.marginLeft + size.marginRight;
10254  var marginHeight = size.marginTop + size.marginBottom;
10255  var borderWidth = size.borderLeftWidth + size.borderRightWidth;
10256  var borderHeight = size.borderTopWidth + size.borderBottomWidth;
10257
10258  var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;
10259
10260  // overwrite width and height if we can get it from style
10261  var styleWidth = getStyleSize( style.width );
10262  if ( styleWidth !== false ) {
10263    size.width = styleWidth +
10264      // add padding and border unless it's already including it
10265      ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );
10266  }
10267
10268  var styleHeight = getStyleSize( style.height );
10269  if ( styleHeight !== false ) {
10270    size.height = styleHeight +
10271      // add padding and border unless it's already including it
10272      ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );
10273  }
10274
10275  size.innerWidth = size.width - ( paddingWidth + borderWidth );
10276  size.innerHeight = size.height - ( paddingHeight + borderHeight );
10277
10278  size.outerWidth = size.width + marginWidth;
10279  size.outerHeight = size.height + marginHeight;
10280
10281  return size;
10282}
10283
10284return getSize;
10285
10286});
10287
10288},{}],32:[function(require,module,exports){
10289/*!
10290 * Isotope v3.0.6
10291 *
10292 * Licensed GPLv3 for open source use
10293 * or Isotope Commercial License for commercial use
10294 *
10295 * https://isotope.metafizzy.co
10296 * Copyright 2010-2018 Metafizzy
10297 */
10298
10299( function( window, factory ) {
10300  // universal module definition
10301  /* jshint strict: false */ /*globals define, module, require */
10302  if ( typeof define == 'function' && define.amd ) {
10303    // AMD
10304    define( [
10305        'outlayer/outlayer',
10306        'get-size/get-size',
10307        'desandro-matches-selector/matches-selector',
10308        'fizzy-ui-utils/utils',
10309        './item',
10310        './layout-mode',
10311        // include default layout modes
10312        './layout-modes/masonry',
10313        './layout-modes/fit-rows',
10314        './layout-modes/vertical'
10315      ],
10316      function( Outlayer, getSize, matchesSelector, utils, Item, LayoutMode ) {
10317        return factory( window, Outlayer, getSize, matchesSelector, utils, Item, LayoutMode );
10318      });
10319  } else if ( typeof module == 'object' && module.exports ) {
10320    // CommonJS
10321    module.exports = factory(
10322      window,
10323      require('outlayer'),
10324      require('get-size'),
10325      require('desandro-matches-selector'),
10326      require('fizzy-ui-utils'),
10327      require('./item'),
10328      require('./layout-mode'),
10329      // include default layout modes
10330      require('./layout-modes/masonry'),
10331      require('./layout-modes/fit-rows'),
10332      require('./layout-modes/vertical')
10333    );
10334  } else {
10335    // browser global
10336    window.Isotope = factory(
10337      window,
10338      window.Outlayer,
10339      window.getSize,
10340      window.matchesSelector,
10341      window.fizzyUIUtils,
10342      window.Isotope.Item,
10343      window.Isotope.LayoutMode
10344    );
10345  }
10346
10347}( window, function factory( window, Outlayer, getSize, matchesSelector, utils,
10348  Item, LayoutMode ) {
10349
10350'use strict';
vendor: 15,771 bytes, lines 10350-10910
10350
10351
10352// -------------------------- vars -------------------------- //
10353
10354var jQuery = window.jQuery;
10355
10356// -------------------------- helpers -------------------------- //
10357
10358var trim = String.prototype.trim ?
10359  function( str ) {
10360    return str.trim();
10361  } :
10362  function( str ) {
10363    return str.replace( /^\s+|\s+$/g, '' );
10364  };
10365
10366// -------------------------- isotopeDefinition -------------------------- //
10367
10368  // create an Outlayer layout class
10369  var Isotope = Outlayer.create( 'isotope', {
10370    layoutMode: 'masonry',
10371    isJQueryFiltering: true,
10372    sortAscending: true
10373  });
10374
10375  Isotope.Item = Item;
10376  Isotope.LayoutMode = LayoutMode;
10377
10378  var proto = Isotope.prototype;
10379
10380  proto._create = function() {
10381    this.itemGUID = 0;
10382    // functions that sort items
10383    this._sorters = {};
10384    this._getSorters();
10385    // call super
10386    Outlayer.prototype._create.call( this );
10387
10388    // create layout modes
10389    this.modes = {};
10390    // start filteredItems with all items
10391    this.filteredItems = this.items;
10392    // keep of track of sortBys
10393    this.sortHistory = [ 'original-order' ];
10394    // create from registered layout modes
10395    for ( var name in LayoutMode.modes ) {
10396      this._initLayoutMode( name );
10397    }
10398  };
10399
10400  proto.reloadItems = function() {
10401    // reset item ID counter
10402    this.itemGUID = 0;
10403    // call super
10404    Outlayer.prototype.reloadItems.call( this );
10405  };
10406
10407  proto._itemize = function() {
10408    var items = Outlayer.prototype._itemize.apply( this, arguments );
10409    // assign ID for original-order
10410    for ( var i=0; i < items.length; i++ ) {
10411      var item = items[i];
10412      item.id = this.itemGUID++;
10413    }
10414    this._updateItemsSortData( items );
10415    return items;
10416  };
10417
10418
10419  // -------------------------- layout -------------------------- //
10420
10421  proto._initLayoutMode = function( name ) {
10422    var Mode = LayoutMode.modes[ name ];
10423    // set mode options
10424    // HACK extend initial options, back-fill in default options
10425    var initialOpts = this.options[ name ] || {};
10426    this.options[ name ] = Mode.options ?
10427      utils.extend( Mode.options, initialOpts ) : initialOpts;
10428    // init layout mode instance
10429    this.modes[ name ] = new Mode( this );
10430  };
10431
10432
10433  proto.layout = function() {
10434    // if first time doing layout, do all magic
10435    if ( !this._isLayoutInited && this._getOption('initLayout') ) {
10436      this.arrange();
10437      return;
10438    }
10439    this._layout();
10440  };
10441
10442  // private method to be used in layout() & magic()
10443  proto._layout = function() {
10444    // don't animate first layout
10445    var isInstant = this._getIsInstant();
10446    // layout flow
10447    this._resetLayout();
10448    this._manageStamps();
10449    this.layoutItems( this.filteredItems, isInstant );
10450
10451    // flag for initalized
10452    this._isLayoutInited = true;
10453  };
10454
10455  // filter + sort + layout
10456  proto.arrange = function( opts ) {
10457    // set any options pass
10458    this.option( opts );
10459    this._getIsInstant();
10460    // filter, sort, and layout
10461
10462    // filter
10463    var filtered = this._filter( this.items );
10464    this.filteredItems = filtered.matches;
10465
10466    this._bindArrangeComplete();
10467
10468    if ( this._isInstant ) {
10469      this._noTransition( this._hideReveal, [ filtered ] );
10470    } else {
10471      this._hideReveal( filtered );
10472    }
10473
10474    this._sort();
10475    this._layout();
10476  };
10477  // alias to _init for main plugin method
10478  proto._init = proto.arrange;
10479
10480  proto._hideReveal = function( filtered ) {
10481    this.reveal( filtered.needReveal );
10482    this.hide( filtered.needHide );
10483  };
10484
10485  // HACK
10486  // Don't animate/transition first layout
10487  // Or don't animate/transition other layouts
10488  proto._getIsInstant = function() {
10489    var isLayoutInstant = this._getOption('layoutInstant');
10490    var isInstant = isLayoutInstant !== undefined ? isLayoutInstant :
10491      !this._isLayoutInited;
10492    this._isInstant = isInstant;
10493    return isInstant;
10494  };
10495
10496  // listen for layoutComplete, hideComplete and revealComplete
10497  // to trigger arrangeComplete
10498  proto._bindArrangeComplete = function() {
10499    // listen for 3 events to trigger arrangeComplete
10500    var isLayoutComplete, isHideComplete, isRevealComplete;
10501    var _this = this;
10502    function arrangeParallelCallback() {
10503      if ( isLayoutComplete && isHideComplete && isRevealComplete ) {
10504        _this.dispatchEvent( 'arrangeComplete', null, [ _this.filteredItems ] );
10505      }
10506    }
10507    this.once( 'layoutComplete', function() {
10508      isLayoutComplete = true;
10509      arrangeParallelCallback();
10510    });
10511    this.once( 'hideComplete', function() {
10512      isHideComplete = true;
10513      arrangeParallelCallback();
10514    });
10515    this.once( 'revealComplete', function() {
10516      isRevealComplete = true;
10517      arrangeParallelCallback();
10518    });
10519  };
10520
10521  // -------------------------- filter -------------------------- //
10522
10523  proto._filter = function( items ) {
10524    var filter = this.options.filter;
10525    filter = filter || '*';
10526    var matches = [];
10527    var hiddenMatched = [];
10528    var visibleUnmatched = [];
10529
10530    var test = this._getFilterTest( filter );
10531
10532    // test each item
10533    for ( var i=0; i < items.length; i++ ) {
10534      var item = items[i];
10535      if ( item.isIgnored ) {
10536        continue;
10537      }
10538      // add item to either matched or unmatched group
10539      var isMatched = test( item );
10540      // item.isFilterMatched = isMatched;
10541      // add to matches if its a match
10542      if ( isMatched ) {
10543        matches.push( item );
10544      }
10545      // add to additional group if item needs to be hidden or revealed
10546      if ( isMatched && item.isHidden ) {
10547        hiddenMatched.push( item );
10548      } else if ( !isMatched && !item.isHidden ) {
10549        visibleUnmatched.push( item );
10550      }
10551    }
10552
10553    // return collections of items to be manipulated
10554    return {
10555      matches: matches,
10556      needReveal: hiddenMatched,
10557      needHide: visibleUnmatched
10558    };
10559  };
10560
10561  // get a jQuery, function, or a matchesSelector test given the filter
10562  proto._getFilterTest = function( filter ) {
10563    if ( jQuery && this.options.isJQueryFiltering ) {
10564      // use jQuery
10565      return function( item ) {
10566        return jQuery( item.element ).is( filter );
10567      };
10568    }
10569    if ( typeof filter == 'function' ) {
10570      // use filter as function
10571      return function( item ) {
10572        return filter( item.element );
10573      };
10574    }
10575    // default, use filter as selector string
10576    return function( item ) {
10577      return matchesSelector( item.element, filter );
10578    };
10579  };
10580
10581  // -------------------------- sorting -------------------------- //
10582
10583  /**
10584   * @params {Array} elems
10585   * @public
10586   */
10587  proto.updateSortData = function( elems ) {
10588    // get items
10589    var items;
10590    if ( elems ) {
10591      elems = utils.makeArray( elems );
10592      items = this.getItems( elems );
10593    } else {
10594      // update all items if no elems provided
10595      items = this.items;
10596    }
10597
10598    this._getSorters();
10599    this._updateItemsSortData( items );
10600  };
10601
10602  proto._getSorters = function() {
10603    var getSortData = this.options.getSortData;
10604    for ( var key in getSortData ) {
10605      var sorter = getSortData[ key ];
10606      this._sorters[ key ] = mungeSorter( sorter );
10607    }
10608  };
10609
10610  /**
10611   * @params {Array} items - of Isotope.Items
10612   * @private
10613   */
10614  proto._updateItemsSortData = function( items ) {
10615    // do not update if no items
10616    var len = items && items.length;
10617
10618    for ( var i=0; len && i < len; i++ ) {
10619      var item = items[i];
10620      item.updateSortData();
10621    }
10622  };
10623
10624  // ----- munge sorter ----- //
10625
10626  // encapsulate this, as we just need mungeSorter
10627  // other functions in here are just for munging
10628  var mungeSorter = ( function() {
10629    // add a magic layer to sorters for convienent shorthands
10630    // `.foo-bar` will use the text of .foo-bar querySelector
10631    // `[foo-bar]` will use attribute
10632    // you can also add parser
10633    // `.foo-bar parseInt` will parse that as a number
10634    function mungeSorter( sorter ) {
10635      // if not a string, return function or whatever it is
10636      if ( typeof sorter != 'string' ) {
10637        return sorter;
10638      }
10639      // parse the sorter string
10640      var args = trim( sorter ).split(' ');
10641      var query = args[0];
10642      // check if query looks like [an-attribute]
10643      var attrMatch = query.match( /^\[(.+)\]$/ );
10644      var attr = attrMatch && attrMatch[1];
10645      var getValue = getValueGetter( attr, query );
10646      // use second argument as a parser
10647      var parser = Isotope.sortDataParsers[ args[1] ];
10648      // parse the value, if there was a parser
10649      sorter = parser ? function( elem ) {
10650        return elem && parser( getValue( elem ) );
10651      } :
10652      // otherwise just return value
10653      function( elem ) {
10654        return elem && getValue( elem );
10655      };
10656
10657      return sorter;
10658    }
10659
10660    // get an attribute getter, or get text of the querySelector
10661    function getValueGetter( attr, query ) {
10662      // if query looks like [foo-bar], get attribute
10663      if ( attr ) {
10664        return function getAttribute( elem ) {
10665          return elem.getAttribute( attr );
10666        };
10667      }
10668
10669      // otherwise, assume its a querySelector, and get its text
10670      return function getChildText( elem ) {
10671        var child = elem.querySelector( query );
10672        return child && child.textContent;
10673      };
10674    }
10675
10676    return mungeSorter;
10677  })();
10678
10679  // parsers used in getSortData shortcut strings
10680  Isotope.sortDataParsers = {
10681    'parseInt': function( val ) {
10682      return parseInt( val, 10 );
10683    },
10684    'parseFloat': function( val ) {
10685      return parseFloat( val );
10686    }
10687  };
10688
10689  // ----- sort method ----- //
10690
10691  // sort filteredItem order
10692  proto._sort = function() {
10693    if ( !this.options.sortBy ) {
10694      return;
10695    }
10696    // keep track of sortBy History
10697    var sortBys = utils.makeArray( this.options.sortBy );
10698    if ( !this._getIsSameSortBy( sortBys ) ) {
10699      // concat all sortBy and sortHistory, add to front, oldest goes in last
10700      this.sortHistory = sortBys.concat( this.sortHistory );
10701    }
10702    // sort magic
10703    var itemSorter = getItemSorter( this.sortHistory, this.options.sortAscending );
10704    this.filteredItems.sort( itemSorter );
10705  };
10706
10707  // check if sortBys is same as start of sortHistory
10708  proto._getIsSameSortBy = function( sortBys ) {
10709    for ( var i=0; i < sortBys.length; i++ ) {
10710      if ( sortBys[i] != this.sortHistory[i] ) {
10711        return false;
10712      }
10713    }
10714    return true;
10715  };
10716
10717  // returns a function used for sorting
10718  function getItemSorter( sortBys, sortAsc ) {
10719    return function sorter( itemA, itemB ) {
10720      // cycle through all sortKeys
10721      for ( var i = 0; i < sortBys.length; i++ ) {
10722        var sortBy = sortBys[i];
10723        var a = itemA.sortData[ sortBy ];
10724        var b = itemB.sortData[ sortBy ];
10725        if ( a > b || a < b ) {
10726          // if sortAsc is an object, use the value given the sortBy key
10727          var isAscending = sortAsc[ sortBy ] !== undefined ? sortAsc[ sortBy ] : sortAsc;
10728          var direction = isAscending ? 1 : -1;
10729          return ( a > b ? 1 : -1 ) * direction;
10730        }
10731      }
10732      return 0;
10733    };
10734  }
10735
10736  // -------------------------- methods -------------------------- //
10737
10738  // get layout mode
10739  proto._mode = function() {
10740    var layoutMode = this.options.layoutMode;
10741    var mode = this.modes[ layoutMode ];
10742    if ( !mode ) {
10743      // TODO console.error
10744      throw new Error( 'No layout mode: ' + layoutMode );
10745    }
10746    // HACK sync mode's options
10747    // any options set after init for layout mode need to be synced
10748    mode.options = this.options[ layoutMode ];
10749    return mode;
10750  };
10751
10752  proto._resetLayout = function() {
10753    // trigger original reset layout
10754    Outlayer.prototype._resetLayout.call( this );
10755    this._mode()._resetLayout();
10756  };
10757
10758  proto._getItemLayoutPosition = function( item  ) {
10759    return this._mode()._getItemLayoutPosition( item );
10760  };
10761
10762  proto._manageStamp = function( stamp ) {
10763    this._mode()._manageStamp( stamp );
10764  };
10765
10766  proto._getContainerSize = function() {
10767    return this._mode()._getContainerSize();
10768  };
10769
10770  proto.needsResizeLayout = function() {
10771    return this._mode().needsResizeLayout();
10772  };
10773
10774  // -------------------------- adding & removing -------------------------- //
10775
10776  // HEADS UP overwrites default Outlayer appended
10777  proto.appended = function( elems ) {
10778    var items = this.addItems( elems );
10779    if ( !items.length ) {
10780      return;
10781    }
10782    // filter, layout, reveal new items
10783    var filteredItems = this._filterRevealAdded( items );
10784    // add to filteredItems
10785    this.filteredItems = this.filteredItems.concat( filteredItems );
10786  };
10787
10788  // HEADS UP overwrites default Outlayer prepended
10789  proto.prepended = function( elems ) {
10790    var items = this._itemize( elems );
10791    if ( !items.length ) {
10792      return;
10793    }
10794    // start new layout
10795    this._resetLayout();
10796    this._manageStamps();
10797    // filter, layout, reveal new items
10798    var filteredItems = this._filterRevealAdded( items );
10799    // layout previous items
10800    this.layoutItems( this.filteredItems );
10801    // add to items and filteredItems
10802    this.filteredItems = filteredItems.concat( this.filteredItems );
10803    this.items = items.concat( this.items );
10804  };
10805
10806  proto._filterRevealAdded = function( items ) {
10807    var filtered = this._filter( items );
10808    this.hide( filtered.needHide );
10809    // reveal all new items
10810    this.reveal( filtered.matches );
10811    // layout new items, no transition
10812    this.layoutItems( filtered.matches, true );
10813    return filtered.matches;
10814  };
10815
10816  /**
10817   * Filter, sort, and layout newly-appended item elements
10818   * @param {Array or NodeList or Element} elems
10819   */
10820  proto.insert = function( elems ) {
10821    var items = this.addItems( elems );
10822    if ( !items.length ) {
10823      return;
10824    }
10825    // append item elements
10826    var i, item;
10827    var len = items.length;
10828    for ( i=0; i < len; i++ ) {
10829      item = items[i];
10830      this.element.appendChild( item.element );
10831    }
10832    // filter new stuff
10833    var filteredInsertItems = this._filter( items ).matches;
10834    // set flag
10835    for ( i=0; i < len; i++ ) {
10836      items[i].isLayoutInstant = true;
10837    }
10838    this.arrange();
10839    // reset flag
10840    for ( i=0; i < len; i++ ) {
10841      delete items[i].isLayoutInstant;
10842    }
10843    this.reveal( filteredInsertItems );
10844  };
10845
10846  var _remove = proto.remove;
10847  proto.remove = function( elems ) {
10848    elems = utils.makeArray( elems );
10849    var removeItems = this.getItems( elems );
10850    // do regular thing
10851    _remove.call( this, elems );
10852    // bail if no items to remove
10853    var len = removeItems && removeItems.length;
10854    // remove elems from filteredItems
10855    for ( var i=0; len && i < len; i++ ) {
10856      var item = removeItems[i];
10857      // remove item from collection
10858      utils.removeFrom( this.filteredItems, item );
10859    }
10860  };
10861
10862  proto.shuffle = function() {
10863    // update random sortData
10864    for ( var i=0; i < this.items.length; i++ ) {
10865      var item = this.items[i];
10866      item.sortData.random = Math.random();
10867    }
10868    this.options.sortBy = 'random';
10869    this._sort();
10870    this._layout();
10871  };
10872
10873  /**
10874   * trigger fn without transition
10875   * kind of hacky to have this in the first place
10876   * @param {Function} fn
10877   * @param {Array} args
10878   * @returns ret
10879   * @private
10880   */
10881  proto._noTransition = function( fn, args ) {
10882    // save transitionDuration before disabling
10883    var transitionDuration = this.options.transitionDuration;
10884    // disable transition
10885    this.options.transitionDuration = 0;
10886    // do it
10887    var returnValue = fn.apply( this, args );
10888    // re-enable transition for reveal
10889    this.options.transitionDuration = transitionDuration;
10890    return returnValue;
10891  };
10892
10893  // ----- helper methods ----- //
10894
10895  /**
10896   * getter method for getting filtered item elements
10897   * @returns {Array} elems - collection of item elements
10898   */
10899  proto.getFilteredItemElements = function() {
10900    return this.filteredItems.map( function( item ) {
10901      return item.element;
10902    });
10903  };
10904
10905  // -----  ----- //
10906
10907  return Isotope;
10908
10909}));
10910
vendor: 8,474 bytes, lines 10911-11255
10911},{"./item":33,"./layout-mode":34,"./layout-modes/fit-rows":35,"./layout-modes/masonry":36,"./layout-modes/vertical":37,"desandro-matches-selector":27,"fizzy-ui-utils":30,"get-size":31,"outlayer":41}],33:[function(require,module,exports){
10912/**
10913 * Isotope Item
10914**/
10915
10916( function( window, factory ) {
10917  // universal module definition
10918  /* jshint strict: false */ /*globals define, module, require */
10919  if ( typeof define == 'function' && define.amd ) {
10920    // AMD
10921    define( [
10922        'outlayer/outlayer'
10923      ],
10924      factory );
10925  } else if ( typeof module == 'object' && module.exports ) {
10926    // CommonJS
10927    module.exports = factory(
10928      require('outlayer')
10929    );
10930  } else {
10931    // browser global
10932    window.Isotope = window.Isotope || {};
10933    window.Isotope.Item = factory(
10934      window.Outlayer
10935    );
10936  }
10937
10938}( window, function factory( Outlayer ) {
10939'use strict';
10940
10941// -------------------------- Item -------------------------- //
10942
10943// sub-class Outlayer Item
10944function Item() {
10945  Outlayer.Item.apply( this, arguments );
10946}
10947
10948var proto = Item.prototype = Object.create( Outlayer.Item.prototype );
10949
10950var _create = proto._create;
10951proto._create = function() {
10952  // assign id, used for original-order sorting
10953  this.id = this.layout.itemGUID++;
10954  _create.call( this );
10955  this.sortData = {};
10956};
10957
10958proto.updateSortData = function() {
10959  if ( this.isIgnored ) {
10960    return;
10961  }
10962  // default sorters
10963  this.sortData.id = this.id;
10964  // for backward compatibility
10965  this.sortData['original-order'] = this.id;
10966  this.sortData.random = Math.random();
10967  // go thru getSortData obj and apply the sorters
10968  var getSortData = this.layout.options.getSortData;
10969  var sorters = this.layout._sorters;
10970  for ( var key in getSortData ) {
10971    var sorter = sorters[ key ];
10972    this.sortData[ key ] = sorter( this.element, this );
10973  }
10974};
10975
10976var _destroy = proto.destroy;
10977proto.destroy = function() {
10978  // call super
10979  _destroy.apply( this, arguments );
10980  // reset display, #741
10981  this.css({
10982    display: ''
10983  });
10984};
10985
10986return Item;
10987
10988}));
10989
10990},{"outlayer":41}],34:[function(require,module,exports){
10991/**
10992 * Isotope LayoutMode
10993 */
10994
10995( function( window, factory ) {
10996  // universal module definition
10997  /* jshint strict: false */ /*globals define, module, require */
10998  if ( typeof define == 'function' && define.amd ) {
10999    // AMD
11000    define( [
11001        'get-size/get-size',
11002        'outlayer/outlayer'
11003      ],
11004      factory );
11005  } else if ( typeof module == 'object' && module.exports ) {
11006    // CommonJS
11007    module.exports = factory(
11008      require('get-size'),
11009      require('outlayer')
11010    );
11011  } else {
11012    // browser global
11013    window.Isotope = window.Isotope || {};
11014    window.Isotope.LayoutMode = factory(
11015      window.getSize,
11016      window.Outlayer
11017    );
11018  }
11019
11020}( window, function factory( getSize, Outlayer ) {
11021  'use strict';
11022
11023  // layout mode class
11024  function LayoutMode( isotope ) {
11025    this.isotope = isotope;
11026    // link properties
11027    if ( isotope ) {
11028      this.options = isotope.options[ this.namespace ];
11029      this.element = isotope.element;
11030      this.items = isotope.filteredItems;
11031      this.size = isotope.size;
11032    }
11033  }
11034
11035  var proto = LayoutMode.prototype;
11036
11037  /**
11038   * some methods should just defer to default Outlayer method
11039   * and reference the Isotope instance as `this`
11040  **/
11041  var facadeMethods = [
11042    '_resetLayout',
11043    '_getItemLayoutPosition',
11044    '_manageStamp',
11045    '_getContainerSize',
11046    '_getElementOffset',
11047    'needsResizeLayout',
11048    '_getOption'
11049  ];
11050
11051  facadeMethods.forEach( function( methodName ) {
11052    proto[ methodName ] = function() {
11053      return Outlayer.prototype[ methodName ].apply( this.isotope, arguments );
11054    };
11055  });
11056
11057  // -----  ----- //
11058
11059  // for horizontal layout modes, check vertical size
11060  proto.needsVerticalResizeLayout = function() {
11061    // don't trigger if size did not change
11062    var size = getSize( this.isotope.element );
11063    // check that this.size and size are there
11064    // IE8 triggers resize on body size change, so they might not be
11065    var hasSizes = this.isotope.size && size;
11066    return hasSizes && size.innerHeight != this.isotope.size.innerHeight;
11067  };
11068
11069  // ----- measurements ----- //
11070
11071  proto._getMeasurement = function() {
11072    this.isotope._getMeasurement.apply( this, arguments );
11073  };
11074
11075  proto.getColumnWidth = function() {
11076    this.getSegmentSize( 'column', 'Width' );
11077  };
11078
11079  proto.getRowHeight = function() {
11080    this.getSegmentSize( 'row', 'Height' );
11081  };
11082
11083  /**
11084   * get columnWidth or rowHeight
11085   * segment: 'column' or 'row'
11086   * size 'Width' or 'Height'
11087  **/
11088  proto.getSegmentSize = function( segment, size ) {
11089    var segmentName = segment + size;
11090    var outerSize = 'outer' + size;
11091    // columnWidth / outerWidth // rowHeight / outerHeight
11092    this._getMeasurement( segmentName, outerSize );
11093    // got rowHeight or columnWidth, we can chill
11094    if ( this[ segmentName ] ) {
11095      return;
11096    }
11097    // fall back to item of first element
11098    var firstItemSize = this.getFirstItemSize();
11099    this[ segmentName ] = firstItemSize && firstItemSize[ outerSize ] ||
11100      // or size of container
11101      this.isotope.size[ 'inner' + size ];
11102  };
11103
11104  proto.getFirstItemSize = function() {
11105    var firstItem = this.isotope.filteredItems[0];
11106    return firstItem && firstItem.element && getSize( firstItem.element );
11107  };
11108
11109  // ----- methods that should reference isotope ----- //
11110
11111  proto.layout = function() {
11112    this.isotope.layout.apply( this.isotope, arguments );
11113  };
11114
11115  proto.getSize = function() {
11116    this.isotope.getSize();
11117    this.size = this.isotope.size;
11118  };
11119
11120  // -------------------------- create -------------------------- //
11121
11122  LayoutMode.modes = {};
11123
11124  LayoutMode.create = function( namespace, options ) {
11125
11126    function Mode() {
11127      LayoutMode.apply( this, arguments );
11128    }
11129
11130    Mode.prototype = Object.create( proto );
11131    Mode.prototype.constructor = Mode;
11132
11133    // default options
11134    if ( options ) {
11135      Mode.options = options;
11136    }
11137
11138    Mode.prototype.namespace = namespace;
11139    // register in Isotope
11140    LayoutMode.modes[ namespace ] = Mode;
11141
11142    return Mode;
11143  };
11144
11145  return LayoutMode;
11146
11147}));
11148
11149},{"get-size":31,"outlayer":41}],35:[function(require,module,exports){
11150/**
11151 * fitRows layout mode
11152 */
11153
11154( function( window, factory ) {
11155  // universal module definition
11156  /* jshint strict: false */ /*globals define, module, require */
11157  if ( typeof define == 'function' && define.amd ) {
11158    // AMD
11159    define( [
11160        '../layout-mode'
11161      ],
11162      factory );
11163  } else if ( typeof exports == 'object' ) {
11164    // CommonJS
11165    module.exports = factory(
11166      require('../layout-mode')
11167    );
11168  } else {
11169    // browser global
11170    factory(
11171      window.Isotope.LayoutMode
11172    );
11173  }
11174
11175}( window, function factory( LayoutMode ) {
11176'use strict';
11177
11178var FitRows = LayoutMode.create('fitRows');
11179
11180var proto = FitRows.prototype;
11181
11182proto._resetLayout = function() {
11183  this.x = 0;
11184  this.y = 0;
11185  this.maxY = 0;
11186  this._getMeasurement( 'gutter', 'outerWidth' );
11187};
11188
11189proto._getItemLayoutPosition = function( item ) {
11190  item.getSize();
11191
11192  var itemWidth = item.size.outerWidth + this.gutter;
11193  // if this element cannot fit in the current row
11194  var containerWidth = this.isotope.size.innerWidth + this.gutter;
11195  if ( this.x !== 0 && itemWidth + this.x > containerWidth ) {
11196    this.x = 0;
11197    this.y = this.maxY;
11198  }
11199
11200  var position = {
11201    x: this.x,
11202    y: this.y
11203  };
11204
11205  this.maxY = Math.max( this.maxY, this.y + item.size.outerHeight );
11206  this.x += itemWidth;
11207
11208  return position;
11209};
11210
11211proto._getContainerSize = function() {
11212  return { height: this.maxY };
11213};
11214
11215return FitRows;
11216
11217}));
11218
11219},{"../layout-mode":34}],36:[function(require,module,exports){
11220/*!
11221 * Masonry layout mode
11222 * sub-classes Masonry
11223 * https://masonry.desandro.com
11224 */
11225
11226( function( window, factory ) {
11227  // universal module definition
11228  /* jshint strict: false */ /*globals define, module, require */
11229  if ( typeof define == 'function' && define.amd ) {
11230    // AMD
11231    define( [
11232        '../layout-mode',
11233        'masonry-layout/masonry'
11234      ],
11235      factory );
11236  } else if ( typeof module == 'object' && module.exports ) {
11237    // CommonJS
11238    module.exports = factory(
11239      require('../layout-mode'),
11240      require('masonry-layout')
11241    );
11242  } else {
11243    // browser global
11244    factory(
11245      window.Isotope.LayoutMode,
11246      window.Masonry
11247    );
11248  }
11249
11250}( window, function factory( LayoutMode, Masonry ) {
11251'use strict';
11252
11253// -------------------------- masonryDefinition -------------------------- //
11254
11255  // create an Outlayer layout class
11256  var MasonryMode = LayoutMode.create('masonry');
11257
11258  var proto = MasonryMode.prototype;
11259
11260  var keepModeMethods = {
11261    _getElementOffset: true,
11262    layout: true,
11263    _getMeasurement: true
11264  };
11265
11266  // inherit Masonry prototype
11267  for ( var method in Masonry.prototype ) {
11268    // do not inherit mode methods
11269    if ( !keepModeMethods[ method ] ) {
11270      proto[ method ] = Masonry.prototype[ method ];
11271    }
11272  }
11273
11274  var measureColumns = proto.measureColumns;
11275  proto.measureColumns = function() {
11276    // set items, used if measuring first item
11277    this.items = this.isotope.filteredItems;
11278    measureColumns.call( this );
11279  };
11280
11281  // point to mode options for fitWidth
11282  var _getOption = proto._getOption;
11283  proto._getOption = function( option ) {
11284    if ( option == 'fitWidth' ) {
11285      return this.options.isFitWidth !== undefined ?
11286        this.options.isFitWidth : this.options.fitWidth;
11287    }
11288    return _getOption.apply( this.isotope, arguments );
11289  };
11290
11291  return MasonryMode;
11292
11293}));
11294
11295},{"../layout-mode":34,"masonry-layout":39}],37:[function(require,module,exports){
11296/**
11297 * vertical layout mode
11298 */
11299
11300( function( window, factory ) {
11301  // universal module definition
11302  /* jshint strict: false */ /*globals define, module, require */
11303  if ( typeof define == 'function' && define.amd ) {
11304    // AMD
11305    define( [
11306        '../layout-mode'
11307      ],
11308      factory );
11309  } else if ( typeof module == 'object' && module.exports ) {
11310    // CommonJS
11311    module.exports = factory(
11312      require('../layout-mode')
11313    );
11314  } else {
11315    // browser global
11316    factory(
11317      window.Isotope.LayoutMode
11318    );
11319  }
11320
11321}( window, function factory( LayoutMode ) {
11322'use strict';
11323
11324var Vertical = LayoutMode.create( 'vertical', {
11325  horizontalAlignment: 0
11326});
11327
11328var proto = Vertical.prototype;
11329
11330proto._resetLayout = function() {
11331  this.y = 0;
11332};
11333
11334proto._getItemLayoutPosition = function( item ) {
11335  item.getSize();
11336  var x = ( this.isotope.size.innerWidth - item.size.outerWidth ) *
11337    this.options.horizontalAlignment;
11338  var y = this.y;
11339  this.y += item.size.outerHeight;
11340  return { x: x, y: y };
11341};
11342
11343proto._getContainerSize = function() {
11344  return { height: this.y };
11345};
11346
11347return Vertical;
11348
11349}));
11350
11351},{"../layout-mode":34}],38:[function(require,module,exports){
11352/*!
11353 * jQuery JavaScript Library v3.6.1
11354 * https://jquery.com/
11355 *
11356 * Includes Sizzle.js
11357 * https://sizzlejs.com/
11358 *
11359 * Copyright OpenJS Foundation and other contributors
11360 * Released under the MIT license
11361 * https://jquery.org/license
11362 *
11363 * Date: 2022-08-26T17:52Z
11364 */
11365( function( global, factory ) {
11366
11367	"use strict";
11368
11369	if ( typeof module === "object" && typeof module.exports === "object" ) {
11370
11371		// For CommonJS and CommonJS-like environments where a proper `window`
11372		// is present, execute the factory and get jQuery.
11373		// For environments that do not have a `window` with a `document`
11374		// (such as Node.js), expose a factory as module.exports.
11375		// This accentuates the need for the creation of a real `window`.
11376		// e.g. var jQuery = require("jquery")(window);
11377		// See ticket trac-14549 for more info.
11378		module.exports = global.document ?
11379			factory( global, true ) :
11380			function( w ) {
11381				if ( !w.document ) {
11382					throw new Error( "jQuery requires a window with a document" );
11383				}
11384				return factory( w );
11385			};
11386	} else {
11387		factory( global );
11388	}
11389
11390// Pass this if window is not defined yet
11391} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
11392
11393// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
11394// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
11395// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
11396// enough that all such attempts are guarded in a try block.
11397"use strict";
11398
11399var arr = [];
11400
11401var getProto = Object.getPrototypeOf;
11402
11403var slice = arr.slice;
11404
11405var flat = arr.flat ? function( array ) {
11406	return arr.flat.call( array );
11407} : function( array ) {
11408	return arr.concat.apply( [], array );
11409};
11410
11411
11412var push = arr.push;
11413
11414var indexOf = arr.indexOf;
11415
11416var class2type = {};
11417
11418var toString = class2type.toString;
11419
11420var hasOwn = class2type.hasOwnProperty;
11421
11422var fnToString = hasOwn.toString;
11423
11424var ObjectFunctionString = fnToString.call( Object );
11425
11426var support = {};
11427
11428var isFunction = function isFunction( obj ) {
11429
vendor: 9,428 bytes, lines 11430-11820
11430		// Support: Chrome <=57, Firefox <=52
11431		// In some browsers, typeof returns "function" for HTML <object> elements
11432		// (i.e., `typeof document.createElement( "object" ) === "function"`).
11433		// We don't want to classify *any* DOM node as a function.
11434		// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
11435		// Plus for old WebKit, typeof returns "function" for HTML collections
11436		// (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
11437		return typeof obj === "function" && typeof obj.nodeType !== "number" &&
11438			typeof obj.item !== "function";
11439	};
11440
11441
11442var isWindow = function isWindow( obj ) {
11443		return obj != null && obj === obj.window;
11444	};
11445
11446
11447var document = window.document;
11448
11449
11450
11451	var preservedScriptAttributes = {
11452		type: true,
11453		src: true,
11454		nonce: true,
11455		noModule: true
11456	};
11457
11458	function DOMEval( code, node, doc ) {
11459		doc = doc || document;
11460
11461		var i, val,
11462			script = doc.createElement( "script" );
11463
11464		script.text = code;
11465		if ( node ) {
11466			for ( i in preservedScriptAttributes ) {
11467
11468				// Support: Firefox 64+, Edge 18+
11469				// Some browsers don't support the "nonce" property on scripts.
11470				// On the other hand, just using `getAttribute` is not enough as
11471				// the `nonce` attribute is reset to an empty string whenever it
11472				// becomes browsing-context connected.
11473				// See https://github.com/whatwg/html/issues/2369
11474				// See https://html.spec.whatwg.org/#nonce-attributes
11475				// The `node.getAttribute` check was added for the sake of
11476				// `jQuery.globalEval` so that it can fake a nonce-containing node
11477				// via an object.
11478				val = node[ i ] || node.getAttribute && node.getAttribute( i );
11479				if ( val ) {
11480					script.setAttribute( i, val );
11481				}
11482			}
11483		}
11484		doc.head.appendChild( script ).parentNode.removeChild( script );
11485	}
11486
11487
11488function toType( obj ) {
11489	if ( obj == null ) {
11490		return obj + "";
11491	}
11492
11493	// Support: Android <=2.3 only (functionish RegExp)
11494	return typeof obj === "object" || typeof obj === "function" ?
11495		class2type[ toString.call( obj ) ] || "object" :
11496		typeof obj;
11497}
11498/* global Symbol */
11499// Defining this global in .eslintrc.json would create a danger of using the global
11500// unguarded in another place, it seems safer to define global only for this module
11501
11502
11503
11504var
11505	version = "3.6.1",
11506
11507	// Define a local copy of jQuery
11508	jQuery = function( selector, context ) {
11509
11510		// The jQuery object is actually just the init constructor 'enhanced'
11511		// Need init if jQuery is called (just allow error to be thrown if not included)
11512		return new jQuery.fn.init( selector, context );
11513	};
11514
11515jQuery.fn = jQuery.prototype = {
11516
11517	// The current version of jQuery being used
11518	jquery: version,
11519
11520	constructor: jQuery,
11521
11522	// The default length of a jQuery object is 0
11523	length: 0,
11524
11525	toArray: function() {
11526		return slice.call( this );
11527	},
11528
11529	// Get the Nth element in the matched element set OR
11530	// Get the whole matched element set as a clean array
11531	get: function( num ) {
11532
11533		// Return all the elements in a clean array
11534		if ( num == null ) {
11535			return slice.call( this );
11536		}
11537
11538		// Return just the one element from the set
11539		return num < 0 ? this[ num + this.length ] : this[ num ];
11540	},
11541
11542	// Take an array of elements and push it onto the stack
11543	// (returning the new matched element set)
11544	pushStack: function( elems ) {
11545
11546		// Build a new jQuery matched element set
11547		var ret = jQuery.merge( this.constructor(), elems );
11548
11549		// Add the old object onto the stack (as a reference)
11550		ret.prevObject = this;
11551
11552		// Return the newly-formed element set
11553		return ret;
11554	},
11555
11556	// Execute a callback for every element in the matched set.
11557	each: function( callback ) {
11558		return jQuery.each( this, callback );
11559	},
11560
11561	map: function( callback ) {
11562		return this.pushStack( jQuery.map( this, function( elem, i ) {
11563			return callback.call( elem, i, elem );
11564		} ) );
11565	},
11566
11567	slice: function() {
11568		return this.pushStack( slice.apply( this, arguments ) );
11569	},
11570
11571	first: function() {
11572		return this.eq( 0 );
11573	},
11574
11575	last: function() {
11576		return this.eq( -1 );
11577	},
11578
11579	even: function() {
11580		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
11581			return ( i + 1 ) % 2;
11582		} ) );
11583	},
11584
11585	odd: function() {
11586		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
11587			return i % 2;
11588		} ) );
11589	},
11590
11591	eq: function( i ) {
11592		var len = this.length,
11593			j = +i + ( i < 0 ? len : 0 );
11594		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
11595	},
11596
11597	end: function() {
11598		return this.prevObject || this.constructor();
11599	},
11600
11601	// For internal use only.
11602	// Behaves like an Array's method, not like a jQuery method.
11603	push: push,
11604	sort: arr.sort,
11605	splice: arr.splice
11606};
11607
11608jQuery.extend = jQuery.fn.extend = function() {
11609	var options, name, src, copy, copyIsArray, clone,
11610		target = arguments[ 0 ] || {},
11611		i = 1,
11612		length = arguments.length,
11613		deep = false;
11614
11615	// Handle a deep copy situation
11616	if ( typeof target === "boolean" ) {
11617		deep = target;
11618
11619		// Skip the boolean and the target
11620		target = arguments[ i ] || {};
11621		i++;
11622	}
11623
11624	// Handle case when target is a string or something (possible in deep copy)
11625	if ( typeof target !== "object" && !isFunction( target ) ) {
11626		target = {};
11627	}
11628
11629	// Extend jQuery itself if only one argument is passed
11630	if ( i === length ) {
11631		target = this;
11632		i--;
11633	}
11634
11635	for ( ; i < length; i++ ) {
11636
11637		// Only deal with non-null/undefined values
11638		if ( ( options = arguments[ i ] ) != null ) {
11639
11640			// Extend the base object
11641			for ( name in options ) {
11642				copy = options[ name ];
11643
11644				// Prevent Object.prototype pollution
11645				// Prevent never-ending loop
11646				if ( name === "__proto__" || target === copy ) {
11647					continue;
11648				}
11649
11650				// Recurse if we're merging plain objects or arrays
11651				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
11652					( copyIsArray = Array.isArray( copy ) ) ) ) {
11653					src = target[ name ];
11654
11655					// Ensure proper type for the source value
11656					if ( copyIsArray && !Array.isArray( src ) ) {
11657						clone = [];
11658					} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
11659						clone = {};
11660					} else {
11661						clone = src;
11662					}
11663					copyIsArray = false;
11664
11665					// Never move original objects, clone them
11666					target[ name ] = jQuery.extend( deep, clone, copy );
11667
11668				// Don't bring in undefined values
11669				} else if ( copy !== undefined ) {
11670					target[ name ] = copy;
11671				}
11672			}
11673		}
11674	}
11675
11676	// Return the modified object
11677	return target;
11678};
11679
11680jQuery.extend( {
11681
11682	// Unique for each copy of jQuery on the page
11683	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
11684
11685	// Assume jQuery is ready without the ready module
11686	isReady: true,
11687
11688	error: function( msg ) {
11689		throw new Error( msg );
11690	},
11691
11692	noop: function() {},
11693
11694	isPlainObject: function( obj ) {
11695		var proto, Ctor;
11696
11697		// Detect obvious negatives
11698		// Use toString instead of jQuery.type to catch host objects
11699		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
11700			return false;
11701		}
11702
11703		proto = getProto( obj );
11704
11705		// Objects with no prototype (e.g., `Object.create( null )`) are plain
11706		if ( !proto ) {
11707			return true;
11708		}
11709
11710		// Objects with prototype are plain iff they were constructed by a global Object function
11711		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
11712		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
11713	},
11714
11715	isEmptyObject: function( obj ) {
11716		var name;
11717
11718		for ( name in obj ) {
11719			return false;
11720		}
11721		return true;
11722	},
11723
11724	// Evaluates a script in a provided context; falls back to the global one
11725	// if not specified.
11726	globalEval: function( code, options, doc ) {
11727		DOMEval( code, { nonce: options && options.nonce }, doc );
11728	},
11729
11730	each: function( obj, callback ) {
11731		var length, i = 0;
11732
11733		if ( isArrayLike( obj ) ) {
11734			length = obj.length;
11735			for ( ; i < length; i++ ) {
11736				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
11737					break;
11738				}
11739			}
11740		} else {
11741			for ( i in obj ) {
11742				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
11743					break;
11744				}
11745			}
11746		}
11747
11748		return obj;
11749	},
11750
11751	// results is for internal usage only
11752	makeArray: function( arr, results ) {
11753		var ret = results || [];
11754
11755		if ( arr != null ) {
11756			if ( isArrayLike( Object( arr ) ) ) {
11757				jQuery.merge( ret,
11758					typeof arr === "string" ?
11759						[ arr ] : arr
11760				);
11761			} else {
11762				push.call( ret, arr );
11763			}
11764		}
11765
11766		return ret;
11767	},
11768
11769	inArray: function( elem, arr, i ) {
11770		return arr == null ? -1 : indexOf.call( arr, elem, i );
11771	},
11772
11773	// Support: Android <=4.0 only, PhantomJS 1 only
11774	// push.apply(_, arraylike) throws on ancient WebKit
11775	merge: function( first, second ) {
11776		var len = +second.length,
11777			j = 0,
11778			i = first.length;
11779
11780		for ( ; j < len; j++ ) {
11781			first[ i++ ] = second[ j ];
11782		}
11783
11784		first.length = i;
11785
11786		return first;
11787	},
11788
11789	grep: function( elems, callback, invert ) {
11790		var callbackInverse,
11791			matches = [],
11792			i = 0,
11793			length = elems.length,
11794			callbackExpect = !invert;
11795
11796		// Go through the array, only saving the items
11797		// that pass the validator function
11798		for ( ; i < length; i++ ) {
11799			callbackInverse = !callback( elems[ i ], i );
11800			if ( callbackInverse !== callbackExpect ) {
11801				matches.push( elems[ i ] );
11802			}
11803		}
11804
11805		return matches;
11806	},
11807
11808	// arg is for internal usage only
11809	map: function( elems, callback, arg ) {
11810		var length, value,
11811			i = 0,
11812			ret = [];
11813
11814		// Go through the array, translating each of the items to their new values
11815		if ( isArrayLike( elems ) ) {
11816			length = elems.length;
11817			for ( ; i < length; i++ ) {
11818				value = callback( elems[ i ], i, arg );
11819
11820				if ( value != null ) {
vendor: 4,201 bytes, lines 11821-11988
11821					ret.push( value );
11822				}
11823			}
11824
11825		// Go through every key on the object,
11826		} else {
11827			for ( i in elems ) {
11828				value = callback( elems[ i ], i, arg );
11829
11830				if ( value != null ) {
11831					ret.push( value );
11832				}
11833			}
11834		}
11835
11836		// Flatten any nested arrays
11837		return flat( ret );
11838	},
11839
11840	// A global GUID counter for objects
11841	guid: 1,
11842
11843	// jQuery.support is not used in Core but other projects attach their
11844	// properties to it so it needs to exist.
11845	support: support
11846} );
11847
11848if ( typeof Symbol === "function" ) {
11849	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
11850}
11851
11852// Populate the class2type map
11853jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
11854	function( _i, name ) {
11855		class2type[ "[object " + name + "]" ] = name.toLowerCase();
11856	} );
11857
11858function isArrayLike( obj ) {
11859
11860	// Support: real iOS 8.2 only (not reproducible in simulator)
11861	// `in` check used to prevent JIT error (gh-2145)
11862	// hasOwn isn't used here due to false negatives
11863	// regarding Nodelist length in IE
11864	var length = !!obj && "length" in obj && obj.length,
11865		type = toType( obj );
11866
11867	if ( isFunction( obj ) || isWindow( obj ) ) {
11868		return false;
11869	}
11870
11871	return type === "array" || length === 0 ||
11872		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
11873}
11874var Sizzle =
11875/*!
11876 * Sizzle CSS Selector Engine v2.3.6
11877 * https://sizzlejs.com/
11878 *
11879 * Copyright JS Foundation and other contributors
11880 * Released under the MIT license
11881 * https://js.foundation/
11882 *
11883 * Date: 2021-02-16
11884 */
11885( function( window ) {
11886var i,
11887	support,
11888	Expr,
11889	getText,
11890	isXML,
11891	tokenize,
11892	compile,
11893	select,
11894	outermostContext,
11895	sortInput,
11896	hasDuplicate,
11897
11898	// Local document vars
11899	setDocument,
11900	document,
11901	docElem,
11902	documentIsHTML,
11903	rbuggyQSA,
11904	rbuggyMatches,
11905	matches,
11906	contains,
11907
11908	// Instance-specific data
11909	expando = "sizzle" + 1 * new Date(),
11910	preferredDoc = window.document,
11911	dirruns = 0,
11912	done = 0,
11913	classCache = createCache(),
11914	tokenCache = createCache(),
11915	compilerCache = createCache(),
11916	nonnativeSelectorCache = createCache(),
11917	sortOrder = function( a, b ) {
11918		if ( a === b ) {
11919			hasDuplicate = true;
11920		}
11921		return 0;
11922	},
11923
11924	// Instance methods
11925	hasOwn = ( {} ).hasOwnProperty,
11926	arr = [],
11927	pop = arr.pop,
11928	pushNative = arr.push,
11929	push = arr.push,
11930	slice = arr.slice,
11931
11932	// Use a stripped-down indexOf as it's faster than native
11933	// https://jsperf.com/thor-indexof-vs-for/5
11934	indexOf = function( list, elem ) {
11935		var i = 0,
11936			len = list.length;
11937		for ( ; i < len; i++ ) {
11938			if ( list[ i ] === elem ) {
11939				return i;
11940			}
11941		}
11942		return -1;
11943	},
11944
11945	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
11946		"ismap|loop|multiple|open|readonly|required|scoped",
11947
11948	// Regular expressions
11949
11950	// http://www.w3.org/TR/css3-selectors/#whitespace
11951	whitespace = "[\\x20\\t\\r\\n\\f]",
11952
11953	// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
11954	identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
11955		"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
11956
11957	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
11958	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
11959
11960		// Operator (capture 2)
11961		"*([*^$|!~]?=)" + whitespace +
11962
11963		// "Attribute values must be CSS identifiers [capture 5]
11964		// or strings [capture 3 or capture 4]"
11965		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
11966		whitespace + "*\\]",
11967
11968	pseudos = ":(" + identifier + ")(?:\\((" +
11969
11970		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
11971		// 1. quoted (capture 3; capture 4 or capture 5)
11972		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
11973
11974		// 2. simple (capture 6)
11975		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
11976
11977		// 3. anything else (capture 2)
11978		".*" +
11979		")\\)|)",
11980
11981	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
11982	rwhitespace = new RegExp( whitespace + "+", "g" ),
11983	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
11984		whitespace + "+$", "g" ),
11985
11986	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
11987	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
11988		"*" ),
vendor: 4,651 bytes, lines 11989-12143
11989	rdescend = new RegExp( whitespace + "|>" ),
11990
11991	rpseudo = new RegExp( pseudos ),
11992	ridentifier = new RegExp( "^" + identifier + "$" ),
11993
11994	matchExpr = {
11995		"ID": new RegExp( "^#(" + identifier + ")" ),
11996		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
11997		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
11998		"ATTR": new RegExp( "^" + attributes ),
11999		"PSEUDO": new RegExp( "^" + pseudos ),
12000		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
12001			whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
12002			whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
12003		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
12004
12005		// For use in libraries implementing .is()
12006		// We use this for POS matching in `select`
12007		"needsContext": new RegExp( "^" + whitespace +
12008			"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
12009			"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
12010	},
12011
12012	rhtml = /HTML$/i,
12013	rinputs = /^(?:input|select|textarea|button)$/i,
12014	rheader = /^h\d$/i,
12015
12016	rnative = /^[^{]+\{\s*\[native \w/,
12017
12018	// Easily-parseable/retrievable ID or TAG or CLASS selectors
12019	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
12020
12021	rsibling = /[+~]/,
12022
12023	// CSS escapes
12024	// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
12025	runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
12026	funescape = function( escape, nonHex ) {
12027		var high = "0x" + escape.slice( 1 ) - 0x10000;
12028
12029		return nonHex ?
12030
12031			// Strip the backslash prefix from a non-hex escape sequence
12032			nonHex :
12033
12034			// Replace a hexadecimal escape sequence with the encoded Unicode code point
12035			// Support: IE <=11+
12036			// For values outside the Basic Multilingual Plane (BMP), manually construct a
12037			// surrogate pair
12038			high < 0 ?
12039				String.fromCharCode( high + 0x10000 ) :
12040				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
12041	},
12042
12043	// CSS string/identifier serialization
12044	// https://drafts.csswg.org/cssom/#common-serializing-idioms
12045	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
12046	fcssescape = function( ch, asCodePoint ) {
12047		if ( asCodePoint ) {
12048
12049			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
12050			if ( ch === "\0" ) {
12051				return "\uFFFD";
12052			}
12053
12054			// Control characters and (dependent upon position) numbers get escaped as code points
12055			return ch.slice( 0, -1 ) + "\\" +
12056				ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
12057		}
12058
12059		// Other potentially-special ASCII characters get backslash-escaped
12060		return "\\" + ch;
12061	},
12062
12063	// Used for iframes
12064	// See setDocument()
12065	// Removing the function wrapper causes a "Permission Denied"
12066	// error in IE
12067	unloadHandler = function() {
12068		setDocument();
12069	},
12070
12071	inDisabledFieldset = addCombinator(
12072		function( elem ) {
12073			return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
12074		},
12075		{ dir: "parentNode", next: "legend" }
12076	);
12077
12078// Optimize for push.apply( _, NodeList )
12079try {
12080	push.apply(
12081		( arr = slice.call( preferredDoc.childNodes ) ),
12082		preferredDoc.childNodes
12083	);
12084
12085	// Support: Android<4.0
12086	// Detect silently failing push.apply
12087	// eslint-disable-next-line no-unused-expressions
12088	arr[ preferredDoc.childNodes.length ].nodeType;
12089} catch ( e ) {
12090	push = { apply: arr.length ?
12091
12092		// Leverage slice if possible
12093		function( target, els ) {
12094			pushNative.apply( target, slice.call( els ) );
12095		} :
12096
12097		// Support: IE<9
12098		// Otherwise append directly
12099		function( target, els ) {
12100			var j = target.length,
12101				i = 0;
12102
12103			// Can't trust NodeList.length
12104			while ( ( target[ j++ ] = els[ i++ ] ) ) {}
12105			target.length = j - 1;
12106		}
12107	};
12108}
12109
12110function Sizzle( selector, context, results, seed ) {
12111	var m, i, elem, nid, match, groups, newSelector,
12112		newContext = context && context.ownerDocument,
12113
12114		// nodeType defaults to 9, since context defaults to document
12115		nodeType = context ? context.nodeType : 9;
12116
12117	results = results || [];
12118
12119	// Return early from calls with invalid selector or context
12120	if ( typeof selector !== "string" || !selector ||
12121		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
12122
12123		return results;
12124	}
12125
12126	// Try to shortcut find operations (as opposed to filters) in HTML documents
12127	if ( !seed ) {
12128		setDocument( context );
12129		context = context || document;
12130
12131		if ( documentIsHTML ) {
12132
12133			// If the selector is sufficiently simple, try using a "get*By*" DOM method
12134			// (excepting DocumentFragment context, where the methods don't exist)
12135			if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
12136
12137				// ID selector
12138				if ( ( m = match[ 1 ] ) ) {
12139
12140					// Document context
12141					if ( nodeType === 9 ) {
12142						if ( ( elem = context.getElementById( m ) ) ) {
12143
12144							// Support: IE, Opera, Webkit
12145							// TODO: identify versions
12146							// getElementById can match elements by name instead of ID
12147							if ( elem.id === m ) {
12148								results.push( elem );
12149								return results;
12150							}
12151						} else {
12152							return results;
12153						}
12154
12155					// Element context
12156					} else {
12157
12158						// Support: IE, Opera, Webkit
12159						// TODO: identify versions
12160						// getElementById can match elements by name instead of ID
12161						if ( newContext && ( elem = newContext.getElementById( m ) ) &&
12162							contains( context, elem ) &&
12163							elem.id === m ) {
12164
12165							results.push( elem );
12166							return results;
12167						}
12168					}
12169
12170				// Type selector
12171				} else if ( match[ 2 ] ) {
12172					push.apply( results, context.getElementsByTagName( selector ) );
12173					return results;
12174
12175				// Class selector
12176				} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&
12177					context.getElementsByClassName ) {
12178
12179					push.apply( results, context.getElementsByClassName( m ) );
12180					return results;
12181				}
12182			}
12183
12184			// Take advantage of querySelectorAll
12185			if ( support.qsa &&
12186				!nonnativeSelectorCache[ selector + " " ] &&
12187				( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
12188
12189				// Support: IE 8 only
12190				// Exclude object elements
12191				( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {
12192
12193				newSelector = selector;
12194				newContext = context;
12195
12196				// qSA considers elements outside a scoping root when evaluating child or
12197				// descendant combinators, which is not what we want.
12198				// In such cases, we work around the behavior by prefixing every selector in the
12199				// list with an ID selector referencing the scope context.
12200				// The technique has to be used as well when a leading combinator is used
12201				// as such selectors are not recognized by querySelectorAll.
12202				// Thanks to Andrew Dupont for this technique.
12203				if ( nodeType === 1 &&
12204					( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
12205
12206					// Expand context for sibling selectors
12207					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
12208						context;
12209
12210					// We can use :scope instead of the ID hack if the browser
12211					// supports it & if we're not changing the context.
12212					if ( newContext !== context || !support.scope ) {
12213
12214						// Capture the context ID, setting it first if necessary
12215						if ( ( nid = context.getAttribute( "id" ) ) ) {
12216							nid = nid.replace( rcssescape, fcssescape );
12217						} else {
12218							context.setAttribute( "id", ( nid = expando ) );
12219						}
12220					}
12221
12222					// Prefix every selector in the list
12223					groups = tokenize( selector );
12224					i = groups.length;
12225					while ( i-- ) {
12226						groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
12227							toSelector( groups[ i ] );
12228					}
12229					newSelector = groups.join( "," );
12230				}
12231
12232				try {
12233					push.apply( results,
12234						newContext.querySelectorAll( newSelector )
12235					);
12236					return results;
12237				} catch ( qsaError ) {
12238					nonnativeSelectorCache( selector, true );
12239				} finally {
12240					if ( nid === expando ) {
12241						context.removeAttribute( "id" );
12242					}
12243				}
12244			}
12245		}
12246	}
12247
12248	// All others
12249	return select( selector.replace( rtrim, "$1" ), context, results, seed );
12250}
12251
12252/**
12253 * Create key-value caches of limited size
12254 * @returns {function(string, object)} Returns the Object data after storing it on itself with
12255 *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
12256 *	deleting the oldest entry
12257 */
12258function createCache() {
12259	var keys = [];
12260
12261	function cache( key, value ) {
12262
12263		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
12264		if ( keys.push( key + " " ) > Expr.cacheLength ) {
12265
12266			// Only keep the most recent entries
12267			delete cache[ keys.shift() ];
12268		}
12269		return ( cache[ key + " " ] = value );
12270	}
12271	return cache;
12272}
12273
12274/**
12275 * Mark a function for special use by Sizzle
12276 * @param {Function} fn The function to mark
12277 */
12278function markFunction( fn ) {
12279	fn[ expando ] = true;
12280	return fn;
12281}
12282
12283/**
12284 * Support testing using an element
12285 * @param {Function} fn Passed the created element and returns a boolean result
12286 */
12287function assert( fn ) {
12288	var el = document.createElement( "fieldset" );
12289
12290	try {
12291		return !!fn( el );
12292	} catch ( e ) {
12293		return false;
vendor: 4,247 bytes, lines 12294-12449
12294	} finally {
12295
12296		// Remove from its parent by default
12297		if ( el.parentNode ) {
12298			el.parentNode.removeChild( el );
12299		}
12300
12301		// release memory in IE
12302		el = null;
12303	}
12304}
12305
12306/**
12307 * Adds the same handler for all of the specified attrs
12308 * @param {String} attrs Pipe-separated list of attributes
12309 * @param {Function} handler The method that will be applied
12310 */
12311function addHandle( attrs, handler ) {
12312	var arr = attrs.split( "|" ),
12313		i = arr.length;
12314
12315	while ( i-- ) {
12316		Expr.attrHandle[ arr[ i ] ] = handler;
12317	}
12318}
12319
12320/**
12321 * Checks document order of two siblings
12322 * @param {Element} a
12323 * @param {Element} b
12324 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
12325 */
12326function siblingCheck( a, b ) {
12327	var cur = b && a,
12328		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
12329			a.sourceIndex - b.sourceIndex;
12330
12331	// Use IE sourceIndex if available on both nodes
12332	if ( diff ) {
12333		return diff;
12334	}
12335
12336	// Check if b follows a
12337	if ( cur ) {
12338		while ( ( cur = cur.nextSibling ) ) {
12339			if ( cur === b ) {
12340				return -1;
12341			}
12342		}
12343	}
12344
12345	return a ? 1 : -1;
12346}
12347
12348/**
12349 * Returns a function to use in pseudos for input types
12350 * @param {String} type
12351 */
12352function createInputPseudo( type ) {
12353	return function( elem ) {
12354		var name = elem.nodeName.toLowerCase();
12355		return name === "input" && elem.type === type;
12356	};
12357}
12358
12359/**
12360 * Returns a function to use in pseudos for buttons
12361 * @param {String} type
12362 */
12363function createButtonPseudo( type ) {
12364	return function( elem ) {
12365		var name = elem.nodeName.toLowerCase();
12366		return ( name === "input" || name === "button" ) && elem.type === type;
12367	};
12368}
12369
12370/**
12371 * Returns a function to use in pseudos for :enabled/:disabled
12372 * @param {Boolean} disabled true for :disabled; false for :enabled
12373 */
12374function createDisabledPseudo( disabled ) {
12375
12376	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
12377	return function( elem ) {
12378
12379		// Only certain elements can match :enabled or :disabled
12380		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
12381		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
12382		if ( "form" in elem ) {
12383
12384			// Check for inherited disabledness on relevant non-disabled elements:
12385			// * listed form-associated elements in a disabled fieldset
12386			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
12387			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
12388			// * option elements in a disabled optgroup
12389			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
12390			// All such elements have a "form" property.
12391			if ( elem.parentNode && elem.disabled === false ) {
12392
12393				// Option elements defer to a parent optgroup if present
12394				if ( "label" in elem ) {
12395					if ( "label" in elem.parentNode ) {
12396						return elem.parentNode.disabled === disabled;
12397					} else {
12398						return elem.disabled === disabled;
12399					}
12400				}
12401
12402				// Support: IE 6 - 11
12403				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
12404				return elem.isDisabled === disabled ||
12405
12406					// Where there is no isDisabled, check manually
12407					/* jshint -W018 */
12408					elem.isDisabled !== !disabled &&
12409					inDisabledFieldset( elem ) === disabled;
12410			}
12411
12412			return elem.disabled === disabled;
12413
12414		// Try to winnow out elements that can't be disabled before trusting the disabled property.
12415		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
12416		// even exist on them, let alone have a boolean value.
12417		} else if ( "label" in elem ) {
12418			return elem.disabled === disabled;
12419		}
12420
12421		// Remaining elements are neither :enabled nor :disabled
12422		return false;
12423	};
12424}
12425
12426/**
12427 * Returns a function to use in pseudos for positionals
12428 * @param {Function} fn
12429 */
12430function createPositionalPseudo( fn ) {
12431	return markFunction( function( argument ) {
12432		argument = +argument;
12433		return markFunction( function( seed, matches ) {
12434			var j,
12435				matchIndexes = fn( [], seed.length, argument ),
12436				i = matchIndexes.length;
12437
12438			// Match elements found at the specified indexes
12439			while ( i-- ) {
12440				if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
12441					seed[ j ] = !( matches[ j ] = seed[ j ] );
12442				}
12443			}
12444		} );
12445	} );
12446}
12447
12448/**
12449 * Checks a node for validity as a Sizzle context
12450 * @param {Element|Object=} context
12451 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
12452 */
12453function testContext( context ) {
12454	return context && typeof context.getElementsByTagName !== "undefined" && context;
12455}
12456
12457// Expose support vars for convenience
12458support = Sizzle.support = {};
12459
12460/**
12461 * Detects XML nodes
12462 * @param {Element|Object} elem An element or a document
12463 * @returns {Boolean} True iff elem is a non-HTML XML node
12464 */
12465isXML = Sizzle.isXML = function( elem ) {
12466	var namespace = elem && elem.namespaceURI,
12467		docElem = elem && ( elem.ownerDocument || elem ).documentElement;
12468
12469	// Support: IE <=8
12470	// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
12471	// https://bugs.jquery.com/ticket/4833
12472	return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
12473};
12474
12475/**
12476 * Sets document-related variables once based on the current document
12477 * @param {Element|Object} [doc] An element or document object to use to set the document
12478 * @returns {Object} Returns the current document
12479 */
12480setDocument = Sizzle.setDocument = function( node ) {
12481	var hasCompare, subWindow,
12482		doc = node ? node.ownerDocument || node : preferredDoc;
12483
12484	// Return early if doc is invalid or already selected
12485	// Support: IE 11+, Edge 17 - 18+
12486	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
12487	// two documents; shallow comparisons work.
12488	// eslint-disable-next-line eqeqeq
12489	if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
12490		return document;
12491	}
12492
12493	// Update global variables
12494	document = doc;
12495	docElem = document.documentElement;
12496	documentIsHTML = !isXML( document );
12497
12498	// Support: IE 9 - 11+, Edge 12 - 18+
12499	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
12500	// Support: IE 11+, Edge 17 - 18+
12501	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
12502	// two documents; shallow comparisons work.
12503	// eslint-disable-next-line eqeqeq
12504	if ( preferredDoc != document &&
12505		( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
12506
12507		// Support: IE 11, Edge
12508		if ( subWindow.addEventListener ) {
12509			subWindow.addEventListener( "unload", unloadHandler, false );
12510
12511		// Support: IE 9 - 10 only
12512		} else if ( subWindow.attachEvent ) {
12513			subWindow.attachEvent( "onunload", unloadHandler );
12514		}
12515	}
12516
12517	// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
12518	// Safari 4 - 5 only, Opera <=11.6 - 12.x only
12519	// IE/Edge & older browsers don't support the :scope pseudo-class.
12520	// Support: Safari 6.0 only
12521	// Safari 6.0 supports :scope but it's an alias of :root there.
12522	support.scope = assert( function( el ) {
12523		docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
12524		return typeof el.querySelectorAll !== "undefined" &&
12525			!el.querySelectorAll( ":scope fieldset div" ).length;
12526	} );
12527
12528	/* Attributes
12529	---------------------------------------------------------------------- */
12530
12531	// Support: IE<8
12532	// Verify that getAttribute really returns attributes and not properties
12533	// (excepting IE8 booleans)
12534	support.attributes = assert( function( el ) {
12535		el.className = "i";
12536		return !el.getAttribute( "className" );
12537	} );
12538
12539	/* getElement(s)By*
12540	---------------------------------------------------------------------- */
12541
12542	// Check if getElementsByTagName("*") returns only elements
12543	support.getElementsByTagName = assert( function( el ) {
12544		el.appendChild( document.createComment( "" ) );
12545		return !el.getElementsByTagName( "*" ).length;
12546	} );
12547
12548	// Support: IE<9
12549	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
12550
12551	// Support: IE<10
12552	// Check if getElementById returns elements by name
12553	// The broken getElementById methods don't pick up programmatically-set names,
12554	// so use a roundabout getElementsByName test
12555	support.getById = assert( function( el ) {
12556		docElem.appendChild( el ).id = expando;
12557		return !document.getElementsByName || !document.getElementsByName( expando ).length;
12558	} );
12559
12560	// ID filter and find
12561	if ( support.getById ) {
12562		Expr.filter[ "ID" ] = function( id ) {
12563			var attrId = id.replace( runescape, funescape );
12564			return function( elem ) {
12565				return elem.getAttribute( "id" ) === attrId;
12566			};
12567		};
12568		Expr.find[ "ID" ] = function( id, context ) {
12569			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
12570				var elem = context.getElementById( id );
12571				return elem ? [ elem ] : [];
12572			}
12573		};
12574	} else {
12575		Expr.filter[ "ID" ] =  function( id ) {
12576			var attrId = id.replace( runescape, funescape );
12577			return function( elem ) {
12578				var node = typeof elem.getAttributeNode !== "undefined" &&
12579					elem.getAttributeNode( "id" );
12580				return node && node.value === attrId;
12581			};
12582		};
12583
vendor: 4,196 bytes, lines 12584-12715
12584		// Support: IE 6 - 7 only
12585		// getElementById is not reliable as a find shortcut
12586		Expr.find[ "ID" ] = function( id, context ) {
12587			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
12588				var node, i, elems,
12589					elem = context.getElementById( id );
12590
12591				if ( elem ) {
12592
12593					// Verify the id attribute
12594					node = elem.getAttributeNode( "id" );
12595					if ( node && node.value === id ) {
12596						return [ elem ];
12597					}
12598
12599					// Fall back on getElementsByName
12600					elems = context.getElementsByName( id );
12601					i = 0;
12602					while ( ( elem = elems[ i++ ] ) ) {
12603						node = elem.getAttributeNode( "id" );
12604						if ( node && node.value === id ) {
12605							return [ elem ];
12606						}
12607					}
12608				}
12609
12610				return [];
12611			}
12612		};
12613	}
12614
12615	// Tag
12616	Expr.find[ "TAG" ] = support.getElementsByTagName ?
12617		function( tag, context ) {
12618			if ( typeof context.getElementsByTagName !== "undefined" ) {
12619				return context.getElementsByTagName( tag );
12620
12621			// DocumentFragment nodes don't have gEBTN
12622			} else if ( support.qsa ) {
12623				return context.querySelectorAll( tag );
12624			}
12625		} :
12626
12627		function( tag, context ) {
12628			var elem,
12629				tmp = [],
12630				i = 0,
12631
12632				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
12633				results = context.getElementsByTagName( tag );
12634
12635			// Filter out possible comments
12636			if ( tag === "*" ) {
12637				while ( ( elem = results[ i++ ] ) ) {
12638					if ( elem.nodeType === 1 ) {
12639						tmp.push( elem );
12640					}
12641				}
12642
12643				return tmp;
12644			}
12645			return results;
12646		};
12647
12648	// Class
12649	Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) {
12650		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
12651			return context.getElementsByClassName( className );
12652		}
12653	};
12654
12655	/* QSA/matchesSelector
12656	---------------------------------------------------------------------- */
12657
12658	// QSA and matchesSelector support
12659
12660	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
12661	rbuggyMatches = [];
12662
12663	// qSa(:focus) reports false when true (Chrome 21)
12664	// We allow this because of a bug in IE8/9 that throws an error
12665	// whenever `document.activeElement` is accessed on an iframe
12666	// So, we allow :focus to pass through QSA all the time to avoid the IE error
12667	// See https://bugs.jquery.com/ticket/13378
12668	rbuggyQSA = [];
12669
12670	if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
12671
12672		// Build QSA regex
12673		// Regex strategy adopted from Diego Perini
12674		assert( function( el ) {
12675
12676			var input;
12677
12678			// Select is set to empty string on purpose
12679			// This is to test IE's treatment of not explicitly
12680			// setting a boolean content attribute,
12681			// since its presence should be enough
12682			// https://bugs.jquery.com/ticket/12359
12683			docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
12684				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
12685				"<option selected=''></option></select>";
12686
12687			// Support: IE8, Opera 11-12.16
12688			// Nothing should be selected when empty strings follow ^= or $= or *=
12689			// The test attribute must be unknown in Opera but "safe" for WinRT
12690			// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
12691			if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) {
12692				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
12693			}
12694
12695			// Support: IE8
12696			// Boolean attributes and "value" are not treated correctly
12697			if ( !el.querySelectorAll( "[selected]" ).length ) {
12698				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
12699			}
12700
12701			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
12702			if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
12703				rbuggyQSA.push( "~=" );
12704			}
12705
12706			// Support: IE 11+, Edge 15 - 18+
12707			// IE 11/Edge don't find elements on a `[name='']` query in some cases.
12708			// Adding a temporary attribute to the document before the selection works
12709			// around the issue.
12710			// Interestingly, IE 10 & older don't seem to have the issue.
12711			input = document.createElement( "input" );
12712			input.setAttribute( "name", "" );
12713			el.appendChild( input );
12714			if ( !el.querySelectorAll( "[name='']" ).length ) {
12715				rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" 
vendor: 4,065 bytes, lines 12715-12844
12715+
12716					whitespace + "*(?:''|\"\")" );
12717			}
12718
12719			// Webkit/Opera - :checked should return selected option elements
12720			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
12721			// IE8 throws error here and will not see later tests
12722			if ( !el.querySelectorAll( ":checked" ).length ) {
12723				rbuggyQSA.push( ":checked" );
12724			}
12725
12726			// Support: Safari 8+, iOS 8+
12727			// https://bugs.webkit.org/show_bug.cgi?id=136851
12728			// In-page `selector#id sibling-combinator selector` fails
12729			if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
12730				rbuggyQSA.push( ".#.+[+~]" );
12731			}
12732
12733			// Support: Firefox <=3.6 - 5 only
12734			// Old Firefox doesn't throw on a badly-escaped identifier.
12735			el.querySelectorAll( "\\\f" );
12736			rbuggyQSA.push( "[\\r\\n\\f]" );
12737		} );
12738
12739		assert( function( el ) {
12740			el.innerHTML = "<a href='' disabled='disabled'></a>" +
12741				"<select disabled='disabled'><option/></select>";
12742
12743			// Support: Windows 8 Native Apps
12744			// The type and name attributes are restricted during .innerHTML assignment
12745			var input = document.createElement( "input" );
12746			input.setAttribute( "type", "hidden" );
12747			el.appendChild( input ).setAttribute( "name", "D" );
12748
12749			// Support: IE8
12750			// Enforce case-sensitivity of name attribute
12751			if ( el.querySelectorAll( "[name=d]" ).length ) {
12752				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
12753			}
12754
12755			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
12756			// IE8 throws error here and will not see later tests
12757			if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
12758				rbuggyQSA.push( ":enabled", ":disabled" );
12759			}
12760
12761			// Support: IE9-11+
12762			// IE's :disabled selector does not pick up the children of disabled fieldsets
12763			docElem.appendChild( el ).disabled = true;
12764			if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
12765				rbuggyQSA.push( ":enabled", ":disabled" );
12766			}
12767
12768			// Support: Opera 10 - 11 only
12769			// Opera 10-11 does not throw on post-comma invalid pseudos
12770			el.querySelectorAll( "*,:x" );
12771			rbuggyQSA.push( ",.*:" );
12772		} );
12773	}
12774
12775	if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
12776		docElem.webkitMatchesSelector ||
12777		docElem.mozMatchesSelector ||
12778		docElem.oMatchesSelector ||
12779		docElem.msMatchesSelector ) ) ) ) {
12780
12781		assert( function( el ) {
12782
12783			// Check to see if it's possible to do matchesSelector
12784			// on a disconnected node (IE 9)
12785			support.disconnectedMatch = matches.call( el, "*" );
12786
12787			// This should fail with an exception
12788			// Gecko does not error, returns false instead
12789			matches.call( el, "[s!='']:x" );
12790			rbuggyMatches.push( "!=", pseudos );
12791		} );
12792	}
12793
12794	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
12795	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
12796
12797	/* Contains
12798	---------------------------------------------------------------------- */
12799	hasCompare = rnative.test( docElem.compareDocumentPosition );
12800
12801	// Element contains another
12802	// Purposefully self-exclusive
12803	// As in, an element does not contain itself
12804	contains = hasCompare || rnative.test( docElem.contains ) ?
12805		function( a, b ) {
12806			var adown = a.nodeType === 9 ? a.documentElement : a,
12807				bup = b && b.parentNode;
12808			return a === bup || !!( bup && bup.nodeType === 1 && (
12809				adown.contains ?
12810					adown.contains( bup ) :
12811					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
12812			) );
12813		} :
12814		function( a, b ) {
12815			if ( b ) {
12816				while ( ( b = b.parentNode ) ) {
12817					if ( b === a ) {
12818						return true;
12819					}
12820				}
12821			}
12822			return false;
12823		};
12824
12825	/* Sorting
12826	---------------------------------------------------------------------- */
12827
12828	// Document order sorting
12829	sortOrder = hasCompare ?
12830	function( a, b ) {
12831
12832		// Flag for duplicate removal
12833		if ( a === b ) {
12834			hasDuplicate = true;
12835			return 0;
12836		}
12837
12838		// Sort on method existence if only one input has compareDocumentPosition
12839		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
12840		if ( compare ) {
12841			return compare;
12842		}
12843
12844		// Calculate position if both inputs belong to the same document
12845		// Support: IE 11+, Edge 17 - 18+
12846		// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
12847		// two documents; shallow comparisons work.
12848		// eslint-disable-next-line eqeqeq
12849		compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
12850			a.compareDocumentPosition( b ) :
12851
12852			// Otherwise we know they are disconnected
12853			1;
12854
12855		// Disconnected nodes
12856		if ( compare & 1 ||
12857			( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
12858
12859			// Choose the first element that is related to our preferred document
12860			// Support: IE 11+, Edge 17 - 18+
12861			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
12862			// two documents; shallow comparisons work.
12863			// eslint-disable-next-line eqeqeq
12864			if ( a == document || a.ownerDocument == preferredDoc &&
12865				contains( preferredDoc, a ) ) {
12866				return -1;
12867			}
12868
12869			// Support: IE 11+, Edge 17 - 18+
12870			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
12871			// two documents; shallow comparisons work.
12872			// eslint-disable-next-line eqeqeq
12873			if ( b == document || b.ownerDocument == preferredDoc &&
12874				contains( preferredDoc, b ) ) {
12875				return 1;
12876			}
12877
12878			// Maintain original order
12879			return sortInput ?
12880				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
12881				0;
12882		}
12883
12884		return compare & 4 ? -1 : 1;
12885	} :
12886	function( a, b ) {
12887
12888		// Exit early if the nodes are identical
12889		if ( a === b ) {
12890			hasDuplicate = true;
12891			return 0;
12892		}
12893
12894		var cur,
12895			i = 0,
12896			aup = a.parentNode,
12897			bup = b.parentNode,
12898			ap = [ a ],
12899			bp = [ b ];
12900
12901		// Parentless nodes are either documents or disconnected
12902		if ( !aup || !bup ) {
12903
12904			// Support: IE 11+, Edge 17 - 18+
12905			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
12906			// two documents; shallow comparisons work.
12907			/* eslint-disable eqeqeq */
12908			return a == document ? -1 :
12909				b == document ? 1 :
12910				/* eslint-enable eqeqeq */
12911				aup ? -1 :
12912				bup ? 1 :
12913				sortInput ?
12914				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
12915				0;
12916
12917		// If the nodes are siblings, we can do a quick check
12918		} else if ( aup === bup ) {
12919			return siblingCheck( a, b );
12920		}
12921
12922		// Otherwise we need full lists of their ancestors for comparison
12923		cur = a;
12924		while ( ( cur = cur.parentNode ) ) {
12925			ap.unshift( cur );
12926		}
12927		cur = b;
12928		while ( ( cur = cur.parentNode ) ) {
12929			bp.unshift( cur );
12930		}
12931
12932		// Walk down the tree looking for a discrepancy
12933		while ( ap[ i ] === bp[ i ] ) {
12934			i++;
12935		}
12936
12937		return i ?
12938
12939			// Do a sibling check if the nodes have a common ancestor
12940			siblingCheck( ap[ i ], bp[ i ] ) :
12941
12942			// Otherwise nodes in our document sort first
12943			// Support: IE 11+, Edge 17 - 18+
12944			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
12945			// two documents; shallow comparisons work.
12946			/* eslint-disable eqeqeq */
12947			ap[ i ] == preferredDoc ? -1 :
12948			bp[ i ] == preferredDoc ? 1 :
12949			/* eslint-enable eqeqeq */
12950			0;
12951	};
12952
12953	return document;
12954};
12955
12956Sizzle.matches = function( expr, elements ) {
12957	return Sizzle( expr, null, null, elements );
12958};
12959
12960Sizzle.matchesSelector = function( elem, expr ) {
12961	setDocument( elem );
12962
12963	if ( support.matchesSelector && documentIsHTML &&
12964		!nonnativeSelectorCache[ expr + " " ] &&
12965		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
12966		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
12967
12968		try {
12969			var ret = matches.call( elem, expr );
12970
12971			// IE 9's matchesSelector returns false on disconnected nodes
12972			if ( ret || support.disconnectedMatch ||
12973
12974				// As well, disconnected nodes are said to be in a document
12975				// fragment in IE 9
12976				elem.document && elem.document.nodeType !== 11 ) {
12977				return ret;
12978			}
12979		} catch ( e ) {
12980			nonnativeSelectorCache( expr, true );
12981		}
12982	}
12983
12984	return Sizzle( expr, document, null, [ elem ] ).length > 0;
12985};
12986
12987Sizzle.contains = function( context, elem ) {
12988
12989	// Set document vars if needed
12990	// Support: IE 11+, Edge 17 - 18+
12991	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
12992	// two documents; shallow comparisons work.
12993	// eslint-disable-next-line eqeqeq
12994	if ( ( context.ownerDocument || context ) != document ) {
12995		setDocument( context );
12996	}
12997	return contains( context, elem );
12998};
12999
13000Sizzle.attr = function( elem, name ) {
13001
13002	// Set document vars if needed
vendor: 16,419 bytes, lines 13003-13595
13003	// Support: IE 11+, Edge 17 - 18+
13004	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
13005	// two documents; shallow comparisons work.
13006	// eslint-disable-next-line eqeqeq
13007	if ( ( elem.ownerDocument || elem ) != document ) {
13008		setDocument( elem );
13009	}
13010
13011	var fn = Expr.attrHandle[ name.toLowerCase() ],
13012
13013		// Don't get fooled by Object.prototype properties (jQuery #13807)
13014		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
13015			fn( elem, name, !documentIsHTML ) :
13016			undefined;
13017
13018	return val !== undefined ?
13019		val :
13020		support.attributes || !documentIsHTML ?
13021			elem.getAttribute( name ) :
13022			( val = elem.getAttributeNode( name ) ) && val.specified ?
13023				val.value :
13024				null;
13025};
13026
13027Sizzle.escape = function( sel ) {
13028	return ( sel + "" ).replace( rcssescape, fcssescape );
13029};
13030
13031Sizzle.error = function( msg ) {
13032	throw new Error( "Syntax error, unrecognized expression: " + msg );
13033};
13034
13035/**
13036 * Document sorting and removing duplicates
13037 * @param {ArrayLike} results
13038 */
13039Sizzle.uniqueSort = function( results ) {
13040	var elem,
13041		duplicates = [],
13042		j = 0,
13043		i = 0;
13044
13045	// Unless we *know* we can detect duplicates, assume their presence
13046	hasDuplicate = !support.detectDuplicates;
13047	sortInput = !support.sortStable && results.slice( 0 );
13048	results.sort( sortOrder );
13049
13050	if ( hasDuplicate ) {
13051		while ( ( elem = results[ i++ ] ) ) {
13052			if ( elem === results[ i ] ) {
13053				j = duplicates.push( i );
13054			}
13055		}
13056		while ( j-- ) {
13057			results.splice( duplicates[ j ], 1 );
13058		}
13059	}
13060
13061	// Clear input after sorting to release objects
13062	// See https://github.com/jquery/sizzle/pull/225
13063	sortInput = null;
13064
13065	return results;
13066};
13067
13068/**
13069 * Utility function for retrieving the text value of an array of DOM nodes
13070 * @param {Array|Element} elem
13071 */
13072getText = Sizzle.getText = function( elem ) {
13073	var node,
13074		ret = "",
13075		i = 0,
13076		nodeType = elem.nodeType;
13077
13078	if ( !nodeType ) {
13079
13080		// If no nodeType, this is expected to be an array
13081		while ( ( node = elem[ i++ ] ) ) {
13082
13083			// Do not traverse comment nodes
13084			ret += getText( node );
13085		}
13086	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
13087
13088		// Use textContent for elements
13089		// innerText usage removed for consistency of new lines (jQuery #11153)
13090		if ( typeof elem.textContent === "string" ) {
13091			return elem.textContent;
13092		} else {
13093
13094			// Traverse its children
13095			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
13096				ret += getText( elem );
13097			}
13098		}
13099	} else if ( nodeType === 3 || nodeType === 4 ) {
13100		return elem.nodeValue;
13101	}
13102
13103	// Do not include comment or processing instruction nodes
13104
13105	return ret;
13106};
13107
13108Expr = Sizzle.selectors = {
13109
13110	// Can be adjusted by the user
13111	cacheLength: 50,
13112
13113	createPseudo: markFunction,
13114
13115	match: matchExpr,
13116
13117	attrHandle: {},
13118
13119	find: {},
13120
13121	relative: {
13122		">": { dir: "parentNode", first: true },
13123		" ": { dir: "parentNode" },
13124		"+": { dir: "previousSibling", first: true },
13125		"~": { dir: "previousSibling" }
13126	},
13127
13128	preFilter: {
13129		"ATTR": function( match ) {
13130			match[ 1 ] = match[ 1 ].replace( runescape, funescape );
13131
13132			// Move the given value to match[3] whether quoted or unquoted
13133			match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
13134				match[ 5 ] || "" ).replace( runescape, funescape );
13135
13136			if ( match[ 2 ] === "~=" ) {
13137				match[ 3 ] = " " + match[ 3 ] + " ";
13138			}
13139
13140			return match.slice( 0, 4 );
13141		},
13142
13143		"CHILD": function( match ) {
13144
13145			/* matches from matchExpr["CHILD"]
13146				1 type (only|nth|...)
13147				2 what (child|of-type)
13148				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
13149				4 xn-component of xn+y argument ([+-]?\d*n|)
13150				5 sign of xn-component
13151				6 x of xn-component
13152				7 sign of y-component
13153				8 y of y-component
13154			*/
13155			match[ 1 ] = match[ 1 ].toLowerCase();
13156
13157			if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
13158
13159				// nth-* requires argument
13160				if ( !match[ 3 ] ) {
13161					Sizzle.error( match[ 0 ] );
13162				}
13163
13164				// numeric x and y parameters for Expr.filter.CHILD
13165				// remember that false/true cast respectively to 0/1
13166				match[ 4 ] = +( match[ 4 ] ?
13167					match[ 5 ] + ( match[ 6 ] || 1 ) :
13168					2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) );
13169				match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
13170
13171				// other types prohibit arguments
13172			} else if ( match[ 3 ] ) {
13173				Sizzle.error( match[ 0 ] );
13174			}
13175
13176			return match;
13177		},
13178
13179		"PSEUDO": function( match ) {
13180			var excess,
13181				unquoted = !match[ 6 ] && match[ 2 ];
13182
13183			if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
13184				return null;
13185			}
13186
13187			// Accept quoted arguments as-is
13188			if ( match[ 3 ] ) {
13189				match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
13190
13191			// Strip excess characters from unquoted arguments
13192			} else if ( unquoted && rpseudo.test( unquoted ) &&
13193
13194				// Get excess from tokenize (recursively)
13195				( excess = tokenize( unquoted, true ) ) &&
13196
13197				// advance to the next closing parenthesis
13198				( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
13199
13200				// excess is a negative index
13201				match[ 0 ] = match[ 0 ].slice( 0, excess );
13202				match[ 2 ] = unquoted.slice( 0, excess );
13203			}
13204
13205			// Return only captures needed by the pseudo filter method (type and argument)
13206			return match.slice( 0, 3 );
13207		}
13208	},
13209
13210	filter: {
13211
13212		"TAG": function( nodeNameSelector ) {
13213			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
13214			return nodeNameSelector === "*" ?
13215				function() {
13216					return true;
13217				} :
13218				function( elem ) {
13219					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
13220				};
13221		},
13222
13223		"CLASS": function( className ) {
13224			var pattern = classCache[ className + " " ];
13225
13226			return pattern ||
13227				( pattern = new RegExp( "(^|" + whitespace +
13228					")" + className + "(" + whitespace + "|$)" ) ) && classCache(
13229						className, function( elem ) {
13230							return pattern.test(
13231								typeof elem.className === "string" && elem.className ||
13232								typeof elem.getAttribute !== "undefined" &&
13233									elem.getAttribute( "class" ) ||
13234								""
13235							);
13236				} );
13237		},
13238
13239		"ATTR": function( name, operator, check ) {
13240			return function( elem ) {
13241				var result = Sizzle.attr( elem, name );
13242
13243				if ( result == null ) {
13244					return operator === "!=";
13245				}
13246				if ( !operator ) {
13247					return true;
13248				}
13249
13250				result += "";
13251
13252				/* eslint-disable max-len */
13253
13254				return operator === "=" ? result === check :
13255					operator === "!=" ? result !== check :
13256					operator === "^=" ? check && result.indexOf( check ) === 0 :
13257					operator === "*=" ? check && result.indexOf( check ) > -1 :
13258					operator === "$=" ? check && result.slice( -check.length ) === check :
13259					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
13260					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
13261					false;
13262				/* eslint-enable max-len */
13263
13264			};
13265		},
13266
13267		"CHILD": function( type, what, _argument, first, last ) {
13268			var simple = type.slice( 0, 3 ) !== "nth",
13269				forward = type.slice( -4 ) !== "last",
13270				ofType = what === "of-type";
13271
13272			return first === 1 && last === 0 ?
13273
13274				// Shortcut for :nth-*(n)
13275				function( elem ) {
13276					return !!elem.parentNode;
13277				} :
13278
13279				function( elem, _context, xml ) {
13280					var cache, uniqueCache, outerCache, node, nodeIndex, start,
13281						dir = simple !== forward ? "nextSibling" : "previousSibling",
13282						parent = elem.parentNode,
13283						name = ofType && elem.nodeName.toLowerCase(),
13284						useCache = !xml && !ofType,
13285						diff = false;
13286
13287					if ( parent ) {
13288
13289						// :(first|last|only)-(child|of-type)
13290						if ( simple ) {
13291							while ( dir ) {
13292								node = elem;
13293								while ( ( node = node[ dir ] ) ) {
13294									if ( ofType ?
13295										node.nodeName.toLowerCase() === name :
13296										node.nodeType === 1 ) {
13297
13298										return false;
13299									}
13300								}
13301
13302								// Reverse direction for :only-* (if we haven't yet done so)
13303								start = dir = type === "only" && !start && "nextSibling";
13304							}
13305							return true;
13306						}
13307
13308						start = [ forward ? parent.firstChild : parent.lastChild ];
13309
13310						// non-xml :nth-child(...) stores cache data on `parent`
13311						if ( forward && useCache ) {
13312
13313							// Seek `elem` from a previously-cached index
13314
13315							// ...in a gzip-friendly way
13316							node = parent;
13317							outerCache = node[ expando ] || ( node[ expando ] = {} );
13318
13319							// Support: IE <9 only
13320							// Defend against cloned attroperties (jQuery gh-1709)
13321							uniqueCache = outerCache[ node.uniqueID ] ||
13322								( outerCache[ node.uniqueID ] = {} );
13323
13324							cache = uniqueCache[ type ] || [];
13325							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
13326							diff = nodeIndex && cache[ 2 ];
13327							node = nodeIndex && parent.childNodes[ nodeIndex ];
13328
13329							while ( ( node = ++nodeIndex && node && node[ dir ] ||
13330
13331								// Fallback to seeking `elem` from the start
13332								( diff = nodeIndex = 0 ) || start.pop() ) ) {
13333
13334								// When found, cache indexes on `parent` and break
13335								if ( node.nodeType === 1 && ++diff && node === elem ) {
13336									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
13337									break;
13338								}
13339							}
13340
13341						} else {
13342
13343							// Use previously-cached element index if available
13344							if ( useCache ) {
13345
13346								// ...in a gzip-friendly way
13347								node = elem;
13348								outerCache = node[ expando ] || ( node[ expando ] = {} );
13349
13350								// Support: IE <9 only
13351								// Defend against cloned attroperties (jQuery gh-1709)
13352								uniqueCache = outerCache[ node.uniqueID ] ||
13353									( outerCache[ node.uniqueID ] = {} );
13354
13355								cache = uniqueCache[ type ] || [];
13356								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
13357								diff = nodeIndex;
13358							}
13359
13360							// xml :nth-child(...)
13361							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
13362							if ( diff === false ) {
13363
13364								// Use the same loop as above to seek `elem` from the start
13365								while ( ( node = ++nodeIndex && node && node[ dir ] ||
13366									( diff = nodeIndex = 0 ) || start.pop() ) ) {
13367
13368									if ( ( ofType ?
13369										node.nodeName.toLowerCase() === name :
13370										node.nodeType === 1 ) &&
13371										++diff ) {
13372
13373										// Cache the index of each encountered element
13374										if ( useCache ) {
13375											outerCache = node[ expando ] ||
13376												( node[ expando ] = {} );
13377
13378											// Support: IE <9 only
13379											// Defend against cloned attroperties (jQuery gh-1709)
13380											uniqueCache = outerCache[ node.uniqueID ] ||
13381												( outerCache[ node.uniqueID ] = {} );
13382
13383											uniqueCache[ type ] = [ dirruns, diff ];
13384										}
13385
13386										if ( node === elem ) {
13387											break;
13388										}
13389									}
13390								}
13391							}
13392						}
13393
13394						// Incorporate the offset, then check against cycle size
13395						diff -= last;
13396						return diff === first || ( diff % first === 0 && diff / first >= 0 );
13397					}
13398				};
13399		},
13400
13401		"PSEUDO": function( pseudo, argument ) {
13402
13403			// pseudo-class names are case-insensitive
13404			// http://www.w3.org/TR/selectors/#pseudo-classes
13405			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
13406			// Remember that setFilters inherits from pseudos
13407			var args,
13408				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
13409					Sizzle.error( "unsupported pseudo: " + pseudo );
13410
13411			// The user may use createPseudo to indicate that
13412			// arguments are needed to create the filter function
13413			// just as Sizzle does
13414			if ( fn[ expando ] ) {
13415				return fn( argument );
13416			}
13417
13418			// But maintain support for old signatures
13419			if ( fn.length > 1 ) {
13420				args = [ pseudo, pseudo, "", argument ];
13421				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
13422					markFunction( function( seed, matches ) {
13423						var idx,
13424							matched = fn( seed, argument ),
13425							i = matched.length;
13426						while ( i-- ) {
13427							idx = indexOf( seed, matched[ i ] );
13428							seed[ idx ] = !( matches[ idx ] = matched[ i ] );
13429						}
13430					} ) :
13431					function( elem ) {
13432						return fn( elem, 0, args );
13433					};
13434			}
13435
13436			return fn;
13437		}
13438	},
13439
13440	pseudos: {
13441
13442		// Potentially complex pseudos
13443		"not": markFunction( function( selector ) {
13444
13445			// Trim the selector passed to compile
13446			// to avoid treating leading and trailing
13447			// spaces as combinators
13448			var input = [],
13449				results = [],
13450				matcher = compile( selector.replace( rtrim, "$1" ) );
13451
13452			return matcher[ expando ] ?
13453				markFunction( function( seed, matches, _context, xml ) {
13454					var elem,
13455						unmatched = matcher( seed, null, xml, [] ),
13456						i = seed.length;
13457
13458					// Match elements unmatched by `matcher`
13459					while ( i-- ) {
13460						if ( ( elem = unmatched[ i ] ) ) {
13461							seed[ i ] = !( matches[ i ] = elem );
13462						}
13463					}
13464				} ) :
13465				function( elem, _context, xml ) {
13466					input[ 0 ] = elem;
13467					matcher( input, null, xml, results );
13468
13469					// Don't keep the element (issue #299)
13470					input[ 0 ] = null;
13471					return !results.pop();
13472				};
13473		} ),
13474
13475		"has": markFunction( function( selector ) {
13476			return function( elem ) {
13477				return Sizzle( selector, elem ).length > 0;
13478			};
13479		} ),
13480
13481		"contains": markFunction( function( text ) {
13482			text = text.replace( runescape, funescape );
13483			return function( elem ) {
13484				return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
13485			};
13486		} ),
13487
13488		// "Whether an element is represented by a :lang() selector
13489		// is based solely on the element's language value
13490		// being equal to the identifier C,
13491		// or beginning with the identifier C immediately followed by "-".
13492		// The matching of C against the element's language value is performed case-insensitively.
13493		// The identifier C does not have to be a valid language name."
13494		// http://www.w3.org/TR/selectors/#lang-pseudo
13495		"lang": markFunction( function( lang ) {
13496
13497			// lang value must be a valid identifier
13498			if ( !ridentifier.test( lang || "" ) ) {
13499				Sizzle.error( "unsupported lang: " + lang );
13500			}
13501			lang = lang.replace( runescape, funescape ).toLowerCase();
13502			return function( elem ) {
13503				var elemLang;
13504				do {
13505					if ( ( elemLang = documentIsHTML ?
13506						elem.lang :
13507						elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
13508
13509						elemLang = elemLang.toLowerCase();
13510						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
13511					}
13512				} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
13513				return false;
13514			};
13515		} ),
13516
13517		// Miscellaneous
13518		"target": function( elem ) {
13519			var hash = window.location && window.location.hash;
13520			return hash && hash.slice( 1 ) === elem.id;
13521		},
13522
13523		"root": function( elem ) {
13524			return elem === docElem;
13525		},
13526
13527		"focus": function( elem ) {
13528			return elem === document.activeElement &&
13529				( !document.hasFocus || document.hasFocus() ) &&
13530				!!( elem.type || elem.href || ~elem.tabIndex );
13531		},
13532
13533		// Boolean properties
13534		"enabled": createDisabledPseudo( false ),
13535		"disabled": createDisabledPseudo( true ),
13536
13537		"checked": function( elem ) {
13538
13539			// In CSS3, :checked should return both checked and selected elements
13540			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
13541			var nodeName = elem.nodeName.toLowerCase();
13542			return ( nodeName === "input" && !!elem.checked ) ||
13543				( nodeName === "option" && !!elem.selected );
13544		},
13545
13546		"selected": function( elem ) {
13547
13548			// Accessing this property makes selected-by-default
13549			// options in Safari work properly
13550			if ( elem.parentNode ) {
13551				// eslint-disable-next-line no-unused-expressions
13552				elem.parentNode.selectedIndex;
13553			}
13554
13555			return elem.selected === true;
13556		},
13557
13558		// Contents
13559		"empty": function( elem ) {
13560
13561			// http://www.w3.org/TR/selectors/#empty-pseudo
13562			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
13563			//   but not by others (comment: 8; processing instruction: 7; etc.)
13564			// nodeType < 6 works because attributes (2) do not appear as children
13565			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
13566				if ( elem.nodeType < 6 ) {
13567					return false;
13568				}
13569			}
13570			return true;
13571		},
13572
13573		"parent": function( elem ) {
13574			return !Expr.pseudos[ "empty" ]( elem );
13575		},
13576
13577		// Element/input types
13578		"header": function( elem ) {
13579			return rheader.test( elem.nodeName );
13580		},
13581
13582		"input": function( elem ) {
13583			return rinputs.test( elem.nodeName );
13584		},
13585
13586		"button": function( elem ) {
13587			var name = elem.nodeName.toLowerCase();
13588			return name === "input" && elem.type === "button" || name === "button";
13589		},
13590
13591		"text": function( elem ) {
13592			var attr;
13593			return elem.nodeName.toLowerCase() === "input" &&
13594				elem.type === "text" &&
13595
vendor: 22,617 bytes, lines 13596-14437
13596				// Support: IE<8
13597				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
13598				( ( attr = elem.getAttribute( "type" ) ) == null ||
13599					attr.toLowerCase() === "text" );
13600		},
13601
13602		// Position-in-collection
13603		"first": createPositionalPseudo( function() {
13604			return [ 0 ];
13605		} ),
13606
13607		"last": createPositionalPseudo( function( _matchIndexes, length ) {
13608			return [ length - 1 ];
13609		} ),
13610
13611		"eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
13612			return [ argument < 0 ? argument + length : argument ];
13613		} ),
13614
13615		"even": createPositionalPseudo( function( matchIndexes, length ) {
13616			var i = 0;
13617			for ( ; i < length; i += 2 ) {
13618				matchIndexes.push( i );
13619			}
13620			return matchIndexes;
13621		} ),
13622
13623		"odd": createPositionalPseudo( function( matchIndexes, length ) {
13624			var i = 1;
13625			for ( ; i < length; i += 2 ) {
13626				matchIndexes.push( i );
13627			}
13628			return matchIndexes;
13629		} ),
13630
13631		"lt": createPositionalPseudo( function( matchIndexes, length, argument ) {
13632			var i = argument < 0 ?
13633				argument + length :
13634				argument > length ?
13635					length :
13636					argument;
13637			for ( ; --i >= 0; ) {
13638				matchIndexes.push( i );
13639			}
13640			return matchIndexes;
13641		} ),
13642
13643		"gt": createPositionalPseudo( function( matchIndexes, length, argument ) {
13644			var i = argument < 0 ? argument + length : argument;
13645			for ( ; ++i < length; ) {
13646				matchIndexes.push( i );
13647			}
13648			return matchIndexes;
13649		} )
13650	}
13651};
13652
13653Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ];
13654
13655// Add button/input type pseudos
13656for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
13657	Expr.pseudos[ i ] = createInputPseudo( i );
13658}
13659for ( i in { submit: true, reset: true } ) {
13660	Expr.pseudos[ i ] = createButtonPseudo( i );
13661}
13662
13663// Easy API for creating new setFilters
13664function setFilters() {}
13665setFilters.prototype = Expr.filters = Expr.pseudos;
13666Expr.setFilters = new setFilters();
13667
13668tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
13669	var matched, match, tokens, type,
13670		soFar, groups, preFilters,
13671		cached = tokenCache[ selector + " " ];
13672
13673	if ( cached ) {
13674		return parseOnly ? 0 : cached.slice( 0 );
13675	}
13676
13677	soFar = selector;
13678	groups = [];
13679	preFilters = Expr.preFilter;
13680
13681	while ( soFar ) {
13682
13683		// Comma and first run
13684		if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
13685			if ( match ) {
13686
13687				// Don't consume trailing commas as valid
13688				soFar = soFar.slice( match[ 0 ].length ) || soFar;
13689			}
13690			groups.push( ( tokens = [] ) );
13691		}
13692
13693		matched = false;
13694
13695		// Combinators
13696		if ( ( match = rcombinators.exec( soFar ) ) ) {
13697			matched = match.shift();
13698			tokens.push( {
13699				value: matched,
13700
13701				// Cast descendant combinators to space
13702				type: match[ 0 ].replace( rtrim, " " )
13703			} );
13704			soFar = soFar.slice( matched.length );
13705		}
13706
13707		// Filters
13708		for ( type in Expr.filter ) {
13709			if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
13710				( match = preFilters[ type ]( match ) ) ) ) {
13711				matched = match.shift();
13712				tokens.push( {
13713					value: matched,
13714					type: type,
13715					matches: match
13716				} );
13717				soFar = soFar.slice( matched.length );
13718			}
13719		}
13720
13721		if ( !matched ) {
13722			break;
13723		}
13724	}
13725
13726	// Return the length of the invalid excess
13727	// if we're just parsing
13728	// Otherwise, throw an error or return tokens
13729	return parseOnly ?
13730		soFar.length :
13731		soFar ?
13732			Sizzle.error( selector ) :
13733
13734			// Cache the tokens
13735			tokenCache( selector, groups ).slice( 0 );
13736};
13737
13738function toSelector( tokens ) {
13739	var i = 0,
13740		len = tokens.length,
13741		selector = "";
13742	for ( ; i < len; i++ ) {
13743		selector += tokens[ i ].value;
13744	}
13745	return selector;
13746}
13747
13748function addCombinator( matcher, combinator, base ) {
13749	var dir = combinator.dir,
13750		skip = combinator.next,
13751		key = skip || dir,
13752		checkNonElements = base && key === "parentNode",
13753		doneName = done++;
13754
13755	return combinator.first ?
13756
13757		// Check against closest ancestor/preceding element
13758		function( elem, context, xml ) {
13759			while ( ( elem = elem[ dir ] ) ) {
13760				if ( elem.nodeType === 1 || checkNonElements ) {
13761					return matcher( elem, context, xml );
13762				}
13763			}
13764			return false;
13765		} :
13766
13767		// Check against all ancestor/preceding elements
13768		function( elem, context, xml ) {
13769			var oldCache, uniqueCache, outerCache,
13770				newCache = [ dirruns, doneName ];
13771
13772			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
13773			if ( xml ) {
13774				while ( ( elem = elem[ dir ] ) ) {
13775					if ( elem.nodeType === 1 || checkNonElements ) {
13776						if ( matcher( elem, context, xml ) ) {
13777							return true;
13778						}
13779					}
13780				}
13781			} else {
13782				while ( ( elem = elem[ dir ] ) ) {
13783					if ( elem.nodeType === 1 || checkNonElements ) {
13784						outerCache = elem[ expando ] || ( elem[ expando ] = {} );
13785
13786						// Support: IE <9 only
13787						// Defend against cloned attroperties (jQuery gh-1709)
13788						uniqueCache = outerCache[ elem.uniqueID ] ||
13789							( outerCache[ elem.uniqueID ] = {} );
13790
13791						if ( skip && skip === elem.nodeName.toLowerCase() ) {
13792							elem = elem[ dir ] || elem;
13793						} else if ( ( oldCache = uniqueCache[ key ] ) &&
13794							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
13795
13796							// Assign to newCache so results back-propagate to previous elements
13797							return ( newCache[ 2 ] = oldCache[ 2 ] );
13798						} else {
13799
13800							// Reuse newcache so results back-propagate to previous elements
13801							uniqueCache[ key ] = newCache;
13802
13803							// A match means we're done; a fail means we have to keep checking
13804							if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
13805								return true;
13806							}
13807						}
13808					}
13809				}
13810			}
13811			return false;
13812		};
13813}
13814
13815function elementMatcher( matchers ) {
13816	return matchers.length > 1 ?
13817		function( elem, context, xml ) {
13818			var i = matchers.length;
13819			while ( i-- ) {
13820				if ( !matchers[ i ]( elem, context, xml ) ) {
13821					return false;
13822				}
13823			}
13824			return true;
13825		} :
13826		matchers[ 0 ];
13827}
13828
13829function multipleContexts( selector, contexts, results ) {
13830	var i = 0,
13831		len = contexts.length;
13832	for ( ; i < len; i++ ) {
13833		Sizzle( selector, contexts[ i ], results );
13834	}
13835	return results;
13836}
13837
13838function condense( unmatched, map, filter, context, xml ) {
13839	var elem,
13840		newUnmatched = [],
13841		i = 0,
13842		len = unmatched.length,
13843		mapped = map != null;
13844
13845	for ( ; i < len; i++ ) {
13846		if ( ( elem = unmatched[ i ] ) ) {
13847			if ( !filter || filter( elem, context, xml ) ) {
13848				newUnmatched.push( elem );
13849				if ( mapped ) {
13850					map.push( i );
13851				}
13852			}
13853		}
13854	}
13855
13856	return newUnmatched;
13857}
13858
13859function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
13860	if ( postFilter && !postFilter[ expando ] ) {
13861		postFilter = setMatcher( postFilter );
13862	}
13863	if ( postFinder && !postFinder[ expando ] ) {
13864		postFinder = setMatcher( postFinder, postSelector );
13865	}
13866	return markFunction( function( seed, results, context, xml ) {
13867		var temp, i, elem,
13868			preMap = [],
13869			postMap = [],
13870			preexisting = results.length,
13871
13872			// Get initial elements from seed or context
13873			elems = seed || multipleContexts(
13874				selector || "*",
13875				context.nodeType ? [ context ] : context,
13876				[]
13877			),
13878
13879			// Prefilter to get matcher input, preserving a map for seed-results synchronization
13880			matcherIn = preFilter && ( seed || !selector ) ?
13881				condense( elems, preMap, preFilter, context, xml ) :
13882				elems,
13883
13884			matcherOut = matcher ?
13885
13886				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
13887				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
13888
13889					// ...intermediate processing is necessary
13890					[] :
13891
13892					// ...otherwise use results directly
13893					results :
13894				matcherIn;
13895
13896		// Find primary matches
13897		if ( matcher ) {
13898			matcher( matcherIn, matcherOut, context, xml );
13899		}
13900
13901		// Apply postFilter
13902		if ( postFilter ) {
13903			temp = condense( matcherOut, postMap );
13904			postFilter( temp, [], context, xml );
13905
13906			// Un-match failing elements by moving them back to matcherIn
13907			i = temp.length;
13908			while ( i-- ) {
13909				if ( ( elem = temp[ i ] ) ) {
13910					matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
13911				}
13912			}
13913		}
13914
13915		if ( seed ) {
13916			if ( postFinder || preFilter ) {
13917				if ( postFinder ) {
13918
13919					// Get the final matcherOut by condensing this intermediate into postFinder contexts
13920					temp = [];
13921					i = matcherOut.length;
13922					while ( i-- ) {
13923						if ( ( elem = matcherOut[ i ] ) ) {
13924
13925							// Restore matcherIn since elem is not yet a final match
13926							temp.push( ( matcherIn[ i ] = elem ) );
13927						}
13928					}
13929					postFinder( null, ( matcherOut = [] ), temp, xml );
13930				}
13931
13932				// Move matched elements from seed to results to keep them synchronized
13933				i = matcherOut.length;
13934				while ( i-- ) {
13935					if ( ( elem = matcherOut[ i ] ) &&
13936						( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {
13937
13938						seed[ temp ] = !( results[ temp ] = elem );
13939					}
13940				}
13941			}
13942
13943		// Add elements to results, through postFinder if defined
13944		} else {
13945			matcherOut = condense(
13946				matcherOut === results ?
13947					matcherOut.splice( preexisting, matcherOut.length ) :
13948					matcherOut
13949			);
13950			if ( postFinder ) {
13951				postFinder( null, results, matcherOut, xml );
13952			} else {
13953				push.apply( results, matcherOut );
13954			}
13955		}
13956	} );
13957}
13958
13959function matcherFromTokens( tokens ) {
13960	var checkContext, matcher, j,
13961		len = tokens.length,
13962		leadingRelative = Expr.relative[ tokens[ 0 ].type ],
13963		implicitRelative = leadingRelative || Expr.relative[ " " ],
13964		i = leadingRelative ? 1 : 0,
13965
13966		// The foundational matcher ensures that elements are reachable from top-level context(s)
13967		matchContext = addCombinator( function( elem ) {
13968			return elem === checkContext;
13969		}, implicitRelative, true ),
13970		matchAnyContext = addCombinator( function( elem ) {
13971			return indexOf( checkContext, elem ) > -1;
13972		}, implicitRelative, true ),
13973		matchers = [ function( elem, context, xml ) {
13974			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
13975				( checkContext = context ).nodeType ?
13976					matchContext( elem, context, xml ) :
13977					matchAnyContext( elem, context, xml ) );
13978
13979			// Avoid hanging onto element (issue #299)
13980			checkContext = null;
13981			return ret;
13982		} ];
13983
13984	for ( ; i < len; i++ ) {
13985		if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
13986			matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
13987		} else {
13988			matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
13989
13990			// Return special upon seeing a positional matcher
13991			if ( matcher[ expando ] ) {
13992
13993				// Find the next relative operator (if any) for proper handling
13994				j = ++i;
13995				for ( ; j < len; j++ ) {
13996					if ( Expr.relative[ tokens[ j ].type ] ) {
13997						break;
13998					}
13999				}
14000				return setMatcher(
14001					i > 1 && elementMatcher( matchers ),
14002					i > 1 && toSelector(
14003
14004					// If the preceding token was a descendant combinator, insert an implicit any-element `*`
14005					tokens
14006						.slice( 0, i - 1 )
14007						.concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
14008					).replace( rtrim, "$1" ),
14009					matcher,
14010					i < j && matcherFromTokens( tokens.slice( i, j ) ),
14011					j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
14012					j < len && toSelector( tokens )
14013				);
14014			}
14015			matchers.push( matcher );
14016		}
14017	}
14018
14019	return elementMatcher( matchers );
14020}
14021
14022function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
14023	var bySet = setMatchers.length > 0,
14024		byElement = elementMatchers.length > 0,
14025		superMatcher = function( seed, context, xml, results, outermost ) {
14026			var elem, j, matcher,
14027				matchedCount = 0,
14028				i = "0",
14029				unmatched = seed && [],
14030				setMatched = [],
14031				contextBackup = outermostContext,
14032
14033				// We must always have either seed elements or outermost context
14034				elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
14035
14036				// Use integer dirruns iff this is the outermost matcher
14037				dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
14038				len = elems.length;
14039
14040			if ( outermost ) {
14041
14042				// Support: IE 11+, Edge 17 - 18+
14043				// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
14044				// two documents; shallow comparisons work.
14045				// eslint-disable-next-line eqeqeq
14046				outermostContext = context == document || context || outermost;
14047			}
14048
14049			// Add elements passing elementMatchers directly to results
14050			// Support: IE<9, Safari
14051			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
14052			for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
14053				if ( byElement && elem ) {
14054					j = 0;
14055
14056					// Support: IE 11+, Edge 17 - 18+
14057					// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
14058					// two documents; shallow comparisons work.
14059					// eslint-disable-next-line eqeqeq
14060					if ( !context && elem.ownerDocument != document ) {
14061						setDocument( elem );
14062						xml = !documentIsHTML;
14063					}
14064					while ( ( matcher = elementMatchers[ j++ ] ) ) {
14065						if ( matcher( elem, context || document, xml ) ) {
14066							results.push( elem );
14067							break;
14068						}
14069					}
14070					if ( outermost ) {
14071						dirruns = dirrunsUnique;
14072					}
14073				}
14074
14075				// Track unmatched elements for set filters
14076				if ( bySet ) {
14077
14078					// They will have gone through all possible matchers
14079					if ( ( elem = !matcher && elem ) ) {
14080						matchedCount--;
14081					}
14082
14083					// Lengthen the array for every element, matched or not
14084					if ( seed ) {
14085						unmatched.push( elem );
14086					}
14087				}
14088			}
14089
14090			// `i` is now the count of elements visited above, and adding it to `matchedCount`
14091			// makes the latter nonnegative.
14092			matchedCount += i;
14093
14094			// Apply set filters to unmatched elements
14095			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
14096			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
14097			// no element matchers and no seed.
14098			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
14099			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
14100			// numerically zero.
14101			if ( bySet && i !== matchedCount ) {
14102				j = 0;
14103				while ( ( matcher = setMatchers[ j++ ] ) ) {
14104					matcher( unmatched, setMatched, context, xml );
14105				}
14106
14107				if ( seed ) {
14108
14109					// Reintegrate element matches to eliminate the need for sorting
14110					if ( matchedCount > 0 ) {
14111						while ( i-- ) {
14112							if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
14113								setMatched[ i ] = pop.call( results );
14114							}
14115						}
14116					}
14117
14118					// Discard index placeholder values to get only actual matches
14119					setMatched = condense( setMatched );
14120				}
14121
14122				// Add matches to results
14123				push.apply( results, setMatched );
14124
14125				// Seedless set matches succeeding multiple successful matchers stipulate sorting
14126				if ( outermost && !seed && setMatched.length > 0 &&
14127					( matchedCount + setMatchers.length ) > 1 ) {
14128
14129					Sizzle.uniqueSort( results );
14130				}
14131			}
14132
14133			// Override manipulation of globals by nested matchers
14134			if ( outermost ) {
14135				dirruns = dirrunsUnique;
14136				outermostContext = contextBackup;
14137			}
14138
14139			return unmatched;
14140		};
14141
14142	return bySet ?
14143		markFunction( superMatcher ) :
14144		superMatcher;
14145}
14146
14147compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
14148	var i,
14149		setMatchers = [],
14150		elementMatchers = [],
14151		cached = compilerCache[ selector + " " ];
14152
14153	if ( !cached ) {
14154
14155		// Generate a function of recursive functions that can be used to check each element
14156		if ( !match ) {
14157			match = tokenize( selector );
14158		}
14159		i = match.length;
14160		while ( i-- ) {
14161			cached = matcherFromTokens( match[ i ] );
14162			if ( cached[ expando ] ) {
14163				setMatchers.push( cached );
14164			} else {
14165				elementMatchers.push( cached );
14166			}
14167		}
14168
14169		// Cache the compiled function
14170		cached = compilerCache(
14171			selector,
14172			matcherFromGroupMatchers( elementMatchers, setMatchers )
14173		);
14174
14175		// Save selector and tokenization
14176		cached.selector = selector;
14177	}
14178	return cached;
14179};
14180
14181/**
14182 * A low-level selection function that works with Sizzle's compiled
14183 *  selector functions
14184 * @param {String|Function} selector A selector or a pre-compiled
14185 *  selector function built with Sizzle.compile
14186 * @param {Element} context
14187 * @param {Array} [results]
14188 * @param {Array} [seed] A set of elements to match against
14189 */
14190select = Sizzle.select = function( selector, context, results, seed ) {
14191	var i, tokens, token, type, find,
14192		compiled = typeof selector === "function" && selector,
14193		match = !seed && tokenize( ( selector = compiled.selector || selector ) );
14194
14195	results = results || [];
14196
14197	// Try to minimize operations if there is only one selector in the list and no seed
14198	// (the latter of which guarantees us context)
14199	if ( match.length === 1 ) {
14200
14201		// Reduce context if the leading compound selector is an ID
14202		tokens = match[ 0 ] = match[ 0 ].slice( 0 );
14203		if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
14204			context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
14205
14206			context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
14207				.replace( runescape, funescape ), context ) || [] )[ 0 ];
14208			if ( !context ) {
14209				return results;
14210
14211			// Precompiled matchers will still verify ancestry, so step up a level
14212			} else if ( compiled ) {
14213				context = context.parentNode;
14214			}
14215
14216			selector = selector.slice( tokens.shift().value.length );
14217		}
14218
14219		// Fetch a seed set for right-to-left matching
14220		i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length;
14221		while ( i-- ) {
14222			token = tokens[ i ];
14223
14224			// Abort if we hit a combinator
14225			if ( Expr.relative[ ( type = token.type ) ] ) {
14226				break;
14227			}
14228			if ( ( find = Expr.find[ type ] ) ) {
14229
14230				// Search, expanding context for leading sibling combinators
14231				if ( ( seed = find(
14232					token.matches[ 0 ].replace( runescape, funescape ),
14233					rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||
14234						context
14235				) ) ) {
14236
14237					// If seed is empty or no tokens remain, we can return early
14238					tokens.splice( i, 1 );
14239					selector = seed.length && toSelector( tokens );
14240					if ( !selector ) {
14241						push.apply( results, seed );
14242						return results;
14243					}
14244
14245					break;
14246				}
14247			}
14248		}
14249	}
14250
14251	// Compile and execute a filtering function if one is not provided
14252	// Provide `match` to avoid retokenization if we modified the selector above
14253	( compiled || compile( selector, match ) )(
14254		seed,
14255		context,
14256		!documentIsHTML,
14257		results,
14258		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
14259	);
14260	return results;
14261};
14262
14263// One-time assignments
14264
14265// Sort stability
14266support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
14267
14268// Support: Chrome 14-35+
14269// Always assume duplicates if they aren't passed to the comparison function
14270support.detectDuplicates = !!hasDuplicate;
14271
14272// Initialize against the default document
14273setDocument();
14274
14275// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
14276// Detached nodes confoundingly follow *each other*
14277support.sortDetached = assert( function( el ) {
14278
14279	// Should return 1, but returns 4 (following)
14280	return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
14281} );
14282
14283// Support: IE<8
14284// Prevent attribute/property "interpolation"
14285// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
14286if ( !assert( function( el ) {
14287	el.innerHTML = "<a href='#'></a>";
14288	return el.firstChild.getAttribute( "href" ) === "#";
14289} ) ) {
14290	addHandle( "type|href|height|width", function( elem, name, isXML ) {
14291		if ( !isXML ) {
14292			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
14293		}
14294	} );
14295}
14296
14297// Support: IE<9
14298// Use defaultValue in place of getAttribute("value")
14299if ( !support.attributes || !assert( function( el ) {
14300	el.innerHTML = "<input/>";
14301	el.firstChild.setAttribute( "value", "" );
14302	return el.firstChild.getAttribute( "value" ) === "";
14303} ) ) {
14304	addHandle( "value", function( elem, _name, isXML ) {
14305		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
14306			return elem.defaultValue;
14307		}
14308	} );
14309}
14310
14311// Support: IE<9
14312// Use getAttributeNode to fetch booleans when getAttribute lies
14313if ( !assert( function( el ) {
14314	return el.getAttribute( "disabled" ) == null;
14315} ) ) {
14316	addHandle( booleans, function( elem, name, isXML ) {
14317		var val;
14318		if ( !isXML ) {
14319			return elem[ name ] === true ? name.toLowerCase() :
14320				( val = elem.getAttributeNode( name ) ) && val.specified ?
14321					val.value :
14322					null;
14323		}
14324	} );
14325}
14326
14327return Sizzle;
14328
14329} )( window );
14330
14331
14332
14333jQuery.find = Sizzle;
14334jQuery.expr = Sizzle.selectors;
14335
14336// Deprecated
14337jQuery.expr[ ":" ] = jQuery.expr.pseudos;
14338jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
14339jQuery.text = Sizzle.getText;
14340jQuery.isXMLDoc = Sizzle.isXML;
14341jQuery.contains = Sizzle.contains;
14342jQuery.escapeSelector = Sizzle.escape;
14343
14344
14345
14346
14347var dir = function( elem, dir, until ) {
14348	var matched = [],
14349		truncate = until !== undefined;
14350
14351	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
14352		if ( elem.nodeType === 1 ) {
14353			if ( truncate && jQuery( elem ).is( until ) ) {
14354				break;
14355			}
14356			matched.push( elem );
14357		}
14358	}
14359	return matched;
14360};
14361
14362
14363var siblings = function( n, elem ) {
14364	var matched = [];
14365
14366	for ( ; n; n = n.nextSibling ) {
14367		if ( n.nodeType === 1 && n !== elem ) {
14368			matched.push( n );
14369		}
14370	}
14371
14372	return matched;
14373};
14374
14375
14376var rneedsContext = jQuery.expr.match.needsContext;
14377
14378
14379
14380function nodeName( elem, name ) {
14381
14382	return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
14383
14384}
14385var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
14386
14387
14388
14389// Implement the identical functionality for filter and not
14390function winnow( elements, qualifier, not ) {
14391	if ( isFunction( qualifier ) ) {
14392		return jQuery.grep( elements, function( elem, i ) {
14393			return !!qualifier.call( elem, i, elem ) !== not;
14394		} );
14395	}
14396
14397	// Single element
14398	if ( qualifier.nodeType ) {
14399		return jQuery.grep( elements, function( elem ) {
14400			return ( elem === qualifier ) !== not;
14401		} );
14402	}
14403
14404	// Arraylike of elements (jQuery, arguments, Array)
14405	if ( typeof qualifier !== "string" ) {
14406		return jQuery.grep( elements, function( elem ) {
14407			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
14408		} );
14409	}
14410
14411	// Filtered directly for both simple and complex selectors
14412	return jQuery.filter( qualifier, elements, not );
14413}
14414
14415jQuery.filter = function( expr, elems, not ) {
14416	var elem = elems[ 0 ];
14417
14418	if ( not ) {
14419		expr = ":not(" + expr + ")";
14420	}
14421
14422	if ( elems.length === 1 && elem.nodeType === 1 ) {
14423		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
14424	}
14425
14426	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
14427		return elem.nodeType === 1;
14428	} ) );
14429};
14430
14431jQuery.fn.extend( {
14432	find: function( selector ) {
14433		var i, ret,
14434			len = this.length,
14435			self = this;
14436
14437		if ( typeof selector !== "string" ) {
vendor: 4,670 bytes, lines 14438-14623
14438			return this.pushStack( jQuery( selector ).filter( function() {
14439				for ( i = 0; i < len; i++ ) {
14440					if ( jQuery.contains( self[ i ], this ) ) {
14441						return true;
14442					}
14443				}
14444			} ) );
14445		}
14446
14447		ret = this.pushStack( [] );
14448
14449		for ( i = 0; i < len; i++ ) {
14450			jQuery.find( selector, self[ i ], ret );
14451		}
14452
14453		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
14454	},
14455	filter: function( selector ) {
14456		return this.pushStack( winnow( this, selector || [], false ) );
14457	},
14458	not: function( selector ) {
14459		return this.pushStack( winnow( this, selector || [], true ) );
14460	},
14461	is: function( selector ) {
14462		return !!winnow(
14463			this,
14464
14465			// If this is a positional/relative selector, check membership in the returned set
14466			// so $("p:first").is("p:last") won't return true for a doc with two "p".
14467			typeof selector === "string" && rneedsContext.test( selector ) ?
14468				jQuery( selector ) :
14469				selector || [],
14470			false
14471		).length;
14472	}
14473} );
14474
14475
14476// Initialize a jQuery object
14477
14478
14479// A central reference to the root jQuery(document)
14480var rootjQuery,
14481
14482	// A simple way to check for HTML strings
14483	// Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521)
14484	// Strict HTML recognition (trac-11290: must start with <)
14485	// Shortcut simple #id case for speed
14486	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
14487
14488	init = jQuery.fn.init = function( selector, context, root ) {
14489		var match, elem;
14490
14491		// HANDLE: $(""), $(null), $(undefined), $(false)
14492		if ( !selector ) {
14493			return this;
14494		}
14495
14496		// Method init() accepts an alternate rootjQuery
14497		// so migrate can support jQuery.sub (gh-2101)
14498		root = root || rootjQuery;
14499
14500		// Handle HTML strings
14501		if ( typeof selector === "string" ) {
14502			if ( selector[ 0 ] === "<" &&
14503				selector[ selector.length - 1 ] === ">" &&
14504				selector.length >= 3 ) {
14505
14506				// Assume that strings that start and end with <> are HTML and skip the regex check
14507				match = [ null, selector, null ];
14508
14509			} else {
14510				match = rquickExpr.exec( selector );
14511			}
14512
14513			// Match html or make sure no context is specified for #id
14514			if ( match && ( match[ 1 ] || !context ) ) {
14515
14516				// HANDLE: $(html) -> $(array)
14517				if ( match[ 1 ] ) {
14518					context = context instanceof jQuery ? context[ 0 ] : context;
14519
14520					// Option to run scripts is true for back-compat
14521					// Intentionally let the error be thrown if parseHTML is not present
14522					jQuery.merge( this, jQuery.parseHTML(
14523						match[ 1 ],
14524						context && context.nodeType ? context.ownerDocument || context : document,
14525						true
14526					) );
14527
14528					// HANDLE: $(html, props)
14529					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
14530						for ( match in context ) {
14531
14532							// Properties of context are called as methods if possible
14533							if ( isFunction( this[ match ] ) ) {
14534								this[ match ]( context[ match ] );
14535
14536							// ...and otherwise set as attributes
14537							} else {
14538								this.attr( match, context[ match ] );
14539							}
14540						}
14541					}
14542
14543					return this;
14544
14545				// HANDLE: $(#id)
14546				} else {
14547					elem = document.getElementById( match[ 2 ] );
14548
14549					if ( elem ) {
14550
14551						// Inject the element directly into the jQuery object
14552						this[ 0 ] = elem;
14553						this.length = 1;
14554					}
14555					return this;
14556				}
14557
14558			// HANDLE: $(expr, $(...))
14559			} else if ( !context || context.jquery ) {
14560				return ( context || root ).find( selector );
14561
14562			// HANDLE: $(expr, context)
14563			// (which is just equivalent to: $(context).find(expr)
14564			} else {
14565				return this.constructor( context ).find( selector );
14566			}
14567
14568		// HANDLE: $(DOMElement)
14569		} else if ( selector.nodeType ) {
14570			this[ 0 ] = selector;
14571			this.length = 1;
14572			return this;
14573
14574		// HANDLE: $(function)
14575		// Shortcut for document ready
14576		} else if ( isFunction( selector ) ) {
14577			return root.ready !== undefined ?
14578				root.ready( selector ) :
14579
14580				// Execute immediately if ready is not present
14581				selector( jQuery );
14582		}
14583
14584		return jQuery.makeArray( selector, this );
14585	};
14586
14587// Give the init function the jQuery prototype for later instantiation
14588init.prototype = jQuery.fn;
14589
14590// Initialize central reference
14591rootjQuery = jQuery( document );
14592
14593
14594var rparentsprev = /^(?:parents|prev(?:Until|All))/,
14595
14596	// Methods guaranteed to produce a unique set when starting from a unique set
14597	guaranteedUnique = {
14598		children: true,
14599		contents: true,
14600		next: true,
14601		prev: true
14602	};
14603
14604jQuery.fn.extend( {
14605	has: function( target ) {
14606		var targets = jQuery( target, this ),
14607			l = targets.length;
14608
14609		return this.filter( function() {
14610			var i = 0;
14611			for ( ; i < l; i++ ) {
14612				if ( jQuery.contains( this, targets[ i ] ) ) {
14613					return true;
14614				}
14615			}
14616		} );
14617	},
14618
14619	closest: function( selectors, context ) {
14620		var cur,
14621			i = 0,
14622			l = this.length,
14623			matched = [],
14624			targets = typeof selectors !== "string" && jQuery( selectors );
14625
14626		// Positional selectors never match, since there's no _selection_ context
14627		if ( !rneedsContext.test( selectors ) ) {
14628			for ( ; i < l; i++ ) {
14629				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
14630
14631					// Always skip document fragments
14632					if ( cur.nodeType < 11 && ( targets ?
14633						targets.index( cur ) > -1 :
14634
14635						// Don't pass non-elements to Sizzle
vendor: 14,565 bytes, lines 14635-15190
14635
14636						cur.nodeType === 1 &&
14637							jQuery.find.matchesSelector( cur, selectors ) ) ) {
14638
14639						matched.push( cur );
14640						break;
14641					}
14642				}
14643			}
14644		}
14645
14646		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
14647	},
14648
14649	// Determine the position of an element within the set
14650	index: function( elem ) {
14651
14652		// No argument, return index in parent
14653		if ( !elem ) {
14654			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
14655		}
14656
14657		// Index in selector
14658		if ( typeof elem === "string" ) {
14659			return indexOf.call( jQuery( elem ), this[ 0 ] );
14660		}
14661
14662		// Locate the position of the desired element
14663		return indexOf.call( this,
14664
14665			// If it receives a jQuery object, the first element is used
14666			elem.jquery ? elem[ 0 ] : elem
14667		);
14668	},
14669
14670	add: function( selector, context ) {
14671		return this.pushStack(
14672			jQuery.uniqueSort(
14673				jQuery.merge( this.get(), jQuery( selector, context ) )
14674			)
14675		);
14676	},
14677
14678	addBack: function( selector ) {
14679		return this.add( selector == null ?
14680			this.prevObject : this.prevObject.filter( selector )
14681		);
14682	}
14683} );
14684
14685function sibling( cur, dir ) {
14686	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
14687	return cur;
14688}
14689
14690jQuery.each( {
14691	parent: function( elem ) {
14692		var parent = elem.parentNode;
14693		return parent && parent.nodeType !== 11 ? parent : null;
14694	},
14695	parents: function( elem ) {
14696		return dir( elem, "parentNode" );
14697	},
14698	parentsUntil: function( elem, _i, until ) {
14699		return dir( elem, "parentNode", until );
14700	},
14701	next: function( elem ) {
14702		return sibling( elem, "nextSibling" );
14703	},
14704	prev: function( elem ) {
14705		return sibling( elem, "previousSibling" );
14706	},
14707	nextAll: function( elem ) {
14708		return dir( elem, "nextSibling" );
14709	},
14710	prevAll: function( elem ) {
14711		return dir( elem, "previousSibling" );
14712	},
14713	nextUntil: function( elem, _i, until ) {
14714		return dir( elem, "nextSibling", until );
14715	},
14716	prevUntil: function( elem, _i, until ) {
14717		return dir( elem, "previousSibling", until );
14718	},
14719	siblings: function( elem ) {
14720		return siblings( ( elem.parentNode || {} ).firstChild, elem );
14721	},
14722	children: function( elem ) {
14723		return siblings( elem.firstChild );
14724	},
14725	contents: function( elem ) {
14726		if ( elem.contentDocument != null &&
14727
14728			// Support: IE 11+
14729			// <object> elements with no `data` attribute has an object
14730			// `contentDocument` with a `null` prototype.
14731			getProto( elem.contentDocument ) ) {
14732
14733			return elem.contentDocument;
14734		}
14735
14736		// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
14737		// Treat the template element as a regular one in browsers that
14738		// don't support it.
14739		if ( nodeName( elem, "template" ) ) {
14740			elem = elem.content || elem;
14741		}
14742
14743		return jQuery.merge( [], elem.childNodes );
14744	}
14745}, function( name, fn ) {
14746	jQuery.fn[ name ] = function( until, selector ) {
14747		var matched = jQuery.map( this, fn, until );
14748
14749		if ( name.slice( -5 ) !== "Until" ) {
14750			selector = until;
14751		}
14752
14753		if ( selector && typeof selector === "string" ) {
14754			matched = jQuery.filter( selector, matched );
14755		}
14756
14757		if ( this.length > 1 ) {
14758
14759			// Remove duplicates
14760			if ( !guaranteedUnique[ name ] ) {
14761				jQuery.uniqueSort( matched );
14762			}
14763
14764			// Reverse order for parents* and prev-derivatives
14765			if ( rparentsprev.test( name ) ) {
14766				matched.reverse();
14767			}
14768		}
14769
14770		return this.pushStack( matched );
14771	};
14772} );
14773var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
14774
14775
14776
14777// Convert String-formatted options into Object-formatted ones
14778function createOptions( options ) {
14779	var object = {};
14780	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
14781		object[ flag ] = true;
14782	} );
14783	return object;
14784}
14785
14786/*
14787 * Create a callback list using the following parameters:
14788 *
14789 *	options: an optional list of space-separated options that will change how
14790 *			the callback list behaves or a more traditional option object
14791 *
14792 * By default a callback list will act like an event callback list and can be
14793 * "fired" multiple times.
14794 *
14795 * Possible options:
14796 *
14797 *	once:			will ensure the callback list can only be fired once (like a Deferred)
14798 *
14799 *	memory:			will keep track of previous values and will call any callback added
14800 *					after the list has been fired right away with the latest "memorized"
14801 *					values (like a Deferred)
14802 *
14803 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
14804 *
14805 *	stopOnFalse:	interrupt callings when a callback returns false
14806 *
14807 */
14808jQuery.Callbacks = function( options ) {
14809
14810	// Convert options from String-formatted to Object-formatted if needed
14811	// (we check in cache first)
14812	options = typeof options === "string" ?
14813		createOptions( options ) :
14814		jQuery.extend( {}, options );
14815
14816	var // Flag to know if list is currently firing
14817		firing,
14818
14819		// Last fire value for non-forgettable lists
14820		memory,
14821
14822		// Flag to know if list was already fired
14823		fired,
14824
14825		// Flag to prevent firing
14826		locked,
14827
14828		// Actual callback list
14829		list = [],
14830
14831		// Queue of execution data for repeatable lists
14832		queue = [],
14833
14834		// Index of currently firing callback (modified by add/remove as needed)
14835		firingIndex = -1,
14836
14837		// Fire callbacks
14838		fire = function() {
14839
14840			// Enforce single-firing
14841			locked = locked || options.once;
14842
14843			// Execute callbacks for all pending executions,
14844			// respecting firingIndex overrides and runtime changes
14845			fired = firing = true;
14846			for ( ; queue.length; firingIndex = -1 ) {
14847				memory = queue.shift();
14848				while ( ++firingIndex < list.length ) {
14849
14850					// Run callback and check for early termination
14851					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
14852						options.stopOnFalse ) {
14853
14854						// Jump to end and forget the data so .add doesn't re-fire
14855						firingIndex = list.length;
14856						memory = false;
14857					}
14858				}
14859			}
14860
14861			// Forget the data if we're done with it
14862			if ( !options.memory ) {
14863				memory = false;
14864			}
14865
14866			firing = false;
14867
14868			// Clean up if we're done firing for good
14869			if ( locked ) {
14870
14871				// Keep an empty list if we have data for future add calls
14872				if ( memory ) {
14873					list = [];
14874
14875				// Otherwise, this object is spent
14876				} else {
14877					list = "";
14878				}
14879			}
14880		},
14881
14882		// Actual Callbacks object
14883		self = {
14884
14885			// Add a callback or a collection of callbacks to the list
14886			add: function() {
14887				if ( list ) {
14888
14889					// If we have memory from a past run, we should fire after adding
14890					if ( memory && !firing ) {
14891						firingIndex = list.length - 1;
14892						queue.push( memory );
14893					}
14894
14895					( function add( args ) {
14896						jQuery.each( args, function( _, arg ) {
14897							if ( isFunction( arg ) ) {
14898								if ( !options.unique || !self.has( arg ) ) {
14899									list.push( arg );
14900								}
14901							} else if ( arg && arg.length && toType( arg ) !== "string" ) {
14902
14903								// Inspect recursively
14904								add( arg );
14905							}
14906						} );
14907					} )( arguments );
14908
14909					if ( memory && !firing ) {
14910						fire();
14911					}
14912				}
14913				return this;
14914			},
14915
14916			// Remove a callback from the list
14917			remove: function() {
14918				jQuery.each( arguments, function( _, arg ) {
14919					var index;
14920					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
14921						list.splice( index, 1 );
14922
14923						// Handle firing indexes
14924						if ( index <= firingIndex ) {
14925							firingIndex--;
14926						}
14927					}
14928				} );
14929				return this;
14930			},
14931
14932			// Check if a given callback is in the list.
14933			// If no argument is given, return whether or not list has callbacks attached.
14934			has: function( fn ) {
14935				return fn ?
14936					jQuery.inArray( fn, list ) > -1 :
14937					list.length > 0;
14938			},
14939
14940			// Remove all callbacks from the list
14941			empty: function() {
14942				if ( list ) {
14943					list = [];
14944				}
14945				return this;
14946			},
14947
14948			// Disable .fire and .add
14949			// Abort any current/pending executions
14950			// Clear all callbacks and values
14951			disable: function() {
14952				locked = queue = [];
14953				list = memory = "";
14954				return this;
14955			},
14956			disabled: function() {
14957				return !list;
14958			},
14959
14960			// Disable .fire
14961			// Also disable .add unless we have memory (since it would have no effect)
14962			// Abort any pending executions
14963			lock: function() {
14964				locked = queue = [];
14965				if ( !memory && !firing ) {
14966					list = memory = "";
14967				}
14968				return this;
14969			},
14970			locked: function() {
14971				return !!locked;
14972			},
14973
14974			// Call all callbacks with the given context and arguments
14975			fireWith: function( context, args ) {
14976				if ( !locked ) {
14977					args = args || [];
14978					args = [ context, args.slice ? args.slice() : args ];
14979					queue.push( args );
14980					if ( !firing ) {
14981						fire();
14982					}
14983				}
14984				return this;
14985			},
14986
14987			// Call all the callbacks with the given arguments
14988			fire: function() {
14989				self.fireWith( this, arguments );
14990				return this;
14991			},
14992
14993			// To know if the callbacks have already been called at least once
14994			fired: function() {
14995				return !!fired;
14996			}
14997		};
14998
14999	return self;
15000};
15001
15002
15003function Identity( v ) {
15004	return v;
15005}
15006function Thrower( ex ) {
15007	throw ex;
15008}
15009
15010function adoptValue( value, resolve, reject, noValue ) {
15011	var method;
15012
15013	try {
15014
15015		// Check for promise aspect first to privilege synchronous behavior
15016		if ( value && isFunction( ( method = value.promise ) ) ) {
15017			method.call( value ).done( resolve ).fail( reject );
15018
15019		// Other thenables
15020		} else if ( value && isFunction( ( method = value.then ) ) ) {
15021			method.call( value, resolve, reject );
15022
15023		// Other non-thenables
15024		} else {
15025
15026			// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
15027			// * false: [ value ].slice( 0 ) => resolve( value )
15028			// * true: [ value ].slice( 1 ) => resolve()
15029			resolve.apply( undefined, [ value ].slice( noValue ) );
15030		}
15031
15032	// For Promises/A+, convert exceptions into rejections
15033	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
15034	// Deferred#then to conditionally suppress rejection.
15035	} catch ( value ) {
15036
15037		// Support: Android 4.0 only
15038		// Strict mode functions invoked without .call/.apply get global-object context
15039		reject.apply( undefined, [ value ] );
15040	}
15041}
15042
15043jQuery.extend( {
15044
15045	Deferred: function( func ) {
15046		var tuples = [
15047
15048				// action, add listener, callbacks,
15049				// ... .then handlers, argument index, [final state]
15050				[ "notify", "progress", jQuery.Callbacks( "memory" ),
15051					jQuery.Callbacks( "memory" ), 2 ],
15052				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
15053					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
15054				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
15055					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
15056			],
15057			state = "pending",
15058			promise = {
15059				state: function() {
15060					return state;
15061				},
15062				always: function() {
15063					deferred.done( arguments ).fail( arguments );
15064					return this;
15065				},
15066				"catch": function( fn ) {
15067					return promise.then( null, fn );
15068				},
15069
15070				// Keep pipe for back-compat
15071				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
15072					var fns = arguments;
15073
15074					return jQuery.Deferred( function( newDefer ) {
15075						jQuery.each( tuples, function( _i, tuple ) {
15076
15077							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
15078							var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
15079
15080							// deferred.progress(function() { bind to newDefer or newDefer.notify })
15081							// deferred.done(function() { bind to newDefer or newDefer.resolve })
15082							// deferred.fail(function() { bind to newDefer or newDefer.reject })
15083							deferred[ tuple[ 1 ] ]( function() {
15084								var returned = fn && fn.apply( this, arguments );
15085								if ( returned && isFunction( returned.promise ) ) {
15086									returned.promise()
15087										.progress( newDefer.notify )
15088										.done( newDefer.resolve )
15089										.fail( newDefer.reject );
15090								} else {
15091									newDefer[ tuple[ 0 ] + "With" ](
15092										this,
15093										fn ? [ returned ] : arguments
15094									);
15095								}
15096							} );
15097						} );
15098						fns = null;
15099					} ).promise();
15100				},
15101				then: function( onFulfilled, onRejected, onProgress ) {
15102					var maxDepth = 0;
15103					function resolve( depth, deferred, handler, special ) {
15104						return function() {
15105							var that = this,
15106								args = arguments,
15107								mightThrow = function() {
15108									var returned, then;
15109
15110									// Support: Promises/A+ section 2.3.3.3.3
15111									// https://promisesaplus.com/#point-59
15112									// Ignore double-resolution attempts
15113									if ( depth < maxDepth ) {
15114										return;
15115									}
15116
15117									returned = handler.apply( that, args );
15118
15119									// Support: Promises/A+ section 2.3.1
15120									// https://promisesaplus.com/#point-48
15121									if ( returned === deferred.promise() ) {
15122										throw new TypeError( "Thenable self-resolution" );
15123									}
15124
15125									// Support: Promises/A+ sections 2.3.3.1, 3.5
15126									// https://promisesaplus.com/#point-54
15127									// https://promisesaplus.com/#point-75
15128									// Retrieve `then` only once
15129									then = returned &&
15130
15131										// Support: Promises/A+ section 2.3.4
15132										// https://promisesaplus.com/#point-64
15133										// Only check objects and functions for thenability
15134										( typeof returned === "object" ||
15135											typeof returned === "function" ) &&
15136										returned.then;
15137
15138									// Handle a returned thenable
15139									if ( isFunction( then ) ) {
15140
15141										// Special processors (notify) just wait for resolution
15142										if ( special ) {
15143											then.call(
15144												returned,
15145												resolve( maxDepth, deferred, Identity, special ),
15146												resolve( maxDepth, deferred, Thrower, special )
15147											);
15148
15149										// Normal processors (resolve) also hook into progress
15150										} else {
15151
15152											// ...and disregard older resolution values
15153											maxDepth++;
15154
15155											then.call(
15156												returned,
15157												resolve( maxDepth, deferred, Identity, special ),
15158												resolve( maxDepth, deferred, Thrower, special ),
15159												resolve( maxDepth, deferred, Identity,
15160													deferred.notifyWith )
15161											);
15162										}
15163
15164									// Handle all other returned values
15165									} else {
15166
15167										// Only substitute handlers pass on context
15168										// and multiple values (non-spec behavior)
15169										if ( handler !== Identity ) {
15170											that = undefined;
15171											args = [ returned ];
15172										}
15173
15174										// Process the value(s)
15175										// Default process is resolve
15176										( special || deferred.resolveWith )( that, args );
15177									}
15178								},
15179
15180								// Only normal processors (resolve) catch and reject exceptions
15181								process = special ?
15182									mightThrow :
15183									function() {
15184										try {
15185											mightThrow();
15186										} catch ( e ) {
15187
15188											if ( jQuery.Deferred.exceptionHook ) {
15189												jQuery.Deferred.exceptionHook( e,
15190													process.
15190stackTrace );
15191											}
15192
15193											// Support: Promises/A+ section 2.3.3.3.4.1
15194											// https://promisesaplus.com/#point-61
15195											// Ignore post-resolution exceptions
15196											if ( depth + 1 >= maxDepth ) {
15197
15198												// Only substitute handlers pass on context
15199												// and multiple values (non-spec behavior)
15200												if ( handler !== Thrower ) {
15201													that = undefined;
15202													args = [ e ];
15203												}
15204
15205												deferred.rejectWith( that, args );
15206											}
15207										}
15208									};
15209
vendor: 9,373 bytes, lines 15210-15605
15210							// Support: Promises/A+ section 2.3.3.3.1
15211							// https://promisesaplus.com/#point-57
15212							// Re-resolve promises immediately to dodge false rejection from
15213							// subsequent errors
15214							if ( depth ) {
15215								process();
15216							} else {
15217
15218								// Call an optional hook to record the stack, in case of exception
15219								// since it's otherwise lost when execution goes async
15220								if ( jQuery.Deferred.getStackHook ) {
15221									process.stackTrace = jQuery.Deferred.getStackHook();
15222								}
15223								window.setTimeout( process );
15224							}
15225						};
15226					}
15227
15228					return jQuery.Deferred( function( newDefer ) {
15229
15230						// progress_handlers.add( ... )
15231						tuples[ 0 ][ 3 ].add(
15232							resolve(
15233								0,
15234								newDefer,
15235								isFunction( onProgress ) ?
15236									onProgress :
15237									Identity,
15238								newDefer.notifyWith
15239							)
15240						);
15241
15242						// fulfilled_handlers.add( ... )
15243						tuples[ 1 ][ 3 ].add(
15244							resolve(
15245								0,
15246								newDefer,
15247								isFunction( onFulfilled ) ?
15248									onFulfilled :
15249									Identity
15250							)
15251						);
15252
15253						// rejected_handlers.add( ... )
15254						tuples[ 2 ][ 3 ].add(
15255							resolve(
15256								0,
15257								newDefer,
15258								isFunction( onRejected ) ?
15259									onRejected :
15260									Thrower
15261							)
15262						);
15263					} ).promise();
15264				},
15265
15266				// Get a promise for this deferred
15267				// If obj is provided, the promise aspect is added to the object
15268				promise: function( obj ) {
15269					return obj != null ? jQuery.extend( obj, promise ) : promise;
15270				}
15271			},
15272			deferred = {};
15273
15274		// Add list-specific methods
15275		jQuery.each( tuples, function( i, tuple ) {
15276			var list = tuple[ 2 ],
15277				stateString = tuple[ 5 ];
15278
15279			// promise.progress = list.add
15280			// promise.done = list.add
15281			// promise.fail = list.add
15282			promise[ tuple[ 1 ] ] = list.add;
15283
15284			// Handle state
15285			if ( stateString ) {
15286				list.add(
15287					function() {
15288
15289						// state = "resolved" (i.e., fulfilled)
15290						// state = "rejected"
15291						state = stateString;
15292					},
15293
15294					// rejected_callbacks.disable
15295					// fulfilled_callbacks.disable
15296					tuples[ 3 - i ][ 2 ].disable,
15297
15298					// rejected_handlers.disable
15299					// fulfilled_handlers.disable
15300					tuples[ 3 - i ][ 3 ].disable,
15301
15302					// progress_callbacks.lock
15303					tuples[ 0 ][ 2 ].lock,
15304
15305					// progress_handlers.lock
15306					tuples[ 0 ][ 3 ].lock
15307				);
15308			}
15309
15310			// progress_handlers.fire
15311			// fulfilled_handlers.fire
15312			// rejected_handlers.fire
15313			list.add( tuple[ 3 ].fire );
15314
15315			// deferred.notify = function() { deferred.notifyWith(...) }
15316			// deferred.resolve = function() { deferred.resolveWith(...) }
15317			// deferred.reject = function() { deferred.rejectWith(...) }
15318			deferred[ tuple[ 0 ] ] = function() {
15319				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
15320				return this;
15321			};
15322
15323			// deferred.notifyWith = list.fireWith
15324			// deferred.resolveWith = list.fireWith
15325			// deferred.rejectWith = list.fireWith
15326			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
15327		} );
15328
15329		// Make the deferred a promise
15330		promise.promise( deferred );
15331
15332		// Call given func if any
15333		if ( func ) {
15334			func.call( deferred, deferred );
15335		}
15336
15337		// All done!
15338		return deferred;
15339	},
15340
15341	// Deferred helper
15342	when: function( singleValue ) {
15343		var
15344
15345			// count of uncompleted subordinates
15346			remaining = arguments.length,
15347
15348			// count of unprocessed arguments
15349			i = remaining,
15350
15351			// subordinate fulfillment data
15352			resolveContexts = Array( i ),
15353			resolveValues = slice.call( arguments ),
15354
15355			// the primary Deferred
15356			primary = jQuery.Deferred(),
15357
15358			// subordinate callback factory
15359			updateFunc = function( i ) {
15360				return function( value ) {
15361					resolveContexts[ i ] = this;
15362					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
15363					if ( !( --remaining ) ) {
15364						primary.resolveWith( resolveContexts, resolveValues );
15365					}
15366				};
15367			};
15368
15369		// Single- and empty arguments are adopted like Promise.resolve
15370		if ( remaining <= 1 ) {
15371			adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
15372				!remaining );
15373
15374			// Use .then() to unwrap secondary thenables (cf. gh-3000)
15375			if ( primary.state() === "pending" ||
15376				isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
15377
15378				return primary.then();
15379			}
15380		}
15381
15382		// Multiple arguments are aggregated like Promise.all array elements
15383		while ( i-- ) {
15384			adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
15385		}
15386
15387		return primary.promise();
15388	}
15389} );
15390
15391
15392// These usually indicate a programmer mistake during development,
15393// warn about them ASAP rather than swallowing them by default.
15394var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
15395
15396jQuery.Deferred.exceptionHook = function( error, stack ) {
15397
15398	// Support: IE 8 - 9 only
15399	// Console exists when dev tools are open, which can happen at any time
15400	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
15401		window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
15402	}
15403};
15404
15405
15406
15407
15408jQuery.readyException = function( error ) {
15409	window.setTimeout( function() {
15410		throw error;
15411	} );
15412};
15413
15414
15415
15416
15417// The deferred used on DOM ready
15418var readyList = jQuery.Deferred();
15419
15420jQuery.fn.ready = function( fn ) {
15421
15422	readyList
15423		.then( fn )
15424
15425		// Wrap jQuery.readyException in a function so that the lookup
15426		// happens at the time of error handling instead of callback
15427		// registration.
15428		.catch( function( error ) {
15429			jQuery.readyException( error );
15430		} );
15431
15432	return this;
15433};
15434
15435jQuery.extend( {
15436
15437	// Is the DOM ready to be used? Set to true once it occurs.
15438	isReady: false,
15439
15440	// A counter to track how many items to wait for before
15441	// the ready event fires. See trac-6781
15442	readyWait: 1,
15443
15444	// Handle when the DOM is ready
15445	ready: function( wait ) {
15446
15447		// Abort if there are pending holds or we're already ready
15448		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
15449			return;
15450		}
15451
15452		// Remember that the DOM is ready
15453		jQuery.isReady = true;
15454
15455		// If a normal DOM Ready event fired, decrement, and wait if need be
15456		if ( wait !== true && --jQuery.readyWait > 0 ) {
15457			return;
15458		}
15459
15460		// If there are functions bound, to execute
15461		readyList.resolveWith( document, [ jQuery ] );
15462	}
15463} );
15464
15465jQuery.ready.then = readyList.then;
15466
15467// The ready event handler and self cleanup method
15468function completed() {
15469	document.removeEventListener( "DOMContentLoaded", completed );
15470	window.removeEventListener( "load", completed );
15471	jQuery.ready();
15472}
15473
15474// Catch cases where $(document).ready() is called
15475// after the browser event has already occurred.
15476// Support: IE <=9 - 10 only
15477// Older IE sometimes signals "interactive" too soon
15478if ( document.readyState === "complete" ||
15479	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
15480
15481	// Handle it asynchronously to allow scripts the opportunity to delay ready
15482	window.setTimeout( jQuery.ready );
15483
15484} else {
15485
15486	// Use the handy event callback
15487	document.addEventListener( "DOMContentLoaded", completed );
15488
15489	// A fallback to window.onload, that will always work
15490	window.addEventListener( "load", completed );
15491}
15492
15493
15494
15495
15496// Multifunctional method to get and set values of a collection
15497// The value/s can optionally be executed if it's a function
15498var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
15499	var i = 0,
15500		len = elems.length,
15501		bulk = key == null;
15502
15503	// Sets many values
15504	if ( toType( key ) === "object" ) {
15505		chainable = true;
15506		for ( i in key ) {
15507			access( elems, fn, i, key[ i ], true, emptyGet, raw );
15508		}
15509
15510	// Sets one value
15511	} else if ( value !== undefined ) {
15512		chainable = true;
15513
15514		if ( !isFunction( value ) ) {
15515			raw = true;
15516		}
15517
15518		if ( bulk ) {
15519
15520			// Bulk operations run against the entire set
15521			if ( raw ) {
15522				fn.call( elems, value );
15523				fn = null;
15524
15525			// ...except when executing function values
15526			} else {
15527				bulk = fn;
15528				fn = function( elem, _key, value ) {
15529					return bulk.call( jQuery( elem ), value );
15530				};
15531			}
15532		}
15533
15534		if ( fn ) {
15535			for ( ; i < len; i++ ) {
15536				fn(
15537					elems[ i ], key, raw ?
15538						value :
15539						value.call( elems[ i ], i, fn( elems[ i ], key ) )
15540				);
15541			}
15542		}
15543	}
15544
15545	if ( chainable ) {
15546		return elems;
15547	}
15548
15549	// Gets
15550	if ( bulk ) {
15551		return fn.call( elems );
15552	}
15553
15554	return len ? fn( elems[ 0 ], key ) : emptyGet;
15555};
15556
15557
15558// Matches dashed string for camelizing
15559var rmsPrefix = /^-ms-/,
15560	rdashAlpha = /-([a-z])/g;
15561
15562// Used by camelCase as callback to replace()
15563function fcamelCase( _all, letter ) {
15564	return letter.toUpperCase();
15565}
15566
15567// Convert dashed to camelCase; used by the css and data modules
15568// Support: IE <=9 - 11, Edge 12 - 15
15569// Microsoft forgot to hump their vendor prefix (trac-9572)
15570function camelCase( string ) {
15571	return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
15572}
15573var acceptData = function( owner ) {
15574
15575	// Accepts only:
15576	//  - Node
15577	//    - Node.ELEMENT_NODE
15578	//    - Node.DOCUMENT_NODE
15579	//  - Object
15580	//    - Any
15581	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
15582};
15583
15584
15585
15586
15587function Data() {
15588	this.expando = jQuery.expando + Data.uid++;
15589}
15590
15591Data.uid = 1;
15592
15593Data.prototype = {
15594
15595	cache: function( owner ) {
15596
15597		// Check if the owner object already has a cache
15598		var value = owner[ this.expando ];
15599
15600		// If not, create one
15601		if ( !value ) {
15602			value = {};
15603
15604			// We can accept data for non-element nodes in modern browsers,
15605			// but we should not, see trac-
vendor: 5,955 bytes, lines 15605-15844
156058335.
15606			// Always return an empty object.
15607			if ( acceptData( owner ) ) {
15608
15609				// If it is a node unlikely to be stringify-ed or looped over
15610				// use plain assignment
15611				if ( owner.nodeType ) {
15612					owner[ this.expando ] = value;
15613
15614				// Otherwise secure it in a non-enumerable property
15615				// configurable must be true to allow the property to be
15616				// deleted when data is removed
15617				} else {
15618					Object.defineProperty( owner, this.expando, {
15619						value: value,
15620						configurable: true
15621					} );
15622				}
15623			}
15624		}
15625
15626		return value;
15627	},
15628	set: function( owner, data, value ) {
15629		var prop,
15630			cache = this.cache( owner );
15631
15632		// Handle: [ owner, key, value ] args
15633		// Always use camelCase key (gh-2257)
15634		if ( typeof data === "string" ) {
15635			cache[ camelCase( data ) ] = value;
15636
15637		// Handle: [ owner, { properties } ] args
15638		} else {
15639
15640			// Copy the properties one-by-one to the cache object
15641			for ( prop in data ) {
15642				cache[ camelCase( prop ) ] = data[ prop ];
15643			}
15644		}
15645		return cache;
15646	},
15647	get: function( owner, key ) {
15648		return key === undefined ?
15649			this.cache( owner ) :
15650
15651			// Always use camelCase key (gh-2257)
15652			owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
15653	},
15654	access: function( owner, key, value ) {
15655
15656		// In cases where either:
15657		//
15658		//   1. No key was specified
15659		//   2. A string key was specified, but no value provided
15660		//
15661		// Take the "read" path and allow the get method to determine
15662		// which value to return, respectively either:
15663		//
15664		//   1. The entire cache object
15665		//   2. The data stored at the key
15666		//
15667		if ( key === undefined ||
15668				( ( key && typeof key === "string" ) && value === undefined ) ) {
15669
15670			return this.get( owner, key );
15671		}
15672
15673		// When the key is not a string, or both a key and value
15674		// are specified, set or extend (existing objects) with either:
15675		//
15676		//   1. An object of properties
15677		//   2. A key and value
15678		//
15679		this.set( owner, key, value );
15680
15681		// Since the "set" path can have two possible entry points
15682		// return the expected data based on which path was taken[*]
15683		return value !== undefined ? value : key;
15684	},
15685	remove: function( owner, key ) {
15686		var i,
15687			cache = owner[ this.expando ];
15688
15689		if ( cache === undefined ) {
15690			return;
15691		}
15692
15693		if ( key !== undefined ) {
15694
15695			// Support array or space separated string of keys
15696			if ( Array.isArray( key ) ) {
15697
15698				// If key is an array of keys...
15699				// We always set camelCase keys, so remove that.
15700				key = key.map( camelCase );
15701			} else {
15702				key = camelCase( key );
15703
15704				// If a key with the spaces exists, use it.
15705				// Otherwise, create an array by matching non-whitespace
15706				key = key in cache ?
15707					[ key ] :
15708					( key.match( rnothtmlwhite ) || [] );
15709			}
15710
15711			i = key.length;
15712
15713			while ( i-- ) {
15714				delete cache[ key[ i ] ];
15715			}
15716		}
15717
15718		// Remove the expando if there's no more data
15719		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
15720
15721			// Support: Chrome <=35 - 45
15722			// Webkit & Blink performance suffers when deleting properties
15723			// from DOM nodes, so set to undefined instead
15724			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
15725			if ( owner.nodeType ) {
15726				owner[ this.expando ] = undefined;
15727			} else {
15728				delete owner[ this.expando ];
15729			}
15730		}
15731	},
15732	hasData: function( owner ) {
15733		var cache = owner[ this.expando ];
15734		return cache !== undefined && !jQuery.isEmptyObject( cache );
15735	}
15736};
15737var dataPriv = new Data();
15738
15739var dataUser = new Data();
15740
15741
15742
15743//	Implementation Summary
15744//
15745//	1. Enforce API surface and semantic compatibility with 1.9.x branch
15746//	2. Improve the module's maintainability by reducing the storage
15747//		paths to a single mechanism.
15748//	3. Use the same single mechanism to support "private" and "user" data.
15749//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
15750//	5. Avoid exposing implementation details on user objects (eg. expando properties)
15751//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
15752
15753var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
15754	rmultiDash = /[A-Z]/g;
15755
15756function getData( data ) {
15757	if ( data === "true" ) {
15758		return true;
15759	}
15760
15761	if ( data === "false" ) {
15762		return false;
15763	}
15764
15765	if ( data === "null" ) {
15766		return null;
15767	}
15768
15769	// Only convert to a number if it doesn't change the string
15770	if ( data === +data + "" ) {
15771		return +data;
15772	}
15773
15774	if ( rbrace.test( data ) ) {
15775		return JSON.parse( data );
15776	}
15777
15778	return data;
15779}
15780
15781function dataAttr( elem, key, data ) {
15782	var name;
15783
15784	// If nothing was found internally, try to fetch any
15785	// data from the HTML5 data-* attribute
15786	if ( data === undefined && elem.nodeType === 1 ) {
15787		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
15788		data = elem.getAttribute( name );
15789
15790		if ( typeof data === "string" ) {
15791			try {
15792				data = getData( data );
15793			} catch ( e ) {}
15794
15795			// Make sure we set the data so it isn't changed later
15796			dataUser.set( elem, key, data );
15797		} else {
15798			data = undefined;
15799		}
15800	}
15801	return data;
15802}
15803
15804jQuery.extend( {
15805	hasData: function( elem ) {
15806		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
15807	},
15808
15809	data: function( elem, name, data ) {
15810		return dataUser.access( elem, name, data );
15811	},
15812
15813	removeData: function( elem, name ) {
15814		dataUser.remove( elem, name );
15815	},
15816
15817	// TODO: Now that all calls to _data and _removeData have been replaced
15818	// with direct calls to dataPriv methods, these can be deprecated.
15819	_data: function( elem, name, data ) {
15820		return dataPriv.access( elem, name, data );
15821	},
15822
15823	_removeData: function( elem, name ) {
15824		dataPriv.remove( elem, name );
15825	}
15826} );
15827
15828jQuery.fn.extend( {
15829	data: function( key, value ) {
15830		var i, name, data,
15831			elem = this[ 0 ],
15832			attrs = elem && elem.attributes;
15833
15834		// Gets all values
15835		if ( key === undefined ) {
15836			if ( this.length ) {
15837				data = dataUser.get( elem );
15838
15839				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
15840					i = attrs.length;
15841					while ( i-- ) {
15842
15843						// Support: IE 11 only
15844						// The attrs elements can be null (
vendor: 15,187 bytes, lines 15844-16456
15844trac-14894)
15845						if ( attrs[ i ] ) {
15846							name = attrs[ i ].name;
15847							if ( name.indexOf( "data-" ) === 0 ) {
15848								name = camelCase( name.slice( 5 ) );
15849								dataAttr( elem, name, data[ name ] );
15850							}
15851						}
15852					}
15853					dataPriv.set( elem, "hasDataAttrs", true );
15854				}
15855			}
15856
15857			return data;
15858		}
15859
15860		// Sets multiple values
15861		if ( typeof key === "object" ) {
15862			return this.each( function() {
15863				dataUser.set( this, key );
15864			} );
15865		}
15866
15867		return access( this, function( value ) {
15868			var data;
15869
15870			// The calling jQuery object (element matches) is not empty
15871			// (and therefore has an element appears at this[ 0 ]) and the
15872			// `value` parameter was not undefined. An empty jQuery object
15873			// will result in `undefined` for elem = this[ 0 ] which will
15874			// throw an exception if an attempt to read a data cache is made.
15875			if ( elem && value === undefined ) {
15876
15877				// Attempt to get data from the cache
15878				// The key will always be camelCased in Data
15879				data = dataUser.get( elem, key );
15880				if ( data !== undefined ) {
15881					return data;
15882				}
15883
15884				// Attempt to "discover" the data in
15885				// HTML5 custom data-* attrs
15886				data = dataAttr( elem, key );
15887				if ( data !== undefined ) {
15888					return data;
15889				}
15890
15891				// We tried really hard, but the data doesn't exist.
15892				return;
15893			}
15894
15895			// Set the data...
15896			this.each( function() {
15897
15898				// We always store the camelCased key
15899				dataUser.set( this, key, value );
15900			} );
15901		}, null, value, arguments.length > 1, null, true );
15902	},
15903
15904	removeData: function( key ) {
15905		return this.each( function() {
15906			dataUser.remove( this, key );
15907		} );
15908	}
15909} );
15910
15911
15912jQuery.extend( {
15913	queue: function( elem, type, data ) {
15914		var queue;
15915
15916		if ( elem ) {
15917			type = ( type || "fx" ) + "queue";
15918			queue = dataPriv.get( elem, type );
15919
15920			// Speed up dequeue by getting out quickly if this is just a lookup
15921			if ( data ) {
15922				if ( !queue || Array.isArray( data ) ) {
15923					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
15924				} else {
15925					queue.push( data );
15926				}
15927			}
15928			return queue || [];
15929		}
15930	},
15931
15932	dequeue: function( elem, type ) {
15933		type = type || "fx";
15934
15935		var queue = jQuery.queue( elem, type ),
15936			startLength = queue.length,
15937			fn = queue.shift(),
15938			hooks = jQuery._queueHooks( elem, type ),
15939			next = function() {
15940				jQuery.dequeue( elem, type );
15941			};
15942
15943		// If the fx queue is dequeued, always remove the progress sentinel
15944		if ( fn === "inprogress" ) {
15945			fn = queue.shift();
15946			startLength--;
15947		}
15948
15949		if ( fn ) {
15950
15951			// Add a progress sentinel to prevent the fx queue from being
15952			// automatically dequeued
15953			if ( type === "fx" ) {
15954				queue.unshift( "inprogress" );
15955			}
15956
15957			// Clear up the last queue stop function
15958			delete hooks.stop;
15959			fn.call( elem, next, hooks );
15960		}
15961
15962		if ( !startLength && hooks ) {
15963			hooks.empty.fire();
15964		}
15965	},
15966
15967	// Not public - generate a queueHooks object, or return the current one
15968	_queueHooks: function( elem, type ) {
15969		var key = type + "queueHooks";
15970		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
15971			empty: jQuery.Callbacks( "once memory" ).add( function() {
15972				dataPriv.remove( elem, [ type + "queue", key ] );
15973			} )
15974		} );
15975	}
15976} );
15977
15978jQuery.fn.extend( {
15979	queue: function( type, data ) {
15980		var setter = 2;
15981
15982		if ( typeof type !== "string" ) {
15983			data = type;
15984			type = "fx";
15985			setter--;
15986		}
15987
15988		if ( arguments.length < setter ) {
15989			return jQuery.queue( this[ 0 ], type );
15990		}
15991
15992		return data === undefined ?
15993			this :
15994			this.each( function() {
15995				var queue = jQuery.queue( this, type, data );
15996
15997				// Ensure a hooks for this queue
15998				jQuery._queueHooks( this, type );
15999
16000				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
16001					jQuery.dequeue( this, type );
16002				}
16003			} );
16004	},
16005	dequeue: function( type ) {
16006		return this.each( function() {
16007			jQuery.dequeue( this, type );
16008		} );
16009	},
16010	clearQueue: function( type ) {
16011		return this.queue( type || "fx", [] );
16012	},
16013
16014	// Get a promise resolved when queues of a certain type
16015	// are emptied (fx is the type by default)
16016	promise: function( type, obj ) {
16017		var tmp,
16018			count = 1,
16019			defer = jQuery.Deferred(),
16020			elements = this,
16021			i = this.length,
16022			resolve = function() {
16023				if ( !( --count ) ) {
16024					defer.resolveWith( elements, [ elements ] );
16025				}
16026			};
16027
16028		if ( typeof type !== "string" ) {
16029			obj = type;
16030			type = undefined;
16031		}
16032		type = type || "fx";
16033
16034		while ( i-- ) {
16035			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
16036			if ( tmp && tmp.empty ) {
16037				count++;
16038				tmp.empty.add( resolve );
16039			}
16040		}
16041		resolve();
16042		return defer.promise( obj );
16043	}
16044} );
16045var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
16046
16047var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
16048
16049
16050var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
16051
16052var documentElement = document.documentElement;
16053
16054
16055
16056	var isAttached = function( elem ) {
16057			return jQuery.contains( elem.ownerDocument, elem );
16058		},
16059		composed = { composed: true };
16060
16061	// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
16062	// Check attachment across shadow DOM boundaries when possible (gh-3504)
16063	// Support: iOS 10.0-10.2 only
16064	// Early iOS 10 versions support `attachShadow` but not `getRootNode`,
16065	// leading to errors. We need to check for `getRootNode`.
16066	if ( documentElement.getRootNode ) {
16067		isAttached = function( elem ) {
16068			return jQuery.contains( elem.ownerDocument, elem ) ||
16069				elem.getRootNode( composed ) === elem.ownerDocument;
16070		};
16071	}
16072var isHiddenWithinTree = function( elem, el ) {
16073
16074		// isHiddenWithinTree might be called from jQuery#filter function;
16075		// in that case, element will be second argument
16076		elem = el || elem;
16077
16078		// Inline style trumps all
16079		return elem.style.display === "none" ||
16080			elem.style.display === "" &&
16081
16082			// Otherwise, check computed style
16083			// Support: Firefox <=43 - 45
16084			// Disconnected elements can have computed display: none, so first confirm that elem is
16085			// in the document.
16086			isAttached( elem ) &&
16087
16088			jQuery.css( elem, "display" ) === "none";
16089	};
16090
16091
16092
16093function adjustCSS( elem, prop, valueParts, tween ) {
16094	var adjusted, scale,
16095		maxIterations = 20,
16096		currentValue = tween ?
16097			function() {
16098				return tween.cur();
16099			} :
16100			function() {
16101				return jQuery.css( elem, prop, "" );
16102			},
16103		initial = currentValue(),
16104		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
16105
16106		// Starting value computation is required for potential unit mismatches
16107		initialInUnit = elem.nodeType &&
16108			( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
16109			rcssNum.exec( jQuery.css( elem, prop ) );
16110
16111	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
16112
16113		// Support: Firefox <=54
16114		// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
16115		initial = initial / 2;
16116
16117		// Trust units reported by jQuery.css
16118		unit = unit || initialInUnit[ 3 ];
16119
16120		// Iteratively approximate from a nonzero starting point
16121		initialInUnit = +initial || 1;
16122
16123		while ( maxIterations-- ) {
16124
16125			// Evaluate and update our best guess (doubling guesses that zero out).
16126			// Finish if the scale equals or crosses 1 (making the old*new product non-positive).
16127			jQuery.style( elem, prop, initialInUnit + unit );
16128			if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
16129				maxIterations = 0;
16130			}
16131			initialInUnit = initialInUnit / scale;
16132
16133		}
16134
16135		initialInUnit = initialInUnit * 2;
16136		jQuery.style( elem, prop, initialInUnit + unit );
16137
16138		// Make sure we update the tween properties later on
16139		valueParts = valueParts || [];
16140	}
16141
16142	if ( valueParts ) {
16143		initialInUnit = +initialInUnit || +initial || 0;
16144
16145		// Apply relative offset (+=/-=) if specified
16146		adjusted = valueParts[ 1 ] ?
16147			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
16148			+valueParts[ 2 ];
16149		if ( tween ) {
16150			tween.unit = unit;
16151			tween.start = initialInUnit;
16152			tween.end = adjusted;
16153		}
16154	}
16155	return adjusted;
16156}
16157
16158
16159var defaultDisplayMap = {};
16160
16161function getDefaultDisplay( elem ) {
16162	var temp,
16163		doc = elem.ownerDocument,
16164		nodeName = elem.nodeName,
16165		display = defaultDisplayMap[ nodeName ];
16166
16167	if ( display ) {
16168		return display;
16169	}
16170
16171	temp = doc.body.appendChild( doc.createElement( nodeName ) );
16172	display = jQuery.css( temp, "display" );
16173
16174	temp.parentNode.removeChild( temp );
16175
16176	if ( display === "none" ) {
16177		display = "block";
16178	}
16179	defaultDisplayMap[ nodeName ] = display;
16180
16181	return display;
16182}
16183
16184function showHide( elements, show ) {
16185	var display, elem,
16186		values = [],
16187		index = 0,
16188		length = elements.length;
16189
16190	// Determine new display value for elements that need to change
16191	for ( ; index < length; index++ ) {
16192		elem = elements[ index ];
16193		if ( !elem.style ) {
16194			continue;
16195		}
16196
16197		display = elem.style.display;
16198		if ( show ) {
16199
16200			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
16201			// check is required in this first loop unless we have a nonempty display value (either
16202			// inline or about-to-be-restored)
16203			if ( display === "none" ) {
16204				values[ index ] = dataPriv.get( elem, "display" ) || null;
16205				if ( !values[ index ] ) {
16206					elem.style.display = "";
16207				}
16208			}
16209			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
16210				values[ index ] = getDefaultDisplay( elem );
16211			}
16212		} else {
16213			if ( display !== "none" ) {
16214				values[ index ] = "none";
16215
16216				// Remember what we're overwriting
16217				dataPriv.set( elem, "display", display );
16218			}
16219		}
16220	}
16221
16222	// Set the display of the elements in a second loop to avoid constant reflow
16223	for ( index = 0; index < length; index++ ) {
16224		if ( values[ index ] != null ) {
16225			elements[ index ].style.display = values[ index ];
16226		}
16227	}
16228
16229	return elements;
16230}
16231
16232jQuery.fn.extend( {
16233	show: function() {
16234		return showHide( this, true );
16235	},
16236	hide: function() {
16237		return showHide( this );
16238	},
16239	toggle: function( state ) {
16240		if ( typeof state === "boolean" ) {
16241			return state ? this.show() : this.hide();
16242		}
16243
16244		return this.each( function() {
16245			if ( isHiddenWithinTree( this ) ) {
16246				jQuery( this ).show();
16247			} else {
16248				jQuery( this ).hide();
16249			}
16250		} );
16251	}
16252} );
16253var rcheckableType = ( /^(?:checkbox|radio)$/i );
16254
16255var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
16256
16257var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
16258
16259
16260
16261( function() {
16262	var fragment = document.createDocumentFragment(),
16263		div = fragment.appendChild( document.createElement( "div" ) ),
16264		input = document.createElement( "input" );
16265
16266	// Support: Android 4.0 - 4.3 only
16267	// Check state lost if the name is set (trac-11217)
16268	// Support: Windows Web Apps (WWA)
16269	// `name` and `type` must use .setAttribute for WWA (trac-14901)
16270	input.setAttribute( "type", "radio" );
16271	input.setAttribute( "checked", "checked" );
16272	input.setAttribute( "name", "t" );
16273
16274	div.appendChild( input );
16275
16276	// Support: Android <=4.1 only
16277	// Older WebKit doesn't clone checked state correctly in fragments
16278	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
16279
16280	// Support: IE <=11 only
16281	// Make sure textarea (and checkbox) defaultValue is properly cloned
16282	div.innerHTML = "<textarea>x</textarea>";
16283	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
16284
16285	// Support: IE <=9 only
16286	// IE <=9 replaces <option> tags with their contents when inserted outside of
16287	// the select element.
16288	div.innerHTML = "<option></option>";
16289	support.option = !!div.lastChild;
16290} )();
16291
16292
16293// We have to close these tags to support XHTML (trac-13200)
16294var wrapMap = {
16295
16296	// XHTML parsers do not magically insert elements in the
16297	// same way that tag soup parsers do. So we cannot shorten
16298	// this by omitting <tbody> or other required elements.
16299	thead: [ 1, "<table>", "</table>" ],
16300	col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
16301	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
16302	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
16303
16304	_default: [ 0, "", "" ]
16305};
16306
16307wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
16308wrapMap.th = wrapMap.td;
16309
16310// Support: IE <=9 only
16311if ( !support.option ) {
16312	wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
16313}
16314
16315
16316function getAll( context, tag ) {
16317
16318	// Support: IE <=9 - 11 only
16319	// Use typeof to avoid zero-argument method invocation on host objects (trac-15151)
16320	var ret;
16321
16322	if ( typeof context.getElementsByTagName !== "undefined" ) {
16323		ret = context.getElementsByTagName( tag || "*" );
16324
16325	} else if ( typeof context.querySelectorAll !== "undefined" ) {
16326		ret = context.querySelectorAll( tag || "*" );
16327
16328	} else {
16329		ret = [];
16330	}
16331
16332	if ( tag === undefined || tag && nodeName( context, tag ) ) {
16333		return jQuery.merge( [ context ], ret );
16334	}
16335
16336	return ret;
16337}
16338
16339
16340// Mark scripts as having already been evaluated
16341function setGlobalEval( elems, refElements ) {
16342	var i = 0,
16343		l = elems.length;
16344
16345	for ( ; i < l; i++ ) {
16346		dataPriv.set(
16347			elems[ i ],
16348			"globalEval",
16349			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
16350		);
16351	}
16352}
16353
16354
16355var rhtml = /<|&#?\w+;/;
16356
16357function buildFragment( elems, context, scripts, selection, ignored ) {
16358	var elem, tmp, tag, wrap, attached, j,
16359		fragment = context.createDocumentFragment(),
16360		nodes = [],
16361		i = 0,
16362		l = elems.length;
16363
16364	for ( ; i < l; i++ ) {
16365		elem = elems[ i ];
16366
16367		if ( elem || elem === 0 ) {
16368
16369			// Add nodes directly
16370			if ( toType( elem ) === "object" ) {
16371
16372				// Support: Android <=4.0 only, PhantomJS 1 only
16373				// push.apply(_, arraylike) throws on ancient WebKit
16374				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
16375
16376			// Convert non-html into a text node
16377			} else if ( !rhtml.test( elem ) ) {
16378				nodes.push( context.createTextNode( elem ) );
16379
16380			// Convert html into DOM nodes
16381			} else {
16382				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
16383
16384				// Deserialize a standard representation
16385				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
16386				wrap = wrapMap[ tag ] || wrapMap._default;
16387				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
16388
16389				// Descend through wrappers to the right content
16390				j = wrap[ 0 ];
16391				while ( j-- ) {
16392					tmp = tmp.lastChild;
16393				}
16394
16395				// Support: Android <=4.0 only, PhantomJS 1 only
16396				// push.apply(_, arraylike) throws on ancient WebKit
16397				jQuery.merge( nodes, tmp.childNodes );
16398
16399				// Remember the top-level container
16400				tmp = fragment.firstChild;
16401
16402				// Ensure the created nodes are orphaned (trac-12392)
16403				tmp.textContent = "";
16404			}
16405		}
16406	}
16407
16408	// Remove wrapper from fragment
16409	fragment.textContent = "";
16410
16411	i = 0;
16412	while ( ( elem = nodes[ i++ ] ) ) {
16413
16414		// Skip elements already in the context collection (trac-4087)
16415		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
16416			if ( ignored ) {
16417				ignored.push( elem );
16418			}
16419			continue;
16420		}
16421
16422		attached = isAttached( elem );
16423
16424		// Append to fragment
16425		tmp = getAll( fragment.appendChild( elem ), "script" );
16426
16427		// Preserve script evaluation history
16428		if ( attached ) {
16429			setGlobalEval( tmp );
16430		}
16431
16432		// Capture executables
16433		if ( scripts ) {
16434			j = 0;
16435			while ( ( elem = tmp[ j++ ] ) ) {
16436				if ( rscriptType.test( elem.type || "" ) ) {
16437					scripts.push( elem );
16438				}
16439			}
16440		}
16441	}
16442
16443	return fragment;
16444}
16445
16446
16447var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
16448
16449function returnTrue() {
16450	return true;
16451}
16452
16453function returnFalse() {
16454	return false;
16455}
16456
16457// Support: IE <=9 - 11+
16458// focus() and blur() are asynchronous, except when they are no-op.
16459// So expect focus to be synchronous when the element is already active,
16460// and blur to be synchronous when the element is not already active.
16461// (focus and blur are always synchronous in other supported browsers,
16462// this just defines when we can count on it).
16463function expectSync( elem, type ) {
16464	return ( elem === safeActiveElement() ) === ( type === "focus" );
16465}
16466
16467// Support: IE <=9 only
16468// Accessing document.activeElement can throw unexpectedly
16469// https://bugs.jquery.com/ticket/13393
16470function safeActiveElement() {
16471	try {
16472		return document.activeElement;
16473	} catch ( err ) { }
vendor: 12,476 bytes, lines 16473-16913
16473
16474}
16475
16476function on( elem, types, selector, data, fn, one ) {
16477	var origFn, type;
16478
16479	// Types can be a map of types/handlers
16480	if ( typeof types === "object" ) {
16481
16482		// ( types-Object, selector, data )
16483		if ( typeof selector !== "string" ) {
16484
16485			// ( types-Object, data )
16486			data = data || selector;
16487			selector = undefined;
16488		}
16489		for ( type in types ) {
16490			on( elem, type, selector, data, types[ type ], one );
16491		}
16492		return elem;
16493	}
16494
16495	if ( data == null && fn == null ) {
16496
16497		// ( types, fn )
16498		fn = selector;
16499		data = selector = undefined;
16500	} else if ( fn == null ) {
16501		if ( typeof selector === "string" ) {
16502
16503			// ( types, selector, fn )
16504			fn = data;
16505			data = undefined;
16506		} else {
16507
16508			// ( types, data, fn )
16509			fn = data;
16510			data = selector;
16511			selector = undefined;
16512		}
16513	}
16514	if ( fn === false ) {
16515		fn = returnFalse;
16516	} else if ( !fn ) {
16517		return elem;
16518	}
16519
16520	if ( one === 1 ) {
16521		origFn = fn;
16522		fn = function( event ) {
16523
16524			// Can use an empty set, since event contains the info
16525			jQuery().off( event );
16526			return origFn.apply( this, arguments );
16527		};
16528
16529		// Use same guid so caller can remove using origFn
16530		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
16531	}
16532	return elem.each( function() {
16533		jQuery.event.add( this, types, fn, data, selector );
16534	} );
16535}
16536
16537/*
16538 * Helper functions for managing events -- not part of the public interface.
16539 * Props to Dean Edwards' addEvent library for many of the ideas.
16540 */
16541jQuery.event = {
16542
16543	global: {},
16544
16545	add: function( elem, types, handler, data, selector ) {
16546
16547		var handleObjIn, eventHandle, tmp,
16548			events, t, handleObj,
16549			special, handlers, type, namespaces, origType,
16550			elemData = dataPriv.get( elem );
16551
16552		// Only attach events to objects that accept data
16553		if ( !acceptData( elem ) ) {
16554			return;
16555		}
16556
16557		// Caller can pass in an object of custom data in lieu of the handler
16558		if ( handler.handler ) {
16559			handleObjIn = handler;
16560			handler = handleObjIn.handler;
16561			selector = handleObjIn.selector;
16562		}
16563
16564		// Ensure that invalid selectors throw exceptions at attach time
16565		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
16566		if ( selector ) {
16567			jQuery.find.matchesSelector( documentElement, selector );
16568		}
16569
16570		// Make sure that the handler has a unique ID, used to find/remove it later
16571		if ( !handler.guid ) {
16572			handler.guid = jQuery.guid++;
16573		}
16574
16575		// Init the element's event structure and main handler, if this is the first
16576		if ( !( events = elemData.events ) ) {
16577			events = elemData.events = Object.create( null );
16578		}
16579		if ( !( eventHandle = elemData.handle ) ) {
16580			eventHandle = elemData.handle = function( e ) {
16581
16582				// Discard the second event of a jQuery.event.trigger() and
16583				// when an event is called after a page has unloaded
16584				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
16585					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
16586			};
16587		}
16588
16589		// Handle multiple events separated by a space
16590		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
16591		t = types.length;
16592		while ( t-- ) {
16593			tmp = rtypenamespace.exec( types[ t ] ) || [];
16594			type = origType = tmp[ 1 ];
16595			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
16596
16597			// There *must* be a type, no attaching namespace-only handlers
16598			if ( !type ) {
16599				continue;
16600			}
16601
16602			// If event changes its type, use the special event handlers for the changed type
16603			special = jQuery.event.special[ type ] || {};
16604
16605			// If selector defined, determine special event api type, otherwise given type
16606			type = ( selector ? special.delegateType : special.bindType ) || type;
16607
16608			// Update special based on newly reset type
16609			special = jQuery.event.special[ type ] || {};
16610
16611			// handleObj is passed to all event handlers
16612			handleObj = jQuery.extend( {
16613				type: type,
16614				origType: origType,
16615				data: data,
16616				handler: handler,
16617				guid: handler.guid,
16618				selector: selector,
16619				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
16620				namespace: namespaces.join( "." )
16621			}, handleObjIn );
16622
16623			// Init the event handler queue if we're the first
16624			if ( !( handlers = events[ type ] ) ) {
16625				handlers = events[ type ] = [];
16626				handlers.delegateCount = 0;
16627
16628				// Only use addEventListener if the special events handler returns false
16629				if ( !special.setup ||
16630					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
16631
16632					if ( elem.addEventListener ) {
16633						elem.addEventListener( type, eventHandle );
16634					}
16635				}
16636			}
16637
16638			if ( special.add ) {
16639				special.add.call( elem, handleObj );
16640
16641				if ( !handleObj.handler.guid ) {
16642					handleObj.handler.guid = handler.guid;
16643				}
16644			}
16645
16646			// Add to the element's handler list, delegates in front
16647			if ( selector ) {
16648				handlers.splice( handlers.delegateCount++, 0, handleObj );
16649			} else {
16650				handlers.push( handleObj );
16651			}
16652
16653			// Keep track of which events have ever been used, for event optimization
16654			jQuery.event.global[ type ] = true;
16655		}
16656
16657	},
16658
16659	// Detach an event or set of events from an element
16660	remove: function( elem, types, handler, selector, mappedTypes ) {
16661
16662		var j, origCount, tmp,
16663			events, t, handleObj,
16664			special, handlers, type, namespaces, origType,
16665			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
16666
16667		if ( !elemData || !( events = elemData.events ) ) {
16668			return;
16669		}
16670
16671		// Once for each type.namespace in types; type may be omitted
16672		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
16673		t = types.length;
16674		while ( t-- ) {
16675			tmp = rtypenamespace.exec( types[ t ] ) || [];
16676			type = origType = tmp[ 1 ];
16677			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
16678
16679			// Unbind all events (on this namespace, if provided) for the element
16680			if ( !type ) {
16681				for ( type in events ) {
16682					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
16683				}
16684				continue;
16685			}
16686
16687			special = jQuery.event.special[ type ] || {};
16688			type = ( selector ? special.delegateType : special.bindType ) || type;
16689			handlers = events[ type ] || [];
16690			tmp = tmp[ 2 ] &&
16691				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
16692
16693			// Remove matching events
16694			origCount = j = handlers.length;
16695			while ( j-- ) {
16696				handleObj = handlers[ j ];
16697
16698				if ( ( mappedTypes || origType === handleObj.origType ) &&
16699					( !handler || handler.guid === handleObj.guid ) &&
16700					( !tmp || tmp.test( handleObj.namespace ) ) &&
16701					( !selector || selector === handleObj.selector ||
16702						selector === "**" && handleObj.selector ) ) {
16703					handlers.splice( j, 1 );
16704
16705					if ( handleObj.selector ) {
16706						handlers.delegateCount--;
16707					}
16708					if ( special.remove ) {
16709						special.remove.call( elem, handleObj );
16710					}
16711				}
16712			}
16713
16714			// Remove generic event handler if we removed something and no more handlers exist
16715			// (avoids potential for endless recursion during removal of special event handlers)
16716			if ( origCount && !handlers.length ) {
16717				if ( !special.teardown ||
16718					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
16719
16720					jQuery.removeEvent( elem, type, elemData.handle );
16721				}
16722
16723				delete events[ type ];
16724			}
16725		}
16726
16727		// Remove data and the expando if it's no longer used
16728		if ( jQuery.isEmptyObject( events ) ) {
16729			dataPriv.remove( elem, "handle events" );
16730		}
16731	},
16732
16733	dispatch: function( nativeEvent ) {
16734
16735		var i, j, ret, matched, handleObj, handlerQueue,
16736			args = new Array( arguments.length ),
16737
16738			// Make a writable jQuery.Event from the native event object
16739			event = jQuery.event.fix( nativeEvent ),
16740
16741			handlers = (
16742				dataPriv.get( this, "events" ) || Object.create( null )
16743			)[ event.type ] || [],
16744			special = jQuery.event.special[ event.type ] || {};
16745
16746		// Use the fix-ed jQuery.Event rather than the (read-only) native event
16747		args[ 0 ] = event;
16748
16749		for ( i = 1; i < arguments.length; i++ ) {
16750			args[ i ] = arguments[ i ];
16751		}
16752
16753		event.delegateTarget = this;
16754
16755		// Call the preDispatch hook for the mapped type, and let it bail if desired
16756		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
16757			return;
16758		}
16759
16760		// Determine handlers
16761		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
16762
16763		// Run delegates first; they may want to stop propagation beneath us
16764		i = 0;
16765		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
16766			event.currentTarget = matched.elem;
16767
16768			j = 0;
16769			while ( ( handleObj = matched.handlers[ j++ ] ) &&
16770				!event.isImmediatePropagationStopped() ) {
16771
16772				// If the event is namespaced, then each handler is only invoked if it is
16773				// specially universal or its namespaces are a superset of the event's.
16774				if ( !event.rnamespace || handleObj.namespace === false ||
16775					event.rnamespace.test( handleObj.namespace ) ) {
16776
16777					event.handleObj = handleObj;
16778					event.data = handleObj.data;
16779
16780					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
16781						handleObj.handler ).apply( matched.elem, args );
16782
16783					if ( ret !== undefined ) {
16784						if ( ( event.result = ret ) === false ) {
16785							event.preventDefault();
16786							event.stopPropagation();
16787						}
16788					}
16789				}
16790			}
16791		}
16792
16793		// Call the postDispatch hook for the mapped type
16794		if ( special.postDispatch ) {
16795			special.postDispatch.call( this, event );
16796		}
16797
16798		return event.result;
16799	},
16800
16801	handlers: function( event, handlers ) {
16802		var i, handleObj, sel, matchedHandlers, matchedSelectors,
16803			handlerQueue = [],
16804			delegateCount = handlers.delegateCount,
16805			cur = event.target;
16806
16807		// Find delegate handlers
16808		if ( delegateCount &&
16809
16810			// Support: IE <=9
16811			// Black-hole SVG <use> instance trees (trac-13180)
16812			cur.nodeType &&
16813
16814			// Support: Firefox <=42
16815			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
16816			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
16817			// Support: IE 11 only
16818			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
16819			!( event.type === "click" && event.button >= 1 ) ) {
16820
16821			for ( ; cur !== this; cur = cur.parentNode || this ) {
16822
16823				// Don't check non-elements (trac-13208)
16824				// Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)
16825				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
16826					matchedHandlers = [];
16827					matchedSelectors = {};
16828					for ( i = 0; i < delegateCount; i++ ) {
16829						handleObj = handlers[ i ];
16830
16831						// Don't conflict with Object.prototype properties (trac-13203)
16832						sel = handleObj.selector + " ";
16833
16834						if ( matchedSelectors[ sel ] === undefined ) {
16835							matchedSelectors[ sel ] = handleObj.needsContext ?
16836								jQuery( sel, this ).index( cur ) > -1 :
16837								jQuery.find( sel, this, null, [ cur ] ).length;
16838						}
16839						if ( matchedSelectors[ sel ] ) {
16840							matchedHandlers.push( handleObj );
16841						}
16842					}
16843					if ( matchedHandlers.length ) {
16844						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
16845					}
16846				}
16847			}
16848		}
16849
16850		// Add the remaining (directly-bound) handlers
16851		cur = this;
16852		if ( delegateCount < handlers.length ) {
16853			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
16854		}
16855
16856		return handlerQueue;
16857	},
16858
16859	addProp: function( name, hook ) {
16860		Object.defineProperty( jQuery.Event.prototype, name, {
16861			enumerable: true,
16862			configurable: true,
16863
16864			get: isFunction( hook ) ?
16865				function() {
16866					if ( this.originalEvent ) {
16867						return hook( this.originalEvent );
16868					}
16869				} :
16870				function() {
16871					if ( this.originalEvent ) {
16872						return this.originalEvent[ name ];
16873					}
16874				},
16875
16876			set: function( value ) {
16877				Object.defineProperty( this, name, {
16878					enumerable: true,
16879					configurable: true,
16880					writable: true,
16881					value: value
16882				} );
16883			}
16884		} );
16885	},
16886
16887	fix: function( originalEvent ) {
16888		return originalEvent[ jQuery.expando ] ?
16889			originalEvent :
16890			new jQuery.Event( originalEvent );
16891	},
16892
16893	special: {
16894		load: {
16895
16896			// Prevent triggered image.load events from bubbling to window.load
16897			noBubble: true
16898		},
16899		click: {
16900
16901			// Utilize native event to ensure correct state for checkable inputs
16902			setup: function( data ) {
16903
16904				// For mutual compressibility with _default, replace `this` access with a local var.
16905				// `|| data` is dead code meant only to preserve the variable through minification.
16906				var el = this || data;
16907
16908				// Claim the first handler
16909				if ( rcheckableType.test( el.type ) &&
16910					el.click && nodeName( el, "input" ) ) {
16911
16912					// dataPriv.set( el, "click", ... )
16913					leverageNative( el, "click", 
vendor: 2,758 bytes, lines 16913-16995
16913returnTrue );
16914				}
16915
16916				// Return false to allow normal processing in the caller
16917				return false;
16918			},
16919			trigger: function( data ) {
16920
16921				// For mutual compressibility with _default, replace `this` access with a local var.
16922				// `|| data` is dead code meant only to preserve the variable through minification.
16923				var el = this || data;
16924
16925				// Force setup before triggering a click
16926				if ( rcheckableType.test( el.type ) &&
16927					el.click && nodeName( el, "input" ) ) {
16928
16929					leverageNative( el, "click" );
16930				}
16931
16932				// Return non-false to allow normal event-path propagation
16933				return true;
16934			},
16935
16936			// For cross-browser consistency, suppress native .click() on links
16937			// Also prevent it if we're currently inside a leveraged native-event stack
16938			_default: function( event ) {
16939				var target = event.target;
16940				return rcheckableType.test( target.type ) &&
16941					target.click && nodeName( target, "input" ) &&
16942					dataPriv.get( target, "click" ) ||
16943					nodeName( target, "a" );
16944			}
16945		},
16946
16947		beforeunload: {
16948			postDispatch: function( event ) {
16949
16950				// Support: Firefox 20+
16951				// Firefox doesn't alert if the returnValue field is not set.
16952				if ( event.result !== undefined && event.originalEvent ) {
16953					event.originalEvent.returnValue = event.result;
16954				}
16955			}
16956		}
16957	}
16958};
16959
16960// Ensure the presence of an event listener that handles manually-triggered
16961// synthetic events by interrupting progress until reinvoked in response to
16962// *native* events that it fires directly, ensuring that state changes have
16963// already occurred before other listeners are invoked.
16964function leverageNative( el, type, expectSync ) {
16965
16966	// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
16967	if ( !expectSync ) {
16968		if ( dataPriv.get( el, type ) === undefined ) {
16969			jQuery.event.add( el, type, returnTrue );
16970		}
16971		return;
16972	}
16973
16974	// Register the controller as a special universal handler for all event namespaces
16975	dataPriv.set( el, type, false );
16976	jQuery.event.add( el, type, {
16977		namespace: false,
16978		handler: function( event ) {
16979			var notAsync, result,
16980				saved = dataPriv.get( this, type );
16981
16982			if ( ( event.isTrigger & 1 ) && this[ type ] ) {
16983
16984				// Interrupt processing of the outer synthetic .trigger()ed event
16985				// Saved data should be false in such cases, but might be a leftover capture object
16986				// from an async native handler (gh-4350)
16987				if ( !saved.length ) {
16988
16989					// Store arguments for use when handling the inner native event
16990					// There will always be at least one argument (an event object), so this array
16991					// will not be confused with a leftover capture object.
16992					saved = slice.call( arguments );
16993					dataPriv.set( this, type, saved );
16994
16995					// Trigger the native event and capture its result
16996					// Support: IE <=9 - 11+
16997					// focus() and blur() are asynchronous
16998					notAsync = expectSync( this, type );
16999					this[ type ]();
17000					result = dataPriv.get( this, type );
17001					if ( saved !== result || notAsync ) {
17002						dataPriv.set( this, type, false );
17003					} else {
17004						result = {};
17005					}
17006					if ( saved !== result ) {
17007
17008						// Cancel the outer synthetic event
17009						event.stopImmediatePropagation();
17010						event.preventDefault();
17011
17012						// Support: Chrome 86+
17013						// In Chrome, if an element having a focusout handler is blurred by
17014						// clicking outside of it, it invokes the handler synchronously. If
17015						// that handler calls `.remove()` on the element, the data is cleared,
17016						// leaving `result` undefined. We need to guard against this.
17017						return result && result.value;
17018					}
17019
17020				// If this is an inner synthetic event for an event with a bubbling surrogate
17021				// (focus or blur), assume that the surrogate already propagated from triggering the
17022				// native event and prevent that from happening again here.
17023				// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
17024				// bubbling surrogate propagates *after* the non-bubbling base), but that seems
17025				// less bad than duplication.
17026				} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
17027					event.stopPropagation();
17028				}
17029
17030			// If this is a native event triggered above, everything is now in order
17031			// Fire an inner synthetic event with the original arguments
17032			} else if ( saved.length ) {
17033
17034				// ...and capture the result
17035				dataPriv.set( this, type, {
17036					value: jQuery.event.trigger(
17037
17038						// Support: IE <=9 - 11+
17039						// Extend with the prototype to reset the above stopImmediatePropagation()
17040						jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
17041						saved.slice( 1 ),
17042						this
17043					)
17044				} );
17045
17046				// Abort handling of the native event
17047				event.stopImmediatePropagation();
17048			}
17049		}
17050	} );
17051}
17052
17053jQuery.removeEvent = function( elem, type, handle ) {
17054
17055	// This "if" is needed for plain objects
17056	if ( elem.removeEventListener ) {
17057		elem.removeEventListener( type, handle );
17058	}
17059};
17060
17061jQuery.Event = function( src, props ) {
17062
17063	// Allow instantiation without the 'new' keyword
17064	if ( !( this instanceof jQuery.Event ) ) {
17065		return new jQuery.Event( src, props );
17066	}
17067
17068	// Event object
17069	if ( src && src.type ) {
17070		this.originalEvent = src;
17071		this.type = src.type;
17072
17073		// Events bubbling up the document may have been marked as prevented
17074		// by a handler lower down the tree; reflect the correct value.
17075		this.isDefaultPrevented = src.defaultPrevented ||
17076				src.defaultPrevented === undefined &&
17077
17078				// Support: Android <=2.3 only
17079				src.returnValue === false ?
17080			returnTrue :
17081			returnFalse;
17082
17083		// Create target properties
17084		// Support: Safari <=6 - 7 only
17085		// Target should not be a text node (trac-504, trac-13143)
17086		this.target = ( src.target && src.target.nodeType === 3 ) ?
17087			src.target.parentNode :
17088			src.target;
17089
17090		this.currentTarget = src.currentTarget;
17091		this.relatedTarget = src.relatedTarget;
17092
17093	// Event type
17094	} else {
17095		this.type = src;
17096	}
17097
17098	// Put explicitly provided properties onto the event object
17099	if ( props ) {
17100		jQuery.extend( this, props );
17101	}
17102
17103	// Create a timestamp if incoming event doesn't have one
17104	this.timeStamp = src && src.timeStamp || Date.now();
17105
17106	// Mark it as fixed
17107	this[ jQuery.expando ] = true;
17108};
17109
17110// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
17111// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
17112jQuery.Event.prototype = {
17113	constructor: jQuery.Event,
17114	isDefaultPrevented: returnFalse,
17115	isPropagationStopped: returnFalse,
17116	isImmediatePropagationStopped: returnFalse,
17117	isSimulated: false,
17118
17119	preventDefault: function() {
17120		var e = this.originalEvent;
17121
17122		this.isDefaultPrevented = returnTrue;
17123
17124		if ( e && !this.isSimulated ) {
17125			e.preventDefault();
17126		}
17127	},
17128	stopPropagation: function() {
17129		var e = this.originalEvent;
17130
17131		this.isPropagationStopped = returnTrue;
17132
17133		if ( e && !this.isSimulated ) {
17134			e.stopPropagation();
17135		}
17136	},
17137	stopImmediatePropagation: function() {
17138		var e = this.originalEvent;
17139
17140		this.isImmediatePropagationStopped = returnTrue;
17141
17142		if ( e && !this.isSimulated ) {
17143			e.stopImmediatePropagation();
17144		}
17145
17146		this.stopPropagation();
17147	}
17148};
17149
17150// Includes all common event props including KeyEvent and MouseEvent specific props
17151jQuery.each( {
17152	altKey: true,
17153	bubbles: true,
17154	cancelable: true,
17155	changedTouches: true,
17156	ctrlKey: true,
17157	detail: true,
17158	eventPhase: true,
17159	metaKey: true,
17160	pageX: true,
17161	pageY: true,
17162	shiftKey: true,
17163	view: true,
17164	"char": true,
17165	code: true,
17166	charCode: true,
17167	key: true,
17168	keyCode: true,
17169	button: true,
17170	buttons: true,
17171	clientX: true,
17172	clientY: true,
17173	offsetX: true,
17174	offsetY: true,
17175	pointerId: true,
17176	pointerType: true,
17177	screenX: true,
17178	screenY: true,
17179	targetTouches: true,
17180	toElement: true,
17181	touches: true,
17182	which: true
17183}, jQuery.event.addProp );
17184
17185jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
17186	jQuery.event.special[ type ] = {
17187
17188		// Utilize native event if possible so blur/focus sequence is correct
17189		setup: function() {
17190
17191			// Claim the first handler
17192			// dataPriv.set( this, "focus", ... )
17193			// dataPriv.set( this, "blur", ... )
17194			leverageNative( this, type, expectSync );
17195
17196			// Return false to allow normal processing in the caller
17197			return false;
vendor: 8,761 bytes, lines 17198-17518
17198		},
17199		trigger: function() {
17200
17201			// Force setup before trigger
17202			leverageNative( this, type );
17203
17204			// Return non-false to allow normal event-path propagation
17205			return true;
17206		},
17207
17208		// Suppress native focus or blur if we're currently inside
17209		// a leveraged native-event stack
17210		_default: function( event ) {
17211			return dataPriv.get( event.target, type );
17212		},
17213
17214		delegateType: delegateType
17215	};
17216} );
17217
17218// Create mouseenter/leave events using mouseover/out and event-time checks
17219// so that event delegation works in jQuery.
17220// Do the same for pointerenter/pointerleave and pointerover/pointerout
17221//
17222// Support: Safari 7 only
17223// Safari sends mouseenter too often; see:
17224// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
17225// for the description of the bug (it existed in older Chrome versions as well).
17226jQuery.each( {
17227	mouseenter: "mouseover",
17228	mouseleave: "mouseout",
17229	pointerenter: "pointerover",
17230	pointerleave: "pointerout"
17231}, function( orig, fix ) {
17232	jQuery.event.special[ orig ] = {
17233		delegateType: fix,
17234		bindType: fix,
17235
17236		handle: function( event ) {
17237			var ret,
17238				target = this,
17239				related = event.relatedTarget,
17240				handleObj = event.handleObj;
17241
17242			// For mouseenter/leave call the handler if related is outside the target.
17243			// NB: No relatedTarget if the mouse left/entered the browser window
17244			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
17245				event.type = handleObj.origType;
17246				ret = handleObj.handler.apply( this, arguments );
17247				event.type = fix;
17248			}
17249			return ret;
17250		}
17251	};
17252} );
17253
17254jQuery.fn.extend( {
17255
17256	on: function( types, selector, data, fn ) {
17257		return on( this, types, selector, data, fn );
17258	},
17259	one: function( types, selector, data, fn ) {
17260		return on( this, types, selector, data, fn, 1 );
17261	},
17262	off: function( types, selector, fn ) {
17263		var handleObj, type;
17264		if ( types && types.preventDefault && types.handleObj ) {
17265
17266			// ( event )  dispatched jQuery.Event
17267			handleObj = types.handleObj;
17268			jQuery( types.delegateTarget ).off(
17269				handleObj.namespace ?
17270					handleObj.origType + "." + handleObj.namespace :
17271					handleObj.origType,
17272				handleObj.selector,
17273				handleObj.handler
17274			);
17275			return this;
17276		}
17277		if ( typeof types === "object" ) {
17278
17279			// ( types-object [, selector] )
17280			for ( type in types ) {
17281				this.off( type, selector, types[ type ] );
17282			}
17283			return this;
17284		}
17285		if ( selector === false || typeof selector === "function" ) {
17286
17287			// ( types [, fn] )
17288			fn = selector;
17289			selector = undefined;
17290		}
17291		if ( fn === false ) {
17292			fn = returnFalse;
17293		}
17294		return this.each( function() {
17295			jQuery.event.remove( this, types, fn, selector );
17296		} );
17297	}
17298} );
17299
17300
17301var
17302
17303	// Support: IE <=10 - 11, Edge 12 - 13 only
17304	// In IE/Edge using regex groups here causes severe slowdowns.
17305	// See https://connect.microsoft.com/IE/feedback/details/1736512/
17306	rnoInnerhtml = /<script|<style|<link/i,
17307
17308	// checked="checked" or checked
17309	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
17310
17311	rcleanScript = /^\s*<!\[CDATA\[|\]\]>\s*$/g;
17312
17313// Prefer a tbody over its parent table for containing new rows
17314function manipulationTarget( elem, content ) {
17315	if ( nodeName( elem, "table" ) &&
17316		nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
17317
17318		return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
17319	}
17320
17321	return elem;
17322}
17323
17324// Replace/restore the type attribute of script elements for safe DOM manipulation
17325function disableScript( elem ) {
17326	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
17327	return elem;
17328}
17329function restoreScript( elem ) {
17330	if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
17331		elem.type = elem.type.slice( 5 );
17332	} else {
17333		elem.removeAttribute( "type" );
17334	}
17335
17336	return elem;
17337}
17338
17339function cloneCopyEvent( src, dest ) {
17340	var i, l, type, pdataOld, udataOld, udataCur, events;
17341
17342	if ( dest.nodeType !== 1 ) {
17343		return;
17344	}
17345
17346	// 1. Copy private data: events, handlers, etc.
17347	if ( dataPriv.hasData( src ) ) {
17348		pdataOld = dataPriv.get( src );
17349		events = pdataOld.events;
17350
17351		if ( events ) {
17352			dataPriv.remove( dest, "handle events" );
17353
17354			for ( type in events ) {
17355				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
17356					jQuery.event.add( dest, type, events[ type ][ i ] );
17357				}
17358			}
17359		}
17360	}
17361
17362	// 2. Copy user data
17363	if ( dataUser.hasData( src ) ) {
17364		udataOld = dataUser.access( src );
17365		udataCur = jQuery.extend( {}, udataOld );
17366
17367		dataUser.set( dest, udataCur );
17368	}
17369}
17370
17371// Fix IE bugs, see support tests
17372function fixInput( src, dest ) {
17373	var nodeName = dest.nodeName.toLowerCase();
17374
17375	// Fails to persist the checked state of a cloned checkbox or radio button.
17376	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
17377		dest.checked = src.checked;
17378
17379	// Fails to return the selected option to the default selected state when cloning options
17380	} else if ( nodeName === "input" || nodeName === "textarea" ) {
17381		dest.defaultValue = src.defaultValue;
17382	}
17383}
17384
17385function domManip( collection, args, callback, ignored ) {
17386
17387	// Flatten any nested arrays
17388	args = flat( args );
17389
17390	var fragment, first, scripts, hasScripts, node, doc,
17391		i = 0,
17392		l = collection.length,
17393		iNoClone = l - 1,
17394		value = args[ 0 ],
17395		valueIsFunction = isFunction( value );
17396
17397	// We can't cloneNode fragments that contain checked, in WebKit
17398	if ( valueIsFunction ||
17399			( l > 1 && typeof value === "string" &&
17400				!support.checkClone && rchecked.test( value ) ) ) {
17401		return collection.each( function( index ) {
17402			var self = collection.eq( index );
17403			if ( valueIsFunction ) {
17404				args[ 0 ] = value.call( this, index, self.html() );
17405			}
17406			domManip( self, args, callback, ignored );
17407		} );
17408	}
17409
17410	if ( l ) {
17411		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
17412		first = fragment.firstChild;
17413
17414		if ( fragment.childNodes.length === 1 ) {
17415			fragment = first;
17416		}
17417
17418		// Require either new content or an interest in ignored elements to invoke the callback
17419		if ( first || ignored ) {
17420			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
17421			hasScripts = scripts.length;
17422
17423			// Use the original fragment for the last item
17424			// instead of the first because it can end up
17425			// being emptied incorrectly in certain situations (trac-8070).
17426			for ( ; i < l; i++ ) {
17427				node = fragment;
17428
17429				if ( i !== iNoClone ) {
17430					node = jQuery.clone( node, true, true );
17431
17432					// Keep references to cloned scripts for later restoration
17433					if ( hasScripts ) {
17434
17435						// Support: Android <=4.0 only, PhantomJS 1 only
17436						// push.apply(_, arraylike) throws on ancient WebKit
17437						jQuery.merge( scripts, getAll( node, "script" ) );
17438					}
17439				}
17440
17441				callback.call( collection[ i ], node, i );
17442			}
17443
17444			if ( hasScripts ) {
17445				doc = scripts[ scripts.length - 1 ].ownerDocument;
17446
17447				// Reenable scripts
17448				jQuery.map( scripts, restoreScript );
17449
17450				// Evaluate executable scripts on first document insertion
17451				for ( i = 0; i < hasScripts; i++ ) {
17452					node = scripts[ i ];
17453					if ( rscriptType.test( node.type || "" ) &&
17454						!dataPriv.access( node, "globalEval" ) &&
17455						jQuery.contains( doc, node ) ) {
17456
17457						if ( node.src && ( node.type || "" ).toLowerCase()  !== "module" ) {
17458
17459							// Optional AJAX dependency, but won't run scripts if not present
17460							if ( jQuery._evalUrl && !node.noModule ) {
17461								jQuery._evalUrl( node.src, {
17462									nonce: node.nonce || node.getAttribute( "nonce" )
17463								}, doc );
17464							}
17465						} else {
17466
17467							// Unwrap a CDATA section containing script contents. This shouldn't be
17468							// needed as in XML documents they're already not visible when
17469							// inspecting element contents and in HTML documents they have no
17470							// meaning but we're preserving that logic for backwards compatibility.
17471							// This will be removed completely in 4.0. See gh-4904.
17472							DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
17473						}
17474					}
17475				}
17476			}
17477		}
17478	}
17479
17480	return collection;
17481}
17482
17483function remove( elem, selector, keepData ) {
17484	var node,
17485		nodes = selector ? jQuery.filter( selector, elem ) : elem,
17486		i = 0;
17487
17488	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
17489		if ( !keepData && node.nodeType === 1 ) {
17490			jQuery.cleanData( getAll( node ) );
17491		}
17492
17493		if ( node.parentNode ) {
17494			if ( keepData && isAttached( node ) ) {
17495				setGlobalEval( getAll( node, "script" ) );
17496			}
17497			node.parentNode.removeChild( node );
17498		}
17499	}
17500
17501	return elem;
17502}
17503
17504jQuery.extend( {
17505	htmlPrefilter: function( html ) {
17506		return html;
17507	},
17508
17509	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
17510		var i, l, srcElements, destElements,
17511			clone = elem.cloneNode( true ),
17512			inPage = isAttached( elem );
17513
17514		// Fix IE cloning issues
17515		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
17516				!jQuery.isXMLDoc( elem ) ) {
17517
17518			// We eschew Sizzle here for performance reasons:
vendor: 6,686 bytes, lines 17518-17793
17518 https://jsperf.com/getall-vs-sizzle/2
17519			destElements = getAll( clone );
17520			srcElements = getAll( elem );
17521
17522			for ( i = 0, l = srcElements.length; i < l; i++ ) {
17523				fixInput( srcElements[ i ], destElements[ i ] );
17524			}
17525		}
17526
17527		// Copy the events from the original to the clone
17528		if ( dataAndEvents ) {
17529			if ( deepDataAndEvents ) {
17530				srcElements = srcElements || getAll( elem );
17531				destElements = destElements || getAll( clone );
17532
17533				for ( i = 0, l = srcElements.length; i < l; i++ ) {
17534					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
17535				}
17536			} else {
17537				cloneCopyEvent( elem, clone );
17538			}
17539		}
17540
17541		// Preserve script evaluation history
17542		destElements = getAll( clone, "script" );
17543		if ( destElements.length > 0 ) {
17544			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
17545		}
17546
17547		// Return the cloned set
17548		return clone;
17549	},
17550
17551	cleanData: function( elems ) {
17552		var data, elem, type,
17553			special = jQuery.event.special,
17554			i = 0;
17555
17556		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
17557			if ( acceptData( elem ) ) {
17558				if ( ( data = elem[ dataPriv.expando ] ) ) {
17559					if ( data.events ) {
17560						for ( type in data.events ) {
17561							if ( special[ type ] ) {
17562								jQuery.event.remove( elem, type );
17563
17564							// This is a shortcut to avoid jQuery.event.remove's overhead
17565							} else {
17566								jQuery.removeEvent( elem, type, data.handle );
17567							}
17568						}
17569					}
17570
17571					// Support: Chrome <=35 - 45+
17572					// Assign undefined instead of using delete, see Data#remove
17573					elem[ dataPriv.expando ] = undefined;
17574				}
17575				if ( elem[ dataUser.expando ] ) {
17576
17577					// Support: Chrome <=35 - 45+
17578					// Assign undefined instead of using delete, see Data#remove
17579					elem[ dataUser.expando ] = undefined;
17580				}
17581			}
17582		}
17583	}
17584} );
17585
17586jQuery.fn.extend( {
17587	detach: function( selector ) {
17588		return remove( this, selector, true );
17589	},
17590
17591	remove: function( selector ) {
17592		return remove( this, selector );
17593	},
17594
17595	text: function( value ) {
17596		return access( this, function( value ) {
17597			return value === undefined ?
17598				jQuery.text( this ) :
17599				this.empty().each( function() {
17600					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
17601						this.textContent = value;
17602					}
17603				} );
17604		}, null, value, arguments.length );
17605	},
17606
17607	append: function() {
17608		return domManip( this, arguments, function( elem ) {
17609			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
17610				var target = manipulationTarget( this, elem );
17611				target.appendChild( elem );
17612			}
17613		} );
17614	},
17615
17616	prepend: function() {
17617		return domManip( this, arguments, function( elem ) {
17618			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
17619				var target = manipulationTarget( this, elem );
17620				target.insertBefore( elem, target.firstChild );
17621			}
17622		} );
17623	},
17624
17625	before: function() {
17626		return domManip( this, arguments, function( elem ) {
17627			if ( this.parentNode ) {
17628				this.parentNode.insertBefore( elem, this );
17629			}
17630		} );
17631	},
17632
17633	after: function() {
17634		return domManip( this, arguments, function( elem ) {
17635			if ( this.parentNode ) {
17636				this.parentNode.insertBefore( elem, this.nextSibling );
17637			}
17638		} );
17639	},
17640
17641	empty: function() {
17642		var elem,
17643			i = 0;
17644
17645		for ( ; ( elem = this[ i ] ) != null; i++ ) {
17646			if ( elem.nodeType === 1 ) {
17647
17648				// Prevent memory leaks
17649				jQuery.cleanData( getAll( elem, false ) );
17650
17651				// Remove any remaining nodes
17652				elem.textContent = "";
17653			}
17654		}
17655
17656		return this;
17657	},
17658
17659	clone: function( dataAndEvents, deepDataAndEvents ) {
17660		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
17661		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
17662
17663		return this.map( function() {
17664			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
17665		} );
17666	},
17667
17668	html: function( value ) {
17669		return access( this, function( value ) {
17670			var elem = this[ 0 ] || {},
17671				i = 0,
17672				l = this.length;
17673
17674			if ( value === undefined && elem.nodeType === 1 ) {
17675				return elem.innerHTML;
17676			}
17677
17678			// See if we can take a shortcut and just use innerHTML
17679			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
17680				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
17681
17682				value = jQuery.htmlPrefilter( value );
17683
17684				try {
17685					for ( ; i < l; i++ ) {
17686						elem = this[ i ] || {};
17687
17688						// Remove element nodes and prevent memory leaks
17689						if ( elem.nodeType === 1 ) {
17690							jQuery.cleanData( getAll( elem, false ) );
17691							elem.innerHTML = value;
17692						}
17693					}
17694
17695					elem = 0;
17696
17697				// If using innerHTML throws an exception, use the fallback method
17698				} catch ( e ) {}
17699			}
17700
17701			if ( elem ) {
17702				this.empty().append( value );
17703			}
17704		}, null, value, arguments.length );
17705	},
17706
17707	replaceWith: function() {
17708		var ignored = [];
17709
17710		// Make the changes, replacing each non-ignored context element with the new content
17711		return domManip( this, arguments, function( elem ) {
17712			var parent = this.parentNode;
17713
17714			if ( jQuery.inArray( this, ignored ) < 0 ) {
17715				jQuery.cleanData( getAll( this ) );
17716				if ( parent ) {
17717					parent.replaceChild( elem, this );
17718				}
17719			}
17720
17721		// Force callback invocation
17722		}, ignored );
17723	}
17724} );
17725
17726jQuery.each( {
17727	appendTo: "append",
17728	prependTo: "prepend",
17729	insertBefore: "before",
17730	insertAfter: "after",
17731	replaceAll: "replaceWith"
17732}, function( name, original ) {
17733	jQuery.fn[ name ] = function( selector ) {
17734		var elems,
17735			ret = [],
17736			insert = jQuery( selector ),
17737			last = insert.length - 1,
17738			i = 0;
17739
17740		for ( ; i <= last; i++ ) {
17741			elems = i === last ? this : this.clone( true );
17742			jQuery( insert[ i ] )[ original ]( elems );
17743
17744			// Support: Android <=4.0 only, PhantomJS 1 only
17745			// .get() because push.apply(_, arraylike) throws on ancient WebKit
17746			push.apply( ret, elems.get() );
17747		}
17748
17749		return this.pushStack( ret );
17750	};
17751} );
17752var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
17753
17754var rcustomProp = /^--/;
17755
17756
17757var getStyles = function( elem ) {
17758
17759		// Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)
17760		// IE throws on elements created in popups
17761		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
17762		var view = elem.ownerDocument.defaultView;
17763
17764		if ( !view || !view.opener ) {
17765			view = window;
17766		}
17767
17768		return view.getComputedStyle( elem );
17769	};
17770
17771var swap = function( elem, options, callback ) {
17772	var ret, name,
17773		old = {};
17774
17775	// Remember the old values, and insert the new ones
17776	for ( name in options ) {
17777		old[ name ] = elem.style[ name ];
17778		elem.style[ name ] = options[ name ];
17779	}
17780
17781	ret = callback.call( elem );
17782
17783	// Revert the old values
17784	for ( name in options ) {
17785		elem.style[ name ] = old[ name ];
17786	}
17787
17788	return ret;
17789};
17790
17791
17792var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
17793
17794var whitespace = "[\\x20\\t\\r\\n\\f]";
17795
17796
17797var rtrimCSS = new RegExp(
17798	"^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$",
17799	"g"
17800);
17801
17802
17803
17804
17805( function() {
17806
17807	// Executing both pixelPosition & boxSizingReliable tests require only one layout
17808	// so they're executed at the same time to save the second computation.
17809	function computeStyleTests() {
17810
17811		// This is a singleton, we need to execute it only once
17812		if ( !div ) {
17813			return;
17814		}
17815
17816		container.style.cssText = "position:absolute;
vendor: 13,607 bytes, lines 17816-18270
17816left:-11111px;width:60px;" +
17817			"margin-top:1px;padding:0;border:0";
17818		div.style.cssText =
17819			"position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
17820			"margin:auto;border:1px;padding:1px;" +
17821			"width:60%;top:1%";
17822		documentElement.appendChild( container ).appendChild( div );
17823
17824		var divStyle = window.getComputedStyle( div );
17825		pixelPositionVal = divStyle.top !== "1%";
17826
17827		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
17828		reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
17829
17830		// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
17831		// Some styles come back with percentage values, even though they shouldn't
17832		div.style.right = "60%";
17833		pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
17834
17835		// Support: IE 9 - 11 only
17836		// Detect misreporting of content dimensions for box-sizing:border-box elements
17837		boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
17838
17839		// Support: IE 9 only
17840		// Detect overflow:scroll screwiness (gh-3699)
17841		// Support: Chrome <=64
17842		// Don't get tricked when zoom affects offsetWidth (gh-4029)
17843		div.style.position = "absolute";
17844		scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
17845
17846		documentElement.removeChild( container );
17847
17848		// Nullify the div so it wouldn't be stored in the memory and
17849		// it will also be a sign that checks already performed
17850		div = null;
17851	}
17852
17853	function roundPixelMeasures( measure ) {
17854		return Math.round( parseFloat( measure ) );
17855	}
17856
17857	var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
17858		reliableTrDimensionsVal, reliableMarginLeftVal,
17859		container = document.createElement( "div" ),
17860		div = document.createElement( "div" );
17861
17862	// Finish early in limited (non-browser) environments
17863	if ( !div.style ) {
17864		return;
17865	}
17866
17867	// Support: IE <=9 - 11 only
17868	// Style of cloned element affects source element cloned (trac-8908)
17869	div.style.backgroundClip = "content-box";
17870	div.cloneNode( true ).style.backgroundClip = "";
17871	support.clearCloneStyle = div.style.backgroundClip === "content-box";
17872
17873	jQuery.extend( support, {
17874		boxSizingReliable: function() {
17875			computeStyleTests();
17876			return boxSizingReliableVal;
17877		},
17878		pixelBoxStyles: function() {
17879			computeStyleTests();
17880			return pixelBoxStylesVal;
17881		},
17882		pixelPosition: function() {
17883			computeStyleTests();
17884			return pixelPositionVal;
17885		},
17886		reliableMarginLeft: function() {
17887			computeStyleTests();
17888			return reliableMarginLeftVal;
17889		},
17890		scrollboxSize: function() {
17891			computeStyleTests();
17892			return scrollboxSizeVal;
17893		},
17894
17895		// Support: IE 9 - 11+, Edge 15 - 18+
17896		// IE/Edge misreport `getComputedStyle` of table rows with width/height
17897		// set in CSS while `offset*` properties report correct values.
17898		// Behavior in IE 9 is more subtle than in newer versions & it passes
17899		// some versions of this test; make sure not to make it pass there!
17900		//
17901		// Support: Firefox 70+
17902		// Only Firefox includes border widths
17903		// in computed dimensions. (gh-4529)
17904		reliableTrDimensions: function() {
17905			var table, tr, trChild, trStyle;
17906			if ( reliableTrDimensionsVal == null ) {
17907				table = document.createElement( "table" );
17908				tr = document.createElement( "tr" );
17909				trChild = document.createElement( "div" );
17910
17911				table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
17912				tr.style.cssText = "border:1px solid";
17913
17914				// Support: Chrome 86+
17915				// Height set through cssText does not get applied.
17916				// Computed height then comes back as 0.
17917				tr.style.height = "1px";
17918				trChild.style.height = "9px";
17919
17920				// Support: Android 8 Chrome 86+
17921				// In our bodyBackground.html iframe,
17922				// display for all div elements is set to "inline",
17923				// which causes a problem only in Android 8 Chrome 86.
17924				// Ensuring the div is display: block
17925				// gets around this issue.
17926				trChild.style.display = "block";
17927
17928				documentElement
17929					.appendChild( table )
17930					.appendChild( tr )
17931					.appendChild( trChild );
17932
17933				trStyle = window.getComputedStyle( tr );
17934				reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
17935					parseInt( trStyle.borderTopWidth, 10 ) +
17936					parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
17937
17938				documentElement.removeChild( table );
17939			}
17940			return reliableTrDimensionsVal;
17941		}
17942	} );
17943} )();
17944
17945
17946function curCSS( elem, name, computed ) {
17947	var width, minWidth, maxWidth, ret,
17948		isCustomProp = rcustomProp.test( name ),
17949
17950		// Support: Firefox 51+
17951		// Retrieving style before computed somehow
17952		// fixes an issue with getting wrong values
17953		// on detached elements
17954		style = elem.style;
17955
17956	computed = computed || getStyles( elem );
17957
17958	// getPropertyValue is needed for:
17959	//   .css('filter') (IE 9 only, trac-12537)
17960	//   .css('--customProperty) (gh-3144)
17961	if ( computed ) {
17962		ret = computed.getPropertyValue( name ) || computed[ name ];
17963
17964		// trim whitespace for custom property (issue gh-4926)
17965		if ( isCustomProp ) {
17966
17967			// rtrim treats U+000D CARRIAGE RETURN and U+000C FORM FEED
17968			// as whitespace while CSS does not, but this is not a problem
17969			// because CSS preprocessing replaces them with U+000A LINE FEED
17970			// (which *is* CSS whitespace)
17971			// https://www.w3.org/TR/css-syntax-3/#input-preprocessing
17972			ret = ret.replace( rtrimCSS, "$1" );
17973		}
17974
17975		if ( ret === "" && !isAttached( elem ) ) {
17976			ret = jQuery.style( elem, name );
17977		}
17978
17979		// A tribute to the "awesome hack by Dean Edwards"
17980		// Android Browser returns percentage for some values,
17981		// but width seems to be reliably pixels.
17982		// This is against the CSSOM draft spec:
17983		// https://drafts.csswg.org/cssom/#resolved-values
17984		if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
17985
17986			// Remember the original values
17987			width = style.width;
17988			minWidth = style.minWidth;
17989			maxWidth = style.maxWidth;
17990
17991			// Put in the new values to get a computed value out
17992			style.minWidth = style.maxWidth = style.width = ret;
17993			ret = computed.width;
17994
17995			// Revert the changed values
17996			style.width = width;
17997			style.minWidth = minWidth;
17998			style.maxWidth = maxWidth;
17999		}
18000	}
18001
18002	return ret !== undefined ?
18003
18004		// Support: IE <=9 - 11 only
18005		// IE returns zIndex value as an integer.
18006		ret + "" :
18007		ret;
18008}
18009
18010
18011function addGetHookIf( conditionFn, hookFn ) {
18012
18013	// Define the hook, we'll check on the first run if it's really needed.
18014	return {
18015		get: function() {
18016			if ( conditionFn() ) {
18017
18018				// Hook not needed (or it's not possible to use it due
18019				// to missing dependency), remove it.
18020				delete this.get;
18021				return;
18022			}
18023
18024			// Hook needed; redefine it so that the support test is not executed again.
18025			return ( this.get = hookFn ).apply( this, arguments );
18026		}
18027	};
18028}
18029
18030
18031var cssPrefixes = [ "Webkit", "Moz", "ms" ],
18032	emptyStyle = document.createElement( "div" ).style,
18033	vendorProps = {};
18034
18035// Return a vendor-prefixed property or undefined
18036function vendorPropName( name ) {
18037
18038	// Check for vendor prefixed names
18039	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
18040		i = cssPrefixes.length;
18041
18042	while ( i-- ) {
18043		name = cssPrefixes[ i ] + capName;
18044		if ( name in emptyStyle ) {
18045			return name;
18046		}
18047	}
18048}
18049
18050// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
18051function finalPropName( name ) {
18052	var final = jQuery.cssProps[ name ] || vendorProps[ name ];
18053
18054	if ( final ) {
18055		return final;
18056	}
18057	if ( name in emptyStyle ) {
18058		return name;
18059	}
18060	return vendorProps[ name ] = vendorPropName( name ) || name;
18061}
18062
18063
18064var
18065
18066	// Swappable if display is none or starts with table
18067	// except "table", "table-cell", or "table-caption"
18068	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
18069	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
18070	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
18071	cssNormalTransform = {
18072		letterSpacing: "0",
18073		fontWeight: "400"
18074	};
18075
18076function setPositiveNumber( _elem, value, subtract ) {
18077
18078	// Any relative (+/-) values have already been
18079	// normalized at this point
18080	var matches = rcssNum.exec( value );
18081	return matches ?
18082
18083		// Guard against undefined "subtract", e.g., when used as in cssHooks
18084		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
18085		value;
18086}
18087
18088function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
18089	var i = dimension === "width" ? 1 : 0,
18090		extra = 0,
18091		delta = 0;
18092
18093	// Adjustment may not be necessary
18094	if ( box === ( isBorderBox ? "border" : "content" ) ) {
18095		return 0;
18096	}
18097
18098	for ( ; i < 4; i += 2 ) {
18099
18100		// Both box models exclude margin
18101		if ( box === "margin" ) {
18102			delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
18103		}
18104
18105		// If we get here with a content-box, we're seeking "padding" or "border" or "margin"
18106		if ( !isBorderBox ) {
18107
18108			// Add padding
18109			delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
18110
18111			// For "border" or "margin", add border
18112			if ( box !== "padding" ) {
18113				delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
18114
18115			// But still keep track of it otherwise
18116			} else {
18117				extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
18118			}
18119
18120		// If we get here with a border-box (content + padding + border), we're seeking "content" or
18121		// "padding" or "margin"
18122		} else {
18123
18124			// For "content", subtract padding
18125			if ( box === "content" ) {
18126				delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
18127			}
18128
18129			// For "content" or "padding", subtract border
18130			if ( box !== "margin" ) {
18131				delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
18132			}
18133		}
18134	}
18135
18136	// Account for positive content-box scroll gutter when requested by providing computedVal
18137	if ( !isBorderBox && computedVal >= 0 ) {
18138
18139		// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
18140		// Assuming integer scroll gutter, subtract the rest and round down
18141		delta += Math.max( 0, Math.ceil(
18142			elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
18143			computedVal -
18144			delta -
18145			extra -
18146			0.5
18147
18148		// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
18149		// Use an explicit zero to avoid NaN (gh-3964)
18150		) ) || 0;
18151	}
18152
18153	return delta;
18154}
18155
18156function getWidthOrHeight( elem, dimension, extra ) {
18157
18158	// Start with computed style
18159	var styles = getStyles( elem ),
18160
18161		// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
18162		// Fake content-box until we know it's needed to know the true value.
18163		boxSizingNeeded = !support.boxSizingReliable() || extra,
18164		isBorderBox = boxSizingNeeded &&
18165			jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
18166		valueIsBorderBox = isBorderBox,
18167
18168		val = curCSS( elem, dimension, styles ),
18169		offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
18170
18171	// Support: Firefox <=54
18172	// Return a confounding non-pixel value or feign ignorance, as appropriate.
18173	if ( rnumnonpx.test( val ) ) {
18174		if ( !extra ) {
18175			return val;
18176		}
18177		val = "auto";
18178	}
18179
18180
18181	// Support: IE 9 - 11 only
18182	// Use offsetWidth/offsetHeight for when box sizing is unreliable.
18183	// In those cases, the computed value can be trusted to be border-box.
18184	if ( ( !support.boxSizingReliable() && isBorderBox ||
18185
18186		// Support: IE 10 - 11+, Edge 15 - 18+
18187		// IE/Edge misreport `getComputedStyle` of table rows with width/height
18188		// set in CSS while `offset*` properties report correct values.
18189		// Interestingly, in some cases IE 9 doesn't suffer from this issue.
18190		!support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
18191
18192		// Fall back to offsetWidth/offsetHeight when value is "auto"
18193		// This happens for inline elements with no explicit setting (gh-3571)
18194		val === "auto" ||
18195
18196		// Support: Android <=4.1 - 4.3 only
18197		// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
18198		!parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
18199
18200		// Make sure the element is visible & connected
18201		elem.getClientRects().length ) {
18202
18203		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
18204
18205		// Where available, offsetWidth/offsetHeight approximate border box dimensions.
18206		// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
18207		// retrieved value as a content box dimension.
18208		valueIsBorderBox = offsetProp in elem;
18209		if ( valueIsBorderBox ) {
18210			val = elem[ offsetProp ];
18211		}
18212	}
18213
18214	// Normalize "" and auto
18215	val = parseFloat( val ) || 0;
18216
18217	// Adjust for the element's box model
18218	return ( val +
18219		boxModelAdjustment(
18220			elem,
18221			dimension,
18222			extra || ( isBorderBox ? "border" : "content" ),
18223			valueIsBorderBox,
18224			styles,
18225
18226			// Provide the current computed size to request scroll gutter calculation (gh-3589)
18227			val
18228		)
18229	) + "px";
18230}
18231
18232jQuery.extend( {
18233
18234	// Add in style property hooks for overriding the default
18235	// behavior of getting and setting a style property
18236	cssHooks: {
18237		opacity: {
18238			get: function( elem, computed ) {
18239				if ( computed ) {
18240
18241					// We should always get a number back from opacity
18242					var ret = curCSS( elem, "opacity" );
18243					return ret === "" ? "1" : ret;
18244				}
18245			}
18246		}
18247	},
18248
18249	// Don't automatically add "px" to these possibly-unitless properties
18250	cssNumber: {
18251		"animationIterationCount": true,
18252		"columnCount": true,
18253		"fillOpacity": true,
18254		"flexGrow": true,
18255		"flexShrink": true,
18256		"fontWeight": true,
18257		"gridArea": true,
18258		"gridColumn": true,
18259		"gridColumnEnd": true,
18260		"gridColumnStart": true,
18261		"gridRow": true,
18262		"gridRowEnd": true,
18263		"gridRowStart": true,
18264		"lineHeight": true,
18265		"opacity": true,
18266		"order": true,
18267		"orphans": true,
18268		"widows": true,
18269		"zIndex": true,
18270		"zoom"
vendor: 42,949 bytes, lines 18270-19995
18270: true
18271	},
18272
18273	// Add in properties whose names you wish to fix before
18274	// setting or getting the value
18275	cssProps: {},
18276
18277	// Get and set the style property on a DOM Node
18278	style: function( elem, name, value, extra ) {
18279
18280		// Don't set styles on text and comment nodes
18281		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
18282			return;
18283		}
18284
18285		// Make sure that we're working with the right name
18286		var ret, type, hooks,
18287			origName = camelCase( name ),
18288			isCustomProp = rcustomProp.test( name ),
18289			style = elem.style;
18290
18291		// Make sure that we're working with the right name. We don't
18292		// want to query the value if it is a CSS custom property
18293		// since they are user-defined.
18294		if ( !isCustomProp ) {
18295			name = finalPropName( origName );
18296		}
18297
18298		// Gets hook for the prefixed version, then unprefixed version
18299		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
18300
18301		// Check if we're setting a value
18302		if ( value !== undefined ) {
18303			type = typeof value;
18304
18305			// Convert "+=" or "-=" to relative numbers (trac-7345)
18306			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
18307				value = adjustCSS( elem, name, ret );
18308
18309				// Fixes bug trac-9237
18310				type = "number";
18311			}
18312
18313			// Make sure that null and NaN values aren't set (trac-7116)
18314			if ( value == null || value !== value ) {
18315				return;
18316			}
18317
18318			// If a number was passed in, add the unit (except for certain CSS properties)
18319			// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
18320			// "px" to a few hardcoded values.
18321			if ( type === "number" && !isCustomProp ) {
18322				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
18323			}
18324
18325			// background-* props affect original clone's values
18326			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
18327				style[ name ] = "inherit";
18328			}
18329
18330			// If a hook was provided, use that value, otherwise just set the specified value
18331			if ( !hooks || !( "set" in hooks ) ||
18332				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
18333
18334				if ( isCustomProp ) {
18335					style.setProperty( name, value );
18336				} else {
18337					style[ name ] = value;
18338				}
18339			}
18340
18341		} else {
18342
18343			// If a hook was provided get the non-computed value from there
18344			if ( hooks && "get" in hooks &&
18345				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
18346
18347				return ret;
18348			}
18349
18350			// Otherwise just get the value from the style object
18351			return style[ name ];
18352		}
18353	},
18354
18355	css: function( elem, name, extra, styles ) {
18356		var val, num, hooks,
18357			origName = camelCase( name ),
18358			isCustomProp = rcustomProp.test( name );
18359
18360		// Make sure that we're working with the right name. We don't
18361		// want to modify the value if it is a CSS custom property
18362		// since they are user-defined.
18363		if ( !isCustomProp ) {
18364			name = finalPropName( origName );
18365		}
18366
18367		// Try prefixed name followed by the unprefixed name
18368		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
18369
18370		// If a hook was provided get the computed value from there
18371		if ( hooks && "get" in hooks ) {
18372			val = hooks.get( elem, true, extra );
18373		}
18374
18375		// Otherwise, if a way to get the computed value exists, use that
18376		if ( val === undefined ) {
18377			val = curCSS( elem, name, styles );
18378		}
18379
18380		// Convert "normal" to computed value
18381		if ( val === "normal" && name in cssNormalTransform ) {
18382			val = cssNormalTransform[ name ];
18383		}
18384
18385		// Make numeric if forced or a qualifier was provided and val looks numeric
18386		if ( extra === "" || extra ) {
18387			num = parseFloat( val );
18388			return extra === true || isFinite( num ) ? num || 0 : val;
18389		}
18390
18391		return val;
18392	}
18393} );
18394
18395jQuery.each( [ "height", "width" ], function( _i, dimension ) {
18396	jQuery.cssHooks[ dimension ] = {
18397		get: function( elem, computed, extra ) {
18398			if ( computed ) {
18399
18400				// Certain elements can have dimension info if we invisibly show them
18401				// but it must have a current display style that would benefit
18402				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
18403
18404					// Support: Safari 8+
18405					// Table columns in Safari have non-zero offsetWidth & zero
18406					// getBoundingClientRect().width unless display is changed.
18407					// Support: IE <=11 only
18408					// Running getBoundingClientRect on a disconnected node
18409					// in IE throws an error.
18410					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
18411					swap( elem, cssShow, function() {
18412						return getWidthOrHeight( elem, dimension, extra );
18413					} ) :
18414					getWidthOrHeight( elem, dimension, extra );
18415			}
18416		},
18417
18418		set: function( elem, value, extra ) {
18419			var matches,
18420				styles = getStyles( elem ),
18421
18422				// Only read styles.position if the test has a chance to fail
18423				// to avoid forcing a reflow.
18424				scrollboxSizeBuggy = !support.scrollboxSize() &&
18425					styles.position === "absolute",
18426
18427				// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
18428				boxSizingNeeded = scrollboxSizeBuggy || extra,
18429				isBorderBox = boxSizingNeeded &&
18430					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
18431				subtract = extra ?
18432					boxModelAdjustment(
18433						elem,
18434						dimension,
18435						extra,
18436						isBorderBox,
18437						styles
18438					) :
18439					0;
18440
18441			// Account for unreliable border-box dimensions by comparing offset* to computed and
18442			// faking a content-box to get border and padding (gh-3699)
18443			if ( isBorderBox && scrollboxSizeBuggy ) {
18444				subtract -= Math.ceil(
18445					elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
18446					parseFloat( styles[ dimension ] ) -
18447					boxModelAdjustment( elem, dimension, "border", false, styles ) -
18448					0.5
18449				);
18450			}
18451
18452			// Convert to pixels if value adjustment is needed
18453			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
18454				( matches[ 3 ] || "px" ) !== "px" ) {
18455
18456				elem.style[ dimension ] = value;
18457				value = jQuery.css( elem, dimension );
18458			}
18459
18460			return setPositiveNumber( elem, value, subtract );
18461		}
18462	};
18463} );
18464
18465jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
18466	function( elem, computed ) {
18467		if ( computed ) {
18468			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
18469				elem.getBoundingClientRect().left -
18470					swap( elem, { marginLeft: 0 }, function() {
18471						return elem.getBoundingClientRect().left;
18472					} )
18473			) + "px";
18474		}
18475	}
18476);
18477
18478// These hooks are used by animate to expand properties
18479jQuery.each( {
18480	margin: "",
18481	padding: "",
18482	border: "Width"
18483}, function( prefix, suffix ) {
18484	jQuery.cssHooks[ prefix + suffix ] = {
18485		expand: function( value ) {
18486			var i = 0,
18487				expanded = {},
18488
18489				// Assumes a single number if not a string
18490				parts = typeof value === "string" ? value.split( " " ) : [ value ];
18491
18492			for ( ; i < 4; i++ ) {
18493				expanded[ prefix + cssExpand[ i ] + suffix ] =
18494					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
18495			}
18496
18497			return expanded;
18498		}
18499	};
18500
18501	if ( prefix !== "margin" ) {
18502		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
18503	}
18504} );
18505
18506jQuery.fn.extend( {
18507	css: function( name, value ) {
18508		return access( this, function( elem, name, value ) {
18509			var styles, len,
18510				map = {},
18511				i = 0;
18512
18513			if ( Array.isArray( name ) ) {
18514				styles = getStyles( elem );
18515				len = name.length;
18516
18517				for ( ; i < len; i++ ) {
18518					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
18519				}
18520
18521				return map;
18522			}
18523
18524			return value !== undefined ?
18525				jQuery.style( elem, name, value ) :
18526				jQuery.css( elem, name );
18527		}, name, value, arguments.length > 1 );
18528	}
18529} );
18530
18531
18532function Tween( elem, options, prop, end, easing ) {
18533	return new Tween.prototype.init( elem, options, prop, end, easing );
18534}
18535jQuery.Tween = Tween;
18536
18537Tween.prototype = {
18538	constructor: Tween,
18539	init: function( elem, options, prop, end, easing, unit ) {
18540		this.elem = elem;
18541		this.prop = prop;
18542		this.easing = easing || jQuery.easing._default;
18543		this.options = options;
18544		this.start = this.now = this.cur();
18545		this.end = end;
18546		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
18547	},
18548	cur: function() {
18549		var hooks = Tween.propHooks[ this.prop ];
18550
18551		return hooks && hooks.get ?
18552			hooks.get( this ) :
18553			Tween.propHooks._default.get( this );
18554	},
18555	run: function( percent ) {
18556		var eased,
18557			hooks = Tween.propHooks[ this.prop ];
18558
18559		if ( this.options.duration ) {
18560			this.pos = eased = jQuery.easing[ this.easing ](
18561				percent, this.options.duration * percent, 0, 1, this.options.duration
18562			);
18563		} else {
18564			this.pos = eased = percent;
18565		}
18566		this.now = ( this.end - this.start ) * eased + this.start;
18567
18568		if ( this.options.step ) {
18569			this.options.step.call( this.elem, this.now, this );
18570		}
18571
18572		if ( hooks && hooks.set ) {
18573			hooks.set( this );
18574		} else {
18575			Tween.propHooks._default.set( this );
18576		}
18577		return this;
18578	}
18579};
18580
18581Tween.prototype.init.prototype = Tween.prototype;
18582
18583Tween.propHooks = {
18584	_default: {
18585		get: function( tween ) {
18586			var result;
18587
18588			// Use a property on the element directly when it is not a DOM element,
18589			// or when there is no matching style property that exists.
18590			if ( tween.elem.nodeType !== 1 ||
18591				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
18592				return tween.elem[ tween.prop ];
18593			}
18594
18595			// Passing an empty string as a 3rd parameter to .css will automatically
18596			// attempt a parseFloat and fallback to a string if the parse fails.
18597			// Simple values such as "10px" are parsed to Float;
18598			// complex values such as "rotate(1rad)" are returned as-is.
18599			result = jQuery.css( tween.elem, tween.prop, "" );
18600
18601			// Empty strings, null, undefined and "auto" are converted to 0.
18602			return !result || result === "auto" ? 0 : result;
18603		},
18604		set: function( tween ) {
18605
18606			// Use step hook for back compat.
18607			// Use cssHook if its there.
18608			// Use .style if available and use plain properties where available.
18609			if ( jQuery.fx.step[ tween.prop ] ) {
18610				jQuery.fx.step[ tween.prop ]( tween );
18611			} else if ( tween.elem.nodeType === 1 && (
18612				jQuery.cssHooks[ tween.prop ] ||
18613					tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
18614				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
18615			} else {
18616				tween.elem[ tween.prop ] = tween.now;
18617			}
18618		}
18619	}
18620};
18621
18622// Support: IE <=9 only
18623// Panic based approach to setting things on disconnected nodes
18624Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
18625	set: function( tween ) {
18626		if ( tween.elem.nodeType && tween.elem.parentNode ) {
18627			tween.elem[ tween.prop ] = tween.now;
18628		}
18629	}
18630};
18631
18632jQuery.easing = {
18633	linear: function( p ) {
18634		return p;
18635	},
18636	swing: function( p ) {
18637		return 0.5 - Math.cos( p * Math.PI ) / 2;
18638	},
18639	_default: "swing"
18640};
18641
18642jQuery.fx = Tween.prototype.init;
18643
18644// Back compat <1.8 extension point
18645jQuery.fx.step = {};
18646
18647
18648
18649
18650var
18651	fxNow, inProgress,
18652	rfxtypes = /^(?:toggle|show|hide)$/,
18653	rrun = /queueHooks$/;
18654
18655function schedule() {
18656	if ( inProgress ) {
18657		if ( document.hidden === false && window.requestAnimationFrame ) {
18658			window.requestAnimationFrame( schedule );
18659		} else {
18660			window.setTimeout( schedule, jQuery.fx.interval );
18661		}
18662
18663		jQuery.fx.tick();
18664	}
18665}
18666
18667// Animations created synchronously will run synchronously
18668function createFxNow() {
18669	window.setTimeout( function() {
18670		fxNow = undefined;
18671	} );
18672	return ( fxNow = Date.now() );
18673}
18674
18675// Generate parameters to create a standard animation
18676function genFx( type, includeWidth ) {
18677	var which,
18678		i = 0,
18679		attrs = { height: type };
18680
18681	// If we include width, step value is 1 to do all cssExpand values,
18682	// otherwise step value is 2 to skip over Left and Right
18683	includeWidth = includeWidth ? 1 : 0;
18684	for ( ; i < 4; i += 2 - includeWidth ) {
18685		which = cssExpand[ i ];
18686		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
18687	}
18688
18689	if ( includeWidth ) {
18690		attrs.opacity = attrs.width = type;
18691	}
18692
18693	return attrs;
18694}
18695
18696function createTween( value, prop, animation ) {
18697	var tween,
18698		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
18699		index = 0,
18700		length = collection.length;
18701	for ( ; index < length; index++ ) {
18702		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
18703
18704			// We're done with this property
18705			return tween;
18706		}
18707	}
18708}
18709
18710function defaultPrefilter( elem, props, opts ) {
18711	var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
18712		isBox = "width" in props || "height" in props,
18713		anim = this,
18714		orig = {},
18715		style = elem.style,
18716		hidden = elem.nodeType && isHiddenWithinTree( elem ),
18717		dataShow = dataPriv.get( elem, "fxshow" );
18718
18719	// Queue-skipping animations hijack the fx hooks
18720	if ( !opts.queue ) {
18721		hooks = jQuery._queueHooks( elem, "fx" );
18722		if ( hooks.unqueued == null ) {
18723			hooks.unqueued = 0;
18724			oldfire = hooks.empty.fire;
18725			hooks.empty.fire = function() {
18726				if ( !hooks.unqueued ) {
18727					oldfire();
18728				}
18729			};
18730		}
18731		hooks.unqueued++;
18732
18733		anim.always( function() {
18734
18735			// Ensure the complete handler is called before this completes
18736			anim.always( function() {
18737				hooks.unqueued--;
18738				if ( !jQuery.queue( elem, "fx" ).length ) {
18739					hooks.empty.fire();
18740				}
18741			} );
18742		} );
18743	}
18744
18745	// Detect show/hide animations
18746	for ( prop in props ) {
18747		value = props[ prop ];
18748		if ( rfxtypes.test( value ) ) {
18749			delete props[ prop ];
18750			toggle = toggle || value === "toggle";
18751			if ( value === ( hidden ? "hide" : "show" ) ) {
18752
18753				// Pretend to be hidden if this is a "show" and
18754				// there is still data from a stopped show/hide
18755				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
18756					hidden = true;
18757
18758				// Ignore all other no-op show/hide data
18759				} else {
18760					continue;
18761				}
18762			}
18763			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
18764		}
18765	}
18766
18767	// Bail out if this is a no-op like .hide().hide()
18768	propTween = !jQuery.isEmptyObject( props );
18769	if ( !propTween && jQuery.isEmptyObject( orig ) ) {
18770		return;
18771	}
18772
18773	// Restrict "overflow" and "display" styles during box animations
18774	if ( isBox && elem.nodeType === 1 ) {
18775
18776		// Support: IE <=9 - 11, Edge 12 - 15
18777		// Record all 3 overflow attributes because IE does not infer the shorthand
18778		// from identically-valued overflowX and overflowY and Edge just mirrors
18779		// the overflowX value there.
18780		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
18781
18782		// Identify a display type, preferring old show/hide data over the CSS cascade
18783		restoreDisplay = dataShow && dataShow.display;
18784		if ( restoreDisplay == null ) {
18785			restoreDisplay = dataPriv.get( elem, "display" );
18786		}
18787		display = jQuery.css( elem, "display" );
18788		if ( display === "none" ) {
18789			if ( restoreDisplay ) {
18790				display = restoreDisplay;
18791			} else {
18792
18793				// Get nonempty value(s) by temporarily forcing visibility
18794				showHide( [ elem ], true );
18795				restoreDisplay = elem.style.display || restoreDisplay;
18796				display = jQuery.css( elem, "display" );
18797				showHide( [ elem ] );
18798			}
18799		}
18800
18801		// Animate inline elements as inline-block
18802		if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
18803			if ( jQuery.css( elem, "float" ) === "none" ) {
18804
18805				// Restore the original display value at the end of pure show/hide animations
18806				if ( !propTween ) {
18807					anim.done( function() {
18808						style.display = restoreDisplay;
18809					} );
18810					if ( restoreDisplay == null ) {
18811						display = style.display;
18812						restoreDisplay = display === "none" ? "" : display;
18813					}
18814				}
18815				style.display = "inline-block";
18816			}
18817		}
18818	}
18819
18820	if ( opts.overflow ) {
18821		style.overflow = "hidden";
18822		anim.always( function() {
18823			style.overflow = opts.overflow[ 0 ];
18824			style.overflowX = opts.overflow[ 1 ];
18825			style.overflowY = opts.overflow[ 2 ];
18826		} );
18827	}
18828
18829	// Implement show/hide animations
18830	propTween = false;
18831	for ( prop in orig ) {
18832
18833		// General show/hide setup for this element animation
18834		if ( !propTween ) {
18835			if ( dataShow ) {
18836				if ( "hidden" in dataShow ) {
18837					hidden = dataShow.hidden;
18838				}
18839			} else {
18840				dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
18841			}
18842
18843			// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
18844			if ( toggle ) {
18845				dataShow.hidden = !hidden;
18846			}
18847
18848			// Show elements before animating them
18849			if ( hidden ) {
18850				showHide( [ elem ], true );
18851			}
18852
18853			/* eslint-disable no-loop-func */
18854
18855			anim.done( function() {
18856
18857				/* eslint-enable no-loop-func */
18858
18859				// The final step of a "hide" animation is actually hiding the element
18860				if ( !hidden ) {
18861					showHide( [ elem ] );
18862				}
18863				dataPriv.remove( elem, "fxshow" );
18864				for ( prop in orig ) {
18865					jQuery.style( elem, prop, orig[ prop ] );
18866				}
18867			} );
18868		}
18869
18870		// Per-property setup
18871		propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
18872		if ( !( prop in dataShow ) ) {
18873			dataShow[ prop ] = propTween.start;
18874			if ( hidden ) {
18875				propTween.end = propTween.start;
18876				propTween.start = 0;
18877			}
18878		}
18879	}
18880}
18881
18882function propFilter( props, specialEasing ) {
18883	var index, name, easing, value, hooks;
18884
18885	// camelCase, specialEasing and expand cssHook pass
18886	for ( index in props ) {
18887		name = camelCase( index );
18888		easing = specialEasing[ name ];
18889		value = props[ index ];
18890		if ( Array.isArray( value ) ) {
18891			easing = value[ 1 ];
18892			value = props[ index ] = value[ 0 ];
18893		}
18894
18895		if ( index !== name ) {
18896			props[ name ] = value;
18897			delete props[ index ];
18898		}
18899
18900		hooks = jQuery.cssHooks[ name ];
18901		if ( hooks && "expand" in hooks ) {
18902			value = hooks.expand( value );
18903			delete props[ name ];
18904
18905			// Not quite $.extend, this won't overwrite existing keys.
18906			// Reusing 'index' because we have the correct "name"
18907			for ( index in value ) {
18908				if ( !( index in props ) ) {
18909					props[ index ] = value[ index ];
18910					specialEasing[ index ] = easing;
18911				}
18912			}
18913		} else {
18914			specialEasing[ name ] = easing;
18915		}
18916	}
18917}
18918
18919function Animation( elem, properties, options ) {
18920	var result,
18921		stopped,
18922		index = 0,
18923		length = Animation.prefilters.length,
18924		deferred = jQuery.Deferred().always( function() {
18925
18926			// Don't match elem in the :animated selector
18927			delete tick.elem;
18928		} ),
18929		tick = function() {
18930			if ( stopped ) {
18931				return false;
18932			}
18933			var currentTime = fxNow || createFxNow(),
18934				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
18935
18936				// Support: Android 2.3 only
18937				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)
18938				temp = remaining / animation.duration || 0,
18939				percent = 1 - temp,
18940				index = 0,
18941				length = animation.tweens.length;
18942
18943			for ( ; index < length; index++ ) {
18944				animation.tweens[ index ].run( percent );
18945			}
18946
18947			deferred.notifyWith( elem, [ animation, percent, remaining ] );
18948
18949			// If there's more to do, yield
18950			if ( percent < 1 && length ) {
18951				return remaining;
18952			}
18953
18954			// If this was an empty animation, synthesize a final progress notification
18955			if ( !length ) {
18956				deferred.notifyWith( elem, [ animation, 1, 0 ] );
18957			}
18958
18959			// Resolve the animation and report its conclusion
18960			deferred.resolveWith( elem, [ animation ] );
18961			return false;
18962		},
18963		animation = deferred.promise( {
18964			elem: elem,
18965			props: jQuery.extend( {}, properties ),
18966			opts: jQuery.extend( true, {
18967				specialEasing: {},
18968				easing: jQuery.easing._default
18969			}, options ),
18970			originalProperties: properties,
18971			originalOptions: options,
18972			startTime: fxNow || createFxNow(),
18973			duration: options.duration,
18974			tweens: [],
18975			createTween: function( prop, end ) {
18976				var tween = jQuery.Tween( elem, animation.opts, prop, end,
18977					animation.opts.specialEasing[ prop ] || animation.opts.easing );
18978				animation.tweens.push( tween );
18979				return tween;
18980			},
18981			stop: function( gotoEnd ) {
18982				var index = 0,
18983
18984					// If we are going to the end, we want to run all the tweens
18985					// otherwise we skip this part
18986					length = gotoEnd ? animation.tweens.length : 0;
18987				if ( stopped ) {
18988					return this;
18989				}
18990				stopped = true;
18991				for ( ; index < length; index++ ) {
18992					animation.tweens[ index ].run( 1 );
18993				}
18994
18995				// Resolve when we played the last frame; otherwise, reject
18996				if ( gotoEnd ) {
18997					deferred.notifyWith( elem, [ animation, 1, 0 ] );
18998					deferred.resolveWith( elem, [ animation, gotoEnd ] );
18999				} else {
19000					deferred.rejectWith( elem, [ animation, gotoEnd ] );
19001				}
19002				return this;
19003			}
19004		} ),
19005		props = animation.props;
19006
19007	propFilter( props, animation.opts.specialEasing );
19008
19009	for ( ; index < length; index++ ) {
19010		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
19011		if ( result ) {
19012			if ( isFunction( result.stop ) ) {
19013				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
19014					result.stop.bind( result );
19015			}
19016			return result;
19017		}
19018	}
19019
19020	jQuery.map( props, createTween, animation );
19021
19022	if ( isFunction( animation.opts.start ) ) {
19023		animation.opts.start.call( elem, animation );
19024	}
19025
19026	// Attach callbacks from options
19027	animation
19028		.progress( animation.opts.progress )
19029		.done( animation.opts.done, animation.opts.complete )
19030		.fail( animation.opts.fail )
19031		.always( animation.opts.always );
19032
19033	jQuery.fx.timer(
19034		jQuery.extend( tick, {
19035			elem: elem,
19036			anim: animation,
19037			queue: animation.opts.queue
19038		} )
19039	);
19040
19041	return animation;
19042}
19043
19044jQuery.Animation = jQuery.extend( Animation, {
19045
19046	tweeners: {
19047		"*": [ function( prop, value ) {
19048			var tween = this.createTween( prop, value );
19049			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
19050			return tween;
19051		} ]
19052	},
19053
19054	tweener: function( props, callback ) {
19055		if ( isFunction( props ) ) {
19056			callback = props;
19057			props = [ "*" ];
19058		} else {
19059			props = props.match( rnothtmlwhite );
19060		}
19061
19062		var prop,
19063			index = 0,
19064			length = props.length;
19065
19066		for ( ; index < length; index++ ) {
19067			prop = props[ index ];
19068			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
19069			Animation.tweeners[ prop ].unshift( callback );
19070		}
19071	},
19072
19073	prefilters: [ defaultPrefilter ],
19074
19075	prefilter: function( callback, prepend ) {
19076		if ( prepend ) {
19077			Animation.prefilters.unshift( callback );
19078		} else {
19079			Animation.prefilters.push( callback );
19080		}
19081	}
19082} );
19083
19084jQuery.speed = function( speed, easing, fn ) {
19085	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
19086		complete: fn || !fn && easing ||
19087			isFunction( speed ) && speed,
19088		duration: speed,
19089		easing: fn && easing || easing && !isFunction( easing ) && easing
19090	};
19091
19092	// Go to the end state if fx are off
19093	if ( jQuery.fx.off ) {
19094		opt.duration = 0;
19095
19096	} else {
19097		if ( typeof opt.duration !== "number" ) {
19098			if ( opt.duration in jQuery.fx.speeds ) {
19099				opt.duration = jQuery.fx.speeds[ opt.duration ];
19100
19101			} else {
19102				opt.duration = jQuery.fx.speeds._default;
19103			}
19104		}
19105	}
19106
19107	// Normalize opt.queue - true/undefined/null -> "fx"
19108	if ( opt.queue == null || opt.queue === true ) {
19109		opt.queue = "fx";
19110	}
19111
19112	// Queueing
19113	opt.old = opt.complete;
19114
19115	opt.complete = function() {
19116		if ( isFunction( opt.old ) ) {
19117			opt.old.call( this );
19118		}
19119
19120		if ( opt.queue ) {
19121			jQuery.dequeue( this, opt.queue );
19122		}
19123	};
19124
19125	return opt;
19126};
19127
19128jQuery.fn.extend( {
19129	fadeTo: function( speed, to, easing, callback ) {
19130
19131		// Show any hidden elements after setting opacity to 0
19132		return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
19133
19134			// Animate to the value specified
19135			.end().animate( { opacity: to }, speed, easing, callback );
19136	},
19137	animate: function( prop, speed, easing, callback ) {
19138		var empty = jQuery.isEmptyObject( prop ),
19139			optall = jQuery.speed( speed, easing, callback ),
19140			doAnimation = function() {
19141
19142				// Operate on a copy of prop so per-property easing won't be lost
19143				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
19144
19145				// Empty animations, or finishing resolves immediately
19146				if ( empty || dataPriv.get( this, "finish" ) ) {
19147					anim.stop( true );
19148				}
19149			};
19150
19151		doAnimation.finish = doAnimation;
19152
19153		return empty || optall.queue === false ?
19154			this.each( doAnimation ) :
19155			this.queue( optall.queue, doAnimation );
19156	},
19157	stop: function( type, clearQueue, gotoEnd ) {
19158		var stopQueue = function( hooks ) {
19159			var stop = hooks.stop;
19160			delete hooks.stop;
19161			stop( gotoEnd );
19162		};
19163
19164		if ( typeof type !== "string" ) {
19165			gotoEnd = clearQueue;
19166			clearQueue = type;
19167			type = undefined;
19168		}
19169		if ( clearQueue ) {
19170			this.queue( type || "fx", [] );
19171		}
19172
19173		return this.each( function() {
19174			var dequeue = true,
19175				index = type != null && type + "queueHooks",
19176				timers = jQuery.timers,
19177				data = dataPriv.get( this );
19178
19179			if ( index ) {
19180				if ( data[ index ] && data[ index ].stop ) {
19181					stopQueue( data[ index ] );
19182				}
19183			} else {
19184				for ( index in data ) {
19185					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
19186						stopQueue( data[ index ] );
19187					}
19188				}
19189			}
19190
19191			for ( index = timers.length; index--; ) {
19192				if ( timers[ index ].elem === this &&
19193					( type == null || timers[ index ].queue === type ) ) {
19194
19195					timers[ index ].anim.stop( gotoEnd );
19196					dequeue = false;
19197					timers.splice( index, 1 );
19198				}
19199			}
19200
19201			// Start the next in the queue if the last step wasn't forced.
19202			// Timers currently will call their complete callbacks, which
19203			// will dequeue but only if they were gotoEnd.
19204			if ( dequeue || !gotoEnd ) {
19205				jQuery.dequeue( this, type );
19206			}
19207		} );
19208	},
19209	finish: function( type ) {
19210		if ( type !== false ) {
19211			type = type || "fx";
19212		}
19213		return this.each( function() {
19214			var index,
19215				data = dataPriv.get( this ),
19216				queue = data[ type + "queue" ],
19217				hooks = data[ type + "queueHooks" ],
19218				timers = jQuery.timers,
19219				length = queue ? queue.length : 0;
19220
19221			// Enable finishing flag on private data
19222			data.finish = true;
19223
19224			// Empty the queue first
19225			jQuery.queue( this, type, [] );
19226
19227			if ( hooks && hooks.stop ) {
19228				hooks.stop.call( this, true );
19229			}
19230
19231			// Look for any active animations, and finish them
19232			for ( index = timers.length; index--; ) {
19233				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
19234					timers[ index ].anim.stop( true );
19235					timers.splice( index, 1 );
19236				}
19237			}
19238
19239			// Look for any animations in the old queue and finish them
19240			for ( index = 0; index < length; index++ ) {
19241				if ( queue[ index ] && queue[ index ].finish ) {
19242					queue[ index ].finish.call( this );
19243				}
19244			}
19245
19246			// Turn off finishing flag
19247			delete data.finish;
19248		} );
19249	}
19250} );
19251
19252jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
19253	var cssFn = jQuery.fn[ name ];
19254	jQuery.fn[ name ] = function( speed, easing, callback ) {
19255		return speed == null || typeof speed === "boolean" ?
19256			cssFn.apply( this, arguments ) :
19257			this.animate( genFx( name, true ), speed, easing, callback );
19258	};
19259} );
19260
19261// Generate shortcuts for custom animations
19262jQuery.each( {
19263	slideDown: genFx( "show" ),
19264	slideUp: genFx( "hide" ),
19265	slideToggle: genFx( "toggle" ),
19266	fadeIn: { opacity: "show" },
19267	fadeOut: { opacity: "hide" },
19268	fadeToggle: { opacity: "toggle" }
19269}, function( name, props ) {
19270	jQuery.fn[ name ] = function( speed, easing, callback ) {
19271		return this.animate( props, speed, easing, callback );
19272	};
19273} );
19274
19275jQuery.timers = [];
19276jQuery.fx.tick = function() {
19277	var timer,
19278		i = 0,
19279		timers = jQuery.timers;
19280
19281	fxNow = Date.now();
19282
19283	for ( ; i < timers.length; i++ ) {
19284		timer = timers[ i ];
19285
19286		// Run the timer and safely remove it when done (allowing for external removal)
19287		if ( !timer() && timers[ i ] === timer ) {
19288			timers.splice( i--, 1 );
19289		}
19290	}
19291
19292	if ( !timers.length ) {
19293		jQuery.fx.stop();
19294	}
19295	fxNow = undefined;
19296};
19297
19298jQuery.fx.timer = function( timer ) {
19299	jQuery.timers.push( timer );
19300	jQuery.fx.start();
19301};
19302
19303jQuery.fx.interval = 13;
19304jQuery.fx.start = function() {
19305	if ( inProgress ) {
19306		return;
19307	}
19308
19309	inProgress = true;
19310	schedule();
19311};
19312
19313jQuery.fx.stop = function() {
19314	inProgress = null;
19315};
19316
19317jQuery.fx.speeds = {
19318	slow: 600,
19319	fast: 200,
19320
19321	// Default speed
19322	_default: 400
19323};
19324
19325
19326// Based off of the plugin by Clint Helfers, with permission.
19327jQuery.fn.delay = function( time, type ) {
19328	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
19329	type = type || "fx";
19330
19331	return this.queue( type, function( next, hooks ) {
19332		var timeout = window.setTimeout( next, time );
19333		hooks.stop = function() {
19334			window.clearTimeout( timeout );
19335		};
19336	} );
19337};
19338
19339
19340( function() {
19341	var input = document.createElement( "input" ),
19342		select = document.createElement( "select" ),
19343		opt = select.appendChild( document.createElement( "option" ) );
19344
19345	input.type = "checkbox";
19346
19347	// Support: Android <=4.3 only
19348	// Default value for a checkbox should be "on"
19349	support.checkOn = input.value !== "";
19350
19351	// Support: IE <=11 only
19352	// Must access selectedIndex to make default options select
19353	support.optSelected = opt.selected;
19354
19355	// Support: IE <=11 only
19356	// An input loses its value after becoming a radio
19357	input = document.createElement( "input" );
19358	input.value = "t";
19359	input.type = "radio";
19360	support.radioValue = input.value === "t";
19361} )();
19362
19363
19364var boolHook,
19365	attrHandle = jQuery.expr.attrHandle;
19366
19367jQuery.fn.extend( {
19368	attr: function( name, value ) {
19369		return access( this, jQuery.attr, name, value, arguments.length > 1 );
19370	},
19371
19372	removeAttr: function( name ) {
19373		return this.each( function() {
19374			jQuery.removeAttr( this, name );
19375		} );
19376	}
19377} );
19378
19379jQuery.extend( {
19380	attr: function( elem, name, value ) {
19381		var ret, hooks,
19382			nType = elem.nodeType;
19383
19384		// Don't get/set attributes on text, comment and attribute nodes
19385		if ( nType === 3 || nType === 8 || nType === 2 ) {
19386			return;
19387		}
19388
19389		// Fallback to prop when attributes are not supported
19390		if ( typeof elem.getAttribute === "undefined" ) {
19391			return jQuery.prop( elem, name, value );
19392		}
19393
19394		// Attribute hooks are determined by the lowercase version
19395		// Grab necessary hook if one is defined
19396		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
19397			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
19398				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
19399		}
19400
19401		if ( value !== undefined ) {
19402			if ( value === null ) {
19403				jQuery.removeAttr( elem, name );
19404				return;
19405			}
19406
19407			if ( hooks && "set" in hooks &&
19408				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
19409				return ret;
19410			}
19411
19412			elem.setAttribute( name, value + "" );
19413			return value;
19414		}
19415
19416		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
19417			return ret;
19418		}
19419
19420		ret = jQuery.find.attr( elem, name );
19421
19422		// Non-existent attributes return null, we normalize to undefined
19423		return ret == null ? undefined : ret;
19424	},
19425
19426	attrHooks: {
19427		type: {
19428			set: function( elem, value ) {
19429				if ( !support.radioValue && value === "radio" &&
19430					nodeName( elem, "input" ) ) {
19431					var val = elem.value;
19432					elem.setAttribute( "type", value );
19433					if ( val ) {
19434						elem.value = val;
19435					}
19436					return value;
19437				}
19438			}
19439		}
19440	},
19441
19442	removeAttr: function( elem, value ) {
19443		var name,
19444			i = 0,
19445
19446			// Attribute names can contain non-HTML whitespace characters
19447			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
19448			attrNames = value && value.match( rnothtmlwhite );
19449
19450		if ( attrNames && elem.nodeType === 1 ) {
19451			while ( ( name = attrNames[ i++ ] ) ) {
19452				elem.removeAttribute( name );
19453			}
19454		}
19455	}
19456} );
19457
19458// Hooks for boolean attributes
19459boolHook = {
19460	set: function( elem, value, name ) {
19461		if ( value === false ) {
19462
19463			// Remove boolean attributes when set to false
19464			jQuery.removeAttr( elem, name );
19465		} else {
19466			elem.setAttribute( name, name );
19467		}
19468		return name;
19469	}
19470};
19471
19472jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
19473	var getter = attrHandle[ name ] || jQuery.find.attr;
19474
19475	attrHandle[ name ] = function( elem, name, isXML ) {
19476		var ret, handle,
19477			lowercaseName = name.toLowerCase();
19478
19479		if ( !isXML ) {
19480
19481			// Avoid an infinite loop by temporarily removing this function from the getter
19482			handle = attrHandle[ lowercaseName ];
19483			attrHandle[ lowercaseName ] = ret;
19484			ret = getter( elem, name, isXML ) != null ?
19485				lowercaseName :
19486				null;
19487			attrHandle[ lowercaseName ] = handle;
19488		}
19489		return ret;
19490	};
19491} );
19492
19493
19494
19495
19496var rfocusable = /^(?:input|select|textarea|button)$/i,
19497	rclickable = /^(?:a|area)$/i;
19498
19499jQuery.fn.extend( {
19500	prop: function( name, value ) {
19501		return access( this, jQuery.prop, name, value, arguments.length > 1 );
19502	},
19503
19504	removeProp: function( name ) {
19505		return this.each( function() {
19506			delete this[ jQuery.propFix[ name ] || name ];
19507		} );
19508	}
19509} );
19510
19511jQuery.extend( {
19512	prop: function( elem, name, value ) {
19513		var ret, hooks,
19514			nType = elem.nodeType;
19515
19516		// Don't get/set properties on text, comment and attribute nodes
19517		if ( nType === 3 || nType === 8 || nType === 2 ) {
19518			return;
19519		}
19520
19521		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
19522
19523			// Fix name and attach hooks
19524			name = jQuery.propFix[ name ] || name;
19525			hooks = jQuery.propHooks[ name ];
19526		}
19527
19528		if ( value !== undefined ) {
19529			if ( hooks && "set" in hooks &&
19530				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
19531				return ret;
19532			}
19533
19534			return ( elem[ name ] = value );
19535		}
19536
19537		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
19538			return ret;
19539		}
19540
19541		return elem[ name ];
19542	},
19543
19544	propHooks: {
19545		tabIndex: {
19546			get: function( elem ) {
19547
19548				// Support: IE <=9 - 11 only
19549				// elem.tabIndex doesn't always return the
19550				// correct value when it hasn't been explicitly set
19551				// Use proper attribute retrieval (trac-12072)
19552				var tabindex = jQuery.find.attr( elem, "tabindex" );
19553
19554				if ( tabindex ) {
19555					return parseInt( tabindex, 10 );
19556				}
19557
19558				if (
19559					rfocusable.test( elem.nodeName ) ||
19560					rclickable.test( elem.nodeName ) &&
19561					elem.href
19562				) {
19563					return 0;
19564				}
19565
19566				return -1;
19567			}
19568		}
19569	},
19570
19571	propFix: {
19572		"for": "htmlFor",
19573		"class": "className"
19574	}
19575} );
19576
19577// Support: IE <=11 only
19578// Accessing the selectedIndex property
19579// forces the browser to respect setting selected
19580// on the option
19581// The getter ensures a default option is selected
19582// when in an optgroup
19583// eslint rule "no-unused-expressions" is disabled for this code
19584// since it considers such accessions noop
19585if ( !support.optSelected ) {
19586	jQuery.propHooks.selected = {
19587		get: function( elem ) {
19588
19589			/* eslint no-unused-expressions: "off" */
19590
19591			var parent = elem.parentNode;
19592			if ( parent && parent.parentNode ) {
19593				parent.parentNode.selectedIndex;
19594			}
19595			return null;
19596		},
19597		set: function( elem ) {
19598
19599			/* eslint no-unused-expressions: "off" */
19600
19601			var parent = elem.parentNode;
19602			if ( parent ) {
19603				parent.selectedIndex;
19604
19605				if ( parent.parentNode ) {
19606					parent.parentNode.selectedIndex;
19607				}
19608			}
19609		}
19610	};
19611}
19612
19613jQuery.each( [
19614	"tabIndex",
19615	"readOnly",
19616	"maxLength",
19617	"cellSpacing",
19618	"cellPadding",
19619	"rowSpan",
19620	"colSpan",
19621	"useMap",
19622	"frameBorder",
19623	"contentEditable"
19624], function() {
19625	jQuery.propFix[ this.toLowerCase() ] = this;
19626} );
19627
19628
19629
19630
19631	// Strip and collapse whitespace according to HTML spec
19632	// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
19633	function stripAndCollapse( value ) {
19634		var tokens = value.match( rnothtmlwhite ) || [];
19635		return tokens.join( " " );
19636	}
19637
19638
19639function getClass( elem ) {
19640	return elem.getAttribute && elem.getAttribute( "class" ) || "";
19641}
19642
19643function classesToArray( value ) {
19644	if ( Array.isArray( value ) ) {
19645		return value;
19646	}
19647	if ( typeof value === "string" ) {
19648		return value.match( rnothtmlwhite ) || [];
19649	}
19650	return [];
19651}
19652
19653jQuery.fn.extend( {
19654	addClass: function( value ) {
19655		var classNames, cur, curValue, className, i, finalValue;
19656
19657		if ( isFunction( value ) ) {
19658			return this.each( function( j ) {
19659				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
19660			} );
19661		}
19662
19663		classNames = classesToArray( value );
19664
19665		if ( classNames.length ) {
19666			return this.each( function() {
19667				curValue = getClass( this );
19668				cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
19669
19670				if ( cur ) {
19671					for ( i = 0; i < classNames.length; i++ ) {
19672						className = classNames[ i ];
19673						if ( cur.indexOf( " " + className + " " ) < 0 ) {
19674							cur += className + " ";
19675						}
19676					}
19677
19678					// Only assign if different to avoid unneeded rendering.
19679					finalValue = stripAndCollapse( cur );
19680					if ( curValue !== finalValue ) {
19681						this.setAttribute( "class", finalValue );
19682					}
19683				}
19684			} );
19685		}
19686
19687		return this;
19688	},
19689
19690	removeClass: function( value ) {
19691		var classNames, cur, curValue, className, i, finalValue;
19692
19693		if ( isFunction( value ) ) {
19694			return this.each( function( j ) {
19695				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
19696			} );
19697		}
19698
19699		if ( !arguments.length ) {
19700			return this.attr( "class", "" );
19701		}
19702
19703		classNames = classesToArray( value );
19704
19705		if ( classNames.length ) {
19706			return this.each( function() {
19707				curValue = getClass( this );
19708
19709				// This expression is here for better compressibility (see addClass)
19710				cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
19711
19712				if ( cur ) {
19713					for ( i = 0; i < classNames.length; i++ ) {
19714						className = classNames[ i ];
19715
19716						// Remove *all* instances
19717						while ( cur.indexOf( " " + className + " " ) > -1 ) {
19718							cur = cur.replace( " " + className + " ", " " );
19719						}
19720					}
19721
19722					// Only assign if different to avoid unneeded rendering.
19723					finalValue = stripAndCollapse( cur );
19724					if ( curValue !== finalValue ) {
19725						this.setAttribute( "class", finalValue );
19726					}
19727				}
19728			} );
19729		}
19730
19731		return this;
19732	},
19733
19734	toggleClass: function( value, stateVal ) {
19735		var classNames, className, i, self,
19736			type = typeof value,
19737			isValidValue = type === "string" || Array.isArray( value );
19738
19739		if ( isFunction( value ) ) {
19740			return this.each( function( i ) {
19741				jQuery( this ).toggleClass(
19742					value.call( this, i, getClass( this ), stateVal ),
19743					stateVal
19744				);
19745			} );
19746		}
19747
19748		if ( typeof stateVal === "boolean" && isValidValue ) {
19749			return stateVal ? this.addClass( value ) : this.removeClass( value );
19750		}
19751
19752		classNames = classesToArray( value );
19753
19754		return this.each( function() {
19755			if ( isValidValue ) {
19756
19757				// Toggle individual class names
19758				self = jQuery( this );
19759
19760				for ( i = 0; i < classNames.length; i++ ) {
19761					className = classNames[ i ];
19762
19763					// Check each className given, space separated list
19764					if ( self.hasClass( className ) ) {
19765						self.removeClass( className );
19766					} else {
19767						self.addClass( className );
19768					}
19769				}
19770
19771			// Toggle whole class name
19772			} else if ( value === undefined || type === "boolean" ) {
19773				className = getClass( this );
19774				if ( className ) {
19775
19776					// Store className if set
19777					dataPriv.set( this, "__className__", className );
19778				}
19779
19780				// If the element has a class name or if we're passed `false`,
19781				// then remove the whole classname (if there was one, the above saved it).
19782				// Otherwise bring back whatever was previously saved (if anything),
19783				// falling back to the empty string if nothing was stored.
19784				if ( this.setAttribute ) {
19785					this.setAttribute( "class",
19786						className || value === false ?
19787							"" :
19788							dataPriv.get( this, "__className__" ) || ""
19789					);
19790				}
19791			}
19792		} );
19793	},
19794
19795	hasClass: function( selector ) {
19796		var className, elem,
19797			i = 0;
19798
19799		className = " " + selector + " ";
19800		while ( ( elem = this[ i++ ] ) ) {
19801			if ( elem.nodeType === 1 &&
19802				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
19803				return true;
19804			}
19805		}
19806
19807		return false;
19808	}
19809} );
19810
19811
19812
19813
19814var rreturn = /\r/g;
19815
19816jQuery.fn.extend( {
19817	val: function( value ) {
19818		var hooks, ret, valueIsFunction,
19819			elem = this[ 0 ];
19820
19821		if ( !arguments.length ) {
19822			if ( elem ) {
19823				hooks = jQuery.valHooks[ elem.type ] ||
19824					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
19825
19826				if ( hooks &&
19827					"get" in hooks &&
19828					( ret = hooks.get( elem, "value" ) ) !== undefined
19829				) {
19830					return ret;
19831				}
19832
19833				ret = elem.value;
19834
19835				// Handle most common string cases
19836				if ( typeof ret === "string" ) {
19837					return ret.replace( rreturn, "" );
19838				}
19839
19840				// Handle cases where value is null/undef or number
19841				return ret == null ? "" : ret;
19842			}
19843
19844			return;
19845		}
19846
19847		valueIsFunction = isFunction( value );
19848
19849		return this.each( function( i ) {
19850			var val;
19851
19852			if ( this.nodeType !== 1 ) {
19853				return;
19854			}
19855
19856			if ( valueIsFunction ) {
19857				val = value.call( this, i, jQuery( this ).val() );
19858			} else {
19859				val = value;
19860			}
19861
19862			// Treat null/undefined as ""; convert numbers to string
19863			if ( val == null ) {
19864				val = "";
19865
19866			} else if ( typeof val === "number" ) {
19867				val += "";
19868
19869			} else if ( Array.isArray( val ) ) {
19870				val = jQuery.map( val, function( value ) {
19871					return value == null ? "" : value + "";
19872				} );
19873			}
19874
19875			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
19876
19877			// If set returns undefined, fall back to normal setting
19878			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
19879				this.value = val;
19880			}
19881		} );
19882	}
19883} );
19884
19885jQuery.extend( {
19886	valHooks: {
19887		option: {
19888			get: function( elem ) {
19889
19890				var val = jQuery.find.attr( elem, "value" );
19891				return val != null ?
19892					val :
19893
19894					// Support: IE <=10 - 11 only
19895					// option.text throws exceptions (trac-14686, trac-14858)
19896					// Strip and collapse whitespace
19897					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
19898					stripAndCollapse( jQuery.text( elem ) );
19899			}
19900		},
19901		select: {
19902			get: function( elem ) {
19903				var value, option, i,
19904					options = elem.options,
19905					index = elem.selectedIndex,
19906					one = elem.type === "select-one",
19907					values = one ? null : [],
19908					max = one ? index + 1 : options.length;
19909
19910				if ( index < 0 ) {
19911					i = max;
19912
19913				} else {
19914					i = one ? index : 0;
19915				}
19916
19917				// Loop through all the selected options
19918				for ( ; i < max; i++ ) {
19919					option = options[ i ];
19920
19921					// Support: IE <=9 only
19922					// IE8-9 doesn't update selected after form reset (trac-2551)
19923					if ( ( option.selected || i === index ) &&
19924
19925							// Don't return options that are disabled or in a disabled optgroup
19926							!option.disabled &&
19927							( !option.parentNode.disabled ||
19928								!nodeName( option.parentNode, "optgroup" ) ) ) {
19929
19930						// Get the specific value for the option
19931						value = jQuery( option ).val();
19932
19933						// We don't need an array for one selects
19934						if ( one ) {
19935							return value;
19936						}
19937
19938						// Multi-Selects return an array
19939						values.push( value );
19940					}
19941				}
19942
19943				return values;
19944			},
19945
19946			set: function( elem, value ) {
19947				var optionSet, option,
19948					options = elem.options,
19949					values = jQuery.makeArray( value ),
19950					i = options.length;
19951
19952				while ( i-- ) {
19953					option = options[ i ];
19954
19955					/* eslint-disable no-cond-assign */
19956
19957					if ( option.selected =
19958						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
19959					) {
19960						optionSet = true;
19961					}
19962
19963					/* eslint-enable no-cond-assign */
19964				}
19965
19966				// Force browsers to behave consistently when non-matching value is set
19967				if ( !optionSet ) {
19968					elem.selectedIndex = -1;
19969				}
19970				return values;
19971			}
19972		}
19973	}
19974} );
19975
19976// Radios and checkboxes getter/setter
19977jQuery.each( [ "radio", "checkbox" ], function() {
19978	jQuery.valHooks[ this ] = {
19979		set: function( elem, value ) {
19980			if ( Array.isArray( value ) ) {
19981				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
19982			}
19983		}
19984	};
19985	if ( !support.checkOn ) {
19986		jQuery.valHooks[ this ].get = function( elem ) {
19987			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
19988		};
19989	}
19990} );
19991
19992
19993
19994
19995// Return jQuery for attributes-only inclusion
vendor: 1,452 bytes, lines 19996-20043
19996
19997
19998support.focusin = "onfocusin" in window;
19999
20000
20001var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
20002	stopPropagationCallback = function( e ) {
20003		e.stopPropagation();
20004	};
20005
20006jQuery.extend( jQuery.event, {
20007
20008	trigger: function( event, data, elem, onlyHandlers ) {
20009
20010		var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
20011			eventPath = [ elem || document ],
20012			type = hasOwn.call( event, "type" ) ? event.type : event,
20013			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
20014
20015		cur = lastElement = tmp = elem = elem || document;
20016
20017		// Don't do events on text and comment nodes
20018		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
20019			return;
20020		}
20021
20022		// focus/blur morphs to focusin/out; ensure we're not firing them right now
20023		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
20024			return;
20025		}
20026
20027		if ( type.indexOf( "." ) > -1 ) {
20028
20029			// Namespaced trigger; create a regexp to match event type in handle()
20030			namespaces = type.split( "." );
20031			type = namespaces.shift();
20032			namespaces.sort();
20033		}
20034		ontype = type.indexOf( ":" ) < 0 && "on" + type;
20035
20036		// Caller can pass in a jQuery.Event object, Object, or just an event type string
20037		event = event[ jQuery.expando ] ?
20038			event :
20039			new jQuery.Event( type, typeof event === "object" && event );
20040
20041		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
20042		event.isTrigger = onlyHandlers ? 2 : 3;
20043		event.namespace = namespaces.join( "." );
vendor: 4,098 bytes, lines 20044-20192
20044		event.rnamespace = event.namespace ?
20045			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
20046			null;
20047
20048		// Clean up the event in case it is being reused
20049		event.result = undefined;
20050		if ( !event.target ) {
20051			event.target = elem;
20052		}
20053
20054		// Clone any incoming data and prepend the event, creating the handler arg list
20055		data = data == null ?
20056			[ event ] :
20057			jQuery.makeArray( data, [ event ] );
20058
20059		// Allow special events to draw outside the lines
20060		special = jQuery.event.special[ type ] || {};
20061		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
20062			return;
20063		}
20064
20065		// Determine event propagation path in advance, per W3C events spec (trac-9951)
20066		// Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)
20067		if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
20068
20069			bubbleType = special.delegateType || type;
20070			if ( !rfocusMorph.test( bubbleType + type ) ) {
20071				cur = cur.parentNode;
20072			}
20073			for ( ; cur; cur = cur.parentNode ) {
20074				eventPath.push( cur );
20075				tmp = cur;
20076			}
20077
20078			// Only add window if we got to document (e.g., not plain obj or detached DOM)
20079			if ( tmp === ( elem.ownerDocument || document ) ) {
20080				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
20081			}
20082		}
20083
20084		// Fire handlers on the event path
20085		i = 0;
20086		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
20087			lastElement = cur;
20088			event.type = i > 1 ?
20089				bubbleType :
20090				special.bindType || type;
20091
20092			// jQuery handler
20093			handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
20094				dataPriv.get( cur, "handle" );
20095			if ( handle ) {
20096				handle.apply( cur, data );
20097			}
20098
20099			// Native handler
20100			handle = ontype && cur[ ontype ];
20101			if ( handle && handle.apply && acceptData( cur ) ) {
20102				event.result = handle.apply( cur, data );
20103				if ( event.result === false ) {
20104					event.preventDefault();
20105				}
20106			}
20107		}
20108		event.type = type;
20109
20110		// If nobody prevented the default action, do it now
20111		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
20112
20113			if ( ( !special._default ||
20114				special._default.apply( eventPath.pop(), data ) === false ) &&
20115				acceptData( elem ) ) {
20116
20117				// Call a native DOM method on the target with the same name as the event.
20118				// Don't do default actions on window, that's where global variables be (trac-6170)
20119				if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
20120
20121					// Don't re-trigger an onFOO event when we call its FOO() method
20122					tmp = elem[ ontype ];
20123
20124					if ( tmp ) {
20125						elem[ ontype ] = null;
20126					}
20127
20128					// Prevent re-triggering of the same event, since we already bubbled it above
20129					jQuery.event.triggered = type;
20130
20131					if ( event.isPropagationStopped() ) {
20132						lastElement.addEventListener( type, stopPropagationCallback );
20133					}
20134
20135					elem[ type ]();
20136
20137					if ( event.isPropagationStopped() ) {
20138						lastElement.removeEventListener( type, stopPropagationCallback );
20139					}
20140
20141					jQuery.event.triggered = undefined;
20142
20143					if ( tmp ) {
20144						elem[ ontype ] = tmp;
20145					}
20146				}
20147			}
20148		}
20149
20150		return event.result;
20151	},
20152
20153	// Piggyback on a donor event to simulate a different one
20154	// Used only for `focus(in | out)` events
20155	simulate: function( type, elem, event ) {
20156		var e = jQuery.extend(
20157			new jQuery.Event(),
20158			event,
20159			{
20160				type: type,
20161				isSimulated: true
20162			}
20163		);
20164
20165		jQuery.event.trigger( e, null, elem );
20166	}
20167
20168} );
20169
20170jQuery.fn.extend( {
20171
20172	trigger: function( type, data ) {
20173		return this.each( function() {
20174			jQuery.event.trigger( type, data, this );
20175		} );
20176	},
20177	triggerHandler: function( type, data ) {
20178		var elem = this[ 0 ];
20179		if ( elem ) {
20180			return jQuery.event.trigger( type, data, elem, true );
20181		}
20182	}
20183} );
20184
20185
20186// Support: Firefox <=44
20187// Firefox doesn't have focus(in | out) events
20188// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
20189//
20190// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
20191// focus(in | out) events fire after focus & blur events,
20192// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
20193// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
20194if ( !support.focusin ) {
20195	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
20196
20197		// Attach a single capturing handler on the document while someone wants focusin/focusout
20198		var handler = function( event ) {
20199			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
20200		};
20201
20202		jQuery.event.special[ fix ] = {
20203			setup: function() {
20204
20205				// Handle: regular nodes (via `this.ownerDocument`), window
20206				// (via `this.document`) & document (via `this`).
20207				var doc = this.ownerDocument || this.document || this,
20208					attaches = dataPriv.access( doc, fix );
20209
20210				if ( !attaches ) {
20211					doc.addEventListener( orig, handler, true );
20212				}
20213				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
20214			},
20215			teardown: function() {
20216				var doc = this.ownerDocument || this.document || this,
20217					attaches = dataPriv.access( doc, fix ) - 1;
20218
20219				if ( !attaches ) {
20220					doc.removeEventListener( orig, handler, true );
20221					dataPriv.remove( doc, fix );
20222
20223				} else {
20224					dataPriv.access( doc, fix, attaches );
20225				}
20226			}
20227		};
20228	} );
20229}
20230var location = window.location;
20231
20232var nonce = { guid: Date.now() };
20233
20234var rquery = ( /\?/ );
20235
20236
20237
20238// Cross-browser xml parsing
20239jQuery.parseXML = function( data ) {
20240	var xml, parserErrorElem;
20241	if ( !data || typeof data !== "string" ) {
20242		return null;
20243	}
20244
20245	// Support: IE 9 - 11 only
20246	// IE throws on parseFromString with invalid input.
20247	try {
20248		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
20249	} catch ( e ) {}
20250
20251	parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
20252	if ( !xml || parserErrorElem ) {
20253		jQuery.error( "Invalid XML: " + (
20254			parserErrorElem ?
20255				jQuery.map( parserErrorElem.childNodes, function( el ) {
20256					return el.textContent;
20257				} ).join( "\n" ) :
20258				data
20259		) );
20260	}
20261	return xml;
20262}
vendor: 48,509 bytes, lines 20262-22109
20262;
20263
20264
20265var
20266	rbracket = /\[\]$/,
20267	rCRLF = /\r?\n/g,
20268	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
20269	rsubmittable = /^(?:input|select|textarea|keygen)/i;
20270
20271function buildParams( prefix, obj, traditional, add ) {
20272	var name;
20273
20274	if ( Array.isArray( obj ) ) {
20275
20276		// Serialize array item.
20277		jQuery.each( obj, function( i, v ) {
20278			if ( traditional || rbracket.test( prefix ) ) {
20279
20280				// Treat each array item as a scalar.
20281				add( prefix, v );
20282
20283			} else {
20284
20285				// Item is non-scalar (array or object), encode its numeric index.
20286				buildParams(
20287					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
20288					v,
20289					traditional,
20290					add
20291				);
20292			}
20293		} );
20294
20295	} else if ( !traditional && toType( obj ) === "object" ) {
20296
20297		// Serialize object item.
20298		for ( name in obj ) {
20299			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
20300		}
20301
20302	} else {
20303
20304		// Serialize scalar item.
20305		add( prefix, obj );
20306	}
20307}
20308
20309// Serialize an array of form elements or a set of
20310// key/values into a query string
20311jQuery.param = function( a, traditional ) {
20312	var prefix,
20313		s = [],
20314		add = function( key, valueOrFunction ) {
20315
20316			// If value is a function, invoke it and use its return value
20317			var value = isFunction( valueOrFunction ) ?
20318				valueOrFunction() :
20319				valueOrFunction;
20320
20321			s[ s.length ] = encodeURIComponent( key ) + "=" +
20322				encodeURIComponent( value == null ? "" : value );
20323		};
20324
20325	if ( a == null ) {
20326		return "";
20327	}
20328
20329	// If an array was passed in, assume that it is an array of form elements.
20330	if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
20331
20332		// Serialize the form elements
20333		jQuery.each( a, function() {
20334			add( this.name, this.value );
20335		} );
20336
20337	} else {
20338
20339		// If traditional, encode the "old" way (the way 1.3.2 or older
20340		// did it), otherwise encode params recursively.
20341		for ( prefix in a ) {
20342			buildParams( prefix, a[ prefix ], traditional, add );
20343		}
20344	}
20345
20346	// Return the resulting serialization
20347	return s.join( "&" );
20348};
20349
20350jQuery.fn.extend( {
20351	serialize: function() {
20352		return jQuery.param( this.serializeArray() );
20353	},
20354	serializeArray: function() {
20355		return this.map( function() {
20356
20357			// Can add propHook for "elements" to filter or add form elements
20358			var elements = jQuery.prop( this, "elements" );
20359			return elements ? jQuery.makeArray( elements ) : this;
20360		} ).filter( function() {
20361			var type = this.type;
20362
20363			// Use .is( ":disabled" ) so that fieldset[disabled] works
20364			return this.name && !jQuery( this ).is( ":disabled" ) &&
20365				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
20366				( this.checked || !rcheckableType.test( type ) );
20367		} ).map( function( _i, elem ) {
20368			var val = jQuery( this ).val();
20369
20370			if ( val == null ) {
20371				return null;
20372			}
20373
20374			if ( Array.isArray( val ) ) {
20375				return jQuery.map( val, function( val ) {
20376					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
20377				} );
20378			}
20379
20380			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
20381		} ).get();
20382	}
20383} );
20384
20385
20386var
20387	r20 = /%20/g,
20388	rhash = /#.*$/,
20389	rantiCache = /([?&])_=[^&]*/,
20390	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
20391
20392	// trac-7653, trac-8125, trac-8152: local protocol detection
20393	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
20394	rnoContent = /^(?:GET|HEAD)$/,
20395	rprotocol = /^\/\//,
20396
20397	/* Prefilters
20398	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
20399	 * 2) These are called:
20400	 *    - BEFORE asking for a transport
20401	 *    - AFTER param serialization (s.data is a string if s.processData is true)
20402	 * 3) key is the dataType
20403	 * 4) the catchall symbol "*" can be used
20404	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
20405	 */
20406	prefilters = {},
20407
20408	/* Transports bindings
20409	 * 1) key is the dataType
20410	 * 2) the catchall symbol "*" can be used
20411	 * 3) selection will start with transport dataType and THEN go to "*" if needed
20412	 */
20413	transports = {},
20414
20415	// Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression
20416	allTypes = "*/".concat( "*" ),
20417
20418	// Anchor tag for parsing the document origin
20419	originAnchor = document.createElement( "a" );
20420
20421originAnchor.href = location.href;
20422
20423// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
20424function addToPrefiltersOrTransports( structure ) {
20425
20426	// dataTypeExpression is optional and defaults to "*"
20427	return function( dataTypeExpression, func ) {
20428
20429		if ( typeof dataTypeExpression !== "string" ) {
20430			func = dataTypeExpression;
20431			dataTypeExpression = "*";
20432		}
20433
20434		var dataType,
20435			i = 0,
20436			dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
20437
20438		if ( isFunction( func ) ) {
20439
20440			// For each dataType in the dataTypeExpression
20441			while ( ( dataType = dataTypes[ i++ ] ) ) {
20442
20443				// Prepend if requested
20444				if ( dataType[ 0 ] === "+" ) {
20445					dataType = dataType.slice( 1 ) || "*";
20446					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
20447
20448				// Otherwise append
20449				} else {
20450					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
20451				}
20452			}
20453		}
20454	};
20455}
20456
20457// Base inspection function for prefilters and transports
20458function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
20459
20460	var inspected = {},
20461		seekingTransport = ( structure === transports );
20462
20463	function inspect( dataType ) {
20464		var selected;
20465		inspected[ dataType ] = true;
20466		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
20467			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
20468			if ( typeof dataTypeOrTransport === "string" &&
20469				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
20470
20471				options.dataTypes.unshift( dataTypeOrTransport );
20472				inspect( dataTypeOrTransport );
20473				return false;
20474			} else if ( seekingTransport ) {
20475				return !( selected = dataTypeOrTransport );
20476			}
20477		} );
20478		return selected;
20479	}
20480
20481	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
20482}
20483
20484// A special extend for ajax options
20485// that takes "flat" options (not to be deep extended)
20486// Fixes trac-9887
20487function ajaxExtend( target, src ) {
20488	var key, deep,
20489		flatOptions = jQuery.ajaxSettings.flatOptions || {};
20490
20491	for ( key in src ) {
20492		if ( src[ key ] !== undefined ) {
20493			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
20494		}
20495	}
20496	if ( deep ) {
20497		jQuery.extend( true, target, deep );
20498	}
20499
20500	return target;
20501}
20502
20503/* Handles responses to an ajax request:
20504 * - finds the right dataType (mediates between content-type and expected dataType)
20505 * - returns the corresponding response
20506 */
20507function ajaxHandleResponses( s, jqXHR, responses ) {
20508
20509	var ct, type, finalDataType, firstDataType,
20510		contents = s.contents,
20511		dataTypes = s.dataTypes;
20512
20513	// Remove auto dataType and get content-type in the process
20514	while ( dataTypes[ 0 ] === "*" ) {
20515		dataTypes.shift();
20516		if ( ct === undefined ) {
20517			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
20518		}
20519	}
20520
20521	// Check if we're dealing with a known content-type
20522	if ( ct ) {
20523		for ( type in contents ) {
20524			if ( contents[ type ] && contents[ type ].test( ct ) ) {
20525				dataTypes.unshift( type );
20526				break;
20527			}
20528		}
20529	}
20530
20531	// Check to see if we have a response for the expected dataType
20532	if ( dataTypes[ 0 ] in responses ) {
20533		finalDataType = dataTypes[ 0 ];
20534	} else {
20535
20536		// Try convertible dataTypes
20537		for ( type in responses ) {
20538			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
20539				finalDataType = type;
20540				break;
20541			}
20542			if ( !firstDataType ) {
20543				firstDataType = type;
20544			}
20545		}
20546
20547		// Or just use first one
20548		finalDataType = finalDataType || firstDataType;
20549	}
20550
20551	// If we found a dataType
20552	// We add the dataType to the list if needed
20553	// and return the corresponding response
20554	if ( finalDataType ) {
20555		if ( finalDataType !== dataTypes[ 0 ] ) {
20556			dataTypes.unshift( finalDataType );
20557		}
20558		return responses[ finalDataType ];
20559	}
20560}
20561
20562/* Chain conversions given the request and the original response
20563 * Also sets the responseXXX fields on the jqXHR instance
20564 */
20565function ajaxConvert( s, response, jqXHR, isSuccess ) {
20566	var conv2, current, conv, tmp, prev,
20567		converters = {},
20568
20569		// Work with a copy of dataTypes in case we need to modify it for conversion
20570		dataTypes = s.dataTypes.slice();
20571
20572	// Create converters map with lowercased keys
20573	if ( dataTypes[ 1 ] ) {
20574		for ( conv in s.converters ) {
20575			converters[ conv.toLowerCase() ] = s.converters[ conv ];
20576		}
20577	}
20578
20579	current = dataTypes.shift();
20580
20581	// Convert to each sequential dataType
20582	while ( current ) {
20583
20584		if ( s.responseFields[ current ] ) {
20585			jqXHR[ s.responseFields[ current ] ] = response;
20586		}
20587
20588		// Apply the dataFilter if provided
20589		if ( !prev && isSuccess && s.dataFilter ) {
20590			response = s.dataFilter( response, s.dataType );
20591		}
20592
20593		prev = current;
20594		current = dataTypes.shift();
20595
20596		if ( current ) {
20597
20598			// There's only work to do if current dataType is non-auto
20599			if ( current === "*" ) {
20600
20601				current = prev;
20602
20603			// Convert response if prev dataType is non-auto and differs from current
20604			} else if ( prev !== "*" && prev !== current ) {
20605
20606				// Seek a direct converter
20607				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
20608
20609				// If none found, seek a pair
20610				if ( !conv ) {
20611					for ( conv2 in converters ) {
20612
20613						// If conv2 outputs current
20614						tmp = conv2.split( " " );
20615						if ( tmp[ 1 ] === current ) {
20616
20617							// If prev can be converted to accepted input
20618							conv = converters[ prev + " " + tmp[ 0 ] ] ||
20619								converters[ "* " + tmp[ 0 ] ];
20620							if ( conv ) {
20621
20622								// Condense equivalence converters
20623								if ( conv === true ) {
20624									conv = converters[ conv2 ];
20625
20626								// Otherwise, insert the intermediate dataType
20627								} else if ( converters[ conv2 ] !== true ) {
20628									current = tmp[ 0 ];
20629									dataTypes.unshift( tmp[ 1 ] );
20630								}
20631								break;
20632							}
20633						}
20634					}
20635				}
20636
20637				// Apply converter (if not an equivalence)
20638				if ( conv !== true ) {
20639
20640					// Unless errors are allowed to bubble, catch and return them
20641					if ( conv && s.throws ) {
20642						response = conv( response );
20643					} else {
20644						try {
20645							response = conv( response );
20646						} catch ( e ) {
20647							return {
20648								state: "parsererror",
20649								error: conv ? e : "No conversion from " + prev + " to " + current
20650							};
20651						}
20652					}
20653				}
20654			}
20655		}
20656	}
20657
20658	return { state: "success", data: response };
20659}
20660
20661jQuery.extend( {
20662
20663	// Counter for holding the number of active queries
20664	active: 0,
20665
20666	// Last-Modified header cache for next request
20667	lastModified: {},
20668	etag: {},
20669
20670	ajaxSettings: {
20671		url: location.href,
20672		type: "GET",
20673		isLocal: rlocalProtocol.test( location.protocol ),
20674		global: true,
20675		processData: true,
20676		async: true,
20677		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
20678
20679		/*
20680		timeout: 0,
20681		data: null,
20682		dataType: null,
20683		username: null,
20684		password: null,
20685		cache: null,
20686		throws: false,
20687		traditional: false,
20688		headers: {},
20689		*/
20690
20691		accepts: {
20692			"*": allTypes,
20693			text: "text/plain",
20694			html: "text/html",
20695			xml: "application/xml, text/xml",
20696			json: "application/json, text/javascript"
20697		},
20698
20699		contents: {
20700			xml: /\bxml\b/,
20701			html: /\bhtml/,
20702			json: /\bjson\b/
20703		},
20704
20705		responseFields: {
20706			xml: "responseXML",
20707			text: "responseText",
20708			json: "responseJSON"
20709		},
20710
20711		// Data converters
20712		// Keys separate source (or catchall "*") and destination types with a single space
20713		converters: {
20714
20715			// Convert anything to text
20716			"* text": String,
20717
20718			// Text to html (true = no transformation)
20719			"text html": true,
20720
20721			// Evaluate text as a json expression
20722			"text json": JSON.parse,
20723
20724			// Parse text as xml
20725			"text xml": jQuery.parseXML
20726		},
20727
20728		// For options that shouldn't be deep extended:
20729		// you can add your own custom options here if
20730		// and when you create one that shouldn't be
20731		// deep extended (see ajaxExtend)
20732		flatOptions: {
20733			url: true,
20734			context: true
20735		}
20736	},
20737
20738	// Creates a full fledged settings object into target
20739	// with both ajaxSettings and settings fields.
20740	// If target is omitted, writes into ajaxSettings.
20741	ajaxSetup: function( target, settings ) {
20742		return settings ?
20743
20744			// Building a settings object
20745			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
20746
20747			// Extending ajaxSettings
20748			ajaxExtend( jQuery.ajaxSettings, target );
20749	},
20750
20751	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
20752	ajaxTransport: addToPrefiltersOrTransports( transports ),
20753
20754	// Main method
20755	ajax: function( url, options ) {
20756
20757		// If url is an object, simulate pre-1.5 signature
20758		if ( typeof url === "object" ) {
20759			options = url;
20760			url = undefined;
20761		}
20762
20763		// Force options to be an object
20764		options = options || {};
20765
20766		var transport,
20767
20768			// URL without anti-cache param
20769			cacheURL,
20770
20771			// Response headers
20772			responseHeadersString,
20773			responseHeaders,
20774
20775			// timeout handle
20776			timeoutTimer,
20777
20778			// Url cleanup var
20779			urlAnchor,
20780
20781			// Request state (becomes false upon send and true upon completion)
20782			completed,
20783
20784			// To know if global events are to be dispatched
20785			fireGlobals,
20786
20787			// Loop variable
20788			i,
20789
20790			// uncached part of the url
20791			uncached,
20792
20793			// Create the final options object
20794			s = jQuery.ajaxSetup( {}, options ),
20795
20796			// Callbacks context
20797			callbackContext = s.context || s,
20798
20799			// Context for global events is callbackContext if it is a DOM node or jQuery collection
20800			globalEventContext = s.context &&
20801				( callbackContext.nodeType || callbackContext.jquery ) ?
20802				jQuery( callbackContext ) :
20803				jQuery.event,
20804
20805			// Deferreds
20806			deferred = jQuery.Deferred(),
20807			completeDeferred = jQuery.Callbacks( "once memory" ),
20808
20809			// Status-dependent callbacks
20810			statusCode = s.statusCode || {},
20811
20812			// Headers (they are sent all at once)
20813			requestHeaders = {},
20814			requestHeadersNames = {},
20815
20816			// Default abort message
20817			strAbort = "canceled",
20818
20819			// Fake xhr
20820			jqXHR = {
20821				readyState: 0,
20822
20823				// Builds headers hashtable if needed
20824				getResponseHeader: function( key ) {
20825					var match;
20826					if ( completed ) {
20827						if ( !responseHeaders ) {
20828							responseHeaders = {};
20829							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
20830								responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
20831									( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
20832										.concat( match[ 2 ] );
20833							}
20834						}
20835						match = responseHeaders[ key.toLowerCase() + " " ];
20836					}
20837					return match == null ? null : match.join( ", " );
20838				},
20839
20840				// Raw string
20841				getAllResponseHeaders: function() {
20842					return completed ? responseHeadersString : null;
20843				},
20844
20845				// Caches the header
20846				setRequestHeader: function( name, value ) {
20847					if ( completed == null ) {
20848						name = requestHeadersNames[ name.toLowerCase() ] =
20849							requestHeadersNames[ name.toLowerCase() ] || name;
20850						requestHeaders[ name ] = value;
20851					}
20852					return this;
20853				},
20854
20855				// Overrides response content-type header
20856				overrideMimeType: function( type ) {
20857					if ( completed == null ) {
20858						s.mimeType = type;
20859					}
20860					return this;
20861				},
20862
20863				// Status-dependent callbacks
20864				statusCode: function( map ) {
20865					var code;
20866					if ( map ) {
20867						if ( completed ) {
20868
20869							// Execute the appropriate callbacks
20870							jqXHR.always( map[ jqXHR.status ] );
20871						} else {
20872
20873							// Lazy-add the new callbacks in a way that preserves old ones
20874							for ( code in map ) {
20875								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
20876							}
20877						}
20878					}
20879					return this;
20880				},
20881
20882				// Cancel the request
20883				abort: function( statusText ) {
20884					var finalText = statusText || strAbort;
20885					if ( transport ) {
20886						transport.abort( finalText );
20887					}
20888					done( 0, finalText );
20889					return this;
20890				}
20891			};
20892
20893		// Attach deferreds
20894		deferred.promise( jqXHR );
20895
20896		// Add protocol if not provided (prefilters might expect it)
20897		// Handle falsy url in the settings object (trac-10093: consistency with old signature)
20898		// We also use the url parameter if available
20899		s.url = ( ( url || s.url || location.href ) + "" )
20900			.replace( rprotocol, location.protocol + "//" );
20901
20902		// Alias method option to type as per ticket trac-12004
20903		s.type = options.method || options.type || s.method || s.type;
20904
20905		// Extract dataTypes list
20906		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
20907
20908		// A cross-domain request is in order when the origin doesn't match the current origin.
20909		if ( s.crossDomain == null ) {
20910			urlAnchor = document.createElement( "a" );
20911
20912			// Support: IE <=8 - 11, Edge 12 - 15
20913			// IE throws exception on accessing the href property if url is malformed,
20914			// e.g. http://example.com:80x/
20915			try {
20916				urlAnchor.href = s.url;
20917
20918				// Support: IE <=8 - 11 only
20919				// Anchor's host property isn't correctly set when s.url is relative
20920				urlAnchor.href = urlAnchor.href;
20921				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
20922					urlAnchor.protocol + "//" + urlAnchor.host;
20923			} catch ( e ) {
20924
20925				// If there is an error parsing the URL, assume it is crossDomain,
20926				// it can be rejected by the transport if it is invalid
20927				s.crossDomain = true;
20928			}
20929		}
20930
20931		// Convert data if not already a string
20932		if ( s.data && s.processData && typeof s.data !== "string" ) {
20933			s.data = jQuery.param( s.data, s.traditional );
20934		}
20935
20936		// Apply prefilters
20937		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
20938
20939		// If request was aborted inside a prefilter, stop there
20940		if ( completed ) {
20941			return jqXHR;
20942		}
20943
20944		// We can fire global events as of now if asked to
20945		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)
20946		fireGlobals = jQuery.event && s.global;
20947
20948		// Watch for a new set of requests
20949		if ( fireGlobals && jQuery.active++ === 0 ) {
20950			jQuery.event.trigger( "ajaxStart" );
20951		}
20952
20953		// Uppercase the type
20954		s.type = s.type.toUpperCase();
20955
20956		// Determine if request has content
20957		s.hasContent = !rnoContent.test( s.type );
20958
20959		// Save the URL in case we're toying with the If-Modified-Since
20960		// and/or If-None-Match header later on
20961		// Remove hash to simplify url manipulation
20962		cacheURL = s.url.replace( rhash, "" );
20963
20964		// More options handling for requests with no content
20965		if ( !s.hasContent ) {
20966
20967			// Remember the hash so we can put it back
20968			uncached = s.url.slice( cacheURL.length );
20969
20970			// If data is available and should be processed, append data to url
20971			if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
20972				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
20973
20974				// trac-9682: remove data so that it's not used in an eventual retry
20975				delete s.data;
20976			}
20977
20978			// Add or update anti-cache param if needed
20979			if ( s.cache === false ) {
20980				cacheURL = cacheURL.replace( rantiCache, "$1" );
20981				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
20982					uncached;
20983			}
20984
20985			// Put hash and anti-cache on the URL that will be requested (gh-1732)
20986			s.url = cacheURL + uncached;
20987
20988		// Change '%20' to '+' if this is encoded form body content (gh-2658)
20989		} else if ( s.data && s.processData &&
20990			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
20991			s.data = s.data.replace( r20, "+" );
20992		}
20993
20994		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
20995		if ( s.ifModified ) {
20996			if ( jQuery.lastModified[ cacheURL ] ) {
20997				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
20998			}
20999			if ( jQuery.etag[ cacheURL ] ) {
21000				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
21001			}
21002		}
21003
21004		// Set the correct header, if data is being sent
21005		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
21006			jqXHR.setRequestHeader( "Content-Type", s.contentType );
21007		}
21008
21009		// Set the Accepts header for the server, depending on the dataType
21010		jqXHR.setRequestHeader(
21011			"Accept",
21012			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
21013				s.accepts[ s.dataTypes[ 0 ] ] +
21014					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
21015				s.accepts[ "*" ]
21016		);
21017
21018		// Check for headers option
21019		for ( i in s.headers ) {
21020			jqXHR.setRequestHeader( i, s.headers[ i ] );
21021		}
21022
21023		// Allow custom headers/mimetypes and early abort
21024		if ( s.beforeSend &&
21025			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
21026
21027			// Abort if not done already and return
21028			return jqXHR.abort();
21029		}
21030
21031		// Aborting is no longer a cancellation
21032		strAbort = "abort";
21033
21034		// Install callbacks on deferreds
21035		completeDeferred.add( s.complete );
21036		jqXHR.done( s.success );
21037		jqXHR.fail( s.error );
21038
21039		// Get transport
21040		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
21041
21042		// If no transport, we auto-abort
21043		if ( !transport ) {
21044			done( -1, "No Transport" );
21045		} else {
21046			jqXHR.readyState = 1;
21047
21048			// Send global event
21049			if ( fireGlobals ) {
21050				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
21051			}
21052
21053			// If request was aborted inside ajaxSend, stop there
21054			if ( completed ) {
21055				return jqXHR;
21056			}
21057
21058			// Timeout
21059			if ( s.async && s.timeout > 0 ) {
21060				timeoutTimer = window.setTimeout( function() {
21061					jqXHR.abort( "timeout" );
21062				}, s.timeout );
21063			}
21064
21065			try {
21066				completed = false;
21067				transport.send( requestHeaders, done );
21068			} catch ( e ) {
21069
21070				// Rethrow post-completion exceptions
21071				if ( completed ) {
21072					throw e;
21073				}
21074
21075				// Propagate others as results
21076				done( -1, e );
21077			}
21078		}
21079
21080		// Callback for when everything is done
21081		function done( status, nativeStatusText, responses, headers ) {
21082			var isSuccess, success, error, response, modified,
21083				statusText = nativeStatusText;
21084
21085			// Ignore repeat invocations
21086			if ( completed ) {
21087				return;
21088			}
21089
21090			completed = true;
21091
21092			// Clear timeout if it exists
21093			if ( timeoutTimer ) {
21094				window.clearTimeout( timeoutTimer );
21095			}
21096
21097			// Dereference transport for early garbage collection
21098			// (no matter how long the jqXHR object will be used)
21099			transport = undefined;
21100
21101			// Cache response headers
21102			responseHeadersString = headers || "";
21103
21104			// Set readyState
21105			jqXHR.readyState = status > 0 ? 4 : 0;
21106
21107			// Determine if successful
21108			isSuccess = status >= 200 && status < 300 || status === 304;
21109
21110			// Get response data
21111			if ( responses ) {
21112				response = ajaxHandleResponses( s, jqXHR, responses );
21113			}
21114
21115			// Use a noop converter for missing script but not if jsonp
21116			if ( !isSuccess &&
21117				jQuery.inArray( "script", s.dataTypes ) > -1 &&
21118				jQuery.inArray( "json", s.dataTypes ) < 0 ) {
21119				s.converters[ "text script" ] = function() {};
21120			}
21121
21122			// Convert no matter what (that way responseXXX fields are always set)
21123			response = ajaxConvert( s, response, jqXHR, isSuccess );
21124
21125			// If successful, handle type chaining
21126			if ( isSuccess ) {
21127
21128				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
21129				if ( s.ifModified ) {
21130					modified = jqXHR.getResponseHeader( "Last-Modified" );
21131					if ( modified ) {
21132						jQuery.lastModified[ cacheURL ] = modified;
21133					}
21134					modified = jqXHR.getResponseHeader( "etag" );
21135					if ( modified ) {
21136						jQuery.etag[ cacheURL ] = modified;
21137					}
21138				}
21139
21140				// if no content
21141				if ( status === 204 || s.type === "HEAD" ) {
21142					statusText = "nocontent";
21143
21144				// if not modified
21145				} else if ( status === 304 ) {
21146					statusText = "notmodified";
21147
21148				// If we have data, let's convert it
21149				} else {
21150					statusText = response.state;
21151					success = response.data;
21152					error = response.error;
21153					isSuccess = !error;
21154				}
21155			} else {
21156
21157				// Extract error from statusText and normalize for non-aborts
21158				error = statusText;
21159				if ( status || !statusText ) {
21160					statusText = "error";
21161					if ( status < 0 ) {
21162						status = 0;
21163					}
21164				}
21165			}
21166
21167			// Set data for the fake xhr object
21168			jqXHR.status = status;
21169			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
21170
21171			// Success/Error
21172			if ( isSuccess ) {
21173				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
21174			} else {
21175				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
21176			}
21177
21178			// Status-dependent callbacks
21179			jqXHR.statusCode( statusCode );
21180			statusCode = undefined;
21181
21182			if ( fireGlobals ) {
21183				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
21184					[ jqXHR, s, isSuccess ? success : error ] );
21185			}
21186
21187			// Complete
21188			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
21189
21190			if ( fireGlobals ) {
21191				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
21192
21193				// Handle the global AJAX counter
21194				if ( !( --jQuery.active ) ) {
21195					jQuery.event.trigger( "ajaxStop" );
21196				}
21197			}
21198		}
21199
21200		return jqXHR;
21201	},
21202
21203	getJSON: function( url, data, callback ) {
21204		return jQuery.get( url, data, callback, "json" );
21205	},
21206
21207	getScript: function( url, callback ) {
21208		return jQuery.get( url, undefined, callback, "script" );
21209	}
21210} );
21211
21212jQuery.each( [ "get", "post" ], function( _i, method ) {
21213	jQuery[ method ] = function( url, data, callback, type ) {
21214
21215		// Shift arguments if data argument was omitted
21216		if ( isFunction( data ) ) {
21217			type = type || callback;
21218			callback = data;
21219			data = undefined;
21220		}
21221
21222		// The url can be an options object (which then must have .url)
21223		return jQuery.ajax( jQuery.extend( {
21224			url: url,
21225			type: method,
21226			dataType: type,
21227			data: data,
21228			success: callback
21229		}, jQuery.isPlainObject( url ) && url ) );
21230	};
21231} );
21232
21233jQuery.ajaxPrefilter( function( s ) {
21234	var i;
21235	for ( i in s.headers ) {
21236		if ( i.toLowerCase() === "content-type" ) {
21237			s.contentType = s.headers[ i ] || "";
21238		}
21239	}
21240} );
21241
21242
21243jQuery._evalUrl = function( url, options, doc ) {
21244	return jQuery.ajax( {
21245		url: url,
21246
21247		// Make this explicit, since user can override this through ajaxSetup (trac-11264)
21248		type: "GET",
21249		dataType: "script",
21250		cache: true,
21251		async: false,
21252		global: false,
21253
21254		// Only evaluate the response if it is successful (gh-4126)
21255		// dataFilter is not invoked for failure responses, so using it instead
21256		// of the default converter is kludgy but it works.
21257		converters: {
21258			"text script": function() {}
21259		},
21260		dataFilter: function( response ) {
21261			jQuery.globalEval( response, options, doc );
21262		}
21263	} );
21264};
21265
21266
21267jQuery.fn.extend( {
21268	wrapAll: function( html ) {
21269		var wrap;
21270
21271		if ( this[ 0 ] ) {
21272			if ( isFunction( html ) ) {
21273				html = html.call( this[ 0 ] );
21274			}
21275
21276			// The elements to wrap the target around
21277			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
21278
21279			if ( this[ 0 ].parentNode ) {
21280				wrap.insertBefore( this[ 0 ] );
21281			}
21282
21283			wrap.map( function() {
21284				var elem = this;
21285
21286				while ( elem.firstElementChild ) {
21287					elem = elem.firstElementChild;
21288				}
21289
21290				return elem;
21291			} ).append( this );
21292		}
21293
21294		return this;
21295	},
21296
21297	wrapInner: function( html ) {
21298		if ( isFunction( html ) ) {
21299			return this.each( function( i ) {
21300				jQuery( this ).wrapInner( html.call( this, i ) );
21301			} );
21302		}
21303
21304		return this.each( function() {
21305			var self = jQuery( this ),
21306				contents = self.contents();
21307
21308			if ( contents.length ) {
21309				contents.wrapAll( html );
21310
21311			} else {
21312				self.append( html );
21313			}
21314		} );
21315	},
21316
21317	wrap: function( html ) {
21318		var htmlIsFunction = isFunction( html );
21319
21320		return this.each( function( i ) {
21321			jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
21322		} );
21323	},
21324
21325	unwrap: function( selector ) {
21326		this.parent( selector ).not( "body" ).each( function() {
21327			jQuery( this ).replaceWith( this.childNodes );
21328		} );
21329		return this;
21330	}
21331} );
21332
21333
21334jQuery.expr.pseudos.hidden = function( elem ) {
21335	return !jQuery.expr.pseudos.visible( elem );
21336};
21337jQuery.expr.pseudos.visible = function( elem ) {
21338	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
21339};
21340
21341
21342
21343
21344jQuery.ajaxSettings.xhr = function() {
21345	try {
21346		return new window.XMLHttpRequest();
21347	} catch ( e ) {}
21348};
21349
21350var xhrSuccessStatus = {
21351
21352		// File protocol always yields status code 0, assume 200
21353		0: 200,
21354
21355		// Support: IE <=9 only
21356		// trac-1450: sometimes IE returns 1223 when it should be 204
21357		1223: 204
21358	},
21359	xhrSupported = jQuery.ajaxSettings.xhr();
21360
21361support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
21362support.ajax = xhrSupported = !!xhrSupported;
21363
21364jQuery.ajaxTransport( function( options ) {
21365	var callback, errorCallback;
21366
21367	// Cross domain only allowed if supported through XMLHttpRequest
21368	if ( support.cors || xhrSupported && !options.crossDomain ) {
21369		return {
21370			send: function( headers, complete ) {
21371				var i,
21372					xhr = options.xhr();
21373
21374				xhr.open(
21375					options.type,
21376					options.url,
21377					options.async,
21378					options.username,
21379					options.password
21380				);
21381
21382				// Apply custom fields if provided
21383				if ( options.xhrFields ) {
21384					for ( i in options.xhrFields ) {
21385						xhr[ i ] = options.xhrFields[ i ];
21386					}
21387				}
21388
21389				// Override mime type if needed
21390				if ( options.mimeType && xhr.overrideMimeType ) {
21391					xhr.overrideMimeType( options.mimeType );
21392				}
21393
21394				// X-Requested-With header
21395				// For cross-domain requests, seeing as conditions for a preflight are
21396				// akin to a jigsaw puzzle, we simply never set it to be sure.
21397				// (it can always be set on a per-request basis or even using ajaxSetup)
21398				// For same-domain requests, won't change header if already provided.
21399				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
21400					headers[ "X-Requested-With" ] = "XMLHttpRequest";
21401				}
21402
21403				// Set headers
21404				for ( i in headers ) {
21405					xhr.setRequestHeader( i, headers[ i ] );
21406				}
21407
21408				// Callback
21409				callback = function( type ) {
21410					return function() {
21411						if ( callback ) {
21412							callback = errorCallback = xhr.onload =
21413								xhr.onerror = xhr.onabort = xhr.ontimeout =
21414									xhr.onreadystatechange = null;
21415
21416							if ( type === "abort" ) {
21417								xhr.abort();
21418							} else if ( type === "error" ) {
21419
21420								// Support: IE <=9 only
21421								// On a manual native abort, IE9 throws
21422								// errors on any property access that is not readyState
21423								if ( typeof xhr.status !== "number" ) {
21424									complete( 0, "error" );
21425								} else {
21426									complete(
21427
21428										// File: protocol always yields status 0; see trac-8605, trac-14207
21429										xhr.status,
21430										xhr.statusText
21431									);
21432								}
21433							} else {
21434								complete(
21435									xhrSuccessStatus[ xhr.status ] || xhr.status,
21436									xhr.statusText,
21437
21438									// Support: IE <=9 only
21439									// IE9 has no XHR2 but throws on binary (trac-11426)
21440									// For XHR2 non-text, let the caller handle it (gh-2498)
21441									( xhr.responseType || "text" ) !== "text"  ||
21442									typeof xhr.responseText !== "string" ?
21443										{ binary: xhr.response } :
21444										{ text: xhr.responseText },
21445									xhr.getAllResponseHeaders()
21446								);
21447							}
21448						}
21449					};
21450				};
21451
21452				// Listen to events
21453				xhr.onload = callback();
21454				errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
21455
21456				// Support: IE 9 only
21457				// Use onreadystatechange to replace onabort
21458				// to handle uncaught aborts
21459				if ( xhr.onabort !== undefined ) {
21460					xhr.onabort = errorCallback;
21461				} else {
21462					xhr.onreadystatechange = function() {
21463
21464						// Check readyState before timeout as it changes
21465						if ( xhr.readyState === 4 ) {
21466
21467							// Allow onerror to be called first,
21468							// but that will not handle a native abort
21469							// Also, save errorCallback to a variable
21470							// as xhr.onerror cannot be accessed
21471							window.setTimeout( function() {
21472								if ( callback ) {
21473									errorCallback();
21474								}
21475							} );
21476						}
21477					};
21478				}
21479
21480				// Create the abort callback
21481				callback = callback( "abort" );
21482
21483				try {
21484
21485					// Do send the request (this may raise an exception)
21486					xhr.send( options.hasContent && options.data || null );
21487				} catch ( e ) {
21488
21489					// trac-14683: Only rethrow if this hasn't been notified as an error yet
21490					if ( callback ) {
21491						throw e;
21492					}
21493				}
21494			},
21495
21496			abort: function() {
21497				if ( callback ) {
21498					callback();
21499				}
21500			}
21501		};
21502	}
21503} );
21504
21505
21506
21507
21508// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
21509jQuery.ajaxPrefilter( function( s ) {
21510	if ( s.crossDomain ) {
21511		s.contents.script = false;
21512	}
21513} );
21514
21515// Install script dataType
21516jQuery.ajaxSetup( {
21517	accepts: {
21518		script: "text/javascript, application/javascript, " +
21519			"application/ecmascript, application/x-ecmascript"
21520	},
21521	contents: {
21522		script: /\b(?:java|ecma)script\b/
21523	},
21524	converters: {
21525		"text script": function( text ) {
21526			jQuery.globalEval( text );
21527			return text;
21528		}
21529	}
21530} );
21531
21532// Handle cache's special case and crossDomain
21533jQuery.ajaxPrefilter( "script", function( s ) {
21534	if ( s.cache === undefined ) {
21535		s.cache = false;
21536	}
21537	if ( s.crossDomain ) {
21538		s.type = "GET";
21539	}
21540} );
21541
21542// Bind script tag hack transport
21543jQuery.ajaxTransport( "script", function( s ) {
21544
21545	// This transport only deals with cross domain or forced-by-attrs requests
21546	if ( s.crossDomain || s.scriptAttrs ) {
21547		var script, callback;
21548		return {
21549			send: function( _, complete ) {
21550				script = jQuery( "<script>" )
21551					.attr( s.scriptAttrs || {} )
21552					.prop( { charset: s.scriptCharset, src: s.url } )
21553					.on( "load error", callback = function( evt ) {
21554						script.remove();
21555						callback = null;
21556						if ( evt ) {
21557							complete( evt.type === "error" ? 404 : 200, evt.type );
21558						}
21559					} );
21560
21561				// Use native DOM manipulation to avoid our domManip AJAX trickery
21562				document.head.appendChild( script[ 0 ] );
21563			},
21564			abort: function() {
21565				if ( callback ) {
21566					callback();
21567				}
21568			}
21569		};
21570	}
21571} );
21572
21573
21574
21575
21576var oldCallbacks = [],
21577	rjsonp = /(=)\?(?=&|$)|\?\?/;
21578
21579// Default jsonp settings
21580jQuery.ajaxSetup( {
21581	jsonp: "callback",
21582	jsonpCallback: function() {
21583		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
21584		this[ callback ] = true;
21585		return callback;
21586	}
21587} );
21588
21589// Detect, normalize options and install callbacks for jsonp requests
21590jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
21591
21592	var callbackName, overwritten, responseContainer,
21593		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
21594			"url" :
21595			typeof s.data === "string" &&
21596				( s.contentType || "" )
21597					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
21598				rjsonp.test( s.data ) && "data"
21599		);
21600
21601	// Handle iff the expected data type is "jsonp" or we have a parameter to set
21602	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
21603
21604		// Get callback name, remembering preexisting value associated with it
21605		callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
21606			s.jsonpCallback() :
21607			s.jsonpCallback;
21608
21609		// Insert callback into url or form data
21610		if ( jsonProp ) {
21611			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
21612		} else if ( s.jsonp !== false ) {
21613			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
21614		}
21615
21616		// Use data converter to retrieve json after script execution
21617		s.converters[ "script json" ] = function() {
21618			if ( !responseContainer ) {
21619				jQuery.error( callbackName + " was not called" );
21620			}
21621			return responseContainer[ 0 ];
21622		};
21623
21624		// Force json dataType
21625		s.dataTypes[ 0 ] = "json";
21626
21627		// Install callback
21628		overwritten = window[ callbackName ];
21629		window[ callbackName ] = function() {
21630			responseContainer = arguments;
21631		};
21632
21633		// Clean-up function (fires after converters)
21634		jqXHR.always( function() {
21635
21636			// If previous value didn't exist - remove it
21637			if ( overwritten === undefined ) {
21638				jQuery( window ).removeProp( callbackName );
21639
21640			// Otherwise restore preexisting value
21641			} else {
21642				window[ callbackName ] = overwritten;
21643			}
21644
21645			// Save back as free
21646			if ( s[ callbackName ] ) {
21647
21648				// Make sure that re-using the options doesn't screw things around
21649				s.jsonpCallback = originalSettings.jsonpCallback;
21650
21651				// Save the callback name for future use
21652				oldCallbacks.push( callbackName );
21653			}
21654
21655			// Call if it was a function and we have a response
21656			if ( responseContainer && isFunction( overwritten ) ) {
21657				overwritten( responseContainer[ 0 ] );
21658			}
21659
21660			responseContainer = overwritten = undefined;
21661		} );
21662
21663		// Delegate to script
21664		return "script";
21665	}
21666} );
21667
21668
21669
21670
21671// Support: Safari 8 only
21672// In Safari 8 documents created via document.implementation.createHTMLDocument
21673// collapse sibling forms: the second one becomes a child of the first one.
21674// Because of that, this security measure has to be disabled in Safari 8.
21675// https://bugs.webkit.org/show_bug.cgi?id=137337
21676support.createHTMLDocument = ( function() {
21677	var body = document.implementation.createHTMLDocument( "" ).body;
21678	body.innerHTML = "<form></form><form></form>";
21679	return body.childNodes.length === 2;
21680} )();
21681
21682
21683// Argument "data" should be string of html
21684// context (optional): If specified, the fragment will be created in this context,
21685// defaults to document
21686// keepScripts (optional): If true, will include scripts passed in the html string
21687jQuery.parseHTML = function( data, context, keepScripts ) {
21688	if ( typeof data !== "string" ) {
21689		return [];
21690	}
21691	if ( typeof context === "boolean" ) {
21692		keepScripts = context;
21693		context = false;
21694	}
21695
21696	var base, parsed, scripts;
21697
21698	if ( !context ) {
21699
21700		// Stop scripts or inline event handlers from being executed immediately
21701		// by using document.implementation
21702		if ( support.createHTMLDocument ) {
21703			context = document.implementation.createHTMLDocument( "" );
21704
21705			// Set the base href for the created document
21706			// so any parsed elements with URLs
21707			// are based on the document's URL (gh-2965)
21708			base = context.createElement( "base" );
21709			base.href = document.location.href;
21710			context.head.appendChild( base );
21711		} else {
21712			context = document;
21713		}
21714	}
21715
21716	parsed = rsingleTag.exec( data );
21717	scripts = !keepScripts && [];
21718
21719	// Single tag
21720	if ( parsed ) {
21721		return [ context.createElement( parsed[ 1 ] ) ];
21722	}
21723
21724	parsed = buildFragment( [ data ], context, scripts );
21725
21726	if ( scripts && scripts.length ) {
21727		jQuery( scripts ).remove();
21728	}
21729
21730	return jQuery.merge( [], parsed.childNodes );
21731};
21732
21733
21734/**
21735 * Load a url into a page
21736 */
21737jQuery.fn.load = function( url, params, callback ) {
21738	var selector, type, response,
21739		self = this,
21740		off = url.indexOf( " " );
21741
21742	if ( off > -1 ) {
21743		selector = stripAndCollapse( url.slice( off ) );
21744		url = url.slice( 0, off );
21745	}
21746
21747	// If it's a function
21748	if ( isFunction( params ) ) {
21749
21750		// We assume that it's the callback
21751		callback = params;
21752		params = undefined;
21753
21754	// Otherwise, build a param string
21755	} else if ( params && typeof params === "object" ) {
21756		type = "POST";
21757	}
21758
21759	// If we have elements to modify, make the request
21760	if ( self.length > 0 ) {
21761		jQuery.ajax( {
21762			url: url,
21763
21764			// If "type" variable is undefined, then "GET" method will be used.
21765			// Make value of this field explicit since
21766			// user can override it through ajaxSetup method
21767			type: type || "GET",
21768			dataType: "html",
21769			data: params
21770		} ).done( function( responseText ) {
21771
21772			// Save response for use in complete callback
21773			response = arguments;
21774
21775			self.html( selector ?
21776
21777				// If a selector was specified, locate the right elements in a dummy div
21778				// Exclude scripts to avoid IE 'Permission Denied' errors
21779				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
21780
21781				// Otherwise use the full result
21782				responseText );
21783
21784		// If the request succeeds, this function gets "data", "status", "jqXHR"
21785		// but they are ignored because response was set above.
21786		// If it fails, this function gets "jqXHR", "status", "error"
21787		} ).always( callback && function( jqXHR, status ) {
21788			self.each( function() {
21789				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
21790			} );
21791		} );
21792	}
21793
21794	return this;
21795};
21796
21797
21798
21799
21800jQuery.expr.pseudos.animated = function( elem ) {
21801	return jQuery.grep( jQuery.timers, function( fn ) {
21802		return elem === fn.elem;
21803	} ).length;
21804};
21805
21806
21807
21808
21809jQuery.offset = {
21810	setOffset: function( elem, options, i ) {
21811		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
21812			position = jQuery.css( elem, "position" ),
21813			curElem = jQuery( elem ),
21814			props = {};
21815
21816		// Set position first, in-case top/left are set even on static elem
21817		if ( position === "static" ) {
21818			elem.style.position = "relative";
21819		}
21820
21821		curOffset = curElem.offset();
21822		curCSSTop = jQuery.css( elem, "top" );
21823		curCSSLeft = jQuery.css( elem, "left" );
21824		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
21825			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
21826
21827		// Need to be able to calculate position if either
21828		// top or left is auto and position is either absolute or fixed
21829		if ( calculatePosition ) {
21830			curPosition = curElem.position();
21831			curTop = curPosition.top;
21832			curLeft = curPosition.left;
21833
21834		} else {
21835			curTop = parseFloat( curCSSTop ) || 0;
21836			curLeft = parseFloat( curCSSLeft ) || 0;
21837		}
21838
21839		if ( isFunction( options ) ) {
21840
21841			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
21842			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
21843		}
21844
21845		if ( options.top != null ) {
21846			props.top = ( options.top - curOffset.top ) + curTop;
21847		}
21848		if ( options.left != null ) {
21849			props.left = ( options.left - curOffset.left ) + curLeft;
21850		}
21851
21852		if ( "using" in options ) {
21853			options.using.call( elem, props );
21854
21855		} else {
21856			curElem.css( props );
21857		}
21858	}
21859};
21860
21861jQuery.fn.extend( {
21862
21863	// offset() relates an element's border box to the document origin
21864	offset: function( options ) {
21865
21866		// Preserve chaining for setter
21867		if ( arguments.length ) {
21868			return options === undefined ?
21869				this :
21870				this.each( function( i ) {
21871					jQuery.offset.setOffset( this, options, i );
21872				} );
21873		}
21874
21875		var rect, win,
21876			elem = this[ 0 ];
21877
21878		if ( !elem ) {
21879			return;
21880		}
21881
21882		// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
21883		// Support: IE <=11 only
21884		// Running getBoundingClientRect on a
21885		// disconnected node in IE throws an error
21886		if ( !elem.getClientRects().length ) {
21887			return { top: 0, left: 0 };
21888		}
21889
21890		// Get document-relative position by adding viewport scroll to viewport-relative gBCR
21891		rect = elem.getBoundingClientRect();
21892		win = elem.ownerDocument.defaultView;
21893		return {
21894			top: rect.top + win.pageYOffset,
21895			left: rect.left + win.pageXOffset
21896		};
21897	},
21898
21899	// position() relates an element's margin box to its offset parent's padding box
21900	// This corresponds to the behavior of CSS absolute positioning
21901	position: function() {
21902		if ( !this[ 0 ] ) {
21903			return;
21904		}
21905
21906		var offsetParent, offset, doc,
21907			elem = this[ 0 ],
21908			parentOffset = { top: 0, left: 0 };
21909
21910		// position:fixed elements are offset from the viewport, which itself always has zero offset
21911		if ( jQuery.css( elem, "position" ) === "fixed" ) {
21912
21913			// Assume position:fixed implies availability of getBoundingClientRect
21914			offset = elem.getBoundingClientRect();
21915
21916		} else {
21917			offset = this.offset();
21918
21919			// Account for the *real* offset parent, which can be the document or its root element
21920			// when a statically positioned element is identified
21921			doc = elem.ownerDocument;
21922			offsetParent = elem.offsetParent || doc.documentElement;
21923			while ( offsetParent &&
21924				( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
21925				jQuery.css( offsetParent, "position" ) === "static" ) {
21926
21927				offsetParent = offsetParent.parentNode;
21928			}
21929			if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
21930
21931				// Incorporate borders into its offset, since they are outside its content origin
21932				parentOffset = jQuery( offsetParent ).offset();
21933				parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
21934				parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
21935			}
21936		}
21937
21938		// Subtract parent offsets and element margins
21939		return {
21940			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
21941			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
21942		};
21943	},
21944
21945	// This method will return documentElement in the following cases:
21946	// 1) For the element inside the iframe without offsetParent, this method will return
21947	//    documentElement of the parent window
21948	// 2) For the hidden or detached element
21949	// 3) For body or html element, i.e. in case of the html node - it will return itself
21950	//
21951	// but those exceptions were never presented as a real life use-cases
21952	// and might be considered as more preferable results.
21953	//
21954	// This logic, however, is not guaranteed and can change at any point in the future
21955	offsetParent: function() {
21956		return this.map( function() {
21957			var offsetParent = this.offsetParent;
21958
21959			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
21960				offsetParent = offsetParent.offsetParent;
21961			}
21962
21963			return offsetParent || documentElement;
21964		} );
21965	}
21966} );
21967
21968// Create scrollLeft and scrollTop methods
21969jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
21970	var top = "pageYOffset" === prop;
21971
21972	jQuery.fn[ method ] = function( val ) {
21973		return access( this, function( elem, method, val ) {
21974
21975			// Coalesce documents and windows
21976			var win;
21977			if ( isWindow( elem ) ) {
21978				win = elem;
21979			} else if ( elem.nodeType === 9 ) {
21980				win = elem.defaultView;
21981			}
21982
21983			if ( val === undefined ) {
21984				return win ? win[ prop ] : elem[ method ];
21985			}
21986
21987			if ( win ) {
21988				win.scrollTo(
21989					!top ? val : win.pageXOffset,
21990					top ? val : win.pageYOffset
21991				);
21992
21993			} else {
21994				elem[ method ] = val;
21995			}
21996		}, method, val, arguments.length );
21997	};
21998} );
21999
22000// Support: Safari <=7 - 9.1, Chrome <=37 - 49
22001// Add the top/left cssHooks using jQuery.fn.position
22002// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
22003// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
22004// getComputedStyle returns percent when specified for top/left/bottom/right;
22005// rather than make the css module depend on the offset module, just check for it here
22006jQuery.each( [ "top", "left" ], function( _i, prop ) {
22007	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
22008		function( elem, computed ) {
22009			if ( computed ) {
22010				computed = curCSS( elem, prop );
22011
22012				// If curCSS returns percentage, fallback to offset
22013				return rnumnonpx.test( computed ) ?
22014					jQuery( elem ).position()[ prop ] + "px" :
22015					computed;
22016			}
22017		}
22018	);
22019} );
22020
22021
22022// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
22023jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
22024	jQuery.each( {
22025		padding: "inner" + name,
22026		content: type,
22027		"": "outer" + name
22028	}, function( defaultExtra, funcName ) {
22029
22030		// Margin is only for outerHeight, outerWidth
22031		jQuery.fn[ funcName ] = function( margin, value ) {
22032			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
22033				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
22034
22035			return access( this, function( elem, type, value ) {
22036				var doc;
22037
22038				if ( isWindow( elem ) ) {
22039
22040					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
22041					return funcName.indexOf( "outer" ) === 0 ?
22042						elem[ "inner" + name ] :
22043						elem.document.documentElement[ "client" + name ];
22044				}
22045
22046				// Get document width or height
22047				if ( elem.nodeType === 9 ) {
22048					doc = elem.documentElement;
22049
22050					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
22051					// whichever is greatest
22052					return Math.max(
22053						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
22054						elem.body[ "offset" + name ], doc[ "offset" + name ],
22055						doc[ "client" + name ]
22056					);
22057				}
22058
22059				return value === undefined ?
22060
22061					// Get width or height on the element, requesting but not forcing parseFloat
22062					jQuery.css( elem, type, extra ) :
22063
22064					// Set width or height on the element
22065					jQuery.style( elem, type, value, extra );
22066			}, type, chainable ? margin : undefined, chainable );
22067		};
22068	} );
22069} );
22070
22071
22072jQuery.each( [
22073	"ajaxStart",
22074	"ajaxStop",
22075	"ajaxComplete",
22076	"ajaxError",
22077	"ajaxSuccess",
22078	"ajaxSend"
22079], function( _i, type ) {
22080	jQuery.fn[ type ] = function( fn ) {
22081		return this.on( type, fn );
22082	};
22083} );
22084
22085
22086
22087
22088jQuery.fn.extend( {
22089
22090	bind: function( types, data, fn ) {
22091		return this.on( types, null, data, fn );
22092	},
22093	unbind: function( types, fn ) {
22094		return this.off( types, null, fn );
22095	},
22096
22097	delegate: function( selector, types, data, fn ) {
22098		return this.on( types, selector, data, fn );
22099	},
22100	undelegate: function( selector, types, fn ) {
22101
22102		// ( namespace ) or ( selector, types [, fn] )
22103		return arguments.length === 1 ?
22104			this.off( selector, "**" ) :
22105			this.off( types, selector || "**", fn );
22106	},
22107
22108	hover: function( fnOver, fnOut ) {
22109		return this
vendor: 2,565 bytes, lines 22109-22201
22109.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
22110	}
22111} );
22112
22113jQuery.each(
22114	( "blur focus focusin focusout resize scroll click dblclick " +
22115	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
22116	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
22117	function( _i, name ) {
22118
22119		// Handle event binding
22120		jQuery.fn[ name ] = function( data, fn ) {
22121			return arguments.length > 0 ?
22122				this.on( name, null, data, fn ) :
22123				this.trigger( name );
22124		};
22125	}
22126);
22127
22128
22129
22130
22131// Support: Android <=4.0 only
22132// Make sure we trim BOM and NBSP
22133// Require that the "whitespace run" starts from a non-whitespace
22134// to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position.
22135var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;
22136
22137// Bind a function to a context, optionally partially applying any
22138// arguments.
22139// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
22140// However, it is not slated for removal any time soon
22141jQuery.proxy = function( fn, context ) {
22142	var tmp, args, proxy;
22143
22144	if ( typeof context === "string" ) {
22145		tmp = fn[ context ];
22146		context = fn;
22147		fn = tmp;
22148	}
22149
22150	// Quick check to determine if target is callable, in the spec
22151	// this throws a TypeError, but we will just return undefined.
22152	if ( !isFunction( fn ) ) {
22153		return undefined;
22154	}
22155
22156	// Simulated bind
22157	args = slice.call( arguments, 2 );
22158	proxy = function() {
22159		return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
22160	};
22161
22162	// Set the guid of unique handler to the same of original handler, so it can be removed
22163	proxy.guid = fn.guid = fn.guid || jQuery.guid++;
22164
22165	return proxy;
22166};
22167
22168jQuery.holdReady = function( hold ) {
22169	if ( hold ) {
22170		jQuery.readyWait++;
22171	} else {
22172		jQuery.ready( true );
22173	}
22174};
22175jQuery.isArray = Array.isArray;
22176jQuery.parseJSON = JSON.parse;
22177jQuery.nodeName = nodeName;
22178jQuery.isFunction = isFunction;
22179jQuery.isWindow = isWindow;
22180jQuery.camelCase = camelCase;
22181jQuery.type = toType;
22182
22183jQuery.now = Date.now;
22184
22185jQuery.isNumeric = function( obj ) {
22186
22187	// As of jQuery 3.0, isNumeric is limited to
22188	// strings and numbers (primitives or objects)
22189	// that can be coerced to finite numbers (gh-2662)
22190	var type = jQuery.type( obj );
22191	return ( type === "number" || type === "string" ) &&
22192
22193		// parseFloat NaNs numeric-cast false positives ("")
22194		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
22195		// subtraction forces infinities to NaN
22196		!isNaN( obj - parseFloat( obj ) );
22197};
22198
22199jQuery.trim = function( text ) {
22200	return text == null ?
22201		"" :
22202		( text + "" ).replace( rtrim, "$1" );
22203};
22204
22205
22206
22207// Register as a named AMD module, since jQuery can be concatenated with other
22208// files that may use define, but not via a proper concatenation script that
22209// understands anonymous AMD modules. A named AMD is safest and most robust
22210// way to register. Lowercase jquery is used because AMD module names are
22211// derived from file names, and jQuery is normally delivered in a lowercase
22212// file name. Do this after creating the global so that if an AMD module wants
22213// to call noConflict to hide this version of jQuery, it will work.
22214
22215// Note that for maximum portability, libraries that are not jQuery should
22216// declare themselves as anonymous modules, and avoid setting a global if an
22217// AMD loader is present. jQuery is a special case. For more information, see
22218// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
22219
22220if ( typeof define === "function" && define.amd ) {
22221	define( "jquery", [], function() {
22222		return jQuery;
22223	} );
22224}
22225
22226
22227
22228
22229var
22230
22231	// Map over jQuery in case of overwrite
22232	_jQuery = window.jQuery,
22233
22234	// Map over the $ in case of overwrite
22235	_$ = window.$;
22236
22237jQuery.noConflict = function( deep ) {
22238	if ( window.$ === jQuery ) {
22239		window.$ = _$;
22240	}
22241
22242	if ( deep && window.jQuery === jQuery ) {
22243		window.jQuery = _jQuery;
22244	}
22245
22246	return jQuery;
22247};
22248
22249// Expose jQuery and $ identifiers, even in AMD
22250// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557)
22251// and CommonJS for browser emulators (trac-13566)
22252if ( typeof noGlobal === "undefined" ) {
22253	window.jQuery = window.$ = jQuery;
22254}
22255
22256
22257
22258
22259return jQuery;
22260} );
22261
22262},{}],39:[function(require,module,exports){
22263/*!
22264 * Masonry v4.2.2
22265 * Cascading grid layout library
22266 * https://masonry.desandro.com
22267 * MIT License
22268 * by David DeSandro
22269 */
22270
22271( function( window, factory ) {
22272  // universal module definition
22273  /* jshint strict: false */ /*globals define, module, require */
22274  if ( typeof define == 'function' && define.amd ) {
22275    // AMD
22276    define( [
22277        'outlayer/outlayer',
22278        'get-size/get-size'
22279      ],
22280      factory );
22281  } else if ( typeof module == 'object' && module.exports ) {
22282    // CommonJS
22283    module.exports = factory(
22284      require('outlayer'),
22285      require('get-size')
22286    );
22287  } else {
22288    // browser global
22289    window.Masonry = factory(
22290      window.Outlayer,
22291      window.getSize
22292    );
22293  }
22294
22295}( window, function factory( Outlayer, getSize ) {
22296
22297'use strict';
22298
22299// -------------------------- masonryDefinition -------------------------- //
22300
22301  // create an Outlayer layout class
22302  var Masonry = Outlayer.create('masonry');
22303  // isFitWidth -> fitWidth
vendor: 6,829 bytes, lines 22304-22513
22304  Masonry.compatOptions.fitWidth = 'isFitWidth';
22305
22306  var proto = Masonry.prototype;
22307
22308  proto._resetLayout = function() {
22309    this.getSize();
22310    this._getMeasurement( 'columnWidth', 'outerWidth' );
22311    this._getMeasurement( 'gutter', 'outerWidth' );
22312    this.measureColumns();
22313
22314    // reset column Y
22315    this.colYs = [];
22316    for ( var i=0; i < this.cols; i++ ) {
22317      this.colYs.push( 0 );
22318    }
22319
22320    this.maxY = 0;
22321    this.horizontalColIndex = 0;
22322  };
22323
22324  proto.measureColumns = function() {
22325    this.getContainerWidth();
22326    // if columnWidth is 0, default to outerWidth of first item
22327    if ( !this.columnWidth ) {
22328      var firstItem = this.items[0];
22329      var firstItemElem = firstItem && firstItem.element;
22330      // columnWidth fall back to item of first element
22331      this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth ||
22332        // if first elem has no width, default to size of container
22333        this.containerWidth;
22334    }
22335
22336    var columnWidth = this.columnWidth += this.gutter;
22337
22338    // calculate columns
22339    var containerWidth = this.containerWidth + this.gutter;
22340    var cols = containerWidth / columnWidth;
22341    // fix rounding errors, typically with gutters
22342    var excess = columnWidth - containerWidth % columnWidth;
22343    // if overshoot is less than a pixel, round up, otherwise floor it
22344    var mathMethod = excess && excess < 1 ? 'round' : 'floor';
22345    cols = Math[ mathMethod ]( cols );
22346    this.cols = Math.max( cols, 1 );
22347  };
22348
22349  proto.getContainerWidth = function() {
22350    // container is parent if fit width
22351    var isFitWidth = this._getOption('fitWidth');
22352    var container = isFitWidth ? this.element.parentNode : this.element;
22353    // check that this.size and size are there
22354    // IE8 triggers resize on body size change, so they might not be
22355    var size = getSize( container );
22356    this.containerWidth = size && size.innerWidth;
22357  };
22358
22359  proto._getItemLayoutPosition = function( item ) {
22360    item.getSize();
22361    // how many columns does this brick span
22362    var remainder = item.size.outerWidth % this.columnWidth;
22363    var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil';
22364    // round if off by 1 pixel, otherwise use ceil
22365    var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth );
22366    colSpan = Math.min( colSpan, this.cols );
22367    // use horizontal or top column position
22368    var colPosMethod = this.options.horizontalOrder ?
22369      '_getHorizontalColPosition' : '_getTopColPosition';
22370    var colPosition = this[ colPosMethod ]( colSpan, item );
22371    // position the brick
22372    var position = {
22373      x: this.columnWidth * colPosition.col,
22374      y: colPosition.y
22375    };
22376    // apply setHeight to necessary columns
22377    var setHeight = colPosition.y + item.size.outerHeight;
22378    var setMax = colSpan + colPosition.col;
22379    for ( var i = colPosition.col; i < setMax; i++ ) {
22380      this.colYs[i] = setHeight;
22381    }
22382
22383    return position;
22384  };
22385
22386  proto._getTopColPosition = function( colSpan ) {
22387    var colGroup = this._getTopColGroup( colSpan );
22388    // get the minimum Y value from the columns
22389    var minimumY = Math.min.apply( Math, colGroup );
22390
22391    return {
22392      col: colGroup.indexOf( minimumY ),
22393      y: minimumY,
22394    };
22395  };
22396
22397  /**
22398   * @param {Number} colSpan - number of columns the element spans
22399   * @returns {Array} colGroup
22400   */
22401  proto._getTopColGroup = function( colSpan ) {
22402    if ( colSpan < 2 ) {
22403      // if brick spans only one column, use all the column Ys
22404      return this.colYs;
22405    }
22406
22407    var colGroup = [];
22408    // how many different places could this brick fit horizontally
22409    var groupCount = this.cols + 1 - colSpan;
22410    // for each group potential horizontal position
22411    for ( var i = 0; i < groupCount; i++ ) {
22412      colGroup[i] = this._getColGroupY( i, colSpan );
22413    }
22414    return colGroup;
22415  };
22416
22417  proto._getColGroupY = function( col, colSpan ) {
22418    if ( colSpan < 2 ) {
22419      return this.colYs[ col ];
22420    }
22421    // make an array of colY values for that one group
22422    var groupColYs = this.colYs.slice( col, col + colSpan );
22423    // and get the max value of the array
22424    return Math.max.apply( Math, groupColYs );
22425  };
22426
22427  // get column position based on horizontal index. #873
22428  proto._getHorizontalColPosition = function( colSpan, item ) {
22429    var col = this.horizontalColIndex % this.cols;
22430    var isOver = colSpan > 1 && col + colSpan > this.cols;
22431    // shift to next row if item can't fit on current row
22432    col = isOver ? 0 : col;
22433    // don't let zero-size items take up space
22434    var hasSize = item.size.outerWidth && item.size.outerHeight;
22435    this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex;
22436
22437    return {
22438      col: col,
22439      y: this._getColGroupY( col, colSpan ),
22440    };
22441  };
22442
22443  proto._manageStamp = function( stamp ) {
22444    var stampSize = getSize( stamp );
22445    var offset = this._getElementOffset( stamp );
22446    // get the columns that this stamp affects
22447    var isOriginLeft = this._getOption('originLeft');
22448    var firstX = isOriginLeft ? offset.left : offset.right;
22449    var lastX = firstX + stampSize.outerWidth;
22450    var firstCol = Math.floor( firstX / this.columnWidth );
22451    firstCol = Math.max( 0, firstCol );
22452    var lastCol = Math.floor( lastX / this.columnWidth );
22453    // lastCol should not go over if multiple of columnWidth #425
22454    lastCol -= lastX % this.columnWidth ? 0 : 1;
22455    lastCol = Math.min( this.cols - 1, lastCol );
22456    // set colYs to bottom of the stamp
22457
22458    var isOriginTop = this._getOption('originTop');
22459    var stampMaxY = ( isOriginTop ? offset.top : offset.bottom ) +
22460      stampSize.outerHeight;
22461    for ( var i = firstCol; i <= lastCol; i++ ) {
22462      this.colYs[i] = Math.max( stampMaxY, this.colYs[i] );
22463    }
22464  };
22465
22466  proto._getContainerSize = function() {
22467    this.maxY = Math.max.apply( Math, this.colYs );
22468    var size = {
22469      height: this.maxY
22470    };
22471
22472    if ( this._getOption('fitWidth') ) {
22473      size.width = this._getContainerFitWidth();
22474    }
22475
22476    return size;
22477  };
22478
22479  proto._getContainerFitWidth = function() {
22480    var unusedCols = 0;
22481    // count unused columns
22482    var i = this.cols;
22483    while ( --i ) {
22484      if ( this.colYs[i] !== 0 ) {
22485        break;
22486      }
22487      unusedCols++;
22488    }
22489    // fit container to columns that have been used
22490    return ( this.cols - unusedCols ) * this.columnWidth - this.gutter;
22491  };
22492
22493  proto.needsResizeLayout = function() {
22494    var previousWidth = this.containerWidth;
22495    this.getContainerWidth();
22496    return previousWidth != this.containerWidth;
22497  };
22498
22499  return Masonry;
22500
22501}));
22502
22503},{"get-size":31,"outlayer":41}],40:[function(require,module,exports){
22504/**
22505 * Outlayer Item
22506 */
22507
22508( function( window, factory ) {
22509  // universal module definition
22510  /* jshint strict: false */ /* globals define, module, require */
22511  if ( typeof define == 'function' && define.amd ) {
22512    // AMD - RequireJS
22513    define( 
vendor: 14,302 bytes, lines 22513-23058
22513[
22514        'ev-emitter/ev-emitter',
22515        'get-size/get-size'
22516      ],
22517      factory
22518    );
22519  } else if ( typeof module == 'object' && module.exports ) {
22520    // CommonJS - Browserify, Webpack
22521    module.exports = factory(
22522      require('ev-emitter'),
22523      require('get-size')
22524    );
22525  } else {
22526    // browser global
22527    window.Outlayer = {};
22528    window.Outlayer.Item = factory(
22529      window.EvEmitter,
22530      window.getSize
22531    );
22532  }
22533
22534}( window, function factory( EvEmitter, getSize ) {
22535'use strict';
22536
22537// ----- helpers ----- //
22538
22539function isEmptyObj( obj ) {
22540  for ( var prop in obj ) {
22541    return false;
22542  }
22543  prop = null;
22544  return true;
22545}
22546
22547// -------------------------- CSS3 support -------------------------- //
22548
22549
22550var docElemStyle = document.documentElement.style;
22551
22552var transitionProperty = typeof docElemStyle.transition == 'string' ?
22553  'transition' : 'WebkitTransition';
22554var transformProperty = typeof docElemStyle.transform == 'string' ?
22555  'transform' : 'WebkitTransform';
22556
22557var transitionEndEvent = {
22558  WebkitTransition: 'webkitTransitionEnd',
22559  transition: 'transitionend'
22560}[ transitionProperty ];
22561
22562// cache all vendor properties that could have vendor prefix
22563var vendorProperties = {
22564  transform: transformProperty,
22565  transition: transitionProperty,
22566  transitionDuration: transitionProperty + 'Duration',
22567  transitionProperty: transitionProperty + 'Property',
22568  transitionDelay: transitionProperty + 'Delay'
22569};
22570
22571// -------------------------- Item -------------------------- //
22572
22573function Item( element, layout ) {
22574  if ( !element ) {
22575    return;
22576  }
22577
22578  this.element = element;
22579  // parent layout class, i.e. Masonry, Isotope, or Packery
22580  this.layout = layout;
22581  this.position = {
22582    x: 0,
22583    y: 0
22584  };
22585
22586  this._create();
22587}
22588
22589// inherit EvEmitter
22590var proto = Item.prototype = Object.create( EvEmitter.prototype );
22591proto.constructor = Item;
22592
22593proto._create = function() {
22594  // transition objects
22595  this._transn = {
22596    ingProperties: {},
22597    clean: {},
22598    onEnd: {}
22599  };
22600
22601  this.css({
22602    position: 'absolute'
22603  });
22604};
22605
22606// trigger specified handler for event type
22607proto.handleEvent = function( event ) {
22608  var method = 'on' + event.type;
22609  if ( this[ method ] ) {
22610    this[ method ]( event );
22611  }
22612};
22613
22614proto.getSize = function() {
22615  this.size = getSize( this.element );
22616};
22617
22618/**
22619 * apply CSS styles to element
22620 * @param {Object} style
22621 */
22622proto.css = function( style ) {
22623  var elemStyle = this.element.style;
22624
22625  for ( var prop in style ) {
22626    // use vendor property if available
22627    var supportedProp = vendorProperties[ prop ] || prop;
22628    elemStyle[ supportedProp ] = style[ prop ];
22629  }
22630};
22631
22632 // measure position, and sets it
22633proto.getPosition = function() {
22634  var style = getComputedStyle( this.element );
22635  var isOriginLeft = this.layout._getOption('originLeft');
22636  var isOriginTop = this.layout._getOption('originTop');
22637  var xValue = style[ isOriginLeft ? 'left' : 'right' ];
22638  var yValue = style[ isOriginTop ? 'top' : 'bottom' ];
22639  var x = parseFloat( xValue );
22640  var y = parseFloat( yValue );
22641  // convert percent to pixels
22642  var layoutSize = this.layout.size;
22643  if ( xValue.indexOf('%') != -1 ) {
22644    x = ( x / 100 ) * layoutSize.width;
22645  }
22646  if ( yValue.indexOf('%') != -1 ) {
22647    y = ( y / 100 ) * layoutSize.height;
22648  }
22649  // clean up 'auto' or other non-integer values
22650  x = isNaN( x ) ? 0 : x;
22651  y = isNaN( y ) ? 0 : y;
22652  // remove padding from measurement
22653  x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight;
22654  y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom;
22655
22656  this.position.x = x;
22657  this.position.y = y;
22658};
22659
22660// set settled position, apply padding
22661proto.layoutPosition = function() {
22662  var layoutSize = this.layout.size;
22663  var style = {};
22664  var isOriginLeft = this.layout._getOption('originLeft');
22665  var isOriginTop = this.layout._getOption('originTop');
22666
22667  // x
22668  var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight';
22669  var xProperty = isOriginLeft ? 'left' : 'right';
22670  var xResetProperty = isOriginLeft ? 'right' : 'left';
22671
22672  var x = this.position.x + layoutSize[ xPadding ];
22673  // set in percentage or pixels
22674  style[ xProperty ] = this.getXValue( x );
22675  // reset other property
22676  style[ xResetProperty ] = '';
22677
22678  // y
22679  var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom';
22680  var yProperty = isOriginTop ? 'top' : 'bottom';
22681  var yResetProperty = isOriginTop ? 'bottom' : 'top';
22682
22683  var y = this.position.y + layoutSize[ yPadding ];
22684  // set in percentage or pixels
22685  style[ yProperty ] = this.getYValue( y );
22686  // reset other property
22687  style[ yResetProperty ] = '';
22688
22689  this.css( style );
22690  this.emitEvent( 'layout', [ this ] );
22691};
22692
22693proto.getXValue = function( x ) {
22694  var isHorizontal = this.layout._getOption('horizontal');
22695  return this.layout.options.percentPosition && !isHorizontal ?
22696    ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px';
22697};
22698
22699proto.getYValue = function( y ) {
22700  var isHorizontal = this.layout._getOption('horizontal');
22701  return this.layout.options.percentPosition && isHorizontal ?
22702    ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px';
22703};
22704
22705proto._transitionTo = function( x, y ) {
22706  this.getPosition();
22707  // get current x & y from top/left
22708  var curX = this.position.x;
22709  var curY = this.position.y;
22710
22711  var didNotMove = x == this.position.x && y == this.position.y;
22712
22713  // save end position
22714  this.setPosition( x, y );
22715
22716  // if did not move and not transitioning, just go to layout
22717  if ( didNotMove && !this.isTransitioning ) {
22718    this.layoutPosition();
22719    return;
22720  }
22721
22722  var transX = x - curX;
22723  var transY = y - curY;
22724  var transitionStyle = {};
22725  transitionStyle.transform = this.getTranslate( transX, transY );
22726
22727  this.transition({
22728    to: transitionStyle,
22729    onTransitionEnd: {
22730      transform: this.layoutPosition
22731    },
22732    isCleaning: true
22733  });
22734};
22735
22736proto.getTranslate = function( x, y ) {
22737  // flip cooridinates if origin on right or bottom
22738  var isOriginLeft = this.layout._getOption('originLeft');
22739  var isOriginTop = this.layout._getOption('originTop');
22740  x = isOriginLeft ? x : -x;
22741  y = isOriginTop ? y : -y;
22742  return 'translate3d(' + x + 'px, ' + y + 'px, 0)';
22743};
22744
22745// non transition + transform support
22746proto.goTo = function( x, y ) {
22747  this.setPosition( x, y );
22748  this.layoutPosition();
22749};
22750
22751proto.moveTo = proto._transitionTo;
22752
22753proto.setPosition = function( x, y ) {
22754  this.position.x = parseFloat( x );
22755  this.position.y = parseFloat( y );
22756};
22757
22758// ----- transition ----- //
22759
22760/**
22761 * @param {Object} style - CSS
22762 * @param {Function} onTransitionEnd
22763 */
22764
22765// non transition, just trigger callback
22766proto._nonTransition = function( args ) {
22767  this.css( args.to );
22768  if ( args.isCleaning ) {
22769    this._removeStyles( args.to );
22770  }
22771  for ( var prop in args.onTransitionEnd ) {
22772    args.onTransitionEnd[ prop ].call( this );
22773  }
22774};
22775
22776/**
22777 * proper transition
22778 * @param {Object} args - arguments
22779 *   @param {Object} to - style to transition to
22780 *   @param {Object} from - style to start transition from
22781 *   @param {Boolean} isCleaning - removes transition styles after transition
22782 *   @param {Function} onTransitionEnd - callback
22783 */
22784proto.transition = function( args ) {
22785  // redirect to nonTransition if no transition duration
22786  if ( !parseFloat( this.layout.options.transitionDuration ) ) {
22787    this._nonTransition( args );
22788    return;
22789  }
22790
22791  var _transition = this._transn;
22792  // keep track of onTransitionEnd callback by css property
22793  for ( var prop in args.onTransitionEnd ) {
22794    _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ];
22795  }
22796  // keep track of properties that are transitioning
22797  for ( prop in args.to ) {
22798    _transition.ingProperties[ prop ] = true;
22799    // keep track of properties to clean up when transition is done
22800    if ( args.isCleaning ) {
22801      _transition.clean[ prop ] = true;
22802    }
22803  }
22804
22805  // set from styles
22806  if ( args.from ) {
22807    this.css( args.from );
22808    // force redraw. http://blog.alexmaccaw.com/css-transitions
22809    var h = this.element.offsetHeight;
22810    // hack for JSHint to hush about unused var
22811    h = null;
22812  }
22813  // enable transition
22814  this.enableTransition( args.to );
22815  // set styles that are transitioning
22816  this.css( args.to );
22817
22818  this.isTransitioning = true;
22819
22820};
22821
22822// dash before all cap letters, including first for
22823// WebkitTransform => -webkit-transform
22824function toDashedAll( str ) {
22825  return str.replace( /([A-Z])/g, function( $1 ) {
22826    return '-' + $1.toLowerCase();
22827  });
22828}
22829
22830var transitionProps = 'opacity,' + toDashedAll( transformProperty );
22831
22832proto.enableTransition = function(/* style */) {
22833  // HACK changing transitionProperty during a transition
22834  // will cause transition to jump
22835  if ( this.isTransitioning ) {
22836    return;
22837  }
22838
22839  // make `transition: foo, bar, baz` from style object
22840  // HACK un-comment this when enableTransition can work
22841  // while a transition is happening
22842  // var transitionValues = [];
22843  // for ( var prop in style ) {
22844  //   // dash-ify camelCased properties like WebkitTransition
22845  //   prop = vendorProperties[ prop ] || prop;
22846  //   transitionValues.push( toDashedAll( prop ) );
22847  // }
22848  // munge number to millisecond, to match stagger
22849  var duration = this.layout.options.transitionDuration;
22850  duration = typeof duration == 'number' ? duration + 'ms' : duration;
22851  // enable transition styles
22852  this.css({
22853    transitionProperty: transitionProps,
22854    transitionDuration: duration,
22855    transitionDelay: this.staggerDelay || 0
22856  });
22857  // listen for transition end event
22858  this.element.addEventListener( transitionEndEvent, this, false );
22859};
22860
22861// ----- events ----- //
22862
22863proto.onwebkitTransitionEnd = function( event ) {
22864  this.ontransitionend( event );
22865};
22866
22867proto.onotransitionend = function( event ) {
22868  this.ontransitionend( event );
22869};
22870
22871// properties that I munge to make my life easier
22872var dashedVendorProperties = {
22873  '-webkit-transform': 'transform'
22874};
22875
22876proto.ontransitionend = function( event ) {
22877  // disregard bubbled events from children
22878  if ( event.target !== this.element ) {
22879    return;
22880  }
22881  var _transition = this._transn;
22882  // get property name of transitioned property, convert to prefix-free
22883  var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName;
22884
22885  // remove property that has completed transitioning
22886  delete _transition.ingProperties[ propertyName ];
22887  // check if any properties are still transitioning
22888  if ( isEmptyObj( _transition.ingProperties ) ) {
22889    // all properties have completed transitioning
22890    this.disableTransition();
22891  }
22892  // clean style
22893  if ( propertyName in _transition.clean ) {
22894    // clean up style
22895    this.element.style[ event.propertyName ] = '';
22896    delete _transition.clean[ propertyName ];
22897  }
22898  // trigger onTransitionEnd callback
22899  if ( propertyName in _transition.onEnd ) {
22900    var onTransitionEnd = _transition.onEnd[ propertyName ];
22901    onTransitionEnd.call( this );
22902    delete _transition.onEnd[ propertyName ];
22903  }
22904
22905  this.emitEvent( 'transitionEnd', [ this ] );
22906};
22907
22908proto.disableTransition = function() {
22909  this.removeTransitionStyles();
22910  this.element.removeEventListener( transitionEndEvent, this, false );
22911  this.isTransitioning = false;
22912};
22913
22914/**
22915 * removes style property from element
22916 * @param {Object} style
22917**/
22918proto._removeStyles = function( style ) {
22919  // clean up transition styles
22920  var cleanStyle = {};
22921  for ( var prop in style ) {
22922    cleanStyle[ prop ] = '';
22923  }
22924  this.css( cleanStyle );
22925};
22926
22927var cleanTransitionStyle = {
22928  transitionProperty: '',
22929  transitionDuration: '',
22930  transitionDelay: ''
22931};
22932
22933proto.removeTransitionStyles = function() {
22934  // remove transition
22935  this.css( cleanTransitionStyle );
22936};
22937
22938// ----- stagger ----- //
22939
22940proto.stagger = function( delay ) {
22941  delay = isNaN( delay ) ? 0 : delay;
22942  this.staggerDelay = delay + 'ms';
22943};
22944
22945// ----- show/hide/remove ----- //
22946
22947// remove element from DOM
22948proto.removeElem = function() {
22949  this.element.parentNode.removeChild( this.element );
22950  // remove display: none
22951  this.css({ display: '' });
22952  this.emitEvent( 'remove', [ this ] );
22953};
22954
22955proto.remove = function() {
22956  // just remove element if no transition support or no transition
22957  if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) {
22958    this.removeElem();
22959    return;
22960  }
22961
22962  // start transition
22963  this.once( 'transitionEnd', function() {
22964    this.removeElem();
22965  });
22966  this.hide();
22967};
22968
22969proto.reveal = function() {
22970  delete this.isHidden;
22971  // remove display: none
22972  this.css({ display: '' });
22973
22974  var options = this.layout.options;
22975
22976  var onTransitionEnd = {};
22977  var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle');
22978  onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd;
22979
22980  this.transition({
22981    from: options.hiddenStyle,
22982    to: options.visibleStyle,
22983    isCleaning: true,
22984    onTransitionEnd: onTransitionEnd
22985  });
22986};
22987
22988proto.onRevealTransitionEnd = function() {
22989  // check if still visible
22990  // during transition, item may have been hidden
22991  if ( !this.isHidden ) {
22992    this.emitEvent('reveal');
22993  }
22994};
22995
22996/**
22997 * get style property use for hide/reveal transition end
22998 * @param {String} styleProperty - hiddenStyle/visibleStyle
22999 * @returns {String}
23000 */
23001proto.getHideRevealTransitionEndProperty = function( styleProperty ) {
23002  var optionStyle = this.layout.options[ styleProperty ];
23003  // use opacity
23004  if ( optionStyle.opacity ) {
23005    return 'opacity';
23006  }
23007  // get first property
23008  for ( var prop in optionStyle ) {
23009    return prop;
23010  }
23011};
23012
23013proto.hide = function() {
23014  // set flag
23015  this.isHidden = true;
23016  // remove display: none
23017  this.css({ display: '' });
23018
23019  var options = this.layout.options;
23020
23021  var onTransitionEnd = {};
23022  var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle');
23023  onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd;
23024
23025  this.transition({
23026    from: options.visibleStyle,
23027    to: options.hiddenStyle,
23028    // keep hidden stuff hidden
23029    isCleaning: true,
23030    onTransitionEnd: onTransitionEnd
23031  });
23032};
23033
23034proto.onHideTransitionEnd = function() {
23035  // check if still hidden
23036  // during transition, item may have been un-hidden
23037  if ( this.isHidden ) {
23038    this.css({ display: 'none' });
23039    this.emitEvent('hide');
23040  }
23041};
23042
23043proto.destroy = function() {
23044  this.css({
23045    position: '',
23046    left: '',
23047    right: '',
23048    top: '',
23049    bottom: '',
23050    transition: '',
23051    transform: ''
23052  });
23053};
23054
23055return Item;
23056
23057}));
23058
23059},{"ev-emitter":29,"get-size":31}],41:[function(require,module,exports){
23060/*!
23061 * Outlayer v2.1.1
23062 * the brains and guts of a layout library
23063 * MIT license
23064 */
23065
23066( function( window, factory ) {
23067  'use strict';
23068  // universal module definition
23069  /* jshint strict: false */ /* globals define, module, require */
23070  if ( typeof define == 'function' && define.amd ) {
23071    // AMD - RequireJS
23072    define( 
vendor: 21,711 bytes, lines 23072-23999
23072[
23073        'ev-emitter/ev-emitter',
23074        'get-size/get-size',
23075        'fizzy-ui-utils/utils',
23076        './item'
23077      ],
23078      function( EvEmitter, getSize, utils, Item ) {
23079        return factory( window, EvEmitter, getSize, utils, Item);
23080      }
23081    );
23082  } else if ( typeof module == 'object' && module.exports ) {
23083    // CommonJS - Browserify, Webpack
23084    module.exports = factory(
23085      window,
23086      require('ev-emitter'),
23087      require('get-size'),
23088      require('fizzy-ui-utils'),
23089      require('./item')
23090    );
23091  } else {
23092    // browser global
23093    window.Outlayer = factory(
23094      window,
23095      window.EvEmitter,
23096      window.getSize,
23097      window.fizzyUIUtils,
23098      window.Outlayer.Item
23099    );
23100  }
23101
23102}( window, function factory( window, EvEmitter, getSize, utils, Item ) {
23103'use strict';
23104
23105// ----- vars ----- //
23106
23107var console = window.console;
23108var jQuery = window.jQuery;
23109var noop = function() {};
23110
23111// -------------------------- Outlayer -------------------------- //
23112
23113// globally unique identifiers
23114var GUID = 0;
23115// internal store of all Outlayer intances
23116var instances = {};
23117
23118
23119/**
23120 * @param {Element, String} element
23121 * @param {Object} options
23122 * @constructor
23123 */
23124function Outlayer( element, options ) {
23125  var queryElement = utils.getQueryElement( element );
23126  if ( !queryElement ) {
23127    if ( console ) {
23128      console.error( 'Bad element for ' + this.constructor.namespace +
23129        ': ' + ( queryElement || element ) );
23130    }
23131    return;
23132  }
23133  this.element = queryElement;
23134  // add jQuery
23135  if ( jQuery ) {
23136    this.$element = jQuery( this.element );
23137  }
23138
23139  // options
23140  this.options = utils.extend( {}, this.constructor.defaults );
23141  this.option( options );
23142
23143  // add id for Outlayer.getFromElement
23144  var id = ++GUID;
23145  this.element.outlayerGUID = id; // expando
23146  instances[ id ] = this; // associate via id
23147
23148  // kick it off
23149  this._create();
23150
23151  var isInitLayout = this._getOption('initLayout');
23152  if ( isInitLayout ) {
23153    this.layout();
23154  }
23155}
23156
23157// settings are for internal use only
23158Outlayer.namespace = 'outlayer';
23159Outlayer.Item = Item;
23160
23161// default options
23162Outlayer.defaults = {
23163  containerStyle: {
23164    position: 'relative'
23165  },
23166  initLayout: true,
23167  originLeft: true,
23168  originTop: true,
23169  resize: true,
23170  resizeContainer: true,
23171  // item options
23172  transitionDuration: '0.4s',
23173  hiddenStyle: {
23174    opacity: 0,
23175    transform: 'scale(0.001)'
23176  },
23177  visibleStyle: {
23178    opacity: 1,
23179    transform: 'scale(1)'
23180  }
23181};
23182
23183var proto = Outlayer.prototype;
23184// inherit EvEmitter
23185utils.extend( proto, EvEmitter.prototype );
23186
23187/**
23188 * set options
23189 * @param {Object} opts
23190 */
23191proto.option = function( opts ) {
23192  utils.extend( this.options, opts );
23193};
23194
23195/**
23196 * get backwards compatible option value, check old name
23197 */
23198proto._getOption = function( option ) {
23199  var oldOption = this.constructor.compatOptions[ option ];
23200  return oldOption && this.options[ oldOption ] !== undefined ?
23201    this.options[ oldOption ] : this.options[ option ];
23202};
23203
23204Outlayer.compatOptions = {
23205  // currentName: oldName
23206  initLayout: 'isInitLayout',
23207  horizontal: 'isHorizontal',
23208  layoutInstant: 'isLayoutInstant',
23209  originLeft: 'isOriginLeft',
23210  originTop: 'isOriginTop',
23211  resize: 'isResizeBound',
23212  resizeContainer: 'isResizingContainer'
23213};
23214
23215proto._create = function() {
23216  // get items from children
23217  this.reloadItems();
23218  // elements that affect layout, but are not laid out
23219  this.stamps = [];
23220  this.stamp( this.options.stamp );
23221  // set container style
23222  utils.extend( this.element.style, this.options.containerStyle );
23223
23224  // bind resize method
23225  var canBindResize = this._getOption('resize');
23226  if ( canBindResize ) {
23227    this.bindResize();
23228  }
23229};
23230
23231// goes through all children again and gets bricks in proper order
23232proto.reloadItems = function() {
23233  // collection of item elements
23234  this.items = this._itemize( this.element.children );
23235};
23236
23237
23238/**
23239 * turn elements into Outlayer.Items to be used in layout
23240 * @param {Array or NodeList or HTMLElement} elems
23241 * @returns {Array} items - collection of new Outlayer Items
23242 */
23243proto._itemize = function( elems ) {
23244
23245  var itemElems = this._filterFindItemElements( elems );
23246  var Item = this.constructor.Item;
23247
23248  // create new Outlayer Items for collection
23249  var items = [];
23250  for ( var i=0; i < itemElems.length; i++ ) {
23251    var elem = itemElems[i];
23252    var item = new Item( elem, this );
23253    items.push( item );
23254  }
23255
23256  return items;
23257};
23258
23259/**
23260 * get item elements to be used in layout
23261 * @param {Array or NodeList or HTMLElement} elems
23262 * @returns {Array} items - item elements
23263 */
23264proto._filterFindItemElements = function( elems ) {
23265  return utils.filterFindElements( elems, this.options.itemSelector );
23266};
23267
23268/**
23269 * getter method for getting item elements
23270 * @returns {Array} elems - collection of item elements
23271 */
23272proto.getItemElements = function() {
23273  return this.items.map( function( item ) {
23274    return item.element;
23275  });
23276};
23277
23278// ----- init & layout ----- //
23279
23280/**
23281 * lays out all items
23282 */
23283proto.layout = function() {
23284  this._resetLayout();
23285  this._manageStamps();
23286
23287  // don't animate first layout
23288  var layoutInstant = this._getOption('layoutInstant');
23289  var isInstant = layoutInstant !== undefined ?
23290    layoutInstant : !this._isLayoutInited;
23291  this.layoutItems( this.items, isInstant );
23292
23293  // flag for initalized
23294  this._isLayoutInited = true;
23295};
23296
23297// _init is alias for layout
23298proto._init = proto.layout;
23299
23300/**
23301 * logic before any new layout
23302 */
23303proto._resetLayout = function() {
23304  this.getSize();
23305};
23306
23307
23308proto.getSize = function() {
23309  this.size = getSize( this.element );
23310};
23311
23312/**
23313 * get measurement from option, for columnWidth, rowHeight, gutter
23314 * if option is String -> get element from selector string, & get size of element
23315 * if option is Element -> get size of element
23316 * else use option as a number
23317 *
23318 * @param {String} measurement
23319 * @param {String} size - width or height
23320 * @private
23321 */
23322proto._getMeasurement = function( measurement, size ) {
23323  var option = this.options[ measurement ];
23324  var elem;
23325  if ( !option ) {
23326    // default to 0
23327    this[ measurement ] = 0;
23328  } else {
23329    // use option as an element
23330    if ( typeof option == 'string' ) {
23331      elem = this.element.querySelector( option );
23332    } else if ( option instanceof HTMLElement ) {
23333      elem = option;
23334    }
23335    // use size of element, if element
23336    this[ measurement ] = elem ? getSize( elem )[ size ] : option;
23337  }
23338};
23339
23340/**
23341 * layout a collection of item elements
23342 * @api public
23343 */
23344proto.layoutItems = function( items, isInstant ) {
23345  items = this._getItemsForLayout( items );
23346
23347  this._layoutItems( items, isInstant );
23348
23349  this._postLayout();
23350};
23351
23352/**
23353 * get the items to be laid out
23354 * you may want to skip over some items
23355 * @param {Array} items
23356 * @returns {Array} items
23357 */
23358proto._getItemsForLayout = function( items ) {
23359  return items.filter( function( item ) {
23360    return !item.isIgnored;
23361  });
23362};
23363
23364/**
23365 * layout items
23366 * @param {Array} items
23367 * @param {Boolean} isInstant
23368 */
23369proto._layoutItems = function( items, isInstant ) {
23370  this._emitCompleteOnItems( 'layout', items );
23371
23372  if ( !items || !items.length ) {
23373    // no items, emit event with empty array
23374    return;
23375  }
23376
23377  var queue = [];
23378
23379  items.forEach( function( item ) {
23380    // get x/y object from method
23381    var position = this._getItemLayoutPosition( item );
23382    // enqueue
23383    position.item = item;
23384    position.isInstant = isInstant || item.isLayoutInstant;
23385    queue.push( position );
23386  }, this );
23387
23388  this._processLayoutQueue( queue );
23389};
23390
23391/**
23392 * get item layout position
23393 * @param {Outlayer.Item} item
23394 * @returns {Object} x and y position
23395 */
23396proto._getItemLayoutPosition = function( /* item */ ) {
23397  return {
23398    x: 0,
23399    y: 0
23400  };
23401};
23402
23403/**
23404 * iterate over array and position each item
23405 * Reason being - separating this logic prevents 'layout invalidation'
23406 * thx @paul_irish
23407 * @param {Array} queue
23408 */
23409proto._processLayoutQueue = function( queue ) {
23410  this.updateStagger();
23411  queue.forEach( function( obj, i ) {
23412    this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i );
23413  }, this );
23414};
23415
23416// set stagger from option in milliseconds number
23417proto.updateStagger = function() {
23418  var stagger = this.options.stagger;
23419  if ( stagger === null || stagger === undefined ) {
23420    this.stagger = 0;
23421    return;
23422  }
23423  this.stagger = getMilliseconds( stagger );
23424  return this.stagger;
23425};
23426
23427/**
23428 * Sets position of item in DOM
23429 * @param {Outlayer.Item} item
23430 * @param {Number} x - horizontal position
23431 * @param {Number} y - vertical position
23432 * @param {Boolean} isInstant - disables transitions
23433 */
23434proto._positionItem = function( item, x, y, isInstant, i ) {
23435  if ( isInstant ) {
23436    // if not transition, just set CSS
23437    item.goTo( x, y );
23438  } else {
23439    item.stagger( i * this.stagger );
23440    item.moveTo( x, y );
23441  }
23442};
23443
23444/**
23445 * Any logic you want to do after each layout,
23446 * i.e. size the container
23447 */
23448proto._postLayout = function() {
23449  this.resizeContainer();
23450};
23451
23452proto.resizeContainer = function() {
23453  var isResizingContainer = this._getOption('resizeContainer');
23454  if ( !isResizingContainer ) {
23455    return;
23456  }
23457  var size = this._getContainerSize();
23458  if ( size ) {
23459    this._setContainerMeasure( size.width, true );
23460    this._setContainerMeasure( size.height, false );
23461  }
23462};
23463
23464/**
23465 * Sets width or height of container if returned
23466 * @returns {Object} size
23467 *   @param {Number} width
23468 *   @param {Number} height
23469 */
23470proto._getContainerSize = noop;
23471
23472/**
23473 * @param {Number} measure - size of width or height
23474 * @param {Boolean} isWidth
23475 */
23476proto._setContainerMeasure = function( measure, isWidth ) {
23477  if ( measure === undefined ) {
23478    return;
23479  }
23480
23481  var elemSize = this.size;
23482  // add padding and border width if border box
23483  if ( elemSize.isBorderBox ) {
23484    measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight +
23485      elemSize.borderLeftWidth + elemSize.borderRightWidth :
23486      elemSize.paddingBottom + elemSize.paddingTop +
23487      elemSize.borderTopWidth + elemSize.borderBottomWidth;
23488  }
23489
23490  measure = Math.max( measure, 0 );
23491  this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px';
23492};
23493
23494/**
23495 * emit eventComplete on a collection of items events
23496 * @param {String} eventName
23497 * @param {Array} items - Outlayer.Items
23498 */
23499proto._emitCompleteOnItems = function( eventName, items ) {
23500  var _this = this;
23501  function onComplete() {
23502    _this.dispatchEvent( eventName + 'Complete', null, [ items ] );
23503  }
23504
23505  var count = items.length;
23506  if ( !items || !count ) {
23507    onComplete();
23508    return;
23509  }
23510
23511  var doneCount = 0;
23512  function tick() {
23513    doneCount++;
23514    if ( doneCount == count ) {
23515      onComplete();
23516    }
23517  }
23518
23519  // bind callback
23520  items.forEach( function( item ) {
23521    item.once( eventName, tick );
23522  });
23523};
23524
23525/**
23526 * emits events via EvEmitter and jQuery events
23527 * @param {String} type - name of event
23528 * @param {Event} event - original event
23529 * @param {Array} args - extra arguments
23530 */
23531proto.dispatchEvent = function( type, event, args ) {
23532  // add original event to arguments
23533  var emitArgs = event ? [ event ].concat( args ) : args;
23534  this.emitEvent( type, emitArgs );
23535
23536  if ( jQuery ) {
23537    // set this.$element
23538    this.$element = this.$element || jQuery( this.element );
23539    if ( event ) {
23540      // create jQuery event
23541      var $event = jQuery.Event( event );
23542      $event.type = type;
23543      this.$element.trigger( $event, args );
23544    } else {
23545      // just trigger with type if no event available
23546      this.$element.trigger( type, args );
23547    }
23548  }
23549};
23550
23551// -------------------------- ignore & stamps -------------------------- //
23552
23553
23554/**
23555 * keep item in collection, but do not lay it out
23556 * ignored items do not get skipped in layout
23557 * @param {Element} elem
23558 */
23559proto.ignore = function( elem ) {
23560  var item = this.getItem( elem );
23561  if ( item ) {
23562    item.isIgnored = true;
23563  }
23564};
23565
23566/**
23567 * return item to layout collection
23568 * @param {Element} elem
23569 */
23570proto.unignore = function( elem ) {
23571  var item = this.getItem( elem );
23572  if ( item ) {
23573    delete item.isIgnored;
23574  }
23575};
23576
23577/**
23578 * adds elements to stamps
23579 * @param {NodeList, Array, Element, or String} elems
23580 */
23581proto.stamp = function( elems ) {
23582  elems = this._find( elems );
23583  if ( !elems ) {
23584    return;
23585  }
23586
23587  this.stamps = this.stamps.concat( elems );
23588  // ignore
23589  elems.forEach( this.ignore, this );
23590};
23591
23592/**
23593 * removes elements to stamps
23594 * @param {NodeList, Array, or Element} elems
23595 */
23596proto.unstamp = function( elems ) {
23597  elems = this._find( elems );
23598  if ( !elems ){
23599    return;
23600  }
23601
23602  elems.forEach( function( elem ) {
23603    // filter out removed stamp elements
23604    utils.removeFrom( this.stamps, elem );
23605    this.unignore( elem );
23606  }, this );
23607};
23608
23609/**
23610 * finds child elements
23611 * @param {NodeList, Array, Element, or String} elems
23612 * @returns {Array} elems
23613 */
23614proto._find = function( elems ) {
23615  if ( !elems ) {
23616    return;
23617  }
23618  // if string, use argument as selector string
23619  if ( typeof elems == 'string' ) {
23620    elems = this.element.querySelectorAll( elems );
23621  }
23622  elems = utils.makeArray( elems );
23623  return elems;
23624};
23625
23626proto._manageStamps = function() {
23627  if ( !this.stamps || !this.stamps.length ) {
23628    return;
23629  }
23630
23631  this._getBoundingRect();
23632
23633  this.stamps.forEach( this._manageStamp, this );
23634};
23635
23636// update boundingLeft / Top
23637proto._getBoundingRect = function() {
23638  // get bounding rect for container element
23639  var boundingRect = this.element.getBoundingClientRect();
23640  var size = this.size;
23641  this._boundingRect = {
23642    left: boundingRect.left + size.paddingLeft + size.borderLeftWidth,
23643    top: boundingRect.top + size.paddingTop + size.borderTopWidth,
23644    right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ),
23645    bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth )
23646  };
23647};
23648
23649/**
23650 * @param {Element} stamp
23651**/
23652proto._manageStamp = noop;
23653
23654/**
23655 * get x/y position of element relative to container element
23656 * @param {Element} elem
23657 * @returns {Object} offset - has left, top, right, bottom
23658 */
23659proto._getElementOffset = function( elem ) {
23660  var boundingRect = elem.getBoundingClientRect();
23661  var thisRect = this._boundingRect;
23662  var size = getSize( elem );
23663  var offset = {
23664    left: boundingRect.left - thisRect.left - size.marginLeft,
23665    top: boundingRect.top - thisRect.top - size.marginTop,
23666    right: thisRect.right - boundingRect.right - size.marginRight,
23667    bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom
23668  };
23669  return offset;
23670};
23671
23672// -------------------------- resize -------------------------- //
23673
23674// enable event handlers for listeners
23675// i.e. resize -> onresize
23676proto.handleEvent = utils.handleEvent;
23677
23678/**
23679 * Bind layout to window resizing
23680 */
23681proto.bindResize = function() {
23682  window.addEventListener( 'resize', this );
23683  this.isResizeBound = true;
23684};
23685
23686/**
23687 * Unbind layout to window resizing
23688 */
23689proto.unbindResize = function() {
23690  window.removeEventListener( 'resize', this );
23691  this.isResizeBound = false;
23692};
23693
23694proto.onresize = function() {
23695  this.resize();
23696};
23697
23698utils.debounceMethod( Outlayer, 'onresize', 100 );
23699
23700proto.resize = function() {
23701  // don't trigger if size did not change
23702  // or if resize was unbound. See #9
23703  if ( !this.isResizeBound || !this.needsResizeLayout() ) {
23704    return;
23705  }
23706
23707  this.layout();
23708};
23709
23710/**
23711 * check if layout is needed post layout
23712 * @returns Boolean
23713 */
23714proto.needsResizeLayout = function() {
23715  var size = getSize( this.element );
23716  // check that this.size and size are there
23717  // IE8 triggers resize on body size change, so they might not be
23718  var hasSizes = this.size && size;
23719  return hasSizes && size.innerWidth !== this.size.innerWidth;
23720};
23721
23722// -------------------------- methods -------------------------- //
23723
23724/**
23725 * add items to Outlayer instance
23726 * @param {Array or NodeList or Element} elems
23727 * @returns {Array} items - Outlayer.Items
23728**/
23729proto.addItems = function( elems ) {
23730  var items = this._itemize( elems );
23731  // add items to collection
23732  if ( items.length ) {
23733    this.items = this.items.concat( items );
23734  }
23735  return items;
23736};
23737
23738/**
23739 * Layout newly-appended item elements
23740 * @param {Array or NodeList or Element} elems
23741 */
23742proto.appended = function( elems ) {
23743  var items = this.addItems( elems );
23744  if ( !items.length ) {
23745    return;
23746  }
23747  // layout and reveal just the new items
23748  this.layoutItems( items, true );
23749  this.reveal( items );
23750};
23751
23752/**
23753 * Layout prepended elements
23754 * @param {Array or NodeList or Element} elems
23755 */
23756proto.prepended = function( elems ) {
23757  var items = this._itemize( elems );
23758  if ( !items.length ) {
23759    return;
23760  }
23761  // add items to beginning of collection
23762  var previousItems = this.items.slice(0);
23763  this.items = items.concat( previousItems );
23764  // start new layout
23765  this._resetLayout();
23766  this._manageStamps();
23767  // layout new stuff without transition
23768  this.layoutItems( items, true );
23769  this.reveal( items );
23770  // layout previous items
23771  this.layoutItems( previousItems );
23772};
23773
23774/**
23775 * reveal a collection of items
23776 * @param {Array of Outlayer.Items} items
23777 */
23778proto.reveal = function( items ) {
23779  this._emitCompleteOnItems( 'reveal', items );
23780  if ( !items || !items.length ) {
23781    return;
23782  }
23783  var stagger = this.updateStagger();
23784  items.forEach( function( item, i ) {
23785    item.stagger( i * stagger );
23786    item.reveal();
23787  });
23788};
23789
23790/**
23791 * hide a collection of items
23792 * @param {Array of Outlayer.Items} items
23793 */
23794proto.hide = function( items ) {
23795  this._emitCompleteOnItems( 'hide', items );
23796  if ( !items || !items.length ) {
23797    return;
23798  }
23799  var stagger = this.updateStagger();
23800  items.forEach( function( item, i ) {
23801    item.stagger( i * stagger );
23802    item.hide();
23803  });
23804};
23805
23806/**
23807 * reveal item elements
23808 * @param {Array}, {Element}, {NodeList} items
23809 */
23810proto.revealItemElements = function( elems ) {
23811  var items = this.getItems( elems );
23812  this.reveal( items );
23813};
23814
23815/**
23816 * hide item elements
23817 * @param {Array}, {Element}, {NodeList} items
23818 */
23819proto.hideItemElements = function( elems ) {
23820  var items = this.getItems( elems );
23821  this.hide( items );
23822};
23823
23824/**
23825 * get Outlayer.Item, given an Element
23826 * @param {Element} elem
23827 * @param {Function} callback
23828 * @returns {Outlayer.Item} item
23829 */
23830proto.getItem = function( elem ) {
23831  // loop through items to get the one that matches
23832  for ( var i=0; i < this.items.length; i++ ) {
23833    var item = this.items[i];
23834    if ( item.element == elem ) {
23835      // return item
23836      return item;
23837    }
23838  }
23839};
23840
23841/**
23842 * get collection of Outlayer.Items, given Elements
23843 * @param {Array} elems
23844 * @returns {Array} items - Outlayer.Items
23845 */
23846proto.getItems = function( elems ) {
23847  elems = utils.makeArray( elems );
23848  var items = [];
23849  elems.forEach( function( elem ) {
23850    var item = this.getItem( elem );
23851    if ( item ) {
23852      items.push( item );
23853    }
23854  }, this );
23855
23856  return items;
23857};
23858
23859/**
23860 * remove element(s) from instance and DOM
23861 * @param {Array or NodeList or Element} elems
23862 */
23863proto.remove = function( elems ) {
23864  var removeItems = this.getItems( elems );
23865
23866  this._emitCompleteOnItems( 'remove', removeItems );
23867
23868  // bail if no items to remove
23869  if ( !removeItems || !removeItems.length ) {
23870    return;
23871  }
23872
23873  removeItems.forEach( function( item ) {
23874    item.remove();
23875    // remove item from collection
23876    utils.removeFrom( this.items, item );
23877  }, this );
23878};
23879
23880// ----- destroy ----- //
23881
23882// remove and disable Outlayer instance
23883proto.destroy = function() {
23884  // clean up dynamic styles
23885  var style = this.element.style;
23886  style.height = '';
23887  style.position = '';
23888  style.width = '';
23889  // destroy items
23890  this.items.forEach( function( item ) {
23891    item.destroy();
23892  });
23893
23894  this.unbindResize();
23895
23896  var id = this.element.outlayerGUID;
23897  delete instances[ id ]; // remove reference to instance by id
23898  delete this.element.outlayerGUID;
23899  // remove data for jQuery
23900  if ( jQuery ) {
23901    jQuery.removeData( this.element, this.constructor.namespace );
23902  }
23903
23904};
23905
23906// -------------------------- data -------------------------- //
23907
23908/**
23909 * get Outlayer instance from element
23910 * @param {Element} elem
23911 * @returns {Outlayer}
23912 */
23913Outlayer.data = function( elem ) {
23914  elem = utils.getQueryElement( elem );
23915  var id = elem && elem.outlayerGUID;
23916  return id && instances[ id ];
23917};
23918
23919
23920// -------------------------- create Outlayer class -------------------------- //
23921
23922/**
23923 * create a layout class
23924 * @param {String} namespace
23925 */
23926Outlayer.create = function( namespace, options ) {
23927  // sub-class Outlayer
23928  var Layout = subclass( Outlayer );
23929  // apply new options and compatOptions
23930  Layout.defaults = utils.extend( {}, Outlayer.defaults );
23931  utils.extend( Layout.defaults, options );
23932  Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions  );
23933
23934  Layout.namespace = namespace;
23935
23936  Layout.data = Outlayer.data;
23937
23938  // sub-class Item
23939  Layout.Item = subclass( Item );
23940
23941  // -------------------------- declarative -------------------------- //
23942
23943  utils.htmlInit( Layout, namespace );
23944
23945  // -------------------------- jQuery bridge -------------------------- //
23946
23947  // make into jQuery plugin
23948  if ( jQuery && jQuery.bridget ) {
23949    jQuery.bridget( namespace, Layout );
23950  }
23951
23952  return Layout;
23953};
23954
23955function subclass( Parent ) {
23956  function SubClass() {
23957    Parent.apply( this, arguments );
23958  }
23959
23960  SubClass.prototype = Object.create( Parent.prototype );
23961  SubClass.prototype.constructor = SubClass;
23962
23963  return SubClass;
23964}
23965
23966// ----- helpers ----- //
23967
23968// how many milliseconds are in each unit
23969var msUnits = {
23970  ms: 1,
23971  s: 1000
23972};
23973
23974// munge time-like parameter into millisecond number
23975// '0.4s' -> 40
23976function getMilliseconds( time ) {
23977  if ( typeof time == 'number' ) {
23978    return time;
23979  }
23980  var matches = time.match( /(^\d*\.?\d*)(\w*)/ );
23981  var num = matches && matches[1];
23982  var unit = matches && matches[2];
23983  if ( !num.length ) {
23984    return 0;
23985  }
23986  num = parseFloat( num );
23987  var mult = msUnits[ unit ] || 1;
23988  return num * mult;
23989}
23990
23991// ----- fin ----- //
23992
23993// back in global
23994Outlayer.Item = Item;
23995
23996return Outlayer;
23997
23998}));
23999
24000},{"./item":40,"ev-emitter":29,"fizzy-ui-utils":30,"get-size":31}],42:[function(require,module,exports){
24001(function (global){(function (){
24002/**!
24003 * @fileOverview Kickass library to create and place poppers near their reference elements.
24004 * @version 1.16.1
24005 * @license
24006 * Copyright (c) 2016 Federico Zivolo and contributors
24007 *
24008 * Permission is hereby granted, free of charge, to any person obtaining a copy
24009 * of this software and associated documentation files (the "Software"), to deal
24010 * in the Software without restriction, including without limitation the rights
24011 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
24012 * copies of the Software, and to permit persons to whom the Software is
24013 * furnished to do so, subject to the following conditions:
24014 *
24015 * The above copyright notice and this permission notice shall be included in all
24016 * copies or substantial portions of the Software.
24017 *
24018 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24019 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24020 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24021 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24022 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24023 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24024 * SOFTWARE.
24025 */
24026(function (global, factory) {
24027	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
24028	typeof define === 'function' && define.amd ? define(factory) :
24029	(global.Popper = factory());
24030}(this, (function () { 'use strict';
24031
24032var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined';
24033
24034var timeoutDuration = function () {
24035  var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];
24036  for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {
24037    if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {
24038      return 1;
24039    }
24040  }
24041  return 0;
24042}();
24043
24044function microtaskDebounce(fn) {
24045  var called = false;
vendor: 3,141 bytes, lines 24046-24171
24046  return function () {
24047    if (called) {
24048      return;
24049    }
24050    called = true;
24051    window.Promise.resolve().then(function () {
24052      called = false;
24053      fn();
24054    });
24055  };
24056}
24057
24058function taskDebounce(fn) {
24059  var scheduled = false;
24060  return function () {
24061    if (!scheduled) {
24062      scheduled = true;
24063      setTimeout(function () {
24064        scheduled = false;
24065        fn();
24066      }, timeoutDuration);
24067    }
24068  };
24069}
24070
24071var supportsMicroTasks = isBrowser && window.Promise;
24072
24073/**
24074* Create a debounced version of a method, that's asynchronously deferred
24075* but called in the minimum time possible.
24076*
24077* @method
24078* @memberof Popper.Utils
24079* @argument {Function} fn
24080* @returns {Function}
24081*/
24082var debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;
24083
24084/**
24085 * Check if the given variable is a function
24086 * @method
24087 * @memberof Popper.Utils
24088 * @argument {Any} functionToCheck - variable to check
24089 * @returns {Boolean} answer to: is a function?
24090 */
24091function isFunction(functionToCheck) {
24092  var getType = {};
24093  return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
24094}
24095
24096/**
24097 * Get CSS computed property of the given element
24098 * @method
24099 * @memberof Popper.Utils
24100 * @argument {Eement} element
24101 * @argument {String} property
24102 */
24103function getStyleComputedProperty(element, property) {
24104  if (element.nodeType !== 1) {
24105    return [];
24106  }
24107  // NOTE: 1 DOM access here
24108  var window = element.ownerDocument.defaultView;
24109  var css = window.getComputedStyle(element, null);
24110  return property ? css[property] : css;
24111}
24112
24113/**
24114 * Returns the parentNode or the host of the element
24115 * @method
24116 * @memberof Popper.Utils
24117 * @argument {Element} element
24118 * @returns {Element} parent
24119 */
24120function getParentNode(element) {
24121  if (element.nodeName === 'HTML') {
24122    return element;
24123  }
24124  return element.parentNode || element.host;
24125}
24126
24127/**
24128 * Returns the scrolling parent of the given element
24129 * @method
24130 * @memberof Popper.Utils
24131 * @argument {Element} element
24132 * @returns {Element} scroll parent
24133 */
24134function getScrollParent(element) {
24135  // Return body, `getScroll` will take care to get the correct `scrollTop` from it
24136  if (!element) {
24137    return document.body;
24138  }
24139
24140  switch (element.nodeName) {
24141    case 'HTML':
24142    case 'BODY':
24143      return element.ownerDocument.body;
24144    case '#document':
24145      return element.body;
24146  }
24147
24148  // Firefox want us to check `-x` and `-y` variations as well
24149
24150  var _getStyleComputedProp = getStyleComputedProperty(element),
24151      overflow = _getStyleComputedProp.overflow,
24152      overflowX = _getStyleComputedProp.overflowX,
24153      overflowY = _getStyleComputedProp.overflowY;
24154
24155  if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {
24156    return element;
24157  }
24158
24159  return getScrollParent(getParentNode(element));
24160}
24161
24162/**
24163 * Returns the reference node of the reference object, or the reference object itself.
24164 * @method
24165 * @memberof Popper.Utils
24166 * @param {Element|Object} reference - the reference element (the popper will be relative to this)
24167 * @returns {Element} parent
24168 */
24169function getReferenceNode(reference) {
24170  return reference && reference.referenceNode ? reference.referenceNode : reference;
24171}
vendor: 3,047 bytes, lines 24171-24277
24171
24172
24173var isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);
24174var isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);
24175
24176/**
24177 * Determines if the browser is Internet Explorer
24178 * @method
24179 * @memberof Popper.Utils
24180 * @param {Number} version to check
24181 * @returns {Boolean} isIE
24182 */
24183function isIE(version) {
24184  if (version === 11) {
24185    return isIE11;
24186  }
24187  if (version === 10) {
24188    return isIE10;
24189  }
24190  return isIE11 || isIE10;
24191}
24192
24193/**
24194 * Returns the offset parent of the given element
24195 * @method
24196 * @memberof Popper.Utils
24197 * @argument {Element} element
24198 * @returns {Element} offset parent
24199 */
24200function getOffsetParent(element) {
24201  if (!element) {
24202    return document.documentElement;
24203  }
24204
24205  var noOffsetParent = isIE(10) ? document.body : null;
24206
24207  // NOTE: 1 DOM access here
24208  var offsetParent = element.offsetParent || null;
24209  // Skip hidden elements which don't have an offsetParent
24210  while (offsetParent === noOffsetParent && element.nextElementSibling) {
24211    offsetParent = (element = element.nextElementSibling).offsetParent;
24212  }
24213
24214  var nodeName = offsetParent && offsetParent.nodeName;
24215
24216  if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {
24217    return element ? element.ownerDocument.documentElement : document.documentElement;
24218  }
24219
24220  // .offsetParent will return the closest TH, TD or TABLE in case
24221  // no offsetParent is present, I hate this job...
24222  if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {
24223    return getOffsetParent(offsetParent);
24224  }
24225
24226  return offsetParent;
24227}
24228
24229function isOffsetContainer(element) {
24230  var nodeName = element.nodeName;
24231
24232  if (nodeName === 'BODY') {
24233    return false;
24234  }
24235  return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;
24236}
24237
24238/**
24239 * Finds the root node (document, shadowDOM root) of the given element
24240 * @method
24241 * @memberof Popper.Utils
24242 * @argument {Element} node
24243 * @returns {Element} root node
24244 */
24245function getRoot(node) {
24246  if (node.parentNode !== null) {
24247    return getRoot(node.parentNode);
24248  }
24249
24250  return node;
24251}
24252
24253/**
24254 * Finds the offset parent common to the two provided nodes
24255 * @method
24256 * @memberof Popper.Utils
24257 * @argument {Element} element1
24258 * @argument {Element} element2
24259 * @returns {Element} common offset parent
24260 */
24261function findCommonOffsetParent(element1, element2) {
24262  // This check is needed to avoid errors in case one of the elements isn't defined for any reason
24263  if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {
24264    return document.documentElement;
24265  }
24266
24267  // Here we make sure to give as "start" the element that comes first in the DOM
24268  var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;
24269  var start = order ? element1 : element2;
24270  var end = order ? element2 : element1;
24271
24272  // Get common ancestor container
24273  var range = document.createRange();
24274  range.setStart(start, 0);
24275  range.setEnd(end, 0);
24276  var commonAncestorContainer = range.commonAncestorContainer;
24277
vendor: 5,354 bytes, lines 24278-24455
24278  // Both nodes are inside #document
24279
24280  if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {
24281    if (isOffsetContainer(commonAncestorContainer)) {
24282      return commonAncestorContainer;
24283    }
24284
24285    return getOffsetParent(commonAncestorContainer);
24286  }
24287
24288  // one of the nodes is inside shadowDOM, find which one
24289  var element1root = getRoot(element1);
24290  if (element1root.host) {
24291    return findCommonOffsetParent(element1root.host, element2);
24292  } else {
24293    return findCommonOffsetParent(element1, getRoot(element2).host);
24294  }
24295}
24296
24297/**
24298 * Gets the scroll value of the given element in the given side (top and left)
24299 * @method
24300 * @memberof Popper.Utils
24301 * @argument {Element} element
24302 * @argument {String} side `top` or `left`
24303 * @returns {number} amount of scrolled pixels
24304 */
24305function getScroll(element) {
24306  var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';
24307
24308  var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';
24309  var nodeName = element.nodeName;
24310
24311  if (nodeName === 'BODY' || nodeName === 'HTML') {
24312    var html = element.ownerDocument.documentElement;
24313    var scrollingElement = element.ownerDocument.scrollingElement || html;
24314    return scrollingElement[upperSide];
24315  }
24316
24317  return element[upperSide];
24318}
24319
24320/*
24321 * Sum or subtract the element scroll values (left and top) from a given rect object
24322 * @method
24323 * @memberof Popper.Utils
24324 * @param {Object} rect - Rect object you want to change
24325 * @param {HTMLElement} element - The element from the function reads the scroll values
24326 * @param {Boolean} subtract - set to true if you want to subtract the scroll values
24327 * @return {Object} rect - The modifier rect object
24328 */
24329function includeScroll(rect, element) {
24330  var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
24331
24332  var scrollTop = getScroll(element, 'top');
24333  var scrollLeft = getScroll(element, 'left');
24334  var modifier = subtract ? -1 : 1;
24335  rect.top += scrollTop * modifier;
24336  rect.bottom += scrollTop * modifier;
24337  rect.left += scrollLeft * modifier;
24338  rect.right += scrollLeft * modifier;
24339  return rect;
24340}
24341
24342/*
24343 * Helper to detect borders of a given element
24344 * @method
24345 * @memberof Popper.Utils
24346 * @param {CSSStyleDeclaration} styles
24347 * Result of `getStyleComputedProperty` on the given element
24348 * @param {String} axis - `x` or `y`
24349 * @return {number} borders - The borders size of the given axis
24350 */
24351
24352function getBordersSize(styles, axis) {
24353  var sideA = axis === 'x' ? 'Left' : 'Top';
24354  var sideB = sideA === 'Left' ? 'Right' : 'Bottom';
24355
24356  return parseFloat(styles['border' + sideA + 'Width']) + parseFloat(styles['border' + sideB + 'Width']);
24357}
24358
24359function getSize(axis, body, html, computedStyle) {
24360  return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);
24361}
24362
24363function getWindowSizes(document) {
24364  var body = document.body;
24365  var html = document.documentElement;
24366  var computedStyle = isIE(10) && getComputedStyle(html);
24367
24368  return {
24369    height: getSize('Height', body, html, computedStyle),
24370    width: getSize('Width', body, html, computedStyle)
24371  };
24372}
24373
24374var classCallCheck = function (instance, Constructor) {
24375  if (!(instance instanceof Constructor)) {
24376    throw new TypeError("Cannot call a class as a function");
24377  }
24378};
24379
24380var createClass = function () {
24381  function defineProperties(target, props) {
24382    for (var i = 0; i < props.length; i++) {
24383      var descriptor = props[i];
24384      descriptor.enumerable = descriptor.enumerable || false;
24385      descriptor.configurable = true;
24386      if ("value" in descriptor) descriptor.writable = true;
24387      Object.defineProperty(target, descriptor.key, descriptor);
24388    }
24389  }
24390
24391  return function (Constructor, protoProps, staticProps) {
24392    if (protoProps) defineProperties(Constructor.prototype, protoProps);
24393    if (staticProps) defineProperties(Constructor, staticProps);
24394    return Constructor;
24395  };
24396}();
24397
24398
24399
24400
24401
24402var defineProperty = function (obj, key, value) {
24403  if (key in obj) {
24404    Object.defineProperty(obj, key, {
24405      value: value,
24406      enumerable: true,
24407      configurable: true,
24408      writable: true
24409    });
24410  } else {
24411    obj[key] = value;
24412  }
24413
24414  return obj;
24415};
24416
24417var _extends = Object.assign || function (target) {
24418  for (var i = 1; i < arguments.length; i++) {
24419    var source = arguments[i];
24420
24421    for (var key in source) {
24422      if (Object.prototype.hasOwnProperty.call(source, key)) {
24423        target[key] = source[key];
24424      }
24425    }
24426  }
24427
24428  return target;
24429};
24430
24431/**
24432 * Given element offsets, generate an output similar to getBoundingClientRect
24433 * @method
24434 * @memberof Popper.Utils
24435 * @argument {Object} offsets
24436 * @returns {Object} ClientRect like output
24437 */
24438function getClientRect(offsets) {
24439  return _extends({}, offsets, {
24440    right: offsets.left + offsets.width,
24441    bottom: offsets.top + offsets.height
24442  });
24443}
24444
24445/**
24446 * Get bounding client rect of given element
24447 * @method
24448 * @memberof Popper.Utils
24449 * @param {HTMLElement} element
24450 * @return {Object} client rect
24451 */
24452function getBoundingClientRect(element) {
24453  var rect = {};
24454
24455  // IE10 10 FIX: Please, don't ask, the element isn't
vendor: 4,625 bytes, lines 24456-24585
24456  // considered in DOM in some circumstances...
24457  // This isn't reproducible in IE10 compatibility mode of IE11
24458  try {
24459    if (isIE(10)) {
24460      rect = element.getBoundingClientRect();
24461      var scrollTop = getScroll(element, 'top');
24462      var scrollLeft = getScroll(element, 'left');
24463      rect.top += scrollTop;
24464      rect.left += scrollLeft;
24465      rect.bottom += scrollTop;
24466      rect.right += scrollLeft;
24467    } else {
24468      rect = element.getBoundingClientRect();
24469    }
24470  } catch (e) {}
24471
24472  var result = {
24473    left: rect.left,
24474    top: rect.top,
24475    width: rect.right - rect.left,
24476    height: rect.bottom - rect.top
24477  };
24478
24479  // subtract scrollbar size from sizes
24480  var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};
24481  var width = sizes.width || element.clientWidth || result.width;
24482  var height = sizes.height || element.clientHeight || result.height;
24483
24484  var horizScrollbar = element.offsetWidth - width;
24485  var vertScrollbar = element.offsetHeight - height;
24486
24487  // if an hypothetical scrollbar is detected, we must be sure it's not a `border`
24488  // we make this check conditional for performance reasons
24489  if (horizScrollbar || vertScrollbar) {
24490    var styles = getStyleComputedProperty(element);
24491    horizScrollbar -= getBordersSize(styles, 'x');
24492    vertScrollbar -= getBordersSize(styles, 'y');
24493
24494    result.width -= horizScrollbar;
24495    result.height -= vertScrollbar;
24496  }
24497
24498  return getClientRect(result);
24499}
24500
24501function getOffsetRectRelativeToArbitraryNode(children, parent) {
24502  var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
24503
24504  var isIE10 = isIE(10);
24505  var isHTML = parent.nodeName === 'HTML';
24506  var childrenRect = getBoundingClientRect(children);
24507  var parentRect = getBoundingClientRect(parent);
24508  var scrollParent = getScrollParent(children);
24509
24510  var styles = getStyleComputedProperty(parent);
24511  var borderTopWidth = parseFloat(styles.borderTopWidth);
24512  var borderLeftWidth = parseFloat(styles.borderLeftWidth);
24513
24514  // In cases where the parent is fixed, we must ignore negative scroll in offset calc
24515  if (fixedPosition && isHTML) {
24516    parentRect.top = Math.max(parentRect.top, 0);
24517    parentRect.left = Math.max(parentRect.left, 0);
24518  }
24519  var offsets = getClientRect({
24520    top: childrenRect.top - parentRect.top - borderTopWidth,
24521    left: childrenRect.left - parentRect.left - borderLeftWidth,
24522    width: childrenRect.width,
24523    height: childrenRect.height
24524  });
24525  offsets.marginTop = 0;
24526  offsets.marginLeft = 0;
24527
24528  // Subtract margins of documentElement in case it's being used as parent
24529  // we do this only on HTML because it's the only element that behaves
24530  // differently when margins are applied to it. The margins are included in
24531  // the box of the documentElement, in the other cases not.
24532  if (!isIE10 && isHTML) {
24533    var marginTop = parseFloat(styles.marginTop);
24534    var marginLeft = parseFloat(styles.marginLeft);
24535
24536    offsets.top -= borderTopWidth - marginTop;
24537    offsets.bottom -= borderTopWidth - marginTop;
24538    offsets.left -= borderLeftWidth - marginLeft;
24539    offsets.right -= borderLeftWidth - marginLeft;
24540
24541    // Attach marginTop and marginLeft because in some circumstances we may need them
24542    offsets.marginTop = marginTop;
24543    offsets.marginLeft = marginLeft;
24544  }
24545
24546  if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {
24547    offsets = includeScroll(offsets, parent);
24548  }
24549
24550  return offsets;
24551}
24552
24553function getViewportOffsetRectRelativeToArtbitraryNode(element) {
24554  var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
24555
24556  var html = element.ownerDocument.documentElement;
24557  var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);
24558  var width = Math.max(html.clientWidth, window.innerWidth || 0);
24559  var height = Math.max(html.clientHeight, window.innerHeight || 0);
24560
24561  var scrollTop = !excludeScroll ? getScroll(html) : 0;
24562  var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;
24563
24564  var offset = {
24565    top: scrollTop - relativeOffset.top + relativeOffset.marginTop,
24566    left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,
24567    width: width,
24568    height: height
24569  };
24570
24571  return getClientRect(offset);
24572}
24573
24574/**
24575 * Check if the given element is fixed or is inside a fixed parent
24576 * @method
24577 * @memberof Popper.Utils
24578 * @argument {Element} element
24579 * @argument {Element} customContainer
24580 * @returns {Boolean} answer to "isFixed?"
24581 */
24582function isFixed(element) {
24583  var nodeName = element.nodeName;
24584  if (nodeName === 'BODY' || nodeName === 'HTML') {
24585    return false;
vendor: 51,450 bytes, lines 24586-26084
24586  }
24587  if (getStyleComputedProperty(element, 'position') === 'fixed') {
24588    return true;
24589  }
24590  var parentNode = getParentNode(element);
24591  if (!parentNode) {
24592    return false;
24593  }
24594  return isFixed(parentNode);
24595}
24596
24597/**
24598 * Finds the first parent of an element that has a transformed property defined
24599 * @method
24600 * @memberof Popper.Utils
24601 * @argument {Element} element
24602 * @returns {Element} first transformed parent or documentElement
24603 */
24604
24605function getFixedPositionOffsetParent(element) {
24606  // This check is needed to avoid errors in case one of the elements isn't defined for any reason
24607  if (!element || !element.parentElement || isIE()) {
24608    return document.documentElement;
24609  }
24610  var el = element.parentElement;
24611  while (el && getStyleComputedProperty(el, 'transform') === 'none') {
24612    el = el.parentElement;
24613  }
24614  return el || document.documentElement;
24615}
24616
24617/**
24618 * Computed the boundaries limits and return them
24619 * @method
24620 * @memberof Popper.Utils
24621 * @param {HTMLElement} popper
24622 * @param {HTMLElement} reference
24623 * @param {number} padding
24624 * @param {HTMLElement} boundariesElement - Element used to define the boundaries
24625 * @param {Boolean} fixedPosition - Is in fixed position mode
24626 * @returns {Object} Coordinates of the boundaries
24627 */
24628function getBoundaries(popper, reference, padding, boundariesElement) {
24629  var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
24630
24631  // NOTE: 1 DOM access here
24632
24633  var boundaries = { top: 0, left: 0 };
24634  var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));
24635
24636  // Handle viewport case
24637  if (boundariesElement === 'viewport') {
24638    boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);
24639  } else {
24640    // Handle other cases based on DOM element used as boundaries
24641    var boundariesNode = void 0;
24642    if (boundariesElement === 'scrollParent') {
24643      boundariesNode = getScrollParent(getParentNode(reference));
24644      if (boundariesNode.nodeName === 'BODY') {
24645        boundariesNode = popper.ownerDocument.documentElement;
24646      }
24647    } else if (boundariesElement === 'window') {
24648      boundariesNode = popper.ownerDocument.documentElement;
24649    } else {
24650      boundariesNode = boundariesElement;
24651    }
24652
24653    var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);
24654
24655    // In case of HTML, we need a different computation
24656    if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {
24657      var _getWindowSizes = getWindowSizes(popper.ownerDocument),
24658          height = _getWindowSizes.height,
24659          width = _getWindowSizes.width;
24660
24661      boundaries.top += offsets.top - offsets.marginTop;
24662      boundaries.bottom = height + offsets.top;
24663      boundaries.left += offsets.left - offsets.marginLeft;
24664      boundaries.right = width + offsets.left;
24665    } else {
24666      // for all the other DOM elements, this one is good
24667      boundaries = offsets;
24668    }
24669  }
24670
24671  // Add paddings
24672  padding = padding || 0;
24673  var isPaddingNumber = typeof padding === 'number';
24674  boundaries.left += isPaddingNumber ? padding : padding.left || 0;
24675  boundaries.top += isPaddingNumber ? padding : padding.top || 0;
24676  boundaries.right -= isPaddingNumber ? padding : padding.right || 0;
24677  boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;
24678
24679  return boundaries;
24680}
24681
24682function getArea(_ref) {
24683  var width = _ref.width,
24684      height = _ref.height;
24685
24686  return width * height;
24687}
24688
24689/**
24690 * Utility used to transform the `auto` placement to the placement with more
24691 * available space.
24692 * @method
24693 * @memberof Popper.Utils
24694 * @argument {Object} data - The data object generated by update method
24695 * @argument {Object} options - Modifiers configuration and options
24696 * @returns {Object} The data object, properly modified
24697 */
24698function computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {
24699  var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;
24700
24701  if (placement.indexOf('auto') === -1) {
24702    return placement;
24703  }
24704
24705  var boundaries = getBoundaries(popper, reference, padding, boundariesElement);
24706
24707  var rects = {
24708    top: {
24709      width: boundaries.width,
24710      height: refRect.top - boundaries.top
24711    },
24712    right: {
24713      width: boundaries.right - refRect.right,
24714      height: boundaries.height
24715    },
24716    bottom: {
24717      width: boundaries.width,
24718      height: boundaries.bottom - refRect.bottom
24719    },
24720    left: {
24721      width: refRect.left - boundaries.left,
24722      height: boundaries.height
24723    }
24724  };
24725
24726  var sortedAreas = Object.keys(rects).map(function (key) {
24727    return _extends({
24728      key: key
24729    }, rects[key], {
24730      area: getArea(rects[key])
24731    });
24732  }).sort(function (a, b) {
24733    return b.area - a.area;
24734  });
24735
24736  var filteredAreas = sortedAreas.filter(function (_ref2) {
24737    var width = _ref2.width,
24738        height = _ref2.height;
24739    return width >= popper.clientWidth && height >= popper.clientHeight;
24740  });
24741
24742  var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;
24743
24744  var variation = placement.split('-')[1];
24745
24746  return computedPlacement + (variation ? '-' + variation : '');
24747}
24748
24749/**
24750 * Get offsets to the reference element
24751 * @method
24752 * @memberof Popper.Utils
24753 * @param {Object} state
24754 * @param {Element} popper - the popper element
24755 * @param {Element} reference - the reference element (the popper will be relative to this)
24756 * @param {Element} fixedPosition - is in fixed position mode
24757 * @returns {Object} An object containing the offsets which will be applied to the popper
24758 */
24759function getReferenceOffsets(state, popper, reference) {
24760  var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
24761
24762  var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));
24763  return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);
24764}
24765
24766/**
24767 * Get the outer sizes of the given element (offset size + margins)
24768 * @method
24769 * @memberof Popper.Utils
24770 * @argument {Element} element
24771 * @returns {Object} object containing width and height properties
24772 */
24773function getOuterSizes(element) {
24774  var window = element.ownerDocument.defaultView;
24775  var styles = window.getComputedStyle(element);
24776  var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);
24777  var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);
24778  var result = {
24779    width: element.offsetWidth + y,
24780    height: element.offsetHeight + x
24781  };
24782  return result;
24783}
24784
24785/**
24786 * Get the opposite placement of the given one
24787 * @method
24788 * @memberof Popper.Utils
24789 * @argument {String} placement
24790 * @returns {String} flipped placement
24791 */
24792function getOppositePlacement(placement) {
24793  var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };
24794  return placement.replace(/left|right|bottom|top/g, function (matched) {
24795    return hash[matched];
24796  });
24797}
24798
24799/**
24800 * Get offsets to the popper
24801 * @method
24802 * @memberof Popper.Utils
24803 * @param {Object} position - CSS position the Popper will get applied
24804 * @param {HTMLElement} popper - the popper element
24805 * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)
24806 * @param {String} placement - one of the valid placement options
24807 * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper
24808 */
24809function getPopperOffsets(popper, referenceOffsets, placement) {
24810  placement = placement.split('-')[0];
24811
24812  // Get popper node sizes
24813  var popperRect = getOuterSizes(popper);
24814
24815  // Add position, width and height to our offsets object
24816  var popperOffsets = {
24817    width: popperRect.width,
24818    height: popperRect.height
24819  };
24820
24821  // depending by the popper placement we have to compute its offsets slightly differently
24822  var isHoriz = ['right', 'left'].indexOf(placement) !== -1;
24823  var mainSide = isHoriz ? 'top' : 'left';
24824  var secondarySide = isHoriz ? 'left' : 'top';
24825  var measurement = isHoriz ? 'height' : 'width';
24826  var secondaryMeasurement = !isHoriz ? 'height' : 'width';
24827
24828  popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;
24829  if (placement === secondarySide) {
24830    popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];
24831  } else {
24832    popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];
24833  }
24834
24835  return popperOffsets;
24836}
24837
24838/**
24839 * Mimics the `find` method of Array
24840 * @method
24841 * @memberof Popper.Utils
24842 * @argument {Array} arr
24843 * @argument prop
24844 * @argument value
24845 * @returns index or -1
24846 */
24847function find(arr, check) {
24848  // use native find if supported
24849  if (Array.prototype.find) {
24850    return arr.find(check);
24851  }
24852
24853  // use `filter` to obtain the same behavior of `find`
24854  return arr.filter(check)[0];
24855}
24856
24857/**
24858 * Return the index of the matching object
24859 * @method
24860 * @memberof Popper.Utils
24861 * @argument {Array} arr
24862 * @argument prop
24863 * @argument value
24864 * @returns index or -1
24865 */
24866function findIndex(arr, prop, value) {
24867  // use native findIndex if supported
24868  if (Array.prototype.findIndex) {
24869    return arr.findIndex(function (cur) {
24870      return cur[prop] === value;
24871    });
24872  }
24873
24874  // use `find` + `indexOf` if `findIndex` isn't supported
24875  var match = find(arr, function (obj) {
24876    return obj[prop] === value;
24877  });
24878  return arr.indexOf(match);
24879}
24880
24881/**
24882 * Loop trough the list of modifiers and run them in order,
24883 * each of them will then edit the data object.
24884 * @method
24885 * @memberof Popper.Utils
24886 * @param {dataObject} data
24887 * @param {Array} modifiers
24888 * @param {String} ends - Optional modifier name used as stopper
24889 * @returns {dataObject}
24890 */
24891function runModifiers(modifiers, data, ends) {
24892  var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));
24893
24894  modifiersToRun.forEach(function (modifier) {
24895    if (modifier['function']) {
24896      // eslint-disable-line dot-notation
24897      console.warn('`modifier.function` is deprecated, use `modifier.fn`!');
24898    }
24899    var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation
24900    if (modifier.enabled && isFunction(fn)) {
24901      // Add properties to offsets to make them a complete clientRect object
24902      // we do this before each modifier to make sure the previous one doesn't
24903      // mess with these values
24904      data.offsets.popper = getClientRect(data.offsets.popper);
24905      data.offsets.reference = getClientRect(data.offsets.reference);
24906
24907      data = fn(data, modifier);
24908    }
24909  });
24910
24911  return data;
24912}
24913
24914/**
24915 * Updates the position of the popper, computing the new offsets and applying
24916 * the new style.<br />
24917 * Prefer `scheduleUpdate` over `update` because of performance reasons.
24918 * @method
24919 * @memberof Popper
24920 */
24921function update() {
24922  // if popper is destroyed, don't perform any further update
24923  if (this.state.isDestroyed) {
24924    return;
24925  }
24926
24927  var data = {
24928    instance: this,
24929    styles: {},
24930    arrowStyles: {},
24931    attributes: {},
24932    flipped: false,
24933    offsets: {}
24934  };
24935
24936  // compute reference element offsets
24937  data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);
24938
24939  // compute auto placement, store placement inside the data object,
24940  // modifiers will be able to edit `placement` if needed
24941  // and refer to originalPlacement to know the original value
24942  data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);
24943
24944  // store the computed placement inside `originalPlacement`
24945  data.originalPlacement = data.placement;
24946
24947  data.positionFixed = this.options.positionFixed;
24948
24949  // compute the popper offsets
24950  data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);
24951
24952  data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';
24953
24954  // run the modifiers
24955  data = runModifiers(this.modifiers, data);
24956
24957  // the first `update` will call `onCreate` callback
24958  // the other ones will call `onUpdate` callback
24959  if (!this.state.isCreated) {
24960    this.state.isCreated = true;
24961    this.options.onCreate(data);
24962  } else {
24963    this.options.onUpdate(data);
24964  }
24965}
24966
24967/**
24968 * Helper used to know if the given modifier is enabled.
24969 * @method
24970 * @memberof Popper.Utils
24971 * @returns {Boolean}
24972 */
24973function isModifierEnabled(modifiers, modifierName) {
24974  return modifiers.some(function (_ref) {
24975    var name = _ref.name,
24976        enabled = _ref.enabled;
24977    return enabled && name === modifierName;
24978  });
24979}
24980
24981/**
24982 * Get the prefixed supported property name
24983 * @method
24984 * @memberof Popper.Utils
24985 * @argument {String} property (camelCase)
24986 * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)
24987 */
24988function getSupportedPropertyName(property) {
24989  var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];
24990  var upperProp = property.charAt(0).toUpperCase() + property.slice(1);
24991
24992  for (var i = 0; i < prefixes.length; i++) {
24993    var prefix = prefixes[i];
24994    var toCheck = prefix ? '' + prefix + upperProp : property;
24995    if (typeof document.body.style[toCheck] !== 'undefined') {
24996      return toCheck;
24997    }
24998  }
24999  return null;
25000}
25001
25002/**
25003 * Destroys the popper.
25004 * @method
25005 * @memberof Popper
25006 */
25007function destroy() {
25008  this.state.isDestroyed = true;
25009
25010  // touch DOM only if `applyStyle` modifier is enabled
25011  if (isModifierEnabled(this.modifiers, 'applyStyle')) {
25012    this.popper.removeAttribute('x-placement');
25013    this.popper.style.position = '';
25014    this.popper.style.top = '';
25015    this.popper.style.left = '';
25016    this.popper.style.right = '';
25017    this.popper.style.bottom = '';
25018    this.popper.style.willChange = '';
25019    this.popper.style[getSupportedPropertyName('transform')] = '';
25020  }
25021
25022  this.disableEventListeners();
25023
25024  // remove the popper if user explicitly asked for the deletion on destroy
25025  // do not use `remove` because IE11 doesn't support it
25026  if (this.options.removeOnDestroy) {
25027    this.popper.parentNode.removeChild(this.popper);
25028  }
25029  return this;
25030}
25031
25032/**
25033 * Get the window associated with the element
25034 * @argument {Element} element
25035 * @returns {Window}
25036 */
25037function getWindow(element) {
25038  var ownerDocument = element.ownerDocument;
25039  return ownerDocument ? ownerDocument.defaultView : window;
25040}
25041
25042function attachToScrollParents(scrollParent, event, callback, scrollParents) {
25043  var isBody = scrollParent.nodeName === 'BODY';
25044  var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;
25045  target.addEventListener(event, callback, { passive: true });
25046
25047  if (!isBody) {
25048    attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);
25049  }
25050  scrollParents.push(target);
25051}
25052
25053/**
25054 * Setup needed event listeners used to update the popper position
25055 * @method
25056 * @memberof Popper.Utils
25057 * @private
25058 */
25059function setupEventListeners(reference, options, state, updateBound) {
25060  // Resize event listener on window
25061  state.updateBound = updateBound;
25062  getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });
25063
25064  // Scroll event listener on scroll parents
25065  var scrollElement = getScrollParent(reference);
25066  attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);
25067  state.scrollElement = scrollElement;
25068  state.eventsEnabled = true;
25069
25070  return state;
25071}
25072
25073/**
25074 * It will add resize/scroll events and start recalculating
25075 * position of the popper element when they are triggered.
25076 * @method
25077 * @memberof Popper
25078 */
25079function enableEventListeners() {
25080  if (!this.state.eventsEnabled) {
25081    this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);
25082  }
25083}
25084
25085/**
25086 * Remove event listeners used to update the popper position
25087 * @method
25088 * @memberof Popper.Utils
25089 * @private
25090 */
25091function removeEventListeners(reference, state) {
25092  // Remove resize event listener on window
25093  getWindow(reference).removeEventListener('resize', state.updateBound);
25094
25095  // Remove scroll event listener on scroll parents
25096  state.scrollParents.forEach(function (target) {
25097    target.removeEventListener('scroll', state.updateBound);
25098  });
25099
25100  // Reset state
25101  state.updateBound = null;
25102  state.scrollParents = [];
25103  state.scrollElement = null;
25104  state.eventsEnabled = false;
25105  return state;
25106}
25107
25108/**
25109 * It will remove resize/scroll events and won't recalculate popper position
25110 * when they are triggered. It also won't trigger `onUpdate` callback anymore,
25111 * unless you call `update` method manually.
25112 * @method
25113 * @memberof Popper
25114 */
25115function disableEventListeners() {
25116  if (this.state.eventsEnabled) {
25117    cancelAnimationFrame(this.scheduleUpdate);
25118    this.state = removeEventListeners(this.reference, this.state);
25119  }
25120}
25121
25122/**
25123 * Tells if a given input is a number
25124 * @method
25125 * @memberof Popper.Utils
25126 * @param {*} input to check
25127 * @return {Boolean}
25128 */
25129function isNumeric(n) {
25130  return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);
25131}
25132
25133/**
25134 * Set the style to the given popper
25135 * @method
25136 * @memberof Popper.Utils
25137 * @argument {Element} element - Element to apply the style to
25138 * @argument {Object} styles
25139 * Object with a list of properties and values which will be applied to the element
25140 */
25141function setStyles(element, styles) {
25142  Object.keys(styles).forEach(function (prop) {
25143    var unit = '';
25144    // add unit if the value is numeric and is one of the following
25145    if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {
25146      unit = 'px';
25147    }
25148    element.style[prop] = styles[prop] + unit;
25149  });
25150}
25151
25152/**
25153 * Set the attributes to the given popper
25154 * @method
25155 * @memberof Popper.Utils
25156 * @argument {Element} element - Element to apply the attributes to
25157 * @argument {Object} styles
25158 * Object with a list of properties and values which will be applied to the element
25159 */
25160function setAttributes(element, attributes) {
25161  Object.keys(attributes).forEach(function (prop) {
25162    var value = attributes[prop];
25163    if (value !== false) {
25164      element.setAttribute(prop, attributes[prop]);
25165    } else {
25166      element.removeAttribute(prop);
25167    }
25168  });
25169}
25170
25171/**
25172 * @function
25173 * @memberof Modifiers
25174 * @argument {Object} data - The data object generated by `update` method
25175 * @argument {Object} data.styles - List of style properties - values to apply to popper element
25176 * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element
25177 * @argument {Object} options - Modifiers configuration and options
25178 * @returns {Object} The same data object
25179 */
25180function applyStyle(data) {
25181  // any property present in `data.styles` will be applied to the popper,
25182  // in this way we can make the 3rd party modifiers add custom styles to it
25183  // Be aware, modifiers could override the properties defined in the previous
25184  // lines of this modifier!
25185  setStyles(data.instance.popper, data.styles);
25186
25187  // any property present in `data.attributes` will be applied to the popper,
25188  // they will be set as HTML attributes of the element
25189  setAttributes(data.instance.popper, data.attributes);
25190
25191  // if arrowElement is defined and arrowStyles has some properties
25192  if (data.arrowElement && Object.keys(data.arrowStyles).length) {
25193    setStyles(data.arrowElement, data.arrowStyles);
25194  }
25195
25196  return data;
25197}
25198
25199/**
25200 * Set the x-placement attribute before everything else because it could be used
25201 * to add margins to the popper margins needs to be calculated to get the
25202 * correct popper offsets.
25203 * @method
25204 * @memberof Popper.modifiers
25205 * @param {HTMLElement} reference - The reference element used to position the popper
25206 * @param {HTMLElement} popper - The HTML element used as popper
25207 * @param {Object} options - Popper.js options
25208 */
25209function applyStyleOnLoad(reference, popper, options, modifierOptions, state) {
25210  // compute reference element offsets
25211  var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);
25212
25213  // compute auto placement, store placement inside the data object,
25214  // modifiers will be able to edit `placement` if needed
25215  // and refer to originalPlacement to know the original value
25216  var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);
25217
25218  popper.setAttribute('x-placement', placement);
25219
25220  // Apply `position` to popper before anything else because
25221  // without the position applied we can't guarantee correct computations
25222  setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });
25223
25224  return options;
25225}
25226
25227/**
25228 * @function
25229 * @memberof Popper.Utils
25230 * @argument {Object} data - The data object generated by `update` method
25231 * @argument {Boolean} shouldRound - If the offsets should be rounded at all
25232 * @returns {Object} The popper's position offsets rounded
25233 *
25234 * The tale of pixel-perfect positioning. It's still not 100% perfect, but as
25235 * good as it can be within reason.
25236 * Discussion here: https://github.com/FezVrasta/popper.js/pull/715
25237 *
25238 * Low DPI screens cause a popper to be blurry if not using full pixels (Safari
25239 * as well on High DPI screens).
25240 *
25241 * Firefox prefers no rounding for positioning and does not have blurriness on
25242 * high DPI screens.
25243 *
25244 * Only horizontal placement and left/right values need to be considered.
25245 */
25246function getRoundedOffsets(data, shouldRound) {
25247  var _data$offsets = data.offsets,
25248      popper = _data$offsets.popper,
25249      reference = _data$offsets.reference;
25250  var round = Math.round,
25251      floor = Math.floor;
25252
25253  var noRound = function noRound(v) {
25254    return v;
25255  };
25256
25257  var referenceWidth = round(reference.width);
25258  var popperWidth = round(popper.width);
25259
25260  var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;
25261  var isVariation = data.placement.indexOf('-') !== -1;
25262  var sameWidthParity = referenceWidth % 2 === popperWidth % 2;
25263  var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;
25264
25265  var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;
25266  var verticalToInteger = !shouldRound ? noRound : round;
25267
25268  return {
25269    left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),
25270    top: verticalToInteger(popper.top),
25271    bottom: verticalToInteger(popper.bottom),
25272    right: horizontalToInteger(popper.right)
25273  };
25274}
25275
25276var isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);
25277
25278/**
25279 * @function
25280 * @memberof Modifiers
25281 * @argument {Object} data - The data object generated by `update` method
25282 * @argument {Object} options - Modifiers configuration and options
25283 * @returns {Object} The data object, properly modified
25284 */
25285function computeStyle(data, options) {
25286  var x = options.x,
25287      y = options.y;
25288  var popper = data.offsets.popper;
25289
25290  // Remove this legacy support in Popper.js v2
25291
25292  var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {
25293    return modifier.name === 'applyStyle';
25294  }).gpuAcceleration;
25295  if (legacyGpuAccelerationOption !== undefined) {
25296    console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');
25297  }
25298  var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;
25299
25300  var offsetParent = getOffsetParent(data.instance.popper);
25301  var offsetParentRect = getBoundingClientRect(offsetParent);
25302
25303  // Styles
25304  var styles = {
25305    position: popper.position
25306  };
25307
25308  var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);
25309
25310  var sideA = x === 'bottom' ? 'top' : 'bottom';
25311  var sideB = y === 'right' ? 'left' : 'right';
25312
25313  // if gpuAcceleration is set to `true` and transform is supported,
25314  //  we use `translate3d` to apply the position to the popper we
25315  // automatically use the supported prefixed version if needed
25316  var prefixedProperty = getSupportedPropertyName('transform');
25317
25318  // now, let's make a step back and look at this code closely (wtf?)
25319  // If the content of the popper grows once it's been positioned, it
25320  // may happen that the popper gets misplaced because of the new content
25321  // overflowing its reference element
25322  // To avoid this problem, we provide two options (x and y), which allow
25323  // the consumer to define the offset origin.
25324  // If we position a popper on top of a reference element, we can set
25325  // `x` to `top` to make the popper grow towards its top instead of
25326  // its bottom.
25327  var left = void 0,
25328      top = void 0;
25329  if (sideA === 'bottom') {
25330    // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)
25331    // and not the bottom of the html element
25332    if (offsetParent.nodeName === 'HTML') {
25333      top = -offsetParent.clientHeight + offsets.bottom;
25334    } else {
25335      top = -offsetParentRect.height + offsets.bottom;
25336    }
25337  } else {
25338    top = offsets.top;
25339  }
25340  if (sideB === 'right') {
25341    if (offsetParent.nodeName === 'HTML') {
25342      left = -offsetParent.clientWidth + offsets.right;
25343    } else {
25344      left = -offsetParentRect.width + offsets.right;
25345    }
25346  } else {
25347    left = offsets.left;
25348  }
25349  if (gpuAcceleration && prefixedProperty) {
25350    styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';
25351    styles[sideA] = 0;
25352    styles[sideB] = 0;
25353    styles.willChange = 'transform';
25354  } else {
25355    // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties
25356    var invertTop = sideA === 'bottom' ? -1 : 1;
25357    var invertLeft = sideB === 'right' ? -1 : 1;
25358    styles[sideA] = top * invertTop;
25359    styles[sideB] = left * invertLeft;
25360    styles.willChange = sideA + ', ' + sideB;
25361  }
25362
25363  // Attributes
25364  var attributes = {
25365    'x-placement': data.placement
25366  };
25367
25368  // Update `data` attributes, styles and arrowStyles
25369  data.attributes = _extends({}, attributes, data.attributes);
25370  data.styles = _extends({}, styles, data.styles);
25371  data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);
25372
25373  return data;
25374}
25375
25376/**
25377 * Helper used to know if the given modifier depends from another one.<br />
25378 * It checks if the needed modifier is listed and enabled.
25379 * @method
25380 * @memberof Popper.Utils
25381 * @param {Array} modifiers - list of modifiers
25382 * @param {String} requestingName - name of requesting modifier
25383 * @param {String} requestedName - name of requested modifier
25384 * @returns {Boolean}
25385 */
25386function isModifierRequired(modifiers, requestingName, requestedName) {
25387  var requesting = find(modifiers, function (_ref) {
25388    var name = _ref.name;
25389    return name === requestingName;
25390  });
25391
25392  var isRequired = !!requesting && modifiers.some(function (modifier) {
25393    return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;
25394  });
25395
25396  if (!isRequired) {
25397    var _requesting = '`' + requestingName + '`';
25398    var requested = '`' + requestedName + '`';
25399    console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');
25400  }
25401  return isRequired;
25402}
25403
25404/**
25405 * @function
25406 * @memberof Modifiers
25407 * @argument {Object} data - The data object generated by update method
25408 * @argument {Object} options - Modifiers configuration and options
25409 * @returns {Object} The data object, properly modified
25410 */
25411function arrow(data, options) {
25412  var _data$offsets$arrow;
25413
25414  // arrow depends on keepTogether in order to work
25415  if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {
25416    return data;
25417  }
25418
25419  var arrowElement = options.element;
25420
25421  // if arrowElement is a string, suppose it's a CSS selector
25422  if (typeof arrowElement === 'string') {
25423    arrowElement = data.instance.popper.querySelector(arrowElement);
25424
25425    // if arrowElement is not found, don't run the modifier
25426    if (!arrowElement) {
25427      return data;
25428    }
25429  } else {
25430    // if the arrowElement isn't a query selector we must check that the
25431    // provided DOM node is child of its popper node
25432    if (!data.instance.popper.contains(arrowElement)) {
25433      console.warn('WARNING: `arrow.element` must be child of its popper element!');
25434      return data;
25435    }
25436  }
25437
25438  var placement = data.placement.split('-')[0];
25439  var _data$offsets = data.offsets,
25440      popper = _data$offsets.popper,
25441      reference = _data$offsets.reference;
25442
25443  var isVertical = ['left', 'right'].indexOf(placement) !== -1;
25444
25445  var len = isVertical ? 'height' : 'width';
25446  var sideCapitalized = isVertical ? 'Top' : 'Left';
25447  var side = sideCapitalized.toLowerCase();
25448  var altSide = isVertical ? 'left' : 'top';
25449  var opSide = isVertical ? 'bottom' : 'right';
25450  var arrowElementSize = getOuterSizes(arrowElement)[len];
25451
25452  //
25453  // extends keepTogether behavior making sure the popper and its
25454  // reference have enough pixels in conjunction
25455  //
25456
25457  // top/left side
25458  if (reference[opSide] - arrowElementSize < popper[side]) {
25459    data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);
25460  }
25461  // bottom/right side
25462  if (reference[side] + arrowElementSize > popper[opSide]) {
25463    data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];
25464  }
25465  data.offsets.popper = getClientRect(data.offsets.popper);
25466
25467  // compute center of the popper
25468  var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;
25469
25470  // Compute the sideValue using the updated popper offsets
25471  // take popper margin in account because we don't have this info available
25472  var css = getStyleComputedProperty(data.instance.popper);
25473  var popperMarginSide = parseFloat(css['margin' + sideCapitalized]);
25474  var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width']);
25475  var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;
25476
25477  // prevent arrowElement from being placed not contiguously to its popper
25478  sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);
25479
25480  data.arrowElement = arrowElement;
25481  data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);
25482
25483  return data;
25484}
25485
25486/**
25487 * Get the opposite placement variation of the given one
25488 * @method
25489 * @memberof Popper.Utils
25490 * @argument {String} placement variation
25491 * @returns {String} flipped placement variation
25492 */
25493function getOppositeVariation(variation) {
25494  if (variation === 'end') {
25495    return 'start';
25496  } else if (variation === 'start') {
25497    return 'end';
25498  }
25499  return variation;
25500}
25501
25502/**
25503 * List of accepted placements to use as values of the `placement` option.<br />
25504 * Valid placements are:
25505 * - `auto`
25506 * - `top`
25507 * - `right`
25508 * - `bottom`
25509 * - `left`
25510 *
25511 * Each placement can have a variation from this list:
25512 * - `-start`
25513 * - `-end`
25514 *
25515 * Variations are interpreted easily if you think of them as the left to right
25516 * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`
25517 * is right.<br />
25518 * Vertically (`left` and `right`), `start` is top and `end` is bottom.
25519 *
25520 * Some valid examples are:
25521 * - `top-end` (on top of reference, right aligned)
25522 * - `right-start` (on right of reference, top aligned)
25523 * - `bottom` (on bottom, centered)
25524 * - `auto-end` (on the side with more space available, alignment depends by placement)
25525 *
25526 * @static
25527 * @type {Array}
25528 * @enum {String}
25529 * @readonly
25530 * @method placements
25531 * @memberof Popper
25532 */
25533var placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];
25534
25535// Get rid of `auto` `auto-start` and `auto-end`
25536var validPlacements = placements.slice(3);
25537
25538/**
25539 * Given an initial placement, returns all the subsequent placements
25540 * clockwise (or counter-clockwise).
25541 *
25542 * @method
25543 * @memberof Popper.Utils
25544 * @argument {String} placement - A valid placement (it accepts variations)
25545 * @argument {Boolean} counter - Set to true to walk the placements counterclockwise
25546 * @returns {Array} placements including their variations
25547 */
25548function clockwise(placement) {
25549  var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
25550
25551  var index = validPlacements.indexOf(placement);
25552  var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));
25553  return counter ? arr.reverse() : arr;
25554}
25555
25556var BEHAVIORS = {
25557  FLIP: 'flip',
25558  CLOCKWISE: 'clockwise',
25559  COUNTERCLOCKWISE: 'counterclockwise'
25560};
25561
25562/**
25563 * @function
25564 * @memberof Modifiers
25565 * @argument {Object} data - The data object generated by update method
25566 * @argument {Object} options - Modifiers configuration and options
25567 * @returns {Object} The data object, properly modified
25568 */
25569function flip(data, options) {
25570  // if `inner` modifier is enabled, we can't use the `flip` modifier
25571  if (isModifierEnabled(data.instance.modifiers, 'inner')) {
25572    return data;
25573  }
25574
25575  if (data.flipped && data.placement === data.originalPlacement) {
25576    // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides
25577    return data;
25578  }
25579
25580  var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);
25581
25582  var placement = data.placement.split('-')[0];
25583  var placementOpposite = getOppositePlacement(placement);
25584  var variation = data.placement.split('-')[1] || '';
25585
25586  var flipOrder = [];
25587
25588  switch (options.behavior) {
25589    case BEHAVIORS.FLIP:
25590      flipOrder = [placement, placementOpposite];
25591      break;
25592    case BEHAVIORS.CLOCKWISE:
25593      flipOrder = clockwise(placement);
25594      break;
25595    case BEHAVIORS.COUNTERCLOCKWISE:
25596      flipOrder = clockwise(placement, true);
25597      break;
25598    default:
25599      flipOrder = options.behavior;
25600  }
25601
25602  flipOrder.forEach(function (step, index) {
25603    if (placement !== step || flipOrder.length === index + 1) {
25604      return data;
25605    }
25606
25607    placement = data.placement.split('-')[0];
25608    placementOpposite = getOppositePlacement(placement);
25609
25610    var popperOffsets = data.offsets.popper;
25611    var refOffsets = data.offsets.reference;
25612
25613    // using floor because the reference offsets may contain decimals we are not going to consider here
25614    var floor = Math.floor;
25615    var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);
25616
25617    var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);
25618    var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);
25619    var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);
25620    var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);
25621
25622    var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;
25623
25624    // flip the variation if required
25625    var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;
25626
25627    // flips variation if reference element overflows boundaries
25628    var flippedVariationByRef = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);
25629
25630    // flips variation if popper content overflows boundaries
25631    var flippedVariationByContent = !!options.flipVariationsByContent && (isVertical && variation === 'start' && overflowsRight || isVertical && variation === 'end' && overflowsLeft || !isVertical && variation === 'start' && overflowsBottom || !isVertical && variation === 'end' && overflowsTop);
25632
25633    var flippedVariation = flippedVariationByRef || flippedVariationByContent;
25634
25635    if (overlapsRef || overflowsBoundaries || flippedVariation) {
25636      // this boolean to detect any flip loop
25637      data.flipped = true;
25638
25639      if (overlapsRef || overflowsBoundaries) {
25640        placement = flipOrder[index + 1];
25641      }
25642
25643      if (flippedVariation) {
25644        variation = getOppositeVariation(variation);
25645      }
25646
25647      data.placement = placement + (variation ? '-' + variation : '');
25648
25649      // this object contains `position`, we want to preserve it along with
25650      // any additional property we may add in the future
25651      data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));
25652
25653      data = runModifiers(data.instance.modifiers, data, 'flip');
25654    }
25655  });
25656  return data;
25657}
25658
25659/**
25660 * @function
25661 * @memberof Modifiers
25662 * @argument {Object} data - The data object generated by update method
25663 * @argument {Object} options - Modifiers configuration and options
25664 * @returns {Object} The data object, properly modified
25665 */
25666function keepTogether(data) {
25667  var _data$offsets = data.offsets,
25668      popper = _data$offsets.popper,
25669      reference = _data$offsets.reference;
25670
25671  var placement = data.placement.split('-')[0];
25672  var floor = Math.floor;
25673  var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;
25674  var side = isVertical ? 'right' : 'bottom';
25675  var opSide = isVertical ? 'left' : 'top';
25676  var measurement = isVertical ? 'width' : 'height';
25677
25678  if (popper[side] < floor(reference[opSide])) {
25679    data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];
25680  }
25681  if (popper[opSide] > floor(reference[side])) {
25682    data.offsets.popper[opSide] = floor(reference[side]);
25683  }
25684
25685  return data;
25686}
25687
25688/**
25689 * Converts a string containing value + unit into a px value number
25690 * @function
25691 * @memberof {modifiers~offset}
25692 * @private
25693 * @argument {String} str - Value + unit string
25694 * @argument {String} measurement - `height` or `width`
25695 * @argument {Object} popperOffsets
25696 * @argument {Object} referenceOffsets
25697 * @returns {Number|String}
25698 * Value in pixels, or original string if no values were extracted
25699 */
25700function toValue(str, measurement, popperOffsets, referenceOffsets) {
25701  // separate value from unit
25702  var split = str.match(/((?:\-|\+)?\d*\.?\d*)(.*)/);
25703  var value = +split[1];
25704  var unit = split[2];
25705
25706  // If it's not a number it's an operator, I guess
25707  if (!value) {
25708    return str;
25709  }
25710
25711  if (unit.indexOf('%') === 0) {
25712    var element = void 0;
25713    switch (unit) {
25714      case '%p':
25715        element = popperOffsets;
25716        break;
25717      case '%':
25718      case '%r':
25719      default:
25720        element = referenceOffsets;
25721    }
25722
25723    var rect = getClientRect(element);
25724    return rect[measurement] / 100 * value;
25725  } else if (unit === 'vh' || unit === 'vw') {
25726    // if is a vh or vw, we calculate the size based on the viewport
25727    var size = void 0;
25728    if (unit === 'vh') {
25729      size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
25730    } else {
25731      size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
25732    }
25733    return size / 100 * value;
25734  } else {
25735    // if is an explicit pixel unit, we get rid of the unit and keep the value
25736    // if is an implicit unit, it's px, and we return just the value
25737    return value;
25738  }
25739}
25740
25741/**
25742 * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.
25743 * @function
25744 * @memberof {modifiers~offset}
25745 * @private
25746 * @argument {String} offset
25747 * @argument {Object} popperOffsets
25748 * @argument {Object} referenceOffsets
25749 * @argument {String} basePlacement
25750 * @returns {Array} a two cells array with x and y offsets in numbers
25751 */
25752function parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {
25753  var offsets = [0, 0];
25754
25755  // Use height if placement is left or right and index is 0 otherwise use width
25756  // in this way the first offset will use an axis and the second one
25757  // will use the other one
25758  var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;
25759
25760  // Split the offset string to obtain a list of values and operands
25761  // The regex addresses values with the plus or minus sign in front (+10, -20, etc)
25762  var fragments = offset.split(/(\+|\-)/).map(function (frag) {
25763    return frag.trim();
25764  });
25765
25766  // Detect if the offset string contains a pair of values or a single one
25767  // they could be separated by comma or space
25768  var divider = fragments.indexOf(find(fragments, function (frag) {
25769    return frag.search(/,|\s/) !== -1;
25770  }));
25771
25772  if (fragments[divider] && fragments[divider].indexOf(',') === -1) {
25773    console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');
25774  }
25775
25776  // If divider is found, we divide the list of values and operands to divide
25777  // them by ofset X and Y.
25778  var splitRegex = /\s*,\s*|\s+/;
25779  var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];
25780
25781  // Convert the values with units to absolute pixels to allow our computations
25782  ops = ops.map(function (op, index) {
25783    // Most of the units rely on the orientation of the popper
25784    var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';
25785    var mergeWithPrevious = false;
25786    return op
25787    // This aggregates any `+` or `-` sign that aren't considered operators
25788    // e.g.: 10 + +5 => [10, +, +5]
25789    .reduce(function (a, b) {
25790      if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {
25791        a[a.length - 1] = b;
25792        mergeWithPrevious = true;
25793        return a;
25794      } else if (mergeWithPrevious) {
25795        a[a.length - 1] += b;
25796        mergeWithPrevious = false;
25797        return a;
25798      } else {
25799        return a.concat(b);
25800      }
25801    }, [])
25802    // Here we convert the string values into number values (in px)
25803    .map(function (str) {
25804      return toValue(str, measurement, popperOffsets, referenceOffsets);
25805    });
25806  });
25807
25808  // Loop trough the offsets arrays and execute the operations
25809  ops.forEach(function (op, index) {
25810    op.forEach(function (frag, index2) {
25811      if (isNumeric(frag)) {
25812        offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);
25813      }
25814    });
25815  });
25816  return offsets;
25817}
25818
25819/**
25820 * @function
25821 * @memberof Modifiers
25822 * @argument {Object} data - The data object generated by update method
25823 * @argument {Object} options - Modifiers configuration and options
25824 * @argument {Number|String} options.offset=0
25825 * The offset value as described in the modifier description
25826 * @returns {Object} The data object, properly modified
25827 */
25828function offset(data, _ref) {
25829  var offset = _ref.offset;
25830  var placement = data.placement,
25831      _data$offsets = data.offsets,
25832      popper = _data$offsets.popper,
25833      reference = _data$offsets.reference;
25834
25835  var basePlacement = placement.split('-')[0];
25836
25837  var offsets = void 0;
25838  if (isNumeric(+offset)) {
25839    offsets = [+offset, 0];
25840  } else {
25841    offsets = parseOffset(offset, popper, reference, basePlacement);
25842  }
25843
25844  if (basePlacement === 'left') {
25845    popper.top += offsets[0];
25846    popper.left -= offsets[1];
25847  } else if (basePlacement === 'right') {
25848    popper.top += offsets[0];
25849    popper.left += offsets[1];
25850  } else if (basePlacement === 'top') {
25851    popper.left += offsets[0];
25852    popper.top -= offsets[1];
25853  } else if (basePlacement === 'bottom') {
25854    popper.left += offsets[0];
25855    popper.top += offsets[1];
25856  }
25857
25858  data.popper = popper;
25859  return data;
25860}
25861
25862/**
25863 * @function
25864 * @memberof Modifiers
25865 * @argument {Object} data - The data object generated by `update` method
25866 * @argument {Object} options - Modifiers configuration and options
25867 * @returns {Object} The data object, properly modified
25868 */
25869function preventOverflow(data, options) {
25870  var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);
25871
25872  // If offsetParent is the reference element, we really want to
25873  // go one step up and use the next offsetParent as reference to
25874  // avoid to make this modifier completely useless and look like broken
25875  if (data.instance.reference === boundariesElement) {
25876    boundariesElement = getOffsetParent(boundariesElement);
25877  }
25878
25879  // NOTE: DOM access here
25880  // resets the popper's position so that the document size can be calculated excluding
25881  // the size of the popper element itself
25882  var transformProp = getSupportedPropertyName('transform');
25883  var popperStyles = data.instance.popper.style; // assignment to help minification
25884  var top = popperStyles.top,
25885      left = popperStyles.left,
25886      transform = popperStyles[transformProp];
25887
25888  popperStyles.top = '';
25889  popperStyles.left = '';
25890  popperStyles[transformProp] = '';
25891
25892  var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);
25893
25894  // NOTE: DOM access here
25895  // restores the original style properties after the offsets have been computed
25896  popperStyles.top = top;
25897  popperStyles.left = left;
25898  popperStyles[transformProp] = transform;
25899
25900  options.boundaries = boundaries;
25901
25902  var order = options.priority;
25903  var popper = data.offsets.popper;
25904
25905  var check = {
25906    primary: function primary(placement) {
25907      var value = popper[placement];
25908      if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {
25909        value = Math.max(popper[placement], boundaries[placement]);
25910      }
25911      return defineProperty({}, placement, value);
25912    },
25913    secondary: function secondary(placement) {
25914      var mainSide = placement === 'right' ? 'left' : 'top';
25915      var value = popper[mainSide];
25916      if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {
25917        value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));
25918      }
25919      return defineProperty({}, mainSide, value);
25920    }
25921  };
25922
25923  order.forEach(function (placement) {
25924    var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';
25925    popper = _extends({}, popper, check[side](placement));
25926  });
25927
25928  data.offsets.popper = popper;
25929
25930  return data;
25931}
25932
25933/**
25934 * @function
25935 * @memberof Modifiers
25936 * @argument {Object} data - The data object generated by `update` method
25937 * @argument {Object} options - Modifiers configuration and options
25938 * @returns {Object} The data object, properly modified
25939 */
25940function shift(data) {
25941  var placement = data.placement;
25942  var basePlacement = placement.split('-')[0];
25943  var shiftvariation = placement.split('-')[1];
25944
25945  // if shift shiftvariation is specified, run the modifier
25946  if (shiftvariation) {
25947    var _data$offsets = data.offsets,
25948        reference = _data$offsets.reference,
25949        popper = _data$offsets.popper;
25950
25951    var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;
25952    var side = isVertical ? 'left' : 'top';
25953    var measurement = isVertical ? 'width' : 'height';
25954
25955    var shiftOffsets = {
25956      start: defineProperty({}, side, reference[side]),
25957      end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])
25958    };
25959
25960    data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);
25961  }
25962
25963  return data;
25964}
25965
25966/**
25967 * @function
25968 * @memberof Modifiers
25969 * @argument {Object} data - The data object generated by update method
25970 * @argument {Object} options - Modifiers configuration and options
25971 * @returns {Object} The data object, properly modified
25972 */
25973function hide(data) {
25974  if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {
25975    return data;
25976  }
25977
25978  var refRect = data.offsets.reference;
25979  var bound = find(data.instance.modifiers, function (modifier) {
25980    return modifier.name === 'preventOverflow';
25981  }).boundaries;
25982
25983  if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {
25984    // Avoid unnecessary DOM access if visibility hasn't changed
25985    if (data.hide === true) {
25986      return data;
25987    }
25988
25989    data.hide = true;
25990    data.attributes['x-out-of-boundaries'] = '';
25991  } else {
25992    // Avoid unnecessary DOM access if visibility hasn't changed
25993    if (data.hide === false) {
25994      return data;
25995    }
25996
25997    data.hide = false;
25998    data.attributes['x-out-of-boundaries'] = false;
25999  }
26000
26001  return data;
26002}
26003
26004/**
26005 * @function
26006 * @memberof Modifiers
26007 * @argument {Object} data - The data object generated by `update` method
26008 * @argument {Object} options - Modifiers configuration and options
26009 * @returns {Object} The data object, properly modified
26010 */
26011function inner(data) {
26012  var placement = data.placement;
26013  var basePlacement = placement.split('-')[0];
26014  var _data$offsets = data.offsets,
26015      popper = _data$offsets.popper,
26016      reference = _data$offsets.reference;
26017
26018  var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;
26019
26020  var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;
26021
26022  popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);
26023
26024  data.placement = getOppositePlacement(placement);
26025  data.offsets.popper = getClientRect(popper);
26026
26027  return data;
26028}
26029
26030/**
26031 * Modifier function, each modifier can have a function of this type assigned
26032 * to its `fn` property.<br />
26033 * These functions will be called on each update, this means that you must
26034 * make sure they are performant enough to avoid performance bottlenecks.
26035 *
26036 * @function ModifierFn
26037 * @argument {dataObject} data - The data object generated by `update` method
26038 * @argument {Object} options - Modifiers configuration and options
26039 * @returns {dataObject} The data object, properly modified
26040 */
26041
26042/**
26043 * Modifiers are plugins used to alter the behavior of your poppers.<br />
26044 * Popper.js uses a set of 9 modifiers to provide all the basic functionalities
26045 * needed by the library.
26046 *
26047 * Usually you don't want to override the `order`, `fn` and `onLoad` props.
26048 * All the other properties are configurations that could be tweaked.
26049 * @namespace modifiers
26050 */
26051var modifiers = {
26052  /**
26053   * Modifier used to shift the popper on the start or end of its reference
26054   * element.<br />
26055   * It will read the variation of the `placement` property.<br />
26056   * It can be one either `-end` or `-start`.
26057   * @memberof modifiers
26058   * @inner
26059   */
26060  shift: {
26061    /** @prop {number} order=100 - Index used to define the order of execution */
26062    order: 100,
26063    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
26064    enabled: true,
26065    /** @prop {ModifierFn} */
26066    fn: shift
26067  },
26068
26069  /**
26070   * The `offset` modifier can shift your popper on both its axis.
26071   *
26072   * It accepts the following units:
26073   * - `px` or unit-less, interpreted as pixels
26074   * - `%` or `%r`, percentage relative to the length of the reference element
26075   * - `%p`, percentage relative to the length of the popper element
26076   * - `vw`, CSS viewport width unit
26077   * - `vh`, CSS viewport height unit
26078   *
26079   * For length is intended the main axis relative to the placement of the popper.<br />
26080   * This means that if the placement is `top` or `bottom`, the length will be the
26081   * `width`. In case of `left` or `right`, it will be the `height`.
26082   *
26083   * You can provide a single value (as `Number` or `String`), or a pair of values
26084   * as `String` divided by a comma or one (or more) white space
vendor: 9,957 bytes, lines 26084-26356
26084s.<br />
26085   * The latter is a deprecated method because it leads to confusion and will be
26086   * removed in v2.<br />
26087   * Additionally, it accepts additions and subtractions between different units.
26088   * Note that multiplications and divisions aren't supported.
26089   *
26090   * Valid examples are:
26091   * ```
26092   * 10
26093   * '10%'
26094   * '10, 10'
26095   * '10%, 10'
26096   * '10 + 10%'
26097   * '10 - 5vh + 3%'
26098   * '-10px + 5vh, 5px - 6%'
26099   * ```
26100   * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap
26101   * > with their reference element, unfortunately, you will have to disable the `flip` modifier.
26102   * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).
26103   *
26104   * @memberof modifiers
26105   * @inner
26106   */
26107  offset: {
26108    /** @prop {number} order=200 - Index used to define the order of execution */
26109    order: 200,
26110    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
26111    enabled: true,
26112    /** @prop {ModifierFn} */
26113    fn: offset,
26114    /** @prop {Number|String} offset=0
26115     * The offset value as described in the modifier description
26116     */
26117    offset: 0
26118  },
26119
26120  /**
26121   * Modifier used to prevent the popper from being positioned outside the boundary.
26122   *
26123   * A scenario exists where the reference itself is not within the boundaries.<br />
26124   * We can say it has "escaped the boundaries" — or just "escaped".<br />
26125   * In this case we need to decide whether the popper should either:
26126   *
26127   * - detach from the reference and remain "trapped" in the boundaries, or
26128   * - if it should ignore the boundary and "escape with its reference"
26129   *
26130   * When `escapeWithReference` is set to`true` and reference is completely
26131   * outside its boundaries, the popper will overflow (or completely leave)
26132   * the boundaries in order to remain attached to the edge of the reference.
26133   *
26134   * @memberof modifiers
26135   * @inner
26136   */
26137  preventOverflow: {
26138    /** @prop {number} order=300 - Index used to define the order of execution */
26139    order: 300,
26140    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
26141    enabled: true,
26142    /** @prop {ModifierFn} */
26143    fn: preventOverflow,
26144    /**
26145     * @prop {Array} [priority=['left','right','top','bottom']]
26146     * Popper will try to prevent overflow following these priorities by default,
26147     * then, it could overflow on the left and on top of the `boundariesElement`
26148     */
26149    priority: ['left', 'right', 'top', 'bottom'],
26150    /**
26151     * @prop {number} padding=5
26152     * Amount of pixel used to define a minimum distance between the boundaries
26153     * and the popper. This makes sure the popper always has a little padding
26154     * between the edges of its container
26155     */
26156    padding: 5,
26157    /**
26158     * @prop {String|HTMLElement} boundariesElement='scrollParent'
26159     * Boundaries used by the modifier. Can be `scrollParent`, `window`,
26160     * `viewport` or any DOM element.
26161     */
26162    boundariesElement: 'scrollParent'
26163  },
26164
26165  /**
26166   * Modifier used to make sure the reference and its popper stay near each other
26167   * without leaving any gap between the two. Especially useful when the arrow is
26168   * enabled and you want to ensure that it points to its reference element.
26169   * It cares only about the first axis. You can still have poppers with margin
26170   * between the popper and its reference element.
26171   * @memberof modifiers
26172   * @inner
26173   */
26174  keepTogether: {
26175    /** @prop {number} order=400 - Index used to define the order of execution */
26176    order: 400,
26177    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
26178    enabled: true,
26179    /** @prop {ModifierFn} */
26180    fn: keepTogether
26181  },
26182
26183  /**
26184   * This modifier is used to move the `arrowElement` of the popper to make
26185   * sure it is positioned between the reference element and its popper element.
26186   * It will read the outer size of the `arrowElement` node to detect how many
26187   * pixels of conjunction are needed.
26188   *
26189   * It has no effect if no `arrowElement` is provided.
26190   * @memberof modifiers
26191   * @inner
26192   */
26193  arrow: {
26194    /** @prop {number} order=500 - Index used to define the order of execution */
26195    order: 500,
26196    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
26197    enabled: true,
26198    /** @prop {ModifierFn} */
26199    fn: arrow,
26200    /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */
26201    element: '[x-arrow]'
26202  },
26203
26204  /**
26205   * Modifier used to flip the popper's placement when it starts to overlap its
26206   * reference element.
26207   *
26208   * Requires the `preventOverflow` modifier before it in order to work.
26209   *
26210   * **NOTE:** this modifier will interrupt the current update cycle and will
26211   * restart it if it detects the need to flip the placement.
26212   * @memberof modifiers
26213   * @inner
26214   */
26215  flip: {
26216    /** @prop {number} order=600 - Index used to define the order of execution */
26217    order: 600,
26218    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
26219    enabled: true,
26220    /** @prop {ModifierFn} */
26221    fn: flip,
26222    /**
26223     * @prop {String|Array} behavior='flip'
26224     * The behavior used to change the popper's placement. It can be one of
26225     * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid
26226     * placements (with optional variations)
26227     */
26228    behavior: 'flip',
26229    /**
26230     * @prop {number} padding=5
26231     * The popper will flip if it hits the edges of the `boundariesElement`
26232     */
26233    padding: 5,
26234    /**
26235     * @prop {String|HTMLElement} boundariesElement='viewport'
26236     * The element which will define the boundaries of the popper position.
26237     * The popper will never be placed outside of the defined boundaries
26238     * (except if `keepTogether` is enabled)
26239     */
26240    boundariesElement: 'viewport',
26241    /**
26242     * @prop {Boolean} flipVariations=false
26243     * The popper will switch placement variation between `-start` and `-end` when
26244     * the reference element overlaps its boundaries.
26245     *
26246     * The original placement should have a set variation.
26247     */
26248    flipVariations: false,
26249    /**
26250     * @prop {Boolean} flipVariationsByContent=false
26251     * The popper will switch placement variation between `-start` and `-end` when
26252     * the popper element overlaps its reference boundaries.
26253     *
26254     * The original placement should have a set variation.
26255     */
26256    flipVariationsByContent: false
26257  },
26258
26259  /**
26260   * Modifier used to make the popper flow toward the inner of the reference element.
26261   * By default, when this modifier is disabled, the popper will be placed outside
26262   * the reference element.
26263   * @memberof modifiers
26264   * @inner
26265   */
26266  inner: {
26267    /** @prop {number} order=700 - Index used to define the order of execution */
26268    order: 700,
26269    /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */
26270    enabled: false,
26271    /** @prop {ModifierFn} */
26272    fn: inner
26273  },
26274
26275  /**
26276   * Modifier used to hide the popper when its reference element is outside of the
26277   * popper boundaries. It will set a `x-out-of-boundaries` attribute which can
26278   * be used to hide with a CSS selector the popper when its reference is
26279   * out of boundaries.
26280   *
26281   * Requires the `preventOverflow` modifier before it in order to work.
26282   * @memberof modifiers
26283   * @inner
26284   */
26285  hide: {
26286    /** @prop {number} order=800 - Index used to define the order of execution */
26287    order: 800,
26288    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
26289    enabled: true,
26290    /** @prop {ModifierFn} */
26291    fn: hide
26292  },
26293
26294  /**
26295   * Computes the style that will be applied to the popper element to gets
26296   * properly positioned.
26297   *
26298   * Note that this modifier will not touch the DOM, it just prepares the styles
26299   * so that `applyStyle` modifier can apply it. This separation is useful
26300   * in case you need to replace `applyStyle` with a custom implementation.
26301   *
26302   * This modifier has `850` as `order` value to maintain backward compatibility
26303   * with previous versions of Popper.js. Expect the modifiers ordering method
26304   * to change in future major versions of the library.
26305   *
26306   * @memberof modifiers
26307   * @inner
26308   */
26309  computeStyle: {
26310    /** @prop {number} order=850 - Index used to define the order of execution */
26311    order: 850,
26312    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
26313    enabled: true,
26314    /** @prop {ModifierFn} */
26315    fn: computeStyle,
26316    /**
26317     * @prop {Boolean} gpuAcceleration=true
26318     * If true, it uses the CSS 3D transformation to position the popper.
26319     * Otherwise, it will use the `top` and `left` properties
26320     */
26321    gpuAcceleration: true,
26322    /**
26323     * @prop {string} [x='bottom']
26324     * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.
26325     * Change this if your popper should grow in a direction different from `bottom`
26326     */
26327    x: 'bottom',
26328    /**
26329     * @prop {string} [x='left']
26330     * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.
26331     * Change this if your popper should grow in a direction different from `right`
26332     */
26333    y: 'right'
26334  },
26335
26336  /**
26337   * Applies the computed styles to the popper element.
26338   *
26339   * All the DOM manipulations are limited to this modifier. This is useful in case
26340   * you want to integrate Popper.js inside a framework or view library and you
26341   * want to delegate all the DOM manipulations to it.
26342   *
26343   * Note that if you disable this modifier, you must make sure the popper element
26344   * has its position set to `absolute` before Popper.js can do its work!
26345   *
26346   * Just disable this modifier and define your own to achieve the desired effect.
26347   *
26348   * @memberof modifiers
26349   * @inner
26350   */
26351  applyStyle: {
26352    /** @prop {number} order=900 - Index used to define the order of execution */
26353    order: 900,
26354    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
26355    enabled: true,
26356    /** @prop {ModifierFn} */
vendor: 9,127 bytes, lines 26357-26621
26357    fn: applyStyle,
26358    /** @prop {Function} */
26359    onLoad: applyStyleOnLoad,
26360    /**
26361     * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier
26362     * @prop {Boolean} gpuAcceleration=true
26363     * If true, it uses the CSS 3D transformation to position the popper.
26364     * Otherwise, it will use the `top` and `left` properties
26365     */
26366    gpuAcceleration: undefined
26367  }
26368};
26369
26370/**
26371 * The `dataObject` is an object containing all the information used by Popper.js.
26372 * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.
26373 * @name dataObject
26374 * @property {Object} data.instance The Popper.js instance
26375 * @property {String} data.placement Placement applied to popper
26376 * @property {String} data.originalPlacement Placement originally defined on init
26377 * @property {Boolean} data.flipped True if popper has been flipped by flip modifier
26378 * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper
26379 * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier
26380 * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)
26381 * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)
26382 * @property {Object} data.boundaries Offsets of the popper boundaries
26383 * @property {Object} data.offsets The measurements of popper, reference and arrow elements
26384 * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values
26385 * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values
26386 * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0
26387 */
26388
26389/**
26390 * Default options provided to Popper.js constructor.<br />
26391 * These can be overridden using the `options` argument of Popper.js.<br />
26392 * To override an option, simply pass an object with the same
26393 * structure of the `options` object, as the 3rd argument. For example:
26394 * ```
26395 * new Popper(ref, pop, {
26396 *   modifiers: {
26397 *     preventOverflow: { enabled: false }
26398 *   }
26399 * })
26400 * ```
26401 * @type {Object}
26402 * @static
26403 * @memberof Popper
26404 */
26405var Defaults = {
26406  /**
26407   * Popper's placement.
26408   * @prop {Popper.placements} placement='bottom'
26409   */
26410  placement: 'bottom',
26411
26412  /**
26413   * Set this to true if you want popper to position it self in 'fixed' mode
26414   * @prop {Boolean} positionFixed=false
26415   */
26416  positionFixed: false,
26417
26418  /**
26419   * Whether events (resize, scroll) are initially enabled.
26420   * @prop {Boolean} eventsEnabled=true
26421   */
26422  eventsEnabled: true,
26423
26424  /**
26425   * Set to true if you want to automatically remove the popper when
26426   * you call the `destroy` method.
26427   * @prop {Boolean} removeOnDestroy=false
26428   */
26429  removeOnDestroy: false,
26430
26431  /**
26432   * Callback called when the popper is created.<br />
26433   * By default, it is set to no-op.<br />
26434   * Access Popper.js instance with `data.instance`.
26435   * @prop {onCreate}
26436   */
26437  onCreate: function onCreate() {},
26438
26439  /**
26440   * Callback called when the popper is updated. This callback is not called
26441   * on the initialization/creation of the popper, but only on subsequent
26442   * updates.<br />
26443   * By default, it is set to no-op.<br />
26444   * Access Popper.js instance with `data.instance`.
26445   * @prop {onUpdate}
26446   */
26447  onUpdate: function onUpdate() {},
26448
26449  /**
26450   * List of modifiers used to modify the offsets before they are applied to the popper.
26451   * They provide most of the functionalities of Popper.js.
26452   * @prop {modifiers}
26453   */
26454  modifiers: modifiers
26455};
26456
26457/**
26458 * @callback onCreate
26459 * @param {dataObject} data
26460 */
26461
26462/**
26463 * @callback onUpdate
26464 * @param {dataObject} data
26465 */
26466
26467// Utils
26468// Methods
26469var Popper = function () {
26470  /**
26471   * Creates a new Popper.js instance.
26472   * @class Popper
26473   * @param {Element|referenceObject} reference - The reference element used to position the popper
26474   * @param {Element} popper - The HTML / XML element used as the popper
26475   * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)
26476   * @return {Object} instance - The generated Popper.js instance
26477   */
26478  function Popper(reference, popper) {
26479    var _this = this;
26480
26481    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
26482    classCallCheck(this, Popper);
26483
26484    this.scheduleUpdate = function () {
26485      return requestAnimationFrame(_this.update);
26486    };
26487
26488    // make update() debounced, so that it only runs at most once-per-tick
26489    this.update = debounce(this.update.bind(this));
26490
26491    // with {} we create a new object with the options inside it
26492    this.options = _extends({}, Popper.Defaults, options);
26493
26494    // init state
26495    this.state = {
26496      isDestroyed: false,
26497      isCreated: false,
26498      scrollParents: []
26499    };
26500
26501    // get reference and popper elements (allow jQuery wrappers)
26502    this.reference = reference && reference.jquery ? reference[0] : reference;
26503    this.popper = popper && popper.jquery ? popper[0] : popper;
26504
26505    // Deep merge modifiers options
26506    this.options.modifiers = {};
26507    Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {
26508      _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});
26509    });
26510
26511    // Refactoring modifiers' list (Object => Array)
26512    this.modifiers = Object.keys(this.options.modifiers).map(function (name) {
26513      return _extends({
26514        name: name
26515      }, _this.options.modifiers[name]);
26516    })
26517    // sort the modifiers by order
26518    .sort(function (a, b) {
26519      return a.order - b.order;
26520    });
26521
26522    // modifiers have the ability to execute arbitrary code when Popper.js get inited
26523    // such code is executed in the same order of its modifier
26524    // they could add new properties to their options configuration
26525    // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!
26526    this.modifiers.forEach(function (modifierOptions) {
26527      if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {
26528        modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);
26529      }
26530    });
26531
26532    // fire the first update to position the popper in the right place
26533    this.update();
26534
26535    var eventsEnabled = this.options.eventsEnabled;
26536    if (eventsEnabled) {
26537      // setup event listeners, they will take care of update the position in specific situations
26538      this.enableEventListeners();
26539    }
26540
26541    this.state.eventsEnabled = eventsEnabled;
26542  }
26543
26544  // We can't use class properties because they don't get listed in the
26545  // class prototype and break stuff like Sinon stubs
26546
26547
26548  createClass(Popper, [{
26549    key: 'update',
26550    value: function update$$1() {
26551      return update.call(this);
26552    }
26553  }, {
26554    key: 'destroy',
26555    value: function destroy$$1() {
26556      return destroy.call(this);
26557    }
26558  }, {
26559    key: 'enableEventListeners',
26560    value: function enableEventListeners$$1() {
26561      return enableEventListeners.call(this);
26562    }
26563  }, {
26564    key: 'disableEventListeners',
26565    value: function disableEventListeners$$1() {
26566      return disableEventListeners.call(this);
26567    }
26568
26569    /**
26570     * Schedules an update. It will run on the next UI update available.
26571     * @method scheduleUpdate
26572     * @memberof Popper
26573     */
26574
26575
26576    /**
26577     * Collection of utilities useful when writing custom modifiers.
26578     * Starting from version 1.7, this method is available only if you
26579     * include `popper-utils.js` before `popper.js`.
26580     *
26581     * **DEPRECATION**: This way to access PopperUtils is deprecated
26582     * and will be removed in v2! Use the PopperUtils module directly instead.
26583     * Due to the high instability of the methods contained in Utils, we can't
26584     * guarantee them to follow semver. Use them at your own risk!
26585     * @static
26586     * @private
26587     * @type {Object}
26588     * @deprecated since version 1.8
26589     * @member Utils
26590     * @memberof Popper
26591     */
26592
26593  }]);
26594  return Popper;
26595}();
26596
26597/**
26598 * The `referenceObject` is an object that provides an interface compatible with Popper.js
26599 * and lets you use it as replacement of a real DOM node.<br />
26600 * You can use this method to position a popper relatively to a set of coordinates
26601 * in case you don't have a DOM node to use as reference.
26602 *
26603 * ```
26604 * new Popper(referenceObject, popperNode);
26605 * ```
26606 *
26607 * NB: This feature isn't supported in Internet Explorer 10.
26608 * @name referenceObject
26609 * @property {Function} data.getBoundingClientRect
26610 * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.
26611 * @property {number} data.clientWidth
26612 * An ES6 getter that will return the width of the virtual reference element.
26613 * @property {number} data.clientHeight
26614 * An ES6 getter that will return the height of the virtual reference element.
26615 */
26616
26617
26618Popper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;
26619Popper.placements = placements;
26620Popper.Defaults = Defaults;
26621
26622return Popper;
26623
26624})));
26625
26626
26627}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
26628},{}],43:[function(require,module,exports){
vendor: 7,610 bytes, lines 26629-26906
26629/*
26630 * jQuery Superfish Menu Plugin - v1.7.10
26631 * Copyright (c) 2018 Joel Birch
26632 *
26633 * Dual licensed under the MIT and GPL licenses:
26634 *	http://www.opensource.org/licenses/mit-license.php
26635 *	http://www.gnu.org/licenses/gpl.html
26636 */
26637
26638;(function ($, w) {
26639	"use strict";
26640
26641	var methods = (function () {
26642		// private properties and methods go here
26643		var c = {
26644				bcClass: 'sf-breadcrumb',
26645				menuClass: 'sf-js-enabled',
26646				anchorClass: 'sf-with-ul',
26647				menuArrowClass: 'sf-arrows'
26648			},
26649			ios = (function () {
26650				var ios = /^(?![\w\W]*Windows Phone)[\w\W]*(iPhone|iPad|iPod)/i.test(navigator.userAgent);
26651				if (ios) {
26652					// tap anywhere on iOS to unfocus a submenu
26653					$('html').css('cursor', 'pointer').on('click', $.noop);
26654				}
26655				return ios;
26656			})(),
26657			wp7 = (function () {
26658				var style = document.documentElement.style;
26659				return ('behavior' in style && 'fill' in style && /iemobile/i.test(navigator.userAgent));
26660			})(),
26661			unprefixedPointerEvents = (function () {
26662				return (!!w.PointerEvent);
26663			})(),
26664			toggleMenuClasses = function ($menu, o, add) {
26665				var classes = c.menuClass,
26666					method;
26667				if (o.cssArrows) {
26668					classes += ' ' + c.menuArrowClass;
26669				}
26670				method = (add) ? 'addClass' : 'removeClass';
26671				$menu[method](classes);
26672			},
26673			setPathToCurrent = function ($menu, o) {
26674				return $menu.find('li.' + o.pathClass).slice(0, o.pathLevels)
26675					.addClass(o.hoverClass + ' ' + c.bcClass)
26676						.filter(function () {
26677							return ($(this).children(o.popUpSelector).hide().show().length);
26678						}).removeClass(o.pathClass);
26679			},
26680			toggleAnchorClass = function ($li, add) {
26681				var method = (add) ? 'addClass' : 'removeClass';
26682				$li.children('a')[method](c.anchorClass);
26683			},
26684			toggleTouchAction = function ($menu) {
26685				var msTouchAction = $menu.css('ms-touch-action');
26686				var touchAction = $menu.css('touch-action');
26687				touchAction = touchAction || msTouchAction;
26688				touchAction = (touchAction === 'pan-y') ? 'auto' : 'pan-y';
26689				$menu.css({
26690					'ms-touch-action': touchAction,
26691					'touch-action': touchAction
26692				});
26693			},
26694			getMenu = function ($el) {
26695				return $el.closest('.' + c.menuClass);
26696			},
26697			getOptions = function ($el) {
26698				return getMenu($el).data('sfOptions');
26699			},
26700			over = function () {
26701				var $this = $(this),
26702					o = getOptions($this);
26703				clearTimeout(o.sfTimer);
26704				$this.siblings().superfish('hide').end().superfish('show');
26705			},
26706			close = function (o) {
26707				o.retainPath = ($.inArray(this[0], o.$path) > -1);
26708				this.superfish('hide');
26709
26710				if (!this.parents('.' + o.hoverClass).length) {
26711					o.onIdle.call(getMenu(this));
26712					if (o.$path.length) {
26713						$.proxy(over, o.$path)();
26714					}
26715				}
26716			},
26717			out = function () {
26718				var $this = $(this),
26719					o = getOptions($this);
26720				if (ios) {
26721					$.proxy(close, $this, o)();
26722				}
26723				else {
26724					clearTimeout(o.sfTimer);
26725					o.sfTimer = setTimeout($.proxy(close, $this, o), o.delay);
26726				}
26727			},
26728			touchHandler = function (e) {
26729				var $this = $(this),
26730					o = getOptions($this),
26731					$ul = $this.siblings(e.data.popUpSelector);
26732
26733				if (o.onHandleTouch.call($ul) === false) {
26734					return this;
26735				}
26736
26737				if ($ul.length > 0 && $ul.is(':hidden')) {
26738					$this.one('click.superfish', false);
26739					if (e.type === 'MSPointerDown' || e.type === 'pointerdown') {
26740						$this.trigger('focus');
26741					} else {
26742						$.proxy(over, $this.parent('li'))();
26743					}
26744				}
26745			},
26746			applyHandlers = function ($menu, o) {
26747				var targets = 'li:has(' + o.popUpSelector + ')';
26748				if ($.fn.hoverIntent && !o.disableHI) {
26749					$menu.hoverIntent(over, out, targets);
26750				}
26751				else {
26752					$menu
26753						.on('mouseenter.superfish', targets, over)
26754						.on('mouseleave.superfish', targets, out);
26755				}
26756				var touchevent = 'MSPointerDown.superfish';
26757				if (unprefixedPointerEvents) {
26758					touchevent = 'pointerdown.superfish';
26759				}
26760				if (!ios) {
26761					touchevent += ' touchend.superfish';
26762				}
26763				if (wp7) {
26764					touchevent += ' mousedown.superfish';
26765				}
26766				$menu
26767					.on('focusin.superfish', 'li', over)
26768					.on('focusout.superfish', 'li', out)
26769					.on(touchevent, 'a', o, touchHandler);
26770			};
26771
26772		return {
26773			// public methods
26774			hide: function (instant) {
26775				if (this.length) {
26776					var $this = this,
26777						o = getOptions($this);
26778					if (!o) {
26779						return this;
26780					}
26781					var not = (o.retainPath === true) ? o.$path : '',
26782						$ul = $this.find('li.' + o.hoverClass).add(this).not(not).removeClass(o.hoverClass).children(o.popUpSelector),
26783						speed = o.speedOut;
26784
26785					if (instant) {
26786						$ul.show();
26787						speed = 0;
26788					}
26789					o.retainPath = false;
26790
26791					if (o.onBeforeHide.call($ul) === false) {
26792						return this;
26793					}
26794
26795					$ul.stop(true, true).animate(o.animationOut, speed, function () {
26796						var $this = $(this);
26797						o.onHide.call($this);
26798					});
26799				}
26800				return this;
26801			},
26802			show: function () {
26803				var o = getOptions(this);
26804				if (!o) {
26805					return this;
26806				}
26807				var $this = this.addClass(o.hoverClass),
26808					$ul = $this.children(o.popUpSelector);
26809
26810				if (o.onBeforeShow.call($ul) === false) {
26811					return this;
26812				}
26813
26814				$ul.stop(true, true).animate(o.animation, o.speed, function () {
26815					o.onShow.call($ul);
26816				});
26817				return this;
26818			},
26819			destroy: function () {
26820				return this.each(function () {
26821					var $this = $(this),
26822						o = $this.data('sfOptions'),
26823						$hasPopUp;
26824					if (!o) {
26825						return false;
26826					}
26827					$hasPopUp = $this.find(o.popUpSelector).parent('li');
26828					clearTimeout(o.sfTimer);
26829					toggleMenuClasses($this, o);
26830					toggleAnchorClass($hasPopUp);
26831					toggleTouchAction($this);
26832					// remove event handlers
26833					$this.off('.superfish').off('.hoverIntent');
26834					// clear animation's inline display style
26835					$hasPopUp.children(o.popUpSelector).attr('style', function (i, style) {
26836						if (typeof style !== 'undefined') {
26837							return style.replace(/display[^;]+;?/g, '');
26838						}
26839					});
26840					// reset 'current' path classes
26841					o.$path.removeClass(o.hoverClass + ' ' + c.bcClass).addClass(o.pathClass);
26842					$this.find('.' + o.hoverClass).removeClass(o.hoverClass);
26843					o.onDestroy.call($this);
26844					$this.removeData('sfOptions');
26845				});
26846			},
26847			init: function (op) {
26848				return this.each(function () {
26849					var $this = $(this);
26850					if ($this.data('sfOptions')) {
26851						return false;
26852					}
26853					var o = $.extend({}, $.fn.superfish.defaults, op),
26854						$hasPopUp = $this.find(o.popUpSelector).parent('li');
26855					o.$path = setPathToCurrent($this, o);
26856
26857					$this.data('sfOptions', o);
26858
26859					toggleMenuClasses($this, o, true);
26860					toggleAnchorClass($hasPopUp, true);
26861					toggleTouchAction($this);
26862					applyHandlers($this, o);
26863
26864					$hasPopUp.not('.' + c.bcClass).superfish('hide', true);
26865
26866					o.onInit.call(this);
26867				});
26868			}
26869		};
26870	})();
26871
26872	$.fn.superfish = function (method, args) {
26873		if (methods[method]) {
26874			return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
26875		}
26876		else if (typeof method === 'object' || ! method) {
26877			return methods.init.apply(this, arguments);
26878		}
26879		else {
26880			return $.error('Method ' +  method + ' does not exist on jQuery.fn.superfish');
26881		}
26882	};
26883
26884	$.fn.superfish.defaults = {
26885		popUpSelector: 'ul,.sf-mega', // within menu context
26886		hoverClass: 'sfHover',
26887		pathClass: 'overrideThisToUse',
26888		pathLevels: 1,
26889		delay: 800,
26890		animation: {opacity: 'show'},
26891		animationOut: {opacity: 'hide'},
26892		speed: 'normal',
26893		speedOut: 'fast',
26894		cssArrows: true,
26895		disableHI: false,
26896		onInit: $.noop,
26897		onBeforeShow: $.noop,
26898		onShow: $.noop,
26899		onBeforeHide: $.noop,
26900		onHide: $.noop,
26901		onIdle: $.noop,
26902		onDestroy: $.noop,
26903		onHandleTouch: $.noop
26904	};
26905
26906})(jQuery, window);
26907
26908},{}],44:[function(require,module,exports){
26909"use strict";
26910
26911var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
26912Object.defineProperty(exports, "__esModule", {
26913  value: true
26914});
26915exports.WcoBitvForm = void 0;
26916var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
26917var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
26918var WcoBitvForm = exports.WcoBitvForm = /*#__PURE__*/function () {
26919  function WcoBitvForm() {
26920    (0, _classCallCheck2["default"])(this, WcoBitvForm);
26921  }
26922  return (0, _createClass2["default"])(WcoBitvForm, [{
26923    key: "initialize",
26924    value: function initialize() {
26925      // form validation
26926      var forms = document.querySelectorAll('form');
26927      if (forms.length > 0) {
26928        forms.forEach(function (formItem) {
26929          var formFields = formItem.querySelectorAll('.form__group.has-error');
26930          if (formFields.length > 0) {
26931            formFields.forEach(function (formField, index) {
26932              var errorTextElement = formField.querySelector('.alert.error');
26933              var uniqueId = 'error-message-' + index;
26934              errorTextElement.id = uniqueId;
26935              var requiredField = formField.querySelector('[required="required"].error');
26936              var inputSecurityCheck = formField.querySelector('input.security-check-input');
26937              if (requiredField) {
26938                requiredField.setAttribute('aria-describedby', uniqueId);
26939              }
26940              if (inputSecurityCheck) {
26941                inputSecurityCheck.setAttribute('aria-describedby', uniqueId);
26942              }
26943            });
26944            setTimeout(function () {
26945              var errorRequired = formFields[0].querySelector('[required="required"].error');
26946              var errorSecurity = formFields[0].querySelector('input.security-check-input');
26947              if (errorRequired) {
26948                errorRequired.focus();
26949              }
26950              if (errorSecurity) {
26951                formFields[0].querySelector('.alert.error').setAttribute("tabindex", "-1");
26952                formFields[0].querySelector(".alert.error").focus();
26953              }
26954            }, 100);
26955          }
26956        });
26957      }
26958    }
26959  }]);
26960}();
26961
26962},{"@babel/runtime/helpers/classCallCheck":45,"@babel/runtime/helpers/createClass":46,"@babel/runtime/helpers/interopRequireDefault":47}],45:[function(require,module,exports){
26963arguments[4][13][0].apply(exports,arguments)
26964},{"dup":13}],46:[function(require,module,exports){
26965arguments[4][14][0].apply(exports,arguments)
26966},{"./toPropertyKey.js":49,"dup":14}],47:[function(require,module,exports){
26967arguments[4][19][0].apply(exports,arguments)
26968},{"dup":19}],48:[function(require,module,exports){
26969arguments[4][23][0].apply(exports,arguments)
26970},{"./typeof.js":50,"dup":23}],49:[function(require,module,exports){
26971arguments[4][24][0].apply(exports,arguments)
26972},{"./toPrimitive.js":48,"./typeof.js":50,"dup":24}],50:[function(require,module,exports){
26973arguments[4][25][0].apply(exports,arguments)
26974},{"dup":25}],51:[function(require,module,exports){
26975"use strict";
26976
26977var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
26978Object.defineProperty(exports, "__esModule", {
26979  value: true
26980});
26981exports.WcoBmiCalculator = void 0;
26982var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
26983var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
26984var WcoBmiCalculator = exports.WcoBmiCalculator = /*#__PURE__*/function () {
26985  function WcoBmiCalculator() {
26986    (0, _classCallCheck2["default"])(this, WcoBmiCalculator);
26987  }
26988  return (0, _createClass2["default"])(WcoBmiCalculator, [{
26989    key: "initialize",
26990    value: function initialize() {
26991      var $calculatorContainer = $('.tx-wco-bmi-calculator');
26992      $calculatorContainer.find('.show-only-with-js').removeClass('show-only-with-js');
26993      $calculatorContainer.find('.range-input-range input').on('input change', function () {
26994        var container = $(this).parents('.range-container');
26995        var textInput = container.find('.range-input-field input');
26996        textInput.val($(this).val());
26997        textInput.trigger('change');
26998      });
26999      $calculatorContainer.find('.range-input-field input').on('change', function () {
27000        var container = $(this).parents('.range-container');
27001        var rangeInput = container.find('.range-input-range input');
27002        var currentVal = $(this).val();
27003        currentVal = currentVal.replace(',', '.');
27004        rangeInput.val(currentVal);
27005      });
27006      $calculatorContainer.find('.range-input-range input').trigger('change');
27007      $calculatorContainer.find('.hidden-gender-input').on('change', function () {
27008        var fieldset = $(this).closest('.gender-inputs');
27009        fieldset.find('.gender-error').hide();
27010      });
27011      $calculatorContainer.find('input[required]').on('invalid', function () {
27012        if (this.validity.valueMissing) {
27013          this.setCustomValidity('Bitte dieses Feld ausfüllen');
27014        } else if (this.validity.stepMismatch || this.validity.badInput) {
27015          var value = parseFloat($(this).val().replace(',', '.'));
27016          var min = parseFloat($(this).attr('min')) || 0;
27017          var step = parseFloat($(this).attr('step') || 1);
27018          var next1 = Math.floor(Math.round((value - min) * 100) / (step * 100)) * step + min;
27019          var next2 = next1 + step;
27020          if (next1 < min) {
27021            next1 = min;
27022            next2 = min + step;
27023          }
27024
27025          // Browser usually rounds to some precision, let's keep it reasonable
27026          next1 = Math.round(next1 * 100) / 100;
27027          next2 = Math.round(next2 * 100) / 100;
27028          this.setCustomValidity('Bitte einen Wert ohne Kommastellen angeben. Die nächsten beiden Werte sind ' + next1.toString().replace('.', ',') + ' und ' + next2.toString().replace('.', ','));
27029        }
27030      });
27031      $calculatorContainer.find('input[required]').on('input change', function () {
27032        this.setCustomValidity('');
27033      });
27034      $calculatorContainer.find('.bmi-calculator-form').on('submit', function (event) {
27035        event.preventDefault(); // avoid to execute the actual submit of the form.
27036
27037        var form = $(this);
27038        var genderInputs = form.find('.hidden-gender-input');
27039        var genderFieldset = form.find('.gender-inputs');
27040        var genderError = genderFieldset.find('.gender-error');
27041        if (!genderInputs.is(':checked')) {
27042          genderError.show();
27043          genderFieldset.addClass('has-error');
27044          genderInputs.first().focus();
27045          return;
27046        }
27047        genderError.hide();
27048        genderFieldset.removeClass('has-error');
27049        if (!form[0].checkValidity()) {
27050          form[0].reportValidity();
27051          return;
27052        }
27053        var url = form.attr('action');
27054        $.ajax({
27055          type: "POST",
27056          dataType: 'html',
27057          url: url,
27058          data: form.serialize(),
27059          // serializes the form's elements.
27060          success: function success(resultData) {
27061            var resultContainer = $calculatorContainer.find('.bmi-calculator-result');
27062            resultContainer.html(resultData);
27063            resultContainer.focus();
27064          },
27065          error: function error(resultData) {
27066            var resultContainer = $calculatorContainer.find('.bmi-calculator-result');
27067            resultContainer.html('Ein Fehler trat während der Berechnung auf.');
27068            resultContainer.focus();
27069          }
27070        });
27071      });
27072    }
27073  }]);
27074}();
27075
27076},{"@babel/runtime/helpers/classCallCheck":52,"@babel/runtime/helpers/createClass":53,"@babel/runtime/helpers/interopRequireDefault":54}],52:[function(require,module,exports){
27077arguments[4][13][0].apply(exports,arguments)
27078},{"dup":13}],53:[function(require,module,exports){
27079arguments[4][14][0].apply(exports,arguments)
27080},{"./toPropertyKey.js":56,"dup":14}],54:[function(require,module,exports){
27081arguments[4][19][0].apply(exports,arguments)
27082},{"dup":19}],55:[function(require,module,exports){
27083arguments[4][23][0].apply(exports,arguments)
27084},{"./typeof.js":57,"dup":23}],56:[function(require,module,exports){
27085arguments[4][24][0].apply(exports,arguments)
27086},{"./toPrimitive.js":55,"./typeof.js":57,"dup":24}],57:[function(require,module,exports){
27087arguments[4][25][0].apply(exports,arguments)
27088},{"dup":25}],58:[function(require,module,exports){
27089"use strict";
27090
27091var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
27092Object.defineProperty(exports, "__esModule", {
27093  value: true
27094});
27095exports.WcoBzgaMethodenfinder = void 0;
27096var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
27097var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
27098var _isotopeLayout = _interopRequireDefault(require("isotope-layout"));
27099var _nouislider = _interopRequireDefault(require("nouislider"));
27100var _wnumb = _interopRequireDefault(require("wnumb"));
27101window.$ = window.jQuery = require('jquery');
27102var WcoBzgaMethodenfinder = exports.WcoBzgaMethodenfinder = /*#__PURE__*/function () {
27103  function WcoBzgaMethodenfinder() {
27104    (0, _classCallCheck2["default"])(this, WcoBzgaMethodenfinder);
27105    this.filters = [];
27106  }
27107  return (0, _createClass2["default"])(WcoBzgaMethodenfinder, [{
27108    key: "initialize",
27109    value: function initialize() {
27110      var _this2 = this;
27111      var methodenfinderContainer = document.querySelector('.tx-wco-bzga-methodenfinder');
27112      if (methodenfinderContainer === null) {
27113        return null;
27114      }
27115      var filters = {};
27116      document.querySelectorAll('.wco-range-slider').forEach(function (rangeSlider) {
27117        // aria-label="Filter für das empfohlene Alter des Spiels in Jahren (von, bis)"
27118        var data = rangeSlider.dataset;
27119        var sliderPostfix = rangeSlider.getAttribute('data-postfix');
27120        var handleAriaSuffix = sliderPostfix.replace(/<[^>]*>/g, '');
27121        _nouislider["default"].create(rangeSlider, {
27122          start: [parseInt(data['min']), parseInt(data['max'])],
27123          step: parseInt(data['step']),
27124          connect: true,
27125          tooltips: [{
27126            to: function to(value) {
27127              return _this2.getTooltipLabel(data, value, 'min');
27128            }
27129          }, {
27130            to: function to(value) {
27131              return _this2.getTooltipLabel(data, value, 'max');
27132            }
27133          }],
27134          ariaFormat: (0, _wnumb["default"])({
27135            decimals: 0,
27136            suffix: handleAriaSuffix
27137          }),
27138          pips: {
27139            mode: 'count',
27140            values: 5,
27141            density: 0
27142          },
27143          keyboardSupport: true,
27144          range: {
27145            'min': parseInt(data['from']),
27146            'max': parseInt(data['to'])
27147          }
27148        });
27149        rangeSlider.noUiSlider.on('change', function (value, handle, unencoded) {
27150          rangeSlider.classList.add('wco-active-slider');
27151          var filterstring = rangeSlider.getAttribute('id');
27152          filterstring = filterstring.replace('wco-range-', '');
27153          var filterLabel = $('.tx-wco-filterbuttons button[aria-controls="filter-' + filterstring + '"]').text();
27154          var filterValue = filterLabel + parseInt(unencoded[0]) + ' - ' + _this2.getTooltipLabel(data, parseInt(unencoded[1]), 'max');
27155          if ($(".wco-active-filter span:contains('" + filterLabel + "')").length > 0) {
27156            $(".wco-active-filter span:contains('" + filterLabel + "')").html(filterValue);
27157          } else {
27158            _this2.addToFilterInfo(filterValue);
27159          }
27160          $grid.arrange();
27161          _this2.setFilteredElementsAmount($grid);
27162        });
27163      });
27164      var grid = document.querySelector('.tx-wco-methods');
27165
27166      //  ----- ISOTOPE -----
27167      var $grid = new _isotopeLayout["default"](grid, {
27168        itemSelector: '.tx-wco-grid-item',
27169        percentPosition: true,
27170        masonry: {
27171          columnWidth: '.grid-sizer'
27172        },
27173        filter: function filter(itemElement) {
27174          return _this2.getActiveFilter($(itemElement));
27175        }
27176      });
27177      $grid.on('arrangeComplete', function () {
27178        $.each($grid.getFilteredItemElements(), function (i, item) {
27179          var method = i % 2 ? 'removeClass' : 'addClass';
27180          $(item.element)[method]('odd');
27181        });
27182        1;
27183      });
27184
27185      //  ----- SEARCH FIELD-----
27186      var $quicksearch = $('.tx-wco-quicksearch').keyup(this.debounce(function () {
27187        _this2.qsRegex = new RegExp($quicksearch.val(), 'gi');
27188        $grid.arrange();
27189        _this2.setFilteredElementsAmount($grid);
27190      }));
27191
27192      //  ----- FILTER BUTTON -----
27193      $('#filterdetails .btn').on('click', function (e) {
27194        $(e.currentTarget).toggleClass("is-checked");
27195        _this2.manageButton($(e.currentTarget));
27196
27197        // special case cause there are currently no outdoor methods
27198        if ($('button[data-filter=".location-1"]').hasClass('is-checked') || $('button[data-filter=".location-2"]').hasClass('is-checked')) {
27199          _this2.filters['location'].push('.location-0');
27200        } else {
27201          _this2.filters['location'] = [];
27202        }
27203        $grid.arrange();
27204        _this2.setFilteredElementsAmount($grid);
27205      });
27206
27207      //  ----- RESET BUTTON -----
27208      $('.tx-wco-reset-filter').on('click', function () {
27209        $('#filterdetails button.is-checked').each(function (e) {
27210          $(this).click();
27211        });
27212        $(".tx-wco-filterbuttons button[aria-expanded='true']").each(function (e) {
27213          $(this).click();
27214        });
27215        document.querySelectorAll('.wco-range-slider').forEach(function (slider) {
27216          slider.classList.remove('wco-active-slider');
27217          slider.noUiSlider.reset();
27218        });
27219        $('.tx-wco-quicksearch').val('');
27220        _this2.qsRegex = new RegExp($quicksearch.val(), 'gi');
27221        $grid.arrange();
27222        _this2.setFilteredElementsAmount($grid);
27223        $('.wco-active-filter').html('&nbsp;');
27224      });
27225
27226      // SVG CONVERT
27227      $(".tx-wco-method-front-img img").each(function () {
27228        var $img = jQuery(this);
27229        var attributes = $img.prop("attributes");
27230        var imgURL = $img.attr("src");
27231        $.get(imgURL, function (data) {
27232          var $svg = $(data).find('svg');
27233          $svg = $svg.removeAttr('xmlns:a');
27234          $.each(attributes, function () {
27235            $svg.attr(this.name, this.value);
27236          });
27237          $img.replaceWith($svg);
27238        });
27239      });
27240
27241      //Tab Order
27242      var filterKeywords = ["topics", "location", "suitableage", "duration", "groupsize"];
27243      filterKeywords.forEach(function (word) {
27244        return _this2.addFocusDirection(word);
27245      });
27246    }
27247  }, {
27248    key: "manageButton",
27249    value: function manageButton($button) {
27250      var group = $button.parents('.button-group').attr('data-filter-group');
27251      // create array for filter group, if not there yet
27252      var filterGroup = this.filters[group];
27253      if (!filterGroup) {
27254        filterGroup = this.filters[group] = [];
27255      }
27256      var isAll = $button.hasClass('all');
27257      // reset filter group if the all box was checked
27258      if (isAll) {
27259        delete this.filters[group];
27260        if (!$button.hasClass('is-checked')) {
27261          $button.addClass('is-checked');
27262        }
27263      }
27264      // index of
27265      var index = $.inArray($button.attr('data-filter'), filterGroup);
27266      if ($button.hasClass('is-checked')) {
27267        var selector = isAll ? 'button' : 'button.all';
27268        $button.siblings(selector).removeClass('is-checked');
27269        if (!isAll && index === -1) {
27270          // add filter to group
27271          this.filters[group].push($button.attr('data-filter'));
27272        }
27273        this.addToFilterInfo($button.text());
27274      } else if (!isAll) {
27275        // remove filter from group
27276        this.filters[group].splice(index, 1);
27277        // if unchecked the last box, check the all
27278        if (!$button.siblings('.is-checked').length) {
27279          $button.siblings('button.all').attr('checked', 'checked');
27280        }
27281        this.removeFromFilterInfo($button.text());
27282      }
27283    }
27284  }, {
27285    key: "removeFromFilterInfo",
27286    value: function removeFromFilterInfo(buttonText) {
27287      $(".wco-active-filter span:contains('" + buttonText + "')").animate({
27288        opacity: '0'
27289      }, 800, function () {
27290        $(".wco-active-filter span:contains('" + buttonText + "')").remove();
27291      });
27292    }
27293  }, {
27294    key: "addToFilterInfo",
27295    value: function addToFilterInfo(buttonText) {
27296      $('.wco-active-filter').html($('.wco-active-filter').html() + '<span>' + buttonText + '</span>');
27297      $('.wco-active-filter span').animate({
27298        opacity: '1'
27299      });
27300    }
27301  }, {
27302    key: "getActiveFilter",
27303    value: function getActiveFilter($this) {
27304      var _this3 = this;
27305      var searchResult = this.qsRegex ? $this.text().match(this.qsRegex) : true;
27306      var buttonResult = this.getComboFilter().length > 0 ? $this.is(this.getComboFilter()) : true;
27307      var rangeResult = true;
27308      document.querySelectorAll('.wco-range-slider.wco-active-slider').forEach(function (slider) {
27309        if (rangeResult === true) {
27310          rangeResult = _this3.getActiveRangeFilter(slider.parentNode.dataset['filterGroup'], $this);
27311        }
27312      });
27313      return buttonResult && searchResult && rangeResult;
27314    }
27315  }, {
27316    key: "getActiveRangeFilter",
27317    value: function getActiveRangeFilter($field, $this) {
27318      var ret = true;
27319      var slider = document.querySelector('.wco-range-' + $field);
27320      var range = slider.noUiSlider.get(true);
27321      var numberFrom = $this.find('.tx-wco-' + $field + '-from').text();
27322      var numberTo = $this.find('.tx-wco-' + $field + '-to').text();
27323      if ($field === "suitableage" || $field === "groupsize") {
27324        ret = numberFrom <= range[0] && numberTo >= range[1];
27325      }
27326      if ($field === "duration") {
27327        if (range[1] === parseInt(slider.dataset['max'])) {
27328          ret = numberFrom >= range[0];
27329        } else {
27330          ret = numberFrom >= range[0] && numberTo <= range[1];
27331        }
27332      }
27333      return ret;
27334    }
27335  }, {
27336    key: "getComboFilter",
27337    value: function getComboFilter() {
27338      var combo = [];
27339      for (var prop in this.filters) {
27340        var group = this.filters[prop];
27341        if (!group.length) {
27342          // no filters in group, carry on
27343          continue;
27344        }
27345        // add first group
27346        if (!combo.length) {
27347          combo = group.slice(0);
27348          continue;
27349        }
27350        // add additional groups
27351        var nextCombo = [];
27352        // split group into combo: [ A, B ] & [ 1, 2 ] => [ A1, A2, B1, B2 ]
27353        for (var i = 0; i < combo.length; i++) {
27354          for (var j = 0; j < group.length; j++) {
27355            var item = combo[i] + group[j];
27356            nextCombo.push(item);
27357          }
27358        }
27359        combo = nextCombo;
27360      }
27361      return combo.join(', ');
27362    }
27363
27364    // debounce so filtering doesn't happen every millisecond
27365  }, {
27366    key: "debounce",
27367    value: function debounce(fn, threshold) {
27368      var timeout;
27369      threshold = threshold || 100;
27370      return function debounced() {
27371        clearTimeout(timeout);
27372        var args = arguments;
27373        var _this = this;
27374        function delayed() {
27375          fn.apply(_this, args);
27376        }
27377        timeout = setTimeout(delayed, threshold);
27378      };
27379    }
27380  }, {
27381    key: "getTooltipLabel",
27382    value: function getTooltipLabel(data, value, type) {
27383      var label = data['postfix'];
27384      value = parseInt(value);
27385      if (data[type + 'Postfix'] && value === parseInt(data[type])) {
27386        label = data[type + 'Postfix'] + label;
27387      }
27388      return value + label;
27389    }
27390  }, {
27391    key: "setFilteredElementsAmount",
27392    value: function setFilteredElementsAmount($grid) {
27393      var elems = $grid.getFilteredItemElements();
27394      if (elems.length == 0) {
27395        $('.wco-method-amount').html('<p id="wco-method-filter-none">Es wurden keine Spiele zu Ihrer Suche gefunden.<br/>Bitte passen Sie ihre Filtereinstellungen an.</p>');
27396      } else if (elems.length == 1) {
27397        $('.wco-method-amount').html('<span id="wco-method-filter-amount">1</span> Spiel gefunden');
27398      } else {
27399        var currentCount = $('#wco-method-filter-amount').html();
27400        $('.wco-method-amount').html('<span id="wco-method-filter-amount">' + elems.length + '</span> Spiele gefunden');
27401        $('#wco-method-filter-amount').each(function () {
27402          var $this = $(this);
27403          jQuery({
27404            Counter: currentCount
27405          }).animate({
27406            Counter: elems.length
27407          }, {
27408            duration: 800,
27409            easing: 'swing',
27410            step: function step() {
27411              $this.text(Math.round(this.Counter));
27412            }
27413          });
27414        });
27415      }
27416    }
27417  }, {
27418    key: "addFocusDirection",
27419    value: function addFocusDirection(filterKeyword) {
27420      var btnFilter = document.querySelector(".btn-filter-" + filterKeyword);
27421      var filterKeywordsNextFocus = {
27422        topics: '.btn-filter-location',
27423        location: '.btn-filter-suitableage',
27424        suitableage: '.btn-filter-duration',
27425        duration: '.btn-filter-groupsize',
27426        groupsize: '.tx-wco-method-link'
27427      };
27428      var nextBtnFilter = document.querySelector(filterKeywordsNextFocus[filterKeyword]);
27429      if (filterKeyword === "topics" || filterKeyword === "location") {
27430        var btnGroup = document.querySelector("#filter-" + filterKeyword + " .button-group");
27431        var firstFilterTopic = btnGroup.firstChild;
27432        var lastFilterTopic = btnGroup.lastChild;
27433        btnFilter.addEventListener("focusout", function () {
27434          firstFilterTopic.focus();
27435        });
27436        lastFilterTopic.addEventListener("focusout", function () {
27437          nextBtnFilter.focus();
27438        });
27439      } else {
27440        var noUiHandels = Array.from(document.querySelectorAll("#filter-" + filterKeyword + " .wco-range-slider .noUi-base .noUi-handle"));
27441        btnFilter.addEventListener("focusout", function () {
27442          noUiHandels[0].focus();
27443        });
27444        noUiHandels[1].addEventListener("focusout", function () {
27445          nextBtnFilter.focus();
27446        });
27447      }
27448    }
27449  }]);
27450}();
27451
27452},{"@babel/runtime/helpers/classCallCheck":59,"@babel/runtime/helpers/createClass":60,"@babel/runtime/helpers/interopRequireDefault":61,"isotope-layout":69,"jquery":75,"n
27452ouislider":77,"wnumb":80}],59:[function(require,module,exports){
27453arguments[4][13][0].apply(exports,arguments)
27454},{"dup":13}],60:[function(require,module,exports){
27455arguments[4][14][0].apply(exports,arguments)
27456},{"./toPropertyKey.js":63,"dup":14}],61:[function(require,module,exports){
27457arguments[4][19][0].apply(exports,arguments)
27458},{"dup":19}],62:[function(require,module,exports){
27459arguments[4][23][0].apply(exports,arguments)
27460},{"./typeof.js":64,"dup":23}],63:[function(require,module,exports){
27461arguments[4][24][0].apply(exports,arguments)
27462},{"./toPrimitive.js":62,"./typeof.js":64,"dup":24}],64:[function(require,module,exports){
27463arguments[4][25][0].apply(exports,arguments)
27464},{"dup":25}],65:[function(require,module,exports){
27465arguments[4][27][0].apply(exports,arguments)
27466},{"dup":27}],66:[function(require,module,exports){
27467arguments[4][29][0].apply(exports,arguments)
27468},{"dup":29}],67:[function(require,module,exports){
27469arguments[4][30][0].apply(exports,arguments)
27470},{"desandro-matches-selector":65,"dup":30}],68:[function(require,module,exports){
27471arguments[4][31][0].apply(exports,arguments)
27472},{"dup":31}],69:[function(require,module,exports){
27473arguments[4][32][0].apply(exports,arguments)
27474},{"./item":70,"./layout-mode":71,"./layout-modes/fit-rows":72,"./layout-modes/masonry":73,"./layout-modes/vertical":74,"desandro-matches-selector":65,"dup":32,"fizzy-ui-utils":67,"get-size":68,"outlayer":79}],70:[function(require,module,exports){
27475arguments[4][33][0].apply(exports,arguments)
27476},{"dup":33,"outlayer":79}],71:[function(require,module,exports){
27477arguments[4][34][0].apply(exports,arguments)
27478},{"dup":34,"get-size":68,"outlayer":79}],72:[function(require,module,exports){
27479arguments[4][35][0].apply(exports,arguments)
27480},{"../layout-mode":71,"dup":35}],73:[function(require,module,exports){
27481arguments[4][36][0].apply(exports,arguments)
27482},{"../layout-mode":71,"dup":36,"masonry-layout":76}],74:[function(require,module,exports){
27483arguments[4][37][0].apply(exports,arguments)
27484},{"../layout-mode":71,"dup":37}],75:[function(require,module,exports){
vendor: 285,314 bytes, lines 27485-38200
27485/*!
27486 * jQuery JavaScript Library v3.7.1
27487 * https://jquery.com/
27488 *
27489 * Copyright OpenJS Foundation and other contributors
27490 * Released under the MIT license
27491 * https://jquery.org/license
27492 *
27493 * Date: 2023-08-28T13:37Z
27494 */
27495( function( global, factory ) {
27496
27497	"use strict";
27498
27499	if ( typeof module === "object" && typeof module.exports === "object" ) {
27500
27501		// For CommonJS and CommonJS-like environments where a proper `window`
27502		// is present, execute the factory and get jQuery.
27503		// For environments that do not have a `window` with a `document`
27504		// (such as Node.js), expose a factory as module.exports.
27505		// This accentuates the need for the creation of a real `window`.
27506		// e.g. var jQuery = require("jquery")(window);
27507		// See ticket trac-14549 for more info.
27508		module.exports = global.document ?
27509			factory( global, true ) :
27510			function( w ) {
27511				if ( !w.document ) {
27512					throw new Error( "jQuery requires a window with a document" );
27513				}
27514				return factory( w );
27515			};
27516	} else {
27517		factory( global );
27518	}
27519
27520// Pass this if window is not defined yet
27521} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
27522
27523// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
27524// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
27525// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
27526// enough that all such attempts are guarded in a try block.
27527"use strict";
27528
27529var arr = [];
27530
27531var getProto = Object.getPrototypeOf;
27532
27533var slice = arr.slice;
27534
27535var flat = arr.flat ? function( array ) {
27536	return arr.flat.call( array );
27537} : function( array ) {
27538	return arr.concat.apply( [], array );
27539};
27540
27541
27542var push = arr.push;
27543
27544var indexOf = arr.indexOf;
27545
27546var class2type = {};
27547
27548var toString = class2type.toString;
27549
27550var hasOwn = class2type.hasOwnProperty;
27551
27552var fnToString = hasOwn.toString;
27553
27554var ObjectFunctionString = fnToString.call( Object );
27555
27556var support = {};
27557
27558var isFunction = function isFunction( obj ) {
27559
27560		// Support: Chrome <=57, Firefox <=52
27561		// In some browsers, typeof returns "function" for HTML <object> elements
27562		// (i.e., `typeof document.createElement( "object" ) === "function"`).
27563		// We don't want to classify *any* DOM node as a function.
27564		// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
27565		// Plus for old WebKit, typeof returns "function" for HTML collections
27566		// (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
27567		return typeof obj === "function" && typeof obj.nodeType !== "number" &&
27568			typeof obj.item !== "function";
27569	};
27570
27571
27572var isWindow = function isWindow( obj ) {
27573		return obj != null && obj === obj.window;
27574	};
27575
27576
27577var document = window.document;
27578
27579
27580
27581	var preservedScriptAttributes = {
27582		type: true,
27583		src: true,
27584		nonce: true,
27585		noModule: true
27586	};
27587
27588	function DOMEval( code, node, doc ) {
27589		doc = doc || document;
27590
27591		var i, val,
27592			script = doc.createElement( "script" );
27593
27594		script.text = code;
27595		if ( node ) {
27596			for ( i in preservedScriptAttributes ) {
27597
27598				// Support: Firefox 64+, Edge 18+
27599				// Some browsers don't support the "nonce" property on scripts.
27600				// On the other hand, just using `getAttribute` is not enough as
27601				// the `nonce` attribute is reset to an empty string whenever it
27602				// becomes browsing-context connected.
27603				// See https://github.com/whatwg/html/issues/2369
27604				// See https://html.spec.whatwg.org/#nonce-attributes
27605				// The `node.getAttribute` check was added for the sake of
27606				// `jQuery.globalEval` so that it can fake a nonce-containing node
27607				// via an object.
27608				val = node[ i ] || node.getAttribute && node.getAttribute( i );
27609				if ( val ) {
27610					script.setAttribute( i, val );
27611				}
27612			}
27613		}
27614		doc.head.appendChild( script ).parentNode.removeChild( script );
27615	}
27616
27617
27618function toType( obj ) {
27619	if ( obj == null ) {
27620		return obj + "";
27621	}
27622
27623	// Support: Android <=2.3 only (functionish RegExp)
27624	return typeof obj === "object" || typeof obj === "function" ?
27625		class2type[ toString.call( obj ) ] || "object" :
27626		typeof obj;
27627}
27628/* global Symbol */
27629// Defining this global in .eslintrc.json would create a danger of using the global
27630// unguarded in another place, it seems safer to define global only for this module
27631
27632
27633
27634var version = "3.7.1",
27635
27636	rhtmlSuffix = /HTML$/i,
27637
27638	// Define a local copy of jQuery
27639	jQuery = function( selector, context ) {
27640
27641		// The jQuery object is actually just the init constructor 'enhanced'
27642		// Need init if jQuery is called (just allow error to be thrown if not included)
27643		return new jQuery.fn.init( selector, context );
27644	};
27645
27646jQuery.fn = jQuery.prototype = {
27647
27648	// The current version of jQuery being used
27649	jquery: version,
27650
27651	constructor: jQuery,
27652
27653	// The default length of a jQuery object is 0
27654	length: 0,
27655
27656	toArray: function() {
27657		return slice.call( this );
27658	},
27659
27660	// Get the Nth element in the matched element set OR
27661	// Get the whole matched element set as a clean array
27662	get: function( num ) {
27663
27664		// Return all the elements in a clean array
27665		if ( num == null ) {
27666			return slice.call( this );
27667		}
27668
27669		// Return just the one element from the set
27670		return num < 0 ? this[ num + this.length ] : this[ num ];
27671	},
27672
27673	// Take an array of elements and push it onto the stack
27674	// (returning the new matched element set)
27675	pushStack: function( elems ) {
27676
27677		// Build a new jQuery matched element set
27678		var ret = jQuery.merge( this.constructor(), elems );
27679
27680		// Add the old object onto the stack (as a reference)
27681		ret.prevObject = this;
27682
27683		// Return the newly-formed element set
27684		return ret;
27685	},
27686
27687	// Execute a callback for every element in the matched set.
27688	each: function( callback ) {
27689		return jQuery.each( this, callback );
27690	},
27691
27692	map: function( callback ) {
27693		return this.pushStack( jQuery.map( this, function( elem, i ) {
27694			return callback.call( elem, i, elem );
27695		} ) );
27696	},
27697
27698	slice: function() {
27699		return this.pushStack( slice.apply( this, arguments ) );
27700	},
27701
27702	first: function() {
27703		return this.eq( 0 );
27704	},
27705
27706	last: function() {
27707		return this.eq( -1 );
27708	},
27709
27710	even: function() {
27711		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
27712			return ( i + 1 ) % 2;
27713		} ) );
27714	},
27715
27716	odd: function() {
27717		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
27718			return i % 2;
27719		} ) );
27720	},
27721
27722	eq: function( i ) {
27723		var len = this.length,
27724			j = +i + ( i < 0 ? len : 0 );
27725		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
27726	},
27727
27728	end: function() {
27729		return this.prevObject || this.constructor();
27730	},
27731
27732	// For internal use only.
27733	// Behaves like an Array's method, not like a jQuery method.
27734	push: push,
27735	sort: arr.sort,
27736	splice: arr.splice
27737};
27738
27739jQuery.extend = jQuery.fn.extend = function() {
27740	var options, name, src, copy, copyIsArray, clone,
27741		target = arguments[ 0 ] || {},
27742		i = 1,
27743		length = arguments.length,
27744		deep = false;
27745
27746	// Handle a deep copy situation
27747	if ( typeof target === "boolean" ) {
27748		deep = target;
27749
27750		// Skip the boolean and the target
27751		target = arguments[ i ] || {};
27752		i++;
27753	}
27754
27755	// Handle case when target is a string or something (possible in deep copy)
27756	if ( typeof target !== "object" && !isFunction( target ) ) {
27757		target = {};
27758	}
27759
27760	// Extend jQuery itself if only one argument is passed
27761	if ( i === length ) {
27762		target = this;
27763		i--;
27764	}
27765
27766	for ( ; i < length; i++ ) {
27767
27768		// Only deal with non-null/undefined values
27769		if ( ( options = arguments[ i ] ) != null ) {
27770
27771			// Extend the base object
27772			for ( name in options ) {
27773				copy = options[ name ];
27774
27775				// Prevent Object.prototype pollution
27776				// Prevent never-ending loop
27777				if ( name === "__proto__" || target === copy ) {
27778					continue;
27779				}
27780
27781				// Recurse if we're merging plain objects or arrays
27782				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
27783					( copyIsArray = Array.isArray( copy ) ) ) ) {
27784					src = target[ name ];
27785
27786					// Ensure proper type for the source value
27787					if ( copyIsArray && !Array.isArray( src ) ) {
27788						clone = [];
27789					} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
27790						clone = {};
27791					} else {
27792						clone = src;
27793					}
27794					copyIsArray = false;
27795
27796					// Never move original objects, clone them
27797					target[ name ] = jQuery.extend( deep, clone, copy );
27798
27799				// Don't bring in undefined values
27800				} else if ( copy !== undefined ) {
27801					target[ name ] = copy;
27802				}
27803			}
27804		}
27805	}
27806
27807	// Return the modified object
27808	return target;
27809};
27810
27811jQuery.extend( {
27812
27813	// Unique for each copy of jQuery on the page
27814	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
27815
27816	// Assume jQuery is ready without the ready module
27817	isReady: true,
27818
27819	error: function( msg ) {
27820		throw new Error( msg );
27821	},
27822
27823	noop: function() {},
27824
27825	isPlainObject: function( obj ) {
27826		var proto, Ctor;
27827
27828		// Detect obvious negatives
27829		// Use toString instead of jQuery.type to catch host objects
27830		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
27831			return false;
27832		}
27833
27834		proto = getProto( obj );
27835
27836		// Objects with no prototype (e.g., `Object.create( null )`) are plain
27837		if ( !proto ) {
27838			return true;
27839		}
27840
27841		// Objects with prototype are plain iff they were constructed by a global Object function
27842		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
27843		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
27844	},
27845
27846	isEmptyObject: function( obj ) {
27847		var name;
27848
27849		for ( name in obj ) {
27850			return false;
27851		}
27852		return true;
27853	},
27854
27855	// Evaluates a script in a provided context; falls back to the global one
27856	// if not specified.
27857	globalEval: function( code, options, doc ) {
27858		DOMEval( code, { nonce: options && options.nonce }, doc );
27859	},
27860
27861	each: function( obj, callback ) {
27862		var length, i = 0;
27863
27864		if ( isArrayLike( obj ) ) {
27865			length = obj.length;
27866			for ( ; i < length; i++ ) {
27867				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
27868					break;
27869				}
27870			}
27871		} else {
27872			for ( i in obj ) {
27873				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
27874					break;
27875				}
27876			}
27877		}
27878
27879		return obj;
27880	},
27881
27882
27883	// Retrieve the text value of an array of DOM nodes
27884	text: function( elem ) {
27885		var node,
27886			ret = "",
27887			i = 0,
27888			nodeType = elem.nodeType;
27889
27890		if ( !nodeType ) {
27891
27892			// If no nodeType, this is expected to be an array
27893			while ( ( node = elem[ i++ ] ) ) {
27894
27895				// Do not traverse comment nodes
27896				ret += jQuery.text( node );
27897			}
27898		}
27899		if ( nodeType === 1 || nodeType === 11 ) {
27900			return elem.textContent;
27901		}
27902		if ( nodeType === 9 ) {
27903			return elem.documentElement.textContent;
27904		}
27905		if ( nodeType === 3 || nodeType === 4 ) {
27906			return elem.nodeValue;
27907		}
27908
27909		// Do not include comment or processing instruction nodes
27910
27911		return ret;
27912	},
27913
27914	// results is for internal usage only
27915	makeArray: function( arr, results ) {
27916		var ret = results || [];
27917
27918		if ( arr != null ) {
27919			if ( isArrayLike( Object( arr ) ) ) {
27920				jQuery.merge( ret,
27921					typeof arr === "string" ?
27922						[ arr ] : arr
27923				);
27924			} else {
27925				push.call( ret, arr );
27926			}
27927		}
27928
27929		return ret;
27930	},
27931
27932	inArray: function( elem, arr, i ) {
27933		return arr == null ? -1 : indexOf.call( arr, elem, i );
27934	},
27935
27936	isXMLDoc: function( elem ) {
27937		var namespace = elem && elem.namespaceURI,
27938			docElem = elem && ( elem.ownerDocument || elem ).documentElement;
27939
27940		// Assume HTML when documentElement doesn't yet exist, such as inside
27941		// document fragments.
27942		return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" );
27943	},
27944
27945	// Support: Android <=4.0 only, PhantomJS 1 only
27946	// push.apply(_, arraylike) throws on ancient WebKit
27947	merge: function( first, second ) {
27948		var len = +second.length,
27949			j = 0,
27950			i = first.length;
27951
27952		for ( ; j < len; j++ ) {
27953			first[ i++ ] = second[ j ];
27954		}
27955
27956		first.length = i;
27957
27958		return first;
27959	},
27960
27961	grep: function( elems, callback, invert ) {
27962		var callbackInverse,
27963			matches = [],
27964			i = 0,
27965			length = elems.length,
27966			callbackExpect = !invert;
27967
27968		// Go through the array, only saving the items
27969		// that pass the validator function
27970		for ( ; i < length; i++ ) {
27971			callbackInverse = !callback( elems[ i ], i );
27972			if ( callbackInverse !== callbackExpect ) {
27973				matches.push( elems[ i ] );
27974			}
27975		}
27976
27977		return matches;
27978	},
27979
27980	// arg is for internal usage only
27981	map: function( elems, callback, arg ) {
27982		var length, value,
27983			i = 0,
27984			ret = [];
27985
27986		// Go through the array, translating each of the items to their new values
27987		if ( isArrayLike( elems ) ) {
27988			length = elems.length;
27989			for ( ; i < length; i++ ) {
27990				value = callback( elems[ i ], i, arg );
27991
27992				if ( value != null ) {
27993					ret.push( value );
27994				}
27995			}
27996
27997		// Go through every key on the object,
27998		} else {
27999			for ( i in elems ) {
28000				value = callback( elems[ i ], i, arg );
28001
28002				if ( value != null ) {
28003					ret.push( value );
28004				}
28005			}
28006		}
28007
28008		// Flatten any nested arrays
28009		return flat( ret );
28010	},
28011
28012	// A global GUID counter for objects
28013	guid: 1,
28014
28015	// jQuery.support is not used in Core but other projects attach their
28016	// properties to it so it needs to exist.
28017	support: support
28018} );
28019
28020if ( typeof Symbol === "function" ) {
28021	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
28022}
28023
28024// Populate the class2type map
28025jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
28026	function( _i, name ) {
28027		class2type[ "[object " + name + "]" ] = name.toLowerCase();
28028	} );
28029
28030function isArrayLike( obj ) {
28031
28032	// Support: real iOS 8.2 only (not reproducible in simulator)
28033	// `in` check used to prevent JIT error (gh-2145)
28034	// hasOwn isn't used here due to false negatives
28035	// regarding Nodelist length in IE
28036	var length = !!obj && "length" in obj && obj.length,
28037		type = toType( obj );
28038
28039	if ( isFunction( obj ) || isWindow( obj ) ) {
28040		return false;
28041	}
28042
28043	return type === "array" || length === 0 ||
28044		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
28045}
28046
28047
28048function nodeName( elem, name ) {
28049
28050	return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
28051
28052}
28053var pop = arr.pop;
28054
28055
28056var sort = arr.sort;
28057
28058
28059var splice = arr.splice;
28060
28061
28062var whitespace = "[\\x20\\t\\r\\n\\f]";
28063
28064
28065var rtrimCSS = new RegExp(
28066	"^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$",
28067	"g"
28068);
28069
28070
28071
28072
28073// Note: an element does not contain itself
28074jQuery.contains = function( a, b ) {
28075	var bup = b && b.parentNode;
28076
28077	return a === bup || !!( bup && bup.nodeType === 1 && (
28078
28079		// Support: IE 9 - 11+
28080		// IE doesn't have `contains` on SVG.
28081		a.contains ?
28082			a.contains( bup ) :
28083			a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
28084	) );
28085};
28086
28087
28088
28089
28090// CSS string/identifier serialization
28091// https://drafts.csswg.org/cssom/#common-serializing-idioms
28092var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;
28093
28094function fcssescape( ch, asCodePoint ) {
28095	if ( asCodePoint ) {
28096
28097		// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
28098		if ( ch === "\0" ) {
28099			return "\uFFFD";
28100		}
28101
28102		// Control characters and (dependent upon position) numbers get escaped as code points
28103		return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
28104	}
28105
28106	// Other potentially-special ASCII characters get backslash-escaped
28107	return "\\" + ch;
28108}
28109
28110jQuery.escapeSelector = function( sel ) {
28111	return ( sel + "" ).replace( rcssescape, fcssescape );
28112};
28113
28114
28115
28116
28117var preferredDoc = document,
28118	pushNative = push;
28119
28120( function() {
28121
28122var i,
28123	Expr,
28124	outermostContext,
28125	sortInput,
28126	hasDuplicate,
28127	push = pushNative,
28128
28129	// Local document vars
28130	document,
28131	documentElement,
28132	documentIsHTML,
28133	rbuggyQSA,
28134	matches,
28135
28136	// Instance-specific data
28137	expando = jQuery.expando,
28138	dirruns = 0,
28139	done = 0,
28140	classCache = createCache(),
28141	tokenCache = createCache(),
28142	compilerCache = createCache(),
28143	nonnativeSelectorCache = createCache(),
28144	sortOrder = function( a, b ) {
28145		if ( a === b ) {
28146			hasDuplicate = true;
28147		}
28148		return 0;
28149	},
28150
28151	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" +
28152		"loop|multiple|open|readonly|required|scoped",
28153
28154	// Regular expressions
28155
28156	// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
28157	identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
28158		"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
28159
28160	// Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors
28161	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
28162
28163		// Operator (capture 2)
28164		"*([*^$|!~]?=)" + whitespace +
28165
28166		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
28167		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
28168		whitespace + "*\\]",
28169
28170	pseudos = ":(" + identifier + ")(?:\\((" +
28171
28172		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
28173		// 1. quoted (capture 3; capture 4 or capture 5)
28174		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
28175
28176		// 2. simple (capture 6)
28177		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
28178
28179		// 3. anything else (capture 2)
28180		".*" +
28181		")\\)|)",
28182
28183	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
28184	rwhitespace = new RegExp( whitespace + "+", "g" ),
28185
28186	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
28187	rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" +
28188		whitespace + "*" ),
28189	rdescend = new RegExp( whitespace + "|>" ),
28190
28191	rpseudo = new RegExp( pseudos ),
28192	ridentifier = new RegExp( "^" + identifier + "$" ),
28193
28194	matchExpr = {
28195		ID: new RegExp( "^#(" + identifier + ")" ),
28196		CLASS: new RegExp( "^\\.(" + identifier + ")" ),
28197		TAG: new RegExp( "^(" + identifier + "|[*])" ),
28198		ATTR: new RegExp( "^" + attributes ),
28199		PSEUDO: new RegExp( "^" + pseudos ),
28200		CHILD: new RegExp(
28201			"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
28202				whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
28203				whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
28204		bool: new RegExp( "^(?:" + booleans + ")$", "i" ),
28205
28206		// For use in libraries implementing .is()
28207		// We use this for POS matching in `select`
28208		needsContext: new RegExp( "^" + whitespace +
28209			"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
28210			"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
28211	},
28212
28213	rinputs = /^(?:input|select|textarea|button)$/i,
28214	rheader = /^h\d$/i,
28215
28216	// Easily-parseable/retrievable ID or TAG or CLASS selectors
28217	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
28218
28219	rsibling = /[+~]/,
28220
28221	// CSS escapes
28222	// https://www.w3.org/TR/CSS21/syndata.html#escaped-characters
28223	runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace +
28224		"?|\\\\([^\\r\\n\\f])", "g" ),
28225	funescape = function( escape, nonHex ) {
28226		var high = "0x" + escape.slice( 1 ) - 0x10000;
28227
28228		if ( nonHex ) {
28229
28230			// Strip the backslash prefix from a non-hex escape sequence
28231			return nonHex;
28232		}
28233
28234		// Replace a hexadecimal escape sequence with the encoded Unicode code point
28235		// Support: IE <=11+
28236		// For values outside the Basic Multilingual Plane (BMP), manually construct a
28237		// surrogate pair
28238		return high < 0 ?
28239			String.fromCharCode( high + 0x10000 ) :
28240			String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
28241	},
28242
28243	// Used for iframes; see `setDocument`.
28244	// Support: IE 9 - 11+, Edge 12 - 18+
28245	// Removing the function wrapper causes a "Permission Denied"
28246	// error in IE/Edge.
28247	unloadHandler = function() {
28248		setDocument();
28249	},
28250
28251	inDisabledFieldset = addCombinator(
28252		function( elem ) {
28253			return elem.disabled === true && nodeName( elem, "fieldset" );
28254		},
28255		{ dir: "parentNode", next: "legend" }
28256	);
28257
28258// Support: IE <=9 only
28259// Accessing document.activeElement can throw unexpectedly
28260// https://bugs.jquery.com/ticket/13393
28261function safeActiveElement() {
28262	try {
28263		return document.activeElement;
28264	} catch ( err ) { }
28265}
28266
28267// Optimize for push.apply( _, NodeList )
28268try {
28269	push.apply(
28270		( arr = slice.call( preferredDoc.childNodes ) ),
28271		preferredDoc.childNodes
28272	);
28273
28274	// Support: Android <=4.0
28275	// Detect silently failing push.apply
28276	// eslint-disable-next-line no-unused-expressions
28277	arr[ preferredDoc.childNodes.length ].nodeType;
28278} catch ( e ) {
28279	push = {
28280		apply: function( target, els ) {
28281			pushNative.apply( target, slice.call( els ) );
28282		},
28283		call: function( target ) {
28284			pushNative.apply( target, slice.call( arguments, 1 ) );
28285		}
28286	};
28287}
28288
28289function find( selector, context, results, seed ) {
28290	var m, i, elem, nid, match, groups, newSelector,
28291		newContext = context && context.ownerDocument,
28292
28293		// nodeType defaults to 9, since context defaults to document
28294		nodeType = context ? context.nodeType : 9;
28295
28296	results = results || [];
28297
28298	// Return early from calls with invalid selector or context
28299	if ( typeof selector !== "string" || !selector ||
28300		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
28301
28302		return results;
28303	}
28304
28305	// Try to shortcut find operations (as opposed to filters) in HTML documents
28306	if ( !seed ) {
28307		setDocument( context );
28308		context = context || document;
28309
28310		if ( documentIsHTML ) {
28311
28312			// If the selector is sufficiently simple, try using a "get*By*" DOM method
28313			// (excepting DocumentFragment context, where the methods don't exist)
28314			if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
28315
28316				// ID selector
28317				if ( ( m = match[ 1 ] ) ) {
28318
28319					// Document context
28320					if ( nodeType === 9 ) {
28321						if ( ( elem = context.getElementById( m ) ) ) {
28322
28323							// Support: IE 9 only
28324							// getElementById can match elements by name instead of ID
28325							if ( elem.id === m ) {
28326								push.call( results, elem );
28327								return results;
28328							}
28329						} else {
28330							return results;
28331						}
28332
28333					// Element context
28334					} else {
28335
28336						// Support: IE 9 only
28337						// getElementById can match elements by name instead of ID
28338						if ( newContext && ( elem = newContext.getElementById( m ) ) &&
28339							find.contains( context, elem ) &&
28340							elem.id === m ) {
28341
28342							push.call( results, elem );
28343							return results;
28344						}
28345					}
28346
28347				// Type selector
28348				} else if ( match[ 2 ] ) {
28349					push.apply( results, context.getElementsByTagName( selector ) );
28350					return results;
28351
28352				// Class selector
28353				} else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) {
28354					push.apply( results, context.getElementsByClassName( m ) );
28355					return results;
28356				}
28357			}
28358
28359			// Take advantage of querySelectorAll
28360			if ( !nonnativeSelectorCache[ selector + " " ] &&
28361				( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) {
28362
28363				newSelector = selector;
28364				newContext = context;
28365
28366				// qSA considers elements outside a scoping root when evaluating child or
28367				// descendant combinators, which is not what we want.
28368				// In such cases, we work around the behavior by prefixing every selector in the
28369				// list with an ID selector referencing the scope context.
28370				// The technique has to be used as well when a leading combinator is used
28371				// as such selectors are not recognized by querySelectorAll.
28372				// Thanks to Andrew Dupont for this technique.
28373				if ( nodeType === 1 &&
28374					( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) {
28375
28376					// Expand context for sibling selectors
28377					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
28378						context;
28379
28380					// We can use :scope instead of the ID hack if the browser
28381					// supports it & if we're not changing the context.
28382					// Support: IE 11+, Edge 17 - 18+
28383					// IE/Edge sometimes throw a "Permission denied" error when
28384					// strict-comparing two documents; shallow comparisons work.
28385					// eslint-disable-next-line eqeqeq
28386					if ( newContext != context || !support.scope ) {
28387
28388						// Capture the context ID, setting it first if necessary
28389						if ( ( nid = context.getAttribute( "id" ) ) ) {
28390							nid = jQuery.escapeSelector( nid );
28391						} else {
28392							context.setAttribute( "id", ( nid = expando ) );
28393						}
28394					}
28395
28396					// Prefix every selector in the list
28397					groups = tokenize( selector );
28398					i = groups.length;
28399					while ( i-- ) {
28400						groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
28401							toSelector( groups[ i ] );
28402					}
28403					newSelector = groups.join( "," );
28404				}
28405
28406				try {
28407					push.apply( results,
28408						newContext.querySelectorAll( newSelector )
28409					);
28410					return results;
28411				} catch ( qsaError ) {
28412					nonnativeSelectorCache( selector, true );
28413				} finally {
28414					if ( nid === expando ) {
28415						context.removeAttribute( "id" );
28416					}
28417				}
28418			}
28419		}
28420	}
28421
28422	// All others
28423	return select( selector.replace( rtrimCSS, "$1" ), context, results, seed );
28424}
28425
28426/**
28427 * Create key-value caches of limited size
28428 * @returns {function(string, object)} Returns the Object data after storing it on itself with
28429 *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
28430 *	deleting the oldest entry
28431 */
28432function createCache() {
28433	var keys = [];
28434
28435	function cache( key, value ) {
28436
28437		// Use (key + " ") to avoid collision with native prototype properties
28438		// (see https://github.com/jquery/sizzle/issues/157)
28439		if ( keys.push( key + " " ) > Expr.cacheLength ) {
28440
28441			// Only keep the most recent entries
28442			delete cache[ keys.shift() ];
28443		}
28444		return ( cache[ key + " " ] = value );
28445	}
28446	return cache;
28447}
28448
28449/**
28450 * Mark a function for special use by jQuery selector module
28451 * @param {Function} fn The function to mark
28452 */
28453function markFunction( fn ) {
28454	fn[ expando ] = true;
28455	return fn;
28456}
28457
28458/**
28459 * Support testing using an element
28460 * @param {Function} fn Passed the created element and returns a boolean result
28461 */
28462function assert( fn ) {
28463	var el = document.createElement( "fieldset" );
28464
28465	try {
28466		return !!fn( el );
28467	} catch ( e ) {
28468		return false;
28469	} finally {
28470
28471		// Remove from its parent by default
28472		if ( el.parentNode ) {
28473			el.parentNode.removeChild( el );
28474		}
28475
28476		// release memory in IE
28477		el = null;
28478	}
28479}
28480
28481/**
28482 * Returns a function to use in pseudos for input types
28483 * @param {String} type
28484 */
28485function createInputPseudo( type ) {
28486	return function( elem ) {
28487		return nodeName( elem, "input" ) && elem.type === type;
28488	};
28489}
28490
28491/**
28492 * Returns a function to use in pseudos for buttons
28493 * @param {String} type
28494 */
28495function createButtonPseudo( type ) {
28496	return function( elem ) {
28497		return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) &&
28498			elem.type === type;
28499	};
28500}
28501
28502/**
28503 * Returns a function to use in pseudos for :enabled/:disabled
28504 * @param {Boolean} disabled true for :disabled; false for :enabled
28505 */
28506function createDisabledPseudo( disabled ) {
28507
28508	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
28509	return function( elem ) {
28510
28511		// Only certain elements can match :enabled or :disabled
28512		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
28513		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
28514		if ( "form" in elem ) {
28515
28516			// Check for inherited disabledness on relevant non-disabled elements:
28517			// * listed form-associated elements in a disabled fieldset
28518			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
28519			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
28520			// * option elements in a disabled optgroup
28521			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
28522			// All such elements have a "form" property.
28523			if ( elem.parentNode && elem.disabled === false ) {
28524
28525				// Option elements defer to a parent optgroup if present
28526				if ( "label" in elem ) {
28527					if ( "label" in elem.parentNode ) {
28528						return elem.parentNode.disabled === disabled;
28529					} else {
28530						return elem.disabled === disabled;
28531					}
28532				}
28533
28534				// Support: IE 6 - 11+
28535				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
28536				return elem.isDisabled === disabled ||
28537
28538					// Where there is no isDisabled, check manually
28539					elem.isDisabled !== !disabled &&
28540						inDisabledFieldset( elem ) === disabled;
28541			}
28542
28543			return elem.disabled === disabled;
28544
28545		// Try to winnow out elements that can't be disabled before trusting the disabled property.
28546		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
28547		// even exist on them, let alone have a boolean value.
28548		} else if ( "label" in elem ) {
28549			return elem.disabled === disabled;
28550		}
28551
28552		// Remaining elements are neither :enabled nor :disabled
28553		return false;
28554	};
28555}
28556
28557/**
28558 * Returns a function to use in pseudos for positionals
28559 * @param {Function} fn
28560 */
28561function createPositionalPseudo( fn ) {
28562	return markFunction( function( argument ) {
28563		argument = +argument;
28564		return markFunction( function( seed, matches ) {
28565			var j,
28566				matchIndexes = fn( [], seed.length, argument ),
28567				i = matchIndexes.length;
28568
28569			// Match elements found at the specified indexes
28570			while ( i-- ) {
28571				if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
28572					seed[ j ] = !( matches[ j ] = seed[ j ] );
28573				}
28574			}
28575		} );
28576	} );
28577}
28578
28579/**
28580 * Checks a node for validity as a jQuery selector context
28581 * @param {Element|Object=} context
28582 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
28583 */
28584function testContext( context ) {
28585	return context && typeof context.getElementsByTagName !== "undefined" && context;
28586}
28587
28588/**
28589 * Sets document-related variables once based on the current document
28590 * @param {Element|Object} [node] An element or document object to use to set the document
28591 * @returns {Object} Returns the current document
28592 */
28593function setDocument( node ) {
28594	var subWindow,
28595		doc = node ? node.ownerDocument || node : preferredDoc;
28596
28597	// Return early if doc is invalid or already selected
28598	// Support: IE 11+, Edge 17 - 18+
28599	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
28600	// two documents; shallow comparisons work.
28601	// eslint-disable-next-line eqeqeq
28602	if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
28603		return document;
28604	}
28605
28606	// Update global variables
28607	document = doc;
28608	documentElement = document.documentElement;
28609	documentIsHTML = !jQuery.isXMLDoc( document );
28610
28611	// Support: iOS 7 only, IE 9 - 11+
28612	// Older browsers didn't support unprefixed `matches`.
28613	matches = documentElement.matches ||
28614		documentElement.webkitMatchesSelector ||
28615		documentElement.msMatchesSelector;
28616
28617	// Support: IE 9 - 11+, Edge 12 - 18+
28618	// Accessing iframe documents after unload throws "permission denied" errors
28619	// (see trac-13936).
28620	// Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`,
28621	// all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well.
28622	if ( documentElement.msMatchesSelector &&
28623
28624		// Support: IE 11+, Edge 17 - 18+
28625		// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
28626		// two documents; shallow comparisons work.
28627		// eslint-disable-next-line eqeqeq
28628		preferredDoc != document &&
28629		( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
28630
28631		// Support: IE 9 - 11+, Edge 12 - 18+
28632		subWindow.addEventListener( "unload", unloadHandler );
28633	}
28634
28635	// Support: IE <10
28636	// Check if getElementById returns elements by name
28637	// The broken getElementById methods don't pick up programmatically-set names,
28638	// so use a roundabout getElementsByName test
28639	support.getById = assert( function( el ) {
28640		documentElement.appendChild( el ).id = jQuery.expando;
28641		return !document.getElementsByName ||
28642			!document.getElementsByName( jQuery.expando ).length;
28643	} );
28644
28645	// Support: IE 9 only
28646	// Check to see if it's possible to do matchesSelector
28647	// on a disconnected node.
28648	support.disconnectedMatch = assert( function( el ) {
28649		return matches.call( el, "*" );
28650	} );
28651
28652	// Support: IE 9 - 11+, Edge 12 - 18+
28653	// IE/Edge don't support the :scope pseudo-class.
28654	support.scope = assert( function() {
28655		return document.querySelectorAll( ":scope" );
28656	} );
28657
28658	// Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only
28659	// Make sure the `:has()` argument is parsed unforgivingly.
28660	// We include `*` in the test to detect buggy implementations that are
28661	// _selectively_ forgiving (specifically when the list includes at least
28662	// one valid selector).
28663	// Note that we treat complete lack of support for `:has()` as if it were
28664	// spec-compliant support, which is fine because use of `:has()` in such
28665	// environments will fail in the qSA path and fall back to jQuery traversal
28666	// anyway.
28667	support.cssHas = assert( function() {
28668		try {
28669			document.querySelector( ":has(*,:jqfake)" );
28670			return false;
28671		} catch ( e ) {
28672			return true;
28673		}
28674	} );
28675
28676	// ID filter and find
28677	if ( support.getById ) {
28678		Expr.filter.ID = function( id ) {
28679			var attrId = id.replace( runescape, funescape );
28680			return function( elem ) {
28681				return elem.getAttribute( "id" ) === attrId;
28682			};
28683		};
28684		Expr.find.ID = function( id, context ) {
28685			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
28686				var elem = context.getElementById( id );
28687				return elem ? [ elem ] : [];
28688			}
28689		};
28690	} else {
28691		Expr.filter.ID =  function( id ) {
28692			var attrId = id.replace( runescape, funescape );
28693			return function( elem ) {
28694				var node = typeof elem.getAttributeNode !== "undefined" &&
28695					elem.getAttributeNode( "id" );
28696				return node && node.value === attrId;
28697			};
28698		};
28699
28700		// Support: IE 6 - 7 only
28701		// getElementById is not reliable as a find shortcut
28702		Expr.find.ID = function( id, context ) {
28703			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
28704				var node, i, elems,
28705					elem = context.getElementById( id );
28706
28707				if ( elem ) {
28708
28709					// Verify the id attribute
28710					node = elem.getAttributeNode( "id" );
28711					if ( node && node.value === id ) {
28712						return [ elem ];
28713					}
28714
28715					// Fall back on getElementsByName
28716					elems = context.getElementsByName( id );
28717					i = 0;
28718					while ( ( elem = elems[ i++ ] ) ) {
28719						node = elem.getAttributeNode( "id" );
28720						if ( node && node.value === id ) {
28721							return [ elem ];
28722						}
28723					}
28724				}
28725
28726				return [];
28727			}
28728		};
28729	}
28730
28731	// Tag
28732	Expr.find.TAG = function( tag, context ) {
28733		if ( typeof context.getElementsByTagName !== "undefined" ) {
28734			return context.getElementsByTagName( tag );
28735
28736		// DocumentFragment nodes don't have gEBTN
28737		} else {
28738			return context.querySelectorAll( tag );
28739		}
28740	};
28741
28742	// Class
28743	Expr.find.CLASS = function( className, context ) {
28744		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
28745			return context.getElementsByClassName( className );
28746		}
28747	};
28748
28749	/* QSA/matchesSelector
28750	---------------------------------------------------------------------- */
28751
28752	// QSA and matchesSelector support
28753
28754	rbuggyQSA = [];
28755
28756	// Build QSA regex
28757	// Regex strategy adopted from Diego Perini
28758	assert( function( el ) {
28759
28760		var input;
28761
28762		documentElement.appendChild( el ).innerHTML =
28763			"<a id='" + expando + "' href='' disabled='disabled'></a>" +
28764			"<select id='" + expando + "-\r\\' disabled='disabled'>" +
28765			"<option selected=''></option></select>";
28766
28767		// Support: iOS <=7 - 8 only
28768		// Boolean attributes and "value" are not treated correctly in some XML documents
28769		if ( !el.querySelectorAll( "[selected]" ).length ) {
28770			rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
28771		}
28772
28773		// Support: iOS <=7 - 8 only
28774		if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
28775			rbuggyQSA.push( "~=" );
28776		}
28777
28778		// Support: iOS 8 only
28779		// https://bugs.webkit.org/show_bug.cgi?id=136851
28780		// In-page `selector#id sibling-combinator selector` fails
28781		if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
28782			rbuggyQSA.push( ".#.+[+~]" );
28783		}
28784
28785		// Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+
28786		// In some of the document kinds, these selectors wouldn't work natively.
28787		// This is probably OK but for backwards compatibility we want to maintain
28788		// handling them through jQuery traversal in jQuery 3.x.
28789		if ( !el.querySelectorAll( ":checked" ).length ) {
28790			rbuggyQSA.push( ":checked" );
28791		}
28792
28793		// Support: Windows 8 Native Apps
28794		// The type and name attributes are restricted during .innerHTML assignment
28795		input = document.createElement( "input" );
28796		input.setAttribute( "type", "hidden" );
28797		el.appendChild( input ).setAttribute( "name", "D" );
28798
28799		// Support: IE 9 - 11+
28800		// IE's :disabled selector does not pick up the children of disabled fieldsets
28801		// Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+
28802		// In some of the document kinds, these selectors wouldn't work natively.
28803		// This is probably OK but for backwards compatibility we want to maintain
28804		// handling them through jQuery traversal in jQuery 3.x.
28805		documentElement.appendChild( el ).disabled = true;
28806		if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
28807			rbuggyQSA.push( ":enabled", ":disabled" );
28808		}
28809
28810		// Support: IE 11+, Edge 15 - 18+
28811		// IE 11/Edge don't find elements on a `[name='']` query in some cases.
28812		// Adding a temporary attribute to the document before the selection works
28813		// around the issue.
28814		// Interestingly, IE 10 & older don't seem to have the issue.
28815		input = document.createElement( "input" );
28816		input.setAttribute( "name", "" );
28817		el.appendChild( input );
28818		if ( !el.querySelectorAll( "[name='']" ).length ) {
28819			rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
28820				whitespace + "*(?:''|\"\")" );
28821		}
28822	} );
28823
28824	if ( !support.cssHas ) {
28825
28826		// Support: Chrome 105 - 110+, Safari 15.4 - 16.3+
28827		// Our regular `try-catch` mechanism fails to detect natively-unsupported
28828		// pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`)
28829		// in browsers that parse the `:has()` argument as a forgiving selector list.
28830		// https://drafts.csswg.org/selectors/#relational now requires the argument
28831		// to be parsed unforgivingly, but browsers have not yet fully adjusted.
28832		rbuggyQSA.push( ":has" );
28833	}
28834
28835	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
28836
28837	/* Sorting
28838	---------------------------------------------------------------------- */
28839
28840	// Document order sorting
28841	sortOrder = function( a, b ) {
28842
28843		// Flag for duplicate removal
28844		if ( a === b ) {
28845			hasDuplicate = true;
28846			return 0;
28847		}
28848
28849		// Sort on method existence if only one input has compareDocumentPosition
28850		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
28851		if ( compare ) {
28852			return compare;
28853		}
28854
28855		// Calculate position if both inputs belong to the same document
28856		// Support: IE 11+, Edge 17 - 18+
28857		// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
28858		// two documents; shallow comparisons work.
28859		// eslint-disable-next-line eqeqeq
28860		compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
28861			a.compareDocumentPosition( b ) :
28862
28863			// Otherwise we know they are disconnected
28864			1;
28865
28866		// Disconnected nodes
28867		if ( compare & 1 ||
28868			( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
28869
28870			// Choose the first element that is related to our preferred document
28871			// Support: IE 11+, Edge 17 - 18+
28872			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
28873			// two documents; shallow comparisons work.
28874			// eslint-disable-next-line eqeqeq
28875			if ( a === document || a.ownerDocument == preferredDoc &&
28876				find.contains( preferredDoc, a ) ) {
28877				return -1;
28878			}
28879
28880			// Support: IE 11+, Edge 17 - 18+
28881			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
28882			// two documents; shallow comparisons work.
28883			// eslint-disable-next-line eqeqeq
28884			if ( b === document || b.ownerDocument == preferredDoc &&
28885				find.contains( preferredDoc, b ) ) {
28886				return 1;
28887			}
28888
28889			// Maintain original order
28890			return sortInput ?
28891				( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
28892				0;
28893		}
28894
28895		return compare & 4 ? -1 : 1;
28896	};
28897
28898	return document;
28899}
28900
28901find.matches = function( expr, elements ) {
28902	return find( expr, null, null, elements );
28903};
28904
28905find.matchesSelector = function( elem, expr ) {
28906	setDocument( elem );
28907
28908	if ( documentIsHTML &&
28909		!nonnativeSelectorCache[ expr + " " ] &&
28910		( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
28911
28912		try {
28913			var ret = matches.call( elem, expr );
28914
28915			// IE 9's matchesSelector returns false on disconnected nodes
28916			if ( ret || support.disconnectedMatch ||
28917
28918					// As well, disconnected nodes are said to be in a document
28919					// fragment in IE 9
28920					elem.document && elem.document.nodeType !== 11 ) {
28921				return ret;
28922			}
28923		} catch ( e ) {
28924			nonnativeSelectorCache( expr, true );
28925		}
28926	}
28927
28928	return find( expr, document, null, [ elem ] ).length > 0;
28929};
28930
28931find.contains = function( context, elem ) {
28932
28933	// Set document vars if needed
28934	// Support: IE 11+, Edge 17 - 18+
28935	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
28936	// two documents; shallow comparisons work.
28937	// eslint-disable-next-line eqeqeq
28938	if ( ( context.ownerDocument || context ) != document ) {
28939		setDocument( context );
28940	}
28941	return jQuery.contains( context, elem );
28942};
28943
28944
28945find.attr = function( elem, name ) {
28946
28947	// Set document vars if needed
28948	// Support: IE 11+, Edge 17 - 18+
28949	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
28950	// two documents; shallow comparisons work.
28951	// eslint-disable-next-line eqeqeq
28952	if ( ( elem.ownerDocument || elem ) != document ) {
28953		setDocument( elem );
28954	}
28955
28956	var fn = Expr.attrHandle[ name.toLowerCase() ],
28957
28958		// Don't get fooled by Object.prototype properties (see trac-13807)
28959		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
28960			fn( elem, name, !documentIsHTML ) :
28961			undefined;
28962
28963	if ( val !== undefined ) {
28964		return val;
28965	}
28966
28967	return elem.getAttribute( name );
28968};
28969
28970find.error = function( msg ) {
28971	throw new Error( "Syntax error, unrecognized expression: " + msg );
28972};
28973
28974/**
28975 * Document sorting and removing duplicates
28976 * @param {ArrayLike} results
28977 */
28978jQuery.uniqueSort = function( results ) {
28979	var elem,
28980		duplicates = [],
28981		j = 0,
28982		i = 0;
28983
28984	// Unless we *know* we can detect duplicates, assume their presence
28985	//
28986	// Support: Android <=4.0+
28987	// Testing for detecting duplicates is unpredictable so instead assume we can't
28988	// depend on duplicate detection in all browsers without a stable sort.
28989	hasDuplicate = !support.sortStable;
28990	sortInput = !support.sortStable && slice.call( results, 0 );
28991	sort.call( results, sortOrder );
28992
28993	if ( hasDuplicate ) {
28994		while ( ( elem = results[ i++ ] ) ) {
28995			if ( elem === results[ i ] ) {
28996				j = duplicates.push( i );
28997			}
28998		}
28999		while ( j-- ) {
29000			splice.call( results, duplicates[ j ], 1 );
29001		}
29002	}
29003
29004	// Clear input after sorting to release objects
29005	// See https://github.com/jquery/sizzle/pull/225
29006	sortInput = null;
29007
29008	return results;
29009};
29010
29011jQuery.fn.uniqueSort = function() {
29012	return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) );
29013};
29014
29015Expr = jQuery.expr = {
29016
29017	// Can be adjusted by the user
29018	cacheLength: 50,
29019
29020	createPseudo: markFunction,
29021
29022	match: matchExpr,
29023
29024	attrHandle: {},
29025
29026	find: {},
29027
29028	relative: {
29029		">": { dir: "parentNode", first: true },
29030		" ": { dir: "parentNode" },
29031		"+": { dir: "previousSibling", first: true },
29032		"~": { dir: "previousSibling" }
29033	},
29034
29035	preFilter: {
29036		ATTR: function( match ) {
29037			match[ 1 ] = match[ 1 ].replace( runescape, funescape );
29038
29039			// Move the given value to match[3] whether quoted or unquoted
29040			match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" )
29041				.replace( runescape, funescape );
29042
29043			if ( match[ 2 ] === "~=" ) {
29044				match[ 3 ] = " " + match[ 3 ] + " ";
29045			}
29046
29047			return match.slice( 0, 4 );
29048		},
29049
29050		CHILD: function( match ) {
29051
29052			/* matches from matchExpr["CHILD"]
29053				1 type (only|nth|...)
29054				2 what (child|of-type)
29055				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
29056				4 xn-component of xn+y argument ([+-]?\d*n|)
29057				5 sign of xn-component
29058				6 x of xn-component
29059				7 sign of y-component
29060				8 y of y-component
29061			*/
29062			match[ 1 ] = match[ 1 ].toLowerCase();
29063
29064			if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
29065
29066				// nth-* requires argument
29067				if ( !match[ 3 ] ) {
29068					find.error( match[ 0 ] );
29069				}
29070
29071				// numeric x and y parameters for Expr.filter.CHILD
29072				// remember that false/true cast respectively to 0/1
29073				match[ 4 ] = +( match[ 4 ] ?
29074					match[ 5 ] + ( match[ 6 ] || 1 ) :
29075					2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" )
29076				);
29077				match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
29078
29079			// other types prohibit arguments
29080			} else if ( match[ 3 ] ) {
29081				find.error( match[ 0 ] );
29082			}
29083
29084			return match;
29085		},
29086
29087		PSEUDO: function( match ) {
29088			var excess,
29089				unquoted = !match[ 6 ] && match[ 2 ];
29090
29091			if ( matchExpr.CHILD.test( match[ 0 ] ) ) {
29092				return null;
29093			}
29094
29095			// Accept quoted arguments as-is
29096			if ( match[ 3 ] ) {
29097				match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
29098
29099			// Strip excess characters from unquoted arguments
29100			} else if ( unquoted && rpseudo.test( unquoted ) &&
29101
29102				// Get excess from tokenize (recursively)
29103				( excess = tokenize( unquoted, true ) ) &&
29104
29105				// advance to the next closing parenthesis
29106				( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
29107
29108				// excess is a negative index
29109				match[ 0 ] = match[ 0 ].slice( 0, excess );
29110				match[ 2 ] = unquoted.slice( 0, excess );
29111			}
29112
29113			// Return only captures needed by the pseudo filter method (type and argument)
29114			return match.slice( 0, 3 );
29115		}
29116	},
29117
29118	filter: {
29119
29120		TAG: function( nodeNameSelector ) {
29121			var expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
29122			return nodeNameSelector === "*" ?
29123				function() {
29124					return true;
29125				} :
29126				function( elem ) {
29127					return nodeName( elem, expectedNodeName );
29128				};
29129		},
29130
29131		CLASS: function( className ) {
29132			var pattern = classCache[ className + " " ];
29133
29134			return pattern ||
29135				( pattern = new RegExp( "(^|" + whitespace + ")" + className +
29136					"(" + whitespace + "|$)" ) ) &&
29137				classCache( className, function( elem ) {
29138					return pattern.test(
29139						typeof elem.className === "string" && elem.className ||
29140							typeof elem.getAttribute !== "undefined" &&
29141								elem.getAttribute( "class" ) ||
29142							""
29143					);
29144				} );
29145		},
29146
29147		ATTR: function( name, operator, check ) {
29148			return function( elem ) {
29149				var result = find.attr( elem, name );
29150
29151				if ( result == null ) {
29152					return operator === "!=";
29153				}
29154				if ( !operator ) {
29155					return true;
29156				}
29157
29158				result += "";
29159
29160				if ( operator === "=" ) {
29161					return result === check;
29162				}
29163				if ( operator === "!=" ) {
29164					return result !== check;
29165				}
29166				if ( operator === "^=" ) {
29167					return check && result.indexOf( check ) === 0;
29168				}
29169				if ( operator === "*=" ) {
29170					return check && result.indexOf( check ) > -1;
29171				}
29172				if ( operator === "$=" ) {
29173					return check && result.slice( -check.length ) === check;
29174				}
29175				if ( operator === "~=" ) {
29176					return ( " " + result.replace( rwhitespace, " " ) + " " )
29177						.indexOf( check ) > -1;
29178				}
29179				if ( operator === "|=" ) {
29180					return result === check || result.slice( 0, check.length + 1 ) === check + "-";
29181				}
29182
29183				return false;
29184			};
29185		},
29186
29187		CHILD: function( type, what, _argument, first, last ) {
29188			var simple = type.slice( 0, 3 ) !== "nth",
29189				forward = type.slice( -4 ) !== "last",
29190				ofType = what === "of-type";
29191
29192			return first === 1 && last === 0 ?
29193
29194				// Shortcut for :nth-*(n)
29195				function( elem ) {
29196					return !!elem.parentNode;
29197				} :
29198
29199				function( elem, _context, xml ) {
29200					var cache, outerCache, node, nodeIndex, start,
29201						dir = simple !== forward ? "nextSibling" : "previousSibling",
29202						parent = elem.parentNode,
29203						name = ofType && elem.nodeName.toLowerCase(),
29204						useCache = !xml && !ofType,
29205						diff = false;
29206
29207					if ( parent ) {
29208
29209						// :(first|last|only)-(child|of-type)
29210						if ( simple ) {
29211							while ( dir ) {
29212								node = elem;
29213								while ( ( node = node[ dir ] ) ) {
29214									if ( ofType ?
29215										nodeName( node, name ) :
29216										node.nodeType === 1 ) {
29217
29218										return false;
29219									}
29220								}
29221
29222								// Reverse direction for :only-* (if we haven't yet done so)
29223								start = dir = type === "only" && !start && "nextSibling";
29224							}
29225							return true;
29226						}
29227
29228						start = [ forward ? parent.firstChild : parent.lastChild ];
29229
29230						// non-xml :nth-child(...) stores cache data on `parent`
29231						if ( forward && useCache ) {
29232
29233							// Seek `elem` from a previously-cached index
29234							outerCache = parent[ expando ] || ( parent[ expando ] = {} );
29235							cache = outerCache[ type ] || [];
29236							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
29237							diff = nodeIndex && cache[ 2 ];
29238							node = nodeIndex && parent.childNodes[ nodeIndex ];
29239
29240							while ( ( node = ++nodeIndex && node && node[ dir ] ||
29241
29242								// Fallback to seeking `elem` from the start
29243								( diff = nodeIndex = 0 ) || start.pop() ) ) {
29244
29245								// When found, cache indexes on `parent` and break
29246								if ( node.nodeType === 1 && ++diff && node === elem ) {
29247									outerCache[ type ] = [ dirruns, nodeIndex, diff ];
29248									break;
29249								}
29250							}
29251
29252						} else {
29253
29254							// Use previously-cached element index if available
29255							if ( useCache ) {
29256								outerCache = elem[ expando ] || ( elem[ expando ] = {} );
29257								cache = outerCache[ type ] || [];
29258								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
29259								diff = nodeIndex;
29260							}
29261
29262							// xml :nth-child(...)
29263							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
29264							if ( diff === false ) {
29265
29266								// Use the same loop as above to seek `elem` from the start
29267								while ( ( node = ++nodeIndex && node && node[ dir ] ||
29268									( diff = nodeIndex = 0 ) || start.pop() ) ) {
29269
29270									if ( ( ofType ?
29271										nodeName( node, name ) :
29272										node.nodeType === 1 ) &&
29273										++diff ) {
29274
29275										// Cache the index of each encountered element
29276										if ( useCache ) {
29277											outerCache = node[ expando ] ||
29278												( node[ expando ] = {} );
29279											outerCache[ type ] = [ dirruns, diff ];
29280										}
29281
29282										if ( node === elem ) {
29283											break;
29284										}
29285									}
29286								}
29287							}
29288						}
29289
29290						// Incorporate the offset, then check against cycle size
29291						diff -= last;
29292						return diff === first || ( diff % first === 0 && diff / first >= 0 );
29293					}
29294				};
29295		},
29296
29297		PSEUDO: function( pseudo, argument ) {
29298
29299			// pseudo-class names are case-insensitive
29300			// https://www.w3.org/TR/selectors/#pseudo-classes
29301			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
29302			// Remember that setFilters inherits from pseudos
29303			var args,
29304				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
29305					find.error( "unsupported pseudo: " + pseudo );
29306
29307			// The user may use createPseudo to indicate that
29308			// arguments are needed to create the filter function
29309			// just as jQuery does
29310			if ( fn[ expando ] ) {
29311				return fn( argument );
29312			}
29313
29314			// But maintain support for old signatures
29315			if ( fn.length > 1 ) {
29316				args = [ pseudo, pseudo, "", argument ];
29317				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
29318					markFunction( function( seed, matches ) {
29319						var idx,
29320							matched = fn( seed, argument ),
29321							i = matched.length;
29322						while ( i-- ) {
29323							idx = indexOf.call( seed, matched[ i ] );
29324							seed[ idx ] = !( matches[ idx ] = matched[ i ] );
29325						}
29326					} ) :
29327					function( elem ) {
29328						return fn( elem, 0, args );
29329					};
29330			}
29331
29332			return fn;
29333		}
29334	},
29335
29336	pseudos: {
29337
29338		// Potentially complex pseudos
29339		not: markFunction( function( selector ) {
29340
29341			// Trim the selector passed to compile
29342			// to avoid treating leading and trailing
29343			// spaces as combinators
29344			var input = [],
29345				results = [],
29346				matcher = compile( selector.replace( rtrimCSS, "$1" ) );
29347
29348			return matcher[ expando ] ?
29349				markFunction( function( seed, matches, _context, xml ) {
29350					var elem,
29351						unmatched = matcher( seed, null, xml, [] ),
29352						i = seed.length;
29353
29354					// Match elements unmatched by `matcher`
29355					while ( i-- ) {
29356						if ( ( elem = unmatched[ i ] ) ) {
29357							seed[ i ] = !( matches[ i ] = elem );
29358						}
29359					}
29360				} ) :
29361				function( elem, _context, xml ) {
29362					input[ 0 ] = elem;
29363					matcher( input, null, xml, results );
29364
29365					// Don't keep the element
29366					// (see https://github.com/jquery/sizzle/issues/299)
29367					input[ 0 ] = null;
29368					return !results.pop();
29369				};
29370		} ),
29371
29372		has: markFunction( function( selector ) {
29373			return function( elem ) {
29374				return find( selector, elem ).length > 0;
29375			};
29376		} ),
29377
29378		contains: markFunction( function( text ) {
29379			text = text.replace( runescape, funescape );
29380			return function( elem ) {
29381				return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1;
29382			};
29383		} ),
29384
29385		// "Whether an element is represented by a :lang() selector
29386		// is based solely on the element's language value
29387		// being equal to the identifier C,
29388		// or beginning with the identifier C immediately followed by "-".
29389		// The matching of C against the element's language value is performed case-insensitively.
29390		// The identifier C does not have to be a valid language name."
29391		// https://www.w3.org/TR/selectors/#lang-pseudo
29392		lang: markFunction( function( lang ) {
29393
29394			// lang value must be a valid identifier
29395			if ( !ridentifier.test( lang || "" ) ) {
29396				find.error( "unsupported lang: " + lang );
29397			}
29398			lang = lang.replace( runescape, funescape ).toLowerCase();
29399			return function( elem ) {
29400				var elemLang;
29401				do {
29402					if ( ( elemLang = documentIsHTML ?
29403						elem.lang :
29404						elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
29405
29406						elemLang = elemLang.toLowerCase();
29407						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
29408					}
29409				} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
29410				return false;
29411			};
29412		} ),
29413
29414		// Miscellaneous
29415		target: function( elem ) {
29416			var hash = window.location && window.location.hash;
29417			return hash && hash.slice( 1 ) === elem.id;
29418		},
29419
29420		root: function( elem ) {
29421			return elem === documentElement;
29422		},
29423
29424		focus: function( elem ) {
29425			return elem === safeActiveElement() &&
29426				document.hasFocus() &&
29427				!!( elem.type || elem.href || ~elem.tabIndex );
29428		},
29429
29430		// Boolean properties
29431		enabled: createDisabledPseudo( false ),
29432		disabled: createDisabledPseudo( true ),
29433
29434		checked: function( elem ) {
29435
29436			// In CSS3, :checked should return both checked and selected elements
29437			// https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
29438			return ( nodeName( elem, "input" ) && !!elem.checked ) ||
29439				( nodeName( elem, "option" ) && !!elem.selected );
29440		},
29441
29442		selected: function( elem ) {
29443
29444			// Support: IE <=11+
29445			// Accessing the selectedIndex property
29446			// forces the browser to treat the default option as
29447			// selected when in an optgroup.
29448			if ( elem.parentNode ) {
29449				// eslint-disable-next-line no-unused-expressions
29450				elem.parentNode.selectedIndex;
29451			}
29452
29453			return elem.selected === true;
29454		},
29455
29456		// Contents
29457		empty: function( elem ) {
29458
29459			// https://www.w3.org/TR/selectors/#empty-pseudo
29460			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
29461			//   but not by others (comment: 8; processing instruction: 7; etc.)
29462			// nodeType < 6 works because attributes (2) do not appear as children
29463			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
29464				if ( elem.nodeType < 6 ) {
29465					return false;
29466				}
29467			}
29468			return true;
29469		},
29470
29471		parent: function( elem ) {
29472			return !Expr.pseudos.empty( elem );
29473		},
29474
29475		// Element/input types
29476		header: function( elem ) {
29477			return rheader.test( elem.nodeName );
29478		},
29479
29480		input: function( elem ) {
29481			return rinputs.test( elem.nodeName );
29482		},
29483
29484		button: function( elem ) {
29485			return nodeName( elem, "input" ) && elem.type === "button" ||
29486				nodeName( elem, "button" );
29487		},
29488
29489		text: function( elem ) {
29490			var attr;
29491			return nodeName( elem, "input" ) && elem.type === "text" &&
29492
29493				// Support: IE <10 only
29494				// New HTML5 attribute values (e.g., "search") appear
29495				// with elem.type === "text"
29496				( ( attr = elem.getAttribute( "type" ) ) == null ||
29497					attr.toLowerCase() === "text" );
29498		},
29499
29500		// Position-in-collection
29501		first: createPositionalPseudo( function() {
29502			return [ 0 ];
29503		} ),
29504
29505		last: createPositionalPseudo( function( _matchIndexes, length ) {
29506			return [ length - 1 ];
29507		} ),
29508
29509		eq: createPositionalPseudo( function( _matchIndexes, length, argument ) {
29510			return [ argument < 0 ? argument + length : argument ];
29511		} ),
29512
29513		even: createPositionalPseudo( function( matchIndexes, length ) {
29514			var i = 0;
29515			for ( ; i < length; i += 2 ) {
29516				matchIndexes.push( i );
29517			}
29518			return matchIndexes;
29519		} ),
29520
29521		odd: createPositionalPseudo( function( matchIndexes, length ) {
29522			var i = 1;
29523			for ( ; i < length; i += 2 ) {
29524				matchIndexes.push( i );
29525			}
29526			return matchIndexes;
29527		} ),
29528
29529		lt: createPositionalPseudo( function( matchIndexes, length, argument ) {
29530			var i;
29531
29532			if ( argument < 0 ) {
29533				i = argument + length;
29534			} else if ( argument > length ) {
29535				i = length;
29536			} else {
29537				i = argument;
29538			}
29539
29540			for ( ; --i >= 0; ) {
29541				matchIndexes.push( i );
29542			}
29543			return matchIndexes;
29544		} ),
29545
29546		gt: createPositionalPseudo( function( matchIndexes, length, argument ) {
29547			var i = argument < 0 ? argument + length : argument;
29548			for ( ; ++i < length; ) {
29549				matchIndexes.push( i );
29550			}
29551			return matchIndexes;
29552		} )
29553	}
29554};
29555
29556Expr.pseudos.nth = Expr.pseudos.eq;
29557
29558// Add button/input type pseudos
29559for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
29560	Expr.pseudos[ i ] = createInputPseudo( i );
29561}
29562for ( i in { submit: true, reset: true } ) {
29563	Expr.pseudos[ i ] = createButtonPseudo( i );
29564}
29565
29566// Easy API for creating new setFilters
29567function setFilters() {}
29568setFilters.prototype = Expr.filters = Expr.pseudos;
29569Expr.setFilters = new setFilters();
29570
29571function tokenize( selector, parseOnly ) {
29572	var matched, match, tokens, type,
29573		soFar, groups, preFilters,
29574		cached = tokenCache[ selector + " " ];
29575
29576	if ( cached ) {
29577		return parseOnly ? 0 : cached.slice( 0 );
29578	}
29579
29580	soFar = selector;
29581	groups = [];
29582	preFilters = Expr.preFilter;
29583
29584	while ( soFar ) {
29585
29586		// Comma and first run
29587		if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
29588			if ( match ) {
29589
29590				// Don't consume trailing commas as valid
29591				soFar = soFar.slice( match[ 0 ].length ) || soFar;
29592			}
29593			groups.push( ( tokens = [] ) );
29594		}
29595
29596		matched = false;
29597
29598		// Combinators
29599		if ( ( match = rleadingCombinator.exec( soFar ) ) ) {
29600			matched = match.shift();
29601			tokens.push( {
29602				value: matched,
29603
29604				// Cast descendant combinators to space
29605				type: match[ 0 ].replace( rtrimCSS, " " )
29606			} );
29607			soFar = soFar.slice( matched.length );
29608		}
29609
29610		// Filters
29611		for ( type in Expr.filter ) {
29612			if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
29613				( match = preFilters[ type ]( match ) ) ) ) {
29614				matched = match.shift();
29615				tokens.push( {
29616					value: matched,
29617					type: type,
29618					matches: match
29619				} );
29620				soFar = soFar.slice( matched.length );
29621			}
29622		}
29623
29624		if ( !matched ) {
29625			break;
29626		}
29627	}
29628
29629	// Return the length of the invalid excess
29630	// if we're just parsing
29631	// Otherwise, throw an error or return tokens
29632	if ( parseOnly ) {
29633		return soFar.length;
29634	}
29635
29636	return soFar ?
29637		find.error( selector ) :
29638
29639		// Cache the tokens
29640		tokenCache( selector, groups ).slice( 0 );
29641}
29642
29643function toSelector( tokens ) {
29644	var i = 0,
29645		len = tokens.length,
29646		selector = "";
29647	for ( ; i < len; i++ ) {
29648		selector += tokens[ i ].value;
29649	}
29650	return selector;
29651}
29652
29653function addCombinator( matcher, combinator, base ) {
29654	var dir = combinator.dir,
29655		skip = combinator.next,
29656		key = skip || dir,
29657		checkNonElements = base && key === "parentNode",
29658		doneName = done++;
29659
29660	return combinator.first ?
29661
29662		// Check against closest ancestor/preceding element
29663		function( elem, context, xml ) {
29664			while ( ( elem = elem[ dir ] ) ) {
29665				if ( elem.nodeType === 1 || checkNonElements ) {
29666					return matcher( elem, context, xml );
29667				}
29668			}
29669			return false;
29670		} :
29671
29672		// Check against all ancestor/preceding elements
29673		function( elem, context, xml ) {
29674			var oldCache, outerCache,
29675				newCache = [ dirruns, doneName ];
29676
29677			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
29678			if ( xml ) {
29679				while ( ( elem = elem[ dir ] ) ) {
29680					if ( elem.nodeType === 1 || checkNonElements ) {
29681						if ( matcher( elem, context, xml ) ) {
29682							return true;
29683						}
29684					}
29685				}
29686			} else {
29687				while ( ( elem = elem[ dir ] ) ) {
29688					if ( elem.nodeType === 1 || checkNonElements ) {
29689						outerCache = elem[ expando ] || ( elem[ expando ] = {} );
29690
29691						if ( skip && nodeName( elem, skip ) ) {
29692							elem = elem[ dir ] || elem;
29693						} else if ( ( oldCache = outerCache[ key ] ) &&
29694							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
29695
29696							// Assign to newCache so results back-propagate to previous elements
29697							return ( newCache[ 2 ] = oldCache[ 2 ] );
29698						} else {
29699
29700							// Reuse newcache so results back-propagate to previous elements
29701							outerCache[ key ] = newCache;
29702
29703							// A match means we're done; a fail means we have to keep checking
29704							if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
29705								return true;
29706							}
29707						}
29708					}
29709				}
29710			}
29711			return false;
29712		};
29713}
29714
29715function elementMatcher( matchers ) {
29716	return matchers.length > 1 ?
29717		function( elem, context, xml ) {
29718			var i = matchers.length;
29719			while ( i-- ) {
29720				if ( !matchers[ i ]( elem, context, xml ) ) {
29721					return false;
29722				}
29723			}
29724			return true;
29725		} :
29726		matchers[ 0 ];
29727}
29728
29729function multipleContexts( selector, contexts, results ) {
29730	var i = 0,
29731		len = contexts.length;
29732	for ( ; i < len; i++ ) {
29733		find( selector, contexts[ i ], results );
29734	}
29735	return results;
29736}
29737
29738function condense( unmatched, map, filter, context, xml ) {
29739	var elem,
29740		newUnmatched = [],
29741		i = 0,
29742		len = unmatched.length,
29743		mapped = map != null;
29744
29745	for ( ; i < len; i++ ) {
29746		if ( ( elem = unmatched[ i ] ) ) {
29747			if ( !filter || filter( elem, context, xml ) ) {
29748				newUnmatched.push( elem );
29749				if ( mapped ) {
29750					map.push( i );
29751				}
29752			}
29753		}
29754	}
29755
29756	return newUnmatched;
29757}
29758
29759function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
29760	if ( postFilter && !postFilter[ expando ] ) {
29761		postFilter = setMatcher( postFilter );
29762	}
29763	if ( postFinder && !postFinder[ expando ] ) {
29764		postFinder = setMatcher( postFinder, postSelector );
29765	}
29766	return markFunction( function( seed, results, context, xml ) {
29767		var temp, i, elem, matcherOut,
29768			preMap = [],
29769			postMap = [],
29770			preexisting = results.length,
29771
29772			// Get initial elements from seed or context
29773			elems = seed ||
29774				multipleContexts( selector || "*",
29775					context.nodeType ? [ context ] : context, [] ),
29776
29777			// Prefilter to get matcher input, preserving a map for seed-results synchronization
29778			matcherIn = preFilter && ( seed || !selector ) ?
29779				condense( elems, preMap, preFilter, context, xml ) :
29780				elems;
29781
29782		if ( matcher ) {
29783
29784			// If we have a postFinder, or filtered seed, or non-seed postFilter
29785			// or preexisting results,
29786			matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
29787
29788				// ...intermediate processing is necessary
29789				[] :
29790
29791				// ...otherwise use results directly
29792				results;
29793
29794			// Find primary matches
29795			matcher( matcherIn, matcherOut, context, xml );
29796		} else {
29797			matcherOut = matcherIn;
29798		}
29799
29800		// Apply postFilter
29801		if ( postFilter ) {
29802			temp = condense( matcherOut, postMap );
29803			postFilter( temp, [], context, xml );
29804
29805			// Un-match failing elements by moving them back to matcherIn
29806			i = temp.length;
29807			while ( i-- ) {
29808				if ( ( elem = temp[ i ] ) ) {
29809					matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
29810				}
29811			}
29812		}
29813
29814		if ( seed ) {
29815			if ( postFinder || preFilter ) {
29816				if ( postFinder ) {
29817
29818					// Get the final matcherOut by condensing this intermediate into postFinder contexts
29819					temp = [];
29820					i = matcherOut.length;
29821					while ( i-- ) {
29822						if ( ( elem = matcherOut[ i ] ) ) {
29823
29824							// Restore matcherIn since elem is not yet a final match
29825							temp.push( ( matcherIn[ i ] = elem ) );
29826						}
29827					}
29828					postFinder( null, ( matcherOut = [] ), temp, xml );
29829				}
29830
29831				// Move matched elements from seed to results to keep them synchronized
29832				i = matcherOut.length;
29833				while ( i-- ) {
29834					if ( ( elem = matcherOut[ i ] ) &&
29835						( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) {
29836
29837						seed[ temp ] = !( results[ temp ] = elem );
29838					}
29839				}
29840			}
29841
29842		// Add elements to results, through postFinder if defined
29843		} else {
29844			matcherOut = condense(
29845				matcherOut === results ?
29846					matcherOut.splice( preexisting, matcherOut.length ) :
29847					matcherOut
29848			);
29849			if ( postFinder ) {
29850				postFinder( null, results, matcherOut, xml );
29851			} else {
29852				push.apply( results, matcherOut );
29853			}
29854		}
29855	} );
29856}
29857
29858function matcherFromTokens( tokens ) {
29859	var checkContext, matcher, j,
29860		len = tokens.length,
29861		leadingRelative = Expr.relative[ tokens[ 0 ].type ],
29862		implicitRelative = leadingRelative || Expr.relative[ " " ],
29863		i = leadingRelative ? 1 : 0,
29864
29865		// The foundational matcher ensures that elements are reachable from top-level context(s)
29866		matchContext = addCombinator( function( elem ) {
29867			return elem === checkContext;
29868		}, implicitRelative, true ),
29869		matchAnyContext = addCombinator( function( elem ) {
29870			return indexOf.call( checkContext, elem ) > -1;
29871		}, implicitRelative, true ),
29872		matchers = [ function( elem, context, xml ) {
29873
29874			// Support: IE 11+, Edge 17 - 18+
29875			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
29876			// two documents; shallow comparisons work.
29877			// eslint-disable-next-line eqeqeq
29878			var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || (
29879				( checkContext = context ).nodeType ?
29880					matchContext( elem, context, xml ) :
29881					matchAnyContext( elem, context, xml ) );
29882
29883			// Avoid hanging onto element
29884			// (see https://github.com/jquery/sizzle/issues/299)
29885			checkContext = null;
29886			return ret;
29887		} ];
29888
29889	for ( ; i < len; i++ ) {
29890		if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
29891			matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
29892		} else {
29893			matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
29894
29895			// Return special upon seeing a positional matcher
29896			if ( matcher[ expando ] ) {
29897
29898				// Find the next relative operator (if any) for proper handling
29899				j = ++i;
29900				for ( ; j < len; j++ ) {
29901					if ( Expr.relative[ tokens[ j ].type ] ) {
29902						break;
29903					}
29904				}
29905				return setMatcher(
29906					i > 1 && elementMatcher( matchers ),
29907					i > 1 && toSelector(
29908
29909						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
29910						tokens.slice( 0, i - 1 )
29911							.concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
29912					).replace( rtrimCSS, "$1" ),
29913					matcher,
29914					i < j && matcherFromTokens( tokens.slice( i, j ) ),
29915					j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
29916					j < len && toSelector( tokens )
29917				);
29918			}
29919			matchers.push( matcher );
29920		}
29921	}
29922
29923	return elementMatcher( matchers );
29924}
29925
29926function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
29927	var bySet = setMatchers.length > 0,
29928		byElement = elementMatchers.length > 0,
29929		superMatcher = function( seed, context, xml, results, outermost ) {
29930			var elem, j, matcher,
29931				matchedCount = 0,
29932				i = "0",
29933				unmatched = seed && [],
29934				setMatched = [],
29935				contextBackup = outermostContext,
29936
29937				// We must always have either seed elements or outermost context
29938				elems = seed || byElement && Expr.find.TAG( "*", outermost ),
29939
29940				// Use integer dirruns iff this is the outermost matcher
29941				dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
29942				len = elems.length;
29943
29944			if ( outermost ) {
29945
29946				// Support: IE 11+, Edge 17 - 18+
29947				// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
29948				// two documents; shallow comparisons work.
29949				// eslint-disable-next-line eqeqeq
29950				outermostContext = context == document || context || outermost;
29951			}
29952
29953			// Add elements passing elementMatchers directly to results
29954			// Support: iOS <=7 - 9 only
29955			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching
29956			// elements by id. (see trac-14142)
29957			for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
29958				if ( byElement && elem ) {
29959					j = 0;
29960
29961					// Support: IE 11+, Edge 17 - 18+
29962					// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
29963					// two documents; shallow comparisons work.
29964					// eslint-disable-next-line eqeqeq
29965					if ( !context && elem.ownerDocument != document ) {
29966						setDocument( elem );
29967						xml = !documentIsHTML;
29968					}
29969					while ( ( matcher = elementMatchers[ j++ ] ) ) {
29970						if ( matcher( elem, context || document, xml ) ) {
29971							push.call( results, elem );
29972							break;
29973						}
29974					}
29975					if ( outermost ) {
29976						dirruns = dirrunsUnique;
29977					}
29978				}
29979
29980				// Track unmatched elements for set filters
29981				if ( bySet ) {
29982
29983					// They will have gone through all possible matchers
29984					if ( ( elem = !matcher && elem ) ) {
29985						matchedCount--;
29986					}
29987
29988					// Lengthen the array for every element, matched or not
29989					if ( seed ) {
29990						unmatched.push( elem );
29991					}
29992				}
29993			}
29994
29995			// `i` is now the count of elements visited above, and adding it to `matchedCount`
29996			// makes the latter nonnegative.
29997			matchedCount += i;
29998
29999			// Apply set filters to unmatched elements
30000			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
30001			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
30002			// no element matchers and no seed.
30003			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
30004			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
30005			// numerically zero.
30006			if ( bySet && i !== matchedCount ) {
30007				j = 0;
30008				while ( ( matcher = setMatchers[ j++ ] ) ) {
30009					matcher( unmatched, setMatched, context, xml );
30010				}
30011
30012				if ( seed ) {
30013
30014					// Reintegrate element matches to eliminate the need for sorting
30015					if ( matchedCount > 0 ) {
30016						while ( i-- ) {
30017							if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
30018								setMatched[ i ] = pop.call( results );
30019							}
30020						}
30021					}
30022
30023					// Discard index placeholder values to get only actual matches
30024					setMatched = condense( setMatched );
30025				}
30026
30027				// Add matches to results
30028				push.apply( results, setMatched );
30029
30030				// Seedless set matches succeeding multiple successful matchers stipulate sorting
30031				if ( outermost && !seed && setMatched.length > 0 &&
30032					( matchedCount + setMatchers.length ) > 1 ) {
30033
30034					jQuery.uniqueSort( results );
30035				}
30036			}
30037
30038			// Override manipulation of globals by nested matchers
30039			if ( outermost ) {
30040				dirruns = dirrunsUnique;
30041				outermostContext = contextBackup;
30042			}
30043
30044			return unmatched;
30045		};
30046
30047	return bySet ?
30048		markFunction( superMatcher ) :
30049		superMatcher;
30050}
30051
30052function compile( selector, match /* Internal Use Only */ ) {
30053	var i,
30054		setMatchers = [],
30055		elementMatchers = [],
30056		cached = compilerCache[ selector + " " ];
30057
30058	if ( !cached ) {
30059
30060		// Generate a function of recursive functions that can be used to check each element
30061		if ( !match ) {
30062			match = tokenize( selector );
30063		}
30064		i = match.length;
30065		while ( i-- ) {
30066			cached = matcherFromTokens( match[ i ] );
30067			if ( cached[ expando ] ) {
30068				setMatchers.push( cached );
30069			} else {
30070				elementMatchers.push( cached );
30071			}
30072		}
30073
30074		// Cache the compiled function
30075		cached = compilerCache( selector,
30076			matcherFromGroupMatchers( elementMatchers, setMatchers ) );
30077
30078		// Save selector and tokenization
30079		cached.selector = selector;
30080	}
30081	return cached;
30082}
30083
30084/**
30085 * A low-level selection function that works with jQuery's compiled
30086 *  selector functions
30087 * @param {String|Function} selector A selector or a pre-compiled
30088 *  selector function built with jQuery selector compile
30089 * @param {Element} context
30090 * @param {Array} [results]
30091 * @param {Array} [seed] A set of elements to match against
30092 */
30093function select( selector, context, results, seed ) {
30094	var i, tokens, token, type, find,
30095		compiled = typeof selector === "function" && selector,
30096		match = !seed && tokenize( ( selector = compiled.selector || selector ) );
30097
30098	results = results || [];
30099
30100	// Try to minimize operations if there is only one selector in the list and no seed
30101	// (the latter of which guarantees us context)
30102	if ( match.length === 1 ) {
30103
30104		// Reduce context if the leading compound selector is an ID
30105		tokens = match[ 0 ] = match[ 0 ].slice( 0 );
30106		if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
30107				context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
30108
30109			context = ( Expr.find.ID(
30110				token.matches[ 0 ].replace( runescape, funescape ),
30111				context
30112			) || [] )[ 0 ];
30113			if ( !context ) {
30114				return results;
30115
30116			// Precompiled matchers will still verify ancestry, so step up a level
30117			} else if ( compiled ) {
30118				context = context.parentNode;
30119			}
30120
30121			selector = selector.slice( tokens.shift().value.length );
30122		}
30123
30124		// Fetch a seed set for right-to-left matching
30125		i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length;
30126		while ( i-- ) {
30127			token = tokens[ i ];
30128
30129			// Abort if we hit a combinator
30130			if ( Expr.relative[ ( type = token.type ) ] ) {
30131				break;
30132			}
30133			if ( ( find = Expr.find[ type ] ) ) {
30134
30135				// Search, expanding context for leading sibling combinators
30136				if ( ( seed = find(
30137					token.matches[ 0 ].replace( runescape, funescape ),
30138					rsibling.test( tokens[ 0 ].type ) &&
30139						testContext( context.parentNode ) || context
30140				) ) ) {
30141
30142					// If seed is empty or no tokens remain, we can return early
30143					tokens.splice( i, 1 );
30144					selector = seed.length && toSelector( tokens );
30145					if ( !selector ) {
30146						push.apply( results, seed );
30147						return results;
30148					}
30149
30150					break;
30151				}
30152			}
30153		}
30154	}
30155
30156	// Compile and execute a filtering function if one is not provided
30157	// Provide `match` to avoid retokenization if we modified the selector above
30158	( compiled || compile( selector, match ) )(
30159		seed,
30160		context,
30161		!documentIsHTML,
30162		results,
30163		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
30164	);
30165	return results;
30166}
30167
30168// One-time assignments
30169
30170// Support: Android <=4.0 - 4.1+
30171// Sort stability
30172support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
30173
30174// Initialize against the default document
30175setDocument();
30176
30177// Support: Android <=4.0 - 4.1+
30178// Detached nodes confoundingly follow *each other*
30179support.sortDetached = assert( function( el ) {
30180
30181	// Should return 1, but returns 4 (following)
30182	return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
30183} );
30184
30185jQuery.find = find;
30186
30187// Deprecated
30188jQuery.expr[ ":" ] = jQuery.expr.pseudos;
30189jQuery.unique = jQuery.uniqueSort;
30190
30191// These have always been private, but they used to be documented as part of
30192// Sizzle so let's maintain them for now for backwards compatibility purposes.
30193find.compile = compile;
30194find.select = select;
30195find.setDocument = setDocument;
30196find.tokenize = tokenize;
30197
30198find.escape = jQuery.escapeSelector;
30199find.getText = jQuery.text;
30200find.isXML = jQuery.isXMLDoc;
30201find.selectors = jQuery.expr;
30202find.support = jQuery.support;
30203find.uniqueSort = jQuery.uniqueSort;
30204
30205	/* eslint-enable */
30206
30207} )();
30208
30209
30210var dir = function( elem, dir, until ) {
30211	var matched = [],
30212		truncate = until !== undefined;
30213
30214	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
30215		if ( elem.nodeType === 1 ) {
30216			if ( truncate && jQuery( elem ).is( until ) ) {
30217				break;
30218			}
30219			matched.push( elem );
30220		}
30221	}
30222	return matched;
30223};
30224
30225
30226var siblings = function( n, elem ) {
30227	var matched = [];
30228
30229	for ( ; n; n = n.nextSibling ) {
30230		if ( n.nodeType === 1 && n !== elem ) {
30231			matched.push( n );
30232		}
30233	}
30234
30235	return matched;
30236};
30237
30238
30239var rneedsContext = jQuery.expr.match.needsContext;
30240
30241var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
30242
30243
30244
30245// Implement the identical functionality for filter and not
30246function winnow( elements, qualifier, not ) {
30247	if ( isFunction( qualifier ) ) {
30248		return jQuery.grep( elements, function( elem, i ) {
30249			return !!qualifier.call( elem, i, elem ) !== not;
30250		} );
30251	}
30252
30253	// Single element
30254	if ( qualifier.nodeType ) {
30255		return jQuery.grep( elements, function( elem ) {
30256			return ( elem === qualifier ) !== not;
30257		} );
30258	}
30259
30260	// Arraylike of elements (jQuery, arguments, Array)
30261	if ( typeof qualifier !== "string" ) {
30262		return jQuery.grep( elements, function( elem ) {
30263			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
30264		} );
30265	}
30266
30267	// Filtered directly for both simple and complex selectors
30268	return jQuery.filter( qualifier, elements, not );
30269}
30270
30271jQuery.filter = function( expr, elems, not ) {
30272	var elem = elems[ 0 ];
30273
30274	if ( not ) {
30275		expr = ":not(" + expr + ")";
30276	}
30277
30278	if ( elems.length === 1 && elem.nodeType === 1 ) {
30279		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
30280	}
30281
30282	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
30283		return elem.nodeType === 1;
30284	} ) );
30285};
30286
30287jQuery.fn.extend( {
30288	find: function( selector ) {
30289		var i, ret,
30290			len = this.length,
30291			self = this;
30292
30293		if ( typeof selector !== "string" ) {
30294			return this.pushStack( jQuery( selector ).filter( function() {
30295				for ( i = 0; i < len; i++ ) {
30296					if ( jQuery.contains( self[ i ], this ) ) {
30297						return true;
30298					}
30299				}
30300			} ) );
30301		}
30302
30303		ret = this.pushStack( [] );
30304
30305		for ( i = 0; i < len; i++ ) {
30306			jQuery.find( selector, self[ i ], ret );
30307		}
30308
30309		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
30310	},
30311	filter: function( selector ) {
30312		return this.pushStack( winnow( this, selector || [], false ) );
30313	},
30314	not: function( selector ) {
30315		return this.pushStack( winnow( this, selector || [], true ) );
30316	},
30317	is: function( selector ) {
30318		return !!winnow(
30319			this,
30320
30321			// If this is a positional/relative selector, check membership in the returned set
30322			// so $("p:first").is("p:last") won't return true for a doc with two "p".
30323			typeof selector === "string" && rneedsContext.test( selector ) ?
30324				jQuery( selector ) :
30325				selector || [],
30326			false
30327		).length;
30328	}
30329} );
30330
30331
30332// Initialize a jQuery object
30333
30334
30335// A central reference to the root jQuery(document)
30336var rootjQuery,
30337
30338	// A simple way to check for HTML strings
30339	// Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521)
30340	// Strict HTML recognition (trac-11290: must start with <)
30341	// Shortcut simple #id case for speed
30342	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
30343
30344	init = jQuery.fn.init = function( selector, context, root ) {
30345		var match, elem;
30346
30347		// HANDLE: $(""), $(null), $(undefined), $(false)
30348		if ( !selector ) {
30349			return this;
30350		}
30351
30352		// Method init() accepts an alternate rootjQuery
30353		// so migrate can support jQuery.sub (gh-2101)
30354		root = root || rootjQuery;
30355
30356		// Handle HTML strings
30357		if ( typeof selector === "string" ) {
30358			if ( selector[ 0 ] === "<" &&
30359				selector[ selector.length - 1 ] === ">" &&
30360				selector.length >= 3 ) {
30361
30362				// Assume that strings that start and end with <> are HTML and skip the regex check
30363				match = [ null, selector, null ];
30364
30365			} else {
30366				match = rquickExpr.exec( selector );
30367			}
30368
30369			// Match html or make sure no context is specified for #id
30370			if ( match && ( match[ 1 ] || !context ) ) {
30371
30372				// HANDLE: $(html) -> $(array)
30373				if ( match[ 1 ] ) {
30374					context = context instanceof jQuery ? context[ 0 ] : context;
30375
30376					// Option to run scripts is true for back-compat
30377					// Intentionally let the error be thrown if parseHTML is not present
30378					jQuery.merge( this, jQuery.parseHTML(
30379						match[ 1 ],
30380						context && context.nodeType ? context.ownerDocument || context : document,
30381						true
30382					) );
30383
30384					// HANDLE: $(html, props)
30385					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
30386						for ( match in context ) {
30387
30388							// Properties of context are called as methods if possible
30389							if ( isFunction( this[ match ] ) ) {
30390								this[ match ]( context[ match ] );
30391
30392							// ...and otherwise set as attributes
30393							} else {
30394								this.attr( match, context[ match ] );
30395							}
30396						}
30397					}
30398
30399					return this;
30400
30401				// HANDLE: $(#id)
30402				} else {
30403					elem = document.getElementById( match[ 2 ] );
30404
30405					if ( elem ) {
30406
30407						// Inject the element directly into the jQuery object
30408						this[ 0 ] = elem;
30409						this.length = 1;
30410					}
30411					return this;
30412				}
30413
30414			// HANDLE: $(expr, $(...))
30415			} else if ( !context || context.jquery ) {
30416				return ( context || root ).find( selector );
30417
30418			// HANDLE: $(expr, context)
30419			// (which is just equivalent to: $(context).find(expr)
30420			} else {
30421				return this.constructor( context ).find( selector );
30422			}
30423
30424		// HANDLE: $(DOMElement)
30425		} else if ( selector.nodeType ) {
30426			this[ 0 ] = selector;
30427			this.length = 1;
30428			return this;
30429
30430		// HANDLE: $(function)
30431		// Shortcut for document ready
30432		} else if ( isFunction( selector ) ) {
30433			return root.ready !== undefined ?
30434				root.ready( selector ) :
30435
30436				// Execute immediately if ready is not present
30437				selector( jQuery );
30438		}
30439
30440		return jQuery.makeArray( selector, this );
30441	};
30442
30443// Give the init function the jQuery prototype for later instantiation
30444init.prototype = jQuery.fn;
30445
30446// Initialize central reference
30447rootjQuery = jQuery( document );
30448
30449
30450var rparentsprev = /^(?:parents|prev(?:Until|All))/,
30451
30452	// Methods guaranteed to produce a unique set when starting from a unique set
30453	guaranteedUnique = {
30454		children: true,
30455		contents: true,
30456		next: true,
30457		prev: true
30458	};
30459
30460jQuery.fn.extend( {
30461	has: function( target ) {
30462		var targets = jQuery( target, this ),
30463			l = targets.length;
30464
30465		return this.filter( function() {
30466			var i = 0;
30467			for ( ; i < l; i++ ) {
30468				if ( jQuery.contains( this, targets[ i ] ) ) {
30469					return true;
30470				}
30471			}
30472		} );
30473	},
30474
30475	closest: function( selectors, context ) {
30476		var cur,
30477			i = 0,
30478			l = this.length,
30479			matched = [],
30480			targets = typeof selectors !== "string" && jQuery( selectors );
30481
30482		// Positional selectors never match, since there's no _selection_ context
30483		if ( !rneedsContext.test( selectors ) ) {
30484			for ( ; i < l; i++ ) {
30485				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
30486
30487					// Always skip document fragments
30488					if ( cur.nodeType < 11 && ( targets ?
30489						targets.index( cur ) > -1 :
30490
30491						// Don't pass non-elements to jQuery#find
30492						cur.nodeType === 1 &&
30493							jQuery.find.matchesSelector( cur, selectors ) ) ) {
30494
30495						matched.push( cur );
30496						break;
30497					}
30498				}
30499			}
30500		}
30501
30502		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
30503	},
30504
30505	// Determine the position of an element within the set
30506	index: function( elem ) {
30507
30508		// No argument, return index in parent
30509		if ( !elem ) {
30510			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
30511		}
30512
30513		// Index in selector
30514		if ( typeof elem === "string" ) {
30515			return indexOf.call( jQuery( elem ), this[ 0 ] );
30516		}
30517
30518		// Locate the position of the desired element
30519		return indexOf.call( this,
30520
30521			// If it receives a jQuery object, the first element is used
30522			elem.jquery ? elem[ 0 ] : elem
30523		);
30524	},
30525
30526	add: function( selector, context ) {
30527		return this.pushStack(
30528			jQuery.uniqueSort(
30529				jQuery.merge( this.get(), jQuery( selector, context ) )
30530			)
30531		);
30532	},
30533
30534	addBack: function( selector ) {
30535		return this.add( selector == null ?
30536			this.prevObject : this.prevObject.filter( selector )
30537		);
30538	}
30539} );
30540
30541function sibling( cur, dir ) {
30542	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
30543	return cur;
30544}
30545
30546jQuery.each( {
30547	parent: function( elem ) {
30548		var parent = elem.parentNode;
30549		return parent && parent.nodeType !== 11 ? parent : null;
30550	},
30551	parents: function( elem ) {
30552		return dir( elem, "parentNode" );
30553	},
30554	parentsUntil: function( elem, _i, until ) {
30555		return dir( elem, "parentNode", until );
30556	},
30557	next: function( elem ) {
30558		return sibling( elem, "nextSibling" );
30559	},
30560	prev: function( elem ) {
30561		return sibling( elem, "previousSibling" );
30562	},
30563	nextAll: function( elem ) {
30564		return dir( elem, "nextSibling" );
30565	},
30566	prevAll: function( elem ) {
30567		return dir( elem, "previousSibling" );
30568	},
30569	nextUntil: function( elem, _i, until ) {
30570		return dir( elem, "nextSibling", until );
30571	},
30572	prevUntil: function( elem, _i, until ) {
30573		return dir( elem, "previousSibling", until );
30574	},
30575	siblings: function( elem ) {
30576		return siblings( ( elem.parentNode || {} ).firstChild, elem );
30577	},
30578	children: function( elem ) {
30579		return siblings( elem.firstChild );
30580	},
30581	contents: function( elem ) {
30582		if ( elem.contentDocument != null &&
30583
30584			// Support: IE 11+
30585			// <object> elements with no `data` attribute has an object
30586			// `contentDocument` with a `null` prototype.
30587			getProto( elem.contentDocument ) ) {
30588
30589			return elem.contentDocument;
30590		}
30591
30592		// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
30593		// Treat the template element as a regular one in browsers that
30594		// don't support it.
30595		if ( nodeName( elem, "template" ) ) {
30596			elem = elem.content || elem;
30597		}
30598
30599		return jQuery.merge( [], elem.childNodes );
30600	}
30601}, function( name, fn ) {
30602	jQuery.fn[ name ] = function( until, selector ) {
30603		var matched = jQuery.map( this, fn, until );
30604
30605		if ( name.slice( -5 ) !== "Until" ) {
30606			selector = until;
30607		}
30608
30609		if ( selector && typeof selector === "string" ) {
30610			matched = jQuery.filter( selector, matched );
30611		}
30612
30613		if ( this.length > 1 ) {
30614
30615			// Remove duplicates
30616			if ( !guaranteedUnique[ name ] ) {
30617				jQuery.uniqueSort( matched );
30618			}
30619
30620			// Reverse order for parents* and prev-derivatives
30621			if ( rparentsprev.test( name ) ) {
30622				matched.reverse();
30623			}
30624		}
30625
30626		return this.pushStack( matched );
30627	};
30628} );
30629var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
30630
30631
30632
30633// Convert String-formatted options into Object-formatted ones
30634function createOptions( options ) {
30635	var object = {};
30636	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
30637		object[ flag ] = true;
30638	} );
30639	return object;
30640}
30641
30642/*
30643 * Create a callback list using the following parameters:
30644 *
30645 *	options: an optional list of space-separated options that will change how
30646 *			the callback list behaves or a more traditional option object
30647 *
30648 * By default a callback list will act like an event callback list and can be
30649 * "fired" multiple times.
30650 *
30651 * Possible options:
30652 *
30653 *	once:			will ensure the callback list can only be fired once (like a Deferred)
30654 *
30655 *	memory:			will keep track of previous values and will call any callback added
30656 *					after the list has been fired right away with the latest "memorized"
30657 *					values (like a Deferred)
30658 *
30659 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
30660 *
30661 *	stopOnFalse:	interrupt callings when a callback returns false
30662 *
30663 */
30664jQuery.Callbacks = function( options ) {
30665
30666	// Convert options from String-formatted to Object-formatted if needed
30667	// (we check in cache first)
30668	options = typeof options === "string" ?
30669		createOptions( options ) :
30670		jQuery.extend( {}, options );
30671
30672	var // Flag to know if list is currently firing
30673		firing,
30674
30675		// Last fire value for non-forgettable lists
30676		memory,
30677
30678		// Flag to know if list was already fired
30679		fired,
30680
30681		// Flag to prevent firing
30682		locked,
30683
30684		// Actual callback list
30685		list = [],
30686
30687		// Queue of execution data for repeatable lists
30688		queue = [],
30689
30690		// Index of currently firing callback (modified by add/remove as needed)
30691		firingIndex = -1,
30692
30693		// Fire callbacks
30694		fire = function() {
30695
30696			// Enforce single-firing
30697			locked = locked || options.once;
30698
30699			// Execute callbacks for all pending executions,
30700			// respecting firingIndex overrides and runtime changes
30701			fired = firing = true;
30702			for ( ; queue.length; firingIndex = -1 ) {
30703				memory = queue.shift();
30704				while ( ++firingIndex < list.length ) {
30705
30706					// Run callback and check for early termination
30707					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
30708						options.stopOnFalse ) {
30709
30710						// Jump to end and forget the data so .add doesn't re-fire
30711						firingIndex = list.length;
30712						memory = false;
30713					}
30714				}
30715			}
30716
30717			// Forget the data if we're done with it
30718			if ( !options.memory ) {
30719				memory = false;
30720			}
30721
30722			firing = false;
30723
30724			// Clean up if we're done firing for good
30725			if ( locked ) {
30726
30727				// Keep an empty list if we have data for future add calls
30728				if ( memory ) {
30729					list = [];
30730
30731				// Otherwise, this object is spent
30732				} else {
30733					list = "";
30734				}
30735			}
30736		},
30737
30738		// Actual Callbacks object
30739		self = {
30740
30741			// Add a callback or a collection of callbacks to the list
30742			add: function() {
30743				if ( list ) {
30744
30745					// If we have memory from a past run, we should fire after adding
30746					if ( memory && !firing ) {
30747						firingIndex = list.length - 1;
30748						queue.push( memory );
30749					}
30750
30751					( function add( args ) {
30752						jQuery.each( args, function( _, arg ) {
30753							if ( isFunction( arg ) ) {
30754								if ( !options.unique || !self.has( arg ) ) {
30755									list.push( arg );
30756								}
30757							} else if ( arg && arg.length && toType( arg ) !== "string" ) {
30758
30759								// Inspect recursively
30760								add( arg );
30761							}
30762						} );
30763					} )( arguments );
30764
30765					if ( memory && !firing ) {
30766						fire();
30767					}
30768				}
30769				return this;
30770			},
30771
30772			// Remove a callback from the list
30773			remove: function() {
30774				jQuery.each( arguments, function( _, arg ) {
30775					var index;
30776					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
30777						list.splice( index, 1 );
30778
30779						// Handle firing indexes
30780						if ( index <= firingIndex ) {
30781							firingIndex--;
30782						}
30783					}
30784				} );
30785				return this;
30786			},
30787
30788			// Check if a given callback is in the list.
30789			// If no argument is given, return whether or not list has callbacks attached.
30790			has: function( fn ) {
30791				return fn ?
30792					jQuery.inArray( fn, list ) > -1 :
30793					list.length > 0;
30794			},
30795
30796			// Remove all callbacks from the list
30797			empty: function() {
30798				if ( list ) {
30799					list = [];
30800				}
30801				return this;
30802			},
30803
30804			// Disable .fire and .add
30805			// Abort any current/pending executions
30806			// Clear all callbacks and values
30807			disable: function() {
30808				locked = queue = [];
30809				list = memory = "";
30810				return this;
30811			},
30812			disabled: function() {
30813				return !list;
30814			},
30815
30816			// Disable .fire
30817			// Also disable .add unless we have memory (since it would have no effect)
30818			// Abort any pending executions
30819			lock: function() {
30820				locked = queue = [];
30821				if ( !memory && !firing ) {
30822					list = memory = "";
30823				}
30824				return this;
30825			},
30826			locked: function() {
30827				return !!locked;
30828			},
30829
30830			// Call all callbacks with the given context and arguments
30831			fireWith: function( context, args ) {
30832				if ( !locked ) {
30833					args = args || [];
30834					args = [ context, args.slice ? args.slice() : args ];
30835					queue.push( args );
30836					if ( !firing ) {
30837						fire();
30838					}
30839				}
30840				return this;
30841			},
30842
30843			// Call all the callbacks with the given arguments
30844			fire: function() {
30845				self.fireWith( this, arguments );
30846				return this;
30847			},
30848
30849			// To know if the callbacks have already been called at least once
30850			fired: function() {
30851				return !!fired;
30852			}
30853		};
30854
30855	return self;
30856};
30857
30858
30859function Identity( v ) {
30860	return v;
30861}
30862function Thrower( ex ) {
30863	throw ex;
30864}
30865
30866function adoptValue( value, resolve, reject, noValue ) {
30867	var method;
30868
30869	try {
30870
30871		// Check for promise aspect first to privilege synchronous behavior
30872		if ( value && isFunction( ( method = value.promise ) ) ) {
30873			method.call( value ).done( resolve ).fail( reject );
30874
30875		// Other thenables
30876		} else if ( value && isFunction( ( method = value.then ) ) ) {
30877			method.call( value, resolve, reject );
30878
30879		// Other non-thenables
30880		} else {
30881
30882			// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
30883			// * false: [ value ].slice( 0 ) => resolve( value )
30884			// * true: [ value ].slice( 1 ) => resolve()
30885			resolve.apply( undefined, [ value ].slice( noValue ) );
30886		}
30887
30888	// For Promises/A+, convert exceptions into rejections
30889	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
30890	// Deferred#then to conditionally suppress rejection.
30891	} catch ( value ) {
30892
30893		// Support: Android 4.0 only
30894		// Strict mode functions invoked without .call/.apply get global-object context
30895		reject.apply( undefined, [ value ] );
30896	}
30897}
30898
30899jQuery.extend( {
30900
30901	Deferred: function( func ) {
30902		var tuples = [
30903
30904				// action, add listener, callbacks,
30905				// ... .then handlers, argument index, [final state]
30906				[ "notify", "progress", jQuery.Callbacks( "memory" ),
30907					jQuery.Callbacks( "memory" ), 2 ],
30908				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
30909					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
30910				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
30911					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
30912			],
30913			state = "pending",
30914			promise = {
30915				state: function() {
30916					return state;
30917				},
30918				always: function() {
30919					deferred.done( arguments ).fail( arguments );
30920					return this;
30921				},
30922				"catch": function( fn ) {
30923					return promise.then( null, fn );
30924				},
30925
30926				// Keep pipe for back-compat
30927				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
30928					var fns = arguments;
30929
30930					return jQuery.Deferred( function( newDefer ) {
30931						jQuery.each( tuples, function( _i, tuple ) {
30932
30933							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
30934							var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
30935
30936							// deferred.progress(function() { bind to newDefer or newDefer.notify })
30937							// deferred.done(function() { bind to newDefer or newDefer.resolve })
30938							// deferred.fail(function() { bind to newDefer or newDefer.reject })
30939							deferred[ tuple[ 1 ] ]( function() {
30940								var returned = fn && fn.apply( this, arguments );
30941								if ( returned && isFunction( returned.promise ) ) {
30942									returned.promise()
30943										.progress( newDefer.notify )
30944										.done( newDefer.resolve )
30945										.fail( newDefer.reject );
30946								} else {
30947									newDefer[ tuple[ 0 ] + "With" ](
30948										this,
30949										fn ? [ returned ] : arguments
30950									);
30951								}
30952							} );
30953						} );
30954						fns = null;
30955					} ).promise();
30956				},
30957				then: function( onFulfilled, onRejected, onProgress ) {
30958					var maxDepth = 0;
30959					function resolve( depth, deferred, handler, special ) {
30960						return function() {
30961							var that = this,
30962								args = arguments,
30963								mightThrow = function() {
30964									var returned, then;
30965
30966									// Support: Promises/A+ section 2.3.3.3.3
30967									// https://promisesaplus.com/#point-59
30968									// Ignore double-resolution attempts
30969									if ( depth < maxDepth ) {
30970										return;
30971									}
30972
30973									returned = handler.apply( that, args );
30974
30975									// Support: Promises/A+ section 2.3.1
30976									// https://promisesaplus.com/#point-48
30977									if ( returned === deferred.promise() ) {
30978										throw new TypeError( "Thenable self-resolution" );
30979									}
30980
30981									// Support: Promises/A+ sections 2.3.3.1, 3.5
30982									// https://promisesaplus.com/#point-54
30983									// https://promisesaplus.com/#point-75
30984									// Retrieve `then` only once
30985									then = returned &&
30986
30987										// Support: Promises/A+ section 2.3.4
30988										// https://promisesaplus.com/#point-64
30989										// Only check objects and functions for thenability
30990										( typeof returned === "object" ||
30991											typeof returned === "function" ) &&
30992										returned.then;
30993
30994									// Handle a returned thenable
30995									if ( isFunction( then ) ) {
30996
30997										// Special processors (notify) just wait for resolution
30998										if ( special ) {
30999											then.call(
31000												returned,
31001												resolve( maxDepth, deferred, Identity, special ),
31002												resolve( maxDepth, deferred, Thrower, special )
31003											);
31004
31005										// Normal processors (resolve) also hook into progress
31006										} else {
31007
31008											// ...and disregard older resolution values
31009											maxDepth++;
31010
31011											then.call(
31012												returned,
31013												resolve( maxDepth, deferred, Identity, special ),
31014												resolve( maxDepth, deferred, Thrower, special ),
31015												resolve( maxDepth, deferred, Identity,
31016													deferred.notifyWith )
31017											);
31018										}
31019
31020									// Handle all other returned values
31021									} else {
31022
31023										// Only substitute handlers pass on context
31024										// and multiple values (non-spec behavior)
31025										if ( handler !== Identity ) {
31026											that = undefined;
31027											args = [ returned ];
31028										}
31029
31030										// Process the value(s)
31031										// Default process is resolve
31032										( special || deferred.resolveWith )( that, args );
31033									}
31034								},
31035
31036								// Only normal processors (resolve) catch and reject exceptions
31037								process = special ?
31038									mightThrow :
31039									function() {
31040										try {
31041											mightThrow();
31042										} catch ( e ) {
31043
31044											if ( jQuery.Deferred.exceptionHook ) {
31045												jQuery.Deferred.exceptionHook( e,
31046													process.error );
31047											}
31048
31049											// Support: Promises/A+ section 2.3.3.3.4.1
31050											// https://promisesaplus.com/#point-61
31051											// Ignore post-resolution exceptions
31052											if ( depth + 1 >= maxDepth ) {
31053
31054												// Only substitute handlers pass on context
31055												// and multiple values (non-spec behavior)
31056												if ( handler !== Thrower ) {
31057													that = undefined;
31058													args = [ e ];
31059												}
31060
31061												deferred.rejectWith( that, args );
31062											}
31063										}
31064									};
31065
31066							// Support: Promises/A+ section 2.3.3.3.1
31067							// https://promisesaplus.com/#point-57
31068							// Re-resolve promises immediately to dodge false rejection from
31069							// subsequent errors
31070							if ( depth ) {
31071								process();
31072							} else {
31073
31074								// Call an optional hook to record the error, in case of exception
31075								// since it's otherwise lost when execution goes async
31076								if ( jQuery.Deferred.getErrorHook ) {
31077									process.error = jQuery.Deferred.getErrorHook();
31078
31079								// The deprecated alias of the above. While the name suggests
31080								// returning the stack, not an error instance, jQuery just passes
31081								// it directly to `console.warn` so both will work; an instance
31082								// just better cooperates with source maps.
31083								} else if ( jQuery.Deferred.getStackHook ) {
31084									process.error = jQuery.Deferred.getStackHook();
31085								}
31086								window.setTimeout( process );
31087							}
31088						};
31089					}
31090
31091					return jQuery.Deferred( function( newDefer ) {
31092
31093						// progress_handlers.add( ... )
31094						tuples[ 0 ][ 3 ].add(
31095							resolve(
31096								0,
31097								newDefer,
31098								isFunction( onProgress ) ?
31099									onProgress :
31100									Identity,
31101								newDefer.notifyWith
31102							)
31103						);
31104
31105						// fulfilled_handlers.add( ... )
31106						tuples[ 1 ][ 3 ].add(
31107							resolve(
31108								0,
31109								newDefer,
31110								isFunction( onFulfilled ) ?
31111									onFulfilled :
31112									Identity
31113							)
31114						);
31115
31116						// rejected_handlers.add( ... )
31117						tuples[ 2 ][ 3 ].add(
31118							resolve(
31119								0,
31120								newDefer,
31121								isFunction( onRejected ) ?
31122									onRejected :
31123									Thrower
31124							)
31125						);
31126					} ).promise();
31127				},
31128
31129				// Get a promise for this deferred
31130				// If obj is provided, the promise aspect is added to the object
31131				promise: function( obj ) {
31132					return obj != null ? jQuery.extend( obj, promise ) : promise;
31133				}
31134			},
31135			deferred = {};
31136
31137		// Add list-specific methods
31138		jQuery.each( tuples, function( i, tuple ) {
31139			var list = tuple[ 2 ],
31140				stateString = tuple[ 5 ];
31141
31142			// promise.progress = list.add
31143			// promise.done = list.add
31144			// promise.fail = list.add
31145			promise[ tuple[ 1 ] ] = list.add;
31146
31147			// Handle state
31148			if ( stateString ) {
31149				list.add(
31150					function() {
31151
31152						// state = "resolved" (i.e., fulfilled)
31153						// state = "rejected"
31154						state = stateString;
31155					},
31156
31157					// rejected_callbacks.disable
31158					// fulfilled_callbacks.disable
31159					tuples[ 3 - i ][ 2 ].disable,
31160
31161					// rejected_handlers.disable
31162					// fulfilled_handlers.disable
31163					tuples[ 3 - i ][ 3 ].disable,
31164
31165					// progress_callbacks.lock
31166					tuples[ 0 ][ 2 ].lock,
31167
31168					// progress_handlers.lock
31169					tuples[ 0 ][ 3 ].lock
31170				);
31171			}
31172
31173			// progress_handlers.fire
31174			// fulfilled_handlers.fire
31175			// rejected_handlers.fire
31176			list.add( tuple[ 3 ].fire );
31177
31178			// deferred.notify = function() { deferred.notifyWith(...) }
31179			// deferred.resolve = function() { deferred.resolveWith(...) }
31180			// deferred.reject = function() { deferred.rejectWith(...) }
31181			deferred[ tuple[ 0 ] ] = function() {
31182				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
31183				return this;
31184			};
31185
31186			// deferred.notifyWith = list.fireWith
31187			// deferred.resolveWith = list.fireWith
31188			// deferred.rejectWith = list.fireWith
31189			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
31190		} );
31191
31192		// Make the deferred a promise
31193		promise.promise( deferred );
31194
31195		// Call given func if any
31196		if ( func ) {
31197			func.call( deferred, deferred );
31198		}
31199
31200		// All done!
31201		return deferred;
31202	},
31203
31204	// Deferred helper
31205	when: function( singleValue ) {
31206		var
31207
31208			// count of uncompleted subordinates
31209			remaining = arguments.length,
31210
31211			// count of unprocessed arguments
31212			i = remaining,
31213
31214			// subordinate fulfillment data
31215			resolveContexts = Array( i ),
31216			resolveValues = slice.call( arguments ),
31217
31218			// the primary Deferred
31219			primary = jQuery.Deferred(),
31220
31221			// subordinate callback factory
31222			updateFunc = function( i ) {
31223				return function( value ) {
31224					resolveContexts[ i ] = this;
31225					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
31226					if ( !( --remaining ) ) {
31227						primary.resolveWith( resolveContexts, resolveValues );
31228					}
31229				};
31230			};
31231
31232		// Single- and empty arguments are adopted like Promise.resolve
31233		if ( remaining <= 1 ) {
31234			adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
31235				!remaining );
31236
31237			// Use .then() to unwrap secondary thenables (cf. gh-3000)
31238			if ( primary.state() === "pending" ||
31239				isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
31240
31241				return primary.then();
31242			}
31243		}
31244
31245		// Multiple arguments are aggregated like Promise.all array elements
31246		while ( i-- ) {
31247			adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
31248		}
31249
31250		return primary.promise();
31251	}
31252} );
31253
31254
31255// These usually indicate a programmer mistake during development,
31256// warn about them ASAP rather than swallowing them by default.
31257var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
31258
31259// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error
31260// captured before the async barrier to get the original error cause
31261// which may otherwise be hidden.
31262jQuery.Deferred.exceptionHook = function( error, asyncError ) {
31263
31264	// Support: IE 8 - 9 only
31265	// Console exists when dev tools are open, which can happen at any time
31266	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
31267		window.console.warn( "jQuery.Deferred exception: " + error.message,
31268			error.stack, asyncError );
31269	}
31270};
31271
31272
31273
31274
31275jQuery.readyException = function( error ) {
31276	window.setTimeout( function() {
31277		throw error;
31278	} );
31279};
31280
31281
31282
31283
31284// The deferred used on DOM ready
31285var readyList = jQuery.Deferred();
31286
31287jQuery.fn.ready = function( fn ) {
31288
31289	readyList
31290		.then( fn )
31291
31292		// Wrap jQuery.readyException in a function so that the lookup
31293		// happens at the time of error handling instead of callback
31294		// registration.
31295		.catch( function( error ) {
31296			jQuery.readyException( error );
31297		} );
31298
31299	return this;
31300};
31301
31302jQuery.extend( {
31303
31304	// Is the DOM ready to be used? Set to true once it occurs.
31305	isReady: false,
31306
31307	// A counter to track how many items to wait for before
31308	// the ready event fires. See trac-6781
31309	readyWait: 1,
31310
31311	// Handle when the DOM is ready
31312	ready: function( wait ) {
31313
31314		// Abort if there are pending holds or we're already ready
31315		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
31316			return;
31317		}
31318
31319		// Remember that the DOM is ready
31320		jQuery.isReady = true;
31321
31322		// If a normal DOM Ready event fired, decrement, and wait if need be
31323		if ( wait !== true && --jQuery.readyWait > 0 ) {
31324			return;
31325		}
31326
31327		// If there are functions bound, to execute
31328		readyList.resolveWith( document, [ jQuery ] );
31329	}
31330} );
31331
31332jQuery.ready.then = readyList.then;
31333
31334// The ready event handler and self cleanup method
31335function completed() {
31336	document.removeEventListener( "DOMContentLoaded", completed );
31337	window.removeEventListener( "load", completed );
31338	jQuery.ready();
31339}
31340
31341// Catch cases where $(document).ready() is called
31342// after the browser event has already occurred.
31343// Support: IE <=9 - 10 only
31344// Older IE sometimes signals "interactive" too soon
31345if ( document.readyState === "complete" ||
31346	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
31347
31348	// Handle it asynchronously to allow scripts the opportunity to delay ready
31349	window.setTimeout( jQuery.ready );
31350
31351} else {
31352
31353	// Use the handy event callback
31354	document.addEventListener( "DOMContentLoaded", completed );
31355
31356	// A fallback to window.onload, that will always work
31357	window.addEventListener( "load", completed );
31358}
31359
31360
31361
31362
31363// Multifunctional method to get and set values of a collection
31364// The value/s can optionally be executed if it's a function
31365var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
31366	var i = 0,
31367		len = elems.length,
31368		bulk = key == null;
31369
31370	// Sets many values
31371	if ( toType( key ) === "object" ) {
31372		chainable = true;
31373		for ( i in key ) {
31374			access( elems, fn, i, key[ i ], true, emptyGet, raw );
31375		}
31376
31377	// Sets one value
31378	} else if ( value !== undefined ) {
31379		chainable = true;
31380
31381		if ( !isFunction( value ) ) {
31382			raw = true;
31383		}
31384
31385		if ( bulk ) {
31386
31387			// Bulk operations run against the entire set
31388			if ( raw ) {
31389				fn.call( elems, value );
31390				fn = null;
31391
31392			// ...except when executing function values
31393			} else {
31394				bulk = fn;
31395				fn = function( elem, _key, value ) {
31396					return bulk.call( jQuery( elem ), value );
31397				};
31398			}
31399		}
31400
31401		if ( fn ) {
31402			for ( ; i < len; i++ ) {
31403				fn(
31404					elems[ i ], key, raw ?
31405						value :
31406						value.call( elems[ i ], i, fn( elems[ i ], key ) )
31407				);
31408			}
31409		}
31410	}
31411
31412	if ( chainable ) {
31413		return elems;
31414	}
31415
31416	// Gets
31417	if ( bulk ) {
31418		return fn.call( elems );
31419	}
31420
31421	return len ? fn( elems[ 0 ], key ) : emptyGet;
31422};
31423
31424
31425// Matches dashed string for camelizing
31426var rmsPrefix = /^-ms-/,
31427	rdashAlpha = /-([a-z])/g;
31428
31429// Used by camelCase as callback to replace()
31430function fcamelCase( _all, letter ) {
31431	return letter.toUpperCase();
31432}
31433
31434// Convert dashed to camelCase; used by the css and data modules
31435// Support: IE <=9 - 11, Edge 12 - 15
31436// Microsoft forgot to hump their vendor prefix (trac-9572)
31437function camelCase( string ) {
31438	return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
31439}
31440var acceptData = function( owner ) {
31441
31442	// Accepts only:
31443	//  - Node
31444	//    - Node.ELEMENT_NODE
31445	//    - Node.DOCUMENT_NODE
31446	//  - Object
31447	//    - Any
31448	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
31449};
31450
31451
31452
31453
31454function Data() {
31455	this.expando = jQuery.expando + Data.uid++;
31456}
31457
31458Data.uid = 1;
31459
31460Data.prototype = {
31461
31462	cache: function( owner ) {
31463
31464		// Check if the owner object already has a cache
31465		var value = owner[ this.expando ];
31466
31467		// If not, create one
31468		if ( !value ) {
31469			value = {};
31470
31471			// We can accept data for non-element nodes in modern browsers,
31472			// but we should not, see trac-8335.
31473			// Always return an empty object.
31474			if ( acceptData( owner ) ) {
31475
31476				// If it is a node unlikely to be stringify-ed or looped over
31477				// use plain assignment
31478				if ( owner.nodeType ) {
31479					owner[ this.expando ] = value;
31480
31481				// Otherwise secure it in a non-enumerable property
31482				// configurable must be true to allow the property to be
31483				// deleted when data is removed
31484				} else {
31485					Object.defineProperty( owner, this.expando, {
31486						value: value,
31487						configurable: true
31488					} );
31489				}
31490			}
31491		}
31492
31493		return value;
31494	},
31495	set: function( owner, data, value ) {
31496		var prop,
31497			cache = this.cache( owner );
31498
31499		// Handle: [ owner, key, value ] args
31500		// Always use camelCase key (gh-2257)
31501		if ( typeof data === "string" ) {
31502			cache[ camelCase( data ) ] = value;
31503
31504		// Handle: [ owner, { properties } ] args
31505		} else {
31506
31507			// Copy the properties one-by-one to the cache object
31508			for ( prop in data ) {
31509				cache[ camelCase( prop ) ] = data[ prop ];
31510			}
31511		}
31512		return cache;
31513	},
31514	get: function( owner, key ) {
31515		return key === undefined ?
31516			this.cache( owner ) :
31517
31518			// Always use camelCase key (gh-2257)
31519			owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
31520	},
31521	access: function( owner, key, value ) {
31522
31523		// In cases where either:
31524		//
31525		//   1. No key was specified
31526		//   2. A string key was specified, but no value provided
31527		//
31528		// Take the "read" path and allow the get method to determine
31529		// which value to return, respectively either:
31530		//
31531		//   1. The entire cache object
31532		//   2. The data stored at the key
31533		//
31534		if ( key === undefined ||
31535				( ( key && typeof key === "string" ) && value === undefined ) ) {
31536
31537			return this.get( owner, key );
31538		}
31539
31540		// When the key is not a string, or both a key and value
31541		// are specified, set or extend (existing objects) with either:
31542		//
31543		//   1. An object of properties
31544		//   2. A key and value
31545		//
31546		this.set( owner, key, value );
31547
31548		// Since the "set" path can have two possible entry points
31549		// return the expected data based on which path was taken[*]
31550		return value !== undefined ? value : key;
31551	},
31552	remove: function( owner, key ) {
31553		var i,
31554			cache = owner[ this.expando ];
31555
31556		if ( cache === undefined ) {
31557			return;
31558		}
31559
31560		if ( key !== undefined ) {
31561
31562			// Support array or space separated string of keys
31563			if ( Array.isArray( key ) ) {
31564
31565				// If key is an array of keys...
31566				// We always set camelCase keys, so remove that.
31567				key = key.map( camelCase );
31568			} else {
31569				key = camelCase( key );
31570
31571				// If a key with the spaces exists, use it.
31572				// Otherwise, create an array by matching non-whitespace
31573				key = key in cache ?
31574					[ key ] :
31575					( key.match( rnothtmlwhite ) || [] );
31576			}
31577
31578			i = key.length;
31579
31580			while ( i-- ) {
31581				delete cache[ key[ i ] ];
31582			}
31583		}
31584
31585		// Remove the expando if there's no more data
31586		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
31587
31588			// Support: Chrome <=35 - 45
31589			// Webkit & Blink performance suffers when deleting properties
31590			// from DOM nodes, so set to undefined instead
31591			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
31592			if ( owner.nodeType ) {
31593				owner[ this.expando ] = undefined;
31594			} else {
31595				delete owner[ this.expando ];
31596			}
31597		}
31598	},
31599	hasData: function( owner ) {
31600		var cache = owner[ this.expando ];
31601		return cache !== undefined && !jQuery.isEmptyObject( cache );
31602	}
31603};
31604var dataPriv = new Data();
31605
31606var dataUser = new Data();
31607
31608
31609
31610//	Implementation Summary
31611//
31612//	1. Enforce API surface and semantic compatibility with 1.9.x branch
31613//	2. Improve the module's maintainability by reducing the storage
31614//		paths to a single mechanism.
31615//	3. Use the same single mechanism to support "private" and "user" data.
31616//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
31617//	5. Avoid exposing implementation details on user objects (eg. expando properties)
31618//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
31619
31620var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
31621	rmultiDash = /[A-Z]/g;
31622
31623function getData( data ) {
31624	if ( data === "true" ) {
31625		return true;
31626	}
31627
31628	if ( data === "false" ) {
31629		return false;
31630	}
31631
31632	if ( data === "null" ) {
31633		return null;
31634	}
31635
31636	// Only convert to a number if it doesn't change the string
31637	if ( data === +data + "" ) {
31638		return +data;
31639	}
31640
31641	if ( rbrace.test( data ) ) {
31642		return JSON.parse( data );
31643	}
31644
31645	return data;
31646}
31647
31648function dataAttr( elem, key, data ) {
31649	var name;
31650
31651	// If nothing was found internally, try to fetch any
31652	// data from the HTML5 data-* attribute
31653	if ( data === undefined && elem.nodeType === 1 ) {
31654		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
31655		data = elem.getAttribute( name );
31656
31657		if ( typeof data === "string" ) {
31658			try {
31659				data = getData( data );
31660			} catch ( e ) {}
31661
31662			// Make sure we set the data so it isn't changed later
31663			dataUser.set( elem, key, data );
31664		} else {
31665			data = undefined;
31666		}
31667	}
31668	return data;
31669}
31670
31671jQuery.extend( {
31672	hasData: function( elem ) {
31673		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
31674	},
31675
31676	data: function( elem, name, data ) {
31677		return dataUser.access( elem, name, data );
31678	},
31679
31680	removeData: function( elem, name ) {
31681		dataUser.remove( elem, name );
31682	},
31683
31684	// TODO: Now that all calls to _data and _removeData have been replaced
31685	// with direct calls to dataPriv methods, these can be deprecated.
31686	_data: function( elem, name, data ) {
31687		return dataPriv.access( elem, name, data );
31688	},
31689
31690	_removeData: function( elem, name ) {
31691		dataPriv.remove( elem, name );
31692	}
31693} );
31694
31695jQuery.fn.extend( {
31696	data: function( key, value ) {
31697		var i, name, data,
31698			elem = this[ 0 ],
31699			attrs = elem && elem.attributes;
31700
31701		// Gets all values
31702		if ( key === undefined ) {
31703			if ( this.length ) {
31704				data = dataUser.get( elem );
31705
31706				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
31707					i = attrs.length;
31708					while ( i-- ) {
31709
31710						// Support: IE 11 only
31711						// The attrs elements can be null (trac-14894)
31712						if ( attrs[ i ] ) {
31713							name = attrs[ i ].name;
31714							if ( name.indexOf( "data-" ) === 0 ) {
31715								name = camelCase( name.slice( 5 ) );
31716								dataAttr( elem, name, data[ name ] );
31717							}
31718						}
31719					}
31720					dataPriv.set( elem, "hasDataAttrs", true );
31721				}
31722			}
31723
31724			return data;
31725		}
31726
31727		// Sets multiple values
31728		if ( typeof key === "object" ) {
31729			return this.each( function() {
31730				dataUser.set( this, key );
31731			} );
31732		}
31733
31734		return access( this, function( value ) {
31735			var data;
31736
31737			// The calling jQuery object (element matches) is not empty
31738			// (and therefore has an element appears at this[ 0 ]) and the
31739			// `value` parameter was not undefined. An empty jQuery object
31740			// will result in `undefined` for elem = this[ 0 ] which will
31741			// throw an exception if an attempt to read a data cache is made.
31742			if ( elem && value === undefined ) {
31743
31744				// Attempt to get data from the cache
31745				// The key will always be camelCased in Data
31746				data = dataUser.get( elem, key );
31747				if ( data !== undefined ) {
31748					return data;
31749				}
31750
31751				// Attempt to "discover" the data in
31752				// HTML5 custom data-* attrs
31753				data = dataAttr( elem, key );
31754				if ( data !== undefined ) {
31755					return data;
31756				}
31757
31758				// We tried really hard, but the data doesn't exist.
31759				return;
31760			}
31761
31762			// Set the data...
31763			this.each( function() {
31764
31765				// We always store the camelCased key
31766				dataUser.set( this, key, value );
31767			} );
31768		}, null, value, arguments.length > 1, null, true );
31769	},
31770
31771	removeData: function( key ) {
31772		return this.each( function() {
31773			dataUser.remove( this, key );
31774		} );
31775	}
31776} );
31777
31778
31779jQuery.extend( {
31780	queue: function( elem, type, data ) {
31781		var queue;
31782
31783		if ( elem ) {
31784			type = ( type || "fx" ) + "queue";
31785			queue = dataPriv.get( elem, type );
31786
31787			// Speed up dequeue by getting out quickly if this is just a lookup
31788			if ( data ) {
31789				if ( !queue || Array.isArray( data ) ) {
31790					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
31791				} else {
31792					queue.push( data );
31793				}
31794			}
31795			return queue || [];
31796		}
31797	},
31798
31799	dequeue: function( elem, type ) {
31800		type = type || "fx";
31801
31802		var queue = jQuery.queue( elem, type ),
31803			startLength = queue.length,
31804			fn = queue.shift(),
31805			hooks = jQuery._queueHooks( elem, type ),
31806			next = function() {
31807				jQuery.dequeue( elem, type );
31808			};
31809
31810		// If the fx queue is dequeued, always remove the progress sentinel
31811		if ( fn === "inprogress" ) {
31812			fn = queue.shift();
31813			startLength--;
31814		}
31815
31816		if ( fn ) {
31817
31818			// Add a progress sentinel to prevent the fx queue from being
31819			// automatically dequeued
31820			if ( type === "fx" ) {
31821				queue.unshift( "inprogress" );
31822			}
31823
31824			// Clear up the last queue stop function
31825			delete hooks.stop;
31826			fn.call( elem, next, hooks );
31827		}
31828
31829		if ( !startLength && hooks ) {
31830			hooks.empty.fire();
31831		}
31832	},
31833
31834	// Not public - generate a queueHooks object, or return the current one
31835	_queueHooks: function( elem, type ) {
31836		var key = type + "queueHooks";
31837		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
31838			empty: jQuery.Callbacks( "once memory" ).add( function() {
31839				dataPriv.remove( elem, [ type + "queue", key ] );
31840			} )
31841		} );
31842	}
31843} );
31844
31845jQuery.fn.extend( {
31846	queue: function( type, data ) {
31847		var setter = 2;
31848
31849		if ( typeof type !== "string" ) {
31850			data = type;
31851			type = "fx";
31852			setter--;
31853		}
31854
31855		if ( arguments.length < setter ) {
31856			return jQuery.queue( this[ 0 ], type );
31857		}
31858
31859		return data === undefined ?
31860			this :
31861			this.each( function() {
31862				var queue = jQuery.queue( this, type, data );
31863
31864				// Ensure a hooks for this queue
31865				jQuery._queueHooks( this, type );
31866
31867				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
31868					jQuery.dequeue( this, type );
31869				}
31870			} );
31871	},
31872	dequeue: function( type ) {
31873		return this.each( function() {
31874			jQuery.dequeue( this, type );
31875		} );
31876	},
31877	clearQueue: function( type ) {
31878		return this.queue( type || "fx", [] );
31879	},
31880
31881	// Get a promise resolved when queues of a certain type
31882	// are emptied (fx is the type by default)
31883	promise: function( type, obj ) {
31884		var tmp,
31885			count = 1,
31886			defer = jQuery.Deferred(),
31887			elements = this,
31888			i = this.length,
31889			resolve = function() {
31890				if ( !( --count ) ) {
31891					defer.resolveWith( elements, [ elements ] );
31892				}
31893			};
31894
31895		if ( typeof type !== "string" ) {
31896			obj = type;
31897			type = undefined;
31898		}
31899		type = type || "fx";
31900
31901		while ( i-- ) {
31902			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
31903			if ( tmp && tmp.empty ) {
31904				count++;
31905				tmp.empty.add( resolve );
31906			}
31907		}
31908		resolve();
31909		return defer.promise( obj );
31910	}
31911} );
31912var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
31913
31914var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
31915
31916
31917var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
31918
31919var documentElement = document.documentElement;
31920
31921
31922
31923	var isAttached = function( elem ) {
31924			return jQuery.contains( elem.ownerDocument, elem );
31925		},
31926		composed = { composed: true };
31927
31928	// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
31929	// Check attachment across shadow DOM boundaries when possible (gh-3504)
31930	// Support: iOS 10.0-10.2 only
31931	// Early iOS 10 versions support `attachShadow` but not `getRootNode`,
31932	// leading to errors. We need to check for `getRootNode`.
31933	if ( documentElement.getRootNode ) {
31934		isAttached = function( elem ) {
31935			return jQuery.contains( elem.ownerDocument, elem ) ||
31936				elem.getRootNode( composed ) === elem.ownerDocument;
31937		};
31938	}
31939var isHiddenWithinTree = function( elem, el ) {
31940
31941		// isHiddenWithinTree might be called from jQuery#filter function;
31942		// in that case, element will be second argument
31943		elem = el || elem;
31944
31945		// Inline style trumps all
31946		return elem.style.display === "none" ||
31947			elem.style.display === "" &&
31948
31949			// Otherwise, check computed style
31950			// Support: Firefox <=43 - 45
31951			// Disconnected elements can have computed display: none, so first confirm that elem is
31952			// in the document.
31953			isAttached( elem ) &&
31954
31955			jQuery.css( elem, "display" ) === "none";
31956	};
31957
31958
31959
31960function adjustCSS( elem, prop, valueParts, tween ) {
31961	var adjusted, scale,
31962		maxIterations = 20,
31963		currentValue = tween ?
31964			function() {
31965				return tween.cur();
31966			} :
31967			function() {
31968				return jQuery.css( elem, prop, "" );
31969			},
31970		initial = currentValue(),
31971		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
31972
31973		// Starting value computation is required for potential unit mismatches
31974		initialInUnit = elem.nodeType &&
31975			( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
31976			rcssNum.exec( jQuery.css( elem, prop ) );
31977
31978	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
31979
31980		// Support: Firefox <=54
31981		// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
31982		initial = initial / 2;
31983
31984		// Trust units reported by jQuery.css
31985		unit = unit || initialInUnit[ 3 ];
31986
31987		// Iteratively approximate from a nonzero starting point
31988		initialInUnit = +initial || 1;
31989
31990		while ( maxIterations-- ) {
31991
31992			// Evaluate and update our best guess (doubling guesses that zero out).
31993			// Finish if the scale equals or crosses 1 (making the old*new product non-positive).
31994			jQuery.style( elem, prop, initialInUnit + unit );
31995			if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
31996				maxIterations = 0;
31997			}
31998			initialInUnit = initialInUnit / scale;
31999
32000		}
32001
32002		initialInUnit = initialInUnit * 2;
32003		jQuery.style( elem, prop, initialInUnit + unit );
32004
32005		// Make sure we update the tween properties later on
32006		valueParts = valueParts || [];
32007	}
32008
32009	if ( valueParts ) {
32010		initialInUnit = +initialInUnit || +initial || 0;
32011
32012		// Apply relative offset (+=/-=) if specified
32013		adjusted = valueParts[ 1 ] ?
32014			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
32015			+valueParts[ 2 ];
32016		if ( tween ) {
32017			tween.unit = unit;
32018			tween.start = initialInUnit;
32019			tween.end = adjusted;
32020		}
32021	}
32022	return adjusted;
32023}
32024
32025
32026var defaultDisplayMap = {};
32027
32028function getDefaultDisplay( elem ) {
32029	var temp,
32030		doc = elem.ownerDocument,
32031		nodeName = elem.nodeName,
32032		display = defaultDisplayMap[ nodeName ];
32033
32034	if ( display ) {
32035		return display;
32036	}
32037
32038	temp = doc.body.appendChild( doc.createElement( nodeName ) );
32039	display = jQuery.css( temp, "display" );
32040
32041	temp.parentNode.removeChild( temp );
32042
32043	if ( display === "none" ) {
32044		display = "block";
32045	}
32046	defaultDisplayMap[ nodeName ] = display;
32047
32048	return display;
32049}
32050
32051function showHide( elements, show ) {
32052	var display, elem,
32053		values = [],
32054		index = 0,
32055		length = elements.length;
32056
32057	// Determine new display value for elements that need to change
32058	for ( ; index < length; index++ ) {
32059		elem = elements[ index ];
32060		if ( !elem.style ) {
32061			continue;
32062		}
32063
32064		display = elem.style.display;
32065		if ( show ) {
32066
32067			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
32068			// check is required in this first loop unless we have a nonempty display value (either
32069			// inline or about-to-be-restored)
32070			if ( display === "none" ) {
32071				values[ index ] = dataPriv.get( elem, "display" ) || null;
32072				if ( !values[ index ] ) {
32073					elem.style.display = "";
32074				}
32075			}
32076			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
32077				values[ index ] = getDefaultDisplay( elem );
32078			}
32079		} else {
32080			if ( display !== "none" ) {
32081				values[ index ] = "none";
32082
32083				// Remember what we're overwriting
32084				dataPriv.set( elem, "display", display );
32085			}
32086		}
32087	}
32088
32089	// Set the display of the elements in a second loop to avoid constant reflow
32090	for ( index = 0; index < length; index++ ) {
32091		if ( values[ index ] != null ) {
32092			elements[ index ].style.display = values[ index ];
32093		}
32094	}
32095
32096	return elements;
32097}
32098
32099jQuery.fn.extend( {
32100	show: function() {
32101		return showHide( this, true );
32102	},
32103	hide: function() {
32104		return showHide( this );
32105	},
32106	toggle: function( state ) {
32107		if ( typeof state === "boolean" ) {
32108			return state ? this.show() : this.hide();
32109		}
32110
32111		return this.each( function() {
32112			if ( isHiddenWithinTree( this ) ) {
32113				jQuery( this ).show();
32114			} else {
32115				jQuery( this ).hide();
32116			}
32117		} );
32118	}
32119} );
32120var rcheckableType = ( /^(?:checkbox|radio)$/i );
32121
32122var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
32123
32124var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
32125
32126
32127
32128( function() {
32129	var fragment = document.createDocumentFragment(),
32130		div = fragment.appendChild( document.createElement( "div" ) ),
32131		input = document.createElement( "input" );
32132
32133	// Support: Android 4.0 - 4.3 only
32134	// Check state lost if the name is set (trac-11217)
32135	// Support: Windows Web Apps (WWA)
32136	// `name` and `type` must use .setAttribute for WWA (trac-14901)
32137	input.setAttribute( "type", "radio" );
32138	input.setAttribute( "checked", "checked" );
32139	input.setAttribute( "name", "t" );
32140
32141	div.appendChild( input );
32142
32143	// Support: Android <=4.1 only
32144	// Older WebKit doesn't clone checked state correctly in fragments
32145	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
32146
32147	// Support: IE <=11 only
32148	// Make sure textarea (and checkbox) defaultValue is properly cloned
32149	div.innerHTML = "<textarea>x</textarea>";
32150	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
32151
32152	// Support: IE <=9 only
32153	// IE <=9 replaces <option> tags with their contents when inserted outside of
32154	// the select element.
32155	div.innerHTML = "<option></option>";
32156	support.option = !!div.lastChild;
32157} )();
32158
32159
32160// We have to close these tags to support XHTML (trac-13200)
32161var wrapMap = {
32162
32163	// XHTML parsers do not magically insert elements in the
32164	// same way that tag soup parsers do. So we cannot shorten
32165	// this by omitting <tbody> or other required elements.
32166	thead: [ 1, "<table>", "</table>" ],
32167	col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
32168	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
32169	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
32170
32171	_default: [ 0, "", "" ]
32172};
32173
32174wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
32175wrapMap.th = wrapMap.td;
32176
32177// Support: IE <=9 only
32178if ( !support.option ) {
32179	wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
32180}
32181
32182
32183function getAll( context, tag ) {
32184
32185	// Support: IE <=9 - 11 only
32186	// Use typeof to avoid zero-argument method invocation on host objects (trac-15151)
32187	var ret;
32188
32189	if ( typeof context.getElementsByTagName !== "undefined" ) {
32190		ret = context.getElementsByTagName( tag || "*" );
32191
32192	} else if ( typeof context.querySelectorAll !== "undefined" ) {
32193		ret = context.querySelectorAll( tag || "*" );
32194
32195	} else {
32196		ret = [];
32197	}
32198
32199	if ( tag === undefined || tag && nodeName( context, tag ) ) {
32200		return jQuery.merge( [ context ], ret );
32201	}
32202
32203	return ret;
32204}
32205
32206
32207// Mark scripts as having already been evaluated
32208function setGlobalEval( elems, refElements ) {
32209	var i = 0,
32210		l = elems.length;
32211
32212	for ( ; i < l; i++ ) {
32213		dataPriv.set(
32214			elems[ i ],
32215			"globalEval",
32216			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
32217		);
32218	}
32219}
32220
32221
32222var rhtml = /<|&#?\w+;/;
32223
32224function buildFragment( elems, context, scripts, selection, ignored ) {
32225	var elem, tmp, tag, wrap, attached, j,
32226		fragment = context.createDocumentFragment(),
32227		nodes = [],
32228		i = 0,
32229		l = elems.length;
32230
32231	for ( ; i < l; i++ ) {
32232		elem = elems[ i ];
32233
32234		if ( elem || elem === 0 ) {
32235
32236			// Add nodes directly
32237			if ( toType( elem ) === "object" ) {
32238
32239				// Support: Android <=4.0 only, PhantomJS 1 only
32240				// push.apply(_, arraylike) throws on ancient WebKit
32241				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
32242
32243			// Convert non-html into a text node
32244			} else if ( !rhtml.test( elem ) ) {
32245				nodes.push( context.createTextNode( elem ) );
32246
32247			// Convert html into DOM nodes
32248			} else {
32249				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
32250
32251				// Deserialize a standard representation
32252				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
32253				wrap = wrapMap[ tag ] || wrapMap._default;
32254				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
32255
32256				// Descend through wrappers to the right content
32257				j = wrap[ 0 ];
32258				while ( j-- ) {
32259					tmp = tmp.lastChild;
32260				}
32261
32262				// Support: Android <=4.0 only, PhantomJS 1 only
32263				// push.apply(_, arraylike) throws on ancient WebKit
32264				jQuery.merge( nodes, tmp.childNodes );
32265
32266				// Remember the top-level container
32267				tmp = fragment.firstChild;
32268
32269				// Ensure the created nodes are orphaned (trac-12392)
32270				tmp.textContent = "";
32271			}
32272		}
32273	}
32274
32275	// Remove wrapper from fragment
32276	fragment.textContent = "";
32277
32278	i = 0;
32279	while ( ( elem = nodes[ i++ ] ) ) {
32280
32281		// Skip elements already in the context collection (trac-4087)
32282		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
32283			if ( ignored ) {
32284				ignored.push( elem );
32285			}
32286			continue;
32287		}
32288
32289		attached = isAttached( elem );
32290
32291		// Append to fragment
32292		tmp = getAll( fragment.appendChild( elem ), "script" );
32293
32294		// Preserve script evaluation history
32295		if ( attached ) {
32296			setGlobalEval( tmp );
32297		}
32298
32299		// Capture executables
32300		if ( scripts ) {
32301			j = 0;
32302			while ( ( elem = tmp[ j++ ] ) ) {
32303				if ( rscriptType.test( elem.type || "" ) ) {
32304					scripts.push( elem );
32305				}
32306			}
32307		}
32308	}
32309
32310	return fragment;
32311}
32312
32313
32314var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
32315
32316function returnTrue() {
32317	return true;
32318}
32319
32320function returnFalse() {
32321	return false;
32322}
32323
32324function on( elem, types, selector, data, fn, one ) {
32325	var origFn, type;
32326
32327	// Types can be a map of types/handlers
32328	if ( typeof types === "object" ) {
32329
32330		// ( types-Object, selector, data )
32331		if ( typeof selector !== "string" ) {
32332
32333			// ( types-Object, data )
32334			data = data || selector;
32335			selector = undefined;
32336		}
32337		for ( type in types ) {
32338			on( elem, type, selector, data, types[ type ], one );
32339		}
32340		return elem;
32341	}
32342
32343	if ( data == null && fn == null ) {
32344
32345		// ( types, fn )
32346		fn = selector;
32347		data = selector = undefined;
32348	} else if ( fn == null ) {
32349		if ( typeof selector === "string" ) {
32350
32351			// ( types, selector, fn )
32352			fn = data;
32353			data = undefined;
32354		} else {
32355
32356			// ( types, data, fn )
32357			fn = data;
32358			data = selector;
32359			selector = undefined;
32360		}
32361	}
32362	if ( fn === false ) {
32363		fn = returnFalse;
32364	} else if ( !fn ) {
32365		return elem;
32366	}
32367
32368	if ( one === 1 ) {
32369		origFn = fn;
32370		fn = function( event ) {
32371
32372			// Can use an empty set, since event contains the info
32373			jQuery().off( event );
32374			return origFn.apply( this, arguments );
32375		};
32376
32377		// Use same guid so caller can remove using origFn
32378		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
32379	}
32380	return elem.each( function() {
32381		jQuery.event.add( this, types, fn, data, selector );
32382	} );
32383}
32384
32385/*
32386 * Helper functions for managing events -- not part of the public interface.
32387 * Props to Dean Edwards' addEvent library for many of the ideas.
32388 */
32389jQuery.event = {
32390
32391	global: {},
32392
32393	add: function( elem, types, handler, data, selector ) {
32394
32395		var handleObjIn, eventHandle, tmp,
32396			events, t, handleObj,
32397			special, handlers, type, namespaces, origType,
32398			elemData = dataPriv.get( elem );
32399
32400		// Only attach events to objects that accept data
32401		if ( !acceptData( elem ) ) {
32402			return;
32403		}
32404
32405		// Caller can pass in an object of custom data in lieu of the handler
32406		if ( handler.handler ) {
32407			handleObjIn = handler;
32408			handler = handleObjIn.handler;
32409			selector = handleObjIn.selector;
32410		}
32411
32412		// Ensure that invalid selectors throw exceptions at attach time
32413		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
32414		if ( selector ) {
32415			jQuery.find.matchesSelector( documentElement, selector );
32416		}
32417
32418		// Make sure that the handler has a unique ID, used to find/remove it later
32419		if ( !handler.guid ) {
32420			handler.guid = jQuery.guid++;
32421		}
32422
32423		// Init the element's event structure and main handler, if this is the first
32424		if ( !( events = elemData.events ) ) {
32425			events = elemData.events = Object.create( null );
32426		}
32427		if ( !( eventHandle = elemData.handle ) ) {
32428			eventHandle = elemData.handle = function( e ) {
32429
32430				// Discard the second event of a jQuery.event.trigger() and
32431				// when an event is called after a page has unloaded
32432				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
32433					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
32434			};
32435		}
32436
32437		// Handle multiple events separated by a space
32438		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
32439		t = types.length;
32440		while ( t-- ) {
32441			tmp = rtypenamespace.exec( types[ t ] ) || [];
32442			type = origType = tmp[ 1 ];
32443			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
32444
32445			// There *must* be a type, no attaching namespace-only handlers
32446			if ( !type ) {
32447				continue;
32448			}
32449
32450			// If event changes its type, use the special event handlers for the changed type
32451			special = jQuery.event.special[ type ] || {};
32452
32453			// If selector defined, determine special event api type, otherwise given type
32454			type = ( selector ? special.delegateType : special.bindType ) || type;
32455
32456			// Update special based on newly reset type
32457			special = jQuery.event.special[ type ] || {};
32458
32459			// handleObj is passed to all event handlers
32460			handleObj = jQuery.extend( {
32461				type: type,
32462				origType: origType,
32463				data: data,
32464				handler: handler,
32465				guid: handler.guid,
32466				selector: selector,
32467				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
32468				namespace: namespaces.join( "." )
32469			}, handleObjIn );
32470
32471			// Init the event handler queue if we're the first
32472			if ( !( handlers = events[ type ] ) ) {
32473				handlers = events[ type ] = [];
32474				handlers.delegateCount = 0;
32475
32476				// Only use addEventListener if the special events handler returns false
32477				if ( !special.setup ||
32478					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
32479
32480					if ( elem.addEventListener ) {
32481						elem.addEventListener( type, eventHandle );
32482					}
32483				}
32484			}
32485
32486			if ( special.add ) {
32487				special.add.call( elem, handleObj );
32488
32489				if ( !handleObj.handler.guid ) {
32490					handleObj.handler.guid = handler.guid;
32491				}
32492			}
32493
32494			// Add to the element's handler list, delegates in front
32495			if ( selector ) {
32496				handlers.splice( handlers.delegateCount++, 0, handleObj );
32497			} else {
32498				handlers.push( handleObj );
32499			}
32500
32501			// Keep track of which events have ever been used, for event optimization
32502			jQuery.event.global[ type ] = true;
32503		}
32504
32505	},
32506
32507	// Detach an event or set of events from an element
32508	remove: function( elem, types, handler, selector, mappedTypes ) {
32509
32510		var j, origCount, tmp,
32511			events, t, handleObj,
32512			special, handlers, type, namespaces, origType,
32513			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
32514
32515		if ( !elemData || !( events = elemData.events ) ) {
32516			return;
32517		}
32518
32519		// Once for each type.namespace in types; type may be omitted
32520		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
32521		t = types.length;
32522		while ( t-- ) {
32523			tmp = rtypenamespace.exec( types[ t ] ) || [];
32524			type = origType = tmp[ 1 ];
32525			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
32526
32527			// Unbind all events (on this namespace, if provided) for the element
32528			if ( !type ) {
32529				for ( type in events ) {
32530					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
32531				}
32532				continue;
32533			}
32534
32535			special = jQuery.event.special[ type ] || {};
32536			type = ( selector ? special.delegateType : special.bindType ) || type;
32537			handlers = events[ type ] || [];
32538			tmp = tmp[ 2 ] &&
32539				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
32540
32541			// Remove matching events
32542			origCount = j = handlers.length;
32543			while ( j-- ) {
32544				handleObj = handlers[ j ];
32545
32546				if ( ( mappedTypes || origType === handleObj.origType ) &&
32547					( !handler || handler.guid === handleObj.guid ) &&
32548					( !tmp || tmp.test( handleObj.namespace ) ) &&
32549					( !selector || selector === handleObj.selector ||
32550						selector === "**" && handleObj.selector ) ) {
32551					handlers.splice( j, 1 );
32552
32553					if ( handleObj.selector ) {
32554						handlers.delegateCount--;
32555					}
32556					if ( special.remove ) {
32557						special.remove.call( elem, handleObj );
32558					}
32559				}
32560			}
32561
32562			// Remove generic event handler if we removed something and no more handlers exist
32563			// (avoids potential for endless recursion during removal of special event handlers)
32564			if ( origCount && !handlers.length ) {
32565				if ( !special.teardown ||
32566					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
32567
32568					jQuery.removeEvent( elem, type, elemData.handle );
32569				}
32570
32571				delete events[ type ];
32572			}
32573		}
32574
32575		// Remove data and the expando if it's no longer used
32576		if ( jQuery.isEmptyObject( events ) ) {
32577			dataPriv.remove( elem, "handle events" );
32578		}
32579	},
32580
32581	dispatch: function( nativeEvent ) {
32582
32583		var i, j, ret, matched, handleObj, handlerQueue,
32584			args = new Array( arguments.length ),
32585
32586			// Make a writable jQuery.Event from the native event object
32587			event = jQuery.event.fix( nativeEvent ),
32588
32589			handlers = (
32590				dataPriv.get( this, "events" ) || Object.create( null )
32591			)[ event.type ] || [],
32592			special = jQuery.event.special[ event.type ] || {};
32593
32594		// Use the fix-ed jQuery.Event rather than the (read-only) native event
32595		args[ 0 ] = event;
32596
32597		for ( i = 1; i < arguments.length; i++ ) {
32598			args[ i ] = arguments[ i ];
32599		}
32600
32601		event.delegateTarget = this;
32602
32603		// Call the preDispatch hook for the mapped type, and let it bail if desired
32604		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
32605			return;
32606		}
32607
32608		// Determine handlers
32609		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
32610
32611		// Run delegates first; they may want to stop propagation beneath us
32612		i = 0;
32613		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
32614			event.currentTarget = matched.elem;
32615
32616			j = 0;
32617			while ( ( handleObj = matched.handlers[ j++ ] ) &&
32618				!event.isImmediatePropagationStopped() ) {
32619
32620				// If the event is namespaced, then each handler is only invoked if it is
32621				// specially universal or its namespaces are a superset of the event's.
32622				if ( !event.rnamespace || handleObj.namespace === false ||
32623					event.rnamespace.test( handleObj.namespace ) ) {
32624
32625					event.handleObj = handleObj;
32626					event.data = handleObj.data;
32627
32628					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
32629						handleObj.handler ).apply( matched.elem, args );
32630
32631					if ( ret !== undefined ) {
32632						if ( ( event.result = ret ) === false ) {
32633							event.preventDefault();
32634							event.stopPropagation();
32635						}
32636					}
32637				}
32638			}
32639		}
32640
32641		// Call the postDispatch hook for the mapped type
32642		if ( special.postDispatch ) {
32643			special.postDispatch.call( this, event );
32644		}
32645
32646		return event.result;
32647	},
32648
32649	handlers: function( event, handlers ) {
32650		var i, handleObj, sel, matchedHandlers, matchedSelectors,
32651			handlerQueue = [],
32652			delegateCount = handlers.delegateCount,
32653			cur = event.target;
32654
32655		// Find delegate handlers
32656		if ( delegateCount &&
32657
32658			// Support: IE <=9
32659			// Black-hole SVG <use> instance trees (trac-13180)
32660			cur.nodeType &&
32661
32662			// Support: Firefox <=42
32663			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
32664			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
32665			// Support: IE 11 only
32666			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
32667			!( event.type === "click" && event.button >= 1 ) ) {
32668
32669			for ( ; cur !== this; cur = cur.parentNode || this ) {
32670
32671				// Don't check non-elements (trac-13208)
32672				// Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)
32673				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
32674					matchedHandlers = [];
32675					matchedSelectors = {};
32676					for ( i = 0; i < delegateCount; i++ ) {
32677						handleObj = handlers[ i ];
32678
32679						// Don't conflict with Object.prototype properties (trac-13203)
32680						sel = handleObj.selector + " ";
32681
32682						if ( matchedSelectors[ sel ] === undefined ) {
32683							matchedSelectors[ sel ] = handleObj.needsContext ?
32684								jQuery( sel, this ).index( cur ) > -1 :
32685								jQuery.find( sel, this, null, [ cur ] ).length;
32686						}
32687						if ( matchedSelectors[ sel ] ) {
32688							matchedHandlers.push( handleObj );
32689						}
32690					}
32691					if ( matchedHandlers.length ) {
32692						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
32693					}
32694				}
32695			}
32696		}
32697
32698		// Add the remaining (directly-bound) handlers
32699		cur = this;
32700		if ( delegateCount < handlers.length ) {
32701			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
32702		}
32703
32704		return handlerQueue;
32705	},
32706
32707	addProp: function( name, hook ) {
32708		Object.defineProperty( jQuery.Event.prototype, name, {
32709			enumerable: true,
32710			configurable: true,
32711
32712			get: isFunction( hook ) ?
32713				function() {
32714					if ( this.originalEvent ) {
32715						return hook( this.originalEvent );
32716					}
32717				} :
32718				function() {
32719					if ( this.originalEvent ) {
32720						return this.originalEvent[ name ];
32721					}
32722				},
32723
32724			set: function( value ) {
32725				Object.defineProperty( this, name, {
32726					enumerable: true,
32727					configurable: true,
32728					writable: true,
32729					value: value
32730				} );
32731			}
32732		} );
32733	},
32734
32735	fix: function( originalEvent ) {
32736		return originalEvent[ jQuery.expando ] ?
32737			originalEvent :
32738			new jQuery.Event( originalEvent );
32739	},
32740
32741	special: {
32742		load: {
32743
32744			// Prevent triggered image.load events from bubbling to window.load
32745			noBubble: true
32746		},
32747		click: {
32748
32749			// Utilize native event to ensure correct state for checkable inputs
32750			setup: function( data ) {
32751
32752				// For mutual compressibility with _default, replace `this` access with a local var.
32753				// `|| data` is dead code meant only to preserve the variable through minification.
32754				var el = this || data;
32755
32756				// Claim the first handler
32757				if ( rcheckableType.test( el.type ) &&
32758					el.click && nodeName( el, "input" ) ) {
32759
32760					// dataPriv.set( el, "click", ... )
32761					leverageNative( el, "click", true );
32762				}
32763
32764				// Return false to allow normal processing in the caller
32765				return false;
32766			},
32767			trigger: function( data ) {
32768
32769				// For mutual compressibility with _default, replace `this` access with a local var.
32770				// `|| data` is dead code meant only to preserve the variable through minification.
32771				var el = this || data;
32772
32773				// Force setup before triggering a click
32774				if ( rcheckableType.test( el.type ) &&
32775					el.click && nodeName( el, "input" ) ) {
32776
32777					leverageNative( el, "click" );
32778				}
32779
32780				// Return non-false to allow normal event-path propagation
32781				return true;
32782			},
32783
32784			// For cross-browser consistency, suppress native .click() on links
32785			// Also prevent it if we're currently inside a leveraged native-event stack
32786			_default: function( event ) {
32787				var target = event.target;
32788				return rcheckableType.test( target.type ) &&
32789					target.click && nodeName( target, "input" ) &&
32790					dataPriv.get( target, "click" ) ||
32791					nodeName( target, "a" );
32792			}
32793		},
32794
32795		beforeunload: {
32796			postDispatch: function( event ) {
32797
32798				// Support: Firefox 20+
32799				// Firefox doesn't alert if the returnValue field is not set.
32800				if ( event.result !== undefined && event.originalEvent ) {
32801					event.originalEvent.returnValue = event.result;
32802				}
32803			}
32804		}
32805	}
32806};
32807
32808// Ensure the presence of an event listener that handles manually-triggered
32809// synthetic events by interrupting progress until reinvoked in response to
32810// *native* events that it fires directly, ensuring that state changes have
32811// already occurred before other listeners are invoked.
32812function leverageNative( el, type, isSetup ) {
32813
32814	// Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add
32815	if ( !isSetup ) {
32816		if ( dataPriv.get( el, type ) === undefined ) {
32817			jQuery.event.add( el, type, returnTrue );
32818		}
32819		return;
32820	}
32821
32822	// Register the controller as a special universal handler for all event namespaces
32823	dataPriv.set( el, type, false );
32824	jQuery.event.add( el, type, {
32825		namespace: false,
32826		handler: function( event ) {
32827			var result,
32828				saved = dataPriv.get( this, type );
32829
32830			if ( ( event.isTrigger & 1 ) && this[ type ] ) {
32831
32832				// Interrupt processing of the outer synthetic .trigger()ed event
32833				if ( !saved ) {
32834
32835					// Store arguments for use when handling the inner native event
32836					// There will always be at least one argument (an event object), so this array
32837					// will not be confused with a leftover capture object.
32838					saved = slice.call( arguments );
32839					dataPriv.set( this, type, saved );
32840
32841					// Trigger the native event and capture its result
32842					this[ type ]();
32843					result = dataPriv.get( this, type );
32844					dataPriv.set( this, type, false );
32845
32846					if ( saved !== result ) {
32847
32848						// Cancel the outer synthetic event
32849						event.stopImmediatePropagation();
32850						event.preventDefault();
32851
32852						return result;
32853					}
32854
32855				// If this is an inner synthetic event for an event with a bubbling surrogate
32856				// (focus or blur), assume that the surrogate already propagated from triggering
32857				// the native event and prevent that from happening again here.
32858				// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
32859				// bubbling surrogate propagates *after* the non-bubbling base), but that seems
32860				// less bad than duplication.
32861				} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
32862					event.stopPropagation();
32863				}
32864
32865			// If this is a native event triggered above, everything is now in order
32866			// Fire an inner synthetic event with the original arguments
32867			} else if ( saved ) {
32868
32869				// ...and capture the result
32870				dataPriv.set( this, type, jQuery.event.trigger(
32871					saved[ 0 ],
32872					saved.slice( 1 ),
32873					this
32874				) );
32875
32876				// Abort handling of the native event by all jQuery handlers while allowing
32877				// native handlers on the same element to run. On target, this is achieved
32878				// by stopping immediate propagation just on the jQuery event. However,
32879				// the native event is re-wrapped by a jQuery one on each level of the
32880				// propagation so the only way to stop it for jQuery is to stop it for
32881				// everyone via native `stopPropagation()`. This is not a problem for
32882				// focus/blur which don't bubble, but it does also stop click on checkboxes
32883				// and radios. We accept this limitation.
32884				event.stopPropagation();
32885				event.isImmediatePropagationStopped = returnTrue;
32886			}
32887		}
32888	} );
32889}
32890
32891jQuery.removeEvent = function( elem, type, handle ) {
32892
32893	// This "if" is needed for plain objects
32894	if ( elem.removeEventListener ) {
32895		elem.removeEventListener( type, handle );
32896	}
32897};
32898
32899jQuery.Event = function( src, props ) {
32900
32901	// Allow instantiation without the 'new' keyword
32902	if ( !( this instanceof jQuery.Event ) ) {
32903		return new jQuery.Event( src, props );
32904	}
32905
32906	// Event object
32907	if ( src && src.type ) {
32908		this.originalEvent = src;
32909		this.type = src.type;
32910
32911		// Events bubbling up the document may have been marked as prevented
32912		// by a handler lower down the tree; reflect the correct value.
32913		this.isDefaultPrevented = src.defaultPrevented ||
32914				src.defaultPrevented === undefined &&
32915
32916				// Support: Android <=2.3 only
32917				src.returnValue === false ?
32918			returnTrue :
32919			returnFalse;
32920
32921		// Create target properties
32922		// Support: Safari <=6 - 7 only
32923		// Target should not be a text node (trac-504, trac-13143)
32924		this.target = ( src.target && src.target.nodeType === 3 ) ?
32925			src.target.parentNode :
32926			src.target;
32927
32928		this.currentTarget = src.currentTarget;
32929		this.relatedTarget = src.relatedTarget;
32930
32931	// Event type
32932	} else {
32933		this.type = src;
32934	}
32935
32936	// Put explicitly provided properties onto the event object
32937	if ( props ) {
32938		jQuery.extend( this, props );
32939	}
32940
32941	// Create a timestamp if incoming event doesn't have one
32942	this.timeStamp = src && src.timeStamp || Date.now();
32943
32944	// Mark it as fixed
32945	this[ jQuery.expando ] = true;
32946};
32947
32948// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
32949// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
32950jQuery.Event.prototype = {
32951	constructor: jQuery.Event,
32952	isDefaultPrevented: returnFalse,
32953	isPropagationStopped: returnFalse,
32954	isImmediatePropagationStopped: returnFalse,
32955	isSimulated: false,
32956
32957	preventDefault: function() {
32958		var e = this.originalEvent;
32959
32960		this.isDefaultPrevented = returnTrue;
32961
32962		if ( e && !this.isSimulated ) {
32963			e.preventDefault();
32964		}
32965	},
32966	stopPropagation: function() {
32967		var e = this.originalEvent;
32968
32969		this.isPropagationStopped = returnTrue;
32970
32971		if ( e && !this.isSimulated ) {
32972			e.stopPropagation();
32973		}
32974	},
32975	stopImmediatePropagation: function() {
32976		var e = this.originalEvent;
32977
32978		this.isImmediatePropagationStopped = returnTrue;
32979
32980		if ( e && !this.isSimulated ) {
32981			e.stopImmediatePropagation();
32982		}
32983
32984		this.stopPropagation();
32985	}
32986};
32987
32988// Includes all common event props including KeyEvent and MouseEvent specific props
32989jQuery.each( {
32990	altKey: true,
32991	bubbles: true,
32992	cancelable: true,
32993	changedTouches: true,
32994	ctrlKey: true,
32995	detail: true,
32996	eventPhase: true,
32997	metaKey: true,
32998	pageX: true,
32999	pageY: true,
33000	shiftKey: true,
33001	view: true,
33002	"char": true,
33003	code: true,
33004	charCode: true,
33005	key: true,
33006	keyCode: true,
33007	button: true,
33008	buttons: true,
33009	clientX: true,
33010	clientY: true,
33011	offsetX: true,
33012	offsetY: true,
33013	pointerId: true,
33014	pointerType: true,
33015	screenX: true,
33016	screenY: true,
33017	targetTouches: true,
33018	toElement: true,
33019	touches: true,
33020	which: true
33021}, jQuery.event.addProp );
33022
33023jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
33024
33025	function focusMappedHandler( nativeEvent ) {
33026		if ( document.documentMode ) {
33027
33028			// Support: IE 11+
33029			// Attach a single focusin/focusout handler on the document while someone wants
33030			// focus/blur. This is because the former are synchronous in IE while the latter
33031			// are async. In other browsers, all those handlers are invoked synchronously.
33032
33033			// `handle` from private data would already wrap the event, but we need
33034			// to change the `type` here.
33035			var handle = dataPriv.get( this, "handle" ),
33036				event = jQuery.event.fix( nativeEvent );
33037			event.type = nativeEvent.type === "focusin" ? "focus" : "blur";
33038			event.isSimulated = true;
33039
33040			// First, handle focusin/focusout
33041			handle( nativeEvent );
33042
33043			// ...then, handle focus/blur
33044			//
33045			// focus/blur don't bubble while focusin/focusout do; simulate the former by only
33046			// invoking the handler at the lower level.
33047			if ( event.target === event.currentTarget ) {
33048
33049				// The setup part calls `leverageNative`, which, in turn, calls
33050				// `jQuery.event.add`, so event handle will already have been set
33051				// by this point.
33052				handle( event );
33053			}
33054		} else {
33055
33056			// For non-IE browsers, attach a single capturing handler on the document
33057			// while someone wants focusin/focusout.
33058			jQuery.event.simulate( delegateType, nativeEvent.target,
33059				jQuery.event.fix( nativeEvent ) );
33060		}
33061	}
33062
33063	jQuery.event.special[ type ] = {
33064
33065		// Utilize native event if possible so blur/focus sequence is correct
33066		setup: function() {
33067
33068			var attaches;
33069
33070			// Claim the first handler
33071			// dataPriv.set( this, "focus", ... )
33072			// dataPriv.set( this, "blur", ... )
33073			leverageNative( this, type, true );
33074
33075			if ( document.documentMode ) {
33076
33077				// Support: IE 9 - 11+
33078				// We use the same native handler for focusin & focus (and focusout & blur)
33079				// so we need to coordinate setup & teardown parts between those events.
33080				// Use `delegateType` as the key as `type` is already used by `leverageNative`.
33081				attaches = dataPriv.get( this, delegateType );
33082				if ( !attaches ) {
33083					this.addEventListener( delegateType, focusMappedHandler );
33084				}
33085				dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 );
33086			} else {
33087
33088				// Return false to allow normal processing in the caller
33089				return false;
33090			}
33091		},
33092		trigger: function() {
33093
33094			// Force setup before trigger
33095			leverageNative( this, type );
33096
33097			// Return non-false to allow normal event-path propagation
33098			return true;
33099		},
33100
33101		teardown: function() {
33102			var attaches;
33103
33104			if ( document.documentMode ) {
33105				attaches = dataPriv.get( this, delegateType ) - 1;
33106				if ( !attaches ) {
33107					this.removeEventListener( delegateType, focusMappedHandler );
33108					dataPriv.remove( this, delegateType );
33109				} else {
33110					dataPriv.set( this, delegateType, attaches );
33111				}
33112			} else {
33113
33114				// Return false to indicate standard teardown should be applied
33115				return false;
33116			}
33117		},
33118
33119		// Suppress native focus or blur if we're currently inside
33120		// a leveraged native-event stack
33121		_default: function( event ) {
33122			return dataPriv.get( event.target, type );
33123		},
33124
33125		delegateType: delegateType
33126	};
33127
33128	// Support: Firefox <=44
33129	// Firefox doesn't have focus(in | out) events
33130	// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
33131	//
33132	// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
33133	// focus(in | out) events fire after focus & blur events,
33134	// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
33135	// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
33136	//
33137	// Support: IE 9 - 11+
33138	// To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch,
33139	// attach a single handler for both events in IE.
33140	jQuery.event.special[ delegateType ] = {
33141		setup: function() {
33142
33143			// Handle: regular nodes (via `this.ownerDocument`), window
33144			// (via `this.document`) & document (via `this`).
33145			var doc = this.ownerDocument || this.document || this,
33146				dataHolder = document.documentMode ? this : doc,
33147				attaches = dataPriv.get( dataHolder, delegateType );
33148
33149			// Support: IE 9 - 11+
33150			// We use the same native handler for focusin & focus (and focusout & blur)
33151			// so we need to coordinate setup & teardown parts between those events.
33152			// Use `delegateType` as the key as `type` is already used by `leverageNative`.
33153			if ( !attaches ) {
33154				if ( document.documentMode ) {
33155					this.addEventListener( delegateType, focusMappedHandler );
33156				} else {
33157					doc.addEventListener( type, focusMappedHandler, true );
33158				}
33159			}
33160			dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 );
33161		},
33162		teardown: function() {
33163			var doc = this.ownerDocument || this.document || this,
33164				dataHolder = document.documentMode ? this : doc,
33165				attaches = dataPriv.get( dataHolder, delegateType ) - 1;
33166
33167			if ( !attaches ) {
33168				if ( document.documentMode ) {
33169					this.removeEventListener( delegateType, focusMappedHandler );
33170				} else {
33171					doc.removeEventListener( type, focusMappedHandler, true );
33172				}
33173				dataPriv.remove( dataHolder, delegateType );
33174			} else {
33175				dataPriv.set( dataHolder, delegateType, attaches );
33176			}
33177		}
33178	};
33179} );
33180
33181// Create mouseenter/leave events using mouseover/out and event-time checks
33182// so that event delegation works in jQuery.
33183// Do the same for pointerenter/pointerleave and pointerover/pointerout
33184//
33185// Support: Safari 7 only
33186// Safari sends mouseenter too often; see:
33187// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
33188// for the description of the bug (it existed in older Chrome versions as well).
33189jQuery.each( {
33190	mouseenter: "mouseover",
33191	mouseleave: "mouseout",
33192	pointerenter: "pointerover",
33193	pointerleave: "pointerout"
33194}, function( orig, fix ) {
33195	jQuery.event.special[ orig ] = {
33196		delegateType: fix,
33197		bindType: fix,
33198
33199		handle: function( event ) {
33200			var ret,
33201				target = this,
33202				related = event.relatedTarget,
33203				handleObj = event.handleObj;
33204
33205			// For mouseenter/leave call the handler if related is outside the target.
33206			// NB: No relatedTarget if the mouse left/entered the browser window
33207			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
33208				event.type = handleObj.origType;
33209				ret = handleObj.handler.apply( this, arguments );
33210				event.type = fix;
33211			}
33212			return ret;
33213		}
33214	};
33215} );
33216
33217jQuery.fn.extend( {
33218
33219	on: function( types, selector, data, fn ) {
33220		return on( this, types, selector, data, fn );
33221	},
33222	one: function( types, selector, data, fn ) {
33223		return on( this, types, selector, data, fn, 1 );
33224	},
33225	off: function( types, selector, fn ) {
33226		var handleObj, type;
33227		if ( types && types.preventDefault && types.handleObj ) {
33228
33229			// ( event )  dispatched jQuery.Event
33230			handleObj = types.handleObj;
33231			jQuery( types.delegateTarget ).off(
33232				handleObj.namespace ?
33233					handleObj.origType + "." + handleObj.namespace :
33234					handleObj.origType,
33235				handleObj.selector,
33236				handleObj.handler
33237			);
33238			return this;
33239		}
33240		if ( typeof types === "object" ) {
33241
33242			// ( types-object [, selector] )
33243			for ( type in types ) {
33244				this.off( type, selector, types[ type ] );
33245			}
33246			return this;
33247		}
33248		if ( selector === false || typeof selector === "function" ) {
33249
33250			// ( types [, fn] )
33251			fn = selector;
33252			selector = undefined;
33253		}
33254		if ( fn === false ) {
33255			fn = returnFalse;
33256		}
33257		return this.each( function() {
33258			jQuery.event.remove( this, types, fn, selector );
33259		} );
33260	}
33261} );
33262
33263
33264var
33265
33266	// Support: IE <=10 - 11, Edge 12 - 13 only
33267	// In IE/Edge using regex groups here causes severe slowdowns.
33268	// See https://connect.microsoft.com/IE/feedback/details/1736512/
33269	rnoInnerhtml = /<script|<style|<link/i,
33270
33271	// checked="checked" or checked
33272	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
33273
33274	rcleanScript = /^\s*<!\[CDATA\[|\]\]>\s*$/g;
33275
33276// Prefer a tbody over its parent table for containing new rows
33277function manipulationTarget( elem, content ) {
33278	if ( nodeName( elem, "table" ) &&
33279		nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
33280
33281		return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
33282	}
33283
33284	return elem;
33285}
33286
33287// Replace/restore the type attribute of script elements for safe DOM manipulation
33288function disableScript( elem ) {
33289	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
33290	return elem;
33291}
33292function restoreScript( elem ) {
33293	if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
33294		elem.type = elem.type.slice( 5 );
33295	} else {
33296		elem.removeAttribute( "type" );
33297	}
33298
33299	return elem;
33300}
33301
33302function cloneCopyEvent( src, dest ) {
33303	var i, l, type, pdataOld, udataOld, udataCur, events;
33304
33305	if ( dest.nodeType !== 1 ) {
33306		return;
33307	}
33308
33309	// 1. Copy private data: events, handlers, etc.
33310	if ( dataPriv.hasData( src ) ) {
33311		pdataOld = dataPriv.get( src );
33312		events = pdataOld.events;
33313
33314		if ( events ) {
33315			dataPriv.remove( dest, "handle events" );
33316
33317			for ( type in events ) {
33318				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
33319					jQuery.event.add( dest, type, events[ type ][ i ] );
33320				}
33321			}
33322		}
33323	}
33324
33325	// 2. Copy user data
33326	if ( dataUser.hasData( src ) ) {
33327		udataOld = dataUser.access( src );
33328		udataCur = jQuery.extend( {}, udataOld );
33329
33330		dataUser.set( dest, udataCur );
33331	}
33332}
33333
33334// Fix IE bugs, see support tests
33335function fixInput( src, dest ) {
33336	var nodeName = dest.nodeName.toLowerCase();
33337
33338	// Fails to persist the checked state of a cloned checkbox or radio button.
33339	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
33340		dest.checked = src.checked;
33341
33342	// Fails to return the selected option to the default selected state when cloning options
33343	} else if ( nodeName === "input" || nodeName === "textarea" ) {
33344		dest.defaultValue = src.defaultValue;
33345	}
33346}
33347
33348function domManip( collection, args, callback, ignored ) {
33349
33350	// Flatten any nested arrays
33351	args = flat( args );
33352
33353	var fragment, first, scripts, hasScripts, node, doc,
33354		i = 0,
33355		l = collection.length,
33356		iNoClone = l - 1,
33357		value = args[ 0 ],
33358		valueIsFunction = isFunction( value );
33359
33360	// We can't cloneNode fragments that contain checked, in WebKit
33361	if ( valueIsFunction ||
33362			( l > 1 && typeof value === "string" &&
33363				!support.checkClone && rchecked.test( value ) ) ) {
33364		return collection.each( function( index ) {
33365			var self = collection.eq( index );
33366			if ( valueIsFunction ) {
33367				args[ 0 ] = value.call( this, index, self.html() );
33368			}
33369			domManip( self, args, callback, ignored );
33370		} );
33371	}
33372
33373	if ( l ) {
33374		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
33375		first = fragment.firstChild;
33376
33377		if ( fragment.childNodes.length === 1 ) {
33378			fragment = first;
33379		}
33380
33381		// Require either new content or an interest in ignored elements to invoke the callback
33382		if ( first || ignored ) {
33383			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
33384			hasScripts = scripts.length;
33385
33386			// Use the original fragment for the last item
33387			// instead of the first because it can end up
33388			// being emptied incorrectly in certain situations (trac-8070).
33389			for ( ; i < l; i++ ) {
33390				node = fragment;
33391
33392				if ( i !== iNoClone ) {
33393					node = jQuery.clone( node, true, true );
33394
33395					// Keep references to cloned scripts for later restoration
33396					if ( hasScripts ) {
33397
33398						// Support: Android <=4.0 only, PhantomJS 1 only
33399						// push.apply(_, arraylike) throws on ancient WebKit
33400						jQuery.merge( scripts, getAll( node, "script" ) );
33401					}
33402				}
33403
33404				callback.call( collection[ i ], node, i );
33405			}
33406
33407			if ( hasScripts ) {
33408				doc = scripts[ scripts.length - 1 ].ownerDocument;
33409
33410				// Re-enable scripts
33411				jQuery.map( scripts, restoreScript );
33412
33413				// Evaluate executable scripts on first document insertion
33414				for ( i = 0; i < hasScripts; i++ ) {
33415					node = scripts[ i ];
33416					if ( rscriptType.test( node.type || "" ) &&
33417						!dataPriv.access( node, "globalEval" ) &&
33418						jQuery.contains( doc, node ) ) {
33419
33420						if ( node.src && ( node.type || "" ).toLowerCase()  !== "module" ) {
33421
33422							// Optional AJAX dependency, but won't run scripts if not present
33423							if ( jQuery._evalUrl && !node.noModule ) {
33424								jQuery._evalUrl( node.src, {
33425									nonce: node.nonce || node.getAttribute( "nonce" )
33426								}, doc );
33427							}
33428						} else {
33429
33430							// Unwrap a CDATA section containing script contents. This shouldn't be
33431							// needed as in XML documents they're already not visible when
33432							// inspecting element contents and in HTML documents they have no
33433							// meaning but we're preserving that logic for backwards compatibility.
33434							// This will be removed completely in 4.0. See gh-4904.
33435							DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
33436						}
33437					}
33438				}
33439			}
33440		}
33441	}
33442
33443	return collection;
33444}
33445
33446function remove( elem, selector, keepData ) {
33447	var node,
33448		nodes = selector ? jQuery.filter( selector, elem ) : elem,
33449		i = 0;
33450
33451	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
33452		if ( !keepData && node.nodeType === 1 ) {
33453			jQuery.cleanData( getAll( node ) );
33454		}
33455
33456		if ( node.parentNode ) {
33457			if ( keepData && isAttached( node ) ) {
33458				setGlobalEval( getAll( node, "script" ) );
33459			}
33460			node.parentNode.removeChild( node );
33461		}
33462	}
33463
33464	return elem;
33465}
33466
33467jQuery.extend( {
33468	htmlPrefilter: function( html ) {
33469		return html;
33470	},
33471
33472	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
33473		var i, l, srcElements, destElements,
33474			clone = elem.cloneNode( true ),
33475			inPage = isAttached( elem );
33476
33477		// Fix IE cloning issues
33478		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
33479				!jQuery.isXMLDoc( elem ) ) {
33480
33481			// We eschew jQuery#find here for performance reasons:
33482			// https://jsperf.com/getall-vs-sizzle/2
33483			destElements = getAll( clone );
33484			srcElements = getAll( elem );
33485
33486			for ( i = 0, l = srcElements.length; i < l; i++ ) {
33487				fixInput( srcElements[ i ], destElements[ i ] );
33488			}
33489		}
33490
33491		// Copy the events from the original to the clone
33492		if ( dataAndEvents ) {
33493			if ( deepDataAndEvents ) {
33494				srcElements = srcElements || getAll( elem );
33495				destElements = destElements || getAll( clone );
33496
33497				for ( i = 0, l = srcElements.length; i < l; i++ ) {
33498					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
33499				}
33500			} else {
33501				cloneCopyEvent( elem, clone );
33502			}
33503		}
33504
33505		// Preserve script evaluation history
33506		destElements = getAll( clone, "script" );
33507		if ( destElements.length > 0 ) {
33508			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
33509		}
33510
33511		// Return the cloned set
33512		return clone;
33513	},
33514
33515	cleanData: function( elems ) {
33516		var data, elem, type,
33517			special = jQuery.event.special,
33518			i = 0;
33519
33520		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
33521			if ( acceptData( elem ) ) {
33522				if ( ( data = elem[ dataPriv.expando ] ) ) {
33523					if ( data.events ) {
33524						for ( type in data.events ) {
33525							if ( special[ type ] ) {
33526								jQuery.event.remove( elem, type );
33527
33528							// This is a shortcut to avoid jQuery.event.remove's overhead
33529							} else {
33530								jQuery.removeEvent( elem, type, data.handle );
33531							}
33532						}
33533					}
33534
33535					// Support: Chrome <=35 - 45+
33536					// Assign undefined instead of using delete, see Data#remove
33537					elem[ dataPriv.expando ] = undefined;
33538				}
33539				if ( elem[ dataUser.expando ] ) {
33540
33541					// Support: Chrome <=35 - 45+
33542					// Assign undefined instead of using delete, see Data#remove
33543					elem[ dataUser.expando ] = undefined;
33544				}
33545			}
33546		}
33547	}
33548} );
33549
33550jQuery.fn.extend( {
33551	detach: function( selector ) {
33552		return remove( this, selector, true );
33553	},
33554
33555	remove: function( selector ) {
33556		return remove( this, selector );
33557	},
33558
33559	text: function( value ) {
33560		return access( this, function( value ) {
33561			return value === undefined ?
33562				jQuery.text( this ) :
33563				this.empty().each( function() {
33564					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
33565						this.textContent = value;
33566					}
33567				} );
33568		}, null, value, arguments.length );
33569	},
33570
33571	append: function() {
33572		return domManip( this, arguments, function( elem ) {
33573			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
33574				var target = manipulationTarget( this, elem );
33575				target.appendChild( elem );
33576			}
33577		} );
33578	},
33579
33580	prepend: function() {
33581		return domManip( this, arguments, function( elem ) {
33582			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
33583				var target = manipulationTarget( this, elem );
33584				target.insertBefore( elem, target.firstChild );
33585			}
33586		} );
33587	},
33588
33589	before: function() {
33590		return domManip( this, arguments, function( elem ) {
33591			if ( this.parentNode ) {
33592				this.parentNode.insertBefore( elem, this );
33593			}
33594		} );
33595	},
33596
33597	after: function() {
33598		return domManip( this, arguments, function( elem ) {
33599			if ( this.parentNode ) {
33600				this.parentNode.insertBefore( elem, this.nextSibling );
33601			}
33602		} );
33603	},
33604
33605	empty: function() {
33606		var elem,
33607			i = 0;
33608
33609		for ( ; ( elem = this[ i ] ) != null; i++ ) {
33610			if ( elem.nodeType === 1 ) {
33611
33612				// Prevent memory leaks
33613				jQuery.cleanData( getAll( elem, false ) );
33614
33615				// Remove any remaining nodes
33616				elem.textContent = "";
33617			}
33618		}
33619
33620		return this;
33621	},
33622
33623	clone: function( dataAndEvents, deepDataAndEvents ) {
33624		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
33625		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
33626
33627		return this.map( function() {
33628			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
33629		} );
33630	},
33631
33632	html: function( value ) {
33633		return access( this, function( value ) {
33634			var elem = this[ 0 ] || {},
33635				i = 0,
33636				l = this.length;
33637
33638			if ( value === undefined && elem.nodeType === 1 ) {
33639				return elem.innerHTML;
33640			}
33641
33642			// See if we can take a shortcut and just use innerHTML
33643			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
33644				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
33645
33646				value = jQuery.htmlPrefilter( value );
33647
33648				try {
33649					for ( ; i < l; i++ ) {
33650						elem = this[ i ] || {};
33651
33652						// Remove element nodes and prevent memory leaks
33653						if ( elem.nodeType === 1 ) {
33654							jQuery.cleanData( getAll( elem, false ) );
33655							elem.innerHTML = value;
33656						}
33657					}
33658
33659					elem = 0;
33660
33661				// If using innerHTML throws an exception, use the fallback method
33662				} catch ( e ) {}
33663			}
33664
33665			if ( elem ) {
33666				this.empty().append( value );
33667			}
33668		}, null, value, arguments.length );
33669	},
33670
33671	replaceWith: function() {
33672		var ignored = [];
33673
33674		// Make the changes, replacing each non-ignored context element with the new content
33675		return domManip( this, arguments, function( elem ) {
33676			var parent = this.parentNode;
33677
33678			if ( jQuery.inArray( this, ignored ) < 0 ) {
33679				jQuery.cleanData( getAll( this ) );
33680				if ( parent ) {
33681					parent.replaceChild( elem, this );
33682				}
33683			}
33684
33685		// Force callback invocation
33686		}, ignored );
33687	}
33688} );
33689
33690jQuery.each( {
33691	appendTo: "append",
33692	prependTo: "prepend",
33693	insertBefore: "before",
33694	insertAfter: "after",
33695	replaceAll: "replaceWith"
33696}, function( name, original ) {
33697	jQuery.fn[ name ] = function( selector ) {
33698		var elems,
33699			ret = [],
33700			insert = jQuery( selector ),
33701			last = insert.length - 1,
33702			i = 0;
33703
33704		for ( ; i <= last; i++ ) {
33705			elems = i === last ? this : this.clone( true );
33706			jQuery( insert[ i ] )[ original ]( elems );
33707
33708			// Support: Android <=4.0 only, PhantomJS 1 only
33709			// .get() because push.apply(_, arraylike) throws on ancient WebKit
33710			push.apply( ret, elems.get() );
33711		}
33712
33713		return this.pushStack( ret );
33714	};
33715} );
33716var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
33717
33718var rcustomProp = /^--/;
33719
33720
33721var getStyles = function( elem ) {
33722
33723		// Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)
33724		// IE throws on elements created in popups
33725		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
33726		var view = elem.ownerDocument.defaultView;
33727
33728		if ( !view || !view.opener ) {
33729			view = window;
33730		}
33731
33732		return view.getComputedStyle( elem );
33733	};
33734
33735var swap = function( elem, options, callback ) {
33736	var ret, name,
33737		old = {};
33738
33739	// Remember the old values, and insert the new ones
33740	for ( name in options ) {
33741		old[ name ] = elem.style[ name ];
33742		elem.style[ name ] = options[ name ];
33743	}
33744
33745	ret = callback.call( elem );
33746
33747	// Revert the old values
33748	for ( name in options ) {
33749		elem.style[ name ] = old[ name ];
33750	}
33751
33752	return ret;
33753};
33754
33755
33756var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
33757
33758
33759
33760( function() {
33761
33762	// Executing both pixelPosition & boxSizingReliable tests require only one layout
33763	// so they're executed at the same time to save the second computation.
33764	function computeStyleTests() {
33765
33766		// This is a singleton, we need to execute it only once
33767		if ( !div ) {
33768			return;
33769		}
33770
33771		container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
33772			"margin-top:1px;padding:0;border:0";
33773		div.style.cssText =
33774			"position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
33775			"margin:auto;border:1px;padding:1px;" +
33776			"width:60%;top:1%";
33777		documentElement.appendChild( container ).appendChild( div );
33778
33779		var divStyle = window.getComputedStyle( div );
33780		pixelPositionVal = divStyle.top !== "1%";
33781
33782		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
33783		reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
33784
33785		// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
33786		// Some styles come back with percentage values, even though they shouldn't
33787		div.style.right = "60%";
33788		pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
33789
33790		// Support: IE 9 - 11 only
33791		// Detect misreporting of content dimensions for box-sizing:border-box elements
33792		boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
33793
33794		// Support: IE 9 only
33795		// Detect overflow:scroll screwiness (gh-3699)
33796		// Support: Chrome <=64
33797		// Don't get tricked when zoom affects offsetWidth (gh-4029)
33798		div.style.position = "absolute";
33799		scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
33800
33801		documentElement.removeChild( container );
33802
33803		// Nullify the div so it wouldn't be stored in the memory and
33804		// it will also be a sign that checks already performed
33805		div = null;
33806	}
33807
33808	function roundPixelMeasures( measure ) {
33809		return Math.round( parseFloat( measure ) );
33810	}
33811
33812	var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
33813		reliableTrDimensionsVal, reliableMarginLeftVal,
33814		container = document.createElement( "div" ),
33815		div = document.createElement( "div" );
33816
33817	// Finish early in limited (non-browser) environments
33818	if ( !div.style ) {
33819		return;
33820	}
33821
33822	// Support: IE <=9 - 11 only
33823	// Style of cloned element affects source element cloned (trac-8908)
33824	div.style.backgroundClip = "content-box";
33825	div.cloneNode( true ).style.backgroundClip = "";
33826	support.clearCloneStyle = div.style.backgroundClip === "content-box";
33827
33828	jQuery.extend( support, {
33829		boxSizingReliable: function() {
33830			computeStyleTests();
33831			return boxSizingReliableVal;
33832		},
33833		pixelBoxStyles: function() {
33834			computeStyleTests();
33835			return pixelBoxStylesVal;
33836		},
33837		pixelPosition: function() {
33838			computeStyleTests();
33839			return pixelPositionVal;
33840		},
33841		reliableMarginLeft: function() {
33842			computeStyleTests();
33843			return reliableMarginLeftVal;
33844		},
33845		scrollboxSize: function() {
33846			computeStyleTests();
33847			return scrollboxSizeVal;
33848		},
33849
33850		// Support: IE 9 - 11+, Edge 15 - 18+
33851		// IE/Edge misreport `getComputedStyle` of table rows with width/height
33852		// set in CSS while `offset*` properties report correct values.
33853		// Behavior in IE 9 is more subtle than in newer versions & it passes
33854		// some versions of this test; make sure not to make it pass there!
33855		//
33856		// Support: Firefox 70+
33857		// Only Firefox includes border widths
33858		// in computed dimensions. (gh-4529)
33859		reliableTrDimensions: function() {
33860			var table, tr, trChild, trStyle;
33861			if ( reliableTrDimensionsVal == null ) {
33862				table = document.createElement( "table" );
33863				tr = document.createElement( "tr" );
33864				trChild = document.createElement( "div" );
33865
33866				table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
33867				tr.style.cssText = "box-sizing:content-box;border:1px solid";
33868
33869				// Support: Chrome 86+
33870				// Height set through cssText does not get applied.
33871				// Computed height then comes back as 0.
33872				tr.style.height = "1px";
33873				trChild.style.height = "9px";
33874
33875				// Support: Android 8 Chrome 86+
33876				// In our bodyBackground.html iframe,
33877				// display for all div elements is set to "inline",
33878				// which causes a problem only in Android 8 Chrome 86.
33879				// Ensuring the div is `display: block`
33880				// gets around this issue.
33881				trChild.style.display = "block";
33882
33883				documentElement
33884					.appendChild( table )
33885					.appendChild( tr )
33886					.appendChild( trChild );
33887
33888				trStyle = window.getComputedStyle( tr );
33889				reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
33890					parseInt( trStyle.borderTopWidth, 10 ) +
33891					parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
33892
33893				documentElement.removeChild( table );
33894			}
33895			return reliableTrDimensionsVal;
33896		}
33897	} );
33898} )();
33899
33900
33901function curCSS( elem, name, computed ) {
33902	var width, minWidth, maxWidth, ret,
33903		isCustomProp = rcustomProp.test( name ),
33904
33905		// Support: Firefox 51+
33906		// Retrieving style before computed somehow
33907		// fixes an issue with getting wrong values
33908		// on detached elements
33909		style = elem.style;
33910
33911	computed = computed || getStyles( elem );
33912
33913	// getPropertyValue is needed for:
33914	//   .css('filter') (IE 9 only, trac-12537)
33915	//   .css('--customProperty) (gh-3144)
33916	if ( computed ) {
33917
33918		// Support: IE <=9 - 11+
33919		// IE only supports `"float"` in `getPropertyValue`; in computed styles
33920		// it's only available as `"cssFloat"`. We no longer modify properties
33921		// sent to `.css()` apart from camelCasing, so we need to check both.
33922		// Normally, this would create difference in behavior: if
33923		// `getPropertyValue` returns an empty string, the value returned
33924		// by `.css()` would be `undefined`. This is usually the case for
33925		// disconnected elements. However, in IE even disconnected elements
33926		// with no styles return `"none"` for `getPropertyValue( "float" )`
33927		ret = computed.getPropertyValue( name ) || computed[ name ];
33928
33929		if ( isCustomProp && ret ) {
33930
33931			// Support: Firefox 105+, Chrome <=105+
33932			// Spec requires trimming whitespace for custom properties (gh-4926).
33933			// Firefox only trims leading whitespace. Chrome just collapses
33934			// both leading & trailing whitespace to a single space.
33935			//
33936			// Fall back to `undefined` if empty string returned.
33937			// This collapses a missing definition with property defined
33938			// and set to an empty string but there's no standard API
33939			// allowing us to differentiate them without a performance penalty
33940			// and returning `undefined` aligns with older jQuery.
33941			//
33942			// rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED
33943			// as whitespace while CSS does not, but this is not a problem
33944			// because CSS preprocessing replaces them with U+000A LINE FEED
33945			// (which *is* CSS whitespace)
33946			// https://www.w3.org/TR/css-syntax-3/#input-preprocessing
33947			ret = ret.replace( rtrimCSS, "$1" ) || undefined;
33948		}
33949
33950		if ( ret === "" && !isAttached( elem ) ) {
33951			ret = jQuery.style( elem, name );
33952		}
33953
33954		// A tribute to the "awesome hack by Dean Edwards"
33955		// Android Browser returns percentage for some values,
33956		// but width seems to be reliably pixels.
33957		// This is against the CSSOM draft spec:
33958		// https://drafts.csswg.org/cssom/#resolved-values
33959		if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
33960
33961			// Remember the original values
33962			width = style.width;
33963			minWidth = style.minWidth;
33964			maxWidth = style.maxWidth;
33965
33966			// Put in the new values to get a computed value out
33967			style.minWidth = style.maxWidth = style.width = ret;
33968			ret = computed.width;
33969
33970			// Revert the changed values
33971			style.width = width;
33972			style.minWidth = minWidth;
33973			style.maxWidth = maxWidth;
33974		}
33975	}
33976
33977	return ret !== undefined ?
33978
33979		// Support: IE <=9 - 11 only
33980		// IE returns zIndex value as an integer.
33981		ret + "" :
33982		ret;
33983}
33984
33985
33986function addGetHookIf( conditionFn, hookFn ) {
33987
33988	// Define the hook, we'll check on the first run if it's really needed.
33989	return {
33990		get: function() {
33991			if ( conditionFn() ) {
33992
33993				// Hook not needed (or it's not possible to use it due
33994				// to missing dependency), remove it.
33995				delete this.get;
33996				return;
33997			}
33998
33999			// Hook needed; redefine it so that the support test is not executed again.
34000			return ( this.get = hookFn ).apply( this, arguments );
34001		}
34002	};
34003}
34004
34005
34006var cssPrefixes = [ "Webkit", "Moz", "ms" ],
34007	emptyStyle = document.createElement( "div" ).style,
34008	vendorProps = {};
34009
34010// Return a vendor-prefixed property or undefined
34011function vendorPropName( name ) {
34012
34013	// Check for vendor prefixed names
34014	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
34015		i = cssPrefixes.length;
34016
34017	while ( i-- ) {
34018		name = cssPrefixes[ i ] + capName;
34019		if ( name in emptyStyle ) {
34020			return name;
34021		}
34022	}
34023}
34024
34025// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
34026function finalPropName( name ) {
34027	var final = jQuery.cssProps[ name ] || vendorProps[ name ];
34028
34029	if ( final ) {
34030		return final;
34031	}
34032	if ( name in emptyStyle ) {
34033		return name;
34034	}
34035	return vendorProps[ name ] = vendorPropName( name ) || name;
34036}
34037
34038
34039var
34040
34041	// Swappable if display is none or starts with table
34042	// except "table", "table-cell", or "table-caption"
34043	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
34044	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
34045	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
34046	cssNormalTransform = {
34047		letterSpacing: "0",
34048		fontWeight: "400"
34049	};
34050
34051function setPositiveNumber( _elem, value, subtract ) {
34052
34053	// Any relative (+/-) values have already been
34054	// normalized at this point
34055	var matches = rcssNum.exec( value );
34056	return matches ?
34057
34058		// Guard against undefined "subtract", e.g., when used as in cssHooks
34059		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
34060		value;
34061}
34062
34063function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
34064	var i = dimension === "width" ? 1 : 0,
34065		extra = 0,
34066		delta = 0,
34067		marginDelta = 0;
34068
34069	// Adjustment may not be necessary
34070	if ( box === ( isBorderBox ? "border" : "content" ) ) {
34071		return 0;
34072	}
34073
34074	for ( ; i < 4; i += 2 ) {
34075
34076		// Both box models exclude margin
34077		// Count margin delta separately to only add it after scroll gutter adjustment.
34078		// This is needed to make negative margins work with `outerHeight( true )` (gh-3982).
34079		if ( box === "margin" ) {
34080			marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
34081		}
34082
34083		// If we get here with a content-box, we're seeking "padding" or "border" or "margin"
34084		if ( !isBorderBox ) {
34085
34086			// Add padding
34087			delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
34088
34089			// For "border" or "margin", add border
34090			if ( box !== "padding" ) {
34091				delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
34092
34093			// But still keep track of it otherwise
34094			} else {
34095				extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
34096			}
34097
34098		// If we get here with a border-box (content + padding + border), we're seeking "content" or
34099		// "padding" or "margin"
34100		} else {
34101
34102			// For "content", subtract padding
34103			if ( box === "content" ) {
34104				delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
34105			}
34106
34107			// For "content" or "padding", subtract border
34108			if ( box !== "margin" ) {
34109				delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
34110			}
34111		}
34112	}
34113
34114	// Account for positive content-box scroll gutter when requested by providing computedVal
34115	if ( !isBorderBox && computedVal >= 0 ) {
34116
34117		// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
34118		// Assuming integer scroll gutter, subtract the rest and round down
34119		delta += Math.max( 0, Math.ceil(
34120			elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
34121			computedVal -
34122			delta -
34123			extra -
34124			0.5
34125
34126		// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
34127		// Use an explicit zero to avoid NaN (gh-3964)
34128		) ) || 0;
34129	}
34130
34131	return delta + marginDelta;
34132}
34133
34134function getWidthOrHeight( elem, dimension, extra ) {
34135
34136	// Start with computed style
34137	var styles = getStyles( elem ),
34138
34139		// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
34140		// Fake content-box until we know it's needed to know the true value.
34141		boxSizingNeeded = !support.boxSizingReliable() || extra,
34142		isBorderBox = boxSizingNeeded &&
34143			jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
34144		valueIsBorderBox = isBorderBox,
34145
34146		val = curCSS( elem, dimension, styles ),
34147		offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
34148
34149	// Support: Firefox <=54
34150	// Return a confounding non-pixel value or feign ignorance, as appropriate.
34151	if ( rnumnonpx.test( val ) ) {
34152		if ( !extra ) {
34153			return val;
34154		}
34155		val = "auto";
34156	}
34157
34158
34159	// Support: IE 9 - 11 only
34160	// Use offsetWidth/offsetHeight for when box sizing is unreliable.
34161	// In those cases, the computed value can be trusted to be border-box.
34162	if ( ( !support.boxSizingReliable() && isBorderBox ||
34163
34164		// Support: IE 10 - 11+, Edge 15 - 18+
34165		// IE/Edge misreport `getComputedStyle` of table rows with width/height
34166		// set in CSS while `offset*` properties report correct values.
34167		// Interestingly, in some cases IE 9 doesn't suffer from this issue.
34168		!support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
34169
34170		// Fall back to offsetWidth/offsetHeight when value is "auto"
34171		// This happens for inline elements with no explicit setting (gh-3571)
34172		val === "auto" ||
34173
34174		// Support: Android <=4.1 - 4.3 only
34175		// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
34176		!parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
34177
34178		// Make sure the element is visible & connected
34179		elem.getClientRects().length ) {
34180
34181		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
34182
34183		// Where available, offsetWidth/offsetHeight approximate border box dimensions.
34184		// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
34185		// retrieved value as a content box dimension.
34186		valueIsBorderBox = offsetProp in elem;
34187		if ( valueIsBorderBox ) {
34188			val = elem[ offsetProp ];
34189		}
34190	}
34191
34192	// Normalize "" and auto
34193	val = parseFloat( val ) || 0;
34194
34195	// Adjust for the element's box model
34196	return ( val +
34197		boxModelAdjustment(
34198			elem,
34199			dimension,
34200			extra || ( isBorderBox ? "border" : "content" ),
34201			valueIsBorderBox,
34202			styles,
34203
34204			// Provide the current computed size to request scroll gutter calculation (gh-3589)
34205			val
34206		)
34207	) + "px";
34208}
34209
34210jQuery.extend( {
34211
34212	// Add in style property hooks for overriding the default
34213	// behavior of getting and setting a style property
34214	cssHooks: {
34215		opacity: {
34216			get: function( elem, computed ) {
34217				if ( computed ) {
34218
34219					// We should always get a number back from opacity
34220					var ret = curCSS( elem, "opacity" );
34221					return ret === "" ? "1" : ret;
34222				}
34223			}
34224		}
34225	},
34226
34227	// Don't automatically add "px" to these possibly-unitless properties
34228	cssNumber: {
34229		animationIterationCount: true,
34230		aspectRatio: true,
34231		borderImageSlice: true,
34232		columnCount: true,
34233		flexGrow: true,
34234		flexShrink: true,
34235		fontWeight: true,
34236		gridArea: true,
34237		gridColumn: true,
34238		gridColumnEnd: true,
34239		gridColumnStart: true,
34240		gridRow: true,
34241		gridRowEnd: true,
34242		gridRowStart: true,
34243		lineHeight: true,
34244		opacity: true,
34245		order: true,
34246		orphans: true,
34247		scale: true,
34248		widows: true,
34249		zIndex: true,
34250		zoom: true,
34251
34252		// SVG-related
34253		fillOpacity: true,
34254		floodOpacity: true,
34255		stopOpacity: true,
34256		strokeMiterlimit: true,
34257		strokeOpacity: true
34258	},
34259
34260	// Add in properties whose names you wish to fix before
34261	// setting or getting the value
34262	cssProps: {},
34263
34264	// Get and set the style property on a DOM Node
34265	style: function( elem, name, value, extra ) {
34266
34267		// Don't set styles on text and comment nodes
34268		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
34269			return;
34270		}
34271
34272		// Make sure that we're working with the right name
34273		var ret, type, hooks,
34274			origName = camelCase( name ),
34275			isCustomProp = rcustomProp.test( name ),
34276			style = elem.style;
34277
34278		// Make sure that we're working with the right name. We don't
34279		// want to query the value if it is a CSS custom property
34280		// since they are user-defined.
34281		if ( !isCustomProp ) {
34282			name = finalPropName( origName );
34283		}
34284
34285		// Gets hook for the prefixed version, then unprefixed version
34286		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
34287
34288		// Check if we're setting a value
34289		if ( value !== undefined ) {
34290			type = typeof value;
34291
34292			// Convert "+=" or "-=" to relative numbers (trac-7345)
34293			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
34294				value = adjustCSS( elem, name, ret );
34295
34296				// Fixes bug trac-9237
34297				type = "number";
34298			}
34299
34300			// Make sure that null and NaN values aren't set (trac-7116)
34301			if ( value == null || value !== value ) {
34302				return;
34303			}
34304
34305			// If a number was passed in, add the unit (except for certain CSS properties)
34306			// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
34307			// "px" to a few hardcoded values.
34308			if ( type === "number" && !isCustomProp ) {
34309				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
34310			}
34311
34312			// background-* props affect original clone's values
34313			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
34314				style[ name ] = "inherit";
34315			}
34316
34317			// If a hook was provided, use that value, otherwise just set the specified value
34318			if ( !hooks || !( "set" in hooks ) ||
34319				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
34320
34321				if ( isCustomProp ) {
34322					style.setProperty( name, value );
34323				} else {
34324					style[ name ] = value;
34325				}
34326			}
34327
34328		} else {
34329
34330			// If a hook was provided get the non-computed value from there
34331			if ( hooks && "get" in hooks &&
34332				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
34333
34334				return ret;
34335			}
34336
34337			// Otherwise just get the value from the style object
34338			return style[ name ];
34339		}
34340	},
34341
34342	css: function( elem, name, extra, styles ) {
34343		var val, num, hooks,
34344			origName = camelCase( name ),
34345			isCustomProp = rcustomProp.test( name );
34346
34347		// Make sure that we're working with the right name. We don't
34348		// want to modify the value if it is a CSS custom property
34349		// since they are user-defined.
34350		if ( !isCustomProp ) {
34351			name = finalPropName( origName );
34352		}
34353
34354		// Try prefixed name followed by the unprefixed name
34355		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
34356
34357		// If a hook was provided get the computed value from there
34358		if ( hooks && "get" in hooks ) {
34359			val = hooks.get( elem, true, extra );
34360		}
34361
34362		// Otherwise, if a way to get the computed value exists, use that
34363		if ( val === undefined ) {
34364			val = curCSS( elem, name, styles );
34365		}
34366
34367		// Convert "normal" to computed value
34368		if ( val === "normal" && name in cssNormalTransform ) {
34369			val = cssNormalTransform[ name ];
34370		}
34371
34372		// Make numeric if forced or a qualifier was provided and val looks numeric
34373		if ( extra === "" || extra ) {
34374			num = parseFloat( val );
34375			return extra === true || isFinite( num ) ? num || 0 : val;
34376		}
34377
34378		return val;
34379	}
34380} );
34381
34382jQuery.each( [ "height", "width" ], function( _i, dimension ) {
34383	jQuery.cssHooks[ dimension ] = {
34384		get: function( elem, computed, extra ) {
34385			if ( computed ) {
34386
34387				// Certain elements can have dimension info if we invisibly show them
34388				// but it must have a current display style that would benefit
34389				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
34390
34391					// Support: Safari 8+
34392					// Table columns in Safari have non-zero offsetWidth & zero
34393					// getBoundingClientRect().width unless display is changed.
34394					// Support: IE <=11 only
34395					// Running getBoundingClientRect on a disconnected node
34396					// in IE throws an error.
34397					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
34398					swap( elem, cssShow, function() {
34399						return getWidthOrHeight( elem, dimension, extra );
34400					} ) :
34401					getWidthOrHeight( elem, dimension, extra );
34402			}
34403		},
34404
34405		set: function( elem, value, extra ) {
34406			var matches,
34407				styles = getStyles( elem ),
34408
34409				// Only read styles.position if the test has a chance to fail
34410				// to avoid forcing a reflow.
34411				scrollboxSizeBuggy = !support.scrollboxSize() &&
34412					styles.position === "absolute",
34413
34414				// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
34415				boxSizingNeeded = scrollboxSizeBuggy || extra,
34416				isBorderBox = boxSizingNeeded &&
34417					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
34418				subtract = extra ?
34419					boxModelAdjustment(
34420						elem,
34421						dimension,
34422						extra,
34423						isBorderBox,
34424						styles
34425					) :
34426					0;
34427
34428			// Account for unreliable border-box dimensions by comparing offset* to computed and
34429			// faking a content-box to get border and padding (gh-3699)
34430			if ( isBorderBox && scrollboxSizeBuggy ) {
34431				subtract -= Math.ceil(
34432					elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
34433					parseFloat( styles[ dimension ] ) -
34434					boxModelAdjustment( elem, dimension, "border", false, styles ) -
34435					0.5
34436				);
34437			}
34438
34439			// Convert to pixels if value adjustment is needed
34440			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
34441				( matches[ 3 ] || "px" ) !== "px" ) {
34442
34443				elem.style[ dimension ] = value;
34444				value = jQuery.css( elem, dimension );
34445			}
34446
34447			return setPositiveNumber( elem, value, subtract );
34448		}
34449	};
34450} );
34451
34452jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
34453	function( elem, computed ) {
34454		if ( computed ) {
34455			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
34456				elem.getBoundingClientRect().left -
34457					swap( elem, { marginLeft: 0 }, function() {
34458						return elem.getBoundingClientRect().left;
34459					} )
34460			) + "px";
34461		}
34462	}
34463);
34464
34465// These hooks are used by animate to expand properties
34466jQuery.each( {
34467	margin: "",
34468	padding: "",
34469	border: "Width"
34470}, function( prefix, suffix ) {
34471	jQuery.cssHooks[ prefix + suffix ] = {
34472		expand: function( value ) {
34473			var i = 0,
34474				expanded = {},
34475
34476				// Assumes a single number if not a string
34477				parts = typeof value === "string" ? value.split( " " ) : [ value ];
34478
34479			for ( ; i < 4; i++ ) {
34480				expanded[ prefix + cssExpand[ i ] + suffix ] =
34481					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
34482			}
34483
34484			return expanded;
34485		}
34486	};
34487
34488	if ( prefix !== "margin" ) {
34489		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
34490	}
34491} );
34492
34493jQuery.fn.extend( {
34494	css: function( name, value ) {
34495		return access( this, function( elem, name, value ) {
34496			var styles, len,
34497				map = {},
34498				i = 0;
34499
34500			if ( Array.isArray( name ) ) {
34501				styles = getStyles( elem );
34502				len = name.length;
34503
34504				for ( ; i < len; i++ ) {
34505					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
34506				}
34507
34508				return map;
34509			}
34510
34511			return value !== undefined ?
34512				jQuery.style( elem, name, value ) :
34513				jQuery.css( elem, name );
34514		}, name, value, arguments.length > 1 );
34515	}
34516} );
34517
34518
34519function Tween( elem, options, prop, end, easing ) {
34520	return new Tween.prototype.init( elem, options, prop, end, easing );
34521}
34522jQuery.Tween = Tween;
34523
34524Tween.prototype = {
34525	constructor: Tween,
34526	init: function( elem, options, prop, end, easing, unit ) {
34527		this.elem = elem;
34528		this.prop = prop;
34529		this.easing = easing || jQuery.easing._default;
34530		this.options = options;
34531		this.start = this.now = this.cur();
34532		this.end = end;
34533		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
34534	},
34535	cur: function() {
34536		var hooks = Tween.propHooks[ this.prop ];
34537
34538		return hooks && hooks.get ?
34539			hooks.get( this ) :
34540			Tween.propHooks._default.get( this );
34541	},
34542	run: function( percent ) {
34543		var eased,
34544			hooks = Tween.propHooks[ this.prop ];
34545
34546		if ( this.options.duration ) {
34547			this.pos = eased = jQuery.easing[ this.easing ](
34548				percent, this.options.duration * percent, 0, 1, this.options.duration
34549			);
34550		} else {
34551			this.pos = eased = percent;
34552		}
34553		this.now = ( this.end - this.start ) * eased + this.start;
34554
34555		if ( this.options.step ) {
34556			this.options.step.call( this.elem, this.now, this );
34557		}
34558
34559		if ( hooks && hooks.set ) {
34560			hooks.set( this );
34561		} else {
34562			Tween.propHooks._default.set( this );
34563		}
34564		return this;
34565	}
34566};
34567
34568Tween.prototype.init.prototype = Tween.prototype;
34569
34570Tween.propHooks = {
34571	_default: {
34572		get: function( tween ) {
34573			var result;
34574
34575			// Use a property on the element directly when it is not a DOM element,
34576			// or when there is no matching style property that exists.
34577			if ( tween.elem.nodeType !== 1 ||
34578				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
34579				return tween.elem[ tween.prop ];
34580			}
34581
34582			// Passing an empty string as a 3rd parameter to .css will automatically
34583			// attempt a parseFloat and fallback to a string if the parse fails.
34584			// Simple values such as "10px" are parsed to Float;
34585			// complex values such as "rotate(1rad)" are returned as-is.
34586			result = jQuery.css( tween.elem, tween.prop, "" );
34587
34588			// Empty strings, null, undefined and "auto" are converted to 0.
34589			return !result || result === "auto" ? 0 : result;
34590		},
34591		set: function( tween ) {
34592
34593			// Use step hook for back compat.
34594			// Use cssHook if its there.
34595			// Use .style if available and use plain properties where available.
34596			if ( jQuery.fx.step[ tween.prop ] ) {
34597				jQuery.fx.step[ tween.prop ]( tween );
34598			} else if ( tween.elem.nodeType === 1 && (
34599				jQuery.cssHooks[ tween.prop ] ||
34600					tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
34601				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
34602			} else {
34603				tween.elem[ tween.prop ] = tween.now;
34604			}
34605		}
34606	}
34607};
34608
34609// Support: IE <=9 only
34610// Panic based approach to setting things on disconnected nodes
34611Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
34612	set: function( tween ) {
34613		if ( tween.elem.nodeType && tween.elem.parentNode ) {
34614			tween.elem[ tween.prop ] = tween.now;
34615		}
34616	}
34617};
34618
34619jQuery.easing = {
34620	linear: function( p ) {
34621		return p;
34622	},
34623	swing: function( p ) {
34624		return 0.5 - Math.cos( p * Math.PI ) / 2;
34625	},
34626	_default: "swing"
34627};
34628
34629jQuery.fx = Tween.prototype.init;
34630
34631// Back compat <1.8 extension point
34632jQuery.fx.step = {};
34633
34634
34635
34636
34637var
34638	fxNow, inProgress,
34639	rfxtypes = /^(?:toggle|show|hide)$/,
34640	rrun = /queueHooks$/;
34641
34642function schedule() {
34643	if ( inProgress ) {
34644		if ( document.hidden === false && window.requestAnimationFrame ) {
34645			window.requestAnimationFrame( schedule );
34646		} else {
34647			window.setTimeout( schedule, jQuery.fx.interval );
34648		}
34649
34650		jQuery.fx.tick();
34651	}
34652}
34653
34654// Animations created synchronously will run synchronously
34655function createFxNow() {
34656	window.setTimeout( function() {
34657		fxNow = undefined;
34658	} );
34659	return ( fxNow = Date.now() );
34660}
34661
34662// Generate parameters to create a standard animation
34663function genFx( type, includeWidth ) {
34664	var which,
34665		i = 0,
34666		attrs = { height: type };
34667
34668	// If we include width, step value is 1 to do all cssExpand values,
34669	// otherwise step value is 2 to skip over Left and Right
34670	includeWidth = includeWidth ? 1 : 0;
34671	for ( ; i < 4; i += 2 - includeWidth ) {
34672		which = cssExpand[ i ];
34673		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
34674	}
34675
34676	if ( includeWidth ) {
34677		attrs.opacity = attrs.width = type;
34678	}
34679
34680	return attrs;
34681}
34682
34683function createTween( value, prop, animation ) {
34684	var tween,
34685		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
34686		index = 0,
34687		length = collection.length;
34688	for ( ; index < length; index++ ) {
34689		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
34690
34691			// We're done with this property
34692			return tween;
34693		}
34694	}
34695}
34696
34697function defaultPrefilter( elem, props, opts ) {
34698	var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
34699		isBox = "width" in props || "height" in props,
34700		anim = this,
34701		orig = {},
34702		style = elem.style,
34703		hidden = elem.nodeType && isHiddenWithinTree( elem ),
34704		dataShow = dataPriv.get( elem, "fxshow" );
34705
34706	// Queue-skipping animations hijack the fx hooks
34707	if ( !opts.queue ) {
34708		hooks = jQuery._queueHooks( elem, "fx" );
34709		if ( hooks.unqueued == null ) {
34710			hooks.unqueued = 0;
34711			oldfire = hooks.empty.fire;
34712			hooks.empty.fire = function() {
34713				if ( !hooks.unqueued ) {
34714					oldfire();
34715				}
34716			};
34717		}
34718		hooks.unqueued++;
34719
34720		anim.always( function() {
34721
34722			// Ensure the complete handler is called before this completes
34723			anim.always( function() {
34724				hooks.unqueued--;
34725				if ( !jQuery.queue( elem, "fx" ).length ) {
34726					hooks.empty.fire();
34727				}
34728			} );
34729		} );
34730	}
34731
34732	// Detect show/hide animations
34733	for ( prop in props ) {
34734		value = props[ prop ];
34735		if ( rfxtypes.test( value ) ) {
34736			delete props[ prop ];
34737			toggle = toggle || value === "toggle";
34738			if ( value === ( hidden ? "hide" : "show" ) ) {
34739
34740				// Pretend to be hidden if this is a "show" and
34741				// there is still data from a stopped show/hide
34742				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
34743					hidden = true;
34744
34745				// Ignore all other no-op show/hide data
34746				} else {
34747					continue;
34748				}
34749			}
34750			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
34751		}
34752	}
34753
34754	// Bail out if this is a no-op like .hide().hide()
34755	propTween = !jQuery.isEmptyObject( props );
34756	if ( !propTween && jQuery.isEmptyObject( orig ) ) {
34757		return;
34758	}
34759
34760	// Restrict "overflow" and "display" styles during box animations
34761	if ( isBox && elem.nodeType === 1 ) {
34762
34763		// Support: IE <=9 - 11, Edge 12 - 15
34764		// Record all 3 overflow attributes because IE does not infer the shorthand
34765		// from identically-valued overflowX and overflowY and Edge just mirrors
34766		// the overflowX value there.
34767		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
34768
34769		// Identify a display type, preferring old show/hide data over the CSS cascade
34770		restoreDisplay = dataShow && dataShow.display;
34771		if ( restoreDisplay == null ) {
34772			restoreDisplay = dataPriv.get( elem, "display" );
34773		}
34774		display = jQuery.css( elem, "display" );
34775		if ( display === "none" ) {
34776			if ( restoreDisplay ) {
34777				display = restoreDisplay;
34778			} else {
34779
34780				// Get nonempty value(s) by temporarily forcing visibility
34781				showHide( [ elem ], true );
34782				restoreDisplay = elem.style.display || restoreDisplay;
34783				display = jQuery.css( elem, "display" );
34784				showHide( [ elem ] );
34785			}
34786		}
34787
34788		// Animate inline elements as inline-block
34789		if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
34790			if ( jQuery.css( elem, "float" ) === "none" ) {
34791
34792				// Restore the original display value at the end of pure show/hide animations
34793				if ( !propTween ) {
34794					anim.done( function() {
34795						style.display = restoreDisplay;
34796					} );
34797					if ( restoreDisplay == null ) {
34798						display = style.display;
34799						restoreDisplay = display === "none" ? "" : display;
34800					}
34801				}
34802				style.display = "inline-block";
34803			}
34804		}
34805	}
34806
34807	if ( opts.overflow ) {
34808		style.overflow = "hidden";
34809		anim.always( function() {
34810			style.overflow = opts.overflow[ 0 ];
34811			style.overflowX = opts.overflow[ 1 ];
34812			style.overflowY = opts.overflow[ 2 ];
34813		} );
34814	}
34815
34816	// Implement show/hide animations
34817	propTween = false;
34818	for ( prop in orig ) {
34819
34820		// General show/hide setup for this element animation
34821		if ( !propTween ) {
34822			if ( dataShow ) {
34823				if ( "hidden" in dataShow ) {
34824					hidden = dataShow.hidden;
34825				}
34826			} else {
34827				dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
34828			}
34829
34830			// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
34831			if ( toggle ) {
34832				dataShow.hidden = !hidden;
34833			}
34834
34835			// Show elements before animating them
34836			if ( hidden ) {
34837				showHide( [ elem ], true );
34838			}
34839
34840			/* eslint-disable no-loop-func */
34841
34842			anim.done( function() {
34843
34844				/* eslint-enable no-loop-func */
34845
34846				// The final step of a "hide" animation is actually hiding the element
34847				if ( !hidden ) {
34848					showHide( [ elem ] );
34849				}
34850				dataPriv.remove( elem, "fxshow" );
34851				for ( prop in orig ) {
34852					jQuery.style( elem, prop, orig[ prop ] );
34853				}
34854			} );
34855		}
34856
34857		// Per-property setup
34858		propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
34859		if ( !( prop in dataShow ) ) {
34860			dataShow[ prop ] = propTween.start;
34861			if ( hidden ) {
34862				propTween.end = propTween.start;
34863				propTween.start = 0;
34864			}
34865		}
34866	}
34867}
34868
34869function propFilter( props, specialEasing ) {
34870	var index, name, easing, value, hooks;
34871
34872	// camelCase, specialEasing and expand cssHook pass
34873	for ( index in props ) {
34874		name = camelCase( index );
34875		easing = specialEasing[ name ];
34876		value = props[ index ];
34877		if ( Array.isArray( value ) ) {
34878			easing = value[ 1 ];
34879			value = props[ index ] = value[ 0 ];
34880		}
34881
34882		if ( index !== name ) {
34883			props[ name ] = value;
34884			delete props[ index ];
34885		}
34886
34887		hooks = jQuery.cssHooks[ name ];
34888		if ( hooks && "expand" in hooks ) {
34889			value = hooks.expand( value );
34890			delete props[ name ];
34891
34892			// Not quite $.extend, this won't overwrite existing keys.
34893			// Reusing 'index' because we have the correct "name"
34894			for ( index in value ) {
34895				if ( !( index in props ) ) {
34896					props[ index ] = value[ index ];
34897					specialEasing[ index ] = easing;
34898				}
34899			}
34900		} else {
34901			specialEasing[ name ] = easing;
34902		}
34903	}
34904}
34905
34906function Animation( elem, properties, options ) {
34907	var result,
34908		stopped,
34909		index = 0,
34910		length = Animation.prefilters.length,
34911		deferred = jQuery.Deferred().always( function() {
34912
34913			// Don't match elem in the :animated selector
34914			delete tick.elem;
34915		} ),
34916		tick = function() {
34917			if ( stopped ) {
34918				return false;
34919			}
34920			var currentTime = fxNow || createFxNow(),
34921				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
34922
34923				// Support: Android 2.3 only
34924				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)
34925				temp = remaining / animation.duration || 0,
34926				percent = 1 - temp,
34927				index = 0,
34928				length = animation.tweens.length;
34929
34930			for ( ; index < length; index++ ) {
34931				animation.tweens[ index ].run( percent );
34932			}
34933
34934			deferred.notifyWith( elem, [ animation, percent, remaining ] );
34935
34936			// If there's more to do, yield
34937			if ( percent < 1 && length ) {
34938				return remaining;
34939			}
34940
34941			// If this was an empty animation, synthesize a final progress notification
34942			if ( !length ) {
34943				deferred.notifyWith( elem, [ animation, 1, 0 ] );
34944			}
34945
34946			// Resolve the animation and report its conclusion
34947			deferred.resolveWith( elem, [ animation ] );
34948			return false;
34949		},
34950		animation = deferred.promise( {
34951			elem: elem,
34952			props: jQuery.extend( {}, properties ),
34953			opts: jQuery.extend( true, {
34954				specialEasing: {},
34955				easing: jQuery.easing._default
34956			}, options ),
34957			originalProperties: properties,
34958			originalOptions: options,
34959			startTime: fxNow || createFxNow(),
34960			duration: options.duration,
34961			tweens: [],
34962			createTween: function( prop, end ) {
34963				var tween = jQuery.Tween( elem, animation.opts, prop, end,
34964					animation.opts.specialEasing[ prop ] || animation.opts.easing );
34965				animation.tweens.push( tween );
34966				return tween;
34967			},
34968			stop: function( gotoEnd ) {
34969				var index = 0,
34970
34971					// If we are going to the end, we want to run all the tweens
34972					// otherwise we skip this part
34973					length = gotoEnd ? animation.tweens.length : 0;
34974				if ( stopped ) {
34975					return this;
34976				}
34977				stopped = true;
34978				for ( ; index < length; index++ ) {
34979					animation.tweens[ index ].run( 1 );
34980				}
34981
34982				// Resolve when we played the last frame; otherwise, reject
34983				if ( gotoEnd ) {
34984					deferred.notifyWith( elem, [ animation, 1, 0 ] );
34985					deferred.resolveWith( elem, [ animation, gotoEnd ] );
34986				} else {
34987					deferred.rejectWith( elem, [ animation, gotoEnd ] );
34988				}
34989				return this;
34990			}
34991		} ),
34992		props = animation.props;
34993
34994	propFilter( props, animation.opts.specialEasing );
34995
34996	for ( ; index < length; index++ ) {
34997		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
34998		if ( result ) {
34999			if ( isFunction( result.stop ) ) {
35000				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
35001					result.stop.bind( result );
35002			}
35003			return result;
35004		}
35005	}
35006
35007	jQuery.map( props, createTween, animation );
35008
35009	if ( isFunction( animation.opts.start ) ) {
35010		animation.opts.start.call( elem, animation );
35011	}
35012
35013	// Attach callbacks from options
35014	animation
35015		.progress( animation.opts.progress )
35016		.done( animation.opts.done, animation.opts.complete )
35017		.fail( animation.opts.fail )
35018		.always( animation.opts.always );
35019
35020	jQuery.fx.timer(
35021		jQuery.extend( tick, {
35022			elem: elem,
35023			anim: animation,
35024			queue: animation.opts.queue
35025		} )
35026	);
35027
35028	return animation;
35029}
35030
35031jQuery.Animation = jQuery.extend( Animation, {
35032
35033	tweeners: {
35034		"*": [ function( prop, value ) {
35035			var tween = this.createTween( prop, value );
35036			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
35037			return tween;
35038		} ]
35039	},
35040
35041	tweener: function( props, callback ) {
35042		if ( isFunction( props ) ) {
35043			callback = props;
35044			props = [ "*" ];
35045		} else {
35046			props = props.match( rnothtmlwhite );
35047		}
35048
35049		var prop,
35050			index = 0,
35051			length = props.length;
35052
35053		for ( ; index < length; index++ ) {
35054			prop = props[ index ];
35055			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
35056			Animation.tweeners[ prop ].unshift( callback );
35057		}
35058	},
35059
35060	prefilters: [ defaultPrefilter ],
35061
35062	prefilter: function( callback, prepend ) {
35063		if ( prepend ) {
35064			Animation.prefilters.unshift( callback );
35065		} else {
35066			Animation.prefilters.push( callback );
35067		}
35068	}
35069} );
35070
35071jQuery.speed = function( speed, easing, fn ) {
35072	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
35073		complete: fn || !fn && easing ||
35074			isFunction( speed ) && speed,
35075		duration: speed,
35076		easing: fn && easing || easing && !isFunction( easing ) && easing
35077	};
35078
35079	// Go to the end state if fx are off
35080	if ( jQuery.fx.off ) {
35081		opt.duration = 0;
35082
35083	} else {
35084		if ( typeof opt.duration !== "number" ) {
35085			if ( opt.duration in jQuery.fx.speeds ) {
35086				opt.duration = jQuery.fx.speeds[ opt.duration ];
35087
35088			} else {
35089				opt.duration = jQuery.fx.speeds._default;
35090			}
35091		}
35092	}
35093
35094	// Normalize opt.queue - true/undefined/null -> "fx"
35095	if ( opt.queue == null || opt.queue === true ) {
35096		opt.queue = "fx";
35097	}
35098
35099	// Queueing
35100	opt.old = opt.complete;
35101
35102	opt.complete = function() {
35103		if ( isFunction( opt.old ) ) {
35104			opt.old.call( this );
35105		}
35106
35107		if ( opt.queue ) {
35108			jQuery.dequeue( this, opt.queue );
35109		}
35110	};
35111
35112	return opt;
35113};
35114
35115jQuery.fn.extend( {
35116	fadeTo: function( speed, to, easing, callback ) {
35117
35118		// Show any hidden elements after setting opacity to 0
35119		return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
35120
35121			// Animate to the value specified
35122			.end().animate( { opacity: to }, speed, easing, callback );
35123	},
35124	animate: function( prop, speed, easing, callback ) {
35125		var empty = jQuery.isEmptyObject( prop ),
35126			optall = jQuery.speed( speed, easing, callback ),
35127			doAnimation = function() {
35128
35129				// Operate on a copy of prop so per-property easing won't be lost
35130				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
35131
35132				// Empty animations, or finishing resolves immediately
35133				if ( empty || dataPriv.get( this, "finish" ) ) {
35134					anim.stop( true );
35135				}
35136			};
35137
35138		doAnimation.finish = doAnimation;
35139
35140		return empty || optall.queue === false ?
35141			this.each( doAnimation ) :
35142			this.queue( optall.queue, doAnimation );
35143	},
35144	stop: function( type, clearQueue, gotoEnd ) {
35145		var stopQueue = function( hooks ) {
35146			var stop = hooks.stop;
35147			delete hooks.stop;
35148			stop( gotoEnd );
35149		};
35150
35151		if ( typeof type !== "string" ) {
35152			gotoEnd = clearQueue;
35153			clearQueue = type;
35154			type = undefined;
35155		}
35156		if ( clearQueue ) {
35157			this.queue( type || "fx", [] );
35158		}
35159
35160		return this.each( function() {
35161			var dequeue = true,
35162				index = type != null && type + "queueHooks",
35163				timers = jQuery.timers,
35164				data = dataPriv.get( this );
35165
35166			if ( index ) {
35167				if ( data[ index ] && data[ index ].stop ) {
35168					stopQueue( data[ index ] );
35169				}
35170			} else {
35171				for ( index in data ) {
35172					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
35173						stopQueue( data[ index ] );
35174					}
35175				}
35176			}
35177
35178			for ( index = timers.length; index--; ) {
35179				if ( timers[ index ].elem === this &&
35180					( type == null || timers[ index ].queue === type ) ) {
35181
35182					timers[ index ].anim.stop( gotoEnd );
35183					dequeue = false;
35184					timers.splice( index, 1 );
35185				}
35186			}
35187
35188			// Start the next in the queue if the last step wasn't forced.
35189			// Timers currently will call their complete callbacks, which
35190			// will dequeue but only if they were gotoEnd.
35191			if ( dequeue || !gotoEnd ) {
35192				jQuery.dequeue( this, type );
35193			}
35194		} );
35195	},
35196	finish: function( type ) {
35197		if ( type !== false ) {
35198			type = type || "fx";
35199		}
35200		return this.each( function() {
35201			var index,
35202				data = dataPriv.get( this ),
35203				queue = data[ type + "queue" ],
35204				hooks = data[ type + "queueHooks" ],
35205				timers = jQuery.timers,
35206				length = queue ? queue.length : 0;
35207
35208			// Enable finishing flag on private data
35209			data.finish = true;
35210
35211			// Empty the queue first
35212			jQuery.queue( this, type, [] );
35213
35214			if ( hooks && hooks.stop ) {
35215				hooks.stop.call( this, true );
35216			}
35217
35218			// Look for any active animations, and finish them
35219			for ( index = timers.length; index--; ) {
35220				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
35221					timers[ index ].anim.stop( true );
35222					timers.splice( index, 1 );
35223				}
35224			}
35225
35226			// Look for any animations in the old queue and finish them
35227			for ( index = 0; index < length; index++ ) {
35228				if ( queue[ index ] && queue[ index ].finish ) {
35229					queue[ index ].finish.call( this );
35230				}
35231			}
35232
35233			// Turn off finishing flag
35234			delete data.finish;
35235		} );
35236	}
35237} );
35238
35239jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
35240	var cssFn = jQuery.fn[ name ];
35241	jQuery.fn[ name ] = function( speed, easing, callback ) {
35242		return speed == null || typeof speed === "boolean" ?
35243			cssFn.apply( this, arguments ) :
35244			this.animate( genFx( name, true ), speed, easing, callback );
35245	};
35246} );
35247
35248// Generate shortcuts for custom animations
35249jQuery.each( {
35250	slideDown: genFx( "show" ),
35251	slideUp: genFx( "hide" ),
35252	slideToggle: genFx( "toggle" ),
35253	fadeIn: { opacity: "show" },
35254	fadeOut: { opacity: "hide" },
35255	fadeToggle: { opacity: "toggle" }
35256}, function( name, props ) {
35257	jQuery.fn[ name ] = function( speed, easing, callback ) {
35258		return this.animate( props, speed, easing, callback );
35259	};
35260} );
35261
35262jQuery.timers = [];
35263jQuery.fx.tick = function() {
35264	var timer,
35265		i = 0,
35266		timers = jQuery.timers;
35267
35268	fxNow = Date.now();
35269
35270	for ( ; i < timers.length; i++ ) {
35271		timer = timers[ i ];
35272
35273		// Run the timer and safely remove it when done (allowing for external removal)
35274		if ( !timer() && timers[ i ] === timer ) {
35275			timers.splice( i--, 1 );
35276		}
35277	}
35278
35279	if ( !timers.length ) {
35280		jQuery.fx.stop();
35281	}
35282	fxNow = undefined;
35283};
35284
35285jQuery.fx.timer = function( timer ) {
35286	jQuery.timers.push( timer );
35287	jQuery.fx.start();
35288};
35289
35290jQuery.fx.interval = 13;
35291jQuery.fx.start = function() {
35292	if ( inProgress ) {
35293		return;
35294	}
35295
35296	inProgress = true;
35297	schedule();
35298};
35299
35300jQuery.fx.stop = function() {
35301	inProgress = null;
35302};
35303
35304jQuery.fx.speeds = {
35305	slow: 600,
35306	fast: 200,
35307
35308	// Default speed
35309	_default: 400
35310};
35311
35312
35313// Based off of the plugin by Clint Helfers, with permission.
35314jQuery.fn.delay = function( time, type ) {
35315	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
35316	type = type || "fx";
35317
35318	return this.queue( type, function( next, hooks ) {
35319		var timeout = window.setTimeout( next, time );
35320		hooks.stop = function() {
35321			window.clearTimeout( timeout );
35322		};
35323	} );
35324};
35325
35326
35327( function() {
35328	var input = document.createElement( "input" ),
35329		select = document.createElement( "select" ),
35330		opt = select.appendChild( document.createElement( "option" ) );
35331
35332	input.type = "checkbox";
35333
35334	// Support: Android <=4.3 only
35335	// Default value for a checkbox should be "on"
35336	support.checkOn = input.value !== "";
35337
35338	// Support: IE <=11 only
35339	// Must access selectedIndex to make default options select
35340	support.optSelected = opt.selected;
35341
35342	// Support: IE <=11 only
35343	// An input loses its value after becoming a radio
35344	input = document.createElement( "input" );
35345	input.value = "t";
35346	input.type = "radio";
35347	support.radioValue = input.value === "t";
35348} )();
35349
35350
35351var boolHook,
35352	attrHandle = jQuery.expr.attrHandle;
35353
35354jQuery.fn.extend( {
35355	attr: function( name, value ) {
35356		return access( this, jQuery.attr, name, value, arguments.length > 1 );
35357	},
35358
35359	removeAttr: function( name ) {
35360		return this.each( function() {
35361			jQuery.removeAttr( this, name );
35362		} );
35363	}
35364} );
35365
35366jQuery.extend( {
35367	attr: function( elem, name, value ) {
35368		var ret, hooks,
35369			nType = elem.nodeType;
35370
35371		// Don't get/set attributes on text, comment and attribute nodes
35372		if ( nType === 3 || nType === 8 || nType === 2 ) {
35373			return;
35374		}
35375
35376		// Fallback to prop when attributes are not supported
35377		if ( typeof elem.getAttribute === "undefined" ) {
35378			return jQuery.prop( elem, name, value );
35379		}
35380
35381		// Attribute hooks are determined by the lowercase version
35382		// Grab necessary hook if one is defined
35383		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
35384			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
35385				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
35386		}
35387
35388		if ( value !== undefined ) {
35389			if ( value === null ) {
35390				jQuery.removeAttr( elem, name );
35391				return;
35392			}
35393
35394			if ( hooks && "set" in hooks &&
35395				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
35396				return ret;
35397			}
35398
35399			elem.setAttribute( name, value + "" );
35400			return value;
35401		}
35402
35403		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
35404			return ret;
35405		}
35406
35407		ret = jQuery.find.attr( elem, name );
35408
35409		// Non-existent attributes return null, we normalize to undefined
35410		return ret == null ? undefined : ret;
35411	},
35412
35413	attrHooks: {
35414		type: {
35415			set: function( elem, value ) {
35416				if ( !support.radioValue && value === "radio" &&
35417					nodeName( elem, "input" ) ) {
35418					var val = elem.value;
35419					elem.setAttribute( "type", value );
35420					if ( val ) {
35421						elem.value = val;
35422					}
35423					return value;
35424				}
35425			}
35426		}
35427	},
35428
35429	removeAttr: function( elem, value ) {
35430		var name,
35431			i = 0,
35432
35433			// Attribute names can contain non-HTML whitespace characters
35434			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
35435			attrNames = value && value.match( rnothtmlwhite );
35436
35437		if ( attrNames && elem.nodeType === 1 ) {
35438			while ( ( name = attrNames[ i++ ] ) ) {
35439				elem.removeAttribute( name );
35440			}
35441		}
35442	}
35443} );
35444
35445// Hooks for boolean attributes
35446boolHook = {
35447	set: function( elem, value, name ) {
35448		if ( value === false ) {
35449
35450			// Remove boolean attributes when set to false
35451			jQuery.removeAttr( elem, name );
35452		} else {
35453			elem.setAttribute( name, name );
35454		}
35455		return name;
35456	}
35457};
35458
35459jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
35460	var getter = attrHandle[ name ] || jQuery.find.attr;
35461
35462	attrHandle[ name ] = function( elem, name, isXML ) {
35463		var ret, handle,
35464			lowercaseName = name.toLowerCase();
35465
35466		if ( !isXML ) {
35467
35468			// Avoid an infinite loop by temporarily removing this function from the getter
35469			handle = attrHandle[ lowercaseName ];
35470			attrHandle[ lowercaseName ] = ret;
35471			ret = getter( elem, name, isXML ) != null ?
35472				lowercaseName :
35473				null;
35474			attrHandle[ lowercaseName ] = handle;
35475		}
35476		return ret;
35477	};
35478} );
35479
35480
35481
35482
35483var rfocusable = /^(?:input|select|textarea|button)$/i,
35484	rclickable = /^(?:a|area)$/i;
35485
35486jQuery.fn.extend( {
35487	prop: function( name, value ) {
35488		return access( this, jQuery.prop, name, value, arguments.length > 1 );
35489	},
35490
35491	removeProp: function( name ) {
35492		return this.each( function() {
35493			delete this[ jQuery.propFix[ name ] || name ];
35494		} );
35495	}
35496} );
35497
35498jQuery.extend( {
35499	prop: function( elem, name, value ) {
35500		var ret, hooks,
35501			nType = elem.nodeType;
35502
35503		// Don't get/set properties on text, comment and attribute nodes
35504		if ( nType === 3 || nType === 8 || nType === 2 ) {
35505			return;
35506		}
35507
35508		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
35509
35510			// Fix name and attach hooks
35511			name = jQuery.propFix[ name ] || name;
35512			hooks = jQuery.propHooks[ name ];
35513		}
35514
35515		if ( value !== undefined ) {
35516			if ( hooks && "set" in hooks &&
35517				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
35518				return ret;
35519			}
35520
35521			return ( elem[ name ] = value );
35522		}
35523
35524		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
35525			return ret;
35526		}
35527
35528		return elem[ name ];
35529	},
35530
35531	propHooks: {
35532		tabIndex: {
35533			get: function( elem ) {
35534
35535				// Support: IE <=9 - 11 only
35536				// elem.tabIndex doesn't always return the
35537				// correct value when it hasn't been explicitly set
35538				// Use proper attribute retrieval (trac-12072)
35539				var tabindex = jQuery.find.attr( elem, "tabindex" );
35540
35541				if ( tabindex ) {
35542					return parseInt( tabindex, 10 );
35543				}
35544
35545				if (
35546					rfocusable.test( elem.nodeName ) ||
35547					rclickable.test( elem.nodeName ) &&
35548					elem.href
35549				) {
35550					return 0;
35551				}
35552
35553				return -1;
35554			}
35555		}
35556	},
35557
35558	propFix: {
35559		"for": "htmlFor",
35560		"class": "className"
35561	}
35562} );
35563
35564// Support: IE <=11 only
35565// Accessing the selectedIndex property
35566// forces the browser to respect setting selected
35567// on the option
35568// The getter ensures a default option is selected
35569// when in an optgroup
35570// eslint rule "no-unused-expressions" is disabled for this code
35571// since it considers such accessions noop
35572if ( !support.optSelected ) {
35573	jQuery.propHooks.selected = {
35574		get: function( elem ) {
35575
35576			/* eslint no-unused-expressions: "off" */
35577
35578			var parent = elem.parentNode;
35579			if ( parent && parent.parentNode ) {
35580				parent.parentNode.selectedIndex;
35581			}
35582			return null;
35583		},
35584		set: function( elem ) {
35585
35586			/* eslint no-unused-expressions: "off" */
35587
35588			var parent = elem.parentNode;
35589			if ( parent ) {
35590				parent.selectedIndex;
35591
35592				if ( parent.parentNode ) {
35593					parent.parentNode.selectedIndex;
35594				}
35595			}
35596		}
35597	};
35598}
35599
35600jQuery.each( [
35601	"tabIndex",
35602	"readOnly",
35603	"maxLength",
35604	"cellSpacing",
35605	"cellPadding",
35606	"rowSpan",
35607	"colSpan",
35608	"useMap",
35609	"frameBorder",
35610	"contentEditable"
35611], function() {
35612	jQuery.propFix[ this.toLowerCase() ] = this;
35613} );
35614
35615
35616
35617
35618	// Strip and collapse whitespace according to HTML spec
35619	// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
35620	function stripAndCollapse( value ) {
35621		var tokens = value.match( rnothtmlwhite ) || [];
35622		return tokens.join( " " );
35623	}
35624
35625
35626function getClass( elem ) {
35627	return elem.getAttribute && elem.getAttribute( "class" ) || "";
35628}
35629
35630function classesToArray( value ) {
35631	if ( Array.isArray( value ) ) {
35632		return value;
35633	}
35634	if ( typeof value === "string" ) {
35635		return value.match( rnothtmlwhite ) || [];
35636	}
35637	return [];
35638}
35639
35640jQuery.fn.extend( {
35641	addClass: function( value ) {
35642		var classNames, cur, curValue, className, i, finalValue;
35643
35644		if ( isFunction( value ) ) {
35645			return this.each( function( j ) {
35646				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
35647			} );
35648		}
35649
35650		classNames = classesToArray( value );
35651
35652		if ( classNames.length ) {
35653			return this.each( function() {
35654				curValue = getClass( this );
35655				cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
35656
35657				if ( cur ) {
35658					for ( i = 0; i < classNames.length; i++ ) {
35659						className = classNames[ i ];
35660						if ( cur.indexOf( " " + className + " " ) < 0 ) {
35661							cur += className + " ";
35662						}
35663					}
35664
35665					// Only assign if different to avoid unneeded rendering.
35666					finalValue = stripAndCollapse( cur );
35667					if ( curValue !== finalValue ) {
35668						this.setAttribute( "class", finalValue );
35669					}
35670				}
35671			} );
35672		}
35673
35674		return this;
35675	},
35676
35677	removeClass: function( value ) {
35678		var classNames, cur, curValue, className, i, finalValue;
35679
35680		if ( isFunction( value ) ) {
35681			return this.each( function( j ) {
35682				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
35683			} );
35684		}
35685
35686		if ( !arguments.length ) {
35687			return this.attr( "class", "" );
35688		}
35689
35690		classNames = classesToArray( value );
35691
35692		if ( classNames.length ) {
35693			return this.each( function() {
35694				curValue = getClass( this );
35695
35696				// This expression is here for better compressibility (see addClass)
35697				cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
35698
35699				if ( cur ) {
35700					for ( i = 0; i < classNames.length; i++ ) {
35701						className = classNames[ i ];
35702
35703						// Remove *all* instances
35704						while ( cur.indexOf( " " + className + " " ) > -1 ) {
35705							cur = cur.replace( " " + className + " ", " " );
35706						}
35707					}
35708
35709					// Only assign if different to avoid unneeded rendering.
35710					finalValue = stripAndCollapse( cur );
35711					if ( curValue !== finalValue ) {
35712						this.setAttribute( "class", finalValue );
35713					}
35714				}
35715			} );
35716		}
35717
35718		return this;
35719	},
35720
35721	toggleClass: function( value, stateVal ) {
35722		var classNames, className, i, self,
35723			type = typeof value,
35724			isValidValue = type === "string" || Array.isArray( value );
35725
35726		if ( isFunction( value ) ) {
35727			return this.each( function( i ) {
35728				jQuery( this ).toggleClass(
35729					value.call( this, i, getClass( this ), stateVal ),
35730					stateVal
35731				);
35732			} );
35733		}
35734
35735		if ( typeof stateVal === "boolean" && isValidValue ) {
35736			return stateVal ? this.addClass( value ) : this.removeClass( value );
35737		}
35738
35739		classNames = classesToArray( value );
35740
35741		return this.each( function() {
35742			if ( isValidValue ) {
35743
35744				// Toggle individual class names
35745				self = jQuery( this );
35746
35747				for ( i = 0; i < classNames.length; i++ ) {
35748					className = classNames[ i ];
35749
35750					// Check each className given, space separated list
35751					if ( self.hasClass( className ) ) {
35752						self.removeClass( className );
35753					} else {
35754						self.addClass( className );
35755					}
35756				}
35757
35758			// Toggle whole class name
35759			} else if ( value === undefined || type === "boolean" ) {
35760				className = getClass( this );
35761				if ( className ) {
35762
35763					// Store className if set
35764					dataPriv.set( this, "__className__", className );
35765				}
35766
35767				// If the element has a class name or if we're passed `false`,
35768				// then remove the whole classname (if there was one, the above saved it).
35769				// Otherwise bring back whatever was previously saved (if anything),
35770				// falling back to the empty string if nothing was stored.
35771				if ( this.setAttribute ) {
35772					this.setAttribute( "class",
35773						className || value === false ?
35774							"" :
35775							dataPriv.get( this, "__className__" ) || ""
35776					);
35777				}
35778			}
35779		} );
35780	},
35781
35782	hasClass: function( selector ) {
35783		var className, elem,
35784			i = 0;
35785
35786		className = " " + selector + " ";
35787		while ( ( elem = this[ i++ ] ) ) {
35788			if ( elem.nodeType === 1 &&
35789				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
35790				return true;
35791			}
35792		}
35793
35794		return false;
35795	}
35796} );
35797
35798
35799
35800
35801var rreturn = /\r/g;
35802
35803jQuery.fn.extend( {
35804	val: function( value ) {
35805		var hooks, ret, valueIsFunction,
35806			elem = this[ 0 ];
35807
35808		if ( !arguments.length ) {
35809			if ( elem ) {
35810				hooks = jQuery.valHooks[ elem.type ] ||
35811					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
35812
35813				if ( hooks &&
35814					"get" in hooks &&
35815					( ret = hooks.get( elem, "value" ) ) !== undefined
35816				) {
35817					return ret;
35818				}
35819
35820				ret = elem.value;
35821
35822				// Handle most common string cases
35823				if ( typeof ret === "string" ) {
35824					return ret.replace( rreturn, "" );
35825				}
35826
35827				// Handle cases where value is null/undef or number
35828				return ret == null ? "" : ret;
35829			}
35830
35831			return;
35832		}
35833
35834		valueIsFunction = isFunction( value );
35835
35836		return this.each( function( i ) {
35837			var val;
35838
35839			if ( this.nodeType !== 1 ) {
35840				return;
35841			}
35842
35843			if ( valueIsFunction ) {
35844				val = value.call( this, i, jQuery( this ).val() );
35845			} else {
35846				val = value;
35847			}
35848
35849			// Treat null/undefined as ""; convert numbers to string
35850			if ( val == null ) {
35851				val = "";
35852
35853			} else if ( typeof val === "number" ) {
35854				val += "";
35855
35856			} else if ( Array.isArray( val ) ) {
35857				val = jQuery.map( val, function( value ) {
35858					return value == null ? "" : value + "";
35859				} );
35860			}
35861
35862			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
35863
35864			// If set returns undefined, fall back to normal setting
35865			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
35866				this.value = val;
35867			}
35868		} );
35869	}
35870} );
35871
35872jQuery.extend( {
35873	valHooks: {
35874		option: {
35875			get: function( elem ) {
35876
35877				var val = jQuery.find.attr( elem, "value" );
35878				return val != null ?
35879					val :
35880
35881					// Support: IE <=10 - 11 only
35882					// option.text throws exceptions (trac-14686, trac-14858)
35883					// Strip and collapse whitespace
35884					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
35885					stripAndCollapse( jQuery.text( elem ) );
35886			}
35887		},
35888		select: {
35889			get: function( elem ) {
35890				var value, option, i,
35891					options = elem.options,
35892					index = elem.selectedIndex,
35893					one = elem.type === "select-one",
35894					values = one ? null : [],
35895					max = one ? index + 1 : options.length;
35896
35897				if ( index < 0 ) {
35898					i = max;
35899
35900				} else {
35901					i = one ? index : 0;
35902				}
35903
35904				// Loop through all the selected options
35905				for ( ; i < max; i++ ) {
35906					option = options[ i ];
35907
35908					// Support: IE <=9 only
35909					// IE8-9 doesn't update selected after form reset (trac-2551)
35910					if ( ( option.selected || i === index ) &&
35911
35912							// Don't return options that are disabled or in a disabled optgroup
35913							!option.disabled &&
35914							( !option.parentNode.disabled ||
35915								!nodeName( option.parentNode, "optgroup" ) ) ) {
35916
35917						// Get the specific value for the option
35918						value = jQuery( option ).val();
35919
35920						// We don't need an array for one selects
35921						if ( one ) {
35922							return value;
35923						}
35924
35925						// Multi-Selects return an array
35926						values.push( value );
35927					}
35928				}
35929
35930				return values;
35931			},
35932
35933			set: function( elem, value ) {
35934				var optionSet, option,
35935					options = elem.options,
35936					values = jQuery.makeArray( value ),
35937					i = options.length;
35938
35939				while ( i-- ) {
35940					option = options[ i ];
35941
35942					/* eslint-disable no-cond-assign */
35943
35944					if ( option.selected =
35945						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
35946					) {
35947						optionSet = true;
35948					}
35949
35950					/* eslint-enable no-cond-assign */
35951				}
35952
35953				// Force browsers to behave consistently when non-matching value is set
35954				if ( !optionSet ) {
35955					elem.selectedIndex = -1;
35956				}
35957				return values;
35958			}
35959		}
35960	}
35961} );
35962
35963// Radios and checkboxes getter/setter
35964jQuery.each( [ "radio", "checkbox" ], function() {
35965	jQuery.valHooks[ this ] = {
35966		set: function( elem, value ) {
35967			if ( Array.isArray( value ) ) {
35968				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
35969			}
35970		}
35971	};
35972	if ( !support.checkOn ) {
35973		jQuery.valHooks[ this ].get = function( elem ) {
35974			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
35975		};
35976	}
35977} );
35978
35979
35980
35981
35982// Return jQuery for attributes-only inclusion
35983var location = window.location;
35984
35985var nonce = { guid: Date.now() };
35986
35987var rquery = ( /\?/ );
35988
35989
35990
35991// Cross-browser xml parsing
35992jQuery.parseXML = function( data ) {
35993	var xml, parserErrorElem;
35994	if ( !data || typeof data !== "string" ) {
35995		return null;
35996	}
35997
35998	// Support: IE 9 - 11 only
35999	// IE throws on parseFromString with invalid input.
36000	try {
36001		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
36002	} catch ( e ) {}
36003
36004	parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
36005	if ( !xml || parserErrorElem ) {
36006		jQuery.error( "Invalid XML: " + (
36007			parserErrorElem ?
36008				jQuery.map( parserErrorElem.childNodes, function( el ) {
36009					return el.textContent;
36010				} ).join( "\n" ) :
36011				data
36012		) );
36013	}
36014	return xml;
36015};
36016
36017
36018var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
36019	stopPropagationCallback = function( e ) {
36020		e.stopPropagation();
36021	};
36022
36023jQuery.extend( jQuery.event, {
36024
36025	trigger: function( event, data, elem, onlyHandlers ) {
36026
36027		var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
36028			eventPath = [ elem || document ],
36029			type = hasOwn.call( event, "type" ) ? event.type : event,
36030			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
36031
36032		cur = lastElement = tmp = elem = elem || document;
36033
36034		// Don't do events on text and comment nodes
36035		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
36036			return;
36037		}
36038
36039		// focus/blur morphs to focusin/out; ensure we're not firing them right now
36040		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
36041			return;
36042		}
36043
36044		if ( type.indexOf( "." ) > -1 ) {
36045
36046			// Namespaced trigger; create a regexp to match event type in handle()
36047			namespaces = type.split( "." );
36048			type = namespaces.shift();
36049			namespaces.sort();
36050		}
36051		ontype = type.indexOf( ":" ) < 0 && "on" + type;
36052
36053		// Caller can pass in a jQuery.Event object, Object, or just an event type string
36054		event = event[ jQuery.expando ] ?
36055			event :
36056			new jQuery.Event( type, typeof event === "object" && event );
36057
36058		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
36059		event.isTrigger = onlyHandlers ? 2 : 3;
36060		event.namespace = namespaces.join( "." );
36061		event.rnamespace = event.namespace ?
36062			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
36063			null;
36064
36065		// Clean up the event in case it is being reused
36066		event.result = undefined;
36067		if ( !event.target ) {
36068			event.target = elem;
36069		}
36070
36071		// Clone any incoming data and prepend the event, creating the handler arg list
36072		data = data == null ?
36073			[ event ] :
36074			jQuery.makeArray( data, [ event ] );
36075
36076		// Allow special events to draw outside the lines
36077		special = jQuery.event.special[ type ] || {};
36078		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
36079			return;
36080		}
36081
36082		// Determine event propagation path in advance, per W3C events spec (trac-9951)
36083		// Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)
36084		if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
36085
36086			bubbleType = special.delegateType || type;
36087			if ( !rfocusMorph.test( bubbleType + type ) ) {
36088				cur = cur.parentNode;
36089			}
36090			for ( ; cur; cur = cur.parentNode ) {
36091				eventPath.push( cur );
36092				tmp = cur;
36093			}
36094
36095			// Only add window if we got to document (e.g., not plain obj or detached DOM)
36096			if ( tmp === ( elem.ownerDocument || document ) ) {
36097				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
36098			}
36099		}
36100
36101		// Fire handlers on the event path
36102		i = 0;
36103		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
36104			lastElement = cur;
36105			event.type = i > 1 ?
36106				bubbleType :
36107				special.bindType || type;
36108
36109			// jQuery handler
36110			handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
36111				dataPriv.get( cur, "handle" );
36112			if ( handle ) {
36113				handle.apply( cur, data );
36114			}
36115
36116			// Native handler
36117			handle = ontype && cur[ ontype ];
36118			if ( handle && handle.apply && acceptData( cur ) ) {
36119				event.result = handle.apply( cur, data );
36120				if ( event.result === false ) {
36121					event.preventDefault();
36122				}
36123			}
36124		}
36125		event.type = type;
36126
36127		// If nobody prevented the default action, do it now
36128		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
36129
36130			if ( ( !special._default ||
36131				special._default.apply( eventPath.pop(), data ) === false ) &&
36132				acceptData( elem ) ) {
36133
36134				// Call a native DOM method on the target with the same name as the event.
36135				// Don't do default actions on window, that's where global variables be (trac-6170)
36136				if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
36137
36138					// Don't re-trigger an onFOO event when we call its FOO() method
36139					tmp = elem[ ontype ];
36140
36141					if ( tmp ) {
36142						elem[ ontype ] = null;
36143					}
36144
36145					// Prevent re-triggering of the same event, since we already bubbled it above
36146					jQuery.event.triggered = type;
36147
36148					if ( event.isPropagationStopped() ) {
36149						lastElement.addEventListener( type, stopPropagationCallback );
36150					}
36151
36152					elem[ type ]();
36153
36154					if ( event.isPropagationStopped() ) {
36155						lastElement.removeEventListener( type, stopPropagationCallback );
36156					}
36157
36158					jQuery.event.triggered = undefined;
36159
36160					if ( tmp ) {
36161						elem[ ontype ] = tmp;
36162					}
36163				}
36164			}
36165		}
36166
36167		return event.result;
36168	},
36169
36170	// Piggyback on a donor event to simulate a different one
36171	// Used only for `focus(in | out)` events
36172	simulate: function( type, elem, event ) {
36173		var e = jQuery.extend(
36174			new jQuery.Event(),
36175			event,
36176			{
36177				type: type,
36178				isSimulated: true
36179			}
36180		);
36181
36182		jQuery.event.trigger( e, null, elem );
36183	}
36184
36185} );
36186
36187jQuery.fn.extend( {
36188
36189	trigger: function( type, data ) {
36190		return this.each( function() {
36191			jQuery.event.trigger( type, data, this );
36192		} );
36193	},
36194	triggerHandler: function( type, data ) {
36195		var elem = this[ 0 ];
36196		if ( elem ) {
36197			return jQuery.event.trigger( type, data, elem, true );
36198		}
36199	}
36200} );
36201
36202
36203var
36204	rbracket = /\[\]$/,
36205	rCRLF = /\r?\n/g,
36206	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
36207	rsubmittable = /^(?:input|select|textarea|keygen)/i;
36208
36209function buildParams( prefix, obj, traditional, add ) {
36210	var name;
36211
36212	if ( Array.isArray( obj ) ) {
36213
36214		// Serialize array item.
36215		jQuery.each( obj, function( i, v ) {
36216			if ( traditional || rbracket.test( prefix ) ) {
36217
36218				// Treat each array item as a scalar.
36219				add( prefix, v );
36220
36221			} else {
36222
36223				// Item is non-scalar (array or object), encode its numeric index.
36224				buildParams(
36225					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
36226					v,
36227					traditional,
36228					add
36229				);
36230			}
36231		} );
36232
36233	} else if ( !traditional && toType( obj ) === "object" ) {
36234
36235		// Serialize object item.
36236		for ( name in obj ) {
36237			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
36238		}
36239
36240	} else {
36241
36242		// Serialize scalar item.
36243		add( prefix, obj );
36244	}
36245}
36246
36247// Serialize an array of form elements or a set of
36248// key/values into a query string
36249jQuery.param = function( a, traditional ) {
36250	var prefix,
36251		s = [],
36252		add = function( key, valueOrFunction ) {
36253
36254			// If value is a function, invoke it and use its return value
36255			var value = isFunction( valueOrFunction ) ?
36256				valueOrFunction() :
36257				valueOrFunction;
36258
36259			s[ s.length ] = encodeURIComponent( key ) + "=" +
36260				encodeURIComponent( value == null ? "" : value );
36261		};
36262
36263	if ( a == null ) {
36264		return "";
36265	}
36266
36267	// If an array was passed in, assume that it is an array of form elements.
36268	if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
36269
36270		// Serialize the form elements
36271		jQuery.each( a, function() {
36272			add( this.name, this.value );
36273		} );
36274
36275	} else {
36276
36277		// If traditional, encode the "old" way (the way 1.3.2 or older
36278		// did it), otherwise encode params recursively.
36279		for ( prefix in a ) {
36280			buildParams( prefix, a[ prefix ], traditional, add );
36281		}
36282	}
36283
36284	// Return the resulting serialization
36285	return s.join( "&" );
36286};
36287
36288jQuery.fn.extend( {
36289	serialize: function() {
36290		return jQuery.param( this.serializeArray() );
36291	},
36292	serializeArray: function() {
36293		return this.map( function() {
36294
36295			// Can add propHook for "elements" to filter or add form elements
36296			var elements = jQuery.prop( this, "elements" );
36297			return elements ? jQuery.makeArray( elements ) : this;
36298		} ).filter( function() {
36299			var type = this.type;
36300
36301			// Use .is( ":disabled" ) so that fieldset[disabled] works
36302			return this.name && !jQuery( this ).is( ":disabled" ) &&
36303				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
36304				( this.checked || !rcheckableType.test( type ) );
36305		} ).map( function( _i, elem ) {
36306			var val = jQuery( this ).val();
36307
36308			if ( val == null ) {
36309				return null;
36310			}
36311
36312			if ( Array.isArray( val ) ) {
36313				return jQuery.map( val, function( val ) {
36314					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
36315				} );
36316			}
36317
36318			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
36319		} ).get();
36320	}
36321} );
36322
36323
36324var
36325	r20 = /%20/g,
36326	rhash = /#.*$/,
36327	rantiCache = /([?&])_=[^&]*/,
36328	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
36329
36330	// trac-7653, trac-8125, trac-8152: local protocol detection
36331	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
36332	rnoContent = /^(?:GET|HEAD)$/,
36333	rprotocol = /^\/\//,
36334
36335	/* Prefilters
36336	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
36337	 * 2) These are called:
36338	 *    - BEFORE asking for a transport
36339	 *    - AFTER param serialization (s.data is a string if s.processData is true)
36340	 * 3) key is the dataType
36341	 * 4) the catchall symbol "*" can be used
36342	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
36343	 */
36344	prefilters = {},
36345
36346	/* Transports bindings
36347	 * 1) key is the dataType
36348	 * 2) the catchall symbol "*" can be used
36349	 * 3) selection will start with transport dataType and THEN go to "*" if needed
36350	 */
36351	transports = {},
36352
36353	// Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression
36354	allTypes = "*/".concat( "*" ),
36355
36356	// Anchor tag for parsing the document origin
36357	originAnchor = document.createElement( "a" );
36358
36359originAnchor.href = location.href;
36360
36361// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
36362function addToPrefiltersOrTransports( structure ) {
36363
36364	// dataTypeExpression is optional and defaults to "*"
36365	return function( dataTypeExpression, func ) {
36366
36367		if ( typeof dataTypeExpression !== "string" ) {
36368			func = dataTypeExpression;
36369			dataTypeExpression = "*";
36370		}
36371
36372		var dataType,
36373			i = 0,
36374			dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
36375
36376		if ( isFunction( func ) ) {
36377
36378			// For each dataType in the dataTypeExpression
36379			while ( ( dataType = dataTypes[ i++ ] ) ) {
36380
36381				// Prepend if requested
36382				if ( dataType[ 0 ] === "+" ) {
36383					dataType = dataType.slice( 1 ) || "*";
36384					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
36385
36386				// Otherwise append
36387				} else {
36388					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
36389				}
36390			}
36391		}
36392	};
36393}
36394
36395// Base inspection function for prefilters and transports
36396function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
36397
36398	var inspected = {},
36399		seekingTransport = ( structure === transports );
36400
36401	function inspect( dataType ) {
36402		var selected;
36403		inspected[ dataType ] = true;
36404		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
36405			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
36406			if ( typeof dataTypeOrTransport === "string" &&
36407				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
36408
36409				options.dataTypes.unshift( dataTypeOrTransport );
36410				inspect( dataTypeOrTransport );
36411				return false;
36412			} else if ( seekingTransport ) {
36413				return !( selected = dataTypeOrTransport );
36414			}
36415		} );
36416		return selected;
36417	}
36418
36419	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
36420}
36421
36422// A special extend for ajax options
36423// that takes "flat" options (not to be deep extended)
36424// Fixes trac-9887
36425function ajaxExtend( target, src ) {
36426	var key, deep,
36427		flatOptions = jQuery.ajaxSettings.flatOptions || {};
36428
36429	for ( key in src ) {
36430		if ( src[ key ] !== undefined ) {
36431			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
36432		}
36433	}
36434	if ( deep ) {
36435		jQuery.extend( true, target, deep );
36436	}
36437
36438	return target;
36439}
36440
36441/* Handles responses to an ajax request:
36442 * - finds the right dataType (mediates between content-type and expected dataType)
36443 * - returns the corresponding response
36444 */
36445function ajaxHandleResponses( s, jqXHR, responses ) {
36446
36447	var ct, type, finalDataType, firstDataType,
36448		contents = s.contents,
36449		dataTypes = s.dataTypes;
36450
36451	// Remove auto dataType and get content-type in the process
36452	while ( dataTypes[ 0 ] === "*" ) {
36453		dataTypes.shift();
36454		if ( ct === undefined ) {
36455			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
36456		}
36457	}
36458
36459	// Check if we're dealing with a known content-type
36460	if ( ct ) {
36461		for ( type in contents ) {
36462			if ( contents[ type ] && contents[ type ].test( ct ) ) {
36463				dataTypes.unshift( type );
36464				break;
36465			}
36466		}
36467	}
36468
36469	// Check to see if we have a response for the expected dataType
36470	if ( dataTypes[ 0 ] in responses ) {
36471		finalDataType = dataTypes[ 0 ];
36472	} else {
36473
36474		// Try convertible dataTypes
36475		for ( type in responses ) {
36476			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
36477				finalDataType = type;
36478				break;
36479			}
36480			if ( !firstDataType ) {
36481				firstDataType = type;
36482			}
36483		}
36484
36485		// Or just use first one
36486		finalDataType = finalDataType || firstDataType;
36487	}
36488
36489	// If we found a dataType
36490	// We add the dataType to the list if needed
36491	// and return the corresponding response
36492	if ( finalDataType ) {
36493		if ( finalDataType !== dataTypes[ 0 ] ) {
36494			dataTypes.unshift( finalDataType );
36495		}
36496		return responses[ finalDataType ];
36497	}
36498}
36499
36500/* Chain conversions given the request and the original response
36501 * Also sets the responseXXX fields on the jqXHR instance
36502 */
36503function ajaxConvert( s, response, jqXHR, isSuccess ) {
36504	var conv2, current, conv, tmp, prev,
36505		converters = {},
36506
36507		// Work with a copy of dataTypes in case we need to modify it for conversion
36508		dataTypes = s.dataTypes.slice();
36509
36510	// Create converters map with lowercased keys
36511	if ( dataTypes[ 1 ] ) {
36512		for ( conv in s.converters ) {
36513			converters[ conv.toLowerCase() ] = s.converters[ conv ];
36514		}
36515	}
36516
36517	current = dataTypes.shift();
36518
36519	// Convert to each sequential dataType
36520	while ( current ) {
36521
36522		if ( s.responseFields[ current ] ) {
36523			jqXHR[ s.responseFields[ current ] ] = response;
36524		}
36525
36526		// Apply the dataFilter if provided
36527		if ( !prev && isSuccess && s.dataFilter ) {
36528			response = s.dataFilter( response, s.dataType );
36529		}
36530
36531		prev = current;
36532		current = dataTypes.shift();
36533
36534		if ( current ) {
36535
36536			// There's only work to do if current dataType is non-auto
36537			if ( current === "*" ) {
36538
36539				current = prev;
36540
36541			// Convert response if prev dataType is non-auto and differs from current
36542			} else if ( prev !== "*" && prev !== current ) {
36543
36544				// Seek a direct converter
36545				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
36546
36547				// If none found, seek a pair
36548				if ( !conv ) {
36549					for ( conv2 in converters ) {
36550
36551						// If conv2 outputs current
36552						tmp = conv2.split( " " );
36553						if ( tmp[ 1 ] === current ) {
36554
36555							// If prev can be converted to accepted input
36556							conv = converters[ prev + " " + tmp[ 0 ] ] ||
36557								converters[ "* " + tmp[ 0 ] ];
36558							if ( conv ) {
36559
36560								// Condense equivalence converters
36561								if ( conv === true ) {
36562									conv = converters[ conv2 ];
36563
36564								// Otherwise, insert the intermediate dataType
36565								} else if ( converters[ conv2 ] !== true ) {
36566									current = tmp[ 0 ];
36567									dataTypes.unshift( tmp[ 1 ] );
36568								}
36569								break;
36570							}
36571						}
36572					}
36573				}
36574
36575				// Apply converter (if not an equivalence)
36576				if ( conv !== true ) {
36577
36578					// Unless errors are allowed to bubble, catch and return them
36579					if ( conv && s.throws ) {
36580						response = conv( response );
36581					} else {
36582						try {
36583							response = conv( response );
36584						} catch ( e ) {
36585							return {
36586								state: "parsererror",
36587								error: conv ? e : "No conversion from " + prev + " to " + current
36588							};
36589						}
36590					}
36591				}
36592			}
36593		}
36594	}
36595
36596	return { state: "success", data: response };
36597}
36598
36599jQuery.extend( {
36600
36601	// Counter for holding the number of active queries
36602	active: 0,
36603
36604	// Last-Modified header cache for next request
36605	lastModified: {},
36606	etag: {},
36607
36608	ajaxSettings: {
36609		url: location.href,
36610		type: "GET",
36611		isLocal: rlocalProtocol.test( location.protocol ),
36612		global: true,
36613		processData: true,
36614		async: true,
36615		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
36616
36617		/*
36618		timeout: 0,
36619		data: null,
36620		dataType: null,
36621		username: null,
36622		password: null,
36623		cache: null,
36624		throws: false,
36625		traditional: false,
36626		headers: {},
36627		*/
36628
36629		accepts: {
36630			"*": allTypes,
36631			text: "text/plain",
36632			html: "text/html",
36633			xml: "application/xml, text/xml",
36634			json: "application/json, text/javascript"
36635		},
36636
36637		contents: {
36638			xml: /\bxml\b/,
36639			html: /\bhtml/,
36640			json: /\bjson\b/
36641		},
36642
36643		responseFields: {
36644			xml: "responseXML",
36645			text: "responseText",
36646			json: "responseJSON"
36647		},
36648
36649		// Data converters
36650		// Keys separate source (or catchall "*") and destination types with a single space
36651		converters: {
36652
36653			// Convert anything to text
36654			"* text": String,
36655
36656			// Text to html (true = no transformation)
36657			"text html": true,
36658
36659			// Evaluate text as a json expression
36660			"text json": JSON.parse,
36661
36662			// Parse text as xml
36663			"text xml": jQuery.parseXML
36664		},
36665
36666		// For options that shouldn't be deep extended:
36667		// you can add your own custom options here if
36668		// and when you create one that shouldn't be
36669		// deep extended (see ajaxExtend)
36670		flatOptions: {
36671			url: true,
36672			context: true
36673		}
36674	},
36675
36676	// Creates a full fledged settings object into target
36677	// with both ajaxSettings and settings fields.
36678	// If target is omitted, writes into ajaxSettings.
36679	ajaxSetup: function( target, settings ) {
36680		return settings ?
36681
36682			// Building a settings object
36683			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
36684
36685			// Extending ajaxSettings
36686			ajaxExtend( jQuery.ajaxSettings, target );
36687	},
36688
36689	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
36690	ajaxTransport: addToPrefiltersOrTransports( transports ),
36691
36692	// Main method
36693	ajax: function( url, options ) {
36694
36695		// If url is an object, simulate pre-1.5 signature
36696		if ( typeof url === "object" ) {
36697			options = url;
36698			url = undefined;
36699		}
36700
36701		// Force options to be an object
36702		options = options || {};
36703
36704		var transport,
36705
36706			// URL without anti-cache param
36707			cacheURL,
36708
36709			// Response headers
36710			responseHeadersString,
36711			responseHeaders,
36712
36713			// timeout handle
36714			timeoutTimer,
36715
36716			// Url cleanup var
36717			urlAnchor,
36718
36719			// Request state (becomes false upon send and true upon completion)
36720			completed,
36721
36722			// To know if global events are to be dispatched
36723			fireGlobals,
36724
36725			// Loop variable
36726			i,
36727
36728			// uncached part of the url
36729			uncached,
36730
36731			// Create the final options object
36732			s = jQuery.ajaxSetup( {}, options ),
36733
36734			// Callbacks context
36735			callbackContext = s.context || s,
36736
36737			// Context for global events is callbackContext if it is a DOM node or jQuery collection
36738			globalEventContext = s.context &&
36739				( callbackContext.nodeType || callbackContext.jquery ) ?
36740				jQuery( callbackContext ) :
36741				jQuery.event,
36742
36743			// Deferreds
36744			deferred = jQuery.Deferred(),
36745			completeDeferred = jQuery.Callbacks( "once memory" ),
36746
36747			// Status-dependent callbacks
36748			statusCode = s.statusCode || {},
36749
36750			// Headers (they are sent all at once)
36751			requestHeaders = {},
36752			requestHeadersNames = {},
36753
36754			// Default abort message
36755			strAbort = "canceled",
36756
36757			// Fake xhr
36758			jqXHR = {
36759				readyState: 0,
36760
36761				// Builds headers hashtable if needed
36762				getResponseHeader: function( key ) {
36763					var match;
36764					if ( completed ) {
36765						if ( !responseHeaders ) {
36766							responseHeaders = {};
36767							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
36768								responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
36769									( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
36770										.concat( match[ 2 ] );
36771							}
36772						}
36773						match = responseHeaders[ key.toLowerCase() + " " ];
36774					}
36775					return match == null ? null : match.join( ", " );
36776				},
36777
36778				// Raw string
36779				getAllResponseHeaders: function() {
36780					return completed ? responseHeadersString : null;
36781				},
36782
36783				// Caches the header
36784				setRequestHeader: function( name, value ) {
36785					if ( completed == null ) {
36786						name = requestHeadersNames[ name.toLowerCase() ] =
36787							requestHeadersNames[ name.toLowerCase() ] || name;
36788						requestHeaders[ name ] = value;
36789					}
36790					return this;
36791				},
36792
36793				// Overrides response content-type header
36794				overrideMimeType: function( type ) {
36795					if ( completed == null ) {
36796						s.mimeType = type;
36797					}
36798					return this;
36799				},
36800
36801				// Status-dependent callbacks
36802				statusCode: function( map ) {
36803					var code;
36804					if ( map ) {
36805						if ( completed ) {
36806
36807							// Execute the appropriate callbacks
36808							jqXHR.always( map[ jqXHR.status ] );
36809						} else {
36810
36811							// Lazy-add the new callbacks in a way that preserves old ones
36812							for ( code in map ) {
36813								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
36814							}
36815						}
36816					}
36817					return this;
36818				},
36819
36820				// Cancel the request
36821				abort: function( statusText ) {
36822					var finalText = statusText || strAbort;
36823					if ( transport ) {
36824						transport.abort( finalText );
36825					}
36826					done( 0, finalText );
36827					return this;
36828				}
36829			};
36830
36831		// Attach deferreds
36832		deferred.promise( jqXHR );
36833
36834		// Add protocol if not provided (prefilters might expect it)
36835		// Handle falsy url in the settings object (trac-10093: consistency with old signature)
36836		// We also use the url parameter if available
36837		s.url = ( ( url || s.url || location.href ) + "" )
36838			.replace( rprotocol, location.protocol + "//" );
36839
36840		// Alias method option to type as per ticket trac-12004
36841		s.type = options.method || options.type || s.method || s.type;
36842
36843		// Extract dataTypes list
36844		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
36845
36846		// A cross-domain request is in order when the origin doesn't match the current origin.
36847		if ( s.crossDomain == null ) {
36848			urlAnchor = document.createElement( "a" );
36849
36850			// Support: IE <=8 - 11, Edge 12 - 15
36851			// IE throws exception on accessing the href property if url is malformed,
36852			// e.g. http://example.com:80x/
36853			try {
36854				urlAnchor.href = s.url;
36855
36856				// Support: IE <=8 - 11 only
36857				// Anchor's host property isn't correctly set when s.url is relative
36858				urlAnchor.href = urlAnchor.href;
36859				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
36860					urlAnchor.protocol + "//" + urlAnchor.host;
36861			} catch ( e ) {
36862
36863				// If there is an error parsing the URL, assume it is crossDomain,
36864				// it can be rejected by the transport if it is invalid
36865				s.crossDomain = true;
36866			}
36867		}
36868
36869		// Convert data if not already a string
36870		if ( s.data && s.processData && typeof s.data !== "string" ) {
36871			s.data = jQuery.param( s.data, s.traditional );
36872		}
36873
36874		// Apply prefilters
36875		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
36876
36877		// If request was aborted inside a prefilter, stop there
36878		if ( completed ) {
36879			return jqXHR;
36880		}
36881
36882		// We can fire global events as of now if asked to
36883		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)
36884		fireGlobals = jQuery.event && s.global;
36885
36886		// Watch for a new set of requests
36887		if ( fireGlobals && jQuery.active++ === 0 ) {
36888			jQuery.event.trigger( "ajaxStart" );
36889		}
36890
36891		// Uppercase the type
36892		s.type = s.type.toUpperCase();
36893
36894		// Determine if request has content
36895		s.hasContent = !rnoContent.test( s.type );
36896
36897		// Save the URL in case we're toying with the If-Modified-Since
36898		// and/or If-None-Match header later on
36899		// Remove hash to simplify url manipulation
36900		cacheURL = s.url.replace( rhash, "" );
36901
36902		// More options handling for requests with no content
36903		if ( !s.hasContent ) {
36904
36905			// Remember the hash so we can put it back
36906			uncached = s.url.slice( cacheURL.length );
36907
36908			// If data is available and should be processed, append data to url
36909			if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
36910				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
36911
36912				// trac-9682: remove data so that it's not used in an eventual retry
36913				delete s.data;
36914			}
36915
36916			// Add or update anti-cache param if needed
36917			if ( s.cache === false ) {
36918				cacheURL = cacheURL.replace( rantiCache, "$1" );
36919				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
36920					uncached;
36921			}
36922
36923			// Put hash and anti-cache on the URL that will be requested (gh-1732)
36924			s.url = cacheURL + uncached;
36925
36926		// Change '%20' to '+' if this is encoded form body content (gh-2658)
36927		} else if ( s.data && s.processData &&
36928			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
36929			s.data = s.data.replace( r20, "+" );
36930		}
36931
36932		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
36933		if ( s.ifModified ) {
36934			if ( jQuery.lastModified[ cacheURL ] ) {
36935				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
36936			}
36937			if ( jQuery.etag[ cacheURL ] ) {
36938				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
36939			}
36940		}
36941
36942		// Set the correct header, if data is being sent
36943		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
36944			jqXHR.setRequestHeader( "Content-Type", s.contentType );
36945		}
36946
36947		// Set the Accepts header for the server, depending on the dataType
36948		jqXHR.setRequestHeader(
36949			"Accept",
36950			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
36951				s.accepts[ s.dataTypes[ 0 ] ] +
36952					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
36953				s.accepts[ "*" ]
36954		);
36955
36956		// Check for headers option
36957		for ( i in s.headers ) {
36958			jqXHR.setRequestHeader( i, s.headers[ i ] );
36959		}
36960
36961		// Allow custom headers/mimetypes and early abort
36962		if ( s.beforeSend &&
36963			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
36964
36965			// Abort if not done already and return
36966			return jqXHR.abort();
36967		}
36968
36969		// Aborting is no longer a cancellation
36970		strAbort = "abort";
36971
36972		// Install callbacks on deferreds
36973		completeDeferred.add( s.complete );
36974		jqXHR.done( s.success );
36975		jqXHR.fail( s.error );
36976
36977		// Get transport
36978		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
36979
36980		// If no transport, we auto-abort
36981		if ( !transport ) {
36982			done( -1, "No Transport" );
36983		} else {
36984			jqXHR.readyState = 1;
36985
36986			// Send global event
36987			if ( fireGlobals ) {
36988				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
36989			}
36990
36991			// If request was aborted inside ajaxSend, stop there
36992			if ( completed ) {
36993				return jqXHR;
36994			}
36995
36996			// Timeout
36997			if ( s.async && s.timeout > 0 ) {
36998				timeoutTimer = window.setTimeout( function() {
36999					jqXHR.abort( "timeout" );
37000				}, s.timeout );
37001			}
37002
37003			try {
37004				completed = false;
37005				transport.send( requestHeaders, done );
37006			} catch ( e ) {
37007
37008				// Rethrow post-completion exceptions
37009				if ( completed ) {
37010					throw e;
37011				}
37012
37013				// Propagate others as results
37014				done( -1, e );
37015			}
37016		}
37017
37018		// Callback for when everything is done
37019		function done( status, nativeStatusText, responses, headers ) {
37020			var isSuccess, success, error, response, modified,
37021				statusText = nativeStatusText;
37022
37023			// Ignore repeat invocations
37024			if ( completed ) {
37025				return;
37026			}
37027
37028			completed = true;
37029
37030			// Clear timeout if it exists
37031			if ( timeoutTimer ) {
37032				window.clearTimeout( timeoutTimer );
37033			}
37034
37035			// Dereference transport for early garbage collection
37036			// (no matter how long the jqXHR object will be used)
37037			transport = undefined;
37038
37039			// Cache response headers
37040			responseHeadersString = headers || "";
37041
37042			// Set readyState
37043			jqXHR.readyState = status > 0 ? 4 : 0;
37044
37045			// Determine if successful
37046			isSuccess = status >= 200 && status < 300 || status === 304;
37047
37048			// Get response data
37049			if ( responses ) {
37050				response = ajaxHandleResponses( s, jqXHR, responses );
37051			}
37052
37053			// Use a noop converter for missing script but not if jsonp
37054			if ( !isSuccess &&
37055				jQuery.inArray( "script", s.dataTypes ) > -1 &&
37056				jQuery.inArray( "json", s.dataTypes ) < 0 ) {
37057				s.converters[ "text script" ] = function() {};
37058			}
37059
37060			// Convert no matter what (that way responseXXX fields are always set)
37061			response = ajaxConvert( s, response, jqXHR, isSuccess );
37062
37063			// If successful, handle type chaining
37064			if ( isSuccess ) {
37065
37066				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
37067				if ( s.ifModified ) {
37068					modified = jqXHR.getResponseHeader( "Last-Modified" );
37069					if ( modified ) {
37070						jQuery.lastModified[ cacheURL ] = modified;
37071					}
37072					modified = jqXHR.getResponseHeader( "etag" );
37073					if ( modified ) {
37074						jQuery.etag[ cacheURL ] = modified;
37075					}
37076				}
37077
37078				// if no content
37079				if ( status === 204 || s.type === "HEAD" ) {
37080					statusText = "nocontent";
37081
37082				// if not modified
37083				} else if ( status === 304 ) {
37084					statusText = "notmodified";
37085
37086				// If we have data, let's convert it
37087				} else {
37088					statusText = response.state;
37089					success = response.data;
37090					error = response.error;
37091					isSuccess = !error;
37092				}
37093			} else {
37094
37095				// Extract error from statusText and normalize for non-aborts
37096				error = statusText;
37097				if ( status || !statusText ) {
37098					statusText = "error";
37099					if ( status < 0 ) {
37100						status = 0;
37101					}
37102				}
37103			}
37104
37105			// Set data for the fake xhr object
37106			jqXHR.status = status;
37107			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
37108
37109			// Success/Error
37110			if ( isSuccess ) {
37111				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
37112			} else {
37113				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
37114			}
37115
37116			// Status-dependent callbacks
37117			jqXHR.statusCode( statusCode );
37118			statusCode = undefined;
37119
37120			if ( fireGlobals ) {
37121				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
37122					[ jqXHR, s, isSuccess ? success : error ] );
37123			}
37124
37125			// Complete
37126			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
37127
37128			if ( fireGlobals ) {
37129				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
37130
37131				// Handle the global AJAX counter
37132				if ( !( --jQuery.active ) ) {
37133					jQuery.event.trigger( "ajaxStop" );
37134				}
37135			}
37136		}
37137
37138		return jqXHR;
37139	},
37140
37141	getJSON: function( url, data, callback ) {
37142		return jQuery.get( url, data, callback, "json" );
37143	},
37144
37145	getScript: function( url, callback ) {
37146		return jQuery.get( url, undefined, callback, "script" );
37147	}
37148} );
37149
37150jQuery.each( [ "get", "post" ], function( _i, method ) {
37151	jQuery[ method ] = function( url, data, callback, type ) {
37152
37153		// Shift arguments if data argument was omitted
37154		if ( isFunction( data ) ) {
37155			type = type || callback;
37156			callback = data;
37157			data = undefined;
37158		}
37159
37160		// The url can be an options object (which then must have .url)
37161		return jQuery.ajax( jQuery.extend( {
37162			url: url,
37163			type: method,
37164			dataType: type,
37165			data: data,
37166			success: callback
37167		}, jQuery.isPlainObject( url ) && url ) );
37168	};
37169} );
37170
37171jQuery.ajaxPrefilter( function( s ) {
37172	var i;
37173	for ( i in s.headers ) {
37174		if ( i.toLowerCase() === "content-type" ) {
37175			s.contentType = s.headers[ i ] || "";
37176		}
37177	}
37178} );
37179
37180
37181jQuery._evalUrl = function( url, options, doc ) {
37182	return jQuery.ajax( {
37183		url: url,
37184
37185		// Make this explicit, since user can override this through ajaxSetup (trac-11264)
37186		type: "GET",
37187		dataType: "script",
37188		cache: true,
37189		async: false,
37190		global: false,
37191
37192		// Only evaluate the response if it is successful (gh-4126)
37193		// dataFilter is not invoked for failure responses, so using it instead
37194		// of the default converter is kludgy but it works.
37195		converters: {
37196			"text script": function() {}
37197		},
37198		dataFilter: function( response ) {
37199			jQuery.globalEval( response, options, doc );
37200		}
37201	} );
37202};
37203
37204
37205jQuery.fn.extend( {
37206	wrapAll: function( html ) {
37207		var wrap;
37208
37209		if ( this[ 0 ] ) {
37210			if ( isFunction( html ) ) {
37211				html = html.call( this[ 0 ] );
37212			}
37213
37214			// The elements to wrap the target around
37215			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
37216
37217			if ( this[ 0 ].parentNode ) {
37218				wrap.insertBefore( this[ 0 ] );
37219			}
37220
37221			wrap.map( function() {
37222				var elem = this;
37223
37224				while ( elem.firstElementChild ) {
37225					elem = elem.firstElementChild;
37226				}
37227
37228				return elem;
37229			} ).append( this );
37230		}
37231
37232		return this;
37233	},
37234
37235	wrapInner: function( html ) {
37236		if ( isFunction( html ) ) {
37237			return this.each( function( i ) {
37238				jQuery( this ).wrapInner( html.call( this, i ) );
37239			} );
37240		}
37241
37242		return this.each( function() {
37243			var self = jQuery( this ),
37244				contents = self.contents();
37245
37246			if ( contents.length ) {
37247				contents.wrapAll( html );
37248
37249			} else {
37250				self.append( html );
37251			}
37252		} );
37253	},
37254
37255	wrap: function( html ) {
37256		var htmlIsFunction = isFunction( html );
37257
37258		return this.each( function( i ) {
37259			jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
37260		} );
37261	},
37262
37263	unwrap: function( selector ) {
37264		this.parent( selector ).not( "body" ).each( function() {
37265			jQuery( this ).replaceWith( this.childNodes );
37266		} );
37267		return this;
37268	}
37269} );
37270
37271
37272jQuery.expr.pseudos.hidden = function( elem ) {
37273	return !jQuery.expr.pseudos.visible( elem );
37274};
37275jQuery.expr.pseudos.visible = function( elem ) {
37276	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
37277};
37278
37279
37280
37281
37282jQuery.ajaxSettings.xhr = function() {
37283	try {
37284		return new window.XMLHttpRequest();
37285	} catch ( e ) {}
37286};
37287
37288var xhrSuccessStatus = {
37289
37290		// File protocol always yields status code 0, assume 200
37291		0: 200,
37292
37293		// Support: IE <=9 only
37294		// trac-1450: sometimes IE returns 1223 when it should be 204
37295		1223: 204
37296	},
37297	xhrSupported = jQuery.ajaxSettings.xhr();
37298
37299support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
37300support.ajax = xhrSupported = !!xhrSupported;
37301
37302jQuery.ajaxTransport( function( options ) {
37303	var callback, errorCallback;
37304
37305	// Cross domain only allowed if supported through XMLHttpRequest
37306	if ( support.cors || xhrSupported && !options.crossDomain ) {
37307		return {
37308			send: function( headers, complete ) {
37309				var i,
37310					xhr = options.xhr();
37311
37312				xhr.open(
37313					options.type,
37314					options.url,
37315					options.async,
37316					options.username,
37317					options.password
37318				);
37319
37320				// Apply custom fields if provided
37321				if ( options.xhrFields ) {
37322					for ( i in options.xhrFields ) {
37323						xhr[ i ] = options.xhrFields[ i ];
37324					}
37325				}
37326
37327				// Override mime type if needed
37328				if ( options.mimeType && xhr.overrideMimeType ) {
37329					xhr.overrideMimeType( options.mimeType );
37330				}
37331
37332				// X-Requested-With header
37333				// For cross-domain requests, seeing as conditions for a preflight are
37334				// akin to a jigsaw puzzle, we simply never set it to be sure.
37335				// (it can always be set on a per-request basis or even using ajaxSetup)
37336				// For same-domain requests, won't change header if already provided.
37337				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
37338					headers[ "X-Requested-With" ] = "XMLHttpRequest";
37339				}
37340
37341				// Set headers
37342				for ( i in headers ) {
37343					xhr.setRequestHeader( i, headers[ i ] );
37344				}
37345
37346				// Callback
37347				callback = function( type ) {
37348					return function() {
37349						if ( callback ) {
37350							callback = errorCallback = xhr.onload =
37351								xhr.onerror = xhr.onabort = xhr.ontimeout =
37352									xhr.onreadystatechange = null;
37353
37354							if ( type === "abort" ) {
37355								xhr.abort();
37356							} else if ( type === "error" ) {
37357
37358								// Support: IE <=9 only
37359								// On a manual native abort, IE9 throws
37360								// errors on any property access that is not readyState
37361								if ( typeof xhr.status !== "number" ) {
37362									complete( 0, "error" );
37363								} else {
37364									complete(
37365
37366										// File: protocol always yields status 0; see trac-8605, trac-14207
37367										xhr.status,
37368										xhr.statusText
37369									);
37370								}
37371							} else {
37372								complete(
37373									xhrSuccessStatus[ xhr.status ] || xhr.status,
37374									xhr.statusText,
37375
37376									// Support: IE <=9 only
37377									// IE9 has no XHR2 but throws on binary (trac-11426)
37378									// For XHR2 non-text, let the caller handle it (gh-2498)
37379									( xhr.responseType || "text" ) !== "text"  ||
37380									typeof xhr.responseText !== "string" ?
37381										{ binary: xhr.response } :
37382										{ text: xhr.responseText },
37383									xhr.getAllResponseHeaders()
37384								);
37385							}
37386						}
37387					};
37388				};
37389
37390				// Listen to events
37391				xhr.onload = callback();
37392				errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
37393
37394				// Support: IE 9 only
37395				// Use onreadystatechange to replace onabort
37396				// to handle uncaught aborts
37397				if ( xhr.onabort !== undefined ) {
37398					xhr.onabort = errorCallback;
37399				} else {
37400					xhr.onreadystatechange = function() {
37401
37402						// Check readyState before timeout as it changes
37403						if ( xhr.readyState === 4 ) {
37404
37405							// Allow onerror to be called first,
37406							// but that will not handle a native abort
37407							// Also, save errorCallback to a variable
37408							// as xhr.onerror cannot be accessed
37409							window.setTimeout( function() {
37410								if ( callback ) {
37411									errorCallback();
37412								}
37413							} );
37414						}
37415					};
37416				}
37417
37418				// Create the abort callback
37419				callback = callback( "abort" );
37420
37421				try {
37422
37423					// Do send the request (this may raise an exception)
37424					xhr.send( options.hasContent && options.data || null );
37425				} catch ( e ) {
37426
37427					// trac-14683: Only rethrow if this hasn't been notified as an error yet
37428					if ( callback ) {
37429						throw e;
37430					}
37431				}
37432			},
37433
37434			abort: function() {
37435				if ( callback ) {
37436					callback();
37437				}
37438			}
37439		};
37440	}
37441} );
37442
37443
37444
37445
37446// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
37447jQuery.ajaxPrefilter( function( s ) {
37448	if ( s.crossDomain ) {
37449		s.contents.script = false;
37450	}
37451} );
37452
37453// Install script dataType
37454jQuery.ajaxSetup( {
37455	accepts: {
37456		script: "text/javascript, application/javascript, " +
37457			"application/ecmascript, application/x-ecmascript"
37458	},
37459	contents: {
37460		script: /\b(?:java|ecma)script\b/
37461	},
37462	converters: {
37463		"text script": function( text ) {
37464			jQuery.globalEval( text );
37465			return text;
37466		}
37467	}
37468} );
37469
37470// Handle cache's special case and crossDomain
37471jQuery.ajaxPrefilter( "script", function( s ) {
37472	if ( s.cache === undefined ) {
37473		s.cache = false;
37474	}
37475	if ( s.crossDomain ) {
37476		s.type = "GET";
37477	}
37478} );
37479
37480// Bind script tag hack transport
37481jQuery.ajaxTransport( "script", function( s ) {
37482
37483	// This transport only deals with cross domain or forced-by-attrs requests
37484	if ( s.crossDomain || s.scriptAttrs ) {
37485		var script, callback;
37486		return {
37487			send: function( _, complete ) {
37488				script = jQuery( "<script>" )
37489					.attr( s.scriptAttrs || {} )
37490					.prop( { charset: s.scriptCharset, src: s.url } )
37491					.on( "load error", callback = function( evt ) {
37492						script.remove();
37493						callback = null;
37494						if ( evt ) {
37495							complete( evt.type === "error" ? 404 : 200, evt.type );
37496						}
37497					} );
37498
37499				// Use native DOM manipulation to avoid our domManip AJAX trickery
37500				document.head.appendChild( script[ 0 ] );
37501			},
37502			abort: function() {
37503				if ( callback ) {
37504					callback();
37505				}
37506			}
37507		};
37508	}
37509} );
37510
37511
37512
37513
37514var oldCallbacks = [],
37515	rjsonp = /(=)\?(?=&|$)|\?\?/;
37516
37517// Default jsonp settings
37518jQuery.ajaxSetup( {
37519	jsonp: "callback",
37520	jsonpCallback: function() {
37521		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
37522		this[ callback ] = true;
37523		return callback;
37524	}
37525} );
37526
37527// Detect, normalize options and install callbacks for jsonp requests
37528jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
37529
37530	var callbackName, overwritten, responseContainer,
37531		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
37532			"url" :
37533			typeof s.data === "string" &&
37534				( s.contentType || "" )
37535					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
37536				rjsonp.test( s.data ) && "data"
37537		);
37538
37539	// Handle iff the expected data type is "jsonp" or we have a parameter to set
37540	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
37541
37542		// Get callback name, remembering preexisting value associated with it
37543		callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
37544			s.jsonpCallback() :
37545			s.jsonpCallback;
37546
37547		// Insert callback into url or form data
37548		if ( jsonProp ) {
37549			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
37550		} else if ( s.jsonp !== false ) {
37551			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
37552		}
37553
37554		// Use data converter to retrieve json after script execution
37555		s.converters[ "script json" ] = function() {
37556			if ( !responseContainer ) {
37557				jQuery.error( callbackName + " was not called" );
37558			}
37559			return responseContainer[ 0 ];
37560		};
37561
37562		// Force json dataType
37563		s.dataTypes[ 0 ] = "json";
37564
37565		// Install callback
37566		overwritten = window[ callbackName ];
37567		window[ callbackName ] = function() {
37568			responseContainer = arguments;
37569		};
37570
37571		// Clean-up function (fires after converters)
37572		jqXHR.always( function() {
37573
37574			// If previous value didn't exist - remove it
37575			if ( overwritten === undefined ) {
37576				jQuery( window ).removeProp( callbackName );
37577
37578			// Otherwise restore preexisting value
37579			} else {
37580				window[ callbackName ] = overwritten;
37581			}
37582
37583			// Save back as free
37584			if ( s[ callbackName ] ) {
37585
37586				// Make sure that re-using the options doesn't screw things around
37587				s.jsonpCallback = originalSettings.jsonpCallback;
37588
37589				// Save the callback name for future use
37590				oldCallbacks.push( callbackName );
37591			}
37592
37593			// Call if it was a function and we have a response
37594			if ( responseContainer && isFunction( overwritten ) ) {
37595				overwritten( responseContainer[ 0 ] );
37596			}
37597
37598			responseContainer = overwritten = undefined;
37599		} );
37600
37601		// Delegate to script
37602		return "script";
37603	}
37604} );
37605
37606
37607
37608
37609// Support: Safari 8 only
37610// In Safari 8 documents created via document.implementation.createHTMLDocument
37611// collapse sibling forms: the second one becomes a child of the first one.
37612// Because of that, this security measure has to be disabled in Safari 8.
37613// https://bugs.webkit.org/show_bug.cgi?id=137337
37614support.createHTMLDocument = ( function() {
37615	var body = document.implementation.createHTMLDocument( "" ).body;
37616	body.innerHTML = "<form></form><form></form>";
37617	return body.childNodes.length === 2;
37618} )();
37619
37620
37621// Argument "data" should be string of html
37622// context (optional): If specified, the fragment will be created in this context,
37623// defaults to document
37624// keepScripts (optional): If true, will include scripts passed in the html string
37625jQuery.parseHTML = function( data, context, keepScripts ) {
37626	if ( typeof data !== "string" ) {
37627		return [];
37628	}
37629	if ( typeof context === "boolean" ) {
37630		keepScripts = context;
37631		context = false;
37632	}
37633
37634	var base, parsed, scripts;
37635
37636	if ( !context ) {
37637
37638		// Stop scripts or inline event handlers from being executed immediately
37639		// by using document.implementation
37640		if ( support.createHTMLDocument ) {
37641			context = document.implementation.createHTMLDocument( "" );
37642
37643			// Set the base href for the created document
37644			// so any parsed elements with URLs
37645			// are based on the document's URL (gh-2965)
37646			base = context.createElement( "base" );
37647			base.href = document.location.href;
37648			context.head.appendChild( base );
37649		} else {
37650			context = document;
37651		}
37652	}
37653
37654	parsed = rsingleTag.exec( data );
37655	scripts = !keepScripts && [];
37656
37657	// Single tag
37658	if ( parsed ) {
37659		return [ context.createElement( parsed[ 1 ] ) ];
37660	}
37661
37662	parsed = buildFragment( [ data ], context, scripts );
37663
37664	if ( scripts && scripts.length ) {
37665		jQuery( scripts ).remove();
37666	}
37667
37668	return jQuery.merge( [], parsed.childNodes );
37669};
37670
37671
37672/**
37673 * Load a url into a page
37674 */
37675jQuery.fn.load = function( url, params, callback ) {
37676	var selector, type, response,
37677		self = this,
37678		off = url.indexOf( " " );
37679
37680	if ( off > -1 ) {
37681		selector = stripAndCollapse( url.slice( off ) );
37682		url = url.slice( 0, off );
37683	}
37684
37685	// If it's a function
37686	if ( isFunction( params ) ) {
37687
37688		// We assume that it's the callback
37689		callback = params;
37690		params = undefined;
37691
37692	// Otherwise, build a param string
37693	} else if ( params && typeof params === "object" ) {
37694		type = "POST";
37695	}
37696
37697	// If we have elements to modify, make the request
37698	if ( self.length > 0 ) {
37699		jQuery.ajax( {
37700			url: url,
37701
37702			// If "type" variable is undefined, then "GET" method will be used.
37703			// Make value of this field explicit since
37704			// user can override it through ajaxSetup method
37705			type: type || "GET",
37706			dataType: "html",
37707			data: params
37708		} ).done( function( responseText ) {
37709
37710			// Save response for use in complete callback
37711			response = arguments;
37712
37713			self.html( selector ?
37714
37715				// If a selector was specified, locate the right elements in a dummy div
37716				// Exclude scripts to avoid IE 'Permission Denied' errors
37717				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
37718
37719				// Otherwise use the full result
37720				responseText );
37721
37722		// If the request succeeds, this function gets "data", "status", "jqXHR"
37723		// but they are ignored because response was set above.
37724		// If it fails, this function gets "jqXHR", "status", "error"
37725		} ).always( callback && function( jqXHR, status ) {
37726			self.each( function() {
37727				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
37728			} );
37729		} );
37730	}
37731
37732	return this;
37733};
37734
37735
37736
37737
37738jQuery.expr.pseudos.animated = function( elem ) {
37739	return jQuery.grep( jQuery.timers, function( fn ) {
37740		return elem === fn.elem;
37741	} ).length;
37742};
37743
37744
37745
37746
37747jQuery.offset = {
37748	setOffset: function( elem, options, i ) {
37749		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
37750			position = jQuery.css( elem, "position" ),
37751			curElem = jQuery( elem ),
37752			props = {};
37753
37754		// Set position first, in-case top/left are set even on static elem
37755		if ( position === "static" ) {
37756			elem.style.position = "relative";
37757		}
37758
37759		curOffset = curElem.offset();
37760		curCSSTop = jQuery.css( elem, "top" );
37761		curCSSLeft = jQuery.css( elem, "left" );
37762		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
37763			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
37764
37765		// Need to be able to calculate position if either
37766		// top or left is auto and position is either absolute or fixed
37767		if ( calculatePosition ) {
37768			curPosition = curElem.position();
37769			curTop = curPosition.top;
37770			curLeft = curPosition.left;
37771
37772		} else {
37773			curTop = parseFloat( curCSSTop ) || 0;
37774			curLeft = parseFloat( curCSSLeft ) || 0;
37775		}
37776
37777		if ( isFunction( options ) ) {
37778
37779			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
37780			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
37781		}
37782
37783		if ( options.top != null ) {
37784			props.top = ( options.top - curOffset.top ) + curTop;
37785		}
37786		if ( options.left != null ) {
37787			props.left = ( options.left - curOffset.left ) + curLeft;
37788		}
37789
37790		if ( "using" in options ) {
37791			options.using.call( elem, props );
37792
37793		} else {
37794			curElem.css( props );
37795		}
37796	}
37797};
37798
37799jQuery.fn.extend( {
37800
37801	// offset() relates an element's border box to the document origin
37802	offset: function( options ) {
37803
37804		// Preserve chaining for setter
37805		if ( arguments.length ) {
37806			return options === undefined ?
37807				this :
37808				this.each( function( i ) {
37809					jQuery.offset.setOffset( this, options, i );
37810				} );
37811		}
37812
37813		var rect, win,
37814			elem = this[ 0 ];
37815
37816		if ( !elem ) {
37817			return;
37818		}
37819
37820		// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
37821		// Support: IE <=11 only
37822		// Running getBoundingClientRect on a
37823		// disconnected node in IE throws an error
37824		if ( !elem.getClientRects().length ) {
37825			return { top: 0, left: 0 };
37826		}
37827
37828		// Get document-relative position by adding viewport scroll to viewport-relative gBCR
37829		rect = elem.getBoundingClientRect();
37830		win = elem.ownerDocument.defaultView;
37831		return {
37832			top: rect.top + win.pageYOffset,
37833			left: rect.left + win.pageXOffset
37834		};
37835	},
37836
37837	// position() relates an element's margin box to its offset parent's padding box
37838	// This corresponds to the behavior of CSS absolute positioning
37839	position: function() {
37840		if ( !this[ 0 ] ) {
37841			return;
37842		}
37843
37844		var offsetParent, offset, doc,
37845			elem = this[ 0 ],
37846			parentOffset = { top: 0, left: 0 };
37847
37848		// position:fixed elements are offset from the viewport, which itself always has zero offset
37849		if ( jQuery.css( elem, "position" ) === "fixed" ) {
37850
37851			// Assume position:fixed implies availability of getBoundingClientRect
37852			offset = elem.getBoundingClientRect();
37853
37854		} else {
37855			offset = this.offset();
37856
37857			// Account for the *real* offset parent, which can be the document or its root element
37858			// when a statically positioned element is identified
37859			doc = elem.ownerDocument;
37860			offsetParent = elem.offsetParent || doc.documentElement;
37861			while ( offsetParent &&
37862				( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
37863				jQuery.css( offsetParent, "position" ) === "static" ) {
37864
37865				offsetParent = offsetParent.parentNode;
37866			}
37867			if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
37868
37869				// Incorporate borders into its offset, since they are outside its content origin
37870				parentOffset = jQuery( offsetParent ).offset();
37871				parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
37872				parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
37873			}
37874		}
37875
37876		// Subtract parent offsets and element margins
37877		return {
37878			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
37879			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
37880		};
37881	},
37882
37883	// This method will return documentElement in the following cases:
37884	// 1) For the element inside the iframe without offsetParent, this method will return
37885	//    documentElement of the parent window
37886	// 2) For the hidden or detached element
37887	// 3) For body or html element, i.e. in case of the html node - it will return itself
37888	//
37889	// but those exceptions were never presented as a real life use-cases
37890	// and might be considered as more preferable results.
37891	//
37892	// This logic, however, is not guaranteed and can change at any point in the future
37893	offsetParent: function() {
37894		return this.map( function() {
37895			var offsetParent = this.offsetParent;
37896
37897			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
37898				offsetParent = offsetParent.offsetParent;
37899			}
37900
37901			return offsetParent || documentElement;
37902		} );
37903	}
37904} );
37905
37906// Create scrollLeft and scrollTop methods
37907jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
37908	var top = "pageYOffset" === prop;
37909
37910	jQuery.fn[ method ] = function( val ) {
37911		return access( this, function( elem, method, val ) {
37912
37913			// Coalesce documents and windows
37914			var win;
37915			if ( isWindow( elem ) ) {
37916				win = elem;
37917			} else if ( elem.nodeType === 9 ) {
37918				win = elem.defaultView;
37919			}
37920
37921			if ( val === undefined ) {
37922				return win ? win[ prop ] : elem[ method ];
37923			}
37924
37925			if ( win ) {
37926				win.scrollTo(
37927					!top ? val : win.pageXOffset,
37928					top ? val : win.pageYOffset
37929				);
37930
37931			} else {
37932				elem[ method ] = val;
37933			}
37934		}, method, val, arguments.length );
37935	};
37936} );
37937
37938// Support: Safari <=7 - 9.1, Chrome <=37 - 49
37939// Add the top/left cssHooks using jQuery.fn.position
37940// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
37941// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
37942// getComputedStyle returns percent when specified for top/left/bottom/right;
37943// rather than make the css module depend on the offset module, just check for it here
37944jQuery.each( [ "top", "left" ], function( _i, prop ) {
37945	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
37946		function( elem, computed ) {
37947			if ( computed ) {
37948				computed = curCSS( elem, prop );
37949
37950				// If curCSS returns percentage, fallback to offset
37951				return rnumnonpx.test( computed ) ?
37952					jQuery( elem ).position()[ prop ] + "px" :
37953					computed;
37954			}
37955		}
37956	);
37957} );
37958
37959
37960// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
37961jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
37962	jQuery.each( {
37963		padding: "inner" + name,
37964		content: type,
37965		"": "outer" + name
37966	}, function( defaultExtra, funcName ) {
37967
37968		// Margin is only for outerHeight, outerWidth
37969		jQuery.fn[ funcName ] = function( margin, value ) {
37970			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
37971				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
37972
37973			return access( this, function( elem, type, value ) {
37974				var doc;
37975
37976				if ( isWindow( elem ) ) {
37977
37978					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
37979					return funcName.indexOf( "outer" ) === 0 ?
37980						elem[ "inner" + name ] :
37981						elem.document.documentElement[ "client" + name ];
37982				}
37983
37984				// Get document width or height
37985				if ( elem.nodeType === 9 ) {
37986					doc = elem.documentElement;
37987
37988					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
37989					// whichever is greatest
37990					return Math.max(
37991						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
37992						elem.body[ "offset" + name ], doc[ "offset" + name ],
37993						doc[ "client" + name ]
37994					);
37995				}
37996
37997				return value === undefined ?
37998
37999					// Get width or height on the element, requesting but not forcing parseFloat
38000					jQuery.css( elem, type, extra ) :
38001
38002					// Set width or height on the element
38003					jQuery.style( elem, type, value, extra );
38004			}, type, chainable ? margin : undefined, chainable );
38005		};
38006	} );
38007} );
38008
38009
38010jQuery.each( [
38011	"ajaxStart",
38012	"ajaxStop",
38013	"ajaxComplete",
38014	"ajaxError",
38015	"ajaxSuccess",
38016	"ajaxSend"
38017], function( _i, type ) {
38018	jQuery.fn[ type ] = function( fn ) {
38019		return this.on( type, fn );
38020	};
38021} );
38022
38023
38024
38025
38026jQuery.fn.extend( {
38027
38028	bind: function( types, data, fn ) {
38029		return this.on( types, null, data, fn );
38030	},
38031	unbind: function( types, fn ) {
38032		return this.off( types, null, fn );
38033	},
38034
38035	delegate: function( selector, types, data, fn ) {
38036		return this.on( types, selector, data, fn );
38037	},
38038	undelegate: function( selector, types, fn ) {
38039
38040		// ( namespace ) or ( selector, types [, fn] )
38041		return arguments.length === 1 ?
38042			this.off( selector, "**" ) :
38043			this.off( types, selector || "**", fn );
38044	},
38045
38046	hover: function( fnOver, fnOut ) {
38047		return this
38048			.on( "mouseenter", fnOver )
38049			.on( "mouseleave", fnOut || fnOver );
38050	}
38051} );
38052
38053jQuery.each(
38054	( "blur focus focusin focusout resize scroll click dblclick " +
38055	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
38056	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
38057	function( _i, name ) {
38058
38059		// Handle event binding
38060		jQuery.fn[ name ] = function( data, fn ) {
38061			return arguments.length > 0 ?
38062				this.on( name, null, data, fn ) :
38063				this.trigger( name );
38064		};
38065	}
38066);
38067
38068
38069
38070
38071// Support: Android <=4.0 only
38072// Make sure we trim BOM and NBSP
38073// Require that the "whitespace run" starts from a non-whitespace
38074// to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position.
38075var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;
38076
38077// Bind a function to a context, optionally partially applying any
38078// arguments.
38079// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
38080// However, it is not slated for removal any time soon
38081jQuery.proxy = function( fn, context ) {
38082	var tmp, args, proxy;
38083
38084	if ( typeof context === "string" ) {
38085		tmp = fn[ context ];
38086		context = fn;
38087		fn = tmp;
38088	}
38089
38090	// Quick check to determine if target is callable, in the spec
38091	// this throws a TypeError, but we will just return undefined.
38092	if ( !isFunction( fn ) ) {
38093		return undefined;
38094	}
38095
38096	// Simulated bind
38097	args = slice.call( arguments, 2 );
38098	proxy = function() {
38099		return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
38100	};
38101
38102	// Set the guid of unique handler to the same of original handler, so it can be removed
38103	proxy.guid = fn.guid = fn.guid || jQuery.guid++;
38104
38105	return proxy;
38106};
38107
38108jQuery.holdReady = function( hold ) {
38109	if ( hold ) {
38110		jQuery.readyWait++;
38111	} else {
38112		jQuery.ready( true );
38113	}
38114};
38115jQuery.isArray = Array.isArray;
38116jQuery.parseJSON = JSON.parse;
38117jQuery.nodeName = nodeName;
38118jQuery.isFunction = isFunction;
38119jQuery.isWindow = isWindow;
38120jQuery.camelCase = camelCase;
38121jQuery.type = toType;
38122
38123jQuery.now = Date.now;
38124
38125jQuery.isNumeric = function( obj ) {
38126
38127	// As of jQuery 3.0, isNumeric is limited to
38128	// strings and numbers (primitives or objects)
38129	// that can be coerced to finite numbers (gh-2662)
38130	var type = jQuery.type( obj );
38131	return ( type === "number" || type === "string" ) &&
38132
38133		// parseFloat NaNs numeric-cast false positives ("")
38134		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
38135		// subtraction forces infinities to NaN
38136		!isNaN( obj - parseFloat( obj ) );
38137};
38138
38139jQuery.trim = function( text ) {
38140	return text == null ?
38141		"" :
38142		( text + "" ).replace( rtrim, "$1" );
38143};
38144
38145
38146
38147// Register as a named AMD module, since jQuery can be concatenated with other
38148// files that may use define, but not via a proper concatenation script that
38149// understands anonymous AMD modules. A named AMD is safest and most robust
38150// way to register. Lowercase jquery is used because AMD module names are
38151// derived from file names, and jQuery is normally delivered in a lowercase
38152// file name. Do this after creating the global so that if an AMD module wants
38153// to call noConflict to hide this version of jQuery, it will work.
38154
38155// Note that for maximum portability, libraries that are not jQuery should
38156// declare themselves as anonymous modules, and avoid setting a global if an
38157// AMD loader is present. jQuery is a special case. For more information, see
38158// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
38159
38160if ( typeof define === "function" && define.amd ) {
38161	define( "jquery", [], function() {
38162		return jQuery;
38163	} );
38164}
38165
38166
38167
38168
38169var
38170
38171	// Map over jQuery in case of overwrite
38172	_jQuery = window.jQuery,
38173
38174	// Map over the $ in case of overwrite
38175	_$ = window.$;
38176
38177jQuery.noConflict = function( deep ) {
38178	if ( window.$ === jQuery ) {
38179		window.$ = _$;
38180	}
38181
38182	if ( deep && window.jQuery === jQuery ) {
38183		window.jQuery = _jQuery;
38184	}
38185
38186	return jQuery;
38187};
38188
38189// Expose jQuery and $ identifiers, even in AMD
38190// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557)
38191// and CommonJS for browser emulators (trac-13566)
38192if ( typeof noGlobal === "undefined" ) {
38193	window.jQuery = window.$ = jQuery;
38194}
38195
38196
38197
38198
38199return jQuery;
38200} );
38201
38202},{}],76:[function(require,module,exports){
38203arguments[4][39][0].apply(exports,arguments)
38204},{"dup":39,"get-size":68,"outlayer":79}],77:[function(require,module,exports){
vendor: 106,364 bytes, lines 38205-40545
38205(function (global, factory) {
38206    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
38207    typeof define === 'function' && define.amd ? define(['exports'], factory) :
38208    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.noUiSlider = {}));
38209})(this, (function (exports) { 'use strict';
38210
38211    exports.PipsMode = void 0;
38212    (function (PipsMode) {
38213        PipsMode["Range"] = "range";
38214        PipsMode["Steps"] = "steps";
38215        PipsMode["Positions"] = "positions";
38216        PipsMode["Count"] = "count";
38217        PipsMode["Values"] = "values";
38218    })(exports.PipsMode || (exports.PipsMode = {}));
38219    exports.PipsType = void 0;
38220    (function (PipsType) {
38221        PipsType[PipsType["None"] = -1] = "None";
38222        PipsType[PipsType["NoValue"] = 0] = "NoValue";
38223        PipsType[PipsType["LargeValue"] = 1] = "LargeValue";
38224        PipsType[PipsType["SmallValue"] = 2] = "SmallValue";
38225    })(exports.PipsType || (exports.PipsType = {}));
38226    //region Helper Methods
38227    function isValidFormatter(entry) {
38228        return isValidPartialFormatter(entry) && typeof entry.from === "function";
38229    }
38230    function isValidPartialFormatter(entry) {
38231        // partial formatters only need a to function and not a from function
38232        return typeof entry === "object" && typeof entry.to === "function";
38233    }
38234    function removeElement(el) {
38235        el.parentElement.removeChild(el);
38236    }
38237    function isSet(value) {
38238        return value !== null && value !== undefined;
38239    }
38240    // Bindable version
38241    function preventDefault(e) {
38242        e.preventDefault();
38243    }
38244    // Removes duplicates from an array.
38245    function unique(array) {
38246        return array.filter(function (a) {
38247            return !this[a] ? (this[a] = true) : false;
38248        }, {});
38249    }
38250    // Round a value to the closest 'to'.
38251    function closest(value, to) {
38252        return Math.round(value / to) * to;
38253    }
38254    // Current position of an element relative to the document.
38255    function offset(elem, orientation) {
38256        var rect = elem.getBoundingClientRect();
38257        var doc = elem.ownerDocument;
38258        var docElem = doc.documentElement;
38259        var pageOffset = getPageOffset(doc);
38260        // getBoundingClientRect contains left scroll in Chrome on Android.
38261        // I haven't found a feature detection that proves this. Worst case
38262        // scenario on mis-match: the 'tap' feature on horizontal sliders breaks.
38263        if (/webkit.*Chrome.*Mobile/i.test(navigator.userAgent)) {
38264            pageOffset.x = 0;
38265        }
38266        return orientation ? rect.top + pageOffset.y - docElem.clientTop : rect.left + pageOffset.x - docElem.clientLeft;
38267    }
38268    // Checks whether a value is numerical.
38269    function isNumeric(a) {
38270        return typeof a === "number" && !isNaN(a) && isFinite(a);
38271    }
38272    // Sets a class and removes it after [duration] ms.
38273    function addClassFor(element, className, duration) {
38274        if (duration > 0) {
38275            addClass(element, className);
38276            setTimeout(function () {
38277                removeClass(element, className);
38278            }, duration);
38279        }
38280    }
38281    // Limits a value to 0 - 100
38282    function limit(a) {
38283        return Math.max(Math.min(a, 100), 0);
38284    }
38285    // Wraps a variable as an array, if it isn't one yet.
38286    // Note that an input array is returned by reference!
38287    function asArray(a) {
38288        return Array.isArray(a) ? a : [a];
38289    }
38290    // Counts decimals
38291    function countDecimals(numStr) {
38292        numStr = String(numStr);
38293        var pieces = numStr.split(".");
38294        return pieces.length > 1 ? pieces[1].length : 0;
38295    }
38296    // http://youmightnotneedjquery.com/#add_class
38297    function addClass(el, className) {
38298        if (el.classList && !/\s/.test(className)) {
38299            el.classList.add(className);
38300        }
38301        else {
38302            el.className += " " + className;
38303        }
38304    }
38305    // http://youmightnotneedjquery.com/#remove_class
38306    function removeClass(el, className) {
38307        if (el.classList && !/\s/.test(className)) {
38308            el.classList.remove(className);
38309        }
38310        else {
38311            el.className = el.className.replace(new RegExp("(^|\\b)" + className.split(" ").join("|") + "(\\b|$)", "gi"), " ");
38312        }
38313    }
38314    // https://plainjs.com/javascript/attributes/adding-removing-and-testing-for-classes-9/
38315    function hasClass(el, className) {
38316        return el.classList ? el.classList.contains(className) : new RegExp("\\b" + className + "\\b").test(el.className);
38317    }
38318    // https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollY#Notes
38319    function getPageOffset(doc) {
38320        var supportPageOffset = window.pageXOffset !== undefined;
38321        var isCSS1Compat = (doc.compatMode || "") === "CSS1Compat";
38322        var x = supportPageOffset
38323            ? window.pageXOffset
38324            : isCSS1Compat
38325                ? doc.documentElement.scrollLeft
38326                : doc.body.scrollLeft;
38327        var y = supportPageOffset
38328            ? window.pageYOffset
38329            : isCSS1Compat
38330                ? doc.documentElement.scrollTop
38331                : doc.body.scrollTop;
38332        return {
38333            x: x,
38334            y: y,
38335        };
38336    }
38337    // we provide a function to compute constants instead
38338    // of accessing window.* as soon as the module needs it
38339    // so that we do not compute anything if not needed
38340    function getActions() {
38341        // Determine the events to bind. IE11 implements pointerEvents without
38342        // a prefix, which breaks compatibility with the IE10 implementation.
38343        return window.navigator.pointerEnabled
38344            ? {
38345                start: "pointerdown",
38346                move: "pointermove",
38347                end: "pointerup",
38348            }
38349            : window.navigator.msPointerEnabled
38350                ? {
38351                    start: "MSPointerDown",
38352                    move: "MSPointerMove",
38353                    end: "MSPointerUp",
38354                }
38355                : {
38356                    start: "mousedown touchstart",
38357                    move: "mousemove touchmove",
38358                    end: "mouseup touchend",
38359                };
38360    }
38361    // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md
38362    // Issue #785
38363    function getSupportsPassive() {
38364        var supportsPassive = false;
38365        /* eslint-disable */
38366        try {
38367            var opts = Object.defineProperty({}, "passive", {
38368                get: function () {
38369                    supportsPassive = true;
38370                },
38371            });
38372            // @ts-ignore
38373            window.addEventListener("test", null, opts);
38374        }
38375        catch (e) { }
38376        /* eslint-enable */
38377        return supportsPassive;
38378    }
38379    function getSupportsTouchActionNone() {
38380        return window.CSS && CSS.supports && CSS.supports("touch-action", "none");
38381    }
38382    //endregion
38383    //region Range Calculation
38384    // Determine the size of a sub-range in relation to a full range.
38385    function subRangeRatio(pa, pb) {
38386        return 100 / (pb - pa);
38387    }
38388    // (percentage) How many percent is this value of this range?
38389    function fromPercentage(range, value, startRange) {
38390        return (value * 100) / (range[startRange + 1] - range[startRange]);
38391    }
38392    // (percentage) Where is this value on this range?
38393    function toPercentage(range, value) {
38394        return fromPercentage(range, range[0] < 0 ? value + Math.abs(range[0]) : value - range[0], 0);
38395    }
38396    // (value) How much is this percentage on this range?
38397    function isPercentage(range, value) {
38398        return (value * (range[1] - range[0])) / 100 + range[0];
38399    }
38400    function getJ(value, arr) {
38401        var j = 1;
38402        while (value >= arr[j]) {
38403            j += 1;
38404        }
38405        return j;
38406    }
38407    // (percentage) Input a value, find where, on a scale of 0-100, it applies.
38408    function toStepping(xVal, xPct, value) {
38409        if (value >= xVal.slice(-1)[0]) {
38410            return 100;
38411        }
38412        var j = getJ(value, xVal);
38413        var va = xVal[j - 1];
38414        var vb = xVal[j];
38415        var pa = xPct[j - 1];
38416        var pb = xPct[j];
38417        return pa + toPercentage([va, vb], value) / subRangeRatio(pa, pb);
38418    }
38419    // (value) Input a percentage, find where it is on the specified range.
38420    function fromStepping(xVal, xPct, value) {
38421        // There is no range group that fits 100
38422        if (value >= 100) {
38423            return xVal.slice(-1)[0];
38424        }
38425        var j = getJ(value, xPct);
38426        var va = xVal[j - 1];
38427        var vb = xVal[j];
38428        var pa = xPct[j - 1];
38429        var pb = xPct[j];
38430        return isPercentage([va, vb], (value - pa) * subRangeRatio(pa, pb));
38431    }
38432    // (percentage) Get the step that applies at a certain value.
38433    function getStep(xPct, xSteps, snap, value) {
38434        if (value === 100) {
38435            return value;
38436        }
38437        var j = getJ(value, xPct);
38438        var a = xPct[j - 1];
38439        var b = xPct[j];
38440        // If 'snap' is set, steps are used as fixed points on the slider.
38441        if (snap) {
38442            // Find the closest position, a or b.
38443            if (value - a > (b - a) / 2) {
38444                return b;
38445            }
38446            return a;
38447        }
38448        if (!xSteps[j - 1]) {
38449            return value;
38450        }
38451        return xPct[j - 1] + closest(value - xPct[j - 1], xSteps[j - 1]);
38452    }
38453    //endregion
38454    //region Spectrum
38455    var Spectrum = /** @class */ (function () {
38456        function Spectrum(entry, snap, singleStep) {
38457            this.xPct = [];
38458            this.xVal = [];
38459            this.xSteps = [];
38460            this.xNumSteps = [];
38461            this.xHighestCompleteStep = [];
38462            this.xSteps = [singleStep || false];
38463            this.xNumSteps = [false];
38464            this.snap = snap;
38465            var index;
38466            var ordered = [];
38467            // Map the object keys to an array.
38468            Object.keys(entry).forEach(function (index) {
38469                ordered.push([asArray(entry[index]), index]);
38470            });
38471            // Sort all entries by value (numeric sort).
38472            ordered.sort(function (a, b) {
38473                return a[0][0] - b[0][0];
38474            });
38475            // Convert all entries to subranges.
38476            for (index = 0; index < ordered.length; index++) {
38477                this.handleEntryPoint(ordered[index][1], ordered[index][0]);
38478            }
38479            // Store the actual step values.
38480            // xSteps is sorted in the same order as xPct and xVal.
38481            this.xNumSteps = this.xSteps.slice(0);
38482            // Convert all numeric steps to the percentage of the subrange they represent.
38483            for (index = 0; index < this.xNumSteps.length; index++) {
38484                this.handleStepPoint(index, this.xNumSteps[index]);
38485            }
38486        }
38487        Spectrum.prototype.getDistance = function (value) {
38488            var distances = [];
38489            for (var index = 0; index < this.xNumSteps.length - 1; index++) {
38490                distances[index] = fromPercentage(this.xVal, value, index);
38491            }
38492            return distances;
38493        };
38494        // Calculate the percentual distance over the whole scale of ranges.
38495        // direction: 0 = backwards / 1 = forwards
38496        Spectrum.prototype.getAbsoluteDistance = function (value, distances, direction) {
38497            var xPct_index = 0;
38498            // Calculate range where to start calculation
38499            if (value < this.xPct[this.xPct.length - 1]) {
38500                while (value > this.xPct[xPct_index + 1]) {
38501                    xPct_index++;
38502                }
38503            }
38504            else if (value === this.xPct[this.xPct.length - 1]) {
38505                xPct_index = this.xPct.length - 2;
38506            }
38507            // If looking backwards and the value is exactly at a range separator then look one range further
38508            if (!direction && value === this.xPct[xPct_index + 1]) {
38509                xPct_index++;
38510            }
38511            if (distances === null) {
38512                distances = [];
38513            }
38514            var start_factor;
38515            var rest_factor = 1;
38516            var rest_rel_distance = distances[xPct_index];
38517            var range_pct = 0;
38518            var rel_range_distance = 0;
38519            var abs_distance_counter = 0;
38520            var range_counter = 0;
38521            // Calculate what part of the start range the value is
38522            if (direction) {
38523                start_factor = (value - this.xPct[xPct_index]) / (this.xPct[xPct_index + 1] - this.xPct[xPct_index]);
38524            }
38525            else {
38526                start_factor = (this.xPct[xPct_index + 1] - value) / (this.xPct[xPct_index + 1] - this.xPct[xPct_index]);
38527            }
38528            // Do until the complete distance across ranges is calculated
38529            while (rest_rel_distance > 0) {
38530                // Calculate the percentage of total range
38531                range_pct = this.xPct[xPct_index + 1 + range_counter] - this.xPct[xPct_index + range_counter];
38532                // Detect if the margin, padding or limit is larger then the current range and calculate
38533                if (distances[xPct_index + range_counter] * rest_factor + 100 - start_factor * 100 > 100) {
38534                    // If larger then take the percentual distance of the whole range
38535                    rel_range_distance = range_pct * start_factor;
38536                    // Rest factor of relative percentual distance still to be calculated
38537                    rest_factor = (rest_rel_distance - 100 * start_factor) / distances[xPct_index + range_counter];
38538                    // Set start factor to 1 as for next range it does not apply.
38539                    start_factor = 1;
38540                }
38541                else {
38542                    // If smaller or equal then take the percentual distance of the calculate percentual part of that range
38543                    rel_range_distance = ((distances[xPct_index + range_counter] * range_pct) / 100) * rest_factor;
38544                    // No rest left as the rest fits in current range
38545                    rest_factor = 0;
38546                }
38547                if (direction) {
38548                    abs_distance_counter = abs_distance_counter - rel_range_distance;
38549                    // Limit range to first range when distance becomes outside of minimum range
38550                    if (this.xPct.length + range_counter >= 1) {
38551                        range_counter--;
38552                    }
38553                }
38554                else {
38555                    abs_distance_counter = abs_distance_counter + rel_range_distance;
38556                    // Limit range to last range when distance becomes outside of maximum range
38557                    if (this.xPct.length - range_counter >= 1) {
38558                        range_counter++;
38559                    }
38560                }
38561                // Rest of relative percentual distance still to be calculated
38562                rest_rel_distance = distances[xPct_index + range_counter] * rest_factor;
38563            }
38564            return value + abs_distance_counter;
38565        };
38566        Spectrum.prototype.toStepping = function (value) {
38567            value = toStepping(this.xVal, this.xPct, value);
38568            return value;
38569        };
38570        Spectrum.prototype.fromStepping = function (value) {
38571            return fromStepping(this.xVal, this.xPct, value);
38572        };
38573        Spectrum.prototype.getStep = function (value) {
38574            value = getStep(this.xPct, this.xSteps, this.snap, value);
38575            return value;
38576        };
38577        Spectrum.prototype.getDefaultStep = function (value, isDown, size) {
38578            var j = getJ(value, this.xPct);
38579            // When at the top or stepping down, look at the previous sub-range
38580            if (value === 100 || (isDown && value === this.xPct[j - 1])) {
38581                j = Math.max(j - 1, 1);
38582            }
38583            return (this.xVal[j] - this.xVal[j - 1]) / size;
38584        };
38585        Spectrum.prototype.getNearbySteps = function (value) {
38586            var j = getJ(value, this.xPct);
38587            return {
38588                stepBefore: {
38589                    startValue: this.xVal[j - 2],
38590                    step: this.xNumSteps[j - 2],
38591                    highestStep: this.xHighestCompleteStep[j - 2],
38592                },
38593                thisStep: {
38594                    startValue: this.xVal[j - 1],
38595                    step: this.xNumSteps[j - 1],
38596                    highestStep: this.xHighestCompleteStep[j - 1],
38597                },
38598                stepAfter: {
38599                    startValue: this.xVal[j],
38600                    step: this.xNumSteps[j],
38601                    highestStep: this.xHighestCompleteStep[j],
38602                },
38603            };
38604        };
38605        Spectrum.prototype.countStepDecimals = function () {
38606            var stepDecimals = this.xNumSteps.map(countDecimals);
38607            return Math.max.apply(null, stepDecimals);
38608        };
38609        Spectrum.prototype.hasNoSize = function () {
38610            return this.xVal[0] === this.xVal[this.xVal.length - 1];
38611        };
38612        // Outside testing
38613        Spectrum.prototype.convert = function (value) {
38614            return this.getStep(this.toStepping(value));
38615        };
38616        Spectrum.prototype.handleEntryPoint = function (index, value) {
38617            var percentage;
38618            // Covert min/max syntax to 0 and 100.
38619            if (index === "min") {
38620                percentage = 0;
38621            }
38622            else if (index === "max") {
38623                percentage = 100;
38624            }
38625            else {
38626                percentage = parseFloat(index);
38627            }
38628            // Check for correct input.
38629            if (!isNumeric(percentage) || !isNumeric(value[0])) {
38630                throw new Error("noUiSlider: 'range' value isn't numeric.");
38631            }
38632            // Store values.
38633            this.xPct.push(percentage);
38634            this.xVal.push(value[0]);
38635            var value1 = Number(value[1]);
38636            // NaN will evaluate to false too, but to keep
38637            // logging clear, set step explicitly. Make sure
38638            // not to override the 'step' setting with false.
38639            if (!percentage) {
38640                if (!isNaN(value1)) {
38641                    this.xSteps[0] = value1;
38642                }
38643            }
38644            else {
38645                this.xSteps.push(isNaN(value1) ? false : value1);
38646            }
38647            this.xHighestCompleteStep.push(0);
38648        };
38649        Spectrum.prototype.handleStepPoint = function (i, n) {
38650            // Ignore 'false' stepping.
38651            if (!n) {
38652                return;
38653            }
38654            // Step over zero-length ranges (#948);
38655            if (this.xVal[i] === this.xVal[i + 1]) {
38656                this.xSteps[i] = this.xHighestCompleteStep[i] = this.xVal[i];
38657                return;
38658            }
38659            // Factor to range ratio
38660            this.xSteps[i] =
38661                fromPercentage([this.xVal[i], this.xVal[i + 1]], n, 0) / subRangeRatio(this.xPct[i], this.xPct[i + 1]);
38662            var totalSteps = (this.xVal[i + 1] - this.xVal[i]) / this.xNumSteps[i];
38663            var highestStep = Math.ceil(Number(totalSteps.toFixed(3)) - 1);
38664            var step = this.xVal[i] + this.xNumSteps[i] * highestStep;
38665            this.xHighestCompleteStep[i] = step;
38666        };
38667        return Spectrum;
38668    }());
38669    //endregion
38670    //region Options
38671    /*	Every input option is tested and parsed. This will prevent
38672        endless validation in internal methods. These tests are
38673        structured with an item for every option available. An
38674        option can be marked as required by setting the 'r' flag.
38675        The testing function is provided with three arguments:
38676            - The provided value for the option;
38677            - A reference to the options object;
38678            - The name for the option;
38679
38680        The testing function returns false when an error is detected,
38681        or true when everything is OK. It can also modify the option
38682        object, to make sure all values can be correctly looped elsewhere. */
38683    //region Defaults
38684    var defaultFormatter = {
38685        to: function (value) {
38686            return value === undefined ? "" : value.toFixed(2);
38687        },
38688        from: Number,
38689    };
38690    var cssClasses = {
38691        target: "target",
38692        base: "base",
38693        origin: "origin",
38694        handle: "handle",
38695        handleLower: "handle-lower",
38696        handleUpper: "handle-upper",
38697        touchArea: "touch-area",
38698        horizontal: "horizontal",
38699        vertical: "vertical",
38700        background: "background",
38701        connect: "connect",
38702        connects: "connects",
38703        ltr: "ltr",
38704        rtl: "rtl",
38705        textDirectionLtr: "txt-dir-ltr",
38706        textDirectionRtl: "txt-dir-rtl",
38707        draggable: "draggable",
38708        drag: "state-drag",
38709        tap: "state-tap",
38710        active: "active",
38711        tooltip: "tooltip",
38712        pips: "pips",
38713        pipsHorizontal: "pips-horizontal",
38714        pipsVertical: "pips-vertical",
38715        marker: "marker",
38716        markerHorizontal: "marker-horizontal",
38717        markerVertical: "marker-vertical",
38718        markerNormal: "marker-normal",
38719        markerLarge: "marker-large",
38720        markerSub: "marker-sub",
38721        value: "value",
38722        valueHorizontal: "value-horizontal",
38723        valueVertical: "value-vertical",
38724        valueNormal: "value-normal",
38725        valueLarge: "value-large",
38726        valueSub: "value-sub",
38727    };
38728    // Namespaces of internal event listeners
38729    var INTERNAL_EVENT_NS = {
38730        tooltips: ".__tooltips",
38731        aria: ".__aria",
38732    };
38733    //endregion
38734    function testStep(parsed, entry) {
38735        if (!isNumeric(entry)) {
38736            throw new Error("noUiSlider: 'step' is not numeric.");
38737        }
38738        // The step option can still be used to set stepping
38739        // for linear sliders. Overwritten if set in 'range'.
38740        parsed.singleStep = entry;
38741    }
38742    function testKeyboardPageMultiplier(parsed, entry) {
38743        if (!isNumeric(entry)) {
38744            throw new Error("noUiSlider: 'keyboardPageMultiplier' is not numeric.");
38745        }
38746        parsed.keyboardPageMultiplier = entry;
38747    }
38748    function testKeyboardMultiplier(parsed, entry) {
38749        if (!isNumeric(entry)) {
38750            throw new Error("noUiSlider: 'keyboardMultiplier' is not numeric.");
38751        }
38752        parsed.keyboardMultiplier = entry;
38753    }
38754    function testKeyboardDefaultStep(parsed, entry) {
38755        if (!isNumeric(entry)) {
38756            throw new Error("noUiSlider: 'keyboardDefaultStep' is not numeric.");
38757        }
38758        parsed.keyboardDefaultStep = entry;
38759    }
38760    function testRange(parsed, entry) {
38761        // Filter incorrect input.
38762        if (typeof entry !== "object" || Array.isArray(entry)) {
38763            throw new Error("noUiSlider: 'range' is not an object.");
38764        }
38765        // Catch missing start or end.
38766        if (entry.min === undefined || entry.max === undefined) {
38767            throw new Error("noUiSlider: Missing 'min' or 'max' in 'range'.");
38768        }
38769        parsed.spectrum = new Spectrum(entry, parsed.snap || false, parsed.singleStep);
38770    }
38771    function testStart(parsed, entry) {
38772        entry = asArray(entry);
38773        // Validate input. Values aren't tested, as the public .val method
38774        // will always provide a valid location.
38775        if (!Array.isArray(entry) || !entry.length) {
38776            throw new Error("noUiSlider: 'start' option is incorrect.");
38777        }
38778        // Store the number of handles.
38779        parsed.handles = entry.length;
38780        // When the slider is initialized, the .val method will
38781        // be called with the start options.
38782        parsed.start = entry;
38783    }
38784    function testSnap(parsed, entry) {
38785        if (typeof entry !== "boolean") {
38786            throw new Error("noUiSlider: 'snap' option must be a boolean.");
38787        }
38788        // Enforce 100% stepping within subranges.
38789        parsed.snap = entry;
38790    }
38791    function testAnimate(parsed, entry) {
38792        if (typeof entry !== "boolean") {
38793            throw new Error("noUiSlider: 'animate' option must be a boolean.");
38794        }
38795        // Enforce 100% stepping within subranges.
38796        parsed.animate = entry;
38797    }
38798    function testAnimationDuration(parsed, entry) {
38799        if (typeof entry !== "number") {
38800            throw new Error("noUiSlider: 'animationDuration' option must be a number.");
38801        }
38802        parsed.animationDuration = entry;
38803    }
38804    function testConnect(parsed, entry) {
38805        var connect = [false];
38806        var i;
38807        // Map legacy options
38808        if (entry === "lower") {
38809            entry = [true, false];
38810        }
38811        else if (entry === "upper") {
38812            entry = [false, true];
38813        }
38814        // Handle boolean options
38815        if (entry === true || entry === false) {
38816            for (i = 1; i < parsed.handles; i++) {
38817                connect.push(entry);
38818            }
38819            connect.push(false);
38820        }
38821        // Reject invalid input
38822        else if (!Array.isArray(entry) || !entry.length || entry.length !== parsed.handles + 1) {
38823            throw new Error("noUiSlider: 'connect' option doesn't match handle count.");
38824        }
38825        else {
38826            connect = entry;
38827        }
38828        parsed.connect = connect;
38829    }
38830    function testOrientation(parsed, entry) {
38831        // Set orientation to an a numerical value for easy
38832        // array selection.
38833        switch (entry) {
38834            case "horizontal":
38835                parsed.ort = 0;
38836                break;
38837            case "vertical":
38838                parsed.ort = 1;
38839                break;
38840            default:
38841                throw new Error("noUiSlider: 'orientation' option is invalid.");
38842        }
38843    }
38844    function testMargin(parsed, entry) {
38845        if (!isNumeric(entry)) {
38846            throw new Error("noUiSlider: 'margin' option must be numeric.");
38847        }
38848        // Issue #582
38849        if (entry === 0) {
38850            return;
38851        }
38852        parsed.margin = parsed.spectrum.getDistance(entry);
38853    }
38854    function testLimit(parsed, entry) {
38855        if (!isNumeric(entry)) {
38856            throw new Error("noUiSlider: 'limit' option must be numeric.");
38857        }
38858        parsed.limit = parsed.spectrum.getDistance(entry);
38859        if (!parsed.limit || parsed.handles < 2) {
38860            throw new Error("noUiSlider: 'limit' option is only supported on linear sliders with 2 or more handles.");
38861        }
38862    }
38863    function testPadding(parsed, entry) {
38864        var index;
38865        if (!isNumeric(entry) && !Array.isArray(entry)) {
38866            throw new Error("noUiSlider: 'padding' option must be numeric or array of exactly 2 numbers.");
38867        }
38868        if (Array.isArray(entry) && !(entry.length === 2 || isNumeric(entry[0]) || isNumeric(entry[1]))) {
38869            throw new Error("noUiSlider: 'padding' option must be numeric or array of exactly 2 numbers.");
38870        }
38871        if (entry === 0) {
38872            return;
38873        }
38874        if (!Array.isArray(entry)) {
38875            entry = [entry, entry];
38876        }
38877        // 'getDistance' returns false for invalid values.
38878        parsed.padding = [parsed.spectrum.getDistance(entry[0]), parsed.spectrum.getDistance(entry[1])];
38879        for (index = 0; index < parsed.spectrum.xNumSteps.length - 1; index++) {
38880            // last "range" can't contain step size as it is purely an endpoint.
38881            if (parsed.padding[0][index] < 0 || parsed.padding[1][index] < 0) {
38882                throw new Error("noUiSlider: 'padding' option must be a positive number(s).");
38883            }
38884        }
38885        var totalPadding = entry[0] + entry[1];
38886        var firstValue = parsed.spectrum.xVal[0];
38887        var lastValue = parsed.spectrum.xVal[parsed.spectrum.xVal.length - 1];
38888        if (totalPadding / (lastValue - firstValue) > 1) {
38889            throw new Error("noUiSlider: 'padding' option must not exceed 100% of the range.");
38890        }
38891    }
38892    function testDirection(parsed, entry) {
38893        // Set direction as a numerical value for easy parsing.
38894        // Invert connection for RTL sliders, so that the proper
38895        // handles get the connect/background classes.
38896        switch (entry) {
38897            case "ltr":
38898                parsed.dir = 0;
38899                break;
38900            case "rtl":
38901                parsed.dir = 1;
38902                break;
38903            default:
38904                throw new Error("noUiSlider: 'direction' option was not recognized.");
38905        }
38906    }
38907    function testBehaviour(parsed, entry) {
38908        // Make sure the input is a string.
38909        if (typeof entry !== "string") {
38910            throw new Error("noUiSlider: 'behaviour' must be a string containing options.");
38911        }
38912        // Check if the string contains any keywords.
38913        // None are required.
38914        var tap = entry.indexOf("tap") >= 0;
38915        var drag = entry.indexOf("drag") >= 0;
38916        var fixed = entry.indexOf("fixed") >= 0;
38917        var snap = entry.indexOf("snap") >= 0;
38918        var hover = entry.indexOf("hover") >= 0;
38919        var unconstrained = entry.indexOf("unconstrained") >= 0;
38920        var invertConnects = entry.indexOf("invert-connects") >= 0;
38921        var dragAll = entry.indexOf("drag-all") >= 0;
38922        var smoothSteps = entry.indexOf("smooth-steps") >= 0;
38923        if (fixed) {
38924            if (parsed.handles !== 2) {
38925                throw new Error("noUiSlider: 'fixed' behaviour must be used with 2 handles");
38926            }
38927            // Use margin to enforce fixed state
38928            testMargin(parsed, parsed.start[1] - parsed.start[0]);
38929        }
38930        if (invertConnects && parsed.handles !== 2) {
38931            throw new Error("noUiSlider: 'invert-connects' behaviour must be used with 2 handles");
38932        }
38933        if (unconstrained && (parsed.margin || parsed.limit)) {
38934            throw new Error("noUiSlider: 'unconstrained' behaviour cannot be used with margin or limit");
38935        }
38936        parsed.events = {
38937            tap: tap || snap,
38938            drag: drag,
38939            dragAll: dragAll,
38940            smoothSteps: smoothSteps,
38941            fixed: fixed,
38942            snap: snap,
38943            hover: hover,
38944            unconstrained: unconstrained,
38945            invertConnects: invertConnects,
38946        };
38947    }
38948    function testTooltips(parsed, entry) {
38949        if (entry === false) {
38950            return;
38951        }
38952        if (entry === true || isValidPartialFormatter(entry)) {
38953            parsed.tooltips = [];
38954            for (var i = 0; i < parsed.handles; i++) {
38955                parsed.tooltips.push(entry);
38956            }
38957        }
38958        else {
38959            entry = asArray(entry);
38960            if (entry.length !== parsed.handles) {
38961                throw new Error("noUiSlider: must pass a formatter for all handles.");
38962            }
38963            entry.forEach(function (formatter) {
38964                if (typeof formatter !== "boolean" && !isValidPartialFormatter(formatter)) {
38965                    throw new Error("noUiSlider: 'tooltips' must be passed a formatter or 'false'.");
38966                }
38967            });
38968            parsed.tooltips = entry;
38969        }
38970    }
38971    function testHandleAttributes(parsed, entry) {
38972        if (entry.length !== parsed.handles) {
38973            throw new Error("noUiSlider: must pass a attributes for all handles.");
38974        }
38975        parsed.handleAttributes = entry;
38976    }
38977    function testAriaFormat(parsed, entry) {
38978        if (!isValidPartialFormatter(entry)) {
38979            throw new Error("noUiSlider: 'ariaFormat' requires 'to' method.");
38980        }
38981        parsed.ariaFormat = entry;
38982    }
38983    function testFormat(parsed, entry) {
38984        if (!isValidFormatter(entry)) {
38985            throw new Error("noUiSlider: 'format' requires 'to' and 'from' methods.");
38986        }
38987        parsed.format = entry;
38988    }
38989    function testKeyboardSupport(parsed, entry) {
38990        if (typeof entry !== "boolean") {
38991            throw new Error("noUiSlider: 'keyboardSupport' option must be a boolean.");
38992        }
38993        parsed.keyboardSupport = entry;
38994    }
38995    function testDocumentElement(parsed, entry) {
38996        // This is an advanced option. Passed values are used without validation.
38997        parsed.documentElement = entry;
38998    }
38999    function testCssPrefix(parsed, entry) {
39000        if (typeof entry !== "string" && entry !== false) {
39001            throw new Error("noUiSlider: 'cssPrefix' must be a string or `false`.");
39002        }
39003        parsed.cssPrefix = entry;
39004    }
39005    function testCssClasses(parsed, entry) {
39006        if (typeof entry !== "object") {
39007            throw new Error("noUiSlider: 'cssClasses' must be an object.");
39008        }
39009        if (typeof parsed.cssPrefix === "string") {
39010            parsed.cssClasses = {};
39011            Object.keys(entry).forEach(function (key) {
39012                parsed.cssClasses[key] = parsed.cssPrefix + entry[key];
39013            });
39014        }
39015        else {
39016            parsed.cssClasses = entry;
39017        }
39018    }
39019    // Test all developer settings and parse to assumption-safe values.
39020    function testOptions(options) {
39021        // To prove a fix for #537, freeze options here.
39022        // If the object is modified, an error will be thrown.
39023        // Object.freeze(options);
39024        var parsed = {
39025            margin: null,
39026            limit: null,
39027            padding: null,
39028            animate: true,
39029            animationDuration: 300,
39030            ariaFormat: defaultFormatter,
39031            format: defaultFormatter,
39032        };
39033        // Tests are executed in the order they are presented here.
39034        var tests = {
39035            step: { r: false, t: testStep },
39036            keyboardPageMultiplier: { r: false, t: testKeyboardPageMultiplier },
39037            keyboardMultiplier: { r: false, t: testKeyboardMultiplier },
39038            keyboardDefaultStep: { r: false, t: testKeyboardDefaultStep },
39039            start: { r: true, t: testStart },
39040            connect: { r: true, t: testConnect },
39041            direction: { r: true, t: testDirection },
39042            snap: { r: false, t: testSnap },
39043            animate: { r: false, t: testAnimate },
39044            animationDuration: { r: false, t: testAnimationDuration },
39045            range: { r: true, t: testRange },
39046            orientation: { r: false, t: testOrientation },
39047            margin: { r: false, t: testMargin },
39048            limit: { r: false, t: testLimit },
39049            padding: { r: false, t: testPadding },
39050            behaviour: { r: true, t: testBehaviour },
39051            ariaFormat: { r: false, t: testAriaFormat },
39052            format: { r: false, t: testFormat },
39053            tooltips: { r: false, t: testTooltips },
39054            keyboardSupport: { r: true, t: testKeyboardSupport },
39055            documentElement: { r: false, t: testDocumentElement },
39056            cssPrefix: { r: true, t: testCssPrefix },
39057            cssClasses: { r: true, t: testCssClasses },
39058            handleAttributes: { r: false, t: testHandleAttributes },
39059        };
39060        var defaults = {
39061            connect: false,
39062            direction: "ltr",
39063            behaviour: "tap",
39064            orientation: "horizontal",
39065            keyboardSupport: true,
39066            cssPrefix: "noUi-",
39067            cssClasses: cssClasses,
39068            keyboardPageMultiplier: 5,
39069            keyboardMultiplier: 1,
39070            keyboardDefaultStep: 10,
39071        };
39072        // AriaFormat defaults to regular format, if any.
39073        if (options.format && !options.ariaFormat) {
39074            options.ariaFormat = options.format;
39075        }
39076        // Run all options through a testing mechanism to ensure correct
39077        // input. It should be noted that options might get modified to
39078        // be handled properly. E.g. wrapping integers in arrays.
39079        Object.keys(tests).forEach(function (name) {
39080            // If the option isn't set, but it is required, throw an error.
39081            if (!isSet(options[name]) && defaults[name] === undefined) {
39082                if (tests[name].r) {
39083                    throw new Error("noUiSlider: '" + name + "' is required.");
39084                }
39085                return;
39086            }
39087            tests[name].t(parsed, !isSet(options[name]) ? defaults[name] : options[name]);
39088        });
39089        // Forward pips options
39090        parsed.pips = options.pips;
39091        // All recent browsers accept unprefixed transform.
39092        // We need -ms- for IE9 and -webkit- for older Android;
39093        // Assume use of -webkit- if unprefixed and -ms- are not supported.
39094        // https://caniuse.com/#feat=transforms2d
39095        var d = document.createElement("div");
39096        var msPrefix = d.style.msTransform !== undefined;
39097        var noPrefix = d.style.transform !== undefined;
39098        parsed.transformRule = noPrefix ? "transform" : msPrefix ? "msTransform" : "webkitTransform";
39099        // Pips don't move, so we can place them using left/top.
39100        var styles = [
39101            ["left", "top"],
39102            ["right", "bottom"],
39103        ];
39104        parsed.style = styles[parsed.dir][parsed.ort];
39105        return parsed;
39106    }
39107    //endregion
39108    function scope(target, options, originalOptions) {
39109        var actions = getActions();
39110        var supportsTouchActionNone = getSupportsTouchActionNone();
39111        var supportsPassive = supportsTouchActionNone && getSupportsPassive();
39112        // All variables local to 'scope' are prefixed with 'scope_'
39113        // Slider DOM Nodes
39114        var scope_Target = target;
39115        var scope_Base;
39116        var scope_ConnectBase;
39117        var scope_Handles;
39118        var scope_Connects;
39119        var scope_Pips;
39120        var scope_Tooltips;
39121        // Slider state values
39122        var scope_Spectrum = options.spectrum;
39123        var scope_Values = [];
39124        var scope_Locations = [];
39125        var scope_HandleNumbers = [];
39126        var scope_ActiveHandlesCount = 0;
39127        var scope_Events = {};
39128        var scope_ConnectsInverted = false;
39129        // Document Nodes
39130        var scope_Document = target.ownerDocument;
39131        var scope_DocumentElement = options.documentElement || scope_Document.documentElement;
39132        var scope_Body = scope_Document.body;
39133        // For horizontal sliders in standard ltr documents,
39134        // make .noUi-origin overflow to the left so the document doesn't scroll.
39135        var scope_DirOffset = scope_Document.dir === "rtl" || options.ort === 1 ? 0 : 100;
39136        // Creates a node, adds it to target, returns the new node.
39137        function addNodeTo(addTarget, className) {
39138            var div = scope_Document.createElement("div");
39139            if (className) {
39140                addClass(div, className);
39141            }
39142            addTarget.appendChild(div);
39143            return div;
39144        }
39145        // Append a origin to the base
39146        function addOrigin(base, handleNumber) {
39147            var origin = addNodeTo(base, options.cssClasses.origin);
39148            var handle = addNodeTo(origin, options.cssClasses.handle);
39149            addNodeTo(handle, options.cssClasses.touchArea);
39150            handle.setAttribute("data-handle", String(handleNumber));
39151            if (options.keyboardSupport) {
39152                // https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex
39153                // 0 = focusable and reachable
39154                handle.setAttribute("tabindex", "0");
39155                handle.addEventListener("keydown", function (event) {
39156                    return eventKeydown(event, handleNumber);
39157                });
39158            }
39159            if (options.handleAttributes !== undefined) {
39160                var attributes_1 = options.handleAttributes[handleNumber];
39161                Object.keys(attributes_1).forEach(function (attribute) {
39162                    handle.setAttribute(attribute, attributes_1[attribute]);
39163                });
39164            }
39165            handle.setAttribute("role", "slider");
39166            handle.setAttribute("aria-orientation", options.ort ? "vertical" : "horizontal");
39167            if (handleNumber === 0) {
39168                addClass(handle, options.cssClasses.handleLower);
39169            }
39170            else if (handleNumber === options.handles - 1) {
39171                addClass(handle, options.cssClasses.handleUpper);
39172            }
39173            origin.handle = handle;
39174            return origin;
39175        }
39176        // Insert nodes for connect elements
39177        function addConnect(base, add) {
39178            if (!add) {
39179                return false;
39180            }
39181            return addNodeTo(base, options.cssClasses.connect);
39182        }
39183        // Add handles to the slider base.
39184        function addElements(connectOptions, base) {
39185            scope_ConnectBase = addNodeTo(base, options.cssClasses.connects);
39186            scope_Handles = [];
39187            scope_Connects = [];
39188            scope_Connects.push(addConnect(scope_ConnectBase, connectOptions[0]));
39189            // [::::O====O====O====]
39190            // connectOptions = [0, 1, 1, 1]
39191            for (var i = 0; i < options.handles; i++) {
39192                // Keep a list of all added handles.
39193                scope_Handles.push(addOrigin(base, i));
39194                scope_HandleNumbers[i] = i;
39195                scope_Connects.push(addConnect(scope_ConnectBase, connectOptions[i + 1]));
39196            }
39197        }
39198        // Initialize a single slider.
39199        function addSlider(addTarget) {
39200            // Apply classes and data to the target.
39201            addClass(addTarget, options.cssClasses.target);
39202            if (options.dir === 0) {
39203                addClass(addTarget, options.cssClasses.ltr);
39204            }
39205            else {
39206                addClass(addTarget, options.cssClasses.rtl);
39207            }
39208            if (options.ort === 0) {
39209                addClass(addTarget, options.cssClasses.horizontal);
39210            }
39211            else {
39212                addClass(addTarget, options.cssClasses.vertical);
39213            }
39214            var textDirection = getComputedStyle(addTarget).direction;
39215            if (textDirection === "rtl") {
39216                addClass(addTarget, options.cssClasses.textDirectionRtl);
39217            }
39218            else {
39219                addClass(addTarget, options.cssClasses.textDirectionLtr);
39220            }
39221            return addNodeTo(addTarget, options.cssClasses.base);
39222        }
39223        function addTooltip(handle, handleNumber) {
39224            if (!options.tooltips || !options.tooltips[handleNumber]) {
39225                return false;
39226            }
39227            return addNodeTo(handle.firstChild, options.cssClasses.tooltip);
39228        }
39229        function isSliderDisabled() {
39230            return scope_Target.hasAttribute("disabled");
39231        }
39232        // Disable the slider dragging if any handle is disabled
39233        function isHandleDisabled(handleNumber) {
39234            var handleOrigin = scope_Handles[handleNumber];
39235            return handleOrigin.hasAttribute("disabled");
39236        }
39237        function disable(handleNumber) {
39238            if (handleNumber !== null && handleNumber !== undefined) {
39239                scope_Handles[handleNumber].setAttribute("disabled", "");
39240                scope_Handles[handleNumber].handle.removeAttribute("tabindex");
39241            }
39242            else {
39243                scope_Target.setAttribute("disabled", "");
39244                scope_Handles.forEach(function (handle) {
39245                    handle.handle.removeAttribute("tabindex");
39246                });
39247            }
39248        }
39249        function enable(handleNumber) {
39250            if (handleNumber !== null && handleNumber !== undefined) {
39251                scope_Handles[handleNumber].removeAttribute("disabled");
39252                scope_Handles[handleNumber].handle.setAttribute("tabindex", "0");
39253            }
39254            else {
39255                scope_Target.removeAttribute("disabled");
39256                scope_Handles.forEach(function (handle) {
39257                    handle.removeAttribute("disabled");
39258                    handle.handle.setAttribute("tabindex", "0");
39259                });
39260            }
39261        }
39262        function removeTooltips() {
39263            if (scope_Tooltips) {
39264                removeEvent("update" + INTERNAL_EVENT_NS.tooltips);
39265                scope_Tooltips.forEach(function (tooltip) {
39266                    if (tooltip) {
39267                        removeElement(tooltip);
39268                    }
39269                });
39270                scope_Tooltips = null;
39271            }
39272        }
39273        // The tooltips option is a shorthand for using the 'update' event.
39274        function tooltips() {
39275            removeTooltips();
39276            // Tooltips are added with options.tooltips in original order.
39277            scope_Tooltips = scope_Handles.map(addTooltip);
39278            bindEvent("update" + INTERNAL_EVENT_NS.tooltips, function (values, handleNumber, unencoded) {
39279                if (!scope_Tooltips || !options.tooltips) {
39280                    return;
39281                }
39282                if (scope_Tooltips[handleNumber] === false) {
39283                    return;
39284                }
39285                var formattedValue = values[handleNumber];
39286                if (options.tooltips[handleNumber] !== true) {
39287                    formattedValue = options.tooltips[handleNumber].to(unencoded[handleNumber]);
39288                }
39289                scope_Tooltips[handleNumber].innerHTML = formattedValue;
39290            });
39291        }
39292        function aria() {
39293            removeEvent("update" + INTERNAL_EVENT_NS.aria);
39294            bindEvent("update" + INTERNAL_EVENT_NS.aria, function (values, handleNumber, unencoded, tap, positions) {
39295                // Update Aria Values for all handles, as a change in one changes min and max values for the next.
39296                scope_HandleNumbers.forEach(function (index) {
39297                    var handle = scope_Handles[index];
39298                    var min = checkHandlePosition(scope_Locations, index, 0, true, true, true);
39299                    var max = checkHandlePosition(scope_Locations, index, 100, true, true, true);
39300                    var now = positions[index];
39301                    // Formatted value for display
39302                    var text = String(options.ariaFormat.to(unencoded[index]));
39303                    // Map to slider range values
39304                    min = scope_Spectrum.fromStepping(min).toFixed(1);
39305                    max = scope_Spectrum.fromStepping(max).toFixed(1);
39306                    now = scope_Spectrum.fromStepping(now).toFixed(1);
39307                    handle.children[0].setAttribute("aria-valuemin", min);
39308                    handle.children[0].setAttribute("aria-valuemax", max);
39309                    handle.children[0].setAttribute("aria-valuenow", now);
39310                    handle.children[0].setAttribute("aria-valuetext", text);
39311                });
39312            });
39313        }
39314        function getGroup(pips) {
39315            // Use the range.
39316            if (pips.mode === exports.PipsMode.Range || pips.mode === exports.PipsMode.Steps) {
39317                return scope_Spectrum.xVal;
39318            }
39319            if (pips.mode === exports.PipsMode.Count) {
39320                if (pips.values < 2) {
39321                    throw new Error("noUiSlider: 'values' (>= 2) required for mode 'count'.");
39322                }
39323                // Divide 0 - 100 in 'count' parts.
39324                var interval = pips.values - 1;
39325                var spread = 100 / interval;
39326                var values = [];
39327                // List these parts and have them handled as 'positions'.
39328                while (interval--) {
39329                    values[interval] = interval * spread;
39330                }
39331                values.push(100);
39332                return mapToRange(values, pips.stepped);
39333            }
39334            if (pips.mode === exports.PipsMode.Positions) {
39335                // Map all percentages to on-range values.
39336                return mapToRange(pips.values, pips.stepped);
39337            }
39338            if (pips.mode === exports.PipsMode.Values) {
39339                // If the value must be stepped, it needs to be converted to a percentage first.
39340                if (pips.stepped) {
39341                    return pips.values.map(function (value) {
39342                        // Convert to percentage, apply step, return to value.
39343                        return scope_Spectrum.fromStepping(scope_Spectrum.getStep(scope_Spectrum.toStepping(value)));
39344                    });
39345                }
39346                // Otherwise, we can simply use the values.
39347                return pips.values;
39348            }
39349            return []; // pips.mode = never
39350        }
39351        function mapToRange(values, stepped) {
39352            return values.map(function (value) {
39353                return scope_Spectrum.fromStepping(stepped ? scope_Spectrum.getStep(value) : value);
39354            });
39355        }
39356        function generateSpread(pips) {
39357            function safeIncrement(value, increment) {
39358                // Avoid floating point variance by dropping the smallest decimal places.
39359                return Number((value + increment).toFixed(7));
39360            }
39361            var group = getGroup(pips);
39362            var indexes = {};
39363            var firstInRange = scope_Spectrum.xVal[0];
39364            var lastInRange = scope_Spectrum.xVal[scope_Spectrum.xVal.length - 1];
39365            var ignoreFirst = false;
39366            var ignoreLast = false;
39367            var prevPct = 0;
39368            // Create a copy of the group, sort it and filter away all duplicates.
39369            group = unique(group.slice().sort(function (a, b) {
39370                return a - b;
39371            }));
39372            // Make sure the range starts with the first element.
39373            if (group[0] !== firstInRange) {
39374                group.unshift(firstInRange);
39375                ignoreFirst = true;
39376            }
39377            // Likewise for the last one.
39378            if (group[group.length - 1] !== lastInRange) {
39379                group.push(lastInRange);
39380                ignoreLast = true;
39381            }
39382            group.forEach(function (current, index) {
39383                // Get the current step and the lower + upper positions.
39384                var step;
39385                var i;
39386                var q;
39387                var low = current;
39388                var high = group[index + 1];
39389                var newPct;
39390                var pctDifference;
39391                var pctPos;
39392                var type;
39393                var steps;
39394                var realSteps;
39395                var stepSize;
39396                var isSteps = pips.mode === exports.PipsMode.Steps;
39397                // When using 'steps' mode, use the provided steps.
39398                // Otherwise, we'll step on to the next subrange.
39399                if (isSteps) {
39400                    step = scope_Spectrum.xNumSteps[index];
39401                }
39402                // Default to a 'full' step.
39403                if (!step) {
39404                    step = high - low;
39405                }
39406                // If high is undefined we are at the last subrange. Make sure it iterates once (#1088)
39407                if (high === undefined) {
39408                    high = low;
39409                }
39410                // Make sure step isn't 0, which would cause an infinite loop (#654)
39411                step = Math.max(step, 0.0000001);
39412                // Find all steps in the subrange.
39413                for (i = low; i <= high; i = safeIncrement(i, step)) {
39414                    // Get the percentage value for the current step,
39415                    // calculate the size for the subrange.
39416                    newPct = scope_Spectrum.toStepping(i);
39417                    pctDifference = newPct - prevPct;
39418                    steps = pctDifference / (pips.density || 1);
39419                    realSteps = Math.round(steps);
39420                    // This ratio represents the amount of percentage-space a point indicates.
39421                    // For a density 1 the points/percentage = 1. For density 2, that percentage needs to be re-divided.
39422                    // Round the percentage offset to an even number, then divide by two
39423                    // to spread the offset on both sides of the range.
39424                    stepSize = pctDifference / realSteps;
39425                    // Divide all points evenly, adding the correct number to this subrange.
39426                    // Run up to <= so that 100% gets a point, event if ignoreLast is set.
39427                    for (q = 1; q <= realSteps; q += 1) {
39428                        // The ratio between the rounded value and the actual size might be ~1% off.
39429                        // Correct the percentage offset by the number of points
39430                        // per subrange. density = 1 will result in 100 points on the
39431                        // full range, 2 for 50, 4 for 25, etc.
39432                        pctPos = prevPct + q * stepSize;
39433                        indexes[pctPos.toFixed(5)] = [scope_Spectrum.fromStepping(pctPos), 0];
39434                    }
39435                    // Determine the point type.
39436                    type = group.indexOf(i) > -1 ? exports.PipsType.LargeValue : isSteps ? exports.PipsType.SmallValue : exports.PipsType.NoValue;
39437                    // Enforce the 'ignoreFirst' option by overwriting the type for 0.
39438                    if (!index && ignoreFirst && i !== high) {
39439                        type = 0;
39440                    }
39441                    if (!(i === high && ignoreLast)) {
39442                        // Mark the 'type' of this point. 0 = plain, 1 = real value, 2 = step value.
39443                        indexes[newPct.toFixed(5)] = [i, type];
39444                    }
39445                    // Update the percentage count.
39446                    prevPct = newPct;
39447                }
39448            });
39449            return indexes;
39450        }
39451        function addMarking(spread, filterFunc, formatter) {
39452            var _a, _b;
39453            var element = scope_Document.createElement("div");
39454            var valueSizeClasses = (_a = {},
39455                _a[exports.PipsType.None] = "",
39456                _a[exports.PipsType.NoValue] = options.cssClasses.valueNormal,
39457                _a[exports.PipsType.LargeValue] = options.cssClasses.valueLarge,
39458                _a[exports.PipsType.SmallValue] = options.cssClasses.valueSub,
39459                _a);
39460            var markerSizeClasses = (_b = {},
39461                _b[exports.PipsType.None] = "",
39462                _b[exports.PipsType.NoValue] = options.cssClasses.markerNormal,
39463                _b[exports.PipsType.LargeValue] = options.cssClasses.markerLarge,
39464                _b[exports.PipsType.SmallValue] = options.cssClasses.markerSub,
39465                _b);
39466            var valueOrientationClasses = [options.cssClasses.valueHorizontal, options.cssClasses.valueVertical];
39467            var markerOrientationClasses = [options.cssClasses.markerHorizontal, options.cssClasses.markerVertical];
39468            addClass(element, options.cssClasses.pips);
39469            addClass(element, options.ort === 0 ? options.cssClasses.pipsHorizontal : options.cssClasses.pipsVertical);
39470            function getClasses(type, source) {
39471                var a = source === options.cssClasses.value;
39472                var orientationClasses = a ? valueOrientationClasses : markerOrientationClasses;
39473                var sizeClasses = a ? valueSizeClasses : markerSizeClasses;
39474                return source + " " + orientationClasses[options.ort] + " " + sizeClasses[type];
39475            }
39476            function addSpread(offset, value, type) {
39477                // Apply the filter function, if it is set.
39478                type = filterFunc ? filterFunc(value, type) : type;
39479                if (type === exports.PipsType.None) {
39480                    return;
39481                }
39482                // Add a marker for every point
39483                var node = addNodeTo(element, false);
39484                node.className = getClasses(type, options.cssClasses.marker);
39485                node.style[options.style] = offset + "%";
39486                // Values are only appended for points marked '1' or '2'.
39487                if (type > exports.PipsType.NoValue) {
39488                    node = addNodeTo(element, false);
39489                    node.className = getClasses(type, options.cssClasses.value);
39490                    node.setAttribute("data-value", String(value));
39491                    node.style[options.style] = offset + "%";
39492                    node.innerHTML = String(formatter.to(value));
39493                }
39494            }
39495            // Append all points.
39496            Object.keys(spread).forEach(function (offset) {
39497                addSpread(offset, spread[offset][0], spread[offset][1]);
39498            });
39499            return element;
39500        }
39501        function removePips() {
39502            if (scope_Pips) {
39503                removeElement(scope_Pips);
39504                scope_Pips = null;
39505            }
39506        }
39507        function pips(pips) {
39508            // Fix #669
39509            removePips();
39510            var spread = generateSpread(pips);
39511            var filter = pips.filter;
39512            var format = pips.format || {
39513                to: function (value) {
39514                    return String(Math.round(value));
39515                },
39516            };
39517            scope_Pips = scope_Target.appendChild(addMarking(spread, filter, format));
39518            return scope_Pips;
39519        }
39520        // Shorthand for base dimensions.
39521        function baseSize() {
39522            var rect = scope_Base.getBoundingClientRect();
39523            var alt = ("offset" + ["Width", "Height"][options.ort]);
39524            return options.ort === 0 ? rect.width || scope_Base[alt] : rect.height || scope_Base[alt];
39525        }
39526        // Handler for attaching events trough a proxy.
39527        function attachEvent(events, element, callback, data) {
39528            // This function can be used to 'filter' events to the slider.
39529            // element is a node, not a nodeList
39530            var method = function (event) {
39531                var e = fixEvent(event, data.pageOffset, data.target || element);
39532                // fixEvent returns false if this event has a different target
39533                // when handling (multi-) touch events;
39534                if (!e) {
39535                    return false;
39536                }
39537                // doNotReject is passed by all end events to make sure released touches
39538                // are not rejected, leaving the slider "stuck" to the cursor;
39539                if (isSliderDisabled() && !data.doNotReject) {
39540                    return false;
39541                }
39542                // Stop if an active 'tap' transition is taking place.
39543                if (hasClass(scope_Target, options.cssClasses.tap) && !data.doNotReject) {
39544                    return false;
39545                }
39546                // Ignore right or middle clicks on start #454
39547                if (events === actions.start && e.buttons !== undefined && e.buttons > 1) {
39548                    return false;
39549                }
39550                // Ignore right or middle clicks on start #454
39551                if (data.hover && e.buttons) {
39552                    return false;
39553                }
39554                // 'supportsPassive' is only true if a browser also supports touch-action: none in CSS.
39555                // iOS safari does not, so it doesn't get to benefit from passive scrolling. iOS does support
39556                // touch-action: manipulation, but that allows panning, which breaks
39557                // sliders after zooming/on non-responsive pages.
39558                // See: https://bugs.webkit.org/show_bug.cgi?id=133112
39559                if (!supportsPassive) {
39560                    e.preventDefault();
39561                }
39562                e.calcPoint = e.points[options.ort];
39563                // Call the event handler with the event [ and additional data ].
39564                callback(e, data);
39565                return;
39566            };
39567            var methods = [];
39568            // Bind a closure on the target for every event type.
39569            events.split(" ").forEach(function (eventName) {
39570                element.addEventListener(eventName, method, supportsPassive ? { passive: true } : false);
39571                methods.push([eventName, method]);
39572            });
39573            return methods;
39574        }
39575        // Provide a clean event with standardized offset values.
39576        function fixEvent(e, pageOffset, eventTarget) {
39577            // Filter the event to register the type, which can be
39578            // touch, mouse or pointer. Offset changes need to be
39579            // made on an event specific basis.
39580            var touch = e.type.indexOf("touch") === 0;
39581            var mouse = e.type.indexOf("mouse") === 0;
39582            var pointer = e.type.indexOf("pointer") === 0;
39583            var x = 0;
39584            var y = 0;
39585            // IE10 implemented pointer events with a prefix;
39586            if (e.type.indexOf("MSPointer") === 0) {
39587                pointer = true;
39588            }
39589            // Erroneous events seem to be passed in occasionally on iOS/iPadOS after user finishes interacting with
39590            // the slider. They appear to be of type MouseEvent, yet they don't have usual properties set. Ignore
39591            // events that have no touches or buttons associated with them. (#1057, #1079, #1095)
39592            if (e.type === "mousedown" && !e.buttons && !e.touches) {
39593                return false;
39594            }
39595            // The only thing one handle should be concerned about is the touches that originated on top of it.
39596            if (touch) {
39597                // Returns true if a touch originated on the target.
39598                var isTouchOnTarget = function (checkTouch) {
39599                    var target = checkTouch.target;
39600                    return (target === eventTarget ||
39601                        eventTarget.contains(target) ||
39602                        (e.composed && e.composedPath().shift() === eventTarget));
39603                };
39604                // In the case of touchstart events, we need to make sure there is still no more than one
39605                // touch on the target so we look amongst all touches.
39606                if (e.type === "touchstart") {
39607                    var targetTouches = Array.prototype.filter.call(e.touches, isTouchOnTarget);
39608                    // Do not support more than one touch per handle.
39609                    if (targetTouches.length > 1) {
39610                        return false;
39611                    }
39612                    x = targetTouches[0].pageX;
39613                    y = targetTouches[0].pageY;
39614                }
39615                else {
39616                    // In the other cases, find on changedTouches is enough.
39617                    var targetTouch = Array.prototype.find.call(e.changedTouches, isTouchOnTarget);
39618                    // Cancel if the target touch has not moved.
39619                    if (!targetTouch) {
39620                        return false;
39621                    }
39622                    x = targetTouch.pageX;
39623                    y = targetTouch.pageY;
39624                }
39625            }
39626            pageOffset = pageOffset || getPageOffset(scope_Document);
39627            if (mouse || pointer) {
39628                x = e.clientX + pageOffset.x;
39629                y = e.clientY + pageOffset.y;
39630            }
39631            e.pageOffset = pageOffset;
39632            e.points = [x, y];
39633            e.cursor = mouse || pointer; // Fix #435
39634            return e;
39635        }
39636        // Translate a coordinate in the document to a percentage on the slider
39637        function calcPointToPercentage(calcPoint) {
39638            var location = calcPoint - offset(scope_Base, options.ort);
39639            var proposal = (location * 100) / baseSize();
39640            // Clamp proposal between 0% and 100%
39641            // Out-of-bound coordinates may occur when .noUi-base pseudo-elements
39642            // are used (e.g. contained handles feature)
39643            proposal = limit(proposal);
39644            return options.dir ? 100 - proposal : proposal;
39645        }
39646        // Find handle closest to a certain percentage on the slider
39647        function getClosestHandle(clickedPosition) {
39648            var smallestDifference = 100;
39649            var handleNumber = false;
39650            scope_Handles.forEach(function (handle, index) {
39651                // Disabled handles are ignored
39652                if (isHandleDisabled(index)) {
39653                    return;
39654                }
39655                var handlePosition = scope_Locations[index];
39656                var differenceWithThisHandle = Math.abs(handlePosition - clickedPosition);
39657                // Initial state
39658                var clickAtEdge = differenceWithThisHandle === 100 && smallestDifference === 100;
39659                // Difference with this handle is smaller than the previously checked handle
39660                var isCloser = differenceWithThisHandle < smallestDifference;
39661                var isCloserAfter = differenceWithThisHandle <= smallestDifference && clickedPosition > handlePosition;
39662                if (isCloser || isCloserAfter || clickAtEdge) {
39663                    handleNumber = index;
39664                    smallestDifference = differenceWithThisHandle;
39665                }
39666            });
39667            return handleNumber;
39668        }
39669        // Fire 'end' when a mouse or pen leaves the document.
39670        function documentLeave(event, data) {
39671            if (event.type === "mouseout" &&
39672                event.target.nodeName === "HTML" &&
39673                event.relatedTarget === null) {
39674                eventEnd(event, data);
39675            }
39676        }
39677        // Handle movement on document for handle and range drag.
39678        function eventMove(event, data) {
39679            // Fix #498
39680            // Check value of .buttons in 'start' to work around a bug in IE10 mobile (data.buttonsProperty).
39681            // https://connect.microsoft.com/IE/feedback/details/927005/mobile-ie10-windows-phone-buttons-property-of-pointermove-event-always-zero
39682            // IE9 has .buttons and .which zero on mousemove.
39683            // Firefox breaks the spec MDN defines.
39684            if (navigator.appVersion.indexOf("MSIE 9") === -1 && event.buttons === 0 && data.buttonsProperty !== 0) {
39685                return eventEnd(event, data);
39686            }
39687            // Check if we are moving up or down
39688            var movement = (options.dir ? -1 : 1) * (event.calcPoint - data.startCalcPoint);
39689            // Convert the movement into a percentage of the slider width/height
39690            var proposal = (movement * 100) / data.baseSize;
39691            moveHandles(movement > 0, proposal, data.locations, data.handleNumbers, data.connect);
39692        }
39693        // Unbind move events on document, call callbacks.
39694        function eventEnd(event, data) {
39695            // The handle is no longer active, so remove the class.
39696            if (data.handle) {
39697                removeClass(data.handle, options.cssClasses.active);
39698                scope_ActiveHandlesCount -= 1;
39699            }
39700            // Unbind the move and end events, which are added on 'start'.
39701            data.listeners.forEach(function (c) {
39702                scope_DocumentElement.removeEventListener(c[0], c[1]);
39703            });
39704            if (scope_ActiveHandlesCount === 0) {
39705                // Remove dragging class.
39706                removeClass(scope_Target, options.cssClasses.drag);
39707                setZindex();
39708                // Remove cursor styles and text-selection events bound to the body.
39709                if (event.cursor) {
39710                    scope_Body.style.cursor = "";
39711                    scope_Body.removeEventListener("selectstart", preventDefault);
39712                }
39713            }
39714            if (options.events.smoothSteps) {
39715                data.handleNumbers.forEach(function (handleNumber) {
39716                    setHandle(handleNumber, scope_Locations[handleNumber], true, true, false, false);
39717                });
39718                data.handleNumbers.forEach(function (handleNumber) {
39719                    fireEvent("update", handleNumber);
39720                });
39721            }
39722            data.handleNumbers.forEach(function (handleNumber) {
39723                fireEvent("change", handleNumber);
39724                fireEvent("set", handleNumber);
39725                fireEvent("end", handleNumber);
39726            });
39727        }
39728        // Bind move events on document.
39729        function eventStart(event, data) {
39730            // Ignore event if any handle is disabled
39731            if (data.handleNumbers.some(isHandleDisabled)) {
39732                return;
39733            }
39734            var handle;
39735            if (data.handleNumbers.length === 1) {
39736                var handleOrigin = scope_Handles[data.handleNumbers[0]];
39737                handle = handleOrigin.children[0];
39738                scope_ActiveHandlesCount += 1;
39739                // Mark the handle as 'active' so it can be styled.
39740                addClass(handle, options.cssClasses.active);
39741            }
39742            // A drag should never propagate up to the 'tap' event.
39743            event.stopPropagation();
39744            // Record the event listeners.
39745            var listeners = [];
39746            // Attach the move and end events.
39747            var moveEvent = attachEvent(actions.move, scope_DocumentElement, eventMove, {
39748                // The event target has changed so we need to propagate the original one so that we keep
39749                // relying on it to extract target touches.
39750                target: event.target,
39751                handle: handle,
39752                connect: data.connect,
39753                listeners: listeners,
39754                startCalcPoint: event.calcPoint,
39755                baseSize: baseSize(),
39756                pageOffset: event.pageOffset,
39757                handleNumbers: data.handleNumbers,
39758                buttonsProperty: event.buttons,
39759                locations: scope_Locations.slice(),
39760            });
39761            var endEvent = attachEvent(actions.end, scope_DocumentElement, eventEnd, {
39762                target: event.target,
39763                handle: handle,
39764                listeners: listeners,
39765                doNotReject: true,
39766                handleNumbers: data.handleNumbers,
39767            });
39768            var outEvent = attachEvent("mouseout", scope_DocumentElement, documentLeave, {
39769                target: event.target,
39770                handle: handle,
39771                listeners: listeners,
39772                doNotReject: true,
39773                handleNumbers: data.handleNumbers,
39774            });
39775            // We want to make sure we pushed the listeners in the listener list rather than creating
39776            // a new one as it has already been passed to the event handlers.
39777            listeners.push.apply(listeners, moveEvent.concat(endEvent, outEvent));
39778            // Text selection isn't an issue on touch devices,
39779            // so adding cursor styles can be skipped.
39780            if (event.cursor) {
39781                // Prevent the 'I' cursor and extend the range-drag cursor.
39782                scope_Body.style.cursor = getComputedStyle(event.target).cursor;
39783                // Mark the target with a dragging state.
39784                if (scope_Handles.length > 1) {
39785                    addClass(scope_Target, options.cssClasses.drag);
39786                }
39787                // Prevent text selection when dragging the handles.
39788                // In noUiSlider <= 9.2.0, this was handled by calling preventDefault on mouse/touch start/move,
39789                // which is scroll blocking. The selectstart event is supported by FireFox starting from version 52,
39790                // meaning the only holdout is iOS Safari. This doesn't matter: text selection isn't triggered there.
39791                // The 'cursor' flag is false.
39792                // See: http://caniuse.com/#search=selectstart
39793                scope_Body.addEventListener("selectstart", preventDefault, false);
39794            }
39795            data.handleNumbers.forEach(function (handleNumber) {
39796                fireEvent("start", handleNumber);
39797            });
39798        }
39799        // Move closest handle to tapped location.
39800        function eventTap(event) {
39801            // The tap event shouldn't propagate up
39802            event.stopPropagation();
39803            var proposal = calcPointToPercentage(event.calcPoint);
39804            var handleNumber = getClosestHandle(proposal);
39805            // Tackle the case that all handles are 'disabled'.
39806            if (handleNumber === false) {
39807                return;
39808            }
39809            // Flag the slider as it is now in a transitional state.
39810            // Transition takes a configurable amount of ms (default 300). Re-enable the slider after that.
39811            if (!options.events.snap) {
39812                addClassFor(scope_Target, options.cssClasses.tap, options.animationDuration);
39813            }
39814            setHandle(handleNumber, proposal, true, true);
39815            setZindex();
39816            fireEvent("slide", handleNumber, true);
39817            fireEvent("update", handleNumber, true);
39818            if (!options.events.snap) {
39819                fireEvent("change", handleNumber, true);
39820                fireEvent("set", handleNumber, true);
39821            }
39822            else {
39823                eventStart(event, { handleNumbers: [handleNumber] });
39824            }
39825        }
39826        // Fires a 'hover' event for a hovered mouse/pen position.
39827        function eventHover(event) {
39828            var proposal = calcPointToPercentage(event.calcPoint);
39829            var to = scope_Spectrum.getStep(proposal);
39830            var value = scope_Spectrum.fromStepping(to);
39831            Object.keys(scope_Events).forEach(function (targetEvent) {
39832                if ("hover" === targetEvent.split(".")[0]) {
39833                    scope_Events[targetEvent].forEach(function (callback) {
39834                        callback.call(scope_Self, value);
39835                    });
39836                }
39837            });
39838        }
39839        // Handles keydown on focused handles
39840        // Don't move the document when pressing arrow keys on focused handles
39841        function eventKeydown(event, handleNumber) {
39842            if (isSliderDisabled() || isHandleDisabled(handleNumber)) {
39843                return false;
39844            }
39845            var horizontalKeys = ["Left", "Right"];
39846            var verticalKeys = ["Down", "Up"];
39847            var largeStepKeys = ["PageDown", "PageUp"];
39848            var edgeKeys = ["Home", "End"];
39849            if (options.dir && !options.ort) {
39850                // On an right-to-left slider, the left and right keys act inverted
39851                horizontalKeys.reverse();
39852            }
39853            else if (options.ort && !options.dir) {
39854                // On a top-to-bottom slider, the up and down keys act inverted
39855                verticalKeys.reverse();
39856                largeStepKeys.reverse();
39857            }
39858            // Strip "Arrow" for IE compatibility. https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key
39859            var key = event.key.replace("Arrow", "");
39860            var isLargeDown = key === largeStepKeys[0];
39861            var isLargeUp = key === largeStepKeys[1];
39862            var isDown = key === verticalKeys[0] || key === horizontalKeys[0] || isLargeDown;
39863            var isUp = key === verticalKeys[1] || key === horizontalKeys[1] || isLargeUp;
39864            var isMin = key === edgeKeys[0];
39865            var isMax = key === edgeKeys[1];
39866            if (!isDown && !isUp && !isMin && !isMax) {
39867                return true;
39868            }
39869            event.preventDefault();
39870            var to;
39871            if (isUp || isDown) {
39872                var direction = isDown ? 0 : 1;
39873                var steps = getNextStepsForHandle(handleNumber);
39874                var step = steps[direction];
39875                // At the edge of a slider, do nothing
39876                if (step === null) {
39877                    return false;
39878                }
39879                // No step set, use the default of 10% of the sub-range
39880                if (step === false) {
39881                    step = scope_Spectrum.getDefaultStep(scope_Locations[handleNumber], isDown, options.keyboardDefaultStep);
39882                }
39883                if (isLargeUp || isLargeDown) {
39884                    step *= options.keyboardPageMultiplier;
39885                }
39886                else {
39887                    step *= options.keyboardMultiplier;
39888                }
39889                // Step over zero-length ranges (#948);
39890                step = Math.max(step, 0.0000001);
39891                // Decrement for down steps
39892                step = (isDown ? -1 : 1) * step;
39893                to = scope_Values[handleNumber] + step;
39894            }
39895            else if (isMax) {
39896                // End key
39897                to = options.spectrum.xVal[options.spectrum.xVal.length - 1];
39898            }
39899            else {
39900                // Home key
39901                to = options.spectrum.xVal[0];
39902            }
39903            setHandle(handleNumber, scope_Spectrum.toStepping(to), true, true);
39904            fireEvent("slide", handleNumber);
39905            fireEvent("update", handleNumber);
39906            fireEvent("change", handleNumber);
39907            fireEvent("set", handleNumber);
39908            return false;
39909        }
39910        // Attach events to several slider parts.
39911        function bindSliderEvents(behaviour) {
39912            // Attach the standard drag event to the handles.
39913            if (!behaviour.fixed) {
39914                scope_Handles.forEach(function (handle, index) {
39915                    // These events are only bound to the visual handle
39916                    // element, not the 'real' origin element.
39917                    attachEvent(actions.start, handle.children[0], eventStart, {
39918                        handleNumbers: [index],
39919                    });
39920                });
39921            }
39922            // Attach the tap event to the slider base.
39923            if (behaviour.tap) {
39924                attachEvent(actions.start, scope_Base, eventTap, {});
39925            }
39926            // Fire hover events
39927            if (behaviour.hover) {
39928                attachEvent(actions.move, scope_Base, eventHover, {
39929                    hover: true,
39930                });
39931            }
39932            // Make the range draggable.
39933            if (behaviour.drag) {
39934                scope_Connects.forEach(function (connect, index) {
39935                    if (connect === false || index === 0 || index === scope_Connects.length - 1) {
39936                        return;
39937                    }
39938                    var handleBefore = scope_Handles[index - 1];
39939                    var handleAfter = scope_Handles[index];
39940                    var eventHolders = [connect];
39941                    var handlesToDrag = [handleBefore, handleAfter];
39942                    var handleNumbersToDrag = [index - 1, index];
39943                    addClass(connect, options.cssClasses.draggable);
39944                    // When the range is fixed, the entire range can
39945                    // be dragged by the handles. The handle in the first
39946                    // origin will propagate the start event upward,
39947                    // but it needs to be bound manually on the other.
39948                    if (behaviour.fixed) {
39949                        eventHolders.push(handleBefore.children[0]);
39950                        eventHolders.push(handleAfter.children[0]);
39951                    }
39952                    if (behaviour.dragAll) {
39953                        handlesToDrag = scope_Handles;
39954                        handleNumbersToDrag = scope_HandleNumbers;
39955                    }
39956                    eventHolders.forEach(function (eventHolder) {
39957                        attachEvent(actions.start, eventHolder, eventStart, {
39958                            handles: handlesToDrag,
39959                            handleNumbers: handleNumbersToDrag,
39960                            connect: connect,
39961                        });
39962                    });
39963                });
39964            }
39965        }
39966        // Attach an event to this slider, possibly including a namespace
39967        function bindEvent(namespacedEvent, callback) {
39968            scope_Events[namespacedEvent] = scope_Events[namespacedEvent] || [];
39969            scope_Events[namespacedEvent].push(callback);
39970            // If the event bound is 'update,' fire it immediately for all handles.
39971            if (namespacedEvent.split(".")[0] === "update") {
39972                scope_Handles.forEach(function (a, index) {
39973                    fireEvent("update", index);
39974                });
39975            }
39976        }
39977        function isInternalNamespace(namespace) {
39978            return namespace === INTERNAL_EVENT_NS.aria || namespace === INTERNAL_EVENT_NS.tooltips;
39979        }
39980        // Undo attachment of event
39981        function removeEvent(namespacedEvent) {
39982            var event = namespacedEvent && namespacedEvent.split(".")[0];
39983            var namespace = event ? namespacedEvent.substring(event.length) : namespacedEvent;
39984            Object.keys(scope_Events).forEach(function (bind) {
39985                var tEvent = bind.split(".")[0];
39986                var tNamespace = bind.substring(tEvent.length);
39987                if ((!event || event === tEvent) && (!namespace || namespace === tNamespace)) {
39988                    // only delete protected internal event if intentional
39989                    if (!isInternalNamespace(tNamespace) || namespace === tNamespace) {
39990                        delete scope_Events[bind];
39991                    }
39992                }
39993            });
39994        }
39995        // External event handling
39996        function fireEvent(eventName, handleNumber, tap) {
39997            Object.keys(scope_Events).forEach(function (targetEvent) {
39998                var eventType = targetEvent.split(".")[0];
39999                if (eventName === eventType) {
40000                    scope_Events[targetEvent].forEach(function (callback) {
40001                        callback.call(
40002                        // Use the slider public API as the scope ('this')
40003                        scope_Self, 
40004                        // Return values as array, so arg_1[arg_2] is always valid.
40005                        scope_Values.map(options.format.to), 
40006                        // Handle index, 0 or 1
40007                        handleNumber, 
40008                        // Un-formatted slider values
40009                        scope_Values.slice(), 
40010                        // Event is fired by tap, true or false
40011                        tap || false, 
40012                        // Left offset of the handle, in relation to the slider
40013                        scope_Locations.slice(), 
40014                        // add the slider public API to an accessible parameter when this is unavailable
40015                        scope_Self);
40016                    });
40017                }
40018            });
40019        }
40020        // Split out the handle positioning logic so the Move event can use it, too
40021        function checkHandlePosition(reference, handleNumber, to, lookBackward, lookForward, getValue, smoothSteps) {
40022            var distance;
40023            // For sliders with multiple handles, limit movement to the other handle.
40024            // Apply the margin option by adding it to the handle positions.
40025            if (scope_Handles.length > 1 && !options.events.unconstrained) {
40026                if (lookBackward && handleNumber > 0) {
40027                    distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber - 1], options.margin, false);
40028                    to = Math.max(to, distance);
40029                }
40030                if (lookForward && handleNumber < scope_Handles.length - 1) {
40031                    distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber + 1], options.margin, true);
40032                    to = Math.min(to, distance);
40033                }
40034            }
40035            // The limit option has the opposite effect, limiting handles to a
40036            // maximum distance from another. Limit must be > 0, as otherwise
40037            // handles would be unmovable.
40038            if (scope_Handles.length > 1 && options.limit) {
40039                if (lookBackward && handleNumber > 0) {
40040                    distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber - 1], options.limit, false);
40041                    to = Math.min(to, distance);
40042                }
40043                if (lookForward && handleNumber < scope_Handles.length - 1) {
40044                    distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber + 1], options.limit, true);
40045                    to = Math.max(to, distance);
40046                }
40047            }
40048            // The padding option keeps the handles a certain distance from the
40049            // edges of the slider. Padding must be > 0.
40050            if (options.padding) {
40051                if (handleNumber === 0) {
40052                    distance = scope_Spectrum.getAbsoluteDistance(0, options.padding[0], false);
40053                    to = Math.max(to, distance);
40054                }
40055                if (handleNumber === scope_Handles.length - 1) {
40056                    distance = scope_Spectrum.getAbsoluteDistance(100, options.padding[1], true);
40057                    to = Math.min(to, distance);
40058                }
40059            }
40060            if (!smoothSteps) {
40061                to = scope_Spectrum.getStep(to);
40062            }
40063            // Limit percentage to the 0 - 100 range
40064            to = limit(to);
40065            // Return false if handle can't move
40066            if (to === reference[handleNumber] && !getValue) {
40067                return false;
40068            }
40069            return to;
40070        }
40071        // Uses slider orientation to create CSS rules. a = base value;
40072        function inRuleOrder(v, a) {
40073            var o = options.ort;
40074            return (o ? a : v) + ", " + (o ? v : a);
40075        }
40076        // Moves handle(s) by a percentage
40077        // (bool, % to move, [% where handle started, ...], [index in scope_Handles, ...])
40078        function moveHandles(upward, proposal, locations, handleNumbers, connect) {
40079            var proposals = locations.slice();
40080            // Store first handle now, so we still have it in case handleNumbers is reversed
40081            var firstHandle = handleNumbers[0];
40082            var smoothSteps = options.events.smoothSteps;
40083            var b = [!upward, upward];
40084            var f = [upward, !upward];
40085            // Copy handleNumbers so we don't change the dataset
40086            handleNumbers = handleNumbers.slice();
40087            // Check to see which handle is 'leading'.
40088            // If that one can't move the second can't either.
40089            if (upward) {
40090                handleNumbers.reverse();
40091            }
40092            // Step 1: get the maximum percentage that any of the handles can move
40093            if (handleNumbers.length > 1) {
40094                handleNumbers.forEach(function (handleNumber, o) {
40095                    var to = checkHandlePosition(proposals, handleNumber, proposals[handleNumber] + proposal, b[o], f[o], false, smoothSteps);
40096                    // Stop if one of the handles can't move.
40097                    if (to === false) {
40098                        proposal = 0;
40099                    }
40100                    else {
40101                        proposal = to - proposals[handleNumber];
40102                        proposals[handleNumber] = to;
40103                    }
40104                });
40105            }
40106            // If using one handle, check backward AND forward
40107            else {
40108                b = f = [true];
40109            }
40110            var state = false;
40111            // Step 2: Try to set the handles with the found percentage
40112            handleNumbers.forEach(function (handleNumber, o) {
40113                state =
40114                    setHandle(handleNumber, locations[handleNumber] + proposal, b[o], f[o], false, smoothSteps) || state;
40115            });
40116            // Step 3: If a handle moved, fire events
40117            if (state) {
40118                handleNumbers.forEach(function (handleNumber) {
40119                    fireEvent("update", handleNumber);
40120                    fireEvent("slide", handleNumber);
40121                });
40122                // If target is a connect, then fire drag event
40123                if (connect != undefined) {
40124                    fireEvent("drag", firstHandle);
40125                }
40126            }
40127        }
40128        // Takes a base value and an offset. This offset is used for the connect bar size.
40129        // In the initial design for this feature, the origin element was 1% wide.
40130        // Unfortunately, a rounding bug in Chrome makes it impossible to implement this feature
40131        // in this manner: https://bugs.chromium.org/p/chromium/issues/detail?id=798223
40132        function transformDirection(a, b) {
40133            return options.dir ? 100 - a - b : a;
40134        }
40135        // Updates scope_Locations and scope_Values, updates visual state
40136        function updateHandlePosition(handleNumber, to) {
40137            // Update locations.
40138            scope_Locations[handleNumber] = to;
40139            // Convert the value to the slider stepping/range.
40140            scope_Values[handleNumber] = scope_Spectrum.fromStepping(to);
40141            var translation = transformDirection(to, 0) - scope_DirOffset;
40142            var translateRule = "translate(" + inRuleOrder(translation + "%", "0") + ")";
40143            scope_Handles[handleNumber].style[options.transformRule] = translateRule;
40144            // sanity check for at least 2 handles (e.g. during setup)
40145            if (options.events.invertConnects && scope_Locations.length > 1) {
40146                // check if handles passed each other, but don't match the ConnectsInverted state
40147                var handlesAreInOrder = scope_Locations.every(function (position, index, locations) {
40148                    return index === 0 || position >= locations[index - 1];
40149                });
40150                if (scope_ConnectsInverted !== !handlesAreInOrder) {
40151                    // invert connects when handles pass each other
40152                    invertConnects();
40153                    // invertConnects already updates all connect elements
40154                    return;
40155                }
40156            }
40157            updateConnect(handleNumber);
40158            updateConnect(handleNumber + 1);
40159            if (scope_ConnectsInverted) {
40160                // When connects are inverted, we also have to update adjacent connects
40161                updateConnect(handleNumber - 1);
40162                updateConnect(handleNumber + 2);
40163            }
40164        }
40165        // Handles before the slider middle are stacked later = higher,
40166        // Handles after the middle later is lower
40167        // [[7] [8] .......... | .......... [5] [4]
40168        function setZindex() {
40169            scope_HandleNumbers.forEach(function (handleNumber) {
40170                var dir = scope_Locations[handleNumber] > 50 ? -1 : 1;
40171                var zIndex = 3 + (scope_Handles.length + dir * handleNumber);
40172                scope_Handles[handleNumber].style.zIndex = String(zIndex);
40173            });
40174        }
40175        // Test suggested values and apply margin, step.
40176        // if exactInput is true, don't run checkHandlePosition, then the handle can be placed in between steps (#436)
40177        function setHandle(handleNumber, to, lookBackward, lookForward, exactInput, smoothSteps) {
40178            if (!exactInput) {
40179                to = checkHandlePosition(scope_Locations, handleNumber, to, lookBackward, lookForward, false, smoothSteps);
40180            }
40181            if (to === false) {
40182                return false;
40183            }
40184            updateHandlePosition(handleNumber, to);
40185            return true;
40186        }
40187        // Updates style attribute for connect nodes
40188        function updateConnect(index) {
40189            // Skip connects set to false
40190            if (!scope_Connects[index]) {
40191                return;
40192            }
40193            // Create a copy of locations, so we can sort them for the local scope logic
40194            var locations = scope_Locations.slice();
40195            if (scope_ConnectsInverted) {
40196                locations.sort(function (a, b) {
40197                    return a - b;
40198                });
40199            }
40200            var l = 0;
40201            var h = 100;
40202            if (index !== 0) {
40203                l = locations[index - 1];
40204            }
40205            if (index !== scope_Connects.length - 1) {
40206                h = locations[index];
40207            }
40208            // We use two rules:
40209            // 'translate' to change the left/top offset;
40210            // 'scale' to change the width of the element;
40211            // As the element has a width of 100%, a translation of 100% is equal to 100% of the parent (.noUi-base)
40212            var connectWidth = h - l;
40213            var translateRule = "translate(" + inRuleOrder(transformDirection(l, connectWidth) + "%", "0") + ")";
40214            var scaleRule = "scale(" + inRuleOrder(connectWidth / 100, "1") + ")";
40215            scope_Connects[index].style[options.transformRule] =
40216                translateRule + " " + scaleRule;
40217        }
40218        // Parses value passed to .set method. Returns current value if not parse-able.
40219        function resolveToValue(to, handleNumber) {
40220            // Setting with null indicates an 'ignore'.
40221            // Inputting 'false' is invalid.
40222            if (to === null || to === false || to === undefined) {
40223                return scope_Locations[handleNumber];
40224            }
40225            // If a formatted number was passed, attempt to decode it.
40226            if (typeof to === "number") {
40227                to = String(to);
40228            }
40229            to = options.format.from(to);
40230            if (to !== false) {
40231                to = scope_Spectrum.toStepping(to);
40232            }
40233            // If parsing the number failed, use the current value.
40234            if (to === false || isNaN(to)) {
40235                return scope_Locations[handleNumber];
40236            }
40237            return to;
40238        }
40239        // Set the slider value.
40240        function valueSet(input, fireSetEvent, exactInput) {
40241            var values = asArray(input);
40242            var isInit = scope_Locations[0] === undefined;
40243            // Event fires by default
40244            fireSetEvent = fireSetEvent === undefined ? true : fireSetEvent;
40245            // Animation is optional.
40246            // Make sure the initial values were set before using animated placement.
40247            if (options.animate && !isInit) {
40248                addClassFor(scope_Target, options.cssClasses.tap, options.animationDuration);
40249            }
40250            // First pass, without lookAhead but with lookBackward. Values are set from left to right.
40251            scope_HandleNumbers.forEach(function (handleNumber) {
40252                setHandle(handleNumber, resolveToValue(values[handleNumber], handleNumber), true, false, exactInput);
40253            });
40254            var i = scope_HandleNumbers.length === 1 ? 0 : 1;
40255            // Spread handles evenly across the slider if the range has no size (min=max)
40256            if (isInit && scope_Spectrum.hasNoSize()) {
40257                exactInput = true;
40258                scope_Locations[0] = 0;
40259                if (scope_HandleNumbers.length > 1) {
40260                    var space_1 = 100 / (scope_HandleNumbers.length - 1);
40261                    scope_HandleNumbers.forEach(function (handleNumber) {
40262                        scope_Locations[handleNumber] = handleNumber * space_1;
40263                    });
40264                }
40265            }
40266            // Secondary passes. Now that all base values are set, apply constraints.
40267            // Iterate all handles to ensure constraints are applied for the entire slider (Issue #1009)
40268            for (; i < scope_HandleNumbers.length; ++i) {
40269                scope_HandleNumbers.forEach(function (handleNumber) {
40270                    setHandle(handleNumber, scope_Locations[handleNumber], true, true, exactInput);
40271                });
40272            }
40273            setZindex();
40274            scope_HandleNumbers.forEach(function (handleNumber) {
40275                fireEvent("update", handleNumber);
40276                // Fire the event only for handles that received a new value, as per #579
40277                if (values[handleNumber] !== null && fireSetEvent) {
40278                    fireEvent("set", handleNumber);
40279                }
40280            });
40281        }
40282        // Reset slider to initial values
40283        function valueReset(fireSetEvent) {
40284            valueSet(options.start, fireSetEvent);
40285        }
40286        // Set value for a single handle
40287        function valueSetHandle(handleNumber, value, fireSetEvent, exactInput) {
40288            // Ensure numeric input
40289            handleNumber = Number(handleNumber);
40290            if (!(handleNumber >= 0 && handleNumber < scope_HandleNumbers.length)) {
40291                throw new Error("noUiSlider: invalid handle number, got: " + handleNumber);
40292            }
40293            // Look both backward and forward, since we don't want this handle to "push" other handles (#960);
40294            // The exactInput argument can be used to ignore slider stepping (#436)
40295            setHandle(handleNumber, resolveToValue(value, handleNumber), true, true, exactInput);
40296            fireEvent("update", handleNumber);
40297            if (fireSetEvent) {
40298                fireEvent("set", handleNumber);
40299            }
40300        }
40301        // Get the slider value.
40302        function valueGet(unencoded) {
40303            if (unencoded === void 0) { unencoded = false; }
40304            if (unencoded) {
40305                // return a copy of the raw values
40306                return scope_Values.length === 1 ? scope_Values[0] : scope_Values.slice(0);
40307            }
40308            var values = scope_Values.map(options.format.to);
40309            // If only one handle is used, return a single value.
40310            if (values.length === 1) {
40311                return values[0];
40312            }
40313            return values;
40314        }
40315        // Removes classes from the root and empties it.
40316        function destroy() {
40317            // remove protected internal listeners
40318            removeEvent(INTERNAL_EVENT_NS.aria);
40319            removeEvent(INTERNAL_EVENT_NS.tooltips);
40320            Object.keys(options.cssClasses).forEach(function (key) {
40321                removeClass(scope_Target, options.cssClasses[key]);
40322            });
40323            while (scope_Target.firstChild) {
40324                scope_Target.removeChild(scope_Target.firstChild);
40325            }
40326            delete scope_Target.noUiSlider;
40327        }
40328        function getNextStepsForHandle(handleNumber) {
40329            var location = scope_Locations[handleNumber];
40330            var nearbySteps = scope_Spectrum.getNearbySteps(location);
40331            var value = scope_Values[handleNumber];
40332            var increment = nearbySteps.thisStep.step;
40333            var decrement = null;
40334            // If snapped, directly use defined step value
40335            if (options.snap) {
40336                return [
40337                    value - nearbySteps.stepBefore.startValue || null,
40338                    nearbySteps.stepAfter.startValue - value || null,
40339                ];
40340            }
40341            // If the next value in this step moves into the next step,
40342            // the increment is the start of the next step - the current value
40343            if (increment !== false) {
40344                if (value + increment > nearbySteps.stepAfter.startValue) {
40345                    increment = nearbySteps.stepAfter.startValue - value;
40346                }
40347            }
40348            // If the value is beyond the starting point
40349            if (value > nearbySteps.thisStep.startValue) {
40350                decrement = nearbySteps.thisStep.step;
40351            }
40352            else if (nearbySteps.stepBefore.step === false) {
40353                decrement = false;
40354            }
40355            // If a handle is at the start of a step, it always steps back into the previous step first
40356            else {
40357                decrement = value - nearbySteps.stepBefore.highestStep;
40358            }
40359            // Now, if at the slider edges, there is no in/decrement
40360            if (location === 100) {
40361                increment = null;
40362            }
40363            else if (location === 0) {
40364                decrement = null;
40365            }
40366            // As per #391, the comparison for the decrement step can have some rounding issues.
40367            var stepDecimals = scope_Spectrum.countStepDecimals();
40368            // Round per #391
40369            if (increment !== null && increment !== false) {
40370                increment = Number(increment.toFixed(stepDecimals));
40371            }
40372            if (decrement !== null && decrement !== false) {
40373                decrement = Number(decrement.toFixed(stepDecimals));
40374            }
40375            return [decrement, increment];
40376        }
40377        // Get the current step size for the slider.
40378        function getNextSteps() {
40379            return scope_HandleNumbers.map(getNextStepsForHandle);
40380        }
40381        // Updatable: margin, limit, padding, step, range, animate, snap
40382        function updateOptions(optionsToUpdate, fireSetEvent) {
40383            // Spectrum is created using the range, snap, direction and step options.
40384            // 'snap' and 'step' can be updated.
40385            // If 'snap' and 'step' are not passed, they should remain unchanged.
40386            var v = valueGet();
40387            var updateAble = [
40388                "margin",
40389                "limit",
40390                "padding",
40391                "range",
40392                "animate",
40393                "snap",
40394                "step",
40395                "format",
40396                "pips",
40397                "tooltips",
40398                "connect",
40399            ];
40400            // Only change options that we're actually passed to update.
40401            updateAble.forEach(function (name) {
40402                // Check for undefined. null removes the value.
40403                if (optionsToUpdate[name] !== undefined) {
40404                    originalOptions[name] = optionsToUpdate[name];
40405                }
40406            });
40407            var newOptions = testOptions(originalOptions);
40408            // Load new options into the slider state
40409            updateAble.forEach(function (name) {
40410                if (optionsToUpdate[name] !== undefined) {
40411                    options[name] = newOptions[name];
40412                }
40413            });
40414            scope_Spectrum = newOptions.spectrum;
40415            // Limit, margin and padding depend on the spectrum but are stored outside of it. (#677)
40416            options.margin = newOptions.margin;
40417            options.limit = newOptions.limit;
40418            options.padding = newOptions.padding;
40419            // Update pips, removes existing.
40420            if (options.pips) {
40421                pips(options.pips);
40422            }
40423            else {
40424                removePips();
40425            }
40426            // Update tooltips, removes existing.
40427            if (options.tooltips) {
40428                tooltips();
40429            }
40430            else {
40431                removeTooltips();
40432            }
40433            // Invalidate the current positioning so valueSet forces an update.
40434            scope_Locations = [];
40435            valueSet(isSet(optionsToUpdate.start) ? optionsToUpdate.start : v, fireSetEvent);
40436            // Update connects only if it was set
40437            if (optionsToUpdate.connect) {
40438                updateConnectOption();
40439            }
40440        }
40441        function updateConnectOption() {
40442            // IE supported way of removing children including event handlers
40443            while (scope_ConnectBase.firstChild) {
40444                scope_ConnectBase.removeChild(scope_ConnectBase.firstChild);
40445            }
40446            // Adding new connects according to the new connect options
40447            for (var i = 0; i <= options.handles; i++) {
40448                scope_Connects[i] = addConnect(scope_ConnectBase, options.connect[i]);
40449                updateConnect(i);
40450            }
40451            // re-adding drag events for the new connect elements
40452            // to ignore the other events we have to negate the 'if (!behaviour.fixed)' check
40453            bindSliderEvents({ drag: options.events.drag, fixed: true });
40454        }
40455        // Invert options for connect handles
40456        function invertConnects() {
40457            scope_ConnectsInverted = !scope_ConnectsInverted;
40458            testConnect(options, 
40459            // inverse the connect boolean array
40460            options.connect.map(function (b) { return !b; }));
40461            updateConnectOption();
40462        }
40463        // Initialization steps
40464        function setupSlider() {
40465            // Create the base element, initialize HTML and set classes.
40466            // Add handles and connect elements.
40467            scope_Base = addSlider(scope_Target);
40468            addElements(options.connect, scope_Base);
40469            // Attach user events.
40470            bindSliderEvents(options.events);
40471            // Use the public value method to set the start values.
40472            valueSet(options.start);
40473            if (options.pips) {
40474                pips(options.pips);
40475            }
40476            if (options.tooltips) {
40477                tooltips();
40478            }
40479            aria();
40480        }
40481        setupSlider();
40482        var scope_Self = {
40483            destroy: destroy,
40484            steps: getNextSteps,
40485            on: bindEvent,
40486            off: removeEvent,
40487            get: valueGet,
40488            set: valueSet,
40489            setHandle: valueSetHandle,
40490            reset: valueReset,
40491            disable: disable,
40492            enable: enable,
40493            // Exposed for unit testing, don't use this in your application.
40494            __moveHandles: function (upward, proposal, handleNumbers) {
40495                moveHandles(upward, proposal, scope_Locations, handleNumbers);
40496            },
40497            options: originalOptions,
40498            updateOptions: updateOptions,
40499            target: scope_Target,
40500            removePips: removePips,
40501            removeTooltips: removeTooltips,
40502            getPositions: function () {
40503                return scope_Locations.slice();
40504            },
40505            getTooltips: function () {
40506                return scope_Tooltips;
40507            },
40508            getOrigins: function () {
40509                return scope_Handles;
40510            },
40511            pips: pips, // Issue #594
40512        };
40513        return scope_Self;
40514    }
40515    // Run the standard initializer
40516    function initialize(target, originalOptions) {
40517        if (!target || !target.nodeName) {
40518            throw new Error("noUiSlider: create requires a single element, got: " + target);
40519        }
40520        // Throw an error if the slider was already initialized.
40521        if (target.noUiSlider) {
40522            throw new Error("noUiSlider: Slider was already initialized.");
40523        }
40524        // Test the options and create the slider environment;
40525        var options = testOptions(originalOptions);
40526        var api = scope(target, options, originalOptions);
40527        target.noUiSlider = api;
40528        return api;
40529    }
40530    var nouislider = {
40531        // Exposed for unit testing, don't use this in your application.
40532        __spectrum: Spectrum,
40533        // A reference to the default classes, allows global changes.
40534        // Use the cssClasses option for changes to one slider.
40535        cssClasses: cssClasses,
40536        create: initialize,
40537    };
40538
40539    exports.create = initialize;
40540    exports.cssClasses = cssClasses;
40541    exports["default"] = nouislider;
40542
40543    Object.defineProperty(exports, '__esModule', { value: true });
40544
40545}));
40546
40547},{}],78:[function(require,module,exports){
40548arguments[4][40][0].apply(exports,arguments)
40549},{"dup":40,"ev-emitter":66,"get-size":68}],79:[function(require,module,exports){
40550arguments[4][41][0].apply(exports,arguments)
40551},{"./item":78,"dup":41,"ev-emitter":66,"fizzy-ui-utils":67,"get-size":68}],80:[function(require,module,exports){
40552(function(factory) {
40553  if (typeof define === "function" && define.amd) {
40554    // AMD. Register as an anonymous module.
40555    define([], factory);
40556  } else if (typeof exports === "object") {
40557    // Node/CommonJS
40558    module.exports = factory();
40559  } else {
40560    // Browser globals
40561    window.wNumb = factory();
40562  }
40563})(function() {
40564  "use strict";
40565
40566  var FormatOptions = [
40567    "decimals",
40568    "thousand",
40569    "mark",
40570    "prefix",
40571    "suffix",
40572    "encoder",
40573    "decoder",
40574    "negativeBefore",
40575    "negative",
40576    "edit",
40577    "undo"
40578  ];
40579
40580  // General
40581
40582  // Reverse a string
40583  function strReverse(a) {
40584    return a
40585      .split("")
40586      .reverse()
40587      .join("");
40588  }
40589
40590  // Check if a string starts with a specified prefix.
40591  function strStartsWith(input, match) {
40592    return input.substring(0, match.length) === match;
40593  }
40594
40595  // Check is a string ends in a specified suffix.
40596  function strEndsWith(input, match) {
40597    return input.slice(-1 * match.length) === match;
40598  }
40599
40600  // Throw an error if formatting options are incompatible.
vendor: 9,435 bytes, lines 40601-40946
40601  function throwEqualError(F, a, b) {
40602    if ((F[a] || F[b]) && F[a] === F[b]) {
40603      throw new Error(a);
40604    }
40605  }
40606
40607  // Check if a number is finite and not NaN
40608  function isValidNumber(input) {
40609    return typeof input === "number" && isFinite(input);
40610  }
40611
40612  // Provide rounding-accurate toFixed method.
40613  // Borrowed: http://stackoverflow.com/a/21323330/775265
40614  function toFixed(value, exp) {
40615    value = value.toString().split("e");
40616    value = Math.round(+(value[0] + "e" + (value[1] ? +value[1] + exp : exp)));
40617    value = value.toString().split("e");
40618    return (+(value[0] + "e" + (value[1] ? +value[1] - exp : -exp))).toFixed(exp);
40619  }
40620
40621  // Formatting
40622
40623  // Accept a number as input, output formatted string.
40624  function formatTo(
40625    decimals,
40626    thousand,
40627    mark,
40628    prefix,
40629    suffix,
40630    encoder,
40631    decoder,
40632    negativeBefore,
40633    negative,
40634    edit,
40635    undo,
40636    input
40637  ) {
40638    var originalInput = input,
40639      inputIsNegative,
40640      inputPieces,
40641      inputBase,
40642      inputDecimals = "",
40643      output = "";
40644
40645    // Apply user encoder to the input.
40646    // Expected outcome: number.
40647    if (encoder) {
40648      input = encoder(input);
40649    }
40650
40651    // Stop if no valid number was provided, the number is infinite or NaN.
40652    if (!isValidNumber(input)) {
40653      return false;
40654    }
40655
40656    // Rounding away decimals might cause a value of -0
40657    // when using very small ranges. Remove those cases.
40658    if (decimals !== false && parseFloat(input.toFixed(decimals)) === 0) {
40659      input = 0;
40660    }
40661
40662    // Formatting is done on absolute numbers,
40663    // decorated by an optional negative symbol.
40664    if (input < 0) {
40665      inputIsNegative = true;
40666      input = Math.abs(input);
40667    }
40668
40669    // Reduce the number of decimals to the specified option.
40670    if (decimals !== false) {
40671      input = toFixed(input, decimals);
40672    }
40673
40674    // Transform the number into a string, so it can be split.
40675    input = input.toString();
40676
40677    // Break the number on the decimal separator.
40678    if (input.indexOf(".") !== -1) {
40679      inputPieces = input.split(".");
40680
40681      inputBase = inputPieces[0];
40682
40683      if (mark) {
40684        inputDecimals = mark + inputPieces[1];
40685      }
40686    } else {
40687      // If it isn't split, the entire number will do.
40688      inputBase = input;
40689    }
40690
40691    // Group numbers in sets of three.
40692    if (thousand) {
40693      inputBase = strReverse(inputBase).match(/.{1,3}/g);
40694      inputBase = strReverse(inputBase.join(strReverse(thousand)));
40695    }
40696
40697    // If the number is negative, prefix with negation symbol.
40698    if (inputIsNegative && negativeBefore) {
40699      output += negativeBefore;
40700    }
40701
40702    // Prefix the number
40703    if (prefix) {
40704      output += prefix;
40705    }
40706
40707    // Normal negative option comes after the prefix. Defaults to '-'.
40708    if (inputIsNegative && negative) {
40709      output += negative;
40710    }
40711
40712    // Append the actual number.
40713    output += inputBase;
40714    output += inputDecimals;
40715
40716    // Apply the suffix.
40717    if (suffix) {
40718      output += suffix;
40719    }
40720
40721    // Run the output through a user-specified post-formatter.
40722    if (edit) {
40723      output = edit(output, originalInput);
40724    }
40725
40726    // All done.
40727    return output;
40728  }
40729
40730  // Accept a sting as input, output decoded number.
40731  function formatFrom(
40732    decimals,
40733    thousand,
40734    mark,
40735    prefix,
40736    suffix,
40737    encoder,
40738    decoder,
40739    negativeBefore,
40740    negative,
40741    edit,
40742    undo,
40743    input
40744  ) {
40745    var originalInput = input,
40746      inputIsNegative,
40747      output = "";
40748
40749    // User defined pre-decoder. Result must be a non empty string.
40750    if (undo) {
40751      input = undo(input);
40752    }
40753
40754    // Test the input. Can't be empty.
40755    if (!input || typeof input !== "string") {
40756      return false;
40757    }
40758
40759    // If the string starts with the negativeBefore value: remove it.
40760    // Remember is was there, the number is negative.
40761    if (negativeBefore && strStartsWith(input, negativeBefore)) {
40762      input = input.replace(negativeBefore, "");
40763      inputIsNegative = true;
40764    }
40765
40766    // Repeat the same procedure for the prefix.
40767    if (prefix && strStartsWith(input, prefix)) {
40768      input = input.replace(prefix, "");
40769    }
40770
40771    // And again for negative.
40772    if (negative && strStartsWith(input, negative)) {
40773      input = input.replace(negative, "");
40774      inputIsNegative = true;
40775    }
40776
40777    // Remove the suffix.
40778    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice
40779    if (suffix && strEndsWith(input, suffix)) {
40780      input = input.slice(0, -1 * suffix.length);
40781    }
40782
40783    // Remove the thousand grouping.
40784    if (thousand) {
40785      input = input.split(thousand).join("");
40786    }
40787
40788    // Set the decimal separator back to period.
40789    if (mark) {
40790      input = input.replace(mark, ".");
40791    }
40792
40793    // Prepend the negative symbol.
40794    if (inputIsNegative) {
40795      output += "-";
40796    }
40797
40798    // Add the number
40799    output += input;
40800
40801    // Trim all non-numeric characters (allow '.' and '-');
40802    output = output.replace(/[^0-9\.\-.]/g, "");
40803
40804    // The value contains no parse-able number.
40805    if (output === "") {
40806      return false;
40807    }
40808
40809    // Covert to number.
40810    output = Number(output);
40811
40812    // Run the user-specified post-decoder.
40813    if (decoder) {
40814      output = decoder(output);
40815    }
40816
40817    // Check is the output is valid, otherwise: return false.
40818    if (!isValidNumber(output)) {
40819      return false;
40820    }
40821
40822    return output;
40823  }
40824
40825  // Framework
40826
40827  // Validate formatting options
40828  function validate(inputOptions) {
40829    var i,
40830      optionName,
40831      optionValue,
40832      filteredOptions = {};
40833
40834    if (inputOptions["suffix"] === undefined) {
40835      inputOptions["suffix"] = inputOptions["postfix"];
40836    }
40837
40838    for (i = 0; i < FormatOptions.length; i += 1) {
40839      optionName = FormatOptions[i];
40840      optionValue = inputOptions[optionName];
40841
40842      if (optionValue === undefined) {
40843        // Only default if negativeBefore isn't set.
40844        if (optionName === "negative" && !filteredOptions.negativeBefore) {
40845          filteredOptions[optionName] = "-";
40846          // Don't set a default for mark when 'thousand' is set.
40847        } else if (optionName === "mark" && filteredOptions.thousand !== ".") {
40848          filteredOptions[optionName] = ".";
40849        } else {
40850          filteredOptions[optionName] = false;
40851        }
40852
40853        // Floating points in JS are stable up to 7 decimals.
40854      } else if (optionName === "decimals") {
40855        if (optionValue >= 0 && optionValue < 8) {
40856          filteredOptions[optionName] = optionValue;
40857        } else {
40858          throw new Error(optionName);
40859        }
40860
40861        // These options, when provided, must be functions.
40862      } else if (
40863        optionName === "encoder" ||
40864        optionName === "decoder" ||
40865        optionName === "edit" ||
40866        optionName === "undo"
40867      ) {
40868        if (typeof optionValue === "function") {
40869          filteredOptions[optionName] = optionValue;
40870        } else {
40871          throw new Error(optionName);
40872        }
40873
40874        // Other options are strings.
40875      } else {
40876        if (typeof optionValue === "string") {
40877          filteredOptions[optionName] = optionValue;
40878        } else {
40879          throw new Error(optionName);
40880        }
40881      }
40882    }
40883
40884    // Some values can't be extracted from a
40885    // string if certain combinations are present.
40886    throwEqualError(filteredOptions, "mark", "thousand");
40887    throwEqualError(filteredOptions, "prefix", "negative");
40888    throwEqualError(filteredOptions, "prefix", "negativeBefore");
40889
40890    return filteredOptions;
40891  }
40892
40893  // Pass all options as function arguments
40894  function passAll(options, method, input) {
40895    var i,
40896      args = [];
40897
40898    // Add all options in order of FormatOptions
40899    for (i = 0; i < FormatOptions.length; i += 1) {
40900      args.push(options[FormatOptions[i]]);
40901    }
40902
40903    // Append the input, then call the method, presenting all
40904    // options as arguments.
40905    args.push(input);
40906    return method.apply("", args);
40907  }
40908
40909  function wNumb(options) {
40910    if (!(this instanceof wNumb)) {
40911      return new wNumb(options);
40912    }
40913
40914    if (typeof options !== "object") {
40915      return;
40916    }
40917
40918    options = validate(options);
40919
40920    // Call 'formatTo' with proper arguments.
40921    this.to = function(input) {
40922      return passAll(options, formatTo, input);
40923    };
40924
40925    // Call 'formatFrom' with proper arguments.
40926    this.from = function(input) {
40927      return passAll(options, formatFrom, input);
40928    };
40929  }
40930
40931  return wNumb;
40932});
40933
40934},{}],81:[function(require,module,exports){
40935"use strict";
40936
40937var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
40938Object.defineProperty(exports, "__esModule", {
40939  value: true
40940});
40941exports.WcoMediaconsent = void 0;
40942var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
40943var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
40944var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
40945var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
40946var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/
40946defineProperty"));
40947var WcoMediaconsent = exports.WcoMediaconsent = /*#__PURE__*/function () {
40948  function WcoMediaconsent() {
40949    (0, _classCallCheck2["default"])(this, WcoMediaconsent);
40950  }
40951  return (0, _createClass2["default"])(WcoMediaconsent, [{
40952    key: "initialize",
40953    value: function initialize() {
40954      document.querySelectorAll(".mediaconsent_activate__btn").forEach(function (elem) {
40955        elem.addEventListener("click", function () {
40956          elem.querySelector(".spinner").classList.remove("d-none");
40957          var $mediaconsent__wrapper = elem.closest('.mediaconsent__wrapper');
40958          // Walk over list of items matching the type in attr('data-mctype')
40959          var mcType = $mediaconsent__wrapper.getAttribute('data-mctype');
40960          var selector = '.mediaconsent__wrapper[data-mctype="' + mcType + '"]';
40961
40962          // Neuen globalen Controller erstellen
40963          WcoMediaconsent.globalController = new AbortController();
40964          document.querySelectorAll(selector).forEach(function (elem) {
40965            WcoMediaconsent.fireEvent(mcType);
40966            WcoMediaconsent.reloadItem(elem);
40967          });
40968        });
40969      });
40970      var consent = document.querySelector('input[name="mediaconsent_consent"]');
40971      if (consent && consent.value === "1") {
40972        WcoMediaconsent.fireEvent(consent.dataset.provider);
40973      }
40974    }
40975  }], [{
40976    key: "fireEvent",
40977    value: function fireEvent(mcType) {
40978      var event = document.createEvent('Event');
40979      event.initEvent('wco-mediaconsent-accepted', [mcType]);
40980      document.dispatchEvent(event);
40981    }
40982  }, {
40983    key: "reloadItem",
40984    value: function () {
40985      var _reloadItem = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(item) {
40986        return _regenerator["default"].wrap(function (_context) {
40987          while (1) switch (_context.prev = _context.next) {
40988            case 0:
40989              if (item.getAttribute('data-rld-page') === "0") {
40990                fetch(item.getAttribute('data-mcuri')).then(function (data) {
40991                  return data.text();
40992                }).then(function (data) {
40993                  item.addEventListener('click', function (event) {
40994                    event.stopImmediatePropagation();
40995                  }, true);
40996                  item.parentNode.innerHTML = data;
40997                })["catch"](function (error) {});
40998              } else {
40999                fetch(item.getAttribute('data-mcuri'), {
41000                  signal: WcoMediaconsent.globalController.signal
41001                }).then(function (data) {
41002                  // Alle anderen Requests abbrechen
41003                  WcoMediaconsent.globalController.abort();
41004                  item.addEventListener('click', function (event) {
41005                    event.stopImmediatePropagation();
41006                  }, true);
41007                  window.location.reload();
41008                })["catch"](function (error) {});
41009              }
41010            case 1:
41011            case "end":
41012              return _context.stop();
41013          }
41014        }, _callee);
41015      }));
41016      function reloadItem(_x) {
41017        return _reloadItem.apply(this, arguments);
41018      }
41019      return reloadItem;
41020    }()
41021  }]);
41022}();
41023// Globaler AbortController für alle Requests
41024(0, _defineProperty2["default"])(WcoMediaconsent, "globalController", null);
41025
41026},{"@babel/runtime/helpers/asyncToGenerator":82,"@babel/runtime/helpers/classCallCheck":83,"@babel/runtime/helpers/createClass":84,"@babel/runtime/helpers/defineProperty":85,"@babel/runtime/helpers/interopRequireDefault":86,"@babel/runtime/regenerator":91}],82:[function(require,module,exports){
41027function asyncGeneratorStep(n, t, e, r, o, a, c) {
41028  try {
41029    var i = n[a](c),
41030      u = i.value;
41031  } catch (n) {
41032    return void e(n);
41033  }
41034  i.done ? t(u) : Promise.resolve(u).then(r, o);
41035}
41036function _asyncToGenerator(n) {
41037  return function () {
41038    var t = this,
41039      e = arguments;
41040    return new Promise(function (r, o) {
41041      var a = n.apply(t, e);
41042      function _next(n) {
41043        asyncGeneratorStep(a, r, o, _next, _throw, "next", n);
41044      }
41045      function _throw(n) {
41046        asyncGeneratorStep(a, r, o, _next, _throw, "throw", n);
41047      }
41048      _next(void 0);
41049    });
41050  };
41051}
41052module.exports = _asyncToGenerator, module.exports.__esModule = true, module.exports["default"] = module.exports;
41053},{}],83:[function(require,module,exports){
41054arguments[4][13][0].apply(exports,arguments)
41055},{"dup":13}],84:[function(require,module,exports){
41056arguments[4][14][0].apply(exports,arguments)
41057},{"./toPropertyKey.js":89,"dup":14}],85:[function(require,module,exports){
41058arguments[4][15][0].apply(exports,arguments)
41059},{"./toPropertyKey.js":89,"dup":15}],86:[function(require,module,exports){
41060arguments[4][19][0].apply(exports,arguments)
41061},{"dup":19}],87:[function(require,module,exports){
41062var _typeof = require("./typeof.js")["default"];
41063function _regeneratorRuntime() {
41064  "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */
41065  module.exports = _regeneratorRuntime = function _regeneratorRuntime() {
41066    return r;
41067  }, module.exports.__esModule = true, module.exports["default"] = module.exports;
41068  var t,
41069    r = {},
41070    e = Object.prototype,
41071    n = e.hasOwnProperty,
41072    o = "function" == typeof Symbol ? Symbol : {},
41073    i = o.iterator || "@@iterator",
41074    a = o.asyncIterator || "@@asyncIterator",
41075    u = o.toStringTag || "@@toStringTag";
41076  function c(t, r, e, n) {
41077    return Object.defineProperty(t, r, {
41078      value: e,
41079      enumerable: !n,
41080      configurable: !n,
41081      writable: !n
41082    });
41083  }
41084  try {
41085    c({}, "");
41086  } catch (t) {
41087    c = function c(t, r, e) {
41088      return t[r] = e;
41089    };
41090  }
41091  function h(r, e, n, o) {
41092    var i = e && e.prototype instanceof Generator ? e : Generator,
41093      a = Object.create(i.prototype);
41094    return c(a, "_invoke", function (r, e, n) {
41095      var o = 1;
41096      return function (i, a) {
41097        if (3 === o) throw Error("Generator is already running");
41098        if (4 === o) {
41099          if ("throw" === i) throw a;
41100          return {
41101            value: t,
41102            done: !0
41103          };
41104        }
41105        for (n.method = i, n.arg = a;;) {
41106          var u = n.delegate;
41107          if (u) {
41108            var c = d(u, n);
41109            if (c) {
41110              if (c === f) continue;
41111              return c;
41112            }
41113          }
41114          if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) {
41115            if (1 === o) throw o = 4, n.arg;
41116            n.dispatchException(n.arg);
41117          } else "return" === n.method && n.abrupt("return", n.arg);
41118          o = 3;
41119          var h = s(r, e, n);
41120          if ("normal" === h.type) {
41121            if (o = n.done ? 4 : 2, h.arg === f) continue;
41122            return {
41123              value: h.arg,
41124              done: n.done
41125            };
41126          }
41127          "throw" === h.type && (o = 4, n.method = "throw", n.arg = h.arg);
41128        }
41129      };
41130    }(r, n, new Context(o || [])), !0), a;
41131  }
41132  function s(t, r, e) {
41133    try {
41134      return {
41135        type: "normal",
41136        arg: t.call(r, e)
41137      };
41138    } catch (t) {
41139      return {
41140        type: "throw",
41141        arg: t
41142      };
41143    }
41144  }
41145  r.wrap = h;
41146  var f = {};
41147  function Generator() {}
41148  function GeneratorFunction() {}
41149  function GeneratorFunctionPrototype() {}
41150  var l = {};
41151  c(l, i, function () {
41152    return this;
41153  });
41154  var p = Object.getPrototypeOf,
41155    y = p && p(p(x([])));
41156  y && y !== e && n.call(y, i) && (l = y);
41157  var v = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(l);
41158  function g(t) {
41159    ["next", "throw", "return"].forEach(function (r) {
41160      c(t, r, function (t) {
41161        return this._invoke(r, t);
41162      });
41163    });
41164  }
41165  function AsyncIterator(t, r) {
41166    function e(o, i, a, u) {
41167      var c = s(t[o], t, i);
41168      if ("throw" !== c.type) {
41169        var h = c.arg,
41170          f = h.value;
41171        return f && "object" == _typeof(f) && n.call(f, "__await") ? r.resolve(f.__await).then(function (t) {
41172          e("next", t, a, u);
41173        }, function (t) {
41174          e("throw", t, a, u);
41175        }) : r.resolve(f).then(function (t) {
41176          h.value = t, a(h);
41177        }, function (t) {
41178          return e("throw", t, a, u);
41179        });
41180      }
41181      u(c.arg);
41182    }
41183    var o;
41184    c(this, "_invoke", function (t, n) {
41185      function i() {
41186        return new r(function (r, o) {
41187          e(t, n, r, o);
41188        });
41189      }
41190      return o = o ? o.then(i, i) : i();
41191    }, !0);
41192  }
41193  function d(r, e) {
41194    var n = e.method,
41195      o = r.i[n];
41196    if (o === t) return e.delegate = null, "throw" === n && r.i["return"] && (e.method = "return", e.arg = t, d(r, e), "throw" === e.method) || "return" !== n && (e.method = "throw", e.arg = new TypeError("The iterator does not provide a '" + n + "' method")), f;
41197    var i = s(o, r.i, e.arg);
41198    if ("throw" === i.type) return e.method = "throw", e.arg = i.arg, e.delegate = null, f;
41199    var a = i.arg;
41200    return a ? a.done ? (e[r.r] = a.value, e.next = r.n, "return" !== e.method && (e.method = "next", e.arg = t), e.delegate = null, f) : a : (e.method = "throw", e.arg = new TypeError("iterator result is not an object"), e.delegate = null, f);
41201  }
41202  function w(t) {
41203    this.tryEntries.push(t);
41204  }
41205  function m(r) {
41206    var e = r[4] || {};
41207    e.type = "normal", e.arg = t, r[4] = e;
41208  }
41209  function Context(t) {
41210    this.tryEntries = [[-1]], t.forEach(w, this), this.reset(!0);
41211  }
41212  function x(r) {
41213    if (null != r) {
41214      var e = r[i];
41215      if (e) return e.call(r);
41216      if ("function" == typeof r.next) return r;
41217      if (!isNaN(r.length)) {
41218        var o = -1,
41219          a = function e() {
41220            for (; ++o < r.length;) if (n.call(r, o)) return e.value = r[o], e.done = !1, e;
41221            return e.value = t, e.done = !0, e;
41222          };
41223        return a.next = a;
41224      }
41225    }
41226    throw new TypeError(_typeof(r) + " is not iterable");
41227  }
41228  return GeneratorFunction.prototype = GeneratorFunctionPrototype, c(v, "constructor", GeneratorFunctionPrototype), c(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = c(GeneratorFunctionPrototype, u, "GeneratorFunction"), r.isGeneratorFunction = function (t) {
41229    var r = "function" == typeof t && t.constructor;
41230    return !!r && (r === GeneratorFunction || "GeneratorFunction" === (r.displayName || r.name));
41231  }, r.mark = function (t) {
41232    return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, c(t, u, "GeneratorFunction")), t.prototype = Object.create(v), t;
41233  }, r.awrap = function (t) {
41234    return {
41235      __await: t
41236    };
41237  }, g(AsyncIterator.prototype), c(AsyncIterator.prototype, a, function () {
41238    return this;
41239  }), r.AsyncIterator = AsyncIterator, r.async = function (t, e, n, o, i) {
41240    void 0 === i && (i = Promise);
41241    var a = new AsyncIterator(h(t, e, n, o), i);
41242    return r.isGeneratorFunction(e) ? a : a.next().then(function (t) {
41243      return t.done ? t.value : a.next();
41244    });
41245  }, g(v), c(v, u, "Generator"), c(v, i, function () {
41246    return this;
41247  }), c(v, "toString", function () {
41248    return "[object Generator]";
41249  }), r.keys = function (t) {
41250    var r = Object(t),
41251      e = [];
41252    for (var n in r) e.unshift(n);
41253    return function t() {
41254      for (; e.length;) if ((n = e.pop()) in r) return t.value = n, t.done = !1, t;
41255      return t.done = !0, t;
41256    };
41257  }, r.values = x, Context.prototype = {
41258    constructor: Context,
41259    reset: function reset(r) {
41260      if (this.prev = this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEac
41260h(m), !r) for (var e in this) "t" === e.charAt(0) && n.call(this, e) && !isNaN(+e.slice(1)) && (this[e] = t);
41261    },
41262    stop: function stop() {
41263      this.done = !0;
41264      var t = this.tryEntries[0][4];
41265      if ("throw" === t.type) throw t.arg;
41266      return this.rval;
41267    },
41268    dispatchException: function dispatchException(r) {
41269      if (this.done) throw r;
41270      var e = this;
41271      function n(t) {
41272        a.type = "throw", a.arg = r, e.next = t;
41273      }
41274      for (var o = e.tryEntries.length - 1; o >= 0; --o) {
41275        var i = this.tryEntries[o],
41276          a = i[4],
41277          u = this.prev,
41278          c = i[1],
41279          h = i[2];
41280        if (-1 === i[0]) return n("end"), !1;
41281        if (!c && !h) throw Error("try statement without catch or finally");
41282        if (null != i[0] && i[0] <= u) {
41283          if (u < c) return this.method = "next", this.arg = t, n(c), !0;
41284          if (u < h) return n(h), !1;
41285        }
41286      }
41287    },
41288    abrupt: function abrupt(t, r) {
41289      for (var e = this.tryEntries.length - 1; e >= 0; --e) {
41290        var n = this.tryEntries[e];
41291        if (n[0] > -1 && n[0] <= this.prev && this.prev < n[2]) {
41292          var o = n;
41293          break;
41294        }
41295      }
41296      o && ("break" === t || "continue" === t) && o[0] <= r && r <= o[2] && (o = null);
41297      var i = o ? o[4] : {};
41298      return i.type = t, i.arg = r, o ? (this.method = "next", this.next = o[2], f) : this.complete(i);
41299    },
41300    complete: function complete(t, r) {
41301      if ("throw" === t.type) throw t.arg;
41302      return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && r && (this.next = r), f;
41303    },
41304    finish: function finish(t) {
41305      for (var r = this.tryEntries.length - 1; r >= 0; --r) {
41306        var e = this.tryEntries[r];
41307        if (e[2] === t) return this.complete(e[4], e[3]), m(e), f;
41308      }
41309    },
41310    "catch": function _catch(t) {
41311      for (var r = this.tryEntries.length - 1; r >= 0; --r) {
41312        var e = this.tryEntries[r];
41313        if (e[0] === t) {
41314          var n = e[4];
41315          if ("throw" === n.type) {
41316            var o = n.arg;
41317            m(e);
41318          }
41319          return o;
41320        }
41321      }
41322      throw Error("illegal catch attempt");
41323    },
41324    delegateYield: function delegateYield(r, e, n) {
41325      return this.delegate = {
41326        i: x(r),
41327        r: e,
41328        n: n
41329      }, "next" === this.method && (this.arg = t), f;
41330    }
41331  }, r;
41332}
41333module.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports["default"] = module.exports;
41334},{"./typeof.js":90}],88:[function(require,module,exports){
41335arguments[4][23][0].apply(exports,arguments)
41336},{"./typeof.js":90,"dup":23}],89:[function(require,module,exports){
41337arguments[4][24][0].apply(exports,arguments)
41338},{"./toPrimitive.js":88,"./typeof.js":90,"dup":24}],90:[function(require,module,exports){
41339arguments[4][25][0].apply(exports,arguments)
41340},{"dup":25}],91:[function(require,module,exports){
41341// TODO(Babel 8): Remove this file.
41342
41343var runtime = require("../helpers/regeneratorRuntime")();
41344module.exports = runtime;
41345
41346// Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736=
41347try {
41348  regeneratorRuntime = runtime;
41349} catch (accidentalStrictMode) {
41350  if (typeof globalThis === "object") {
41351    globalThis.regeneratorRuntime = runtime;
41352  } else {
41353    Function("r", "regeneratorRuntime = r")(runtime);
41354  }
41355}
41356
41357},{"../helpers/regeneratorRuntime":87}],92:[function(require,module,exports){
41358"use strict";
41359
41360var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
41361var _typeof = require("@babel/runtime/helpers/typeof");
41362Object.defineProperty(exports, "__esModule", {
41363  value: true
41364});
41365exports.WcoSwiperSlider = exports.Swiper = void 0;
41366var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
41367var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
41368var SwiperModule = _interopRequireWildcard(require("swiper/swiper-bundle.mjs"));
41369function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esMo
41369dule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
41370var Swiper = exports.Swiper = SwiperModule.Swiper || SwiperModule["default"];
41371var WcoSwiperSlider = exports.WcoSwiperSlider = /*#__PURE__*/function () {
41372  /**
41373   *
41374   * @param queryString {string}
41375   * @param config {object}
41376   */
41377  function WcoSwiperSlider(queryString, config) {
41378    (0, _classCallCheck2["default"])(this, WcoSwiperSlider);
41379    this.queryString = queryString;
41380    this.config = config;
41381    this.Swiper = Swiper;
41382  }
41383  return (0, _createClass2["default"])(WcoSwiperSlider, [{
41384    key: "initialize",
41385    value: function initialize() {
41386      var _this = this;
41387      document.addEventListener("DOMContentLoaded", function () {
41388        if (typeof Swiper !== 'function') {
41389          console.error('Swiper constructor not found!', SwiperModule);
41390          return;
41391        }
41392        _this.slider = new Swiper(_this.queryString, _this.config);
41393      });
41394    }
41395  }]);
41396}();
41397
41398},{"@babel/runtime/helpers/classCallCheck":96,"@babel/runtime/helpers/createClass":97,"@babel/runtime/helpers/interopRequireDefault":99,"@babel/runtime/helpers/typeof":108,"swiper/swiper-bundle.mjs":142}],93:[function(require,module,exports){
41399function _arrayLikeToArray(r, a) {
41400  (null == a || a > r.length) && (a = r.length);
41401  for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
41402  return n;
41403}
41404module.exports = _arrayLikeToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
41405},{}],94:[function(require,module,exports){
41406function _arrayWithHoles(r) {
41407  if (Array.isArray(r)) return r;
41408}
41409module.exports = _arrayWithHoles, module.exports.__esModule = true, module.exports["default"] = module.exports;
41410},{}],95:[function(require,module,exports){
41411var arrayLikeToArray = require("./arrayLikeToArray.js");
41412function _arrayWithoutHoles(r) {
41413  if (Array.isArray(r)) return arrayLikeToArray(r);
41414}
41415module.exports = _arrayWithoutHoles, module.exports.__esModule = true, module.exports["default"] = module.exports;
41416},{"./arrayLikeToArray.js":93}],96:[function(require,module,exports){
41417arguments[4][13][0].apply(exports,arguments)
41418},{"dup":13}],97:[function(require,module,exports){
41419arguments[4][14][0].apply(exports,arguments)
41420},{"./toPropertyKey.js":107,"dup":14}],98:[function(require,module,exports){
41421arguments[4][15][0].apply(exports,arguments)
41422},{"./toPropertyKey.js":107,"dup":15}],99:[function(require,module,exports){
41423arguments[4][19][0].apply(exports,arguments)
41424},{"dup":19}],100:[function(require,module,exports){
41425function _iterableToArray(r) {
41426  if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r);
41427}
41428module.exports = _iterableToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
41429},{}],101:[function(require,module,exports){
41430function _iterableToArrayLimit(r, l) {
41431  var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
41432  if (null != t) {
41433    var e,
41434      n,
41435      i,
41436      u,
41437      a = [],
41438      f = !0,
41439      o = !1;
41440    try {
41441      if (i = (t = t.call(r)).next, 0 === l) {
41442        if (Object(t) !== t) return;
41443        f = !1;
41444      } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);
41445    } catch (r) {
41446      o = !0, n = r;
41447    } finally {
41448      try {
41449        if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return;
41450      } finally {
41451        if (o) throw n;
41452      }
41453    }
41454    return a;
41455  }
41456}
41457module.exports = _iterableToArrayLimit, module.exports.__esModule = true, module.exports["default"] = module.exports;
41458},{}],102:[function(require,module,exports){
41459function _nonIterableRest() {
41460  throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
41461}
41462module.exports = _nonIterableRest, module.exports.__esModule = true, module.exports["default"] = module.exports;
41463},{}],103:[function(require,module,exports){
41464function _nonIterableSpread() {
41465  throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
41466}
41467module.exports = _nonIterableSpread, module.exports.__esModule = true, module.exports["default"] = module.exports;
41468},{}],104:[function(require,module,exports){
41469var arrayWithHoles = require("./arrayWithHoles.js");
41470var iterableToArrayLimit = require("./iterableToArrayLimit.js");
41471var unsupportedIterableToArray = require("./unsupportedIterableToArray.js");
41472var nonIterableRest = require("./nonIterableRest.js");
41473function _slicedToArray(r, e) {
41474  return arrayWithHoles(r) || iterableToArrayLimit(r, e) || unsupportedIterableToArray(r, e) || nonIterableRest();
41475}
41476module.exports = _slicedToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
41477},{"./arrayWithHoles.js":94,"./iterableToArrayLimit.js":101,"./nonIterableRest.js":102,"./unsupportedIterableToArray.js":109}],105:[function(require,module,exports){
41478var arrayWithoutHoles = require("./arrayWithoutHoles.js");
41479var iterableToArray = require("./iterableToArray.js");
41480var unsupportedIterableToArray = require("./unsupportedIterableToArray.js");
41481var nonIterableSpread = require("./nonIterableSpread.js");
41482function _toConsumableArray(r) {
41483  return arrayWithoutHoles(r) || iterableToArray(r) || unsupportedIterableToArray(r) || nonIterableSpread();
41484}
41485module.exports = _toConsumableArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
41486},{"./arrayWithoutHoles.js":95,"./iterableToArray.js":100,"./nonIterableSpread.js":103,"./unsupportedIterableToArray.js":109}],106:[function(require,module,exports){
41487arguments[4][23][0].apply(exports,arguments)
41488},{"./typeof.js":108,"dup":23}],107:[function(require,module,exports){
41489arguments[4][24][0].apply(exports,arguments)
41490},{"./toPrimitive.js":106,"./typeof.js":108,"dup":24}],108:[function(require,module,exports){
41491arguments[4][25][0].apply(exports,arguments)
41492},{"dup":25}],109:[function(require,module,exports){
41493var arrayLikeToArray = require("./arrayLikeToArray.js");
41494function _unsupportedIterableToArray(r, a) {
41495  if (r) {
41496    if ("string" == typeof r) return arrayLikeToArray(r, a);
41497    var t = {}.toString.call(r).slice(8, -1);
41498    return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? arrayLikeToArray(r, a) : void 0;
41499  }
41500}
41501module.exports = _unsupportedIterableToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
41502},{"./arrayLikeToArray.js":93}],110:[function(require,module,exports){
41503"use strict";
41504
41505Object.defineProperty(exports, "__esModule", {
41506  value: true
41507});
41508exports["default"] = A11y;
41509var _ssrWindowEsm = require("../shared/ssr-window.esm.mjs");
41510var _classesToSelector = require("../shared/classes-to-selector.mjs");
41511var _utils = require("../shared/utils.mjs");
41512function A11y(_ref) {
41513  var swiper = _ref.swiper,
41514    extendParams = _ref.extendParams,
41515    on = _ref.on;
41516  extendParams({
41517    a11y: {
41518      enabled: true,
41519      notificationClass: 'swiper-notification',
41520      prevSlideMessage: 'Previous slide',
41521      nextSlideMessage: 'Next slide',
41522      firstSlideMessage: 'This is the first slide',
41523      lastSlideMessage: 'This is the last slide',
41524      paginationBulletMessage: 'Go to slide {{index}}',
41525      slideLabelMessage: '{{index}} / {{slidesLength}}',
41526      containerMessage: null,
41527      containerRoleDescriptionMessage: null,
41528      containerRole: null,
41529      itemRoleDescriptionMessage: null,
41530      slideRole: 'group',
41531      id: null,
41532      scrollOnFocus: true,
41533      wrapperLiveRegion: true
41534    }
41535  });
41536  swiper.a11y = {
41537    clicked: false
41538  };
41539  var liveRegion = null;
41540  var preventFocusHandler;
41541  var focusTargetSlideEl;
41542  var visibilityChangedTimestamp = new Date().getTime();
41543  function notify(message) {
41544    var notification = liveRegion;
41545    if (notification.length === 0) return;
41546    (0, _utils.s)(notification, message);
41547  }
41548  function getRandomNumber() {
41549    var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 16;
41550    var randomChar = function randomChar() {
41551      return Math.round(16 * Math.random()).toString(16);
41552    };
41553    return 'x'.repeat(size).replace(/x/g, randomChar);
41554  }
41555  function makeElFocusable(el) {
41556    el = (0, _utils.m)(el);
41557    el.forEach(function (subEl) {
41558      subEl.setAttribute('tabIndex', '0');
41559    });
41560  }
41561  function makeElNotFocusable(el) {
41562    el = (0, _utils.m)(el);
41563    el.forEach(function (subEl) {
41564      subEl.setAttribute('tabIndex', '-1');
41565    });
41566  }
41567  function addElRole(el, role) {
41568    el = (0, _utils.m)(el);
41569    el.forEach(function (subEl) {
41570      subEl.setAttribute('role', role);
41571    });
41572  }
41573  function addElRoleDescription(el, description) {
41574    el = (0, _utils.m)(el);
41575    el.forEach(function (subEl) {
41576      subEl.setAttribute('aria-roledescription', description);
41577    });
41578  }
41579  function addElLabel(el, label) {
41580    el = (0, _utils.m)(el);
41581    el.forEach(function (subEl) {
41582      subEl.setAttribute('aria-label', label);
41583    });
41584  }
41585  function addElId(el, id) {
41586    el = (0, _utils.m)(el);
41587    el.forEach(function (subEl) {
41588      subEl.setAttribute('id', id);
41589    });
41590  }
41591  function addElLive(el, live) {
41592    el = (0, _utils.m)(el);
41593    el.forEach(function (subEl) {
41594      subEl.setAttribute('aria-live', live);
41595    });
41596  }
41597  function disableEl(el) {
41598    el = (0, _utils.m)(el);
41599    el.forEach(function (subEl) {
41600      subEl.setAttribute('aria-disabled', true);
41601    });
41602  }
41603  function enableEl(el) {
41604    el = (0, _utils.m)(el);
41605    el.forEach(function (subEl) {
41606      subEl.removeAttribute('aria-disabled');
41607    });
41608  }
41609  function onEnterOrSpaceKey(e) {
41610    if (e.keyCode !== 13 && e.keyCode !== 32) return;
41611    var params = swiper.params.a11y;
41612    var targetEl = e.target;
41613    if (swiper.pagination && swiper.pagination.el && (targetEl === swiper.pagination.el || swiper.pagination.el.contains(e.target))) {
41614      if (!e.target.matches((0, _classesToSelector.c)(swiper.params.pagination.bulletClass))) return;
41615    }
41616    if (swiper.navigation && swiper.navigation.prevEl && swiper.navigation.nextEl) {
41617      var prevEls = (0, _utils.m)(swiper.navigation.prevEl);
41618      var nextEls = (0, _utils.m)(swiper.navigation.nextEl);
41619      if (nextEls.includes(targetEl)) {
41620        if (!(swiper.isEnd && !swiper.params.loop)) {
41621          swiper.slideNext();
41622        }
41623        if (swiper.isEnd) {
41624          notify(params.lastSlideMessage);
41625        } else {
41626          notify(params.nextSlideMessage);
41627        }
41628      }
41629      if (prevEls.includes(targetEl)) {
41630        if (!(swiper.isBeginning && !swiper.params.loop)) {
41631          swiper.slidePrev();
41632        }
41633        if (swiper.isBeginning) {
41634          notify(params.firstSlideMessage);
41635        } else {
41636          notify(params.prevSlideMessage);
41637        }
41638      }
41639    }
41640    if (swiper.pagination && targetEl.matches((0, _classesToSelector.c)(swiper.params.pagination.bulletClass))) {
41641      targetEl.click();
41642    }
41643  }
41644  function updateNavigation() {
41645    if (swiper.params.loop || swiper.params.rewind || !swiper.navigation) return;
41646    var _swiper$navigation = swiper.navigation,
41647      nextEl = _swiper$navigation.nextEl,
41648      prevEl = _swiper$navigation.prevEl;
41649    if (prevEl) {
41650      if (swiper.isBeginning) {
41651        disableEl(prevEl);
41652        makeElNotFocusable(prevEl);
41653      } else {
41654        enableEl(prevEl);
41655        makeElFocusable(prevEl);
41656      }
41657    }
41658    if (nextEl) {
41659      if (swiper.isEnd) {
41660        disableEl(nextEl);
41661        makeElNotFocusable(nextEl);
41662      } else {
41663        enableEl(nextEl);
41664        makeElFocusable(nextEl);
41665      }
41666    }
41667  }
41668  function hasPagination() {
41669    return swiper.pagination && swiper.pagination.bullets && swiper.pagination.bullets.length;
41670  }
41671  function hasClickablePagination() {
41672    return hasPagination() && swiper.params.pagination.clickable;
41673  }
41674  function updatePagination() {
41675    var params = swiper.params.a11y;
41676    if (!hasPagination()) return;
41677    swiper.pagination.bullets.forEach(function (bulletEl) {
41678      if (swiper.params.pagination.clickable) {
41679        makeElFocusable(bulletEl);
41680        if (!swiper.params.pagination.renderBullet) {
41681          addElRole(bulletEl, 'button');
41682          addElLabel(bulletEl, params.paginationBulletMessage.replace(/\{\{index\}\}/, (0, _utils.j)(bulletEl) + 1));
41683        }
41684      }
41685      if (bulletEl.matches((0, _classesToSelector.c)(swiper.params.pagination.bulletActiveClass))) {
41686        bulletEl.setAttribute('aria-current', 'true');
41687      } else {
41688        bulletEl.removeAttribute('aria-current');
41689      }
41690    });
41691  }
41692  var initNavEl = function initNavEl(el, wrapperId, message) {
41693    makeElFocusable(el);
41694    if (el.tagName !== 'BUTTON') {
41695      addElRole(el, 'button');
41696      el.addEventListener('keydown', onEnterOrSpaceKey);
41697    }
41698    addElLabel(el, message);
41699  };
41700  var handlePointerDown = function handlePointerDown(e) {
41701    if (focusTargetSlideEl && focusTargetSlideEl !== e.target && !focusTargetSlideEl.contains(e.target)) {
41702      preventFocusHandler = true;
41703    }
41704    swiper.a11y.clicked = true;
41705  };
41706  var handlePointerUp = function handlePointerUp() {
41707    preventFocusHandler = false;
41708    requestAnimationFrame(function () {
41709      requestAnimationFrame(function () {
41710        if (!swiper.destroyed) {
41711          swiper.a11y.clicked = false;
41712        }
41713      });
41714    });
41715  };
41716  var onVisibilityChange = function onVisibilityChange(e) {
41717    visibilityChangedTimestamp = new Date().getTime();
41718  };
41719  var handleFocus = function handleFocus(e) {
41720    if (swiper.a11y.clicked || !swiper.params.a11y.scrollOnFocus) return;
41721    if (new Date().getTime() - visibilityChangedTimestamp < 100) return;
41722    var slideEl = e.target.closest(".".concat(swiper.params.slideClass, ", swiper-slide"));
41723    if (!slideEl || !swiper.slides.includes(slideEl)) return;
41724    focusTargetSlideEl = slideEl;
41725    var isVirtual = swiper.virtual && swiper.params.virtual.enabled;
41726    var isActive = (isVirtual ? parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10) : swiper.slides.indexOf(slideEl)) === swiper.activeIndex;
41727    var isVisible = swiper.params.watchSlidesProgress && swiper.visibleSlides && swiper.visibleSlides.includes(slideEl);
41728    if (isActive || isVisible) return;
41729    if (e.sourceCapabilities && e.sourceCapabilities.firesTouchEvents) return;
41730    if (swiper.isHorizontal()) {
41731      swiper.el.scrollLeft = 0;
41732    } else {
41733      swiper.el.scrollTop = 0;
41734    }
41735    requestAnimationFrame(function () {
41736      if (preventFocusHandler) return;
41737      if (swiper.params.loop) {
41738        swiper.slideToLoop(swiper.getSlideIndexWhenGrid(parseInt(slideEl.getAttribute('data-swiper-slide-index'))), 0);
41739      } else if (isVirtual) {
41740        swiper.slideTo(swiper.getSlideIndexWhenGrid(parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10)), 0);
41741      } else {
41742        swiper.slideTo(swiper.getSlideIndexWhenGrid(swiper.slides.indexOf(slideEl)), 0);
41743      }
41744      preventFocusHandler = false;
41745    });
41746  };
41747  var initSlides = function initSlides() {
41748    var params = swiper.params.a11y;
41749    if (params.itemRoleDescriptionMessage) {
41750      addElRoleDescription(swiper.slides, params.itemRoleDescriptionMessage);
41751    }
41752    if (params.slideRole) {
41753      addElRole(swiper.slides, params.slideRole);
41754    }
41755    var slidesLength = swiper.slides.length;
41756    if (params.slideLabelMessage) {
41757      swiper.slides.forEach(function (slideEl, index) {
41758        var slideIndex = swiper.params.loop ? parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10) : index;
41759        var ariaLabelMessage = params.slideLabelMessage.replace(/\{\{index\}\}/, slideIndex + 1).replace(/\{\{slidesLength\}\}/, slidesLength);
41760        addElLabel(slideEl, ariaLabelMessage);
41761      });
41762    }
41763  };
41764  var init = function init() {
41765    var params = swiper.params.a11y;
41766    swiper.el.append(liveRegion);
41767
41768    // Container
41769    var containerEl = swiper.el;
41770    if (params.containerRoleDescriptionMessage) {
41771      addElRoleDescription(containerEl, params.containerRoleDescriptionMessage);
41772    }
41773    if (params.containerMessage) {
41774      addElLabel(containerEl, params.containerMessage);
41775    }
41776    if (params.containerRole) {
41777      addElRole(containerEl, params.containerRole);
41778    }
41779
41780    // Wrapper
41781    var wrapperEl = swiper.wrapperEl;
41782    var wrapperId = params.id || wrapperEl.getAttribute('id') || "swiper-wrapper-".concat(getRandomNumber(16));
41783    addElId(wrapperEl, wrapperId);
41784    if (params.wrapperLiveRegion) {
41785      var live = swiper.params.autoplay && swiper.params.autoplay.enabled ? 'off' : 'polite';
41786      addElLive(wrapperEl, live);
41787    }
41788
41789    // Slide
41790    initSlides();
41791
41792    // Navigation
41793    var _ref2 = swiper.navigation ? swiper.navigation : {},
41794      nextEl = _ref2.nextEl,
41795      prevEl = _ref2.prevEl;
41796    nextEl = (0, _utils.m)(nextEl);
41797    prevEl = (0, _utils.m)(prevEl);
41798    if (nextEl) {
41799      nextEl.forEach(function (el) {
41800        return initNavEl(el, wrapperId, params.nextSlideMessage);
41801      });
41802    }
41803    if (prevEl) {
41804      prevEl.forEach(function (el) {
41805        return initNavEl(el, wrapperId, params.prevSlideMessage);
41806      });
41807    }
41808
41809    // Pagination
41810    if (hasClickablePagination()) {
41811      var paginationEl = (0, _utils.m)(swiper.pagination.el);
41812      paginationEl.forEach(function (el) {
41813        el.addEventListener('keydown', onEnterOrSpaceKey);
41814      });
41815    }
41816
41817    // Tab focus
41818    var document = (0, _ssrWindowEsm.g)();
41819    document.addEventListener('visibilitychange', onVisibilityChange);
41820    swiper.el.addEventListener('focus', handleFocus, true);
41821    swiper.el.addEventListener('pointerdown', handlePointerDown, true);
41822    swiper.el.addEventListener('pointerup', handlePointerUp, true);
41823  };
41824  function destroy() {
41825    if (liveRegion) liveRegion.remove();
41826    var _ref3 = swiper.navigation ? swiper.navigation : {},
41827      nextEl = _ref3.nextEl,
41828      prevEl = _ref3.prevEl;
41829    nextEl = (0, _utils.m)(nextEl);
41830    prevEl = (0, _utils.m)(prevEl);
41831    if (nextEl) {
41832      nextEl.forEach(function (el) {
41833        return el.removeEventListener('keydown', onEnterOrSpaceKey);
41834      });
41835    }
41836    if (prevEl) {
41837      prevEl.forEach(function (el) {
41838        return el.removeEventListener('keydown', onEnterOrSpaceKey);
41839      });
41840    }
41841
41842    // Pagination
41843    if (hasClickablePagination()) {
41844      var paginationEl = (0, _utils.m)(swiper.pagination.el);
41845      paginationEl.forEach(function (el) {
41846        el.removeEventListener('keydown', onEnterOrSpaceKey);
41847      });
41848    }
41849    var document = (0, _ssrWindowEsm.g)();
41850    document.removeEventListener('visibilitychange', onVisibilityChange);
41851    // Tab focus
41852    if (swiper.el && typeof swiper.el !== 'string') {
41853      swiper.el.removeEventListener('focus', handleFocus, true);
41854      swiper.el.removeEventListener('pointerdown', handlePointerDown, true);
41855      swiper.el.removeEventListener('pointerup', handlePointerUp, true);
41856    }
41857  }
41858  on('beforeInit', function () {
41859    liveRegion = (0, _utils.c)('span', swiper.params.a11y.notificationClass);
41860    liveRegion.setAttribute('aria-live', 'assertive');
41861    liveRegion.setAttribute('aria-atomic', 'true');
41862  });
41863  on('afterInit', function () {
41864    if (!swiper.params.a11y.enabled) return;
41865    init();
41866  });
41867  on('slidesLengthChange snapGridLengthChange slidesGridLengthChange', function () {
41868    if (!swiper.params.a11y.enabled) return;
41869    initSlides();
41870  });
41871  on('fromEdge toEdge afterInit lock unlock', function () {
41872    if (!swiper.params.a11y.enabled) return;
41873    updateNavigation();
41874  });
41875  on('paginationUpdate', function () {
41876    if (!swiper.params.a11y.enabled) return;
41877    updatePagination();
41878  });
41879  on('destroy', function () {
41880    if (!swiper.params.a11y.enabled) return;
41881    destroy();
41882  });
41883}
41884
41885},{"../shared/classes-to-selector.mjs":133,"../shared/ssr-window.esm.mjs":139,"../shared/utils.mjs":141}],111:[function(require,module,exports){
41886"use strict";
41887
41888Object.defineProperty(exports, "__esModule", {
41889  value: true
41890});
41891exports["default"] = Autoplay;
41892var _ssrWindowEsm = require("../shared/ssr-window.esm.mjs");
41893/* eslint no-underscore-dangle: "off" */
41894/* eslint no-use-before-define: "off" */
41895function Autoplay(_ref) {
41896  var swiper = _ref.swiper,
41897    extendParams = _ref.extendParams,
41898    on = _ref.on,
41899    emit = _ref.emit,
41900    params = _ref.params;
41901  swiper.autoplay = {
41902    running: false,
41903    paused: false,
41904    timeLeft: 0
41905  };
41906  extendParams({
41907    autoplay: {
41908      enabled: false,
41909      delay: 3000,
41910      waitForTransition: true,
41911      disableOnInteraction: false,
41912      stopOnLastSlide: false,
41913      reverseDirection: false,
41914      pauseOnMouseEnter: false
41915    }
41916  });
41917  var timeout;
41918  var raf;
41919  var autoplayDelayTotal = params && params.autoplay ? params.autoplay.delay : 3000;
41920  var autoplayDelayCurrent = params && params.autoplay ? params.autoplay.delay : 3000;
41921  var autoplayTimeLeft;
41922  var autoplayStartTime = new Date().getTime();
41923  var wasPaused;
41924  var isTouched;
41925  var pausedByTouch;
41926  var touchStartTimeout;
41927  var pausedByInteraction;
41928  var pausedByPointerEnter;
41929  function onTransitionEnd(e) {
41930    if (!swiper || swiper.destroyed || !swiper.wrapperEl) return;
41931    if (e.target !== swiper.wrapperEl) return;
41932    swiper.wrapperEl.removeEventListener('transitionend', onTransitionEnd);
41933    if (pausedByPointerEnter || e.detail && e.detail.bySwiperTouchMove) {
41934      return;
41935    }
41936    resume();
41937  }
41938  var _calcTimeLeft = function calcTimeLeft() {
41939    if (swiper.destroyed || !swiper.autoplay.running) return;
41940    if (swiper.autoplay.paused) {
41941      wasPaused = true;
41942    } else if (wasPaused) {
41943      autoplayDelayCurrent = autoplayTimeLeft;
41944      wasPaused = false;
41945    }
41946    var timeLeft = swiper.autoplay.paused ? autoplayTimeLeft : autoplayStartTime + autoplayDelayCurrent - new Date().getTime();
41947    swiper.autoplay.timeLeft = timeLeft;
41948    emit('autoplayTimeLeft', timeLeft, timeLeft / autoplayDelayTotal);
41949    raf = requestAnimationFrame(function () {
41950      _calcTimeLeft();
41951    });
41952  };
41953  var getSlideDelay = function getSlideDelay() {
41954    var activeSlideEl;
41955    if (swiper.virtual && swiper.params.virtual.enabled) {
41956      activeSlideEl = swiper.slides.find(function (slideEl) {
41957        return slideEl.classList.contains('swiper-slide-active');
41958      });
41959    } else {
41960      activeSlideEl = swiper.slides[swiper.activeIndex];
41961    }
41962    if (!activeSlideEl) return undefined;
41963    var currentSlideDelay = parseInt(activeSlideEl.getAttribute('data-swiper-autoplay'), 10);
41964    return currentSlideDelay;
41965  };
41966  var getTotalDelay = function getTotalDelay() {
41967    var totalDelay = swiper.params.autoplay.delay;
41968    var currentSlideDelay = getSlideDelay();
41969    if (!Number.isNaN(currentSlideDelay) && currentSlideDelay > 0) {
41970      totalDelay = currentSlideDelay;
41971    }
41972    return totalDelay;
41973  };
41974  var _run = function run(delayForce) {
41975    if (swiper.destroyed || !swiper.autoplay.running) return;
41976    cancelAnimationFrame(raf);
41977    _calcTimeLeft();
41978    var delay = delayForce;
41979    if (typeof delay === 'undefined') {
41980      delay = getTotalDelay();
41981      autoplayDelayTotal = delay;
41982      autoplayDelayCurrent = delay;
41983    }
41984    autoplayTimeLeft = delay;
41985    var speed = swiper.params.speed;
41986    var proceed = function proceed() {
41987      if (!swiper || swiper.destroyed) return;
41988      if (swiper.params.autoplay.reverseDirection) {
41989        if (!swiper.isBeginning || swiper.params.loop || swiper.params.rewind) {
41990          swiper.slidePrev(speed, true, true);
41991          emit('autoplay');
41992        } else if (!swiper.params.autoplay.stopOnLastSlide) {
41993          swiper.slideTo(swiper.slides.length - 1, speed, true, true);
41994          emit('autoplay');
41995        }
41996      } else {
41997        if (!swiper.isEnd || swiper.params.loop || swiper.params.rewind) {
41998          swiper.slideNext(speed, true, true);
41999          emit('autoplay');
42000        } else if (!swiper.params.autoplay.stopOnLastSlide) {
42001          swiper.slideTo(0, speed, true, true);
42002          emit('autoplay');
42003        }
42004      }
42005      if (swiper.params.cssMode) {
42006        autoplayStartTime = new Date().getTime();
42007        requestAnimationFrame(function () {
42008          _run();
42009        });
42010      }
42011    };
42012    if (delay > 0) {
42013      clearTimeout(timeout);
42014      timeout = setTimeout(function () {
42015        proceed();
42016      }, delay);
42017    } else {
42018      requestAnimationFrame(function () {
42019        proceed();
42020      });
42021    }
42022
42023    // eslint-disable-next-line
42024    return delay;
42025  };
42026  var start = function start() {
42027    autoplayStartTime = new Date().getTime();
42028    swiper.autoplay.running = true;
42029    _run();
42030    emit('autoplayStart');
42031  };
42032  var stop = function stop() {
42033    swiper.autoplay.running = false;
42034    clearTimeout(timeout);
42035    cancelAnimationFrame(raf);
42036    emit('autoplayStop');
42037  };
42038  var pause = function pause(internal, reset) {
42039    if (swiper.destroyed || !swiper.autoplay.running) return;
42040    clearTimeout(timeout);
42041    if (!internal) {
42042      pausedByInteraction = true;
42043    }
42044    var proceed = function proceed() {
42045      emit('autoplayPause');
42046      if (swiper.params.autoplay.waitForTransition) {
42047        swiper.wrapperEl.addEventListener('transitionend', onTransitionEnd);
42048      } else {
42049        resume();
42050      }
42051    };
42052    swiper.autoplay.paused = true;
42053    if (reset) {
42054      proceed();
42055      return;
42056    }
42057    var delay = autoplayTimeLeft || swiper.params.autoplay.delay;
42058    autoplayTimeLeft = delay - (new Date().getTime() - autoplayStartTime);
42059    if (swiper.isEnd && autoplayTimeLeft < 0 && !swiper.params.loop) return;
42060    if (autoplayTimeLeft < 0) autoplayTimeLeft = 0;
42061    proceed();
42062  };
42063  var resume = function resume() {
42064    if (swiper.isEnd && autoplayTimeLeft < 0 && !swiper.params.loop || swiper.destroyed || !swiper.autoplay.running) return;
42065    autoplayStartTime = new Date().getTime();
42066    if (pausedByInteraction) {
42067      pausedByInteraction = false;
42068      _run(autoplayTimeLeft);
42069    } else {
42070      _run();
42071    }
42072    swiper.autoplay.paused = false;
42073    emit('autoplayResume');
42074  };
42075  var onVisibilityChange = function onVisibilityChange() {
42076    if (swiper.destroyed || !swiper.autoplay.running) return;
42077    var document = (0, _ssrWindowEsm.g)();
42078    if (document.visibilityState === 'hidden') {
42079      pausedByInteraction = true;
42080      pause(true);
42081    }
42082    if (document.visibilityState === 'visible') {
42083      resume();
42084    }
42085  };
42086  var onPointerEnter = function onPointerEnter(e) {
42087    if (e.pointerType !== 'mouse') return;
42088    pausedByInteraction = true;
42089    pausedByPointerEnter = true;
42090    if (swiper.animating || swiper.autoplay.paused) return;
42091    pause(true);
42092  };
42093  var onPointerLeave = function onPointerLeave(e) {
42094    if (e.pointerType !== 'mouse') return;
42095    pausedByPointerEnter = false;
42096    if (swiper.autoplay.paused) {
42097      resume();
42098    }
42099  };
42100  var attachMouseEvents = function attachMouseEvents() {
42101    if (swiper.params.autoplay.pauseOnMouseEnter) {
42102      swiper.el.addEventListener('pointerenter', onPointerEnter);
42103      swiper.el.addEventListener('pointerleave', onPointerLeave);
42104    }
42105  };
42106  var detachMouseEvents = function detachMouseEvents() {
42107    if (swiper.el && typeof swiper.el !== 'string') {
42108      swiper.el.removeEventListener('pointerenter', onPointerEnter);
42109      swiper.el.removeEventListener('pointerleave', onPointerLeave);
42110    }
42111  };
42112  var attachDocumentEvents = function attachDocumentEvents() {
42113    var document = (0, _ssrWindowEsm.g)();
42114    document.addEventListener('visibilitychange', onVisibilityChange);
42115  };
42116  var detachDocumentEvents = function detachDocumentEvents() {
42117    var document = (0, _ssrWindowEsm.g)();
42118    document.removeEventListener('visibilitychange', onVisibilityChange);
42119  };
42120  on('init', function () {
42121    if (swiper.params.autoplay.enabled) {
42122      attachMouseEvents();
42123      attachDocumentEvents();
42124      start();
42125    }
42126  });
42127  on('destroy', function () {
42128    detachMouseEvents();
42129    detachDocumentEvents();
42130    if (swiper.autoplay.running) {
42131      stop();
42132    }
42133  });
42134  on('_freeModeStaticRelease', function () {
42135    if (pausedByTouch || pausedByInteraction) {
42136      resume();
42137    }
42138  });
42139  on('_freeModeNoMomentumRelease', function () {
42140    if (!swiper.params.autoplay.disableOnInteraction) {
42141      pause(true, true);
42142    } else {
42143      stop();
42144    }
42145  });
42146  on('beforeTransitionStart', function (_s, speed, internal) {
42147    if (swiper.destroyed || !swiper.autoplay.running) return;
42148    if (internal || !swiper.params.autoplay.disableOnInteraction) {
42149      pause(true, true);
42150    } else {
42151      stop();
42152    }
42153  });
42154  on('sliderFirstMove', function () {
42155    if (swiper.destroyed || !swiper.autoplay.running) return;
42156    if (swiper.params.autoplay.disableOnInteraction) {
42157      stop();
42158      return;
42159    }
42160    isTouched = true;
42161    pausedByTouch = false;
42162    pausedByInteraction = false;
42163    touchStartTimeout = setTimeout(function () {
42164      pausedByInteraction = true;
42165      pausedByTouch = true;
42166      pause(true);
42167    }, 200);
42168  });
42169  on('touchEnd', function () {
42170    if (swiper.destroyed || !swiper.autoplay.running || !isTouched) return;
42171    clearTimeout(touchStartTimeout);
42172    clearTimeout(timeout);
42173    if (swiper.params.autoplay.disableOnInteraction) {
42174      pausedByTouch = false;
42175      isTouched = false;
42176      return;
42177    }
42178    if (pausedByTouch && swiper.params.cssMode) resume();
42179    pausedByTouch = false;
42180    isTouched = false;
42181  });
42182  on('slideChange', function () {
42183    if (swiper.destroyed || !swiper.autoplay.running) return;
42184    if (swiper.autoplay.paused) {
42185      autoplayTimeLeft = getTotalDelay();
42186      autoplayDelayTotal = getTotalDelay();
42187    }
42188  });
42189  Object.assign(swiper.autoplay, {
42190    start: start,
42191    stop: stop,
42192    pause: pause,
42193    resume: resume
42194  });
42195}
42196
42197},{"../shared/ssr-window.esm.mjs":139}],112:[function(require,module,exports){
42198"use strict";
42199
42200var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
42201Object.defineProperty(exports, "__esModule", {
42202  value: true
42203});
42204exports["default"] = Controller;
42205var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
42206var _utils = require("../shared/utils.mjs");
42207/* eslint no-bitwise: ["error", { "allow": [">>"] }] */
42208function Controller(_ref) {
42209  var swiper = _ref.swiper,
42210    extendParams = _ref.extendParams,
42211    on = _ref.on;
42212  extendParams({
42213    controller: {
42214      control: undefined,
42215      inverse: false,
42216      by: 'slide' // or 'container'
42217    }
42218  });
42219  swiper.controller = {
42220    control: undefined
42221  };
42222  function LinearSpline(x, y) {
42223    var binarySearch = function search() {
42224      var maxIndex;
42225      var minIndex;
42226      var guess;
42227      return function (array, val) {
42228        minIndex = -1;
42229        maxIndex = array.length;
42230        while (maxIndex - minIndex > 1) {
42231          guess = maxIndex + minIndex >> 1;
42232          if (array[guess] <= val) {
42233            minIndex = guess;
42234          } else {
42235            maxIndex = guess;
42236          }
42237        }
42238        return maxIndex;
42239      };
42240    }();
42241    this.x = x;
42242    this.y = y;
42243    this.lastIndex = x.length - 1;
42244    // Given an x value (x2), return the expected y2 value:
42245    // (x1,y1) is the known point before given value,
42246    // (x3,y3) is the known point after given value.
42247    var i1;
42248    var i3;
42249    this.interpolate = function interpolate(x2) {
42250      if (!x2) return 0;
42251
42252      // Get the indexes of x1 and x3 (the array indexes before and after given x2):
42253      i3 = binarySearch(this.x, x2);
42254      i1 = i3 - 1;
42255
42256      // We have our indexes i1 & i3, so we can calculate already:
42257      // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1
42258      return (x2 - this.x[i1]) * (this.y[i3] - this.y[i1]) / (this.x[i3] - this.x[i1]) + this.y[i1];
42259    };
42260    return this;
42261  }
42262  function getInterpolateFunction(c) {
42263    swiper.controller.spline = swiper.params.loop ? new LinearSpline(swiper.slidesGrid, c.slidesGrid) : new LinearSpline(swiper.snapGrid, c.snapGrid);
42264  }
42265  function setTranslate(_t, byController) {
42266    var controlled = swiper.controller.control;
42267    var multiplier;
42268    var controlledTranslate;
42269    var Swiper = swiper.constructor;
42270    function setControlledTranslate(c) {
42271      if (c.destroyed) return;
42272
42273      // this will create an Interpolate function based on the snapGrids
42274      // x is the Grid of the scrolled scroller and y will be the controlled scroller
42275      // it makes sense to create this only once and recall it for the interpolation
42276      // the function does a lot of value caching for performance
42277      var translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;
42278      if (swiper.params.controller.by === 'slide') {
42279        getInterpolateFunction(c);
42280        // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid
42281        // but it did not work out
42282        controlledTranslate = -swiper.controller.spline.interpolate(-translate);
42283      }
42284      if (!controlledTranslate || swiper.params.controller.by === 'container') {
42285        multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());
42286        if (Number.isNaN(multiplier) || !Number.isFinite(multiplier)) {
42287          multiplier = 1;
42288        }
42289        controlledTranslate = (translate - swiper.minTranslate()) * multiplier + c.minTranslate();
42290      }
42291      if (swiper.params.controller.inverse) {
42292        controlledTranslate = c.maxTranslate() - controlledTranslate;
42293      }
42294      c.updateProgress(controlledTranslate);
42295      c.setTranslate(controlledTranslate, swiper);
42296      c.updateActiveIndex();
42297      c.updateSlidesClasses();
42298    }
42299    if (Array.isArray(controlled)) {
42300      for (var i = 0; i < controlled.length; i += 1) {
42301        if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
42302          setControlledTranslate(controlled[i]);
42303        }
42304      }
42305    } else if (controlled instanceof Swiper && byController !== controlled) {
42306      setControlledTranslate(controlled);
42307    }
42308  }
42309  function setTransition(duration, byController) {
42310    var Swiper = swiper.constructor;
42311    var controlled = swiper.controller.control;
42312    var i;
42313    function setControlledTransition(c) {
42314      if (c.destroyed) return;
42315      c.setTransition(duration, swiper);
42316      if (duration !== 0) {
42317        c.transitionStart();
42318        if (c.params.autoHeight) {
42319          (0, _utils.n)(function () {
42320            c.updateAutoHeight();
42321          });
42322        }
42323        (0, _utils.o)(c.wrapperEl, function () {
42324          if (!controlled) return;
42325          c.transitionEnd();
42326        });
42327      }
42328    }
42329    if (Array.isArray(controlled)) {
42330      for (i = 0; i < controlled.length; i += 1) {
42331        if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
42332          setControlledTransition(controlled[i]);
42333        }
42334      }
42335    } else if (controlled instanceof Swiper && byController !== controlled) {
42336      setControlledTransition(controlled);
42337    }
42338  }
42339  function removeSpline() {
42340    if (!swiper.controller.control) return;
42341    if (swiper.controller.spline) {
42342      swiper.controller.spline = undefined;
42343      delete swiper.controller.spline;
42344    }
42345  }
42346  on('beforeInit', function () {
42347    if (typeof window !== 'undefined' && (
42348    // eslint-disable-line
42349    typeof swiper.params.controller.control === 'string' || swiper.params.controller.control instanceof HTMLElement)) {
42350      var controlElements = typeof swiper.params.controller.control === 'string' ? (0, _toConsumableArray2["default"])(document.querySelectorAll(swiper.params.controller.control)) : [swiper.params.controller.control];
42351      controlElements.forEach(function (controlElement) {
42352        if (!swiper.controller.control) swiper.controller.control = [];
42353        if (controlElement && controlElement.swiper) {
42354          swiper.controller.control.push(controlElement.swiper);
42355        } else if (controlElement) {
42356          var eventName = "".concat(swiper.params.eventsPrefix, "init");
42357          var _onControllerSwiper = function onControllerSwiper(e) {
42358            swiper.controller.control.push(e.detail[0]);
42359            swiper.update();
42360            controlElement.removeEventListener(eventName, _onControllerSwiper);
42361          };
42362          controlElement.addEventListener(eventName, _onControllerSwiper);
42363        }
42364      });
42365      return;
42366    }
42367    swiper.controller.control = swiper.params.controller.control;
42368  });
42369  on('update', function () {
42370    removeSpline();
42371  });
42372  on('resize', function () {
42373    removeSpline();
42374  });
42375  on('observerUpdate', function () {
42376    removeSpline();
42377  });
42378  on('setTranslate', function (_s, translate, byController) {
42379    if (!swiper.controller.control || swiper.controller.control.destroyed) return;
42380    swiper.controller.setTranslate(translate, byController);
42381  });
42382  on('setTransition', function (_s, duration, byController) {
42383    if (!swiper.controller.control || swiper.controller.control.destroyed) return;
42384    swiper.controller.setTransition(duration, byController);
42385  });
42386  Object.assign(swiper.controller, {
42387    setTranslate: setTranslate,
42388    setTransition: setTransition
42389  });
42390}
42391
42392},{"../shared/utils.mjs":141,"@babel/runtime/helpers/interopRequireDefault":99,"@babel/runtime/helpers/toConsumableArray":105}],113:[function(require,module,exports){
42393"use strict";
42394
42395Object.defineProperty(exports, "__esModule", {
42396  value: true
42397});
42398exports["default"] = EffectCards;
42399var _createShadow = require("../shared/create-shadow.mjs");
42400var _effectInit = require("../shared/effect-init.mjs");
42401var _effectTarget = require("../shared/effect-target.mjs");
42402var _effectVirtualTransitionEnd = require("../shared/effect-virtual-transition-end.mjs");
42403var _utils = require("../shared/utils.mjs");
42404function EffectCards(_ref) {
42405  var swiper = _ref.swiper,
42406    extendParams = _ref.extendParams,
42407    on = _ref.on;
42408  extendParams({
42409    cardsEffect: {
42410      slideShadows: true,
42411      rotate: true,
42412      perSlideRotate: 2,
42413      perSlideOffset: 8
42414    }
42415  });
42416  var setTranslate = function setTranslate() {
42417    var slides = swiper.slides,
42418      activeIndex = swiper.activeIndex,
42419      rtl = swiper.rtlTranslate;
42420    var params = swiper.params.cardsEffect;
42421    var _swiper$touchEventsDa = swiper.touchEventsData,
42422      startTranslate = _swiper$touchEventsDa.startTranslate,
42423      isTouched = _swiper$touchEventsDa.isTouched;
42424    var currentTranslate = rtl ? -swiper.translate : swiper.translate;
42425    for (var i = 0; i < slides.length; i += 1) {
42426      var slideEl = slides[i];
42427      var slideProgress = slideEl.progress;
42428      var progress = Math.min(Math.max(slideProgress, -4), 4);
42429      var offset = slideEl.swiperSlideOffset;
42430      if (swiper.params.centeredSlides && !swiper.params.cssMode) {
42431        swiper.wrapperEl.style.transform = "translateX(".concat(swiper.minTranslate(), "px)");
42432      }
42433      if (swiper.params.centeredSlides && swiper.params.cssMode) {
42434        offset -= slides[0].swiperSlideOffset;
42435      }
42436      var tX = swiper.params.cssMode ? -offset - swiper.translate : -offset;
42437      var tY = 0;
42438      var tZ = -100 * Math.abs(progress);
42439      var scale = 1;
42440      var rotate = -params.perSlideRotate * progress;
42441      var tXAdd = params.perSlideOffset - Math.abs(progress) * 0.75;
42442      var slideIndex = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.from + i : i;
42443      var isSwipeToNext = (slideIndex === activeIndex || slideIndex === activeIndex - 1) && progress > 0 && progress < 1 && (isTouched || swiper.params.cssMode) && currentTranslate < startTranslate;
42444      var isSwipeToPrev = (slideIndex === activeIndex || slideIndex === activeIndex + 1) && progress < 0 && progress > -1 && (isTouched || swiper.params.cssMode) && currentTranslate > startTranslate;
42445      if (isSwipeToNext || isSwipeToPrev) {
42446        var subProgress = Math.pow(1 - Math.abs((Math.abs(progress) - 0.5) / 0.5), 0.5);
42447        rotate += -28 * progress * subProgress;
42448        scale += -0.5 * subProgress;
42449        tXAdd += 96 * subProgress;
42450        tY = "".concat((params.rotate || swiper.isHorizontal() ? -25 
42450: 0) * subProgress * Math.abs(progress), "%");
42451      }
42452      if (progress < 0) {
42453        // next
42454        tX = "calc(".concat(tX, "px ").concat(rtl ? '-' : '+', " (").concat(tXAdd * Math.abs(progress), "%))");
42455      } else if (progress > 0) {
42456        // prev
42457        tX = "calc(".concat(tX, "px ").concat(rtl ? '-' : '+', " (-").concat(tXAdd * Math.abs(progress), "%))");
42458      } else {
42459        tX = "".concat(tX, "px");
42460      }
42461      if (!swiper.isHorizontal()) {
42462        var prevY = tY;
42463        tY = tX;
42464        tX = prevY;
42465      }
42466      var scaleString = progress < 0 ? "".concat(1 + (1 - scale) * progress) : "".concat(1 - (1 - scale) * progress);
42467
42468      /* eslint-disable */
42469      var transform = "\n        translate3d(".concat(tX, ", ").concat(tY, ", ").concat(tZ, "px)\n        rotateZ(").concat(params.rotate ? rtl ? -rotate : rotate : 0, "deg)\n        scale(").concat(scaleString, ")\n      ");
42470      /* eslint-enable */
42471
42472      if (params.slideShadows) {
42473        // Set shadows
42474        var shadowEl = slideEl.querySelector('.swiper-slide-shadow');
42475        if (!shadowEl) {
42476          shadowEl = (0, _createShadow.c)('cards', slideEl);
42477        }
42478        if (shadowEl) shadowEl.style.opacity = Math.min(Math.max((Math.abs(progress) - 0.5) / 0.5, 0), 1);
42479      }
42480      slideEl.style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;
42481      var targetEl = (0, _effectTarget.e)(params, slideEl);
42482      targetEl.style.transform = transform;
42483    }
42484  };
42485  var setTransition = function setTransition(duration) {
42486    var transformElements = swiper.slides.map(function (slideEl) {
42487      return (0, _utils.g)(slideEl);
42488    });
42489    transformElements.forEach(function (el) {
42490      el.style.transitionDuration = "".concat(duration, "ms");
42491      el.querySelectorAll('.swiper-slide-shadow').forEach(function (shadowEl) {
42492        shadowEl.style.transitionDuration = "".concat(duration, "ms");
42493      });
42494    });
42495    (0, _effectVirtualTransitionEnd.e)({
42496      swiper: swiper,
42497      duration: duration,
42498      transformElements: transformElements
42499    });
42500  };
42501  (0, _effectInit.e)({
42502    effect: 'cards',
42503    swiper: swiper,
42504    on: on,
42505    setTranslate: setTranslate,
42506    setTransition: setTransition,
42507    perspective: function perspective() {
42508      return true;
42509    },
42510    overwriteParams: function overwriteParams() {
42511      return {
42512        _loopSwapReset: false,
42513        watchSlidesProgress: true,
42514        loopAdditionalSlides: swiper.params.cardsEffect.rotate ? 3 : 2,
42515        centeredSlides: true,
42516        virtualTranslate: !swiper.params.cssMode
42517      };
42518    }
42519  });
42520}
42521
42522},{"../shared/create-shadow.mjs":135,"../shared/effect-init.mjs":136,"../shared/effect-target.mjs":137,"../shared/effect-virtual-transition-end.mjs":138,"../shared/utils.mjs":141}],114:[function(require,module,exports){
42523"use strict";
42524
42525Object.defineProperty(exports, "__esModule", {
42526  value: true
42527});
42528exports["default"] = EffectCoverflow;
42529var _createShadow = require("../shared/create-shadow.mjs");
42530var _effectInit = require("../shared/effect-init.mjs");
42531var _effectTarget = require("../shared/effect-target.mjs");
42532var _utils = require("../shared/utils.mjs");
42533function EffectCoverflow(_ref) {
42534  var swiper = _ref.swiper,
42535    extendParams = _ref.extendParams,
42536    on = _ref.on;
42537  extendParams({
42538    coverflowEffect: {
42539      rotate: 50,
42540      stretch: 0,
42541      depth: 100,
42542      scale: 1,
42543      modifier: 1,
42544      slideShadows: true
42545    }
42546  });
42547  var setTranslate = function setTranslate() {
42548    var swiperWidth = swiper.width,
42549      swiperHeight = swiper.height,
42550      slides = swiper.slides,
42551      slidesSizesGrid = swiper.slidesSizesGrid;
42552    var params = swiper.params.coverflowEffect;
42553    var isHorizontal = swiper.isHorizontal();
42554    var transform = swiper.translate;
42555    var center = isHorizontal ? -transform + swiperWidth / 2 : -transform + swiperHeight / 2;
42556    var rotate = isHorizontal ? params.rotate : -params.rotate;
42557    var translate = params.depth;
42558    var r = (0, _utils.a)(swiper);
42559    // Each slide offset from center
42560    for (var i = 0, length = slides.length; i < length; i += 1) {
42561      var slideEl = slides[i];
42562      var slideSize = slidesSizesGrid[i];
42563      var slideOffset = slideEl.swiperSlideOffset;
42564      var centerOffset = (center - slideOffset - slideSize / 2) / slideSize;
42565      var offsetMultiplier = typeof params.modifier === 'function' ? params.modifier(centerOffset) : centerOffset * params.modifier;
42566      var rotateY = isHorizontal ? rotate * offsetMultiplier : 0;
42567      var rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;
42568      // var rotateZ = 0
42569      var translateZ = -translate * Math.abs(offsetMultiplier);
42570      var stretch = params.stretch;
42571      // Allow percentage to make a relative stretch for responsive sliders
42572      if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) {
42573        stretch = parseFloat(params.stretch) / 100 * slideSize;
42574      }
42575      var translateY = isHorizontal ? 0 : stretch * offsetMultiplier;
42576      var translateX = isHorizontal ? stretch * offsetMultiplier : 0;
42577      var scale = 1 - (1 - params.scale) * Math.abs(offsetMultiplier);
42578
42579      // Fix for ultra small values
42580      if (Math.abs(translateX) < 0.001) translateX = 0;
42581      if (Math.abs(translateY) < 0.001) translateY = 0;
42582      if (Math.abs(translateZ) < 0.001) translateZ = 0;
42583      if (Math.abs(rotateY) < 0.001) rotateY = 0;
42584      if (Math.abs(rotateX) < 0.001) rotateX = 0;
42585      if (Math.abs(scale) < 0.001) scale = 0;
42586      var slideTransform = "translate3d(".concat(translateX, "px,").concat(translateY, "px,").concat(translateZ, "px)  rotateX(").concat(r(rotateX), "deg) rotateY(").concat(r(rotateY), "deg) scale(").concat(scale, ")");
42587      var targetEl = (0, _effectTarget.e)(params, slideEl);
42588      targetEl.style.transform = slideTransform;
42589      slideEl.style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;
42590      if (params.slideShadows) {
42591        // Set shadows
42592        var shadowBeforeEl = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-left') : slideEl.querySelector('.swiper-slide-shadow-top');
42593        var shadowAfterEl = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-right') : slideEl.querySelector('.swiper-slide-shadow-bottom');
42594        if (!shadowBeforeEl) {
42595          shadowBeforeEl = (0, _createShadow.c)('coverflow', slideEl, isHorizontal ? 'left' : 'top');
42596        }
42597        if (!shadowAfterEl) {
42598          shadowAfterEl = (0, _createShadow.c)('coverflow', slideEl, isHorizontal ? 'right' : 'bottom');
42599        }
42600        if (shadowBeforeEl) shadowBeforeEl.style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0;
42601        if (shadowAfterEl) shadowAfterEl.style.opacity = -offsetMultiplier > 0 ? -offsetMultiplier : 0;
42602      }
42603    }
42604  };
42605  var setTransition = function setTransition(duration) {
42606    var transformElements = swiper.slides.map(function (slideEl) {
42607      return (0, _utils.g)(slideEl);
42608    });
42609    transformElements.forEach(function (el) {
42610      el.style.transitionDuration = "".concat(duration, "ms");
42611      el.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(function (shadowEl) {
42612        shadowEl.style.transitionDuration = "".concat(duration, "ms");
42613      });
42614    });
42615  };
42616  (0, _effectInit.e)({
42617    effect: 'coverflow',
42618    swiper: swiper,
42619    on: on,
42620    setTranslate: setTranslate,
42621    setTransition: setTransition,
42622    perspective: function perspective() {
42623      return true;
42624    },
42625    overwriteParams: function overwriteParams() {
42626      return {
42627        watchSlidesProgress: true
42628      };
42629    }
42630  });
42631}
42632
42633},{"../shared/create-shadow.mjs":135,"../shared/effect-init.mjs":136,"../shared/effect-target.mjs":137,"../shared/utils.mjs":141}],115:[function(require,module,exports){
42634"use strict";
42635
42636Object.defineProperty(exports, "__esModule", {
42637  value: true
42638});
42639exports["default"] = EffectCreative;
42640var _createShadow = require("../shared/create-shadow.mjs");
42641var _effectInit = require("../shared/effect-init.mjs");
42642var _effectTarget = require("../shared/effect-target.mjs");
42643var _effectVirtualTransitionEnd = require("../shared/effect-virtual-transition-end.mjs");
42644var _utils = require("../shared/utils.mjs");
42645function EffectCreative(_ref) {
42646  var swiper = _ref.swiper,
42647    extendParams = _ref.extendParams,
42648    on = _ref.on;
42649  extendParams({
42650    creativeEffect: {
42651      limitProgress: 1,
42652      shadowPerProgress: false,
42653      progressMultiplier: 1,
42654      perspective: true,
42655      prev: {
42656        translate: [0, 0, 0],
42657        rotate: [0, 0, 0],
42658        opacity: 1,
42659        scale: 1
42660      },
42661      next: {
42662        translate: [0, 0, 0],
42663        rotate: [0, 0, 0],
42664        opacity: 1,
42665        scale: 1
42666      }
42667    }
42668  });
42669  var getTranslateValue = function getTranslateValue(value) {
42670    if (typeof value === 'string') return value;
42671    return "".concat(value, "px");
42672  };
42673  var setTranslate = function setTranslate() {
42674    var slides = swiper.slides,
42675      wrapperEl = swiper.wrapperEl,
42676      slidesSizesGrid = swiper.slidesSizesGrid;
42677    var params = swiper.params.creativeEffect;
42678    var multiplier = params.progressMultiplier;
42679    var isCenteredSlides = swiper.params.centeredSlides;
42680    var rotateFix = (0, _utils.a)(swiper);
42681    if (isCenteredSlides) {
42682      var margin = slidesSizesGrid[0] / 2 - swiper.params.slidesOffsetBefore || 0;
42683      wrapperEl.style.transform = "translateX(calc(50% - ".concat(margin, "px))");
42684    }
42685    var _loop = function _loop() {
42686      var slideEl = slides[i];
42687      var slideProgress = slideEl.progress;
42688      var progress = Math.min(Math.max(slideEl.progress, -params.limitProgress), params.limitProgress);
42689      var originalProgress = progress;
42690      if (!isCenteredSlides) {
42691        originalProgress = Math.min(Math.max(slideEl.originalProgress, -params.limitProgress), params.limitProgress);
42692      }
42693      var offset = slideEl.swiperSlideOffset;
42694      var t = [swiper.params.cssMode ? -offset - swiper.translate : -offset, 0, 0];
42695      var r = [0, 0, 0];
42696      var custom = false;
42697      if (!swiper.isHorizontal()) {
42698        t[1] = t[0];
42699        t[0] = 0;
42700      }
42701      var data = {
42702        translate: [0, 0, 0],
42703        rotate: [0, 0, 0],
42704        scale: 1,
42705        opacity: 1
42706      };
42707      if (progress < 0) {
42708        data = params.next;
42709        custom = true;
42710      } else if (progress > 0) {
42711        data = params.prev;
42712        custom = true;
42713      }
42714      // set translate
42715      t.forEach(function (value, index) {
42716        t[index] = "calc(".concat(value, "px + (").concat(getTranslateValue(data.translate[index]), " * ").concat(Math.abs(progress * multiplier), "))");
42717      });
42718      // set rotates
42719      r.forEach(function (value, index) {
42720        var val = data.rotate[index] * Math.abs(progress * multiplier);
42721        r[index] = val;
42722      });
42723      slideEl.style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;
42724      var translateString = t.join(', ');
42725      var rotateString = "rotateX(".concat(rotateFix(r[0]), "deg) rotateY(").concat(rotateFix(r[1]), "deg) rotateZ(").concat(rotateFix(r[2]), "deg)");
42726      var scaleString = originalProgress < 0 ? "scale(".concat(1 + (1 - data.scale) * originalProgress * multiplier, ")") : "scale(".concat(1 - (1 - data.scale) * originalProgress * multiplier, ")");
42727      var opacityString = originalProgress < 0 ? 1 + (1 - data.opacity) * originalProgress * multiplier : 1 - (1 - data.opacity) * originalProgress * multiplier;
42728      var transform = "translate3d(".concat(translateString, ") ").concat(rotateString, " ").concat(scaleString);
42729
42730      // Set shadows
42731      if (custom && data.shadow || !custom) {
42732        var shadowEl = slideEl.querySelector('.swiper-slide-shadow');
42733        if (!shadowEl && data.shadow) {
42734          shadowEl = (0, _createShadow.c)('creative', slideEl);
42735        }
42736        if (shadowEl) {
42737          var shadowOpacity = params.shadowPerProgress ? progress * (1 / params.limitProgress) : progress;
42738          shadowEl.style.opacity = Math.min(Math.max(Math.abs(shadowOpacity), 0), 1);
42739        }
42740      }
42741      var targetEl = (0, _effectTarget.e)(params, slideEl);
42742      targetEl.style.transform = transform;
42743      targetEl.style.opacity = opacityString;
42744      if (data.origin) {
42745        targetEl.style.transformOrigin = data.origin;
42746      }
42747    };
42748    for (var i = 0; i < slides.length; i += 1) {
42749      _loop();
42750    }
42751  };
42752  var setTransition = function setTransition(duration) {
42753    var transformElements = swiper.slides.map(function (slideEl) {
42754      return (0, _utils.g)(slideEl);
42755    });
42756    transformElements.forEach(function (el) {
42757      el.style.transitionDuration = "".concat(duration, "ms");
42758      el.querySelectorAll('.swiper-slide-shadow').forEach(function (shadowEl) {
42759        shadowEl.style.transitionDuration = "".concat(duration, "ms");
42760      });
42761    });
42762    (0, _effectVirtualTransitionEnd.e)({
42763      swiper: swiper,
42764      duration: duration,
42765      transformElements: transformElements,
42766      allSlides: true
42767    });
42768  };
42769  (0, _effectInit.e)({
42770    effect: 'creative',
42771    swiper: swiper,
42772    on: on,
42773    setTranslate: setTranslate,
42774    setTransition: setTransition,
42775    perspective: function perspective() {
42776      return swiper.params.creativeEffect.perspective;
42777    },
42778    overwriteParams: function overwriteParams() {
42779      return {
42780        watchSlidesProgress: true,
42781        virtualTranslate: !swiper.params.cssMode
42782      };
42783    }
42784  });
42785}
42786
42787},{"../shared/create-shadow.mjs":135,"../shared/effect-init.mjs":136,"../shared/effect-target.mjs":137,"../shared/effect-virtual-transition-end.mjs":138,"../shared/utils.mjs":141}],116:[function(require,module,exports){
42788"use strict";
42789
42790Object.defineProperty(exports, "__esModule", {
42791  value: true
42792});
42793exports["default"] = EffectCube;
42794var _effectInit = require("../shared/effect-init.mjs");
42795var _utils = require("../shared/utils.mjs");
42796function EffectCube(_ref) {
42797  var swiper = _ref.swiper,
42798    extendParams = _ref.extendParams,
42799    on = _ref.on;
42800  extendParams({
42801    cubeEffect: {
42802      slideShadows: true,
42803      shadow: true,
42804      shadowOffset: 20,
42805      shadowScale: 0.94
42806    }
42807  });
42808  var createSlideShadows = function createSlideShadows(slideEl, progress, isHorizontal) {
42809    var shadowBefore = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-left') : slideEl.querySelector('.swiper-slide-shadow-top');
42810    var shadowAfter = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-right') : slideEl.querySelector('.swiper-slide-shadow-bottom');
42811    if (!shadowBefore) {
42812      shadowBefore = (0, _utils.c)('div', "swiper-slide-shadow-cube swiper-slide-shadow-".concat(isHorizontal ? 'left' : 'top').split(' '));
42813      slideEl.append(shadowBefore);
42814    }
42815    if (!shadowAfter) {
42816      shadowAfter = (0, _utils.c)('div', "swiper-slide-shadow-cube swiper-slide-shadow-".concat(isHorizontal ? 'right' : 'bottom').split(' '));
42817      slideEl.append(shadowAfter);
42818    }
42819    if (shadowBefore) shadowBefore.style.opacity = Math.max(-progress, 0);
42820    if (shadowAfter) shadowAfter.style.opacity = Math.max(progress, 0);
42821  };
42822  var recreateShadows = function recreateShadows() {
42823    // create new ones
42824    var isHorizontal = swiper.isHorizontal();
42825    swiper.slides.forEach(function (slideEl) {
42826      var progress = Math.max(Math.min(slideEl.progress, 1), -1);
42827      createSlideShadows(slideEl, progress, isHorizontal);
42828    });
42829  };
42830  var setTranslate = function setTranslate() {
42831    var el = swiper.el,
42832      wrapperEl = swiper.wrapperEl,
42833      slides = swiper.slides,
42834      swiperWidth = swiper.width,
42835      swiperHeight = swiper.height,
42836      rtl = swiper.rtlTranslate,
42837      swiperSize = swiper.size,
42838      browser = swiper.browser;
42839    var r = (0, _utils.a)(swiper);
42840    var params = swiper.params.cubeEffect;
42841    var isHorizontal = swiper.isHorizontal();
42842    var isVirtual = swiper.virtual && swiper.params.virtual.enabled;
42843    var wrapperRotate = 0;
42844    var cubeShadowEl;
42845    if (params.shadow) {
42846      if (isHorizontal) {
42847        cubeShadowEl = swiper.wrapperEl.querySelector('.swiper-cube-shadow');
42848        if (!cubeShadowEl) {
42849          cubeShadowEl = (0, _utils.c)('div', 'swiper-cube-shadow');
42850          swiper.wrapperEl.append(cubeShadowEl);
42851        }
42852        cubeShadowEl.style.height = "".concat(swiperWidth, "px");
42853      } else {
42854        cubeShadowEl = el.querySelector('.swiper-cube-shadow');
42855        if (!cubeShadowEl) {
42856          cubeShadowEl = (0, _utils.c)('div', 'swiper-cube-shadow');
42857          el.append(cubeShadowEl);
42858        }
42859      }
42860    }
42861    for (var i = 0; i < slides.length; i += 1) {
42862      var slideEl = slides[i];
42863      var slideIndex = i;
42864      if (isVirtual) {
42865        slideIndex = parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10);
42866      }
42867      var slideAngle = slideIndex * 90;
42868      var round = Math.floor(slideAngle / 360);
42869      if (rtl) {
42870        slideAngle = -slideAngle;
42871        round = Math.floor(-slideAngle / 360);
42872      }
42873      var progress = Math.max(Math.min(slideEl.progress, 1), -1);
42874      var tx = 0;
42875      var ty = 0;
42876      var tz = 0;
42877      if (slideIndex % 4 === 0) {
42878        tx = -round * 4 * swiperSize;
42879        tz = 0;
42880      } else if ((slideIndex - 1) % 4 === 0) {
42881        tx = 0;
42882        tz = -round * 4 * swiperSize;
42883      } else if ((slideIndex - 2) % 4 === 0) {
42884        tx = swiperSize + round * 4 * swiperSize;
42885        tz = swiperSize;
42886      } else if ((slideIndex - 3) % 4 === 0) {
42887        tx = -swiperSize;
42888        tz = 3 * swiperSize + swiperSize * 4 * round;
42889      }
42890      if (rtl) {
42891        tx = -tx;
42892      }
42893      if (!isHorizontal) {
42894        ty = tx;
42895        tx = 0;
42896      }
42897      var transform = "rotateX(".concat(r(isHorizontal ? 0 : -slideAngle), "deg) rotateY(").concat(r(isHorizontal ? slideAngle : 0), "deg) translate3d(").concat(tx, "px, ").concat(ty, "px, ").concat(tz, "px)");
42898      if (progress <= 1 && progress > -1) {
42899        wrapperRotate = slideIndex * 90 + progress * 90;
42900        if (rtl) wrapperRotate = -slideIndex * 90 - progress * 90;
42901      }
42902      slideEl.style.transform = transform;
42903      if (params.slideShadows) {
42904        createSlideShadows(slideEl, progress, isHorizontal);
42905      }
42906    }
42907    wrapperEl.style.transformOrigin = "50% 50% -".concat(swiperSize / 2, "px");
42908    wrapperEl.style['-webkit-transform-origin'] = "50% 50% -".concat(swiperSize / 2, "px");
42909    if (params.shadow) {
42910      if (isHorizontal) {
42911        cubeShadowEl.style.transform = "translate3d(0px, ".concat(swiperWidth / 2 + params.shadowOffset, "px, ").concat(-swiperWidth / 2, "px) rotateX(89.99deg) rotateZ(0deg) scale(").concat(params.shadowScale, ")");
42912      } else {
42913        var shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90;
42914        var multiplier = 1.5 - (Math.sin(shadowAngle * 2 * Math.PI / 360) / 2 + Math.cos(shadowAngle * 2 * Math.PI / 360) / 2);
42915        var scale1 = params.shadowScale;
42916        var scale2 = params.shadowScale / multiplier;
42917        var offset = params.shadowOffset;
42918        cubeShadowEl.style.transform = "scale3d(".concat(scale1, ", 1, ").concat(scale2, ") translate3d(0px, ").concat(swiperHeight / 2 + offset, "px, ").concat(-swiperHeight / 2 / scale2, "px) rotateX(-89.99deg)");
42919      }
42920    }
42921    var zFactor = (browser.isSafari || browser.isWebView) && browser.needPerspectiveFix ? -swiperSize / 2 : 0;
42922    wrapperEl.style.transform = "translate3d(0px,0,".concat(zFactor, "px) rotateX(").concat(r(swiper.isHorizontal() ? 0 : wrapperRotate), "deg) rotateY(").concat(r(swiper.isHorizontal() ? -wrapperRotate : 0), "deg)");
42923    wrapperEl.style.setProperty('--swiper-cube-translate-z', "".concat(zFactor, "px"));
42924  };
42925  var setTransition = function setTransition(duration) {
42926    var el = swiper.el,
42927      slides = swiper.slides;
42928    slides.forEach(function (slideEl) {
42929      slideEl.style.transitionDuration = "".concat(duration, "ms");
42930      slideEl.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(function (subEl) {
42931        subEl.style.transitionDuration = "".concat(duration, "ms");
42932      });
42933    });
42934    if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {
42935      var shadowEl = el.querySelector('.swiper-cube-shadow');
42936      if (shadowEl) shadowEl.style.transitionDuration = "".concat(duration, "ms");
42937    }
42938  };
42939  (0, _effectInit.e)({
42940    effect: 'cube',
42941    swiper: swiper,
42942    on: on,
42943    setTranslate: setTranslate,
42944    setTransition: setTransition,
42945    recreateShadows: recreateShadows,
42946    getEffectParams: function getEffectParams() {
42947      return swiper.params.cubeEffect;
42948    },
42949    perspective: function perspective() {
42950      return true;
42951    },
42952    overwriteParams: function overwriteParams() {
42953      return {
42954        slidesPerView: 1,
42955        slidesPerGroup: 1,
42956        watchSlidesProgress: true,
42957        resistanceRatio: 0,
42958        spaceBetween: 0,
42959        centeredSlides: false,
42960        virtualTranslate: true
42961      };
42962    }
42963  });
42964}
42965
42966},{"../shared/effect-init.mjs":136,"../shared/utils.mjs":141}],117:[function(require,module,exports){
42967"use strict";
42968
42969Object.defineProperty(exports, "__esModule", {
42970  value: true
42971});
42972exports["default"] = EffectFade;
42973var _effectInit = require("../shared/effect-init.mjs");
42974var _effectTarget = require("../shared/effect-target.mjs");
42975var _effectVirtualTransitionEnd = require("../shared/effect-virtual-transition-end.mjs");
42976var _utils = require("../shared/utils.mjs");
42977function EffectFade(_ref) {
42978  var swiper = _ref.swiper,
42979    extendParams = _ref.extendParams,
42980    on = _ref.on;
42981  extendParams({
42982    fadeEffect: {
42983      crossFade: false
42984    }
42985  });
42986  var setTranslate = function setTranslate() {
42987    var slides = swiper.slides;
42988    var params = swiper.params.fadeEffect;
42989    for (var i = 0; i < slides.length; i += 1) {
42990      var slideEl = swiper.slides[i];
42991      var offset = slideEl.swiperSlideOffset;
42992      var tx = -offset;
42993      if (!swiper.params.virtualTranslate) tx -= swiper.translate;
42994      var ty = 0;
42995      if (!swiper.isHorizontal()) {
42996        ty = tx;
42997        tx = 0;
42998      }
42999      var slideOpacity = swiper.params.fadeEffect.crossFade ? Math.max(1 - Math.abs(slideEl.progress), 0) : 1 + Math.min(Math.max(slideEl.progress, -1), 0);
43000      var targetEl = (0, _effectTarget.e)(params, slideEl);
43001      targetEl.style.opacity = slideOpacity;
43002      targetEl.style.transform = "translate3d(".concat(tx, "px, ").concat(ty, "px, 0px)");
43003    }
43004  };
43005  var setTransition = function setTransition(duration) {
43006    var transformElements = swiper.slides.map(function (slideEl) {
43007      return (0, _utils.g)(slideEl);
43008    });
43009    transformElements.forEach(function (el) {
43010      el.style.transitionDuration = "".concat(duration, "ms");
43011    });
43012    (0, _effectVirtualTransitionEnd.e)({
43013      swiper: swiper,
43014      duration: duration,
43015      transformElements: transformElements,
43016      allSlides: true
43017    });
43018  };
43019  (0, _effectInit.e)({
43020    effect: 'fade',
43021    swiper: swiper,
43022    on: on,
43023    setTranslate: setTranslate,
43024    setTransition: setTransition,
43025    overwriteParams: function overwriteParams() {
43026      return {
43027        slidesPerView: 1,
43028        slidesPerGroup: 1,
43029        watchSlidesProgress: true,
43030        spaceBetween: 0,
43031        virtualTranslate: !swiper.params.cssMode
43032      };
43033    }
43034  });
43035}
43036
43037},{"../shared/effect-init.mjs":136,"../shared/effect-target.mjs":137,"../shared/effect-virtual-transition-end.mjs":138,"../shared/utils.mjs":141}],118:[function(require,module,exports){
43038"use strict";
43039
43040Object.defineProperty(exports, "__esModule", {
43041  value: true
43042});
43043exports["default"] = EffectFlip;
43044var _createShadow = require("../shared/create-shadow.mjs");
43045var _effectInit = require("../shared/effect-init.mjs");
43046var _effectTarget = require("../shared/effect-target.mjs");
43047var _effectVirtualTransitionEnd = require("../shared/effect-virtual-transition-end.mjs");
43048var _utils = require("../shared/utils.mjs");
43049function EffectFlip(_ref) {
43050  var swiper = _ref.swiper,
43051    extendParams = _ref.extendParams,
43052    on = _ref.on;
43053  extendParams({
43054    flipEffect: {
43055      slideShadows: true,
43056      limitRotation: true
43057    }
43058  });
43059  var createSlideShadows = function createSlideShadows(slideEl, progress) {
43060    var shadowBefore = swiper.isHorizontal() ? slideEl.querySelector('.swiper-slide-shadow-left') : slideEl.querySelector('.swiper-slide-shadow-top');
43061    var shadowAfter = swiper.isHorizontal() ? slideEl.querySelector('.swiper-slide-shadow-right') : slideEl.querySelector('.swiper-slide-shadow-bottom');
43062    if (!shadowBefore) {
43063      shadowBefore = (0, _createShadow.c)('flip', slideEl, swiper.isHorizontal() ? 'left' : 'top');
43064    }
43065    if (!shadowAfter) {
43066      shadowAfter = (0, _createShadow.c)('flip', slideEl, swiper.isHorizontal() ? 'right' : 'bottom');
43067    }
43068    if (shadowBefore) shadowBefore.style.opacity = Math.max(-progress, 0);
43069    if (shadowAfter) shadowAfter.style.opacity = Math.max(progress, 0);
43070  };
43071  var recreateShadows = function recreateShadows() {
43072    // Set shadows
43073    swiper.params.flipEffect;
43074    swiper.slides.forEach(function (slideEl) {
43075      var progress = slideEl.progress;
43076      if (swiper.params.flipEffect.limitRotation) {
43077        progress = Math.max(Math.min(slideEl.progress, 1), -1);
43078      }
43079      createSlideShadows(slideEl, progress);
43080    });
43081  };
43082  var setTranslate = function setTranslate() {
43083    var slides = swiper.slides,
43084      rtl = swiper.rtlTranslate;
43085    var params = swiper.params.flipEffect;
43086    var rotateFix = (0, _utils.a)(swiper);
43087    for (var i = 0; i < slides.length; i += 1) {
43088      var slideEl = slides[i];
43089      var progress = slideEl.progress;
43090      if (swiper.params.flipEffect.limitRotation) {
43091        progress = Math.max(Math.min(slideEl.progress, 1), -1);
43092      }
43093      var offset = slideEl.swiperSlideOffset;
43094      var rotate = -180 * progress;
43095      var rotateY = rotate;
43096      var rotateX = 0;
43097      var tx = swiper.params.cssMode ? -offset - swiper.translate : -offset;
43098      var ty = 0;
43099      if (!swiper.isHorizontal()) {
43100        ty = tx;
43101        tx = 0;
43102        rotateX = -rotateY;
43103        rotateY = 0;
43104      } else if (rtl) {
43105        rotateY = -rotateY;
43106      }
43107      slideEl.style.zIndex = -Math.abs(Math.round(progress)) + slides.length;
43108      if (params.slideShadows) {
43109        createSlideShadows(slideEl, progress);
43110      }
43111      var transform = "translate3d(".concat(tx, "px, ").concat(ty, "px, 0px) rotateX(").concat(rotateFix(rotateX), "deg) rotateY(").concat(rotateFix(rotateY), "deg)");
43112      var targetEl = (0, _effectTarget.e)(params, slideEl);
43113      targetEl.style.transform = transform;
43114    }
43115  };
43116  var setTransition = function setTransition(duration) {
43117    var transformElements = swiper.slides.map(function (slideEl) {
43118      return (0, _utils.g)(slideEl);
43119    });
43120    transformElements.forEach(function (el) {
43121      el.style.transitionDuration = "".concat(duration, "ms");
43122      el.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(function (shadowEl) {
43123        shadowEl.style.transitionDuration = "".concat(duration, "ms");
43124      });
43125    });
43126    (0, _effectVirtualTransitionEnd.e)({
43127      swiper: swiper,
43128      duration: duration,
43129      transformElements: transformElements
43130    });
43131  };
43132  (0, _effectInit.e)({
43133    effect: 'flip',
43134    swiper: swiper,
43135    on: on,
43136    setTranslate: setTranslate,
43137    setTransition: setTransition,
43138    recreateShadows: recreateShadows,
43139    getEffectParams: function getEffectParams() {
43140      return swiper.params.flipEffect;
43141    },
43142    perspective: function perspective() {
43143      return true;
43144    },
43145    overwriteParams: function overwriteParams() {
43146      return {
43147        slidesPerView: 1,
43148        slidesPerGroup: 1,
43149        watchSlidesProgress: true,
43150        spaceBetween: 0,
43151        virtualTranslate: !swiper.params.cssMode
43152      };
43153    }
43154  });
43155}
43156
43157},{"../shared/create-shadow.mjs":135,"../shared/effect-init.mjs":136,"../shared/effect-target.mjs":137,"../shared/effect-virtual-transition-end.mjs":138,"../shared/utils.mjs":141}],119:[function(require,module,exports){
43158"use strict";
43159
43160Object.defineProperty(exports, "__esModule", {
43161  value: true
43162});
43163exports["default"] = freeMode;
43164var _utils = require("../shared/utils.mjs");
43165function freeMode(_ref) {
43166  var swiper = _ref.swiper,
43167    extendParams = _ref.extendParams,
43168    emit = _ref.emit,
43169    once = _ref.once;
43170  extendParams({
43171    freeMode: {
43172      enabled: false,
43173      momentum: true,
43174      momentumRatio: 1,
43175      momentumBounce: true,
43176      momentumBounceRatio: 1,
43177      momentumVelocityRatio: 1,
43178      sticky: false,
43179      minimumVelocity: 0.02
43180    }
43181  });
43182  function onTouchStart() {
43183    if (swiper.params.cssMode) return;
43184    var translate = swiper.getTranslate();
43185    swiper.setTranslate(translate);
43186    swiper.setTransition(0);
43187    swiper.touchEventsData.velocities.length = 0;
43188    swiper.freeMode.onTouchEnd({
43189      currentPos: swiper.rtl ? swiper.translate : -swiper.translate
43190    });
43191  }
43192  function onTouchMove() {
43193    if (swiper.params.cssMode) return;
43194    var data = swiper.touchEventsData,
43195      touches = swiper.touches;
43196    // Velocity
43197    if (data.velocities.length === 0) {
43198      data.velocities.push({
43199        position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],
43200        time: data.touchStartTime
43201      });
43202    }
43203    data.velocities.push({
43204      position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],
43205      time: (0, _utils.h)()
43206    });
43207  }
43208  function onTouchEnd(_ref2) {
43209    var currentPos = _ref2.currentPos;
43210    if (swiper.params.cssMode) return;
43211    var params = swiper.params,
43212      wrapperEl = swiper.wrapperEl,
43213      rtl = swiper.rtlTranslate,
43214      snapGrid = swiper.snapGrid,
43215      data = swiper.touchEventsData;
43216    // Time diff
43217    var touchEndTime = (0, _utils.h)();
43218    var timeDiff = touchEndTime - data.touchStartTime;
43219    if (currentPos < -swiper.minTranslate()) {
43220      swiper.slideTo(swiper.activeIndex);
43221      return;
43222    }
43223    if (currentPos > -swiper.maxTranslate()) {
43224      if (swiper.slides.length < snapGrid.length) {
43225        swiper.slideTo(snapGrid.length - 1);
43226      } else {
43227        swiper.slideTo(swiper.slides.length - 1);
43228      }
43229      return;
43230    }
43231    if (params.freeMode.momentum) {
43232      if (data.velocities.length > 1) {
43233        var lastMoveEvent = data.velocities.pop();
43234        var velocityEvent = data.velocities.pop();
43235        var distance = lastMoveEvent.position - velocityEvent.position;
43236        var time = lastMoveEvent.time - velocityEvent.time;
43237        swiper.velocity = distance / time;
43238        swiper.velocity /= 2;
43239        if (Math.abs(swiper.velocity) < params.freeMode.minimumVelocity) {
43240          swiper.velocity = 0;
43241        }
43242        // this implies that the user stopped moving a finger then released.
43243        // There would be no events with distance zero, so the last event is stale.
43244        if (time > 150 || (0, _utils.h)() - lastMoveEvent.time > 300) {
43245          swiper.velocity = 0;
43246        }
43247      } else {
43248        swiper.velocity = 0;
43249      }
43250      swiper.velocity *= params.freeMode.momentumVelocityRatio;
43251      data.velocities.length = 0;
43252      var momentumDuration = 1000 * params.freeMode.momentumRatio;
43253      var momentumDistance = swiper.velocity * momentumDuration;
43254      var newPosition = swiper.translate + momentumDistance;
43255      if (rtl) newPosition = -newPosition;
43256      var doBounce = false;
43257      var afterBouncePosition;
43258      var bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeMode.momentumBounceRatio;
43259      var needsLoopFix;
43260      if (newPosition < swiper.maxTranslate()) {
43261        if (params.freeMode.momentumBounce) {
43262          if (newPosition + swiper.maxTranslate() < -bounceAmount) {
43263            newPosition = swiper.maxTranslate() - bounceAmount;
43264          }
43265          afterBouncePosition = swiper.maxTranslate();
43266          doBounce = true;
43267          data.allowMomentumBounce = true;
43268        } else {
43269          newPosition = swiper.maxTranslate();
43270        }
43271        if (params.loop && params.centeredSlides) needsLoopFix = true;
43272      } else if (newPosition > swiper.minTranslate()) {
43273        if (params.freeMode.momentumBounce) {
43274          if (newPosition - swiper.minTranslate() > bounceAmount) {
43275            newPosition = swiper.minTranslate() + bounceAmount;
43276          }
43277          afterBouncePosition = swiper.minTranslate();
43278          doBounce = true;
43279          data.allowMomentumBounce = true;
43280        } else {
43281          newPosition = swiper.minTranslate();
43282        }
43283        if (params.loop && params.centeredSlides) needsLoopFix = true;
43284      } else if (params.freeMode.sticky) {
43285        var nextSlide;
43286        for (var j = 0; j < snapGrid.length; j += 1) {
43287          if (snapGrid[j] > -newPosition) {
43288            nextSlide = j;
43289            break;
43290          }
43291        }
43292        if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') {
43293          newPosition = snapGrid[nextSlide];
43294        } else {
43295          newPosition = snapGrid[nextSlide - 1];
43296        }
43297        newPosition = -newPosition;
43298      }
43299      if (needsLoopFix) {
43300        once('transitionEnd', function () {
43301          swiper.loopFix();
43302        });
43303      }
43304      // Fix duration
43305      if (swiper.velocity !== 0) {
43306        if (rtl) {
43307          momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);
43308        } else {
43309          momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);
43310        }
43311        if (params.freeMode.sticky) {
43312          // If freeMode.sticky is active and the user ends a swipe with a slow-velocity
43313          // event, then durations can be 20+ seconds to slide one (or zero!) slides.
43314          // It's easy to see this when simulating touch with mouse events. To fix this,
43315          // limit single-slide swipes to the default slide duration. This also has the
43316          // nice side effect of matching slide speed if the user stopped moving before
43317          // lifting finger or mouse vs. moving slowly before lifting the finger/mouse.
43318          // For faster swipes, also apply limits (albeit higher ones).
43319          var moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate);
43320          var currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex];
43321          if (moveDistance < currentSlideSize) {
43322            momentumDuration = params.speed;
43323          } else if (moveDistance < 2 * currentSlideSize) {
43324            momentumDuration = params.speed * 1.5;
43325          } else {
43326            momentumDuration = params.speed * 2.5;
43327          }
43328        }
43329      } else if (params.freeMode.sticky) {
43330        swiper.slideToClosest();
43331        return;
43332      }
43333      if (params.freeMode.momentumBounce && doBounce) {
43334        swiper.updateProgress(afterBouncePosition);
43335        swiper.setTransition(momentumDuration);
43336        swiper.setTranslate(newPosition);
43337        swiper.transitionStart(true, swiper.swipeDirection);
43338        swiper.animating = true;
43339        (0, _utils.o)(wrapperEl, function () {
43340          if (!swiper || swiper.destroyed || !data.allowMomentumBounce) return;
43341          emit('momentumBounce');
43342          swiper.setTransition(params.speed);
43343          setTimeout(function () {
43344            swiper.setTranslate(afterBouncePosition);
43345            (0, _utils.o)(wrapperEl, function () {
43346              if (!swiper || swiper.destroyed) return;
43347              swiper.transitionEnd();
43348            });
43349          }, 0);
43350        });
43351      } else if (swiper.velocity) {
43352        emit('_freeModeNoMomentumRelease');
43353        swiper.updateProgress(newPosition);
43354        swiper.setTransition(momentumDuration);
43355        swiper.setTranslate(newPosition);
43356        swiper.transitionStart(true, swiper.swipeDirection);
43357        if (!swiper.animating) {
43358          swiper.animating = true;
43359          (0, _utils.o)(wrapperEl, function () {
43360            if (!swiper || swiper.destroyed) return;
43361            swiper.transitionEnd();
43362          });
43363        }
43364      } else {
43365        swiper.updateProgress(newPosition);
43366      }
43367      swiper.updateActiveIndex();
43368      swiper.updateSlidesClasses();
43369    } else if (params.freeMode.sticky) {
43370      swiper.slideToClosest();
43371      return;
43372    } else if (params.freeMode) {
43373      emit('_freeModeNoMomentumRelease');
43374    }
43375    if (!params.freeMode.momentum || timeDiff >= params.longSwipesMs) {
43376      emit('_freeModeStaticRelease');
43377      swiper.updateProgress();
43378      swiper.updateActiveIndex();
43379      swiper.updateSlidesClasses();
43380    }
43381  }
43382  Object.assign(swiper, {
43383    freeMode: {
43384      onTouchStart: onTouchStart,
43385      onTouchMove: onTouchMove,
43386      onTouchEnd: onTouchEnd
43387    }
43388  });
43389}
43390
43391},{"../shared/utils.mjs":141}],120:[function(require,module,exports){
43392"use strict";
43393
43394Object.defineProperty(exports, "__esModule", {
43395  value: true
43396});
43397exports["default"] = Grid;
43398function Grid(_ref) {
43399  var swiper = _ref.swiper,
43400    extendParams = _ref.extendParams,
43401    on = _ref.on;
43402  extendParams({
43403    grid: {
43404      rows: 1,
43405      fill: 'column'
43406    }
43407  });
43408  var slidesNumberEvenToRows;
43409  var slidesPerRow;
43410  var numFullColumns;
43411  var wasMultiRow;
43412  var getSpaceBetween = function getSpaceBetween() {
43413    var spaceBetween = swiper.params.spaceBetween;
43414    if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
43415      spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiper.size;
43416    } else if (typeof spaceBetween === 'string') {
43417      spaceBetween = parseFloat(spaceBetween);
43418    }
43419    return spaceBetween;
43420  };
43421  var initSlides = function initSlides(slides) {
43422    var slidesPerView = swiper.params.slidesPerView;
43423    var _swiper$params$grid = swiper.params.grid,
43424      rows = _swiper$params$grid.rows,
43425      fill = _swiper$params$grid.fill;
43426    var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : slides.length;
43427    numFullColumns = Math.floor(slidesLength / rows);
43428    if (Math.floor(slidesLength / rows) === slidesLength / rows) {
43429      slidesNumberEvenToRows = slidesLength;
43430    } else {
43431      slidesNumberEvenToRows = Math.ceil(slidesLength / rows) * rows;
43432    }
43433    if (slidesPerView !== 'auto' && fill === 'row') {
43434      slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, Math.floor(slidesPerView) * rows);
43435    }
43436    slidesPerRow = slidesNumberEvenToRows / rows;
43437  };
43438  var unsetSlides = function unsetSlides() {
43439    if (swiper.slides) {
43440      swiper.slides.forEach(function (slide) {
43441        if (slide.swiperSlideGridSet) {
43442          slide.style.height = '';
43443          slide.style[swiper.getDirectionLabel('margin-top')] = '';
43444        }
43445      });
43446    }
43447  };
43448  var updateSlide = function updateSlide(i, slide, slides) {
43449    var slidesPerGroup = swiper.params.slidesPerGroup;
43450    var spaceBetween = getSpaceBetween();
43451    var _swiper$params$grid2 = swiper.params.grid,
43452      rows = _swiper$params$grid2.rows,
43453      fill = _swiper$params$grid2.fill;
43454    var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : slides.length;
43455    // Set slides order
43456    var newSlideOrderIndex;
43457    var column;
43458    var row;
43459    if (fill === 'row' && slidesPerGroup > 1) {
43460      var groupIndex = Math.floor(i / (slidesPerGroup * rows));
43461      var slideIndexInGroup = i - rows * slidesPerGroup * groupIndex;
43462      var columnsInGroup = groupIndex === 0 ? slidesPerGroup : Math.min(Math.ceil((slidesLength - groupIndex * rows * slidesPerGroup) / rows), slidesPerGroup);
43463      row = Math.floor(slideIndexInGroup / columnsInGroup);
43464      column = slideIndexInGroup - row * columnsInGroup + groupIndex * slidesPerGroup;
43465      newSlideOrderIndex = column + row * slidesNumberEvenToRows / rows;
43466      slide.style.order = newSlideOrderIndex;
43467    } else if (fill === 'column') {
43468      column = Math.floor(i / rows);
43469      row = i - column * rows;
43470      if (column > numFullColumns || column === numFullColumns && row === rows - 1) {
43471        row += 1;
43472        if (row >= rows) {
43473          row = 0;
43474          column += 1;
43475        }
43476      }
43477    } else {
43478      row = Math.floor(i / slidesPerRow);
43479      column = i - row * slidesPerRow;
43480    }
43481    slide.row = row;
43482    slide.column = column;
43483    slide.style.height = "calc((100% - ".concat((rows - 1) * spaceBetween, "px) / ").concat(rows, ")");
43484    slide.style[swiper.getDirectionLabel('margin-top')] = row !== 0 ? spaceBetween && "".concat(spaceBetween, "px") : '';
43485    slide.swiperSlideGridSet = true;
43486  };
43487  var updateWrapperSize = function updateWrapperSize(slideSize, snapGrid) {
43488    var _swiper$params = swiper.params,
43489      centeredSlides = _swiper$params.centeredSlides,
43490      roundLengths = _swiper$params.roundLengths;
43491    var spaceBetween = getSpaceBetween();
43492    var rows = swiper.params.grid.rows;
43493    swiper.virtualSize = (slideSize + spaceBetween) * slidesNumberEvenToRows;
43494    swiper.virtualSize = Math.ceil(swiper.virtualSize / rows) - spaceBetween;
43495    if (!swiper.params.cssMode) {
43496      swiper.wrapperEl.style[swiper.getDirectionLabel('width')] = "".concat(swiper.virtualSize + spaceBetween, "px");
43497    }
43498    if (centeredSlides) {
43499      var newSlidesGrid = [];
43500      for (var i = 0; i < snapGrid.length; i += 1) {
43501        var slidesGridItem = snapGrid[i];
43502        if (roundLengths) slidesGridItem = Math.floor(slidesGridItem);
43503        if (snapGrid[i] < swiper.virtualSize + snapGrid[0]) newSlidesGrid.push(slidesGridItem);
43504      }
43505      snapGrid.splice(0, snapGrid.length);
43506      snapGrid.push.apply(snapGrid, newSlidesGrid);
43507    }
43508  };
43509  var onInit = function onInit() {
43510    wasMultiRow = swiper.params.grid && swiper.params.grid.rows > 1;
43511  };
43512  var onUpdate = function onUpdate() {
43513    var params = swiper.params,
43514      el = swiper.el;
43515    var isMultiRow = params.grid && params.grid.rows > 1;
43516    if (wasMultiRow && !isMultiRow) {
43517      el.classList.remove("".concat(params.containerModifierClass, "grid"), "".concat(params.containerModifierClass, "grid-column"));
43518      numFullColumns = 1;
43519      swiper.emitContainerClasses();
43520    } else if (!wasMultiRow && isMultiRow) {
43521      el.classList.add("".concat(params.containerModifierClass, "grid"));
43522      if (params.grid.fill === 'column') {
43523        el.classList.add("".concat(params.containerModifierClass, "grid-column"));
43524      }
43525      swiper.emitContainerClasses();
43526    }
43527    wasMultiRow = isMultiRow;
43528  };
43529  on('init', onInit);
43530  on('update', onUpdate);
43531  swiper.grid = {
43532    initSlides: initSlides,
43533    unsetSlides: unsetSlides,
43534    updateSlide: updateSlide,
43535    updateWrapperSize: updateWrapperSize
43536  };
43537}
43538
43539},{}],121:[function(require,module,exports){
43540"use strict";
43541
43542Object.defineProperty(exports, "__esModule", {
43543  value: true
43544});
43545exports["default"] = HashNavigation;
43546var _ssrWindowEsm = require("../shared/ssr-window.esm.mjs");
43547var _utils = require("../shared/utils.mjs");
43548function HashNavigation(_ref) {
43549  var swiper = _ref.swiper,
43550    extendParams = _ref.extendParams,
43551    emit = _ref.emit,
43552    on = _ref.on;
43553  var initialized = false;
43554  var document = (0, _ssrWindowEsm.g)();
43555  var window = (0, _ssrWindowEsm.a)();
43556  extendParams({
43557    hashNavigation: {
43558      enabled: false,
43559      replaceState: false,
43560      watchState: false,
43561      getSlideIndex: function getSlideIndex(_s, hash) {
43562        if (swiper.virtual && swiper.params.virtual.enabled) {
43563          var slideWithHash = swiper.slides.find(function (slideEl) {
43564            return slideEl.getAttribute('data-hash') === hash;
43565          });
43566          if (!slideWithHash) return 0;
43567          var index = parseInt(slideWithHash.getAttribute('data-swiper-slide-index'), 10);
43568          return index;
43569        }
43570        return swiper.getSlideIndex((0, _utils.e)(swiper.slidesEl, ".".concat(swiper.params.slideClass, "[data-hash=\"").concat(hash, "\"], swiper-slide[data-hash=\"").concat(hash, "\"]"))[0]);
43571      }
43572    }
43573  });
43574  var onHashChange = function onHashChange() {
43575    emit('hashChange');
43576    var newHash = document.location.hash.replace('#', '');
43577    var activeSlideEl = swiper.virtual && swiper.params.virtual.enabled ? swiper.slidesEl.querySelector("[data-swiper-slide-index=\"".concat(swiper.activeIndex, "\"]")) : swiper.slides[swiper.activeIndex];
43578    var activeSlideHash = activeSlideEl ? activeSlideEl.getAttribute('data-hash') : '';
43579    if (newHash !== activeSlideHash) {
43580      var newIndex = swiper.params.hashNavigation.getSlideIndex(swiper, newHash);
43581      if (typeof newIndex === 'undefined' || Number.isNaN(newIndex)) return;
43582      swiper.slideTo(newIndex);
43583    }
43584  };
43585  var setHash = function setHash() {
43586    if (!initialized || !swiper.params.hashNavigation.enabled) return;
43587    var activeSlideEl = swiper.virtual && swiper.params.virtual.enabled ? swiper.slidesEl.querySelector("[data-swiper-slide-index=\"".concat(swiper.activeIndex, "\"]")) : swiper.slides[swiper.activeIndex];
43588    var activeSlideHash = activeSlideEl ? activeSlideEl.getAttribute('data-hash') || activeSlideEl.getAttribute('data-history') : '';
43589    if (swiper.params.hashNavigation.replaceState && window.history && window.history.replaceState) {
43590      window.history.replaceState(null, null, "#".concat(activeSlideHash) || '');
43591      emit('hashSet');
43592    } else {
43593      document.location.hash = activeSlideHash || '';
43594      emit('hashSet');
43595    }
43596  };
43597  var init = function init() {
43598    if (!swiper.params.hashNavigation.enabled || swiper.params.history && swiper.params.history.enabled) return;
43599    initialized = true;
43600    var hash = document.location.hash.replace('#', '');
43601    if (hash) {
43602      var speed = 0;
43603      var index = swiper.params.hashNavigation.getSlideIndex(swiper, hash);
43604      swiper.slideTo(index || 0, speed, swiper.params.runCallbacksOnInit, true);
43605    }
43606    if (swiper.params.hashNavigation.watchState) {
43607      window.addEventListener('hashchange', onHashChange);
43608    }
43609  };
43610  var destroy = function destroy() {
43611    if (swiper.params.hashNavigation.watchState) {
43612      window.removeEventListener('hashchange', onHashChange);
43613    }
43614  };
43615  on('init', function () {
43616    if (swiper.params.hashNavigation.enabled) {
43617      init();
43618    }
43619  });
43620  on('destroy', function () {
43621    if (swiper.params.hashNavigation.enabled) {
43622      destroy();
43623    }
43624  });
43625  on('transitionEnd _freeModeNoMomentumRelease', function () {
43626    if (initialized) {
43627      setHash();
43628    }
43629  });
43630  on('slideChange', function () {
43631    if (initialized && swiper.params.cssMode) {
43632      setHash();
43633    }
43634  });
43635}
43636
43637},{"../shared/ssr-window.esm.mjs":139,"../shared/utils.mjs":141}],122:[function(require,module,exports){
43638"use strict";
43639
43640Object.defineProperty(exports, "__esModule", {
43641  value: true
43642});
43643exports["default"] = History;
43644var _ssrWindowEsm = require("../shared/ssr-window.esm.mjs");
43645function History(_ref) {
43646  var swiper = _ref.swiper,
43647    extendParams = _ref.extendParams,
43648    on = _ref.on;
43649  extendParams({
43650    history: {
43651      enabled: false,
43652      root: '',
43653      replaceState: false,
43654      key: 'slides',
43655      keepQuery: false
43656    }
43657  });
43658  var initialized = false;
43659  var paths = {};
43660  var slugify = function slugify(text) {
43661    return text.toString().replace(/\s+/g, '-').replace(/[^\w-]+/g, '').replace(/--+/g, '-').replace(/^-+/, '').replace(/-+$/, '');
43662  };
43663  var getPathValues = function getPathValues(urlOverride) {
43664    var window = (0, _ssrWindowEsm.a)();
43665    var location;
43666    if (urlOverride) {
43667      location = new URL(urlOverride);
43668    } else {
43669      location = window.location;
43670    }
43671    var pathArray = location.pathname.slice(1).split('/').filter(function (part) {
43672      return part !== '';
43673    });
43674    var total = pathArray.length;
43675    var key = pathArray[total - 2];
43676    var value = pathArray[total - 1];
43677    return {
43678      key: key,
43679      value: value
43680    };
43681  };
43682  var setHistory = function setHistory(key, index) {
43683    var window = (0, _ssrWindowEsm.a)();
43684    if (!initialized || !swiper.params.history.enabled) return;
43685    var location;
43686    if (swiper.params.url) {
43687      location = new URL(swiper.params.url);
43688    } else {
43689      location = window.location;
43690    }
43691    var slide = swiper.virtual && swiper.params.virtual.enabled ? swiper.slidesEl.querySelector("[data-swiper-slide-index=\"".concat(index, "\"]")) : swiper.slides[index];
43692    var value = slugify(slide.getAttribute('data-history'));
43693    if (swiper.params.history.root.length > 0) {
43694      var root = swiper.params.history.root;
43695      if (root[root.length - 1] === '/') root = root.slice(0, root.length - 1);
43696      value = "".concat(root, "/").concat(key ? "".concat(key, "/") : '').concat(value);
43697    } else if (!location.pathname.includes(key)) {
43698      value = "".concat(key ? "".concat(key, "/") : '').concat(value);
43699    }
43700    if (swiper.params.history.keepQuery) {
43701      value += location.search;
43702    }
43703    var currentState = window.history.state;
43704    if (currentState && currentState.value === value) {
43705      return;
43706    }
43707    if (swiper.params.history.replaceState) {
43708      window.history.replaceState({
43709        value: value
43710      }, null, value);
43711    } else {
43712      window.history.pushState({
43713        value: value
43714      }, null, value);
43715    }
43716  };
43717  var scrollToSlide = function scrollToSlide(speed, value, runCallbacks) {
43718    if (value) {
43719      for (var i = 0, length = swiper.slides.length; i < length; i += 1) {
43720        var slide = swiper.slides[i];
43721        var slideHistory = slugify(slide.getAttribute('data-history'));
43722        if (slideHistory === value) {
43723          var index = swiper.getSlideIndex(slide);
43724          swiper.slideTo(index, speed, runCallbacks);
43725        }
43726      }
43727    } else {
43728      swiper.slideTo(0, speed, runCallbacks);
43729    }
43730  };
43731  var setHistoryPopState = function setHistoryPopState() {
43732    paths = getPathValues(swiper.params.url);
43733    scrollToSlide(swiper.params.speed, paths.value, false);
43734  };
43735  var init = function init() {
43736    var window = (0, _ssrWindowEsm.a)();
43737    if (!swiper.params.history) return;
43738    if (!window.history || !window.history.pushState) {
43739      swiper.params.history.enabled = false;
43740      swiper.params.hashNavigation.enabled = true;
43741      return;
43742    }
43743    initialized = true;
43744    paths = getPathValues(swiper.params.url);
43745    if (!paths.key && !paths.value) {
43746      if (!swiper.params.history.replaceState) {
43747        window.addEventListener('popstate', setHistoryPopState);
43748      }
43749      return;
43750    }
43751    scrollToSlide(0, paths.value, swiper.params.runCallbacksOnInit);
43752    if (!swiper.params.history.replaceState) {
43753      window.addEventListener('popstate', setHistoryPopState);
43754    }
43755  };
43756  var destroy = function destroy() {
43757    var window = (0, _ssrWindowEsm.a)();
43758    if (!swiper.params.history.replaceState) {
43759      window.removeEventListener('popstate', setHistoryPopState);
43760    }
43761  };
43762  on('init', function () {
43763    if (swiper.params.history.enabled) {
43764      init();
43765    }
43766  });
43767  on('destroy', function () {
43768    if (swiper.params.history.enabled) {
43769      destroy();
43770    }
43771  });
43772  on('transitionEnd _freeModeNoMomentumRelease', function () {
43773    if (initialized) {
43774      setHistory(swiper.params.history.key, swiper.activeIndex);
43775    }
43776  });
43777  on('slideChange', function () {
43778    if (initialized && swiper.params.cssMode) {
43779      setHistory(swiper.params.history.key, swiper.activeIndex);
43780    }
43781  });
43782}
43783
43784},{"../shared/ssr-window.esm.mjs":139}],123:[function(require,module,exports){
43785"use strict";
43786
43787Object.defineProperty(exports, "__esModule", {
43788  value: true
43789});
43790exports["default"] = Keyboard;
43791var _ssrWindowEsm = require("../shared/ssr-window.esm.mjs");
43792var _utils = require("../shared/utils.mjs");
43793/* eslint-disable consistent-return */
43794function Keyboard(_ref) {
43795  var swiper = _ref.swiper,
43796    extendParams = _ref.extendParams,
43797    on = _ref.on,
43798    emit = _ref.emit;
43799  var document = (0, _ssrWindowEsm.g)();
43800  var window = (0, _ssrWindowEsm.a)();
43801  swiper.keyboard = {
43802    enabled: false
43803  };
43804  extendParams({
43805    keyboard: {
43806      enabled: false,
43807      onlyInViewport: true,
43808      pageUpDown: true,
43809      speed: undefined
43810    }
43811  });
43812  function handle(event) {
43813    if (!swiper.enabled) return;
43814    var rtl = swiper.rtlTranslate;
43815    var e = event;
43816    if (e.originalEvent) e = e.originalEvent; // jquery fix
43817    var kc = e.keyCode || e.charCode;
43818    var pageUpDown = swiper.params.keyboard.pageUpDown;
43819    var isPageUp = pageUpDown && kc === 33;
43820    var isPageDown = pageUpDown && kc === 34;
43821    var isArrowLeft = kc === 37;
43822    var isArrowRight = kc === 39;
43823    var isArrowUp = kc === 38;
43824    var isArrowDown = kc === 40;
43825    // Directions locks
43826    if (!swiper.allowSlideNext && (swiper.isHorizontal() && isArrowRight || swiper.isVertical() && isArrowDown || isPageDown)) {
43827      return false;
43828    }
43829    if (!swiper.allowSlidePrev && (swiper.isHorizontal() && isArrowLeft || swiper.isVertical() && isArrowUp || isPageUp)) {
43830      return false;
43831    }
43832    if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {
43833      return undefined;
43834    }
43835    if (document.activeElement && (document.activeElement.isContentEditable || document.activeElement.nodeName && (document.activeElement.nodeName.toLowerCase() === 'input' || document.activeElement.nodeName.toLowerCase() === 'textarea'))) {
43836      return undefined;
43837    }
43838    if (swiper.params.keyboard.onlyInViewport && (isPageUp || isPageDown || isArrowLeft || isArrowRight || isArrowUp || isArrowDown)) {
43839      var inView = false;
43840      // Check that swiper should be inside of visible area of window
43841      if ((0, _utils.d)(swiper.el, ".".concat(swiper.params.slideClass, ", swiper-slide")).length > 0 && (0, _utils.d)(swiper.el, ".".concat(swiper.params.slideActiveClass)).length === 0) {
43842        return undefined;
43843      }
43844      var el = swiper.el;
43845      var swiperWidth = el.clientWidth;
43846      var swiperHeight = el.clientHeight;
43847      var windowWidth = window.innerWidth;
43848      var windowHeight = window.innerHeight;
43849      var swiperOffset = (0, _utils.f)(el);
43850      if (rtl) swiperOffset.left -= el.scrollLeft;
43851      var swiperCoord = [[swiperOffset.left, swiperOffset.top], [swiperOffset.left + swiperWidth, swiperOffset.top], [swiperOffset.left, swiperOffset.top + swiperHeight], [swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight]];
43852      for (var i = 0; i < swiperCoord.length; i += 1) {
43853        var point = swiperCoord[i];
43854        if (point[0] >= 0 && point[0] <= windowWidth && point[1] >= 0 && point[1] <= windowHeight) {
43855          if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line
43856          inView = true;
43857        }
43858      }
43859      if (!inView) return undefined;
43860    }
43861    var speed = swiper.params.keyboard.speed;
43862    if (swiper.isHorizontal()) {
43863      if (isPageUp || isPageDown || isArrowLeft || isArrowRight) {
43864        if (e.preventDefault) e.preventDefault();else e.returnValue = false;
43865      }
43866      if ((isPageDown || isArrowRight) && !rtl || (isPageUp || isArrowLeft) && rtl) swiper.slideNext(speed);
43867      if ((isPageUp || isArrowLeft) && !rtl || (isPageDown || isArrowRight) && rtl) swiper.slidePrev(speed);
43868    } else {
43869      if (isPageUp || isPageDown || isArrowUp || isArrowDown) {
43870        if (e.preventDefault) e.preventDefault();else e.returnValue = false;
43871      }
43872      if (isPageDown || isArrowDown) swiper.slideNext(speed);
43873      if (isPageUp || isArrowUp) swiper.slidePrev(speed);
43874    }
43875    emit('keyPress', kc);
43876    return undefined;
43877  }
43878  function enable() {
43879    if (swiper.keyboard.enabled) return;
43880    document.addEventListener('keydown', handle);
43881    swiper.keyboard.enabled = true;
43882  }
43883  function disable() {
43884    if (!swiper.keyboard.enabled) return;
43885    document.removeEventListener('keydown', handle);
43886    swiper.keyboard.enabled = false;
43887  }
43888  on('init', function () {
43889    if (swiper.params.keyboard.enabled) {
43890      enable();
43891    }
43892  });
43893  on('destroy', function () {
43894    if (swiper.keyboard.enabled) {
43895      disable();
43896    }
43897  });
43898  Object.assign(swiper.keyboard, {
43899    enable: enable,
43900    disable: disable
43901  });
43902}
43903
43904},{"../shared/ssr-window.esm.mjs":139,"../shared/utils.mjs":141}],124:[function(require,module,exports){
43905"use strict";
43906
43907var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
43908Object.defineProperty(exports, "__esModule", {
43909  value: true
43910});
43911exports["default"] = Manipulation;
43912var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
43913var _utils = require("../shared/utils.mjs");
43914function appendSlide(slides) {
43915  var swiper = this;
43916  var params = swiper.params,
43917    slidesEl = swiper.slidesEl;
43918  if (params.loop) {
43919    swiper.loopDestroy();
43920  }
43921  var appendElement = function appendElement(slideEl) {
43922    if (typeof slideEl === 'string') {
43923      var tempDOM = document.createElement('div');
43924      (0, _utils.s)(tempDOM, slideEl);
43925      slidesEl.append(tempDOM.children[0]);
43926      (0, _utils.s)(tempDOM, '');
43927    } else {
43928      slidesEl.append(slideEl);
43929    }
43930  };
43931  if ((0, _typeof2["default"])(slides) === 'object' && 'length' in slides) {
43932    for (var i = 0; i < slides.length; i += 1) {
43933      if (slides[i]) appendElement(slides[i]);
43934    }
43935  } else {
43936    appendElement(slides);
43937  }
43938  swiper.recalcSlides();
43939  if (params.loop) {
43940    swiper.loopCreate();
43941  }
43942  if (!params.observer || swiper.isElement) {
43943    swiper.update();
43944  }
43945}
43946function prependSlide(slides) {
43947  var swiper = this;
43948  var params = swiper.params,
43949    activeIndex = swiper.activeIndex,
43950    slidesEl = swiper.slidesEl;
43951  if (params.loop) {
43952    swiper.loopDestroy();
43953  }
43954  var newActiveIndex = activeIndex + 1;
43955  var prependElement = function prependElement(slideEl) {
43956    if (typeof slideEl === 'string') {
43957      var tempDOM = document.createElement('div');
43958      (0, _utils.s)(tempDOM, slideEl);
43959      slidesEl.prepend(tempDOM.children[0]);
43960      (0, _utils.s)(tempDOM, '');
43961    } else {
43962      slidesEl.prepend(slideEl);
43963    }
43964  };
43965  if ((0, _typeof2["default"])(slides) === 'object' && 'length' in slides) {
43966    for (var i = 0; i < slides.length; i += 1) {
43967      if (slides[i]) prependElement(slides[i]);
43968    }
43969    newActiveIndex = activeIndex + slides.length;
43970  } else {
43971    prependElement(slides);
43972  }
43973  swiper.recalcSlides();
43974  if (params.loop) {
43975    swiper.loopCreate();
43976  }
43977  if (!params.observer || swiper.isElement) {
43978    swiper.update();
43979  }
43980  swiper.slideTo(newActiveIndex, 0, false);
43981}
43982function addSlide(index, slides) {
43983  var swiper = this;
43984  var params = swiper.params,
43985    activeIndex = swiper.activeIndex,
43986    slidesEl = swiper.slidesEl;
43987  var activeIndexBuffer = activeIndex;
43988  if (params.loop) {
43989    activeIndexBuffer -= swiper.loopedSlides;
43990    swiper.loopDestroy();
43991    swiper.recalcSlides();
43992  }
43993  var baseLength = swiper.slides.length;
43994  if (index <= 0) {
43995    swiper.prependSlide(slides);
43996    return;
43997  }
43998  if (index >= baseLength) {
43999    swiper.appendSlide(slides);
44000    return;
44001  }
44002  var newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;
44003  var slidesBuffer = [];
44004  for (var i = baseLength - 1; i >= index; i -= 1) {
44005    var currentSlide = swiper.slides[i];
44006    currentSlide.remove();
44007    slidesBuffer.unshift(currentSlide);
44008  }
44009  if ((0, _typeof2["default"])(slides) === 'object' && 'length' in slides) {
44010    for (var _i = 0; _i < slides.length; _i += 1) {
44011      if (slides[_i]) slidesEl.append(slides[_i]);
44012    }
44013    newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;
44014  } else {
44015    slidesEl.append(slides);
44016  }
44017  for (var _i2 = 0; _i2 < slidesBuffer.length; _i2 += 1) {
44018    slidesEl.append(slidesBuffer[_i2]);
44019  }
44020  swiper.recalcSlides();
44021  if (params.loop) {
44022    swiper.loopCreate();
44023  }
44024  if (!params.observer || swiper.isElement) {
44025    swiper.update();
44026  }
44027  if (params.loop) {
44028    swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
44029  } else {
44030    swiper.slideTo(newActiveIndex, 0, false);
44031  }
44032}
44033function removeSlide(slidesIndexes) {
44034  var swiper = this;
44035  var params = swiper.params,
44036    activeIndex = swiper.activeIndex;
44037  var activeIndexBuffer = activeIndex;
44038  if (params.loop) {
44039    activeIndexBuffer -= swiper.loopedSlides;
44040    swiper.loopDestroy();
44041  }
44042  var newActiveIndex = activeIndexBuffer;
44043  var indexToRemove;
44044  if ((0, _typeof2["default"])(slidesIndexes) === 'object' && 'length' in slidesIndexes) {
44045    for (var i = 0; i < slidesIndexes.length; i += 1) {
44046      indexToRemove = slidesIndexes[i];
44047      if (swiper.slides[indexToRemove]) swiper.slides[indexToRemove].remove();
44048      if (indexToRemove < newActiveIndex) newActiveIndex -= 1;
44049    }
44050    newActiveIndex = Math.max(newActiveIndex, 0);
44051  } else {
44052    indexToRemove = slidesIndexes;
44053    if (swiper.slides[indexToRemove]) swiper.slides[indexToRemove].remove();
44054    if (indexToRemove < newActiveIndex) newActiveIndex -= 1;
44055    newActiveIndex = Math.max(newActiveIndex, 0);
44056  }
44057  swiper.recalcSlides();
44058  if (params.loop) {
44059    swiper.loopCreate();
44060  }
44061  if (!params.observer || swiper.isElement) {
44062    swiper.update();
44063  }
44064  if (params.loop) {
44065    swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
44066  } else {
44067    swiper.slideTo(newActiveIndex, 0, false);
44068  }
44069}
44070function removeAllSlides() {
44071  var swiper = this;
44072  var slidesIndexes = [];
44073  for (var i = 0; i < swiper.slides.length; i += 1) {
44074    slidesIndexes.push(i);
44075  }
44076  swiper.removeSlide(slidesIndexes);
44077}
44078function Manipulation(_ref) {
44079  var swiper = _ref.swiper;
44080  Object.assign(swiper, {
44081    appendSlide: appendSlide.bind(swiper),
44082    prependSlide: prependSlide.bind(swiper),
44083    addSlide: addSlide.bind(swiper),
44084    removeSlide: removeSlide.bind(swiper),
44085    removeAllSlides: removeAllSlides.bind(swiper)
44086  });
44087}
44088
44089},{"../shared/utils.mjs":141,"@babel/runtime/helpers/interopRequireDefault":99,"@babel/runtime/helpers/typeof":108}],125:[function(require,module,exports){
44090"use strict";
44091
44092Object.defineProperty(exports, "__esModule", {
44093  value: true
44094});
44095exports["default"] = Mousewheel;
44096var _ssrWindowEsm = require("../shared/ssr-window.esm.mjs");
44097var _utils = require("../shared/utils.mjs");
44098/* eslint-disable consistent-return */
44099function Mousewheel(_ref) {
44100  var swiper = _ref.swiper,
44101    extendParams = _ref.extendParams,
44102    on = _ref.on,
44103    emit = _ref.emit;
44104  var window = (0, _ssrWindowEsm.a)();
44105  extendParams({
44106    mousewheel: {
44107      enabled: false,
44108      releaseOnEdges: false,
44109      invert: false,
vendor: 4,312 bytes, lines 44110-44255
44110      forceToAxis: false,
44111      sensitivity: 1,
44112      eventsTarget: 'container',
44113      thresholdDelta: null,
44114      thresholdTime: null,
44115      noMousewheelClass: 'swiper-no-mousewheel'
44116    }
44117  });
44118  swiper.mousewheel = {
44119    enabled: false
44120  };
44121  var timeout;
44122  var lastScrollTime = (0, _utils.h)();
44123  var lastEventBeforeSnap;
44124  var recentWheelEvents = [];
44125  function normalize(e) {
44126    // Reasonable defaults
44127    var PIXEL_STEP = 10;
44128    var LINE_HEIGHT = 40;
44129    var PAGE_HEIGHT = 800;
44130    var sX = 0;
44131    var sY = 0; // spinX, spinY
44132    var pX = 0;
44133    var pY = 0; // pixelX, pixelY
44134
44135    // Legacy
44136    if ('detail' in e) {
44137      sY = e.detail;
44138    }
44139    if ('wheelDelta' in e) {
44140      sY = -e.wheelDelta / 120;
44141    }
44142    if ('wheelDeltaY' in e) {
44143      sY = -e.wheelDeltaY / 120;
44144    }
44145    if ('wheelDeltaX' in e) {
44146      sX = -e.wheelDeltaX / 120;
44147    }
44148
44149    // side scrolling on FF with DOMMouseScroll
44150    if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {
44151      sX = sY;
44152      sY = 0;
44153    }
44154    pX = sX * PIXEL_STEP;
44155    pY = sY * PIXEL_STEP;
44156    if ('deltaY' in e) {
44157      pY = e.deltaY;
44158    }
44159    if ('deltaX' in e) {
44160      pX = e.deltaX;
44161    }
44162    if (e.shiftKey && !pX) {
44163      // if user scrolls with shift he wants horizontal scroll
44164      pX = pY;
44165      pY = 0;
44166    }
44167    if ((pX || pY) && e.deltaMode) {
44168      if (e.deltaMode === 1) {
44169        // delta in LINE units
44170        pX *= LINE_HEIGHT;
44171        pY *= LINE_HEIGHT;
44172      } else {
44173        // delta in PAGE units
44174        pX *= PAGE_HEIGHT;
44175        pY *= PAGE_HEIGHT;
44176      }
44177    }
44178
44179    // Fall-back if spin cannot be determined
44180    if (pX && !sX) {
44181      sX = pX < 1 ? -1 : 1;
44182    }
44183    if (pY && !sY) {
44184      sY = pY < 1 ? -1 : 1;
44185    }
44186    return {
44187      spinX: sX,
44188      spinY: sY,
44189      pixelX: pX,
44190      pixelY: pY
44191    };
44192  }
44193  function handleMouseEnter() {
44194    if (!swiper.enabled) return;
44195    swiper.mouseEntered = true;
44196  }
44197  function handleMouseLeave() {
44198    if (!swiper.enabled) return;
44199    swiper.mouseEntered = false;
44200  }
44201  function animateSlider(newEvent) {
44202    if (swiper.params.mousewheel.thresholdDelta && newEvent.delta < swiper.params.mousewheel.thresholdDelta) {
44203      // Prevent if delta of wheel scroll delta is below configured threshold
44204      return false;
44205    }
44206    if (swiper.params.mousewheel.thresholdTime && (0, _utils.h)() - lastScrollTime < swiper.params.mousewheel.thresholdTime) {
44207      // Prevent if time between scrolls is below configured threshold
44208      return false;
44209    }
44210
44211    // If the movement is NOT big enough and
44212    // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider):
44213    //   Don't go any further (avoid insignificant scroll movement).
44214    if (newEvent.delta >= 6 && (0, _utils.h)() - lastScrollTime < 60) {
44215      // Return false as a default
44216      return true;
44217    }
44218    // If user is scrolling towards the end:
44219    //   If the slider hasn't hit the latest slide or
44220    //   if the slider is a loop and
44221    //   if the slider isn't moving right now:
44222    //     Go to next slide and
44223    //     emit a scroll event.
44224    // Else (the user is scrolling towards the beginning) and
44225    // if the slider hasn't hit the first slide or
44226    // if the slider is a loop and
44227    // if the slider isn't moving right now:
44228    //   Go to prev slide and
44229    //   emit a scroll event.
44230    if (newEvent.direction < 0) {
44231      if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {
44232        swiper.slideNext();
44233        emit('scroll', newEvent.raw);
44234      }
44235    } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {
44236      swiper.slidePrev();
44237      emit('scroll', newEvent.raw);
44238    }
44239    // If you got here is because an animation has been triggered so store the current time
44240    lastScrollTime = new window.Date().getTime();
44241    // Return false as a default
44242    return false;
44243  }
44244  function releaseScroll(newEvent) {
44245    var params = swiper.params.mousewheel;
44246    if (newEvent.direction < 0) {
44247      if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) {
44248        // Return true to animate scroll on edges
44249        return true;
44250      }
44251    } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) {
44252      // Return true to animate scroll on edges
44253      return true;
44254    }
44255    return false;
44256  }
44257  function handle(event) {
44258    var e = event;
44259    var disableParentSwiper = true;
44260    if (!swiper.enabled) return;
44261
44262    // Ignore event if the target or its parents have the swiper-no-mousewheel class
44263    if (event.target.closest(".".concat(swiper.params.mousewheel.noMousewheelClass))) return;
44264    var params = swiper.params.mousewheel;
44265    if (swiper.params.cssMode) {
44266      e.preventDefault();
44267    }
44268    var targetEl = swiper.el;
44269    if (swiper.params.mousewheel.eventsTarget !== 'container') {
44270      targetEl = document.querySelector(swiper.params.mousewheel.eventsTarget);
44271    }
44272    var targetElContainsTarget = targetEl && targetEl.contains(e.target);
44273    if (!swiper.mouseEntered && !targetElContainsTarget && !params.releaseOnEdges) return true;
44274    if (e.originalEvent) e = e.originalEvent; // jquery fix
44275    var delta = 0;
44276    var rtlFactor = swiper.rtlTranslate ? -1 : 1;
44277    var data = normalize(e);
44278    if (params.forceToAxis) {
44279      if (swiper.isHorizontal()) {
44280        if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = -data.pixelX * rtlFactor;else return true;
44281      } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = -data.pixelY;else return true;
44282    } else {
44283      delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;
44284    }
44285    if (delta === 0) return true;
44286    if (params.invert) delta = -delta;
44287
44288    // Get the scroll positions
44289    var positions = swiper.getTranslate() + delta * params.sensitivity;
44290    if (positions >= swiper.minTranslate()) positions = swiper.minTranslate();
44291    if (positions <= swiper.maxTranslate()) positions = swiper.maxTranslate();
44292
44293    // When loop is true:
44294    //     the disableParentSwiper will be true.
44295    // When loop is false:
44296    //     if the scroll positions is not on edge,
44297    //     then the disableParentSwiper will be true.
44298    //     if the scroll on edge positions,
44299    //     then the disableParentSwiper will be false.
44300    disableParentSwiper = swiper.params.loop ? true : !(positions === swiper.minTranslate() || positions === swiper.maxTranslate());
44301    if (disableParentSwiper && swiper.params.nested) e.stopPropagation();
44302    if (!swiper.params.freeMode || !swiper.params.freeMode.enabled) {
44303      // Register the new event in a variable which stores the relevant data
44304      var newEvent = {
44305        time: (0, _utils.h)(),
44306        delta: Math.abs(delta),
44307        direction: Math.sign(delta),
44308        raw: event
44309      };
44310
44311      // Keep the most recent events
44312      if (recentWheelEvents.length >= 2) {
44313        recentWheelEvents.shift(); // only store the last N events
44314      }
44315      var prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined;
44316      recentWheelEvents.push(newEvent);
44317
44318      // If there is at least one previous recorded event:
44319      //   If direction has changed or
44320      //   if the scroll is quicker than the previous one:
44321      //     Animate the slider.
44322      // Else (this is the first time the wheel is moved):
44323      //     Animate the slider.
44324      if (prevEvent) {
44325        if (newEvent.direction !== prevEvent.direction || newEvent.delta > prevEvent.delta || newEvent.time > prevEvent.time + 150) {
44326          animateSlider(newEvent);
44327        }
44328      } else {
44329        animateSlider(newEvent);
44330      }
44331
44332      // If it's time to release the scroll:
44333      //   Return now so you don't hit the preventDefault.
44334      if (releaseScroll(newEvent)) {
44335        return true;
44336      }
44337    } else {
44338      // Freemode or scrollContainer:
44339
44340      // If we recently snapped after a momentum scroll, then ignore wheel events
44341      // to give time for the deceleration to finish. Stop ignoring after 500 msecs
44342      // or if it's a new scroll (larger delta or inverse sign as last event before
44343      // an end-of-momentum snap).
44344      var _newEvent = {
44345        time: (0, _utils.h)(),
44346        delta: Math.abs(delta),
44347        direction: Math.sign(delta)
44348      };
44349      var ignoreWheelEvents = lastEventBeforeSnap && _newEvent.time < lastEventBeforeSnap.time + 500 && _newEvent.delta <= lastEventBeforeSnap.delta && _newEvent.direction === lastEventBeforeSnap.direction;
44350      if (!ignoreWheelEvents) {
44351        lastEventBeforeSnap = undefined;
44352        var position = swiper.getTranslate() + delta * params.sensitivity;
44353        var wasBeginning = swiper.isBeginning;
44354        var wasEnd = swiper.isEnd;
44355        if (position >= swiper.minTranslate()) position = swiper.minTranslate();
44356        if (position <= swiper.maxTranslate()) position = swiper.maxTranslate();
44357        swiper.setTransition(0);
44358        swiper.setTranslate(position);
44359        swiper.updateProgress();
44360        swiper.updateActiveIndex();
44361        swiper.updateSlidesClasses();
44362        if (!wasBeginning && swiper.isBeginning || !wasEnd && swiper.isEnd) {
44363          swiper.updateSlidesClasses();
44364        }
44365        if (swiper.params.loop) {
44366          swiper.loopFix({
44367            direction: _newEvent.direction < 0 ? 'next' : 'prev',
44368            byMousewheel: true
44369          });
44370        }
44371        if (swiper.params.freeMode.sticky) {
44372          // When wheel scrolling starts with sticky (aka snap) enabled, then detect
44373          // the end of a momentum scroll by storing recent (N=15?) wheel events.
vendor: 4,190 bytes, lines 44374-44451
44374          // 1. do all N events have decreasing or same (absolute value) delta?
44375          // 2. did all N events arrive in the last M (M=500?) msecs?
44376          // 3. does the earliest event have an (absolute value) delta that's
44377          //    at least P (P=1?) larger than the most recent event's delta?
44378          // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels?
44379          // If 1-4 are "yes" then we're near the end of a momentum scroll deceleration.
44380          // Snap immediately and ignore remaining wheel events in this scroll.
44381          // See comment above for "remaining wheel events in this scroll" determination.
44382          // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event.
44383          clearTimeout(timeout);
44384          timeout = undefined;
44385          if (recentWheelEvents.length >= 15) {
44386            recentWheelEvents.shift(); // only store the last N events
44387          }
44388          var _prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined;
44389          var firstEvent = recentWheelEvents[0];
44390          recentWheelEvents.push(_newEvent);
44391          if (_prevEvent && (_newEvent.delta > _prevEvent.delta || _newEvent.direction !== _prevEvent.direction)) {
44392            // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log.
44393            recentWheelEvents.splice(0);
44394          } else if (recentWheelEvents.length >= 15 && _newEvent.time - firstEvent.time < 500 && firstEvent.delta - _newEvent.delta >= 1 && _newEvent.delta <= 6) {
44395            // We're at the end of the deceleration of a momentum scroll, so there's no need
44396            // to wait for more events. Snap ASAP on the next tick.
44397            // Also, because there's some remaining momentum we'll bias the snap in the
44398            // direction of the ongoing scroll because it's better UX for the scroll to snap
44399            // in the same direction as the scroll instead of reversing to snap.  Therefore,
44400            // if it's already scrolled more than 20% in the current direction, keep going.
44401            var snapToThreshold = delta > 0 ? 0.8 : 0.2;
44402            lastEventBeforeSnap = _newEvent;
44403            recentWheelEvents.splice(0);
44404            timeout = (0, _utils.n)(function () {
44405              if (swiper.destroyed || !swiper.params) return;
44406              swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);
44407            }, 0); // no delay; move on next tick
44408          }
44409          if (!timeout) {
44410            // if we get here, then we haven't detected the end of a momentum scroll, so
44411            // we'll consider a scroll "complete" when there haven't been any wheel events
44412            // for 500ms.
44413            timeout = (0, _utils.n)(function () {
44414              if (swiper.destroyed || !swiper.params) return;
44415              var snapToThreshold = 0.5;
44416              lastEventBeforeSnap = _newEvent;
44417              recentWheelEvents.splice(0);
44418              swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);
44419            }, 500);
44420          }
44421        }
44422
44423        // Emit event
44424        if (!ignoreWheelEvents) emit('scroll', e);
44425
44426        // Stop autoplay
44427        if (swiper.params.autoplay && swiper.params.autoplay.disableOnInteraction) swiper.autoplay.stop();
44428        // Return page scroll on edge positions
44429        if (params.releaseOnEdges && (position === swiper.minTranslate() || position === swiper.maxTranslate())) {
44430          return true;
44431        }
44432      }
44433    }
44434    if (e.preventDefault) e.preventDefault();else e.returnValue = false;
44435    return false;
44436  }
44437  function events(method) {
44438    var targetEl = swiper.el;
44439    if (swiper.params.mousewheel.eventsTarget !== 'container') {
44440      targetEl = document.querySelector(swiper.params.mousewheel.eventsTarget);
44441    }
44442    targetEl[method]('mouseenter', handleMouseEnter);
44443    targetEl[method]('mouseleave', handleMouseLeave);
44444    targetEl[method]('wheel', handle);
44445  }
44446  function enable() {
44447    if (swiper.params.cssMode) {
44448      swiper.wrapperEl.removeEventListener('wheel', handle);
44449      return true;
44450    }
44451    if (swiper.mousewheel.enabled) return false;
44452    events('addEventListener');
44453    swiper.mousewheel.enabled = true;
44454    return true;
44455  }
44456  function disable() {
44457    if (swiper.params.cssMode) {
44458      swiper.wrapperEl.addEventListener(event, handle);
44459      return true;
44460    }
44461    if (!swiper.mousewheel.enabled) return false;
44462    events('removeEventListener');
44463    swiper.mousewheel.enabled = false;
44464    return true;
44465  }
44466  on('init', function () {
44467    if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) {
44468      disable();
44469    }
44470    if (swiper.params.mousewheel.enabled) enable();
44471  });
44472  on('destroy', function () {
44473    if (swiper.params.cssMode) {
44474      enable();
44475    }
44476    if (swiper.mousewheel.enabled) disable();
44477  });
44478  Object.assign(swiper.mousewheel, {
44479    enable: enable,
44480    disable: disable
44481  });
44482}
44483
44484},{"../shared/ssr-window.esm.mjs":139,"../shared/utils.mjs":141}],126:[function(require,module,exports){
44485"use strict";
44486
44487var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
44488Object.defineProperty(exports, "__esModule", {
44489  value: true
44490});
44491exports["default"] = Navigation;
44492var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
44493var _createElementIfNotDefined = require("../shared/create-element-if-not-defined.mjs");
44494var _utils = require("../shared/utils.mjs");
44495var arrowSvg = "<svg class=\"swiper-navigation-icon\" width=\"11\" height=\"20\" viewBox=\"0 0 11 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0.38296 20.0762C0.111788 19.805 0.111788 19.3654 0.38296 19.0942L9.19758 10.2796L0.38296 1.46497C0.111788 1.19379 0.111788 0.754138 0.38296 0.482966C0.654131 0.211794 1.09379 0.211794 1.36496 0.482966L10.4341 9.55214C10.8359 9.9539 10.8359 10.6053 10.4341 11.007L1.36496 20.0762C1.09379 20.3474 0.654131 20.3474 0.38296 20.0762Z\" fill=\"currentColor\"/></svg>";
44496function Navigation(_ref) {
44497  var swiper = _ref.swiper,
44498    extendParams = _ref.extendParams,
44499    on = _ref.on,
44500    emit = _ref.emit;
44501  extendParams({
44502    navigation: {
44503      nextEl: null,
44504      prevEl: null,
44505      addIcons: true,
44506      hideOnClick: false,
44507      disabledClass: 'swiper-button-disabled',
44508      hiddenClass: 'swiper-button-hidden',
44509      lockClass: 'swiper-button-lock',
44510      navigationDisabledClass: 'swiper-navigation-disabled'
44511    }
44512  });
44513  swiper.navigation = {
44514    nextEl: null,
44515    prevEl: null,
44516    arrowSvg: arrowSvg
44517  };
44518  function getEl(el) {
44519    var res;
44520    if (el && typeof el === 'string' && swiper.isElement) {
44521      res = swiper.el.querySelector(el) || swiper.hostEl.querySelector(el);
44522      if (res) return res;
44523    }
44524    if (el) {
44525      if (typeof el === 'string') res = (0, _toConsumableArray2["default"])(document.querySelectorAll(el));
44526      if (swiper.params.uniqueNavElements && typeof el === 'string' && res && res.length > 1 && swiper.el.querySelectorAll(el).length === 1) {
44527        res = swiper.el.querySelector(el);
44528      } else if (res && res.length === 1) {
44529        res = res[0];
44530      }
44531    }
44532    if (el && !res) return el;
44533    // if (Array.isArray(res) && res.length === 1) res = res[0];
44534    return res;
44535  }
44536  function toggleEl(el, disabled) {
44537    var params = swiper.params.navigation;
44538    el = (0, _utils.m)(el);
44539    el.forEach(function (subEl) {
44540      if (subEl) {
44541        var _subEl$classList;
44542        (_subEl$classList = subEl.classList)[disabled ? 'add' : 'remove'].apply(_subEl$classList, (0, _toConsumableArray2["default"])(params.disabledClass.split(' ')));
44543        if (subEl.tagName === 'BUTTON') subEl.disabled = disabled;
44544        if (swiper.params.watchOverflow && swiper.enabled) {
44545          subEl.classList[swiper.isLocked ? 'add' : 'remove'](params.lockClass);
44546        }
44547      }
44548    });
44549  }
44550  function update() {
44551    // Update Navigation Buttons
44552    var _swiper$navigation = swiper.navigation,
44553      nextEl = _swiper$navigation.nextEl,
44554      prevEl = _swiper$navigation.prevEl;
44555    if (swiper.params.loop) {
44556      toggleEl(prevEl, false);
44557      toggleEl(nextEl, false);
44558      return;
44559    }
44560    toggleEl(prevEl, swiper.isBeginning && !swiper.params.rewind);
44561    toggleEl(nextEl, swiper.isEnd && !swiper.params.rewind);
44562  }
44563  function onPrevClick(e) {
44564    e.preventDefault();
44565    if (swiper.isBeginning && !swiper.params.loop && !swiper.params.rewind) return;
44566    swiper.slidePrev();
44567    emit('navigationPrev');
44568  }
44569  function onNextClick(e) {
44570    e.preventDefault();
44571    if (swiper.isEnd && !swiper.params.loop && !swiper.params.rewind) return;
44572    swiper.slideNext();
44573    emit('navigationNext');
44574  }
44575  function init() {
44576    var params = swiper.params.navigation;
44577    swiper.params.navigation = (0, _createElementIfNotDefined.c)(swiper, swiper.originalParams.navigation, swiper.params.navigation, {
44578      nextEl: 'swiper-button-next',
44579      prevEl: 'swiper-button-prev'
44580    });
44581    if (!(params.nextEl || params.prevEl)) return;
44582    var nextEl = getEl(params.nextEl);
44583    var prevEl = getEl(params.prevEl);
44584    Object.assign(swiper.navigation, {
44585      nextEl: nextEl,
44586      prevEl: prevEl
44587    });
44588    nextEl = (0, _utils.m)(nextEl);
44589    prevEl = (0, _utils.m)(prevEl);
44590    var initButton = function initButton(el, dir) {
44591      if (el) {
44592        if (params.addIcons && el.matches('.swiper-button-next,.swiper-button-prev') && !el.querySelector('svg')) {
44593          var tempEl = document.createElement('div');
44594          (0, _utils.s)(tempEl, arrowSvg);
44595          el.appendChild(tempEl.querySelector('svg'));
44596          tempEl.remove();
44597        }
44598        el.addEventListener('click', dir === 'next' ? onNextClick : onPrevClick);
44599      }
44600      if (!swiper.enabled && el) {
44601        var _el$classList;
44602        (_el$classList = el.classList).add.apply(_el$classList, (0, _toConsumableArray2["default"])(params.lockClass.split(' ')));
44603      }
44604    };
44605    nextEl.forEach(function (el) {
44606      return initButton(el, 'next');
44607    });
44608    prevEl.forEach(function (el) {
44609      return initButton(el, 'prev');
44610    });
44611  }
44612  function destroy() {
44613    var _swiper$navigation2 = swiper.navigation,
44614      nextEl = _swiper$navigation2.nextEl,
44615      prevEl = _swiper$navigation2.prevEl;
44616    nextEl = (0, _utils.m)(nextEl);
44617    prevEl = (0, _utils.m)(prevEl);
44618    var destroyButton = function destroyButton(el, dir) {
44619      var _el$classList2;
44620      el.removeEventListener('click', dir === 'next' ? onNextClick : onPrevClick);
44621      (_el$classList2 = el.classList).remove.apply(_el$classList2, (0, _toConsumableArray2["default"])(swiper.params.navigation.disabledClass.split(' ')));
44622    };
44623    nextEl.forEach(function (el) {
44624      return destroyButton(el, 'next');
44625    });
44626    prevEl.forEach(function (el) {
44627      return destroyButton(el, 'prev');
44628    });
44629  }
44630  on('init', function () {
44631    if (swiper.params.navigation.enabled === false) {
44632      // eslint-disable-next-line
44633      disable();
44634    } else {
44635      init();
44636      update();
44637    }
44638  });
44639  on('toEdge fromEdge lock unlock', function () {
44640    update();
44641  });
44642  on('destroy', function () {
44643    destroy();
44644  });
44645  on('enable disable', function () {
44646    var _swiper$navigation3 = swiper.navigation,
44647      nextEl = _swiper$navigation3.nextEl,
44648      prevEl = _swiper$navigation3.prevEl;
44649    nextEl = (0, _utils.m)(nextEl);
44650    prevEl = (0, _utils.m)(prevEl);
44651    if (swiper.enabled) {
44652      update();
44653      return;
44654    }
44655    [].concat((0, _toConsumableArray2["default"])(nextEl), (0, _toConsumableArray2["default"])(prevEl)).filter(function (el) {
44656      return !!el;
44657    }
44657).forEach(function (el) {
44658      return el.classList.add(swiper.params.navigation.lockClass);
44659    });
44660  });
44661  on('click', function (_s, e) {
44662    var _swiper$navigation4 = swiper.navigation,
44663      nextEl = _swiper$navigation4.nextEl,
44664      prevEl = _swiper$navigation4.prevEl;
44665    nextEl = (0, _utils.m)(nextEl);
44666    prevEl = (0, _utils.m)(prevEl);
44667    var targetEl = e.target;
44668    var targetIsButton = prevEl.includes(targetEl) || nextEl.includes(targetEl);
44669    if (swiper.isElement && !targetIsButton) {
44670      var path = e.path || e.composedPath && e.composedPath();
44671      if (path) {
44672        targetIsButton = path.find(function (pathEl) {
44673          return nextEl.includes(pathEl) || prevEl.includes(pathEl);
44674        });
44675      }
44676    }
44677    if (swiper.params.navigation.hideOnClick && !targetIsButton) {
44678      if (swiper.pagination && swiper.params.pagination && swiper.params.pagination.clickable && (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))) return;
44679      var isHidden;
44680      if (nextEl.length) {
44681        isHidden = nextEl[0].classList.contains(swiper.params.navigation.hiddenClass);
44682      } else if (prevEl.length) {
44683        isHidden = prevEl[0].classList.contains(swiper.params.navigation.hiddenClass);
44684      }
44685      if (isHidden === true) {
44686        emit('navigationShow');
44687      } else {
44688        emit('navigationHide');
44689      }
44690      [].concat((0, _toConsumableArray2["default"])(nextEl), (0, _toConsumableArray2["default"])(prevEl)).filter(function (el) {
44691        return !!el;
44692      }
44692).forEach(function (el) {
44693        return el.classList.toggle(swiper.params.navigation.hiddenClass);
44694      });
44695    }
44696  });
44697  var enable = function enable() {
44698    var _swiper$el$classList;
44699    (_swiper$el$classList = swiper.el.classList).remove.apply(_swiper$el$classList, (0, _toConsumableArray2["default"])(swiper.params.navigation.navigationDisabledClass.split(' ')));
44700    init();
44701    update();
44702  };
44703  var disable = function disable() {
44704    var _swiper$el$classList2;
44705    (_swiper$el$classList2 = swiper.el.classList).add.apply(_swiper$el$classList2, (0, _toConsumableArray2["default"])(swiper.params.navigation.navigationDisabledClass.split(' ')));
44706    destroy();
44707  };
44708  Object.assign(swiper.navigation, {
44709    enable: enable,
44710    disable: disable,
44711    update: update,
44712    init: init,
44713    destroy: destroy
44714  });
44715}
44716
44717},{"../shared/create-element-if-not-defined.mjs":134,"../shared/utils.mjs":141,"@babel/runtime/helpers/interopRequireDefault":99,"@babel/runtime/helpers/toConsumableArray":105}],127:[function(require,module,exports){
44718"use strict";
44719
44720var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
44721Object.defineProperty(exports, "__esModule", {
44722  value: true
44723});
44724exports["default"] = Pagination;
44725var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
44726var _classesToSelector = require("../shared/classes-to-selector.mjs");
44727var _createElementIfNotDefined = require("../shared/create-element-if-not-defined.mjs");
44728var _utils = require("../shared/utils.mjs");
44729function Pagination(_ref) {
44730  var swiper = _ref.swiper,
44731    extendParams = _ref.extendParams,
44732    on = _ref.on,
44733    emit = _ref.emit;
44734  var pfx = 'swiper-pagination';
44735  extendParams({
44736    pagination: {
44737      el: null,
44738      bulletElement: 'span',
44739      clickable: false,
44740      hideOnClick: false,
44741      renderBullet: null,
44742      renderProgressbar: null,
44743      renderFraction: null,
44744      renderCustom: null,
44745      progressbarOpposite: false,
44746      type: 'bullets',
44747      // 'bullets' or 'progressbar' or 'fraction' or 'custom'
44748      dynamicBullets: false,
44749      dynamicMainBullets: 1,
44750      formatFractionCurrent: function formatFractionCurrent(number) {
44751        return number;
44752      },
44753      formatFractionTotal: function formatFractionTotal(number) {
44754        return number;
44755      },
44756      bulletClass: "".concat(pfx, "-bullet"),
44757      bulletActiveClass: "".concat(pfx, "-bullet-active"),
44758      modifierClass: "".concat(pfx, "-"),
44759      currentClass: "".concat(pfx, "-current"),
44760      totalClass: "".concat(pfx, "-total"),
44761      hiddenClass: "".concat(pfx, "-hidden"),
44762      progressbarFillClass: "".concat(pfx, "-progressbar-fill"),
44763      progressbarOppositeClass: "".concat(pfx, "-progressbar-opposite"),
44764      clickableClass: "".concat(pfx, "-clickable"),
44765      lockClass: "".concat(pfx, "-lock"),
44766      horizontalClass: "".concat(pfx, "-horizontal"),
44767      verticalClass: "".concat(pfx, "-vertical"),
44768      paginationDisabledClass: "".concat(pfx, "-disabled")
44769    }
44770  });
44771  swiper.pagination = {
44772    el: null,
44773    bullets: []
44774  };
44775  var bulletSize;
44776  var dynamicBulletIndex = 0;
44777  function isPaginationDisabled() {
44778    return !swiper.params.pagination.el || !swiper.pagination.el || Array.isArray(swiper.pagination.el) && swiper.pagination.el.length === 0;
44779  }
44780  function setSideBullets(bulletEl, position) {
44781    var bulletActiveClass = swiper.params.pagination.bulletActiveClass;
44782    if (!bulletEl) return;
44783    bulletEl = bulletEl["".concat(position === 'prev' ? 'previous' : 'next', "ElementSibling")];
44784    if (bulletEl) {
44785      bulletEl.classList.add("".concat(bulletActiveClass, "-").concat(position));
44786      bulletEl = bulletEl["".concat(position === 'prev' ? 'previous' : 'next', "ElementSibling")];
44787      if (bulletEl) {
44788        bulletEl.classList.add("".concat(bulletActiveClass, "-").concat(position, "-").concat(position));
44789      }
44790    }
44791  }
44792  function getMoveDirection(prevIndex, nextIndex, length) {
44793    prevIndex = prevIndex % length;
44794    nextIndex = nextIndex % length;
44795    if (nextIndex === prevIndex + 1) {
44796      return 'next';
44797    } else if (nextIndex === prevIndex - 1) {
44798      return 'previous';
44799    }
44800    return;
44801  }
44802  function onBulletClick(e) {
44803    var bulletEl = e.target.closest((0, _classesToSelector.c)(swiper.params.pagination.bulletClass));
44804    if (!bulletEl) {
44805      return;
44806    }
44807    e.preventDefault();
44808    var index = (0, _utils.j)(bulletEl) * swiper.params.slidesPerGroup;
44809    if (swiper.params.loop) {
44810      if (swiper.realIndex === index) return;
44811      var moveDirection = getMoveDirection(swiper.realIndex, index, swiper.slides.length);
44812      if (moveDirection === 'next') {
44813        swiper.slideNext();
44814      } else if (moveDirection === 'previous') {
44815        swiper.slidePrev();
44816      } else {
44817        swiper.slideToLoop(index);
44818      }
44819    } else {
44820      swiper.slideTo(index);
44821    }
44822  }
44823  function update() {
44824    // Render || Update Pagination bullets/items
44825    var rtl = swiper.rtl;
44826    var params = swiper.params.pagination;
44827    if (isPaginationDisabled()) return;
44828    var el = swiper.pagination.el;
44829    el = (0, _utils.m)(el);
44830    // Current/Total
44831    var current;
44832    var previousIndex;
44833    var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;
44834    var total = swiper.params.loop ? Math.ceil(slidesLength / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
44835    if (swiper.params.loop) {
44836      previousIndex = swiper.previousRealIndex || 0;
44837      current = swiper.params.slidesPerGroup > 1 ? Math.floor(swiper.realIndex / swiper.params.slidesPerGroup) : swiper.realIndex;
44838    } else if (typeof swiper.snapIndex !== 'undefined') {
44839      current = swiper.snapIndex;
44840      previousIndex = swiper.previousSnapIndex;
44841    } else {
44842      previousIndex = swiper.previousIndex || 0;
44843      current = swiper.activeIndex || 0;
44844    }
44845    // Types
44846    if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) {
44847      var bullets = swiper.pagination.bullets;
44848      var firstIndex;
44849      var lastIndex;
44850      var midIndex;
44851      if (params.dynamicBullets) {
44852        bulletSize = (0, _utils.i)(bullets[0], swiper.isHorizontal() ? 'width' : 'height', true);
44853        el.forEach(function (subEl) {
44854          subEl.style[swiper.isHorizontal() ? 'width' : 'height'] = "".concat(bulletSize * (params.dynamicMainBullets + 4), "px");
44855        });
44856        if (params.dynamicMainBullets > 1 && previousIndex !== undefined) {
44857          dynamicBulletIndex += current - (previousIndex || 0);
44858          if (dynamicBulletIndex > params.dynamicMainBullets - 1) {
44859            dynamicBulletIndex = params.dynamicMainBullets - 1;
44860          } else if (dynamicBulletIndex < 0) {
44861            dynamicBulletIndex = 0;
44862          }
44863        }
44864        firstIndex = Math.max(current - dynamicBulletIndex, 0);
44865        lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);
44866        midIndex = (lastIndex + firstIndex) / 2;
44867      }
44868      bullets.forEach(function (bulletEl) {
44869        var _bulletEl$classList;
44870        var classesToRemove = (0, _toConsumableArray2["default"])(['', '-next', '-next-next', '-prev', '-prev-prev', '-main'].map(function (suffix) {
44871          return "".concat(params.bulletActiveClass).concat(suffix);
44872        })).map(function (s) {
44873          return typeof s === 'string' && s.includes(' ') ? s.split(' ') : s;
44874        }).flat();
44875        (_bulletEl$classList = bulletEl.classList).remove.apply(_bulletEl$classList, (0, _toConsumableArray2["default"])(classesToRemove));
44876      });
44877      if (el.length > 1) {
44878        bullets.forEach(function (bullet) {
44879          var bulletIndex = (0, _utils.j)(bullet);
44880          if (bulletIndex === current) {
44881            var _bullet$classList;
44882            (_bullet$classList = bullet.classList).add.apply(_bullet$classList, (0, _toConsumableArray2["default"])(params.bulletActiveClass.split(' ')));
44883          } else if (swiper.isElement) {
44884            bullet.setAttribute('part', 'bullet');
44885          }
44886          if (params.dynamicBullets) {
44887            if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {
44888              var _bullet$classList2;
44889              (_bullet$classList2 = bullet.classList).add.apply(_bullet$classList2, (0, _toConsumableArray2["default"])("".concat(params.bulletActiveClass, "-main").split(' ')));
44890            }
44891            if (bulletIndex === firstIndex) {
44892              setSideBullets(bullet, 'prev');
44893            }
44894            if (bulletIndex === lastIndex) {
44895              setSideBullets(bullet, 'next');
44896            }
44897          }
44898        });
44899      } else {
44900        var bullet = bullets[current];
44901        if (bullet) {
44902          var _bullet$classList3;
44903          (_bullet$classList3 = bullet.classList).add.apply(_bullet$classList3, (0, _toConsumableArray2["default"])(params.bulletActiveClass.split(' ')));
44904        }
44905        if (swiper.isElement) {
44906          bullets.forEach(function (bulletEl, bulletIndex) {
44907            bulletEl.setAttribute('part', bulletIndex === current ? 'bullet-active' : 'bullet');
44908          });
44909        }
44910        if (params.dynamicBullets) {
44911          var firstDisplayedBullet = bullets[firstIndex];
44912          var lastDisplayedBullet = bullets[lastIndex];
44913          for (var i = firstIndex; i <= lastIndex; i += 1) {
44914            if (bullets[i]) {
44915              var _bullets$i$classList;
44916              (_bullets$i$classList = bullets[i].classList).add.apply(_bullets$i$classList, (0, _toConsumableArray2["default"])("".concat(params.bulletActiveClass, "-main").split(' ')));
44917            }
44918          }
44919          setSideBullets(firstDisplayedBullet, 'prev');
44920          setSideBullets(lastDisplayedBullet, 'next');
44921        }
44922      }
44923      if (params.dynamicBullets) {
44924        var dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);
44925        var bulletsOffset = (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize;
44926        var offsetProp = rtl ? 'right' : 'left';
44927        bullets.forEach(function (bullet) {
44928          bullet.style[swiper.isHorizontal() ? offsetProp : 'top'] = "".concat(bulletsOffset, "px");
44929        });
44930      }
44931    }
44932    el.forEach(function (subEl, subElIndex) {
44933      if (params.type === 'fraction') {
44934        subEl.querySelectorAll((0, _classesToSelector.c)(params.currentClass)).forEach(function (fractionEl) {
44935          fractionEl.textContent = params.formatFractionCurrent(current + 1);
44936        });
44937        subEl.querySelectorAll((0, _classesToSelector.c)(params.totalClass)).forEach(function (totalEl) {
44938          totalEl.textContent = params.formatFractionTotal(total);
44939        });
44940      }
44941      if (params.type === 'progressbar') {
44942        var progressbarDirection;
44943        if (params.progressbarOpposite) {
44944          progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';
44945        } else {
44946          progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';
44947        }
44948        var scale = (current + 1) / total;
44949        var scaleX = 1;
44950        var scaleY = 1;
44951        if (progressbarDirection === 'horizontal') {
44952          scaleX = scale;
44953        } else {
44954          scaleY = scale;
44955        }
44956        subEl.querySelectorAll((0, _classesToSelector.c)(params.progressbarFillClass)).forEach(function (progressEl) {
44957          progressEl.style.transform = "translate3d(0,0,0) scaleX(".concat(scaleX, ") scaleY(").concat(scaleY, ")");
44958          progressEl.style.transitionDuration = "".concat(swiper.params.speed, "ms");
44959        });
44960      }
44961      if (params.type === 'custom' && params.renderCustom) {
44962        (0, _utils.s)(subEl, params.renderCustom(swiper, current + 1, total));
44963        if (subElIndex === 0) emit('paginationRender', subEl);
44964      } else {
44965        if (subElIndex === 0) emit('paginationRender', subEl);
44966        emit('paginationUpdate', subEl);
44967      }
44968      if (swiper.params.watchOverflow && swiper.enabled) {
44969        subEl.classList[swiper.isLocked ? 'add' : 'remove'](params.lockClass);
44970      }
44971    });
44972  }
44973  function render() {
44974    // Render Container
44975    var params = swiper.params.pagination;
44976    if (isPaginationDisabled()) return;
44977    var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.grid && swiper.params.grid.rows > 1 ? swiper.slides.length / Math.ceil(swiper.params.grid.rows) : swiper.slides.length;
44978    var el = swiper.pagination.el;
44979    el = (0, _utils.m)(el);
44980    var paginationHTML = '';
44981    if (params.type === 'bullets') {
44982      var numberOfBullets = swiper.params.loop ? Math.ceil(slidesLength / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
44983      if (swiper.params.freeMode && swiper.params.freeMode.enabled && numberOfBullets > slidesLength) {
44984        numberOfBullets = slidesLength;
44985      }
44986      for (var i = 0; i < numberOfBullets; i += 1) {
44987        if (params.renderBullet) {
44988          paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);
44989        } else {
44990          // prettier-ignore
44991          paginationHTML += "<".concat(params.bulletElement, " ").concat(swiper.isElement ? 'part="bullet"' : '', " class=\"").concat(params.bulletClass, "\"></").concat(params.bulletElement, ">");
44992        }
44993      }
44994    }
44995    if (params.type === 'fraction') {
44996      if (params.renderFraction) {
44997        paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);
44998      } else {
44999        paginationHTML = "<span class=\"".concat(params.currentClass, "\"></span>") + ' / ' + "<span class=\"".concat(params.totalClass, "\"></span>");
45000      }
45001    }
45002    if (params.type === 'progressbar') {
45003      if (params.renderProgressbar) {
45004        paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);
45005      } else {
45006        paginationHTML = "<span class=\"".concat(params.progressbarFillClass, "\"></span>");
45007      }
45008    }
45009    swiper.pagination.bullets = [];
45010    el.forEach(function (subEl) {
45011      if (params.type !== 'custom') {
45012        (0, _utils.s)(subEl, paginationHTML || '');
45013      }
45014      if (params.type === 'bullets') {
45015        var _swiper$pagination$bu;
45016        (_swiper$pagination$bu = swiper.pagination.bullets).push.apply(_swiper$pagination$bu, (0, _toConsumableArray2["default"])(subEl.querySelectorAll((0, _classesToSelector.c)(params.bulletClass))));
45017      }
45018    });
45019    if (params.type !== 'custom') {
45020      emit('paginationRender', el[0]);
45021    }
45022  }
45023  function init() {
45024    swiper.params.pagination = (0, _createElementIfNotDefined.c)(swiper, swiper.originalParams.pagination, swiper.params.pagination, {
45025      el: 'swiper-pagination'
45026    });
45027    var params = swiper.params.pagination;
45028    if (!params.el) return;
45029    var el;
45030    if (typeof params.el === 'string' && swiper.isElement) {
45031      el = swiper.el.querySelector(params.el);
45032    }
45033    if (!el && typeof params.el === 'string') {
45034      el = (0, _toConsumableArray2["default"])(document.querySelectorAll(params.el));
45035    }
45036    if (!el) {
45037      el = params.el;
45038    }
45039    if (!el || el.length === 0) return;
45040    if (swiper.params.uniqueNavElements && typeof params.el === 'string' && Array.isArray(el) && el.length > 1) {
45041      el = (0, _toConsumableArray2["default"])(swiper.el.querySelectorAll(params.el));
45042      // check if it belongs to another nested Swiper
45043      if (el.length > 1) {
45044        el = el.find(function (subEl) {
45045          if ((0, _utils.d)(subEl, '.swiper')[0] !== swiper.el) return false;
45046          return true;
45047        });
45048      }
45049    }
45050    if (Array.isArray(el) && el.length === 1) el = el[0];
45051    Object.assign(swiper.pagination, {
45052      el: el
45053    });
45054    el = (0, _utils.m)(el);
45055    el.forEach(function (subEl) {
45056      if (params.type === 'bullets' && params.clickable) {
45057        var _subEl$classList;
45058        (_subEl$classList = subEl.classList).add.apply(_subEl$classList, (0, _toConsumableArray2["default"])((params.clickableClass || '').split(' ')));
45059      }
45060      subEl.classList.add(params.modifierClass + params.type);
45061      subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);
45062      if (params.type === 'bullets' && params.dynamicBullets) {
45063        subEl.classList.add("".concat(params.modifierClass).concat(params.type, "-dynamic"));
45064        dynamicBulletIndex = 0;
45065        if (params.dynamicMainBullets < 1) {
45066          params.dynamicMainBullets = 1;
45067        }
45068      }
45069      if (params.type === 'progressbar' && params.progressbarOpposite) {
45070        subEl.classList.add(params.progressbarOppositeClass);
45071      }
45072      if (params.clickable) {
45073        subEl.addEventListener('click', onBulletClick);
45074      }
45075      if (!swiper.enabled) {
45076        subEl.classList.add(params.lockClass);
45077      }
45078    });
45079  }
45080  function destroy() {
45081    var params = swiper.params.pagination;
45082    if (isPaginationDisabled()) return;
45083    var el = swiper.pagination.el;
45084    if (el) {
45085      el = (0, _utils.m)(el);
45086      el.forEach(function (subEl) {
45087        subEl.classList.remove(params.hiddenClass);
45088        subEl.classList.remove(params.modifierClass + params.type);
45089        subEl.classList.remove(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);
45090        if (params.clickable) {
45091          var _subEl$classList2;
45092          (_subEl$classList2 = subEl.classList).remove.apply(_subEl$classList2, (0, _toConsumableArray2["default"])((params.clickableClass || '').split(' ')));
45093          subEl.removeEventListener('click', onBulletClick);
45094        }
45095      });
45096    }
45097    if (swiper.pagination.bullets) swiper.pagination.bullets.forEach(function (subEl) {
45098      var _subEl$classList3;
45099      return (_subEl$classList3 = subEl.classList).remove.apply(_subEl$classList3, (0, _toConsumableArray2["default"])(params.bulletActiveClass.split(' ')));
45100    });
45101  }
45102  on('changeDirection', function () {
45103    if (!swiper.pagination || !swiper.pagination.el) return;
45104    var params = swiper.params.pagination;
45105    var el = swiper.pagination.el;
45106    el = (0, _utils.m)(el);
45107    el.forEach(function (subEl) {
45108      subEl.classList.remove(params.horizontalClass, params.verticalClass);
45109      subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);
45110    });
45111  });
45112  on('init', function () {
45113    if (swiper.params.pagination.enabled === false) {
45114      // eslint-disable-next-line
45115      disable();
45116    } else {
45117      init();
45118      render();
45119      update();
45120    }
45121  });
45122  on('activeIndexChange', function () {
45123    if (typeof swiper.snapIndex === 'undefined') {
45124      update();
45125    }
45126  });
45127  on('snapIndexChange', function () {
45128    update();
45129  });
45130  on('snapGridLengthChange', function () {
45131    render();
45132    update();
45133  });
45134  on('destroy', function () {
45135    destroy();
45136  });
45137  on('enable disable', function () {
45138    var el = swiper.pagination.el;
45139    if (el) {
45140      el = (0, _utils.m)(el);
45141      el.forEach(function (subEl) {
45142        return subEl.classList[swiper.enabled ? 'remove' : 'add'](swiper.params.pagination.lockClass);
45143      });
45144    }
45145  });
45146  on('lock unlock', function () {
45147    update();
45148  });
45149  on('click', function (_s, e) {
45150    var targetEl = e.target;
45151    var el = (0, _utils.m)(swiper.pagination.el);
45152    if (swiper.params.pagination.el && swiper.params.pagination.hideOnClick && el && el.length > 0 && !targetEl.classList.contains(swiper.params.pagination.bulletClass)) {
45153      if (swiper.navigation && (swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl || swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl)) return;
45154      var isHidden = el[0].classList.contains(swiper.params.pagination.hiddenClass);
45155      if (isHidden === true) {
45156        emit('paginationShow');
45157      } else {
45158        emit('paginationHide');
45159      }
45160      el.forEach(function (subEl) {
45161        return subEl.classList.toggle(swiper.params.pagination.hiddenClass);
45162      });
45163    }
45164  });
45165  var enable = function enable() {
45166    swiper.el.classList.remove(swiper.params.pagination.paginationDisabledClass);
45167    var el = swiper.pagination.el;
45168    if (el) {
45169      el = (0, _utils.m)(el);
45170      el.forEach(function (subEl) {
45171        return subEl.classList.remove(swiper.params.pagination.paginationDisabledClass);
45172      });
45173    }
45174    init();
45175    render();
45176    update();
45177  };
45178  var disable = function disable() {
45179    swiper.el.classList.add(swiper.params.pagination.paginationDisabledClass);
45180    var el = swiper.pagination.el;
45181    if (el) {
45182      el = (0, _utils.m)(el);
45183      el.forEach(function (subEl) {
45184        return subEl.classList.add(swiper.params.pagination.paginationDisabledClass);
45185      });
45186    }
45187    destroy();
45188  };
45189  Object.assign(swiper.pagination, {
45190    enable: enable,
45191    disable: disable,
45192    render: render,
45193    update: update,
45194    init: init,
45195    destroy: destroy
45196  });
45197}
45198
45199},{"../shared/classes-to-selector.mjs":133,"../shared/create-element-if-not-defined.mjs":134,"../shared/utils.mjs":141,"@babel/runtime/helpers/interopRequireDefault":99,"@babel/runtime/helpers/toConsumableArray":105}],128:[function(require,module,exports){
45200"use strict";
45201
45202var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
45203Object.defineProperty(exports, "__esModule", {
45204  value: true
45205});
45206exports["default"] = Parallax;
45207var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
45208var _utils = require("../shared/utils.mjs");
45209function Parallax(_ref) {
45210  var swiper = _ref.swiper,
45211    extendParams = _ref.extendParams,
45212    on = _ref.on;
45213  extendParams({
45214    parallax: {
45215      enabled: false
45216    }
45217  });
45218  var elementsSelector = '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]';
45219  var setTransform = function setTransform(el, progress) {
45220    var rtl = swiper.rtl;
45221    var rtlFactor = rtl ? -1 : 1;
45222    var p = el.getAttribute('data-swiper-parallax') || '0';
45223    var x = el.getAttribute('data-swiper-parallax-x');
45224    var y = el.getAttribute('data-swiper-parallax-y');
45225    var scale = el.getAttribute('data-swiper-parallax-scale');
45226    var opacity = el.getAttribute('data-swiper-parallax-opacity');
45227    var rotate = el.getAttribute('data-swiper-parallax-rotate');
45228    if (x || y) {
45229      x = x || '0';
45230      y = y || '0';
45231    } else if (swiper.isHorizontal()) {
45232      x = p;
45233      y = '0';
45234    } else {
45235      y = p;
45236      x = '0';
45237    }
45238    if (x.indexOf('%') >= 0) {
45239      x = "".concat(parseInt(x, 10) * progress * rtlFactor, "%");
45240    } else {
45241      x = "".concat(x * progress * rtlFactor, "px");
45242    }
45243    if (y.indexOf('%') >= 0) {
45244      y = "".concat(parseInt(y, 10) * progress, "%");
45245    } else {
45246      y = "".concat(y * progress, "px");
45247    }
45248    if (typeof opacity !== 'undefined' && opacity !== null) {
45249      var currentOpacity = opacity - (opacity - 1) * (1 - Math.abs(progress));
45250      el.style.opacity = currentOpacity;
45251    }
45252    var transform = "translate3d(".concat(x, ", ").concat(y, ", 0px)");
45253    if (typeof scale !== 'undefined' && scale !== null) {
45254      var currentScale = scale - (scale - 1) * (1 - Math.abs(progress));
45255      transform += " scale(".concat(currentScale, ")");
45256    }
45257    if (rotate && typeof rotate !== 'undefined' && rotate !== null) {
45258      var currentRotate = rotate * progress * -1;
45259      transform += " rotate(".concat(currentRotate, "deg)");
45260    }
45261    el.style.transform = transform;
45262  };
45263  var setTranslate = function setTranslate() {
45264    var el = swiper.el,
45265      slides = swiper.slides,
45266      progress = swiper.progress,
45267      snapGrid = swiper.snapGrid,
45268      isElement = swiper.isElement;
45269    var elements = (0, _utils.e)(el, elementsSelector);
45270    if (swiper.isElement) {
45271      elements.push.apply(elements, (0, _toConsumableArray2["default"])((0, _utils.e)(swiper.hostEl, elementsSelector)));
45272    }
45273    elements.forEach(function (subEl) {
45274      setTransform(subEl, progress);
45275    });
45276    slides.forEach(function (slideEl, slideIndex) {
45277      var slideProgress = slideEl.progress;
45278      if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {
45279        slideProgress += Math.ceil(slideIndex / 2) - progress * (snapGrid.length - 1);
45280      }
45281      slideProgress = Math.min(Math.max(slideProgress, -1), 1);
45282      slideEl.querySelectorAll("".concat(elementsSelector, ", [data-swiper-parallax-rotate]")).forEach(function (subEl) {
45283        setTransform(subEl, slideProgress);
45284      });
45285    });
45286  };
45287  var setTransition = function setTransition() {
45288    var duration = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : swiper.params.speed;
45289    var el = swiper.el,
45290      hostEl = swiper.hostEl;
45291    var elements = (0, _toConsumableArray2["default"])(el.querySelectorAll(elementsSelector));
45292    if (swiper.isElement) {
45293      elements.push.apply(elements, (0, _toConsumableArray2["default"])(hostEl.querySelectorAll(elementsSelector)));
45294    }
45295    elements.forEach(function (parallaxEl) {
45296      var parallaxDuration = parseInt(parallaxEl.getAttribute('data-swiper-parallax-duration'), 10) || duration;
45297      if (duration === 0) parallaxDuration = 0;
45298      parallaxEl.style.transitionDuration = "".concat(parallaxDuration, "ms");
45299    });
45300  };
45301  on('beforeInit', function () {
45302    if (!swiper.params.parallax.enabled) return;
45303    swiper.params.watchSlidesProgress = true;
45304    swiper.originalParams.watchSlidesProgress = true;
45305  });
45306  on('init', function () {
45307    if (!swiper.params.parallax.enabled) return;
45308    setTranslate();
45309  });
45310  on('setTranslate', function () {
45311    if (!swiper.params.parallax.enabled) return;
45312    setTranslate();
45313  });
45314  on('setTransition', function (_swiper, duration) {
45315    if (!swiper.params.parallax.enabled) return;
45316    setTransition(duration);
45317  });
45318}
45319
45320},{"../shared/utils.mjs":141,"@babel/runtime/helpers/interopRequireDefault":99,"@babel/runtime/helpers/toConsumableArray":105}],129:[function(require,module,exports){
45321"use strict";
45322
45323var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
45324Object.defineProperty(exports, "__esModule", {
45325  value: true
45326});
45327exports["default"] = Scrollbar;
45328var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
45329var _ssrWindowEsm = require("../shared/ssr-window.esm.mjs");
45330var _utils = require("../shared/utils.mjs");
45331var _createElementIfNotDefined = require("../shared/create-element-if-not-defined.mjs");
45332var _classesToSelector = require("../shared/classes-to-selector.mjs");
45333function Scrollbar(_ref) {
45334  var swiper = _ref.swiper,
45335    extendParams = _ref.extendParams,
45336    on = _ref.on,
45337    emit = _ref.emit;
45338  var document = (0, _ssrWindowEsm.g)();
45339  var isTouched = false;
45340  var timeout = null;
45341  var dragTimeout = null;
45342  var dragStartPos;
45343  var dragSize;
45344  var trackSize;
45345  var divider;
45346  extendParams({
45347    scrollbar: {
45348      el: null,
45349      dragSize: 'auto',
45350      hide: false,
45351      draggable: false,
45352      snapOnRelease: true,
45353      lockClass: 'swiper-scrollbar-lock',
45354      dragClass: 'swiper-scrollbar-drag',
45355      scrollbarDisabledClass: 'swiper-scrollbar-disabled',
45356      horizontalClass: "swiper-scrollbar-horizontal",
45357      verticalClass: "swiper-scrollbar-vertical"
45358    }
45359  });
45360  swiper.scrollbar = {
45361    el: null,
45362    dragEl: null
45363  };
45364  function setTranslate() {
45365    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
45366    var scrollbar = swiper.scrollbar,
45367      rtl = swiper.rtlTranslate;
45368    var dragEl = scrollbar.dragEl,
45369      el = scrollbar.el;
45370    var params = swiper.params.scrollbar;
45371    var progress = swiper.params.loop ? swiper.progressLoop : swiper.progress;
45372    var newSize = dragSize;
45373    var newPos = (trackSize - dragSize) * progress;
45374    if (rtl) {
45375      newPos = -newPos;
45376      if (newPos > 0) {
45377        newSize = dragSize - newPos;
45378        newPos = 0;
45379      } else if (-newPos + dragSize > trackSize) {
45380        newSize = trackSize + newPos;
45381      }
45382    } else if (newPos < 0) {
45383      newSize = dragSize + newPos;
45384      newPos = 0;
45385    } else if (newPos + dragSize > trackSize) {
45386      newSize = trackSize - newPos;
45387    }
45388    if (swiper.isHorizontal()) {
45389      dragEl.style.transform = "translate3d(".concat(newPos, "px, 0, 0)");
45390      dragEl.style.width = "".concat(newSize, "px");
45391    } else {
45392      dragEl.style.transform = "translate3d(0px, ".concat(newPos, "px, 0)");
45393      dragEl.style.height = "".concat(newSize, "px");
45394    }
45395    if (params.hide) {
45396      clearTimeout(timeout);
45397      el.style.opacity = 1;
45398      timeout = setTimeout(function () {
45399        el.style.opacity = 0;
45400        el.style.transitionDuration = '400ms';
45401      }, 1000);
45402    }
45403  }
45404  function setTransition(duration) {
45405    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
45406    swiper.scrollbar.dragEl.style.transitionDuration = "".concat(duration, "ms");
45407  }
45408  function updateSize() {
45409    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
45410    var scrollbar = swiper.scrollbar;
45411    var dragEl = scrollbar.dragEl,
45412      el = scrollbar.el;
45413    dragEl.style.width = '';
45414    dragEl.style.height = '';
45415    trackSize = swiper.isHorizontal() ? el.offsetWidth : el.offsetHeight;
45416    divider = swiper.size / (swiper.virtualSize + swiper.params.slidesOffsetBefore - (swiper.params.centeredSlides ? swiper.snapGrid[0] : 0));
45417    if (swiper.params.scrollbar.dragSize === 'auto') {
45418      dragSize = trackSize * divider;
45419    } else {
45420      dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);
45421    }
45422    if (swiper.isHorizontal()) {
45423      dragEl.style.width = "".concat(dragSize, "px");
45424    } else {
45425      dragEl.style.height = "".concat(dragSize, "px");
45426    }
45427    if (divider >= 1) {
45428      el.style.display = 'none';
45429    } else {
45430      el.style.display = '';
45431    }
45432    if (swiper.params.scrollbar.hide) {
45433      el.style.opacity = 0;
45434    }
45435    if (swiper.params.watchOverflow && swiper.enabled) {
45436      scrollbar.el.classList[swiper.isLocked ? 'add' : 'remove'](swiper.params.scrollbar.lockClass);
45437    }
45438  }
45439  function getPointerPosition(e) {
45440    return swiper.isHorizontal() ? e.clientX : e.clientY;
45441  }
45442  function setDragPosition(e) {
45443    var scrollbar = swiper.scrollbar,
45444      rtl = swiper.rtlTranslate;
45445    var el = scrollbar.el;
45446    var positionRatio;
45447    positionRatio = (getPointerPosition(e) - (0, _utils.f)(el)[swiper.isHorizontal() ? 'left' : 'top'] - (dragStartPos !== null ? dragStartPos : dragSize / 2)) / (trackSize - dragSize);
45448    positionRatio = Math.max(Math.min(positionRatio, 1), 0);
45449    if (rtl) {
45450      positionRatio = 1 - positionRatio;
45451    }
45452    var position = swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio;
45453    swiper.updateProgress(position);
45454    swiper.setTranslate(position);
45455    swiper.updateActiveIndex();
45456    swiper.updateSlidesClasses();
45457  }
45458  function onDragStart(e) {
45459    var params = swiper.params.scrollbar;
45460    var scrollbar = swiper.scrollbar,
45461      wrapperEl = swiper.wrapperEl;
45462    var el = scrollbar.el,
45463      dragEl = scrollbar.dragEl;
45464    isTouched = true;
45465    dragStartPos = e.target === dragEl ? getPointerPosition(e) - e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top'] : null;
45466    e.preventDefault();
45467    e.stopPropagation();
45468    wrapperEl.style.transitionDuration = '100ms';
45469    dragEl.style.transitionDuration = '100ms';
45470    setDragPosition(e);
45471    clearTimeout(dragTimeout);
45472    el.style.transitionDuration = '0ms';
45473    if (params.hide) {
45474      el.style.opacity = 1;
45475    }
45476    if (swiper.params.cssMode) {
45477      swiper.wrapperEl.style['scroll-snap-type'] = 'none';
45478    }
45479    emit('scrollbarDragStart', e);
45480  }
45481  function onDragMove(e) {
45482    var scrollbar = swiper.scrollbar,
45483      wrapperEl = swiper.wrapperEl;
45484    var el = scrollbar.el,
45485      dragEl = scrollbar.dragEl;
45486    if (!isTouched) return;
45487    if (e.preventDefault && e.cancelable) e.preventDefault();else e.returnValue = false;
45488    setDragPosition(e);
45489    wrapperEl.style.transitionDuration = '0ms';
45490    el.style.transitionDuration = '0ms';
45491    dragEl.style.transitionDuration = '0ms';
45492    emit('scrollbarDragMove', e);
45493  }
45494  function onDragEnd(e) {
45495    var params = swiper.params.scrollbar;
45496    var scrollbar = swiper.scrollbar,
45497      wrapperEl = swiper.wrapperEl;
45498    var el = scrollbar.el;
45499    if (!isTouched) return;
45500    isTouched = false;
45501    if (swiper.params.cssMode) {
45502      swiper.wrapperEl.style['scroll-snap-type'] = '';
45503      wrapperEl.style.transitionDuration = '';
45504    }
45505    if (params.hide) {
45506      clearTimeout(dragTimeout);
45507      dragTimeout = (0, _utils.n)(function () {
45508        el.style.opacity = 0;
45509        el.style.transitionDuration = '400ms';
45510      }, 1000);
45511    }
45512    emit('scrollbarDragEnd', e);
45513    if (params.snapOnRelease) {
45514      swiper.slideToClosest();
45515    }
45516  }
45517  function events(method) {
45518    var scrollbar = swiper.scrollbar,
45519      params = swiper.params;
45520    var el = scrollbar.el;
45521    if (!el) return;
45522    var target = el;
45523    var activeListener = params.passiveListeners ? {
45524      passive: false,
45525      capture: false
45526    } : false;
45527    var passiveListener = params.passiveListeners ? {
45528      passive: true,
45529      capture: false
45530    } : false;
45531    if (!target) return;
45532    var eventMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';
45533    target[eventMethod]('pointerdown', onDragStart, activeListener);
45534    document[eventMethod]('pointermove', onDragMove, activeListener);
45535    document[eventMethod]('pointerup', onDragEnd, passiveListener);
45536  }
45537  function enableDraggable() {
45538    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
45539    events('on');
45540  }
45541  function disableDraggable() {
45542    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
45543    events('off');
45544  }
45545  function init() {
45546    var scrollbar = swiper.scrollbar,
45547      swiperEl = swiper.el;
45548    swiper.params.scrollbar = (0, _createElementIfNotDefined.c)(swiper, swiper.originalParams.scrollbar, swiper.params.scrollbar, {
45549      el: 'swiper-scrollbar'
45550    });
45551    var params = swiper.params.scrollbar;
45552    if (!params.el) return;
45553    var el;
45554    if (typeof params.el === 'string' && swiper.isElement) {
45555      el = swiper.el.querySelector(params.el);
45556    }
45557    if (!el && typeof params.el === 'string') {
45558      el = document.querySelectorAll(params.el);
45559      if (!el.length) return;
45560    } else if (!el) {
45561      el = params.el;
45562    }
45563    if (swiper.params.uniqueNavElements && typeof params.el === 'string' && el.length > 1 && swiperEl.querySelectorAll(params.el).length === 1) {
45564      el = swiperEl.querySelector(params.el);
45565    }
45566    if (el.length > 0) el = el[0];
45567    el.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);
45568    var dragEl;
45569    if (el) {
45570      dragEl = el.querySelector((0, _classesToSelector.c)(swiper.params.scrollbar.dragClass));
45571      if (!dragEl) {
45572        dragEl = (0, _utils.c)('div', swiper.params.scrollbar.dragClass);
45573        el.append(dragEl);
45574      }
45575    }
45576    Object.assign(scrollbar, {
45577      el: el,
45578      dragEl: dragEl
45579    });
45580    if (params.draggable) {
45581      enableDraggable();
45582    }
45583    if (el) {
45584      var _el$classList;
45585      (_el$classList = el.classList)[swiper.enabled ? 'remove' : 'add'].apply(_el$classList, (0, _toConsumableArray2["default"])((0, _utils.k)(swiper.params.scrollbar.lockClass)));
45586    }
45587  }
45588  function destroy() {
45589    var params = swiper.params.scrollbar;
45590    var el = swiper.scrollbar.el;
45591    if (el) {
45592      var _el$classList2;
45593      (_el$classList2 = el.classList).remove.apply(_el$classList2, (0, _toConsumableArray2["default"])((0, _utils.k)(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass)));
45594    }
45595    disableDraggable();
45596  }
45597  on('changeDirection', function () {
45598    if (!swiper.scrollbar || !swiper.scrollbar.el) return;
45599    var params = swiper.params.scrollbar;
45600    var el = swiper.scrollbar.el;
45601    el = (0, _utils.m)(el);
45602    el.forEach(function (subEl) {
45603      subEl.classList.remove(params.horizontalClass, params.verticalClass);
45604      subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);
45605    });
45606  });
45607  on('init', function () {
45608    if (swiper.params.scrollbar.enabled === false) {
45609      // eslint-disable-next-line
45610      disable();
45611    } else {
45612      init();
45613      updateSize();
45614      setTranslate();
45615    }
45616  });
45617  on('update resize observerUpdate lock unlock changeDirection', function () {
45618    updateSize();
45619  });
45620  on('setTranslate', function () {
45621    setTranslate();
45622  });
45623  on('setTransition', function (_s, duration) {
45624    setTransition(duration);
45625  });
45626  on('enable disable', function () {
45627    var el = swiper.scrollbar.el;
45628    if (el) {
45629      var _el$classList3;
45630      (_el$classList3 = el.classList)[swiper.enabled ? 'remove' : 'add'].apply(_el$classList3, (0, _toConsumableArray2["default"])((0, _utils.k)(swiper.params.scrollbar.lockClass)));
45631    }
45632  });
45633  on('destroy', function () {
45634    destroy();
45635  });
45636  var enable = function enable() {
45637    var _swiper$el$classList;
45638    (_swiper$el$classList = swiper.el.classList).remove.apply(_swiper$el$classList, (0, _toConsumableArray2["default"])((0, _utils.k)(swiper.params.scrollbar.scrollbarDisabledClass)));
45639    if (swiper.scrollbar.el) {
45640      var _swiper$scrollbar$el$;
45641      (_swiper$scrollbar$el$ = swiper.scrollbar.el.classList).remove.apply(_swiper$scrollbar$el$, (0, _toConsumableArray2["default"])((0, _utils.k)(swiper.params.scrollbar.scrollbarDisabledClass)));
45642    }
45643    init();
45644    updateSize();
45645    setTranslate();
45646  };
45647  var disable = function disable() {
45648    var _swiper$el$classList2;
45649    (_swiper$el$classList2 = swiper.el.classList).add.apply(_swiper$el$classList2, (0, _toConsumableArray2["default"])((0, _utils.k)(swiper.params.scrollbar.scrollbarDisabledClass)));
45650    if (swiper.scrollbar.el) {
45651      var _swiper$scrollbar$el$2;
45652      (_swiper$scrollbar$el$2 = swiper.scrollbar.el.classList).add.apply(_swiper$scrollbar$el$2, (0, _toConsumableArray2["default"])((0, _utils.k)(swiper.params.scrollbar.scrollbarDisabledClass)));
45653    }
45654    destroy();
45655  };
45656  Object.assign(swiper.scrollbar, {
45657    enable: enable,
45658    disable: disable,
45659    updateSize: updateSize,
45660    setTranslate: setTranslate,
45661    init: init,
45662    destroy: destroy
45663  });
45664}
45665
45666},{"../shared/classes-to-selector.mjs":133,"../shared/create-element-if-not-defined.mjs":134,"../shared/ssr-window.esm.mjs":139,"../shared/utils.mjs":141,"@babel/runtime/helpers/interopRequireDefault":99,"@babel/runtime/helpers/toConsumableArray":105}],130:[function(require,module,exports){
45667"use strict";
45668
45669Object.defineProperty(exports, "__esModule", {
45670  value: true
45671});
45672exports["default"] = Thumb;
45673var _ssrWindowEsm = require("../shared/ssr-window.esm.mjs");
45674var _utils = require("../shared/utils.mjs");
45675function Thumb(_ref) {
45676  var swiper = _ref.swiper,
45677    extendParams = _ref.extendParams,
45678    on = _ref.on;
45679  extendParams({
45680    thumbs: {
45681      swiper: null,
45682      multipleActiveThumbs: true,
45683      autoScrollOffset: 0,
45684      slideThumbActiveClass: 'swiper-slide-thumb-active',
45685      thumbsContainerClass: 'swiper-thumbs'
45686    }
45687  });
45688  var initialized = false;
45689  var swiperCreated = false;
45690  swiper.thumbs = {
45691    swiper: null
45692  };
45693  function isVirtualEnabled() {
45694    var thumbsSwiper = swiper.thumbs.swiper;
45695    if (!thumbsSwiper || thumbsSwiper.destroyed) return false;
45696    return thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled;
45697  }
45698  function onThumbClick() {
45699    var thumbsSwiper = swiper.thumbs.swiper;
45700    if (!thumbsSwiper || thumbsSwiper.destroyed) return;
45701    var clickedIndex = thumbsSwiper.clickedIndex;
45702    var clickedSlide = thumbsSwiper.clickedSlide;
45703    if (clickedSlide && clickedSlide.classList.contains(swiper.params.thumbs.slideThumbActiveClass)) return;
45704    if (typeof clickedIndex === 'undefined' || clickedIndex === null) return;
45705    var slideToIndex;
45706    if (thumbsSwiper.params.loop) {
45707      slideToIndex = parseInt(thumbsSwiper.clickedSlide.getAttribute('data-swiper-slide-index'), 10);
45708    } else {
45709      slideToIndex = clickedIndex;
45710    }
45711    if (swiper.params.loop) {
45712      swiper.slideToLoop(slideToIndex);
45713    } else {
45714      swiper.slideTo(slideToIndex);
45715    }
45716  }
45717  function init() {
45718    var thumbsParams = swiper.params.thumbs;
45719    if (initialized) return false;
45720    initialized = true;
45721    var SwiperClass = swiper.constructor;
45722    if (thumbsParams.swiper instanceof SwiperClass) {
45723      if (thumbsParams.swiper.destroyed) {
45724        initialized = false;
45725        return false;
45726      }
45727      swiper.thumbs.swiper = thumbsParams.swiper;
45728      Object.assign(swiper.thumbs.swiper.originalParams, {
45729        watchSlidesProgress: true,
45730        slideToClickedSlide: false
45731      });
45732      Object.assign(swiper.thumbs.swiper.params, {
45733        watchSlidesProgress: true,
45734        slideToClickedSlide: false
45735      });
45736      swiper.thumbs.swiper.update();
45737    } else if ((0, _utils.p)(thumbsParams.swiper)) {
45738      var thumbsSwiperParams = Object.assign({}, thumbsParams.swiper);
45739      Object.assign(thumbsSwiperParams, {
45740        watchSlidesProgress: true,
45741        slideToClickedSlide: false
45742      });
45743      swiper.thumbs.swiper = new SwiperClass(thumbsSwiperParams);
45744      swiperCreated = true;
45745    }
45746    swiper.thumbs.swiper.el.classList.add(swiper.params.thumbs.thumbsContainerClass);
45747    swiper.thumbs.swiper.on('tap', onThumbClick);
45748    if (isVirtualEnabled()) {
45749      swiper.thumbs.swiper.on('virtualUpdate', function () {
45750        update(false, {
45751          autoScroll: false
45752        });
45753      });
45754    }
45755    return true;
45756  }
45757  function update(initial, p) {
45758    var _p$autoScroll;
45759    var thumbsSwiper = swiper.thumbs.swiper;
45760    if (!thumbsSwiper || thumbsSwiper.destroyed) return;
45761
45762    // Activate thumbs
45763    var thumbsToActivate = 1;
45764    var thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;
45765    if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {
45766      thumbsToActivate = swiper.params.slidesPerView;
45767    }
45768    if (!swiper.params.thumbs.multipleActiveThumbs) {
45769      thumbsToActivate = 1;
45770    }
45771    thumbsToActivate = Math.floor(thumbsToActivate);
45772    thumbsSwiper.slides.forEach(function (slideEl) {
45773      return slideEl.classList.remove(thumbActiveClass);
45774    });
45775    if (thumbsSwiper.params.loop || isVirtualEnabled()) {
45776      for (var i = 0; i < thumbsToActivate; i += 1) {
45777        (0, _utils.e)(thumbsSwiper.slidesEl, "[data-swiper-slide-index=\"".concat(swiper.realIndex + i, "\"]")).forEach(function (slideEl) {
45778          slideEl.classList.add(thumbActiveClass);
45779        });
45780      }
45781    } else {
45782      for (var _i = 0; _i < thumbsToActivate; _i += 1) {
45783        if (thumbsSwiper.slides[swiper.realIndex + _i]) {
45784          thumbsSwiper.slides[swiper.realIndex + _i].classList.add(thumbActiveClass);
45785        }
45786      }
45787    }
45788    if ((_p$autoScroll = p === null || p === void 0 ? void 0 : p.autoScroll) !== null && _p$autoScroll !== void 0 ? _p$autoScroll : true) {
45789      autoScroll(initial ? 0 : undefined);
45790    }
45791  }
45792  function autoScroll(slideSpeed) {
45793    var thumbsSwiper = swiper.thumbs.swiper;
45794    if (!thumbsSwiper || thumbsSwiper.destroyed) return;
45795    var slidesPerView = thumbsSwiper.params.slidesPerView === 'auto' ? thumbsSwiper.slidesPerViewDynamic() : thumbsSwiper.params.slidesPerView;
45796    var autoScrollOffset = swiper.params.thumbs.autoScrollOffset;
45797    var useOffset = autoScrollOffset && !thumbsSwiper.params.loop;
45798    if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) {
45799      var currentThumbsIndex = thumbsSwiper.activeIndex;
45800      var newThumbsIndex;
45801      var direction;
45802      if (thumbsSwiper.params.loop) {
45803        var newThumbsSlide = thumbsSwiper.slides.find(function (slideEl) {
45804          return slideEl.getAttribute('data-swiper-slide-index') === "".concat(swiper.realIndex);
45805        });
45806        newThumbsIndex = thumbsSwiper.slides.indexOf(newThumbsSlide);
45807        direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev';
45808      } else {
45809        newThumbsIndex = swiper.realIndex;
45810        direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev';
45811      }
45812      if (useOffset) {
45813        newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset;
45814      }
45815      if (thumbsSwiper.visibleSlidesIndexes && thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) {
45816        if (thumbsSwiper.params.centeredSlides) {
45817          if (newThumbsIndex > currentThumbsIndex) {
45818            newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;
45819          } else {
45820            newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;
45821          }
45822        } else if (newThumbsIndex > currentThumbsIndex && thumbsSwiper.params.slidesPerGroup === 1) ;
45823        thumbsSwiper.slideTo(newThumbsIndex, slideSpeed);
45824      }
45825    }
45826  }
45827  on('beforeInit', function () {
45828    var thumbs = swiper.params.thumbs;
45829    if (!thumbs || !thumbs.swiper) return;
45830    if (typeof thumbs.swiper === 'string' || thumbs.swiper instanceof HTMLElement) {
45831      var document = (0, _ssrWindowEsm.g)();
45832      var getThumbsElementAndInit = function getThumbsElementAndInit() {
45833        var thumbsElement = typeof thumbs.swiper === 'string' ? document.querySelector(thumbs.swiper) : thumbs.swiper;
45834        if (thumbsElement && thumbsElement.swiper) {
45835          thumbs.swiper = thumbsElement.swiper;
45836          init();
45837          update(true);
45838        } else if (thumbsElement) {
45839          var eventName = "".concat(swiper.params.eventsPrefix, "init");
45840          var _onThumbsSwiper = function onThumbsSwiper(e) {
45841            thumbs.swiper = e.detail[0];
45842            thumbsElement.removeEventListener(eventName, _onThumbsSwiper);
45843            init();
45844            update(true);
45845            thumbs.swiper.update();
45846            swiper.update();
45847          };
45848          thumbsElement.addEventListener(eventName, _onThumbsSwiper);
45849        }
45850        return thumbsElement;
45851      };
45852      var _watchForThumbsToAppear = function watchForThumbsToAppear() {
45853        if (swiper.destroyed) return;
45854        var thumbsElement = getThumbsElementAndInit();
45855        if (!thumbsElement) {
45856          requestAnimationFrame(_watchForThumbsToAppear);
45857        }
45858      };
45859      requestAnimationFrame(_watchForThumbsToAppear);
45860    } else {
45861      init();
45862      update(true);
45863    }
45864  });
45865  on('slideChange update resize observerUpdate', function () {
45866    update();
45867  });
45868  on('setTransition', function (_s, duration) {
45869    var thumbsSwiper = swiper.thumbs.swiper;
45870    if (!thumbsSwiper || thumbsSwiper.destroyed) return;
45871    thumbsSwiper.setTransition(duration);
45872  });
45873  on('beforeDestroy', function () {
45874    var thumbsSwiper = swiper.thumbs.swiper;
45875    if (!thumbsSwiper || thumbsSwiper.destroyed) return;
45876    if (swiperCreated) {
45877      thumbsSwiper.destroy();
45878    }
45879  });
45880  Object.assign(swiper.thumbs, {
45881    init: init,
45882    update: update
45883  });
45884}
45885
45886},{"../shared/ssr-window.esm.mjs":139,"../shared/utils.mjs":141}],131:[function(require,module,exports){
45887"use strict";
45888
45889var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
45890Object.defineProperty(exports, "__esModule", {
45891  value: true
45892});
45893exports["default"] = Virtual;
45894var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
45895var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
45896var _ssrWindowEsm = require("../shared/ssr-window.esm.mjs");
45897var _utils = require("../shared/utils.mjs");
45898function Virtual(_ref) {
45899  var swiper = _ref.swiper,
45900    extendParams = _ref.extendParams,
45901    on = _ref.on,
45902    emit = _ref.emit;
45903  extendParams({
45904    virtual: {
45905      enabled: false,
45906      slides: [],
45907      cache: true,
45908      slidesPerViewAutoSlideSize: 320,
45909      renderSlide: null,
45910      renderExternal: null,
45911      renderExternalUpdate: true,
45912      addSlidesBefore: 0,
45913      addSlidesAfter: 0
45914    }
45915  });
45916  var cssModeTimeout;
45917  var document = (0, _ssrWindowEsm.g)();
45918  swiper.virtual = {
45919    cache: {},
45920    from: undefined,
45921    to: undefined,
45922    slides: [],
45923    offset: 0,
45924    slidesGrid: []
45925  };
45926  var tempDOM = document.createElement('div');
45927  function renderSlide(slide, index) {
45928    var params = swiper.params.virtual;
45929    if (params.cache && swiper.virtual.cache[index]) {
45930      return swiper.virtual.cache[index];
45931    }
45932    // eslint-disable-next-line
45933    var slideEl;
45934    if (params.renderSlide) {
45935      slideEl = params.renderSlide.call(swiper, slide, index);
45936      if (typeof slideEl === 'string') {
45937        (0, _utils.s)(tempDOM, slideEl);
45938        slideEl = tempDOM.children[0];
45939      }
45940    } else if (swiper.isElement) {
45941      slideEl = (0, _utils.c)('swiper-slide');
45942    } else {
45943      slideEl = (0, _utils.c)('div', swiper.params.slideClass);
45944    }
45945    slideEl.setAttribute('data-swiper-slide-index', index);
45946    if (!params.renderSlide) {
45947      (0, _utils.s)(slideEl, slide);
45948    }
45949    if (params.cache) {
45950      swiper.virtual.cache[index] = slideEl;
45951    }
45952    return slideEl;
45953  }
45954  function update(force, beforeInit, forceActiveIndex) {
45955    var _swiper$params = swiper.params,
45956      slidesPerGroup = _swiper$params.slidesPerGroup,
45957      centeredSlides = _swiper$params.centeredSlides,
45958      slidesPerView = _swiper$params.slidesPerView,
45959      isLoop = _swiper$params.loop,
45960      initialSlide = _swiper$params.initialSlide;
45961    if (beforeInit && !isLoop && initialSlide > 0) {
45962      return;
45963    }
45964    var _swiper$params$virtua = swiper.params.virtual,
45965      addSlidesBefore = _swiper$params$virtua.addSlidesBefore,
45966      addSlidesAfter = _swiper$params$virtua.addSlidesAfter,
45967      slidesPerViewAutoSlideSize = _swiper$params$virtua.slidesPerViewAutoSlideSize;
45968    var _swiper$virtual = swiper.virtual,
45969      previousFrom = _swiper$virtual.from,
45970      previousTo = _swiper$virtual.to,
45971      slides = _swiper$virtual.slides,
45972      previousSlidesGrid = _swiper$virtual.slidesGrid,
45973      previousOffset = _swiper$virtual.offset;
45974    if (!swiper.params.cssMode) {
45975      swiper.updateActiveIndex();
45976    }
45977    var activeIndex = typeof forceActiveIndex === 'undefined' ? swiper.activeIndex || 0 : forceActiveIndex;
45978    var offsetProp;
45979    if (swiper.rtlTranslate) offsetProp = 'right';else offsetProp = swiper.isHorizontal() ? 'left' : 'top';
45980    var slidesPerViewNumeric;
45981    if (slidesPerView === 'auto') {
45982      if (slidesPerViewAutoSlideSize) {
45983        var swiperSize = swiper.size;
45984        if (!swiperSize) {
45985          swiperSize = swiper.isHorizontal() ? swiper.el.getBoundingClientRect().width : swiper.el.getBoundingClientRect().height;
45986        }
45987        slidesPerViewNumeric = Math.max(1, Math.ceil(swiperSize / slidesPerViewAutoSlideSize));
45988      } else {
45989        slidesPerViewNumeric = 1;
45990      }
45991    } else {
45992      slidesPerViewNumeric = slidesPerView;
45993    }
45994    var slidesAfter;
45995    var slidesBefore;
45996    if (centeredSlides) {
45997      slidesAfter = Math.floor(slidesPerViewNumeric / 2) + slidesPerGroup + addSlidesAfter;
45998      slidesBefore = Math.floor(slidesPerViewNumeric / 2) + slidesPerGroup + addSlidesBefore;
45999    } else {
46000      slidesAfter = slidesPerViewNumeric + (slidesPerGroup - 1) + addSlidesAfter;
46001      slidesBefore = (isLoop ? slidesPerViewNumeric : slidesPerGroup) + addSlidesBefore;
46002    }
46003    var from = activeIndex - slidesBefore;
46004    var to = activeIndex + slidesAfter;
46005    if (!isLoop) {
46006      from = Math.max(from, 0);
46007      to = Math.min(to, slides.length - 1);
46008    }
46009    var offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);
46010    if (isLoop && activeIndex >= slidesBefore) {
46011      from -= slidesBefore;
46012      if (!centeredSlides) offset += swiper.slidesGrid[0];
46013    } else if (isLoop && activeIndex < slidesBefore) {
46014      from = -slidesBefore;
46015      if (centeredSlides) offset += swiper.slidesGrid[0];
46016    }
46017    Object.assign(swiper.virtual, {
46018      from: from,
46019      to: to,
46020      offset: offset,
46021      slidesGrid: swiper.slidesGrid,
46022      slidesBefore: slidesBefore,
46023      slidesAfter: slidesAfter
46024    });
46025    function onRendered() {
46026      swiper.updateSlides();
46027      swiper.updateProgress();
46028      swiper.updateSlidesClasses();
46029      emit('virtualUpdate');
46030    }
46031    if (previousFrom === from && previousTo === to && !force) {
46032      if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {
46033        swiper.slides.forEach(function (slideEl) {
46034          slideEl.style[offsetProp] = "".concat(offset - Math.abs(swiper.cssOverflowAdjustment()), "px");
46035        });
46036      }
46037      swiper.updateProgress();
46038      emit('virtualUpdate');
46039      return;
46040    }
46041    if (swiper.params.virtual.renderExternal) {
46042      swiper.params.virtual.renderExternal.call(swiper, {
46043        offset: offset,
46044        from: from,
46045        to: to,
46046        slides: function getSlides() {
46047          var slidesToRender = [];
46048          for (var i = from; i <= to; i += 1) {
46049            slidesToRender.push(slides[i]);
46050          }
46051          return slidesToRender;
46052        }()
46053      });
46054      if (swiper.params.virtual.renderExternalUpdate) {
46055        onRendered();
46056      } else {
46057        emit('virtualUpdate');
46058      }
46059      return;
46060    }
46061    var prependIndexes = [];
46062    var appendIndexes = [];
46063    var getSlideIndex = function getSlideIndex(index) {
46064      var slideIndex = index;
46065      if (index < 0) {
46066        slideIndex = slides.length + index;
46067      } else if (slideIndex >= slides.length) {
46068        // eslint-disable-next-line
46069        slideIndex = slideIndex - slides.length;
46070      }
46071      return slideIndex;
46072    };
46073    if (force) {
46074      swiper.slides.filter(function (el) {
46075        return el.matches(".".concat(swiper.params.slideClass, ", swiper-slide"));
46076      }
46076).forEach(function (slideEl) {
46077        slideEl.remove();
46078      });
46079    } else {
46080      var _loop = function _loop() {
46081        if (i < from || i > to) {
46082          var slideIndex = getSlideIndex(i);
46083          swiper.slides.filter(function (el) {
46084            return el.matches(".".concat(swiper.params.slideClass, "[data-swiper-slide-index=\"").concat(slideIndex, "\"], swiper-slide[data-swiper-slide-index=\"").concat(slideIndex, "\"]"));
46085          }).forEach(function (slideEl) {
46086            slideEl.remove();
46087          });
46088        }
46089      };
46090      for (var i = previousFrom; i <= previousTo; i += 1) {
46091        _loop();
46092      }
46093    }
46094    var loopFrom = isLoop ? -slides.length : 0;
46095    var loopTo = isLoop ? slides.length * 2 : slides.length;
46096    for (var _i = loopFrom; _i < loopTo; _i += 1) {
46097      if (_i >= from && _i <= to) {
46098        var slideIndex = getSlideIndex(_i);
46099        if (typeof previousTo === 'undefined' || force) {
46100          appendIndexes.push(slideIndex);
46101        } else {
46102          if (_i > previousTo) appendIndexes.push(slideIndex);
46103          if (_i < previousFrom) prependIndexes.push(slideIndex);
46104        }
46105      }
46106    }
46107    appendIndexes.forEach(function (index) {
46108      swiper.slidesEl.append(renderSlide(slides[index], index));
46109    });
46110    if (isLoop) {
46111      for (var _i2 = prependIndexes.length - 1; _i2 >= 0; _i2 -= 1) {
46112        var index = prependIndexes[_i2];
46113        swiper.slidesEl.prepend(renderSlide(slides[index], index));
46114      }
46115    } else {
46116      prependIndexes.sort(function (a, b) {
46117        return b - a;
46118      });
46119      prependIndexes.forEach(function (index) {
46120        swiper.slidesEl.prepend(renderSlide(slides[index], index));
46121      });
46122    }
46123    (0, _utils.e)(swiper.slidesEl, '.swiper-slide, swiper-slide').forEach(function (slideEl) {
46124      slideEl.style[offsetProp] = "".concat(offset - Math.abs(swiper.cssOverflowAdjustment()), "px");
46125    });
46126    onRendered();
46127  }
46128  function appendSlide(slides) {
46129    if ((0, _typeof2["default"])(slides) === 'object' && 'length' in slides) {
46130      for (var i = 0; i < slides.length; i += 1) {
46131        if (slides[i]) swiper.virtual.slides.push(slides[i]);
46132      }
46133    } else {
46134      swiper.virtual.slides.push(slides);
46135    }
46136    update(true);
46137  }
46138  function prependSlide(slides) {
46139    var activeIndex = swiper.activeIndex;
46140    var newActiveIndex = activeIndex + 1;
46141    var numberOfNewSlides = 1;
46142    if (Array.isArray(slides)) {
46143      for (var i = 0; i < slides.length; i += 1) {
46144        if (slides[i]) swiper.virtual.slides.unshift(slides[i]);
46145      }
46146      newActiveIndex = activeIndex + slides.length;
46147      numberOfNewSlides = slides.length;
46148    } else {
46149      swiper.virtual.slides.unshift(slides);
46150    }
46151    if (swiper.params.virtual.cache) {
46152      var cache = swiper.virtual.cache;
46153      var newCache = {};
46154      Object.keys(cache).forEach(function (cachedIndex) {
46155        var cachedEl = cache[cachedIndex];
46156        var cachedElIndex = cachedEl.getAttribute('data-swiper-slide-index');
46157        if (cachedElIndex) {
46158          cachedEl.setAttribute('data-swiper-slide-index', parseInt(cachedElIndex, 10) + numberOfNewSlides);
46159        }
46160        newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = cachedEl;
46161      });
46162      swiper.virtual.cache = newCache;
46163    }
46164    update(true);
46165    swiper.slideTo(newActiveIndex, 0);
46166  }
46167  function removeSlide(slidesIndexes) {
46168    if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return;
46169    var activeIndex = swiper.activeIndex;
46170    if (Array.isArray(slidesIndexes)) {
46171      for (var i = slidesIndexes.length - 1; i >= 0; i -= 1) {
46172        if (swiper.params.virtual.cache) {
46173          delete swiper.virtual.cache[slidesIndexes[i]];
46174          // shift cache indexes
46175          Object.keys(swiper.virtual.cache).forEach(function (key) {
46176            if (key > slidesIndexes) {
46177              swiper.virtual.cache[key - 1] = swiper.virtual.cache[key];
46178              swiper.virtual.cache[key - 1].setAttribute('data-swiper-slide-index', key - 1);
46179              delete swiper.virtual.cache[key];
46180            }
46181          });
46182        }
46183        swiper.virtual.slides.splice(slidesIndexes[i], 1);
46184        if (slidesIndexes[i] < activeIndex) activeIndex -= 1;
46185        activeIndex = Math.max(activeIndex, 0);
46186      }
46187    } else {
46188      if (swiper.params.virtual.cache) {
46189        delete swiper.virtual.cache[slidesIndexes];
46190        // shift cache indexes
46191        Object.keys(swiper.virtual.cache).forEach(function (key) {
46192          if (key > slidesIndexes) {
46193            swiper.virtual.cache[key - 1] = swiper.virtual.cache[key];
46194            swiper.virtual.cache[key - 1].setAttribute('data-swiper-slide-index', key - 1);
46195            delete swiper.virtual.cache[key];
46196          }
46197        });
46198      }
46199      swiper.virtual.slides.splice(slidesIndexes, 1);
46200      if (slidesIndexes < activeIndex) activeIndex -= 1;
46201      activeIndex = Math.max(activeIndex, 0);
46202    }
46203    update(true);
46204    swiper.slideTo(activeIndex, 0);
46205  }
46206  function removeAllSlides() {
46207    swiper.virtual.slides = [];
46208    if (swiper.params.virtual.cache) {
46209      swiper.virtual.cache = {};
46210    }
46211    update(true);
46212    swiper.slideTo(0, 0);
46213  }
46214  on('beforeInit', function () {
46215    if (!swiper.params.virtual.enabled) return;
46216    var domSlidesAssigned;
46217    if (typeof swiper.passedParams.virtual.slides === 'undefined') {
46218      var slides = (0, _toConsumableArray2["default"])(swiper.slidesEl.children).filter(function (el) {
46219        return el.matches(".".concat(swiper.params.slideClass, ", swiper-slide"));
46220      });
46221      if (slides && slides.length) {
46222        swiper.virtual.slides = (0, _toConsumableArray2["default"])(slides);
46223        domSlidesAssigned = true;
46224        slides.forEach(function (slideEl, slideIndex) {
46225          slideEl.setAttribute('data-swiper-slide-index', slideIndex);
46226          swiper.virtual.cache[slideIndex] = slideEl;
46227          slideEl.remove();
46228        });
46229      }
46230    }
46231    if (!domSlidesAssigned) {
46232      swiper.virtual.slides = swiper.params.virtual.slides;
46233    }
46234    swiper.classNames.push("".concat(swiper.params.containerModifierClass, "virtual"));
46235    swiper.params.watchSlidesProgress = true;
46236    swiper.originalParams.watchSlidesProgress = true;
46237    update(false, true);
46238  });
46239  on('setTranslate', function () {
46240    if (!swiper.params.virtual.enabled) return;
46241    if (swiper.params.cssMode && !swiper._immediateVirtual) {
46242      clearTimeout(cssModeTimeout);
46243      cssModeTimeout = setTimeout(function () {
46244        update();
46245      }, 100);
46246    } else {
46247      update();
46248    }
46249  });
46250  on('init update resize', function () {
46251    if (!swiper.params.virtual.enabled) return;
46252    if (swiper.params.cssMode) {
46253      (0, _utils.b)(swiper.wrapperEl, '--swiper-virtual-size', "".concat(swiper.virtualSize, "px"));
46254    }
46255  });
46256  Object.assign(swiper.virtual, {
46257    appendSlide: appendSlide,
46258    prependSlide: prependSlide,
46259    removeSlide: removeSlide,
46260    removeAllSlides: removeAllSlides,
46261    update: update
46262  });
46263}
46264
46265},{"../shared/ssr-window.esm.mjs":139,"../shared/utils.mjs":141,"@babel/runtime/helpers/interopRequireDefault":99,"@babel/runtime/helpers/toConsumableArray":105,"@babel/runtime/helpers/typeof":108}],132:[function(require,module,exports){
46266"use strict";
46267
46268var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
46269Object.defineProperty(exports, "__esModule", {
46270  value: true
46271});
46272exports["default"] = Zoom;
46273var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
46274var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
46275var _ssrWindowEsm = require("../shared/ssr-window.esm.mjs");
46276var _utils = require("../shared/utils.mjs");
46277function Zoom(_ref) {
46278  var swiper = _ref.swiper,
46279    extendParams = _ref.extendParams,
46280    on = _ref.on,
46281    emit = _ref.emit;
46282  var window = (0, _ssrWindowEsm.a)();
46283  extendParams({
46284    zoom: {
46285      enabled: false,
46286      limitToOriginalSize: false,
46287      maxRatio: 3,
46288      minRatio: 1,
46289      panOnMouseMove: false,
46290      toggle: true,
46291      containerClass: 'swiper-zoom-container',
46292      zoomedSlideClass: 'swiper-slide-zoomed'
46293    }
46294  });
46295  swiper.zoom = {
46296    enabled: false
46297  };
46298  var currentScale = 1;
46299  var isScaling = false;
46300  var isPanningWithMouse = false;
46301  var mousePanStart = {
46302    x: 0,
46303    y: 0
46304  };
46305  var mousePanSensitivity = -3; // Negative to invert pan direction
46306  var fakeGestureTouched;
46307  var fakeGestureMoved;
46308  var evCache = [];
46309  var gesture = {
46310    originX: 0,
46311    originY: 0,
46312    slideEl: undefined,
46313    slideWidth: undefined,
46314    slideHeight: undefined,
46315    imageEl: undefined,
46316    imageWrapEl: undefined,
46317    maxRatio: 3
46318  };
46319  var image = {
46320    isTouched: undefined,
46321    isMoved: undefined,
46322    currentX: undefined,
46323    currentY: undefined,
46324    minX: undefined,
46325    minY: undefined,
46326    maxX: undefined,
46327    maxY: undefined,
46328    width: undefined,
46329    height: undefined,
46330    startX: undefined,
46331    startY: undefined,
46332    touchesStart: {},
46333    touchesCurrent: {}
46334  };
46335  var velocity = {
46336    x: undefined,
46337    y: undefined,
46338    prevPositionX: undefined,
46339    prevPositionY: undefined,
46340    prevTime: undefined
46341  };
46342  var scale = 1;
46343  Object.defineProperty(swiper.zoom, 'scale', {
46344    get: function get() {
46345      return scale;
46346    },
46347    set: function set(value) {
46348      if (scale !== value) {
46349        var imageEl = gesture.imageEl;
46350        var slideEl = gesture.slideEl;
46351        emit('zoomChange', value, imageEl, slideEl);
46352      }
46353      scale = value;
46354    }
46355  });
46356  function getDistanceBetweenTouches() {
46357    if (evCache.length < 2) return 1;
46358    var x1 = evCache[0].pageX;
46359    var y1 = evCache[0].pageY;
46360    var x2 = evCache[1].pageX;
46361    var y2 = evCache[1].pageY;
46362    var distance = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
46363    return distance;
46364  }
46365  function getMaxRatio() {
46366    var params = swiper.params.zoom;
46367    var maxRatio = gesture.imageWrapEl.getAttribute('data-swiper-zoom') || params.maxRatio;
46368    if (params.limitToOriginalSize && gesture.imageEl && gesture.imageEl.naturalWi
46368dth) {
46369      var imageMaxRatio = gesture.imageEl.naturalWidth / gesture.imageEl.offsetWidth;
46370      return Math.min(imageMaxRatio, maxRatio);
46371    }
46372    return maxRatio;
46373  }
46374  function getScaleOrigin() {
46375    if (evCache.length < 2) return {
46376      x: null,
46377      y: null
46378    };
46379    var box = gesture.imageEl.getBoundingClientRect();
46380    return [(evCache[0].pageX + (evCache[1].pageX - evCache[0].pageX) / 2 - box.x - window.scrollX) / currentScale, (evCache[0].pageY + (evCache[1].pageY - evCache[0].pageY) / 2 - box.y - window.scrollY) / currentScale];
46381  }
46382  function getSlideSelector() {
46383    return swiper.isElement ? "swiper-slide" : ".".concat(swiper.params.slideClass);
46384  }
46385  function eventWithinSlide(e) {
46386    var slideSelector = getSlideSelector();
46387    if (e.target.matches(slideSelector)) return true;
46388    if (swiper.slides.filter(function (slideEl) {
46389      return slideEl.contains(e.target);
46390    }).length > 0) return true;
46391    return false;
46392  }
46393  function eventWithinZoomContainer(e) {
46394    var selector = ".".concat(swiper.params.zoom.containerClass);
46395    if (e.target.matches(selector)) return true;
46396    if ((0, _toConsumableArray2["default"])(swiper.hostEl.querySelectorAll(selector)).filter(function (containerEl) {
46397      return containerEl.contains(e.target);
46398    }).length > 0) return true;
46399    return false;
46400  }
46401
46402  // Events
46403  function onGestureStart(e) {
46404    if (e.pointerType === 'mouse') {
46405      evCache.splice(0, evCache.length);
46406    }
46407    if (!eventWithinSlide(e)) return;
46408    var params = swiper.params.zoom;
46409    fakeGestureTouched = false;
46410    fakeGestureMoved = false;
46411    evCache.push(e);
46412    if (evCache.length < 2) {
46413      return;
46414    }
46415    fakeGestureTouched = true;
46416    gesture.scaleStart = getDistanceBetweenTouches();
46417    if (!gesture.slideEl) {
46418      gesture.slideEl = e.target.closest(".".concat(swiper.params.slideClass, ", swiper-slide"));
46419      if (!gesture.slideEl) gesture.slideEl = swiper.slides[swiper.activeIndex];
46420      var imageEl = gesture.slideEl.querySelector(".".concat(params.containerClass));
46421      if (imageEl) {
46422        imageEl = imageEl.querySelectorAll('picture, img, svg, canvas, .swiper-zoom-target')[0];
46423      }
46424      gesture.imageEl = imageEl;
46425      if (imageEl) {
46426        gesture.imageWrapEl = (0, _utils.d)(gesture.imageEl, ".".concat(params.containerClass))[0];
46427      } else {
46428        gesture.imageWrapEl = undefined;
46429      }
46430      if (!gesture.imageWrapEl) {
46431        gesture.imageEl = undefined;
46432        return;
46433      }
46434      gesture.maxRatio = getMaxRatio();
46435    }
46436    if (gesture.imageEl) {
46437      var _getScaleOrigin = getScaleOrigin(),
46438        _getScaleOrigin2 = (0, _slicedToArray2["default"])(_getScaleOrigin, 2),
46439        originX = _getScaleOrigin2[0],
46440        originY = _getScaleOrigin2[1];
46441      gesture.originX = originX;
46442      gesture.originY = originY;
46443      gesture.imageEl.style.transitionDuration = '0ms';
46444    }
46445    isScaling = true;
46446  }
46447  function onGestureChange(e) {
46448    if (!eventWithinSlide(e)) return;
46449    var params = swiper.params.zoom;
46450    var zoom = swiper.zoom;
46451    var pointerIndex = evCache.findIndex(function (cachedEv) {
46452      return cachedEv.pointerId === e.pointerId;
46453    });
46454    if (pointerIndex >= 0) evCache[pointerIndex] = e;
46455    if (evCache.length < 2) {
46456      return;
46457    }
46458    fakeGestureMoved = true;
46459    gesture.scaleMove = getDistanceBetweenTouches();
46460    if (!gesture.imageEl) {
46461      return;
46462    }
46463    zoom.scale = gesture.scaleMove / gesture.scaleStart * currentScale;
46464    if (zoom.scale > gesture.maxRatio) {
46465      zoom.scale = gesture.maxRatio - 1 + Math.pow(zoom.scale - gesture.maxRatio + 1, 0.5);
46466    }
46467    if (zoom.scale < params.minRatio) {
46468      zoom.scale = params.minRatio + 1 - Math.pow(params.minRatio - zoom.scale + 1, 0.5);
46469    }
46470    gesture.imageEl.style.transform = "translate3d(0,0,0) scale(".concat(zoom.scale, ")");
46471  }
46472  function onGestureEnd(e) {
46473    if (!eventWithinSlide(e)) return;
46474    if (e.pointerType === 'mouse' && e.type === 'pointerout') return;
46475    var params = swiper.params.zoom;
46476    var zoom = swiper.zoom;
46477    var pointerIndex = evCache.findIndex(function (cachedEv) {
46478      return cachedEv.pointerId === e.pointerId;
46479    });
46480    if (pointerIndex >= 0) evCache.splice(pointerIndex, 1);
46481    if (!fakeGestureTouched || !fakeGestureMoved) {
46482      return;
46483    }
46484    fakeGestureTouched = false;
46485    fakeGestureMoved = false;
46486    if (!gesture.imageEl) return;
46487    zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);
46488    gesture.imageEl.style.transitionDuration = "".concat(swiper.params.speed, "ms");
46489    gesture.imageEl.style.transform = "translate3d(0,0,0) scale(".concat(zoom.scale, ")");
46490    currentScale = zoom.scale;
46491    isScaling = false;
46492    if (zoom.scale > 1 && gesture.slideEl) {
46493      gesture.slideEl.classList.add("".concat(params.zoomedSlideClass));
46494    } else if (zoom.scale <= 1 && gesture.slideEl) {
46495      gesture.slideEl.classList.remove("".concat(params.zoomedSlideClass));
46496    }
46497    if (zoom.scale === 1) {
46498      gesture.originX = 0;
46499      gesture.originY = 0;
46500      gesture.slideEl = undefined;
46501    }
46502  }
46503  var allowTouchMoveTimeout;
46504  function allowTouchMove() {
46505    swiper.touchEventsData.preventTouchMoveFromPointerMove = false;
46506  }
46507  function preventTouchMove() {
46508    clearTimeout(allowTouchMoveTimeout);
46509    swiper.touchEventsData.preventTouchMoveFromPointerMove = true;
46510    allowTouchMoveTimeout = setTimeout(function () {
46511      if (swiper.destroyed) return;
46512      allowTouchMove();
46513    });
46514  }
46515  function onTouchStart(e) {
46516    var device = swiper.device;
46517    if (!gesture.imageEl) return;
46518    if (image.isTouched) return;
46519    if (device.android && e.cancelable) e.preventDefault();
46520    image.isTouched = true;
46521    var event = evCache.length > 0 ? evCache[0] : e;
46522    image.touchesStart.x = event.pageX;
46523    image.touchesStart.y = event.pageY;
46524  }
46525  function onTouchMove(e) {
46526    var isMouseEvent = e.pointerType === 'mouse';
46527    var isMousePan = isMouseEvent && swiper.params.zoom.panOnMouseMove;
46528    if (!eventWithinSlide(e) || !eventWithinZoomContainer(e)) {
46529      return;
46530    }
46531    var zoom = swiper.zoom;
46532    if (!gesture.imageEl) {
46533      return;
46534    }
46535    if (!image.isTouched || !gesture.slideEl) {
46536      if (isMousePan) onMouseMove(e);
46537      return;
46538    }
46539    if (isMousePan) {
46540      onMouseMove(e);
46541      return;
46542    }
46543    if (!image.isMoved) {
46544      image.width = gesture.imageEl.offsetWidth || gesture.imageEl.clientWidth;
46545      image.height = gesture.imageEl.offsetHeight || gesture.imageEl.clientHeight;
46546      image.startX = (0, _utils.l)(gesture.imageWrapEl, 'x') || 0;
46547      image.startY = (0, _utils.l)(gesture.imageWrapEl, 'y') || 0;
46548      gesture.slideWidth = gesture.slideEl.offsetWidth;
46549      gesture.slideHeight = gesture.slideEl.offsetHeight;
46550      gesture.imageWrapEl.style.transitionDuration = '0ms';
46551    }
46552    // Define if we need image drag
46553    var scaledWidth = image.width * zoom.scale;
46554    var scaledHeight = image.height * zoom.scale;
46555    image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);
46556    image.maxX = -image.minX;
46557    image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);
46558    image.maxY = -image.minY;
46559    image.touchesCurrent.x = evCache.length > 0 ? evCache[0].pageX : e.pageX;
46560    image.touchesCurrent.y = evCache.length > 0 ? evCache[0].pageY : e.pageY;
46561    var touchesDiff = Math.max(Math.abs(image.touchesCurrent.x - image.touchesStart.x), Math.abs(image.touchesCurrent.y - image.touchesStart.y));
46562    if (touchesDiff > 5) {
46563      swiper.allowClick = false;
46564    }
46565    if (!image.isMoved && !isScaling) {
46566      if (swiper.isHorizontal() && (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x || Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x)) {
46567        image.isTouched = false;
46568        allowTouchMove();
46569        return;
46570      }
46571      if (!swiper.isHorizontal() && (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y || Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y)) {
46572        image.isTouched = false;
46573        allowTouchMove();
46574        return;
46575      }
46576    }
46577    if (e.cancelable) {
46578      e.preventDefault();
46579    }
46580    e.stopPropagation();
46581    preventTouchMove();
46582    image.isMoved = true;
46583    var scaleRatio = (zoom.scale - currentScale) / (gesture.maxRatio - swiper.params.zoom.minRatio);
46584    var originX = gesture.originX,
46585      originY = gesture.originY;
46586    image.currentX = image.touchesCurrent.x - image.touchesStart.x + image.startX + scaleRatio * (image.
46586width - originX * 2);
46587    image.currentY = image.touchesCurrent.y - image.touchesStart.y + image.startY + scaleRatio * (image.height - originY * 2);
46588    if (image.currentX < image.minX) {
46589      image.currentX = image.minX + 1 - Math.pow(image.minX - image.currentX + 1, 0.8);
46590    }
46591    if (image.currentX > image.maxX) {
46592      image.currentX = image.maxX - 1 + Math.pow(image.currentX - image.maxX + 1, 0.8);
46593    }
46594    if (image.currentY < image.minY) {
46595      image.currentY = image.minY + 1 - Math.pow(image.minY - image.currentY + 1, 0.8);
46596    }
46597    if (image.currentY > image.maxY) {
46598      image.currentY = image.maxY - 1 + Math.pow(image.currentY - image.maxY + 1, 0.8);
46599    }
46600
46601    // Velocity
46602    if (!velocity.prevPositionX) velocity.prevPositionX = image.touchesCurrent.x;
46603    if (!velocity.prevPositionY) velocity.prevPositionY = image.touchesCurrent.y;
46604    if (!velocity.prevTime) velocity.prevTime = Date.now();
46605    velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;
46606    velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;
46607    if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) velocity.x = 0;
46608    if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) velocity.y = 0;
46609    velocity.prevPositionX = image.touchesCurrent.x;
46610    velocity.prevPositionY = image.touchesCurrent.y;
46611    velocity.prevTime = Date.now();
46612    gesture.imageWrapEl.style.transform = "translate3d(".concat(image.currentX, "px, ").concat(image.currentY, "px,0)");
46613  }
46614  function onTouchEnd() {
46615    var zoom = swiper.zoom;
46616    evCache.length = 0;
46617    if (!gesture.imageEl) return;
46618    if (!image.isTouched || !image.isMoved) {
46619      image.isTouched = false;
46620      image.isMoved = false;
46621      return;
46622    }
46623    image.isTouched = false;
46624    image.isMoved = false;
46625    var momentumDurationX = 300;
46626    var momentumDurationY = 300;
46627    var momentumDistanceX = velocity.x * momentumDurationX;
46628    var newPositionX = image.currentX + momentumDistanceX;
46629    var momentumDistanceY = velocity.y * momentumDurationY;
46630    var newPositionY = image.currentY + momentumDistanceY;
46631
46632    // Fix duration
46633    if (velocity.x !== 0) momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x);
46634    if (velocity.y !== 0) momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y);
46635    var momentumDuration = Math.max(momentumDurationX, momentumDurationY);
46636    image.currentX = newPositionX;
46637    image.currentY = newPositionY;
46638    // Define if we need image drag
46639    var scaledWidth = image.width * zoom.scale;
46640    var scaledHeight = image.height * zoom.scale;
46641    image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);
46642    image.maxX = -image.minX;
46643    image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);
46644    image.maxY = -image.minY;
46645    image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);
46646    image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);
46647    gesture.imageWrapEl.style.transitionDuration = "".concat(momentumDuration, "ms");
46648    gesture.imageWrapEl.style.transform = "translate3d(".concat(image.currentX, "px, ").concat(image.currentY, "px,0)");
46649  }
46650  function onTransitionEnd() {
46651    var zoom = swiper.zoom;
46652    if (gesture.slideEl && swiper.activeIndex !== swiper.slides.indexOf(gesture.slideEl)) {
46653      if (gesture.imageEl) {
46654        gesture.imageEl.style.transform = 'translate3d(0,0,0) scale(1)';
46655      }
46656      if (gesture.imageWrapEl) {
46657        gesture.imageWrapEl.style.transform = 'translate3d(0,0,0)';
46658      }
46659      gesture.slideEl.classList.remove("".concat(swiper.params.zoom.zoomedSlideClass));
46660      zoom.scale = 1;
46661      currentScale = 1;
46662      gesture.slideEl = undefined;
46663      gesture.imageEl = undefined;
46664      gesture.imageWrapEl = undefined;
46665      gesture.originX = 0;
46666      gesture.originY = 0;
46667    }
46668  }
46669  function onMouseMove(e) {
46670    // Only pan if zoomed in and mouse panning is enabled
46671    if (currentScale <= 1 || !gesture.imageWrapEl) return;
46672    if (!eventWithinSlide(e) || !eventWithinZoomContainer(e)) return;
46673    var currentTransform = window.getComputedStyle(gesture.imageWrapEl).transform;
46674    var matrix = new window.DOMMatrix(currentTransform);
46675    if (!isPanningWithMouse) {
46676      isPanningWithMouse = true;
46677      mousePanStart.x = e.clientX;
46678      mousePanStart.y = e.clientY;
46679      image.startX = matrix.e;
46680      image.startY = matrix.f;
46681      image.width = gesture.imageEl.offsetWidth || gesture.imageEl.clientWidth;
46682      image.height = gesture.imageEl.offsetHeight || gesture.imageEl.clientHeight;
46683      gesture.slideWidth = gesture.slideEl.offsetWidth;
46684      gesture.slideHeight = gesture.slideEl.offsetHeight;
46685      return;
46686    }
46687    var deltaX = (e.clientX - mousePanStart.x) * mousePanSensitivity;
46688    var deltaY = (e.clientY - mousePanStart.y) * mousePanSensitivity;
46689    var scaledWidth = image.width * currentScale;
46690    var scaledHeight = image.height * currentScale;
46691    var slideWidth = gesture.slideWidth;
46692    var slideHeight = gesture.slideHeight;
46693    var minX = Math.min(slideWidth / 2 - scaledWidth / 2, 0);
46694    var maxX = -minX;
46695    var minY = Math.min(slideHeight / 2 - scaledHeight / 2, 0);
46696    var maxY = -minY;
46697    var newX = Math.max(Math.min(image.startX + deltaX, maxX), minX);
46698    var newY = Math.max(Math.min(image.startY + deltaY, maxY), minY);
46699    gesture.imageWrapEl.style.transitionDuration = '0ms';
46700    gesture.imageWrapEl.style.transform = "translate3d(".concat(newX, "px, ").concat(newY, "px, 0)");
46701    mousePanStart.x = e.clientX;
46702    mousePanStart.y = e.clientY;
46703    image.startX = newX;
46704    image.startY = newY;
46705    image.currentX = newX;
46706    image.currentY = newY;
46707  }
46708  function zoomIn(e) {
46709    var zoom = swiper.zoom;
46710    var params = swiper.params.zoom;
46711    if (!gesture.slideEl) {
46712      if (e && e.target) {
46713        gesture.slideEl = e.target.closest(".".concat(swiper.params.slideClass, ", swiper-slide"));
46714      }
46715      if (!gesture.slideEl) {
46716        if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {
46717          gesture.slideEl = (0, _utils.e)(swiper.slidesEl, ".".concat(swiper.params.slideActiveClass))[0];
46718        } else {
46719          gesture.slideEl = swiper.slides[swiper.activeIndex];
46720        }
46721      }
46722      var imageEl = gesture.slideEl.querySelector(".".concat(params.containerClass));
46723      if (imageEl) {
46724        imageEl = imageEl.querySelectorAll('picture, img, svg, canvas, .swiper-zoom-target')[0];
46725      }
46726      gesture.imageEl = imageEl;
46727      if (imageEl) {
46728        gesture.imageWrapEl = (0, _utils.d)(gesture.imageEl, ".".concat(params.containerClass))[0];
46729      } else {
46730        gesture.imageWrapEl = undefined;
46731      }
46732    }
46733    if (!gesture.imageEl || !gesture.imageWrapEl) return;
46734    gesture.maxRatio = getMaxRatio();
46735    if (swiper.params.cssMode) {
46736      swiper.wrapperEl.style.overflow = 'hidden';
46737      swiper.wrapperEl.style.touchAction = 'none';
46738    }
46739    gesture.slideEl.classList.add("".concat(params.zoomedSlideClass));
46740    var touchX;
46741    var touchY;
46742    var offsetX;
46743    var offsetY;
46744    var diffX;
46745    var diffY;
46746    var translateX;
46747    var translateY;
46748    var imageWidth;
46749    var imageHeight;
46750    var scaledWidth;
46751    var scaledHeight;
46752    var translateMinX;
46753    var translateMinY;
46754    var translateMaxX;
46755    var translateMaxY;
46756    var slideWidth;
46757    var slideHeight;
46758    if (typeof image.touchesStart.x === 'undefined' && e) {
46759      touchX = e.pageX;
46760      touchY = e.pageY;
46761    } else {
46762      touchX = image.touchesStart.x;
46763      touchY = image.touchesStart.y;
46764    }
46765    var prevScale = currentScale;
46766    var forceZoomRatio = typeof e === 'number' ? e : null;
46767    if (currentScale === 1 && forceZoomRatio) {
46768      touchX = undefined;
46769      touchY = undefined;
46770      image.touchesStart.x = undefined;
46771      image.touchesStart.y = undefined;
46772    }
46773    var maxRatio = getMaxRatio();
46774    zoom.scale = forceZoomRatio || maxRatio;
46775    currentScale = forceZoomRatio || maxRatio;
46776    if (e && !(currentScale === 1 && forceZoomRatio)) {
46777      slideWidth = gesture.slideEl.offsetWidth;
46778      slideHeight = gesture.slideEl.offsetHeight;
46779      offsetX = (0, _utils.f)(gesture.slideEl).left + window.scrollX;
46780      offsetY = (0, _utils.f)(gesture.slideEl).top + window.scrollY;
46781      diffX = offsetX + slideWidth / 2 - touchX;
46782      diffY = offsetY + slideHeight / 2 - touchY;
46783      imageWidth = gesture.imageEl.offsetWidth || gesture.imageEl.clientWidth;
46784      imageHeight = gesture.imageEl.offsetHeight || gesture.imageEl.clientHeight;
46785      scaledWidth = imageWidth * zoom.scale;
46786      scaledHeight = imageHeight * zoom.scale;
46787      translateMinX = Math.min(slideWidth / 2 - scaledWidth / 2, 0);
46788      translateMinY = Math.min(slideHeight / 2 - scaledHeight / 2, 0);
46789      translateMaxX = -translateMinX;
46790      translateMaxY = -translateMinY;
46791      if (prevScale > 0 && forceZoomRatio && typeof image.currentX === 'number' && typeof image.currentY === 'number') {
46792        translateX = image.currentX * zoom.scale / prevScale;
46793        translateY = image.currentY * zoom.scale / prevScale;
46794      } else {
46795        translateX = diffX * zoom.scale;
46796        translateY = diffY * zoom.scale;
46797      }
46798      if (translateX < translateMinX) {
46799        translateX = translateMinX;
46800      }
46801      if (translateX > translateMaxX) {
46802        translateX = translateMaxX;
46803      }
46804      if (translateY < translateMinY) {
46805        translateY = translateMinY;
46806      }
46807      if (translateY > translateMaxY) {
46808        translateY = translateMaxY;
46809      }
46810    } else {
46811      translateX = 0;
46812      translateY = 0;
46813    }
46814    if (forceZoomRatio && zoom.scale === 1) {
46815      gesture.originX = 0;
46816      gesture.originY = 0;
46817    }
46818    image.currentX = translateX;
46819    image.currentY = translateY;
46820    gesture.imageWrapEl.style.transitionDuration = '300ms';
46821    gesture.imageWrapEl.style.transform = "translate3d(".concat(translateX, "px, ").concat(translateY, "px,0)");
46822    gesture.imageEl.style.transitionDuration = '300ms';
46823    gesture.imageEl.style.transform = "translate3d(0,0,0) scale(".concat(zoom.scale, ")");
46824  }
46825  function zoomOut() {
46826    var zoom = swiper.zoom;
46827    var params = swiper.params.zoom;
46828    if (!gesture.slideEl) {
46829      if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {
46830        gesture.slideEl = (0, _utils.e)(swiper.slidesEl, ".".concat(swiper.params.slideActiveClass))[0];
46831      } else {
46832        gesture.slideEl = swiper.slides[swiper.activeIndex];
46833      }
46834      var imageEl = gesture.slideEl.querySelector(".".concat(params.containerClass));
46835      if (imageEl) {
46836        imageEl = imageEl.querySelectorAll('picture, img, svg, canvas, .swiper-zoom-target')[0];
46837      }
46838      gesture.imageEl = imageEl;
46839      if (imageEl) {
46840        gesture.imageWrapEl = (0, _utils.d)(gesture.imageEl, ".".concat(params.containerClass))[0];
46841      } else {
46842        gesture.imageWrapEl = undefined;
46843      }
46844    }
46845    if (!gesture.imageEl || !gesture.imageWrapEl) return;
46846    gesture.maxRatio = getMaxRatio();
46847    if (swiper.params.cssMode) {
46848      swiper.wrapperEl.style.overflow = '';
46849      swiper.wrapperEl.style.touchAction = '';
46850    }
46851    zoom.scale = 1;
46852    currentScale = 1;
46853    image.currentX = undefined;
46854    image.currentY = undefined;
46855    image.touchesStart.x = undefined;
46856    image.touchesStart.y = undefined;
46857    gesture.imageWrapEl.style.transitionDuration = '300ms';
46858    gesture.imageWrapEl.style.transform = 'translate3d(0,0,0)';
46859    gesture.imageEl.style.transitionDuration = '300ms';
46860    gesture.imageEl.style.transform = 'translate3d(0,0,0) scale(1)';
46861    gesture.slideEl.classList.remove("".concat(params.zoomedSlideClass));
46862    gesture.slideEl = undefined;
46863    gesture.originX = 0;
46864    gesture.originY = 0;
46865    if (swiper.params.zoom.panOnMouseMove) {
46866      mousePanStart = {
46867        x: 0,
46868        y: 0
46869      };
46870      if (isPanningWithMouse) {
46871        isPanningWithMouse = false;
46872        image.startX = 0;
46873        image.startY = 0;
46874      }
46875    }
46876  }
46877
46878  // Toggle Zoom
46879  function zoomToggle(e) {
46880    var zoom = swiper.zoom;
46881    if (zoom.scale && zoom.scale !== 1) {
46882      // Zoom Out
46883      zoomOut();
46884    } else {
46885      // Zoom In
46886      zoomIn(e);
46887    }
46888  }
46889  function getListeners() {
46890    var passiveListener = swiper.params.passiveListeners ? {
46891      passive: true,
46892      capture: false
46893    } : false;
46894    var activeListenerWithCapture = swiper.params.passiveListeners ? {
46895      passive: false,
46896      capture: true
46897    } : true;
46898    return {
46899      passiveListener: passiveListener,
46900      activeListenerWithCapture: activeListenerWithCapture
46901    };
46902  }
46903
46904  // Attach/Detach Events
46905  function enable() {
46906    var zoom = swiper.zoom;
46907    if (zoom.enabled) return;
46908    zoom.enabled = true;
46909    var _getListeners = getListeners(),
46910      passiveListener = _getListeners.passiveListener,
46911      activeListenerWithCapture = _getListeners.activeListenerWithCapture;
46912
46913    // Scale image
46914    swiper.wrapperEl.addEventListener('pointerdown', onGestureStart, passiveListener);
46915    swiper.wrapperEl.addEventListener('pointermove', onGestureChange, activeListenerWithCapture);
46916    ['pointerup', 'pointercancel', 'pointerout'].forEach(function (eventName) {
46917      swiper.wrapperEl.addEventListener(eventName, onGestureEnd, passiveListener);
46918    });
46919
46920    // Move image
46921    swiper.wrapperEl.addEventListener('pointermove', onTouchMove, activeListenerWithCapture);
46922  }
46923  function disable() {
46924    var zoom = swiper.zoom;
46925    if (!zoom.enabled) return;
46926    zoom.enabled = false;
46927    var _getListeners2 = getListeners(),
46928      passiveListener = _getListeners2.passiveListener,
46929      activeListenerWithCapture = _getListeners2.activeListenerWithCapture;
46930
46931    // Scale image
46932    swiper.wrapperEl.removeEventListener('pointerdown', onGestureStart, passiveListener);
46933    swiper.wrapperEl.removeEventListener('pointermove', onGestureChange, activeListenerWithCapture);
46934    ['pointerup', 'pointercancel', 'pointerout'].forEach(function (eventName) {
46935      swiper.wrapperEl.removeEventListener(eventName, onGestureEnd, passiveListener);
46936    });
46937
46938    // Move image
46939    swiper.wrapperEl.removeEventListener('pointermove', onTouchMove, activeListenerWithCapture);
46940  }
46941  on('init', function () {
46942    if (swiper.params.zoom.enabled) {
46943      enable();
46944    }
46945  });
46946  on('destroy', function () {
46947    disable();
46948  });
46949  on('touchStart', function (_s, e) {
46950    if (!swiper.zoom.enabled) return;
46951    onTouchStart(e);
46952  });
46953  on('touchEnd', function (_s, e) {
46954    if (!swiper.zoom.enabled) return;
46955    onTouchEnd();
46956  });
46957  on('doubleTap', function (_s, e) {
46958    if (!swiper.animating && swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) {
46959      zoomToggle(e);
46960    }
46961  });
46962  on('transitionEnd', function () {
46963    if (swiper.zoom.enabled && swiper.params.zoom.enabled) {
46964      onTransitionEnd();
46965    }
46966  });
46967  on('slideChange', function () {
46968    if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) {
46969      onTransitionEnd();
46970    }
46971  });
46972  Object.assign(swiper.zoom, {
46973    enable: enable,
46974    disable: disable,
46975    "in": zoomIn,
46976    out: zoomOut,
46977    toggle: zoomToggle
46978  });
46979}
46980
46981},{"../shared/ssr-window.esm.mjs":139,"../shared/utils.mjs":141,"@babel/runtime/helpers/interopRequireDefault":99,"@babel/runtime/helpers/slicedToArray":104,"@babel/runtime/helpers/toConsumableArray":105}],133:[function(require,module,exports){
46982"use strict";
46983
46984Object.defineProperty(exports, "__esModule", {
46985  value: true
46986});
46987exports.c = classesToSelector;
46988function classesToSelector() {
46989  var classes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
46990  // Escape all CSS selector special characters
46991  return ".".concat(classes.trim().replace(/([\.:!+\/()[\]#>~*^$|=,'"@{}\\])/g, '\\$1') // eslint-disable-line
46992  .replace(/ /g, '.'));
46993}
46994
46995},{}],134:[function(require,module,exports){
46996"use strict";
46997
46998Object.defineProperty(exports, "__esModule", {
46999  value: true
47000});
47001exports.c = createElementIfNotDefined;
47002var _utils = require("./utils.mjs");
47003function createElementIfNotDefined(swiper, originalParams, params, checkProps) {
47004  if (swiper.params.createElements) {
47005    Object.keys(checkProps).forEach(function (key) {
47006      if (!params[key] && params.auto === true) {
47007        var element = (0, _utils.e)(swiper.el, ".".concat(checkProps[key]))[0];
47008        if (!element) {
47009          element = (0, _utils.c)('div', checkProps[key]);
47010          element.className = checkProps[key];
47011          swiper.el.append(element);
47012        }
47013        params[key] = element;
47014        originalParams[key] = element;
47015      }
47016    });
47017  }
47018  return params;
47019}
47020
47021},{"./utils.mjs":141}],135:[function(require,module,exports){
47022"use strict";
47023
47024Object.defineProperty(exports, "__esModule", {
47025  value: true
47026});
47027exports.c = createShadow;
47028var _utils = require("./utils.mjs");
47029function createShadow(suffix, slideEl, side) {
47030  var shadowClass = "swiper-slide-shadow".concat(side ? "-".concat(side) : '').concat(suffix ? " swiper-slide-shadow-".concat(suffix) : '');
47031  var shadowContainer = (0, _utils.g)(slideEl);
47032  var shadowEl = shadowContainer.querySelector(".".concat(shadowClass.split(' ').join('.')));
47033  if (!shadowEl) {
47034    shadowEl = (0, _utils.c)('div', shadowClass.split(' '));
47035    shadowContainer.append(shadowEl);
47036  }
47037  return shadowEl;
47038}
47039
47040},{"./utils.mjs":141}],136:[function(require,module,exports){
47041"use strict";
47042
47043Object.defineProperty(exports, "__esModule", {
47044  value: true
47045});
47046exports.e = effectInit;
47047function effectInit(params) {
47048  var effect = params.effect,
47049    swiper = params.swiper,
47050    on = params.on,
47051    setTranslate = params.setTranslate,
47052    setTransition = params.setTransition,
47053    overwriteParams = params.overwriteParams,
47054    perspective = params.perspective,
47055    recreateShadows = params.recreateShadows,
47056    getEffectParams = params.getEffectParams;
47057  on('beforeInit', function () {
47058    if (swiper.params.effect !== effect) return;
47059    swiper.classNames.push("".concat(swiper.params.containerModifierClass).concat(effect));
47060    if (perspective && perspective()) {
47061      swiper.classNames.push("".concat(swiper.params.containerModifierClass, "3d"));
47062    }
47063    var overwriteParamsResult = overwriteParams ? overwriteParams() : {};
47064    Object.assign(swiper.params, overwriteParamsResult);
47065    Object.assign(swiper.originalParams, overwriteParamsResult);
47066  });
47067  on('setTranslate _virtualUpdated', function () {
47068    if (swiper.params.effect !== effect) return;
47069    setTranslate();
47070  });
47071  on('setTransition', function (_s, duration) {
47072    if (swiper.params.effect !== effect) return;
47073    setTransition(duration);
47074  });
47075  on('transitionEnd', function () {
47076    if (swiper.params.effect !== effect) return;
47077    if (recreateShadows) {
47078      if (!getEffectParams || !getEffectParams().slideShadows) return;
47079      // remove shadows
47080      swiper.slides.forEach(function (slideEl) {
47081        slideEl.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(function (shadowEl) {
47082          return shadowEl.remove();
47083        });
47084      });
47085      // create new one
47086      recreateShadows();
47087    }
47088  });
47089  var requireUpdateOnVirtual;
47090  on('virtualUpdate', function () {
47091    if (swiper.params.effect !== effect) return;
47092    if (!swiper.slides.length) {
47093      requireUpdateOnVirtual = true;
47094    }
47095    requestAnimationFrame(function () {
47096      if (requireUpdateOnVirtual && swiper.slides && swiper.slides.length) {
47097        setTranslate();
47098        requireUpdateOnVirtual = false;
47099      }
47100    });
47101  });
47102}
47103
47104},{}],137:[function(require,module,exports){
47105"use strict";
47106
47107Object.defineProperty(exports, "__esModule", {
47108  value: true
47109});
47110exports.e = effectTarget;
47111var _utils = require("./utils.mjs");
47112function effectTarget(effectParams, slideEl) {
47113  var transformEl = (0, _utils.g)(slideEl);
47114  if (transformEl !== slideEl) {
47115    transformEl.style.backfaceVisibility = 'hidden';
47116    transformEl.style['-webkit-backface-visibility'] = 'hidden';
47117  }
47118  return transformEl;
47119}
47120
47121},{"./utils.mjs":141}],138:[function(require,module,exports){
47122"use strict";
47123
47124Object.defineProperty(exports, "__esModule", {
47125  value: true
47126});
47127exports.e = effectVirtualTransitionEnd;
47128var _utils = require("./utils.mjs");
47129function effectVirtualTransitionEnd(_ref) {
47130  var swiper = _ref.swiper,
47131    duration = _ref.duration,
47132    transformElements = _ref.transformElements,
47133    allSlides = _ref.allSlides;
47134  var activeIndex = swiper.activeIndex;
47135  var getSlide = function getSlide(el) {
47136    if (!el.parentElement) {
47137      // assume shadow root
47138      var slide = swiper.slides.find(function (slideEl) {
47139        return slideEl.shadowRoot && slideEl.shadowRoot === el.parentNode;
47140      });
47141      return slide;
47142    }
47143    return el.parentElement;
47144  };
47145  if (swiper.params.virtualTranslate && duration !== 0) {
47146    var eventTriggered = false;
47147    var transitionEndTarget;
47148    if (allSlides) {
47149      transitionEndTarget = transformElements;
47150    } else {
47151      transitionEndTarget = transformElements.filter(function (transformEl) {
47152        var el = transformEl.classList.contains('swiper-slide-transform') ? getSlide(transformEl) : transformEl;
47153        return swiper.getSlideIndex(el) === activeIndex;
47154      });
47155    }
47156    transitionEndTarget.forEach(function (el) {
47157      (0, _utils.o)(el, function () {
47158        if (eventTriggered) return;
47159        if (!swiper || swiper.destroyed) return;
47160        eventTriggered = true;
47161        swiper.animating = false;
47162        var evt = new window.CustomEvent('transitionend', {
47163          bubbles: true,
47164          cancelable: true
47165        });
47166        swiper.wrapperEl.dispatchEvent(evt);
47167      });
47168    });
47169  }
47170}
47171
47172},{"./utils.mjs":141}],139:[function(require,module,exports){
47173"use strict";
47174
47175var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
47176Object.defineProperty(exports, "__esModule", {
47177  value: true
47178});
47179exports.a = getWindow;
47180exports.g = getDocument;
47181var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
47182/**
47183 * SSR Window 5.0.1
47184 * Better handling for window object in SSR environment
47185 * https://github.com/nolimits4web/ssr-window
47186 *
47187 * Copyright 2025, Vladimir Kharlampidi
47188 *
47189 * Licensed under MIT
47190 *
47191 * Released on: June 27, 2025
47192 */
47193/* eslint-disable no-param-reassign */
47194function isObject(obj) {
47195  return obj !== null && (0, _typeof2["default"])(obj) === 'object' && 'constructor' in obj && obj.constructor === Object;
47196}
47197function extend() {
47198  var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
47199  var src = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
47200  var noExtend = ['__proto__', 'constructor', 'prototype'];
47201  Object.keys(src).filter(function (key) {
47202    return noExtend.indexOf(key) < 0;
47203  }).forEach(function (key) {
47204    if (typeof target[key] === 'undefined') target[key] = src[key];else if (isObject(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) {
47205      extend(target[key], src[key]);
47206    }
47207  });
47208}
47209var ssrDocument = {
47210  body: {},
47211  addEventListener: function addEventListener() {},
47212  removeEventListener: function removeEventListener() {},
47213  activeElement: {
47214    blur: function blur() {},
47215    nodeName: ''
47216  },
47217  querySelector: function querySelector() {
47218    return null;
47219  },
47220  querySelectorAll: function querySelectorAll() {
47221    return [];
47222  },
47223  getElementById: function getElementById() {
47224    return null;
47225  },
47226  createEvent: function createEvent() {
47227    return {
47228      initEvent: function initEvent() {}
47229    };
47230  },
47231  createElement: function createElement() {
47232    return {
47233      children: [],
47234      childNodes: [],
47235      style: {},
47236      setAttribute: function setAttribute() {},
47237      getElementsByTagName: function getElementsByTagName() {
47238        return [];
47239      }
47240    };
47241  },
47242  createElementNS: function createElementNS() {
47243    return {};
47244  },
47245  importNode: function importNode() {
47246    return null;
47247  },
47248  location: {
47249    hash: '',
47250    host: '',
47251    hostname: '',
47252    href: '',
47253    origin: '',
47254    pathname: '',
47255    protocol: '',
47256    search: ''
47257  }
47258};
47259function getDocument() {
47260  var doc = typeof document !== 'undefined' ? document : {};
47261  extend(doc, ssrDocument);
47262  return doc;
47263}
47264var ssrWindow = {
47265  document: ssrDocument,
47266  navigator: {
47267    userAgent: ''
47268  },
47269  location: {
47270    hash: '',
47271    host: '',
47272    hostname: '',
47273    href: '',
47274    origin: '',
47275    pathname: '',
47276    protocol: '',
47277    search: ''
47278  },
47279  history: {
47280    replaceState: function replaceState() {},
47281    pushState: function pushState() {},
47282    go: function go() {},
47283    back: function back() {}
47284  },
47285  CustomEvent: function CustomEvent() {
47286    return this;
47287  },
47288  addEventListener: function addEventListener() {},
47289  removeEventListener: function removeEventListener() {},
47290  getComputedStyle: function getComputedStyle() {
47291    return {
47292      getPropertyValue: function getPropertyValue() {
47293        return '';
47294      }
47295    };
47296  },
47297  Image: function Image() {},
47298  Date: function Date() {},
47299  screen: {},
47300  setTimeout: function setTimeout() {},
47301  clearTimeout: function clearTimeout() {},
47302  matchMedia: function matchMedia() {
47303    return {};
47304  },
47305  requestAnimationFrame: function requestAnimationFrame(callback) {
47306    if (typeof setTimeout === 'undefined') {
47307      callback();
47308      return null;
47309    }
47310    return setTimeout(callback, 0);
47311  },
47312  cancelAnimationFrame: function cancelAnimationFrame(id) {
47313    if (typeof setTimeout === 'undefined') {
47314      return;
47315    }
47316    clearTimeout(id);
47317  }
47318};
47319function getWindow() {
47320  var win = typeof window !== 'undefined' ? window : {};
47321  extend(win, ssrWindow);
47322  return win;
47323}
47324
47325},{"@babel/runtime/helpers/interopRequireDefault":99,"@babel/runtime/helpers/typeof":108}],140:[function(require,module,exports){
47326"use strict";
47327
47328var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
47329Object.defineProperty(exports, "__esModule", {
47330  value: true
47331});
47332exports.d = exports.S = void 0;
47333var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
47334var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
47335var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
47336var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
47337var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
47338var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
47339var _ssrWindowEsm = require("./ssr-window.esm.mjs");
47340var _utils = require("./utils.mjs");
47341function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
47342function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
47343var support;
47344function calcSupport() {
47345  var window = (0, _ssrWindowEsm.a)();
47346  var document = (0, _ssrWindowEsm.g)();
47347  return {
47348    smoothScroll: document.documentElement && document.documentElement.style && 'scrollBehavior' in document.documentElement.style,
47349    touch: !!('ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch)
47350  };
47351}
47352function getSupport() {
47353  if (!support) {
47354    support = calcSupport();
47355  }
47356  return support;
47357}
47358var deviceCached;
47359function calcDevice() {
47360  var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
47361    userAgent = _ref.userAgent;
47362  var support = getSupport();
47363  var window = (0, _ssrWindowEsm.a)();
47364  var platform = window.navigator.platform;
47365  var ua = userAgent || window.navigator.userAgent;
47366  var device = {
47367    ios: false,
47368    android: false
47369  };
47370  var screenWidth = window.screen.width;
47371  var screenHeight = window.screen.height;
47372  var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line
47373  var ipad = ua.match(/(iPad)(?!\1).*OS\s([\d_]+)/);
47374  var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/);
47375  var iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/);
47376  var windows = platform === 'Win32';
47377  var macos = platform === 'MacIntel';
47378
47379  // iPadOs 13 fix
47380  var iPadScreens = ['1024x1366', '1366x1024', '834x1194', '1194x834', '834x1112', '1112x834', '768x1024', '1024x768', '820x1180', '1180x820', '810x1080', '1080x810'];
47381  if (!ipad && macos && support.touch && iPadScreens.indexOf("".concat(screenWidth, "x").concat(screenHeight)) >= 0) {
47382    ipad = ua.match(/(Version)\/([\d.]+)/);
47383    if (!ipad) ipad = [0, 1, '13_0_0'];
47384    macos = false;
47385  }
47386
47387  // Android
47388  if (android && !windows) {
47389    device.os = 'android';
47390    device.android = true;
47391  }
47392  if (ipad || iphone || ipod) {
47393    device.os = 'ios';
47394    device.ios = true;
47395  }
47396
47397  // Export object
47398  return device;
47399}
47400function getDevice() {
47401  var overrides = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
47402  if (!deviceCached) {
47403    deviceCached = calcDevice(overrides);
47404  }
47405  return deviceCached;
47406}
47407var browser;
47408function calcBrowser() {
47409  var window = (0, _ssrWindowEsm.a)();
47410  var device = getDevice();
47411  var needPerspectiveFix = false;
47412  function isSafari() {
47413    var ua = window.navigator.userAgent.toLowerCase();
47414    return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0;
47415  }
47416  if (isSafari()) {
47417    var ua = String(window.navigator.userAgent);
47418    if (ua.includes('Version/')) {
47419      var _ua$split$1$split$0$s = ua.split('Version/')[1].split(' ')[0].split('.').map(function (num) {
47420          return Number(num);
47421        }),
47422        _ua$split$1$split$0$s2 = (0, _slicedToArray2["default"])(_ua$split$1$split$0$s, 2),
47423        major = _ua$split$1$split$0$s2[0],
47424        minor = _ua$split$1$split$0$s2[1];
47425      needPerspectiveFix = major < 16 || major === 16 && minor < 2;
47426    }
47427  }
47428  var isWebView = /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent);
47429  var isSafariBrowser = isSafari();
47430  var need3dFix = isSafariBrowser || isWebView && device.ios;
47431  return {
47432    isSafari: needPerspectiveFix || isSafariBrowser,
47433    needPerspectiveFix: needPerspectiveFix,
47434    need3dFix: need3dFix,
47435    isWebView: isWebView
47436  };
47437}
47438function getBrowser() {
47439  if (!browser) {
47440    browser = calcBrowser();
47441  }
47442  return browser;
47443}
47444function Resize(_ref2) {
47445  var swiper = _ref2.swiper,
47446    on = _ref2.on,
47447    emit = _ref2.emit;
47448  var window = (0, _ssrWindowEsm.a)();
47449  var observer = null;
47450  var animationFrame = null;
47451  var resizeHandler = function resizeHandler() {
47452    if (!swiper || swiper.destroyed || !swiper.initialized) return;
47453    emit('beforeResize');
47454    emit('resize');
47455  };
47456  var createObserver = function createObserver() {
47457    if (!swiper || swiper.destroyed || !swiper.initialized) return;
47458    observer = new ResizeObserver(function (entries) {
47459      animationFrame = window.requestAnimationFrame(function () {
47460        var width = swiper.width,
47461          height = swiper.height;
47462        var newWidth = width;
47463        var newHeight = height;
47464        entries.forEach(function (_ref3) {
47465          var contentBoxSize = _ref3.contentBoxSize,
47466            contentRect = _ref3.contentRect,
47467            target = _ref3.target;
47468          if (target && target !== swiper.el) return;
47469          newWidth = contentRect ? contentRect.width : (contentBoxSize[0] || contentBoxSize).inlineSize;
47470          newHeight = contentRect ? contentRect.height : (contentBoxSize[0] || contentBoxSize).blockSize;
47471        });
47472        if (newWidth !== width || newHeight !== height) {
47473          resizeHandler();
47474        }
47475      });
47476    });
47477    observer.observe(swiper.el);
47478  };
47479  var removeObserver = function removeObserver() {
47480    if (animationFrame) {
47481      window.cancelAnimationFrame(animationFrame);
47482    }
47483    if (observer && observer.unobserve && swiper.el) {
47484      observer.unobserve(swiper.el);
47485      observer = null;
47486    }
47487  };
47488  var orientationChangeHandler = function orientationChangeHandler() {
47489    if (!swiper || swiper.destroyed || !swiper.initialized) return;
47490    emit('orientationchange');
47491  };
47492  on('init', function () {
47493    if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') {
47494      createObserver();
47495      return;
47496    }
47497    window.addEventListener('resize', resizeHandler);
47498    window.addEventListener('orientationchange', orientationChangeHandler);
47499  });
47500  on('destroy', function () {
47501    removeObserver();
47502    window.removeEventListener('resize', resizeHandler);
47503    window.removeEventListener('orientationchange', orientationChangeHandler);
47504  });
47505}
47506function Observer(_ref4) {
47507  var swiper = _ref4.swiper,
47508    extendParams = _ref4.extendParams,
47509    on = _ref4.on,
47510    emit = _ref4.emit;
47511  var observers = [];
47512  var window = (0, _ssrWindowEsm.a)();
47513  var attach = function attach(target) {
47514    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
47515    var ObserverFunc = window.MutationObserver || window.WebkitMutationObserver;
47516    var observer = new ObserverFunc(function (mutations) {
47517      // The observerUpdate event should only be triggered
47518      // once despite the number of mutations.  Additional
47519      // triggers are redundant and are very costly
47520      if (swiper.__preventObserver__) return;
47521      if (mutations.length === 1) {
47522        emit('observerUpdate', mutations[0]);
47523        return;
47524      }
47525      var observerUpdate = function observerUpdate() {
47526        emit('observerUpdate', mutations[0]);
47527      };
47528      if (window.requestAnimationFrame) {
47529        window.requestAnimationFrame(observerUpdate);
47530      } else {
47531        window.setTimeout(observerUpdate, 0);
47532      }
47533    });
47534    observer.observe(target, {
47535      attributes: typeof options.attributes === 'undefined' ? true : options.attributes,
47536      childList: swiper.isElement || (typeof options.childList === 'undefined' ? true : options).childList,
47537      characterData: typeof options.characterData === 'undefined' ? true : options.characterData
47538    });
47539    observers.push(observer);
47540  };
47541  var init = function init() {
47542    if (!swiper.params.observer) return;
47543    if (swiper.params.observeParents) {
47544      var containerParents = (0, _utils.d)(swiper.hostEl);
47545      for (var i = 0; i < containerParents.length; i += 1) {
47546        attach(containerParents[i]);
47547      }
47548    }
47549    // Observe container
47550    attach(swiper.hostEl, {
47551      childList: swiper.params.observeSlideChildren
47552    });
47553
47554    // Observe wrapper
47555    attach(swiper.wrapperEl, {
47556      attributes: false
47557    });
47558  };
47559  var destroy = function destroy() {
47560    observers.forEach(function (observer) {
47561      observer.disconnect();
47562    });
47563    observers.splice(0, observers.length);
47564  };
47565  extendParams({
47566    observer: false,
47567    observeParents: false,
47568    observeSlideChildren: false
47569  });
47570  on('init', init);
47571  on('destroy', destroy);
47572}
47573
47574/* eslint-disable no-underscore-dangle */
47575
47576var eventsEmitter = {
47577  on: function on(events, handler, priority) {
47578    var self = this;
47579    if (!self.eventsListeners || self.destroyed) return self;
47580    if (typeof handler !== 'function') return self;
47581    var method = priority ? 'unshift' : 'push';
47582    events.split(' ').forEach(function (event) {
47583      if (!self.eventsListeners[event]) self.eventsListeners[event] = [];
47584      self.eventsListeners[event][method](handler);
47585    });
47586    return self;
47587  },
47588  once: function once(events, handler, priority) {
47589    var self = this;
47590    if (!self.eventsListeners || self.destroyed) return self;
47591    if (typeof handler !== 'function') return self;
47592    function onceHandler() {
47593      self.off(events, onceHandler);
47594      if (onceHandler.__emitterProxy) {
47595        delete onceHandler.__emitterProxy;
47596      }
47597      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
47598        args[_key] = arguments[_key];
47599      }
47600      handler.apply(self, args);
47601    }
47602    onceHandler.__emitterProxy = handler;
47603    return self.on(events, onceHandler, priority);
47604  },
47605  onAny: function onAny(handler, priority) {
47606    var self = this;
47607    if (!self.eventsListeners || self.destroyed) return self;
47608    if (typeof handler !== 'function') return self;
47609    var method = priority ? 'unshift' : 'push';
47610    if (self.eventsAnyListeners.indexOf(handler) < 0) {
47611      self.eventsAnyListeners[method](handler);
47612    }
47613    return self;
47614  },
47615  offAny: function offAny(handler) {
47616    var self = this;
47617    if (!self.eventsListeners || self.destroyed) return self;
47618    if (!self.eventsAnyListeners) return self;
47619    var index = self.eventsAnyListeners.indexOf(handler);
47620    if (index >= 0) {
47621      self.eventsAnyListeners.splice(index, 1);
47622    }
47623    return self;
47624  },
47625  off: function off(events, handler) {
47626    var self = this;
47627    if (!self.eventsListeners || self.destroyed) return self;
47628    if (!self.eventsListeners) return self;
47629    events.split(' ').forEach(function (event) {
47630      if (typeof handler === 'undefined') {
47631        self.eventsListeners[event] = [];
47632      } else if (self.eventsListeners[event]) {
47633        self.eventsListeners[event].forEach(function (eventHandler, index) {
47634          if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) {
47635            self.eventsListeners[event].splice(index, 1);
47636          }
47637        });
47638      }
47639    });
47640    return self;
47641  },
47642  emit: function emit() {
47643    var self = this;
47644    if (!self.eventsListeners || self.destroyed) return self;
47645    if (!self.eventsListeners) return self;
47646    var events;
47647    var data;
47648    var context;
47649    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
47650      args[_key2] = arguments[_key2];
47651    }
47652    if (typeof args[0] === 'string' || Array.isArray(args[0])) {
47653      events = args[0];
47654      data = args.slice(1, args.length);
47655      context = self;
47656    } else {
47657      events = args[0].events;
47658      data = args[0].data;
47659      context = args[0].context || self;
47660    }
47661    data.unshift(context);
47662    var eventsArray = Array.isArray(events) ? events : events.split(' ');
47663    eventsArray.forEach(function (event) {
47664      if (self.eventsAnyListeners && self.eventsAnyListeners.length) {
47665        self.eventsAnyListeners.forEach(function (eventHandler) {
47666          eventHandler.apply(context, [event].concat((0, _toConsumableArray2["default"])(data)));
47667        });
47668      }
47669      if (self.eventsListeners && self.eventsListeners[event]) {
47670        self.eventsListeners[event].forEach(function (eventHandler) {
47671          eventHandler.apply(context, data);
47672        });
47673      }
47674    });
47675    return self;
47676  }
47677};
47678function updateSize() {
47679  var swiper = this;
47680  var width;
47681  var height;
47682  var el = swiper.el;
47683  if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) {
47684    width = swiper.params.width;
47685  } else {
47686    width = el.clientWidth;
47687  }
47688  if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) {
47689    height = swiper.params.height;
47690  } else {
47691    height = el.clientHeight;
47692  }
47693  if (width === 0 && swiper.isHorizontal() || height === 0 && swiper.isVertical()) {
47694    return;
47695  }
47696
47697  // Subtract paddings
47698  width = width - parseInt((0, _utils.q)(el, 'padding-left') || 0, 10) - parseInt((0, _utils.q)(el, 'padding-right') || 0, 10);
47699  height = height - parseInt((0, _utils.q)(el, 'padding-top') || 0, 10) - parseInt((0, _utils.q)(el, 'padding-bottom') || 0, 10);
47700  if (Number.isNaN(width)) width = 0;
47701  if (Number.isNaN(height)) height = 0;
47702  Object.assign(swiper, {
47703    width: width,
47704    height: height,
47705    size: swiper.isHorizontal() ? width : height
47706  });
47707}
47708function updateSlides() {
47709  var swiper = this;
47710  function getDirectionPropertyValue(node, label) {
47711    return parseFloat(node.getPropertyValue(swiper.getDirectionLabel(label)) || 0);
47712  }
47713  var params = swiper.params;
47714  var wrapperEl = swiper.wrapperEl,
47715    slidesEl = swiper.slidesEl,
47716    rtl = swiper.rtlTranslate,
47717    wrongRTL = swiper.wrongRTL;
47718  var isVirtual = swiper.virtual && params.virtual.enabled;
47719  var previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;
47720  var slides = (0, _utils.e)(slidesEl, ".".concat(swiper.params.slideClass, ", swiper-slide"));
47721  var slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;
47722  var snapGrid = [];
47723  var slidesGrid = [];
47724  var slidesSizesGrid = [];
47725  var offsetBefore = params.slidesOffsetBefore;
47726  if (typeof offsetBefore === 'function') {
47727    offsetBefore = params.slidesOffsetBefore.call(swiper);
47728  }
47729  var offsetAfter = params.slidesOffsetAfter;
47730  if (typeof offsetAfter === 'function') {
47731    offsetAfter = params.slidesOffsetAfter.call(swiper);
47732  }
47733  var previousSnapGridLength = swiper.snapGrid.length;
47734  var previousSlidesGridLength = swiper.slidesGrid.length;
47735  var swiperSize = swiper.size - offsetBefore - offsetAfter;
47736  var spaceBetween = params.spaceBetween;
47737  var slidePosition = -offsetBefore;
47738  var prevSlideSize = 0;
47739  var index = 0;
47740  if (typeof swiperSize === 'undefined') {
47741    return;
47742  }
47743  if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
47744    spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiperSize;
47745  } else if (typeof spaceBetween === 'string') {
47746    spaceBetween = parseFloat(spaceBetween);
47747  }
47748  swiper.virtualSize = -spaceBetween - offsetBefore - offsetAfter;
47749
47750  // reset margins
47751  slides.forEach(function (slideEl) {
47752    if (rtl) {
47753      slideEl.style.marginLeft = '';
47754    } else {
47755      slideEl.style.marginRight = '';
47756    }
47757    slideEl.style.marginBottom = '';
47758    slideEl.style.marginTop = '';
47759  });
47760
47761  // reset cssMode offsets
47762  if (params.centeredSlides && params.cssMode) {
47763    (0, _utils.b)(wrapperEl, '--swiper-centered-offset-before', '');
47764    (0, _utils.b)(wrapperEl, '--swiper-centered-offset-after', '');
47765  }
47766
47767  // set cssMode offsets
47768  if (params.cssMode) {
47769    (0, _utils.b)(wrapperEl, '--swiper-slides-offset-before', "".concat(offsetBefore, "px"));
47770    (0, _utils.b)(wrapperEl, '--swiper-slides-offset-after', "".concat(offsetAfter, "px"));
47771  }
47772  var gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid;
47773  if (gridEnabled) {
47774    swiper.grid.initSlides(slides);
47775  } else if (swiper.grid) {
47776    swiper.grid.unsetSlides();
47777  }
47778
47779  // Calc slides
47780  var slideSize;
47781  var shouldResetSlideSize = params.slidesPerView === 'auto' && params.breakpoints && Object.keys(params.breakpoints).filter(function (key) {
47782    return typeof params.breakpoints[key].slidesPerView !== 'undefined';
47783  }).length > 0;
47784  for (var i = 0; i < slidesLength; i += 1) {
47785    slideSize = 0;
47786    var _slide = slides[i];
47787    if (_slide) {
47788      if (gridEnabled) {
47789        swiper.grid.updateSlide(i, _slide, slides);
47790      }
47791      if ((0, _utils.q)(_slide, 'display') === 'none') continue; // eslint-disable-line
47792    }
47793    if (isVirtual && params.slidesPerView === 'auto') {
47794      if (params.virtual.slidesPerViewAutoSlideSize) {
47795        slideSize = params.virtual.slidesPerViewAutoSlideSize;
47796      }
47797      if (slideSize && _slide) {
47798        if (params.roundLengths) slideSize = Math.floor(slideSize);
47799        _slide.style[swiper.getDirectionLabel('width')] = "".concat(slideSize, "px");
47800      }
47801    } else if (params.slidesPerView === 'auto') {
47802      if (shouldResetSlideSize) {
47803        _slide.style[swiper.getDirectionLabel('width')] = "";
47804      }
47805      var slideStyles = getComputedStyle(_slide);
47806      var currentTransform = _slide.style.transform;
47807      var currentWebKitTransform = _slide.style.webkitTransform;
47808      if (currentTransform) {
47809        _slide.style.transform = 'none';
47810      }
47811      if (currentWebKitTransform) {
47812        _slide.style.webkitTransform = 'none';
47813      }
47814      if (params.roundLengths) {
47815        slideSize = swiper.isHorizontal() ? (0, _utils.i)(_slide, 'width', true) : (0, _utils.i)(_slide, 'height', true);
47816      } else {
47817        // eslint-disable-next-line
47818        var width = getDirectionPropertyValue(slideStyles, 'width');
47819        var paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left');
47820        var paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right');
47821        var marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left');
47822        var marginRight = getDirectionPropertyValue(slideStyles, 'margin-right');
47823        var boxSizing = slideStyles.getPropertyValue('box-sizing');
47824        if (boxSizing && boxSizing === 'border-box') {
47825          slideSize = width + marginLeft + marginRight;
47826        } else {
47827          var clientWidth = _slide.clientWidth,
47828            offsetWidth = _slide.offsetWidth;
47829          slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight + (offsetWidth - clientWidth);
47830        }
47831      }
47832      if (currentTransform) {
47833        _slide.style.transform = currentTransform;
47834      }
47835      if (currentWebKitTransform) {
47836        _slide.style.webkitTransform = currentWebKitTransform;
47837      }
47838      if (params.roundLengths) slideSize = Math.floor(slideSize);
47839    } else {
47840      slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;
47841      if (params.roundLengths) slideSize = Math.floor(slideSize);
47842      if (_slide) {
47843        _slide.style[swiper.getDirectionLabel('width')] = "".concat(slideSize, "px");
47844      }
47845    }
47846    if (_slide) {
47847      _slide.swiperSlideSize = slideSize;
47848    }
47849    slidesSizesGrid.push(slideSize);
47850    if (params.centeredSlides) {
47851      slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;
47852      if (prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;
47853      if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;
47854      if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0;
47855      if (params.roundLengths) slidePosition = Math.floor(slidePosition);
47856      if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition);
47857      slidesGrid.push(slidePosition);
47858    } else {
47859      if (params.roundLengths) slidePosition = Math.floor(slidePosition);
47860      if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) snapGrid.push(slidePosition);
47861      slidesGrid.push(slidePosition);
47862      slidePosition = slidePosition + slideSize + spaceBetween;
47863    }
47864    swiper.virtualSize += slideSize + spaceBetween;
47865    prevSlideSize = slideSize;
47866    index += 1;
47867  }
47868  swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;
47869  if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {
47870    wrapperEl.style.width = "".concat(swiper.virtualSize + spaceBetween, "px");
47871  }
47872  if (params.setWrapperSize) {
47873    wrapperEl.style[swiper.getDirectionLabel('width')] = "".concat(swiper.virtualSize + spaceBetween, "px");
47874  }
47875  if (gridEnabled) {
47876    swiper.grid.updateWrapperSize(slideSize, snapGrid);
47877  }
47878
47879  // Remove last grid elements depending on width
47880  if (!params.centeredSlides) {
47881    // Check if snapToSlideEdge should be applied
47882    var isFractionalSlidesPerView = params.slidesPerView !== 'auto' && params.slidesPerView % 1 !== 0;
47883    var shouldSnapToSlideEdge = params.snapToSlideEdge && !params.loop && (params.slidesPerView === 'auto' || isFractionalSlidesPerView);
47884
47885    // Calculate the last allowed snap index when snapToSlideEdge is enabled
47886    // This ensures minimum slides are visible at the end
47887    var lastAllowedSnapIndex = snapGrid.length;
47888    if (shouldSnapToSlideEdge) {
47889      var minVisibleSlides;
47890      if (params.slidesPerView === 'auto') {
47891        // For 'auto' mode, calculate how many slides fit based on actual sizes
47892        minVisibleSlides = 1;
47893        var accumulatedSize = 0;
47894        for (var _i = slidesSizesGrid.length - 1; _i >= 0; _i -= 1) {
47895          accumulatedSize += slidesSizesGrid[_i] + (_i < slidesSizesGrid.length - 1 ? spaceBetween : 0);
47896          if (accumulatedSize <= swiperSize) {
47897            minVisibleSlides = slidesSizesGrid.length - _i;
47898          } else {
47899            break;
47900          }
47901        }
47902      } else {
47903        minVisibleSlides = Math.floor(params.slidesPerView);
47904      }
47905      lastAllowedSnapIndex = Math.max(slidesLength - minVisibleSlides, 0);
47906    }
47907    var newSlidesGrid = [];
47908    for (var _i2 = 0; _i2 < snapGrid.length; _i2 += 1) {
47909      var slidesGridItem = snapGrid[_i2];
47910      if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem);
47911      if (shouldSnapToSlideEdge) {
47912        // When snapToSlideEdge is enabled, only keep snaps up to lastAllowedSnapIndex
47913        if (_i2 <= lastAllowedSnapIndex) {
47914          newSlidesGrid.push(slidesGridItem);
47915        }
47916      }
47916 else if (snapGrid[_i2] <= swiper.virtualSize - swiperSize) {
47917        // When snapToSlideEdge is disabled, keep snaps that fit within scrollable area
47918        newSlidesGrid.push(slidesGridItem);
47919      }
47920    }
47921    snapGrid = newSlidesGrid;
47922    if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {
47923      // Only add edge-aligned snap if snapToSlideEdge is not enabled
47924      if (!shouldSnapToSlideEdge) {
47925        snapGrid.push(swiper.virtualSize - swiperSize);
47926      }
47927    }
47928  }
47929  if (isVirtual && params.loop) {
47930    var size = slidesSizesGrid[0] + spaceBetween;
47931    if (params.slidesPerGroup > 1) {
47932      var groups = Math.ceil((swiper.virtual.slidesBefore + swiper.virtual.slidesAfter) / params.slidesPerGroup);
47933      var groupSize = size * params.slidesPerGroup;
47934      for (var _i3 = 0; _i3 < groups; _i3 += 1) {
47935        snapGrid.push(snapGrid[snapGrid.length - 1] + groupSize);
47936      }
47937    }
47938    for (var _i4 = 0; _i4 < swiper.virtual.slidesBefore + swiper.virtual.slidesAfter; _i4 += 1) {
47939      if (params.slidesPerGroup === 1) {
47940        snapGrid.push(snapGrid[snapGrid.length - 1] + size);
47941      }
47942      slidesGrid.push(slidesGrid[slidesGrid.length - 1] + size);
47943      swiper.virtualSize += size;
47944    }
47945  }
47946  if (snapGrid.length === 0) snapGrid = [0];
47947  if (spaceBetween !== 0) {
47948    var key = swiper.isHorizontal() && rtl ? 'marginLeft' : swiper.getDirectionLabel('marginRight');
47949    slides.filter(function (_, slideIndex) {
47950      if (!params.cssMode || params.loop) return true;
47951      if (slideIndex === slides.length - 1) {
47952        return false;
47953      }
47954      return true;
47955    }
47955).forEach(function (slideEl) {
47956      slideEl.style[key] = "".concat(spaceBetween, "px");
47957    });
47958  }
47959  if (params.centeredSlides && params.centeredSlidesBounds) {
47960    var allSlidesSize = 0;
47961    slidesSizesGrid.forEach(function (slideSizeValue) {
47962      allSlidesSize += slideSizeValue + (spaceBetween || 0);
47963    });
47964    allSlidesSize -= spaceBetween;
47965    var maxSnap = allSlidesSize > swiperSize ? allSlidesSize - swiperSize : 0;
47966    snapGrid = snapGrid.map(function (snap) {
47967      if (snap <= 0) return -offsetBefore;
47968      if (snap > maxSnap) return maxSnap + offsetAfter;
47969      return snap;
47970    });
47971  }
47972  if (params.centerInsufficientSlides) {
47973    var _allSlidesSize = 0;
47974    slidesSizesGrid.forEach(function (slideSizeValue) {
47975      _allSlidesSize += slideSizeValue + (spaceBetween || 0);
47976    });
47977    _allSlidesSize -= spaceBetween;
47978    if (_allSlidesSize < swiperSize) {
47979      var allSlidesOffset = (swiperSize - _allSlidesSize) / 2;
47980      snapGrid.forEach(function (snap, snapIndex) {
47981        snapGrid[snapIndex] = snap - allSlidesOffset;
47982      });
47983      slidesGrid.forEach(function (snap, snapIndex) {
47984        slidesGrid[snapIndex] = snap + allSlidesOffset;
47985      });
47986    }
47987  }
47988  Object.assign(swiper, {
47989    slides: slides,
47990    snapGrid: snapGrid,
47991    slidesGrid: slidesGrid,
47992    slidesSizesGrid: slidesSizesGrid
47993  });
47994  if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) {
47995    (0, _utils.b)(wrapperEl, '--swiper-centered-offset-before', "".concat(-snapGrid[0], "px"));
47996    (0, _utils.b)(wrapperEl, '--swiper-centered-offset-after', "".concat(swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2, "px"));
47997    var addToSnapGrid = -swiper.snapGrid[0];
47998    var addToSlidesGrid = -swiper.slidesGrid[0];
47999    swiper.snapGrid = swiper.snapGrid.map(function (v) {
48000      return v + addToSnapGrid;
48001    });
48002    swiper.slidesGrid = swiper.slidesGrid.map(function (v) {
48003      return v + addToSlidesGrid;
48004    });
48005  }
48006  if (slidesLength !== previousSlidesLength) {
48007    swiper.emit('slidesLengthChange');
48008  }
48009  if (snapGrid.length !== previousSnapGridLength) {
48010    if (swiper.params.watchOverflow) swiper.checkOverflow();
48011    swiper.emit('snapGridLengthChange');
48012  }
48013  if (slidesGrid.length !== previousSlidesGridLength) {
48014    swiper.emit('slidesGridLengthChange');
48015  }
48016  if (params.watchSlidesProgress) {
48017    swiper.updateSlidesOffset();
48018  }
48019  swiper.emit('slidesUpdated');
48020  if (!isVirtual && !params.cssMode && (params.effect === 'slide' || params.effect === 'fade')) {
48021    var backFaceHiddenClass = "".concat(params.containerModifierClass, "backface-hidden");
48022    var hasClassBackfaceClassAdded = swiper.el.classList.contains(backFaceHiddenClass);
48023    if (slidesLength <= params.maxBackfaceHiddenSlides) {
48024      if (!hasClassBackfaceClassAdded) swiper.el.classList.add(backFaceHiddenClass);
48025    } else if (hasClassBackfaceClassAdded) {
48026      swiper.el.classList.remove(backFaceHiddenClass);
48027    }
48028  }
48029}
48030function updateAutoHeight(speed) {
48031  var swiper = this;
48032  var activeSlides = [];
48033  var isVirtual = swiper.virtual && swiper.params.virtual.enabled;
48034  var newHeight = 0;
48035  var i;
48036  if (typeof speed === 'number') {
48037    swiper.setTransition(speed);
48038  } else if (speed === true) {
48039    swiper.setTransition(swiper.params.speed);
48040  }
48041  var getSlideByIndex = function getSlideByIndex(index) {
48042    if (isVirtual) {
48043      return swiper.slides[swiper.getSlideIndexByData(index)];
48044    }
48045    return swiper.slides[index];
48046  };
48047  // Find slides currently in view
48048  if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {
48049    if (swiper.params.centeredSlides) {
48050      (swiper.visibleSlides || []).forEach(function (slide) {
48051        activeSlides.push(slide);
48052      });
48053    } else {
48054      for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {
48055        var index = swiper.activeIndex + i;
48056        if (index > swiper.slides.length && !isVirtual) break;
48057        activeSlides.push(getSlideByIndex(index));
48058      }
48059    }
48060  } else {
48061    activeSlides.push(getSlideByIndex(swiper.activeIndex));
48062  }
48063
48064  // Find new height from highest slide in view
48065  for (i = 0; i < activeSlides.length; i += 1) {
48066    if (typeof activeSlides[i] !== 'undefined') {
48067      var height = activeSlides[i].offsetHeight;
48068      newHeight = height > newHeight ? height : newHeight;
48069    }
48070  }
48071
48072  // Update Height
48073  if (newHeight || newHeight === 0) swiper.wrapperEl.style.height = "".concat(newHeight, "px");
48074}
48075function updateSlidesOffset() {
48076  var swiper = this;
48077  var slides = swiper.slides;
48078  // eslint-disable-next-line
48079  var minusOffset = swiper.isElement ? swiper.isHorizontal() ? swiper.wrapperEl.offsetLeft : swiper.wrapperEl.offsetTop : 0;
48080  for (var i = 0; i < slides.length; i += 1) {
48081    slides[i].swiperSlideOffset = (swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop) - minu
48081sOffset - swiper.cssOverflowAdjustment();
48082  }
48083}
48084var toggleSlideClasses$1 = function toggleSlideClasses$1(slideEl, condition, className) {
48085  if (condition && !slideEl.classList.contains(className)) {
48086    slideEl.classList.add(className);
48087  } else if (!condition && slideEl.classList.contains(className)) {
48088    slideEl.classList.remove(className);
48089  }
48090};
48091function updateSlidesProgress() {
48092  var translate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this && this.translate || 0;
48093  var swiper = this;
48094  var params = swiper.params;
48095  var slides = swiper.slides,
48096    rtl = swiper.rtlTranslate,
48097    snapGrid = swiper.snapGrid;
48098  if (slides.length === 0) return;
48099  if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset();
48100  var offsetCenter = -translate;
48101  if (rtl) offsetCenter = translate;
48102  swiper.visibleSlidesIndexes = [];
48103  swiper.visibleSlides = [];
48104  var spaceBetween = params.spaceBetween;
48105  if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
48106    spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiper.size;
48107  } else if (typeof spaceBetween === 'string') {
48108    spaceBetween = parseFloat(spaceBetween);
48109  }
48110  for (var i = 0; i < slides.length; i += 1) {
48111    var _slide2 = slides[i];
48112    var slideOffset = _slide2.swiperSlideOffset;
48113    if (params.cssMode && params.centeredSlides) {
48114      slideOffset -= slides[0].swiperSlideOffset;
48115    }
48116    var slideProgress = (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (_slide2.swiperSlideSize + spaceBetween);
48117    var originalSlideProgress = (offsetCenter - snapGrid[0] + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (_slide2.swiperSlideSize + spaceBetween);
48118    var slideBefore = -(offsetCenter - slideOffset);
48119    var slideAfter = slideBefore + swiper.slidesSizesGrid[i];
48120    var isFullyVisible = slideBefore >= 0 && slideBefore <= swiper.size - swiper.slidesSizesGrid[i];
48121    var isVisible = slideBefore >= 0 && slideBefore < swiper.size - 1 || slideAfter > 1 && slideAfter <= swiper.size || slideBefore <= 0 && slideAfter >= swiper.size;
48122    if (isVisible) {
48123      swiper.visibleSlides.push(_slide2);
48124      swiper.visibleSlidesIndexes.push(i);
48125    }
48126    toggleSlideClasses$1(_slide2, isVisible, params.slideVisibleClass);
48127    toggleSlideClasses$1(_slide2, isFullyVisible, params.slideFullyVisibleClass);
48128    _slide2.progress = rtl ? -slideProgress : slideProgress;
48129    _slide2.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress;
48130  }
48131}
48132function updateProgress(translate) {
48133  var swiper = this;
48134  if (typeof translate === 'undefined') {
48135    var multiplier = swiper.rtlTranslate ? -1 : 1;
48136    // eslint-disable-next-line
48137    translate = swiper && swiper.translate && swiper.translate * multiplier || 0;
48138  }
48139  var params = swiper.params;
48140  var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
48141  var progress = swiper.progress,
48142    isBeginning = swiper.isBeginning,
48143    isEnd = swiper.isEnd,
48144    progressLoop = swiper.progressLoop;
48145  var wasBeginning = isBeginning;
48146  var wasEnd = isEnd;
48147  if (translatesDiff === 0) {
48148    progress = 0;
48149    isBeginning = true;
48150    isEnd = true;
48151  } else {
48152    progress = (translate - swiper.minTranslate()) / translatesDiff;
48153    var isBeginningRounded = Math.abs(translate - swiper.minTranslate()) < 1;
48154    var isEndRounded = Math.abs(translate - swiper.maxTranslate()) < 1;
48155    isBeginning = isBeginningRounded || progress <= 0;
48156    isEnd = isEndRounded || progress >= 1;
48157    if (isBeginningRounded) progress = 0;
48158    if (isEndRounded) progress = 1;
48159  }
48160  if (params.loop) {
48161    var firstSlideIndex = swiper.getSlideIndexByData(0);
48162    var lastSlideIndex = swiper.getSlideIndexByData(swiper.slides.length - 1);
48163    var firstSlideTranslate = swiper.slidesGrid[firstSlideIndex];
48164    var lastSlideTranslate = swiper.slidesGrid[lastSlideIndex];
48165    var translateMax = swiper.slidesGrid[swiper.slidesGrid.length - 1];
48166    var translateAbs = Math.abs(translate);
48167    if (translateAbs >= firstSlideTranslate) {
48168      progressLoop = (translateAbs - firstSlideTranslate) / translateMax;
48169    } else {
48170      progressLoop = (translateAbs + translateMax - lastSlideTranslate) / translateMax;
48171    }
48172    if (progressLoop > 1) progressLoop -= 1;
48173  }
48174  Object.assign(swiper, {
48175    progress: progress,
48176    progressLoop: progressLoop,
48177    isBeginning: isBeginning,
48178    isEnd: isEnd
48179  });
48180  if (params.watchSlidesProgress || params.centeredSlides && params.autoHeight) swiper.updateSlidesProgress(translate);
48181  if (isBeginning && !wasBeginning) {
48182    swiper.emit('reachBeginning toEdge');
48183  }
48184  if (isEnd && !wasEnd) {
48185    swiper.emit('reachEnd toEdge');
48186  }
48187  if (wasBeginning && !isBeginning || wasEnd && !isEnd) {
48188    swiper.emit('fromEdge');
48189  }
48190  swiper.emit('progress', progress);
48191}
48192var toggleSlideClasses = function toggleSlideClasses(slideEl, condition, className) {
48193  if (condition && !slideEl.classList.contains(className)) {
48194    slideEl.classList.add(className);
48195  } else if (!condition && slideEl.classList.contains(className)) {
48196    slideEl.classList.remove(className);
48197  }
48198};
48199function updateSlidesClasses() {
48200  var swiper = this;
48201  var slides = swiper.slides,
48202    params = swiper.params,
48203    slidesEl = swiper.slidesEl,
48204    activeIndex = swiper.activeIndex;
48205  var isVirtual = swiper.virtual && params.virtual.enabled;
48206  var gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;
48207  var getFilteredSlide = function getFilteredSlide(selector) {
48208    return (0, _utils.e)(slidesEl, ".".concat(params.slideClass).concat(selector, ", swiper-slide").concat(selector))[0];
48209  };
48210  var activeSlide;
48211  var prevSlide;
48212  var nextSlide;
48213  if (isVirtual) {
48214    if (params.loop) {
48215      var slideIndex = activeIndex - swiper.virtual.slidesBefore;
48216      if (slideIndex < 0) slideIndex = swiper.virtual.slides.length + slideIndex;
48217      if (slideIndex >= swiper.virtual.slides.length) slideIndex -= swiper.virtual.slides.length;
48218      activeSlide = getFilteredSlide("[data-swiper-slide-index=\"".concat(slideIndex, "\"]"));
48219    } else {
48220      activeSlide = getFilteredSlide("[data-swiper-slide-index=\"".concat(activeIndex, "\"]"));
48221    }
48222  } else {
48223    if (gridEnabled) {
48224      activeSlide = slides.find(function (slideEl) {
48225        return slideEl.column === activeIndex;
48226      });
48227      nextSlide = slides.find(function (slideEl) {
48228        return slideEl.column === activeIndex + 1;
48229      });
48230      prevSlide = slides.find(function (slideEl) {
48231        return slideEl.column === activeIndex - 1;
48232      });
48233    } else {
48234      activeSlide = slides[activeIndex];
48235    }
48236  }
48237  if (activeSlide) {
48238    if (!gridEnabled) {
48239      // Next Slide
48240      nextSlide = (0, _utils.r)(activeSlide, ".".concat(params.slideClass, ", swiper-slide"))[0];
48241      if (params.loop && !nextSlide) {
48242        nextSlide = slides[0];
48243      }
48244
48245      // Prev Slide
48246      prevSlide = (0, _utils.t)(activeSlide, ".".concat(params.slideClass, ", swiper-slide"))[0];
48247      if (params.loop && !prevSlide === 0) {
48248        prevSlide = slides[slides.length - 1];
48249      }
48250    }
48251  }
48252  slides.forEach(function (slideEl) {
48253    toggleSlideClasses(slideEl, slideEl === activeSlide, params.slideActiveClass);
48254    toggleSlideClasses(slideEl, slideEl === nextSlide, params.slideNextClass);
48255    toggleSlideClasses(slideEl, slideEl === prevSlide, params.slidePrevClass);
48256  });
48257  swiper.emitSlidesClasses();
48258}
48259var processLazyPreloader = function processLazyPreloader(swiper, imageEl) {
48260  if (!swiper || swiper.destroyed || !swiper.params) return;
48261  var slideSelector = function slideSelector() {
48262    return swiper.isElement ? "swiper-slide" : ".".concat(swiper.params.slideClass);
48263  };
48264  var slideEl = imageEl.closest(slideSelector());
48265  if (slideEl) {
48266    var lazyEl = slideEl.querySelector(".".concat(swiper.params.lazyPreloaderClass));
48267    if (!lazyEl && swiper.isElement) {
48268      if (slideEl.shadowRoot) {
48269        lazyEl = slideEl.shadowRoot.querySelector(".".concat(swiper.params.lazyPreloaderClass));
48270      } else {
48271        // init later
48272        requestAnimationFrame(function () {
48273          if (slideEl.shadowRoot) {
48274            lazyEl = slideEl.shadowRoot.querySelector(".".concat(swiper.params.lazyPreloaderClass));
48275            if (lazyEl && !lazyEl.lazyPreloaderManaged) lazyEl.remove();
48276          }
48277        });
48278      }
48279    }
48280    // Skip removal if managed by React/Vue component
48281    if (lazyEl && !lazyEl.lazyPreloaderManaged) lazyEl.remove();
48282  }
48283};
48284var unlazy = function unlazy(swiper, index) {
48285  if (!swiper.slides[index]) return;
48286  var imageEl = swiper.slides[index].querySelector('[loading="lazy"]');
48287  if (imageEl) imageEl.removeAttribute('loading');
48288};
48289var preload = function preload(swiper) {
48290  if (!swiper || swiper.destroyed || !swiper.params) return;
48291  var amount = swiper.params.lazyPreloadPrevNext;
48292  var len = swiper.slides.length;
48293  if (!len || !amount || amount < 0) return;
48294  amount = Math.min(amount, len);
48295  var slidesPerView = swiper.params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(swiper.params.slidesPerView);
48296  var activeIndex = swiper.activeIndex;
48297  if (swiper.params.grid && swiper.params.grid.rows > 1) {
48298    var activeColumn = activeIndex;
48299    var preloadColumns = [activeColumn - amount];
48300    preloadColumns.push.apply(preloadColumns, (0, _toConsumableArray2["default"])(Array.from({
48301      length: amount
48302    }).map(function (_, i) {
48303      return activeColumn + slidesPerView + i;
48304    })));
48305    swiper.slides.forEach(function (slideEl, i) {
48306      if (preloadColumns.includes(slideEl.column)) unlazy(swiper, i);
48307    });
48308    return;
48309  }
48310  var slideIndexLastInView = activeIndex + slidesPerView - 1;
48311  if (swiper.params.rewind || swiper.params.loop) {
48312    for (var i = activeIndex - amount; i <= slideIndexLastInView + amount; i += 1) {
48313      var realIndex = (i % len + len) % len;
48314      if (realIndex < activeIndex || realIndex > slideIndexLastInView) unlazy(swiper, realIndex);
48315    }
48316  } else {
48317    for (var _i5 = Math.max(activeIndex - amount, 0); _i5 <= Math.min(slideIndexLastInView + amount, len - 1); _i5 += 1) {
48318      if (_i5 !== activeIndex && (_i5 > slideIndexLastInView || _i5 < activeIndex)) {
48319        unlazy(swiper, _i5);
48320      }
48321    }
48322  }
48323};
48324function getActiveIndexByTranslate(swiper) {
48325  var slidesGrid = swiper.slidesGrid,
48326    params = swiper.params;
48327  var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
48328  var activeIndex;
48329  for (var i = 0; i < slidesGrid.length; i += 1) {
48330    if (typeof slidesGrid[i + 1] !== 'undefined') {
48331      if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2) {
48332        activeIndex = i;
48333      } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {
48334        activeIndex = i + 1;
48335      }
48336    } else if (translate >= slidesGrid[i]) {
48337      activeIndex = i;
48338    }
48339  }
48340  // Normalize slideIndex
48341  if (params.normalizeSlideIndex) {
48342    if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0;
48343  }
48344  return activeIndex;
48345}
48346function updateActiveIndex(newActiveIndex) {
48347  var swiper = this;
48348  var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
48349  var snapGrid = swiper.snapGrid,
48350    params = swiper.params,
48351    previousIndex = swiper.activeIndex,
48352    previousRealIndex = swiper.realIndex,
48353    previousSnapIndex = swiper.snapIndex;
48354  var activeIndex = newActiveIndex;
48355  var snapIndex;
48356  var getVirtualRealIndex = function getVirtualRealIndex(aIndex) {
48357    var realIndex = aIndex - swiper.virtual.slidesBefore;
48358    if (realIndex < 0) {
48359      realIndex = swiper.virtual.slides.length + realIndex;
48360    }
48361    if (realIndex >= swiper.virtual.slides.length) {
48362      realIndex -= swiper.virtual.slides.length;
48363    }
48364    return realIndex;
48365  };
48366  if (typeof activeIndex === 'undefined') {
48367    activeIndex = getActiveIndexByTranslate(swiper);
48368  }
48369  if (snapGrid.indexOf(translate) >= 0) {
48370    snapIndex = snapGrid.indexOf(translate);
48371  } else {
48372    var skip = Math.min(params.slidesPerGroupSkip, activeIndex);
48373    snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);
48374  }
48375  if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;
48376  if (activeIndex === previousIndex && !swiper.params.loop) {
48377    if (snapIndex !== previousSnapIndex) {
48378      swiper.snapIndex = snapIndex;
48379      swiper.emit('snapIndexChange');
48380    }
48381    return;
48382  }
48383  if (activeIndex === previousIndex && swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) {
48384    swiper.realIndex = getVirtualRealIndex(activeIndex);
48385    return;
48386  }
48387  var gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;
48388
48389  // Get real index
48390  var realIndex;
48391  if (swiper.virtual && params.virtual.enabled) {
48392    if (params.loop) {
48393      realIndex = getVirtualRealIndex(activeIndex);
48394    } else {
48395      realIndex = activeIndex;
48396    }
48397  } else if (gridEnabled) {
48398    var firstSlideInColumn = swiper.slides.find(function (slideEl) {
48399      return slideEl.column === activeIndex;
48400    });
48401    var activeSlideIndex = parseInt(firstSlideInColumn.getAttribute('data-swiper-slide-index'), 10);
48402    if (Number.isNaN(activeSlideIndex)) {
48403      activeSlideIndex = Math.max(swiper.slides.indexOf(firstSlideInColumn), 0);
48404    }
48405    realIndex = Math.floor(activeSlideIndex / params.grid.rows);
48406  } else if (swiper.slides[activeIndex]) {
48407    var slideIndex = swiper.slides[activeIndex].getAttribute('data-swiper-slide-index');
48408    if (slideIndex) {
48409      realIndex = parseInt(slideIndex, 10);
48410    } else {
48411      realIndex = activeIndex;
48412    }
48413  } else {
48414    realIndex = activeIndex;
48415  }
48416  Object.assign(swiper, {
48417    previousSnapIndex: previousSnapIndex,
48418    snapIndex: snapIndex,
48419    previousRealIndex: previousRealIndex,
48420    realIndex: realIndex,
48421    previousIndex: previousIndex,
48422    activeIndex: activeIndex
48423  });
48424  if (swiper.initialized) {
48425    preload(swiper);
48426  }
48427  swiper.emit('activeIndexChange');
48428  swiper.emit('snapIndexChange');
48429  if (swiper.initialized || swiper.params.runCallbacksOnInit) {
48430    if (previousRealIndex !== realIndex) {
48431      swiper.emit('realIndexChange');
48432    }
48433    swiper.emit('slideChange');
48434  }
48435}
48436function updateClickedSlide(el, path) {
48437  var swiper = this;
48438  var params = swiper.params;
48439  var slide = el.closest(".".concat(params.slideClass, ", swiper-slide"));
48440  if (!slide && swiper.isElement && path && path.length > 1 && path.includes(el)) {
48441    (0, _toConsumableArray2["default"])(path.slice(path.indexOf(el) + 1, path.length)).forEach(function (pathEl) {
48442      if (!slide && pathEl.matches && pathEl.matches(".".concat(params.slideClass, ", swiper-slide"))) {
48443        slide = pathEl;
48444      }
48445    });
48446  }
48447  var slideFound = false;
48448  var slideIndex;
48449  if (slide) {
48450    for (var i = 0; i < swiper.slides.length; i += 1) {
48451      if (swiper.slides[i] === slide) {
48452        slideFound = true;
48453        slideIndex = i;
48454        break;
48455      }
48456    }
48457  }
48458  if (slide && slideFound) {
48459    swiper.clickedSlide = slide;
48460    if (swiper.virtual && swiper.params.virtual.enabled) {
48461      swiper.clickedIndex = parseInt(slide.getAttribute('data-swiper-slide-index'), 10);
48462    } else {
48463      swiper.clickedIndex = slideIndex;
48464    }
48465  } else {
48466    swiper.clickedSlide = undefined;
48467    swiper.clickedIndex = undefined;
48468    return;
48469  }
48470  if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {
48471    swiper.slideToClickedSlide();
48472  }
48473}
48474var update = {
48475  updateSize: updateSize,
48476  updateSlides: updateSlides,
48477  updateAutoHeight: updateAutoHeight,
48478  updateSlidesOffset: updateSlidesOffset,
48479  updateSlidesProgress: updateSlidesProgress,
48480  updateProgress: updateProgress,
48481  updateSlidesClasses: updateSlidesClasses,
48482  updateActiveIndex: updateActiveIndex,
48483  updateClickedSlide: updateClickedSlide
48484};
48485function getSwiperTranslate() {
48486  var axis = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.isHorizontal() ? 'x' : 'y';
48487  var swiper = this;
48488  var params = swiper.params,
48489    rtl = swiper.rtlTranslate,
48490    translate = swiper.translate,
48491    wrapperEl = swiper.wrapperEl;
48492  if (params.virtualTranslate) {
48493    return rtl ? -translate : translate;
48494  }
48495  if (params.cssMode) {
48496    return translate;
48497  }
48498  var currentTranslate = (0, _utils.l)(wrapperEl, axis);
48499  currentTranslate += swiper.cssOverflowAdjustment();
48500  if (rtl) currentTranslate = -currentTranslate;
48501  return currentTranslate || 0;
48502}
48503function setTranslate(translate, byController) {
48504  var swiper = this;
48505  var rtl = swiper.rtlTranslate,
48506    params = swiper.params,
48507    wrapperEl = swiper.wrapperEl,
48508    progress = swiper.progress;
48509  var x = 0;
48510  var y = 0;
48511  var z = 0;
48512  if (swiper.isHorizontal()) {
48513    x = rtl ? -translate : translate;
48514  } else {
48515    y = translate;
48516  }
48517  if (params.roundLengths) {
48518    x = Math.floor(x);
48519    y = Math.floor(y);
48520  }
48521  swiper.previousTranslate = swiper.translate;
48522  swiper.translate = swiper.isHorizontal() ? x : y;
48523  if (params.cssMode) {
48524    wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;
48525  } else if (!params.virtualTranslate) {
48526    if (swiper.isHorizontal()) {
48527      x -= swiper.cssOverflowAdjustment();
48528    } else {
48529      y -= swiper.cssOverflowAdjustment();
48530    }
48531    wrapperEl.style.transform = "translate3d(".concat(x, "px, ").concat(y, "px, ").concat(z, "px)");
48532  }
48533
48534  // Check if we need to update progress
48535  var newProgress;
48536  var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
48537  if (translatesDiff === 0) {
48538    newProgress = 0;
48539  } else {
48540    newProgress = (translate - swiper.minTranslate()) / translatesDiff;
48541  }
48542  if (newProgress !== progress) {
48543    swiper.updateProgress(translate);
48544  }
48545  swiper.emit('setTranslate', swiper.translate, byController);
48546}
48547function minTranslate() {
48548  return -this.snapGrid[0];
48549}
48550function maxTranslate() {
48551  return -this.snapGrid[this.snapGrid.length - 1];
48552}
48553function translateTo() {
48554  var translate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
48555  var speed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.params.speed;
48556  var runCallbacks = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
48557  var translateBounds = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
48558  var internal = arguments.length > 4 ? arguments[4] : undefined;
48559  var swiper = this;
48560  var params = swiper.params,
48561    wrapperEl = swiper.wrapperEl;
48562  if (swiper.animating && params.preventInteractionOnTransition) {
48563    return false;
48564  }
48565  var minTranslate = swiper.minTranslate();
48566  var maxTranslate = swiper.maxTranslate();
48567  var newTranslate;
48568  if (translateBounds && translate > minTranslate) newTranslate = minTranslate;else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;else newTranslate = translate;
48569
48570  // Update progress
48571  swiper.updateProgress(newTranslate);
48572  if (params.cssMode) {
48573    var isH = swiper.isHorizontal();
48574    if (speed === 0) {
48575      wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;
48576    } else {
48577      if (!swiper.support.smoothScroll) {
48578        (0, _utils.u)({
48579          swiper: swiper,
48580          targetPosition: -newTranslate,
48581          side: isH ? 'left' : 'top'
48582        });
48583        return true;
48584      }
48585      wrapperEl.scrollTo((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, isH ? 'left' : 'top', -newTranslate), "behavior", 'smooth'));
48586    }
48587    return true;
48588  }
48589  if (speed === 0) {
48590    swiper.setTransition(0);
48591    swiper.setTranslate(newTranslate);
48592    if (runCallbacks) {
48593      swiper.emit('beforeTransitionStart', speed, internal);
48594      swiper.emit('transitionEnd');
48595    }
48596  } else {
48597    swiper.setTransition(speed);
48598    swiper.setTranslate(newTranslate);
48599    if (runCallbacks) {
48600      swiper.emit('beforeTransitionStart', speed, internal);
48601      swiper.emit('transitionStart');
48602    }
48603    if (!swiper.animating) {
48604      swiper.animating = true;
48605      if (!swiper.onTranslateToWrapperTransitionEnd) {
48606        swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {
48607          if (!swiper || swiper.destroyed) return;
48608          if (e.target !== this) return;
48609          swiper.wrapperEl.removeEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);
48610          swiper.onTranslateToWrapperTransitionEnd = null;
48611          delete swiper.onTranslateToWrapperTransitionEnd;
48612          swiper.animating = false;
48613          if (runCallbacks) {
48614            swiper.emit('transitionEnd');
48615          }
48616        };
48617      }
48618      swiper.wrapperEl.addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);
48619    }
48620  }
48621  return true;
48622}
48623var translate = {
48624  getTranslate: getSwiperTranslate,
48625  setTranslate: setTranslate,
48626  minTranslate: minTranslate,
48627  maxTranslate: maxTranslate,
48628  translateTo: translateTo
48629};
48630function setTransition(duration, byController) {
48631  var swiper = this;
48632  if (!swiper.params.cssMode) {
48633    swiper.wrapperEl.style.transitionDuration = "".concat(duration, "ms");
48634    swiper.wrapperEl.style.transitionDelay = duration === 0 ? "0ms" : '';
48635  }
48636  swiper.emit('setTransition', duration, byController);
48637}
48638function transitionEmit(_ref5) {
48639  var swiper = _ref5.swiper,
48640    runCallbacks = _ref5.runCallbacks,
48641    direction = _ref5.direction,
48642    step = _ref5.step;
48643  var activeIndex = swiper.activeIndex,
48644    previousIndex = swiper.previousIndex;
48645  var dir = direction;
48646  if (!dir) {
48647    if (activeIndex > previousIndex) dir = 'next';else if (activeIndex < previousIndex) dir = 'prev';else dir = 'reset';
48648  }
48649  swiper.emit("transition".concat(step));
48650  if (runCallbacks && dir === 'reset') {
48651    swiper.emit("slideResetTransition".concat(step));
48652  } else if (runCallbacks && activeIndex !== previousIndex) {
48653    swiper.emit("slideChangeTransition".concat(step));
48654    if (dir === 'next') {
48655      swiper.emit("slideNextTransition".concat(step));
48656    } else {
48657      swiper.emit("slidePrevTransition".concat(step));
48658    }
48659  }
48660}
48661function transitionStart() {
48662  var runCallbacks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
48663  var direction = arguments.length > 1 ? arguments[1] : undefined;
48664  var swiper = this;
48665  var params = swiper.params;
48666  if (params.cssMode) return;
48667  if (params.autoHeight) {
48668    swiper.updateAutoHeight();
48669  }
48670  transitionEmit({
48671    swiper: swiper,
48672    runCallbacks: runCallbacks,
48673    direction: direction,
48674    step: 'Start'
48675  });
48676}
48677function transitionEnd() {
48678  var runCallbacks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
48679  var direction = arguments.length > 1 ? arguments[1] : undefined;
48680  var swiper = this;
48681  var params = swiper.params;
48682  swiper.animating = false;
48683  if (params.cssMode) return;
48684  swiper.setTransition(0);
48685  transitionEmit({
48686    swiper: swiper,
48687    runCallbacks: runCallbacks,
48688    direction: direction,
48689    step: 'End'
48690  });
48691}
48692var transition = {
48693  setTransition: setTransition,
48694  transitionStart: transitionStart,
48695  transitionEnd: transitionEnd
48696};
48697function slideTo() {
48698  var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
48699  var speed = arguments.length > 1 ? arguments[1] : undefined;
48700  var runCallbacks = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
48701  var internal = arguments.length > 3 ? arguments[3] : undefined;
48702  var initial = arguments.length > 4 ? arguments[4] : undefined;
48703  if (typeof index === 'string') {
48704    index = parseInt(index, 10);
48705  }
48706  var swiper = this;
48707  var slideIndex = index;
48708  if (slideIndex < 0) slideIndex = 0;
48709  var params = swiper.params,
48710    snapGrid = swiper.snapGrid,
48711    slidesGrid = swiper.slidesGrid,
48712    previousIndex = swiper.previousIndex,
48713    activeIndex = swiper.activeIndex,
48714    rtl = swiper.rtlTranslate,
48715    wrapperEl = swiper.wrapperEl,
48716    enabled = swiper.enabled;
48717  if (!enabled && !internal && !initial || swiper.destroyed || swiper.animating && params.preventInteractionOnTransition) {
48718    return false;
48719  }
48720  if (typeof speed === 'undefined') {
48721    speed = swiper.params.speed;
48722  }
48723  var skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);
48724  var snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);
48725  if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;
48726  var translate = -snapGrid[snapIndex];
48727  // Normalize slideIndex
48728  if (params.normalizeSlideIndex) {
48729    for (var i = 0; i < slidesGrid.length; i += 1) {
48730      var normalizedTranslate = -Math.floor(translate * 100);
48731      var normalizedGrid = Math.floor(slidesGrid[i] * 100);
48732      var normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100);
48733      if (typeof slidesGrid[i + 1] !== 'undefined') {
48734        if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2) {
48735          slideIndex = i;
48736        } else if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext) {
48737          slideIndex = i + 1;
48738        }
48739      } else if (normalizedTranslate >= normalizedGrid) {
48740        slideIndex = i;
48741      }
48742    }
48743  }
48744  // Directions locks
48745  if (swiper.initialized && slideIndex !== activeIndex) {
48746    if (!swiper.allowSlideNext && (rtl ? translate > swiper.translate && translate > swiper.minTranslate() : translate < swiper.translate && translate < swiper.minTranslate())) {
48747      return false;
48748    }
48749    if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {
48750      if ((activeIndex || 0) !== slideIndex) {
48751        return false;
48752      }
48753    }
48754  }
48755  if (slideIndex !== (previousIndex || 0) && runCallbacks) {
48756    swiper.emit('beforeSlideChangeStart');
48757  }
48758
48759  // Update progress
48760  swiper.updateProgress(translate);
48761  var direction;
48762  if (slideIndex > activeIndex) direction = 'next';else if (slideIndex < activeIndex) direction = 'prev';else direction = 'reset';
48763
48764  // initial virtual
48765  var isVirtual = swiper.virtual && swiper.params.virtual.enabled;
48766  var isInitialVirtual = isVirtual && initial;
48767  // Update Index
48768  if (!isInitialVirtual && (rtl && -translate === swiper.translate || !rtl && translate === swiper.translate)) {
48769    swiper.updateActiveIndex(slideIndex);
48770    // Update Height
48771    if (params.autoHeight) {
48772      swiper.updateAutoHeight();
48773    }
48774    swiper.updateSlidesClasses();
48775    if (params.effect !== 'slide') {
48776      swiper.setTranslate(translate);
48777    }
48778    if (direction !== 'reset') {
48779      swiper.transitionStart(runCallbacks, direction);
48780      swiper.transitionEnd(runCallbacks, direction);
48781    }
48782    return false;
48783  }
48784  if (params.cssMode) {
48785    var isH = swiper.isHorizontal();
48786    var t = rtl ? translate : -translate;
48787    if (speed === 0) {
48788      if (isVirtual) {
48789        swiper.wrapperEl.style.scrollSnapType = 'none';
48790        swiper._immediateVirtual = true;
48791      }
48792      if (isVirtual && !swiper._cssModeVirtualInitialSet && swiper.params.initialSlide > 0) {
48793        swiper._cssModeVirtualInitialSet = true;
48794        requestAnimationFrame(function () {
48795          wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;
48796        });
48797      } else {
48798        wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;
48799      }
48800      if (isVirtual) {
48801        requestAnimationFrame(function () {
48802          swiper.wrapperEl.style.scrollSnapType = '';
48803          swiper._immediateVirtual = false;
48804        });
48805      }
48806    } else {
48807      if (!swiper.support.smoothScroll) {
48808        (0, _utils.u)({
48809          swiper: swiper,
48810          targetPosition: t,
48811          side: isH ? 'left' : 'top'
48812        });
48813        return true;
48814      }
48815      wrapperEl.scrollTo((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, isH ? 'left' : 'top', t), "behavior", 'smooth'));
48816    }
48817    return true;
48818  }
48819  var browser = getBrowser();
48820  var isSafari = browser.isSafari;
48821  if (isVirtual && !initial && isSafari && swiper.isElement) {
48822    swiper.virtual.update(false, false, slideIndex);
48823  }
48824  swiper.setTransition(speed);
48825  swiper.setTranslate(translate);
48826  swiper.updateActiveIndex(slideIndex);
48827  swiper.updateSlidesClasses();
48828  swiper.emit('beforeTransitionStart', speed, internal);
48829  swiper.transitionStart(runCallbacks, direction);
48830  if (speed === 0) {
48831    swiper.transitionEnd(runCallbacks, direction);
48832  } else if (!swiper.animating) {
48833    swiper.animating = true;
48834    if (!swiper.onSlideToWrapperTransitionEnd) {
48835      swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {
48836        if (!swiper || swiper.destroyed) return;
48837        if (e.target !== this) return;
48838        swiper.wrapperEl.removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
48839        swiper.onSlideToWrapperTransitionEnd = null;
48840        delete swiper.onSlideToWrapperTransitionEnd;
48841        swiper.transitionEnd(runCallbacks, direction);
48842      };
48843    }
48844    swiper.wrapperEl.addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
48845  }
48846  return true;
48847}
48848function slideToLoop() {
48849  var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
48850  var speed = arguments.length > 1 ? arguments[1] : undefined;
48851  var runCallbacks = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
48852  var internal = arguments.length > 3 ? arguments[3] : undefined;
48853  if (typeof index === 'string') {
48854    var indexAsNumber = parseInt(index, 10);
48855    index = indexAsNumber;
48856  }
48857  var swiper = this;
48858  if (swiper.destroyed) return;
48859  if (typeof speed === 'undefined') {
48860    speed = swiper.params.speed;
48861  }
48862  var gridEnabled = swiper.grid && swiper.params.grid && swiper.params.grid.rows > 1;
48863  var newIndex = index;
48864  if (swiper.params.loop) {
48865    if (swiper.virtual && swiper.params.virtual.enabled) {
48866      // eslint-disable-next-line
48867      newIndex = newIndex + swiper.virtual.slidesBefore;
48868    } else {
48869      var targetSlideIndex;
48870      if (gridEnabled) {
48871        var slideIndex = newIndex * swiper.params.grid.rows;
48872        targetSlideIndex = swiper.slides.find(function (slideEl) {
48873          return slideEl.getAttribute('data-swiper-slide-index') * 1 === slideIndex;
48874        }).column;
48875      } else {
48876        targetSlideIndex = swiper.getSlideIndexByData(newIndex);
48877      }
48878      var cols = gridEnabled ? Math.ceil(swiper.slides.length / swiper.params.grid.rows) : swiper.slides.length;
48879      var _swiper$params = swiper.params,
48880        centeredSlides = _swiper$params.centeredSlides,
48881        slidesOffsetBefore = _swiper$params.slidesOffsetBefore,
48882        slidesOffsetAfter = _swiper$params.slidesOffsetAfter;
48883      var bothDirections = centeredSlides || !!slidesOffsetBefore || !!slidesOffsetAfter;
48884      var slidesPerView = swiper.params.slidesPerView;
48885      if (slidesPerView === 'auto') {
48886        slidesPerView = swiper.slidesPerViewDynamic();
48887      } else {
48888        slidesPerView = Math.ceil(parseFloat(swiper.params.slidesPerView, 10));
48889        if (bothDirections && slidesPerView % 2 === 0) {
48890          slidesPerView = slidesPerView + 1;
48891        }
48892      }
48893      var needLoopFix = cols - targetSlideIndex < slidesPerView;
48894      if (bothDirections) {
48895        needLoopFix = needLoopFix || targetSlideIndex < Math.ceil(slidesPerView / 2);
48896      }
48897      if (internal && bothDirections && swiper.params.slidesPerView !== 'auto' && !gridEnabled) {
48898        needLoopFix = false;
48899      }
48900      if (needLoopFix) {
48901        var direction = bothDirections ? targetSlideIndex < swiper.activeIndex ? 'prev' : 'next' : targetSlideIndex - swiper.activeIndex - 1 < swiper.params.slidesPerView ? 'next' : 'prev';
48902        swiper.loopFix({
48903          direction: direction,
48904          slideTo: true,
48905          activeSlideIndex: direction === 'next' ? targetSlideIndex + 1 : targetSlideIndex - cols + 1,
48906          slideRealIndex: direction === 'next' ? swiper.realIndex : undefined
48907        });
48908      }
48909      if (gridEnabled) {
48910        var _slideIndex = newIndex * swiper.params.grid.rows;
48911        newIndex = swiper.slides.find(function (slideEl) {
48912          return slideEl.getAttribute('data-swiper-slide-index') * 1 === _slideIndex;
48913        }).column;
48914      } else {
48915        newIndex = swiper.getSlideIndexByData(newIndex);
48916      }
48917    }
48918  }
48919  requestAnimationFrame(function () {
48920    swiper.slideTo(newIndex, speed, runCallbacks, internal);
48921  });
48922  return swiper;
48923}
48924
48925/* eslint no-unused-vars: "off" */
48926function slideNext(speed) {
48927  var runCallbacks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
48928  var internal = arguments.length > 2 ? arguments[2] : undefined;
48929  var swiper = this;
48930  var enabled = swiper.enabled,
48931    params = swiper.params,
48932    animating = swiper.animating;
48933  if (!enabled || swiper.destroyed) return swiper;
48934  if (typeof speed === 'undefined') {
48935    speed = swiper.params.speed;
48936  }
48937  var perGroup = params.slidesPerGroup;
48938  if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {
48939    perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1);
48940  }
48941  var increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup;
48942  var isVirtual = swiper.virtual && params.virtual.enabled;
48943  if (params.loop) {
48944    if (animating && !isVirtual && params.loopPreventsSliding) return false;
48945    swiper.loopFix({
48946      direction: 'next'
48947    });
48948    // eslint-disable-next-line
48949    swiper._clientLeft = swiper.wrapperEl.clientLeft;
48950    if (swiper.activeIndex === swiper.slides.length - 1 && params.cssMode) {
48951      requestAnimationFrame(function () {
48952        swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);
48953      });
48954      return true;
48955    }
48956  }
48957  if (params.rewind && swiper.isEnd) {
48958    return swiper.slideTo(0, speed, runCallbacks, internal);
48959  }
48960  return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);
48961}
48962
48963/* eslint no-unused-vars: "off" */
48964function slidePrev(speed) {
48965  var runCallbacks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
48966  var internal = arguments.length > 2 ? arguments[2] : undefined;
48967  var swiper = this;
48968  var params = swiper.params,
48969    snapGrid = swiper.snapGrid,
48970    slidesGrid = swiper.slidesGrid,
48971    rtlTranslate = swiper.rtlTranslate,
48972    enabled = swiper.enabled,
48973    animating = swiper.animating;
48974  if (!enabled || swiper.destroyed) return swiper;
48975  if (typeof speed === 'undefined') {
48976    speed = swiper.params.speed;
48977  }
48978  var isVirtual = swiper.virtual && params.virtual.enabled;
48979  if (params.loop) {
48980    if (animating && !isVirtual && params.loopPreventsSliding) return false;
48981    swiper.loopFix({
48982      direction: 'prev'
48983    });
48984    // eslint-disable-next-line
48985    swiper._clientLeft = swiper.wrapperEl.clientLeft;
48986  }
48987  var translate = rtlTranslate ? swiper.translate : -swiper.translate;
48988  function normalize(val) {
48989    if (val < 0) return -Math.floor(Math.abs(val));
48990    return Math.floor(val);
48991  }
48992  var normalizedTranslate = normalize(translate);
48993  var normalizedSnapGrid = snapGrid.map(function (val) {
48994    return normalize(val);
48995  });
48996  var isFreeMode = params.freeMode && params.freeMode.enabled;
48997  var prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];
48998  if (typeof prevSnap === 'undefined' && (params.cssMode || isFreeMode)) {
48999    var prevSnapIndex;
49000    snapGrid.forEach(function (snap, snapIndex) {
49001      if (normalizedTranslate >= snap) {
49002        // prevSnap = snap;
49003        prevSnapIndex = snapIndex;
49004      }
49005    });
49006    if (typeof prevSnapIndex !== 'undefined') {
49007      prevSnap = isFreeMode ? snapGrid[prevSnapIndex] : snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex];
49008    }
49009  }
49010  var prevIndex = 0;
49011  if (typeof prevSnap !== 'undefined') {
49012    prevIndex = slidesGrid.indexOf(prevSnap);
49013    if (prevIndex < 0) prevIndex = swiper.activeIndex - 1;
49014    if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {
49015      prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1;
49016      prevIndex = Math.max(prevIndex, 0);
49017    }
49018  }
49019  if (params.rewind && swiper.isBeginning) {
49020    var lastIndex = swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;
49021    return swiper.slideTo(lastIndex, speed, runCallbacks, internal);
49022  } else if (params.loop && swiper.activeIndex === 0 && params.cssMode) {
49023    requestAnimationFrame(function () {
49024      swiper.slideTo(prevIndex, speed, runCallbacks, internal);
49025    });
49026    return true;
49027  }
49028  return swiper.slideTo(prevIndex, speed, runCallbacks, internal);
49029}
49030
49031/* eslint no-unused-vars: "off" */
49032function slideReset(speed) {
49033  var runCallbacks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
49034  var internal = arguments.length > 2 ? arguments[2] : undefined;
49035  var swiper = this;
49036  if (swiper.destroyed) return;
49037  if (typeof speed === 'undefined') {
49038    speed = swiper.params.speed;
49039  }
49040  return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);
49041}
49042
49043/* eslint no-unused-vars: "off" */
49044function slideToClosest(speed) {
49045  var runCallbacks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
49046  var internal = arguments.length > 2 ? arguments[2] : undefined;
49047  var threshold = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0.5;
49048  var swiper = this;
49049  if (swiper.destroyed) return;
49050  if (typeof speed === 'undefined') {
49051    speed = swiper.params.speed;
49052  }
49053  var index = swiper.activeIndex;
49054  var skip = Math.min(swiper.params.slidesPerGroupSkip, index);
49055  var snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);
49056  var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
49057  if (translate >= swiper.snapGrid[snapIndex]) {
49058    // The current translate is on or after the current snap index, so the choice
49059    // is between the current index and the one after it.
49060    var currentSnap = swiper.snapGrid[snapIndex];
49061    var nextSnap = swiper.snapGrid[snapIndex + 1];
49062    if (translate - currentSnap > (nextSnap - currentSnap) * threshold) {
49063      index += swiper.params.slidesPerGroup;
49064    }
49065  } else {
49066    // The current translate is before the current snap index, so the choice
49067    // is between the current index and the one before it.
49068    var prevSnap = swiper.snapGrid[snapIndex - 1];
49069    var _currentSnap = swiper.snapGrid[snapIndex];
49070    if (translate - prevSnap <= (_currentSnap - prevSnap) * threshold) {
49071      index -= swiper.params.slidesPerGroup;
49072    }
49073  }
49074  index = Math.max(index, 0);
49075  index = Math.min(index, swiper.slidesGrid.length - 1);
49076  return swiper.slideTo(index, speed, runCallbacks, internal);
49077}
49078function slideToClickedSlide() {
49079  var swiper = this;
49080  if (swiper.destroyed) return;
49081  var params = swiper.params,
49082    slidesEl = swiper.slidesEl;
49083  var slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;
49084  var slideToIndex = swiper.getSlideIndexWhenGrid(swiper.clickedIndex);
49085  var realIndex;
49086  var slideSelector = swiper.isElement ? "swiper-slide" : ".".concat(params.slideClass);
49087  var isGrid = swiper.grid && swiper.params.grid && swiper.params.grid.rows > 1;
49088  if (params.loop) {
49089    if (swiper.animating) return;
49090    realIndex = parseInt(swiper.clickedSlide.getAttribute('data-swiper-slide-index'), 10);
49091    if (params.centeredSlides) {
49092      swiper.slideToLoop(realIndex);
49093    } else if (slideToIndex > (isGrid ? (swiper.slides.length - slidesPerView) / 2 - (swiper.params.grid.rows - 1) : swiper.slides.length - slidesPerView)) {
49094      swiper.loopFix();
49095      slideToIndex = swiper.getSlideIndex((0, _utils.e)(slidesEl, "".concat(slideSelector, "[data-swiper-slide-index=\"").concat(realIndex, "\"]"))[0]);
49096      (0, _utils.n)(function () {
49097        swiper.slideTo(slideToIndex);
49098      });
49099    } else {
49100      swiper.slideTo(slideToIndex);
49101    }
49102  } else {
49103    swiper.slideTo(slideToIndex);
49104  }
49105}
49106var slide = {
49107  slideTo: slideTo,
49108  slideToLoop: slideToLoop,
49109  slideNext: slideNext,
49110  slidePrev: slidePrev,
49111  slideReset: slideReset,
49112  slideToClosest: slideToClosest,
49113  slideToClickedSlide: slideToClickedSlide
49114};
49115function loopCreate(slideRealIndex, initial) {
49116  var swiper = this;
49117  var params = swiper.params,
49118    slidesEl = swiper.slidesEl;
49119  if (!params.loop || swiper.virtual && swiper.params.virtual.enabled) return;
49120  var initSlides = function initSlides() {
49121    var slides = (0, _utils.e)(slidesEl, ".".concat(params.slideClass, ", swiper-slide"));
49122    slides.forEach(function (el, index) {
49123      el.setAttribute('data-swiper-slide-index', index);
49124    });
49125  };
49126  var clearBlankSlides = function clearBlankSlides() {
49127    var slides = (0, _utils.e)(slidesEl, ".".concat(params.slideBlankClass));
49128    slides.forEach(function (el) {
49129      el.remove();
49130    });
49131    if (slides.length > 0) {
49132      swiper.recalcSlides();
49133      swiper.updateSlides();
49134    }
49135  };
49136  var gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;
49137  if (params.loopAddBlankSlides && (params.slidesPerGroup > 1 || gridEnabled)) {
49138    clearBlankSlides();
49139  }
49140  var slidesPerGroup = params.slidesPerGroup * (gridEnabled ? params.grid.rows : 1);
49141  var shouldFillGroup = swiper.slides.length % slidesPerGroup !== 0;
49142  var shouldFillGrid = gridEnabled && swiper.slides.length % params.grid.rows !== 0;
49143  var addBlankSlides = function addBlankSlides(amountOfSlides) {
49144    for (var i = 0; i < amountOfSlides; i += 1) {
49145      var slideEl = swiper.isElement ? (0, _utils.c)('swiper-slide', [params.slideBlankClass]) : (0, _utils.c)('div', [params.slideClass, params.slideBlankClass]);
49146      swiper.slidesEl.append(slideEl);
49147    }
49148  };
49149  if (shouldFillGroup) {
49150    if (params.loopAddBlankSlides) {
49151      var slidesToAdd = slidesPerGroup - swiper.slides.length % slidesPerGroup;
49152      addBlankSlides(slidesToAdd);
49153      swiper.recalcSlides();
49154      swiper.updateSlides();
49155    } else {
49156      (0, _utils.v)('Swiper Loop Warning: The number of slides is not even to slidesPerGroup, loop mode may 
49156not function properly. You need to add more slides (or make duplicates, or empty slides)');
49157    }
49158    initSlides();
49159  } else if (shouldFillGrid) {
49160    if (params.loopAddBlankSlides) {
49161      var _slidesToAdd = params.grid.rows - swiper.slides.length % params.grid.rows;
49162      addBlankSlides(_slidesToAdd);
49163      swiper.recalcSlides();
49164      swiper.updateSlides();
49165    } else {
49166      (0, _utils.v)('Swiper Loop Warning: The number of slides is not even to grid.rows, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)');
49167    }
49168    initSlides();
49169  } else {
49170    initSlides();
49171  }
49172  var bothDirections = params.centeredSlides || !!params.slidesOffsetBefore || !!params.slidesOffsetAfter;
49173  swiper.loopFix({
49174    slideRealIndex: slideRealIndex,
49175    direction: bothDirections ? undefined : 'next',
49176    initial: initial
49177  });
49178}
49179function loopFix() {
49180  var _ref6 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
49181    slideRealIndex = _ref6.slideRealIndex,
49182    _ref6$slideTo = _ref6.slideTo,
49183    slideTo = _ref6$slideTo === void 0 ? true : _ref6$slideTo,
49184    direction = _ref6.direction,
49185    setTranslate = _ref6.setTranslate,
49186    activeSlideIndex = _ref6.activeSlideIndex,
49187    initial = _ref6.initial,
49188    byController = _ref6.byController,
49189    byMousewheel = _ref6.byMousewheel;
49190  var swiper = this;
49191  if (!swiper.params.loop) return;
49192  swiper.emit('beforeLoopFix');
49193  var slides = swiper.slides,
49194    allowSlidePrev = swiper.allowSlidePrev,
49195    allowSlideNext = swiper.allowSlideNext,
49196    slidesEl = swiper.slidesEl,
49197    params = swiper.params;
49198  var centeredSlides = params.centeredSlides,
49199    slidesOffsetBefore = params.slidesOffsetBefore,
49200    slidesOffsetAfter = params.slidesOffsetAfter,
49201    initialSlide = params.initialSlide;
49202  var bothDirections = centeredSlides || !!slidesOffsetBefore || !!slidesOffsetAfter;
49203  swiper.allowSlidePrev = true;
49204  swiper.allowSlideNext = true;
49205  if (swiper.virtual && params.virtual.enabled) {
49206    if (slideTo) {
49207      if (!bothDirections && swiper.snapIndex === 0) {
49208        swiper.slideTo(swiper.virtual.slides.length, 0, false, true);
49209      } else if (bothDirections && swiper.snapIndex < params.slidesPerView) {
49210        swiper.slideTo(swiper.virtual.slides.length + swiper.snapIndex, 0, false, true);
49211      } else if (swiper.snapIndex === swiper.snapGrid.length - 1) {
49212        swiper.slideTo(swiper.virtual.slidesBefore, 0, false, true);
49213      }
49214    }
49215    swiper.allowSlidePrev = allowSlidePrev;
49216    swiper.allowSlideNext = allowSlideNext;
49217    swiper.emit('loopFix');
49218    return;
49219  }
49220  var slidesPerView = params.slidesPerView;
49221  if (slidesPerView === 'auto') {
49222    slidesPerView = swiper.slidesPerViewDynamic();
49223  } else {
49224    slidesPerView = Math.ceil(parseFloat(params.slidesPerView, 10));
49225    if (bothDirections && slidesPerView % 2 === 0) {
49226      slidesPerView = slidesPerView + 1;
49227    }
49228  }
49229  var slidesPerGroup = params.slidesPerGroupAuto ? slidesPerView : params.slidesPerGroup;
49230  var loopedSlides = bothDirections ? Math.max(slidesPerGroup, Math.ceil(slidesPerView / 2)) : slidesPerGroup;
49231  if (loopedSlides % slidesPerGroup !== 0) {
49232    loopedSlides += slidesPerGroup - loopedSlides % slidesPerGroup;
49233  }
49234  loopedSlides += params.loopAdditionalSlides;
49235  swiper.loopedSlides = loopedSlides;
49236  var gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;
49237  if (slides.length < slidesPerView + loopedSlides || swiper.params.effect === 'cards' && slides.length < slidesPerView + loopedSlides * 2) {
49238    (0, _utils.v)('Swiper Loop Warning: The number of slides is not enough for loop mode, it will be disabled or not function properly. You need to add more slides (or make duplicates) or lower the values of slidesPerView and slidesPerGroup parameters');
49239  } else if (gridEnabled && params.grid.fill === 'row') {
49240    (0, _utils.v)('Swiper Loop Warning: Loop mode is not compatible with grid.fill = `row`');
49241  }
49242  var prependSlidesIndexes = [];
49243  var appendSlidesIndexes = [];
49244  var cols = gridEnabled ? Math.ceil(slides.length / params.grid.rows) : slides.length;
49245  var isInitialOverflow = initial && cols - initialSlide < slidesPerView && !bothDirections;
49246  var activeIndex = isInitialOverflow ? initialSlide : swiper.activeIndex;
49247  if (typeof activeSlideIndex === 'undefined') {
49248    activeSlideIndex = swiper.getSlideIndex(slides.find(function (el) {
49249      return el.classList.contains(params.slideActiveClass);
49250    }));
49251  } else {
49252    activeIndex = activeSlideIndex;
49253  }
49254  var isNext = direction === 'next' || !direction;
49255  var isPrev = direction === 'prev' || !direction;
49256  var slidesPrepended = 0;
49257  var slidesAppended = 0;
49258  var activeColIndex = gridEnabled ? slides[activeSlideIndex].column : activeSlideIndex;
49259  var activeColIndexWithShift = activeColIndex + (bothDirections && typeof setTranslate === 'undefined' ? -slidesPerView / 2 + 0.5 : 0);
49260  // prepend last slides before start
49261  if (activeColIndexWithShift < loopedSlides) {
49262    slidesPrepended = Math.max(loopedSlides - activeColIndexWithShift, slidesPerGroup);
49263    for (var i = 0; i < loopedSlides - activeColIndexWithShift; i += 1) {
49264      var index = i - Math.floor(i / cols) * cols;
49265      if (gridEnabled) {
49266        var colIndexToPrepend = cols - index - 1;
49267        for (var _i6 = slides.length - 1; _i6 >= 0; _i6 -= 1) {
49268          if (slides[_i6].column === colIndexToPrepend) prependSlidesIndexes.push(_i6);
49269        }
49270        // slides.forEach((slide, slideIndex) => {
49271        //   if (slide.column === colIndexToPrepend) prependSlidesIndexes.push(slideIndex);
49272        // });
49273      } else {
49274        prependSlidesIndexes.push(cols - index - 1);
49275      }
49276    }
49277  } else if (activeColIndexWithShift + slidesPerView > cols - loopedSlides) {
49278    slidesAppended = Math.max(activeColIndexWithShift - (cols - loopedSlides * 2), slidesPerGroup);
49279    if (isInitialOverflow) {
49280      slidesAppended = Math.max(slidesAppended, slidesPerView - cols + initialSlide + 1);
49281    }
49282    var _loop = function _loop() {
49283      var index = _i7 - Math.floor(_i7 / cols) * cols;
49284      if (gridEnabled) {
49285        slides.forEach(function (slide, slideIndex) {
49286          if (slide.column === index) appendSlidesIndexes.push(slideIndex);
49287        });
49288      } else {
49289        appendSlidesIndexes.push(index);
49290      }
49291    };
49292    for (var _i7 = 0; _i7 < slidesAppended; _i7 += 1) {
49293      _loop();
49294    }
49295  }
49296  swiper.__preventObserver__ = true;
49297  requestAnimationFrame(function () {
49298    swiper.__preventObserver__ = false;
49299  });
49300  if (swiper.params.effect === 'cards' && slides.length < slidesPerView + loopedSlides * 2) {
49301    if (appendSlidesIndexes.includes(activeSlideIndex)) {
49302      appendSlidesIndexes.splice(appendSlidesIndexes.indexOf(activeSlideIndex), 1);
49303    }
49304    if (prependSlidesIndexes.includes(activeSlideIndex)) {
49305      prependSlidesIndexes.splice(prependSlidesIndexes.indexOf(activeSlideIndex), 1);
49306    }
49307  }
49308  if (isPrev) {
49309    prependSlidesIndexes.forEach(function (index) {
49310      slides[index].swiperLoopMoveDOM = true;
49311      slidesEl.prepend(slides[index]);
49312      slides[index].swiperLoopMoveDOM = false;
49313    });
49314  }
49315  if (isNext) {
49316    appendSlidesIndexes.forEach(function (index) {
49317      slides[index].swiperLoopMoveDOM = true;
49318      slidesEl.append(slides[index]);
49319      slides[index].swiperLoopMoveDOM = false;
49320    });
49321  }
49322  swiper.recalcSlides();
49323  if (params.slidesPerView === 'auto') {
49324    swiper.updateSlides();
49325  } else if (gridEnabled && (prependSlidesIndexes.length > 0 && isPrev || appendSlidesIndexes.length > 0 && isNext)) {
49326    swiper.slides.forEach(function (slide, slideIndex) {
49327      swiper.grid.updateSlide(slideIndex, slide, swiper.slides);
49328    });
49329  }
49330  if (params.watchSlidesProgress) {
49331    swiper.updateSlidesOffset();
49332  }
49333  if (slideTo) {
49334    if (prependSlidesIndexes.length > 0 && isPrev) {
49335      if (typeof slideRealIndex === 'undefined') {
49336        var currentSlideTranslate = swiper.slidesGrid[activeIndex];
49337        var newSlideTranslate = swiper.slidesGrid[activeIndex + slidesPrepended];
49338        var diff = newSlideTranslate - currentSlideTranslate;
49339        if (byMousewheel) {
49340          swiper.setTranslate(swiper.translate - diff);
49341        } else {
49342          swiper.slideTo(activeIndex + Math.ceil(slidesPrepended), 0, false, true);
49343          if (setTranslate) {
49344            swiper.touchEventsData.startTranslate = swiper.touchEventsData.startTranslate - diff;
49345            swiper.touchEventsData.currentTranslate = swiper.touchEventsData.currentTranslate - diff;
49346          }
49347        }
49348      } else {
49349        if (setTranslate) {
49350          var shift = gridEnabled ? prependSlidesIndexes.length / params.grid.rows : prependSlidesIndexes.length;
49351          swiper.slideTo(swiper.activeIndex + shift, 0, false, true);
49352          swiper.touchEventsData.currentTranslate = swiper.translate;
49353        }
49354      }
49355    } else if (appendSlidesIndexes.length > 0 && isNext) {
49356      if (typeof slideRealIndex === 'undefined') {
49357        var _currentSlideTranslate = swiper.slidesGrid[activeIndex];
49358        var _newSlideTranslate = swiper.slidesGrid[activeIndex - slidesAppended];
49359        var _diff = _newSlideTranslate - _currentSlideTranslate;
49360        if (byMousewheel) {
49361          swiper.setTranslate(swiper.translate - _diff);
49362        } else {
49363          swiper.slideTo(activeIndex - slidesAppended, 0, false, true);
49364          if (setTranslate) {
49365            swiper.touchEventsData.startTranslate = swiper.touchEventsData.startTranslate - _diff;
49366            swiper.touchEventsData.currentTranslate = swiper.touchEventsData.currentTranslate - _diff;
49367          }
49368        }
49369      } else {
49370        var _shift = gridEnabled ? appendSlidesIndexes.length / params.grid.rows : appendSlidesIndexes.length;
49371        swiper.slideTo(swiper.activeIndex - _shift, 0, false, true);
49372      }
49373    }
49374  }
49375  swiper.allowSlidePrev = allowSlidePrev;
49376  swiper.allowSlideNext = allowSlideNext;
49377  if (swiper.controller && swiper.controller.control && !byController) {
49378    var loopParams = {
49379      slideRealIndex: slideRealIndex,
49380      direction: direction,
49381      setTranslate: setTranslate,
49382      activeSlideIndex: activeSlideIndex,
49383      byController: true
49384    };
49385    if (Array.isArray(swiper.controller.control)) {
49386      swiper.controller.control.forEach(function (c) {
49387        if (!c.destroyed && c.params.loop) c.loopFix(_objectSpread(_objectSpread({}, loopParams), {}, {
49388          slideTo: c.params.slidesPerView === params.slidesPerView ? slideTo : false
49389        }));
49390      });
49391    } else if (swiper.controller.control instanceof swiper.constructor && swiper.controller.control.params.loop) {
49392      swiper.controller.control.loopFix(_objectSpread(_objectSpread({}, loopParams), {}, {
49393        slideTo: swiper.controller.control.params.slidesPerView === params.slidesPerView ? slideTo : false
49394      }));
49395    }
49396  }
49397  swiper.emit('loopFix');
49398}
49399function loopDestroy() {
49400  var swiper = this;
49401  var params = swiper.params,
49402    slidesEl = swiper.slidesEl;
49403  if (!params.loop || !slidesEl || swiper.virtual && swiper.params.virtual.enabled) return;
49404  swiper.recalcSlides();
49405  var newSlidesOrder = [];
49406  swiper.slides.forEach(function (slideEl) {
49407    var index = typeof slideEl.swiperSlideIndex === 'undefined' ? slideEl.getAttribute('data-swiper-slide-index') * 1 : slideEl.swiperSlideIndex;
49408    newSlidesOrder[index] = slideEl;
49409  });
49410  swiper.slides.forEach(function (slideEl) {
49411    slideEl.removeAttribute('data-swiper-slide-index');
49412  });
49413  newSlidesOrder.forEach(function (slideEl) {
49414    slidesEl.append(slideEl);
49415  });
49416  swiper.recalcSlides();
49417  swiper.slideTo(swiper.realIndex, 0);
49418}
49419var loop = {
49420  loopCreate: loopCreate,
49421  loopFix: loopFix,
49422  loopDestroy: loopDestroy
49423};
49424function setGrabCursor(moving) {
49425  var swiper = this;
49426  if (!swiper.params.simulateTouch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) return;
49427  var el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl;
49428  if (swiper.isElement) {
49429    swiper.__preventObserver__ = true;
49430  }
49431  el.style.cursor = 'move';
49432  el.style.cursor = moving ? 'grabbing' : 'grab';
49433  if (swiper.isElement) {
49434    requestAnimationFrame(function () {
49435      swiper.__preventObserver__ = false;
49436    });
49437  }
49438}
49439function unsetGrabCursor() {
49440  var swiper = this;
49441  if (swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) {
49442    return;
49443  }
49444  if (swiper.isElement) {
49445    swiper.__preventObserver__ = true;
49446  }
49447  swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = '';
49448  if (swiper.isElement) {
49449    requestAnimationFrame(function () {
49450      swiper.__preventObserver__ = false;
49451    });
49452  }
49453}
49454var grabCursor = {
49455  setGrabCursor: setGrabCursor,
49456  unsetGrabCursor: unsetGrabCursor
49457};
49458
49459// Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd
49460function closestElement(selector) {
49461  var base = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this;
49462  function __closestFrom(el) {
49463    if (!el || el === (0, _ssrWindowEsm.g)() || el === (0, _ssrWindowEsm.a)()) return null;
49464    if (el.assignedSlot) el = el.assignedSlot;
49465    var found = el.closest(selector);
49466    if (!found && !el.getRootNode) {
49467      return null;
49468    }
49469    return found || __closestFrom(el.getRootNode().host);
49470  }
49471  return __closestFrom(base);
49472}
49473function preventEdgeSwipe(swiper, event, startX) {
49474  var window = (0, _ssrWindowEsm.a)();
49475  var params = swiper.params;
49476  var edgeSwipeDetection = params.edgeSwipeDetection;
49477  var edgeSwipeThreshold = params.edgeSwipeThreshold;
49478  if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)) {
49479    if (edgeSwipeDetection === 'prevent') {
49480      event.preventDefault();
49481      return true;
49482    }
49483    return false;
49484  }
49485  return true;
49486}
49487function onTouchStart(event) {
49488  var swiper = this;
49489  var document = (0, _ssrWindowEsm.g)();
49490  var e = event;
49491  if (e.originalEvent) e = e.originalEvent;
49492  var data = swiper.touchEventsData;
49493  if (e.type === 'pointerdown') {
49494    if (data.pointerId !== null && data.pointerId !== e.pointerId) {
49495      return;
49496    }
49497    data.pointerId = e.pointerId;
49498  } else if (e.type === 'touchstart' && e.targetTouches.length === 1) {
49499    data.touchId = e.targetTouches[0].identifier;
49500  }
49501  if (e.type === 'touchstart') {
49502    // don't proceed touch event
49503    preventEdgeSwipe(swiper, e, e.targetTouches[0].pageX);
49504    return;
49505  }
49506  var params = swiper.params,
49507    touches = swiper.touches,
49508    enabled = swiper.enabled;
49509  if (!enabled) return;
49510  if (!params.simulateTouch && e.pointerType === 'mouse') return;
49511  if (swiper.animating && params.preventInteractionOnTransition) {
49512    return;
49513  }
49514  if (!swiper.animating && params.cssMode && params.loop) {
49515    swiper.loopFix();
49516  }
49517  var targetEl = e.target;
49518  if (params.touchEventsTarget === 'wrapper') {
49519    if (!(0, _utils.w)(targetEl, swiper.wrapperEl)) return;
49520  }
49521  if ('which' in e && e.which === 3) return;
49522  if ('button' in e && e.button > 0) return;
49523  if (data.isTouched && data.isMoved) return;
49524
49525  // change target el for shadow root component
49526  var swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== '';
49527  // eslint-disable-next-line
49528  var eventPath = e.composedPath ? e.composedPath() : e.path;
49529  if (swipingClassHasValue && e.target && e.target.shadowRoot && eventPath) {
49530    targetEl = eventPath[0];
49531  }
49532  var noSwipingSelector = params.noSwipingSelector ? params.noSwipingSelector : ".".concat(params.noSwipingClass);
49533  var isTargetShadow = !!(e.target && e.target.shadowRoot);
49534
49535  // use closestElement for shadow root element to get the actual closest for nested shadow root element
49536  if (params.noSwiping && (isTargetShadow ? closestElement(noSwipingSelector, targetEl) : targetEl.closest(noSwipingSelector))) {
49537    swiper.allowClick = true;
49538    return;
49539  }
49540  if (params.swipeHandler) {
49541    if (!targetEl.closest(params.swipeHandler)) return;
49542  }
49543  touches.currentX = e.pageX;
49544  touches.currentY = e.pageY;
49545  var startX = touches.currentX;
49546  var startY = touches.currentY;
49547
49548  // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore
49549
49550  if (!preventEdgeSwipe(swiper, e, startX)) {
49551    return;
49552  }
49553  Object.assign(data, {
49554    isTouched: true,
49555    isMoved: false,
49556    allowTouchCallbacks: true,
49557    isScrolling: undefined,
49558    startMoving: undefined
49559  });
49560  touches.startX = startX;
49561  touches.startY = startY;
49562  data.touchStartTime = (0, _utils.h)();
49563  swiper.allowClick = true;
49564  swiper.updateSize();
49565  swiper.swipeDirection = undefined;
49566  if (params.threshold > 0) data.allowThresholdMove = false;
49567  var preventDefault = true;
49568  if (targetEl.matches(data.focusableElements)) {
49569    preventDefault = false;
49570    if (targetEl.nodeName === 'SELECT') {
49571      data.isTouched = false;
49572    }
49573  }
49574  if (document.activeElement && document.activeElement.matches(data.focusableElements) && document.activeElement !== targetEl && (e.pointerType === 'mouse' || e.pointerType !== 'mouse' && !targetEl.matches(data.focusableElements))) {
49575    document.activeElement.blur();
49576  }
49577  var shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;
49578  if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !targetEl.isContentEditable) {
49579    e.preventDefault();
49580  }
49581  if (params.freeMode && params.freeMode.enabled && swiper.freeMode && swiper.animating && !params.cssMode) {
49582    swiper.freeMode.onTouchStart();
49583  }
49584  swiper.emit('touchStart', e);
49585}
49586function onTouchMove(event) {
49587  var document = (0, _ssrWindowEsm.g)();
49588  var swiper = this;
49589  var data = swiper.touchEventsData;
49590  var params = swiper.params,
49591    touches = swiper.touches,
49592    rtl = swiper.rtlTranslate,
49593    enabled = swiper.enabled;
49594  if (!enabled) return;
49595  if (!params.simulateTouch && event.pointerType === 'mouse') return;
49596  var e = event;
49597  if (e.originalEvent) e = e.originalEvent;
49598  if (e.type === 'pointermove') {
49599    if (data.touchId !== null) return; // return from pointer if we use touch
49600    var id = e.pointerId;
49601    if (id !== data.pointerId) return;
49602  }
49603  var targetTouch;
49604  if (e.type === 'touchmove') {
49605    targetTouch = (0, _toConsumableArray2["default"])(e.changedTouches).find(function (t) {
49606      return t.identifier === data.touchId;
49607    });
49608    if (!targetTouch || targetTouch.identifier !== data.touchId) return;
49609  } else {
49610    targetTouch = e;
49611  }
49612  if (!data.isTouched) {
49613    if (data.startMoving && data.isScrolling) {
49614      swiper.emit('touchMoveOpposite', e);
49615    }
49616    return;
49617  }
49618  var pageX = targetTouch.pageX;
49619  var pageY = targetTouch.pageY;
49620  if (e.preventedByNestedSwiper) {
49621    touches.startX = pageX;
49622    touches.startY = pageY;
49623    return;
49624  }
49625  if (!swiper.allowTouchMove) {
49626    if (!e.target.matches(data.focusableElements)) {
49627      swiper.allowClick = false;
49628    }
49629    if (data.isTouched) {
49630      Object.assign(touches, {
49631        startX: pageX,
49632        startY: pageY,
49633        currentX: pageX,
49634        currentY: pageY
49635      });
49636      data.touchStartTime = (0, _utils.h)();
49637    }
49638    return;
49639  }
49640  if (params.touchReleaseOnEdges && !params.loop) {
49641    if (swiper.isVertical()) {
49642      // Vertical
49643      if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) {
49644        data.isTouched = false;
49645        data.isMoved = false;
49646        return;
49647      }
49648    } else if (rtl && (pageX > touches.startX && -swiper.translate <= swiper.maxTranslate() || pageX < touches.startX && -swiper.translate >= swiper.minTranslate())) {
49649      return;
49650    } else if (!rtl && (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate())) {
49651      return;
49652    }
49653  }
49654  if (document.activeElement && document.activeElement.matches(data.focusableElements) && document.activeElement !== e.target && e.pointerType !== 'mouse') {
49655    document.activeElement.blur();
49656  }
49657  if (document.activeElement) {
49658    if (e.target === document.activeElement && e.target.matches(data.focusableElements)) {
49659      data.isMoved = true;
49660      swiper.allowClick = false;
49661      return;
49662    }
49663  }
49664  if (data.allowTouchCallbacks) {
49665    swiper.emit('touchMove', e);
49666  }
49667  touches.previousX = touches.currentX;
49668  touches.previousY = touches.currentY;
49669  touches.currentX = pageX;
49670  touches.currentY = pageY;
49671  var diffX = touches.currentX - touches.startX;
49672  var diffY = touches.currentY - touches.startY;
49673  if (swiper.params.threshold && Math.sqrt(Math.pow(diffX, 2) + Math.pow(diffY, 2)) < swiper.params.threshold) return;
49674  if (typeof data.isScrolling === 'undefined') {
49675    var touchAngle;
49676    if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) {
49677      data.isScrolling = false;
vendor: 3,840 bytes, lines 49678-49781
49678    } else {
49679      // eslint-disable-next-line
49680      if (diffX * diffX + diffY * diffY >= 25) {
49681        touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI;
49682        data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle;
49683      }
49684    }
49685  }
49686  if (data.isScrolling) {
49687    swiper.emit('touchMoveOpposite', e);
49688  }
49689  if (typeof data.startMoving === 'undefined') {
49690    if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {
49691      data.startMoving = true;
49692    }
49693  }
49694  if (data.isScrolling || e.type === 'touchmove' && data.preventTouchMoveFromPointerMove) {
49695    data.isTouched = false;
49696    return;
49697  }
49698  if (!data.startMoving) {
49699    return;
49700  }
49701  swiper.allowClick = false;
49702  if (!params.cssMode && e.cancelable) {
49703    e.preventDefault();
49704  }
49705  if (params.touchMoveStopPropagation && !params.nested) {
49706    e.stopPropagation();
49707  }
49708  var diff = swiper.isHorizontal() ? diffX : diffY;
49709  var touchesDiff = swiper.isHorizontal() ? touches.currentX - touches.previousX : touches.currentY - touches.previousY;
49710  if (params.oneWayMovement) {
49711    diff = Math.abs(diff) * (rtl ? 1 : -1);
49712    touchesDiff = Math.abs(touchesDiff) * (rtl ? 1 : -1);
49713  }
49714  touches.diff = diff;
49715  diff *= params.touchRatio;
49716  if (rtl) {
49717    diff = -diff;
49718    touchesDiff = -touchesDiff;
49719  }
49720  var prevTouchesDirection = swiper.touchesDirection;
49721  swiper.swipeDirection = diff > 0 ? 'prev' : 'next';
49722  swiper.touchesDirection = touchesDiff > 0 ? 'prev' : 'next';
49723  var isLoop = swiper.params.loop && !params.cssMode;
49724  var allowLoopFix = swiper.touchesDirection === 'next' && swiper.allowSlideNext || swiper.touchesDirection === 'prev' && swiper.allowSlidePrev;
49725  if (!data.isMoved) {
49726    if (isLoop && allowLoopFix) {
49727      swiper.loopFix({
49728        direction: swiper.swipeDirection
49729      });
49730    }
49731    data.startTranslate = swiper.getTranslate();
49732    swiper.setTransition(0);
49733    if (swiper.animating) {
49734      var evt = new window.CustomEvent('transitionend', {
49735        bubbles: true,
49736        cancelable: true,
49737        detail: {
49738          bySwiperTouchMove: true
49739        }
49740      });
49741      swiper.wrapperEl.dispatchEvent(evt);
49742    }
49743    data.allowMomentumBounce = false;
49744    // Grab Cursor
49745    if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
49746      swiper.setGrabCursor(true);
49747    }
49748    swiper.emit('sliderFirstMove', e);
49749  }
49750  var loopFixed;
49751  new Date().getTime();
49752  if (params._loopSwapReset !== false && data.isMoved && data.allowThresholdMove && prevTouchesDirection !== swiper.touchesDirection && isLoop && allowLoopFix && Math.abs(diff) >= 1) {
49753    Object.assign(touches, {
49754      startX: pageX,
49755      startY: pageY,
49756      currentX: pageX,
49757      currentY: pageY,
49758      startTranslate: data.currentTranslate
49759    });
49760    data.loopSwapReset = true;
49761    data.startTranslate = data.currentTranslate;
49762    return;
49763  }
49764  swiper.emit('sliderMove', e);
49765  data.isMoved = true;
49766  data.currentTranslate = diff + data.startTranslate;
49767  var disableParentSwiper = true;
49768  var resistanceRatio = params.resistanceRatio;
49769  if (params.touchReleaseOnEdges) {
49770    resistanceRatio = 0;
49771  }
49772  if (diff > 0) {
49773    if (isLoop && allowLoopFix && !loopFixed && data.allowThresholdMove && data.currentTranslate > (params.centeredSlides ? swiper.minTranslate() - swiper.slidesSizesGrid[swiper.activeIndex + 1] - (params.slidesPerView !== 'auto' && swiper.slides.length - params.slidesPerView >= 2 ? swiper.slidesSizesGrid[swiper.activeIndex + 1] + swiper.params.spaceBetween : 0) - swiper.params.spaceBetween : swiper.minTranslate())) {
49774      swiper.loopFix({
49775        direction: 'prev',
49776        setTranslate: true,
49777        activeSlideIndex: 0
49778      });
49779    }
49780    if (data.currentTranslate > swiper.minTranslate()) {
49781      disableParentSwiper = false;
49782      if (params.resistance) {
49783        data.currentTranslate = swiper.minTranslate() - 1 + Math.pow(-swiper.minTranslate() + data.startTranslate + diff, resistanceRatio);
49784      }
49785    }
49786  } else if (diff < 0) {
49787    if (isLoop && allowLoopFix && !loopFixed && data.allowThresholdMove && data.currentTranslate < (params.centeredSlides ? swiper.maxTranslate() + swiper.slidesSizesGrid[swiper.slidesSizesGrid.length - 1] + swiper.params.spaceBetween + (params.slidesPerView !== 'auto' && swiper.slides.length - params.slidesPerView >= 2 ? swiper.slidesSizesGrid[swiper.slidesSizesGrid.length - 1] + swiper.params.spaceBetween : 0) : swiper.maxTranslate())) {
49788      swiper.loopFix({
49789        direction: 'next',
49790        setTranslate: true,
49791        activeSlideIndex: swiper.slides.length - (params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(params.slidesPerView, 10)))
49792      });
49793    }
49794    if (data.currentTranslate < swiper.maxTranslate()) {
49795      disableParentSwiper = false;
49796      if (params.resistance) {
49797        data.currentTranslate = swiper.maxTranslate() + 1 - Math.pow(swiper.maxTranslate() - data.startTranslate - diff, resistanceRatio);
49798      }
49799    }
49800  }
49801  if (disableParentSwiper) {
49802    e.preventedByNestedSwiper = true;
49803  }
49804
49805  // Directions locks
49806  if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {
49807    data.currentTranslate = data.startTranslate;
49808  }
49809  if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {
49810    data.currentTranslate = data.startTranslate;
49811  }
49812  if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {
49813    data.currentTranslate = data.startTranslate;
49814  }
49815
49816  // Threshold
49817  if (params.threshold > 0) {
49818    if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {
49819      if (!data.allowThresholdMove) {
49820        data.allowThresholdMove = true;
49821        touches.startX = touches.currentX;
49822        touches.startY = touches.currentY;
49823        data.currentTranslate = data.startTranslate;
49824        touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;
49825        return;
49826      }
49827    } else {
49828      data.currentTranslate = data.startTranslate;
49829      return;
49830    }
49831  }
49832  if (!params.followFinger || params.cssMode) return;
49833
49834  // Update active index in free mode
49835  if (params.freeMode && params.freeMode.enabled && swiper.freeMode || params.watchSlidesProgress) {
49836    swiper.updateActiveIndex();
49837    swiper.updateSlidesClasses();
49838  }
49839  if (params.freeMode && params.freeMode.enabled && swiper.freeMode) {
49840    swiper.freeMode.onTouchMove();
49841  }
49842  // Update progress
49843  swiper.updateProgress(data.currentTranslate);
49844  // Update translate
49845  swiper.setTranslate(data.currentTranslate);
49846}
49847function onTouchEnd(event) {
49848  var swiper = this;
49849  var data = swiper.touchEventsData;
49850  var e = event;
49851  if (e.originalEvent) e = e.originalEvent;
49852  var targetTouch;
49853  var isTouchEvent = e.type === 'touchend' || e.type === 'touchcancel';
49854  if (!isTouchEvent) {
49855    if (data.touchId !== null) return; // return from pointer if we use touch
49856    if (e.pointerId !== data.pointerId) return;
49857    targetTouch = e;
49858  } else {
49859    targetTouch = (0, _toConsumableArray2["default"])(e.changedTouches).find(function (t) {
49860      return t.identifier === data.touchId;
49861    });
49862    if (!targetTouch || targetTouch.identifier !== data.touchId) return;
49863  }
49864  if (['pointercancel', 'pointerout', 'pointerleave', 'contextmenu'].includes(e.type)) {
49865    var proceed = ['pointercancel', 'contextmenu'].includes(e.type) && (swiper.browser.isSafari || swiper.browser.isWebView);
49866    if (!proceed) {
49867      return;
49868    }
49869  }
49870  data.pointerId = null;
49871  data.touchId = null;
49872  var params = swiper.params,
49873    touches = swiper.touches,
49874    rtl = swiper.rtlTranslate,
49875    slidesGrid = swiper.slidesGrid,
49876    enabled = swiper.enabled;
49877  if (!enabled) return;
49878  if (!params.simulateTouch && e.pointerType === 'mouse') return;
49879  if (data.allowTouchCallbacks) {
49880    swiper.emit('touchEnd', e);
49881  }
49882  data.allowTouchCallbacks = false;
49883  if (!data.isTouched) {
49884    if (data.isMoved && params.grabCursor) {
49885      swiper.setGrabCursor(false);
49886    }
49887    data.isMoved = false;
49888    data.startMoving = false;
49889    return;
49890  }
49891
49892  // Return Grab Cursor
49893  if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
49894    swiper.setGrabCursor(false);
49895  }
49896
49897  // Time diff
49898  var touchEndTime = (0, _utils.h)();
49899  var timeDiff = touchEndTime - data.touchStartTime;
49900
49901  // Tap, doubleTap, Click
49902  if (swiper.allowClick) {
49903    var pathTree = e.path || e.composedPath && e.composedPath();
49904    swiper.updateClickedSlide(pathTree && pathTree[0] || e.target, pathTree);
49905    swiper.emit('tap click', e);
49906    if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {
49907      swiper.emit('doubleTap doubleClick', e);
49908    }
49909  }
49910  data.lastClickTime = (0, _utils.h)();
49911  (0, _utils.n)(function () {
49912    if (!swiper.destroyed) swiper.allowClick = true;
49913  });
49914  if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 && !data.loopSwapReset || data.currentTranslate === data.startTranslate && !data.loopSwapReset) {
49915    data.isTouched = false;
49916    data.isMoved = false;
49917    data.startMoving = false;
49918    return;
49919  }
49920  data.isTouched = false;
49921  data.isMoved = false;
49922  data.startMoving = false;
49923  var currentPos;
49924  if (params.followFinger) {
49925    currentPos = rtl ? swiper.translate : -swiper.translate;
49926  } else {
49927    currentPos = -data.currentTranslate;
49928  }
49929  if (params.cssMode) {
49930    return;
49931  }
49932  if (params.freeMode && params.freeMode.enabled) {
49933    swiper.freeMode.onTouchEnd({
49934      currentPos: currentPos
49935    });
49936    return;
49937  }
49938
49939  // Find current slide
49940  var swipeToLast = currentPos >= -swiper.maxTranslate() && !swiper.params.loop;
49941  var stopIndex = 0;
49942  var groupSize = swiper.slidesSizesGrid[0];
49943  for (var i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) {
49944    var _increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;
49945    if (typeof slidesGrid[i + _increment] !== 'undefined') {
49946      if (swipeToLast || currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + _increment]) {
49947        stopIndex = i;
49948        groupSize = slidesGrid[i + _increment] - slidesGrid[i];
49949      }
49950    } else if (swipeToLast || currentPos >= slidesGrid[i]) {
49951      stopIndex = i;
49952      groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];
49953    }
49954  }
49955  var rewindFirstIndex = null;
49956  var rewindLastIndex = null;
49957  if (params.rewind) {
49958    if (swiper.isBeginning) {
49959      rewindLastIndex = params.virtual && params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;
49960    } else if (swiper.isEnd) {
49961      rewindFirstIndex = 0;
49962    }
49963  }
49964  // Find current slide size
49965  var ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;
49966  var increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;
49967  if (timeDiff > params.longSwipesMs) {
49968    // Long touches
49969    if (!params.longSwipes) {
49970      swiper.slideTo(swiper.activeIndex);
49971      return;
49972    }
49973    if (swiper.swipeDirection === 'next') {
49974      if (ratio >= params.longSwipesRatio) swiper.slideTo(params.rewind && swiper.isEnd ? rewindFirstIndex : stopIndex + increment);else swiper.slideTo(stopIndex);
49975    }
49976    if (swiper.swipeDirection === 'prev') {
49977      if (ratio > 1 - params.longSwipesRatio) {
49978        swiper.slideTo(stopIndex + increment);
49979      } else if (rewindLastIndex !== null && ratio < 0 && Math.abs(ratio) > params.longSwipesRatio) {
49980        swiper.slideTo(rewindLastIndex);
49981      } else {
49982        swiper.slideTo(stopIndex);
49983      }
49984    }
49985  } else {
49986    // Short swipes
49987    if (!params.shortSwipes) {
49988      swiper.slideTo(swiper.activeIndex);
49989      return;
49990    }
49991    var isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);
49992    if (!isNavButtonTarget) {
49993      if (swiper.swipeDirection === 'next') {
49994        swiper.slideTo(rewindFirstIndex !== null ? rewindFirstIndex : stopIndex + increment);
49995      }
49996      if (swiper.swipeDirection === 'prev') {
49997        swiper.slideTo(rewindLastIndex !== null ? rewindLastIndex : stopIndex);
49998      }
49999    } else if (e.target === swiper.navigation.nextEl) {
50000      swiper.slideTo(stopIndex + increment);
50001    } else {
50002      swiper.slideTo(stopIndex);
50003    }
50004  }
50005}
50006function onResize() {
50007  var swiper = this;
50008  var params = swiper.params,
50009    el = swiper.el;
50010  if (el && el.offsetWidth === 0) return;
50011
50012  // Breakpoints
50013  if (params.breakpoints) {
50014    swiper.setBreakpoint();
50015  }
50016
50017  // Save locks
50018  var allowSlideNext = swiper.allowSlideNext,
50019    allowSlidePrev = swiper.allowSlidePrev,
50020    snapGrid = swiper.snapGrid;
50021  var isVirtual = swiper.virtual && swiper.params.virtual.enabled;
50022
50023  // Disable locks on resize
50024  swiper.allowSlideNext = true;
50025  swiper.allowSlidePrev = true;
50026  swiper.updateSize();
50027  swiper.updateSlides();
50028  swiper.updateSlidesClasses();
50029  var isVirtualLoop = isVirtual && params.loop;
50030  if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.isBeginning && !swiper.params.centeredSlides && !isVirtualLoop) {
50031    var slides = isVirtual ? swiper.virtual.slides : swiper.slides;
50032    swiper.slideTo(slides.length - 1, 0, false, true);
50033  } else {
50034    if (swiper.params.loop && !isVirtual) {
50035      swiper.slideToLoop(swiper.realIndex, 0, false, true);
50036    } else {
50037      swiper.slideTo(swiper.activeIndex, 0, false, true);
50038    }
50039  }
50040  if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {
50041    clearTimeout(swiper.autoplay.resizeTimeout);
50042    swiper.autoplay.resizeTimeout = setTimeout(function () {
50043      if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {
50044        swiper.autoplay.resume();
50045      }
50046    }, 500);
50047  }
50048  // Return locks after resize
50049  swiper.allowSlidePrev = allowSlidePrev;
50050  swiper.allowSlideNext = allowSlideNext;
50051  if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {
50052    swiper.checkOverflow();
50053  }
50054}
50055function onClick(e) {
50056  var swiper = this;
50057  if (!swiper.enabled) return;
50058  if (!swiper.allowClick) {
50059    if (swiper.params.preventClicks) e.preventDefault();
50060    if (swiper.params.preventClicksPropagation && swiper.animating) {
50061      e.stopPropagation();
50062      e.stopImmediatePropagation();
50063    }
50064  }
50065}
50066function onScroll() {
50067  var swiper = this;
50068  var wrapperEl = swiper.wrapperEl,
50069    rtlTranslate = swiper.rtlTranslate,
50070    enabled = swiper.enabled;
50071  if (!enabled) return;
50072  swiper.previousTranslate = swiper.translate;
50073  if (swiper.isHorizontal()) {
50074    swiper.translate = -wrapperEl.scrollLeft;
50075  } else {
50076    swiper.translate = -wrapperEl.scrollTop;
50077  }
50078  // eslint-disable-next-line
50079  if (swiper.translate === 0) swiper.translate = 0;
50080  swiper.updateActiveIndex();
50081  swiper.updateSlidesClasses();
50082  var newProgress;
50083  var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
50084  if (translatesDiff === 0) {
50085    newProgress = 0;
50086  } else {
50087    newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff;
50088  }
50089  if (newProgress !== swiper.progress) {
50090    swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);
50091  }
50092  swiper.emit('setTranslate', swiper.translate, false);
50093}
50094function onLoad(e) {
50095  var swiper = this;
50096  processLazyPreloader(swiper, e.target);
50097  if (swiper.params.cssMode || swiper.params.slidesPerView !== 'auto' && !swiper.params.autoHeight) {
50098    return;
50099  }
50100  swiper.update();
50101}
50102function onDocumentTouchStart() {
50103  var swiper = this;
50104  if (swiper.documentTouchHandlerProceeded) return;
50105  swiper.documentTouchHandlerProceeded = true;
50106  if (swiper.params.touchReleaseOnEdges) {
50107    swiper.el.style.touchAction = 'auto';
50108  }
50109}
50110var events = function events(swiper, method) {
50111  var document = (0, _ssrWindowEsm.g)();
50112  var params = swiper.params,
50113    el = swiper.el,
50114    wrapperEl = swiper.wrapperEl,
50115    device = swiper.device;
50116  var capture = !!params.nested;
50117  var domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';
50118  var swiperMethod = method;
50119  if (!el || typeof el === 'string') return;
50120
50121  // Touch Events
50122  document[domMethod]('touchstart', swiper.onDocumentTouchStart, {
50123    passive: false,
50124    capture: capture
50125  });
50126  el[domMethod]('touchstart', swiper.onTouchStart, {
50127    passive: false
50128  });
50129  el[domMethod]('pointerdown', swiper.onTouchStart, {
50130    passive: false
50131  });
50132  document[domMethod]('touchmove', swiper.onTouchMove, {
50133    passive: false,
50134    capture: capture
50135  });
50136  document[domMethod]('pointermove', swiper.onTouchMove, {
50137    passive: false,
50138    capture: capture
50139  });
50140  document[domMethod]('touchend', swiper.onTouchEnd, {
50141    passive: true
50142  });
50143  document[domMethod]('pointerup', swiper.onTouchEnd, {
50144    passive: true
50145  });
50146  document[domMethod]('pointercancel', swiper.onTouchEnd, {
50147    passive: true
50148  });
50149  document[domMethod]('touchcancel', swiper.onTouchEnd, {
50150    passive: true
50151  });
50152  document[domMethod]('pointerout', swiper.onTouchEnd, {
50153    passive: true
50154  });
50155  document[domMethod]('pointerleave', swiper.onTouchEnd, {
50156    passive: true
50157  });
50158  document[domMethod]('contextmenu', swiper.onTouchEnd, {
50159    passive: true
50160  });
50161
50162  // Prevent Links Clicks
50163  if (params.preventClicks || params.preventClicksPropagation) {
50164    el[domMethod]('click', swiper.onClick, true);
50165  }
50166  if (params.cssMode) {
50167    wrapperEl[domMethod]('scroll', swiper.onScroll);
50168  }
50169
50170  // Resize handler
50171  if (params.updateOnWindowResize) {
50172    swiper[swiperMethod](device.ios || device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate', onResize, true);
50173  } else {
50174    swiper[swiperMethod]('observerUpdate', onResize, true);
50175  }
50176
50177  // Images loader
50178  el[domMethod]('load', swiper.onLoad, {
50179    capture: true
50180  });
50181};
50182function attachEvents() {
50183  var swiper = this;
50184  var params = swiper.params;
50185  swiper.onTouchStart = onTouchStart.bind(swiper);
50186  swiper.onTouchMove = onTouchMove.bind(swiper);
50187  swiper.onTouchEnd = onTouchEnd.bind(swiper);
50188  swiper.onDocumentTouchStart = onDocumentTouchStart.bind(swiper);
50189  if (params.cssMode) {
50190    swiper.onScroll = onScroll.bind(swiper);
50191  }
50192  swiper.onClick = onClick.bind(swiper);
50193  swiper.onLoad = onLoad.bind(swiper);
50194  events(swiper, 'on');
50195}
50196function detachEvents() {
50197  var swiper = this;
50198  events(swiper, 'off');
50199}
50200var events$1 = {
50201  attachEvents: attachEvents,
50202  detachEvents: detachEvents
50203};
50204var isGridEnabled = function isGridEnabled(swiper, params) {
50205  return swiper.grid && params.grid && params.grid.rows > 1;
50206};
50207function setBreakpoint() {
50208  var swiper = this;
50209  var realIndex = swiper.realIndex,
50210    initialized = swiper.initialized,
50211    params = swiper.params,
50212    el = swiper.el;
50213  var breakpoints = params.breakpoints;
50214  if (!breakpoints || breakpoints && Object.keys(breakpoints).length === 0) return;
50215  var document = (0, _ssrWindowEsm.g)();
50216
50217  // Get breakpoint for window/container width and update parameters
50218  var breakpointsBase = params.breakpointsBase === 'window' || !params.breakpointsBase ? params.breakpointsBase : 'container';
50219  var breakpointContainer = ['window', 'container'].includes(params.breakpointsBase) || !params.breakpointsBase ? swiper.el : document.querySelector(params.breakpointsBase);
50220  var breakpoint = swiper.getBreakpoint(breakpoints, breakpointsBase, breakpointContainer);
50221  if (!breakpoint || swiper.currentBreakpoint === breakpoint) return;
50222  var breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;
50223  var breakpointParams = breakpointOnlyParams || swiper.originalParams;
50224  var wasMultiRow = isGridEnabled(swiper, params);
50225  var isMultiRow = isGridEnabled(swiper, breakpointParams);
50226  var wasGrabCursor = swiper.params.grabCursor;
50227  var isGrabCursor = breakpointParams.grabCursor;
50228  var wasEnabled = params.enabled;
50229  if (wasMultiRow && !isMultiRow) {
50230    el.classList.remove("".concat(params.containerModifierClass, "grid"), "".concat(params.containerModifierClass, "grid-column"));
50231    swiper.emitContainerClasses();
50232  } else if (!wasMultiRow && isMultiRow) {
50233    el.classList.add("".concat(params.containerModifierClass, "grid"));
50234    if (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column' || !breakpointParams.grid.fill && params.grid.fill === 'column') {
50235      el.classList.add("".concat(params.containerModifierClass, "grid-column"));
50236    }
50237    swiper.emitContainerClasses();
50238  }
50239  if (wasGrabCursor && !isGrabCursor) {
50240    swiper.unsetGrabCursor();
50241  } else if (!wasGrabCursor && isGrabCursor) {
50242    swiper.setGrabCursor();
50243  }
50244
50245  // Toggle navigation, pagination, scrollbar
50246  ['navigation', 'pagination', 'scrollbar'].forEach(function (prop) {
50247    if (typeof breakpointParams[prop] === 'undefined') return;
50248    var wasModuleEnabled = params[prop] && params[prop].enabled;
50249    var isModuleEnabled = breakpointParams[prop] && breakpointParams[prop].enabled;
50250    if (wasModuleEnabled && !isModuleEnabled) {
50251      swiper[prop].disable();
50252    }
50253    if (!wasModuleEnabled && isModuleEnabled) {
50254      swiper[prop].enable();
50255    }
50256  });
50257  var directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;
50258  var needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);
50259  var wasLoop = params.loop;
50260  if (directionChanged && initialized) {
50261    swiper.changeDirection();
50262  }
50263  (0, _utils.x)(swiper.params, breakpointParams);
50264  var isEnabled = swiper.params.enabled;
50265  var hasLoop = swiper.params.loop;
50266  Object.assign(swiper, {
50267    allowTouchMove: swiper.params.allowTouchMove,
50268    allowSlideNext: swiper.params.allowSlideNext,
50269    allowSlidePrev: swiper.params.allowSlidePrev
50270  });
50271  if (wasEnabled && !isEnabled) {
50272    swiper.disable();
50273  } else if (!wasEnabled && isEnabled) {
50274    swiper.enable();
50275  }
50276  swiper.currentBreakpoint = breakpoint;
50277  swiper.emit('_beforeBreakpoint', breakpointParams);
50278  if (initialized) {
50279    if (needsReLoop) {
50280      swiper.loopDestroy();
50281      swiper.loopCreate(realIndex);
50282      swiper.updateSlides();
50283    } else if (!wasLoop && hasLoop) {
50284      swiper.loopCreate(realIndex);
50285      swiper.updateSlides();
50286    } else if (wasLoop && !hasLoop) {
50287      swiper.loopDestroy();
50288    }
50289  }
50290  swiper.emit('breakpoint', breakpointParams);
50291}
50292function getBreakpoint(breakpoints) {
50293  var base = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'window';
50294  var containerEl = arguments.length > 2 ? arguments[2] : undefined;
50295  if (!breakpoints || base === 'container' && !containerEl) return undefined;
50296  var breakpoint = false;
50297  var window = (0, _ssrWindowEsm.a)();
50298  var currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight;
50299  var points = Object.keys(breakpoints).map(function (point) {
50300    if (typeof point === 'string' && point.indexOf('@') === 0) {
50301      var minRatio = parseFloat(point.substr(1));
50302      var value = currentHeight * minRatio;
50303      return {
50304        value: value,
50305        point: point
50306      };
50307    }
50308    return {
50309      value: point,
50310      point: point
50311    };
50312  });
50313  points.sort(function (a, b) {
50314    return parseInt(a.value, 10) - parseInt(b.value, 10);
50315  });
50316  for (var i = 0; i < points.length; i += 1) {
50317    var _points$i = points[i],
50318      point = _points$i.point,
50319      value = _points$i.value;
50320    if (base === 'window') {
50321      if (window.matchMedia("(min-width: ".concat(value, "px)")).matches) {
50322        breakpoint = point;
50323      }
50324    } else if (value <= containerEl.clientWidth) {
50325      breakpoint = point;
50326    }
50327  }
50328  return breakpoint || 'max';
50329}
50330var breakpoints = {
50331  setBreakpoint: setBreakpoint,
50332  getBreakpoint: getBreakpoint
50333};
50334function prepareClasses(entries, prefix) {
50335  var resultClasses = [];
50336  entries.forEach(function (item) {
50337    if ((0, _typeof2["default"])(item) === 'object') {
50338      Object.keys(item).forEach(function (classNames) {
50339        if (item[classNames]) {
50340          resultClasses.push(prefix + classNames);
50341        }
50342      });
50343    } else if (typeof item === 'string') {
50344      resultClasses.push(prefix + item);
50345    }
50346  });
50347  return resultClasses;
50348}
50349function addClasses() {
50350  var _el$classList;
50351  var swiper = this;
50352  var classNames = swiper.classNames,
50353    params = swiper.params,
50354    rtl = swiper.rtl,
50355    el = swiper.el,
50356    device = swiper.device;
50357  // prettier-ignore
50358  var suffixes = prepareClasses(['initialized', params.direction, {
50359    'free-mode': swiper.params.freeMode && params.freeMode.enabled
50360  }, {
50361    'autoheight': params.autoHeight
50362  }, {
50363    'rtl': rtl
50364  }, {
50365    'grid': params.grid && params.grid.rows > 1
50366  }, {
50367    'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column'
50368  }, {
50369    'android': device.android
50370  }, {
50371    'ios': device.ios
50372  }, {
50373    'css-mode': params.cssMode
50374  }, {
50375    'centered': params.cssMode && params.centeredSlides
50376  }, {
50377    'watch-progress': params.watchSlidesProgress
50378  }], params.containerModifierClass);
50379  classNames.push.apply(classNames, (0, _toConsumableArray2["default"])(suffixes));
50380  (_el$classList = el.classList).add.apply(_el$classList, (0, _toConsumableArray2["default"])(classNames));
50381  swiper.emitContainerClasses();
50382}
50383function removeClasses() {
50384  var _el$classList2;
50385  var swiper = this;
50386  var el = swiper.el,
50387    classNames = swiper.classNames;
50388  if (!el || typeof el === 'string') return;
50389  (_el$classList2 = el.classList).remove.apply(_el$classList2, (0, _toConsumableArray2["default"])(classNames));
50390  swiper.emitContainerClasses();
50391}
50392var classes = {
50393  addClasses: addClasses,
50394  removeClasses: removeClasses
50395};
50396function checkOverflow() {
50397  var swiper = this;
50398  var wasLocked = swiper.isLocked,
50399    params = swiper.params;
50400  var slidesOffsetBefore = params.slidesOffsetBefore;
50401  if (slidesOffsetBefore) {
50402    var lastSlideIndex = swiper.slides.length - 1;
50403    var lastSlideRightEdge = swiper.slidesGrid[lastSlideIndex] + swiper.slidesSizesGrid[lastSlideIndex] + slidesOffsetBefore * 2;
50404    swiper.isLocked = swiper.size > lastSlideRightEdge;
50405  } else {
50406    swiper.isLocked = swiper.snapGrid.length === 1;
50407  }
50408  if (params.allowSlideNext === true) {
50409    swiper.allowSlideNext = !swiper.isLocked;
50410  }
50411  if (params.allowSlidePrev === true) {
50412    swiper.allowSlidePrev = !swiper.isLocked;
50413  }
50414  if (wasLocked && wasLocked !== swiper.isLocked) {
50415    swiper.isEnd = false;
50416  }
50417  if (wasLocked !== swiper.isLocked) {
50418    swiper.emit(swiper.isLocked ? 'lock' : 'unlock');
50419  }
50420}
50421var checkOverflow$1 = {
50422  checkOverflow: checkOverflow
50423};
50424var defaults = exports.d = {
50425  init: true,
50426  direction: 'horizontal',
50427  oneWayMovement: false,
50428  swiperElementNodeName: 'SWIPER-CONTAINER',
50429  touchEventsTarget: 'wrapper',
50430  initialSlide: 0,
50431  speed: 300,
50432  cssMode: false,
50433  updateOnWindowResize: true,
50434  resizeObserver: true,
50435  nested: false,
50436  createElements: false,
50437  eventsPrefix: 'swiper',
50438  enabled: true,
50439  focusableElements: 'input, select, option, textarea, button, video, label',
50440  // Overrides
50441  width: null,
50442  height: null,
50443  //
50444  preventInteractionOnTransition: false,
50445  // ssr
50446  userAgent: null,
50447  url: null,
50448  // To support iOS's swipe-to-go-back gesture (when being used in-app).
50449  edgeSwipeDetection: false,
50450  edgeSwipeThreshold: 20,
50451  // Autoheight
50452  autoHeight: false,
50453  // Set wrapper width
50454  setWrapperSize: false,
50455  // Virtual Translate
50456  virtualTranslate: false,
50457  // Effects
50458  effect: 'slide',
50459  // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'
50460
50461  // Breakpoints
50462  breakpoints: undefined,
50463  breakpointsBase: 'window',
50464  // Slides grid
50465  spaceBetween: 0,
50466  slidesPerView: 1,
50467  slidesPerGroup: 1,
50468  slidesPerGroupSkip: 0,
50469  slidesPerGroupAuto: false,
50470  centeredSlides: false,
50471  centeredSlidesBounds: false,
50472  slidesOffsetBefore: 0,
50473  // in px
50474  slidesOffsetAfter: 0,
50475  // in px
50476  normalizeSlideIndex: true,
50477  centerInsufficientSlides: false,
50478  snapToSlideEdge: false,
50479  // Disable swiper and hide navigation when container not overflow
50480  watchOverflow: true,
50481  // Round length
50482  roundLengths: false,
50483  // Touches
50484  touchRatio: 1,
50485  touchAngle: 45,
50486  simulateTouch: true,
50487  shortSwipes: true,
50488  longSwipes: true,
50489  longSwipesRatio: 0.5,
50490  longSwipesMs: 300,
50491  followFinger: true,
50492  allowTouchMove: true,
50493  threshold: 5,
50494  touchMoveStopPropagation: false,
50495  touchStartPreventDefault: true,
50496  touchStartForcePreventDefault: false,
50497  touchReleaseOnEdges: false,
50498  // Unique Navigation Elements
50499  uniqueNavElements: true,
50500  // Resistance
50501  resistance: true,
50502  resistanceRatio: 0.85,
50503  // Progress
50504  watchSlidesProgress: false,
50505  // Cursor
50506  grabCursor: false,
50507  // Clicks
50508  preventClicks: true,
50509  preventClicksPropagation: true,
50510  slideToClickedSlide: false,
50511  // loop
50512  loop: false,
50513  loopAddBlankSlides: true,
50514  loopAdditionalSlides: 0,
50515  loopPreventsSliding: true,
50516  // rewind
50517  rewind: false,
50518  // Swiping/no swiping
50519  allowSlidePrev: true,
50520  allowSlideNext: true,
50521  swipeHandler: null,
50522  // '.swipe-handler',
50523  noSwiping: true,
50524  noSwipingClass: 'swiper-no-swiping',
50525  noSwipingSelector: null,
50526  // Passive Listeners
50527  passiveListeners: true,
50528  maxBackfaceHiddenSlides: 10,
50529  // NS
50530  containerModifierClass: 'swiper-',
50531  // NEW
50532  slideClass: 'swiper-slide',
50533  slideBlankClass: 'swiper-slide-blank',
50534  slideActiveClass: 'swiper-slide-active',
50535  slideVisibleClass: 'swiper-slide-visible',
50536  slideFullyVisibleClass: 'swiper-slide-fully-visible',
50537  slideNextClass: 'swiper-slide-next',
50538  slidePrevClass: 'swiper-slide-prev',
50539  wrapperClass: 'swiper-wrapper',
50540  lazyPreloaderClass: 'swiper-lazy-preloader',
50541  lazyPreloadPrevNext: 0,
50542  // Callbacks
50543  runCallbacksOnInit: true,
50544  // Internals
50545  _emitClasses: false
50546};
50547function moduleExtendParams(params, allModulesParams) {
50548  return function extendParams() {
50549    var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
50550    var moduleParamName = Object.keys(obj)[0];
50551    var moduleParams = obj[moduleParamName];
50552    if ((0, _typeof2["default"])(moduleParams) !== 'object' || moduleParams === null) {
50553      (0, _utils.x)(allModulesParams, obj);
50554      return;
50555    }
50556    if (params[moduleParamName] === true) {
50557      params[moduleParamName] = {
50558        enabled: true
50559      };
50560    }
50561    if (moduleParamName === 'navigation' && params[moduleParamName] && params[moduleParamName].enabled && !params[moduleParamName].prevEl && !params[moduleParamName].nextEl) {
50562      params[moduleParamName].auto = true;
50563    }
50564    if (['pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 && params[moduleParamName] && params[moduleParamName].enabled && !params[moduleParamName].el) {
50565      params[moduleParamName].auto = true;
50566    }
50567    if (!(moduleParamName in params && 'enabled' in moduleParams)) {
50568      (0, _utils.x)(allModulesParams, obj);
50569      return;
50570    }
50571    if ((0, _typeof2["default"])(params[moduleParamName]) === 'object' && !('enabled' in params[moduleParamName])) {
50572      params[moduleParamName].enabled = true;
50573    }
50574    if (!params[moduleParamName]) params[moduleParamName] = {
50575      enabled: false
50576    };
50577    (0, _utils.x)(allModulesParams, obj);
50578  };
50579}
50580
50581/* eslint no-param-reassign: "off" */
50582var prototypes = {
50583  eventsEmitter: eventsEmitter,
50584  update: update,
50585  translate: translate,
50586  transition: transition,
50587  slide: slide,
50588  loop: loop,
50589  grabCursor: grabCursor,
50590  events: events$1,
50591  breakpoints: breakpoints,
50592  checkOverflow: checkOverflow$1,
50593  classes: classes
50594};
50595var extendedDefaults = {};
50596var Swiper = exports.S = /*#__PURE__*/function () {
50597  function Swiper() {
50598    (0, _classCallCheck2["default"])(this, Swiper);
50599    var el;
50600    var params;
50601    for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
50602      args[_key3] = arguments[_key3];
50603    }
50604    if (args.length === 1 && args[0].constructor && Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object') {
50605      params = args[0];
50606    } else {
50607      el = args[0];
50608      params = args[1];
50609    }
50610    if (!params) params = {};
50611    params = (0, _utils.x)({}, params);
50612    if (el && !params.el) params.el = el;
50613    var document = (0, _ssrWindowEsm.g)();
50614    if (params.el && typeof params.el === 'string' && document.querySelectorAll(params.el).length > 1) {
50615      var swipers = [];
50616      document.querySelectorAll(params.el).forEach(function (containerEl) {
50617        var newParams = (0, _utils.x)({}, params, {
50618          el: containerEl
50619        });
50620        swipers.push(new Swiper(newParams));
50621      });
50622      // eslint-disable-next-line no-constructor-return
50623      return swipers;
50624    }
50625
50626    // Swiper Instance
50627    var swiper = this;
50628    swiper.__swiper__ = true;
50629    swiper.support = getSupport();
50630    swiper.device = getDevice({
50631      userAgent: params.userAgent
50632    });
50633    swiper.browser = getBrowser();
50634    swiper.eventsListeners = {};
50635    swiper.eventsAnyListeners = [];
50636    swiper.modules = (0, _toConsumableArray2["default"])(swiper.__modules__);
50637    if (params.modules && Array.isArray(params.modules)) {
50638      params.modules.forEach(function (mod) {
50639        if (typeof mod === 'function' && swiper.modules.indexOf(mod) < 0) {
50640          swiper.modules.push(mod);
50641        }
50642      });
50643    }
50644    var allModulesParams = {};
50645    swiper.modules.forEach(function (mod) {
50646      mod({
50647        params: params,
50648        swiper: swiper,
50649        extendParams: moduleExtendParams(params, allModulesParams),
50650        on: swiper.on.bind(swiper),
50651        once: swiper.once.bind(swiper),
50652        off: swiper.off.bind(swiper),
50653        emit: swiper.emit.bind(swiper)
50654      });
50655    });
50656
50657    // Extend defaults with modules params
50658    var swiperParams = (0, _utils.x)({}, defaults, allModulesParams);
50659
50660    // Extend defaults with passed params
50661    swiper.params = (0, _utils.x)({}, swiperParams, extendedDefaults, params);
50662    swiper.originalParams = (0, _utils.x)({}, swiper.params);
50663    swiper.passedParams = (0, _utils.x)({}, params);
50664
50665    // add event listeners
50666    if (swiper.params && swiper.params.on) {
50667      Object.keys(swiper.params.on).forEach(function (eventName) {
50668        swiper.on(eventName, swiper.params.on[eventName]);
50669      });
50670    }
50671    if (swiper.params && swiper.params.onAny) {
50672      swiper.onAny(swiper.params.onAny);
50673    }
50674
50675    // Extend Swiper
50676    Object.assign(swiper, {
50677      enabled: swiper.params.enabled,
50678      el: el,
50679      // Classes
50680      classNames: [],
50681      // Slides
50682      slides: [],
50683      slidesGrid: [],
50684      snapGrid: [],
50685      slidesSizesGrid: [],
50686      // isDirection
50687      isHorizontal: function isHorizontal() {
50688        return swiper.params.direction === 'horizontal';
50689      },
50690      isVertical: function isVertical() {
50691        return swiper.params.direction === 'vertical';
50692      },
50693      // Indexes
50694      activeIndex: 0,
50695      realIndex: 0,
50696      //
50697      isBeginning: true,
50698      isEnd: false,
50699      // Props
50700      translate: 0,
50701      previousTranslate: 0,
50702      progress: 0,
50703      velocity: 0,
50704      animating: false,
50705      cssOverflowAdjustment: function cssOverflowAdjustment() {
50706        // Returns 0 unless `translate` is > 2**23
50707        // Should be subtracted from css values to prevent overflow
50708        return Math.trunc(this.translate / Math.pow(2, 23)) * Math.pow(2, 23);
50709      },
50710      // Locks
50711      allowSlideNext: swiper.params.allowSlideNext,
50712      allowSlidePrev: swiper.params.allowSlidePrev,
50713      // Touch Events
50714      touchEventsData: {
50715        isTouched: undefined,
50716        isMoved: undefined,
50717        allowTouchCallbacks: undefined,
50718        touchStartTime: undefined,
50719        isScrolling: undefined,
50720        currentTranslate: undefined,
50721        startTranslate: undefined,
50722        allowThresholdMove: undefined,
50723        // Form elements to match
50724        focusableElements: swiper.params.focusableElements,
50725        // Last click time
50726        lastClickTime: 0,
50727        clickTimeout: undefined,
50728        // Velocities
50729        velocities: [],
50730        allowMomentumBounce: undefined,
50731        startMoving: undefined,
50732        pointerId: null,
50733        touchId: null
50734      },
50735      // Clicks
50736      allowClick: true,
50737      // Touches
50738      allowTouchMove: swiper.params.allowTouchMove,
50739      touches: {
50740        startX: 0,
50741        startY: 0,
50742        currentX: 0,
50743        currentY: 0,
50744        diff: 0
50745      },
50746      // Images
50747      imagesToLoad: [],
50748      imagesLoaded: 0
50749    });
50750    swiper.emit('_swiper');
50751
50752    // Init
50753    if (swiper.params.init) {
50754      swiper.init();
50755    }
50756
50757    // Return app instance
50758    // eslint-disable-next-line no-constructor-return
50759    return swiper;
50760  }
50761  return (0, _createClass2["default"])(Swiper, [{
50762    key: "getDirectionLabel",
50763    value: function getDirectionLabel(property) {
50764      if (this.isHorizontal()) {
50765        return property;
50766      }
50767      // prettier-ignore
50768      return {
50769        'width': 'height',
50770        'margin-top': 'margin-left',
50771        'margin-bottom ': 'margin-right',
50772        'margin-left': 'margin-top',
50773        'margin-right': 'margin-bottom',
50774        'padding-left': 'padding-top',
50775        'padding-right': 'padding-bottom',
50776        'marginRight': 'marginBottom'
50777      }[property];
50778    }
50779  }, {
50780    key: "getSlideIndex",
50781    value: function getSlideIndex(slideEl) {
50782      var slidesEl = this.slidesEl,
50783        params = this.params;
50784      var slides = (0, _utils.e)(slidesEl, ".".concat(params.slideClass, ", swiper-slide"));
50785      var firstSlideIndex = (0, _utils.j)(slides[0]);
50786      return (0, _utils.j)(slideEl) - firstSlideIndex;
50787    }
50788  }, {
50789    key: "getSlideIndexByData",
50790    value: function getSlideIndexByData(index) {
50791      return this.getSlideIndex(this.slides.find(function (slideEl) {
50792        return slideEl.getAttribute('data-swiper-slide-index') * 1 === index;
50793      }));
50794    }
50795  }, {
50796    key: "getSlideIndexWhenGrid",
50797    value: function getSlideIndexWhenGrid(index) {
50798      if (this.grid && this.params.grid && this.params.grid.rows > 1) {
50799        if (this.params.grid.fill === 'column') {
50800          index = Math.floor(index / this.params.grid.rows);
50801        } else if (this.params.grid.fill === 'row') {
50802          index = index % Math.ceil(this.slides.length / this.params.grid.rows);
50803        }
50804      }
50805      return index;
50806    }
50807  }, {
50808    key: "recalcSlides",
50809    value: function recalcSlides() {
50810      var swiper = this;
50811      var slidesEl = swiper.slidesEl,
50812        params = swiper.params;
50813      swiper.slides = (0, _utils.e)(slidesEl, ".".concat(params.slideClass, ", swiper-slide"));
50814    }
50815  }, {
50816    key: "enable",
50817    value: function enable() {
50818      var swiper = this;
50819      if (swiper.enabled) return;
50820      swiper.enabled = true;
50821      if (swiper.params.grabCursor) {
50822        swiper.setGrabCursor();
50823      }
50824      swiper.emit('enable');
50825    }
50826  }, {
50827    key: "disable",
50828    value: function disable() {
50829      var swiper = this;
50830      if (!swiper.enabled) return;
50831      swiper.enabled = false;
50832      if (swiper.params.grabCursor) {
50833        swiper.unsetGrabCursor();
50834      }
50835      swiper.emit('disable');
50836    }
50837  }, {
50838    key: "setProgress",
50839    value: function setProgress(progress, speed) {
50840      var swiper = this;
50841      progress = Math.min(Math.max(progress, 0), 1);
50842      var min = swiper.minTranslate();
50843      var max = swiper.maxTranslate();
50844      var current = (max - min) * progress + min;
50845      swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed);
50846      swiper.updateActiveIndex();
50847      swiper.updateSlidesClasses();
50848    }
50849  }, {
50850    key: "emitContainerClasses",
50851    value: function emitContainerClasses() {
50852      var swiper = this;
50853      if (!swiper.params._emitClasses || !swiper.el) return;
50854      var cls = swiper.el.className.split(' ').filter(function (className) {
50855        return className.indexOf('swiper') === 0 || className.indexOf(swiper.params.containerModifierClass) === 0;
50856      });
50857      swiper.emit('_containerClasses', cls.join(' '));
50858    }
50859  }, {
50860    key: "getSlideClasses",
50861    value: function getSlideClasses(slideEl) {
50862      var swiper = this;
50863      if (swiper.destroyed) return '';
50864      return slideEl.className.split(' ').filter(function (className) {
50865        return className.indexOf('swiper-slide') === 0 || className.indexOf(swiper.params.slideClass) === 0;
50866      }).join(' ');
50867    }
50868  }, {
50869    key: "emitSlidesClasses",
50870    value: function emitSlidesClasses() {
50871      var swiper = this;
50872      if (!swiper.params._emitClasses || !swiper.el) return;
50873      var updates = [];
50874      swiper.slides.forEach(function (slideEl) {
50875        var classNames = swiper.getSlideClasses(slideEl);
50876        updates.push({
50877          slideEl: slideEl,
50878          classNames: classNames
50879        });
50880        swiper.emit('_slideClass', slideEl, classNames);
50881      });
50882      swiper.emit('_slideClasses', updates);
50883    }
50884  }, {
50885    key: "slidesPerViewDynamic",
50886    value: function slidesPerViewDynamic() {
50887      var view = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'current';
50888      var exact = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
50889      var swiper = this;
50890      var params = swiper.params,
50891        slides = swiper.slides,
50892        slidesGrid = swiper.slidesGrid,
50893        slidesSizesGrid = swiper.slidesSizesGrid,
50894        swiperSize = swiper.size,
50895        activeIndex = swiper.activeIndex;
50896      var spv = 1;
50897      if (typeof params.slidesPerView === 'number') return params.slidesPerView;
50898      if (params.centeredSlides) {
50899        var slideSize = slides[activeIndex] ? Math.ceil(slides[activeIndex].swiperSlideSize) : 0;
50900        var breakLoop;
50901        for (var i = activeIndex + 1; i < slides.length; i += 1) {
50902          if (slides[i] && !breakLoop) {
50903            slideSize += Math.ceil(slides[i].swiperSlideSize);
50904            spv += 1;
50905            if (slideSize > swiperSize) breakLoop = true;
50906          }
50907        }
50908        for (var _i8 = activeIndex - 1; _i8 >= 0; _i8 -= 1) {
50909          if (slides[_i8] && !breakLoop) {
50910            slideSize += slides[_i8].swiperSlideSize;
50911            spv += 1;
50912            if (slideSize > swiperSize) breakLoop = true;
50913          }
50914        }
50915      } else {
50916        // eslint-disable-next-line
50917        if (view === 'current') {
50918          for (var _i9 = activeIndex + 1; _i9 < slides.length; _i9 += 1) {
50919            var slideInView = exact ? slidesGrid[_i9] + slidesSizesGrid[_i9] - slidesGrid[activeIndex] < swiperSize : slidesGrid[_i9] - slidesGrid[activeIndex] < swiperSize;
50920            if (slideInView) {
50921              spv += 1;
50922            }
50923          }
50924        } else {
50925          // previous
50926          for (var _i0 = activeIndex - 1; _i0 >= 0; _i0 -= 1) {
50927            var _slideInView = slidesGrid[activeIndex] - slidesGrid[_i0] < swiperSize;
50928            if (_slideInView) {
50929              spv += 1;
50930            }
50931          }
50932        }
50933      }
50934      return spv;
50935    }
50936  }, {
50937    key: "update",
50938    value: function update() {
50939      var swiper = this;
50940      if (!swiper || swiper.destroyed) return;
50941      var snapGrid = swiper.snapGrid,
50942        params = swiper.params;
50943      // Breakpoints
50944      if (params.breakpoints) {
50945        swiper.setBreakpoint();
50946      }
50947      (0, _toConsumableArray2["default"])(swiper.el.querySelectorAll('[loading="lazy"]')).forEach(function (imageEl) {
50948        if (imageEl.complete) {
50949          processLazyPreloader(swiper, imageEl);
50950        }
50951      });
50952      swiper.updateSize();
50953      swiper.updateSlides();
50954      swiper.updateProgress();
50955      swiper.updateSlidesClasses();
50956      function setTranslate() {
50957        var translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;
50958        var newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());
50959        swiper.setTranslate(newTranslate);
50960        swiper.updateActiveIndex();
50961        swiper.updateSlidesClasses();
50962      }
50963      var translated;
50964      if (params.freeMode && params.freeMode.enabled && !params.cssMode) {
50965        setTranslate();
50966        if (params.autoHeight) {
50967          swiper.updateAutoHeight();
50968        }
50969      } else {
50970        if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !params.centeredSlides) {
50971          var slides = swiper.virtual && params.virtual.enabled ? swiper.virtual.slides : swiper.slides;
50972          translated = swiper.slideTo(slides.length - 1, 0, false, true);
50973        } else {
50974          translated = swiper.slideTo(swiper.activeIndex, 0, false, true);
50975        }
50976        if (!translated) {
50977          setTranslate();
50978        }
50979      }
50980      if (params.watchOverflow && snapGrid !== swiper.snapGrid) {
50981        swiper.checkOverflow();
50982      }
50983      swiper.emit('update');
50984    }
50985  }, {
50986    key: "changeDirection",
50987    value: function changeDirection(newDirection) {
50988      var needUpdate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
50989      var swiper = this;
50990      var currentDirection = swiper.params.direction;
50991      if (!newDirection) {
50992        // eslint-disable-next-line
50993        newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';
50994      }
50995      if (newDirection === currentDirection || newDirection !== 'horizontal' && newDirection !== 'vertical') {
50996        return swiper;
50997      }
50998      swiper.el.classList.remove("".concat(swiper.params.containerModifierClass).concat(currentDirection));
50999      swiper.el.classList.add("".concat(swiper.params.containerModifierClass).concat(newDirection));
51000      swiper.emitContainerClasses();
51001      swiper.params.direction = newDirection;
51002      swiper.slides.forEach(function (slideEl) {
51003        if (newDirection === 'vertical') {
51004          slideEl.style.width = '';
51005        } else {
51006          slideEl.style.height = '';
51007        }
51008      });
51009      swiper.emit('changeDirection');
51010      if (needUpdate) swiper.update();
51011      return swiper;
51012    }
51013  }, {
51014    key: "changeLanguageDirection",
51015    value: function changeLanguageDirection(direction) {
51016      var swiper = this;
51017      if (swiper.rtl && direction === 'rtl' || !swiper.rtl && direction === 'ltr') return;
51018      swiper.rtl = direction === 'rtl';
51019      swiper.rtlTranslate = swiper.params.direction === 'horizontal' && swiper.rtl;
51020      if (swiper.rtl) {
51021        swiper.el.classList.add("".concat(swiper.params.containerModifierClass, "rtl"));
51022        swiper.el.dir = 'rtl';
51023      } else {
51024        swiper.el.classList.remove("".concat(swiper.params.containerModifierClass, "rtl"));
51025        swiper.el.dir = 'ltr';
51026      }
51027      swiper.update();
51028    }
51029  }, {
51030    key: "mount",
51031    value: function mount(element) {
51032      var swiper = this;
51033      if (swiper.mounted) return true;
51034
51035      // Find el
51036      var el = element || swiper.params.el;
51037      if (typeof el === 'string') {
51038        el = document.querySelector(el);
51039      }
51040      if (!el) {
51041        return false;
51042      }
51043      el.swiper = swiper;
51044      if (el.parentNode && el.parentNode.host && el.parentNode.host.nodeName === swiper.params.swiperElementNodeName.toUpperCase()) {
51045        swiper.isElement = true;
51046      }
51047      var getWrapperSelector = function getWrapperSelector() {
51048        return ".".concat((swiper.params.wrapperClass || '').trim().split(' ').join('.'));
51049      };
51050      var getWrapper = function getWrapper() {
51051        if (el && el.shadowRoot && el.shadowRoot.querySelector) {
51052          var res = el.shadowRoot.querySelector(getWrapperSelector());
51053          // Children needs to return slot items
51054          return res;
51055        }
51056        return (0, _utils.e)(el, getWrapperSelector())[0];
51057      };
51058      // Find Wrapper
51059      var wrapperEl = getWrapper();
51060      if (!wrapperEl && swiper.params.createElements) {
51061        wrapperEl = (0, _utils.c)('div', swiper.params.wrapperClass);
51062        el.append(wrapperEl);
51063        (0, _utils.e)(el, ".".concat(swiper.params.slideClass)).forEac
51063h(function (slideEl) {
51064          wrapperEl.append(slideEl);
51065        });
51066      }
51067      Object.assign(swiper, {
51068        el: el,
51069        wrapperEl: wrapperEl,
51070        slidesEl: swiper.isElement && !el.parentNode.host.slideSlots ? el.parentNode.host : wrapperEl,
51071        hostEl: swiper.isElement ? el.parentNode.host : el,
51072        mounted: true,
51073        // RTL
51074        rtl: el.dir.toLowerCase() === 'rtl' || (0, _utils.q)(el, 'direction') === 'rtl',
51075        rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || (0, _utils.q)(el, 'direction') === 'rtl'),
51076        wrongRTL: (0, _utils.q)(wrapperEl, 'display') === '-webkit-box'
51077      });
51078      return true;
51079    }
51080  }, {
51081    key: "init",
51082    value: function init(el) {
51083      var swiper = this;
51084      if (swiper.initialized) return swiper;
51085      var mounted = swiper.mount(el);
51086      if (mounted === false) return swiper;
51087      swiper.emit('beforeInit');
51088
51089      // Set breakpoint
51090      if (swiper.params.breakpoints) {
51091        swiper.setBreakpoint();
51092      }
51093
51094      // Add Classes
51095      swiper.addClasses();
51096
51097      // Update size
51098      swiper.updateSize();
51099
51100      // Update slides
51101      swiper.updateSlides();
51102      if (swiper.params.watchOverflow) {
51103        swiper.checkOverflow();
51104      }
51105
51106      // Set Grab Cursor
51107      if (swiper.params.grabCursor && swiper.enabled) {
51108        swiper.setGrabCursor();
51109      }
51110
51111      // Slide To Initial Slide
51112      if (swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) {
51113        swiper.slideTo(swiper.params.initialSlide + swiper.virtual.slidesBefore, 0, swiper.params.runCallbacksOnInit, false, true);
51114      } else {
51115        swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true);
51116      }
51117
51118      // Create loop
51119      if (swiper.params.loop) {
51120        swiper.loopCreate(undefined, true);
51121      }
51122
51123      // Attach events
51124      swiper.attachEvents();
51125      var lazyElements = (0, _toConsumableArray2["default"])(swiper.el.querySelectorAll('[loading="lazy"]'));
51126      if (swiper.isElement) {
51127        lazyElements.push.apply(lazyElements, (0, _toConsumableArray2["default"])(swiper.hostEl.querySelectorAll('[loading="lazy"]')));
51128      }
51129      lazyElements.forEach(function (imageEl) {
51130        if (imageEl.complete) {
51131          processLazyPreloader(swiper, imageEl);
51132        } else {
51133          imageEl.addEventListener('load', function (e) {
51134            processLazyPreloader(swiper, e.target);
51135          });
51136        }
51137      });
51138      preload(swiper);
51139
51140      // Init Flag
51141      swiper.initialized = true;
51142      preload(swiper);
51143
51144      // Emit
51145      swiper.emit('init');
51146      swiper.emit('afterInit');
51147      return swiper;
51148    }
51149  }, {
51150    key: "destroy",
51151    value: function destroy() {
51152      var deleteInstance = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
51153      var cleanStyles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
51154      var swiper = this;
51155      var params = swiper.params,
51156        el = swiper.el,
51157        wrapperEl = swiper.wrapperEl,
51158        slides = swiper.slides;
51159      if (typeof swiper.params === 'undefined' || swiper.destroyed) {
51160        return null;
51161      }
51162      swiper.emit('beforeDestroy');
51163
51164      // Init Flag
51165      swiper.initialized = false;
51166
51167      // Detach events
51168      swiper.detachEvents();
51169
51170      // Destroy loop
51171      if (params.loop) {
51172        swiper.loopDestroy();
51173      }
51174
51175      // Cleanup styles
51176      if (cleanStyles) {
51177        swiper.removeClasses();
51178        if (el && typeof el !== 'string') {
51179          el.removeAttribute('style');
51180        }
51181        if (wrapperEl) {
51182          wrapperEl.removeAttribute('style');
51183        }
51184        if (slides && slides.length) {
51185          slides.forEach(function (slideEl) {
51186            slideEl.classList.remove(params.slideVisibleClass, params.slideFullyVisibleClass, params.slideActiveClass, params.slideNextClass, params.slidePrevClass);
51187            slideEl.removeAttribute('style');
51188            slideEl.removeAttribute('data-swiper-slide-index');
51189          });
51190        }
51191      }
51192      swiper.emit('destroy');
51193
51194      // Detach emitter events
51195      Object.keys(swiper.eventsListeners).forEach(function (eventName) {
51196        swiper.off(eventName);
51197      });
51198      if (deleteInstance !== false) {
51199        if (swiper.el && typeof swiper.el !== 'string') {
51200          swiper.el.swiper = null;
51201        }
51202        (0, _utils.y)(swiper);
51203      }
51204      swiper.destroyed = true;
51205      return null;
51206    }
51207  }], [{
51208    key: "extendDefaults",
51209    value: function extendDefaults(newDefaults) {
51210      (0, _utils.x)(extendedDefaults, newDefaults);
51211    }
51212  }, {
51213    key: "extendedDefaults",
51214    get: function get() {
51215      return extendedDefaults;
51216    }
51217  }, {
51218    key: "defaults",
51219    get: function get() {
51220      return defaults;
51221    }
51222  }, {
51223    key: "installModule",
51224    value: function installModule(mod) {
51225      if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = [];
51226      var modules = Swiper.prototype.__modules__;
51227      if (typeof mod === 'function' && modules.indexOf(mod) < 0) {
51228        modules.push(mod);
51229      }
51230    }
51231  }, {
51232    key: "use",
51233    value: function use(module) {
51234      if (Array.isArray(module)) {
51235        module.forEach(function (m) {
51236          return Swiper.installModule(m);
51237        });
51238        return Swiper;
51239      }
51240      Swiper.installModule(module);
51241      return Swiper;
51242    }
51243  }]);
51244}();
51245Object.keys(prototypes).forEach(function (prototypeGroup) {
51246  Object.keys(prototypes[prototypeGroup]).forEach(function (protoMethod) {
51247    Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];
51248  });
51249});
51250Swiper.use([Resize, Observer]);
51251
51252},{"./ssr-window.esm.mjs":139,"./utils.mjs":141,"@babel/runtime/helpers/classCallCheck":96,"@babel/runtime/helpers/createClass":97,"@babel/runtime/helpers/defineProperty":98,"@babel/runtime/helpers/interopRequireDefault":99,"@babel/runtime/helpers/slicedToArray":104,"@babel/runtime/helpers/toConsumableArray":105,"@babel/runtime/helpers/typeof":108}],141:[function(require,module,exports){
51253"use strict";
51254
51255var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
51256Object.defineProperty(exports, "__esModule", {
51257  value: true
51258});
51259exports.a = getRotateFix;
51260exports.b = setCSSProperty;
51261exports.c = createElement;
51262exports.d = elementParents;
51263exports.e = elementChildren;
51264exports.f = elementOffset;
51265exports.g = getSlideTransformEl;
51266exports.h = now;
51267exports.i = elementOuterSize;
51268exports.j = elementIndex;
51269exports.k = classesToTokens;
51270exports.l = getTranslate;
51271exports.m = makeElementsArray;
51272exports.n = nextTick;
51273exports.o = elementTransitionEnd;
51274exports.p = isObject;
51275exports.q = elementStyle;
51276exports.r = elementNextAll;
51277exports.s = setInnerHTML;
51278exports.t = elementPrevAll;
51279exports.u = animateCSSModeScroll;
51280exports.v = showWarning;
51281exports.w = elementIsChildOf;
51282exports.x = extend;
51283exports.y = deleteProps;
51284var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
51285var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
51286var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
51287var _ssrWindowEsm = require("./ssr-window.esm.mjs");
51288function classesToTokens() {
51289  var classes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
51290  return classes.trim().split(' ').filter(function (c) {
51291    return !!c.trim();
51292  });
51293}
51294function deleteProps(obj) {
51295  var object = obj;
51296  Object.keys(object).forEach(function (key) {
51297    try {
51298      object[key] = null;
51299    } catch (e) {
51300      // no getter for object
51301    }
51302    try {
51303      delete object[key];
51304    } catch (e) {
51305      // something got wrong
51306    }
51307  });
51308}
51309function nextTick(callback) {
51310  var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
51311  return setTimeout(callback, delay);
51312}
51313function now() {
51314  return Date.now();
51315}
51316function getComputedStyle(el) {
51317  var window = (0, _ssrWindowEsm.a)();
51318  var style;
51319  if (window.getComputedStyle) {
51320    style = window.getComputedStyle(el, null);
51321  }
51322  if (!style && el.currentStyle) {
51323    style = el.currentStyle;
51324  }
51325  if (!style) {
51326    style = el.style;
51327  }
51328  return style;
51329}
51330function getTranslate(el) {
51331  var axis = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'x';
51332  var window = (0, _ssrWindowEsm.a)();
51333  var matrix;
51334  var curTransform;
51335  var transformMatrix;
51336  var curStyle = getComputedStyle(el);
51337  if (window.WebKitCSSMatrix) {
51338    curTransform = curStyle.transform || curStyle.webkitTransform;
51339    if (curTransform.split(',').length > 6) {
51340      curTransform = curTransform.split(', ').map(function (a) {
51341        return a.replace(',', '.');
51342      }).join(', ');
51343    }
51344    // Some old versions of Webkit choke when 'none' is passed; pass
51345    // empty string instead in this case
51346    transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);
51347  } else {
51348    transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');
51349    matrix = transformMatrix.toString().split(',');
51350  }
51351  if (axis === 'x') {
51352    // Latest Chrome and webkits Fix
51353    if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41;
51354    // Crazy IE10 Matrix
51355    else if (matrix.length === 16) curTransform = parseFloat(matrix[12]);
51356    // Normal Browsers
51357    else curTransform = parseFloat(matrix[4]);
51358  }
51359  if (axis === 'y') {
51360    // Latest Chrome and webkits Fix
51361    if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42;
51362    // Crazy IE10 Matrix
51363    else if (matrix.length === 16) curTransform = parseFloat(matrix[13]);
51364    // Normal Browsers
51365    else curTransform = parseFloat(matrix[5]);
51366  }
51367  return curTransform || 0;
51368}
51369function isObject(o) {
51370  return (0, _typeof2["default"])(o) === 'object' && o !== null && o.constructor && Ob
51370ject.prototype.toString.call(o).slice(8, -1) === 'Object';
51371}
51372function isNode(node) {
51373  // eslint-disable-next-line
51374  if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') {
51375    return node instanceof HTMLElement;
51376  }
51377  return node && (node.nodeType === 1 || node.nodeType === 11);
51378}
51379function extend() {
51380  var to = Object(arguments.length <= 0 ? undefined : arguments[0]);
51381  for (var i = 1; i < arguments.length; i += 1) {
51382    var nextSource = i < 0 || arguments.length <= i ? undefined : arguments[i];
51383    if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) {
51384      var keysArray = Object.keys(Object(nextSource)).filter(function (key) {
51385        return key !== '__proto__' && key !== 'constructor' && key !== 'prototype';
51386      });
51387      for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
51388        var nextKey = keysArray[nextIndex];
51389        var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
51390        if (desc !== undefined && desc.enumerable) {
51391          if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) {
51392            if (nextSource[nextKey].__swiper__) {
51393              to[nextKey] = nextSource[nextKey];
51394            } else {
51395              extend(to[nextKey], nextSource[nextKey]);
51396            }
51397          } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) {
51398            to[nextKey] = {};
51399            if (nextSource[nextKey].__swiper__) {
51400              to[nextKey] = nextSource[nextKey];
51401            } else {
51402              extend(to[nextKey], nextSource[nextKey]);
51403            }
51404          } else {
51405            to[nextKey] = nextSource[nextKey];
51406          }
51407        }
51408      }
51409    }
51410  }
51411  return to;
51412}
51413function setCSSProperty(el, varName, varValue) {
51414  el.style.setProperty(varName, varValue);
51415}
51416function animateCSSModeScroll(_ref) {
51417  var swiper = _ref.swiper,
51418    targetPosition = _ref.targetPosition,
51419    side = _ref.side;
51420  var window = (0, _ssrWindowEsm.a)();
51421  var startPosition = -swiper.translate;
51422  var startTime = null;
51423  var time;
51424  var duration = swiper.params.speed;
51425  swiper.wrapperEl.style.scrollSnapType = 'none';
51426  window.cancelAnimationFrame(swiper.cssModeFrameID);
51427  var dir = targetPosition > startPosition ? 'next' : 'prev';
51428  var isOutOfBound = function isOutOfBound(current, target) {
51429    return dir === 'next' && current >= target || dir === 'prev' && current <= target;
51430  };
51431  var _animate = function animate() {
51432    time = new Date().getTime();
51433    if (startTime === null) {
51434      startTime = time;
51435    }
51436    var progress = Math.max(Math.min((time - startTime) / duration, 1), 0);
51437    var easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2;
51438    var currentPosition = startPosition + easeProgress * (targetPosition - startPosition);
51439    if (isOutOfBound(currentPosition, targetPosition)) {
51440      currentPosition = targetPosition;
51441    }
51442    swiper.wrapperEl.scrollTo((0, _defineProperty2["default"])({}, side, currentPosition));
51443    if (isOutOfBound(currentPosition, targetPosition)) {
51444      swiper.wrapperEl.style.overflow = 'hidden';
51445      swiper.wrapperEl.style.scrollSnapType = '';
51446      setTimeout(function () {
51447        swiper.wrapperEl.style.overflow = '';
51448        swiper.wrapperEl.scrollTo((0, _defineProperty2["default"])({}, side, currentPosition));
51449      });
51450      window.cancelAnimationFrame(swiper.cssModeFrameID);
51451      return;
51452    }
51453    swiper.cssModeFrameID = window.requestAnimationFrame(_animate);
51454  };
51455  _animate();
51456}
51457function getSlideTransformEl(slideEl) {
51458  return slideEl.querySelector('.swiper-slide-transform') || slideEl.shadowRoot && slideEl.shadowRoot.querySelector('.swiper-slide-transform') || slideEl;
51459}
51460function elementChildren(element) {
51461  var selector = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
51462  var window = (0, _ssrWindowEsm.a)();
51463  var children = (0, _toConsumableArray2["default"])(element.children);
51464  if (window.HTMLSlotElement && element instanceof HTMLSlotElement) {
51465    children.push.apply(children, (0, _toConsumableArray2["default"])(element.assignedElements()));
51466  }
51467  if (!selector) {
51468    return children;
51469  }
51470  return children.filter(function (el) {
51471    return el.matches(selector);
51472  });
51473}
51474function elementIsChildOfSlot(el, slot) {
51475  // Breadth-first search through all parent's children and assigned elements
51476  var elementsQueue = [slot];
51477  while (elementsQueue.length > 0) {
51478    var elementToCheck = elementsQueue.shift();
51479    if (el === elementToCheck) {
51480      return true;
51481    }
51482    elementsQueue.push.apply(elementsQueue, (0, _toConsumableArray2["default"])(elementToCheck.children).concat((0, _toConsumableArray2["default"])(elementToCheck.shadowRoot ? elementToCheck.shadowRoot.children : []), (0, _toConsumableArray2["default"])(elementToCheck.assignedElements ? elementToCheck.assignedElements() : [])));
51483  }
51484}
51485function elementIsChildOf(el, parent) {
51486  var window = (0, _ssrWindowEsm.a)();
51487  var isChild = parent.contains(el);
51488  if (!isChild && window.HTMLSlotElement && parent instanceof HTMLSlotElement) {
51489    var children = (0, _toConsumableArray2["default"])(parent.assignedElements());
51490    isChild = children.includes(el);
51491    if (!isChild) {
51492      isChild = elementIsChildOfSlot(el, parent);
51493    }
51494  }
51495  return isChild;
51496}
51497function showWarning(text) {
51498  try {
51499    console.warn(text);
51500    return;
51501  } catch (err) {
51502    // err
51503  }
51504}
51505function createElement(tag) {
51506  var _el$classList;
51507  var classes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
51508  var el = document.createElement(tag);
51509  (_el$classList = el.classList).add.apply(_el$classList, (0, _toConsumableArray2["default"])(Array.isArray(classe
51509s) ? classes : classesToTokens(classes)));
51510  return el;
51511}
51512function elementOffset(el) {
51513  var window = (0, _ssrWindowEsm.a)();
51514  var document = (0, _ssrWindowEsm.g)();
51515  var box = el.getBoundingClientRect();
51516  var body = document.body;
51517  var clientTop = el.clientTop || body.clientTop || 0;
51518  var clientLeft = el.clientLeft || body.clientLeft || 0;
51519  var scrollTop = el === window ? window.scrollY : el.scrollTop;
51520  var scrollLeft = el === window ? window.scrollX : el.scrollLeft;
51521  return {
51522    top: box.top + scrollTop - clientTop,
51523    left: box.left + scrollLeft - clientLeft
51524  };
51525}
51526function elementPrevAll(el, selector) {
51527  var prevEls = [];
51528  while (el.previousElementSibling) {
51529    var prev = el.previousElementSibling; // eslint-disable-line
51530    if (selector) {
51531      if (prev.matches(selector)) prevEls.push(prev);
51532    } else prevEls.push(prev);
51533    el = prev;
51534  }
51535  return prevEls;
51536}
51537function elementNextAll(el, selector) {
51538  var nextEls = [];
51539  while (el.nextElementSibling) {
51540    var next = el.nextElementSibling; // eslint-disable-line
51541    if (selector) {
51542      if (next.matches(selector)) nextEls.push(next);
51543    } else nextEls.push(next);
51544    el = next;
51545  }
51546  return nextEls;
51547}
51548function elementStyle(el, prop) {
51549  var window = (0, _ssrWindowEsm.a)();
51550  return window.getComputedStyle(el, null).getPropertyValue(prop);
51551}
51552function elementIndex(el) {
51553  var child = el;
51554  var i;
51555  if (child) {
51556    i = 0;
51557    // eslint-disable-next-line
51558    while ((child = child.previousSibling) !== null) {
51559      if (child.nodeType === 1) i += 1;
51560    }
51561    return i;
51562  }
51563  return undefined;
51564}
51565function elementParents(el, selector) {
51566  var parents = []; // eslint-disable-line
51567  var parent = el.parentElement; // eslint-disable-line
51568  while (parent) {
51569    if (selector) {
51570      if (parent.matches(selector)) parents.push(parent);
51571    } else {
51572      parents.push(parent);
51573    }
51574    parent = parent.parentElement;
51575  }
51576  return parents;
51577}
51578function elementTransitionEnd(el, callback) {
51579  function fireCallBack(e) {
51580    if (e.target !== el) return;
51581    callback.call(el, e);
51582    el.removeEventListener('transitionend', fireCallBack);
51583  }
51584  if (callback) {
51585    el.addEventListener('transitionend', fireCallBack);
51586  }
51587}
51588function elementOuterSize(el, size, includeMargins) {
51589  var window = (0, _ssrWindowEsm.a)();
51590  if (includeMargins) {
51591    return el[size === 'width' ? 'offsetWidth' : 'offsetHeight'] + parseFloat(window.getComputedStyle(el, null).getPropertyValue(size === 'width' ? 'margin-right' : 'margin-top')) + parseFloat(window.getComputedStyle(el, null).getPropertyValue(size === 'width' ? 'margin-left' : 'margin-bottom'));
51592  }
51593  return el.offsetWidth;
51594}
51595function makeElementsArray(el) {
51596  return (Array.isArray(el) ? el : [el]).filter(function (e) {
51597    return !!e;
51598  });
51599}
51600function getRotateFix(swiper) {
51601  return function (v) {
51602    if (Math.abs(v) > 0 && swiper.browser && swiper.browser.need3dFix && Math.abs(v) % 90 === 0) {
51603      return v + 0.001;
51604    }
51605    return v;
51606  };
51607}
51608function setInnerHTML(el) {
51609  var html = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
51610  if (typeof trustedTypes !== 'undefined') {
51611    el.innerHTML = trustedTypes.createPolicy('html', {
51612      createHTML: function createHTML(s) {
51613        return s;
51614      }
51615    }).createHTML(html);
51616  } else {
51617    el.innerHTML = html;
51618  }
51619}
51620
51621},{"./ssr-window.esm.mjs":139,"@babel/runtime/helpers/defineProperty":98,"@babel/runtime/helpers/interopRequireDefault":99,"@babel/runtime/helpers/toConsumableArray":105,"@babel/runtime/helpers/typeof":108}],142:[function(require,module,exports){
51622"use strict";
51623
51624var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
51625Object.defineProperty(exports, "__esModule", {
51626  value: true
51627});
51628Object.defineProperty(exports, "Swiper", {
51629  enumerable: true,
51630  get: function get() {
51631    return _swiperCore.S;
51632  }
51633});
51634Object.defineProperty(exports, "default", {
51635  enumerable: true,
51636  get: function get() {
51637    return _swiperCore.S;
51638  }
51639});
51640var _swiperCore = require("./shared/swiper-core.mjs");
51641var _virtual = _interopRequireDefault(require("./modules/virtual.mjs"));
51642var _keyboard = _interopRequireDefault(require("./modules/keyboard.mjs"));
51643var _mousewheel = _interopRequireDefault(require("./modules/mousewheel.mjs"));
51644var _navigation = _interopRequireDefault(require("./modules/navigation.mjs"));
51645var _pagination = _interopRequireDefault(require("./modules/pagination.mjs"));
51646var _scrollbar = _interopRequireDefault(require("./modules/scrollbar.mjs"));
51647var _parallax = _interopRequireDefault(require("./modules/parallax.mjs"));
51648var _zoom = _interopRequireDefault(require("./modules/zoom.mjs"));
51649var _controller = _interopRequireDefault(require("./modules/controller.mjs"));
51650var _a11y = _interopRequireDefault(require("./modules/a11y.mjs"));
51651var _history = _interopRequireDefault(require("./modules/history.mjs"));
51652var _hashNavigation = _interopRequireDefault(require("./modules/hash-navigation.mjs"));
51653var _autoplay = _interopRequireDefault(require("./modules/autoplay.mjs"));
51654var _thumbs = _interopRequireDefault(require("./modules/thumbs.mjs"));
51655var _freeMode = _interopRequireDefault(require("./modules/free-mode.mjs"));
51656var _grid = _interopRequireDefault(require("./modules/grid.mjs"));
51657var _manipulation = _interopRequireDefault(require("./modules/manipulation.mjs"));
51658var _effectFade = _interopRequireDefault(require("./modules/effect-fade.mjs"));
51659var _effectCube = _interopRequireDefault(require("./modules/effect-cube.mjs"));
51660var _effectFlip = _interopRequireDefault(require("./modules/effect-flip.mjs"));
51661var _effectCoverflow = _interopRequireDefault(require("./modules/effect-coverflow.mjs"));
51662var _effectCreative = _interopRequireDefault(require("./modules/effect-creative.mjs"));
51663var _effectCards = _interopRequireDefault(require("./modules/effect-cards.mjs"));
51664/**
51665 * Swiper 12.1.4
51666 * Most modern mobile touch slider and framework with hardware accelerated transitions
51667 * https://swiperjs.com
51668 *
51669 * Copyright 2014-2026 Vladimir Kharlampidi
51670 *
51671 * Released under the MIT License
51672 *
51673 * Released on: April 29, 2026
51674 */
51675
51676// Swiper Class
51677var modules = [_virtual["default"], _keyboard["default"], _mousewheel["default"], _navigation["default"], _pagination["default"], _scrollbar["default"], _parallax["default"], _zoom["default"], _controller["default"], _a11y["default"], _history["default"], _hashNavigation["default"], _autoplay["default"], _thumbs["default"], _freeMode["default"], _grid["default"], _manipulation["default"], _effectFade["default"], _effectCube["default"], _effectFlip["default"], _effectCoverflow["default"], _effectCreative["default"], _effectCards["default"]];
51678_swiperCore.S.use(modules);
51679
51680},{"./modules/a11y.mjs":110,"./modules/autoplay.mjs":111,"./modules/controller.mjs":112,"./modules/effect-cards.mjs":113,"./modules/effect-coverflow.mjs":114,"./modules/effect-creative.mjs":115,"./modules/effect-cube.mjs":116,"./modules/effect-fade.mjs":117,"./modules/effect-flip.mjs":118,"./modules/free-mode.mjs":119,"./modules/grid.mjs":120,"./modules/hash-navigation.mjs":121,"./modules/history.mjs":122,"./modules/keyboard.mjs":123,"./modules/manipulation.mjs":124,"./modules/mousewheel.mjs":125,"./modules/navigation.mjs":126,"./modules/pagination.mjs":127,"./modules/parallax.mjs":128,"./modules/scrollbar.mjs":129,"./modules/thumbs.mjs":130,"./modules/virtual.mjs":131,"./modules/zoom.mjs":132,"./shared/swiper-core.mjs":140,"@babel/runtime/helpers/interopRequireDefault":99}]},{},[7]);

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