PageSourceSearch

https://caseconverter.tools/wp-content/plugins/ultimate-blocks/src…/image-slider/swiper-bundle.js?ver=3.5.8

js caseconverter.tools collected 2026-09-30 03:24:03 UTC 323,444 bytes, 9,862 lines download raw bytes

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

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.