PageSourceSearch

https://jfm.or.jp/js/swiper.js

js jfm.or.jp collected 2026-10-02 11:20:36 UTC 274,822 bytes, 7,986 lines download raw bytes

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

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.