PageSourceSearch

https://coeliac.ie/wp-content/plugins/elementor/assets/lib/swiper/swiper.js?ver=5.3.6

js coeliac.ie collected 2026-09-24 11:26:03 UTC 303,703 bytes, 8,661 lines download raw bytes

1/**
2 * Swiper 5.3.6
3 * Most modern mobile touch slider and framework with hardware accelerated transitions
4 * http://swiperjs.com
5 *
6 * Copyright 2014-2020 Vladimir Kharlampidi
7 *
8 * Released under the MIT License
9 *
10 * Released on: February 29, 2020
11 */
12
13(function (global, factory) {
14  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
15  typeof define === 'function' && define.amd ? define(factory) :
16  (global = global || self, global.Swiper = factory());
17}(this, function () { 'use strict';
18
19  /**
20   * SSR Window 1.0.1
21   * Better handling for window object in SSR environment
22   * https://github.com/nolimits4web/ssr-window
23   *
24   * Copyright 2018, Vladimir Kharlampidi
25   *
26   * Licensed under MIT
27   *
28   * Released on: July 18, 2018
29   */
30  var doc = (typeof document === 'undefined') ? {
31    body: {},
32    addEventListener: function addEventListener() {},
33    removeEventListener: function removeEventListener() {},
34    activeElement: {
35      blur: function blur() {},
36      nodeName: '',
37    },
38    querySelector: function querySelector() {
39      return null;
40    },
41    querySelectorAll: function querySelectorAll() {
42      return [];
43    },
44    getElementById: function getElementById() {
45      return null;
46    },
47    createEvent: function createEvent() {
48      return {
49        initEvent: function initEvent() {},
50      };
51    },
52    createElement: function createElement() {
53      return {
54        children: [],
55        childNodes: [],
56        style: {},
57        setAttribute: function setAttribute() {},
58        getElementsByTagName: function getElementsByTagName() {
59          return [];
60        },
61      };
62    },
63    location: { hash: '' },
64  } : document; // eslint-disable-line
65
66  var win = (typeof window === 'undefined') ? {
67    document: doc,
68    navigator: {
69      userAgent: '',
70    },
71    location: {},
72    history: {},
73    CustomEvent: function CustomEvent() {
74      return this;
75    },
76    addEventListener: function addEventListener() {},
77    removeEventListener: function removeEventListener() {},
78    getComputedStyle: function getComputedStyle() {
79      return {
80        getPropertyValue: function getPropertyValue() {
81          return '';
82        },
83      };
84    },
85    Image: function Image() {},
86    Date: function Date() {},
87    screen: {},
88    setTimeout: function setTimeout() {},
89    clearTimeout: function clearTimeout() {},
90  } : window; // eslint-disable-line
91
92  /**
93   * Dom7 2.1.3
94   * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API
95   * http://framework7.io/docs/dom.html
96   *
97   * Copyright 2019, Vladimir Kharlampidi
98   * The iDangero.us
99   * http://www.idangero.us/
100   *
101   * Licensed under MIT
102   *
103   * Released on: February 11, 2019
104   */
105
106  var Dom7 = function Dom7(arr) {
107    var self = this;
108    // Create array-like object
109    for (var i = 0; i < arr.length; i += 1) {
110      self[i] = arr[i];
111    }
112    self.length = arr.length;
113    // Return collection with methods
114    return this;
115  };
116
117  function $(selector, context) {
118    var arr = [];
119    var i = 0;
120    if (selector && !context) {
121      if (selector instanceof Dom7) {
122        return selector;
123      }
124    }
125    if (selector) {
126        // String
127      if (typeof selector === 'string') {
128        var els;
129        var tempParent;
130        var html = selector.trim();
131        if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {
132          var toCreate = 'div';
133          if (html.indexOf('<li') === 0) { toCreate = 'ul'; }
134          if (html.indexOf('<tr') === 0) { toCreate = 'tbody'; }
135          if (html.indexOf('<td') === 0 || html.indexOf('<th') === 0) { toCreate = 'tr'; }
136          if (html.indexOf('<tbody') === 0) { toCreate = 'table'; }
137          if (html.indexOf('<option') === 0) { toCreate = 'select'; }
138          tempParent = doc.createElement(toCreate);
139          tempParent.innerHTML = html;
140          for (i = 0; i < tempParent.childNodes.length; i += 1) {
141            arr.push(tempParent.childNodes[i]);
142          }
143        } else {
144          if (!context && selector[0] === '#' && !selector.match(/[ .<>:~]/)) {
145            // Pure ID selector
146            els = [doc.getElementById(selector.trim().split('#')[1])];
147          } else {
148            // Other selectors
149            els = (context || doc).querySelectorAll(selector.trim());
150          }
151          for (i = 0; i < els.length; i += 1) {
152            if (els[i]) { arr.push(els[i]); }
153          }
154        }
155      } else if (selector.nodeType || selector === win || selector === doc) {
156        // Node/element
157        arr.push(selector);
158      } else if (selector.length > 0 && selector[0].nodeType) {
159        // Array of elements or instance of Dom
160        for (i = 0; i < selector.length; i += 1) {
161          arr.push(selector[i]);
162        }
163      }
164    }
165    return new Dom7(arr);
166  }
167
168  $.fn = Dom7.prototype;
169  $.Class = Dom7;
170  $.Dom7 = Dom7;
171
172  function unique(arr) {
173    var uniqueArray = [];
174    for (var i = 0; i < arr.length; i += 1) {
175      if (uniqueArray.indexOf(arr[i]) === -1) { uniqueArray.push(arr[i]); }
176    }
177    return uniqueArray;
178  }
179
180  // Classes and attributes
181  function addClass(className) {
182    if (typeof className === 'undefined') {
183      return this;
184    }
185    var classes = className.split(' ');
186    for (var i = 0; i < classes.length; i += 1) {
187      for (var j = 0; j < this.length; j += 1) {
188        if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.add(classes[i]); }
189      }
190    }
191    return this;
192  }
193  function removeClass(className) {
194    var classes = className.split(' ');
195    for (var i = 0; i < classes.length; i += 1) {
196      for (var j = 0; j < this.length; j += 1) {
197        if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.remove(classes[i]); }
198      }
199    }
200    return this;
201  }
202  function hasClass(className) {
203    if (!this[0]) { return false; }
204    return this[0].classList.contains(className);
205  }
206  function toggleClass(className) {
207    var classes = className.split(' ');
208    for (var i = 0; i < classes.length; i += 1) {
209      for (var j = 0; j < this.length; j += 1) {
210        if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.toggle(classes[i]); }
211      }
212    }
213    return this;
214  }
215  function attr(attrs, value) {
216    var arguments$1 = arguments;
217
218    if (arguments.length === 1 && typeof attrs === 'string') {
219      // Get attr
220      if (this[0]) { return this[0].getAttribute(attrs); }
221      return undefined;
222    }
223
224    // Set attrs
225    for (var i = 0; i < this.length; i += 1) {
226      if (arguments$1.length === 2) {
227        // String
228        this[i].setAttribute(attrs, value);
229      } else {
230        // Object
231        // eslint-disable-next-line
232        for (var attrName in attrs) {
233          this[i][attrName] = attrs[attrName];
234          this[i].setAttribute(attrName, attrs[attrName]);
235        }
236      }
237    }
238    return this;
239  }
240  // eslint-disable-next-line
241  function removeAttr(attr) {
242    for (var i = 0; i < this.length; i += 1) {
243      this[i].removeAttribute(attr);
244    }
245    return this;
246  }
247  function data(key, value) {
248    var el;
249    if (typeof value === 'undefined') {
250      el = this[0];
251      // Get value
252      if (el) {
253        if (el.dom7ElementDataStorage && (key in el.dom7ElementDataStorage)) {
254          return el.dom7ElementDataStorage[key];
255        }
256
257        var dataKey = el.getAttribute(("data-" + key));
258        if (dataKey) {
259          return dataKey;
260        }
261        return undefined;
262      }
263      return undefined;
264    }
265
266    // Set value
267    for (var i = 0; i < this.length; i += 1) {
268      el = this[i];
269      if (!el.dom7ElementDataStorage) { el.dom7ElementDataStorage = {}; }
270      el.dom7ElementDataStorage[key] = value;
271    }
272    return this;
273  }
274  // Transforms
275  // eslint-disable-next-line
276  function transform(transform) {
277    for (var i = 0; i < this.length; i += 1) {
278      var elStyle = this[i].style;
279      elStyle.webkitTransform = transform;
280      elStyle.transform = transform;
281    }
282    return this;
283  }
284  function transition(duration) {
285    if (typeof duration !== 'string') {
286      duration = duration + "ms"; // eslint-disable-line
287    }
288    for (var i = 0; i < this.length; i += 1) {
289      var elStyle = this[i].style;
290      elStyle.webkitTransitionDuration = duration;
291      elStyle.transitionDuration = duration;
292    }
293    return this;
294  }
295  // Events
296  function on() {
297    var assign;
298
299    var args = [], len = arguments.length;
300    while ( len-- ) args[ len ] = arguments[ len ];
301    var eventType = args[0];
302    var targetSelector = args[1];
303    var listener = args[2];
304    var capture = args[3];
305    if (typeof args[1] === 'function') {
306      (assign = args, eventType = assign[0], listener = assign[1], capture = assign[2]);
307      targetSelector = undefined;
308    }
309    if (!capture) { capture = false; }
310
311    function handleLiveEvent(e) {
312      var target = e.target;
313      if (!target) { return; }
314      var eventData = e.target.dom7EventData || [];
315      if (eventData.indexOf(e) < 0) {
316        eventData.unshift(e);
317      }
318      if ($(target).is(targetSelector)) { listener.apply(target, eventData); }
319      else {
320        var parents = $(target).parents(); // eslint-disable-line
321        for (var k = 0; k < parents.length; k += 1) {
322          if ($(parents[k]).is(targetSelector)) { listener.apply(parents[k], eventData); }
323        }
324      }
325    }
326    function handleEvent(e) {
327      var eventData = e && e.target ? e.target.dom7EventData || [] : [];
328      if (eventData.indexOf(e) < 0) {
329        eventData.unshift(e);
330      }
331      listener.apply(this, eventData);
332    }
333    var events = eventType.split(' ');
334    var j;
335    for (var i = 0; i < this.length; i += 1) {
336      var el = this[i];
337      if (!targetSelector) {
338        for (j = 0; j < events.length; j += 1) {
339          var event = events[j];
340          if (!el.dom7Listeners) { el.dom7Listeners = {}; }
341          if (!el.dom7Listeners[event]) { el.dom7Listeners[event] = []; }
342          el.dom7Listeners[event].push({
343            listener: listener,
344            proxyListener: handleEvent,
345          });
346          el.addEventListener(event, handleEvent, capture);
347        }
348      } else {
349        // Live events
350        for (j = 0; j < events.length; j += 1) {
351          var event$1 = events[j];
352          if (!el.dom7LiveListeners) { el.dom7LiveListeners = {}; }
353          if (!el.dom7LiveListeners[event$1]) { el.dom7LiveListeners[event$1] = []; }
354          el.dom7LiveListeners[event$1].push({
355            listener: listener,
356            proxyListener: handleLiveEvent,
357          });
358          el.addEventListener(event$1, handleLiveEvent, capture);
359        }
360      }
361    }
362    return this;
363  }
364  function off() {
365    var assign;
366
367    var args = [], len = arguments.length;
368    while ( len-- ) args[ len ] = arguments[ len ];
369    var eventType = args[0];
370    var targetSelector = args[1];
371    var listener = args[2];
372    var capture = args[3];
373    if (typeof args[1] === 'function') {
374      (assign = args, eventType = assign[0], listener = assign[1], capture = assign[2]);
375      targetSelector = undefined;
376    }
377    if (!capture) { capture = false; }
378
379    var events = eventType.split(' ');
380    for (var i = 0; i < events.length; i += 1) {
381      var event = events[i];
382      for (var j = 0; j < this.length; j += 1) {
383        var el = this[j];
384        var handlers = (void 0);
385        if (!targetSelector && el.dom7Listeners) {
386          handlers = el.dom7Listeners[event];
387        }
387 else if (targetSelector && el.dom7LiveListeners) {
388          handlers = el.dom7LiveListeners[event];
389        }
390        if (handlers && handlers.length) {
391          for (var k = handlers.length - 1; k >= 0; k -= 1) {
392            var handler = handlers[k];
393            if (listener && handler.listener === listener) {
394              el.removeEventListener(event, handler.proxyListener, capture);
395              handlers.splice(k, 1);
396            } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) {
397              el.removeEventListener(event, handler.proxyListener, capture);
398              handlers.splice(k, 1);
399            } else if (!listener) {
400              el.removeEventListener(event, handler.proxyListener, capture);
401              handlers.splice(k, 1);
402            }
403          }
404        }
405      }
406    }
407    return this;
408  }
409  function trigger() {
410    var args = [], len = arguments.length;
411    while ( len-- ) args[ len ] = arguments[ len ];
412
413    var events = args[0].split(' ');
414    var eventData = args[1];
415    for (var i = 0; i < events.length; i += 1) {
416      var event = events[i];
417      for (var j = 0; j < this.length; j += 1) {
418        var el = this[j];
419        var evt = (void 0);
420        try {
421          evt = new win.CustomEvent(event, {
422            detail: eventData,
423            bubbles: true,
424            cancelable: true,
425          });
426        } catch (e) {
427          evt = doc.createEvent('Event');
428          evt.initEvent(event, true, true);
429          evt.detail = eventData;
430        }
431        // eslint-disable-next-line
432        el.dom7EventData = args.filter(function (data, dataIndex) { return dataIndex > 0; });
433        el.dispatchEvent(evt);
434        el.dom7EventData = [];
435        delete el.dom7EventData;
436      }
437    }
438    return this;
439  }
440  function transitionEnd(callback) {
441    var events = ['webkitTransitionEnd', 'transitionend'];
442    var dom = this;
443    var i;
444    function fireCallBack(e) {
445      /* jshint validthis:true */
446      if (e.target !== this) { return; }
447      callback.call(this, e);
448      for (i = 0; i < events.length; i += 1) {
449        dom.off(events[i], fireCallBack);
450      }
451    }
452    if (callback) {
453      for (i = 0; i < events.length; i += 1) {
454        dom.on(events[i], fireCallBack);
455      }
456    }
457    return this;
458  }
459  function outerWidth(includeMargins) {
460    if (this.length > 0) {
461      if (includeMargins) {
462        // eslint-disable-next-line
463        var styles = this.styles();
464        return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left'));
465      }
466      return this[0].offsetWidth;
467    }
468    return null;
469  }
470  function outerHeight(includeMargins) {
471    if (this.length > 0) {
472      if (includeMargins) {
473        // eslint-disable-next-line
474        var styles = this.styles();
475        return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom'));
476      }
477      return this[0].offsetHeight;
478    }
479    return null;
480  }
481  function offset() {
482    if (this.length > 0) {
483      var el = this[0];
484      var box = el.getBoundingClientRect();
485      var body = doc.body;
486      var clientTop = el.clientTop || body.clientTop || 0;
487      var clientLeft = el.clientLeft || body.clientLeft || 0;
488      var scrollTop = el === win ? win.scrollY : el.scrollTop;
489      var scrollLeft = el === win ? win.scrollX : el.scrollLeft;
490      return {
491        top: (box.top + scrollTop) - clientTop,
492        left: (box.left + scrollLeft) - clientLeft,
493      };
494    }
495
496    return null;
497  }
498  function styles() {
499    if (this[0]) { return win.getComputedStyle(this[0], null); }
500    return {};
501  }
502  function css(props, value) {
503    var i;
504    if (arguments.length === 1) {
505      if (typeof props === 'string') {
506        if (this[0]) { return win.getComputedStyle(this[0], null).getPropertyValue(props); }
507      } else {
508        for (i = 0; i < this.length; i += 1) {
509          // eslint-disable-next-line
510          for (var prop in props) {
511            this[i].style[prop] = props[prop];
512          }
513        }
514        return this;
515      }
516    }
517    if (arguments.length === 2 && typeof props === 'string') {
518      for (i = 0; i < this.length; i += 1) {
519        this[i].style[props] = value;
520      }
521      return this;
522    }
523    return this;
524  }
525  // Iterate over the collection passing elements to `callback`
526  function each(callback) {
527    // Don't bother continuing without a callback
528    if (!callback) { return this; }
529    // Iterate over the current collection
530    for (var i = 0; i < this.length; i += 1) {
531      // If the callback returns false
532      if (callback.call(this[i], i, this[i]) === false) {
533        // End the loop early
534        return this;
535      }
536    }
537    // Return `this` to allow chained DOM operations
538    return this;
539  }
540  function filter(callback) {
541    var matchedItems = [];
542    var dom = this;
543    for (var i = 0; i < dom.length; i += 1) {
544      if (callback.call(dom[i], i, dom[i])) { matchedItems.push(dom[i]); }
545    }
546    return new Dom7(matchedItems);
547  }
548  // eslint-disable-next-line
549  function html(html) {
550    if (typeof html === 'undefined') {
551      return this[0] ? this[0].innerHTML : undefined;
552    }
553
554    for (var i = 0; i < this.length; i += 1) {
555      this[i].innerHTML = html;
556    }
557    return this;
558  }
559  // eslint-disable-next-line
560  function text(text) {
561    if (typeof text === 'undefined') {
562      if (this[0]) {
563        return this[0].textContent.trim();
564      }
565      return null;
566    }
567
568    for (var i = 0; i < this.length; i += 1) {
569      this[i].textContent = text;
570    }
571    return this;
572  }
573  function is(selector) {
574    var el = this[0];
575    var compareWith;
576    var i;
577    if (!el || typeof selector === 'undefined') { return false; }
578    if (typeof selector === 'string') {
579      if (el.matches) { return el.matches(selector); }
580      else if (el.webkitMatchesSelector) { return el.webkitMatchesSelector(selector); }
581      else if (el.msMatchesSelector) { return el.msMatchesSelector(selector); }
582
583      compareWith = $(selector);
584      for (i = 0; i < compareWith.length; i += 1) {
585        if (compareWith[i] === el) { return true; }
586      }
587      return false;
588    } else if (selector === doc) { return el === doc; }
589    else if (selector === win) { return el === win; }
590
591    if (selector.nodeType || selector instanceof Dom7) {
592      compareWith = selector.nodeType ? [selector] : selector;
593      for (i = 0; i < compareWith.length; i += 1) {
594        if (compareWith[i] === el) { return true; }
595      }
596      return false;
597    }
598    return false;
599  }
600  function index() {
601    var child = this[0];
602    var i;
603    if (child) {
604      i = 0;
605      // eslint-disable-next-line
606      while ((child = child.previousSibling) !== null) {
607        if (child.nodeType === 1) { i += 1; }
608      }
609      return i;
610    }
611    return undefined;
612  }
613  // eslint-disable-next-line
614  function eq(index) {
615    if (typeof index === 'undefined') { return this; }
616    var length = this.length;
617    var returnIndex;
618    if (index > length - 1) {
619      return new Dom7([]);
620    }
621    if (index < 0) {
622      returnIndex = length + index;
623      if (returnIndex < 0) { return new Dom7([]); }
624      return new Dom7([this[returnIndex]]);
625    }
626    return new Dom7([this[index]]);
627  }
628  function append() {
629    var args = [], len = arguments.length;
630    while ( len-- ) args[ len ] = arguments[ len ];
631
632    var newChild;
633
634    for (var k = 0; k < args.length; k += 1) {
635      newChild = args[k];
636      for (var i = 0; i < this.length; i += 1) {
637        if (typeof newChild === 'string') {
638          var tempDiv = doc.createElement('div');
639          tempDiv.innerHTML = newChild;
640          while (tempDiv.firstChild) {
641            this[i].appendChild(tempDiv.firstChild);
642          }
643        } else if (newChild instanceof Dom7) {
644          for (var j = 0; j < newChild.length; j += 1) {
645            this[i].appendChild(newChild[j]);
646          }
647        } else {
648          this[i].appendChild(newChild);
649        }
650      }
651    }
652
653    return this;
654  }
655  function prepend(newChild) {
656    var i;
657    var j;
658    for (i = 0; i < this.length; i += 1) {
659      if (typeof newChild === 'string') {
660        var tempDiv = doc.createElement('div');
661        tempDiv.innerHTML = newChild;
662        for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {
663          this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);
664        }
665      } else if (newChild instanceof Dom7) {
666        for (j = 0; j < newChild.length; j += 1) {
667          this[i].insertBefore(newChild[j], this[i].childNodes[0]);
668        }
669      } else {
670        this[i].insertBefore(newChild, this[i].childNodes[0]);
671      }
672    }
673    return this;
674  }
675  function next(selector) {
676    if (this.length > 0) {
677      if (selector) {
678        if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) {
679          return new Dom7([this[0].nextElementSibling]);
680        }
681        return new Dom7([]);
682      }
683
684      if (this[0].nextElementSibling) { return new Dom7([this[0].nextElementSibling]); }
685      return new Dom7([]);
686    }
687    return new Dom7([]);
688  }
689  function nextAll(selector) {
690    var nextEls = [];
691    var el = this[0];
692    if (!el) { return new Dom7([]); }
693    while (el.nextElementSibling) {
694      var next = el.nextElementSibling; // eslint-disable-line
695      if (selector) {
696        if ($(next).is(selector)) { nextEls.push(next); }
697      } else { nextEls.push(next); }
698      el = next;
699    }
700    return new Dom7(nextEls);
701  }
702  function prev(selector) {
703    if (this.length > 0) {
704      var el = this[0];
705      if (selector) {
706        if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) {
707          return new Dom7([el.previousElementSibling]);
708        }
709        return new Dom7([]);
710      }
711
712      if (el.previousElementSibling) { return new Dom7([el.previousElementSibling]); }
713      return new Dom7([]);
714    }
715    return new Dom7([]);
716  }
717  function prevAll(selector) {
718    var prevEls = [];
719    var el = this[0];
720    if (!el) { return new Dom7([]); }
721    while (el.previousElementSibling) {
722      var prev = el.previousElementSibling; // eslint-disable-line
723      if (selector) {
724        if ($(prev).is(selector)) { prevEls.push(prev); }
725      } else { prevEls.push(prev); }
726      el = prev;
727    }
728    return new Dom7(prevEls);
729  }
730  function parent(selector) {
731    var parents = []; // eslint-disable-line
732    for (var i = 0; i < this.length; i += 1) {
733      if (this[i].parentNode !== null) {
734        if (selector) {
735          if ($(this[i].parentNode).is(selector)) { parents.push(this[i].parentNode); }
736        } else {
737          parents.push(this[i].parentNode);
738        }
739      }
740    }
741    return $(unique(parents));
742  }
743  function parents(selector) {
744    var parents = []; // eslint-disable-line
745    for (var i = 0; i < this.length; i += 1) {
746      var parent = this[i].parentNode; // eslint-disable-line
747      while (parent) {
748        if (selector) {
749          if ($(parent).is(selector)) { parents.push(parent); }
750        } else {
751          parents.push(parent);
752        }
753        parent = parent.parentNode;
754      }
755    }
756    return $(unique(parents));
757  }
758  function closest(selector) {
759    var closest = this; // eslint-disable-line
760    if (typeof selector === 'undefined') {
761      return new Dom7([]);
762    }
763    if (!closest.is(selector)) {
764      closest = closest.parents(selector).eq(0);
765    }
766    return closest;
767  }
768  function find(selector) {
769    var foundElements = [];
770    for (var i = 0; i < this.length; i += 1) {
771      var found = this[i].querySelectorAll(selector);
772      for (var j = 0; j < found.length; j += 1) {
773        foundElements.push(found[j]);
774      }
775    }
776    return new Dom7(foundElements);
777  }
778  function children(selector) {
779    var children = []; // eslint-disable-line
780    for (var i = 0; i < this.length; i += 1) {
781      var childNodes = this[i].childNodes;
782
783      for (var j = 0; j < childNodes.length; j += 1) {
784        if (!selector) {
785          if (childNodes[j].nodeType === 1) { children.push(childNodes[j]); }
786        } else if (childNodes[j].nodeType === 1 && $(childNodes[j]).is(selector)) {
787          children.push(childNodes[j]);
788        }
789      }
790    }
791    return new Dom7(unique(children));
792  }
793  function remove() {
794    for (var i = 0; i < this.length; i += 1) {
795      if (this[i].parentNode) { this[i].parentNode.removeChild(this[i]); }
796    }
797    return this;
798  }
799  function add() {
800    var args = [], len = arguments.length;
801    while ( len-- ) args[ len ] = arguments[ len ];
802
803    var dom = this;
804    var i;
805    var j;
806    for (i = 0; i < args.length; i += 1) {
807      var toAdd = $(args[i]);
808      for (j = 0; j < toAdd.length; j += 1) {
809        dom[dom.length] = toAdd[j];
810        dom.length += 1;
811      }
812    }
813    return dom;
814  }
815
816  var Methods = {
817    addClass: addClass,
818    removeClass: removeClass,
819    hasClass: hasClass,
820    toggleClass: toggleClass,
821    attr: attr,
822    removeAttr: removeAttr,
823    data: data,
824    transform: transform,
825    transition: transition,
826    on: on,
827    off: off,
828    trigger: trigger,
829    transitionEnd: transitionEnd,
830    outerWidth: outerWidth,
831    outerHeight: outerHeight,
832    offset: offset,
833    css: css,
834    each: each,
835    html: html,
836    text: text,
837    is: is,
838    index: index,
839    eq: eq,
840    append: append,
841    prepend: prepend,
842    next: next,
843    nextAll: nextAll,
844    prev: prev,
845    prevAll: prevAll,
846    parent: parent,
847    parents: parents,
848    closest: closest,
849    find: find,
850    children: children,
851    filter: filter,
852    remove: remove,
853    add: add,
854    styles: styles,
855  };
856
857  Object.keys(Methods).forEach(function (methodName) {
858    $.fn[methodName] = $.fn[methodName] || Methods[methodName];
859  });
860
861  var Utils = {
862    deleteProps: function deleteProps(obj) {
863      var object = obj;
864      Object.keys(object).forEach(function (key) {
865        try {
866          object[key] = null;
867        } catch (e) {
868          // no getter for object
869        }
870        try {
871          delete object[key];
872        } catch (e) {
873          // something got wrong
874        }
875      });
876    },
877    nextTick: function nextTick(callback, delay) {
878      if ( delay === void 0 ) delay = 0;
879
880      return setTimeout(callback, delay);
881    },
882    now: function now() {
883      return Date.now();
884    },
885    getTranslate: function getTranslate(el, axis) {
886      if ( axis === void 0 ) axis = 'x';
887
888      var matrix;
889      var curTransform;
890      var transformMatrix;
891
892      var curStyle = win.getComputedStyle(el, null);
893
894      if (win.WebKitCSSMatrix) {
895        curTransform = curStyle.transform || curStyle.webkitTransform;
896        if (curTransform.split(',').length > 6) {
897          curTransform = curTransform.split(', ').map(function (a) { return a.replace(',', '.'); }).join(', ');
898        }
899        // Some old versions of Webkit choke when 'none' is passed; pass
900        // empty string instead in this case
901        transformMatrix = new win.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);
902      } else {
903        transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');
904        matrix = transformMatrix.toString().split(',');
905      }
906
907      if (axis === 'x') {
908        // Latest Chrome and webkits Fix
909        if (win.WebKitCSSMatrix) { curTransform = transformMatrix.m41; }
910        // Crazy IE10 Matrix
911        else if (matrix.length === 16) { curTransform = parseFloat(matrix[12]); }
912        // Normal Browsers
913        else { curTransform = parseFloat(matrix[4]); }
914      }
915      if (axis === 'y') {
916        // Latest Chrome and webkits Fix
917        if (win.WebKitCSSMatrix) { curTransform = transformMatrix.m42; }
918        // Crazy IE10 Matrix
919        else if (matrix.length === 16) { curTransform = parseFloat(matrix[13]); }
920        // Normal Browsers
921        else { curTransform = parseFloat(matrix[5]); }
922      }
923      return curTransform || 0;
924    },
925    parseUrlQuery: function parseUrlQuery(url) {
926      var query = {};
927      var urlToParse = url || win.location.href;
928      var i;
929      var params;
930      var param;
931      var length;
932      if (typeof urlToParse === 'string' && urlToParse.length) {
933        urlToParse = urlToParse.indexOf('?') > -1 ? urlToParse.replace(/\S*\?/, '') : '';
934        params = urlToParse.split('&').filter(function (paramsPart) { return paramsPart !== ''; });
935        length = params.length;
936
937        for (i = 0; i < length; i += 1) {
938          param = params[i].replace(/#\S+/g, '').split('=');
939          query[decodeURIComponent(param[0])] = typeof param[1] === 'undefined' ? undefined : decodeURIComponent(param[1]) || '';
940        }
941      }
942      return query;
943    },
944    isObject: function isObject(o) {
945      return typeof o === 'object' && o !== null && o.constructor && o.constructor === Object;
946    },
947    extend: function extend() {
948      var args = [], len$1 = arguments.length;
949      while ( len$1-- ) args[ len$1 ] = arguments[ len$1 ];
950
951      var to = Object(args[0]);
952      for (var i = 1; i < args.length; i += 1) {
953        var nextSource = args[i];
954        if (nextSource !== undefined && nextSource !== null) {
955          var keysArray = Object.keys(Object(nextSource));
956          for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
957            var nextKey = keysArray[nextIndex];
958            var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
959            if (desc !== undefined && desc.enumerable) {
960              if (Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) {
961                Utils.extend(to[nextKey], nextSource[nextKey]);
962              } else if (!Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) {
963                to[nextKey] = {};
964                Utils.extend(to[nextKey], nextSource[nextKey]);
965              } else {
966                to[nextKey] = nextSource[nextKey];
967              }
968            }
969          }
970        }
971      }
972      return to;
973    },
974  };
975
976  var Support = (function Support() {
977    return {
978      touch: (win.Modernizr && win.Modernizr.touch === true) || (function checkTouch() {
979        return !!((win.navigator.maxTouchPoints > 0) || ('ontouchstart' in win) || (win.DocumentTouch && doc instanceof win.DocumentTouch));
980      }()),
981
982      pointerEvents: !!win.PointerEvent && ('maxTouchPoints' in win.navigator) && win.navigator.maxTouchPoints > 0,
983
984      observer: (function checkObserver() {
985        return ('MutationObserver' in win || 'WebkitMutationObserver' in win);
986      }()),
987
988      passiveListener: (function checkPassiveListener() {
989        var supportsPassive = false;
990        try {
991          var opts = Object.defineProperty({}, 'passive', {
992            // eslint-disable-next-line
993            get: function get() {
994              supportsPassive = true;
995            },
996          });
997          win.addEventListener('testPassiveListener', null, opts);
998        } catch (e) {
999          // No support
1000        }
1001        return supportsPassive;
1002      }()),
1003
1004      gestures: (function checkGestures() {
1005        return 'ongesturestart' in win;
1006      }()),
1007    };
1008  }());
1009
1010  var SwiperClass = function SwiperClass(params) {
1011    if ( params === void 0 ) params = {};
1012
1013    var self = this;
1014    self.params = params;
1015
1016    // Events
1017    self.eventsListeners = {};
1018
1019    if (self.params && self.params.on) {
1020      Object.keys(self.params.on).forEach(function (eventName) {
1021        self.on(eventName, self.params.on[eventName]);
1022      });
1023    }
1024  };
1025
1026  var staticAccessors = { components: { configurable: true } };
1027
1028  SwiperClass.prototype.on = function on (events, handler, priority) {
1029    var self = this;
1030    if (typeof handler !== 'function') { return self; }
1031    var method = priority ? 'unshift' : 'push';
1032    events.split(' ').forEach(function (event) {
1033      if (!self.eventsListeners[event]) { self.eventsListeners[event] = []; }
1034      self.eventsListeners[event][method](handler);
1035    });
1036    return self;
1037  };
1038
1039  SwiperClass.prototype.once = function once (events, handler, priority) {
1040    var self = this;
1041    if (typeof handler !== 'function') { return self; }
1042    function onceHandler() {
1043        var args = [], len = arguments.length;
1044        while ( len-- ) args[ len ] = arguments[ len ];
1045
1046      self.off(events, onceHandler);
1047      if (onceHandler.f7proxy) {
1048        delete onceHandler.f7proxy;
1049      }
1050      handler.apply(self, args);
1051    }
1052    onceHandler.f7proxy = handler;
1053    return self.on(events, onceHandler, priority);
1054  };
1055
1056  SwiperClass.prototype.off = function off (events, handler) {
1057    var self = this;
1058    if (!self.eventsListeners) { return self; }
1059    events.split(' ').forEach(function (event) {
1060      if (typeof handler === 'undefined') {
1061        self.eventsListeners[event] = [];
1062      } else if (self.eventsListeners[event] && self.eventsListeners[event].length) {
1063        self.eventsListeners[event].forEach(function (eventHandler, index) {
1064          if (eventHandler === handler || (eventHandler.f7proxy && eventHandler.f7proxy === handler)) {
1065            self.eventsListeners[event].splice(index, 1);
1066          }
1067        });
1068      }
1069    });
1070    return self;
1071  };
1072
1073  SwiperClass.prototype.emit = function emit () {
1074      var args = [], len = arguments.length;
1075      while ( len-- ) args[ len ] = arguments[ len ];
1076
1077    var self = this;
1078    if (!self.eventsListeners) { return self; }
1079    var events;
1080    var data;
1081    var context;
1082    if (typeof args[0] === 'string' || Array.isArray(args[0])) {
1083      events = args[0];
1084      data = args.slice(1, args.length);
1085      context = self;
1086    } else {
1087      events = args[0].events;
1088      data = args[0].data;
1089      context = args[0].context || self;
1090    }
1091    var eventsArray = Array.isArray(events) ? events : events.split(' ');
1092    eventsArray.forEach(function (event) {
1093      if (self.eventsListeners && self.eventsListeners[event]) {
1094        var handlers = [];
1095        self.eventsListeners[event].forEach(function (eventHandler) {
1096          handlers.push(eventHandler);
1097        });
1098        handlers.forEach(function (eventHandler) {
1099          eventHandler.apply(context, data);
1100        });
1101      }
1102    });
1103    return self;
1104  };
1105
1106  SwiperClass.prototype.useModulesParams = function useModulesParams (instanceParams) {
1107    var instance = this;
1108    if (!instance.modules) { return; }
1109    Object.keys(instance.modules).forEach(function (moduleName) {
1110      var module = instance.modules[moduleName];
1111      // Extend params
1112      if (module.params) {
1113        Utils.extend(instanceParams, module.params);
1114      }
1115    });
1116  };
1117
1118  SwiperClass.prototype.useModules = function useModules (modulesParams) {
1119      if ( modulesParams === void 0 ) modulesParams = {};
1120
1121    var instance = this;
1122    if (!instance.modules) { return; }
1123    Object.keys(instance.modules).forEach(function (moduleName) {
1124      var module = instance.modules[moduleName];
1125      var moduleParams = modulesParams[moduleName] || {};
1126      // Extend instance methods and props
1127      if (module.instance) {
1128        Object.keys(module.instance).forEach(function (modulePropName) {
1129          var moduleProp = module.instance[modulePropName];
1130          if (typeof moduleProp === 'function') {
1131            instance[modulePropName] = moduleProp.bind(instance);
1132          } else {
1133            instance[modulePropName] = moduleProp;
1134          }
1135        });
1136      }
1137      // Add event listeners
1138      if (module.on && instance.on) {
1139        Object.keys(module.on).forEach(function (moduleEventName) {
1140          instance.on(moduleEventName, module.on[moduleEventName]);
1141        });
1142      }
1143
1144      // Module create callback
1145      if (module.create) {
1146        module.create.bind(instance)(moduleParams);
1147      }
1148    });
1149  };
1150
1151  staticAccessors.components.set = function (components) {
1152    var Class = this;
1153    if (!Class.use) { return; }
1154    Class.use(components);
1155  };
1156
1157  SwiperClass.installModule = function installModule (module) {
1158      var params = [], len = arguments.length - 1;
1159      while ( len-- > 0 ) params[ len ] = arguments[ len + 1 ];
1160
1161    var Class = this;
1162    if (!Class.prototype.modules) { Class.prototype.modules = {}; }
1163    var name = module.name || (((Object.keys(Class.prototype.modules).length) + "_" + (Utils.now())));
1164    Class.prototype.modules[name] = module;
1165    // Prototype
1166    if (module.proto) {
1167      Object.keys(module.proto).forEach(function (key) {
1168        Class.prototype[key] = module.proto[key];
1169      });
1170    }
1171    // Class
1172    if (module.static) {
1173      Object.keys(module.static).forEach(function (key) {
1174        Class[key] = module.static[key];
1175      });
1176    }
1177    // Callback
1178    if (module.install) {
1179      module.install.apply(Class, params);
1180    }
1181    return Class;
1182  };
1183
1184  SwiperClass.use = function use (module) {
1185      var params = [], len = arguments.length - 1;
1186      while ( len-- > 0 ) params[ len ] = arguments[ len + 1 ];
1187
1188    var Class = this;
1189    if (Array.isArray(module)) {
1190      module.forEach(function (m) { return Class.installModule(m); });
1191      return Class;
1192    }
1193    return Class.installModule.apply(Class, [ module ].concat( params ));
1194  };
1195
1196  Object.defineProperties( SwiperClass, staticAccessors );
1197
1198  function updateSize () {
1199    var swiper = this;
1200    var width;
1201    var height;
1202    var $el = swiper.$el;
1203    if (typeof swiper.params.width !== 'undefined') {
1204      width = swiper.params.width;
1205    } else {
1206      width = $el[0].clientWidth;
1207    }
1208    if (typeof swiper.params.height !== 'undefined') {
1209      height = swiper.params.height;
1210    } else {
1211      height = $el[0].clientHeight;
1212    }
1213    if ((width === 0 && swiper.isHorizontal()) || (height === 0 && swiper.isVertical())) {
1214      return;
1215    }
1216
1217    // Subtract paddings
1218    width = width - parseInt($el.css('padding-left'), 10) - parseInt($el.css('padding-right'), 10);
1219    height = height - parseInt($el.css('padding-top'), 10) - parseInt($el.css('padding-bottom'), 10);
1220
1221    Utils.extend(swiper, {
1222      width: width,
1223      height: height,
1224      size: swiper.isHorizontal() ? width : height,
1225    });
1226  }
1227
1228  function updateSlides () {
1229    var swiper = this;
1230    var params = swiper.params;
1231
1232    var $wrapperEl = swiper.$wrapperEl;
1233    var swiperSize = swiper.size;
1234    var rtl = swiper.rtlTranslate;
1235    var wrongRTL = swiper.wrongRTL;
1236    var isVirtual = swiper.virtual && params.virtual.enabled;
1237    var previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;
1238    var slides = $wrapperEl.children(("." + (swiper.params.slideClass)));
1239    var slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;
1240    var snapGrid = [];
1241    var slidesGrid = [];
1242    var slidesSizesGrid = [];
1243
1244    function slidesForMargin(slideIndex) {
1245      if (!params.cssMode) { return true; }
1246      if (slideIndex === slides.length - 1) {
1247        return false;
1248      }
1249      return true;
1250    }
1251
1252    var offsetBefore = params.slidesOffsetBefore;
1253    if (typeof offsetBefore === 'function') {
1254      offsetBefore = params.slidesOffsetBefore.call(swiper);
1255    }
1256
1257    var offsetAfter = params.slidesOffsetAfter;
1258    if (typeof offsetAfter === 'function') {
1259      offsetAfter = params.slidesOffsetAfter.call(swiper);
1260    }
1261
1262    var previousSnapGridLength = swiper.snapGrid.length;
1263    var previousSlidesGridLength = swiper.snapGrid.length;
1264
1265    var spaceBetween = params.spaceBetween;
1266    var slidePosition = -offsetBefore;
1267    var prevSlideSize = 0;
1268    var index = 0;
1269    if (typeof swiperSize === 'undefined') {
1270      return;
1271    }
1272    if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
1273      spaceBetween = (parseFloat(spaceBetween.replace('%', '')) / 100) * swiperSize;
1274    }
1275
1276    swiper.virtualSize = -spaceBetween;
1277
1278    // reset margins
1279    if (rtl) { slides.css({ marginLeft: '', marginTop: '' }); }
1280    else { slides.css({ marginRight: '', marginBottom: '' }); }
1281
1282    var slidesNumberEvenToRows;
1283    if (params.slidesPerColumn > 1) {
1284      if (Math.floor(slidesLength / params.slidesPerColumn) === slidesLength / swiper.params.slidesPerColumn) {
1285        slidesNumberEvenToRows = slidesLength;
1286      } else {
1287        slidesNumberEvenToRows = Math.ceil(slidesLength / params.slidesPerColumn) * params.slidesPerColumn;
1288      }
1289      if (params.slidesPerView !== 'auto' && params.slidesPerColumnFill === 'row') {
1290        slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, params.slidesPerView * params.slidesPerColumn);
1291      }
1292    }
1293
1294    // Calc slides
1295    var slideSize;
1296    var slidesPerColumn = params.slidesPerColumn;
1297    var slidesPerRow = slidesNumberEvenToRows / slidesPerColumn;
1298    var numFullColumns = Math.floor(slidesLength / params.slidesPerColumn);
1299    for (var i = 0; i < slidesLength; i += 1) {
1300      slideSize = 0;
1301      var slide = slides.eq(i);
1302      if (params.slidesPerColumn > 1) {
1303        // Set slides order
1304        var newSlideOrderIndex = (void 0);
1305        var column = (void 0);
1306        var row = (void 0);
1307        if (params.slidesPerColumnFill === 'row' && params.slidesPerGroup > 1) {
1308          var groupIndex = Math.floor(i / (params.slidesPerGroup * params.slidesPerColumn));
1309          var slideIndexInGroup = i - params.slidesPerColumn * params.slidesPerGroup * groupIndex;
1310          var columnsInGroup = groupIndex === 0
1311            ? params.slidesPerGroup
1312            : Math.min(Math.ceil((slidesLength - groupIndex * slidesPerColumn * params.slidesPerGroup) / slidesPerColumn), params.slidesPerGroup);
1313          row = Math.floor(slideIndexInGroup / columnsInGroup);
1314          column = (slideIndexInGroup - row * columnsInGroup) + groupIndex * params.slidesPerGroup;
1315
1316          newSlideOrderIndex = column + ((row * slidesNumberEvenToRows) / slidesPerColumn);
1317          slide
1318            .css({
1319              '-webkit-box-ordinal-group': newSlideOrderIndex,
1320              '-moz-box-ordinal-group': newSlideOrderIndex,
1321              '-ms-flex-order': newSlideOrderIndex,
1322              '-webkit-order': newSlideOrderIndex,
1323              order: newSlideOrderIndex,
1324            });
1325        } else if (params.slidesPerColumnFill === 'column') {
1326          column = Math.floor(i / slidesPerColumn);
1327          row = i - (column * slidesPerColumn);
1328          if (column > numFullColumns || (column === numFullColumns && row === slidesPerColumn - 1)) {
1329            row += 1;
1330            if (row >= slidesPerColumn) {
1331              row = 0;
1332              column += 1;
1333            }
1334          }
1335        } else {
1336          row = Math.floor(i / slidesPerRow);
1337          column = i - (row * slidesPerRow);
1338        }
1339        slide.css(
1340          ("margin-" + (swiper.isHorizontal() ? 'top' : 'left')),
1341          (row !== 0 && params.spaceBetween) && (((params.spaceBetween) + "px"))
1342        );
1343      }
1344      if (slide.css('display') === 'none') { continue; } // eslint-disable-line
1345
1346      if (params.slidesPerView === 'auto') {
1347        var slideStyles = win.getComputedStyle(slide[0], null);
1348        var currentTransform = slide[0].style.transform;
1349        var currentWebKitTransform = slide[0].style.webkitTransform;
1350        if (currentTransform) {
1351          slide[0].style.transform = 'none';
1352        }
1353        if (currentWebKitTransform) {
1354          slide[0].style.webkitTransform = 'none';
1355        }
1356        if (params.roundLengths) {
1357          slideSize = swiper.isHorizontal()
1358            ? slide.outerWidth(true)
1359            : slide.outerHeight(true);
1360        } else {
1361          // eslint-disable-next-line
1362          if (swiper.isHorizontal()) {
1363            var width = parseFloat(slideStyles.getPropertyValue('width'));
1364            var paddingLeft = parseFloat(slideStyles.getPropertyValue('padding-left'));
1365            var paddingRight = parseFloat(slideStyles.getPropertyValue('padding-right'));
1366            var marginLeft = parseFloat(slideStyles.getPropertyValue('margin-left'));
1367            var marginRight = parseFloat(slideStyles.getPropertyValue('margin-right'));
1368            var boxSizing = slideStyles.getPropertyValue('box-sizing');
1369            if (boxSizing && boxSizing === 'border-box') {
1370              slideSize = width + marginLeft + marginRight;
1371            } else {
1372              slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight;
1373            }
1374          } else {
1375            var height = parseFloat(slideStyles.getPropertyValue('height'));
1376            var paddingTop = parseFloat(slideStyles.getPropertyValue('padding-top'));
1377            var paddingBottom = parseFloat(slideStyles.getPropertyValue('padding-bottom'));
1378            var marginTop = parseFloat(slideStyles.getPropertyValue('margin-top'));
1379            var marginBottom = parseFloat(slideStyles.getPropertyValue('margin-bottom'));
1380            var boxSizing$1 = slideStyles.getPropertyValue('box-sizing');
1381            if (boxSizing$1 && boxSizing$1 === 'border-box') {
1382              slideSize = height + marginTop + marginBottom;
1383            } else {
1384              slideSize = height + paddingTop + paddingBottom + marginTop + marginBottom;
1385            }
1386          }
1387        }
1388        if (currentTransform) {
1389          slide[0].style.transform = currentTransform;
1390        }
1391        if (currentWebKitTransform) {
1392          slide[0].style.webkitTransform = currentWebKitTransform;
1393        }
1394        if (params.roundLengths) { slideSize = Math.floor(slideSize); }
1395      } else {
1396        slideSize = (swiperSize - ((params.slidesPerView - 1) * spaceBetween)) / params.slidesPerView;
1397        if (params.roundLengths) { slideSize = Math.floor(slideSize); }
1398
1399        if (slides[i]) {
1400          if (swiper.isHorizontal()) {
1401            slides[i].style.width = slideSize + "px";
1402          } else {
1403            slides[i].style.height = slideSize + "px";
1404          }
1405        }
1406      }
1407      if (slides[i]) {
1408        slides[i].swiperSlideSize = slideSize;
1409      }
1410      slidesSizesGrid.push(slideSize);
1411
1412
1413      if (params.centeredSlides) {
1414        slidePosition = slidePosition + (slideSize / 2) + (prevSlideSize / 2) + spaceBetween;
1415        if (prevSlideSize === 0 && i !== 0) { slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; }
1416        if (i === 0) { slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; }
1417        if (Math.abs(slidePosition) < 1 / 1000) { slidePosition = 0; }
1418        if (params.roundLengths) { slidePosition = Math.floor(slidePosition); }
1419        if ((index) % params.slidesPerGroup === 0) { snapGrid.push(slidePosition); }
1420        slidesGrid.push(slidePosition);
1421      } else {
1422        if (params.roundLengths) { slidePosition = Math.floor(slidePosition); }
1423        if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) { snapGrid.push(slidePosition); }
1424        slidesGrid.push(slidePosition);
1425        slidePosition = slidePosition + slideSize + spaceBetween;
1426      }
1427
1428      swiper.virtualSize += slideSize + spaceBetween;
1429
1430      prevSlideSize = slideSize;
1431
1432      index += 1;
1433    }
1434    swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;
1435    var newSlidesGrid;
1436
1437    if (
1438      rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {
1439      $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") });
1440    }
1441    if (params.setWrapperSize) {
1442      if (swiper.isHorizontal()) { $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
1443      else { $wrapperEl.css({ height: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
1444    }
1445
1446    if (params.slidesPerColumn > 1) {
1447      swiper.virtualSize = (slideSize + params.spaceBetween) * slidesNumber
1447EvenToRows;
1448      swiper.virtualSize = Math.ceil(swiper.virtualSize / params.slidesPerColumn) - params.spaceBetween;
1449      if (swiper.isHorizontal()) { $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
1450      else { $wrapperEl.css({ height: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
1451      if (params.centeredSlides) {
1452        newSlidesGrid = [];
1453        for (var i$1 = 0; i$1 < snapGrid.length; i$1 += 1) {
1454          var slidesGridItem = snapGrid[i$1];
1455          if (params.roundLengths) { slidesGridItem = Math.floor(slidesGridItem); }
1456          if (snapGrid[i$1] < swiper.virtualSize + snapGrid[0]) { newSlidesGrid.push(slidesGridItem); }
1457        }
1458        snapGrid = newSlidesGrid;
1459      }
1460    }
1461
1462    // Remove last grid elements depending on width
1463    if (!params.centeredSlides) {
1464      newSlidesGrid = [];
1465      for (var i$2 = 0; i$2 < snapGrid.length; i$2 += 1) {
1466        var slidesGridItem$1 = snapGrid[i$2];
1467        if (params.roundLengths) { slidesGridItem$1 = Math.floor(slidesGridItem$1); }
1468        if (snapGrid[i$2] <= swiper.virtualSize - swiperSize) {
1469          newSlidesGrid.push(slidesGridItem$1);
1470        }
1471      }
1472      snapGrid = newSlidesGrid;
1473      if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {
1474        snapGrid.push(swiper.virtualSize - swiperSize);
1475      }
1476    }
1477    if (snapGrid.length === 0) { snapGrid = [0]; }
1478
1479    if (params.spaceBetween !== 0) {
1480      if (swiper.isHorizontal()) {
1481        if (rtl) { slides.filter(slidesForMargin).css({ marginLeft: (spaceBetween + "px") }); }
1482        else { slides.filter(slidesForMargin).css({ marginRight: (spaceBetween + "px") }); }
1483      } else { slides.filter(slidesForMargin).css({ marginBottom: (spaceBetween + "px") }); }
1484    }
1485
1486    if (params.centeredSlides && params.centeredSlidesBounds) {
1487      var allSlidesSize = 0;
1488      slidesSizesGrid.forEach(function (slideSizeValue) {
1489        allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);
1490      });
1491      allSlidesSize -= params.spaceBetween;
1492      var maxSnap = allSlidesSize - swiperSize;
1493      snapGrid = snapGrid.map(function (snap) {
1494        if (snap < 0) { return -offsetBefore; }
1495        if (snap > maxSnap) { return maxSnap + offsetAfter; }
1496        return snap;
1497      });
1498    }
1499
1500    if (params.centerInsufficientSlides) {
1501      var allSlidesSize$1 = 0;
1502      slidesSizesGrid.forEach(function (slideSizeValue) {
1503        allSlidesSize$1 += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);
1504      });
1505      allSlidesSize$1 -= params.spaceBetween;
1506      if (allSlidesSize$1 < swiperSize) {
1507        var allSlidesOffset = (swiperSize - allSlidesSize$1) / 2;
1508        snapGrid.forEach(function (snap, snapIndex) {
1509          snapGrid[snapIndex] = snap - allSlidesOffset;
1510        });
1511        slidesGrid.forEach(function (snap, snapIndex) {
1512          slidesGrid[snapIndex] = snap + allSlidesOffset;
1513        });
1514      }
1515    }
1516
1517    Utils.extend(swiper, {
1518      slides: slides,
1519      snapGrid: snapGrid,
1520      slidesGrid: slidesGrid,
1521      slidesSizesGrid: slidesSizesGrid,
1522    });
1523
1524    if (slidesLength !== previousSlidesLength) {
1525      swiper.emit('slidesLengthChange');
1526    }
1527    if (snapGrid.length !== previousSnapGridLength) {
1528      if (swiper.params.watchOverflow) { swiper.checkOverflow(); }
1529      swiper.emit('snapGridLengthChange');
1530    }
1531    if (slidesGrid.length !== previousSlidesGridLength) {
1532      swiper.emit('slidesGridLengthChange');
1533    }
1534
1535    if (params.watchSlidesProgress || params.watchSlidesVisibility) {
1536      swiper.updateSlidesOffset();
1537    }
1538  }
1539
1540  function updateAutoHeight (speed) {
1541    var swiper = this;
1542    var activeSlides = [];
1543    var newHeight = 0;
1544    var i;
1545    if (typeof speed === 'number') {
1546      swiper.setTransition(speed);
1547    } else if (speed === true) {
1548      swiper.setTransition(swiper.params.speed);
1549    }
1550    // Find slides currently in view
1551    if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {
1552      if (swiper.params.centeredSlides) { activeSlides.push.apply(activeSlides, swiper.visibleSlides); }
1553      else {
1554        for (i = 0;
1554 i < Math.ceil(swiper.params.slidesPerView); i += 1) {
1555          var index = swiper.activeIndex + i;
1556          if (index > swiper.slides.length) { break; }
1557          activeSlides.push(swiper.slides.eq(index)[0]);
1558        }
1559      }
1560    } else {
1561      activeSlides.push(swiper.slides.eq(swiper.activeIndex)[0]);
1562    }
1563
1564    // Find new height from highest slide in view
1565    for (i = 0; i < activeSlides.length; i += 1) {
1566      if (typeof activeSlides[i] !== 'undefined') {
1567        var height = activeSlides[i].offsetHeight;
1568        newHeight = height > newHeight ? height : newHeight;
1569      }
1570    }
1571
1572    // Update Height
1573    if (newHeight) { swiper.$wrapperEl.css('height', (newHeight + "px")); }
1574  }
1575
1576  function updateSlidesOffset () {
1577    var swiper = this;
1578    var slides = swiper.slides;
1579    for (var i = 0; i < slides.length; i += 1) {
1580      slides[i].swiperSlideOffset = swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop;
1581    }
1582  }
1583
1584  function updateSlidesProgress (translate) {
1585    if ( translate === void 0 ) translate = (this && this.translate) || 0;
1586
1587    var swiper = this;
1588    var params = swiper.params;
1589
1590    var slides = swiper.slides;
1591    var rtl = swiper.rtlTranslate;
1592
1593    if (slides.length === 0) { return; }
1594    if (typeof slides[0].swiperSlideOffset === 'undefined') { swiper.updateSlidesOffset(); }
1595
1596    var offsetCenter = -translate;
1597    if (rtl) { offsetCenter = translate; }
1598
1599    // Visible Slides
1600    slides.removeClass(params.slideVisibleClass);
1601
1602    swiper.visibleSlidesIndexes = [];
1603    swiper.visibleSlides = [];
1604
1605    for (var i = 0; i < slides.length; i += 1) {
1606      var slide = slides[i];
1607      var slideProgress = (
1608        (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0)) - slide.swiperSlideOffset
1609      ) / (slide.swiperSlideSize + params.spaceBetween);
1610      if (params.watchSlidesVisibility || (params.centeredSlides && params.autoHeight)) {
1611        var slideBefore = -(offsetCenter - slide.swiperSlideOffset);
1612        var slideAfter = slideBefore + swiper.slidesSizesGrid[i];
1613        var isVisible = (slideBefore >= 0 && slideBefore < swiper.size - 1)
1614                  || (slideAfter > 1 && slideAfter <= swiper.size)
1615                  || (slideBefore <= 0 && slideAfter >= swiper.size);
1616        if (isVisible) {
1617          swiper.visibleSlides.push(slide);
1618          swiper.visibleSlidesIndexes.push(i);
1619          slides.eq(i).addClass(params.slideVisibleClass);
1620        }
1621      }
1622      slide.progress = rtl ? -slideProgress : slideProgress;
1623    }
1624    swiper.visibleSlides = $(swiper.visibleSlides);
1625  }
1626
1627  function updateProgress (translate) {
1628    var swiper = this;
1629    if (typeof translate === 'undefined') {
1630      var multiplier = swiper.rtlTranslate ? -1 : 1;
1631      // eslint-disable-next-line
1632      translate = (swiper && swiper.translate && (swiper.translate * multiplier)) || 0;
1633    }
1634    var params = swiper.params;
1635    var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
1636    var progress = swiper.progress;
1637    var isBeginning = swiper.isBeginning;
1638    var isEnd = swiper.isEnd;
1639    var wasBeginning = isBeginning;
1640    var wasEnd = isEnd;
1641    if (translatesDiff === 0) {
1642      progress = 0;
1643      isBeginning = true;
1644      isEnd = true;
1645    } else {
1646      progress = (translate - swiper.minTranslate()) / (translatesDiff);
1647      isBeginning = progress <= 0;
1648      isEnd = progress >= 1;
1649    }
1650    Utils.extend(swiper, {
1651      progress: progress,
1652      isBeginning: isBeginning,
1653      isEnd: isEnd,
1654    });
1655
1656    if (params.watchSlidesProgress || params.watchSlidesVisibility || (params.centeredSlides && params.autoHeight)) { swiper.updateSlidesProgress(translate); }
1657
1658    if (isBeginning && !wasBeginning) {
1659      swiper.emit('reachBeginning toEdge');
1660    }
1661    if (isEnd && !wasEnd) {
1662      swiper.emit('reachEnd toEdge');
1663    }
1664    if ((wasBeginning && !isBeginning) || (wasEnd && !isEnd)) {
1665      swiper.emit('fromEdge');
1666    }
1667
1668    swiper.emit('progress', progress);
1669  }
1670
1671  function updateSlidesClasses () {
1672    var swiper = this;
1673
1674    var slides = swiper.slides;
1675    var params = swiper.params;
1676    var $wrapperEl = swiper.$wrapperEl;
1677    var activeIndex = swiper.activeIndex;
1678    var realIndex = swiper.realIndex;
1679    var isVirtual = swiper.virtual && params.virtual.enabled;
1680
1681    slides.removeClass(((params.slideActiveClass) + " " + (params.slideNextClass) + " " + (params.slidePrevClass) + " " + (params.slideDuplicateActiveClass) + " " + (params.slideDuplicateNextClass) + " " + (params.slideDuplicatePrevClass)));
1682
1683    var activeSlide;
1684    if (isVirtual) {
1685      activeSlide = swiper.$wrapperEl.find(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + activeIndex + "\"]"));
1686    } else {
1687      activeSlide = slides.eq(activeIndex);
1688    }
1689
1690    // Active classes
1691    activeSlide.addClass(params.slideActiveClass);
1692
1693    if (params.loop) {
1694      // Duplicate to all looped slides
1695      if (activeSlide.hasClass(params.slideDuplicateClass)) {
1696        $wrapperEl
1697          .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + realIndex + "\"]"))
1698          .addClass(params.slideDuplicateActiveClass);
1699      } else {
1700        $wrapperEl
1701          .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]"))
1702          .addClass(params.slideDuplicateActiveClass);
1703      }
1704    }
1705    // Next Slide
1706    var nextSlide = activeSlide.nextAll(("." + (params.slideClass))).eq(0).addClass(params.slideNextClass);
1707    if (params.loop && nextSlide.length === 0) {
1708      nextSlide = slides.eq(0);
1709      nextSlide.addClass(params.slideNextClass);
1710    }
1711    // Prev Slide
1712    var prevSlide = activeSlide.prevAll(("." + (params.slideClass))).eq(0).addClass(params.slidePrevClass);
1713    if (params.loop && prevSlide.length === 0) {
1714      prevSlide = slides.eq(-1);
1715      prevSlide.addClass(params.slidePrevClass);
1716    }
1717    if (params.loop) {
1718      // Duplicate to all looped slides
1719      if (nextSlide.hasClass(params.slideDuplicateClass)) {
1720        $wrapperEl
1721          .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + (nextSlide.attr('data-swiper-slide-index')) + "\"]"))
1722          .addClass(params.slideDuplicateNextClass);
1723      } else {
1724        $wrapperEl
1725          .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + (nextSlide.attr('data-swiper-slide-index')) + "\"]"))
1726          .addClass(params.slideDuplicateNextClass);
1727      }
1728      if (prevSlide.hasClass(params.slideDuplicateClass)) {
1729        $wrapperEl
1730          .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + (prevSlide.attr('data-swiper-slide-index')) + "\"]"))
1731          .addClass(params.slideDuplicatePrevClass);
1732      } else {
1733        $wrapperEl
1734          .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + (prevSlide.attr('data-swiper-slide-index')) + "\"]"))
1735          .addClass(params.slideDuplicatePrevClass);
1736      }
1737    }
1738  }
1739
1740  function updateActiveIndex (newActiveIndex) {
1741    var swiper = this;
1742    var translate = swiper.rtlTranslate ? swiper.translate : -swi
1742per.translate;
1743    var slidesGrid = swiper.slidesGrid;
1744    var snapGrid = swiper.snapGrid;
1745    var params = swiper.params;
1746    var previousIndex = swiper.activeIndex;
1747    var previousRealIndex = swiper.realIndex;
1748    var previousSnapIndex = swiper.snapIndex;
1749    var activeIndex = newActiveIndex;
1750    var snapIndex;
1751    if (typeof activeIndex === 'undefined') {
1752      for (var i = 0; i < slidesGrid.length; i += 1) {
1753        if (typeof slidesGrid[i + 1] !== 'undefined') {
1754          if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - ((slidesGrid[i + 1] - slidesGrid[i]) / 2)) {
1755            activeIndex = i;
1756          } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {
1757            activeIndex = i + 1;
1758          }
1759        } else if (translate >= slidesGrid[i]) {
1760          activeIndex = i;
1761        }
1762      }
1763      // Normalize slideIndex
1764      if (params.normalizeSlideIndex) {
1765        if (activeIndex < 0 || typeof activeIndex === 'undefined') { activeIndex = 0; }
1766      }
1767    }
1768    if (snapGrid.indexOf(translate) >= 0) {
1769      snapIndex = snapGrid.indexOf(translate);
1770    } else {
1771      var skip = Math.min(params.slidesPerGroupSkip, activeIndex);
1772      snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);
1773    }
1774    if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; }
1775    if (activeIndex === previousIndex) {
1776      if (snapIndex !== previousSnapIndex) {
1777        swiper.snapIndex = snapIndex;
1778        swiper.emit('snapIndexChange');
1779      }
1780      return;
1781    }
1782
1783    // Get real index
1784    var realIndex = parseInt(swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex, 10);
1785
1786    Utils.extend(swiper, {
1787      snapIndex: snapIndex,
1788      realIndex: realIndex,
1789      previousIndex: previousIndex,
1790      activeIndex: activeIndex,
1791    });
1792    swiper.emit('activeIndexChange');
1793    swiper.emit('snapIndexChange');
1794    if (previousRealIndex !== realIndex) {
1795      swiper.emit('realIndexChange');
1796    }
1797    if (swiper.initialized || swiper.runCallbacksOnInit) {
1798      swiper.emit('slideChange');
1799    }
1800  }
1801
1802  function updateClickedSlide (e) {
1803    var swiper = this;
1804    var params = swiper.params;
1805    var slide = $(e.target).closest(("." + (params.slideClass)))[0];
1806    var slideFound = false;
1807    if (slide) {
1808      for (var i = 0; i < swiper.slides.length; i += 1) {
1809        if (swiper.slides[i] === slide) { slideFound = true; }
1810      }
1811    }
1812
1813    if (slide && slideFound) {
1814      swiper.clickedSlide = slide;
1815      if (swiper.virtual && swiper.params.virtual.enabled) {
1816        swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10);
1817      } else {
1818        swiper.clickedIndex = $(slide).index();
1819      }
1820    } else {
1821      swiper.clickedSlide = undefined;
1822      swiper.clickedIndex = undefined;
1823      return;
1824    }
1825    if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {
1826      swiper.slideToClickedSlide();
1827    }
1828  }
1829
1830  var update = {
1831    updateSize: updateSize,
1832    updateSlides: updateSlides,
1833    updateAutoHeight: updateAutoHeight,
1834    updateSlidesOffset: updateSlidesOffset,
1835    updateSlidesProgress: updateSlidesProgress,
1836    updateProgress: updateProgress,
1837    updateSlidesClasses: updateSlidesClasses,
1838    updateActiveIndex: updateActiveIndex,
1839    updateClickedSlide: updateClickedSlide,
1840  };
1841
1842  function getTranslate (axis) {
1843    if ( axis === void 0 ) axis = this.isHorizontal() ? 'x' : 'y';
1844
1845    var swiper = this;
1846
1847    var params = swiper.params;
1848    var rtl = swiper.rtlTranslate;
1849    var translate = swiper.translate;
1850    var $wrapperEl = swiper.$wrapperEl;
1851
1852    if (params.virtualTranslate) {
1853      return rtl ? -translate : translate;
1854    }
1855    if (params.cssMode) {
1856      return translate;
1857    }
1858
1859    var currentTranslate = Utils.getTranslate($wrapperEl[0], axis);
1860    if (rtl) { currentTranslate = -currentTranslate; }
1861
1862    return currentTranslate || 0;
1863  }
1864
1865  function setTranslate (translate, byController) {
1866    var swiper = this;
1867    var rtl = swiper.rtlTranslate;
1868    var params = swiper.params;
1869    var $wrapperEl = swiper.$wrapperEl;
1870    var wrapperEl = swiper.wrapperEl;
1871    var progress = swiper.progress;
1872    var x = 0;
1873    var y = 0;
1874    var z = 0;
1875
1876    if (swiper.isHorizontal()) {
1877      x = rtl ? -translate : translate;
1878    } else {
1879      y = translate;
1880    }
1881
1882    if (params.roundLengths) {
1883      x = Math.floor(x);
1884      y = Math.floor(y);
1885    }
1886
1887    if (params.cssMode) {
1888      wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;
1889    } else if (!params.virtualTranslate) {
1890      $wrapperEl.transform(("translate3d(" + x + "px, " + y + "px, " + z + "px)"));
1891    }
1892    swiper.previousTranslate = swiper.translate;
1893    swiper.translate = swiper.isHorizontal() ? x : y;
1894
1895    // Check if we need to update progress
1896    var newProgress;
1897    var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
1898    if (translatesDiff === 0) {
1899      newProgress = 0;
1900    } else {
1901      newProgress = (translate - swiper.minTranslate()) / (translatesDiff);
1902    }
1903    if (newProgress !== progress) {
1904      swiper.updateProgress(translate);
1905    }
1906
1907    swiper.emit('setTranslate', swiper.translate, byController);
1908  }
1909
1910  function minTranslate () {
1911    return (-this.snapGrid[0]);
1912  }
1913
1914  function maxTranslate () {
1915    return (-this.snapGrid[this.snapGrid.length - 1]);
1916  }
1917
1918  function translateTo (translate, speed, runCallbacks, translateBounds, internal) {
1919    var obj;
1920
1921    if ( translate === void 0 ) translate = 0;
1922    if ( speed === void 0 ) speed = this.params.speed;
1923    if ( runCallbacks === void 0 ) runCallbacks = true;
1924    if ( translateBounds === void 0 ) translateBounds = true;
1925    var swiper = this;
1926
1927    var params = swiper.params;
1928    var wrapperEl = swiper.wrapperEl;
1929
1930    if (swiper.animating && params.preventInteractionOnTransition) {
1931      return false;
1932    }
1933
1934    var minTranslate = swiper.minTranslate();
1935    var maxTranslate = swiper.maxTranslate();
1936    var newTranslate;
1937    if (translateBounds && translate > minTranslate) { newTranslate = minTranslate; }
1938    else if (translateBounds && translate < maxTranslate) { newTranslate = maxTranslate; }
1939    else { newTranslate = translate; }
1940
1941    // Update progress
1942    swiper.updateProgress(newTranslate);
1943
1944    if (params.cssMode) {
1945      var isH = swiper.isHorizontal();
1946      if (speed === 0) {
1947        wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;
1948      } else {
1949        // eslint-disable-next-line
1950        if (wrapperEl.scrollTo) {
1951          wrapperEl.scrollTo(( obj = {}, obj[isH ? 'left' : 'top'] = -newTranslate, obj.behavior = 'smooth', obj ));
1952        } else {
1953          wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;
1954        }
1955      }
1956      return true;
1957    }
1958
1959    if (speed === 0) {
1960      swiper.setTransition(0);
1961      swiper.setTranslate(newTranslate);
1962      if (runCallbacks) {
1963        swiper.emit('beforeTransitionStart', speed, internal);
1964        swiper.emit('transitionEnd');
1965      }
1966    } else {
1967      swiper.setTransition(speed);
1968      swiper.setTranslate(newTranslate);
1969      if (runCallbacks) {
1970        swiper.emit('beforeTransitionStart', speed, internal);
1971        swiper.emit('transitionStart');
1972      }
1973      if (!swiper.animating) {
1974        swiper.animating = true;
1975        if (!swiper.onTranslateToWrapperTransitionEnd) {
1976          swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {
1977            if (!swiper || swiper.destroyed) { return; }
1978            if (e.target !== this) { return; }
1979            swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);
1980            swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd);
1981            swiper.onTranslateToWrapperTransitionEnd = null;
1982            delete swiper.onTranslateToWrapperTransitionEnd;
1983            if (runCallbacks) {
1984              swiper.emit('transitionEnd');
1985            }
1986          };
1987        }
1988        swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);
1989        swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd);
1990      }
1991    }
1992
1993    return true;
1994  }
1995
1996  var translate = {
1997    getTranslate: getTranslate,
1998    setTranslate: setTranslate,
1999    minTranslate: minTranslate,
2000    maxTranslate: maxTranslate,
2001    translateTo: translateTo,
2002  };
2003
2004  function setTransition (duration, byController) {
2005    var swiper = this;
2006
2007    if (!swiper.params.cssMode) {
2008      swiper.$wrapperEl.transition(duration);
2009    }
2010
2011    swiper.emit('setTransition', duration, byController);
2012  }
2013
2014  function transitionStart (runCallbacks, direction) {
2015    if ( runCallbacks === void 0 ) runCallbacks = true;
2016
2017    var swiper = this;
2018    var activeIndex = swiper.activeIndex;
2019    var params = swiper.params;
2020    var previousIndex = swiper.previousIndex;
2021    if (params.cssMode) { return; }
2022    if (params.autoHeight) {
2023      swiper.updateAutoHeight();
2024    }
2025
2026    var dir = direction;
2027    if (!dir) {
2028      if (activeIndex > previousIndex) { dir = 'next'; }
2029      else if (activeIndex < previousIndex) { dir = 'prev'; }
2030      else { dir = 'reset'; }
2031    }
2032
2033    swiper.emit('transitionStart');
2034
2035    if (runCallbacks && activeIndex !== previousIndex) {
2036      if (dir === 'reset') {
2037        swiper.emit('slideResetTransitionStart');
2038        return;
2039      }
2040      swiper.emit('slideChangeTransitionStart');
2041      if (dir === 'next') {
2042        swiper.emit('slideNextTransitionStart');
2043      } else {
2044        swiper.emit('slidePrevTransitionStart');
2045      }
2046    }
2047  }
2048
2049  function transitionEnd$1 (runCallbacks, direction) {
2050    if ( runCallbacks === void 0 ) runCallbacks = true;
2051
2052    var swiper = this;
2053    var activeIndex = swiper.activeIndex;
2054    var previousIndex = swiper.previousIndex;
2055    var params = swiper.params;
2056    swiper.animating = false;
2057    if (params.cssMode) { return; }
2058    swiper.setTransition(0);
2059
2060    var dir = direction;
2061    if (!dir) {
2062      if (activeIndex > previousIndex) { dir = 'next'; }
2063      else if (activeIndex < previousIndex) { dir = 'prev'; }
2064      else { dir = 'reset'; }
2065    }
2066
2067    swiper.emit('transitionEnd');
2068
2069    if (runCallbacks && activeIndex !== previousIndex) {
2070      if (dir === 'reset') {
2071        swiper.emit('slideResetTransitionEnd');
2072        return;
2073      }
2074      swiper.emit('slideChangeTransitionEnd');
2075      if (dir === 'next') {
2076        swiper.emit('slideNextTransitionEnd');
2077      } else {
2078        swiper.emit('slidePrevTransitionEnd');
2079      }
2080    }
2081  }
2082
2083  var transition$1 = {
2084    setTransition: setTransition,
2085    transitionStart: transitionStart,
2086    transitionEnd: transitionEnd$1,
2087  };
2088
2089  function slideTo (index, speed, runCallbacks, internal) {
2090    var obj;
2091
2092    if ( index === void 0 ) index = 0;
2093    if ( speed === void 0 ) speed = this.params.speed;
2094    if ( runCallbacks === void 0 ) runCallbacks = true;
2095    var swiper = this;
2096    var slideIndex = index;
2097    if (slideIndex < 0) { slideIndex = 0; }
2098
2099    var params = swiper.params;
2100    var snapGrid = swiper.snapGrid;
2101    var slidesGrid = swiper.slidesGrid;
2102    var previousIndex = swiper.previousIndex;
2103    var activeIndex = swiper.activeIndex;
2104    var rtl = swiper.rtlTranslate;
2105    var wrapperEl = swiper.wrapperEl;
2106    if (swiper.animating && params.preventInteractionOnTransition) {
2107      return false;
2108    }
2109
2110    var skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);
2111    var snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);
2112    if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; }
2113
2114    if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {
2115      swiper.emit('beforeSlideChangeStart');
2116    }
2117
2118    var translate = -snapGrid[snapIndex];
2119
2120    // Update progress
2121    swiper.updateProgress(translate);
2122
2123    // Normalize slideIndex
2124    if (params.normalizeSlideIndex) {
2125      for (var i = 0; i < slidesGrid.length; i += 1) {
2126        if (-Math.floor(translate * 100) >= Math.floor(slidesGrid[i] * 100)) {
2127          slideIndex = i;
2128        }
2129      }
2130    }
2131    // Directions locks
2132    if (swiper.initialized && slideIndex !== activeIndex) {
2133      if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) {
2134        return false;
2135      }
2136      if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {
2137        if ((activeIndex || 0) !== slideIndex) { return false; }
2138      }
2139    }
2140
2141    var direction;
2142    if (slideIndex > activeIndex) { direction = 'next'; }
2143    else if (slideIndex < activeIndex) { direction = 'prev'; }
2144    else { direction = 'reset'; }
2145
2146
2147    // Update Index
2148    if ((rtl && -translate === swiper.translate) || (!rtl && translate === swiper.translate)) {
2149      swiper.updateActiveIndex(slideIndex);
2150      // Update Height
2151      if (params.autoHeight) {
2152        swiper.updateAutoHeight();
2153      }
2154      swiper.updateSlidesClasses();
2155      if (params.effect !== 'slide') {
2156        swiper.setTranslate(translate);
2157      }
2158      if (direction !== 'reset') {
2159        swiper.transitionStart(runCallbacks, direction);
2160        swiper.transitionEnd(runCallbacks, direction);
2161      }
2162      return false;
2163    }
2164    if (params.cssMode) {
2165      var isH = swiper.isHorizontal();
2166      if (speed === 0) {
2167        wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -translate;
2168      } else {
2169        // eslint-disable-next-line
2170        if (wrapperEl.scrollTo) {
2171          wrapperEl.scrollTo(( obj = {}, obj[isH ? 'left' : 'top'] = -translate, obj.behavior = 'smooth', obj ));
2172        } else {
2173          wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -translate;
2174        }
2175      }
2176      return true;
2177    }
2178
2179    if (speed === 0) {
2180      swiper.setTransition(0);
2181      swiper.setTranslate(translate);
2182      swiper.updateActiveIndex(slideIndex);
2183      swiper.updateSlidesClasses();
2184      swiper.emit('beforeTransitionStart', speed, internal);
2185      swiper.transitionStart(runCallbacks, direction);
2186      swiper.transitionEnd(runCallbacks, direction);
2187    } else {
2188      swiper.setTransition(speed);
2189      swiper.setTranslate(translate);
2190      swiper.updateActiveIndex(slideIndex);
2191      swiper.updateSlidesClasses();
2192      swiper.emit('beforeTransitionStart', speed, internal);
2193      swiper.transitionStart(runCallbacks, direction);
2194      if (!swiper.animating) {
2195        swiper.animating = true;
2196        if (!swiper.onSlideToWrapperTransitionEnd) {
2197          swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {
2198            if (!swiper || swiper.destroyed) { return; }
2199            if (e.target !== this) { return; }
2200            swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
2201            swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);
2202            swiper.onSlideToWrapperTransitionEnd = null;
2203            delete swiper.onSlideToWrapperTransitionEnd;
2204            swiper.transitionEnd(runCallbacks, direction);
2205          };
2206        }
2207        swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
2208        swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);
2209      }
2210    }
2211
2212    return true;
2213  }
2214
2215  function slideToLoop (index, speed, runCallbacks, internal) {
2216    if ( index === void 0 ) index = 0;
2217    if ( speed === void 0 ) speed = this.params.speed;
2218    if ( runCallbacks === void 0 ) runCallbacks = true;
2219
2220    var swiper = this;
2221    var newIndex = index;
2222    if (swiper.params.loop) {
2223      newIndex += swiper.loopedSlides;
2224    }
2225
2226    return swiper.slideTo(newIndex, speed, runCallbacks, internal);
2227  }
2228
2229  /* eslint no-unused-vars: "off" */
2230  function slideNext (speed, runCallbacks, internal) {
2231    if ( speed === void 0 ) speed = this.params.speed;
2232    if ( runCallbacks === void 0 ) runCallbacks = true;
2233
2234    var swiper = this;
2235    var params = swiper.params;
2236    var animating = swiper.animating;
2237    var increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup;
2238    if (params.loop) {
2239      if (animating) { return false; }
2240      swiper.loopFix();
2241      // eslint-disable-next-line
2242      swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
2243    }
2244    return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);
2245  }
2246
2247  /* eslint no-unused-vars: "off" */
2248  function slidePrev (speed, runCallbacks, internal) {
2249    if ( speed === void 0 ) speed = this.params.speed;
2250    if ( runCallbacks === void 0 ) runCallbacks = true;
2251
2252    var swiper = this;
2253    var params = swiper.params;
2254    var animating = swiper.animating;
2255    var snapGrid = swiper.snapGrid;
2256    var slidesGrid = swiper.slidesGrid;
2257    var rtlTranslate = swiper.rtlTranslate;
2258
2259    if (params.loop) {
2260      if (animating) { return false; }
2261      swiper.loopFix();
2262      // eslint-disable-next-line
2263      swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
2264    }
2265    var translate = rtlTranslate ? swiper.translate : -swiper.translate;
2266    function normalize(val) {
2267      if (val < 0) { return -Math.floor(Math.abs(val)); }
2268      return Math.floor(val);
2269    }
2270    var normalizedTranslate = normalize(translate);
2271    var normalizedSnapGrid = snapGrid.map(function (val) { return normalize(val); });
2272    var normalizedSlidesGrid = slidesGrid.map(function (val) { return normalize(val); });
2273
2274    var currentSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate)];
2275    var prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];
2276    if (typeof prevSnap === 'undefined' && params.cssMode) {
2277      snapGrid.forEach(function (snap) {
2278        if (!prevSnap && normalizedTranslate >= snap) { prevSnap = snap; }
2279      });
2280    }
2281    var prevIndex;
2282    if (typeof prevSnap !== 'undefined') {
2283      prevIndex = slidesGrid.indexOf(prevSnap);
2284      if (prevIndex < 0) { prevIndex = swiper.activeIndex - 1; }
2285    }
2286    return swiper.slideTo(prevIndex, speed, runCallbacks, internal);
2287  }
2288
2289  /* eslint no-unused-vars: "off" */
2290  function slideReset (speed, runCallbacks, internal) {
2291    if ( speed === void 0 ) speed = this.params.speed;
2292    if ( runCallbacks === void 0 ) runCallbacks = true;
2293
2294    var swiper = this;
2295    return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);
2296  }
2297
2298  /* eslint no-unused-vars: "off" */
2299  function slideToClosest (speed, runCallbacks, internal, threshold) {
2300    if ( speed === void 0 ) speed = this.params.speed;
2301    if ( runCallbacks === void 0 ) runCallbacks = true;
2302    if ( threshold === void 0 ) threshold = 0.5;
2303
2304    var swiper = this;
2305    var index = swiper.activeIndex;
2306    var skip = Math.min(swiper.params.slidesPerGroupSkip, index);
2307    var snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);
2308
2309    var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
2310
2311    if (translate >= swiper.snapGrid[snapIndex]) {
2312      // The current translate is on or after the current snap index, so the choice
2313      // is between the current index and the one after it.
2314      var currentSnap = swiper.snapGrid[snapIndex];
2315      var nextSnap = swiper.snapGrid[snapIndex + 1];
2316      if ((translate - currentSnap) > (nextSnap - currentSnap) * threshold) {
2317        index += swiper.params.slidesPerGroup;
2318      }
2319    } else {
2320      // The current translate is before the current snap index, so the choice
2321      // is between the current index and the one before it.
2322      var prevSnap = swiper.snapGrid[snapIndex - 1];
2323      var currentSnap$1 = swiper.snapGrid[snapIndex];
2324      if ((translate - prevSnap) <= (currentSnap$1 - prevSnap) * threshold) {
2325        index -= swiper.params.slidesPerGroup;
2326      }
2327    }
2328    index = Math.max(index, 0);
2329    index = Math.min(index, swiper.slidesGrid.length - 1);
2330
2331    return swiper.slideTo(index, speed, runCallbacks, internal);
2332  }
2333
2334  function slideToClickedSlide () {
2335    var swiper = this;
2336    var params = swiper.params;
2337    var $wrapperEl = swiper.$wrapperEl;
2338
2339    var slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;
2340    var slideToIndex = swiper.clickedIndex;
2341    var realIndex;
2342    if (params.loop) {
2343      if (swiper.animating) { return; }
2344      realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10);
2345      if (params.centeredSlides) {
2346        if (
2347          (slideToIndex < swiper.loopedSlides - (slidesPerView / 2))
2348          || (slideToIndex > (swiper.slides.length - swiper.loopedSlides) + (slidesPerView / 2))
2349        ) {
2350          swiper.loopFix();
2351          slideToIndex = $wrapperEl
2352            .children(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]:not(." + (params.slideDuplicateClass) + ")"))
2353            .eq(0)
2354            .index();
2355
2356          Utils.nextTick(function () {
2357            swiper.slideTo(slideToIndex);
2358          });
2359        } else {
2360          swiper.slideTo(slideToIndex);
2361        }
2362      } else if (slideToIndex > swiper.slides.length - slidesPerView) {
2363        swiper.loopFix();
2364        slideToIndex = $wrapperEl
2365          .children(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]:not(." + (params.slideDuplicateClass) + ")"))
2366          .eq(0)
2367          .index();
2368
2369        Utils.nextTick(function () {
2370          swiper.slideTo(slideToIndex);
2371        });
2372      } else {
2373        swiper.slideTo(slideToIndex);
2374      }
2375    } else {
2376      swiper.slideTo(slideToIndex);
2377    }
2378  }
2379
2380  var slide = {
2381    slideTo: slideTo,
2382    slideToLoop: slideToLoop,
2383    slideNext: slideNext,
2384    slidePrev: slidePrev,
2385    slideReset: slideReset,
2386    slideToClosest: slideToClosest,
2387    slideToClickedSlide: slideToClickedSlide,
2388  };
2389
2390  function loopCreate () {
2391    var swiper = this;
2392    var params = swiper.params;
2393    var $wrapperEl = swiper.$wrapperEl;
2394    // Remove duplicated slides
2395    $wrapperEl.children(("." + (params.slideClass) + "." + (params.slideDuplicateClass))).remove();
2396
2397    var slides = $wrapperEl.children(("." + (params.slideClass)));
2398
2399    if (params.loopFillGroupWithBlank) {
2400      var blankSlidesNum = params.slidesPerGroup - (slides.length % params.slidesPerGroup);
2401      if (blankSlidesNum !== params.slidesPerGroup) {
2402        for (var i = 0; i < blankSlidesNum; i += 1) {
2403          var blankNode = $(doc.createElement('div')).addClass(((params.slideClass) + " " + (params.slideBlankClass)));
2404          $wrapperEl.append(blankNode);
2405        }
2406        slides = $wrapperEl.children(("." + (params.slideClass)));
2407      }
2408    }
2409
2410    if (params.slidesPerView === 'auto' && !params.loopedSlides) { params.loopedSlides = slides.length; }
2411
2412    swiper.loopedSlides = Math.ceil(parseFloat(params.loopedSlides || params.slidesPerView, 10));
2413    swiper.loopedSlides += params.loopAdditionalSlides;
2414    if (swiper.loopedSlides > slides.length) {
2415      swiper.loopedSlides = slides.length;
2416    }
2417
2418    var prependSlides = [];
2419    var appendSlides = [];
2420    slides.each(function (index, el) {
2421      var slide = $(el);
2422      if (index < swiper.loopedSlides) { appendSlides.push(el); }
2423      if (index < slides.length && index >= slides.length - swiper.loopedSlides) { prependSlides.push(el); }
2424      slide.attr('data-swiper-slide-index', index);
2425    });
2426    for (var i$1 = 0; i$1 < appendSlides.length; i$1 += 1) {
2427      $wrapperEl.append($(appendSlides[i$1].cloneNode(true)).addClass(params.slideDuplicateClass));
2428    }
2429    for (var i$2 = prependSlides.length - 1; i$2 >= 0; i$2 -= 1) {
2430      $wrapperEl.prepend($(prependSlides[i$2].cloneNode(true)).addClass(params.slideDuplicateClass));
2431    }
2432  }
2433
2434  function loopFix () {
2435    var swiper = this;
2436
2437    swiper.emit('beforeLoopFix');
2438
2439    var activeIndex = swiper.activeIndex;
2440    var slides = swiper.slides;
2441    var loopedSlides = swiper.loopedSlides;
2442    var allowSlidePrev = swiper.allowSlidePrev;
2443    var allowSlideNext = swiper.allowSlideNext;
2444    var snapGrid = swiper.snapGrid;
2445    var rtl = swiper.rtlTranslate;
2446    var newIndex;
2447    swiper.allowSlidePrev = true;
2448    swiper.allowSlideNext = true;
2449
2450    var snapTranslate = -snapGrid[activeIndex];
2451    var diff = snapTranslate - swiper.getTranslate();
2452
2453    // Fix For Negative Oversliding
2454    if (activeIndex < loopedSlides) {
2455      newIndex = (slides.length - (loopedSlides * 3)) + activeIndex;
2456      newIndex += loopedSlides;
2457      var slideChanged = swiper.slideTo(newIndex, 0, false, true);
2458      if (slideChanged && diff !== 0) {
2459        swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);
2460      }
2461    } else if (activeIndex >= slides.length - loopedSlides) {
2462      // Fix For Positive Oversliding
2463      newIndex = -slides.length + activeIndex + loopedSlides;
2464      newIndex += loopedSlides;
2465      var slideChanged$1 = swiper.slideTo(newIndex, 0, false, true);
2466      if (slideChanged$1 && diff !== 0) {
2467        swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);
2468      }
2469    }
2470    swiper.allowSlidePrev = allowSlidePrev;
2471    swiper.allowSlideNext = allowSlideNext;
2472
2473    swiper.emit('loopFix');
2474  }
2475
2476  function loopDestroy () {
2477    var swiper = this;
2478    var $wrapperEl = swiper.$wrapperEl;
2479    var params = swiper.params;
2480    var slides = swiper.slides;
2481    $wrapperEl.children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + ",." + (params.slideClass) + "." + (params.slideBlankClass))).remove();
2482    slides.removeAttr('data-swiper-slide-index');
2483  }
2484
2485  var loop = {
2486    loopCreate: loopCreate,
2487    loopFix: loopFix,
2488    loopDestroy: loopDestroy,
2489  };
2490
2491  function setGrabCursor (moving) {
2492    var swiper = this;
2493    if (Support.touch || !swiper.params.simulateTouch || (swiper.params.watchOverflow && swiper.isLocked) || swiper.params.cssMode) { return; }
2494    var el = swiper.el;
2495    el.style.cursor = 'move';
2496    el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';
2497    el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab';
2498    el.style.cursor = moving ? 'grabbing' : 'grab';
2499  }
2500
2501  function unsetGrabCursor () {
2502    var swiper = this;
2503    if (Support.touch || (swiper.params.watchOverflow && swiper.isLocked) || swiper.params.cssMode) { return; }
2504    swiper.el.style.cursor = '';
2505  }
2506
2507  var grabCursor = {
2508    setGrabCursor: setGrabCursor,
2509    unsetGrabCursor: unsetGrabCursor,
2510  };
2511
2512  function appendSlide (slides) {
2513    var swiper = this;
2514    var $wrapperEl = swiper.$wrapperEl;
2515    var params = swiper.params;
2516    if (params.loop) {
2517      swiper.loopDestroy();
2518    }
2519    if (typeof slides === 'object' && 'length' in slides) {
2520      for (var i = 0; i < slides.length; i += 1) {
2521        if (slides[i]) { $wrapperEl.append(slides[i]); }
2522      }
2523    } else {
2524      $wrapperEl.append(slides);
2525    }
2526    if (params.loop) {
2527      swiper.loopCreate();
2528    }
2529    if (!(params.observer && Support.observer)) {
2530      swiper.update();
2531    }
2532  }
2533
2534  function prependSlide (slides) {
2535    var swiper = this;
2536    var params = swiper.params;
2537    var $wrapperEl = swiper.$wrapperEl;
2538    var activeIndex = swiper.activeIndex;
2539
2540    if (params.loop) {
2541      swiper.loopDestroy();
2542    }
2543    var newActiveIndex = activeIndex + 1;
2544    if (typeof slides === 'object' && 'length' in slides) {
2545      for (var i = 0; i < slides.length; i += 1) {
2546        if (slides[i]) { $wrapperEl.prepend(slides[i]); }
2547      }
2548      newActiveIndex = activeIndex + slides.length;
2549    } else {
2550      $wrapperEl.prepend(slides);
2551    }
2552    if (params.loop) {
2553      swiper.loopCreate();
2554    }
2555    if (!(params.observer && Support.observer)) {
2556      swiper.update();
2557    }
2558    swiper.slideTo(newActiveIndex, 0, false);
2559  }
2560
2561  function addSlide (index, slides) {
2562    var swiper = this;
2563    var $wrapperEl = swiper.$wrapperEl;
2564    var params = swiper.params;
2565    var activeIndex = swiper.activeIndex;
2566    var activeIndexBuffer = activeIndex;
2567    if (params.loop) {
2568      activeIndexBuffer -= swiper.loopedSlides;
2569      swiper.loopDestroy();
2570      swiper.slides = $wrapperEl.children(("." + (params.slideClass)));
2571    }
2572    var baseLength = swiper.slides.length;
2573    if (index <= 0) {
2574      swiper.prependSlide(slides);
2575      return;
2576    }
2577    if (index >= baseLength) {
2578      swiper.appendSlide(slides);
2579      return;
2580    }
2581    var newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;
2582
2583    var slidesBuffer = [];
2584    for (var i = baseLength - 1; i >= index; i -= 1) {
2585      var currentSlide = swiper.slides.eq(i);
2586      currentSlide.remove();
2587      slidesBuffer.unshift(currentSlide);
2588    }
2589
2590    if (typeof slides === 'object' && 'length' in slides) {
2591      for (var i$1 = 0; i$1 < slides.length; i$1 += 1) {
2592        if (slides[i$1]) { $wrapperEl.append(slides[i$1]); }
2593      }
2594      newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;
2595    } else {
2596      $wrapperEl.append(slides);
2597    }
2598
2599    for (var i$2 = 0; i$2 < slidesBuffer.length; i$2 += 1) {
2600      $wrapperEl.append(slidesBuffer[i$2]);
2601    }
2602
2603    if (params.loop) {
2604      swiper.loopCreate();
2605    }
2606    if (!(params.observer && Support.observer)) {
2607      swiper.update();
2608    }
2609    if (params.loop) {
2610      swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
2611    } else {
2612      swiper.slideTo(newActiveIndex, 0, false);
2613    }
2614  }
2615
2616  function removeSlide (slidesIndexes) {
2617    var swiper = this;
2618    var params = swiper.params;
2619    var $wrapperEl = swiper.$wrapperEl;
2620    var activeIndex = swiper.activeIndex;
2621
2622    var activeIndexBuffer = activeIndex;
2623    if (params.loop) {
2624      activeIndexBuffer -= swiper.loopedSlides;
2625      swiper.loopDestroy();
2626      swiper.slides = $wrapperEl.children(("." + (params.slideClass)));
2627    }
2628    var newActiveIndex = activeIndexBuffer;
2629    var indexToRemove;
2630
2631    if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {
2632      for (var i = 0; i < slidesIndexes.length; i += 1) {
2633        indexToRemove = slidesIndexes[i];
2634        if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); }
2635        if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; }
2636      }
2637      newActiveIndex = Math.max(newActiveIndex, 0);
2638    } else {
2639      indexToRemove = slidesIndexes;
2640      if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); }
2641      if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; }
2642      newActiveIndex = Math.max(newActiveIndex, 0);
2643    }
2644
2645    if (params.loop) {
2646      swiper.loopCreate();
2647    }
2648
2649    if (!(params.observer && Support.observer)) {
2650      swiper.update();
2651    }
2652    if (params.loop) {
2653      swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
2654    } else {
2655      swiper.slideTo(newActiveIndex, 0, false);
2656    }
2657  }
2658
2659  function removeAllSlides () {
2660    var swiper = this;
2661
2662    var slidesIndexes = [];
2663    for (var i = 0; i < swiper.slides.length; i += 1) {
2664      slidesIndexes.push(i);
2665    }
2666    swiper.removeSlide(slidesIndexes);
2667  }
2668
2669  var manipulation = {
2670    appendSlide: appendSlide,
2671    prependSlide: prependSlide,
2672    addSlide: addSlide,
2673    removeSlide: removeSlide,
2674    removeAllSlides: removeAllSlides,
2675  };
2676
2677  var Device = (function Device() {
2678    var platform = win.navigator.platform;
2679    var ua = win.navigator.userAgent;
2680
2681    var device = {
2682      ios: false,
2683      android: false,
2684      androidChrome: false,
2685      desktop: false,
2686      iphone: false,
2687      ipod: false,
2688      ipad: false,
2689      edge: false,
2690      ie: false,
2691      firefox: false,
2692      macos: false,
2693      windows: false,
2694      cordova: !!(win.cordova || win.phonegap),
2695      phonegap: !!(win.cordova || win.phonegap),
2696      electron: false,
2697    };
2698
2699    var screenWidth = win.screen.width;
2700    var screenHeight = win.screen.height;
2701
2702    var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line
2703    var ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
2704    var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/);
2705    var iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/);
2706    var ie = ua.indexOf('MSIE ') >= 0 || ua.indexOf('Trident/') >= 0;
2707    var edge = ua.indexOf('Edge/') >= 0;
2708    var firefox = ua.indexOf('Gecko/') >= 0 && ua.indexOf('Firefox/') >= 0;
2709    var windows = platform === 'Win32';
2710    var electron = ua.toLowerCase().indexOf('electron') >= 0;
2711    var macos = platform === 'MacIntel';
2712
2713    // iPadOs 13 fix
2714    if (!ipad
2715      && macos
2716      && Support.touch
2717      && (
2718        (screenWidth === 1024 && screenHeight === 1366) // Pro 12.9
2719        || (screenWidth === 834 && screenHeight === 1194) // Pro 11
2720        || (screenWidth === 834 && screenHeight === 1112) // Pro 10.5
2721        || (screenWidth === 768 && screenHeight === 1024) // other
2722      )
2723    ) {
2724      ipad = ua.match(/(Version)\/([\d.]+)/);
2725      macos = false;
2726    }
2727
2728    device.ie = ie;
2729    device.edge = edge;
2730    device.firefox = firefox;
2731
2732    // Android
2733    if (android && !windows) {
2734      device.os = 'android';
2735      device.osVersion = android[2];
2736      device.android = true;
2737      device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0;
2738    }
2739    if (ipad || iphone || ipod) {
2740      device.os = 'ios';
2741      device.ios = true;
2742    }
2743    // iOS
2744    if (iphone && !ipod) {
2745      device.osVersion = iphone[2].replace(/_/g, '.');
2746      device.iphone = true;
2747    }
2748    if (ipad) {
2749      device.osVersion = ipad[2].replace(/_/g, '.');
2750      device.ipad = true;
2751    }
2752    if (ipod) {
2753      device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null;
2754      device.ipod = true;
2755    }
2756    // iOS 8+ changed UA
2757    if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) {
2758      if (device.osVersion.split('.')[0] === '10') {
2759        device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0];
2760      }
2761    }
2762
2763    // Webview
2764    device.webView = !!((iphone || ipad || ipod) && (ua.match(/.*AppleWebKit(?!.*Safari)/i) || win.navigator.standalone))
2765      || (win.matchMedia && win.matchMedia('(display-mode: standalone)').matches);
2766    device.webview = device.webView;
2767    device.standalone = device.webView;
2768
2769    // Desktop
2770    device.desktop = !(device.ios || device.android) || electron;
2771    if (device.desktop) {
2772      device.electron = electron;
2773      device.macos = macos;
2774      device.windows = windows;
2775      if (device.macos) {
2776        device.os = 'macos';
2777      }
2778      if (device.windows) {
2779        device.os = 'windows';
2780      }
2781    }
2782
2783    // Pixel Ratio
2784    device.pixelRatio = win.devicePixelRatio || 1;
2785
2786    // Export object
2787    return device;
2788  }());
2789
2790  function onTouchStart (event) {
2791    var swiper = this;
2792    var data = swiper.touchEventsData;
2793    var params = swiper.params;
2794    var touches = swiper.touches;
2795
2796    if (swiper.animating && params.preventInteractionOnTransition) {
2797      return;
2798    }
2799    var e = event;
2800    if (e.originalEvent) { e = e.originalEvent; }
2801    var $targetEl = $(e.target);
2802
2803    if (params.touchEventsTarget === 'wrapper') {
2804      if (!$targetEl.closest(swiper.wrapperEl).length) { return; }
2805    }
2806    data.isTouchEvent = e.type === 'touchstart';
2807    if (!data.isTouchEvent && 'which' in e && e.which === 3) { return; }
2808    if (!data.isTouchEvent && 'button' in e && e.button > 0) { return; }
2809    if (data.isTouched && data.isMoved) { return; }
2810    if (params.noSwiping && $targetEl.closest(params.noSwipingSelector ? params.noSwipingSelector : ("." + (params.noSwipingClass)))[0]) {
2811      swiper.allowClick = true;
2812      return;
2813    }
2814    if (params.swipeHandler) {
2815      if (!$targetEl.closest(params.swipeHandler)[0]) { return; }
2816    }
2817
2818    touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
2819    touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
2820    var startX = touches.currentX;
2821    var startY = touches.currentY;
2822
2823    // Do NOT start if iOS edge swipe is detected. Otherwise iOS app (UIWebView) cannot swipe-to-go-back anymore
2824
2825    var edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;
2826    var edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;
2827    if (
2828      edgeSwipeDetection
2829      && ((startX <= edgeSwipeThreshold)
2830      || (startX >= win.screen.width - edgeSwipeThreshold))
2831    ) {
2832      return;
2833    }
2834
2835    Utils.extend(data, {
2836      isTouched: true,
2837      isMoved: false,
2838      allowTouchCallbacks: true,
2839      isScrolling: undefined,
2840      startMoving: undefined,
2841    });
2842
2843    touches.startX = startX;
2844    touches.startY = startY;
2845    data.touchStartTime = Utils.now();
2846    swiper.allowClick = true;
2847    swiper.updateSize();
2848    swiper.swipeDirection = undefined;
2849    if (params.threshold > 0) { data.allowThresholdMove = false; }
2850    if (e.type !== 'touchstart') {
2851      var preventDefault = true;
2852      if ($targetEl.is(data.formElements)) { preventDefault = false; }
2853      if (
2854        doc.activeElement
2855        && $(doc.activeElement).is(data.formElements)
2856        && doc.activeElement !== $targetEl[0]
2857      ) {
2858        doc.activeElement.blur();
2859      }
2860
2861      var shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;
2862      if (params.touchStartForcePreventDefault || shouldPreventDefault) {
2863        e.preventDefault();
2864      }
2865    }
2866    swiper.emit('touchStart', e);
2867  }
2868
2869  function onTouchMove (event) {
2870    var swiper = this;
2871    var data = swiper.touchEventsData;
2872    var params = swiper.params;
2873    var touches = swiper.touches;
2874    var rtl = swiper.rtlTranslate;
2875    var e = event;
2876    if (e.originalEvent) { e = e.originalEvent; }
2877    if (!data.isTouched) {
2878      if (data.startMoving && data.isScrolling) {
2879        swiper.emit('touchMoveOpposite', e);
2880      }
2881      return;
2882    }
2883    if (data.isTouchEvent && e.type === 'mousemove') { return; }
2884    var targetTouch = e.type === 'touchmove' && e.targetTouches && (e.targetTouches[0] || e.changedTouches[0]);
2885    var pageX = e.type === 'touchmove' ? targetTouch.pageX : e.pageX;
2886    var pageY = e.type === 'touchmove' ? targetTouch.pageY : e.pageY;
2887    if (e.preventedByNestedSwiper) {
2888      touches.startX = pageX;
2889      touches.startY = pageY;
2890      return;
2891    }
2892    if (!swiper.allowTouchMove) {
2893      // isMoved = true;
2894      swiper.allowClick = false;
2895      if (data.isTouched) {
2896        Utils.extend(touches, {
2897          startX: pageX,
2898          startY: pageY,
2899          currentX: pageX,
2900          currentY: pageY,
2901        });
2902        data.touchStartTime = Utils.now();
2903      }
2904      return;
2905    }
2906    if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {
2907      if (swiper.isVertical()) {
2908        // Vertical
2909        if (
2910          (pageY < touches.startY && swiper.translate <= swiper.maxTranslate())
2911          || (pageY > touches.startY && swiper.translate >= swiper.minTranslate())
2912        ) {
2913          data.isTouched = false;
2914          data.isMoved = false;
2915          return;
2916        }
2917      } else if (
2918        (pageX < touches.startX && swiper.translate <= swiper.maxTranslate())
2919        || (pageX > touches.startX && swiper.translate >= swiper.minTranslate())
2920      ) {
2921        return;
2922      }
2923    }
2924    if (data.isTouchEvent && doc.activeElement) {
2925      if (e.target === doc.activeElement && $(e.target).is(data.formElements)) {
2926        data.isMoved = true;
2927        swiper.allowClick = false;
2928        return;
2929      }
2930    }
2931    if (data.allowTouchCallbacks) {
2932      swiper.emit('touchMove', e);
2933    }
2934    if (e.targetTouches && e.targetTouches.length > 1) { return; }
2935
2936    touches.currentX = pageX;
2937    touches.currentY = pageY;
2938
2939    var diffX = touches.currentX - touches.startX;
2940    var diffY = touches.currentY - touches.startY;
2941    if (swiper.params.threshold && Math.sqrt((Math.pow( diffX, 2 )) + (Math.pow( diffY, 2 ))) < swiper.params.threshold) { return; }
2942
2943    if (typeof data.isScrolling === 'undefined') {
2944      var touchAngle;
2945      if ((swiper.isHorizontal() && touches.currentY === touches.startY) || (swiper.isVertical() && touches.currentX === touches.startX)) {
2946        data.isScrolling = false;
2947      } else {
2948        // eslint-disable-next-line
2949        if ((diffX * diffX) + (diffY * diffY) >= 25) {
2950          touchAngle = (Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180) / Math.PI;
2951          data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : (90 - touchAngle > params.touchAngle);
2952        }
2953      }
2954    }
2955    if (data.isScrolling) {
2956      swiper.emit('touchMoveOpposite', e);
2957    }
2958    if (typeof data.startMoving === 'undefined') {
2959      if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {
2960        data.startMoving = true;
2961      }
2962    }
2963    if (data.isScrolling) {
2964      data.isTouched = false;
2965      return;
2966    }
2967    if (!data.startMoving) {
2968      return;
2969    }
2970    swiper.allowClick = false;
2971    if (!params.cssMode) {
2972      e.preventDefault();
2973    }
2974    if (params.touchMoveStopPropagation && !params.nested) {
2975      e.stopPropagation();
2976    }
2977
2978    if (!data.isMoved) {
2979      if (params.loop) {
2980        swiper.loopFix();
2981      }
2982      data.startTranslate = swiper.getTranslate();
2983      swiper.setTransition(0);
2984      if (swiper.animating) {
2985        swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');
2986      }
2987      data.allowMomentumBounce = false;
2988      // Grab Cursor
2989      if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
2990        swiper.setGrabCursor(true);
2991      }
2992      swiper.emit('sliderFirstMove', e);
2993    }
2994    swiper.emit('sliderMove', e);
2995    data.isMoved = true;
2996
2997    var diff = swiper.isHorizontal() ? diffX : diffY;
2998    touches.diff = diff;
2999
3000    diff *= params.touchRatio;
3001    if (rtl) { diff = -diff; }
3002
3003    swiper.swipeDirection = diff > 0 ? 'prev' : 'next';
3004    data.currentTranslate = diff + data.startTranslate;
3005
3006    var disableParentSwiper = true;
3007    var resistanceRatio = params.resistanceRatio;
3008    if (params.touchReleaseOnEdges) {
3009      resistanceRatio = 0;
3010    }
3011    if ((diff > 0 && data.currentTranslate > swiper.minTranslate())) {
3012      disableParentSwiper = false;
3013      if (params.resistance) { data.currentTranslate = (swiper.minTranslate() - 1) + (Math.pow( (-swiper.minTranslate() + data.startTranslate + diff), resistanceRatio )); }
3014    } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {
3015      disableParentSwiper = false;
3016      if (params.resistance) { data.currentTranslate = (swiper.maxTranslate() + 1) - (Math.pow( (swiper.maxTranslate() - data.startTranslate - diff), resistanceRatio )); }
3017    }
3018
3019    if (disableParentSwiper) {
3020      e.preventedByNestedSwiper = true;
3021    }
3022
3023    // Directions locks
3024    if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {
3025      data.currentTranslate = data.startTranslate;
3026    }
3027    if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {
3028      data.currentTranslate = data.startTranslate;
3029    }
3030
3031
3032    // Threshold
3033    if (params.threshold > 0) {
3034      if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {
3035        if (!data.allowThresholdMove) {
3036          data.allowThresholdMove = true;
3037          touches.startX = touches.currentX;
3038          touches.startY = touches.currentY;
3039          data.currentTranslate = data.startTranslate;
3040          touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;
3041          return;
3042        }
3043      } else {
3044        data.currentTranslate = data.startTranslate;
3045        return;
3046      }
3047    }
3048
3049    if (!params.followFinger || params.cssMode) { return; }
3050
3051    // Update active index in free mode
3052    if (params.freeMode || params.watchSlidesProgress || params.watchSlidesVisibility) {
3053      swiper.updateActiveIndex();
3054      swiper.updateSlidesClasses();
3055    }
3056    if (params.freeMode) {
3057      // Velocity
3058      if (data.velocities.length === 0) {
3059        data.velocities.push({
3060          position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],
3061          time: data.touchStartTime,
3062        });
3063      }
3064      data.velocities.push({
3065        position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],
3066        time: Utils.now(),
3067      });
3068    }
3069    // Update progress
3070    swiper.updateProgress(data.currentTranslate);
3071    // Update translate
3072    swiper.setTranslate(data.currentTranslate);
3073  }
3074
3075  function onTouchEnd (event) {
3076    var swiper = this;
3077    var data = swiper.touchEventsData;
3078
3079    var params = swiper.params;
3080    var touches = swiper.touches;
3081    var rtl = swiper.rtlTranslate;
3082    var $wrapperEl = swiper.$wrapperEl;
3083    var slidesGrid = swiper.slidesGrid;
3084    var snapGrid = swiper.snapGrid;
3085    var e = event;
3086    if (e.originalEvent) { e = e.originalEvent; }
3087    if (data.allowTouchCallbacks) {
3088      swiper.emit('touchEnd', e);
3089    }
3090    data.allowTouchCallbacks = false;
3091    if (!data.isTouched) {
3092      if (data.isMoved && params.grabCursor) {
3093        swiper.setGrabCursor(false);
3094      }
3095      data.isMoved = false;
3096      data.startMoving = false;
3097      return;
3098    }
3099    // Return Grab Cursor
3100    if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
3101      swiper.setGrabCursor(false);
3102    }
3103
3104    // Time diff
3105    var touchEndTime = Utils.now();
3106    var timeDiff = touchEndTime - data.touchStartTime;
3107
3108    // Tap, doubleTap, Click
3109    if (swiper.allowClick) {
3110      swiper.updateClickedSlide(e);
3111      swiper.emit('tap click', e);
3112      if (timeDiff < 300 && (touchEndTime - data.lastClickTime) < 300) {
3113        swiper.emit('doubleTap doubleClick', e);
3114      }
3115    }
3116
3117    data.lastClickTime = Utils.now();
3118    Utils.nextTick(function () {
3119      if (!swiper.destroyed) { swiper.allowClick = true; }
3120    });
3121
3122    if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) {
3123      data.isTouched = false;
3124      data.isMoved = false;
3125      data.startMoving = false;
3126      return;
3127    }
3128    data.isTouched = false;
3129    data.isMoved = false;
3130    data.startMoving = false;
3131
3132    var currentPos;
3133    if (params.followFinger) {
3134      currentPos = rtl ? swiper.translate : -swiper.translate;
3135    } else {
3136      currentPos = -data.currentTranslate;
3137    }
3138
3139    if (params.cssMode) {
3140      return;
3141    }
3142
3143    if (params.freeMode) {
3144      if (currentPos < -swiper.minTranslate()) {
3145        swiper.slideTo(swiper.activeIndex);
3146        return;
3147      }
3148      if (currentPos > -swiper.maxTranslate()) {
3149        if (swiper.slides.length < snapGrid.length) {
3150          swiper.slideTo(snapGrid.length - 1);
3151        } else {
3152          swiper.slideTo(swiper.slides.length - 1);
3153        }
3154        return;
3155      }
3156
3157      if (params.freeModeMomentum) {
3158        if (data.velocities.length > 1) {
3159          var lastMoveEvent = data.velocities.pop();
3160          var velocityEvent = data.velocities.pop();
3161
3162          var distance = lastMoveEvent.position - velocityEvent.position;
3163          var time = lastMoveEvent.time - velocityEvent.time;
3164          swiper.velocity = distance / time;
3165          swiper.velocity /= 2;
3166          if (Math.abs(swiper.velocity) < params.freeModeMinimumVelocity) {
3167            swiper.velocity = 0;
3168          }
3169          // this implies that the user stopped moving a finger then released.
3170          // There would be no events with distance zero, so the last event is stale.
3171          if (time > 150 || (Utils.now() - lastMoveEvent.time) > 300) {
3172            swiper.velocity = 0;
3173          }
3174        } else {
3175          swiper.velocity = 0;
3176        }
3177        swiper.velocity *= params.freeModeMomentumVelocityRatio;
3178
3179        data.velocities.length = 0;
3180        var momentumDuration = 1000 * params.freeModeMomentumRatio;
3181        var momentumDistance = swiper.velocity * momentumDuration;
3182
3183        var newPosition = swiper.translate + momentumDistance;
3184        if (rtl) { newPosition = -newPosition; }
3185
3186        var doBounce = false;
3187        var afterBouncePosition;
3188        var bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeModeMomentumBounceRatio;
3189        var needsLoopFix;
3190        if (newPosition < swiper.maxTranslate()) {
3191          if (params.freeModeMomentumBounce) {
3192            if (newPosition + swiper.maxTranslate() < -bounceAmount) {
3193              newPosition = swiper.maxTranslate() - bounceAmount;
3194            }
3195            afterBouncePosition = swiper.maxTranslate();
3196            doBounce = true;
3197            data.allowMomentumBounce = true;
3198          } else {
3199            newPosition = swiper.maxTranslate();
3200          }
3201          if (params.loop && params.centeredSlides) { needsLoopFix = true; }
3202        } else if (newPosition > swiper.minTranslate()) {
3203          if (params.freeModeMomentumBounce) {
3204            if (newPosition - swiper.minTranslate() > bounceAmount) {
3205              newPosition = swiper.minTranslate() + bounceAmount;
3206            }
3207            afterBouncePosition = swiper.minTranslate();
3208            doBounce = true;
3209            data.allowMomentumBounce = true;
3210          } else {
3211            newPosition = swiper.minTranslate();
3212          }
3213          if (params.loop && params.centeredSlides) { needsLoopFix = true; }
3214        } else if (params.freeModeSticky) {
3215          var nextSlide;
3216          for (var j = 0; j < snapGrid.length; j += 1) {
3217            if (snapGrid[j] > -newPosition) {
3218              nextSlide = j;
3219              break;
3220            }
3221          }
3222
3223          if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') {
3224            newPosition = snapGrid[nextSlide];
3225          } else {
3226            newPosition = snapGrid[nextSlide - 1];
3227          }
3228          newPosition = -newPosition;
3229        }
3230        if (needsLoopFix) {
3231          swiper.once('transitionEnd', function () {
3232            swiper.loopFix();
3233          });
3234        }
3235        // Fix duration
3236        if (swiper.velocity !== 0) {
3237          if (rtl) {
3238            momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);
3239          } else {
3240            momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);
3241          }
3242          if (params.freeModeSticky) {
3243            // If freeModeSticky is active and the user ends a swipe with a slow-velocity
3244            // event, then durations can be 20+ seconds to slide one (or zero!) slides.
3245            // It's easy to see this when simulating touch with mouse events. To fix this,
3246            // limit single-slide swipes to the default slide duration. This also has the
3247            // nice side effect of matching slide speed if the user stopped moving before
3248            // lifting finger or mouse vs. moving slowly before lifting the finger/mouse.
3249            // For faster swipes, also apply limits (albeit higher ones).
3250            var moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate);
3251            var currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex];
3252            if (moveDistance < currentSlideSize) {
3253              momentumDuration = params.speed;
3254            } else if (moveDistance < 2 * currentSlideSize) {
3255              momentumDuration = params.speed * 1.5;
3256            } else {
3257              momentumDuration = params.speed * 2.5;
3258            }
3259          }
3260        } else if (params.freeModeSticky) {
3261          swiper.slideToClosest();
3262          return;
3263        }
3264
3265        if (params.freeModeMomentumBounce && doBounce) {
3266          swiper.updateProgress(afterBouncePosition);
3267          swiper.setTransition(momentumDuration);
3268          swiper.setTranslate(newPosition);
3269          swiper.transitionStart(true, swiper.swipeDirection);
3270          swiper.animating = true;
3271          $wrapperEl.transitionEnd(function () {
3272            if (!swiper || swiper.destroyed || !data.allowMomentumBounce) { return; }
3273            swiper.emit('momentumBounce');
3274
3275            swiper.setTransition(params.speed);
3276            swiper.setTranslate(afterBouncePosition);
3277            $wrapperEl.transitionEnd(function () {
3278              if (!swiper || swiper.destroyed) { return; }
3279              swiper.transitionEnd();
3280            });
3281          });
3282        } else if (swiper.velocity) {
3283          swiper.updateProgress(newPosition);
3284          swiper.setTransition(momentumDuration);
3285          swiper.setTranslate(newPosition);
3286          swiper.transitionStart(true, swiper.swipeDirection);
3287          if (!swiper.animating) {
3288            swiper.animating = true;
3289            $wrapperEl.transitionEnd(function () {
3290              if (!swiper || swiper.destroyed) { return; }
3291              swiper.transitionEnd();
3292            });
3293          }
3294        } else {
3295          swiper.updateProgress(newPosition);
3296        }
3297
3298        swiper.updateActiveIndex();
3299        swiper.updateSlidesClasses();
3300      } else if (params.freeModeSticky) {
3301        swiper.slideToClosest();
3302        return;
3303      }
3304
3305      if (!params.freeModeMomentum || timeDiff >= params.longSwipesMs) {
3306        swiper.updateProgress();
3307        swiper.updateActiveIndex();
3308        swiper.updateSlidesClasses();
3309      }
3310      return;
3311    }
3312
3313    // Find current slide
3314    var stopIndex = 0;
3315    var groupSize = swiper.slidesSizesGrid[0];
3316    for (var i = 0; i < slidesGrid.length; i += (i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup)) {
3317      var increment$1 = (i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup);
3318      if (typeof slidesGrid[i + increment$1] !== 'undefined') {
3319        if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment$1]) {
3320          stopIndex = i;
3321          groupSize = slidesGrid[i + increment$1] - slidesGrid[i];
3322        }
3323      } else if (currentPos >= slidesGrid[i]) {
3324        stopIndex = i;
3325        groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];
3326      }
3327    }
3328
3329    // Find current slide size
3330    var ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;
3331    var increment = (stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup);
3332
3333    if (timeDiff > params.longSwipesMs) {
3334      // Long touches
3335      if (!params.longSwipes) {
3336        swiper.slideTo(swiper.activeIndex);
3337        return;
3338      }
3339      if (swiper.swipeDirection === 'next') {
3340        if (ratio >= params.longSwipesRatio) { swiper.slideTo(stopIndex + increment); }
3341        else { swiper.slideTo(stopIndex); }
3342      }
3343      if (swiper.swipeDirection === 'prev') {
3344        if (ratio > (1 - params.longSwipesRatio)) { swiper.slideTo(stopIndex + increment); }
3345        else { swiper.slideTo(stopIndex); }
3346      }
3347    } else {
3348      // Short swipes
3349      if (!params.shortSwipes) {
3350        swiper.slideTo(swiper.activeIndex);
3351        return;
3352      }
3353      var isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);
3354      if (!isNavButtonTarget) {
3355        if (swiper.swipeDirection === 'next') {
3356          swiper.slideTo(stopIndex + increment);
3357        }
3358        if (swiper.swipeDirection === 'prev') {
3359          swiper.slideTo(stopIndex);
3360        }
3361      } else if (e.target === swiper.navigation.nextEl) {
3362        swiper.slideTo(stopIndex + increment);
3363      } else {
3364        swiper.slideTo(stopIndex);
3365      }
3366    }
3367  }
3368
3369  function onResize () {
3370    var swiper = this;
3371
3372    var params = swiper.params;
3373    var el = swiper.el;
3374
3375    if (el && el.offsetWidth === 0) { return; }
3376
3377    // Breakpoints
3378    if (params.breakpoints) {
3379      swiper.setBreakpoint();
3380    }
3381
3382    // Save locks
3383    var allowSlideNext = swiper.allowSlideNext;
3384    var allowSlidePrev = swiper.allowSlidePrev;
3385    var snapGrid = swiper.snapGrid;
3386
3387    // Disable locks on resize
3388    swiper.allowSlideNext = true;
3389    swiper.allowSlidePrev = true;
3390
3391    swiper.updateSize();
3392    swiper.updateSlides();
3393
3394    swiper.updateSlidesClasses();
3395    if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {
3396      swiper.slideTo(swiper.slides.length - 1, 0, false, true);
3397    } else {
3398      swiper.slideTo(swiper.activeIndex, 0, false, true);
3399    }
3400
3401    if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {
3402      swiper.autoplay.run();
3403    }
3404    // Return locks after resize
3405    swiper.allowSlidePrev = allowSlidePrev;
3406    swiper.allowSlideNext = allowSlideNext;
3407
3408    if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {
3409      swiper.checkOverflow();
3410    }
3411  }
3412
3413  function onClick (e) {
3414    var swiper = this;
3415    if (!swiper.allowClick) {
3416      if (swiper.params.preventClicks) { e.preventDefault(); }
3417      if (swiper.params.preventClicksPropagation && swiper.animating) {
3418        e.stopPropagation();
3419        e.stopImmediatePropagation();
3420      }
3421    }
3422  }
3423
3424  function onScroll () {
3425    var swiper = this;
3426    var wrapperEl = swiper.wrapperEl;
3427    swiper.previousTranslate = swiper.translate;
3428    swiper.translate = swiper.isHorizontal() ? -wrapperEl.scrollLeft : -wrapperEl.scrollTop;
3429    // eslint-disable-next-line
3430    if (swiper.translate === -0) { swiper.translate = 0; }
3431
3432    swiper.updateActiveIndex();
3433    swiper.updateSlidesClasses();
3434
3435    var newProgress;
3436    var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
3437    if (translatesDiff === 0) {
3438      newProgress = 0;
3439    } else {
3440      newProgress = (swiper.translate - swiper.minTranslate()) / (translatesDiff);
3441    }
3442    if (newProgress !== swiper.progress) {
3443      swiper.updateProgress(swiper.translate);
3444    }
3445
3446    swiper.emit('setTranslate', swiper.translate, false);
3447  }
3448
3449  var dummyEventAttached = false;
3450  function dummyEventListener() {}
3451
3452  function attachEvents() {
3453    var swiper = this;
3454    var params = swiper.params;
3455    var touchEvents = swiper.touchEvents;
3456    var el = swiper.el;
3457    var wrapperEl = swiper.wrapperEl;
3458
3459    swiper.onTouchStart = onTouchStart.bind(swiper);
3460    swiper.onTouchMove = onTouchMove.bind(swiper);
3461    swiper.onTouchEnd = onTouchEnd.bind(swiper);
3462    if (params.cssMode) {
3463      swiper.onScroll = onScroll.bind(swiper);
3464    }
3465
3466    swiper.onClick = onClick.bind(swiper);
3467
3468    var capture = !!params.nested;
3469
3470    // Touch Events
3471    if (!Support.touch && Support.pointerEvents) {
3472      el.addEventListener(touchEvents.start, swiper.onTouchStart, false);
3473      doc.addEventListener(touchEvents.move, swiper.onTouchMove, capture);
3474      doc.addEventListener(touchEvents.end, swiper.onTouchEnd, false);
3475    } else {
3476      if (Support.touch) {
3477        var passiveListener = touchEvents.start === 'touchstart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
3478        el.addEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);
3479        el.addEventListener(touchEvents.move, swiper.onTouchMove, Support.passiveListener ? { passive: false, capture: capture } : capture);
3480        el.addEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);
3481        if (touchEvents.cancel) {
3482          el.addEventListener(touchEvents.cancel, swiper.onTouchEnd, passiveListener);
3483        }
3484        if (!dummyEventAttached) {
3485          doc.addEventListener('touchstart', dummyEventListener);
3486          dummyEventAttached = true;
3487        }
3488      }
3489      if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) {
3490        el.addEventListener('mousedown', swiper.onTouchStart, false);
3491        doc.addEventListener('mousemove', swiper.onTouchMove, capture);
3492        doc.addEventListener('mouseup', swiper.onTouchEnd, false);
3493      }
3494    }
3495    // Prevent Links Clicks
3496    if (params.preventClicks || params.preventClicksPropagation) {
3497      el.addEventListener('click', swiper.onClick, true);
3498    }
3499    if (params.cssMode) {
3500      wrapperEl.addEventListener('scroll', swiper.onScroll);
3501    }
3502
3503    // Resize handler
3504    if (params.updateOnWindowResize) {
3505      swiper.on((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize, true);
3506    } else {
3507      swiper.on('observerUpdate', onResize, true);
3508    }
3509  }
3510
3511  function detachEvents() {
3512    var swiper = this;
3513
3514    var params = swiper.params;
3515    var touchEvents = swiper.touchEvents;
3516    var el = swiper.el;
3517    var wrapperEl = swiper.wrapperEl;
3518
3519    var capture = !!params.nested;
3520
3521    // Touch Events
3522    if (!Support.touch && Support.pointerEvents) {
3523      el.removeEventListener(touchEvents.start, swiper.onTouchStart, false);
3524      doc.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);
3525      doc.removeEventListener(touchEvents.end, swiper.onTouchEnd, false);
3526    } else {
3527      if (Support.touch) {
3528        var passiveListener = touchEvents.start === 'onTouchStart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
3529        el.removeEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);
3530        el.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);
3531        el.removeEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);
3532        if (touchEvents.cancel) {
3533          el.removeEventListener(touchEvents.cancel, swiper.onTouchEnd, passiveListener);
3534        }
3535      }
3536      if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) {
3537        el.removeEventListener('mousedown', swiper.onTouchStart, false);
3538        doc.removeEventListener('mousemove', swiper.onTouchMove, capture);
3539        doc.removeEventListener('mouseup', swiper.onTouchEnd, false);
3540      }
3541    }
3542    // Prevent Links Clicks
3543    if (params.preventClicks || params.preventClicksPropagation) {
3544      el.removeEventListener('click', swiper.onClick, true);
3545    }
3546
3547    if (params.cssMode) {
3548      wrapperEl.removeEventListener('scroll', swiper.onScroll);
3549    }
3550
3551    // Resize handler
3552    swiper.off((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize);
3553  }
3554
3555  var events = {
3556    attachEvents: attachEvents,
3557    detachEvents: detachEvents,
3558  };
3559
3560  function setBreakpoint () {
3561    var swiper = this;
3562    var activeIndex = swiper.activeIndex;
3563    var initialized = swiper.initialized;
3564    var loopedSlides = swiper.loopedSlides; if ( loopedSlides === void 0 ) loopedSlides = 0;
3565    var params = swiper.params;
3566    var $el = swiper.$el;
3567    var breakpoints = params.breakpoints;
3568    if (!breakpoints || (breakpoints && Object.keys(breakpoints).length === 0)) { return; }
3569
3570    // Get breakpoint for window width and update parameters
3571    var breakpoint = swiper.getBreakpoint(breakpoints);
3572
3573    if (breakpoint && swiper.currentBreakpoint !== breakpoint) {
3574      var breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;
3575      if (breakpointOnlyParams) {
3576        ['slidesPerView', 'spaceBetween', 'slidesPerGroup', 'slidesPerGroupSkip', 'slidesPerColumn'].forEach(function (param) {
3577          var paramValue = breakpointOnlyParams[param];
3578          if (typeof paramValue === 'undefined') { return; }
3579          if (param === 'slidesPerView' && (paramValue === 'AUTO' || paramValue === 'auto')) {
3580            breakpointOnlyParams[param] = 'auto';
3581          } else if (param === 'slidesPerView') {
3582            breakpointOnlyParams[param] = parseFloat(paramValue);
3583          } else {
3584            breakpointOnlyParams[param] = parseInt(paramValue, 10);
3585          }
3586        });
3587      }
3588
3589      var breakpointParams = breakpointOnlyParams || swiper.originalParams;
3590      var wasMultiRow = params.slidesPerColumn > 1;
3591      var isMultiRow = breakpointParams.slidesPerColumn > 1;
3592      if (wasMultiRow && !isMultiRow) {
3593        $el.removeClass(((params.containerModifierClass) + "multirow " + (params.containerModifierClass) + "multirow-column"));
3594      } else if (!wasMultiRow && isMultiRow) {
3595        $el.addClass(((params.containerModifierClass) + "multirow"));
3596        if (breakpointParams.slidesPerColumnFill === 'column') {
3597          $el.addClass(((params.containerModifierClass) + "multirow-column"));
3598        }
3599      }
3600
3601      var directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;
3602      var needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);
3603
3604      if (directionChanged && initialized) {
3605        swiper.changeDirection();
3606      }
3607
3608      Utils.extend(swiper.params, breakpointParams);
3609
3610      Utils.extend(swiper, {
3611        allowTouchMove: swiper.params.allowTouchMove,
3612        allowSlideNext: swiper.params.allowSlideNext,
3613        allowSlidePrev: swiper.params.allowSlidePrev,
3614      });
3615
3616      swiper.currentBreakpoint = breakpoint;
3617
3618      if (needsReLoop && initialized) {
3619        swiper.loopDestroy();
3620        swiper.loopCreate();
3621        swiper.updateSlides();
3622        swiper.slideTo((activeIndex - loopedSlides) + swiper.loopedSlides, 0, false);
3623      }
3624
3625      swiper.emit('breakpoint', breakpointParams);
3626    }
3627  }
3628
3629  function getBreakpoint (breakpoints) {
3630    // Get breakpoint for window width
3631    if (!breakpoints) { return undefined; }
3632    var breakpoint = false;
3633
3634    var points = Object.keys(breakpoints).map(function (point) {
3635      if (typeof point === 'string' && point.indexOf('@') === 0) {
3636        var minRatio = parseFloat(point.substr(1));
3637        var value = win.innerHeight * minRatio;
3638        return { value: value, point: point };
3639      }
3640      return { value: point, point: point };
3641    });
3642
3643    points.sort(function (a, b) { return parseInt(a.value, 10) - parseInt(b.value, 10); });
3644    for (var i = 0; i < points.length; i += 1) {
3645      var ref = points[i];
3646      var point = ref.point;
3647      var value = ref.value;
3648      if (value <= win.innerWidth) {
3649        breakpoint = point;
3650      }
3651    }
3652    return breakpoint || 'max';
3653  }
3654
3655  var breakpoints = { setBreakpoint: setBreakpoint, getBreakpoint: getBreakpoint };
3656
3657  function addClasses () {
3658    var swiper = this;
3659    var classNames = swiper.classNames;
3660    var params = swiper.params;
3661    var rtl = swiper.rtl;
3662    var $el = swiper.$el;
3663    var suffixes = [];
3664
3665    suffixes.push('initialized');
3666    suffixes.push(params.direction);
3667
3668    if (params.freeMode) {
3669      suffixes.push('free-mode');
3670    }
3671    if (params.autoHeight) {
3672      suffixes.push('autoheight');
3673    }
3674    if (rtl) {
3675      suffixes.push('rtl');
3676    }
3677    if (params.slidesPerColumn > 1) {
3678      suffixes.push('multirow');
3679      if (params.slidesPerColumnFill === 'column') {
3680        suffixes.push('multirow-column');
3681      }
3682    }
3683    if (Device.android) {
3684      suffixes.push('android');
3685    }
3686    if (Device.ios) {
3687      suffixes.push('ios');
3688    }
3689
3690    if (params.cssMode) {
3691      suffixes.push('css-mode');
3692    }
3693
3694    suffixes.forEach(function (suffix) {
3695      classNames.push(params.containerModifierClass + suffix);
3696    });
3697
3698    $el.addClass(classNames.join(' '));
3699  }
3700
3701  function removeClasses () {
3702    var swiper = this;
3703    var $el = swiper.$el;
3704    var classNames = swiper.classNames;
3705
3706    $el.removeClass(classNames.join(' '));
3707  }
3708
3709  var classes = { addClasses: addClasses, removeClasses: removeClasses };
3710
3711  function loadImage (imageEl, src, srcset, sizes, checkForComplete, callback) {
3712    var image;
3713    function onReady() {
3714      if (callback) { callback(); }
3715    }
3716    if (!imageEl.complete || !checkForComplete) {
3717      if (src) {
3718        image = new win.Image();
3719        image.onload = onReady;
3720        image.onerror = onReady;
3721        if (sizes) {
3722          image.sizes = sizes;
3723        }
3724        if (srcset) {
3725          image.srcset = srcset;
3726        }
3727        if (src) {
3728          image.src = src;
3729        }
3730      } else {
3731        onReady();
3732      }
3733    } else {
3734      // image already loaded...
3735      onReady();
3736    }
3737  }
3738
3739  function preloadImages () {
3740    var swiper = this;
3741    swiper.imagesToLoad = swiper.$el.find('img');
3742    function onReady() {
3743      if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) { return; }
3744      if (swiper.imagesLoaded !== undefined) { swiper.imagesLoaded += 1; }
3745      if (swiper.imagesLoaded === swiper.imagesToLoad.length) {
3746        if (swiper.params.updateOnImagesReady) { swiper.update(); }
3747        swiper.emit('imagesReady');
3748      }
3749    }
3750    for (var i = 0; i < swiper.imagesToLoad.length; i += 1) {
3751      var imageEl = swiper.imagesToLoad[i];
3752      swiper.loadImage(
3753        imageEl,
3754        imageEl.currentSrc || imageEl.getAttribute('src'),
3755        imageEl.srcset || imageEl.getAttribute('srcset'),
3756        imageEl.sizes || imageEl.getAttribute('sizes'),
3757        true,
3758        onReady
3759      );
3760    }
3761  }
3762
3763  var images = {
3764    loadImage: loadImage,
3765    preloadImages: preloadImages,
3766  };
3767
3768  function checkOverflow() {
3769    var swiper = this;
3770    var params = swiper.params;
3771    var wasLocked = swiper.isLocked;
3772    var lastSlidePosition = swiper.slides.length > 0 && (params.slidesOffsetBefore + (params.spaceBetween * (swiper.slides.length - 1)) + ((swiper.slides[0]).offsetWidth) * swiper.slides.length);
3773
3774    if (params.slidesOffsetBefore && params.slidesOffsetAfter && lastSlidePosition) {
3775      swiper.isLocked = lastSlidePosition <= swiper.size;
3776    } else {
3777      swiper.isLocked = swiper.snapGrid.length === 1;
3778    }
3779
3780    swiper.allowSlideNext = !swiper.isLocked;
3781    swiper.allowSlidePrev = !swiper.isLocked;
3782
3783    // events
3784    if (wasLocked !== swiper.isLocked) { swiper.emit(swiper.isLocked ? 'lock' : 'unlock'); }
3785
3786    if (wasLocked && wasLocked !== swiper.isLocked) {
3787      swiper.isEnd = false;
3788      swiper.navigation.update();
3789    }
3790  }
3791
3792  var checkOverflow$1 = { checkOverflow: checkOverflow };
3793
3794  var defaults = {
3795    init: true,
3796    direction: 'horizontal',
3797    touchEventsTarget: 'container',
3798    initialSlide: 0,
3799    speed: 300,
3800    cssMode: false,
3801    updateOnWindowResize: true,
3802    //
3803    preventInteractionOnTransition: false,
3804
3805    // To support iOS's swipe-to-go-back gesture (when being used in-app, with UIWebView).
3806    edgeSwipeDetection: false,
3807    edgeSwipeThreshold: 20,
3808
3809    // Free mode
3810    freeMode: false,
3811    freeModeMomentum: true,
3812    freeModeMomentumRatio: 1,
3813    freeModeMomentumBounce: true,
3814    freeModeMomentumBounceRatio: 1,
3815    freeModeMomentumVelocityRatio: 1,
3816    freeModeSticky: false,
3817    freeModeMinimumVelocity: 0.02,
3818
3819    // Autoheight
3820    autoHeight: false,
3821
3822    // Set wrapper width
3823    setWrapperSize: false,
3824
3825    // Virtual Translate
3826    virtualTranslate: false,
3827
3828    // Effects
3829    effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'
3830
3831    // Breakpoints
3832    breakpoints: undefined,
3833
3834    // Slides grid
3835    spaceBetween: 0,
3836    slidesPerView: 1,
3837    slidesPerColumn: 1,
3838    slidesPerColumnFill: 'column',
3839    slidesPerGroup: 1,
3840    slidesPerGroupSkip: 0,
3841    centeredSlides: false,
3842    centeredSlidesBounds: false,
3843    slidesOffsetBefore: 0, // in px
3844    slidesOffsetAfter: 0, // in px
3845    normalizeSlideIndex: true,
3846    centerInsufficientSlides: false,
3847
3848    // Disable swiper and hide navigation when container not overflow
3849    watchOverflow: false,
3850
3851    // Round length
3852    roundLengths: false,
3853
3854    // Touches
3855    touchRatio: 1,
3856    touchAngle: 45,
3857    simulateTouch: true,
3858    shortSwipes: true,
3859    longSwipes: true,
3860    longSwipesRatio: 0.5,
3861    longSwipesMs: 300,
3862    followFinger: true,
3863    allowTouchMove: true,
3864    threshold: 0,
3865    touchMoveStopPropagation: false,
3866    touchStartPreventDefault: true,
3867    touchStartForcePreventDefault: false,
3868    touchReleaseOnEdges: false,
3869
3870    // Unique Navigation Elements
3871    uniqueNavElements: true,
3872
3873    // Resistance
3874    resistance: true,
3875    resistanceRatio: 0.85,
3876
3877    // Progress
3878    watchSlidesProgress: false,
3879    watchSlidesVisibility: false,
3880
3881    // Cursor
3882    grabCursor: false,
3883
3884    // Clicks
3885    preventClicks: true,
3886    preventClicksPropagation: true,
3887    slideToClickedSlide: false,
3888
3889    // Images
3890    preloadImages: true,
3891    updateOnImagesReady: true,
3892
3893    // loop
3894    loop: false,
3895    loopAdditionalSlides: 0,
3896    loopedSlides: null,
3897    loopFillGroupWithBlank: false,
3898
3899    // Swiping/no swiping
3900    allowSlidePrev: true,
3901    allowSlideNext: true,
3902    swipeHandler: null, // '.swipe-handler',
3903    noSwiping: true,
3904    noSwipingClass: 'swiper-no-swiping',
3905    noSwipingSelector: null,
3906
3907    // Passive Listeners
3908    passiveListeners: true,
3909
3910    // NS
3911    containerModifierClass: 'swiper-container-', // NEW
3912    slideClass: 'swiper-slide',
3913    slideBlankClass: 'swiper-slide-invisible-blank',
3914    slideActiveClass: 'swiper-slide-active',
3915    slideDuplicateActiveClass: 'swiper-slide-duplicate-active',
3916    slideVisibleClass: 'swiper-slide-visible',
3917    slideDuplicateClass: 'swiper-slide-duplicate',
3918    slideNextClass: 'swiper-slide-next',
3919    slideDuplicateNextClass: 'swiper-slide-duplicate-next',
3920    slidePrevClass: 'swiper-slide-prev',
3921    slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',
3922    wrapperClass: 'swiper-wrapper',
3923
3924    // Callbacks
3925    runCallbacksOnInit: true,
3926  };
3927
3928  /* eslint no-param-reassign: "off" */
3929
3930  var prototypes = {
3931    update: update,
3932    translate: translate,
3933    transition: transition$1,
3934    slide: slide,
3935    loop: loop,
3936    grabCursor: grabCursor,
3937    manipulation: manipulation,
3938    events: events,
3939    breakpoints: breakpoints,
3940    checkOverflow: checkOverflow$1,
3941    classes: classes,
3942    images: images,
3943  };
3944
3945  var extendedDefaults = {};
3946
3947  var Swiper = /*@__PURE__*/(function (SwiperClass) {
3948    function Swiper() {
3949      var assign;
3950
3951      var args = [], len = arguments.length;
3952      while ( len-- ) args[ len ] = arguments[ len ];
3953      var el;
3954      var params;
3955      if (args.length === 1 && args[0].constructor && args[0].constructor === Object) {
3956        params = args[0];
3957      } else {
3958        (assign = args, el = assign[0], params = assign[1]);
3959      }
3960      if (!params) { params = {}; }
3961
3962      params = Utils.extend({}, params);
3963      if (el && !params.el) { params.el = el; }
3964
3965      SwiperClass.call(this, params);
3966
3967      Object.keys(prototypes).forEach(function (prototypeGroup) {
3968        Object.keys(prototypes[prototypeGroup]).forEach(function (protoMethod) {
3969          if (!Swiper.prototype[protoMethod]) {
3970            Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];
3971          }
3972        });
3973      });
3974
3975      // Swiper Instance
3976      var swiper = this;
3977      if (typeof swiper.modules === 'undefined') {
3978        swiper.modules = {};
3979      }
3980      Object.keys(swiper.modules).forEach(function (moduleName) {
3981        var module = swiper.modules[moduleName];
3982        if (module.params) {
3983          var moduleParamName = Object.keys(module.params)[0];
3984          var moduleParams = module.params[moduleParamName];
3985          if (typeof moduleParams !== 'object' || moduleParams === null) { return; }
3986          if (!(moduleParamName in params && 'enabled' in moduleParams)) { return; }
3987          if (params[moduleParamName] === true) {
3988            params[moduleParamName] = { enabled: true };
3989          }
3990          if (
3991            typeof params[moduleParamName] === 'object'
3992            && !('enabled' in params[moduleParamName])
3993          ) {
3994            params[moduleParamName].enabled = true;
3995          }
3996          if (!params[moduleParamName]) { params[moduleParamName] = { enabled: false }; }
3997        }
3998      });
3999
4000      // Extend defaults with modules params
4001      var swiperParams = Utils.extend({}, defaults);
4002      swiper.useModulesParams(swiperParams);
4003
4004      // Extend defaults with passed params
4005      swiper.params = Utils.extend({}, swiperParams, extendedDefaults, params);
4006      swiper.originalParams = Utils.extend({}, swiper.params);
4007      swiper.passedParams = Utils.extend({}, params);
4008
4009      // Save Dom lib
4010      swiper.$ = $;
4011
4012      // Find el
4013      var $el = $(swiper.params.el);
4014      el = $el[0];
4015
4016      if (!el) {
4017        return undefined;
4018      }
4019
4020      if ($el.length > 1) {
4021        var swipers = [];
4022        $el.each(function (index, containerEl) {
4023          var newParams = Utils.extend({}, params, { el: containerEl });
4024          swipers.push(new Swiper(newParams));
4025        });
4026        return swipers;
4027      }
4028
4029      el.swiper = swiper;
4030      $el.data('swiper', swiper);
4031
4032      // Find Wrapper
4033      var $wrapperEl;
4034      if (el && el.shadowRoot && el.shadowRoot.querySelector) {
4035        $wrapperEl = $(el.shadowRoot.querySelector(("." + (swiper.params.wrapperClass))));
4036        // Children needs to return slot items
4037        $wrapperEl.children = function (options) { return $el.children(options); };
4038      } else {
4039        $wrapperEl = $el.children(("." + (swiper.params.wrapperClass)));
4040      }
4041      // Extend Swiper
4042      Utils.extend(swiper, {
4043        $el: $el,
4044        el: el,
4045        $wrapperEl: $wrapperEl,
4046        wrapperEl: $wrapperEl[0],
4047
4048        // Classes
4049        classNames: [],
4050
4051        // Slides
4052        slides: $(),
4053        slidesGrid: [],
4054        snapGrid: [],
4055        slidesSizesGrid: [],
4056
4057        // isDirection
4058        isHorizontal: function isHorizontal() {
4059          return swiper.params.direction === 'horizontal';
4060        },
4061        isVertical: function isVertical() {
4062          return swiper.params.direction === 'vertical';
4063        },
4064        // RTL
4065        rtl: (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),
4066        rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),
4067        wrongRTL: $wrapperEl.css('display') === '-webkit-box',
4068
4069        // Indexes
4070        activeIndex: 0,
4071        realIndex: 0,
4072
4073        //
4074        isBeginning: true,
4075        isEnd: false,
4076
4077        // Props
4078        translate: 0,
4079        previousTranslate: 0,
4080        progress: 0,
4081        velocity: 0,
4082        animating: false,
4083
4084        // Locks
4085        allowSlideNext: swiper.params.allowSlideNext,
4086        allowSlidePrev: swiper.params.allowSlidePrev,
4087
4088        // Touch Events
4089        touchEvents: (function touchEvents() {
4090          var touch = ['touchstart', 'touchmove', 'touchend', 'touchcancel'];
4091          var desktop = ['mousedown', 'mousemove', 'mouseup'];
4092          if (Support.pointerEvents) {
4093            desktop = ['pointerdown', 'pointermove', 'pointerup'];
4094          }
4095          swiper.touchEventsTouch = {
4096            start: touch[0],
4097            move: touch[1],
4098            end: touch[2],
4099            cancel: touch[3],
4100          };
4101          swiper.touchEventsDesktop = {
4102            start: desktop[0],
4103            move: desktop[1],
4104            end: desktop[2],
4105          };
4106          return Support.touch || !swiper.params.simulateTouch ? swiper.touchEventsTouch : swiper.touchEventsDesktop;
4107        }()),
4108        touchEventsData: {
4109          isTouched: undefined,
4110          isMoved: undefined,
4111          allowTouchCallbacks: undefined,
4112          touchStartTime: undefined,
4113          isScrolling: undefined,
4114          currentTranslate: undefined,
4115          startTranslate: undefined,
4116          allowThresholdMove: undefined,
4117          // Form elements to match
4118          formElements: 'input, select, option, textarea, button, video, label',
4119          // Last click time
4120          lastClickTime: Utils.now(),
4121          clickTimeout: undefined,
4122          // Velocities
4123          velocities: [],
4124          allowMomentumBounce: undefined,
4125          isTouchEvent: undefined,
4126          startMoving: undefined,
4127        },
4128
4129        // Clicks
4130        allowClick: true,
4131
4132        // Touches
4133        allowTouchMove: swiper.params.allowTouchMove,
4134
4135        touches: {
4136          startX: 0,
4137          startY: 0,
4138          currentX: 0,
4139          currentY: 0,
4140          diff: 0,
4141        },
4142
4143        // Images
4144        imagesToLoad: [],
4145        imagesLoaded: 0,
4146
4147      });
4148
4149      // Install Modules
4150      swiper.useModules();
4151
4152      // Init
4153      if (swiper.params.init) {
4154        swiper.init();
4155      }
4156
4157      // Return app instance
4158      return swiper;
4159    }
4160
4161    if ( SwiperClass ) Swiper.__proto__ = SwiperClass;
4162    Swiper.prototype = Object.create( SwiperClass && SwiperClass.prototype );
4163    Swiper.prototype.constructor = Swiper;
4164
4165    var staticAccessors = { extendedDefaults: { configurable: true },defaults: { configurable: true },Class: { configurable: true },$: { configurable: true } };
4166
4167    Swiper.prototype.slidesPerViewDynamic = function slidesPerViewDynamic () {
4168      var swiper = this;
4169      var params = swiper.params;
4170      var slides = swiper.slides;
4171      var slidesGrid = swiper.slidesGrid;
4172      var swiperSize = swiper.size;
4173      var activeIndex = swiper.activeIndex;
4174      var spv = 1;
4175      if (params.centeredSlides) {
4176        var slideSize = slides[activeIndex].swiperSlideSize;
4177        var breakLoop;
4178        for (var i = activeIndex + 1; i < slides.length; i += 1) {
4179          if (slides[i] && !breakLoop) {
4180            slideSize += slides[i].swiperSlideSize;
4181            spv += 1;
4182            if (slideSize > swiperSize) { breakLoop = true; }
4183          }
4184        }
4185        for (var i$1 = activeIndex - 1; i$1 >= 0; i$1 -= 1) {
4186          if (slides[i$1] && !breakLoop) {
4187            slideSize += slides[i$1].swiperSlideSize;
4188            spv += 1;
4189            if (slideSize > swiperSize) { breakLoop = true; }
4190          }
4191        }
4192      } else {
4193        for (var i$2 = activeIndex + 1; i$2 < slides.length; i$2 += 1) {
4194          if (slidesGrid[i$2] - slidesGrid[activeIndex] < swiperSize) {
4195            spv += 1;
4196          }
4197        }
4198      }
4199      return spv;
4200    };
4201
4202    Swiper.prototype.update = function update () {
4203      var swiper = this;
4204      if (!swiper || swiper.destroyed) { return; }
4205      var snapGrid = swiper.snapGrid;
4206      var params = swiper.params;
4207      // Breakpoints
4208      if (params.breakpoints) {
4209        swiper.setBreakpoint();
4210      }
4211      swiper.updateSize();
4212      swiper.updateSlides();
4213      swiper.updateProgress();
4214      swiper.updateSlidesClasses();
4215
4216      function setTranslate() {
4217        var translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;
4218        var newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());
4219        swiper.setTranslate(newTranslate);
4220        swiper.updateActiveIndex();
4221        swiper.updateSlidesClasses();
4222      }
4223      var translated;
4224      if (swiper.params.freeMode) {
4225        setTranslate();
4226        if (swiper.params.autoHeight) {
4227          swiper.updateAutoHeight();
4228        }
4229      } else {
4230        if ((swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {
4231          translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true);
4232        } else {
4233          translated = swiper.slideTo(swiper.activeIndex, 0, false, true);
4234        }
4235        if (!translated) {
4236          setTranslate();
4237        }
4238      }
4239      if (params.watchOverflow && snapGrid !== swiper.snapGrid) {
4240        swiper.checkOverflow();
4241      }
4242      swiper.emit('update');
4243    };
4244
4245    Swiper.prototype.changeDirection = function changeDirection (newDirection, needUpdate) {
4246      if ( needUpdate === void 0 ) needUpdate = true;
4247
4248      var swiper = this;
4249      var currentDirection = swiper.params.direction;
4250      if (!newDirection) {
4251        // eslint-disable-next-line
4252        newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';
4253      }
4254      if ((newDirection === currentDirection) || (newDirection !== 'horizontal' && newDirection !== 'vertical')) {
4255        return swiper;
4256      }
4257
4258      swiper.$el
4259        .removeClass(("" + (swiper.params.containerModifierClass) + currentDirection))
4260        .addClass(("" + (swiper.params.containerModifierClass) + newDirection));
4261
4262      swiper.params.direction = newDirection;
4263
4264      swiper.slides.each(function (slideIndex, slideEl) {
4265        if (newDirection === 'vertical') {
4266          slideEl.style.width = '';
4267        } else {
4268          slideEl.style.height = '';
4269        }
4270      });
4271
4272      swiper.emit('changeDirection');
4273      if (needUpdate) { swiper.update(); }
4274
4275      return swiper;
4276    };
4277
4278    Swiper.prototype.init = function init () {
4279      var swiper = this;
4280      if (swiper.initialized) { return; }
4281
4282      swiper.emit('beforeInit');
4283
4284      // Set breakpoint
4285      if (swiper.params.breakpoints) {
4286        swiper.setBreakpoint();
4287      }
4288
4289      // Add Classes
4290      swiper.addClasses();
4291
4292      // Create loop
4293      if (swiper.params.loop) {
4294        swiper.loopCreate();
4295      }
4296
4297      // Update size
4298      swiper.updateSize();
4299
4300      // Update slides
4301      swiper.updateSlides();
4302
4303      if (swiper.params.watchOverflow) {
4304        swiper.checkOverflow();
4305      }
4306
4307      // Set Grab Cursor
4308      if (swiper.params.grabCursor) {
4309        swiper.setGrabCursor();
4310      }
4311
4312      if (swiper.params.preloadImages) {
4313        swiper.preloadImages();
4314      }
4315
4316      // Slide To Initial Slide
4317      if (swiper.params.loop) {
4318        swiper.slideTo(swiper.params.initialSlide + swiper.loopedSlides, 0, swiper.params.runCallbacksOnInit);
4319      } else {
4320        swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit);
4321      }
4322
4323      // Attach events
4324      swiper.attachEvents();
4325
4326      // Init Flag
4327      swiper.initialized = true;
4328
4329      // Emit
4330      swiper.emit('init');
4331    };
4332
4333    Swiper.prototype.destroy = function destroy (deleteInstance, cleanStyles) {
4334      if ( deleteInstance === void 0 ) deleteInstance = true;
4335      if ( cleanStyles === void 0 ) cleanStyles = true;
4336
4337      var swiper = this;
4338      var params = swiper.params;
4339      var $el = swiper.$el;
4340      var $wrapperEl = swiper.$wrapperEl;
4341      var slides = swiper.slides;
4342
4343      if (typeof swiper.params === 'undefined' || swiper.destroyed) {
4344        return null;
4345      }
4346
4347      swiper.emit('beforeDestroy');
4348
4349      // Init Flag
4350      swiper.initialized = false;
4351
4352      // Detach events
4353      swiper.detachEvents();
4354
4355      // Destroy loop
4356      if (params.loop) {
4357        swiper.loopDestroy();
4358      }
4359
4360      // Cleanup styles
4361      if (cleanStyles) {
4362        swiper.removeClasses();
4363        $el.removeAttr('style');
4364        $wrapperEl.removeAttr('style');
4365        if (slides && slides.length) {
4366          slides
4367            .removeClass([
4368              params.slideVisibleClass,
4369              params.slideActiveClass,
4370              params.slideNextClass,
4371              params.slidePrevClass ].join(' '))
4372            .removeAttr('style')
4373            .removeAttr('data-swiper-slide-index');
4374        }
4375      }
4376
4377      swiper.emit('destroy');
4378
4379      // Detach emitter events
4380      Object.keys(swiper.eventsListeners).forEach(function (eventName) {
4381        swiper.off(eventName);
4382      });
4383
4384      if (deleteInstance !== false) {
4385        swiper.$el[0].swiper = null;
4386        swiper.$el.data('swiper', null);
4387        Utils.deleteProps(swiper);
4388      }
4389      swiper.destroyed = true;
4390
4391      return null;
4392    };
4393
4394    Swiper.extendDefaults = function extendDefaults (newDefaults) {
4395      Utils.extend(extendedDefaults, newDefaults);
4396    };
4397
4398    staticAccessors.extendedDefaults.get = function () {
4399      return extendedDefaults;
4400    };
4401
4402    staticAccessors.defaults.get = function () {
4403      return defaults;
4404    };
4405
4406    staticAccessors.Class.get = function () {
4407      return SwiperClass;
4408    };
4409
4410    staticAccessors.$.get = function () {
4411      return $;
4412    };
4413
4414    Object.defineProperties( Swiper, staticAccessors );
4415
4416    return Swiper;
4417  }(SwiperClass));
4418
4419  var Device$1 = {
4420    name: 'device',
4421    proto: {
4422      device: Device,
4423    },
4424    static: {
4425      device: Device,
4426    },
4427  };
4428
4429  var Support$1 = {
4430    name: 'support',
4431    proto: {
4432      support: Support,
4433    },
4434    static: {
4435      support: Support,
4436    },
4437  };
4438
4439  var Browser = (function Browser() {
4440    function isSafari() {
4441      var ua = win.navigator.userAgent.toLowerCase();
4442      return (ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0);
4443    }
4444    return {
4445      isEdge: !!win.navigator.userAgent.match(/Edge/g),
4446      isSafari: isSafari(),
4447      isUiWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(win.navigator.userAgent),
4448    };
4449  }());
4450
4451  var Browser$1 = {
4452    name: 'browser',
4453    proto: {
4454      browser: Browser,
4455    },
4456    static: {
4457      browser: Browser,
4458    },
4459  };
4460
4461  var Resize = {
4462    name: 'resize',
4463    create: function create() {
4464      var swiper = this;
4465      Utils.extend(swiper, {
4466        resize: {
4467          resizeHandler: function resizeHandler() {
4468            if (!swiper || swiper.destroyed || !swiper.initialized) { return; }
4469            swiper.emit('beforeResize');
4470            swiper.emit('resize');
4471          },
4472          orientationChangeHandler: function orientationChangeHandler() {
4473            if (!swiper || swiper.destroyed || !swiper.initialized) { return; }
4474            swiper.emit('orientationchange');
4475          },
4476        },
4477      });
4478    },
4479    on: {
4480      init: function init() {
4481        var swiper = this;
4482        // Emit resize
4483        win.addEventListener('resize', swiper.resize.resizeHandler);
4484
4485        // Emit orientationchange
4486        win.addEventListener('orientationchange', swiper.resize.orientationChangeHandler);
4487      },
4488      destroy: function destroy() {
4489        var swiper = this;
4490        win.removeEventListener('resize', swiper.resize.resizeHandler);
4491        win.removeEventListener('orientationchange', swiper.resize.orientationChangeHandler);
4492      },
4493    },
4494  };
4495
4496  var Observer = {
4497    func: win.MutationObserver || win.WebkitMutationObserver,
4498    attach: function attach(target, options) {
4499      if ( options === void 0 ) options = {};
4500
4501      var swiper = this;
4502
4503      var ObserverFunc = Observer.func;
4504      var observer = new ObserverFunc(function (mutations) {
4505        // The observerUpdate event should only be triggered
4506        // once despite the number of mutations.  Additional
4507        // triggers are redundant and are very costly
4508        if (mutations.length === 1) {
4509          swiper.emit('observerUpdate', mutations[0]);
4510          return;
4511        }
4512        var observerUpdate = function observerUpdate() {
4513          swiper.emit('observerUpdate', mutations[0]);
4514        };
4515
4516        if (win.requestAnimationFrame) {
4517          win.requestAnimationFrame(observerUpdate);
4518        } else {
4519          win.setTimeout(observerUpdate, 0);
4520        }
4521      });
4522
4523      observer.observe(target, {
4524        attributes: typeof options.attributes === 'undefined' ? true : options.attributes,
4525        childList: typeof options.childList === 'undefined' ? true : options.childList,
4526        characterData: typeof options.characterData === 'undefined' ? true : options.characterData,
4527      });
4528
4529      swiper.observer.observers.push(observer);
4530    },
4531    init: function init() {
4532      var swiper = this;
4533      if (!Support.observer || !swiper.params.observer) { return; }
4534      if (swiper.params.observeParents) {
4535        var containerParents = swiper.$el.parents();
4536        for (var i = 0; i < containerParents.length; i += 1) {
4537          swiper.observer.attach(containerParents[i]);
4538        }
4539      }
4540      // Observe container
4541      swiper.observer.attach(swiper.$el[0], { childList: swiper.params.observeSlideChildren });
4542
4543      // Observe wrapper
4544      swiper.observer.attach(swiper.$wrapperEl[0], { attributes: false });
4545    },
4546    destroy: function destroy() {
4547      var swiper = this;
4548      swiper.observer.observers.forEach(function (observer) {
4549        observer.disconnect();
4550      });
4551      swiper.observer.observers = [];
4552    },
4553  };
4554
4555  var Observer$1 = {
4556    name: 'observer',
4557    params: {
4558      observer: false,
4559      observeParents: false,
4560      observeSlideChildren: false,
4561    },
4562    create: function create() {
4563      var swiper = this;
4564      Utils.extend(swiper, {
4565        observer: {
4566          init: Observer.init.bind(swiper),
4567          attach: Observer.attach.bind(swiper),
4568          destroy: Observer.destroy.bind(swiper),
4569          observers: [],
4570        },
4571      });
4572    },
4573    on: {
4574      init: function init() {
4575        var swiper = this;
4576        swiper.observer.init();
4577      },
4578      destroy: function destroy() {
4579        var swiper = this;
4580        swiper.observer.destroy();
4581      },
4582    },
4583  };
4584
4585  var Virtual = {
4586    update: function update(force) {
4587      var swiper = this;
4588      var ref = swiper.params;
4589      var slidesPerView = ref.slidesPerView;
4590      var slidesPerGroup = ref.slidesPerGroup;
4591      var centeredSlides = ref.centeredSlides;
4592      var ref$1 = swiper.params.virtual;
4593      var addSlidesBefore = ref$1.addSlidesBefore;
4594      var addSlidesAfter = ref$1.addSlidesAfter;
4595      var ref$2 = swiper.virtual;
4596      var previousFrom = ref$2.from;
4597      var previousTo = ref$2.to;
4598      var slides = ref$2.slides;
4599      var previousSlidesGrid = ref$2.slidesGrid;
4600      var renderSlide = ref$2.renderSlide;
4601      var previousOffset = ref$2.offset;
4602      swiper.updateActiveIndex();
4603      var activeIndex = swiper.activeIndex || 0;
4604
4605      var offsetProp;
4606      if (swiper.rtlTranslate) { offsetProp = 'right'; }
4607      else { offsetProp = swiper.isHorizontal() ? 'left' : 'top'; }
4608
4609      var slidesAfter;
4610      var slidesBefore;
4611      if (centeredSlides) {
4612        slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;
4613        slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;
4614      } else {
4615        slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesBefore;
4616        slidesBefore = slidesPerGroup + addSlidesAfter;
4617      }
4618      var from = Math.max((activeIndex || 0) - slidesBefore, 0);
4619      var to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1);
4620      var offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);
4621
4622      Utils.extend(swiper.virtual, {
4623        from: from,
4624        to: to,
4625        offset: offset,
4626        slidesGrid: swiper.slidesGrid,
4627      });
4628
4629      function onRendered() {
4630        swiper.updateSlides();
4631        swiper.updateProgress();
4632        swiper.updateSlidesClasses();
4633        if (swiper.lazy && swiper.params.lazy.enabled) {
4634          swiper.lazy.load();
4635        }
4636      }
4637
4638      if (previousFrom === from && previousTo === to && !force) {
4639        if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {
4640          swiper.slides.css(offsetProp, (offset + "px"));
4641        }
4642        swiper.updateProgress();
4643        return;
4644      }
4645      if (swiper.params.virtual.renderExternal) {
4646        swiper.params.virtual.renderExternal.call(swiper, {
4647          offset: offset,
4648          from: from,
4649          to: to,
4650          slides: (function getSlides() {
4651            var slidesToRender = [];
4652            for (var i = from; i <= to; i += 1) {
4653              slidesToRender.push(slides[i]);
4654            }
4655            return slidesToRender;
4656          }()),
4657        });
4658        onRendered();
4659        return;
4660      }
4661      var prependIndexes = [];
4662      var appendIndexes = [];
4663      if (force) {
4664        swiper.$wrapperEl.find(("." + (swiper.params.slideClass))).remove();
4665      } else {
4666        for (var i = previousFrom; i <= previousTo; i += 1) {
4667          if (i < from || i > to) {
4668            swiper.$wrapperEl.find(("." + (swiper.params.slideClass) + "[data-swiper-slide-index=\"" + i + "\"]")).remove();
4669          }
4670        }
4671      }
4672      for (var i$1 = 0; i$1 < slides.length; i$1 += 1) {
4673        if (i$1 >= from && i$1 <= to) {
4674          if (typeof previousTo === 'undefined' || force) {
4675            appendIndexes.push(i$1);
4676          } else {
4677            if (i$1 > previousTo) { appendIndexes.push(i$1); }
4678            if (i$1 < previousFrom) { prependIndexes.push(i$1); }
4679          }
4680        }
4681      }
4682      appendIndexes.forEach(function (index) {
4683        swiper.$wrapperEl.append(renderSlide(slides[index], index));
4684      });
4685      prependIndexes.sort(function (a, b) { return b - a; }).forEach(function (index) {
4686        swiper.$wrapperEl.prepend(renderSlide(slides[index], index));
4687      });
4688      swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, (offset + "px"));
4689      onRendered();
4690    },
4691    renderSlide: function renderSlide(slide, index) {
4692      var swiper = this;
4693      var params = swiper.params.virtual;
4694      if (params.cache && swiper.virtual.cache[index]) {
4695        return swiper.virtual.cache[index];
4696      }
4697      var $slideEl = params.renderSlide
4698        ? $(params.renderSlide.call(swiper, slide, index))
4699        : $(("<div class=\"" + (swiper.params.slideClass) + "\" data-swiper-slide-index=\"" + index + "\">" + slide + "</div>"));
4700      if (!$slideEl.attr('data-swiper-slide-index')) { $slideEl.attr('data-swiper-slide-index', index); }
4701      if (params.cache) { swiper.virtual.cache[index] = $slideEl; }
4702      return $slideEl;
4703    },
4704    appendSlide: function appendSlide(slides) {
4705      var swiper = this;
4706      if (typeof slides === 'object' && 'length' in slides) {
4707        for (var i = 0; i < slides.length; i += 1) {
4708          if (slides[i]) { swiper.virtual.slides.push(slides[i]); }
4709        }
4710      } else {
4711        swiper.virtual.slides.push(slides);
4712      }
4713      swiper.virtual.update(true);
4714    },
4715    prependSlide: function prependSlide(slides) {
4716      var swiper = this;
4717      var activeIndex = swiper.activeIndex;
4718      var newActiveIndex = activeIndex + 1;
4719      var numberOfNewSlides = 1;
4720
4721      if (Array.isArray(slides)) {
4722        for (var i = 0; i < slides.length; i += 1) {
4723          if (slides[i]) { swiper.virtual.slides.unshift(slides[i]); }
4724        }
4725        newActiveIndex = activeIndex + slides.length;
4726        numberOfNewSlides = slides.length;
4727      } else {
4728        swiper.virtual.slides.unshift(slides);
4729      }
4730      if (swiper.params.virtual.cache) {
4731        var cache = swiper.virtual.cache;
4732        var newCache = {};
4733        Object.keys(cache).forEach(function (cachedIndex) {
4734          var $cachedEl = cache[cachedIndex];
4735          var cachedElIndex = $cachedEl.attr('data-swiper-slide-index');
4736          if (cachedElIndex) {
4737            $cachedEl.attr('data-swiper-slide-index', parseInt(cachedElIndex, 10) + 1);
4738          }
4739          newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = $cachedEl;
4740        });
4741        swiper.virtual.cache = newCache;
4742      }
4743      swiper.virtual.update(true);
4744      swiper.slideTo(newActiveIndex, 0);
4745    },
4746    removeSlide: function removeSlide(slidesIndexes) {
4747      var swiper = this;
4748      if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) { return; }
4749      var activeIndex = swiper.activeIndex;
4750      if (Array.isArray(slidesIndexes)) {
4751        for (var i = slidesIndexes.length - 1; i >= 0; i -= 1) {
4752          swiper.virtual.slides.splice(slidesIndexes[i], 1);
4753          if (swiper.params.virtual.cache) {
4754            delete swiper.virtual.cache[slidesIndexes[i]];
4755          }
4756          if (slidesIndexes[i] < activeIndex) { activeIndex -= 1; }
4757          activeIndex = Math.max(activeIndex, 0);
4758        }
4759      } else {
4760        swiper.virtual.slides.splice(slidesIndexes, 1);
4761        if (swiper.params.virtual.cache) {
4762          delete swiper.virtual.cache[slidesIndexes];
4763        }
4764        if (slidesIndexes < activeIndex) { activeIndex -= 1; }
4765        activeIndex = Math.max(activeIndex, 0);
4766      }
4767      swiper.virtual.update(true);
4768      swiper.slideTo(activeIndex, 0);
4769    },
4770    removeAllSlides: function removeAllSlides() {
4771      var swiper = this;
4772      swiper.virtual.slides = [];
4773      if (swiper.params.virtual.cache) {
4774        swiper.virtual.cache = {};
4775      }
4776      swiper.virtual.update(true);
4777      swiper.slideTo(0, 0);
4778    },
4779  };
4780
4781  var Virtual$1 = {
4782    name: 'virtual',
4783    params: {
4784      virtual: {
4785        enabled: false,
4786        slides: [],
4787        cache: true,
4788        renderSlide: null,
4789        renderExternal: null,
4790        addSlidesBefore: 0,
4791        addSlidesAfter: 0,
4792      },
4793    },
4794    create: function create() {
4795      var swiper = this;
4796      Utils.extend(swiper, {
4797        virtual: {
4798          update: Virtual.update.bind(swiper),
4799          appendSlide: Virtual.appendSlide.bind(swiper),
4800          prependSlide: Virtual.prependSlide.bind(swiper),
4801          removeSlide: Virtual.removeSlide.bind(swiper),
4802          removeAllSlides: Virtual.removeAllSlides.bind(swiper),
4803          renderSlide: Virtual.renderSlide.bind(swiper),
4804          slides: swiper.params.virtual.slides,
4805          cache: {},
4806        },
4807      });
4808    },
4809    on: {
4810      beforeInit: function beforeInit() {
4811        var swiper = this;
4812        if (!swiper.params.virtual.enabled) { return; }
4813        swiper.classNames.push(((swiper.params.containerModifierClass) + "virtual"));
4814        var overwriteParams = {
4815          watchSlidesProgress: true,
4816        };
4817        Utils.extend(swiper.params, overwriteParams);
4818        Utils.extend(swiper.originalParams, overwriteParams);
4819
4820        if (!swiper.params.initialSlide) {
4821          swiper.virtual.update();
4822        }
4823      },
4824      setTranslate: function setTranslate() {
4825        var swiper = this;
4826        if (!swiper.params.virtual.enabled) { return; }
4827        swiper.virtual.update();
4828      },
4829    },
4830  };
4831
4832  var Keyboard = {
4833    handle: function handle(event) {
4834      var swiper = this;
4835      var rtl = swiper.rtlTranslate;
4836      var e = event;
4837      if (e.originalEvent) { e = e.originalEvent; } // jquery fix
4838      var kc = e.keyCode || e.charCode;
4839      // Directions locks
4840      if (!swiper.allowSlideNext && ((swiper.isHorizontal() && kc === 39) || (swiper.isVertical() && kc === 40) || kc === 34)) {
4841        return false;
4842      }
4843      if (!swiper.allowSlidePrev && ((swiper.isHorizontal() && kc === 37) || (swiper.isVertical() && kc === 38) || kc === 33)) {
4844        return false;
4845      }
4846      if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {
4847        return undefined;
4848      }
4849      if (doc.activeElement && doc.activeElement.nodeName && (doc.activeElement.nodeName.toLowerCase() === 'input' || doc.activeElement.nodeName.toLowerCase() === 'textarea')) {
4850        return undefined;
4851      }
4852      if (swiper.params.keyboard.onlyInViewport && (kc === 33 || kc === 34 || kc === 37 || kc === 39 || kc === 38 || kc === 40)) {
4853        var inView = false;
4854        // Check that swiper should be inside of visible area of window
4855        if (swiper.$el.parents(("." + (swiper.params.slideClass))).length > 0 && swiper.$el.parents(("." + (swiper.params.slideActiveClass))).length === 0) {
4856          return undefined;
4857        }
4858        var windowWidth = win.innerWidth;
4859        var windowHeight = win.innerHeight;
4860        var swiperOffset = swiper.$el.offset();
4861        if (rtl) { swiperOffset.left -= swiper.$el[0].scrollLeft; }
4862        var swiperCoord = [
4863          [swiperOffset.left, swiperOffset.top],
4864          [swiperOffset.left + swiper.width, swiperOffset.top],
4865          [swiperOffset.left, swiperOffset.top + swiper.height],
4866          [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height] ];
4867        for (var i = 0; i < swiperCoord.length; i += 1) {
4868          var point = swiperCoord[i];
4869          if (
4870            point[0] >= 0 && point[0] <= windowWidth
4871            && point[1] >= 0 && point[1] <= windowHeight
4872          ) {
4873            inView = true;
4874          }
4875        }
4876        if (!inView) { return undefined; }
4877      }
4878      if (swiper.isHorizontal()) {
4879        if (kc === 33 || kc === 34 || kc === 37 || kc === 39) {
4880          if (e.preventDefault) { e.preventDefault(); }
4881          else { e.returnValue = false; }
4882        }
4883        if (((kc === 34 || kc === 39) && !rtl) || ((kc === 33 || kc === 37) && rtl)) { swiper.slideNext(); }
4884        if (((kc === 33 || kc === 37) && !rtl) || ((kc === 34 || kc === 39) && rtl)) { swiper.slidePrev(); }
4885      } else {
4886        if (kc === 33 || kc === 34 || kc === 38 || kc === 40) {
4887          if (e.preventDefault) { e.preventDefault(); }
4888          else { e.returnValue = false; }
4889        }
4890        if (kc === 34 || kc === 40) { swiper.slideNext(); }
4891        if (kc === 33 || kc === 38) { swiper.slidePrev(); }
4892      }
4893      swiper.emit('keyPress', kc);
4894      return undefined;
4895    },
4896    enable: function enable() {
4897      var swiper = this;
4898      if (swiper.keyboard.enabled) { return; }
4899      $(doc).on('keydown', swiper.keyboard.handle);
4900      swiper.keyboard.enabled = true;
4901    },
4902    disable: function disable() {
4903      var swiper = this;
4904      if (!swiper.keyboard.enabled) { return; }
4905      $(doc).off('keydown', swiper.keyboard.handle);
4906      swiper.keyboard.enabled = false;
4907    },
4908  };
4909
4910  var Keyboard$1 = {
4911    name: 'keyboard',
4912    params: {
4913      keyboard: {
4914        enabled: false,
4915        onlyInViewport: true,
4916      },
4917    },
4918    create: function create() {
4919      var swiper = this;
4920      Utils.extend(swiper, {
4921        keyboard: {
4922          enabled: false,
4923          enable: Keyboard.enable.bind(swiper),
4924          disable: Keyboard.disable.bind(swiper),
4925          handle: Keyboard.handle.bind(swiper),
4926        },
4927      });
4928    },
4929    on: {
4930      init: function init() {
4931        var swiper = this;
4932        if (swiper.params.keyboard.enabled) {
4933          swiper.keyboard.enable();
4934        }
4935      },
4936      destroy: function destroy() {
4937        var swiper = this;
4938        if (swiper.keyboard.enabled) {
4939          swiper.keyboard.disable();
4940        }
4941      },
4942    },
4943  };
4944
4945  function isEventSupported() {
4946    var eventName = 'onwheel';
4947    var isSupported = eventName in doc;
4948
4949    if (!isSupported) {
4950      var element = doc.createElement('div');
4951      element.setAttribute(eventName, 'return;');
4952      isSupported = typeof element[eventName] === 'function';
4953    }
4954
4955    if (!isSupported
4956      && doc.implementation
4957      && doc.implementation.hasFeature
4958      // always returns true in newer browsers as per the standard.
4959      // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature
4960      && doc.implementation.hasFeature('', '') !== true
4961    ) {
4962      // This is the only way to test support for the `wheel` event in IE9+.
4963      isSupported = doc.implementation.hasFeature('Events.wheel', '3.0');
4964    }
4965
4966    return isSupported;
4967  }
4968  var Mousewheel = {
4969    lastScrollTime: Utils.now(),
4970    lastEventBeforeSnap: undefined,
4971    recentWheelEvents: [],
4972    event: function event() {
4973      if (win.navigator.userAgent.indexOf('firefox') > -1) { return 'DOMMouseScroll'; }
4974      return isEventSupported() ? 'wheel' : 'mousewheel';
4975    },
4976    normalize: function normalize(e) {
4977      // Reasonable defaults
4978      var PIXEL_STEP = 10;
4979      var LINE_HEIGHT = 40;
4980      var PAGE_HEIGHT = 800;
4981
4982      var sX = 0;
4983      var sY = 0; // spinX, spinY
4984      var pX = 0;
4985      var pY = 0; // pixelX, pixelY
4986
4987      // Legacy
4988      if ('detail' in e) {
4989        sY = e.detail;
4990      }
4991      if ('wheelDelta' in e) {
4992        sY = -e.wheelDelta / 120;
4993      }
4994      if ('wheelDeltaY' in e) {
4995        sY = -e.wheelDeltaY / 120;
4996      }
4997      if ('wheelDeltaX' in e) {
4998        sX = -e.wheelDeltaX / 120;
4999      }
5000
5001      // side scrolling on FF with DOMMouseScroll
5002      if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {
5003        sX = sY;
5004        sY = 0;
5005      }
5006
5007      pX = sX * PIXEL_STEP;
5008      pY = sY * PIXEL_STEP;
5009
5010      if ('deltaY' in e) {
5011        pY = e.deltaY;
5012      }
5013      if ('deltaX' in e) {
5014        pX = e.deltaX;
5015      }
5016
5017      if (e.shiftKey && !pX) { // if user scrolls with shift he wants horizontal scroll
5018        pX = pY;
5019        pY = 0;
5020      }
5021
5022      if ((pX || pY) && e.deltaMode) {
5023        if (e.deltaMode === 1) { // delta in LINE units
5024          pX *= LINE_HEIGHT;
5025          pY *= LINE_HEIGHT;
5026        } else { // delta in PAGE units
5027          pX *= PAGE_HEIGHT;
5028          pY *= PAGE_HEIGHT;
5029        }
5030      }
5031
5032      // Fall-back if spin cannot be determined
5033      if (pX && !sX) {
5034        sX = (pX < 1) ? -1 : 1;
5035      }
5036      if (pY && !sY) {
5037        sY = (pY < 1) ? -1 : 1;
5038      }
5039
5040      return {
5041        spinX: sX,
5042        spinY: sY,
5043        pixelX: pX,
5044        pixelY: pY,
5045      };
5046    },
5047    handleMouseEnter: function handleMouseEnter() {
5048      var swiper = this;
5049      swiper.mouseEntered = true;
5050    },
5051    handleMouseLeave: function handleMouseLeave() {
5052      var swiper = this;
5053      swiper.mouseEntered = false;
5054    },
5055    handle: function handle(event) {
5056      var e = event;
5057      var swiper = this;
5058      var params = swiper.params.mousewheel;
5059
5060      if (swiper.params.cssMode) {
5061        e.preventDefault();
5062      }
5063
5064      var target = swiper.$el;
5065      if (swiper.params.mousewheel.eventsTarged !== 'container') {
5066        target = $(swiper.params.mousewheel.eventsTarged);
5067      }
5068      if (!swiper.mouseEntered && !target[0].contains(e.target) && !params.releaseOnEdges) { return true; }
5069
5070      if (e.originalEvent) { e = e.originalEvent; } // jquery fix
5071      var delta = 0;
5072      var rtlFactor = swiper.rtlTranslate ? -1 : 1;
5073
5074      var data = Mousewheel.normalize(e);
5075
5076      if (params.forceToAxis) {
5077        if (swiper.isHorizontal()) {
5078          if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) { delta = data.pixelX * rtlFactor; }
5079          else { return true; }
5080        } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) { delta = data.pixelY; }
5081        else { return true; }
5082      } else {
5083        delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;
5084      }
5085
5086      if (delta === 0) { return true; }
5087
5088      if (params.invert) { delta = -delta; }
5089
5090      if (!swiper.params.freeMode) {
5091        // Register the new event in a variable which stores the relevant data
5092        var newEvent = {
5093          time: Utils.now(),
5094          delta: Math.abs(delta),
5095          direction: Math.sign(delta),
5096          raw: event,
5097        };
5098
5099        // Keep the most recent events
5100        var recentWheelEvents = swiper.mousewheel.recentWheelEvents;
5101        if (recentWheelEvents.length >= 2) {
5102          recentWheelEvents.shift(); // only store the last N events
5103        }
5104        var prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined;
5105        recentWheelEvents.push(newEvent);
5106
5107        // If there is at least one previous recorded event:
5108        //   If direction has changed or
5109        //   if the scroll is quicker than the previous one:
5110        //     Animate the slider.
5111        // Else (this is the first time the wheel is moved):
5112        //     Animate the slider.
5113        if (prevEvent) {
5114          if (newEvent.direction !== prevEvent.direction || newEvent.delta > prevEvent.delta) {
5115            swiper.mousewheel.animateSlider(newEvent);
5116          }
5117        } else {
5118          swiper.mousewheel.animateSlider(newEvent);
5119        }
5120
5121        // If it's time to release the scroll:
5122        //   Return now so you don't hit the preventDefault.
5123        if (swiper.mousewheel.releaseScroll(newEvent)) {
5124          return true;
5125        }
5126      } else {
5127        // Freemode or scrollContainer:
5128
5129        // If we recently snapped after a momentum scroll, then ignore wheel events
5130        // to give time for the deceleration to finish. Stop ignoring after 500 msecs
5131        // or if it's a new scroll (larger delta or inverse sign as last event before
5132        // an end-of-momentum snap).
5133        var newEvent$1 = { time: Utils.now(), delta: Math.abs(delta), direction: Math.sign(delta) };
5134        var ref = swiper.mousewheel;
5135        var lastEventBeforeSnap = ref.lastEventBeforeSnap;
5136        var ignoreWheelEvents = lastEventBeforeSnap
5137          && newEvent$1.time < lastEventBeforeSnap.time + 500
5138          && newEvent$1.delta <= lastEventBeforeSnap.delta
5139          && newEvent$1.direction === lastEventBeforeSnap.direction;
5140        if (!ignoreWheelEvents) {
5141          swiper.mousewheel.lastEventBeforeSnap = undefined;
5142
5143          if (swiper.params.loop) {
5144            swiper.loopFix();
5145          }
5146          var position = swiper.getTranslate() + (delta * params.sensitivity);
5147          var wasBeginning = swiper.isBeginning;
5148          var wasEnd = swiper.isEnd;
5149
5150          if (position >= swiper.minTranslate()) { position = swiper.minTranslate(); }
5151          if (position <= swiper.maxTranslate()) { position = swiper.maxTranslate(); }
5152
5153          swiper.setTransition(0);
5154          swiper.setTranslate(position);
5155          swiper.updateProgress();
5156          swiper.updateActiveIndex();
5157          swiper.updateSlidesClasses();
5158
5159          if ((!wasBeginning && swiper.isBeginning) || (!wasEnd && swiper.isEnd)) {
5160            swiper.updateSlidesClasses();
5161          }
5162
5163          if (swiper.params.freeModeSticky) {
5164            // When wheel scrolling starts with sticky (aka snap) enabled, then detect
5165            // the end of a momentum scroll by storing recent (N=15?) wheel events.
5166            // 1. do all N events have decreasing or same (absolute value) delta?
5167            // 2. did all N events arrive in the last M (M=500?) msecs?
5168            // 3. does the earliest event have an (absolute value) delta that's
5169            //    at least P (P=1?) larger than the most recent event's delta?
5170            // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels?
5171            // If 1-4 are "yes" then we're near the end of a momuntum scroll deceleration.
5172            // Snap immediately and ignore remaining wheel events in this scroll.
5173            // See comment above for "remaining wheel events in this scroll" determination.
5174            // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event.
5175            clearTimeout(swiper.mousewheel.timeout);
5176            swiper.mousewheel.timeout = undefined;
5177            var recentWheelEvents$1 = swiper.mousewheel.recentWheelEvents;
5178            if (recentWheelEvents$1.length >= 15) {
5179              recentWheelEvents$1.shift(); // only store the last N events
5180            }
5181            var prevEvent$1 = recentWheelEvents$1.length ? recentWheelEvents$1[recentWheelEvents$1.length - 1] : undefined;
5182            var firstEvent = recentWheelEvents$1[0];
5183            recentWheelEvents$1.push(newEvent$1);
5184            if (prevEvent$1 && (newEvent$1.delta > prevEvent$1.delta || newEvent$1.direction !== prevEvent$1.direction)) {
5185              // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log.
5186              recentWheelEvents$1.splice(0);
5187            } else if (recentWheelEvents$1.length >= 15
5188                && newEvent$1.time - firstEvent.time < 500
5189                && firstEvent.delta - newEvent$1.delta >= 1
5190                && newEvent$1.delta <= 6
5191            ) {
5192              // We're at the end of the deceleration of a momentum scroll, so there's no need
5193              // to wait for more events. Snap ASAP on the next tick.
5194              // Also, because there's some remaining momentum we'll bias the snap in the
5195              // direction of the ongoing scroll because it's better UX for the scroll to snap
5196              // in the same direction as the scroll instead of reversing to snap.  Therefore,
5197              // if it's already scrolled more than 20% in the current direction, keep going.
5198              var snapToThreshold = delta > 0 ? 0.8 : 0.2;
5199              swiper.mousewheel.lastEventBeforeSnap = newEvent$1;
5200              recentWheelEvents$1.splice(0);
5201              swiper.mousewheel.timeout = Utils.nextTick(function () {
5202                swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);
5203              }, 0); // no delay; move on next tick
5204            }
5205            if (!swiper.mousewheel.timeout) {
5206              // if we get here, then we haven't detected the end of a momentum scroll, so
5207              // we'll consider a scroll "complete" when there haven't been any wheel events
5208              // for 500ms.
5209              swiper.mousewheel.timeout = Utils.nextTick(function () {
5210                var snapToThreshold = 0.5;
5211                swiper.mousewheel.lastEventBeforeSnap = newEvent$1;
5212                recentWheelEvents$1.splice(0);
5213                swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);
5214              }, 500);
5215            }
5216          }
5217
5218          // Emit event
5219          if (!ignoreWheelEvents) { swiper.emit('scroll', e); }
5220
5221          // Stop autoplay
5222          if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction) { swiper.autoplay.stop(); }
5223          // Return page scroll on edge positions
5224          if (position === swiper.minTranslate() || position === swiper.maxTranslate()) { return true; }
5225        }
5226      }
5227
5228      if (e.preventDefault) { e.preventDefault(); }
5229      else { e.returnValue = false; }
5230      return false;
5231    },
5232    animateSlider: function animateSlider(newEvent) {
5233      var swiper = this;
5234      // If the movement is NOT big enough and
5235      // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider):
5236      //   Don't go any further (avoid insignificant scroll movement).
5237      if (newEvent.delta >= 6 && Utils.now() - swiper.mousewheel.lastScrollTime < 60) {
5238        // Return false as a default
5239        return true;
5240      }
5241      // If user is scrolling towards the end:
5242      //   If the slider hasn't hit the latest slide or
5243      //   if the slider is a loop and
5244      //   if the slider isn't moving right now:
5245      //     Go to next slide and
5246      //     emit a scroll event.
5247      // Else (the user is scrolling towards the beginning) and
5248      // if the slider hasn't hit the first slide or
5249      // if the slider is a loop and
5250      // if the slider isn't moving right now:
5251      //   Go to prev slide and
5252      //   emit a scroll event.
5253      if (newEvent.direction < 0) {
5254        if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {
5255          swiper.slideNext();
5256          swiper.emit('scroll', newEvent.raw);
5257        }
5258      } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {
5259        swiper.slidePrev();
5260        swiper.emit('scroll', newEvent.raw);
5261      }
5262      // If you got here is because an animation has been triggered so store the current time
5263      swiper.mousewheel.lastScrollTime = (new win.Date()).getTime();
5264      // Return false as a default
5265      return false;
5266    },
5267    releaseScroll: function releaseScroll(newEvent) {
5268      var swiper = this;
5269      var params = swiper.params.mousewheel;
5270      if (newEvent.direction < 0) {
5271        if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) {
5272          // Return true to animate scroll on edges
5273          return true;
5274        }
5275      } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) {
5276        // Return true to animate scroll on edges
5277        return true;
5278      }
5279      return false;
5280    },
5281    enable: function enable() {
5282      var swiper = this;
5283      var event = Mousewheel.event();
5284      if (swiper.params.cssMode) {
5285        swiper.wrapperEl.removeEventListener(event, swiper.mousewheel.handle);
5286        return true;
5287      }
5288      if (!event) { return false; }
5289      if (swiper.mousewheel.enabled) { return false; }
5290      var target = swiper.$el;
5291      if (swiper.params.mousewheel.eventsTarged !== 'container') {
5292        target = $(swiper.params.mousewheel.eventsTarged);
5293      }
5294      target.on('mouseenter', swiper.mousewheel.handleMouseEnter);
5295      target.on('mouseleave', swiper.mousewheel.handleMouseLeave);
5296      target.on(event, swiper.mousewheel.handle);
5297      swiper.mousewheel.enabled = true;
5298      return true;
5299    },
5300    disable: function disable() {
5301      var swiper = this;
5302      var event = Mousewheel.event();
5303      if (swiper.params.cssMode) {
5304        swiper.wrapperEl.addEventListener(event, swiper.mousewheel.handle);
5305        return true;
5306      }
5307      if (!event) { return false; }
5308      if (!swiper.mousewheel.enabled) { return false; }
5309      var target = swiper.$el;
5310      if (swiper.params.mousewheel.eventsTarged !== 'container') {
5311        target = $(swiper.params.mousewheel.eventsTarged);
5312      }
5313      target.off(event, swiper.mousewheel.handle);
5314      swiper.mousewheel.enabled = false;
5315      return true;
5316    },
5317  };
5318
5319  var Mousewheel$1 = {
5320    name: 'mousewheel',
5321    params: {
5322      mousewheel: {
5323        enabled: false,
5324        releaseOnEdges: false,
5325        invert: false,
5326        forceToAxis: false,
5327        sensitivity: 1,
5328        eventsTarged: 'container',
5329      },
5330    },
5331    create: function create() {
5332      var swiper = this;
5333      Utils.extend(swiper, {
5334        mousewheel: {
5335          enabled: false,
5336          enable: Mousewheel.enable.bind(swiper),
5337          disable: Mousewheel.disable.bind(swiper),
5338          handle: Mousewheel.handle.bind(swiper),
5339          handleMouseEnter: Mousewheel.handleMouseEnter.bind(swiper),
5340          handleMouseLeave: Mousewheel.handleMouseLeave.bind(swiper),
5341          animateSlider: Mousewheel.animateSlider.bind(swiper),
5342          releaseScroll: Mousewheel.releaseScroll.bind(swiper),
5343          lastScrollTime: Utils.now(),
5344          lastEventBeforeSnap: undefined,
5345          recentWheelEvents: [],
5346        },
5347      });
5348    },
5349    on: {
5350      init: function init() {
5351        var swiper = this;
5352        if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) {
5353          swiper.mousewheel.disable();
5354        }
5355        if (swiper.params.mousewheel.enabled) { swiper.mousewheel.enable(); }
5356      },
5357      destroy: function destroy() {
5358        var swiper = this;
5359        if (swiper.params.cssMode) {
5360          swiper.mousewheel.enable();
5361        }
5362        if (swiper.mousewheel.enabled) { swiper.mousewheel.disable(); }
5363      },
5364    },
5365  };
5366
5367  var Navigation = {
5368    update: function update() {
5369      // Update Navigation Buttons
5370      var swiper = this;
5371      var params = swiper.params.navigation;
5372
5373      if (swiper.params.loop) { return; }
5374      var ref = swiper.navigation;
5375      var $nextEl = ref.$nextEl;
5376      var $prevEl = ref.$prevEl;
5377
5378      if ($prevEl && $prevEl.length > 0) {
5379        if (swiper.isBeginning) {
5380          $prevEl.addClass(params.disabledClass);
5381        } else {
5382          $prevEl.removeClass(params.disabledClass);
5383        }
5384        $prevEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
5385      }
5386      if ($nextEl && $nextEl.length > 0) {
5387        if (swiper.isEnd) {
5388          $nextEl.addClass(params.disabledClass);
5389        } else {
5390          $nextEl.removeClass(params.disabledClass);
5391        }
5392        $nextEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
5393      }
5394    },
5395    onPrevClick: function onPrevClick(e) {
5396      var swiper = this;
5397      e.preventDefault();
5398      if (swiper.isBeginning && !swiper.params.loop) { return; }
5399      swiper.slidePrev();
5400    },
5401    onNextClick: function onNextClick(e) {
5402      var swiper = this;
5403      e.preventDefault();
5404      if (swiper.isEnd && !swiper.params.loop) { return; }
5405      swiper.slideNext();
5406    },
5407    init: function init() {
5408      var swiper = this;
5409      var params = swiper.params.navigation;
5410      if (!(params.nextEl || params.prevEl)) { return; }
5411
5412      var $nextEl;
5413      var $prevEl;
5414      if (params.nextEl) {
5415        $nextEl = $(params.nextEl);
5416        if (
5417          swiper.params.uniqueNavElements
5418          && typeof params.nextEl === 'string'
5419          && $nextEl.length > 1
5420          && swiper.$el.find(params.nextEl).length === 1
5421        ) {
5422          $nextEl = swiper.$el.find(params.nextEl);
5423        }
5424      }
5425      if (params.prevEl) {
5426        $prevEl = $(params.prevEl);
5427        if (
5428          swiper.params.uniqueNavElements
5429          && typeof params.prevEl === 'string'
5430          && $prevEl.length > 1
5431          && swiper.$el.find(params.prevEl).length === 1
5432        ) {
5433          $prevEl = swiper.$el.find(params.prevEl);
5434        }
5435      }
5436
5437      if ($nextEl && $nextEl.length > 0) {
5438        $nextEl.on('click', swiper.navigation.onNextClick);
5439      }
5440      if ($prevEl && $prevEl.length > 0) {
5441        $prevEl.on('click', swiper.navigation.onPrevClick);
5442      }
5443
5444      Utils.extend(swiper.navigation, {
5445        $nextEl: $nextEl,
5446        nextEl: $nextEl && $nextEl[0],
5447        $prevEl: $prevEl,
5448        prevEl: $prevEl && $prevEl[0],
5449      });
5450    },
5451    destroy: function destroy() {
5452      var swiper = this;
5453      var ref = swiper.navigation;
5454      var $nextEl = ref.$nextEl;
5455      var $prevEl = ref.$prevEl;
5456      if ($nextEl && $nextEl.length) {
5457        $nextEl.off('click', swiper.navigation.onNextClick);
5458        $nextEl.removeClass(swiper.params.navigation.disabledClass);
5459      }
5460      if ($prevEl && $prevEl.length) {
5461        $prevEl.off('click', swiper.navigation.onPrevClick);
5462        $prevEl.removeClass(swiper.params.navigation.disabledClass);
5463      }
5464    },
5465  };
5466
5467  var Navigation$1 = {
5468    name: 'navigation',
5469    params: {
5470      navigation: {
5471        nextEl: null,
5472        prevEl: null,
5473
5474        hideOnClick: false,
5475        disabledClass: 'swiper-button-disabled',
5476        hiddenClass: 'swiper-button-hidden',
5477        lockClass: 'swiper-button-lock',
5478      },
5479    },
5480    create: function create() {
5481      var swiper = this;
5482      Utils.extend(swiper, {
5483        navigation: {
5484          init: Navigation.init.bind(swiper),
5485          update: Navigation.update.bind(swiper),
5486          destroy: Navigation.destroy.bind(swiper),
5487          onNextClick: Navigation.onNextClick.bind(swiper),
5488          onPrevClick: Navigation.onPrevClick.bind(swiper),
5489        },
5490      });
5491    },
5492    on: {
5493      init: function init() {
5494        var swiper = this;
5495        swiper.navigation.init();
5496        swiper.navigation.update();
5497      },
5498      toEdge: function toEdge() {
5499        var swiper = this;
5500        swiper.navigation.update();
5501      },
5502      fromEdge: function fromEdge() {
5503        var swiper = this;
5504        swiper.navigation.update();
5505      },
5506      destroy: function destroy() {
5507        var swiper = this;
5508        swiper.navigation.destroy();
5509      },
5510      click: function click(e) {
5511        var swiper = this;
5512        var ref = swiper.navigation;
5513        var $nextEl = ref.$nextEl;
5514        var $prevEl = ref.$prevEl;
5515        if (
5516          swiper.params.navigation.hideOnClick
5517          && !$(e.target).is($prevEl)
5518          && !$(e.target).is($nextEl)
5519        ) {
5520          var isHidden;
5521          if ($nextEl) {
5522            isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass);
5523          } else if ($prevEl) {
5524            isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass);
5525          }
5526          if (isHidden === true) {
5527            swiper.emit('navigationShow', swiper);
5528          } else {
5529            swiper.emit('navigationHide', swiper);
5530          }
5531          if ($nextEl) {
5532            $nextEl.toggleClass(swiper.params.navigation.hiddenClass);
5533          }
5534          if ($prevEl) {
5535            $prevEl.toggleClass(swiper.params.navigation.hiddenClass);
5536          }
5537        }
5538      },
5539    },
5540  };
5541
5542  var Pagination = {
5543    update: function update() {
5544      // Render || Update Pagination bullets/items
5545      var swiper = this;
5546      var rtl = swiper.rtl;
5547      var params = swiper.params.pagination;
5548      if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }
5549      var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;
5550      var $el = swiper.pagination.$el;
5551      // Current/Total
5552      var current;
5553      var total = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
5554      if (swiper.params.loop) {
5555        current = Math.ceil((swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup);
5556        if (current > slidesLength - 1 - (swiper.loopedSlides * 2)) {
5557          current -= (slidesLength - (swiper.loopedSlides * 2));
5558        }
5559        if (current > total - 1) { current -= total; }
5560        if (current < 0 && swiper.params.paginationType !== 'bullets') { current = total + current; }
5561      } else if (typeof swiper.snapIndex !== 'undefined') {
5562        current = swiper.snapIndex;
5563      } else {
5564        current = swiper.activeIndex || 0;
5565      }
5566      // Types
5567      if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) {
5568        var bullets = swiper.pagination.bullets;
5569        var firstIndex;
5570        var lastIndex;
5571        var midIndex;
5572        if (params.dynamicBullets) {
5573          swiper.pagination.bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);
5574          $el.css(swiper.isHorizontal() ? 'width' : 'height', ((swiper.pagination.bulletSize * (params.dynamicMainBullets + 4)) + "px"));
5575          if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) {
5576            swiper.pagination.dynamicBulletIndex += (current - swiper.previousIndex);
5577            if (swiper.pagination.dynamicBulletIndex > (params.dynamicMainBullets - 1)) {
5578              swiper.pagination.dynamicBulletIndex = params.dynamicMainBullets - 1;
5579            } else if (swiper.pagination.dynamicBulletIndex < 0) {
5580              swiper.pagination.dynamicBulletIndex = 0;
5581            }
5582          }
5583          firstIndex = current - swiper.pagination.dynamicBulletIndex;
5584          lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);
5585          midIndex = (lastIndex + firstIndex) / 2;
5586        }
5587        bullets.removeClass(((params.bulletActiveClass) + " " + (params.bulletActiveClass) + "-next " + (params.bulletActiveClass) + "-next-next " + (params.bulletActiveClass) + "-prev " + (params.bulletActiveClass) + "-prev-prev " + (params.bulletActiveClass) + "-main"));
5588        if ($el.length > 1) {
5589          bullets.each(function (index, bullet) {
5590            var $bullet = $(bullet);
5591            var bulletIndex = $bullet.index();
5592            if (bulletIndex === current) {
5593              $bullet.addClass(params.bulletActiveClass);
5594            }
5595            if (params.dynamicBullets) {
5596              if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {
5597                $bullet.addClass(((params.bulletActiveClass) + "-main"));
5598              }
5599              if (bulletIndex === firstIndex) {
5600                $bullet
5601                  .prev()
5602                  .addClass(((params.bulletActiveClass) + "-prev"))
5603                  .prev()
5604                  .addClass(((params.bulletActiveClass) + "-prev-prev"));
5605              }
5606              if (bulletIndex === lastIndex) {
5607                $bullet
5608                  .next()
5609                  .addClass(((params.bulletActiveClass) + "-next"))
5610                  .next()
5611                  .addClass(((params.bulletActiveClass) + "-next-next"));
5612              }
5613            }
5614          });
5615        } else {
5616          var $bullet = bullets.eq(current);
5617          var bulletIndex = $bullet.index();
5618          $bullet.addClass(params.bulletActiveClass);
5619          if (params.dynamicBullets) {
5620            var $firstDisplayedBullet = bullets.eq(firstIndex);
5621            var $lastDisplayedBullet = bullets.eq(lastIndex);
5622            for (var i = firstIndex; i <= lastIndex; i += 1) {
5623              bullets.eq(i).addClass(((params.bulletActiveClass) + "-main"));
5624            }
5625            if (swiper.params.loop) {
5626              if (bulletIndex >= bullets.length - params.dynamicMainBullets) {
5627                for (var i$1 = params.dynamicMainBullets; i$1 >= 0; i$1 -= 1) {
5628                  bullets.eq(bullets.length - i$1).addClass(((params.bulletActiveClass) + "-main"));
5629                }
5630                bullets.eq(bullets.length - params.dynamicMainBullets - 1).addClass(((params.bulletActiveClass) + "-prev"));
5631              } else {
5632                $firstDisplayedBullet
5633                  .prev()
5634                  .addClass(((params.bulletActiveClass) + "-prev"))
5635                  .prev()
5636                  .addClass(((params.bulletActiveClass) + "-prev-prev"));
5637                $lastDisplayedBullet
5638                  .next()
5639                  .addClass(((params.bulletActiveClass) + "-next"))
5640                  .next()
5641                  .addClass(((params.bulletActiveClass) + "-next-next"));
5642              }
5643            } else {
5644              $firstDisplayedBullet
5645                .prev()
5646                .addClass(((params.bulletActiveClass) + "-prev"))
5647                .prev()
5648                .addClass(((params.bulletActiveClass) + "-prev-prev"));
5649              $lastDisplayedBullet
5650                .next()
5651                .addClass(((params.bulletActiveClass) + "-next"))
5652                .next()
5653                .addClass(((params.bulletActiveClass) + "-next-next"));
5654            }
5655          }
5656        }
5657        if (params.dynamicBullets) {
5658          var dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);
5659          var bulletsOffset = (((swiper.pagination.bulletSize * dynamicBulletsLength) - (swiper.pagination.bulletSize)) / 2) - (midIndex * swiper.pagination.bulletSize);
5660          var offsetProp = rtl ? 'right' : 'left';
5661          bullets.css(swiper.isHorizontal() ? offsetProp : 'top', (bulletsOffset + "px"));
5662        }
5663      }
5664      if (params.type === 'fraction') {
5665        $el.find(("." + (params.currentClass))).text(params.formatFractionCurrent(current + 1));
5666        $el.find(("." + (params.totalClass))).text(params.formatFractionTotal(total));
5667      }
5668      if (params.type === 'progressbar') {
5669        var progressbarDirection;
5670        if (params.progressbarOpposite) {
5671          progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';
5672        } else {
5673          progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';
5674        }
5675        var scale = (current + 1) / total;
5676        var scaleX = 1;
5677        var scaleY = 1;
5678        if (progressbarDirection === 'horizontal') {
5679          scaleX = scale;
5680        } else {
5681          scaleY = scale;
5682        }
5683        $el.find(("." + (params.progressbarFillClass))).transform(("translate3d(0,
56830,0) scaleX(" + scaleX + ") scaleY(" + scaleY + ")")).transition(swiper.params.speed);
5684      }
5685      if (params.type === 'custom' && params.renderCustom) {
5686        $el.html(params.renderCustom(swiper, current + 1, total));
5687        swiper.emit('paginationRender', swiper, $el[0]);
5688      } else {
5689        swiper.emit('paginationUpdate', swiper, $el[0]);
5690      }
5691      $el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
5692    },
5693    render: function render() {
5694      // Render Container
5695      var swiper = this;
5696      var params = swiper.params.pagination;
5697      if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }
5698      var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;
5699
5700      var $el = swiper.pagination.$el;
5701      var paginationHTML = '';
5702      if (params.type === 'bullets') {
5703        var numberOfBullets = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
5704        for (var i = 0; i < numberOfBullets; i += 1) {
5705          if (params.renderBullet) {
5706            paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);
5707          } else {
5708            paginationHTML += "<" + (params.bulletElement) + " class=\"" + (params.bulletClass) + "\"></" + (params.bulletElement) + ">";
5709          }
5710        }
5711        $el.html(paginationHTML);
5712        swiper.pagination.bullets = $el.find(("." + (params.bulletClass)));
5713      }
5714      if (params.type === 'fraction') {
5715        if (params.renderFraction) {
5716          paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);
5717        } else {
5718          paginationHTML = "<span class=\"" + (params.currentClass) + "\"></span>"
5719          + ' / '
5720          + "<span class=\"" + (params.totalClass) + "\"></span>";
5721        }
5722        $el.html(paginationHTML);
5723      }
5724      if (params.type === 'progressbar') {
5725        if (params.renderProgressbar) {
5726          paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);
5727        } else {
5728          paginationHTML = "<span class=\"" + (params.progressbarFillClass) + "\"></span>";
5729        }
5730        $el.html(paginationHTML);
5731      }
5732      if (params.type !== 'custom') {
5733        swiper.emit('paginationRender', swiper.pagination.$el[0]);
5734      }
5735    },
5736    init: function init() {
5737      var swiper = this;
5738      var params = swiper.params.pagination;
5739      if (!params.el) { return; }
5740
5741      var $el = $(params.el);
5742      if ($el.length === 0) { return; }
5743
5744      if (
5745        swiper.params.uniqueNavElements
5746        && typeof params.el === 'string'
5747        && $el.length > 1
5748        && swiper.$el.find(params.el).length === 1
5749      ) {
5750        $el = swiper.$el.find(params.el);
5751      }
5752
5753      if (params.type === 'bullets' && params.clickable) {
5754        $el.addClass(params.clickableClass);
5755      }
5756
5757      $el.addClass(params.modifierClass + params.type);
5758
5759      if (params.type === 'bullets' && params.dynamicBullets) {
5760        $el.addClass(("" + (params.modifierClass) + (params.type) + "-dynamic"));
5761        swiper.pagination.dynamicBulletIndex = 0;
5762        if (params.dynamicMainBullets < 1) {
5763          params.dynamicMainBullets = 1;
5764        }
5765      }
5766      if (params.type === 'progressbar' && params.progressbarOpposite) {
5767        $el.addClass(params.progressbarOppositeClass);
5768      }
5769
5770      if (params.clickable) {
5771        $el.on('click', ("." + (params.bulletClass)), function onClick(e) {
5772          e.preventDefault();
5773          var index = $(this).index() * swiper.params.slidesPerGroup;
5774          if (swiper.params.loop) { index += swiper.loopedSlides; }
5775          swiper.slideTo(index);
5776        });
5777      }
5778
5779      Utils.extend(swiper.pagination, {
5780        $el: $el,
5781        el: $el[0],
5782      });
5783    },
5784    destroy: function destroy() {
5785      var swiper = this;
5786      var params = swiper.params.pagination;
5787      if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }
5788      var $el = swiper.pagination.$el;
5789
5790      $el.removeClass(params.hiddenClass);
5791      $el.removeClass(params.modifierClass + params.type);
5792      if (swiper.pagination.bullets) { swiper.pagination.bullets.removeClass(params.bulletActiveClass); }
5793      if (params.clickable) {
5794        $el.off('click', ("." + (params.bulletClass)));
5795      }
5796    },
5797  };
5798
5799  var Pagination$1 = {
5800    name: 'pagination',
5801    params: {
5802      pagination: {
5803        el: null,
5804        bulletElement: 'span',
5805        clickable: false,
5806        hideOnClick: false,
5807        renderBullet: null,
5808        renderProgressbar: null,
5809        renderFraction: null,
5810        renderCustom: null,
5811        progressbarOpposite: false,
5812        type: 'bullets', // 'bullets' or 'progressbar' or 'fraction' or 'custom'
5813        dynamicBullets: false,
5814        dynamicMainBullets: 1,
5815        formatFractionCurrent: function (number) { return number; },
5816        formatFractionTotal: function (number) { return number; },
5817        bulletClass: 'swiper-pagination-bullet',
5818        bulletActiveClass: 'swiper-pagination-bullet-active',
5819        modifierClass: 'swiper-pagination-', // NEW
5820        currentClass: 'swiper-pagination-current',
5821        totalClass: 'swiper-pagination-total',
5822        hiddenClass: 'swiper-pagination-hidden',
5823        progressbarFillClass: 'swiper-pagination-progressbar-fill',
5824        progressbarOppositeClass: 'swiper-pagination-progressbar-opposite',
5825        clickableClass: 'swiper-pagination-clickable', // NEW
5826        lockClass: 'swiper-pagination-lock',
5827      },
5828    },
5829    create: function create() {
5830      var swiper = this;
5831      Utils.extend(swiper, {
5832        pagination: {
5833          init: Pagination.init.bind(swiper),
5834          render: Pagination.render.bind(swiper),
5835          update: Pagination.update.bind(swiper),
5836          destroy: Pagination.destroy.bind(swiper),
5837          dynamicBulletIndex: 0,
5838        },
5839      });
5840    },
5841    on: {
5842      init: function init() {
5843        var swiper = this;
5844        swiper.pagination.init();
5845        swiper.pagination.render();
5846        swiper.pagination.update();
5847      },
5848      activeIndexChange: function activeIndexChange() {
5849        var swiper = this;
5850        if (swiper.params.loop) {
5851          swiper.pagination.update();
5852        } else if (typeof swiper.snapIndex === 'undefined') {
5853          swiper.pagination.update();
5854        }
5855      },
5856      snapIndexChange: function snapIndexChange() {
5857        var swiper = this;
5858        if (!swiper.params.loop) {
5859          swiper.pagination.update();
5860        }
5861      },
5862      slidesLengthChange: function slidesLengthChange() {
5863        var swiper = this;
5864        if (swiper.params.loop) {
5865          swiper.pagination.render();
5866          swiper.pagination.update();
5867        }
5868      },
5869      snapGridLengthChange: function snapGridLengthChange() {
5870        var swiper = this;
5871        if (!swiper.params.loop) {
5872          swiper.pagination.render();
5873          swiper.pagination.update();
5874        }
5875      },
5876      destroy: function destroy() {
5877        var swiper = this;
5878        swiper.pagination.destroy();
5879      },
5880      click: function click(e) {
5881        var swiper = this;
5882        if (
5883          swiper.params.pagination.el
5884          && swiper.params.pagination.hideOnClick
5885          && swiper.pagination.$el.length > 0
5886          && !$(e.target).hasClass(swiper.params.pagination.bulletClass)
5887        ) {
5888          var isHidden = swiper.pagination.$el.hasClass(swiper.params.pagination.hiddenClass);
5889          if (isHidden === true) {
5890            swiper.emit('paginationShow', swiper);
5891          } else {
5892            swiper.emit('paginationHide', swiper);
5893          }
5894          swiper.pagination.$el.toggleClass(swiper.params.pagination.hiddenClass);
5895        }
5896      },
5897    },
5898  };
5899
5900  var Scrollbar = {
5901    setTranslate: function setTranslate() {
5902      var swiper = this;
5903      if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }
5904      var scrollbar = swiper.scrollbar;
5905      var rtl = swiper.rtlTranslate;
5906      var progress = swiper.progress;
5907      var dragSize = scrollbar.dragSize;
5908      var trackSize = scrollbar.trackSize;
5909      var $dragEl = scrollbar.$dragEl;
5910      var $el = scrollbar.$el;
5911      var params = swiper.params.scrollbar;
5912
5913      var newSize = dragSize;
5914      var newPos = (trackSize - dragSize) * progress;
5915      if (rtl) {
5916        newPos = -newPos;
5917        if (newPos > 0) {
5918          newSize = dragSize - newPos;
5919          newPos = 0;
5920        } else if (-newPos + dragSize > trackSize) {
5921          newSize = trackSize + newPos;
5922        }
5923      } else if (newPos < 0) {
5924        newSize = dragSize + newPos;
5925        newPos = 0;
5926      } else if (newPos + dragSize > trackSize) {
5927        newSize = trackSize - newPos;
5928      }
5929      if (swiper.isHorizontal()) {
5930        $dragEl.transform(("translate3d(" + newPos + "px, 0, 0)"));
5931        $dragEl[0].style.width = newSize + "px";
5932      } else {
5933        $dragEl.transform(("translate3d(0px, " + newPos + "px, 0)"));
5934        $dragEl[0].style.height = newSize + "px";
5935      }
5936      if (params.hide) {
5937        clearTimeout(swiper.scrollbar.timeout);
5938        $el[0].style.opacity = 1;
5939        swiper.scrollbar.timeout = setTimeout(function () {
5940          $el[0].style.opacity = 0;
5941          $el.transition(400);
5942        }, 1000);
5943      }
5944    },
5945    setTransition: function setTransition(duration) {
5946      var swiper = this;
5947      if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }
5948      swiper.scrollbar.$dragEl.transition(duration);
5949    },
5950    updateSize: function updateSize() {
5951      var swiper = this;
5952      if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }
5953
5954      var scrollbar = swiper.scrollbar;
5955      var $dragEl = scrollbar.$dragEl;
5956      var $el = scrollbar.$el;
5957
5958      $dragEl[0].style.width = '';
5959      $dragEl[0].style.height = '';
5960      var trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight;
5961
5962      var divider = swiper.size / swiper.virtualSize;
5963      var moveDivider = divider * (trackSize / swiper.size);
5964      var dragSize;
5965      if (swiper.params.scrollbar.dragSize === 'auto') {
5966        dragSize = trackSize * divider;
5967      } else {
5968        dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);
5969      }
5970
5971      if (swiper.isHorizontal()) {
5972        $dragEl[0].style.width = dragSize + "px";
5973      } else {
5974        $dragEl[0].style.height = dragSize + "px";
5975      }
5976
5977      if (divider >= 1) {
5978        $el[0].style.display = 'none';
5979      } else {
5980        $el[0].style.display = '';
5981      }
5982      if (swiper.params.scrollbar.hide) {
5983        $el[0].style.opacity = 0;
5984      }
5985      Utils.extend(scrollbar, {
5986        trackSize: trackSize,
5987        divider: divider,
5988        moveDivider: moveDivider,
5989        dragSize: dragSize,
5990      });
5991      scrollbar.$el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](swiper.params.scrollbar.lockClass);
5992    },
5993    getPointerPosition: function getPointerPosition(e) {
5994      var swiper = this;
5995      if (swiper.isHorizontal()) {
5996        return ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].clientX : e.clientX);
5997      }
5998      return ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].clientY : e.clientY);
5999    },
6000    setDragPosition: function setDragPosition(e) {
6001      var swiper = this;
6002      var scrollbar = swiper.scrollbar;
6003      var rtl = swiper.rtlTranslate;
6004      var $el = scrollbar.$el;
6005      var dragSize = scrollbar.dragSize;
6006      var trackSize = scrollbar.trackSize;
6007      var dragStartPos = scrollbar.dragStartPos;
6008
6009      var positionRatio;
6010      positionRatio = ((scrollbar.getPointerPosition(e)) - $el.offset()[swiper.isHorizontal() ? 'left' : 'top']
6011        - (dragStartPos !== null ? dragStartPos : dragSize / 2)) / (trackSize - dragSize);
6012      positionRatio = Math.max(Math.min(positionRatio, 1), 0);
6013      if (rtl) {
6014        positionRatio = 1 - positionRatio;
6015      }
6016
6017      var position = swiper.minTranslate() + ((swiper.maxTranslate() - swiper.minTranslate()) * positionRatio);
6018
6019      swiper.updateProgress(position);
6020      swiper.setTranslate(position);
6021      swiper.updateActiveIndex();
6022      swiper.updateSlidesClasses();
6023    },
6024    onDragStart: function onDragStart(e) {
6025      var swiper = this;
6026      var params = swiper.params.scrollbar;
6027      var scrollbar = swiper.scrollbar;
6028      var $wrapperEl = swiper.$wrapperEl;
6029      var $el = scrollbar.$el;
6030      var $dragEl = scrollbar.$dragEl;
6031      swiper.scrollbar.isTouched = true;
6032      swiper.scrollbar.dragStartPos = (e.target === $dragEl[0] || e.target === $dragEl)
6033        ? scrollbar.getPointerPosition(e) - e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top'] : null;
6034      e.preventDefault();
6035      e.stopPropagation();
6036
6037      $wrapperEl.transition(100);
6038      $dragEl.transition(100);
6039      scrollbar.setDragPosition(e);
6040
6041      clearTimeout(swiper.scrollbar.dragTimeout);
6042
6043      $el.transition(0);
6044      if (params.hide) {
6045        $el.css('opacity', 1);
6046      }
6047      if (swiper.params.cssMode) {
6048        swiper.$wrapperEl.css('scroll-snap-type', 'none');
6049      }
6050      swiper.emit('scrollbarDragStart', e);
6051    },
6052    onDragMove: function onDragMove(e) {
6053      var swiper = this;
6054      var scrollbar = swiper.scrollbar;
6055      var $wrapperEl = swiper.$wrapperEl;
6056      var $el = scrollbar.$el;
6057      var $dragEl = scrollbar.$dragEl;
6058
6059      if (!swiper.scrollbar.isTouched) { return; }
6060      if (e.preventDefault) { e.preventDefault(); }
6061      else { e.returnValue = false; }
6062      scrollbar.setDragPosition(e);
6063      $wrapperEl.transition(0);
6064      $el.transition(0);
6065      $dragEl.transition(0);
6066      swiper.emit('scrollbarDragMove', e);
6067    },
6068    onDragEnd: function onDragEnd(e) {
6069      var swiper = this;
6070
6071      var params = swiper.params.scrollbar;
6072      var scrollbar = swiper.scrollbar;
6073      var $wrapperEl = swiper.$wrapperEl;
6074      var $el = scrollbar.$el;
6075
6076      if (!swiper.scrollbar.isTouched) { return; }
6077      swiper.scrollbar.isTouched = false;
6078      if (swiper.params.cssMode) {
6079        swiper.$wrapperEl.css('scroll-snap-type', '');
6080        $wrapperEl.transition('');
6081      }
6082      if (params.hide) {
6083        clearTimeout(swiper.scrollbar.dragTimeout);
6084        swiper.scrollbar.dragTimeout = Utils.nextTick(function () {
6085          $el.css('opacity', 0);
6086          $el.transition(400);
6087        }, 1000);
6088      }
6089      swiper.emit('scrollbarDragEnd', e);
6090      if (params.snapOnRelease) {
6091        swiper.slideToClosest();
6092      }
6093    },
6094    enableDraggable: function enableDraggable() {
6095      var swiper = this;
6096      if (!swiper.params.scrollbar.el) { return; }
6097      var scrollbar = swiper.scrollbar;
6098      var touchEventsTouch = swiper.touchEventsTouch;
6099      var touchEventsDesktop = swiper.touchEventsDesktop;
6100      var params = swiper.params;
6101      var $el = scrollbar.$el;
6102      var target = $el[0];
6103      var activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false;
6104      var passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
6105      if (!Support.touch) {
6106        target.addEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener);
6107        doc.addEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener);
6108        doc.addEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener);
6109      } else {
6110        target.addEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener);
6111        target.addEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener);
6112        target.addEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener);
6113      }
6114    },
6115    disableDraggable: function disableDraggable() {
6116      var swiper = this;
6117      if (!swiper.params.scrollbar.el) { return; }
6118      var scrollbar = swiper.scrollbar;
6119      var touchEventsTouch = swiper.touchEventsTouch;
6120      var touchEventsDesktop = swiper.touchEventsDesktop;
6121      var params = swiper.params;
6122      var $el = scrollbar.$el;
6123      var target = $el[0];
6124      var activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false;
6125      var passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
6126      if (!Support.touch) {
6127        target.removeEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener);
6128        doc.removeEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener);
6129        doc.removeEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener);
6130      } else {
6131        target.removeEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener);
6132        target.removeEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener);
6133        target.removeEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener);
6134      }
6135    },
6136    init: function init() {
6137      var swiper = this;
6138      if (!swiper.params.scrollbar.el) { return; }
6139      var scrollbar = swiper.scrollbar;
6140      var $swiperEl = swiper.$el;
6141      var params = swiper.params.scrollbar;
6142
6143      var $el = $(params.el);
6144      if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1 && $swiperEl.find(params.el).length === 1) {
6145        $el = $swiperEl.find(params.el);
6146      }
6147
6148      var $dragEl = $el.find(("." + (swiper.params.scrollbar.dragClass)));
6149      if ($dragEl.length === 0) {
6150        $dragEl = $(("<div class=\"" + (swiper.params.scrollbar.dragClass) + "\"></div>"));
6151        $el.append($dragEl);
6152      }
6153
6154      Utils.extend(scrollbar, {
6155        $el: $el,
6156        el: $el[0],
6157        $dragEl: $dragEl,
6158        dragEl: $dragEl[0],
6159      });
6160
6161      if (params.draggable) {
6162        scrollbar.enableDraggable();
6163      }
6164    },
6165    destroy: function destroy() {
6166      var swiper = this;
6167      swiper.scrollbar.disableDraggable();
6168    },
6169  };
6170
6171  var Scrollbar$1 = {
6172    name: 'scrollbar',
6173    params: {
6174      scrollbar: {
6175        el: null,
6176        dragSize: 'auto',
6177        hide: false,
6178        draggable: false,
6179        snapOnRelease: true,
6180        lockClass: 'swiper-scrollbar-lock',
6181        dragClass: 'swiper-scrollbar-drag',
6182      },
6183    },
6184    create: function create() {
6185      var swiper = this;
6186      Utils.extend(swiper, {
6187        scrollbar: {
6188          init: Scrollbar.init.bind(swiper),
6189          destroy: Scrollbar.destroy.bind(swiper),
6190          updateSize: Scrollbar.updateSize.bind(swiper),
6191          setTranslate: Scrollbar.setTranslate.bind(swiper),
6192          setTransition: Scrollbar.setTransition.bind(swiper),
6193          enableDraggable: Scrollbar.enableDraggable.bind(swiper),
6194          disableDraggable: Scrollbar.disableDraggable.bind(swiper),
6195          setDragPosition: Scrollbar.setDragPosition.bind(swiper),
6196          getPointerPosition: Scrollbar.getPointerPosition.bind(swiper),
6197          onDragStart: Scrollbar.onDragStart.bind(swiper),
6198          onDragMove: Scrollbar.onDragMove.bind(swiper),
6199          onDragEnd: Scrollbar.onDragEnd.bind(swiper),
6200          isTouched: false,
6201          timeout: null,
6202          dragTimeout: null,
6203        },
6204      });
6205    },
6206    on: {
6207      init: function init() {
6208        var swiper = this;
6209        swiper.scrollbar.init();
6210        swiper.scrollbar.updateSize();
6211        swiper.scrollbar.setTranslate();
6212      },
6213      update: function update() {
6214        var swiper = this;
6215        swiper.scrollbar.updateSize();
6216      },
6217      resize: function resize() {
6218        var swiper = this;
6219        swiper.scrollbar.updateSize();
6220      },
6221      observerUpdate: function observerUpdate() {
6222        var swiper = this;
6223        swiper.scrollbar.updateSize();
6224      },
6225      setTranslate: function setTranslate() {
6226        var swiper = this;
6227        swiper.scrollbar.setTranslate();
6228      },
6229      setTransition: function setTransition(duration) {
6230        var swiper = this;
6231        swiper.scrollbar.setTransition(duration);
6232      },
6233      destroy: function destroy() {
6234        var swiper = this;
6235        swiper.scrollbar.destroy();
6236      },
6237    },
6238  };
6239
6240  var Parallax = {
6241    setTransform: function setTransform(el, progress) {
6242      var swiper = this;
6243      var rtl = swiper.rtl;
6244
6245      var $el = $(el);
6246      var rtlFactor = rtl ? -1 : 1;
6247
6248      var p = $el.attr('data-swiper-parallax') || '0';
6249      var x = $el.attr('data-swiper-parallax-x');
6250      var y = $el.attr('data-swiper-parallax-y');
6251      var scale = $el.attr('data-swiper-parallax-scale');
6252      var opacity = $el.attr('data-swiper-parallax-opacity');
6253
6254      if (x || y) {
6255        x = x || '0';
6256        y = y || '0';
6257      } else if (swiper.isHorizontal()) {
6258        x = p;
6259        y = '0';
6260      } else {
6261        y = p;
6262        x = '0';
6263      }
6264
6265      if ((x).indexOf('%') >= 0) {
6266        x = (parseInt(x, 10) * progress * rtlFactor) + "%";
6267      } else {
6268        x = (x * progress * rtlFactor) + "px";
6269      }
6270      if ((y).indexOf('%') >= 0) {
6271        y = (parseInt(y, 10) * progress) + "%";
6272      } else {
6273        y = (y * progress) + "px";
6274      }
6275
6276      if (typeof opacity !== 'undefined' && opacity !== null) {
6277        var currentOpacity = opacity - ((opacity - 1) * (1 - Math.abs(progress)));
6278        $el[0].style.opacity = currentOpacity;
6279      }
6280      if (typeof scale === 'undefined' || scale === null) {
6281        $el.transform(("translate3d(" + x + ", " + y + ", 0px)"));
6282      } else {
6283        var currentScale = scale - ((scale - 1) * (1 - Math.abs(progress)));
6284        $el.transform(("translate3d(" + x + ", " + y + ", 0px) scale(" + currentScale + ")"));
6285      }
6286    },
6287    setTranslate: function setTranslate() {
6288      var swiper = this;
6289      var $el = swiper.$el;
6290      var slides = swiper.slides;
6291      var progress = swiper.progress;
6292      var snapGrid = swiper.snapGrid;
6293      $el.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]')
6294        .each(function (index, el) {
6295          swiper.parallax.setTransform(el, progress);
6296        });
6297      slides.each(function (slideIndex, slideEl) {
6298        var slideProgress = slideEl.progress;
6299        if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {
6300          slideProgress += Math.ceil(slideIndex / 2) - (progress * (snapGrid.length - 1));
6301        }
6302        slideProgress = Math.min(Math.max(slideProgress, -1), 1);
6303        $(slideEl).find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]')
6304          .each(function (index, el) {
6305            swiper.parallax.setTransform(el, slideProgress);
6306          });
6307      });
6308    },
6309    setTransition: function setTransition(duration) {
6310      if ( duration === void 0 ) duration = this.params.speed;
6311
6312      var swiper = this;
6313      var $el = swiper.$el;
6314      $el.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]')
6315        .each(function (index, parallaxEl) {
6316          var $parallaxEl = $(parallaxEl);
6317          var parallaxDuration = parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration;
6318          if (duration === 0) { parallaxDuration = 0; }
6319          $parallaxEl.transition(parallaxDuration);
6320        });
6321    },
6322  };
6323
6324  var Parallax$1 = {
6325    name: 'parallax',
6326    params: {
6327      parallax: {
6328        enabled: false,
6329      },
6330    },
6331    create: function create() {
6332      var swiper = this;
6333      Utils.extend(swiper, {
6334        parallax: {
6335          setTransform: Parallax.setTransform.bind(swiper),
6336          setTranslate: Parallax.setTranslate.bind(swiper),
6337          setTransition: Parallax.setTransition.bind(swiper),
6338        },
6339      });
6340    },
6341    on: {
6342      beforeInit: function beforeInit() {
6343        var swiper = this;
6344        if (!swiper.params.parallax.enabled) { return; }
6345        swiper.params.watchSlidesProgress = true;
6346        swiper.originalParams.watchSlidesProgress = true;
6347      },
6348      init: function init() {
6349        var swiper = this;
6350        if (!swiper.params.parallax.enabled) { return; }
6351        swiper.parallax.setTranslate();
6352      },
6353      setTranslate: function setTranslate() {
6354        var swiper = this;
6355        if (!swiper.params.parallax.enabled) { return; }
6356        swiper.parallax.setTranslate();
6357      },
6358      setTransition: function setTransition(duration) {
6359        var swiper = this;
6360        if (!swiper.params.parallax.enabled) { return; }
6361        swiper.parallax.setTransition(duration);
6362      },
6363    },
6364  };
6365
6366  var Zoom = {
6367    // Calc Scale From Multi-touches
6368    getDistanceBetweenTouches: function getDistanceBetweenTouches(e) {
6369      if (e.targetTouches.length < 2) { return 1; }
6370      var x1 = e.targetTouches[0].pageX;
6371      var y1 = e.targetTouches[0].pageY;
6372      var x2 = e.targetTouches[1].pageX;
6373      var y2 = e.targetTouches[1].pageY;
6374      var distance = Math.sqrt((Math.pow( (x2 - x1), 2 )) + (Math.pow( (y2 - y1), 2 )));
6375      return distance;
6376    },
6377    // Events
6378    onGestureStart: function onGestureStart(e) {
6379      var swiper = this;
6380      var params = swiper.params.zoom;
6381      var zoom = swiper.zoom;
6382      var gesture = zoom.gesture;
6383      zoom.fakeGestureTouched = false;
6384      zoom.fakeGestureMoved = false;
6385      if (!Support.gestures) {
6386        if (e.type !== 'touchstart' || (e.type === 'touchstart' && e.targetTouches.length < 2)) {
6387          return;
6388        }
6389        zoom.fakeGestureTouched = true;
6390        gesture.scaleStart = Zoom.getDistanceBetweenTouches(e);
6391      }
6392      if (!gesture.$slideEl || !gesture.$slideEl.length) {
6393        gesture.$slideEl = $(e.target).closest(("." + (swiper.params.slideClass)));
6394        if (gesture.$slideEl.length === 0) { gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); }
6395        gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas, picture, .swiper-zoom-target');
6396        gesture.$imageWrapEl = gesture.$imageEl.parent(("." + (params.containerClass)));
6397        gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
6398        if (gesture.$imageWrapEl.length === 0) {
6399          gesture.$imageEl = undefined;
6400          return;
6401        }
6402      }
6403      gesture.$imageEl.transition(0);
6404      swiper.zoom.isScaling = true;
6405    },
6406    onGestureChange: function onGestureChange(e) {
6407      var swiper = this;
6408      var params = swiper.params.zoom;
6409      var zoom = swiper.zoom;
6410      var gesture = zoom.gesture;
6411      if (!Support.gestures) {
6412        if (e.type !== 'touchmove' || (e.type === 'touchmove' && e.targetTouches.length < 2)) {
6413          return;
6414        }
6415        zoom.fakeGestureMoved = true;
6416        gesture.scaleMove = Zoom.getDistanceBetweenTouches(e);
6417      }
6418      if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
6419      if (Support.gestures) {
6420        zoom.scale = e.scale * zoom.currentScale;
6421      } else {
6422        zoom.scale = (gesture.scaleMove / gesture.scaleStart) * zoom.currentScale;
6423      }
6424      if (zoom.scale > gesture.maxRatio) {
6425        zoom.scale = (gesture.maxRatio - 1) + (Math.pow( ((zoom.scale - gesture.maxRatio) + 1), 0.5 ));
6426      }
6427      if (zoom.scale < params.minRatio) {
6428        zoom.scale = (params.minRatio + 1) - (Math.pow( ((params.minRatio - zoom.scale) + 1), 0.5 ));
6429      }
6430      gesture.$imageEl.transform(("translate3d(0,0,0) scale(" + (zoom.scale) + ")"));
6431    },
6432    onGestureEnd: function onGestureEnd(e) {
6433      var swiper = this;
6434      var params = swiper.params.zoom;
6435      var zoom = swiper.zoom;
6436      var gesture = zoom.gesture;
6437      if (!Support.gestures) {
6438        if (!zoom.fakeGestureTouched || !zoom.fakeGestureMoved) {
6439          return;
6440        }
6441        if (e.type !== 'touchend' || (e.type === 'touchend' && e.changedTouches.length < 2 && !Device.android)) {
6442          return;
6443        }
6444        zoom.fakeGestureTouched = false;
6445        zoom.fakeGestureMoved = false;
6446      }
6447      if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
6448      zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);
6449      gesture.$imageEl.transition(swiper.params.speed).transform(("translate3d(0,
64490,0) scale(" + (zoom.scale) + ")"));
6450      zoom.currentScale = zoom.scale;
6451      zoom.isScaling = false;
6452      if (zoom.scale === 1) { gesture.$slideEl = undefined; }
6453    },
6454    onTouchStart: function onTouchStart(e) {
6455      var swiper = this;
6456      var zoom = swiper.zoom;
6457      var gesture = zoom.gesture;
6458      var image = zoom.image;
6459      if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
6460      if (image.isTouched) { return; }
6461      if (Device.android) { e.preventDefault(); }
6462      image.isTouched = true;
6463      image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
6464      image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
6465    },
6466    onTouchMove: function onTouchMove(e) {
6467      var swiper = this;
6468      var zoom = swiper.zoom;
6469      var gesture = zoom.gesture;
6470      var image = zoom.image;
6471      var velocity = zoom.velocity;
6472      if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
6473      swiper.allowClick = false;
6474      if (!image.isTouched || !gesture.$slideEl) { return; }
6475
6476      if (!image.isMoved) {
6477        image.width = gesture.$imageEl[0].offsetWidth;
6478        image.height = gesture.$imageEl[0].offsetHeight;
6479        image.startX = Utils.getTranslate(gesture.$imageWrapEl[0], 'x') || 0;
6480        image.startY = Utils.getTranslate(gesture.$imageWrapEl[0], 'y') || 0;
6481        gesture.slideWidth = gesture.$slideEl[0].offsetWidth;
6482        gesture.slideHeight = gesture.$slideEl[0].offsetHeight;
6483        gesture.$imageWrapEl.transition(0);
6484        if (swiper.rtl) {
6485          image.startX = -image.startX;
6486          image.startY = -image.startY;
6487        }
6488      }
6489      // Define if we need image drag
6490      var scaledWidth = image.width * zoom.scale;
6491      var scaledHeight = image.height * zoom.scale;
6492
6493      if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) { return; }
6494
6495      image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0);
6496      image.maxX = -image.minX;
6497      image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0);
6498      image.maxY = -image.minY;
6499
6500      image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
6501      image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
6502
6503      if (!image.isMoved && !zoom.isScaling) {
6504        if (
6505          swiper.isHorizontal()
6506          && (
6507            (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x)
6508            || (Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x)
6509          )
6510        ) {
6511          image.isTouched = false;
6512          return;
6513        } if (
6514          !swiper.isHorizontal()
6515          && (
6516            (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y)
6517            || (Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y)
6518          )
6519        ) {
6520          image.isTouched = false;
6521          return;
6522        }
6523      }
6524      e.preventDefault();
6525      e.stopPropagation();
6526
6527      image.isMoved = true;
6528      image.currentX = (image.touchesCurrent.x - image.touchesStart.x) + image.startX;
6529      image.currentY = (image.touchesCurrent.y - image.touchesStart.y) + image.startY;
6530
6531      if (image.currentX < image.minX) {
6532        image.currentX = (image.minX + 1) - (Math.pow( ((image.minX - image.currentX) + 1), 0.8 ));
6533      }
6534      if (image.currentX > image.maxX) {
6535        image.currentX = (image.maxX - 1) + (Math.pow( ((image.currentX - image.maxX) + 1), 0.8 ));
6536      }
6537
6538      if (image.currentY < image.minY) {
6539        image.currentY = (image.minY + 1) - (Math.pow( ((image.minY - image.currentY) + 1), 0.8 ));
6540      }
6541      if (image.currentY > image.maxY) {
6542        image.currentY = (image.maxY - 1) + (Math.pow( ((image.currentY - image.maxY) + 1), 0.8 ));
6543      }
6544
6545      // Velocity
6546      if (!velocity.prevPositionX) { velocity.prevPositionX = image.touchesCurrent.x; }
6547      if (!velocity.prevPositionY) { velocity.prevPositionY = image.touchesCurrent.y; }
6548      if (!velocity.prevTime) { velocity.prevTime = Date.now(); }
6549      velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;
6550      velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;
6551      if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) { velocity.x = 0; }
6552      if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) { velocity.y = 0; }
6553      velocity.prevPositionX = image.touchesCurrent.x;
6554      velocity.prevPositionY = image.touchesCurrent.y;
6555      velocity.prevTime = Date.now();
6556
6557      gesture.$imageWrapEl.transform(("translate3d(" + (image.currentX) + "px, " + (image.currentY) + "px,0)"));
6558    },
6559    onTouchEnd: function onTouchEnd() {
6560      var swiper = this;
6561      var zoom = swiper.zoom;
6562      var gesture = zoom.gesture;
6563      var image = zoom.image;
6564      var velocity = zoom.velocity;
6565      if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
6566      if (!image.isTouched || !image.isMoved) {
6567        image.isTouched = false;
6568        image.isMoved = false;
6569        return;
6570      }
6571      image.isTouched = false;
6572      image.isMoved = false;
6573      var momentumDurationX = 300;
6574      var momentumDurationY = 300;
6575      var momentumDistanceX = velocity.x * momentumDurationX;
6576      var newPositionX = image.currentX + momentumDistanceX;
6577      var momentumDistanceY = velocity.y * momentumDurationY;
6578      var newPositionY = image.currentY + momentumDistanceY;
6579
6580      // Fix duration
6581      if (velocity.x !== 0) { momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x); }
6582      if (velocity.y !== 0) { momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y); }
6583      var momentumDuration = Math.max(momentumDurationX, momentumDurationY);
6584
6585      image.currentX = newPositionX;
6586      image.currentY = newPositionY;
6587
6588      // Define if we need image drag
6589      var scaledWidth = image.width * zoom.scale;
6590      var scaledHeight = image.height * zoom.scale;
6591      image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0);
6592      image.maxX = -image.minX;
6593      image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0);
6594      image.maxY = -image.minY;
6595      image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);
6596      image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);
6597
6598      gesture.$imageWrapEl.transition(momentumDuration).transform(("translate3d(" + (image.currentX) + "px, " + (image.currentY) + "px,0)"));
6599    },
6600    onTransitionEnd: function onTransitionEnd() {
6601      var swiper = this;
6602      var zoom = swiper.zoom;
6603      var gesture = zoom.gesture;
6604      if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) {
6605        gesture.$imageEl.transform('translate3d(0,0,0) scale(1)');
6606        gesture.$imageWrapEl.transform('translate3d(0,0,0)');
6607
6608        zoom.scale = 1;
6609        zoom.currentScale = 1;
6610
6611        gesture.$slideEl = undefined;
6612        gesture.$imageEl = undefined;
6613        gesture.$imageWrapEl = undefined;
6614      }
6615    },
6616    // Toggle Zoom
6617    toggle: function toggle(e) {
6618      var swiper = this;
6619      var zoom = swiper.zoom;
6620
6621      if (zoom.scale && zoom.scale !== 1) {
6622        // Zoom Out
6623        zoom.out();
6624      } else {
6625        // Zoom In
6626        zoom.in(e);
6627      }
6628    },
6629    in: function in$1(e) {
6630      var swiper = this;
6631
6632      var zoom = swiper.zoom;
6633      var params = swiper.params.zoom;
6634      var gesture = zoom.gesture;
6635      var image = zoom.image;
6636
6637      if (!gesture.$slideEl) {
6638        gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);
6639        gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas, picture, .swiper-zoom-target');
6640        gesture.$imageWrapEl = gesture.$imageEl.parent(("." + (params.containerClass)));
6641      }
6642      if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
6643
6644      gesture.$slideEl.addClass(("" + (params.zoomedSlideClass)));
6645
6646      var touchX;
6647      var touchY;
6648      var offsetX;
6649      var offsetY;
6650      var diffX;
6651      var diffY;
6652      var translateX;
6653      var translateY;
6654      var imageWidth;
6655      var imageHeight;
6656      var scaledWidth;
6657      var scaledHeight;
6658      var translateMinX;
6659      var translateMinY;
6660      var translateMaxX;
6661      var translateMaxY;
6662      var slideWidth;
6663      var slideHeight;
6664
6665      if (typeof image.touchesStart.x === 'undefined' && e) {
6666        touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX;
6667        touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY;
6668      } else {
6669        touchX = image.touchesStart.x;
6670        touchY = image.touchesStart.y;
6671      }
6672
6673      zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
6674      zoom.currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
6675      if (e) {
6676        slideWidth = gesture.$slideEl[0].offsetWidth;
6677        slideHeight = gesture.$slideEl[0].offsetHeight;
6678        offsetX = gesture.$slideEl.offset().left;
6679        offsetY = gesture.$slideEl.offset().top;
6680        diffX = (offsetX + (slideWidth / 2)) - touchX;
6681        diffY = (offsetY + (slideHeight / 2)) - touchY;
6682
6683        imageWidth = gesture.$imageEl[0].offsetWidth;
6684        imageHeight = gesture.$imageEl[0].offsetHeight;
6685        scaledWidth = imageWidth * zoom.scale;
6686        scaledHeight = imageHeight * zoom.scale;
6687
6688        translateMinX = Math.min(((slideWidth / 2) - (scaledWidth / 2)), 0);
6689        translateMinY = Math.min(((slideHeight / 2) - (scaledHeight / 2)), 0);
6690        translateMaxX = -translateMinX;
6691        translateMaxY = -translateMinY;
6692
6693        translateX = diffX * zoom.scale;
6694        translateY = diffY * zoom.scale;
6695
6696        if (translateX < translateMinX) {
6697          translateX = translateMinX;
6698        }
6699        if (translateX > translateMaxX) {
6700          translateX = translateMaxX;
6701        }
6702
6703        if (translateY < translateMinY) {
6704          translateY = translateMinY;
6705        }
6706        if (translateY > translateMaxY) {
6707          translateY = translateMaxY;
6708        }
6709      } else {
6710        translateX = 0;
6711        translateY = 0;
6712      }
6713      gesture.$imageWrapEl.transition(300).transform(("translate3d(" + translateX + "px, " + translateY + "px,0
6713)"));
6714      gesture.$imageEl.transition(300).transform(("translate3d(0,0,0) scale(" + (zoom.scale) + ")"));
6715    },
6716    out: function out() {
6717      var swiper = this;
6718
6719      var zoom = swiper.zoom;
6720      var params = swiper.params.zoom;
6721      var gesture = zoom.gesture;
6722
6723      if (!gesture.$slideEl) {
6724        gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);
6725        gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas, picture, .swiper-zoom-target');
6726        gesture.$imageWrapEl = gesture.$imageEl.parent(("." + (params.containerClass)));
6727      }
6728      if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
6729
6730      zoom.scale = 1;
6731      zoom.currentScale = 1;
6732      gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)');
6733      gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)');
6734      gesture.$slideEl.removeClass(("" + (params.zoomedSlideClass)));
6735      gesture.$slideEl = undefined;
6736    },
6737    // Attach/Detach Events
6738    enable: function enable() {
6739      var swiper = this;
6740      var zoom = swiper.zoom;
6741      if (zoom.enabled) { return; }
6742      zoom.enabled = true;
6743
6744      var passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false;
6745      var activeListenerWithCapture = Support.passiveListener ? { passive: false, capture: true } : true;
6746
6747      var slideSelector = "." + (swiper.params.slideClass);
6748
6749      // Scale image
6750      if (Support.gestures) {
6751        swiper.$wrapperEl.on('gesturestart', slideSelector, zoom.onGestureStart, passiveListener);
6752        swiper.$wrapperEl.on('gesturechange', slideSelector, zoom.onGestureChange, passiveListener);
6753        swiper.$wrapperEl.on('gestureend', slideSelector, zoom.onGestureEnd, passiveListener);
6754      } else if (swiper.touchEvents.start === 'touchstart') {
6755        swiper.$wrapperEl.on(swiper.touchEvents.start, slideSelector, zoom.onGestureStart, passiveListener);
6756        swiper.$wrapperEl.on(swiper.touchEvents.move, slideSelector, zoom.onGestureChange, activeListenerWithCapture);
6757        swiper.$wrapperEl.on(swiper.touchEvents.end, slideSelector, zoom.onGestureEnd, passiveListener);
6758        if (swiper.touchEvents.cancel) {
6759          swiper.$wrapperEl.on(swiper.touchEvents.cancel, slideSelector, zoom.onGestureEnd, passiveListener);
6760        }
6761      }
6762
6763      // Move image
6764      swiper.$wrapperEl.on(swiper.touchEvents.move, ("." + (swiper.params.zoom.containerClass)), zoom.onTouchMove, activeListenerWithCapture);
6765    },
6766    disable: function disable() {
6767      var swiper = this;
6768      var zoom = swiper.zoom;
6769      if (!zoom.enabled) { return; }
6770
6771      swiper.zoom.enabled = false;
6772
6773      var passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false;
6774      var activeListenerWithCapture = Support.passiveListener ? { passive: false, capture: true } : true;
6775
6776      var slideSelector = "." + (swiper.params.slideClass);
6777
6778      // Scale image
6779      if (Support.gestures) {
6780        swiper.$wrapperEl.off('gesturestart', slideSelector, zoom.onGestureStart, passiveListener);
6781        swiper.$wrapperEl.off('gesturechange', slideSelector, zoom.onGestureChange, passiveListener);
6782        swiper.$wrapperEl.off('gestureend', slideSelector, zoom.onGestureEnd, passiveListener);
6783      } else if (swiper.touchEvents.start === 'touchstart') {
6784        swiper.$wrapperEl.off(swiper.touchEvents.start, slideSelector, zoom.onGestureStart, passiveListener);
6785        swiper.$wrapperEl.off(swiper.touchEvents.move, slideSelector, zoom.onGestureChange, activeListenerWithCapture);
6786        swiper.$wrapperEl.off(swiper.touchEvents.end, slideSelector, zoom.onGestureEnd, passiveListener);
6787        if (swiper.touchEvents.cancel) {
6788          swiper.$wrapperEl.off(swiper.touchEvents.cancel, slideSelector, zoom.onGestureEnd, passiveListener);
6789        }
6790      }
6791
6792      // Move image
6793      swiper.$wrapperEl.off(swiper.touchEvents.move, ("." + (swiper.params.zoom.containerClass)), zoom.onTouchMove, activeListenerWithCapture);
6794    },
6795  };
6796
6797  var Zoom$1 = {
6798    name: 'zoom',
6799    params: {
6800      zoom: {
6801        enabled: false,
6802        maxRatio: 3,
6803        minRatio: 1,
6804        toggle: true,
6805        containerClass: 'swiper-zoom-container',
6806        zoomedSlideClass: 'swiper-slide-zoomed',
6807      },
6808    },
6809    create: function create() {
6810      var swiper = this;
6811      var zoom = {
6812        enabled: false,
6813        scale: 1,
6814        currentScale: 1,
6815        isScaling: false,
6816        gesture: {
6817          $slideEl: undefined,
6818          slideWidth: undefined,
6819          slideHeight: undefined,
6820          $imageEl: undefined,
6821          $imageWrapEl: undefined,
6822          maxRatio: 3,
6823        },
6824        image: {
6825          isTouched: undefined,
6826          isMoved: undefined,
6827          currentX: undefined,
6828          currentY: undefined,
6829          minX: undefined,
6830          minY: undefined,
6831          maxX: undefined,
6832          maxY: undefined,
6833          width: undefined,
6834          height: undefined,
6835          startX: undefined,
6836          startY: undefined,
6837          touchesStart: {},
6838          touchesCurrent: {},
6839        },
6840        velocity: {
6841          x: undefined,
6842          y: undefined,
6843          prevPositionX: undefined,
6844          prevPositionY: undefined,
6845          prevTime: undefined,
6846        },
6847      };
6848
6849      ('onGestureStart onGestureChange onGestureEnd onTouchStart onTouchMove onTouchEnd onTransitionEnd toggle enable disable in out').split(' ').forEach(function (methodName) {
6850        zoom[methodName] = Zoom[methodName].bind(swiper);
6851      });
6852      Utils.extend(swiper, {
6853        zoom: zoom,
6854      });
6855
6856      var scale = 1;
6857      Object.defineProperty(swiper.zoom, 'scale', {
6858        get: function get() {
6859          return scale;
6860        },
6861        set: function set(value) {
6862          if (scale !== value) {
6863            var imageEl = swiper.zoom.gesture.$imageEl ? swiper.zoom.gesture.$imageEl[0] : undefined;
6864            var slideEl = swiper.zoom.gesture.$slideEl ? swiper.zoom.gesture.$slideEl[0] : undefined;
6865            swiper.emit('zoomChange', value, imageEl, slideEl);
6866          }
6867          scale = value;
6868        },
6869      });
6870    },
6871    on: {
6872      init: function init() {
6873        var swiper = this;
6874        if (swiper.params.zoom.enabled) {
6875          swiper.zoom.enable();
6876        }
6877      },
6878      destroy: function destroy() {
6879        var swiper = this;
6880        swiper.zoom.disable();
6881      },
6882      touchStart: function touchStart(e) {
6883        var swiper = this;
6884        if (!swiper.zoom.enabled) { return; }
6885        swiper.zoom.onTouchStart(e);
6886      },
6887      touchEnd: function touchEnd(e) {
6888        var swiper = this;
6889        if (!swiper.zoom.enabled) { return; }
6890        swiper.zoom.onTouchEnd(e);
6891      },
6892      doubleTap: function doubleTap(e) {
6893        var swiper = this;
6894        if (swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) {
6895          swiper.zoom.toggle(e);
6896        }
6897      },
6898      transitionEnd: function transitionEnd() {
6899        var swiper = this;
6900        if (swiper.zoom.enabled && swiper.params.zoom.enabled) {
6901          swiper.zoom.onTransitionEnd();
6902        }
6903      },
6904      slideChange: function slideChange() {
6905        var swiper = this;
6906        if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) {
6907          swiper.zoom.onTransitionEnd();
6908        }
6909      },
6910    },
6911  };
6912
6913  var Lazy = {
6914    loadInSlide: function loadInSlide(index, loadInDuplicate) {
6915      if ( loadInDuplicate === void 0 ) loadInDuplicate = true;
6916
6917      var swiper = this;
6918      var params = swiper.params.lazy;
6919      if (typeof index === 'undefined') { return; }
6920      if (swiper.slides.length === 0) { return; }
6921      var isVirtual = swiper.virtual && swiper.params.virtual.enabled;
6922
6923      var $slideEl = isVirtual
6924        ? swiper.$wrapperEl.children(("." + (swiper.params.slideClass) + "[data-swiper-slide-index=\"" + index + "\"]"))
6925        : swiper.slides.eq(index);
6926
6927      var $images = $slideEl.find(("." + (params.elementClass) + ":not(." + (params.loadedClass) + "):not(." + (params.loadingClass) + ")"));
6928      if ($slideEl.hasClass(params.elementClass) && !$slideEl.hasClass(params.loadedClass) && !$slideEl.hasClass(params.loadingClass)) {
6929        $images = $images.add($slideEl[0]);
6930      }
6931      if ($images.length === 0) { return; }
6932
6933      $images.each(function (imageIndex, imageEl) {
6934        var $imageEl = $(imageEl);
6935        $imageEl.addClass(params.loadingClass);
6936
6937        var background = $imageEl.attr('data-background');
6938        var src = $imageEl.attr('data-src');
6939        var srcset = $imageEl.attr('data-srcset');
6940        var sizes = $imageEl.attr('data-sizes');
6941
6942        swiper.loadImage($imageEl[0], (src || background), srcset, sizes, false, function () {
6943          if (typeof swiper === 'undefined' || swiper === null || !swiper || (swiper && !swiper.params) || swiper.destroyed) { return; }
6944          if (background) {
6945            $imageEl.css('background-image', ("url(\"" + background + "\")"));
6946            $imageEl.removeAttr('data-background');
6947          } else {
6948            if (srcset) {
6949              $imageEl.attr('srcset', srcset);
6950              $imageEl.removeAttr('data-srcset');
6951            }
6952            if (sizes) {
6953              $imageEl.attr('sizes', sizes);
6954              $imageEl.removeAttr('data-sizes');
6955            }
6956            if (src) {
6957              $imageEl.attr('src', src);
6958              $imageEl.removeAttr('data-src');
6959            }
6960          }
6961
6962          $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass);
6963          $slideEl.find(("." + (params.preloaderClass))).remove();
6964          if (swiper.params.loop && loadInDuplicate) {
6965            var slideOriginalIndex = $slideEl.attr('data-swiper-slide-index');
6966            if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) {
6967              var originalSlide = swiper.$wrapperEl.children(("[data-swiper-slide-index=\"" + slideOriginalIndex + "\"]:not(." + (swiper.params.slideDuplicateClass) + ")"));
6968              swiper.lazy.loadInSlide(originalSlide.index(), false);
6969            } else {
6970              var duplicatedSlide = swiper.$wrapperEl.children(("." + (swiper.params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + slideOriginalIndex + "\"]"));
6971              swiper.lazy.loadInSlide(duplicatedSlide.index(), false);
6972            }
6973          }
6974          swiper.emit('lazyImageReady', $slideEl[0], $imageEl[0]);
6975          if (swiper.params.autoHeight) {
6976            swiper.updateAutoHeight();
6977          }
6978        });
6979
6980        swiper.emit('lazyImageLoad', $slideEl[0], $imageEl[0]);
6981      });
6982    },
6983    load: function load() {
6984      var swiper = this;
6985      var $wrapperEl = swiper.$wrapperEl;
6986      var swiperParams = swiper.params;
6987      var slides = swiper.slides;
6988      var activeIndex = swiper.activeIndex;
6989      var isVirtual = swiper.virtual && swiperParams.virtual.enabled;
6990      var params = swiperParams.lazy;
6991
6992      var slidesPerView = swiperParams.slidesPerView;
6993      if (slidesPerView === 'auto') {
6994        slidesPerView = 0;
6995      }
6996
6997      function slideExist(index) {
6998        if (isVirtual) {
6999          if ($wrapperEl.children(("." + (swiperParams.slideClass) + "[data-swiper-slide-index=\"" + index + "\"]")).length) {
7000            return true;
7001          }
7002        } else if (slides[index]) { return true; }
7003        return false;
7004      }
7005      function slideIndex(slideEl) {
7006        if (isVirtual) {
7007          return $(slideEl).attr('data-swiper-slide-index');
7008        }
7009        return $(slideEl).index();
7010      }
7011
7012      if (!swiper.lazy.initialImageLoaded) { swiper.lazy.initialImageLoaded = true; }
7013      if (swiper.params.watchSlidesVisibility) {
7014        $wrapperEl.children(("." + (swiperParams.slideVisibleClass))).each(function (elIndex, slideEl) {
7015          var index = isVirtual ? $(slideEl).attr('data-swiper-slide-index') : $(slideEl).index();
7016          swiper.lazy.loadInSlide(index);
7017        });
7018      } else if (slidesPerView > 1) {
7019        for (var i = activeIndex; i < activeIndex + slidesPerView; i += 1) {
7020          if (slideExist(i)) { swiper.lazy.loadInSlide(i); }
7021        }
7022      } else {
7023        swiper.lazy.loadInSlide(activeIndex);
7024      }
7025      if (params.loadPrevNext) {
7026        if (slidesPerView > 1 || (params.loadPrevNextAmount && params.loadPrevNextAmount > 1)) {
7027          var amount = params.loadPrevNextAmount;
7028          var spv = slidesPerView;
7029          var maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length);
7030          var minIndex = Math.max(activeIndex - Math.max(spv, amount), 0);
7031          // Next Slides
7032          for (var i$1 = activeIndex + slidesPerView; i$1 < maxIndex; i$1 += 1) {
7033            if (slideExist(i$1)) { swiper.lazy.loadInSlide(i$1); }
7034          }
7035          // Prev Slides
7036          for (var i$2 = minIndex; i$2 < activeIndex; i$2 += 1) {
7037            if (slideExist(i$2)) { swiper.lazy.loadInSlide(i$2); }
7038          }
7039        } else {
7040          var nextSlide = $wrapperEl.children(("." + (swiperParams.slideNextClass)));
7041          if (nextSlide.length > 0) { swiper.lazy.loadInSlide(slideIndex(nextSlide)); }
7042
7043          var prevSlide = $wrapperEl.children(("." + (swiperParams.slidePrevClass)));
7044          if (prevSlide.length > 0) { swiper.lazy.loadInSlide(slideIndex(prevSlide)); }
7045        }
7046      }
7047    },
7048  };
7049
7050  var Lazy$1 = {
7051    name: 'lazy',
7052    params: {
7053      lazy: {
7054        enabled: false,
7055        loadPrevNext: false,
7056        loadPrevNextAmount: 1,
7057        loadOnTransitionStart: false,
7058
7059        elementClass: 'swiper-lazy',
7060        loadingClass: 'swiper-lazy-loading',
7061        loadedClass: 'swiper-lazy-loaded',
7062        preloaderClass: 'swiper-lazy-preloader',
7063      },
7064    },
7065    create: function create() {
7066      var swiper = this;
7067      Utils.extend(swiper, {
7068        lazy: {
7069          initialImageLoaded: false,
7070          load: Lazy.load.bind(swiper),
7071          loadInSlide: Lazy.loadInSlide.bind(swiper),
7072        },
7073      });
7074    },
7075    on: {
7076      beforeInit: function beforeInit() {
7077        var swiper = this;
7078        if (swiper.params.lazy.enabled && swiper.params.preloadImages) {
7079          swiper.params.preloadImages = false;
7080        }
7081      },
7082      init: function init() {
7083        var swiper = this;
7084        if (swiper.params.lazy.enabled && !swiper.params.loop && swiper.params.initialSlide === 0) {
7085          swiper.lazy.load();
7086        }
7087      },
7088      scroll: function scroll() {
7089        var swiper = this;
7090        if (swiper.params.freeMode && !swiper.params.freeModeSticky) {
7091          swiper.lazy.load();
7092        }
7093      },
7094      resize: function resize() {
7095        var swiper = this;
7096        if (swiper.params.lazy.enabled) {
7097          swiper.lazy.load();
7098        }
7099      },
7100      scrollbarDragMove: function scrollbarDragMove() {
7101        var swiper = this;
7102        if (swiper.params.lazy.enabled) {
7103          swiper.lazy.load();
7104        }
7105      },
7106      transitionStart: function transitionStart() {
7107        var swiper = this;
7108        if (swiper.params.lazy.enabled) {
7109          if (swiper.params.lazy.loadOnTransitionStart || (!swiper.params.lazy.loadOnTransitionStart && !swiper.lazy.initialImageLoaded)) {
7110            swiper.lazy.load();
7111          }
7112        }
7113      },
7114      transitionEnd: function transitionEnd() {
7115        var swiper = this;
7116        if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) {
7117          swiper.lazy.load();
7118        }
7119      },
7120      slideChange: function slideChange() {
7121        var swiper = this;
7122        if (swiper.params.lazy.enabled && swiper.params.cssMode) {
7123          swiper.lazy.load();
7124        }
7125      },
7126    },
7127  };
7128
7129  /* eslint no-bitwise: ["error", { "allow": [">>"] }] */
7130
7131  var Controller = {
7132    LinearSpline: function LinearSpline(x, y) {
7133      var binarySearch = (function search() {
7134        var maxIndex;
7135        var minIndex;
7136        var guess;
7137        return function (array, val) {
7138          minIndex = -1;
7139          maxIndex = array.length;
7140          while (maxIndex - minIndex > 1) {
7141            guess = maxIndex + minIndex >> 1;
7142            if (array[guess] <= val) {
7143              minIndex = guess;
7144            } else {
7145              maxIndex = guess;
7146            }
7147          }
7148          return maxIndex;
7149        };
7150      }());
7151      this.x = x;
7152      this.y = y;
7153      this.lastIndex = x.length - 1;
7154      // Given an x value (x2), return the expected y2 value:
7155      // (x1,y1) is the known point before given value,
7156      // (x3,y3) is the known point after given value.
7157      var i1;
7158      var i3;
7159
7160      this.interpolate = function interpolate(x2) {
7161        if (!x2) { return 0; }
7162
7163        // Get the indexes of x1 and x3 (the array indexes before and after given x2):
7164        i3 = binarySearch(this.x, x2);
7165        i1 = i3 - 1;
7166
7167        // We have our indexes i1 & i3, so we can calculate already:
7168        // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1
7169        return (((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1])) + this.y[i1];
7170      };
7171      return this;
7172    },
7173    // xxx: for now i will just save one spline function to to
7174    getInterpolateFunction: function getInterpolateFunction(c) {
7175      var swiper = this;
7176      if (!swiper.controller.spline) {
7177        swiper.controller.spline = swiper.params.loop
7178          ? new Controller.LinearSpline(swiper.slidesGrid, c.slidesGrid)
7179          : new Controller.LinearSpline(swiper.snapGrid, c.snapGrid);
7180      }
7181    },
7182    setTranslate: function setTranslate(setTranslate$1, byController) {
7183      var swiper = this;
7184      var controlled = swiper.controller.control;
7185      var multiplier;
7186      var controlledTranslate;
7187      function setControlledTranslate(c) {
7188        // this will create an Interpolate function based on the snapGrids
7189        // x is the Grid of the scrolled scroller and y will be the controlled scroller
7190        // it makes sense to create this only once and recall it for the interpolation
7191        // the function does a lot of value caching for performance
7192        var translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;
7193        if (swiper.params.controller.by === 'slide') {
7194          swiper.controller.getInterpolateFunction(c);
7195          // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid
7196          // but it did not work out
7197          controlledTranslate = -swiper.controller.spline.interpolate(-translate);
7198        }
7199
7200        if (!controlledTranslate || swiper.params.controller.by === 'container') {
7201          multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());
7202          controlledTranslate = ((translate - swiper.minTranslate()) * multiplier) + c.minTranslate();
7203        }
7204
7205        if (swiper.params.controller.inverse) {
7206          controlledTranslate = c.maxTranslate() - controlledTranslate;
7207        }
7208        c.updateProgress(controlledTranslate);
7209        c.setTranslate(controlledTranslate, swiper);
7210        c.updateActiveIndex();
7211        c.updateSlidesClasses();
7212      }
7213      if (Array.isArray(controlled)) {
7214        for (var i = 0; i < controlled.length; i += 1) {
7215          if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
7216            setControlledTranslate(controlled[i]);
7217          }
7218        }
7219      } else if (controlled instanceof Swiper && byController !== controlled) {
7220        setControlledTranslate(controlled);
7221      }
7222    },
7223    setTransition: function setTransition(duration, byController) {
7224      var swiper = this;
7225      var controlled = swiper.controller.control;
7226      var i;
7227      function setControlledTransition(c) {
7228        c.setTransition(duration, swiper);
7229        if (duration !== 0) {
7230          c.transitionStart();
7231          if (c.params.autoHeight) {
7232            Utils.nextTick(function () {
7233              c.updateAutoHeight();
7234            });
7235          }
7236          c.$wrapperEl.transitionEnd(function () {
7237            if (!controlled) { return; }
7238            if (c.params.loop && swiper.params.controller.by === 'slide') {
7239              c.loopFix();
7240            }
7241            c.transitionEnd();
7242          });
7243        }
7244      }
7245      if (Array.isArray(controlled)) {
7246        for (i = 0; i < controlled.length; i += 1) {
7247          if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
7248            setControlledTransition(controlled[i]);
7249          }
7250        }
7251      } else if (controlled instanceof Swiper && byController !== controlled) {
7252        setControlledTransition(controlled);
7253      }
7254    },
7255  };
7256  var Controller$1 = {
7257    name: 'controller',
7258    params: {
7259      controller: {
7260        control: undefined,
7261        inverse: false,
7262        by: 'slide', // or 'container'
7263      },
7264    },
7265    create: function create() {
7266      var swiper = this;
7267      Utils.extend(swiper, {
7268        controller: {
7269          control: swiper.params.controller.control,
7270          getInterpolateFunction: Controller.getInterpolateFunction.bind(swiper),
7271          setTranslate: Controller.setTranslate.bind(swiper),
7272          setTransition: Controller.setTransition.bind(swiper),
7273        },
7274      });
7275    },
7276    on: {
7277      update: function update() {
7278        var swiper = this;
7279        if (!swiper.controller.control) { return; }
7280        if (swiper.controller.spline) {
7281          swiper.controller.spline = undefined;
7282          delete swiper.controller.spline;
7283        }
7284      },
7285      resize: function resize() {
7286        var swiper = this;
7287        if (!swiper.controller.control) { return; }
7288        if (swiper.controller.spline) {
7289          swiper.controller.spline = undefined;
7290          delete swiper.controller.spline;
7291        }
7292      },
7293      observerUpdate: function observerUpdate() {
7294        var swiper = this;
7295        if (!swiper.controller.control) { return; }
7296        if (swiper.controller.spline) {
7297          swiper.controller.spline = undefined;
7298          delete swiper.controller.spline;
7299        }
7300      },
7301      setTranslate: function setTranslate(translate, byController) {
7302        var swiper = this;
7303        if (!swiper.controller.control) { return; }
7304        swiper.controller.setTranslate(translate, byController);
7305      },
7306      setTransition: function setTransition(duration, byController) {
7307        var swiper = this;
7308        if (!swiper.controller.control) { return; }
7309        swiper.controller.setTransition(duration, byController);
7310      },
7311    },
7312  };
7313
7314  var a11y = {
7315    makeElFocusable: function makeElFocusable($el) {
7316      $el.attr('tabIndex', '0');
7317      return $el;
7318    },
7319    addElRole: function addElRole($el, role) {
7320      $el.attr('role', role);
7321      return $el;
7322    },
7323    addElLabel: function addElLabel($el, label) {
7324      $el.attr('aria-label', label);
7325      return $el;
7326    },
7327    disableEl: function disableEl($el) {
7328      $el.attr('aria-disabled', true);
7329      return $el;
7330    },
7331    enableEl: function enableEl($el) {
7332      $el.attr('aria-disabled', false);
7333      return $el;
7334    },
7335    onEnterKey: function onEnterKey(e) {
7336      var swiper = this;
7337      var params = swiper.params.a11y;
7338      if (e.keyCode !== 13) { return; }
7339      var $targetEl = $(e.target);
7340      if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) {
7341        if (!(swiper.isEnd && !swiper.params.loop)) {
7342          swiper.slideNext();
7343        }
7344        if (swiper.isEnd) {
7345          swiper.a11y.notify(params.lastSlideMessage);
7346        } else {
7347          swiper.a11y.notify(params.nextSlideMessage);
7348        }
7349      }
7350      if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) {
7351        if (!(swiper.isBeginning && !swiper.params.loop)) {
7352          swiper.slidePrev();
7353        }
7354        if (swiper.isBeginning) {
7355          swiper.a11y.notify(params.firstSlideMessage);
7356        } else {
7357          swiper.a11y.notify(params.prevSlideMessage);
7358        }
7359      }
7360      if (swiper.pagination && $targetEl.is(("." + (swiper.params.pagination.bulletClass)))) {
7361        $targetEl[0].click();
7362      }
7363    },
7364    notify: function notify(message) {
7365      var swiper = this;
7366      var notification = swiper.a11y.liveRegion;
7367      if (notification.length === 0) { return; }
7368      notification.html('');
7369      notification.html(message);
7370    },
7371    updateNavigation: function updateNavigation() {
7372      var swiper = this;
7373
7374      if (swiper.params.loop || !swiper.navigation) { return; }
7375      var ref = swiper.navigation;
7376      var $nextEl = ref.$nextEl;
7377      var $prevEl = ref.$prevEl;
7378
7379      if ($prevEl && $prevEl.length > 0) {
7380        if (swiper.isBeginning) {
7381          swiper.a11y.disableEl($prevEl);
7382        } else {
7383          swiper.a11y.enableEl($prevEl);
7384        }
7385      }
7386      if ($nextEl && $nextEl.length > 0) {
7387        if (swiper.isEnd) {
7388          swiper.a11y.disableEl($nextEl);
7389        } else {
7390          swiper.a11y.enableEl($nextEl);
7391        }
7392      }
7393    },
7394    updatePagination: function updatePagination() {
7395      var swiper = this;
7396      var params = swiper.params.a11y;
7397      if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
7398        swiper.pagination.bullets.each(function (bulletIndex, bulletEl) {
7399          var $bulletEl = $(bulletEl);
7400          swiper.a11y.makeElFocusable($bulletEl);
7401          swiper.a11y.addElRole($bulletEl, 'button');
7402          swiper.a11y.addElLabel($bulletEl, params.paginationBulletMessage.replace(/{{index}}/, $bulletEl.index() + 1));
7403        });
7404      }
7405    },
7406    init: function init() {
7407      var swiper = this;
7408
7409      swiper.$el.append(swiper.a11y.liveRegion);
7410
7411      // Navigation
7412      var params = swiper.params.a11y;
7413      var $nextEl;
7414      var $prevEl;
7415      if (swiper.navigation && swiper.navigation.$nextEl) {
7416        $nextEl = swiper.navigation.$nextEl;
7417      }
7418      if (swiper.navigation && swiper.navigation.$prevEl) {
7419        $prevEl = swiper.navigation.$prevEl;
7420      }
7421      if ($nextEl) {
7422        swiper.a11y.makeElFocusable($nextEl);
7423        swiper.a11y.addElRole($nextEl, 'button');
7424        swiper.a11y.addElLabel($nextEl, params.nextSlideMessage);
7425        $nextEl.on('keydown', swiper.a11y.onEnterKey);
7426      }
7427      if ($prevEl) {
7428        swiper.a11y.makeElFocusable($prevEl);
7429        swiper.a11y.addElRole($prevEl, 'button');
7430        swiper.a11y.addElLabel($prevEl, params.prevSlideMessage);
7431        $prevEl.on('keydown', swiper.a11y.onEnterKey);
7432      }
7433
7434      // Pagination
7435      if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
7436        swiper.pagination.$el.on('keydown', ("." + (swiper.params.pagination.bulletClass)), swiper.a11y.onEnterKey);
7437      }
7438    },
7439    destroy: function destroy() {
7440      var swiper = this;
7441      if (swiper.a11y.liveRegion && swiper.a11y.liveRegion.length > 0) { swiper.a11y.liveRegion.remove(); }
7442
7443      var $nextEl;
7444      var $prevEl;
7445      if (swiper.navigation && swiper.navigation.$nextEl) {
7446        $nextEl = swiper.navigation.$nextEl;
7447      }
7448      if (swiper.navigation && swiper.navigation.$prevEl) {
7449        $prevEl = swiper.navigation.$prevEl;
7450      }
7451      if ($nextEl) {
7452        $nextEl.off('keydown', swiper.a11y.onEnterKey);
7453      }
7454      if ($prevEl) {
7455        $prevEl.off('keydown', swiper.a11y.onEnterKey);
7456      }
7457
7458      // Pagination
7459      if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
7460        swiper.pagination.$el.off('keydown', ("." + (swiper.params.pagination.bulletClass)), swiper.a11y.onEnterKey);
7461      }
7462    },
7463  };
7464  var A11y = {
7465    name: 'a11y',
7466    params: {
7467      a11y: {
7468        enabled: true,
7469        notificationClass: 'swiper-notification',
7470        prevSlideMessage: 'Previous slide',
7471        nextSlideMessage: 'Next slide',
7472        firstSlideMessage: 'This is the first slide',
7473        lastSlideMessage: 'This is the last slide',
7474        paginationBulletMessage: 'Go to slide {{index}}',
7475      },
7476    },
7477    create: function create() {
7478      var swiper = this;
7479      Utils.extend(swiper, {
7480        a11y: {
7481          liveRegion: $(("<span class=\"" + (swiper.params.a11y.notificationClass) + "\" aria-live=\"assertive\" aria-atomic=\"true\"></span>")),
7482        },
7483      });
7484      Object.keys(a11y).forEach(function (methodName) {
7485        swiper.a11y[methodName] = a11y[methodName].bind(swiper);
7486      });
7487    },
7488    on: {
7489      init: function init() {
7490        var swiper = this;
7491        if (!swiper.params.a11y.enabled) { return; }
7492        swiper.a11y.init();
7493        swiper.a11y.updateNavigation();
7494      },
7495      toEdge: function toEdge() {
7496        var swiper = this;
7497        if (!swiper.params.a11y.enabled) { return; }
7498        swiper.a11y.updateNavigation();
7499      },
7500      fromEdge: function fromEdge() {
7501        var swiper = this;
7502        if (!swiper.params.a11y.enabled) { return; }
7503        swiper.a11y.updateNavigation();
7504      },
7505      paginationUpdate: function paginationUpdate() {
7506        var swiper = this;
7507        if (!swiper.params.a11y.enabled) { return; }
7508        swiper.a11y.updatePagination();
7509      },
7510      destroy: function destroy() {
7511        var swiper = this;
7512        if (!swiper.params.a11y.enabled) { return; }
7513        swiper.a11y.destroy();
7514      },
7515    },
7516  };
7517
7518  var History = {
7519    init: function init() {
7520      var swiper = this;
7521      if (!swiper.params.history) { return; }
7522      if (!win.history || !win.history.pushState) {
7523        swiper.params.history.enabled = false;
7524        swiper.params.hashNavigation.enabled = true;
7525        return;
7526      }
7527      var history = swiper.history;
7528      history.initialized = true;
7529      history.paths = History.getPathValues();
7530      if (!history.paths.key && !history.paths.value) { return; }
7531      history.scrollToSlide(0, history.paths.value, swiper.params.runCallbacksOnInit);
7532      if (!swiper.params.history.replaceState) {
7533        win.addEventListener('popstate', swiper.history.setHistoryPopState);
7534      }
7535    },
7536    destroy: function destroy() {
7537      var swiper = this;
7538      if (!swiper.params.history.replaceState) {
7539        win.removeEventListener('popstate', swiper.history.setHistoryPopState);
7540      }
7541    },
7542    setHistoryPopState: function setHistoryPopState() {
7543      var swiper = this;
7544      swiper.history.paths = History.getPathValues();
7545      swiper.history.scrollToSlide(swiper.params.speed, swiper.history.paths.value, false);
7546    },
7547    getPathValues: function getPathValues() {
7548      var pathArray = win.location.pathname.slice(1).split('/').filter(function (part) { return part !== ''; });
7549      var total = pathArray.length;
7550      var key = pathArray[total - 2];
7551      var value = pathArray[total - 1];
7552      return { key: key, value: value };
7553    },
7554    setHistory: function setHistory(key, index) {
7555      var swiper = this;
7556      if (!swiper.history.initialized || !swiper.params.history.enabled) { return; }
7557      var slide = swiper.slides.eq(index);
7558      var value = History.slugify(slide.attr('data-history'));
7559      if (!win.location.pathname.includes(key)) {
7560        value = key + "/" + value;
7561      }
7562      var currentState = win.history.state;
7563      if (currentState && currentState.value === value) {
7564        return;
7565      }
7566      if (swiper.params.history.replaceState) {
7567        win.history.replaceState({ value: value }, null, value);
7568      } else {
7569        win.history.pushState({ value: value }, null, value);
7570      }
7571    },
7572    slugify: function slugify(text) {
7573      return text.toString()
7574        .replace(/\s+/g, '-')
7575        .replace(/[^\w-]+/g, '')
7576        .replace(/--+/g, '-')
7577        .replace(/^-+/, '')
7578        .replace(/-+$/, '');
7579    },
7580    scrollToSlide: function scrollToSlide(speed, value, runCallbacks) {
7581      var swiper = this;
7582      if (value) {
7583        for (var i = 0, length = swiper.slides.length; i < length; i += 1) {
7584          var slide = swiper.slides.eq(i);
7585          var slideHistory = History.slugify(slide.attr('data-history'));
7586          if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) {
7587            var index = slide.index();
7588            swiper.slideTo(index, speed, runCallbacks);
7589          }
7590        }
7591      } else {
7592        swiper.slideTo(0, speed, runCallbacks);
7593      }
7594    },
7595  };
7596
7597  var History$1 = {
7598    name: 'history',
7599    params: {
7600      history: {
7601        enabled: false,
7602        replaceState: false,
7603        key: 'slides',
7604      },
7605    },
7606    create: function create() {
7607      var swiper = this;
7608      Utils.extend(swiper, {
7609        history: {
7610          init: History.init.bind(swiper),
7611          setHistory: History.setHistory.bind(swiper),
7612          setHistoryPopState: History.setHistoryPopState.bind(swiper),
7613          scrollToSlide: History.scrollToSlide.bind(swiper),
7614          destroy: History.destroy.bind(swiper),
7615        },
7616      });
7617    },
7618    on: {
7619      init: function init() {
7620        var swiper = this;
7621        if (swiper.params.history.enabled) {
7622          swiper.history.init();
7623        }
7624      },
7625      destroy: function destroy() {
7626        var swiper = this;
7627        if (swiper.params.history.enabled) {
7628          swiper.history.destroy();
7629        }
7630      },
7631      transitionEnd: function transitionEnd() {
7632        var swiper = this;
7633        if (swiper.history.initialized) {
7634          swiper.history.setHistory(swiper.params.history.key, swiper.activeIndex);
7635        }
7636      },
7637      slideChange: function slideChange() {
7638        var swiper = this;
7639        if (swiper.history.initialized && swiper.params.cssMode) {
7640          swiper.history.setHistory(swiper.params.history.key, swiper.activeIndex);
7641        }
7642      },
7643    },
7644  };
7645
7646  var HashNavigation = {
7647    onHashCange: function onHashCange() {
7648      var swiper = this;
7649      var newHash = doc.location.hash.replace('#', '');
7650      var activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash');
7651      if (newHash !== activeSlideHash) {
7652        var newIndex = swiper.$wrapperEl.children(("." + (swiper.params.slideClass) + "[data-hash=\"" + newHash + "\"]")).index();
7653        if (typeof newIndex === 'undefined') { return; }
7654        swiper.slideTo(newIndex);
7655      }
7656    },
7657    setHash: function setHash() {
7658      var swiper = this;
7659      if (!swiper.hashNavigation.initialized || !swiper.params.hashNavigation.enabled) { return; }
7660      if (swiper.params.hashNavigation.replaceState && win.history && win.history.replaceState) {
7661        win.history.replaceState(null, null, (("#" + (swiper.slides.eq(swiper.activeIndex).attr('data-hash'))) || ''));
7662      } else {
7663        var slide = swiper.slides.eq(swiper.activeIndex);
7664        var hash = slide.attr('data-hash') || slide.attr('data-history');
7665        doc.location.hash = hash || '';
7666      }
7667    },
7668    init: function init() {
7669      var swiper = this;
7670      if (!swiper.params.hashNavigation.enabled || (swiper.params.history && swiper.params.history.enabled)) { return; }
7671      swiper.hashNavigation.initialized = true;
7672      var hash = doc.location.hash.replace('#', '');
7673      if (hash) {
7674        var speed = 0;
7675        for (var i = 0, length = swiper.slides.length; i < length; i += 1) {
7676          var slide = swiper.slides.eq(i);
7677          var slideHash = slide.attr('data-hash') || slide.attr('data-history');
7678          if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) {
7679            var index = slide.index();
7680            swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true);
7681          }
7682        }
7683      }
7684      if (swiper.params.hashNavigation.watchState) {
7685        $(win).on('hashchange', swiper.hashNavigation.onHashCange);
7686      }
7687    },
7688    destroy: function destroy() {
7689      var swiper = this;
7690      if (swiper.params.hashNavigation.watchState) {
7691        $(win).off('hashchange', swiper.hashNavigation.onHashCange);
7692      }
7693    },
7694  };
7695  var HashNavigation$1 = {
7696    name: 'hash-navigation',
7697    params: {
7698      hashNavigation: {
7699        enabled: false,
7700        replaceState: false,
7701        watchState: false,
7702      },
7703    },
7704    create: function create() {
7705      var swiper = this;
7706      Utils.extend(swiper, {
7707        hashNavigation: {
7708          initialized: false,
7709          init: HashNavigation.init.bind(swiper),
7710          destroy: HashNavigation.destroy.bind(swiper),
7711          setHash: HashNavigation.setHash.bind(swiper),
7712          onHashCange: HashNavigation.onHashCange.bind(swiper),
7713        },
7714      });
7715    },
7716    on: {
7717      init: function init() {
7718        var swiper = this;
7719        if (swiper.params.hashNavigation.enabled) {
7720          swiper.hashNavigation.init();
7721        }
7722      },
7723      destroy: function destroy() {
7724        var swiper = this;
7725        if (swiper.params.hashNavigation.enabled) {
7726          swiper.hashNavigation.destroy();
7727        }
7728      },
7729      transitionEnd: function transitionEnd() {
7730        var swiper = this;
7731        if (swiper.hashNavigation.initialized) {
7732          swiper.hashNavigation.setHash();
7733        }
7734      },
7735      slideChange: function slideChange() {
7736        var swiper = this;
7737        if (swiper.hashNavigation.initialized && swiper.params.cssMode) {
7738          swiper.hashNavigation.setHash();
7739        }
7740      },
7741    },
7742  };
7743
7744  /* eslint no-underscore-dangle: "off" */
7745
7746  var Autoplay = {
7747    run: function run() {
7748      var swiper = this;
7749      var $activeSlideEl = swiper.slides.eq(swiper.activeIndex);
7750      var delay = swiper.params.autoplay.delay;
7751      if ($activeSlideEl.attr('data-swiper-autoplay')) {
7752        delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay;
7753      }
7754      clearTimeout(swiper.autoplay.timeout);
7755      swiper.autoplay.timeout = Utils.nextTick(function () {
7756        if (swiper.params.autoplay.reverseDirection) {
7757          if (swiper.params.loop) {
7758            swiper.loopFix();
7759            swiper.slidePrev(swiper.params.speed, true, true);
7760            swiper.emit('autoplay');
7761          } else if (!swiper.isBeginning) {
7762            swiper.slidePrev(swiper.params.speed, true, true);
7763            swiper.emit('autoplay');
7764          } else if (!swiper.params.autoplay.stopOnLastSlide) {
7765            swiper.slideTo(swiper.slides.length - 1, swiper.params.speed, true, true);
7766            swiper.emit('autoplay');
7767          } else {
7768            swiper.autoplay.stop();
7769          }
7770        } else if (swiper.params.loop) {
7771          swiper.loopFix();
7772          swiper.slideNext(swiper.params.speed, true, true);
7773          swiper.emit('autoplay');
7774        } else if (!swiper.isEnd) {
7775          swiper.slideNext(swiper.params.speed, true, true);
7776          swiper.emit('autoplay');
7777        } else if (!swiper.params.autoplay.stopOnLastSlide) {
7778          swiper.slideTo(0, swiper.params.speed, true, true);
7779          swiper.emit('autoplay');
7780        } else {
7781          swiper.autoplay.stop();
7782        }
7783        if (swiper.params.cssMode && swiper.autoplay.running) { swiper.autoplay.run(); }
7784      }, delay);
7785    },
7786    start: function start() {
7787      var swiper = this;
7788      if (typeof swiper.autoplay.timeout !== 'undefined') { return false; }
7789      if (swiper.autoplay.running) { return false; }
7790      swiper.autoplay.running = true;
7791      swiper.emit('autoplayStart');
7792      swiper.autoplay.run();
7793      return true;
7794    },
7795    stop: function stop() {
7796      var swiper = this;
7797      if (!swiper.autoplay.running) { return false; }
7798      if (typeof swiper.autoplay.timeout === 'undefined') { return false; }
7799
7800      if (swiper.autoplay.timeout) {
7801        clearTimeout(swiper.autoplay.timeout);
7802        swiper.autoplay.timeout = undefined;
7803      }
7804      swiper.autoplay.running = false;
7805      swiper.emit('autoplayStop');
7806      return true;
7807    },
7808    pause: function pause(speed) {
7809      var swiper = this;
7810      if (!swiper.autoplay.running) { return; }
7811      if (swiper.autoplay.paused) { return; }
7812      if (swiper.autoplay.timeout) { clearTimeout(swiper.autoplay.timeout); }
7813      swiper.autoplay.paused = true;
7814      if (speed === 0 || !swiper.params.autoplay.waitForTransition) {
7815        swiper.autoplay.paused = false;
7816        swiper.autoplay.run();
7817      } else {
7818        swiper.$wrapperEl[0].addEventListener('transitionend', swiper.autoplay.onTransitionEnd);
7819        swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd);
7820      }
7821    },
7822  };
7823
7824  var Autoplay$1 = {
7825    name: 'autoplay',
7826    params: {
7827      autoplay: {
7828        enabled: false,
7829        delay: 3000,
7830        waitForTransition: true,
7831        disableOnInteraction: true,
7832        stopOnLastSlide: false,
7833        reverseDirection: false,
7834      },
7835    },
7836    create: function create() {
7837      var swiper = this;
7838      Utils.extend(swiper, {
7839        autoplay: {
7840          running: false,
7841          paused: false,
7842          run: Autoplay.run.bind(swiper),
7843          start: Autoplay.start.bind(swiper),
7844          stop: Autoplay.stop.bind(swiper),
7845          pause: Autoplay.pause.bind(swiper),
7846          onVisibilityChange: function onVisibilityChange() {
7847            if (document.visibilityState === 'hidden' && swiper.autoplay.running) {
7848              swiper.autoplay.pause();
7849            }
7850            if (document.visibilityState === 'visible' && swiper.autoplay.paused) {
7851              swiper.autoplay.run();
7852              swiper.autoplay.paused = false;
7853            }
7854          },
7855          onTransitionEnd: function onTransitionEnd(e) {
7856            if (!swiper || swiper.destroyed || !swiper.$wrapperEl) { return; }
7857            if (e.target !== this) { return; }
7858            swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.autoplay.onTransitionEnd);
7859            swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd);
7860            swiper.autoplay.paused = false;
7861            if (!swiper.autoplay.running) {
7862              swiper.autoplay.stop();
7863            } else {
7864              swiper.autoplay.run();
7865            }
7866          },
7867        },
7868      });
7869    },
7870    on: {
7871      init: function init() {
7872        var swiper = this;
7873        if (swiper.params.autoplay.enabled) {
7874          swiper.autoplay.start();
7875          document.addEventListener('visibilitychange', swiper.autoplay.onVisibilityChange);
7876        }
7877      },
7878      beforeTransitionStart: function beforeTransitionStart(speed, internal) {
7879        var swiper = this;
7880        if (swiper.autoplay.running) {
7881          if (internal || !swiper.params.autoplay.disableOnInteraction) {
7882            swiper.autoplay.pause(speed);
7883          } else {
7884            swiper.autoplay.stop();
7885          }
7886        }
7887      },
7888      sliderFirstMove: function sliderFirstMove() {
7889        var swiper = this;
7890        if (swiper.autoplay.running) {
7891          if (swiper.params.autoplay.disableOnInteraction) {
7892            swiper.autoplay.stop();
7893          } else {
7894            swiper.autoplay.pause();
7895          }
7896        }
7897      },
7898      touchEnd: function touchEnd() {
7899        var swiper = this;
7900        if (swiper.params.cssMode && swiper.autoplay.paused && !swiper.params.autoplay.disableOnInteraction) {
7901          swiper.autoplay.run();
7902        }
7903      },
7904      destroy: function destroy() {
7905        var swiper = this;
7906        if (swiper.autoplay.running) {
7907          swiper.autoplay.stop();
7908        }
7909        document.removeEventListener('visibilitychange', swiper.autoplay.onVisibilityChange);
7910      },
7911    },
7912  };
7913
7914  var Fade = {
7915    setTranslate: function setTranslate() {
7916      var swiper = this;
7917      var slides = swiper.slides;
7918      for (var i = 0; i < slides.length; i += 1) {
7919        var $slideEl = swiper.slides.eq(i);
7920        var offset = $slideEl[0].swiperSlideOffset;
7921        var tx = -offset;
7922        if (!swiper.params.virtualTranslate) { tx -= swiper.translate; }
7923        var ty = 0;
7924        if (!swiper.isHorizontal()) {
7925          ty = tx;
7926          tx = 0;
7927        }
7928        var slideOpacity = swiper.params.fadeEffect.crossFade
7929          ? Math.max(1 - Math.abs($slideEl[0].progress), 0)
7930          : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0);
7931        $slideEl
7932          .css({
7933            opacity: slideOpacity,
7934          })
7935          .transform(("translate3d(" + tx + "px, " + ty + "px, 0px)"));
7936      }
7937    },
7938    setTransition: function setTransition(duration) {
7939      var swiper = this;
7940      var slides = swiper.slides;
7941      var $wrapperEl = swiper.$wrapperEl;
7942      slides.transition(duration);
7943      if (swiper.params.virtualTranslate && duration !== 0) {
7944        var eventTriggered = false;
7945        slides.transitionEnd(function () {
7946          if (eventTriggered) { return; }
7947          if (!swiper || swiper.destroyed) { return; }
7948          eventTriggered = true;
7949          swiper.animating = false;
7950          var triggerEvents = ['webkitTransitionEnd', 'transitionend'];
7951          for (var i = 0; i < triggerEvents.length; i += 1) {
7952            $wrapperEl.trigger(triggerEvents[i]);
7953          }
7954        });
7955      }
7956    },
7957  };
7958
7959  var EffectFade = {
7960    name: 'effect-fade',
7961    params: {
7962      fadeEffect: {
7963        crossFade: false,
7964      },
7965    },
7966    create: function create() {
7967      var swiper = this;
7968      Utils.extend(swiper, {
7969        fadeEffect: {
7970          setTranslate: Fade.setTranslate.bind(swiper),
7971          setTransition: Fade.setTransition.bind(swiper),
7972        },
7973      });
7974    },
7975    on: {
7976      beforeInit: function beforeInit() {
7977        var swiper = this;
7978        if (swiper.params.effect !== 'fade') { return; }
7979        swiper.classNames.push(((swiper.params.containerModifierClass) + "fade"));
7980        var overwriteParams = {
7981          slidesPerView: 1,
7982          slidesPerColumn: 1,
7983          slidesPerGroup: 1,
7984          watchSlidesProgress: true,
7985          spaceBetween: 0,
7986          virtualTranslate: true,
7987        };
7988        Utils.extend(swiper.params, overwriteParams);
7989        Utils.extend(swiper.originalParams, overwriteParams);
7990      },
7991      setTranslate: function setTranslate() {
7992        var swiper = this;
7993        if (swiper.params.effect !== 'fade') { return; }
7994        swiper.fadeEffect.setTranslate();
7995      },
7996      setTransition: function setTransition(duration) {
7997        var swiper = this;
7998        if (swiper.params.effect !== 'fade') { return; }
7999        swiper.fadeEffect.setTransition(duration);
8000      },
8001    },
8002  };
8003
8004  var Cube = {
8005    setTranslate: function setTranslate() {
8006      var swiper = this;
8007      var $el = swiper.$el;
8008      var $wrapperEl = swiper.$wrapperEl;
8009      var slides = swiper.slides;
8010      var swiperWidth = swiper.width;
8011      var swiperHeight = swiper.height;
8012      var rtl = swiper.rtlTranslate;
8013      var swiperSize = swiper.size;
8014      var params = swiper.params.cubeEffect;
8015      var isHorizontal = swiper.isHorizontal();
8016      var isVirtual = swiper.virtual && swiper.params.virtual.enabled;
8017      var wrapperRotate = 0;
8018      var $cubeShadowEl;
8019      if (params.shadow) {
8020        if (isHorizontal) {
8021          $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow');
8022          if ($cubeShadowEl.length === 0) {
8023            $cubeShadowEl = $('<div class="swiper-cube-shadow"></div>');
8024            $wrapperEl.append($cubeShadowEl);
8025          }
8026          $cubeShadowEl.css({ height: (swiperWidth + "px") });
8027        } else {
8028          $cubeShadowEl = $el.find('.swiper-cube-shadow');
8029          if ($cubeShadowEl.length === 0) {
8030            $cubeShadowEl = $('<div class="swiper-cube-shadow"></div>');
8031            $el.append($cubeShadowEl);
8032          }
8033        }
8034      }
8035      for (var i = 0; i < slides.length; i += 1) {
8036        var $slideEl = slides.eq(i);
8037        var slideIndex = i;
8038        if (isVirtual) {
8039          slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10);
8040        }
8041        var slideAngle = slideIndex * 90;
8042        var round = Math.floor(slideAngle / 360);
8043        if (rtl) {
8044          slideAngle = -slideAngle;
8045          round = Math.floor(-slideAngle / 360);
8046        }
8047        var progress = Math.max(Math.min($slideEl[0].progress, 1), -1);
8048        var tx = 0;
8049        var ty = 0;
8050        var tz = 0;
8051        if (slideIndex % 4 === 0) {
8052          tx = -round * 4 * swiperSize;
8053          tz = 0;
8054        } else if ((slideIndex - 1) % 4 === 0) {
8055          tx = 0;
8056          tz = -round * 4 * swiperSize;
8057        } else if ((slideIndex - 2) % 4 === 0) {
8058          tx = swiperSize + (round * 4 * swiperSize);
8059          tz = swiperSize;
8060        } else if ((slideIndex - 3) % 4 === 0) {
8061          tx = -swiperSize;
8062          tz = (3 * swiperSize) + (swiperSize * 4 * round);
8063        }
8064        if (rtl) {
8065          tx = -tx;
8066        }
8067
8068        if (!isHorizontal) {
8069          ty = tx;
8070          tx = 0;
8071        }
8072
8073        var transform = "rotateX(" + (isHorizontal ? 0 : -slideAngle) + "deg) rotateY(" + (isHorizontal ? slideAngle : 0) + "deg) translate3d(" + tx + "px, " + ty + "px, " + tz + "px)";
8074        if (progress <= 1 && progress > -1) {
8075          wrapperRotate = (slideIndex * 90) + (progress * 90);
8076          if (rtl) { wrapperRotate = (-slideIndex * 90) - (progress * 90); }
8077        }
8078        $slideEl.transform(transform);
8079        if (params.slideShadows) {
8080          // Set shadows
8081          var shadowBefore = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
8082          var shadowAfter = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
8083          if (shadowBefore.length === 0) {
8084            shadowBefore = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'left' : 'top') + "\"></div>"));
8085            $slideEl.append(shadowBefore);
8086          }
8087          if (shadowAfter.length === 0) {
8088            shadowAfter = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'right' : 'bottom') + "\"></div>"));
8089            $slideEl.append(shadowAfter);
8090          }
8091          if (shadowBefore.length) { shadowBefore[0].style.opacity = Math.max(-progress, 0); }
8092          if (shadowAfter.length) { shadowAfter[0].style.opacity = Math.max(progress, 0); }
8093        }
8094      }
8095      $wrapperEl.css({
8096        '-webkit-transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
8097        '-moz-transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
8098        '-ms-transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
8099        'transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
8100      });
8101
8102      if (params.shadow) {
8103        if (isHorizontal) {
8104          $cubeShadowEl.transform(("translate3d(0px, " + ((swiperWidth / 2) + params.shadowOffset) + "px, " + (-swiperWidth / 2) + "px) rotateX(90deg) rotateZ(0deg) scale(" + (params.shadowScale) + ")"));
8105        } else {
8106          var shadowAngle = Math.abs(wrapperRotate) - (Math.floor(Math.abs(wrapperRotate) / 90) * 90);
8107          var multiplier = 1.5 - (
8108            (Math.sin((shadowAngle * 2 * Math.PI) / 360) / 2)
8109            + (Math.cos((shadowAngle * 2 * Math.PI) / 360) / 2)
8110          );
8111          var scale1 = params.shadowScale;
8112          var scale2 = params.shadowScale / multiplier;
8113          var offset = params.shadowOffset;
8114          $cubeShadowEl.transform(("scale3d(" + scale1 + ", 1, " + scale2 + ") translate3d(0px, " + ((swiperHeight / 2) + offset) + "px, " + (-swiperHeight / 2 / scale2) + "px) rotateX(-90deg)"));
8115        }
8116      }
8117      var zFactor = (Browser.isSafari || Browser.isUiWebView) ? (-swiperSize / 2) : 0;
8118      $wrapperEl
8119        .transform(("translate3d(0px,0," + zFactor + "px) rotateX(" + (swiper.isHorizontal() ? 0 : wrapperRotate) + "deg) rotateY(" + (swiper.isHorizontal() ? -wrapperRotate : 0) + "deg)"));
8120    },
8121    setTransition: function setTransition(duration) {
8122      var swiper = this;
8123      var $el = swiper.$el;
8124      var slides = swiper.slides;
8125      slides
8126        .transition(duration)
8127        .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')
8128        .transition(duration);
8129      if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {
8130        $el.find('.swiper-cube-shadow').transition(duration);
8131      }
8132    },
8133  };
8134
8135  var EffectCube = {
8136    name: 'effect-cube',
8137    params: {
8138      cubeEffect: {
8139        slideShadows: true,
8140        shadow: true,
8141        shadowOffset: 20,
8142        shadowScale: 0.94,
8143      },
8144    },
8145    create: function create() {
8146      var swiper = this;
8147      Utils.extend(swiper, {
8148        cubeEffect: {
8149          setTranslate: Cube.setTranslate.bind(swiper),
8150          setTransition: Cube.setTransition.bind(swiper),
8151        },
8152      });
8153    },
8154    on: {
8155      beforeInit: function beforeInit() {
8156        var swiper = this;
8157        if (swiper.params.effect !== 'cube') { return; }
8158        swiper.classNames.push(((swiper.params.containerModifierClass) + "cube"));
8159        swiper.classNames.push(((swiper.params.containerModifierClass) + "3d"));
8160        var overwriteParams = {
8161          slidesPerView: 1,
8162          slidesPerColumn: 1,
8163          slidesPerGroup: 1,
8164          watchSlidesProgress: true,
8165          resistanceRatio: 0,
8166          spaceBetween: 0,
8167          centeredSlides: false,
8168          virtualTranslate: true,
8169        };
8170        Utils.extend(swiper.params, overwriteParams);
8171        Utils.extend(swiper.originalParams, overwriteParams);
8172      },
8173      setTranslate: function setTranslate() {
8174        var swiper = this;
8175        if (swiper.params.effect !== 'cube') { return; }
8176        swiper.cubeEffect.setTranslate();
8177      },
8178      setTransition: function setTransition(duration) {
8179        var swiper = this;
8180        if (swiper.params.effect !== 'cube') { return; }
8181        swiper.cubeEffect.setTransition(duration);
8182      },
8183    },
8184  };
8185
8186  var Flip = {
8187    setTranslate: function setTranslate() {
8188      var swiper = this;
8189      var slides = swiper.slides;
8190      var rtl = swiper.rtlTranslate;
8191      for (var i = 0; i < slides.length; i += 1) {
8192        var $slideEl = slides.eq(i);
8193        var progress = $slideEl[0].progress;
8194        if (swiper.params.flipEffect.limitRotation) {
8195          progress = Math.max(Math.min($slideEl[0].progress, 1), -1);
8196        }
8197        var offset = $slideEl[0].swiperSlideOffset;
8198        var rotate = -180 * progress;
8199        var rotateY = rotate;
8200        var rotateX = 0;
8201        var tx = -offset;
8202        var ty = 0;
8203        if (!swiper.isHorizontal()) {
8204          ty = tx;
8205          tx = 0;
8206          rotateX = -rotateY;
8207          rotateY = 0;
8208        } else if (rtl) {
8209          rotateY = -rotateY;
8210        }
8211
8212        $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length;
8213
8214        if (swiper.params.flipEffect.slideShadows) {
8215          // Set shadows
8216          var shadowBefore = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
8217          var shadowAfter = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
8218          if (shadowBefore.length === 0) {
8219            shadowBefore = $(("<div class=\"swiper-slide-shadow-" + (swiper.isHorizontal() ? 'left' : 'top') + "\"></div>"));
8220            $slideEl.append(shadowBefore);
8221          }
8222          if (shadowAfter.length === 0) {
8223            shadowAfter = $(("<div class=\"swiper-slide-shadow-" + (swiper.isHorizontal() ? 'right' : 'bottom') + "\"></div>"));
8224            $slideEl.append(shadowAfter);
8225          }
8226          if (shadowBefore.length) { shadowBefore[0].style.opacity = Math.max(-progress, 0); }
8227          if (shadowAfter.length) { shadowAfter[0].style.opacity = Math.max(progress, 0); }
8228        }
8229        $slideEl
8230          .transform(("translate3d(" + tx + "px, " + ty + "px, 0px) rotateX(" + rotateX + "deg) rotateY(" + rotateY + "deg)"));
8231      }
8232    },
8233    setTransition: function setTransition(duration) {
8234      var swiper = this;
8235      var slides = swiper.slides;
8236      var activeIndex = swiper.activeIndex;
8237      var $wrapperEl = swiper.$wrapperEl;
8238      slides
8239        .transition(duration)
8240        .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')
8241        .transition(duration);
8242      if (swiper.params.virtualTranslate && duration !== 0) {
8243        var eventTriggered = false;
8244        // eslint-disable-next-line
8245        slides.eq(activeIndex).transitionEnd(function onTransitionEnd() {
8246          if (eventTriggered) { return; }
8247          if (!swiper || swiper.destroyed) { return; }
8248          // if (!$(this).hasClass(swiper.params.slideActiveClass)) return;
8249          eventTriggered = true;
8250          swiper.animating = false;
8251          var triggerEvents = ['webkitTransitionEnd', 'transitionend'];
8252          for (var i = 0; i < triggerEvents.length; i += 1) {
8253            $wrapperEl.trigger(triggerEvents[i]);
8254          }
8255        });
8256      }
8257    },
8258  };
8259
8260  var EffectFlip = {
8261    name: 'effect-flip',
8262    params: {
8263      flipEffect: {
8264        slideShadows: true,
8265        limitRotation: true,
8266      },
8267    },
8268    create: function create() {
8269      var swiper = this;
8270      Utils.extend(swiper, {
8271        flipEffect: {
8272          setTranslate: Flip.setTranslate.bind(swiper),
8273          setTransition: Flip.setTransition.bind(swiper),
8274        },
8275      });
8276    },
8277    on: {
8278      beforeInit: function beforeInit() {
8279        var swiper = this;
8280        if (swiper.params.effect !== 'flip') { return; }
8281        swiper.classNames.push(((swiper.params.containerModifierClass) + "flip"));
8282        swiper.classNames.push(((swiper.params.containerModifierClass) + "3d"));
8283        var overwriteParams = {
8284          slidesPerView: 1,
8285          slidesPerColumn: 1,
8286          slidesPerGroup: 1,
8287          watchSlidesProgress: true,
8288          spaceBetween: 0,
8289          virtualTranslate: true,
8290        };
8291        Utils.extend(swiper.params, overwriteParams);
8292        Utils.extend(swiper.originalParams, overwriteParams);
8293      },
8294      setTranslate: function setTranslate() {
8295        var swiper = this;
8296        if (swiper.params.effect !== 'flip') { return; }
8297        swiper.flipEffect.setTranslate();
8298      },
8299      setTransition: function setTransition(duration) {
8300        var swiper = this;
8301        if (swiper.params.effect !== 'flip') { return; }
8302        swiper.flipEffect.setTransition(duration);
8303      },
8304    },
8305  };
8306
8307  var Coverflow = {
8308    setTranslate: function setTranslate() {
8309      var swiper = this;
8310      var swiperWidth = swiper.width;
8311      var swiperHeight = swiper.height;
8312      var slides = swiper.slides;
8313      var $wrapperEl = swiper.$wrapperEl;
8314      var slidesSizesGrid = swiper.slidesSizesGrid;
8315      var params = swiper.params.coverflowEffect;
8316      var isHorizontal = swiper.isHorizontal();
8317      var transform = swiper.translate;
8318      var center = isHorizontal ? -transform + (swiperWidth / 2) : -transform + (swiperHeight / 2);
8319      var rotate = isHorizontal ? params.rotate : -params.rotate;
8320      var translate = params.depth;
8321      // Each slide offset from center
8322      for (var i = 0, length = slides.length; i < length; i += 1) {
8323        var $slideEl = slides.eq(i);
8324        var slideSize = slidesSizesGrid[i];
8325        var slideOffset = $slideEl[0].swiperSlideOffset;
8326        var offsetMultiplier = ((center - slideOffset - (slideSize / 2)) / slideSize) * params.modifier;
8327
8328        var rotateY = isHorizontal ? rotate * offsetMultiplier : 0;
8329        var rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;
8330        // var rotateZ = 0
8331        var translateZ = -translate * Math.abs(offsetMultiplier);
8332
8333        var stretch = params.stretch;
8334        // Allow percentage to make a relative stretch for responsive sliders
8335        if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) {
8336          stretch = ((parseFloat(params.stretch) / 100) * slideSize);
8337        }
8338        var translateY = isHorizontal ? 0 : stretch * (offsetMultiplier);
8339        var translateX = isHorizontal ? stretch * (offsetMultiplier) : 0;
8340
8341        // Fix for ultra small values
8342        if (Math.abs(translateX) < 0.001) { translateX = 0; }
8343        if (Math.abs(translateY) < 0.001) { translateY = 0; }
8344        if (Math.abs(translateZ) < 0.001) { translateZ = 0; }
8345        if (Math.abs(rotateY) < 0.001) { rotateY = 0; }
8346        if (Math.abs(rotateX) < 0.001) { rotateX = 0; }
8347
8348        var slideTransform = "translate3d(" + translateX + "px," + translateY + "px," + translateZ + "px)  rotateX(" + rotateX + "deg) rotateY(" + rotateY + "deg)";
8349
8350        $slideEl.transform(slideTransform);
8351        $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;
8352        if (params.slideShadows) {
8353          // Set shadows
8354          var $shadowBeforeEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
8355          var $shadowAfterEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
8356          if ($shadowBeforeEl.length === 0) {
8357            $shadowBeforeEl = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'left' : 'top') + "\"></div>"));
8358            $slideEl.append($shadowBeforeEl);
8359          }
8360          if ($shadowAfterEl.length === 0) {
8361            $shadowAfterEl = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'right' : 'bottom') + "\"></div>"));
8362            $slideEl.append($shadowAfterEl);
8363          }
8364          if ($shadowBeforeEl.length) { $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0; }
8365          if ($shadowAfterEl.length) { $shadowAfterEl[0].style.opacity = (-offsetMultiplier) > 0 ? -offsetMultiplier : 0; }
8366        }
8367      }
8368
8369      // Set correct perspective for IE10
8370      if (Support.pointerEvents || Support.prefixedPointerEvents) {
8371        var ws = $wrapperEl[0].style;
8372        ws.perspectiveOrigin = center + "px 50%";
8373      }
8374    },
8375    setTransition: function setTransition(duration) {
8376      var swiper = this;
8377      swiper.slides
8378        .transition(duration)
8379        .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')
8380        .transition(duration);
8381    },
8382  };
8383
8384  var EffectCoverflow = {
8385    name: 'effect-coverflow',
8386    params: {
8387      coverflowEffect: {
8388        rotate: 50,
8389        stretch: 0,
8390        depth: 100,
8391        modifier: 1,
8392        slideShadows: true,
8393      },
8394    },
8395    create: function create() {
8396      var swiper = this;
8397      Utils.extend(swiper, {
8398        coverflowEffect: {
8399          setTranslate: Coverflow.setTranslate.bind(swiper),
8400          setTransition: Coverflow.setTransition.bind(swiper),
8401        },
8402      });
8403    },
8404    on: {
8405      beforeInit: function beforeInit() {
8406        var swiper = this;
8407        if (swiper.params.effect !== 'coverflow') { return; }
8408
8409        swiper.classNames.push(((swiper.params.containerModifierClass) + "coverflow"));
8410        swiper.classNames.push(((swiper.params.containerModifierClass) + "3d"));
8411
8412        swiper.params.watchSlidesProgress = true;
8413        swiper.originalParams.watchSlidesProgress = true;
8414      },
8415      setTranslate: function setTranslate() {
8416        var swiper = this;
8417        if (swiper.params.effect !== 'coverflow') { return; }
8418        swiper.coverflowEffect.setTranslate();
8419      },
8420      setTransition: function setTransition(duration) {
8421        var swiper = this;
8422        if (swiper.params.effect !== 'coverflow') { return; }
8423        swiper.coverflowEffect.setTransition(duration);
8424      },
8425    },
8426  };
8427
8428  var Thumbs = {
8429    init: function init() {
8430      var swiper = this;
8431      var ref = swiper.params;
8432      var thumbsParams = ref.thumbs;
8433      var SwiperClass = swiper.constructor;
8434      if (thumbsParams.swiper instanceof SwiperClass) {
8435        swiper.thumbs.swiper = thumbsParams.swiper;
8436        Utils.extend(swiper.thumbs.swiper.originalParams, {
8437          watchSlidesProgress: true,
8438          slideToClickedSlide: false,
8439        });
8440        Utils.extend(swiper.thumbs.swiper.params, {
8441          watchSlidesProgress: true,
8442          slideToClickedSlide: false,
8443        });
8444      } else if (Utils.isObject(thumbsParams.swiper)) {
8445        swiper.thumbs.swiper = new SwiperClass(Utils.extend({}, thumbsParams.swiper, {
8446          watchSlidesVisibility: true,
8447          watchSlidesProgress: true,
8448          slideToClickedSlide: false,
8449        }));
8450        swiper.thumbs.swiperCreated = true;
8451      }
8452      swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass);
8453      swiper.thumbs.swiper.on('tap', swiper.thumbs.onThumbClick);
8454    },
8455    onThumbClick: function onThumbClick() {
8456      var swiper = this;
8457      var thumbsSwiper = swiper.thumbs.swiper;
8458      if (!thumbsSwiper) { return; }
8459      var clickedIndex = thumbsSwiper.clickedIndex;
8460      var clickedSlide = thumbsSwiper.clickedSlide;
8461      if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass)) { return; }
8462      if (typeof clickedIndex === 'undefined' || clickedIndex === null) { return; }
8463      var slideToIndex;
8464      if (thumbsSwiper.params.loop) {
8465        slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10);
8466      } else {
8467        slideToIndex = clickedIndex;
8468      }
8469      if (swiper.params.loop) {
8470        var currentIndex = swiper.activeIndex;
8471        if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) {
8472          swiper.loopFix();
8473          // eslint-disable-next-line
8474          swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
8475          currentIndex = swiper.activeIndex;
8476        }
8477        var prevIndex = swiper.slides.eq(currentIndex).prevAll(("[data-swiper-slide-index=\"" + slideToIndex + "\"]")).eq(0).index();
8478        var nextIndex = swiper.slides.eq(currentIndex).nextAll(("[data-swiper-slide-index=\"" + slideToIndex + "\"]")).eq(0).index();
8479        if (typeof prevIndex === 'undefined') { slideToIndex = nextIndex; }
8480        else if (typeof nextIndex === 'undefined') { slideToIndex = prevIndex; }
8481        else if (nextIndex - currentIndex < currentIndex - prevIndex) { slideToIndex = nextIndex; }
8482        else { slideToIndex = prevIndex; }
8483      }
8484      swiper.slideTo(slideToIndex);
8485    },
8486    update: function update(initial) {
8487      var swiper = this;
8488      var thumbsSwiper = swiper.thumbs.swiper;
8489      if (!thumbsSwiper) { return; }
8490
8491      var slidesPerView = thumbsSwiper.params.slidesPerView === 'auto'
8492        ? thumbsSwiper.slidesPerViewDynamic()
8493        : thumbsSwiper.params.slidesPerView;
8494
8495      if (swiper.realIndex !== thumbsSwiper.realIndex) {
8496        var currentThumbsIndex = thumbsSwiper.activeIndex;
8497        var newThumbsIndex;
8498        if (thumbsSwiper.params.loop) {
8499          if (thumbsSwiper.slides.eq(currentThumbsIndex).hasClass(thumbsSwiper.params.slideDuplicateClass)) {
8500            thumbsSwiper.loopFix();
8501            // eslint-disable-next-line
8502            thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft;
8503            currentThumbsIndex = thumbsSwiper.activeIndex;
8504          }
8505          // Find actual thumbs index to slide to
8506          var prevThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).prevAll(("[data-swiper-slide-index=\"" + (swiper.realIndex) + "\"]")).eq(0).index();
8507          var nextThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).nextAll(("[data-swiper-slide-index=\"" + (swiper.realIndex) + "\"]")).eq(0).index();
8508          if (typeof prevThumbsIndex === 'undefined') { newThumbsIndex = nextThumbsIndex; }
8509          else if (typeof nextThumbsIndex === 'undefined') { newThumbsIndex = prevThumbsIndex; }
8510          else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) { newThumbsIndex = currentThumbsIndex; }
8511          else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) { newThumbsIndex = nextThumbsIndex; }
8512          else { newThumbsIndex = prevThumbsIndex; }
8513        } else {
8514          newThumbsIndex = swiper.realIndex;
8515        }
8516        if (thumbsSwiper.visibleSlidesIndexes && thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) {
8517          if (thumbsSwiper.params.centeredSlides) {
8518            if (newThumbsIndex > currentThumbsIndex) {
8519              newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;
8520            } else {
8521              newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;
8522            }
8523          } else if (newThumbsIndex > currentThumbsIndex) {
8524            newThumbsIndex = newThumbsIndex - slidesPerView + 1;
8525          }
8526          thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);
8527        }
8528      }
8529
8530      // Activate thumbs
8531      var thumbsToActivate = 1;
8532      var thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;
8533
8534      if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {
8535        thumbsToActivate = swiper.params.slidesPerView;
8536      }
8537
8538      if (!swiper.params.thumbs.multipleActiveThumbs) {
8539        thumbsToActivate = 1;
8540      }
8541
8542      thumbsToActivate = Math.floor(thumbsToActivate);
8543
8544      thumbsSwiper.slides.removeClass(thumbActiveClass);
8545      if (thumbsSwiper.params.loop || (thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled)) {
8546        for (var i = 0; i < thumbsToActivate; i += 1) {
8547          thumbsSwiper.$wrapperEl.children(("[data-swiper-slide-index=\"" + (swiper.realIndex + i) + "\"]")).addClass(thumbActiveClass);
8548        }
8549      } else {
8550        for (var i$1 = 0; i$1 < thumbsToActivate; i$1 += 1) {
8551          thumbsSwiper.slides.eq(swiper.realIndex + i$1).addClass(thumbActiveClass);
8552        }
8553      }
8554    },
8555  };
8556  var Thumbs$1 = {
8557    name: 'thumbs',
8558    params: {
8559      thumbs: {
8560        multipleActiveThumbs: true,
8561        swiper: null,
8562        slideThumbActiveClass: 'swiper-slide-thumb-active',
8563        thumbsContainerClass: 'swiper-container-thumbs',
8564      },
8565    },
8566    create: function create() {
8567      var swiper = this;
8568      Utils.extend(swiper, {
8569        thumbs: {
8570          swiper: null,
8571          init: Thumbs.init.bind(swiper),
8572          update: Thumbs.update.bind(swiper),
8573          onThumbClick: Thumbs.onThumbClick.bind(swiper),
8574        },
8575      });
8576    },
8577    on: {
8578      beforeInit: function beforeInit() {
8579        var swiper = this;
8580        var ref = swiper.params;
8581        var thumbs = ref.thumbs;
8582        if (!thumbs || !thumbs.swiper) { return; }
8583        swiper.thumbs.init();
8584        swiper.thumbs.update(true);
8585      },
8586      slideChange: function slideChange() {
8587        var swiper = this;
8588        if (!swiper.thumbs.swiper) { return; }
8589        swiper.thumbs.update();
8590      },
8591      update: function update() {
8592        var swiper = this;
8593        if (!swiper.thumbs.swiper) { return; }
8594        swiper.thumbs.update();
8595      },
8596      resize: function resize() {
8597        var swiper = this;
8598        if (!swiper.thumbs.swiper) { return; }
8599        swiper.thumbs.update();
8600      },
8601      observerUpdate: function observerUpdate() {
8602        var swiper = this;
8603        if (!swiper.thumbs.swiper) { return; }
8604        swiper.thumbs.update();
8605      },
8606      setTransition: function setTransition(duration) {
8607        var swiper = this;
8608        var thumbsSwiper = swiper.thumbs.swiper;
8609        if (!thumbsSwiper) { return; }
8610        thumbsSwiper.setTransition(duration);
8611      },
8612      beforeDestroy: function beforeDestroy() {
8613        var swiper = this;
8614        var thumbsSwiper = swiper.thumbs.swiper;
8615        if (!thumbsSwiper) { return; }
8616        if (swiper.thumbs.swiperCreated && thumbsSwiper) {
8617          thumbsSwiper.destroy();
8618        }
8619      },
8620    },
8621  };
8622
8623  // Swiper Class
8624
8625  var components = [
8626    Device$1,
8627    Support$1,
8628    Browser$1,
8629    Resize,
8630    Observer$1,
8631    Virtual$1,
8632    Keyboard$1,
8633    Mousewheel$1,
8634    Navigation$1,
8635    Pagination$1,
8636    Scrollbar$1,
8637    Parallax$1,
8638    Zoom$1,
8639    Lazy$1,
8640    Controller$1,
8641    A11y,
8642    History$1,
8643    HashNavigation$1,
8644    Autoplay$1,
8645    EffectFade,
8646    EffectCube,
8647    EffectFlip,
8648    EffectCoverflow,
8649    Thumbs$1
8650  ];
8651
8652  if (typeof Swiper.use === 'undefined') {
8653    Swiper.use = Swiper.Class.use;
8654    Swiper.installModule = Swiper.Class.installModule;
8655  }
8656
8657  Swiper.use(components);
8658
8659  return Swiper;
8660
8661}));

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.