PageSourceSearch

https://www.eetasia.com/wp-content/themes/aspencoreasia/js/swiper-bundle.js

js eetasia.com collected 2026-09-24 17:36:30 UTC 339,082 bytes, 10,702 lines download raw bytes

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

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.