CINXE.COM
M88 Online Casino & Bookmaker Review: Bonuses for MY, SG, ID, VN
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>M88 Online Casino & Bookmaker Review: Bonuses for MY, SG, ID, VN</title> <link rel="icon" href="/wp-content/uploads/2022/11/favicon.svg" sizes="32x32"/> <link rel="icon" href="/wp-content/uploads/2022/11/favicon.svg" sizes="192x192"/> <link rel="apple-touch-icon" href="/wp-content/uploads/2022/11/favicon.svg"/> <meta name="msapplication-TileImage" content="/wp-content/uploads/2022/11/favicon.svg"/> <style> /* montserrat-regular - latin-ext_latin */ @font-face { font-family: 'Montserrat'; font-style: normal; font-weight: 400; font-display: swap; src: url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-regular.eot'); /* IE9 Compat Modes */ src: local(''), url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-regular.woff') format('woff'), /* Modern Browsers */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-regular.svg#Montserrat') format('svg'); /* Legacy iOS */ } /* montserrat-600 - latin-ext_latin */ @font-face { font-family: 'Montserrat'; font-style: normal; font-weight: 600; font-display: swap; src: url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-600.eot'); /* IE9 Compat Modes */ src: local(''), url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-600.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-600.woff2') format('woff2'), /* Super Modern Browsers */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-600.woff') format('woff'), /* Modern Browsers */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-600.ttf') format('truetype'), /* Safari, Android, iOS */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-600.svg#Montserrat') format('svg'); /* Legacy iOS */ } /* montserrat-500 - latin-ext_latin */ @font-face { font-family: 'Montserrat'; font-style: normal; font-weight: 500; font-display: swap; src: url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-500.eot'); /* IE9 Compat Modes */ src: local(''), url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-500.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-500.woff2') format('woff2'), /* Super Modern Browsers */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-500.woff') format('woff'), /* Modern Browsers */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-500.ttf') format('truetype'), /* Safari, Android, iOS */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-500.svg#Montserrat') format('svg'); /* Legacy iOS */ } /* montserrat-700 - latin-ext_latin */ @font-face { font-family: 'Montserrat'; font-style: normal; font-weight: 700; font-display: swap; src: url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-700.eot'); /* IE9 Compat Modes */ src: local(''), url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-700.woff2') format('woff2'), /* Super Modern Browsers */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-700.woff') format('woff'), /* Modern Browsers */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-700.ttf') format('truetype'), /* Safari, Android, iOS */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-700.svg#Montserrat') format('svg'); /* Legacy iOS */ } </style> <link rel="dns-prefetch" href="https://www.google-analytics.com"> <link rel="preconnect" href="https://www.google-analytics.com"> <link rel="dns-prefetch" href="https://www.googletagmanager.com"> <link rel="dns-prefetch" href="https://www.googletagmanager.com"> <link rel="dns-prefetch" href="https://images.dmca.com"> <link rel="preconnect" href="https://images.dmca.com"> <meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' /> <style>img:is([sizes="auto" i], [sizes^="auto," i]) { contain-intrinsic-size: 3000px 1500px }</style> <!-- This site is optimized with the Yoast SEO plugin v24.5 - https://yoast.com/wordpress/plugins/seo/ --> <meta name="description" content="M88 Mansion online casino and bookmaker review in 2024! ⭐ Get a M88 Mansion Bonus! ✅ Is M88 Mansion a legal, safe and trusted gambling site for Asian Punters? ✅ Reg&Bet with AsiaBetting.Online!" /> <link rel="canonical" href="https://asian-bookies.net/review/m88/" /> <meta property="og:locale" content="en_GB" /> <meta property="og:type" content="article" /> <meta property="og:title" content="M88 Online Casino & Bookmaker Review: Bonuses for MY, SG, ID, VN" /> <meta property="og:description" content="M88 Mansion online casino and bookmaker review in 2024! ⭐ Get a M88 Mansion Bonus! ✅ Is M88 Mansion a legal, safe and trusted gambling site for Asian Punters? ✅ Reg&Bet with AsiaBetting.Online!" /> <meta property="og:url" content="https://asian-bookies.net/review/m88/" /> <meta property="og:site_name" content="96 Bets Asia" /> <meta property="article:publisher" content="https://www.facebook.com/AsianBookiesNet" /> <meta property="article:modified_time" content="2024-03-01T13:54:21+00:00" /> <meta property="og:image" content="https://asian-bookies.net/wp-content/uploads/2023/06/logo.png" /> <meta property="og:image:width" content="267" /> <meta property="og:image:height" content="74" /> <meta property="og:image:type" content="image/png" /> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:site" content="@AsianBookiesNet" /> <script type="application/ld+json" class="yoast-schema-graph">{"@context":"https://schema.org","@graph":[{"@type":"WebPage","@id":"https://asian-bookies.net/review/m88/","url":"https://asian-bookies.net/review/m88/","name":"M88 Online Casino & Bookmaker Review: Bonuses for MY, SG, ID, VN","isPartOf":{"@id":"https://asian-bookies.net/#website"},"datePublished":"2022-11-13T22:50:43+00:00","dateModified":"2024-03-01T13:54:21+00:00","description":"M88 Mansion online casino and bookmaker review in 2024! ⭐ Get a M88 Mansion Bonus! ✅ Is M88 Mansion a legal, safe and trusted gambling site for Asian Punters? ✅ Reg&Bet with AsiaBetting.Online!","breadcrumb":{"@id":"https://asian-bookies.net/review/m88/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https://asian-bookies.net/review/m88/"]}]},{"@type":"BreadcrumbList","@id":"https://asian-bookies.net/review/m88/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://asian-bookies.net/"},{"@type":"ListItem","position":2,"name":"Reviews","item":"https://asian-bookies.net/review/"},{"@type":"ListItem","position":3,"name":"M88 Mansion"}]},{"@type":"WebSite","@id":"https://asian-bookies.net/#website","url":"https://asian-bookies.net/","name":"asian-bookies.net","description":"96 Bets Asia (Asian-Bookies.net)","publisher":{"@id":"https://asian-bookies.net/#organization"},"alternateName":"asian-bookies.net","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://asian-bookies.net/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https://asian-bookies.net/#organization","name":"Asian Bookies","alternateName":"asian-bookies.net","url":"https://asian-bookies.net/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https://asian-bookies.net/#/schema/logo/image/","url":"https://asian-bookies.net/wp-content/uploads/2023/03/logo_dark_purple_240-160.png","contentUrl":"https://asian-bookies.net/wp-content/uploads/2023/03/logo_dark_purple_240-160.png","width":240,"height":158,"caption":"Asian Bookies"},"image":{"@id":"https://asian-bookies.net/#/schema/logo/image/"},"sameAs":["https://www.facebook.com/AsianBookiesNet","https://x.com/AsianBookiesNet"]}]}</script> <!-- / Yoast SEO plugin. --> <script type="text/javascript"> /* <![CDATA[ */ window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/15.0.3\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/15.0.3\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/asian-bookies.net\/wp-includes\/js\/wp-emoji-release.min.js?ver=6.7.2"}}; /*! This file is auto-generated */ !function(i,n){var o,s,e;function c(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function p(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data),r=(e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0),new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data));return t.every(function(e,t){return e===r[t]})}function u(e,t,n){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\uddfa\ud83c\uddf3","\ud83c\uddfa\u200b\ud83c\uddf3")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!n(e,"\ud83d\udc26\u200d\u2b1b","\ud83d\udc26\u200b\u2b1b")}return!1}function f(e,t,n){var r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):i.createElement("canvas"),a=r.getContext("2d",{willReadFrequently:!0}),o=(a.textBaseline="top",a.font="600 32px Arial",{});return e.forEach(function(e){o[e]=t(a,e,n)}),o}function t(e){var t=i.createElement("script");t.src=e,t.defer=!0,i.head.appendChild(t)}"undefined"!=typeof Promise&&(o="wpEmojiSettingsSupports",s=["flag","emoji"],n.supports={everything:!0,everythingExceptFlag:!0},e=new Promise(function(e){i.addEventListener("DOMContentLoaded",e,{once:!0})}),new Promise(function(t){var n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"}),a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=function(e){c(n=e.data),a.terminate(),t(n)})}catch(e){}c(n=f(s,u,p))}t(n)}).then(function(e){for(var t in e)n.supports[t]=e[t],n.supports.everything=n.supports.everything&&n.supports[t],"flag"!==t&&(n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&n.supports[t]);n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&!n.supports.flag,n.DOMReady=!1,n.readyCallback=function(){n.DOMReady=!0}}).then(function(){return e}).then(function(){var e;n.supports.everything||(n.readyCallback(),(e=n.source||{}).concatemoji?t(e.concatemoji):e.wpemoji&&e.twemoji&&(t(e.twemoji),t(e.wpemoji)))}))}((window,document),window._wpemojiSettings); /* ]]> */ </script> <style id='wp-emoji-styles-inline-css' type='text/css'> img.wp-smiley, img.emoji { display: inline !important; border: none !important; box-shadow: none !important; height: 1em !important; width: 1em !important; margin: 0 0.07em !important; vertical-align: -0.1em !important; background: none !important; padding: 0 !important; } </style> <style id='safe-svg-svg-icon-style-inline-css' type='text/css'> .safe-svg-cover{text-align:center}.safe-svg-cover .safe-svg-inside{display:inline-block;max-width:100%}.safe-svg-cover svg{height:100%;max-height:100%;max-width:100%;width:100%} </style> <style id='classic-theme-styles-inline-css' type='text/css'> /*! This file is auto-generated */ .wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none} </style> <link rel='stylesheet' id='poka-review-vendor-css' href='https://asian-bookies.net/wp-content/plugins/poka-review/public/css/poka-review-vendor.min.css?ver=1.0.8' type='text/css' media='all' /> <link rel='stylesheet' id='poka-review-main-css' href='https://asian-bookies.net/wp-content/plugins/poka-review/public/css/poka-review-main.css?ver=1.0.8' type='text/css' media='all' /> <link rel='stylesheet' id='dashicons-css' href='https://asian-bookies.net/wp-includes/css/dashicons.min.css?ver=6.7.2' type='text/css' media='all' /> <link rel='stylesheet' id='swiper-css' href='https://asian-bookies.net/wp-content/themes/bb/dist/styles/swiper.css?ver=6.7.2' type='text/css' media='all' /> <link rel='stylesheet' id='styles-css' href='https://asian-bookies.net/wp-content/themes/bb/dist/styles/styles.min.css?v=67b86e3dbcc45&ver=6.7.2' type='text/css' media='all' /> <link rel="https://api.w.org/" href="https://asian-bookies.net/wp-json/" /><!-- Advance Canonical URL (Basic) --><link rel="canonical" href="https://asian-bookies.net/review/m88/"><!-- Advance Canonical URL --><script>document.createElement( "picture" );if(!window.HTMLPictureElement && document.addEventListener) {window.addEventListener("DOMContentLoaded", function() {var s = document.createElement("script");s.src = "https://asian-bookies.net/wp-content/plugins/webp-express/js/picturefill.min.js";document.body.appendChild(s);});}</script><style type="text/css">/** Wednesday 28th June 2023 12:36:15 UTC (core) **//** THIS FILE IS AUTOMATICALLY GENERATED - DO NOT MAKE MANUAL EDITS! **//** Custom CSS should be added to Mega Menu > Menu Themes > Custom Styling **/.mega-menu-last-modified-1687955775 { content: 'Wednesday 28th June 2023 12:36:15 UTC'; }#mega-menu-wrap-main_menu, #mega-menu-wrap-main_menu #mega-menu-main_menu, #mega-menu-wrap-main_menu #mega-menu-main_menu ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-row, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-column, #mega-menu-wrap-main_menu #mega-menu-main_menu a.mega-menu-link, #mega-menu-wrap-main_menu #mega-menu-main_menu span.mega-menu-badge {transition: none;border-radius: 0;box-shadow: none;background: none;border: 0;bottom: auto;box-sizing: border-box;clip: auto;color: #666;display: block;float: none;font-family: inherit;font-size: 14px;height: auto;left: auto;line-height: 1.7;list-style-type: none;margin: 0;min-height: auto;max-height: none;min-width: auto;max-width: none;opacity: 1;outline: none;overflow: visible;padding: 0;position: relative;pointer-events: auto;right: auto;text-align: left;text-decoration: none;text-indent: 0;text-transform: none;transform: none;top: auto;vertical-align: baseline;visibility: inherit;width: auto;word-wrap: break-word;white-space: normal;}#mega-menu-wrap-main_menu:before, #mega-menu-wrap-main_menu #mega-menu-main_menu:before, #mega-menu-wrap-main_menu #mega-menu-main_menu ul.mega-sub-menu:before, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item:before, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-row:before, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-column:before, #mega-menu-wrap-main_menu #mega-menu-main_menu a.mega-menu-link:before, #mega-menu-wrap-main_menu #mega-menu-main_menu span.mega-menu-badge:before, #mega-menu-wrap-main_menu:after, #mega-menu-wrap-main_menu #mega-menu-main_menu:after, #mega-menu-wrap-main_menu #mega-menu-main_menu ul.mega-sub-menu:after, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item:after, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-row:after, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-column:after, #mega-menu-wrap-main_menu #mega-menu-main_menu a.mega-menu-link:after, #mega-menu-wrap-main_menu #mega-menu-main_menu span.mega-menu-badge:after {display: none;}#mega-menu-wrap-main_menu {border-radius: 0;}@media only screen and (min-width: 769px) {#mega-menu-wrap-main_menu {background: #222;}}#mega-menu-wrap-main_menu.mega-keyboard-navigation .mega-menu-toggle:focus, #mega-menu-wrap-main_menu.mega-keyboard-navigation .mega-toggle-block:focus, #mega-menu-wrap-main_menu.mega-keyboard-navigation .mega-toggle-block a:focus, #mega-menu-wrap-main_menu.mega-keyboard-navigation .mega-toggle-block .mega-search input[type=text]:focus, #mega-menu-wrap-main_menu.mega-keyboard-navigation .mega-toggle-block button.mega-toggle-animated:focus, #mega-menu-wrap-main_menu.mega-keyboard-navigation #mega-menu-main_menu a:focus, #mega-menu-wrap-main_menu.mega-keyboard-navigation #mega-menu-main_menu span:focus, #mega-menu-wrap-main_menu.mega-keyboard-navigation #mega-menu-main_menu input:focus, #mega-menu-wrap-main_menu.mega-keyboard-navigation #mega-menu-main_menu li.mega-menu-item a.mega-menu-link:focus {outline: 3px solid #109cde;outline-offset: -3px;}#mega-menu-wrap-main_menu.mega-keyboard-navigation .mega-toggle-block button.mega-toggle-animated:focus {outline-offset: 2px;}#mega-menu-wrap-main_menu.mega-keyboard-navigation > li.mega-menu-item > a.mega-menu-link:focus {background: #333;color: #fff;font-weight: normal;text-decoration: none;border-color: #fff;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu.mega-keyboard-navigation > li.mega-menu-item > a.mega-menu-link:focus {color: #fff;background: #333;}}#mega-menu-wrap-main_menu #mega-menu-main_menu {visibility: visible;text-align: left;padding: 0px 0px 0px 0px;}#mega-menu-wrap-main_menu #mega-menu-main_menu a.mega-menu-link {cursor: pointer;display: inline;}#mega-menu-wrap-main_menu #mega-menu-main_menu a.mega-menu-link .mega-description-group {vertical-align: middle;display: inline-block;transition: none;}#mega-menu-wrap-main_menu #mega-menu-main_menu a.mega-menu-link .mega-description-group .mega-menu-title, #mega-menu-wrap-main_menu #mega-menu-main_menu a.mega-menu-link .mega-description-group .mega-menu-description {transition: none;line-height: 1.5;display: block;}#mega-menu-wrap-main_menu #mega-menu-main_menu a.mega-menu-link .mega-description-group .mega-menu-description {font-style: italic;font-size: 0.8em;text-transform: none;font-weight: normal;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu li.mega-menu-item.mega-icon-left.mega-has-description.mega-has-icon > a.mega-menu-link {display: flex;align-items: center;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu li.mega-menu-item.mega-icon-left.mega-has-description.mega-has-icon > a.mega-menu-link:before {flex: 0 0 auto;align-self: flex-start;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-tabbed.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item.mega-icon-left.mega-has-description.mega-has-icon > a.mega-menu-link {display: block;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-icon-top > a.mega-menu-link {display: table-cell;vertical-align: middle;line-height: initial;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-icon-top > a.mega-menu-link:before {display: block;margin: 0 0 6px 0;text-align: center;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-icon-top > a.mega-menu-link > span.mega-title-below {display: inline-block;transition: none;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-icon-top > a.mega-menu-link {display: block;line-height: 40px;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-icon-top > a.mega-menu-link:before {display: inline-block;margin: 0 6px 0 0;text-align: left;}}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-icon-right > a.mega-menu-link:before {float: right;margin: 0 0 0 6px;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-animating > ul.mega-sub-menu {pointer-events: none;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-disable-link > a.mega-menu-link, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu li.mega-disable-link > a.mega-menu-link {cursor: inherit;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item-has-children.mega-disable-link > a.mega-menu-link, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > li.mega-menu-item-has-children.mega-disable-link > a.mega-menu-link {cursor: pointer;}#mega-menu-wrap-main_menu #mega-menu-main_menu p {margin-bottom: 10px;}#mega-menu-wrap-main_menu #mega-menu-main_menu input, #mega-menu-wrap-main_menu #mega-menu-main_menu img {max-width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item > ul.mega-sub-menu {display: block;visibility: hidden;opacity: 1;pointer-events: auto;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item > ul.mega-sub-menu {display: none;visibility: visible;opacity: 1;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-toggle-on > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu.mega-menu-item.mega-toggle-on ul.mega-sub-menu {display: block;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu.mega-menu-item.mega-toggle-on li.mega-hide-sub-menu-on-mobile > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-hide-sub-menu-on-mobile > ul.mega-sub-menu {display: none;}}@media only screen and (min-width: 769px) {#mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="fade"] li.mega-menu-item > ul.mega-sub-menu {opacity: 0;transition: opacity 200ms ease-in, visibility 200ms ease-in;}#mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="fade"].mega-no-js li.mega-menu-item:hover > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="fade"].mega-no-js li.mega-menu-item:focus > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="fade"] li.mega-menu-item.mega-toggle-on > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="fade"] li.mega-menu-item.mega-menu-megamenu.mega-toggle-on ul.mega-sub-menu {opacity: 1;}#mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="fade_up"] li.mega-menu-item.mega-menu-megamenu > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="fade_up"] li.mega-menu-item.mega-menu-flyout ul.mega-sub-menu {opacity: 0;transform: translate(0, 10px);transition: opacity 200ms ease-in, transform 200ms ease-in, visibility 200ms ease-in;}#mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="fade_up"].mega-no-js li.mega-menu-item:hover > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="fade_up"].mega-no-js li.mega-menu-item:focus > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="fade_up"] li.mega-menu-item.mega-toggle-on > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="fade_up"] li.mega-menu-item.mega-menu-megamenu.mega-toggle-on ul.mega-sub-menu {opacity: 1;transform: translate(0, 0);}#mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="slide_up"] li.mega-menu-item.mega-menu-megamenu > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="slide_up"] li.mega-menu-item.mega-menu-flyout ul.mega-sub-menu {transform: translate(0, 10px);transition: transform 200ms ease-in, visibility 200ms ease-in;}#mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="slide_up"].mega-no-js li.mega-menu-item:hover > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="slide_up"].mega-no-js li.mega-menu-item:focus > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="slide_up"] li.mega-menu-item.mega-toggle-on > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="slide_up"] li.mega-menu-item.mega-menu-megamenu.mega-toggle-on ul.mega-sub-menu {transform: translate(0, 0);}}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-menu-megamenu ul.mega-sub-menu li.mega-collapse-children > ul.mega-sub-menu {display: none;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-menu-megamenu ul.mega-sub-menu li.mega-collapse-children.mega-toggle-on > ul.mega-sub-menu {display: block;}#mega-menu-wrap-main_menu #mega-menu-main_menu.mega-no-js li.mega-menu-item:hover > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu.mega-no-js li.mega-menu-item:focus > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-toggle-on > ul.mega-sub-menu {visibility: visible;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-menu-megamenu ul.mega-sub-menu ul.mega-sub-menu {visibility: inherit;opacity: 1;display: block;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-menu-megamenu ul.mega-sub-menu li.mega-1-columns > ul.mega-sub-menu > li.mega-menu-item {float: left;width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-menu-megamenu ul.mega-sub-menu li.mega-2-columns > ul.mega-sub-menu > li.mega-menu-item {float: left;width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-menu-megamenu ul.mega-sub-menu li.mega-3-columns > ul.mega-sub-menu > li.mega-menu-item {float: left;width: 33.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-menu-megamenu ul.mega-sub-menu li.mega-4-columns > ul.mega-sub-menu > li.mega-menu-item {float: left;width: 25%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-menu-megamenu ul.mega-sub-menu li.mega-5-columns > ul.mega-sub-menu > li.mega-menu-item {float: left;width: 20%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-menu-megamenu ul.mega-sub-menu li.mega-6-columns > ul.mega-sub-menu > li.mega-menu-item {float: left;width: 16.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item a[class^='dashicons']:before {font-family: dashicons;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item a.mega-menu-link:before {display: inline-block;font: inherit;font-family: dashicons;position: static;margin: 0 6px 0 0px;vertical-align: top;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;color: inherit;background: transparent;height: auto;width: auto;top: auto;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-hide-text a.mega-menu-link:before {margin: 0;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-hide-text li.mega-menu-item a.mega-menu-link:before {margin: 0 6px 0 0;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-align-bottom-left.mega-toggle-on > a.mega-menu-link {border-radius: 0;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-align-bottom-right > ul.mega-sub-menu {right: 0;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-align-bottom-right.mega-toggle-on > a.mega-menu-link {border-radius: 0;}@media only screen and (min-width: 769px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu.mega-menu-item {position: static;}}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item {margin: 0 0px 0 0;display: inline-block;height: auto;vertical-align: middle;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-item-align-right {float: right;}@media only screen and (min-width: 769px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-item-align-right {margin: 0 0 0 0px;}}@media only screen and (min-width: 769px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-item-align-float-left {float: left;}}@media only screen and (min-width: 769px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item > a.mega-menu-link:hover, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item > a.mega-menu-link:focus {background: #333;color: #fff;font-weight: normal;text-decoration: none;border-color: #fff;}}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-toggle-on > a.mega-menu-link {background: #333;color: #fff;font-weight: normal;text-decoration: none;border-color: #fff;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-toggle-on > a.mega-menu-link {color: #fff;background: #333;}}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-current-menu-item > a.mega-menu-link, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-current-menu-ancestor > a.mega-menu-link, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-current-page-ancestor > a.mega-menu-link {background: #333;color: #fff;font-weight: normal;text-decoration: none;border-color: #fff;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-current-menu-item > a.mega-menu-link, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-current-menu-ancestor > a.mega-menu-link, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-current-page-ancestor > a.mega-menu-link {color: #fff;background: #333;}}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item > a.mega-menu-link {line-height: 40px;height: 40px;padding: 0px 10px 0px 10px;vertical-align: baseline;width: auto;display: block;color: #fff;text-transform: none;text-decoration: none;text-align: left;background: rgba(0, 0, 0, 0);border: 0;border-radius: 0;font-family: inherit;font-size: 14px;font-weight: normal;outline: none;}@media only screen and (min-width: 769px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-multi-line > a.mega-menu-link {line-height: inherit;display: table-cell;vertical-align: middle;}}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-multi-line > a.mega-menu-link br {display: none;}}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item {display: list-item;margin: 0;clear: both;border: 0;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-item-align-right {float: none;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item > a.mega-menu-link {border-radius: 0;border: 0;margin: 0;line-height: 40px;height: 40px;padding: 0 10px;background: transparent;text-align: left;color: #fff;font-size: 14px;}}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row {width: 100%;float: left;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row .mega-menu-column {float: left;min-height: 1px;}@media only screen and (min-width: 769px) {#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-1-of-1 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-1-of-2 {width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-2-of-2 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-1-of-3 {width: 33.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-2-of-3 {width: 66.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-3-of-3 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-1-of-4 {width: 25%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-2-of-4 {width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-3-of-4 {width: 75%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-4-of-4 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-1-of-5 {width: 20%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-2-of-5 {width: 40%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-3-of-5 {width: 60%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-4-of-5 {width: 80%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-5-of-5 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-1-of-6 {width: 16.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-2-of-6 {width: 33.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-3-of-6 {width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-4-of-6 {width: 66.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-5-of-6 {width: 83.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-6-of-6 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-1-of-7 {width: 14.28571%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-2-of-7 {width: 28.57143%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-3-of-7 {width: 42.85714%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-4-of-7 {width: 57.14286%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-5-of-7 {width: 71.42857%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-6-of-7 {width: 85.71429%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-7-of-7 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-1-of-8 {width: 12.5%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-2-of-8 {width: 25%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-3-of-8 {width: 37.5%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-4-of-8 {width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-5-of-8 {width: 62.5%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-6-of-8 {width: 75%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-7-of-8 {width: 87.5%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-8-of-8 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-1-of-9 {width: 11.11111%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-2-of-9 {width: 22.22222%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-3-of-9 {width: 33.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-4-of-9 {width: 44.44444%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-5-of-9 {width: 55.55556%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-6-of-9 {width: 66.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-7-of-9 {width: 77.77778%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-8-of-9 {width: 88.88889%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-9-of-9 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-1-of-10 {width: 10%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-2-of-10 {width: 20%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-3-of-10 {width: 30%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-4-of-10 {width: 40%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-5-of-10 {width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-6-of-10 {width: 60%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-7-of-10 {width: 70%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-8-of-10 {width: 80%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-9-of-10 {width: 90%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-10-of-10 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-1-of-11 {width: 9.09091%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-2-of-11 {width: 18.18182%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-3-of-11 {width: 27.27273%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-4-of-11 {width: 36.36364%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-5-of-11 {width: 45.45455%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-6-of-11 {width: 54.54545%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-7-of-11 {width: 63.63636%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-8-of-11 {width: 72.72727%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-9-of-11 {width: 81.81818%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-10-of-11 {width: 90.90909%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-11-of-11 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-1-of-12 {width: 8.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-2-of-12 {width: 16.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-3-of-12 {width: 25%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-4-of-12 {width: 33.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-5-of-12 {width: 41.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-6-of-12 {width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-7-of-12 {width: 58.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-8-of-12 {width: 66.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-9-of-12 {width: 75%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-10-of-12 {width: 83.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-11-of-12 {width: 91.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-12-of-12 {width: 100%;}}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-column {width: 100%;clear: both;}}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row .mega-menu-column > ul.mega-sub-menu > li.mega-menu-item {padding: 15px 15px 15px 15px;width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu {z-index: 999;border-radius: 0;background: #f1f1f1;border: 0;padding: 0px 0px 0px 0px;position: absolute;width: 100%;max-width: none;left: 0;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu {float: left;position: static;width: 100%;}}@media only screen and (min-width: 769px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-1-of-1 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-1-of-2 {width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-2-of-2 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-1-of-3 {width: 33.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-2-of-3 {width: 66.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-3-of-3 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-1-of-4 {width: 25%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-2-of-4 {width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-3-of-4 {width: 75%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-4-of-4 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-1-of-5 {width: 20%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-2-of-5 {width: 40%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-3-of-5 {width: 60%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-4-of-5 {width: 80%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-5-of-5 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-1-of-6 {width: 16.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-2-of-6 {width: 33.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-3-of-6 {width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-4-of-6 {width: 66.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-5-of-6 {width: 83.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-6-of-6 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-1-of-7 {width: 14.28571%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-2-of-7 {width: 28.57143%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-3-of-7 {width: 42.85714%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-4-of-7 {width: 57.14286%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-5-of-7 {width: 71.42857%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-6-of-7 {width: 85.71429%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-7-of-7 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-1-of-8 {width: 12.5%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-2-of-8 {width: 25%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-3-of-8 {width: 37.5%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-4-of-8 {width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-5-of-8 {width: 62.5%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-6-of-8 {width: 75%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-7-of-8 {width: 87.5%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-8-of-8 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-1-of-9 {width: 11.11111%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-2-of-9 {width: 22.22222%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-3-of-9 {width: 33.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-4-of-9 {width: 44.44444%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-5-of-9 {width: 55.55556%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-6-of-9 {width: 66.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-7-of-9 {width: 77.77778%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-8-of-9 {width: 88.88889%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-9-of-9 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-1-of-10 {width: 10%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-2-of-10 {width: 20%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-3-of-10 {width: 30%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-4-of-10 {width: 40%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-5-of-10 {width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-6-of-10 {width: 60%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-7-of-10 {width: 70%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-8-of-10 {width: 80%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-9-of-10 {width: 90%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-10-of-10 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-1-of-11 {width: 9.09091%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-2-of-11 {width: 18.18182%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-3-of-11 {width: 27.27273%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-4-of-11 {width: 36.36364%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-5-of-11 {width: 45.45455%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-6-of-11 {width: 54.54545%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-7-of-11 {width: 63.63636%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-8-of-11 {width: 72.72727%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-9-of-11 {width: 81.81818%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-10-of-11 {width: 90.90909%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-11-of-11 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-1-of-12 {width: 8.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-2-of-12 {width: 16.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-3-of-12 {width: 25%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-4-of-12 {width: 33.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-5-of-12 {width: 41.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-6-of-12 {width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-7-of-12 {width: 58.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-8-of-12 {width: 66.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-9-of-12 {width: 75%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-10-of-12 {width: 83.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-11-of-12 {width: 91.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-12-of-12 {width: 100%;}}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu .mega-description-group .mega-menu-description {margin: 5px 0;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item ul.mega-sub-menu {clear: both;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item ul.mega-sub-menu li.mega-menu-item ul.mega-sub-menu {margin-left: 10px;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu ul.mega-sub-menu ul.mega-sub-menu {margin-left: 10px;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item {color: #666;font-family: inherit;font-size: 14px;display: block;float: left;clear: none;padding: 15px 15px 15px 15px;vertical-align: top;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item.mega-menu-clear, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item.mega-menu-clear {clear: left;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item h4.mega-block-title, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item h4.mega-block-title {color: #555;font-family: inherit;font-size: 16px;text-transform: uppercase;text-decoration: none;font-weight: bold;text-align: left;margin: 0px 0px 0px 0px;padding: 0px 0px 5px 0px;vertical-align: top;display: block;visibility: inherit;border: 0;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item h4.mega-block-title:hover, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item h4.mega-block-title:hover {border-color: rgba(0, 0, 0, 0);}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link {/* Mega Menu > Menu Themes > Mega Menus > Second Level Menu Items */color: #555;font-family: inherit;font-size: 16px;text-transform: uppercase;text-decoration: none;font-weight: bold;text-align: left;margin: 0px 0px 0px 0px;padding: 0px 0px 0px 0px;vertical-align: top;display: block;border: 0;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:hover, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:hover {border-color: rgba(0, 0, 0, 0);}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:hover, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:hover, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:focus, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:focus {/* Mega Menu > Menu Themes > Mega Menus > Second Level Menu Items (Hover) */color: #555;font-weight: bold;text-decoration: none;background: rgba(0, 0, 0, 0);}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:hover > span.mega-title-below, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:hover > span.mega-title-below, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:focus > span.mega-title-below, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:focus > span.mega-title-below {text-decoration: none;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item li.mega-menu-item > a.mega-menu-link, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item li.mega-menu-item > a.mega-menu-link {/* Mega Menu > Menu Themes > Mega Menus > Third Level Menu Items */color: #666;font-family: inherit;font-size: 14px;text-transform: none;text-decoration: none;font-weight: normal;text-align: left;margin: 0px 0px 0px 0px;padding: 0px 0px 0px 0px;vertical-align: top;display: block;border: 0;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item li.mega-menu-item > a.mega-menu-link:hover, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item li.mega-menu-item > a.mega-menu-link:hover {border-color: rgba(0, 0, 0, 0);}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item li.mega-menu-item.mega-icon-left.mega-has-description.mega-has-icon > a.mega-menu-link, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item li.mega-menu-item.mega-icon-left.mega-has-description.mega-has-icon > a.mega-menu-link {display: flex;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item li.mega-menu-item > a.mega-menu-link:hover, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item li.mega-menu-item > a.mega-menu-link:hover, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item li.mega-menu-item > a.mega-menu-link:focus, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item li.mega-menu-item > a.mega-menu-link:focus {/* Mega Menu > Menu Themes > Mega Menus > Third Level Menu Items (Hover) */color: #666;font-weight: normal;text-decoration: none;background: rgba(0, 0, 0, 0);}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu {border: 0;padding: 10px;border-radius: 0;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item {width: 100%;clear: both;}}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu.mega-no-headers > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu.mega-no-headers > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link {color: #666;font-family: inherit;font-size: 14px;text-transform: none;text-decoration: none;font-weight: normal;margin: 0;border: 0;padding: 0px 0px 0px 0px;vertical-align: top;display: block;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu.mega-no-headers > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:hover, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu.mega-no-headers > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:focus, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu.mega-no-headers > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:hover, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu.mega-no-headers > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:focus {color: #666;font-weight: normal;text-decoration: none;background: rgba(0, 0, 0, 0);}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu {z-index: 999;position: absolute;width: 250px;max-width: none;padding: 0px 0px 0px 0px;border: 0;background: #f1f1f1;border-radius: 0;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu {float: left;position: static;width: 100%;padding: 0;border: 0;border-radius: 0;}}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu li.mega-menu-item {clear: both;}}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu li.mega-menu-item a.mega-menu-link {display: block;background: #f1f1f1;color: #666;font-family: inherit;font-size: 14px;font-weight: normal;padding: 0px 10px 0px 10px;line-height: 35px;text-decoration: none;text-transform: none;vertical-align: baseline;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu li.mega-menu-item:first-child > a.mega-menu-link {border-top-left-radius: 0px;border-top-right-radius: 0px;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu li.mega-menu-item:first-child > a.mega-menu-link {border-top-left-radius: 0;border-top-right-radius: 0;}}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu li.mega-menu-item:last-child > a.mega-menu-link {border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu li.mega-menu-item:last-child > a.mega-menu-link {border-bottom-right-radius: 0;border-bottom-left-radius: 0;}}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu li.mega-menu-item a.mega-menu-link:hover, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu li.mega-menu-item a.mega-menu-link:focus {background: #ddd;font-weight: normal;text-decoration: none;color: #666;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu li.mega-menu-item ul.mega-sub-menu {position: absolute;left: 100%;top: 0;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu li.mega-menu-item ul.mega-sub-menu {position: static;left: 0;width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu li.mega-menu-item ul.mega-sub-menu a.mega-menu-link {padding-left: 20px;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu li.mega-menu-item ul.mega-sub-menu ul.mega-sub-menu a.mega-menu-link {padding-left: 30px;}}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item-has-children > a.mega-menu-link > span.mega-indicator {display: inline-block;width: auto;background: transparent;position: relative;pointer-events: auto;left: auto;min-width: auto;font-size: inherit;padding: 0;margin: 0 0 0 6px;height: auto;line-height: inherit;color: inherit;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item-has-children > a.mega-menu-link > span.mega-indicator:after {content: '\f140';font-family: dashicons;font-weight: normal;display: inline-block;margin: 0;vertical-align: top;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;transform: rotate(0);color: inherit;position: relative;background: transparent;height: auto;width: auto;right: auto;line-height: inherit;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item-has-children li.mega-menu-item-has-children > a.mega-menu-link > span.mega-indicator {float: right;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item-has-children.mega-collapse-children.mega-toggle-on > a.mega-menu-link > span.mega-indicator:after {content: '\f142';}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item-has-children > a.mega-menu-link > span.mega-indicator {float: right;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item-has-children.mega-toggle-on > a.mega-menu-link > span.mega-indicator:after {content: '\f142';}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item-has-children.mega-hide-sub-menu-on-mobile > a.mega-menu-link > span.mega-indicator {display: none;}}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu:not(.mega-menu-tabbed) li.mega-menu-item-has-children:not(.mega-collapse-children) > a.mega-menu-link > span.mega-indicator, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item-has-children.mega-hide-arrow > a.mega-menu-link > span.mega-indicator {display: none;}@media only screen and (min-width: 769px) {#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-flyout li.mega-menu-item a.mega-menu-link > span.mega-indicator:after {content: '\f139';}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-flyout.mega-align-bottom-right li.mega-menu-item a.mega-menu-link {text-align: right;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-flyout.mega-align-bottom-right li.mega-menu-item a.mega-menu-link > span.mega-indicator {float: left;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-flyout.mega-align-bottom-right li.mega-menu-item a.mega-menu-link > span.mega-indicator:after {content: '\f141';margin: 0 6px 0 0;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-flyout.mega-align-bottom-right li.mega-menu-item a.mega-menu-link:before {float: right;margin: 0 0 0 6px;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-flyout.mega-align-bottom-right ul.mega-sub-menu li.mega-menu-item ul.mega-sub-menu {left: -100%;top: 0;}}#mega-menu-wrap-main_menu #mega-menu-main_menu li[class^='mega-lang-item'] > a.mega-menu-link > img {display: inline;}#mega-menu-wrap-main_menu #mega-menu-main_menu a.mega-menu-link > img.wpml-ls-flag, #mega-menu-wrap-main_menu #mega-menu-main_menu a.mega-menu-link > img.iclflag {display: inline;margin-right: 8px;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-hide-on-mobile, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-hide-on-mobile, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item.mega-hide-on-mobile {display: none;}}@media only screen and (min-width: 769px) {#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-hide-on-desktop, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-hide-on-desktop, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item.mega-hide-on-desktop {display: none;}}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu:after {content: "";display: table;clear: both;}}#mega-menu-wrap-main_menu .mega-menu-toggle {display: none;z-index: 1;cursor: pointer;background: #222;border-radius: 2px 2px 2px 2px;line-height: 40px;height: 40px;text-align: left;user-select: none;-webkit-tap-highlight-color: transparent;outline: none;white-space: nowrap;}#mega-menu-wrap-main_menu .mega-menu-toggle img {max-width: 100%;padding: 0;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu .mega-menu-toggle {display: -webkit-box;display: -ms-flexbox;display: -webkit-flex;display: flex;}}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-blocks-left, #mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-blocks-center, #mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-blocks-right {display: -webkit-box;display: -ms-flexbox;display: -webkit-flex;display: flex;-ms-flex-preferred-size: 33.33%;-webkit-flex-basis: 33.33%;flex-basis: 33.33%;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-blocks-left {-webkit-box-flex: 1;-ms-flex: 1;-webkit-flex: 1;flex: 1;-webkit-box-pack: start;-ms-flex-pack: start;-webkit-justify-content: flex-start;justify-content: flex-start;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-blocks-left .mega-toggle-block {margin-left: 6px;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-blocks-left .mega-toggle-block:only-child {margin-right: 6px;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-blocks-center {-webkit-box-pack: center;-ms-flex-pack: center;-webkit-justify-content: center;justify-content: center;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-blocks-center .mega-toggle-block {margin-left: 3px;margin-right: 3px;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-blocks-right {-webkit-box-flex: 1;-ms-flex: 1;-webkit-flex: 1;flex: 1;-webkit-box-pack: end;-ms-flex-pack: end;-webkit-justify-content: flex-end;justify-content: flex-end;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-blocks-right .mega-toggle-block {margin-right: 6px;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-blocks-right .mega-toggle-block:only-child {margin-left: 6px;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block {display: -webkit-box;display: -ms-flexbox;display: -webkit-flex;display: flex;height: 100%;outline: 0;-webkit-align-self: center;-ms-flex-item-align: center;align-self: center;-ms-flex-negative: 0;-webkit-flex-shrink: 0;flex-shrink: 0;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu .mega-menu-toggle + #mega-menu-main_menu {background: #222;padding: 0px 0px 0px 0px;display: none;}#mega-menu-wrap-main_menu .mega-menu-toggle.mega-menu-open + #mega-menu-main_menu {display: block;}}#mega-menu-wrap-main_menu .mega-menu-toggle {/** Push menu onto new line **/}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 {/*! * Hamburgers * @description Tasty CSS-animated hamburgers * @author Jonathan Suh @jonsuh * @site https://jonsuh.com/hamburgers * @link https://github.com/jonsuh/hamburgers */cursor: pointer;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated {padding: 0;display: -webkit-box;display: -ms-flexbox;display: -webkit-flex;display: flex;cursor: pointer;transition-property: opacity, filter;transition-duration: 0.15s;transition-timing-function: linear;font: inherit;color: inherit;text-transform: none;background-color: transparent;border: 0;margin: 0;overflow: visible;transform: scale(0.8);align-self: center;outline: 0;background: none;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated-box {width: 40px;height: 24px;display: inline-block;position: relative;outline: 0;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated-inner {display: block;top: 50%;margin-top: -2px;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated-inner, #mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated-inner::before, #mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated-inner::after {width: 40px;height: 4px;background-color: #ddd;border-radius: 4px;position: absolute;transition-property: transform;transition-duration: 0.15s;transition-timing-function: ease;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated-inner::before, #mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated-inner::after {content: "";display: block;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated-inner::before {top: -10px;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated-inner::after {bottom: -10px;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated-slider .mega-toggle-animated-inner {top: 2px;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated-slider .mega-toggle-animated-inner::before {top: 10px;transition-property: transform, opacity;transition-timing-function: ease;transition-duration: 0.15s;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated-slider .mega-toggle-animated-inner::after {top: 20px;}#mega-menu-wrap-main_menu .mega-menu-toggle.mega-menu-open .mega-toggle-block-0 .mega-toggle-animated-slider .mega-toggle-animated-inner {transform: translate3d(0, 10px, 0) rotate(45deg);}#mega-menu-wrap-main_menu .mega-menu-toggle.mega-menu-open .mega-toggle-block-0 .mega-toggle-animated-slider .mega-toggle-animated-inner::before {transform: rotate(-45deg) translate3d(-5.71429px, -6px, 0);opacity: 0;}#mega-menu-wrap-main_menu .mega-menu-toggle.mega-menu-open .mega-toggle-block-0 .mega-toggle-animated-slider .mega-toggle-animated-inner::after {transform: translate3d(0, -20px, 0) rotate(-90deg);}#mega-menu-wrap-main_menu {clear: both;}.wp-block {}</style> </head> <body data-rsssl=1> <!-- Google tag (gtag.js) --> <script defer src="https://www.googletagmanager.com/gtag/js?id=G-2RPHT34J3M"></script> <script> window.addEventListener("load", function(event) { window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-2RPHT34J3M'); }); </script> <div class="site-header-wrapper -single -review-page "> <header class="site-header"> <div class="site-header__row container -big"> <div class="main-logo site-header__logo"> <a href="https://asian-bookies.net/"> <img width="267" height="54" src="https://asian-bookies.net/wp-content/themes/bb/images/logo.svg" alt="96 Bets Asia"> </a> </div> <button class="site-header__mob-menu-btn" title="Menu"><i></i></button> <div id="mega-menu-wrap-main_menu" class="mega-menu-wrap"><div class="mega-menu-toggle"><div class="mega-toggle-blocks-left"></div><div class="mega-toggle-blocks-center"></div><div class="mega-toggle-blocks-right"><div class='mega-toggle-block mega-menu-toggle-animated-block mega-toggle-block-0' id='mega-toggle-block-0'><button aria-label="Toggle Menu" class="mega-toggle-animated mega-toggle-animated-slider" type="button" aria-expanded="false"> <span class="mega-toggle-animated-box"> <span class="mega-toggle-animated-inner"></span> </span> </button></div></div></div><ul id="mega-menu-main_menu" class="mega-menu max-mega-menu mega-menu-horizontal mega-no-js" data-event="hover" data-effect="fade_up" data-effect-speed="200" data-effect-mobile="disabled" data-effect-speed-mobile="0" data-mobile-force-width="false" data-second-click="go" data-document-click="collapse" data-vertical-behaviour="standard" data-breakpoint="768" data-unbind="true" data-mobile-state="collapse_all" data-mobile-direction="vertical" data-hover-intent-timeout="300" data-hover-intent-interval="100"><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-home mega-menu-item-has-children mega-align-bottom-left mega-menu-flyout mega-menu-item-21801' id='mega-menu-item-21801'><a class="mega-menu-link" href="https://asian-bookies.net/" aria-expanded="false" tabindex="0">Betting Sites<span class="mega-indicator"></span></a> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21803' id='mega-menu-item-21803'><a class="mega-menu-link" href="https://asian-bookies.net/asian-handicap/">Asian Handicap</a></li></ul> </li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-has-children mega-align-bottom-left mega-menu-flyout mega-menu-item-21836' id='mega-menu-item-21836'><a class="mega-menu-link" aria-expanded="false" tabindex="0">Countries<span class="mega-indicator"></span></a> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21811' id='mega-menu-item-21811'><a class="mega-menu-link" href="https://asian-bookies.net/bangladesh/">Bangladesh</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21812' id='mega-menu-item-21812'><a class="mega-menu-link" href="https://asian-bookies.net/hong-kong/">Hong Kong</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21813' id='mega-menu-item-21813'><a class="mega-menu-link" href="https://asian-bookies.net/india/">India</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21815' id='mega-menu-item-21815'><a class="mega-menu-link" href="https://asian-bookies.net/indonesia/">Indonesia</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21816' id='mega-menu-item-21816'><a class="mega-menu-link" href="https://asian-bookies.net/japan/">Japan</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21817' id='mega-menu-item-21817'><a class="mega-menu-link" href="https://asian-bookies.net/korea/">Korea</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21818' id='mega-menu-item-21818'><a class="mega-menu-link" href="https://asian-bookies.net/malaysia/">Malaysia</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21820' id='mega-menu-item-21820'><a class="mega-menu-link" href="https://asian-bookies.net/philippines/">Philippines</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21828' id='mega-menu-item-21828'><a class="mega-menu-link" href="https://asian-bookies.net/singapore/">Singapore</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21830' id='mega-menu-item-21830'><a class="mega-menu-link" href="https://asian-bookies.net/thailand/">Thailand</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21819' id='mega-menu-item-21819'><a class="mega-menu-link" href="https://asian-bookies.net/vietnam/">Vietnam</a></li></ul> </li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-has-children mega-align-bottom-left mega-menu-flyout mega-menu-item-21834' id='mega-menu-item-21834'><a class="mega-menu-link" aria-expanded="false" tabindex="0">Sports<span class="mega-indicator"></span></a> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21805' id='mega-menu-item-21805'><a class="mega-menu-link" href="https://asian-bookies.net/baseball/">Baseball</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-has-children mega-menu-item-21806' id='mega-menu-item-21806'><a class="mega-menu-link" href="https://asian-bookies.net/basketball/" aria-expanded="false">Basketball<span class="mega-indicator"></span></a> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21821' id='mega-menu-item-21821'><a class="mega-menu-link" href="https://asian-bookies.net/philippines/betting-on-nba/">Betting on NBA</a></li> </ul> </li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21814' id='mega-menu-item-21814'><a class="mega-menu-link" href="https://asian-bookies.net/india/cricket/">Cricket</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21809' id='mega-menu-item-21809'><a class="mega-menu-link" href="https://asian-bookies.net/esports/">eSports</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21810' id='mega-menu-item-21810'><a class="mega-menu-link" href="https://asian-bookies.net/football/">Football</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21829' id='mega-menu-item-21829'><a class="mega-menu-link" href="https://asian-bookies.net/singapore/horse-racing/">Horse Racing</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21831' id='mega-menu-item-21831'><a class="mega-menu-link" href="https://asian-bookies.net/tennis/">Tennis</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21832' id='mega-menu-item-21832'><a class="mega-menu-link" href="https://asian-bookies.net/volleyball/">Volleyball</a></li></ul> </li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-has-children mega-align-bottom-left mega-menu-flyout mega-menu-item-21835' id='mega-menu-item-21835'><a class="mega-menu-link" aria-expanded="false" tabindex="0">Payments<span class="mega-indicator"></span></a> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21823' id='mega-menu-item-21823'><a class="mega-menu-link" href="https://asian-bookies.net/payments/bkash/">bKash</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21824' id='mega-menu-item-21824'><a class="mega-menu-link" href="https://asian-bookies.net/payments/gcash/">GCash</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21825' id='mega-menu-item-21825'><a class="mega-menu-link" href="https://asian-bookies.net/payments/paypal/">PayPal</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21826' id='mega-menu-item-21826'><a class="mega-menu-link" href="https://asian-bookies.net/payments/paysafecard/">Paysafecard</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21827' id='mega-menu-item-21827'><a class="mega-menu-link" href="https://asian-bookies.net/payments/tether-usdt/">Tether (USDT)</a></li></ul> </li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-current-menu-ancestor mega-current-menu-parent mega-menu-item-has-children mega-align-bottom-left mega-menu-flyout mega-menu-item-21848' id='mega-menu-item-21848'><a class="mega-menu-link" href="/" aria-expanded="false" tabindex="0">Bookies<span class="mega-indicator"></span></a> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-21849' id='mega-menu-item-21849'><a class="mega-menu-link" href="/review/1xbet/">1xBet</a></li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-21850' id='mega-menu-item-21850'><a class="mega-menu-link" href="/review/22bet/">22Bet</a></li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-21851' id='mega-menu-item-21851'><a class="mega-menu-link" href="/review/20bet/">20Bet</a></li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-21852' id='mega-menu-item-21852'><a class="mega-menu-link" href="/review/4rabet/">4raBet</a></li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-21860' id='mega-menu-item-21860'><a class="mega-menu-link" href="/review/bc-game/">BC.game</a></li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-21858' id='mega-menu-item-21858'><a class="mega-menu-link" href="/review/betwinner/">Betwinner</a></li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-21854' id='mega-menu-item-21854'><a class="mega-menu-link" href="/review/crickex/">Crickex</a></li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-21859' id='mega-menu-item-21859'><a class="mega-menu-link" href="/review/dafabet/">Dafabet</a></li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-current-menu-item mega-menu-item-21853' id='mega-menu-item-21853'><a class="mega-menu-link" href="/review/m88/" aria-current="page">M88 Mansion</a></li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-21856' id='mega-menu-item-21856'><a class="mega-menu-link" href="/review/melbet/">Melbet</a></li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-21857' id='mega-menu-item-21857'><a class="mega-menu-link" href="/review/mostbet/">Mostbet</a></li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-21855' id='mega-menu-item-21855'><a class="mega-menu-link" href="/review/sportsbet-io/">Sportsbet.IO</a></li></ul> </li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-align-bottom-left mega-menu-flyout mega-menu-item-21807' id='mega-menu-item-21807'><a class="mega-menu-link" href="https://asian-bookies.net/casino/" tabindex="0">Casino</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-has-children mega-align-bottom-left mega-menu-flyout mega-menu-item-21833' id='mega-menu-item-21833'><a class="mega-menu-link" href="https://asian-bookies.net/about-us/" aria-expanded="false" tabindex="0">About<span class="mega-indicator"></span></a> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21808' id='mega-menu-item-21808'><a class="mega-menu-link" href="https://asian-bookies.net/contacts/">Contact Us</a></li></ul> </li></ul></div> <div class="header-langs"> <button class="header-langs__current"> <picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/themes/bb/images/flags/gb.png.webp" type="image/webp"><img src="https://asian-bookies.net/wp-content/themes/bb/images/flags/gb.png" alt="English" class="webpexpress-processed"></picture> <span>en</span> </button> <div class="header-langs__list"> <ul> <li class="lang-item lang-item-14 lang-item-en current-lang lang-item-first"><a lang="en-GB" hreflang="en-GB" href="https://asian-bookies.net/review/m88/"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAMAAABBPP0LAAAAt1BMVEWSmb66z+18msdig8La3u+tYX9IaLc7W7BagbmcUW+kqMr/q6n+//+hsNv/lIr/jIGMnNLJyOP9/fyQttT/wb3/////aWn+YWF5kNT0oqz0i4ueqtIZNJjhvt/8gn//WVr/6+rN1+o9RKZwgcMPJpX/VFT9UEn+RUX8Ozv2Ly+FGzdYZrfU1e/8LS/lQkG/mbVUX60AE231hHtcdMb0mp3qYFTFwNu3w9prcqSURGNDaaIUMX5FNW5wYt7AAAAAjklEQVR4AR3HNUJEMQCGwf+L8RR36ajR+1+CEuvRdd8kK9MNAiRQNgJmVDAt1yM6kSzYVJUsPNssAk5N7ZFKjVNFAY4co6TAOI+kyQm+LFUEBEKKzuWUNB7rSH/rSnvOulOGk+QlXTBqMIrfYX4tSe2nP3iRa/KNK7uTmWJ5a9+erZ3d+18od4ytiZdvZyuKWy8o3UpTVAAAAABJRU5ErkJggg==" alt="" width="16" height="11" style="width: 16px; height: 11px;" /><span style="margin-left:0.3em;">English</span></a></li> </ul> </div> </div> </div> </header> </div> <div class="container"> <div class="review-page"> <div class="breadcrumbs -no-absolute -rev-page"><span><span><a href="https://asian-bookies.net/">Home</a></span> » <span><a href="https://asian-bookies.net/review/">Reviews</a></span> » <span class="breadcrumb_last" aria-current="page">M88 Mansion</span></span></div> <div class="content-white block-content-padding block-content-lr-padding white-block-shadow review-page--header"> <div class="review-page--header__logo" style="background-color:#526686"> <picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-mansion-casino-logo.png.webp" type="image/webp"><img width="290" height="90" src="https://asian-bookies.net/wp-content/uploads/2022/11/m88-mansion-casino-logo.png" class="attachment-medium size-medium webpexpress-processed" alt="" decoding="async"></picture> </div> <div class="review-page--header__data"> <h1>M88 Mansion</h1> <div class="review-page--header__rating"> <div class="g-rp-rating--title">Overall Rating</div> <div class="g-rp-rating--grid"> <div class="main-stars-block"> <i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i> </div> <div class="g-rp-rating--val">5/5</div> </div> </div> </div> <div class="review-page--header__bonus"> <div class="g-rp-bonus"> <div class="g-rp-bonus--title">Bonus: </div> <div class="g-rp-bonus--val"> <span>200%</span> Bonus up to <span>$650 USD</span> <br>+ Get <span>88</span> Free Spins! </div> </div> </div> <div class="review-page--header__last-b"> <div class="g-rp-last-update"> Last Updated: <span>March 1, 2024</span> </div> <div class="g-rp-more-link"> <a class="main-link-btn -ib" rel="nofollow" target="_blank" href="https://asian-bookies.net/go/m88/" target="_blank" rel="nofollow" > <span class="big-label">VISIT WEBSITE</span> </a> </div> </div> </div> <div class="hero-toggle -rev-page"> <button class="hero-toggle__header"> <i class="icon-left"></i> <span>Table of content</span> <div class="icon-right-wrapper"> <i class="icon-right"></i> </div> </button> <div class="hero-toggle__content"> <ul class="single-toc--ul"> <li class="single-toc--li"> <a href="#review-m88-mansion-bookmaker-and-online-casino">Review M88 Mansion Bookmaker and Online Casino</a> </li> <li class="single-toc--li"> <a href="#about-m88-mansion-company">About M88 Mansion Company</a> </li> <li class="single-toc--li"> <a href="#quick-advantages-to-play-games-at-m88-mansion">Quick Advantages to Play Games at M88 Mansion</a> </li> <li class="single-toc--li"> <a href="#sportsbook-m88-mansion">Sportsbook M88 Mansion</a> </li> <li class="single-toc--li"> <a href="#live-betting-in-m88-mansion">Live Betting in M88 Mansion</a> </li> <li class="single-toc--li"> <a href="#available-types-of-bets-on-m88-mansion">Available Types of Bets on M88 Mansion</a> </li> <li class="single-toc--li"> <a href="#additional-betting-tools">Additional Betting Tools</a> </li> <li class="single-toc--li"> <a href="#how-to-place-a-bet-at-m88-mansion">How to Place a Bet at M88 Mansion?</a> </li> <li class="single-toc--li"> <a href="#our-experience-of-betting-on-m88-mansion">Our experience of betting on M88 Mansion</a> </li> <li class="single-toc--li"> <a href="#m88-mansion-online-casino">M88 Mansion Online Casino</a> </li> <li class="single-toc--li"> <a href="#providers-slot-games-available-at-m88-mansion">Providers Slot Games Available at M88 Mansion</a> </li> <li class="single-toc--li"> <a href="#is-m88-mansion-asian-and-hunting-slots-games-available">Is M88 Mansion Asian and Hunting Slots Games Available?</a> </li> <li class="single-toc--li"> <a href="#top-casino-games-available-at-m88-mansion">Top Casino Games Available at M88 Mansion</a> </li> <li class="single-toc--li"> <a href="#live-casino-at-m88-mansion">Live Casino at M88 Mansion</a> </li> <li class="single-toc--li"> <a href="#live-games-providers-in-m88-mansion">Live Games Providers in M88 Mansion</a> </li> <li class="single-toc--li"> <a href="#advantages-of-live-casino-games-at-m88-mansion">Advantages of Live Casino Games at M88 Mansion</a> </li> <li class="single-toc--li"> <a href="#instant-games-at-m88-mansion">Instant Games at M88 Mansion</a> </li> <li class="single-toc--li"> <a href="#how-to-start-play-at-casino-m88-mansion">How to Start Play at Casino M88 Mansion?</a> </li> <li class="single-toc--li"> <a href="#our-experience-of-gamble-in-casino-m88-mansion">Our experience of gamble in casino M88 Mansion</a> </li> <li class="single-toc--li"> <a href="#m88-mansion-online-poker-room">M88 Mansion Online Poker Room</a> </li> <li class="single-toc--li"> <a href="#m88-mansion-100-sports-welcome-bonus">M88 Mansion 100% Sports Welcome Bonus</a> </li> <li class="single-toc--li"> <a href="#188-welcome-bonus">188% WELCOME BONUS</a> </li> <li class="single-toc--li"> <a href="#188-e-sports-welcome-bonus">188% E-SPORTS WELCOME BONUS</a> </li> <li class="single-toc--li"> <a href="#m88-mansion-bonuses-and-promotions">M88 Mansion Bonuses and Promotions</a> </li> <li class="single-toc--li"> <a href="#m88-mansions-vip-loyalty-program-the-prestige-club">M88 Mansion’s VIP Loyalty Program: The Prestige Club</a> </li> <li class="single-toc--li"> <a href="#promo-codes-how-to-get-and-use-promocodes-at-m88-mansion">Promo Codes: How to get and use promocodes at M88 Mansion?</a> </li> <li class="single-toc--li"> <a href="#m88-mansion-payment-methods">M88 Mansion Payment Methods</a> </li> <li class="single-toc--li"> <a href="#registration-at-m88-mansion-how-to-sign-up">Registration at M88 Mansion: How to Sign Up?</a> </li> <li class="single-toc--li"> <a href="#m88-mansion-account-verification-instruction">M88 Mansion Account Verification Instruction</a> </li> <li class="single-toc--li"> <a href="#m88-mansion-mobile-app-for-android-and-ios">M88 Mansion Mobile App for Android and iOS</a> </li> <li class="single-toc--li"> <a href="#tips-and-best-practices-for-playing-at-m88-mansion">Tips and Best Practices for Playing at M88 Mansion</a> </li> <li class="single-toc--li"> <a href="#m88-mansion-mobile-website">M88 Mansion Mobile Website</a> </li> <li class="single-toc--li"> <a href="#m88-mansion-license-and-fairness">M88 Mansion License and Fairness</a> </li> <li class="single-toc--li"> <a href="#m88-mansion-customer-support">M88 Mansion Customer Support</a> </li> <li class="single-toc--li"> <a href="#final-opinion-on-m88-mansion-as-bookmaker-and-online-casino">Final Opinion on M88 Mansion as bookmaker and online casino</a> </li> <li class="single-toc--li"> <a href="#accepted-cryptocurrencies">Accepted Cryptocurrencies</a> </li> <li class="single-toc--li"> <a href="#available-games">Available Games</a> </li> <li class="single-toc--li"> <a href="#supported-languages">Supported Languages</a> </li> <li class="single-toc--li"> <a href="#faq-about-m88-mansion">FAQ about M88 Mansion:</a> </li> </ul> </div> </div> <div class="review-page--content"> <main> <div id="review-m88-mansion-bookmaker-and-online-casino" class="auto-scroll-block content-white block-content-padding block-content-lr-padding white-block-shadow mb30"> <div class="g-rp-rep-block-title mobile-show"> <i class="rev-icon"></i> <div> <h2 id="review-m88-mansion-bookmaker-and-online-casino">Review M88 Mansion Bookmaker and Online Casino</h2> <div class="g-rp-rep-block-title__short-desc"></div> </div> </div> <div class="rev-page-first-block"> <div class="rev-page-first-block--content"> <div class="g-rp-rep-block-title mobile-hide"> <i class="rev-icon"></i> <div> <h2 id="review-m88-mansion-bookmaker-and-online-casino">Review M88 Mansion Bookmaker and Online Casino</h2> <div class="g-rp-rep-block-title__short-desc"></div> </div> </div> <article class="post-entry"> <p><span style="font-weight: 400;">Discover the comprehensive review of M88 Mansion, a leading bookmaker and online casino. Unveiling its features, bonuses, payment methods, and more, this article provides a deep insight into the platform. Designed for both newcomers and experienced players, it offers useful information about registration, betting options, game selection, and mobile compatibility. Learn about the M88 Mansion’s pros and cons, available promotions, and VIP loyalty program. Whether you’re interested in sports betting or casino games, this review covers it all. Immerse yourself in the exciting world of M88 Mansion and make informed decisions. Prepare for an exhilarating gaming experience and maximize your chances of winning.</span></p> <p><strong>Review of the bookmaker and online casino M88 Mansion is also available in other languages:</strong></p> <ul> <li class="lang-item lang-item-17 lang-item-id"><strong><a lang="id-ID" href="https://asian-bookies.net/id/reviews/m88-mansion-indonesia/" hreflang="id-ID">Bahasa Indonesia</a></strong></li> <li class="lang-item lang-item-28 lang-item-ja"><strong><a lang="ja" href="https://asian-bookies.net/ja/reviews/m88-mansion-japan/" hreflang="ja">日本語</a></strong></li> <li class="lang-item lang-item-33 lang-item-vi"><strong><a lang="vi" href="https://asian-bookies.net/vi/reviews/m88-mansion-vietnam/" hreflang="vi">Tiếng Việt</a></strong></li> <li class="lang-item lang-item-38 lang-item-th"><strong><a lang="th" href="https://asian-bookies.net/th/reviews/m88-mansion-thailand/" hreflang="th">ไทย</a></strong></li> <li class="lang-item lang-item-53 lang-item-zh"><strong><a lang="zh-CN" href="https://asian-bookies.net/zh/reviews/m88-mansion-china-singapore/" hreflang="zh-CN">中文 (中国)</a></strong></li> <li class="lang-item lang-item-78 lang-item-km"><strong><a lang="km" href="https://asian-bookies.net/km/reviews/m88-mansion-cambodia/" hreflang="km">ភាសាខ្មែរ</a></strong></li> </ul> <h2 id="about-m88-mansion-company"><span style="font-weight: 400;">About M88 Mansion Company</span></h2> <p><span style="font-weight: 400;">Navigating through the vibrant world of betting, M88 Mansion stands out with its reputation for providing a remarkable platform for bettors and gamblers alike. M88 Mansion license issued by the Ministry of Finance and Economic Development. With strict confidentiality policies in place, they ensure that all personal information remains secure at all times. Moreover, M88 Mansion safeguards connection through a 128 Bit SSL encryption, providing an additional layer of data protection. </span></p> <p><picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-main-970x476.jpg.webp 970w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-main-1170x574.jpg.webp 1170w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-main-768x377.jpg.webp 768w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-main-1536x753.jpg.webp 1536w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-main-1000x491.jpg.webp 1000w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-main.jpg.webp 1898w" sizes="(max-width: 970px) 100vw, 970px" type="image/webp"><img fetchpriority="high" decoding="async" class="alignnone size-medium wp-image-11121 webpexpress-processed" src="https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-main-970x476.jpg" alt="M88 — Review Bookmaker Features, Offers, Pros & Cons for 2023" width="970" height="476" srcset="https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-main-970x476.jpg 970w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-main-1170x574.jpg 1170w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-main-768x377.jpg 768w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-main-1536x753.jpg 1536w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-main-1000x491.jpg 1000w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-main.jpg 1898w" sizes="(max-width: 970px) 100vw, 970px"></picture></p> <p><span style="font-weight: 400;">M88 Mansion, a titan in the field, boasts a user-friendly platform coupled with an extensive array of games, offering bettors numerous possibilities for placing bets. It’s also convenient for players around the globe, accepting a multitude of currencies from EUR to VND.M88 has also partnered with several well-known providers such as Pragmatic Play and others to create exclusive offers only available on this site.</span></p> <p><span style="font-weight: 400;">As we tested the platform, we appreciated the quick and efficient deposit and withdrawal system. Options range from traditional cards to various web wallets, payment systems, and even a wide range of cryptocurrencies, including Bitcoin and Ethereum.</span></p> <h2 id="quick-advantages-to-play-games-at-m88-mansion"><span style="font-weight: 400;">Quick Advantages to Play Games at M88 Mansion</span></h2> <p><span style="font-weight: 400;">At M88 Mansion, bettors are treated to a cornucopia of advantages. The minimum deposit threshold is relatively low at $5 USDT, which is inviting for casual players and serious gamblers alike.</span></p> <p><span style="font-weight: 400;">Our bookmaker M88 Mansion review also revealed an enticing bonus structure. With a bonus wager requirement of only 20x, M88 Mansion truly gives players a competitive edge.</span></p> <p><span style="font-weight: 400;">We found that the M88 Mansion experience was greatly enhanced by its well-designed app, facilitating seamless wagering on the go. Given all these advantages, it’s easy to see why our casino M88 Mansion review paints a positive picture of this betting powerhouse.</span></p> <h2 id="sportsbook-m88-mansion"><span style="font-weight: 400;">Sportsbook M88 Mansion</span></h2> <p><span style="font-weight: 400;">Engaging in the sportsbook M88 Mansion is akin to stepping into a diverse sports betting universe. This bookmaker M88 Mansion caters to a variety of tastes, with a broad range of sports on offer for those eager to place their stakes.</span></p> <p><picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-sportsbook-970x476.jpg.webp 970w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-sportsbook-1170x574.jpg.webp 1170w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-sportsbook-768x377.jpg.webp 768w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-sportsbook-1536x753.jpg.webp 1536w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-sportsbook-1000x491.jpg.webp 1000w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-sportsbook.jpg.webp 1898w" sizes="(max-width: 970px) 100vw, 970px" type="image/webp"><img decoding="async" class="alignnone size-medium wp-image-11122 webpexpress-processed" src="https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-sportsbook-970x476.jpg" alt="M88 — Review Bookmaker Features, Offers, Pros & Cons for 2023" width="970" height="476" srcset="https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-sportsbook-970x476.jpg 970w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-sportsbook-1170x574.jpg 1170w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-sportsbook-768x377.jpg 768w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-sportsbook-1536x753.jpg 1536w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-sportsbook-1000x491.jpg 1000w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-sportsbook.jpg 1898w" sizes="(max-width: 970px) 100vw, 970px"></picture></p> <h3 id="most-popular-sports-betting-markets-in-m88-mansion"><span style="font-weight: 400;">Most Popular Sports Betting Markets in M88 Mansion</span></h3> <p><span style="font-weight: 400;">M88 offers several bookmakers to choose from such as MSports, Saba Sports, Pinnacle Sports, ParlaBay. Among the multitude of options for betting, several sports tend to attract the most attention. Let’s delve into these markets, which are a hit with punters frequenting the M88 Mansion betting site.</span></p> <ul> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><strong>Football Betting in M88 Mansion.</strong> A significant chunk of M88 Mansion bets is directed towards football, the global sport par excellence. Here, punters can place stakes on an array of leagues, from the English Premier League to La Liga, the Champions League to Bundesliga. This depth and variety make <a href="https://asian-bookies.net/football-betting-sites/">football betting</a> in M88 Mansion an enticing prospect for fans of the beautiful game.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><strong>Basketball.</strong> Basketball fans will not be disappointed with the offering at the sportsbook M88 Mansion. Whether it’s wagering on the nail-biting action of the NBA or exploring overseas leagues, the opportunities for <a href="https://asian-bookies.net/philippines-nba/">basketball betting</a> are extensive and engaging.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><strong>Cricket.</strong> For fans of the quintessential gentleman’s game, M88 Mansion doesn’t disappoint. Bettors can place their stakes on a wide array of <a href="https://asian-bookies.net/india/cricket/">cricket</a> tournaments, including the ever-popular <a href="https://asian-bookies.net/ipl-betting-sites/">IPL</a>, the Ashes series, or even the Cricket World Cup.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><strong>eSports.</strong> M88 Mansion has been quick to adapt to the rising popularity of eSports. Whether it’s betting on the competitive intensity of <a href="/esports-betting-sites/lol-league-of-legends/">League of Legends</a> or the strategic gameplay of <a href="/esports-betting-sites/dota-2/">Dota 2</a>, M88 Mansion offers a fantastic platform for eSports enthusiasts.</span></li> </ul> <h3 id="other-betting-markets-available-at-m88-mansion"><span style="font-weight: 400;">Other Betting Markets Available at M88 Mansion</span></h3> <p><span style="font-weight: 400;">Beyond these popular sports, the betting portfolio of M88 Mansion is significantly diverse. Other sports markets include tennis, where you can bet on the outcome of every serve or volley in grand slams or ATP tournaments. Golf enthusiasts can stake on tournaments like the Masters or the US Open.</span></p> <p><span style="font-weight: 400;">The depth of betting markets in M88 Mansion is truly impressive, accommodating bettors with different tastes and preferences. From football to eSports, from cricket to motorsports, M88 Mansion is a betting site that offers a vast range of possibilities for every punter.</span></p> <h2 id="live-betting-in-m88-mansion"><span style="font-weight: 400;">Live Betting in M88 Mansion</span></h2> <p><span style="font-weight: 400;">The thrill of in-play wagering is well catered to at M88 Mansion. The platform’s live betting M88 Mansion feature allows punters to place stakes on games and matches as they unfold in real time. The thrill of the game becomes more palpable as you watch odds change and make strategic live bets M88 Mansion, maximizing your potential for substantial winnings.</span></p> <h3 id="live-streaming-in-m88-mansion"><span style="font-weight: 400;">Live Streaming in M88 Mansion</span></h3> <p><span style="font-weight: 400;">Complementing live betting is the M88 Mansion live streaming feature. This provides an immersive betting experience, as it allows punters to watch games and observe shifts in momentum. However, this feature is available mainly for the eSports section and some other sections.</span></p> <h2 id="available-types-of-bets-on-m88-mansion"><span style="font-weight: 400;">Available Types of Bets on M88 Mansion</span></h2> <p><span style="font-weight: 400;">M88 Mansion stands out with its range of betting options. From the simplest single bets to more complex accumulator bets, the platform caters to different betting styles. If you enjoy increasing potential payouts by combining multiple selections into a single bet, the accumulator option is for you. M88 Mansion also offers combo systems of bets, adding flexibility by allowing you to win even if not all your selections are correct.</span></p> <h2 id="additional-betting-tools"><span style="font-weight: 400;">Additional Betting Tools</span></h2> <p><span style="font-weight: 400;">To enhance your betting journey, M88 Mansion provides additional tools. The M88 Mansion cash out feature, for instance, gives you control over your bets and the chance to take your winnings before a game ends. This feature is particularly beneficial if your bet is doing well but you suspect the tide might turn.</span></p> <h2 id="how-to-place-a-bet-at-m88-mansion"><span style="font-weight: 400;">How to Place a Bet at M88 Mansion?</span></h2> <p><span style="font-weight: 400;">As with most reputable betting platforms, placing a bet at M88 Mansion is a simple, straightforward process designed to get you into the action quickly. Here are the steps to follow:</span></p> <ol> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Sign into your M88 Mansion account. If you haven’t created an account yet, you’ll need to register first.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Browse through the array of sports and events available on the M88 Mansion homepage.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Click on your chosen event, and you’ll see the available betting markets.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Make your selection and decide on your stake. Your choice will appear on the bet slip on the right-hand side of the page.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Review your bet and the potential payout, then click on ‘Place Bet.’</span></li> </ol> <h3 id="how-to-place-a-stake-at-m88-mansion-with-the-app"><span style="font-weight: 400;">How to Place a Stake at M88 Mansion with the App?</span></h3> <p><span style="font-weight: 400;">Placing a bet via the M88 Mansion app follows a similar process and is just as straightforward, allowing you to place a wager wherever you are. Here are the steps:</span></p> <ol> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Log into the M88 Mansion app on your mobile device.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Navigate through the intuitive app interface to select your preferred sports event or betting market.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Tap on your desired bet, and your selection will be added to your virtual bet slip.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Decide the amount you want to stake, then review your potential returns.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Once you are satisfied with your bet, click ‘Place Bet,’ and your stake will be submitted.</span></li> </ol> <h2 id="our-experience-of-betting-on-m88-mansion"><span style="font-weight: 400;">Our experience of betting on M88 Mansion</span></h2> <p><span style="font-weight: 400;">Drawing on our betting expertise, our team decided to stake 500 USDT on M88 Mansion. We strategized to divide our funds into two bets – a prematch bet and an in-play bet. Our approach was to exploit the high odds in an underdog story, combined with the safety net of a popular market.</span></p> <p><span style="font-weight: 400;">For the prematch bet, we decided to dabble in the cricket market. Considering the high unpredictable nature of the sport, we placed 200 USDT on an outright bet for an underdog team in an upcoming international cricket series. The chosen team had shown promising form in the warm-up matches, leading us to believe they could pull off a surprise. The prematch outright bet had the potential for a high return given the underdog status.</span></p> <p><span style="font-weight: 400;">The remaining 300 USDT was reserved for an in-play bet during a Dota 2 eSports match. We followed the match live, waiting for the right moment to strike. When the favorite team lost their carry early in the mid-game, we seized the moment and placed an in-play bet on the underdog team. This allowed us to exploit the temporarily increased odds.</span></p> <p><span style="font-weight: 400;">Our strategy was based on balancing the potential high return of the underdog with the more predictable eSports market. The excitement of watching the matches live and making calculated decisions added to the thrill. It’s this combination of strategy, knowledge, and sometimes a little bit of luck, that can make betting on M88 Mansion both fun and rewarding.</span></p> <h2 id="m88-mansion-online-casino"><span style="font-weight: 400;">M88 Mansion Online Casino</span></h2> <p><span style="font-weight: 400;">The M88 Mansion online casino is a punter’s paradise, showcasing an expansive variety of games that cater to all tastes. It ensures every gambler’s needs are met, with everything from slots and table games to live dealer games.</span></p> <p><picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-casino-970x476.jpg.webp 970w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-casino-1170x574.jpg.webp 1170w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-casino-768x377.jpg.webp 768w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-casino-1536x753.jpg.webp 1536w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-casino-1000x491.jpg.webp 1000w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-casino.jpg.webp 1898w" sizes="(max-width: 970px) 100vw, 970px" type="image/webp"><img decoding="async" class="alignnone size-medium wp-image-11124 webpexpress-processed" src="https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-casino-970x476.jpg" alt="M88 — Review Bookmaker Features, Offers, Pros & Cons for 2023" width="970" height="476" srcset="https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-casino-970x476.jpg 970w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-casino-1170x574.jpg 1170w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-casino-768x377.jpg 768w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-casino-1536x753.jpg 1536w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-casino-1000x491.jpg 1000w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-casino.jpg 1898w" sizes="(max-width: 970px) 100vw, 970px"></picture></p> <p><span style="font-weight: 400;">M88 Mansion’s well-organized casino lobby allows for easy navigation between game categories. The site uses advanced software to provide high-quality graphics and a smooth gaming experience, making it one of the most user-friendly gambling platforms on the market.</span></p> <h2 id="providers-slot-games-available-at-m88-mansion"><span style="font-weight: 400;">Providers Slot Games Available at M88 Mansion</span></h2> <p><span style="font-weight: 400;">One of the things that make the M88 Mansion gambling site stand out is its collaboration with top-tier game providers. The platform hosts games from the likes of Playtech, NoLimit, Pragmatic Play, and many others, providing a diverse array of slot games that have amazing graphics, innovative themes, and intriguing gameplay. Whether you are looking for classic 3-reel slots or the latest 5-reel video slots, M88 Mansion casino games cater to every player’s preference.</span></p> <h2 id="is-m88-mansion-asian-and-hunting-slots-games-available"><span style="font-weight: 400;">Is M88 Mansion Asian and Hunting Slots Games Available?</span></h2> <p><span style="font-weight: 400;">Absolutely! M88 Mansion prides itself on its collection of Asian-themed slot games, aiming to provide a familiar and enjoyable experience for its primarily Asian clientele. You can find various slot games that incorporate Asian culture and mythology, such as “Lucky Chan Chu” or “Triple Tigers”. Moreover, for those players who prefer a more action-packed gaming experience, M88 Mansion also offers fishing and hunting slot games.</span></p> <h2 id="top-casino-games-available-at-m88-mansion"><span style="font-weight: 400;">Top Casino Games Available at M88 Mansion</span></h2> <p><span style="font-weight: 400;">While slots make up a large portion of the game library, the M88 Mansion online casino isn’t just about slot games. There’s an extensive range of top casino games to enjoy, including classics like Blackjack, Roulette, Baccarat, and Poker.</span></p> <p><span style="font-weight: 400;">The casino also boasts a live dealer section where players can gamble on games such as Live Roulette or Live Blackjack in real-time with professional dealers. This feature replicates the experience of a land-based casino, right from the comfort of your home.</span></p> <h2 id="live-casino-at-m88-mansion"><span style="font-weight: 400;">Live Casino at M88 Mansion</span></h2> <p><span style="font-weight: 400;">If you’re seeking the thrill of real-time gaming, M88 Mansion’s live casino is the place to be. Here, you can immerse yourself in an authentic casino environment, where professional dealers manage games broadcast live in high definition. Whether it’s Blackjack, Roulette, Baccarat, Dragon Tiger, or Sic Bo, you’ll feel like you’ve stepped into a Las Vegas casino, all from the comfort of your own home.</span></p> <p><picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-live_casino-970x476.jpg.webp 970w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-live_casino-1170x574.jpg.webp 1170w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-live_casino-768x377.jpg.webp 768w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-live_casino-1536x753.jpg.webp 1536w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-live_casino-1000x491.jpg.webp 1000w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-live_casino.jpg.webp 1898w" sizes="(max-width: 970px) 100vw, 970px" type="image/webp"><img decoding="async" class="alignnone size-medium wp-image-11125 webpexpress-processed" src="https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-live_casino-970x476.jpg" alt="M88 — Review Bookmaker Features, Offers, Pros & Cons for 2023" width="970" height="476" srcset="https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-live_casino-970x476.jpg 970w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-live_casino-1170x574.jpg 1170w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-live_casino-768x377.jpg 768w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-live_casino-1536x753.jpg 1536w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-live_casino-1000x491.jpg 1000w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-live_casino.jpg 1898w" sizes="(max-width: 970px) 100vw, 970px"></picture></p> <h2 id="live-games-providers-in-m88-mansion"><span style="font-weight: 400;">Live Games Providers in M88 Mansion</span></h2> <p><span style="font-weight: 400;">M88 Mansion collaborates with prominent live games providers to ensure top-notch gaming quality. Renowned names like Pragmatic Play or MG Live, supply their flagship live dealer games, guaranteeing an unbeatable gaming experience. These providers are known for their interactive features, multiple camera angles, and friendly, professional dealers, ensuring a realistic and enjoyable live gaming session on M88 Mansion.</span></p> <h2 id="advantages-of-live-casino-games-at-m88-mansion"><span style="font-weight: 400;">Advantages of Live Casino Games at M88 Mansion</span></h2> <p><span style="font-weight: 400;">There are several advantages to playing live dealer games on M88 Mansion. First and foremost, you have the opportunity to interact with the dealers and other players, creating a social atmosphere that mimics that of a land-based casino.</span></p> <p><span style="font-weight: 400;">Secondly, M88 Mansion guarantees fairness and transparency in all their games. You can watch the dealer shuffle and deal the cards, or spin the roulette wheel, eliminating any doubts about the integrity of the game.</span></p> <p><span style="font-weight: 400;">Lastly, M88 Mansion’s live casino is available around the clock. Regardless of your schedule, you can always find a game to join, whether it’s early in the morning or late at night.</span></p> <p><span style="font-weight: 400;">Playing with real dealers on M88 Mansion is not just about the games; it’s about the entire immersive experience. It’s the closest you can get to a physical casino without leaving your living room.</span></p> <h2 id="instant-games-at-m88-mansion"><span style="font-weight: 400;">Instant Games at M88 Mansion</span></h2> <p><span style="font-weight: 400;">For those who crave quick betting games with high stakes and fast-paced action, M88 Mansion offers an impressive selection of instant games. These games combine simplicity, speed, and the potential for high returns, which makes them a favorite among punters at M88 Mansion. The ‘crash’ style games in particular, such as Aviator and JetX, have proven to be a hit.</span></p> <h3 id="aviator-at-m88-mansion"><span style="font-weight: 400;">Aviator at M88 Mansion</span></h3> <p><span style="font-weight: 400;">Aviator is one of the most popular social casino games at M88 Mansion. Its simple mechanics, combined with its unpredictability, make it an exciting choice for quick thrill-seekers. Players bet on an increasing multiplier, aiming to cash out before it crashes. The longer you hold out, the higher your potential win – but wait too long, and you could lose everything. Each round in the Aviator game at M88 Mansion promises a new adrenaline-pumping adventure.</span></p> <h3 id="jetx-at-m88-mansion"><span style="font-weight: 400;">JetX at M88 Mansion</span></h3> <p><span style="font-weight: 400;">JetX, another exciting crash game on M88 Mansion, carries the same electrifying tension. Here, a spaceship takes off, and the multiplier increases along with its height. The trick is to predict when the spaceship will crash and cash out beforehand. JetX game at M88 Mansion is more than just a game of luck; it’s a test of nerve and strategy, where timing is everything.</span></p> <h2 id="how-to-start-play-at-casino-m88-mansion"><span style="font-weight: 400;">How to Start Play at Casino M88 Mansion?</span></h2> <p><span style="font-weight: 400;">Commencing your gaming journey at M88 Mansion is straightforward. The first step is registration. Head over to the M88 Mansion website, click on the ‘Join Now’ button, and fill in the necessary information. Following email verification, log in to your newly created account. Now you’re ready to deposit funds. Navigate to the ‘Cashier’ or ‘Banking’ section, choose your preferred deposit method, and follow the instructions to complete the transaction. Once your deposit is successful, it’s time to hit the games. Browse the extensive library of casino games on M88 Mansion and select your favorite. Click on it, adjust your bet, and you’re good to go. Remember, playing responsibly is key to enjoying your experience at M88 Mansion.</span></p> <h3 id="how-to-start-play-at-m88-mansion-via-app"><span style="font-weight: 400;">How to Start Play at M88 Mansion via App?</span></h3> <p><span style="font-weight: 400;">If you prefer gaming on the go, M88 Mansion has you covered with its intuitive mobile app. First, download the M88 Mansion app from the website or respective app stores and install it on your device. Open the app and register for an account or log in if you already have one. Now, proceed to deposit funds into your account. The ‘Cashier’ or ‘Banking’ section is conveniently located within the app’s user-friendly interface for quick access. Once your account is topped up, navigate to the casino section, choose your game, set your stake, and start playing. With M88 Mansion’s mobile app, a world-class casino experience is just a few taps away.</span></p> <h2 id="our-experience-of-gamble-in-casino-m88-mansion"><span style="font-weight: 400;">Our experience of gamble in casino M88 Mansion</span></h2> <p><span style="font-weight: 400;">Entering the M88 Mansion virtual casino floor with a budget of 500 USDT, we were immediately taken in by the grand variety of games on offer. As per the plan, we decided to divide our budget between a slot game and a live game, allocating 250 USDT to each.</span></p> <p><span style="font-weight: 400;">Our choice for the slot game was the popular “Gonzo’s Quest” from NetEnt. Known for its adventurous theme and lucrative bonus features, we hoped to ride the luck with Gonzo. We decided to stick to a modest betting strategy, wagering 5 USDT per spin. Over more than 20 spins, we experienced a mix of small wins and losses and our balance didn’t change.</span></p> <p><span style="font-weight: 400;">Following the exhilarating slots experience, we switched gears to live casino action. We chose “Immersive Roulette”, a live roulette game known for its high-quality streaming and interactive gaming experience. Given the unpredictable nature of roulette, we decided to follow the Martingale betting strategy. Starting with a 10 USDT bet on ‘Red’, we planned to double our bet after each loss. However, the game proved volatile, with a mix of red and black outcomes. After some ups and downs, we ended up with a net loss.</span></p> <p><span style="font-weight: 400;">Overall, our M88 Mansion casino experience was thrilling. Though the unpredictability of the games meant some losses, the overall gameplay, smooth navigation, and immersive experience were impressive. Remember, the point of online casinos is to enjoy the games and gamble responsibly, making sure to keep within your budget. M88 Mansion is an excellent venue for this, offering a wide variety of games to suit every taste.</span></p> <h2 id="m88-mansion-online-poker-room"><span style="font-weight: 400;">M88 Mansion Online Poker Room</span></h2> <p><span style="font-weight: 400;">As a dedicated platform catering to a wide range of betting and gaming needs, M88 Mansion has been widely recognized for its vast array of options. However, it’s important to note that while M88 Mansion offers an impressive assortment of gambling activities, the platform currently does not operate a standalone online poker room. Instead, it offers an alternative that combines the thrill of poker with the ease of online casino games: video poker.</span></p> <h2 id="m88-mansion-100-sports-welcome-bonus"><span style="font-weight: 400;">M88 Mansion 100% Sports Welcome Bonus</span></h2> <p><span style="font-weight: 400;">M88 Mansion offers a lucrative Welcome Bonus for new players, featuring a 100% Sports Welcome Bonus. This promotion caters exclusively to new Malaysian registrations. Upon a minimum first deposit of MYR 30, players can benefit from a matched bonus up to MYR 388. The bonus is applicable for SABA and PINNACLE sports betting.</span></p> <p><picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-VIP-970x476.jpg.webp 970w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-VIP-1170x574.jpg.webp 1170w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-VIP-768x377.jpg.webp 768w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-VIP-1536x753.jpg.webp 1536w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-VIP-1000x491.jpg.webp 1000w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-my-VIP.jpg.webp 1898w" sizes="(max-width: 970px) 100vw, 970px" type="image/webp"><img decoding="async" class="alignnone size-medium wp-image-11123 webpexpress-processed" src="https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-VIP-970x476.jpg" alt="M88 — Review Bookmaker Features, Offers, Pros & Cons for 2023" width="970" height="476" srcset="https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-VIP-970x476.jpg 970w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-VIP-1170x574.jpg 1170w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-VIP-768x377.jpg 768w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-VIP-1536x753.jpg 1536w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-VIP-1000x491.jpg 1000w, https://asian-bookies.net/wp-content/uploads/2022/11/m88-my-VIP.jpg 1898w" sizes="(max-width: 970px) 100vw, 970px"></picture></p> <h3 id="100-sports-welcome-bonus-wagering-requirements"><span style="font-weight: 400;">‘100% Sports Welcome Bonus’ Wagering Requirements</span></h3> <p><span style="font-weight: 400;">However, this bonus comes with wagering requirements, specifically an 18x rollover for the deposit and bonus. For instance, if a new player deposits MYR 100, they will receive an equal bonus of MYR 100. To meet the rollover requirement, the player needs to bet a total of MYR 3,600 [(100 deposit + 100 bonus) x 18].</span></p> <p><span style="font-weight: 400;">It’s crucial to note that the bonus is valid for 14 days from issuance and the rollover must be fulfilled within this period. The requirement is considered met if the account balance is MYR 1 or less.</span></p> <h2 id="188-welcome-bonus"><span style="font-weight: 400;">188% WELCOME BONUS</span></h2> <p><span style="font-weight: 400;">M88 Mansion provides a substantial 188% Welcome Bonus to its new players. This generous bonus applies to new members looking to try their luck in Casino Slots, with the opportunity to claim up to MYR 888.</span></p> <p><span style="font-weight: 400;">To be eligible for this enticing offer, new members need to make a successful deposit of at least MYR 30. Upon verification of this deposit, the bonus amount is credited to their Casino Slots account. Players should be aware that the first deposit must be placed within 30 days of signing up to qualify for this bonus.</span></p> <h3 id="188-welcome-bonus-wagering-requirements"><span style="font-weight: 400;">‘188% WELCOME BONUS’ Wagering Requirements</span></h3> <p><span style="font-weight: 400;">However, there are certain wagering requirements. Players must meet a 28x rollover requirement in Casino Slots before making a withdrawal. This means the deposit and bonus amount need to be wagered 28 times within 14 days of the bonus issuance. Note that only casino slot games count towards this wagering contribution.</span></p> <p><span style="font-weight: 400;">This bonus cannot be combined with other M88 Mansion promotions and can only be claimed once during the promotional period. Please refer to the platform for a complete list of included and excluded games for wagering contribution. Failing to meet these requirements within the specified time could result in the forfeiture of both the bonus and the winnings derived from it.</span></p> <h2 id="188-e-sports-welcome-bonus"><span style="font-weight: 400;">188% E-SPORTS WELCOME BONUS</span></h2> <p><span style="font-weight: 400;">M88 Mansion also presents an exclusive 188% E-Sports Welcome Bonus for its newly registered players to boost the initial esports betting experience with a maximum bonus of MYR 588. The bonus comes with an 18x rollover requirement and applies to Pinnacle Esports, SABA Esports, and TF Gaming.</span></p> <p><span style="font-weight: 400;">To be eligible for this exciting bonus, new members must make a minimum first deposit of MYR 30 within 30 days from their registration.</span></p> <h3 id="188-e-sports-welcome-bonus-wagering-requirements"><span style="font-weight: 400;">‘188% E-SPORTS WELCOME BONUS’ Wagering Requirements</span></h3> <p><span style="font-weight: 400;">The amount of bonus, if a deposit of MYR 100 is made, would be 188% X MYR 100 = MYR 188. The rollover requirement for this bonus becomes (MYR 100 + 188) x 18 = MYR 5,184. This requirement must be met within 14 days from the bonus issuance, and the rollover will be considered fulfilled if the account balance is MYR 1 or less. It’s important to note that draw bets, void bets, bets with decimal odds below 1.50, and bets on excluded games are not included in the rollover calculation.</span></p> <p><span style="font-weight: 400;">This bonus cannot be used in conjunction with other M88 Mansion promotions and can be claimed only once during the promotion period. Ensuring to meet these requirements will prevent forfeiture of the bonus and the winnings derived from it.</span></p> <h2 id="m88-mansion-bonuses-and-promotions"><span style="font-weight: 400;">M88 Mansion Bonuses and Promotions</span></h2> <p><span style="font-weight: 400;">M88 Mansion is an online betting platform that goes above and beyond to provide its players with exceptional bonuses and promotions. A key element that sets it apart in the competitive casino landscape is its wide array of enticing offers that not only welcome new players but also reward the existing ones.</span></p> <p><span style="font-weight: 400;">There are many promotions in the promotions section, such as Rebate and cashbacks. In addition, temporary offers such as tournament bonuses and extra spins are constantly appearing on the site.</span></p> <p><span style="font-weight: 400;">However, at the time of writing this review, M88 Mansion does not offer the popular classic deposit bonuses. In addition, we cannot provide a description of other promotions in this article, since the list of offers, their conditions and bonuses are constantly changing. For more recent, detailed information, please visit the official M88 Mansion website.</span></p> <h2 id="m88-mansions-vip-loyalty-program-the-prestige-club"><span style="font-weight: 400;">M88 Mansion’s VIP Loyalty Program: The Prestige Club</span></h2> <p><span style="font-weight: 400;">The M88 Mansion’s Prestige Club is a unique loyalty program, specially designed to provide an unparalleled gaming experience for its valued members, replete with a wealth of privileges and benefits.</span></p> <p><span style="font-weight: 400;">This VIP loyalty program works by rewarding members with VIP points every time they make deposits or play games like Live Casino, Sports, Slots, and Keno & Lotto. Accumulated points can result in automatic upgrades through various VIP tiers, each with its own set of requirements and benefits.</span></p> <p><span style="font-weight: 400;">The Prestige Club comprises of five distinct levels:</span></p> <ul> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><strong>Bronze:</strong> Entry-level, requires 0 points, with a qualification period of 30 days and no sustainment period.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><strong>Silver:</strong> Requires 100 points, with a qualification and sustainment period of 30 days each.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><strong>Gold:</strong> Requires 1,000 points, has a qualification period of 30 days and a sustainment period of 90 days.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><strong>Platinum:</strong> Requires 3,000 points, with a qualification period of 30 days and a sustainment period of 180 days.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><strong>Diamond:</strong> This top tier is by invitation only, with a qualification period of 30 days and an impressive sustainment period of 360 days.</span></li> </ul> <p><span style="font-weight: 400;">Members can earn points in a variety of ways. For instance, a deposit of MYR 80 grants one VIP point, whereas turnovers of MYR 4,000 in Live Casino or MYR 800 in Sports and Casino/Fishing games also earn a member one VIP point.</span></p> <p><span style="font-weight: 400;">This loyalty program is applicable to all M88 members, but each player is restricted to only one account. It is worth noting that the program is primarily intended for recreational players, and M88 reserves the right to limit the eligibility of customers to participate in any promotion.</span></p> <h2 id="promo-codes-how-to-get-and-use-promocodes-at-m88-mansion"><span style="font-weight: 400;">Promo Codes: How to get and use promocodes at M88 Mansion?</span></h2> <p><span style="font-weight: 400;">Using promocodes at M88 Mansion can significantly enhance your online gaming experience by giving you access to exclusive bonuses and promotions. Getting your hands on a M88 Mansion promocode can be as simple as visiting their promotions page, signing up for their newsletters, or participating in their regular events and tournaments.</span></p> <p><span style="font-weight: 400;">Once you’ve obtained a promo code you can use it. When making a deposit, just enter the promo codes M88 Mansion has provided in the designated ‘promocode’ field. The bonus associated with the code will automatically be added to your account once your deposit is successful. It’s a quick and efficient way to boost your betting power.</span></p> <p><span style="font-weight: 400;">Remember, each promo code comes with its own terms and conditions, such as wagering requirements and validity period.</span></p> <h2 id="m88-mansion-payment-methods"><span style="font-weight: 400;">M88 Mansion Payment Methods</span></h2> <p><span style="font-weight: 400;">As a part of our review, it’s essential to assess the deposit and withdrawal methods at M88 Mansion. The platform caters to a broad global audience, offering an array of payment options to ensure players can fund their accounts and withdraw their winnings with ease.</span></p> <h3 id="available-deposit-and-withdrawal-methods-at-m88-mansion"><span style="font-weight: 400;">Available Deposit and Withdrawal Methods at M88 Mansion</span></h3> <p><span style="font-weight: 400;">The deposit methods M88 Mansion provides include popular choices like credit and debit cards (Visa and MasterCard), e-wallets such as Skrill and Neteller, and bank transfers. These options are carefully selected to provide convenience and security to users from different regions worldwide.</span></p> <p><span style="font-weight: 400;">Likewise, when it comes to withdrawal methods M88 Mansion offers, the process is equally straightforward. Players can withdraw their winnings using their preferred method from the list, including e-wallets and bank transfers. Each withdrawal method is subject to specific processing times and may incur a fee, so it’s always wise to review the conditions associated with each option before making a decision.</span></p> <p><span style="font-weight: 400;">One thing to note when managing transactions with M88 Mansion is the deposit and withdrawal limits. The minimum deposit M88 Mansion allows varies depending on the chosen payment method, but it typically caters to all levels of players.</span></p> <p> </p> <table> <tbody> <tr> <td><span style="font-weight: 400;">Minimum deposit </span></td> <td><span style="font-weight: 400;">£1.00</span></td> </tr> <tr> <td><span style="font-weight: 400;">Minimum withdraw </span></td> <td><span style="font-weight: 400;">£1.00</span></td> </tr> <tr> <td><span style="font-weight: 400;">Maximum withdraw</span></td> <td><span style="font-weight: 400;">£10000.00</span></td> </tr> </tbody> </table> <p> </p> <h3 id="how-to-deposit-money-at-m88-mansion"><span style="font-weight: 400;">How to Deposit Money at M88 Mansion?</span></h3> <p><span style="font-weight: 400;">Depositing money at M88 Mansion is a simple process. Start by logging into your account and clicking the ‘Deposit’ button. You’ll then be asked to choose your deposit method from the list. After selecting the preferred method, enter the amount you want to deposit (ensuring it meets the minimum deposit M88 Mansion requirement) and follow the on-screen prompts to complete the transaction.</span></p> <h3 id="how-to-withdraw-money-from-m88-mansion"><span style="font-weight: 400;">How to Withdraw Money from M88 Mansion?</span></h3> <p><span style="font-weight: 400;">Withdrawing money from M88 Mansion is equally straightforward. After logging in, select the ‘Withdraw’ option. You’ll then need to choose your preferred withdrawal method and enter the amount you wish to withdraw (keeping the minimum and maximum withdraw M88 Mansion limits in mind). After confirming your withdrawal, the request is processed, and your funds are released as per the processing time of the chosen method.</span></p> <h2 id="registration-at-m88-mansion-how-to-sign-up"><span style="font-weight: 400;">Registration at M88 Mansion: How to Sign Up?</span></h2> <p><span style="font-weight: 400;">To start your journey with M88 Mansion, the initial step is creating an account. The sign-up process is straightforward, and we’ll guide you through it step by step.</span></p> <ol> <li><span style="font-weight: 400;"><strong>Step1:</strong> Visit M88 Mansion. Start by visiting the M88 Mansion official site. You can follow the link to the official site or use our mirror link if required. Ensure that you’re visiting a secure site, denoted by the padlock symbol in the URL bar, to protect your personal information.</span></li> <li><span style="font-weight: 400;"><strong>Step 2:</strong> Sign Up . Once you’re on the homepage, you’ll find the “Sign Up” or “Register” button usually located at the top right corner. Clicking on it will direct you to the registration page. This step is your gateway to the M88 Mansion login process, where you’ll fill out the registration form with the required information, including your name, email address, password, and contact details.</span></li> <li><span style="font-weight: 400;"><strong>Step 3:</strong> Make a Deposit. After signing up, the next step involves making a deposit. This process is made easy with the various deposit methods M88 Mansion provides. Select a payment method that is convenient for you and deposit funds into your account, ensuring you meet the minimum deposit requirement.</span></li> <li><span style="font-weight: 400;"><strong>Step 4:</strong> Place a Stakes. Now that you’re all set with a funded account, you’re ready to start staking. Choose your preferred games or sports, study the odds, and place your stakes. Remember, always gamble responsibly.</span></li> </ol> <h3 id="registration-requirements"><span style="font-weight: 400;">Registration Requirements</span></h3> <p><span style="font-weight: 400;">Registering at M88 Mansion requires you to be at least 18 years of age, a legal requirement for all online gambling platforms. It’s also essential to ensure that online gambling is legal in your jurisdiction.</span></p> <p><span style="font-weight: 400;">While signing up, ensure that all your details are accurate. False information can lead to difficulties when withdrawing your winnings. M88 Mansion also prohibits the creation of multiple accounts by the same individual.</span></p> <h3 id="how-to-register-with-the-mobile-app"><span style="font-weight: 400;">How to register with the mobile app?</span></h3> <p><span style="font-weight: 400;">If you prefer gaming on the go, you can register M88 Mansion through their mobile app. The app is designed for both iOS and Android devices, offering a sleek and user-friendly interface. You can download the app from the official website or your device’s app store.</span></p> <p><span style="font-weight: 400;">The sign-up process via the app mirrors the web process. Once the app is installed, click on the sign-in button, fill in the registration form, and create your account. You can then make your first deposit and start placing stakes.</span></p> <h3 id="how-to-get-a-welcome-bonus-m88-mansion-with-registration"><span style="font-weight: 400;">How to Get a Welcome Bonus M88 Mansion with Registration?</span></h3> <p><span style="font-weight: 400;">One of the exciting aspects of registering on M88 Mansion is the opportunity to receive a welcome bonus. This bonus is typically offered to new members as a way of boosting their initial betting funds.</span></p> <p><span style="font-weight: 400;">To claim this bonus, ensure to check the “Claim Bonus” box during the registration process or enter a promo code if one is required.</span></p> <h2 id="m88-mansion-account-verification-instruction"><span style="font-weight: 400;">M88 Mansion Account Verification Instruction</span></h2> <p><span style="font-weight: 400;">Account verification is a crucial step at M88 Mansion, designed to protect both the player and the platform by ensuring the authenticity of the account.</span></p> <p><span style="font-weight: 400;">Upon registering, new users may need to verify their accounts. This process, often referred to as KYC (Know Your Customer), typically involves providing certain documents to prove your identity and address. Acceptable forms of identification can include a passport, driving license, or national ID card. To verify your address, you may be asked to submit a utility bill, bank statement, or any other official document that clearly shows your name and residential address.</span></p> <p><span style="font-weight: 400;">Once the documents are submitted, the M88 Mansion team will review them. This verification process may take a few days, but rest assured, your account will be fully functional during this period. You will be notified once your account is verified. If there are any issues, M88 Mansion’s customer service will reach out for additional information.</span></p> <p><span style="font-weight: 400;">Please remember that the verification process is a one-time procedure. Once completed, you will not be asked to go through it again. This procedure not only keeps your account secure but also ensures smooth transactions in the future, such as when making withdrawals from your winnings.</span></p> <h2 id="m88-mansion-mobile-app-for-android-and-ios"><span style="font-weight: 400;">M88 Mansion Mobile App for Android and iOS</span></h2> <p><span style="font-weight: 400;">The M88 Mansion mobile application offers a seamless gaming and betting experience right at your fingertips, available for both Android and iOS systems. The app is an ideal choice for users who prefer to bet on the go, without any constraints on time or location.</span></p> <h3 id="system-requirements-m88-mansion-app-for-android-and-ios"><span style="font-weight: 400;">System Requirements M88 Mansion App for Android and iOS</span></h3> <p><span style="font-weight: 400;">The M88 Mansion app for Android requires an operating system of 4.4 and above, ensuring its compatibility with a wide range of Android devices. On the other hand, the app M88 Mansion for iOS requires an iOS version of 9.0 or later and is compatible with iPhone, iPad, and iPod touch. These system requirements ensure smooth performance and seamless navigation for users on both platforms.</span></p> <h3 id="how-to-download-m88-mansion-apk-for-android"><span style="font-weight: 400;">How to download M88 Mansion APK for Android?</span></h3> <p><span style="font-weight: 400;">Downloading the M88 Mansion APK on Android is a straightforward process. Due to Google Play Store’s restrictions on gambling apps, the APK needs to be downloaded directly from the M88 Mansion official site. Navigate to the site using your mobile browser, and look for the section that offers the Android app download. Click on the download button and the APK file will be downloaded onto your device.</span></p> <h3 id="how-to-install-m88-mansion-app-on-android"><span style="font-weight: 400;">How to install M88 Mansion App on Android?</span></h3> <p><span style="font-weight: 400;">Once the APK file is downloaded, the next step is to install the M88 Mansion app. Before proceeding, ensure that your device allows installation from unknown sources. This setting can be found and enabled in the security settings of your Android device. After enabling, locate the downloaded APK file in your device’s file manager and tap on it to start the installation. Follow the prompts on your screen, and in a few moments, the M88 Mansion app will be installed and ready for use.</span></p> <h3 id="how-to-download-and-install-m88-mansion-app-on-ios"><span style="font-weight: 400;">How to download and install M88 Mansion App on iOS?</span></h3> <p><span style="font-weight: 400;">For iOS users, the M88 Mansion app can be downloaded directly from the Apple App Store. Simply open the App Store on your device, type “M88 Mansion” into the search bar, and tap on “Get” to start the download. Once downloaded, the app will automatically install itself on your device. Just like any other app, the M88 Mansion icon will appear on your home screen, ready for you to open and start betting.</span></p> <h3 id="how-to-update-m88-mansion-app"><span style="font-weight: 400;">How to Update M88 Mansion App?</span></h3> <p><span style="font-weight: 400;">Regular updates are crucial to ensure the best user experience, as they often contain new features, bug fixes, and security enhancements. Android users can check the M88 Mansion website for any available updates and download the latest APK file. For iOS users, any available updates will be displayed in the App Store under “Updates”. Just tap on “Update” next to the M88 Mansion app, and the latest version will be installed.</span></p> <h2 id="tips-and-best-practices-for-playing-at-m88-mansion"><span style="font-weight: 400;">Tips and Best Practices for Playing at M88 Mansion</span></h2> <p><span style="font-weight: 400;">Playing at M88 Mansion can be an exciting and rewarding experience. To enhance your gameplay and maximize your chances of success, we make some tips and best practices.</span></p> <p><span style="font-weight: 400;">Understand the Games: Before diving into any game, take the time to understand its rules, strategies, and odds. Familiarize yourself with different game variations and betting options to make informed decisions.</span></p> <p><span style="font-weight: 400;">Set a Budget: It’s essential to establish a budget and stick to it. Determine how much you’re willing to spend and never exceed that amount. Gambling should always be for entertainment purposes, and you should never gamble with money you can’t afford to lose.</span></p> <p><span style="font-weight: 400;">Take Advantage of Promotions: M88 Mansion offers various promotions and bonuses to its players. Keep an eye out for these offers and take advantage of them when applicable. However, be sure to read and understand the terms and conditions associated with each promotion.</span></p> <p><span style="font-weight: 400;">Practice Bankroll Management: Proper bankroll management is crucial for long-term success. Divide your bankroll into smaller units and set limits on how much you wager per bet or game. This strategy helps you manage your funds effectively and minimizes the risk of significant losses.</span></p> <p><span style="font-weight: 400;">Know When to Take Breaks: Gambling can be exhilarating, but it’s important to take regular breaks to maintain focus and avoid making impulsive decisions. Set time limits for your gaming sessions and step away when needed.</span></p> <p><span style="font-weight: 400;">Play Responsibly: Gambling should always be approached responsibly. Avoid chasing losses, and if you find yourself getting too caught up in the excitement, take a step back. It’s important to maintain a healthy balance between gambling and other aspects of your life.</span></p> <p><span style="font-weight: 400;">Seek Support if Needed: If you ever feel that gambling is becoming a problem or interfering with your daily life, don’t hesitate to seek help. Many resources are available for those experiencing gambling-related issues, such as helplines and support groups.</span></p> <p><span style="font-weight: 400;">By following these tips, you can enhance your overall experience at M88 Mansion while keeping your gaming responsible and enjoyable. Remember to prioritize fun and never gamble beyond your means.</span></p> <h2 id="m88-mansion-mobile-website"><span style="font-weight: 400;">M88 Mansion Mobile Website</span></h2> <p><span style="font-weight: 400;">The M88 Mansion mobile website provides a convenient way to access the platform and enjoy your favorite games on the go. The mobile website features a user-friendly interface, making it easy to navigate and find your desired games. The layout is designed to provide smooth and hassle-free browsing, ensuring you can quickly access various sections of the site.</span></p> <h3 id="how-to-use-the-m88-mansion-mobile-website"><span style="font-weight: 400;">How to Use the M88 Mansion Mobile Website?</span></h3> <p><span style="font-weight: 400;">To use the M88 Mansion mobile website, open your preferred mobile browser and enter the M88 Mansion website address. The mobile version of the site will automatically load, optimized for a seamless mobile gaming experience.</span></p> <p><span style="font-weight: 400;">The mobile website offers a wide range of casino games, sports betting options, and more. Browse through the available categories or use the search function to find specific games or events you’re interested in.</span></p> <p><span style="font-weight: 400;">Whether you’re into sports betting or casino games, the mobile website allows you to place bets with ease. Simply select your preferred game or event, choose your betting options, and enter the desired stake. Confirm your bet, and you’re good to go.</span></p> <p><span style="font-weight: 400;">The mobile website also enables you to manage your account effectively. You can access features such as deposits, withdrawals, and account settings right from your mobile device. Keep track of your balance, view transaction history, and update personal details whenever needed.</span></p> <h2 id="m88-mansion-license-and-fairness"><span style="font-weight: 400;">M88 Mansion License and Fairness</span></h2> <p><span style="font-weight: 400;">M88 Mansion operates under a valid and reputable license issued by the Ministry of Finance and Economic Development, ensuring a secure and fair gaming environment for its players. The license signifies that the platform adheres to strict regulations and standards set by the licensing authority. This provides peace of mind to players, knowing that their gameplay is protected and monitored.</span></p> <p><span style="font-weight: 400;">Additionally, M88 Mansion employs advanced technologies, such as random number generators (RNGs), to ensure fairness in all its games. These RNGs generate random outcomes, guaranteeing that each game result is independent and unbiased.</span></p> <h2 id="m88-mansion-customer-support"><span style="font-weight: 400;">M88 Mansion Customer Support</span></h2> <p><span style="font-weight: 400;">M88 Mansion takes customer support seriously and offers various channels for players to seek assistance when needed. The customer support team is dedicated to providing timely and helpful responses to any inquiries or issues you may encounter.</span></p> <p><span style="font-weight: 400;">You can reach M88 Mansion’s customer support through multiple channels, including email, live chat, and phone. The support team is available 24/7, ensuring that you can get the help you need, regardless of the time.</span></p> <h2 id="final-opinion-on-m88-mansion-as-bookmaker-and-online-casino"><span style="font-weight: 400;">Final Opinion on M88 Mansion as bookmaker and online casino</span></h2> <p><span style="font-weight: 400;">In conclusion, M88 Mansion emerges as a dynamic and exciting bookmaker and online casino platform, a real giant on the market. With its plethora of bonuses and cashbacks, players are treated to a rewarding gaming experience. The extensive coverage of cricket events showcases M88 Mansion’s commitment to offering diverse sports markets. Moreover, the availability of both fiat and crypto payment methods adds convenience for users. However, it is important to note that certain country and regional restrictions apply, limiting access for some potential players. Additionally, the absence of dedicated poker rooms may be a drawback for poker enthusiasts. Despite these limitations, M88 Mansion continues to captivate users with its competitive odds, user-friendly interface, and ever-evolving promotional offers. For those seeking an all-encompassing gaming destination, M88 Mansion proves to be an enticing choice.</span></p> <p> <strong> <em>Read this page in other languages:</em> </strong> </p> <ul> <li> <a href="https://asian-bookies.net/id/?post_type=prp_reviews&p=13871">Bahasa Indonesia: M88 Mansion – Indonesia</a> </li> <li> <a href="https://asian-bookies.net/ja/?post_type=prp_reviews&p=13873">日本語: M88 Mansion – Japan</a> </li> <li> <a href="https://asian-bookies.net/vi/?post_type=prp_reviews&p=13872">Tiếng Việt: M88 Mansion – Vietnam</a> </li> <li> <a href="https://asian-bookies.net/th/?post_type=prp_reviews&p=13868">ไทย: M88 Mansion – Thailand</a> </li> <li> <a href="https://asian-bookies.net/zh/?post_type=prp_reviews&p=13870">中文 (中国): M88 Mansion – China / Singapore</a> </li> <li> <a href="https://asian-bookies.net/km/?post_type=prp_reviews&p=13874">ភាសាខ្មែរ: M88 Mansion – Cambodia</a> </li> </ul> <h2 id="accepted-cryptocurrencies">Accepted Cryptocurrencies</h2> <div class="g-toggle-list g-toggle-list--w-icon"><ul> <li > <img src="https://asian-bookies.net/wp-content/uploads/2022/11/USD.svg" alt=""> <span>USD</span> </li> <li > <img src="https://asian-bookies.net/wp-content/uploads/2022/11/EUR.svg" alt=""> <span>EUR</span> </li> </ul></div> <h2 id="available-games">Available Games</h2> <div class="g-toggle-list g-toggle-list--w-icon"><ul> <li > <i class="list-check-icon"></i> <span>Sports Betting</span> </li> <li > <i class="list-check-icon"></i> <span>Roulette</span> </li> <li > <i class="list-check-icon"></i> <span>Baccarat</span> </li> </ul></div> <h2 id="supported-languages">Supported Languages</h2> <div class="g-toggle-list g-toggle-list--w-icon"><ul> <li > <img src="https://asian-bookies.net/wp-content/uploads/2022/11/Rectangle-1162.svg" alt=""> <span>English</span> </li> <li > <img src="https://asian-bookies.net/wp-content/uploads/2022/11/Chinese.svg" alt=""> <span>Chinese</span> </li> <li > <img src="https://asian-bookies.net/wp-content/uploads/2022/11/Rectangle-1162-3-1.svg" alt=""> <span>Hindi</span> </li> <li > <img src="https://asian-bookies.net/wp-content/uploads/2022/11/Rectangle-1163-8.svg" alt=""> <span>Thai</span> </li> <li > <img src="https://asian-bookies.net/wp-content/uploads/2022/11/Rectangle-1162-4.svg" alt=""> <span>Japanese</span> </li> </ul></div> <div class="pros-cons-block -small-fs"> <div class="pros-cons-block__block -pros"> <div class="pros-cons-block__title">Pros</div> <div class="pros-cons-block__content"><ul> <li><span style="font-weight: 400;">Diverse range of bonuses and cashbacks available.</span></li> <li><span style="font-weight: 400;">Extensive coverage of cricket events.</span></li> <li><span style="font-weight: 400;">Wide selection of payment methods, including both fiat and crypto options.</span></li> <li><span style="font-weight: 400;">Competitive odds and attractive betting options.</span></li> <li><span style="font-weight: 400;">User-friendly and intuitive website interface.</span></li> <li><span style="font-weight: 400;">A modern site with a choice of color schemes.</span></li> <li><span style="font-weight: 400;">Choice of several bookmakers.</span></li> </ul> </div> </div> <div class="pros-cons-block__block -cons"> <div class="pros-cons-block__title">Cons</div> <div class="pros-cons-block__content"><ul> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Restrictions for players from certain countries and regions.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Absence of dedicated poker rooms.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Frequent changes in promotional offers.</span></li> </ul> </div> </div> </div> </article> </div> <div class="rev-page-first-block--side"> <div class="review-page--side-rating--wrapper"> <div class="review-page--side-rating"> <div class="rp-side-rating__val">5/5</div> <div class="main-stars-block rp-side-rating__stars"> <i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i> </div> <div class="rp-side-rating__title"> Overall Rating </div> </div> <div class="review-page--side-rating--items"> <div class="li"> <div class="label">Bonuses</div> <div class="val-grid"> <div class="main-stars-block"> <i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i> </div> <span class="rating-val">10/5</span> </div> </div> <div class="li"> <div class="label">Look & Feel</div> <div class="val-grid"> <div class="main-stars-block"> <i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i> </div> <span class="rating-val">10/5</span> </div> </div> <div class="li"> <div class="label">Licensing & Safety</div> <div class="val-grid"> <div class="main-stars-block"> <i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i> </div> <span class="rating-val">9/5</span> </div> </div> <div class="li"> <div class="label">Game Selection</div> <div class="val-grid"> <div class="main-stars-block"> <i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i> </div> <span class="rating-val">9/5</span> </div> </div> <div class="li"> <div class="label">Payment Options</div> <div class="val-grid"> <div class="main-stars-block"> <i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i> </div> <span class="rating-val">10/5</span> </div> </div> <div class="li"> <div class="label">Customer Support</div> <div class="val-grid"> <div class="main-stars-block"> <i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i> </div> <span class="rating-val">9/5</span> </div> </div> <div class="li"> <div class="label">Сustomer Reviews</div> <div class="val-grid"> <div class="main-stars-block"> <i class="icon-empty green"></i><i class="icon-empty green"></i><i class="icon-empty green"></i><i class="icon-empty green"></i><i class="icon-empty green"></i> </div> <span class="rating-val">0/5</span> </div> </div> </div> </div> <div class="review-page--side-rating---data"> <div class="line"> <label class="label">Website</label> <span class="val"> <a aria-label="Go to M88 Mansion betting site" href="https://asian-bookies.net/go/m88/" rel="nofollow" target="_blank">m88.com</a> </span> </div> <div class="line"> <label class="label">Established</label> <span class="val"> 2007 </span> </div> <div class="line"> <label class="label">License</label> <span class="val"> Vanuatu Gambling License </span> </div> <div class="line"> <label class="label">Bonus</label> <span class="val"> <span>200%</span> Bonus up to $650 USD + Get <span>88</span> Free Spins! </span> </div> <div class="line"> <label class="label">Wagering Requirement</label> <span class="val"> 18x </span> </div> <div class="line"> <label class="label">No Deposit Bonus</label> <span class="val"> No </span> </div> <div class="line"> <label class="label">Live Chat</label> <span class="val"> Yes </span> </div> <div class="line"> <div class="label">Credit cards</div> <div class="val"> Accepted </div> </div> <div class="line"> <div class="label">Withdraw time </div> <div class="val"> 1-3 days </div> </div> <div class="line"> <div class="label">Cashout Times</div> <div class="val"> 0-72 house </div> </div> <div class="line"> <div class="label">Freespins</div> <div class="val"> 88 </div> </div> <div class="line"> <div class="label">Email Support </div> <div class="val"> "VIETNAMESE - <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f7819e9283a89484b79acfcfd994989a">[email protected]</a> CHINESE - <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a3c0d6d0d7cccec6d1d0c6d1d5cac0c6e3ce9b9bc2d0cac28dc0ccce">[email protected]</a> MALAYSIAN <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="274f424b57674a1f1f0944484a">[email protected]</a> +63 9369178192 THAI <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="ef9b878e86b08c9caf82d7d7c18c8082">[email protected]</a> @336awdmf +44 207 048 2246 (Toll-Free) INDIAN <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a1c8cfc5c8c0fec2d2e1cc99998fc2cecc">[email protected]</a> +63 9761858828 KOREAN <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="cca7a3bea9ad93afbf8ca1f4f4e2afa3a1">[email protected]</a> @m88kor m88kor JAPANESE <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="6a000b1a0b043509192a07525244090507">[email protected]</a> @883thtdn" </div> </div> <div class="line"> <div class="label">Bonus %</div> <div class="val"> 200% </div> </div> <div class="line"> <div class="label">Min.dep in $</div> <div class="val"> 10 USD </div> </div> <div class="line"> <div class="label">Payments </div> <div class="val"> "CARDS: Visa, MasterCard WEB WALLETS:Qiwi, WebMoney, Skrill, Perfect Money, Jeton Wallet PAYMENT SYSTEMS: Neteller, ecoPayz, Payeer BANK TRANSFER: Sepa CRYPTOCURRENCY:Bitcoin, Litecoin, Dogecoin, Dash, Ethereum, Monero, ZCash, GameCredits, NEM, Bytecoin, SIB, DigiByte, Bitcoin gold, Bitcoin Cash, Ethereum Classic, Verge, QTUM, Stratis, BitShares, Tether, TRON, Tether on Tron" </div> </div> </div> <div class="review-page--side-rating--add-rev" role="button"> <i></i> <div class="add-rev--title">Customer too?</div> <div class="add-rev--btn">LEAVE YOUR REVIEW</div> </div> <a class="review-page--side-cta" rel="nofollow" target="_blank" href="https://asian-bookies.net/go/m88/"> <div class="review-page--side-cta__logo" style="background-color:#526686"> <picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/m88-mansion-casino-logo.png.webp" type="image/webp"><img width="290" height="90" src="https://asian-bookies.net/wp-content/uploads/2022/11/m88-mansion-casino-logo.png" class="attachment-medium size-medium webpexpress-processed" alt="" decoding="async"></picture> </div> <div class="add-rev--title">Go to M88 Mansion</div> </a> </div> </div> </div> <div id="faq-about-m88-mansion" class="auto-scroll-block content-white block-content-padding block-content-lr-padding white-block-shadow mb30" itemscope itemtype="https://schema.org/FAQPage" > <div class="g-rp-rep-block-title"> <i class="faq-icon"></i> <div> <h2>FAQ about M88 Mansion:</h2> <div class="g-rp-rep-block-title__short-desc"></div> </div> </div> <div class="rev-page-faq"> <div class="yellow-bg-block rev-page-faq__item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <h3 itemprop="name">Is betting at M88 Mansion betting site legal?</h3> <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div itemprop="text"> <p><span style="font-weight: 400;">Yes, betting at M88 Mansion is legal and regulated. The platform operates under the appropriate licenses and follows legal requirements.</span></p> </div> </div> </div> <div class="yellow-bg-block rev-page-faq__item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <h3 itemprop="name">Which requirements for play at M88 Mansion?</h3> <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div itemprop="text"> <p><span style="font-weight: 400;">To play at M88 Mansion, you need to meet the minimum age requirement, which is typically 18 years or older. Additionally, you may need to comply with any specific country or regional regulations.</span></p> </div> </div> </div> <div class="yellow-bg-block rev-page-faq__item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <h3 itemprop="name">Is it possible to bet or play without registration on M88 Mansion?</h3> <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div itemprop="text"> <p><span style="font-weight: 400;">No, registration is necessary to bet or play at M88 Mansion. You need to create an account to access the betting and gaming options.</span></p> </div> </div> </div> <div class="yellow-bg-block rev-page-faq__item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <h3 itemprop="name">Can I register multiple accounts in M88 Mansion?</h3> <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div itemprop="text"> <p><span style="font-weight: 400;">No, M88 Mansion strictly prohibits multiple account registrations. Each user is allowed to have only one account on the platform.</span></p> </div> </div> </div> <div class="yellow-bg-block rev-page-faq__item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <h3 itemprop="name">Is there a no deposit bonus for signing up with the M88 Mansion?</h3> <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div itemprop="text"> <p><span style="font-weight: 400;">At this moment M88 Mansion does not offer no deposit bonus. But we recommend checking the promotions section or contact customer support for the latest information regarding sign-up bonuses.</span></p> </div> </div> </div> <div class="yellow-bg-block rev-page-faq__item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <h3 itemprop="name">Will I be able to get a welcome bonus for signing up on mobile?</h3> <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div itemprop="text"> <p><span style="font-weight: 400;">Yes, M88 Mansion offers welcome bonuses for new players who sign up on both the desktop website and the mobile app. The specific details and requirements for the welcome bonus can be found in the promotions section.</span></p> </div> </div> </div> <div class="yellow-bg-block rev-page-faq__item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <h3 itemprop="name">Is the M88 Mansion app free to download?</h3> <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div itemprop="text"> <p><span style="font-weight: 400;">Yes, the M88 Mansion app is free to download. You can download it from the official website or through the app stores for iOS and Android devices.</span></p> </div> </div> </div> <div class="yellow-bg-block rev-page-faq__item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <h3 itemprop="name">How to play online without the M88 Mansion app for iOS or Android?</h3> <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div itemprop="text"> <p><span style="font-weight: 400;">If you prefer not to use the M88 Mansion app, you can still access and play on the platform through the mobile website. Simply visit the M88 Mansion website on your mobile device’s browser.</span></p> </div> </div> </div> <div class="yellow-bg-block rev-page-faq__item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <h3 itemprop="name">What deposit and withdrawal methods does the brand have?</h3> <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div itemprop="text"> <p><span style="font-weight: 400;">M88 Mansion offers a variety of deposit and withdrawal methods, including fiat and cryptocurrency options. Some common methods include bank transfers, credit/debit cards, e-wallets, and cryptocurrency wallets.</span></p> </div> </div> </div> <div class="yellow-bg-block rev-page-faq__item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <h3 itemprop="name">What is the minimum deposit for the brand?</h3> <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div itemprop="text"> <p><span style="font-weight: 400;">The minimum deposit amount for M88 Mansion may vary depending on the chosen payment method, but in average it is £1.00.</span></p> </div> </div> </div> </div> </div> <div id="add-comment"> <div class="g-rev-page-comment-form "> <div class="g-rev-page-comment-form--title"> Post your review </div> <div class="g-rev-page-comment-form--desc">Everybody will see your review</div> <form class="add-comment" data-comment="0" data-post="4249" > <input type="hidden" id="add_comment_form_nonce" name="add_comment_form_nonce" value="0559a5129b" /><input type="hidden" name="_wp_http_referer" value="/review/m88/" /> <div> <div class="g-rev-page-comment-form--input-group"> <input type="text" require name="name" placeholder="Your name"> <input type="text" require name="email" placeholder="Your E-mail"> </div> <textarea name="comment" require placeholder="Your comment..."></textarea> </div> <div> <div class="comment-rating-options"> <div class="comment-rating-options--title">Your grade out of 5</div> <div class="comment-rating-options--desc">Optional</div> <div class="comment-rating-options--val">N/A</div> <input type="range" name="rating" class="comment-rating-range" min="0" max="5" value="0" step="1"> </div> </div> <div> <div class="comment-form-errrors"></div> <button class="g-rev-page-comment-form--btn">Send</button> </div> </form> </div> </div> </main> </div> </div> </div> <button class="to-top-btn"><i></i></button> <footer class="site-footer"> <div class="site-footer--row container"> <div class="site-footer__logo"> <img src="https://asian-bookies.net/wp-content/themes/bb/images/logo.svg" alt="96 Bets Asia"> <div class="site-footer__copyr-txt"> AsiaBetting.Online is an independent site with reviews and ratings of betting sites and casinos. We conduct our own research and live tests of online platforms and websites. Based on our own experience, we write reviews and make ratings in which we give you information about betting and gambling, and the experience of our team. We earn commissions and this allows our site and team to continue to operate. But these commissions have no impact on our ratings, reviews and rankings. Gamble responsibly. We remind our readers that we only provide independent information, but you make your own decisions and are responsible for them when you gamble. If you need help with gambling addiction you can contact one of the organizations listed below. Their logos are clickable and lead directly to their official websites. </div> </div> <div class="site-footer__menues"> <div class="footer-menu -first"> <div class="footer-menu__title">Top Ratings</div> <nav class="footer-menu-list"><ul id="menu-top-ratings" class="menu"><li id="menu-item-19953" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-19953"><a href="https://asian-bookies.net/asian-handicap/">Asian Handicap</a></li> <li id="menu-item-19954" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-19954"><a href="https://asian-bookies.net/casino/">Asian Casinos</a></li> <li id="menu-item-21837" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21837"><a href="https://asian-bookies.net/bangladesh/">Bangladesh</a></li> <li id="menu-item-21838" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21838"><a href="https://asian-bookies.net/hong-kong/">Hong Kong</a></li> <li id="menu-item-21839" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21839"><a href="https://asian-bookies.net/india/">India</a></li> <li id="menu-item-21840" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21840"><a href="https://asian-bookies.net/indonesia/">Indonesia</a></li> <li id="menu-item-21841" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21841"><a href="https://asian-bookies.net/japan/">Japan</a></li> <li id="menu-item-21842" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21842"><a href="https://asian-bookies.net/korea/">Korea</a></li> <li id="menu-item-21843" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21843"><a href="https://asian-bookies.net/malaysia/">Malaysia</a></li> <li id="menu-item-21844" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21844"><a href="https://asian-bookies.net/vietnam/">Vietnam</a></li> <li id="menu-item-21845" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21845"><a href="https://asian-bookies.net/philippines/">Philippines</a></li> <li id="menu-item-21846" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21846"><a href="https://asian-bookies.net/singapore/">Singapore</a></li> <li id="menu-item-21847" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21847"><a href="https://asian-bookies.net/thailand/">Thailand</a></li> </ul></nav> </div> <div class="footer-menu"> <div class="footer-menu__title">Info Pages</div> <nav class="footer-menu-list"><ul id="menu-info-pages" class="menu"><li id="menu-item-5569" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-5569"><a href="https://asian-bookies.net/about-us/">About Us</a></li> <li id="menu-item-84" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-84"><a href="https://asian-bookies.net/authors/">Authors & Our team</a></li> <li id="menu-item-1111" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1111"><a href="https://asian-bookies.net/contacts/">Contact Us</a></li> </ul></nav> </div> </div> <div class="site-footer__bottom--logos"> <a class="logo-item" target="_blank" rel="nofollow" href="https://www.begambleaware.org/" title="BeGambleAware"> <img src="/wp-content/uploads/2022/12/bgmblawr.png" alt="BeGambleAware"> </a> <a class="logo-item" target="_blank" rel="nofollow" href="https://www.gamblingtherapy.org/" title="Gambling Therapy"> <img src="/wp-content/uploads/2022/12/gambl-therapy.png" alt="Gambling Therapy"> </a> <a class="logo-item" target="_blank" rel="nofollow" href="https://www.gamcare.org.uk/" title="GamCare"> <img src="/wp-content/uploads/2022/12/gamcare.png" alt="GamCare"> </a> <a class="logo-item" target="_blank" rel="nofollow" href="https://www.taketimetothink.co.uk/" title="Take Time To Think"> <img src="/wp-content/uploads/2022/12/taketimetothink.svg" alt="Take Time To Think"> </a> <a class="logo-item -hide-mob" target="_blank" rel="nofollow" href="https://www.gamstop.co.uk/" title="GAMSTOP"> <img src="/wp-content/uploads/2022/12/gamstop.png" alt="GAMSTOP"> </a> <a class="logo-item -hide-mob" target="_blank" rel="nofollow" href="https://quitgamble.com/" title="Quit Gamble"> <img src="/wp-content/uploads/2022/12/QuitGamble.png" alt="Quit Gamble"> </a> <a class="logo-item -hide-mob" target="_blank" rel="nofollow" href="https://www.pagcor.ph/regulatory/responsible-gaming.php" title="PACGOR"> <img src="/wp-content/uploads/2022/12/pagcor.png" alt="PACGOR"> </a> <a class="logo-item -hide-mob" target="_blank" rel="nofollow" href="https://ibia.bet/" title="International Betting Integrity Association"> <img src="/wp-content/uploads/2022/12/InternationalBettingIntegrity.svg" alt="International Betting Integrity Association"> </a> <a class="logo-item -hide-mob" target="_blank" rel="nofollow" href="https://ecogra.org/" title="eCORGA"> <img src="/wp-content/uploads/2022/12/ecorga.png" alt="eCORGA"> </a> <a class="logo-item -hide-mob" target="_blank" rel="nofollow" href="https://www.gamblingcommission.gov.uk/" title="Gambling Commission"> <img src="/wp-content/uploads/2022/12/gambling-commission.svg" alt="Gambling Commission"> </a> <div class="site-footer__bottom--logos--btn-toggle" role="button"> <span>View more +</span> </div> </div> <div class="site-footer__bottom-copyr container"> <div class="site-footer--dmcs-grid"> <a href="//www.dmca.com/Protection/Status.aspx?ID=2b8039f0-cb42-49a9-bb24-ef5811fcb356" title="DMCA.com Protection Status" class="dmca-badge"> <img width="150" height="30" src ="https://images.dmca.com/Badges/dmca_protected_sml_120n.png?ID=2b8039f0-cb42-49a9-bb24-ef5811fcb356" alt="DMCA.com Protection Status" /></a> <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script><script src="https://images.dmca.com/Badges/DMCABadgeHelper.min.js"> </script> <a href="https://www.trustpilot.com/review/asian-bookies.net" target="_blank" rel="nofollow" title="AsiaBetting.Online on Trustpilot" > <img src="/wp-content/uploads/2022/12/trustpilot.png" alt="Asian Bookies on Trustpilot"> </a> <img src="/wp-content/uploads/2022/12/gpwa.png" alt="AsiaBetting.Online on GPWA"> </div> <div class="c-t"> Copyright © 2025 – AsiaBetting.Online </div> </div> </div> </footer> <div class="g-popup-block"> <div class="container"> <div class="row"> <div class="g-popup-block__content"> <div class="g-popup-block__logo" style="background-color:#ffffff"> <a href="https://asian-bookies.net/go/1xbet/"> <img width="171" height="80" src="https://asian-bookies.net/wp-content/uploads/2022/11/1xbet.webp" class="attachment-review-teaser-image size-review-teaser-image" alt="1xbet - bookmaker logo" decoding="async" loading="lazy" /> </a> </div> <div class="g-rating-block"> <div class="title-score">5<span> / 5</span></div><div class="main-stars-block"><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i></div> </div> <div class="g-title-bonus-block"> <div class="prp-title">Bonus:</div> <div class="prp-col-bonus"> <span>100%</span> Bonus up to <span>$110 USD</span> <br>+ <span>150</span> Free Spins </div> </div> <div class="g-play-now-btn"> <a class="main-link-btn -ib-important" href="https://asian-bookies.net/go/1xbet/"> <span class="big-label">Play now!</span> <span class="small-label">Go to 1xBet</span> </a> </div> <button class="g-popup-block__close-btn"></button> </div> </div> </div> </div> <div class="g-comment-thank-block"> <div class="g-comment-thank-block--content"> <img src="https://asian-bookies.net/wp-content/themes/bb/images/thanks-img.svg" alt="Thanks for comment"> <div class="h2">Thank you!</div> <p>Your review has been sent for moderation</p> <button class="thanks-btn">Go back</button> </div> </div> <script type="text/javascript" src="https://asian-bookies.net/wp-content/themes/bb/dist/js/fslightbox.js?v=67b86e3dbcc5f&ver=6.7.2" id="fslightbox-js"></script> <script type="text/javascript" id="scripts-js-extra"> /* <![CDATA[ */ var ajax = {"url":"https:\/\/asian-bookies.net\/wp-admin\/admin-ajax.php","nonce":"b5994c27cc"}; /* ]]> */ </script> <script type="text/javascript" src="https://asian-bookies.net/wp-content/themes/bb/dist/js/scripts.min.js?v=67b86e3dbcc6b&ver=6.7.2" id="scripts-js"></script> <script type="text/javascript"> (function() { var expirationDate = new Date(); expirationDate.setTime( expirationDate.getTime() + 31536000 * 1000 ); document.cookie = "pll_language=en; expires=" + expirationDate.toUTCString() + "; path=/; secure; SameSite=Lax"; }()); </script> <script> !function (e, t) { "object" == typeof exports && "undefined" != typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define(t) : (e = "undefined" != typeof globalThis ? globalThis : e || self).Swiper = t() }(this, (function () { "use strict"; function e(e) { return null !== e && "object" == typeof e && "constructor" in e && e.constructor === Object } function t(s, a) { void 0 === s && (s = {}), void 0 === a && (a = {}), Object.keys(a).forEach((i => { void 0 === s[i] ? s[i] = a[i] : e(a[i]) && e(s[i]) && Object.keys(a[i]).length > 0 && t(s[i], a[i]) })) } const s = { body: {}, addEventListener() { }, removeEventListener() { }, activeElement: { blur() { }, nodeName: "" }, querySelector: () => null, querySelectorAll: () => [], getElementById: () => null, createEvent: () => ({ initEvent() { } }), createElement: () => ({ children: [], childNodes: [], style: {}, setAttribute() { }, getElementsByTagName: () => [] }), createElementNS: () => ({}), importNode: () => null, location: { hash: "", host: "", hostname: "", href: "", origin: "", pathname: "", protocol: "", search: "" } }; function a() { const e = "undefined" != typeof document ? document : {}; return t(e, s), e } const i = { document: s, navigator: { userAgent: "" }, location: { hash: "", host: "", hostname: "", href: "", origin: "", pathname: "", protocol: "", search: "" }, history: { replaceState() { }, pushState() { }, go() { }, back() { } }, CustomEvent: function () { return this }, addEventListener() { }, removeEventListener() { }, getComputedStyle: () => ({ getPropertyValue: () => "" }), Image() { }, Date() { }, screen: {}, setTimeout() { }, clearTimeout() { }, matchMedia: () => ({}), requestAnimationFrame: e => "undefined" == typeof setTimeout ? (e(), null) : setTimeout(e, 0), cancelAnimationFrame(e) { "undefined" != typeof setTimeout && clearTimeout(e) } }; function r() { const e = "undefined" != typeof window ? window : {}; return t(e, i), e } class n extends Array { constructor(e) { "number" == typeof e ? super(e) : (super(...e || []), function (e) { const t = e.__proto__; Object.defineProperty(e, "__proto__", { get: () => t, set(e) { t.__proto__ = e } }) }(this)) } } function l(e) { void 0 === e && (e = []); const t = []; return e.forEach((e => { Array.isArray(e) ? t.push(...l(e)) : t.push(e) })), t } function o(e, t) { return Array.prototype.filter.call(e, t) } function d(e, t) { const s = r(), i = a(); let l = []; if (!t && e instanceof n) return e; if (!e) return new n(l); if ("string" == typeof e) { const s = e.trim(); if (s.indexOf("<") >= 0 && s.indexOf(">") >= 0) { let e = "div"; 0 === s.indexOf("<li") && (e = "ul"), 0 === s.indexOf("<tr") && (e = "tbody"), 0 !== s.indexOf("<td") && 0 !== s.indexOf("<th") || (e = "tr"), 0 === s.indexOf("<tbody") && (e = "table"), 0 === s.indexOf("<option") && (e = "select"); const t = i.createElement(e); t.innerHTML = s; for (let e = 0; e < t.childNodes.length; e += 1)l.push(t.childNodes[e]) } else l = function (e, t) { if ("string" != typeof e) return [e]; const s = [], a = t.querySelectorAll(e); for (let e = 0; e < a.length; e += 1)s.push(a[e]); return s }(e.trim(), t || i) } else if (e.nodeType || e === s || e === i) l.push(e); else if (Array.isArray(e)) { if (e instanceof n) return e; l = e } return new n(function (e) { const t = []; for (let s = 0; s < e.length; s += 1)-1 === t.indexOf(e[s]) && t.push(e[s]); return t }(l)) } d.fn = n.prototype; const c = { addClass: function () { for (var e = arguments.length, t = new Array(e), s = 0; s < e; s++)t[s] = arguments[s]; const a = l(t.map((e => e.split(" ")))); return this.forEach((e => { e.classList.add(...a) })), this }, removeClass: function () { for (var e = arguments.length, t = new Array(e), s = 0; s < e; s++)t[s] = arguments[s]; const a = l(t.map((e => e.split(" ")))); return this.forEach((e => { e.classList.remove(...a) })), this }, hasClass: function () { for (var e = arguments.length, t = new Array(e), s = 0; s < e; s++)t[s] = arguments[s]; const a = l(t.map((e => e.split(" ")))); return o(this, (e => a.filter((t => e.classList.contains(t))).length > 0)).length > 0 }, toggleClass: function () { for (var e = arguments.length, t = new Array(e), s = 0; s < e; s++)t[s] = arguments[s]; const a = l(t.map((e => e.split(" ")))); this.forEach((e => { a.forEach((t => { e.classList.toggle(t) })) })) }, attr: function (e, t) { if (1 === arguments.length && "string" == typeof e) return this[0] ? this[0].getAttribute(e) : void 0; for (let s = 0; s < this.length; s += 1)if (2 === arguments.length) this[s].setAttribute(e, t); else for (const t in e) this[s][t] = e[t], this[s].setAttribute(t, e[t]); return this }, removeAttr: function (e) { for (let t = 0; t < this.length; t += 1)this[t].removeAttribute(e); return this }, transform: function (e) { for (let t = 0; t < this.length; t += 1)this[t].style.transform = e; return this }, transition: function (e) { for (let t = 0; t < this.length; t += 1)this[t].style.transitionDuration = "string" != typeof e ? `${e}ms` : e; return this }, on: function () { for (var e = arguments.length, t = new Array(e), s = 0; s < e; s++)t[s] = arguments[s]; let [a, i, r, n] = t; function l(e) { const t = e.target; if (!t) return; const s = e.target.dom7EventData || []; if (s.indexOf(e) < 0 && s.unshift(e), d(t).is(i)) r.apply(t, s); else { const e = d(t).parents(); for (let t = 0; t < e.length; t += 1)d(e[t]).is(i) && r.apply(e[t], s) } } function o(e) { const t = e && e.target && e.target.dom7EventData || []; t.indexOf(e) < 0 && t.unshift(e), r.apply(this, t) } "function" == typeof t[1] && ([a, r, n] = t, i = void 0), n || (n = !1); const c = a.split(" "); let p; for (let e = 0; e < this.length; e += 1) { const t = this[e]; if (i) for (p = 0; p < c.length; p += 1) { const e = c[p]; t.dom7LiveListeners || (t.dom7LiveListeners = {}), t.dom7LiveListeners[e] || (t.dom7LiveListeners[e] = []), t.dom7LiveListeners[e].push({ listener: r, proxyListener: l }), t.addEventListener(e, l, n) } else for (p = 0; p < c.length; p += 1) { const e = c[p]; t.dom7Listeners || (t.dom7Listeners = {}), t.dom7Listeners[e] || (t.dom7Listeners[e] = []), t.dom7Listeners[e].push({ listener: r, proxyListener: o }), t.addEventListener(e, o, n) } } return this }, off: function () { for (var e = arguments.length, t = new Array(e), s = 0; s < e; s++)t[s] = arguments[s]; let [a, i, r, n] = t; "function" == typeof t[1] && ([a, r, n] = t, i = void 0), n || (n = !1); const l = a.split(" "); for (let e = 0; e < l.length; e += 1) { const t = l[e]; for (let e = 0; e < this.length; e += 1) { const s = this[e]; let a; if (!i && s.dom7Listeners ? a = s.dom7Listeners[t] : i && s.dom7LiveListeners && (a = s.dom7LiveListeners[t]), a && a.length) for (let e = a.length - 1; e >= 0; e -= 1) { const i = a[e]; r && i.listener === r || r && i.listener && i.listener.dom7proxy && i.listener.dom7proxy === r ? (s.removeEventListener(t, i.proxyListener, n), a.splice(e, 1)) : r || (s.removeEventListener(t, i.proxyListener, n), a.splice(e, 1)) } } } return this }, trigger: function () { const e = r(); for (var t = arguments.length, s = new Array(t), a = 0; a < t; a++)s[a] = arguments[a]; const i = s[0].split(" "), n = s[1]; for (let t = 0; t < i.length; t += 1) { const a = i[t]; for (let t = 0; t < this.length; t += 1) { const i = this[t]; if (e.CustomEvent) { const t = new e.CustomEvent(a, { detail: n, bubbles: !0, cancelable: !0 }); i.dom7EventData = s.filter(((e, t) => t > 0)), i.dispatchEvent(t), i.dom7EventData = [], delete i.dom7EventData } } } return this }, transitionEnd: function (e) { const t = this; return e && t.on("transitionend", (function s(a) { a.target === this && (e.call(this, a), t.off("transitionend", s)) })), this }, outerWidth: function (e) { if (this.length > 0) { if (e) { const e = this.styles(); return this[0].offsetWidth + parseFloat(e.getPropertyValue("margin-right")) + parseFloat(e.getPropertyValue("margin-left")) } return this[0].offsetWidth } return null }, outerHeight: function (e) { if (this.length > 0) { if (e) { const e = this.styles(); return this[0].offsetHeight + parseFloat(e.getPropertyValue("margin-top")) + parseFloat(e.getPropertyValue("margin-bottom")) } return this[0].offsetHeight } return null }, styles: function () { const e = r(); return this[0] ? e.getComputedStyle(this[0], null) : {} }, offset: function () { if (this.length > 0) { const e = r(), t = a(), s = this[0], i = s.getBoundingClientRect(), n = t.body, l = s.clientTop || n.clientTop || 0, o = s.clientLeft || n.clientLeft || 0, d = s === e ? e.scrollY : s.scrollTop, c = s === e ? e.scrollX : s.scrollLeft; return { top: i.top + d - l, left: i.left + c - o } } return null }, css: function (e, t) { const s = r(); let a; if (1 === arguments.length) { if ("string" != typeof e) { for (a = 0; a < this.length; a += 1)for (const t in e) this[a].style[t] = e[t]; return this } if (this[0]) return s.getComputedStyle(this[0], null).getPropertyValue(e) } if (2 === arguments.length && "string" == typeof e) { for (a = 0; a < this.length; a += 1)this[a].style[e] = t; return this } return this }, each: function (e) { return e ? (this.forEach(((t, s) => { e.apply(t, [t, s]) })), this) : this }, html: function (e) { if (void 0 === e) return this[0] ? this[0].innerHTML : null; for (let t = 0; t < this.length; t += 1)this[t].innerHTML = e; return this }, text: function (e) { if (void 0 === e) return this[0] ? this[0].textContent.trim() : null; for (let t = 0; t < this.length; t += 1)this[t].textContent = e; return this }, is: function (e) { const t = r(), s = a(), i = this[0]; let l, o; if (!i || void 0 === e) return !1; if ("string" == typeof e) { if (i.matches) return i.matches(e); if (i.webkitMatchesSelector) return i.webkitMatchesSelector(e); if (i.msMatchesSelector) return i.msMatchesSelector(e); for (l = d(e), o = 0; o < l.length; o += 1)if (l[o] === i) return !0; return !1 } if (e === s) return i === s; if (e === t) return i === t; if (e.nodeType || e instanceof n) { for (l = e.nodeType ? [e] : e, o = 0; o < l.length; o += 1)if (l[o] === i) return !0; return !1 } return !1 }, index: function () { let e, t = this[0]; if (t) { for (e = 0; null !== (t = t.previousSibling);)1 === t.nodeType && (e += 1); return e } }, eq: function (e) { if (void 0 === e) return this; const t = this.length; if (e > t - 1) return d([]); if (e < 0) { const s = t + e; return d(s < 0 ? [] : [this[s]]) } return d([this[e]]) }, append: function () { let e; const t = a(); for (let s = 0; s < arguments.length; s += 1) { e = s < 0 || arguments.length <= s ? void 0 : arguments[s]; for (let s = 0; s < this.length; s += 1)if ("string" == typeof e) { const a = t.createElement("div"); for (a.innerHTML = e; a.firstChild;)this[s].appendChild(a.firstChild) } else if (e instanceof n) for (let t = 0; t < e.length; t += 1)this[s].appendChild(e[t]); else this[s].appendChild(e) } return this }, prepend: function (e) { const t = a(); let s, i; for (s = 0; s < this.length; s += 1)if ("string" == typeof e) { const a = t.createElement("div"); for (a.innerHTML = e, i = a.childNodes.length - 1; i >= 0; i -= 1)this[s].insertBefore(a.childNodes[i], this[s].childNodes[0]) } else if (e instanceof n) for (i = 0; i < e.length; i += 1)this[s].insertBefore(e[i], this[s].childNodes[0]); else this[s].insertBefore(e, this[s].childNodes[0]); return this }, next: function (e) { return this.length > 0 ? e ? this[0].nextElementSibling && d(this[0].nextElementSibling).is(e) ? d([this[0].nextElementSibling]) : d([]) : this[0].nextElementSibling ? d([this[0].nextElementSibling]) : d([]) : d([]) }, nextAll: function (e) { const t = []; let s = this[0]; if (!s) return d([]); for (; s.nextElementSibling;) { const a = s.nextElementSibling; e ? d(a).is(e) && t.push(a) : t.push(a), s = a } return d(t) }, prev: function (e) { if (this.length > 0) { const t = this[0]; return e ? t.previousElementSibling && d(t.previousElementSibling).is(e) ? d([t.previousElementSibling]) : d([]) : t.previousElementSibling ? d([t.previousElementSibling]) : d([]) } return d([]) }, prevAll: function (e) { const t = []; let s = this[0]; if (!s) return d([]); for (; s.previousElementSibling;) { const a = s.previousElementSibling; e ? d(a).is(e) && t.push(a) : t.push(a), s = a } return d(t) }, parent: function (e) { const t = []; for (let s = 0; s < this.length; s += 1)null !== this[s].parentNode && (e ? d(this[s].parentNode).is(e) && t.push(this[s].parentNode) : t.push(this[s].parentNode)); return d(t) }, parents: function (e) { const t = []; for (let s = 0; s < this.length; s += 1) { let a = this[s].parentNode; for (; a;)e ? d(a).is(e) && t.push(a) : t.push(a), a = a.parentNode } return d(t) }, closest: function (e) { let t = this; return void 0 === e ? d([]) : (t.is(e) || (t = t.parents(e).eq(0)), t) }, find: function (e) { const t = []; for (let s = 0; s < this.length; s += 1) { const a = this[s].querySelectorAll(e); for (let e = 0; e < a.length; e += 1)t.push(a[e]) } return d(t) }, children: function (e) { const t = []; for (let s = 0; s < this.length; s += 1) { const a = this[s].children; for (let s = 0; s < a.length; s += 1)e && !d(a[s]).is(e) || t.push(a[s]) } return d(t) }, filter: function (e) { return d(o(this, e)) }, remove: function () { for (let e = 0; e < this.length; e += 1)this[e].parentNode && this[e].parentNode.removeChild(this[e]); return this } }; function p(e, t) { return void 0 === t && (t = 0), setTimeout(e, t) } function u() { return Date.now() } function h(e, t) { void 0 === t && (t = "x"); const s = r(); let a, i, n; const l = function (e) { const t = r(); let s; return t.getComputedStyle && (s = t.getComputedStyle(e, null)), !s && e.currentStyle && (s = e.currentStyle), s || (s = e.style), s }(e); return s.WebKitCSSMatrix ? (i = l.transform || l.webkitTransform, i.split(",").length > 6 && (i = i.split(", ").map((e => e.replace(",", "."))).join(", ")), n = new s.WebKitCSSMatrix("none" === i ? "" : i)) : (n = l.MozTransform || l.OTransform || l.MsTransform || l.msTransform || l.transform || l.getPropertyValue("transform").replace("translate(", "matrix(1, 0, 0, 1,"), a = n.toString().split(",")), "x" === t && (i = s.WebKitCSSMatrix ? n.m41 : 16 === a.length ? parseFloat(a[12]) : parseFloat(a[4])), "y" === t && (i = s.WebKitCSSMatrix ? n.m42 : 16 === a.length ? parseFloat(a[13]) : parseFloat(a[5])), i || 0 } function m(e) { return "object" == typeof e && null !== e && e.constructor && "Object" === Object.prototype.toString.call(e).slice(8, -1) } function f(e) { return "undefined" != typeof window && void 0 !== window.HTMLElement ? e instanceof HTMLElement : e && (1 === e.nodeType || 11 === e.nodeType) } function g() { const e = Object(arguments.length <= 0 ? void 0 : arguments[0]), t = ["__proto__", "constructor", "prototype"]; for (let s = 1; s < arguments.length; s += 1) { const a = s < 0 || arguments.length <= s ? void 0 : arguments[s]; if (null != a && !f(a)) { const s = Object.keys(Object(a)).filter((e => t.indexOf(e) < 0)); for (let t = 0, i = s.length; t < i; t += 1) { const i = s[t], r = Object.getOwnPropertyDescriptor(a, i); void 0 !== r && r.enumerable && (m(e[i]) && m(a[i]) ? a[i].__swiper__ ? e[i] = a[i] : g(e[i], a[i]) : !m(e[i]) && m(a[i]) ? (e[i] = {}, a[i].__swiper__ ? e[i] = a[i] : g(e[i], a[i])) : e[i] = a[i]) } } } return e } function v(e, t, s) { e.style.setProperty(t, s) } function w(e) { let { swiper: t, targetPosition: s, side: a } = e; const i = r(), n = -t.translate; let l, o = null; const d = t.params.speed; t.wrapperEl.style.scrollSnapType = "none", i.cancelAnimationFrame(t.cssModeFrameID); const c = s > n ? "next" : "prev", p = (e, t) => "next" === c && e >= t || "prev" === c && e <= t, u = () => { l = (new Date).getTime(), null === o && (o = l); const e = Math.max(Math.min((l - o) / d, 1), 0), r = .5 - Math.cos(e * Math.PI) / 2; let c = n + r * (s - n); if (p(c, s) && (c = s), t.wrapperEl.scrollTo({ [a]: c }), p(c, s)) return t.wrapperEl.style.overflow = "hidden", t.wrapperEl.style.scrollSnapType = "", setTimeout((() => { t.wrapperEl.style.overflow = "", t.wrapperEl.scrollTo({ [a]: c }) })), void i.cancelAnimationFrame(t.cssModeFrameID); t.cssModeFrameID = i.requestAnimationFrame(u) }; u() } let b, x, y; function E() { return b || (b = function () { const e = r(), t = a(); return { smoothScroll: t.documentElement && "scrollBehavior" in t.documentElement.style, touch: !!("ontouchstart" in e || e.DocumentTouch && t instanceof e.DocumentTouch), passiveListener: function () { let t = !1; try { const s = Object.defineProperty({}, "passive", { get() { t = !0 } }); e.addEventListener("testPassiveListener", null, s) } catch (e) { } return t }(), gestures: "ongesturestart" in e } }()), b } function C(e) { return void 0 === e && (e = {}), x || (x = function (e) { let { userAgent: t } = void 0 === e ? {} : e; const s = E(), a = r(), i = a.navigator.platform, n = t || a.navigator.userAgent, l = { ios: !1, android: !1 }, o = a.screen.width, d = a.screen.height, c = n.match(/(Android);?[\s\/]+([\d.]+)?/); let p = n.match(/(iPad).*OS\s([\d_]+)/); const u = n.match(/(iPod)(.*OS\s([\d_]+))?/), h = !p && n.match(/(iPhone\sOS|iOS)\s([\d_]+)/), m = "Win32" === i; let f = "MacIntel" === i; return !p && f && s.touch && ["1024x1366", "1366x1024", "834x1194", "1194x834", "834x1112", "1112x834", "768x1024", "1024x768", "820x1180", "1180x820", "810x1080", "1080x810"].indexOf(`${o}x${d}`) >= 0 && (p = n.match(/(Version)\/([\d.]+)/), p || (p = [0, 1, "13_0_0"]), f = !1), c && !m && (l.os = "android", l.android = !0), (p || h || u) && (l.os = "ios", l.ios = !0), l }(e)), x } function T() { return y || (y = function () { const e = r(); return { isSafari: function () { const t = e.navigator.userAgent.toLowerCase(); return t.indexOf("safari") >= 0 && t.indexOf("chrome") < 0 && t.indexOf("android") < 0 }(), isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(e.navigator.userAgent) } }()), y } Object.keys(c).forEach((e => { Object.defineProperty(d.fn, e, { value: c[e], writable: !0 }) })); var $ = { on(e, t, s) { const a = this; if (!a.eventsListeners || a.destroyed) return a; if ("function" != typeof t) return a; const i = s ? "unshift" : "push"; return e.split(" ").forEach((e => { a.eventsListeners[e] || (a.eventsListeners[e] = []), a.eventsListeners[e][i](t) })), a }, once(e, t, s) { const a = this; if (!a.eventsListeners || a.destroyed) return a; if ("function" != typeof t) return a; function i() { a.off(e, i), i.__emitterProxy && delete i.__emitterProxy; for (var s = arguments.length, r = new Array(s), n = 0; n < s; n++)r[n] = arguments[n]; t.apply(a, r) } return i.__emitterProxy = t, a.on(e, i, s) }, onAny(e, t) { const s = this; if (!s.eventsListeners || s.destroyed) return s; if ("function" != typeof e) return s; const a = t ? "unshift" : "push"; return s.eventsAnyListeners.indexOf(e) < 0 && s.eventsAnyListeners[a](e), s }, offAny(e) { const t = this; if (!t.eventsListeners || t.destroyed) return t; if (!t.eventsAnyListeners) return t; const s = t.eventsAnyListeners.indexOf(e); return s >= 0 && t.eventsAnyListeners.splice(s, 1), t }, off(e, t) { const s = this; return !s.eventsListeners || s.destroyed ? s : s.eventsListeners ? (e.split(" ").forEach((e => { void 0 === t ? s.eventsListeners[e] = [] : s.eventsListeners[e] && s.eventsListeners[e].forEach(((a, i) => { (a === t || a.__emitterProxy && a.__emitterProxy === t) && s.eventsListeners[e].splice(i, 1) })) })), s) : s }, emit() { const e = this; if (!e.eventsListeners || e.destroyed) return e; if (!e.eventsListeners) return e; let t, s, a; for (var i = arguments.length, r = new Array(i), n = 0; n < i; n++)r[n] = arguments[n]; "string" == typeof r[0] || Array.isArray(r[0]) ? (t = r[0], s = r.slice(1, r.length), a = e) : (t = r[0].events, s = r[0].data, a = r[0].context || e), s.unshift(a); return (Array.isArray(t) ? t : t.split(" ")).forEach((t => { e.eventsAnyListeners && e.eventsAnyListeners.length && e.eventsAnyListeners.forEach((e => { e.apply(a, [t, ...s]) })), e.eventsListeners && e.eventsListeners[t] && e.eventsListeners[t].forEach((e => { e.apply(a, s) })) })), e } }; var S = { updateSize: function () { const e = this; let t, s; const a = e.$el; t = void 0 !== e.params.width && null !== e.params.width ? e.params.width : a[0].clientWidth, s = void 0 !== e.params.height && null !== e.params.height ? e.params.height : a[0].clientHeight, 0 === t && e.isHorizontal() || 0 === s && e.isVertical() || (t = t - parseInt(a.css("padding-left") || 0, 10) - parseInt(a.css("padding-right") || 0, 10), s = s - parseInt(a.css("padding-top") || 0, 10) - parseInt(a.css("padding-bottom") || 0, 10), Number.isNaN(t) && (t = 0), Number.isNaN(s) && (s = 0), Object.assign(e, { width: t, height: s, size: e.isHorizontal() ? t : s })) }, updateSlides: function () { const e = this; function t(t) { return e.isHorizontal() ? t : { width: "height", "margin-top": "margin-left", "margin-bottom ": "margin-right", "margin-left": "margin-top", "margin-right": "margin-bottom", "padding-left": "padding-top", "padding-right": "padding-bottom", marginRight: "marginBottom" }[t] } function s(e, s) { return parseFloat(e.getPropertyValue(t(s)) || 0) } const a = e.params, { $wrapperEl: i, size: r, rtlTranslate: n, wrongRTL: l } = e, o = e.virtual && a.virtual.enabled, d = o ? e.virtual.slides.length : e.slides.length, c = i.children(`.${e.params.slideClass}`), p = o ? e.virtual.slides.length : c.length; let u = []; const h = [], m = []; let f = a.slidesOffsetBefore; "function" == typeof f && (f = a.slidesOffsetBefore.call(e)); let g = a.slidesOffsetAfter; "function" == typeof g && (g = a.slidesOffsetAfter.call(e)); const w = e.snapGrid.length, b = e.slidesGrid.length; let x = a.spaceBetween, y = -f, E = 0, C = 0; if (void 0 === r) return; "string" == typeof x && x.indexOf("%") >= 0 && (x = parseFloat(x.replace("%", "")) / 100 * r), e.virtualSize = -x, n ? c.css({ marginLeft: "", marginBottom: "", marginTop: "" }) : c.css({ marginRight: "", marginBottom: "", marginTop: "" }), a.centeredSlides && a.cssMode && (v(e.wrapperEl, "--swiper-centered-offset-before", ""), v(e.wrapperEl, "--swiper-centered-offset-after", "")); const T = a.grid && a.grid.rows > 1 && e.grid; let $; T && e.grid.initSlides(p); const S = "auto" === a.slidesPerView && a.breakpoints && Object.keys(a.breakpoints).filter((e => void 0 !== a.breakpoints[e].slidesPerView)).length > 0; for (let i = 0; i < p; i += 1) { $ = 0; const n = c.eq(i); if (T && e.grid.updateSlide(i, n, p, t), "none" !== n.css("display")) { if ("auto" === a.slidesPerView) { S && (c[i].style[t("width")] = ""); const r = getComputedStyle(n[0]), l = n[0].style.transform, o = n[0].style.webkitTransform; if (l && (n[0].style.transform = "none"), o && (n[0].style.webkitTransform = "none"), a.roundLengths) $ = e.isHorizontal() ? n.outerWidth(!0) : n.outerHeight(!0); else { const e = s(r, "width"), t = s(r, "padding-left"), a = s(r, "padding-right"), i = s(r, "margin-left"), l = s(r, "margin-right"), o = r.getPropertyValue("box-sizing"); if (o && "border-box" === o) $ = e + i + l; else { const { clientWidth: s, offsetWidth: r } = n[0]; $ = e + t + a + i + l + (r - s) } } l && (n[0].style.transform = l), o && (n[0].style.webkitTransform = o), a.roundLengths && ($ = Math.floor($)) } else $ = (r - (a.slidesPerView - 1) * x) / a.slidesPerView, a.roundLengths && ($ = Math.floor($)), c[i] && (c[i].style[t("width")] = `${$}px`); c[i] && (c[i].swiperSlideSize = $), m.push($), a.centeredSlides ? (y = y + $ / 2 + E / 2 + x, 0 === E && 0 !== i && (y = y - r / 2 - x), 0 === i && (y = y - r / 2 - x), Math.abs(y) < .001 && (y = 0), a.roundLengths && (y = Math.floor(y)), C % a.slidesPerGroup == 0 && u.push(y), h.push(y)) : (a.roundLengths && (y = Math.floor(y)), (C - Math.min(e.params.slidesPerGroupSkip, C)) % e.params.slidesPerGroup == 0 && u.push(y), h.push(y), y = y + $ + x), e.virtualSize += $ + x, E = $, C += 1 } } if (e.virtualSize = Math.max(e.virtualSize, r) + g, n && l && ("slide" === a.effect || "coverflow" === a.effect) && i.css({ width: `${e.virtualSize + a.spaceBetween}px` }), a.setWrapperSize && i.css({ [t("width")]: `${e.virtualSize + a.spaceBetween}px` }), T && e.grid.updateWrapperSize($, u, t), !a.centeredSlides) { const t = []; for (let s = 0; s < u.length; s += 1) { let i = u[s]; a.roundLengths && (i = Math.floor(i)), u[s] <= e.virtualSize - r && t.push(i) } u = t, Math.floor(e.virtualSize - r) - Math.floor(u[u.length - 1]) > 1 && u.push(e.virtualSize - r) } if (0 === u.length && (u = [0]), 0 !== a.spaceBetween) { const s = e.isHorizontal() && n ? "marginLeft" : t("marginRight"); c.filter(((e, t) => !a.cssMode || t !== c.length - 1)).css({ [s]: `${x}px` }) } if (a.centeredSlides && a.centeredSlidesBounds) { let e = 0; m.forEach((t => { e += t + (a.spaceBetween ? a.spaceBetween : 0) })), e -= a.spaceBetween; const t = e - r; u = u.map((e => e < 0 ? -f : e > t ? t + g : e)) } if (a.centerInsufficientSlides) { let e = 0; if (m.forEach((t => { e += t + (a.spaceBetween ? a.spaceBetween : 0) })), e -= a.spaceBetween, e < r) { const t = (r - e) / 2; u.forEach(((e, s) => { u[s] = e - t })), h.forEach(((e, s) => { h[s] = e + t })) } } if (Object.assign(e, { slides: c, snapGrid: u, slidesGrid: h, slidesSizesGrid: m }), a.centeredSlides && a.cssMode && !a.centeredSlidesBounds) { v(e.wrapperEl, "--swiper-centered-offset-before", -u[0] + "px"), v(e.wrapperEl, "--swiper-centered-offset-after", e.size / 2 - m[m.length - 1] / 2 + "px"); const t = -e.snapGrid[0], s = -e.slidesGrid[0]; e.snapGrid = e.snapGrid.map((e => e + t)), e.slidesGrid = e.slidesGrid.map((e => e + s)) } if (p !== d && e.emit("slidesLengthChange"), u.length !== w && (e.params.watchOverflow && e.checkOverflow(), e.emit("snapGridLengthChange")), h.length !== b && e.emit("slidesGridLengthChange"), a.watchSlidesProgress && e.updateSlidesOffset(), !(o || a.cssMode || "slide" !== a.effect && "fade" !== a.effect)) { const t = `${a.containerModifierClass}backface-hidden`, s = e.$el.hasClass(t); p <= a.maxBackfaceHiddenSlides ? s || e.$el.addClass(t) : s && e.$el.removeClass(t) } }, updateAutoHeight: function (e) { const t = this, s = [], a = t.virtual && t.params.virtual.enabled; let i, r = 0; "number" == typeof e ? t.setTransition(e) : !0 === e && t.setTransition(t.params.speed); const n = e => a ? t.slides.filter((t => parseInt(t.getAttribute("data-swiper-slide-index"), 10) === e))[0] : t.slides.eq(e)[0]; if ("auto" !== t.params.slidesPerView && t.params.slidesPerView > 1) if (t.params.centeredSlides) (t.visibleSlides || d([])).each((e => { s.push(e) })); else for (i = 0; i < Math.ceil(t.params.slidesPerView); i += 1) { const e = t.activeIndex + i; if (e > t.slides.length && !a) break; s.push(n(e)) } else s.push(n(t.activeIndex)); for (i = 0; i < s.length; i += 1)if (void 0 !== s[i]) { const e = s[i].offsetHeight; r = e > r ? e : r } (r || 0 === r) && t.$wrapperEl.css("height", `${r}px`) }, updateSlidesOffset: function () { const e = this, t = e.slides; for (let s = 0; s < t.length; s += 1)t[s].swiperSlideOffset = e.isHorizontal() ? t[s].offsetLeft : t[s].offsetTop }, updateSlidesProgress: function (e) { void 0 === e && (e = this && this.translate || 0); const t = this, s = t.params, { slides: a, rtlTranslate: i, snapGrid: r } = t; if (0 === a.length) return; void 0 === a[0].swiperSlideOffset && t.updateSlidesOffset(); let n = -e; i && (n = e), a.removeClass(s.slideVisibleClass), t.visibleSlidesIndexes = [], t.visibleSlides = []; for (let e = 0; e < a.length; e += 1) { const l = a[e]; let o = l.swiperSlideOffset; s.cssMode && s.centeredSlides && (o -= a[0].swiperSlideOffset); const d = (n + (s.centeredSlides ? t.minTranslate() : 0) - o) / (l.swiperSlideSize + s.spaceBetween), c = (n - r[0] + (s.centeredSlides ? t.minTranslate() : 0) - o) / (l.swiperSlideSize + s.spaceBetween), p = -(n - o), u = p + t.slidesSizesGrid[e]; (p >= 0 && p < t.size - 1 || u > 1 && u <= t.size || p <= 0 && u >= t.size) && (t.visibleSlides.push(l), t.visibleSlidesIndexes.push(e), a.eq(e).addClass(s.slideVisibleClass)), l.progress = i ? -d : d, l.originalProgress = i ? -c : c } t.visibleSlides = d(t.visibleSlides) }, updateProgress: function (e) { const t = this; if (void 0 === e) { const s = t.rtlTranslate ? -1 : 1; e = t && t.translate && t.translate * s || 0 } const s = t.params, a = t.maxTranslate() - t.minTranslate(); let { progress: i, isBeginning: r, isEnd: n } = t; const l = r, o = n; 0 === a ? (i = 0, r = !0, n = !0) : (i = (e - t.minTranslate()) / a, r = i <= 0, n = i >= 1), Object.assign(t, { progress: i, isBeginning: r, isEnd: n }), (s.watchSlidesProgress || s.centeredSlides && s.autoHeight) && t.updateSlidesProgress(e), r && !l && t.emit("reachBeginning toEdge"), n && !o && t.emit("reachEnd toEdge"), (l && !r || o && !n) && t.emit("fromEdge"), t.emit("progress", i) }, updateSlidesClasses: function () { const e = this, { slides: t, params: s, $wrapperEl: a, activeIndex: i, realIndex: r } = e, n = e.virtual && s.virtual.enabled; let l; t.removeClass(`${s.slideActiveClass} ${s.slideNextClass} ${s.slidePrevClass} ${s.slideDuplicateActiveClass} ${s.slideDuplicateNextClass} ${s.slideDuplicatePrevClass}`), l = n ? e.$wrapperEl.find(`.${s.slideClass}[data-swiper-slide-index="${i}"]`) : t.eq(i), l.addClass(s.slideActiveClass), s.loop && (l.hasClass(s.slideDuplicateClass) ? a.children(`.${s.slideClass}:not(.${s.slideDuplicateClass})[data-swiper-slide-index="${r}"]`).addClass(s.slideDuplicateActiveClass) : a.children(`.${s.slideClass}.${s.slideDuplicateClass}[data-swiper-slide-index="${r}"]`).addClass(s.slideDuplicateActiveClass)); let o = l.nextAll(`.${s.slideClass}`).eq(0).addClass(s.slideNextClass); s.loop && 0 === o.length && (o = t.eq(0), o.addClass(s.slideNextClass)); let d = l.prevAll(`.${s.slideClass}`).eq(0).addClass(s.slidePrevClass); s.loop && 0 === d.length && (d = t.eq(-1), d.addClass(s.slidePrevClass)), s.loop && (o.hasClass(s.slideDuplicateClass) ? a.children(`.${s.slideClass}:not(.${s.slideDuplicateClass})[data-swiper-slide-index="${o.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicateNextClass) : a.children(`.${s.slideClass}.${s.slideDuplicateClass}[data-swiper-slide-index="${o.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicateNextClass), d.hasClass(s.slideDuplicateClass) ? a.children(`.${s.slideClass}:not(.${s.slideDuplicateClass})[data-swiper-slide-index="${d.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicatePrevClass) : a.children(`.${s.slideClass}.${s.slideDuplicateClass}[data-swiper-slide-index="${d.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicatePrevClass)), e.emitSlidesClasses() }, updateActiveIndex: function (e) { const t = this, s = t.rtlTranslate ? t.translate : -t.translate, { slidesGrid: a, snapGrid: i, params: r, activeIndex: n, realIndex: l, snapIndex: o } = t; let d, c = e; if (void 0 === c) { for (let e = 0; e < a.length; e += 1)void 0 !== a[e + 1] ? s >= a[e] && s < a[e + 1] - (a[e + 1] - a[e]) / 2 ? c = e : s >= a[e] && s < a[e + 1] && (c = e + 1) : s >= a[e] && (c = e); r.normalizeSlideIndex && (c < 0 || void 0 === c) && (c = 0) } if (i.indexOf(s) >= 0) d = i.indexOf(s); else { const e = Math.min(r.slidesPerGroupSkip, c); d = e + Math.floor((c - e) / r.slidesPerGroup) } if (d >= i.length && (d = i.length - 1), c === n) return void (d !== o && (t.snapIndex = d, t.emit("snapIndexChange"))); const p = parseInt(t.slides.eq(c).attr("data-swiper-slide-index") || c, 10); Object.assign(t, { snapIndex: d, realIndex: p, previousIndex: n, activeIndex: c }), t.emit("activeIndexChange"), t.emit("snapIndexChange"), l !== p && t.emit("realIndexChange"), (t.initialized || t.params.runCallbacksOnInit) && t.emit("slideChange") }, updateClickedSlide: function (e) { const t = this, s = t.params, a = d(e).closest(`.${s.slideClass}`)[0]; let i, r = !1; if (a) for (let e = 0; e < t.slides.length; e += 1)if (t.slides[e] === a) { r = !0, i = e; break } if (!a || !r) return t.clickedSlide = void 0, void (t.clickedIndex = void 0); t.clickedSlide = a, t.virtual && t.params.virtual.enabled ? t.clickedIndex = parseInt(d(a).attr("data-swiper-slide-index"), 10) : t.clickedIndex = i, s.slideToClickedSlide && void 0 !== t.clickedIndex && t.clickedIndex !== t.activeIndex && t.slideToClickedSlide() } }; var M = { getTranslate: function (e) { void 0 === e && (e = this.isHorizontal() ? "x" : "y"); const { params: t, rtlTranslate: s, translate: a, $wrapperEl: i } = this; if (t.virtualTranslate) return s ? -a : a; if (t.cssMode) return a; let r = h(i[0], e); return s && (r = -r), r || 0 }, setTranslate: function (e, t) { const s = this, { rtlTranslate: a, params: i, $wrapperEl: r, wrapperEl: n, progress: l } = s; let o, d = 0, c = 0; s.isHorizontal() ? d = a ? -e : e : c = e, i.roundLengths && (d = Math.floor(d), c = Math.floor(c)), i.cssMode ? n[s.isHorizontal() ? "scrollLeft" : "scrollTop"] = s.isHorizontal() ? -d : -c : i.virtualTranslate || r.transform(`translate3d(${d}px, ${c}px, 0px)`), s.previousTranslate = s.translate, s.translate = s.isHorizontal() ? d : c; const p = s.maxTranslate() - s.minTranslate(); o = 0 === p ? 0 : (e - s.minTranslate()) / p, o !== l && s.updateProgress(e), s.emit("setTranslate", s.translate, t) }, minTranslate: function () { return -this.snapGrid[0] }, maxTranslate: function () { return -this.snapGrid[this.snapGrid.length - 1] }, translateTo: function (e, t, s, a, i) { void 0 === e && (e = 0), void 0 === t && (t = this.params.speed), void 0 === s && (s = !0), void 0 === a && (a = !0); const r = this, { params: n, wrapperEl: l } = r; if (r.animating && n.preventInteractionOnTransition) return !1; const o = r.minTranslate(), d = r.maxTranslate(); let c; if (c = a && e > o ? o : a && e < d ? d : e, r.updateProgress(c), n.cssMode) { const e = r.isHorizontal(); if (0 === t) l[e ? "scrollLeft" : "scrollTop"] = -c; else { if (!r.support.smoothScroll) return w({ swiper: r, targetPosition: -c, side: e ? "left" : "top" }), !0; l.scrollTo({ [e ? "left" : "top"]: -c, behavior: "smooth" }) } return !0 } return 0 === t ? (r.setTransition(0), r.setTranslate(c), s && (r.emit("beforeTransitionStart", t, i), r.emit("transitionEnd"))) : (r.setTransition(t), r.setTranslate(c), s && (r.emit("beforeTransitionStart", t, i), r.emit("transitionStart")), r.animating || (r.animating = !0, r.onTranslateToWrapperTransitionEnd || (r.onTranslateToWrapperTransitionEnd = function (e) { r && !r.destroyed && e.target === this && (r.$wrapperEl[0].removeEventListener("transitionend", r.onTranslateToWrapperTransitionEnd), r.$wrapperEl[0].removeEventListener("webkitTransitionEnd", r.onTranslateToWrapperTransitionEnd), r.onTranslateToWrapperTransitionEnd = null, delete r.onTranslateToWrapperTransitionEnd, s && r.emit("transitionEnd")) }), r.$wrapperEl[0].addEventListener("transitionend", r.onTranslateToWrapperTransitionEnd), r.$wrapperEl[0].addEventListener("webkitTransitionEnd", r.onTranslateToWrapperTransitionEnd))), !0 } }; function P(e) { let { swiper: t, runCallbacks: s, direction: a, step: i } = e; const { activeIndex: r, previousIndex: n } = t; let l = a; if (l || (l = r > n ? "next" : r < n ? "prev" : "reset"), t.emit(`transition${i}`), s && r !== n) { if ("reset" === l) return void t.emit(`slideResetTransition${i}`); t.emit(`slideChangeTransition${i}`), "next" === l ? t.emit(`slideNextTransition${i}`) : t.emit(`slidePrevTransition${i}`) } } var k = { slideTo: function (e, t, s, a, i) { if (void 0 === e && (e = 0), void 0 === t && (t = this.params.speed), void 0 === s && (s = !0), "number" != typeof e && "string" != typeof e) throw new Error(`The 'index' argument cannot have type other than 'number' or 'string'. [${typeof e}] given.`); if ("string" == typeof e) { const t = parseInt(e, 10); if (!isFinite(t)) throw new Error(`The passed-in 'index' (string) couldn't be converted to 'number'. [${e}] given.`); e = t } const r = this; let n = e; n < 0 && (n = 0); const { params: l, snapGrid: o, slidesGrid: d, previousIndex: c, activeIndex: p, rtlTranslate: u, wrapperEl: h, enabled: m } = r; if (r.animating && l.preventInteractionOnTransition || !m && !a && !i) return !1; const f = Math.min(r.params.slidesPerGroupSkip, n); let g = f + Math.floor((n - f) / r.params.slidesPerGroup); g >= o.length && (g = o.length - 1); const v = -o[g]; if (l.normalizeSlideIndex) for (let e = 0; e < d.length; e += 1) { const t = -Math.floor(100 * v), s = Math.floor(100 * d[e]), a = Math.floor(100 * d[e + 1]); void 0 !== d[e + 1] ? t >= s && t < a - (a - s) / 2 ? n = e : t >= s && t < a && (n = e + 1) : t >= s && (n = e) } if (r.initialized && n !== p) { if (!r.allowSlideNext && v < r.translate && v < r.minTranslate()) return !1; if (!r.allowSlidePrev && v > r.translate && v > r.maxTranslate() && (p || 0) !== n) return !1 } let b; if (n !== (c || 0) && s && r.emit("beforeSlideChangeStart"), r.updateProgress(v), b = n > p ? "next" : n < p ? "prev" : "reset", u && -v === r.translate || !u && v === r.translate) return r.updateActiveIndex(n), l.autoHeight && r.updateAutoHeight(), r.updateSlidesClasses(), "slide" !== l.effect && r.setTranslate(v), "reset" !== b && (r.transitionStart(s, b), r.transitionEnd(s, b)), !1; if (l.cssMode) { const e = r.isHorizontal(), s = u ? v : -v; if (0 === t) { const t = r.virtual && r.params.virtual.enabled; t && (r.wrapperEl.style.scrollSnapType = "none", r._immediateVirtual = !0), h[e ? "scrollLeft" : "scrollTop"] = s, t && requestAnimationFrame((() => { r.wrapperEl.style.scrollSnapType = "", r._swiperImmediateVirtual = !1 })) } else { if (!r.support.smoothScroll) return w({ swiper: r, targetPosition: s, side: e ? "left" : "top" }), !0; h.scrollTo({ [e ? "left" : "top"]: s, behavior: "smooth" }) } return !0 } return r.setTransition(t), r.setTranslate(v), r.updateActiveIndex(n), r.updateSlidesClasses(), r.emit("beforeTransitionStart", t, a), r.transitionStart(s, b), 0 === t ? r.transitionEnd(s, b) : r.animating || (r.animating = !0, r.onSlideToWrapperTransitionEnd || (r.onSlideToWrapperTransitionEnd = function (e) { r && !r.destroyed && e.target === this && (r.$wrapperEl[0].removeEventListener("transitionend", r.onSlideToWrapperTransitionEnd), r.$wrapperEl[0].removeEventListener("webkitTransitionEnd", r.onSlideToWrapperTransitionEnd), r.onSlideToWrapperTransitionEnd = null, delete r.onSlideToWrapperTransitionEnd, r.transitionEnd(s, b)) }), r.$wrapperEl[0].addEventListener("transitionend", r.onSlideToWrapperTransitionEnd), r.$wrapperEl[0].addEventListener("webkitTransitionEnd", r.onSlideToWrapperTransitionEnd)), !0 }, slideToLoop: function (e, t, s, a) { if (void 0 === e && (e = 0), void 0 === t && (t = this.params.speed), void 0 === s && (s = !0), "string" == typeof e) { const t = parseInt(e, 10); if (!isFinite(t)) throw new Error(`The passed-in 'index' (string) couldn't be converted to 'number'. [${e}] given.`); e = t } const i = this; let r = e; return i.params.loop && (r += i.loopedSlides), i.slideTo(r, t, s, a) }, slideNext: function (e, t, s) { void 0 === e && (e = this.params.speed), void 0 === t && (t = !0); const a = this, { animating: i, enabled: r, params: n } = a; if (!r) return a; let l = n.slidesPerGroup; "auto" === n.slidesPerView && 1 === n.slidesPerGroup && n.slidesPerGroupAuto && (l = Math.max(a.slidesPerViewDynamic("current", !0), 1)); const o = a.activeIndex < n.slidesPerGroupSkip ? 1 : l; if (n.loop) { if (i && n.loopPreventsSlide) return !1; a.loopFix(), a._clientLeft = a.$wrapperEl[0].clientLeft } return n.rewind && a.isEnd ? a.slideTo(0, e, t, s) : a.slideTo(a.activeIndex + o, e, t, s) }, slidePrev: function (e, t, s) { void 0 === e && (e = this.params.speed), void 0 === t && (t = !0); const a = this, { params: i, animating: r, snapGrid: n, slidesGrid: l, rtlTranslate: o, enabled: d } = a; if (!d) return a; if (i.loop) { if (r && i.loopPreventsSlide) return !1; a.loopFix(), a._clientLeft = a.$wrapperEl[0].clientLeft } function c(e) { return e < 0 ? -Math.floor(Math.abs(e)) : Math.floor(e) } const p = c(o ? a.translate : -a.translate), u = n.map((e => c(e))); let h = n[u.indexOf(p) - 1]; if (void 0 === h && i.cssMode) { let e; n.forEach(((t, s) => { p >= t && (e = s) })), void 0 !== e && (h = n[e > 0 ? e - 1 : e]) } let m = 0; if (void 0 !== h && (m = l.indexOf(h), m < 0 && (m = a.activeIndex - 1), "auto" === i.slidesPerView && 1 === i.slidesPerGroup && i.slidesPerGroupAuto && (m = m - a.slidesPerViewDynamic("previous", !0) + 1, m = Math.max(m, 0))), i.rewind && a.isBeginning) { const i = a.params.virtual && a.params.virtual.enabled && a.virtual ? a.virtual.slides.length - 1 : a.slides.length - 1; return a.slideTo(i, e, t, s) } return a.slideTo(m, e, t, s) }, slideReset: function (e, t, s) { return void 0 === e && (e = this.params.speed), void 0 === t && (t = !0), this.slideTo(this.activeIndex, e, t, s) }, slideToClosest: function (e, t, s, a) { void 0 === e && (e = this.params.speed), void 0 === t && (t = !0), void 0 === a && (a = .5); const i = this; let r = i.activeIndex; const n = Math.min(i.params.slidesPerGroupSkip, r), l = n + Math.floor((r - n) / i.params.slidesPerGroup), o = i.rtlTranslate ? i.translate : -i.translate; if (o >= i.snapGrid[l]) { const e = i.snapGrid[l]; o - e > (i.snapGrid[l + 1] - e) * a && (r += i.params.slidesPerGroup) } else { const e = i.snapGrid[l - 1]; o - e <= (i.snapGrid[l] - e) * a && (r -= i.params.slidesPerGroup) } return r = Math.max(r, 0), r = Math.min(r, i.slidesGrid.length - 1), i.slideTo(r, e, t, s) }, slideToClickedSlide: function () { const e = this, { params: t, $wrapperEl: s } = e, a = "auto" === t.slidesPerView ? e.slidesPerViewDynamic() : t.slidesPerView; let i, r = e.clickedIndex; if (t.loop) { if (e.animating) return; i = parseInt(d(e.clickedSlide).attr("data-swiper-slide-index"), 10), t.centeredSlides ? r < e.loopedSlides - a / 2 || r > e.slides.length - e.loopedSlides + a / 2 ? (e.loopFix(), r = s.children(`.${t.slideClass}[data-swiper-slide-index="${i}"]:not(.${t.slideDuplicateClass})`).eq(0).index(), p((() => { e.slideTo(r) }))) : e.slideTo(r) : r > e.slides.length - a ? (e.loopFix(), r = s.children(`.${t.slideClass}[data-swiper-slide-index="${i}"]:not(.${t.slideDuplicateClass})`).eq(0).index(), p((() => { e.slideTo(r) }))) : e.slideTo(r) } else e.slideTo(r) } }; var z = { loopCreate: function () { const e = this, t = a(), { params: s, $wrapperEl: i } = e, r = i.children().length > 0 ? d(i.children()[0].parentNode) : i; r.children(`.${s.slideClass}.${s.slideDuplicateClass}`).remove(); let n = r.children(`.${s.slideClass}`); if (s.loopFillGroupWithBlank) { const e = s.slidesPerGroup - n.length % s.slidesPerGroup; if (e !== s.slidesPerGroup) { for (let a = 0; a < e; a += 1) { const e = d(t.createElement("div")).addClass(`${s.slideClass} ${s.slideBlankClass}`); r.append(e) } n = r.children(`.${s.slideClass}`) } } "auto" !== s.slidesPerView || s.loopedSlides || (s.loopedSlides = n.length), e.loopedSlides = Math.ceil(parseFloat(s.loopedSlides || s.slidesPerView, 10)), e.loopedSlides += s.loopAdditionalSlides, e.loopedSlides > n.length && e.params.loopedSlidesLimit && (e.loopedSlides = n.length); const l = [], o = []; n.each(((e, t) => { d(e).attr("data-swiper-slide-index", t) })); for (let t = 0; t < e.loopedSlides; t += 1) { const e = t - Math.floor(t / n.length) * n.length; o.push(n.eq(e)[0]), l.unshift(n.eq(n.length - e - 1)[0]) } for (let e = 0; e < o.length; e += 1)r.append(d(o[e].cloneNode(!0)).addClass(s.slideDuplicateClass)); for (let e = l.length - 1; e >= 0; e -= 1)r.prepend(d(l[e].cloneNode(!0)).addClass(s.slideDuplicateClass)) }, loopFix: function () { const e = this; e.emit("beforeLoopFix"); const { activeIndex: t, slides: s, loopedSlides: a, allowSlidePrev: i, allowSlideNext: r, snapGrid: n, rtlTranslate: l } = e; let o; e.allowSlidePrev = !0, e.allowSlideNext = !0; const d = -n[t] - e.getTranslate(); if (t < a) { o = s.length - 3 * a + t, o += a; e.slideTo(o, 0, !1, !0) && 0 !== d && e.setTranslate((l ? -e.translate : e.translate) - d) } else if (t >= s.length - a) { o = -s.length + t + a, o += a; e.slideTo(o, 0, !1, !0) && 0 !== d && e.setTranslate((l ? -e.translate : e.translate) - d) } e.allowSlidePrev = i, e.allowSlideNext = r, e.emit("loopFix") }, loopDestroy: function () { const { $wrapperEl: e, params: t, slides: s } = this; e.children(`.${t.slideClass}.${t.slideDuplicateClass},.${t.slideClass}.${t.slideBlankClass}`).remove(), s.removeAttr("data-swiper-slide-index") } }; function L(e) { const t = this, s = a(), i = r(), n = t.touchEventsData, { params: l, touches: o, enabled: c } = t; if (!c) return; if (t.animating && l.preventInteractionOnTransition) return; !t.animating && l.cssMode && l.loop && t.loopFix(); let p = e; p.originalEvent && (p = p.originalEvent); let h = d(p.target); if ("wrapper" === l.touchEventsTarget && !h.closest(t.wrapperEl).length) return; if (n.isTouchEvent = "touchstart" === p.type, !n.isTouchEvent && "which" in p && 3 === p.which) return; if (!n.isTouchEvent && "button" in p && p.button > 0) return; if (n.isTouched && n.isMoved) return; const m = !!l.noSwipingClass && "" !== l.noSwipingClass, f = e.composedPath ? e.composedPath() : e.path; m && p.target && p.target.shadowRoot && f && (h = d(f[0])); const g = l.noSwipingSelector ? l.noSwipingSelector : `.${l.noSwipingClass}`, v = !(!p.target || !p.target.shadowRoot); if (l.noSwiping && (v ? function (e, t) { return void 0 === t && (t = this), function t(s) { if (!s || s === a() || s === r()) return null; s.assignedSlot && (s = s.assignedSlot); const i = s.closest(e); return i || s.getRootNode ? i || t(s.getRootNode().host) : null }(t) }(g, h[0]) : h.closest(g)[0])) return void (t.allowClick = !0); if (l.swipeHandler && !h.closest(l.swipeHandler)[0]) return; o.currentX = "touchstart" === p.type ? p.targetTouches[0].pageX : p.pageX, o.currentY = "touchstart" === p.type ? p.targetTouches[0].pageY : p.pageY; const w = o.currentX, b = o.currentY, x = l.edgeSwipeDetection || l.iOSEdgeSwipeDetection, y = l.edgeSwipeThreshold || l.iOSEdgeSwipeThreshold; if (x && (w <= y || w >= i.innerWidth - y)) { if ("prevent" !== x) return; e.preventDefault() } if (Object.assign(n, { isTouched: !0, isMoved: !1, allowTouchCallbacks: !0, isScrolling: void 0, startMoving: void 0 }), o.startX = w, o.startY = b, n.touchStartTime = u(), t.allowClick = !0, t.updateSize(), t.swipeDirection = void 0, l.threshold > 0 && (n.allowThresholdMove = !1), "touchstart" !== p.type) { let e = !0; h.is(n.focusableElements) && (e = !1, "SELECT" === h[0].nodeName && (n.isTouched = !1)), s.activeElement && d(s.activeElement).is(n.focusableElements) && s.activeElement !== h[0] && s.activeElement.blur(); const a = e && t.allowTouchMove && l.touchStartPreventDefault; !l.touchStartForcePreventDefault && !a || h[0].isContentEditable || p.preventDefault() } t.params.freeMode && t.params.freeMode.enabled && t.freeMode && t.animating && !l.cssMode && t.freeMode.onTouchStart(), t.emit("touchStart", p) } function O(e) { const t = a(), s = this, i = s.touchEventsData, { params: r, touches: n, rtlTranslate: l, enabled: o } = s; if (!o) return; let c = e; if (c.originalEvent && (c = c.originalEvent), !i.isTouched) return void (i.startMoving && i.isScrolling && s.emit("touchMoveOpposite", c)); if (i.isTouchEvent && "touchmove" !== c.type) return; const p = "touchmove" === c.type && c.targetTouches && (c.targetTouches[0] || c.changedTouches[0]), h = "touchmove" === c.type ? p.pageX : c.pageX, m = "touchmove" === c.type ? p.pageY : c.pageY; if (c.preventedByNestedSwiper) return n.startX = h, void (n.startY = m); if (!s.allowTouchMove) return d(c.target).is(i.focusableElements) || (s.allowClick = !1), void (i.isTouched && (Object.assign(n, { startX: h, startY: m, currentX: h, currentY: m }), i.touchStartTime = u())); if (i.isTouchEvent && r.touchReleaseOnEdges && !r.loop) if (s.isVertical()) { if (m < n.startY && s.translate <= s.maxTranslate() || m > n.startY && s.translate >= s.minTranslate()) return i.isTouched = !1, void (i.isMoved = !1) } else if (h < n.startX && s.translate <= s.maxTranslate() || h > n.startX && s.translate >= s.minTranslate()) return; if (i.isTouchEvent && t.activeElement && c.target === t.activeElement && d(c.target).is(i.focusableElements)) return i.isMoved = !0, void (s.allowClick = !1); if (i.allowTouchCallbacks && s.emit("touchMove", c), c.targetTouches && c.targetTouches.length > 1) return; n.currentX = h, n.currentY = m; const f = n.currentX - n.startX, g = n.currentY - n.startY; if (s.params.threshold && Math.sqrt(f ** 2 + g ** 2) < s.params.threshold) return; if (void 0 === i.isScrolling) { let e; s.isHorizontal() && n.currentY === n.startY || s.isVertical() && n.currentX === n.startX ? i.isScrolling = !1 : f * f + g * g >= 25 && (e = 180 * Math.atan2(Math.abs(g), Math.abs(f)) / Math.PI, i.isScrolling = s.isHorizontal() ? e > r.touchAngle : 90 - e > r.touchAngle) } if (i.isScrolling && s.emit("touchMoveOpposite", c), void 0 === i.startMoving && (n.currentX === n.startX && n.currentY === n.startY || (i.startMoving = !0)), i.isScrolling) return void (i.isTouched = !1); if (!i.startMoving) return; s.allowClick = !1, !r.cssMode && c.cancelable && c.preventDefault(), r.touchMoveStopPropagation && !r.nested && c.stopPropagation(), i.isMoved || (r.loop && !r.cssMode && s.loopFix(), i.startTranslate = s.getTranslate(), s.setTransition(0), s.animating && s.$wrapperEl.trigger("webkitTransitionEnd transitionend"), i.allowMomentumBounce = !1, !r.grabCursor || !0 !== s.allowSlideNext && !0 !== s.allowSlidePrev || s.setGrabCursor(!0), s.emit("sliderFirstMove", c)), s.emit("sliderMove", c), i.isMoved = !0; let v = s.isHorizontal() ? f : g; n.diff = v, v *= r.touchRatio, l && (v = -v), s.swipeDirection = v > 0 ? "prev" : "next", i.currentTranslate = v + i.startTranslate; let w = !0, b = r.resistanceRatio; if (r.touchReleaseOnEdges && (b = 0), v > 0 && i.currentTranslate > s.minTranslate() ? (w = !1, r.resistance && (i.currentTranslate = s.minTranslate() - 1 + (-s.minTranslate() + i.startTranslate + v) ** b)) : v < 0 && i.currentTranslate < s.maxTranslate() && (w = !1, r.resistance && (i.currentTranslate = s.maxTranslate() + 1 - (s.maxTranslate() - i.startTranslate - v) ** b)), w && (c.preventedByNestedSwiper = !0), !s.allowSlideNext && "next" === s.swipeDirection && i.currentTranslate < i.startTranslate && (i.currentTranslate = i.startTranslate), !s.allowSlidePrev && "prev" === s.swipeDirection && i.currentTranslate > i.startTranslate && (i.currentTranslate = i.startTranslate), s.allowSlidePrev || s.allowSlideNext || (i.currentTranslate = i.startTranslate), r.threshold > 0) { if (!(Math.abs(v) > r.threshold || i.allowThresholdMove)) return void (i.currentTranslate = i.startTranslate); if (!i.allowThresholdMove) return i.allowThresholdMove = !0, n.startX = n.currentX, n.startY = n.currentY, i.currentTranslate = i.startTranslate, void (n.diff = s.isHorizontal() ? n.currentX - n.startX : n.currentY - n.startY) } r.followFinger && !r.cssMode && ((r.freeMode && r.freeMode.enabled && s.freeMode || r.watchSlidesProgress) && (s.updateActiveIndex(), s.updateSlidesClasses()), s.params.freeMode && r.freeMode.enabled && s.freeMode && s.freeMode.onTouchMove(), s.updateProgress(i.currentTranslate), s.setTranslate(i.currentTranslate)) } function I(e) { const t = this, s = t.touchEventsData, { params: a, touches: i, rtlTranslate: r, slidesGrid: n, enabled: l } = t; if (!l) return; let o = e; if (o.originalEvent && (o = o.originalEvent), s.allowTouchCallbacks && t.emit("touchEnd", o), s.allowTouchCallbacks = !1, !s.isTouched) return s.isMoved && a.grabCursor && t.setGrabCursor(!1), s.isMoved = !1, void (s.startMoving = !1); a.grabCursor && s.isMoved && s.isTouched && (!0 === t.allowSlideNext || !0 === t.allowSlidePrev) && t.setGrabCursor(!1); const d = u(), c = d - s.touchStartTime; if (t.allowClick) { const e = o.path || o.composedPath && o.composedPath(); t.updateClickedSlide(e && e[0] || o.target), t.emit("tap click", o), c < 300 && d - s.lastClickTime < 300 && t.emit("doubleTap doubleClick", o) } if (s.lastClickTime = u(), p((() => { t.destroyed || (t.allowClick = !0) })), !s.isTouched || !s.isMoved || !t.swipeDirection || 0 === i.diff || s.currentTranslate === s.startTranslate) return s.isTouched = !1, s.isMoved = !1, void (s.startMoving = !1); let h; if (s.isTouched = !1, s.isMoved = !1, s.startMoving = !1, h = a.followFinger ? r ? t.translate : -t.translate : -s.currentTranslate, a.cssMode) return; if (t.params.freeMode && a.freeMode.enabled) return void t.freeMode.onTouchEnd({ currentPos: h }); let m = 0, f = t.slidesSizesGrid[0]; for (let e = 0; e < n.length; e += e < a.slidesPerGroupSkip ? 1 : a.slidesPerGroup) { const t = e < a.slidesPerGroupSkip - 1 ? 1 : a.slidesPerGroup; void 0 !== n[e + t] ? h >= n[e] && h < n[e + t] && (m = e, f = n[e + t] - n[e]) : h >= n[e] && (m = e, f = n[n.length - 1] - n[n.length - 2]) } let g = null, v = null; a.rewind && (t.isBeginning ? v = t.params.virtual && t.params.virtual.enabled && t.virtual ? t.virtual.slides.length - 1 : t.slides.length - 1 : t.isEnd && (g = 0)); const w = (h - n[m]) / f, b = m < a.slidesPerGroupSkip - 1 ? 1 : a.slidesPerGroup; if (c > a.longSwipesMs) { if (!a.longSwipes) return void t.slideTo(t.activeIndex); "next" === t.swipeDirection && (w >= a.longSwipesRatio ? t.slideTo(a.rewind && t.isEnd ? g : m + b) : t.slideTo(m)), "prev" === t.swipeDirection && (w > 1 - a.longSwipesRatio ? t.slideTo(m + b) : null !== v && w < 0 && Math.abs(w) > a.longSwipesRatio ? t.slideTo(v) : t.slideTo(m)) } else { if (!a.shortSwipes) return void t.slideTo(t.activeIndex); t.navigation && (o.target === t.navigation.nextEl || o.target === t.navigation.prevEl) ? o.target === t.navigation.nextEl ? t.slideTo(m + b) : t.slideTo(m) : ("next" === t.swipeDirection && t.slideTo(null !== g ? g : m + b), "prev" === t.swipeDirection && t.slideTo(null !== v ? v : m)) } } function A() { const e = this, { params: t, el: s } = e; if (s && 0 === s.offsetWidth) return; t.breakpoints && e.setBreakpoint(); const { allowSlideNext: a, allowSlidePrev: i, snapGrid: r } = e; e.allowSlideNext = !0, e.allowSlidePrev = !0, e.updateSize(), e.updateSlides(), e.updateSlidesClasses(), ("auto" === t.slidesPerView || t.slidesPerView > 1) && e.isEnd && !e.isBeginning && !e.params.centeredSlides ? e.slideTo(e.slides.length - 1, 0, !1, !0) : e.slideTo(e.activeIndex, 0, !1, !0), e.autoplay && e.autoplay.running && e.autoplay.paused && e.autoplay.run(), e.allowSlidePrev = i, e.allowSlideNext = a, e.params.watchOverflow && r !== e.snapGrid && e.checkOverflow() } function D(e) { const t = this; t.enabled && (t.allowClick || (t.params.preventClicks && e.preventDefault(), t.params.preventClicksPropagation && t.animating && (e.stopPropagation(), e.stopImmediatePropagation()))) } function G() { const e = this, { wrapperEl: t, rtlTranslate: s, enabled: a } = e; if (!a) return; let i; e.previousTranslate = e.translate, e.isHorizontal() ? e.translate = -t.scrollLeft : e.translate = -t.scrollTop, 0 === e.translate && (e.translate = 0), e.updateActiveIndex(), e.updateSlidesClasses(); const r = e.maxTranslate() - e.minTranslate(); i = 0 === r ? 0 : (e.translate - e.minTranslate()) / r, i !== e.progress && e.updateProgress(s ? -e.translate : e.translate), e.emit("setTranslate", e.translate, !1) } let N = !1; function B() { } const H = (e, t) => { const s = a(), { params: i, touchEvents: r, el: n, wrapperEl: l, device: o, support: d } = e, c = !!i.nested, p = "on" === t ? "addEventListener" : "removeEventListener", u = t; if (d.touch) { const t = !("touchstart" !== r.start || !d.passiveListener || !i.passiveListeners) && { passive: !0, capture: !1 }; n[p](r.start, e.onTouchStart, t), n[p](r.move, e.onTouchMove, d.passiveListener ? { passive: !1, capture: c } : c), n[p](r.end, e.onTouchEnd, t), r.cancel && n[p](r.cancel, e.onTouchEnd, t) } else n[p](r.start, e.onTouchStart, !1), s[p](r.move, e.onTouchMove, c), s[p](r.end, e.onTouchEnd, !1); (i.preventClicks || i.preventClicksPropagation) && n[p]("click", e.onClick, !0), i.cssMode && l[p]("scroll", e.onScroll), i.updateOnWindowResize ? e[u](o.ios || o.android ? "resize orientationchange observerUpdate" : "resize observerUpdate", A, !0) : e[u]("observerUpdate", A, !0) }; var X = { attachEvents: function () { const e = this, t = a(), { params: s, support: i } = e; e.onTouchStart = L.bind(e), e.onTouchMove = O.bind(e), e.onTouchEnd = I.bind(e), s.cssMode && (e.onScroll = G.bind(e)), e.onClick = D.bind(e), i.touch && !N && (t.addEventListener("touchstart", B), N = !0), H(e, "on") }, detachEvents: function () { H(this, "off") } }; const Y = (e, t) => e.grid && t.grid && t.grid.rows > 1; var R = { addClasses: function () { const e = this, { classNames: t, params: s, rtl: a, $el: i, device: r, support: n } = e, l = function (e, t) { const s = []; return e.forEach((e => { "object" == typeof e ? Object.keys(e).forEach((a => { e[a] && s.push(t + a) })) : "string" == typeof e && s.push(t + e) })), s }(["initialized", s.direction, { "pointer-events": !n.touch }, { "free-mode": e.params.freeMode && s.freeMode.enabled }, { autoheight: s.autoHeight }, { rtl: a }, { grid: s.grid && s.grid.rows > 1 }, { "grid-column": s.grid && s.grid.rows > 1 && "column" === s.grid.fill }, { android: r.android }, { ios: r.ios }, { "css-mode": s.cssMode }, { centered: s.cssMode && s.centeredSlides }, { "watch-progress": s.watchSlidesProgress }], s.containerModifierClass); t.push(...l), i.addClass([...t].join(" ")), e.emitContainerClasses() }, removeClasses: function () { const { $el: e, classNames: t } = this; e.removeClass(t.join(" ")), this.emitContainerClasses() } }; var W = { init: !0, direction: "horizontal", touchEventsTarget: "wrapper", initialSlide: 0, speed: 300, cssMode: !1, updateOnWindowResize: !0, resizeObserver: !0, nested: !1, createElements: !1, enabled: !0, focusableElements: "input, select, option, textarea, button, video, label", width: null, height: null, preventInteractionOnTransition: !1, userAgent: null, url: null, edgeSwipeDetection: !1, edgeSwipeThreshold: 20, autoHeight: !1, setWrapperSize: !1, virtualTranslate: !1, effect: "slide", breakpoints: void 0, breakpointsBase: "window", spaceBetween: 0, slidesPerView: 1, slidesPerGroup: 1, slidesPerGroupSkip: 0, slidesPerGroupAuto: !1, centeredSlides: !1, centeredSlidesBounds: !1, slidesOffsetBefore: 0, slidesOffsetAfter: 0, normalizeSlideIndex: !0, centerInsufficientSlides: !1, watchOverflow: !0, roundLengths: !1, touchRatio: 1, touchAngle: 45, simulateTouch: !0, shortSwipes: !0, longSwipes: !0, longSwipesRatio: .5, longSwipesMs: 300, followFinger: !0, allowTouchMove: !0, threshold: 0, touchMoveStopPropagation: !1, touchStartPreventDefault: !0, touchStartForcePreventDefault: !1, touchReleaseOnEdges: !1, uniqueNavElements: !0, resistance: !0, resistanceRatio: .85, watchSlidesProgress: !1, grabCursor: !1, preventClicks: !0, preventClicksPropagation: !0, slideToClickedSlide: !1, preloadImages: !0, updateOnImagesReady: !0, loop: !1, loopAdditionalSlides: 0, loopedSlides: null, loopedSlidesLimit: !0, loopFillGroupWithBlank: !1, loopPreventsSlide: !0, rewind: !1, allowSlidePrev: !0, allowSlideNext: !0, swipeHandler: null, noSwiping: !0, noSwipingClass: "swiper-no-swiping", noSwipingSelector: null, passiveListeners: !0, maxBackfaceHiddenSlides: 10, containerModifierClass: "swiper-", slideClass: "swiper-slide", slideBlankClass: "swiper-slide-invisible-blank", slideActiveClass: "swiper-slide-active", slideDuplicateActiveClass: "swiper-slide-duplicate-active", slideVisibleClass: "swiper-slide-visible", slideDuplicateClass: "swiper-slide-duplicate", slideNextClass: "swiper-slide-next", slideDuplicateNextClass: "swiper-slide-duplicate-next", slidePrevClass: "swiper-slide-prev", slideDuplicatePrevClass: "swiper-slide-duplicate-prev", wrapperClass: "swiper-wrapper", runCallbacksOnInit: !0, _emitClasses: !1 }; function q(e, t) { return function (s) { void 0 === s && (s = {}); const a = Object.keys(s)[0], i = s[a]; "object" == typeof i && null !== i ? (["navigation", "pagination", "scrollbar"].indexOf(a) >= 0 && !0 === e[a] && (e[a] = { auto: !0 }), a in e && "enabled" in i ? (!0 === e[a] && (e[a] = { enabled: !0 }), "object" != typeof e[a] || "enabled" in e[a] || (e[a].enabled = !0), e[a] || (e[a] = { enabled: !1 }), g(t, s)) : g(t, s)) : g(t, s) } } const j = { eventsEmitter: $, update: S, translate: M, transition: { setTransition: function (e, t) { const s = this; s.params.cssMode || s.$wrapperEl.transition(e), s.emit("setTransition", e, t) }, transitionStart: function (e, t) { void 0 === e && (e = !0); const s = this, { params: a } = s; a.cssMode || (a.autoHeight && s.updateAutoHeight(), P({ swiper: s, runCallbacks: e, direction: t, step: "Start" })) }, transitionEnd: function (e, t) { void 0 === e && (e = !0); const s = this, { params: a } = s; s.animating = !1, a.cssMode || (s.setTransition(0), P({ swiper: s, runCallbacks: e, direction: t, step: "End" })) } }, slide: k, loop: z, grabCursor: { setGrabCursor: function (e) { const t = this; if (t.support.touch || !t.params.simulateTouch || t.params.watchOverflow && t.isLocked || t.params.cssMode) return; const s = "container" === t.params.touchEventsTarget ? t.el : t.wrapperEl; s.style.cursor = "move", s.style.cursor = e ? "grabbing" : "grab" }, unsetGrabCursor: function () { const e = this; e.support.touch || e.params.watchOverflow && e.isLocked || e.params.cssMode || (e["container" === e.params.touchEventsTarget ? "el" : "wrapperEl"].style.cursor = "") } }, events: X, breakpoints: { setBreakpoint: function () { const e = this, { activeIndex: t, initialized: s, loopedSlides: a = 0, params: i, $el: r } = e, n = i.breakpoints; if (!n || n && 0 === Object.keys(n).length) return; const l = e.getBreakpoint(n, e.params.breakpointsBase, e.el); if (!l || e.currentBreakpoint === l) return; const o = (l in n ? n[l] : void 0) || e.originalParams, d = Y(e, i), c = Y(e, o), p = i.enabled; d && !c ? (r.removeClass(`${i.containerModifierClass}grid ${i.containerModifierClass}grid-column`), e.emitContainerClasses()) : !d && c && (r.addClass(`${i.containerModifierClass}grid`), (o.grid.fill && "column" === o.grid.fill || !o.grid.fill && "column" === i.grid.fill) && r.addClass(`${i.containerModifierClass}grid-column`), e.emitContainerClasses()), ["navigation", "pagination", "scrollbar"].forEach((t => { const s = i[t] && i[t].enabled, a = o[t] && o[t].enabled; s && !a && e[t].disable(), !s && a && e[t].enable() })); const u = o.direction && o.direction !== i.direction, h = i.loop && (o.slidesPerView !== i.slidesPerView || u); u && s && e.changeDirection(), g(e.params, o); const m = e.params.enabled; Object.assign(e, { allowTouchMove: e.params.allowTouchMove, allowSlideNext: e.params.allowSlideNext, allowSlidePrev: e.params.allowSlidePrev }), p && !m ? e.disable() : !p && m && e.enable(), e.currentBreakpoint = l, e.emit("_beforeBreakpoint", o), h && s && (e.loopDestroy(), e.loopCreate(), e.updateSlides(), e.slideTo(t - a + e.loopedSlides, 0, !1)), e.emit("breakpoint", o) }, getBreakpoint: function (e, t, s) { if (void 0 === t && (t = "window"), !e || "container" === t && !s) return; let a = !1; const i = r(), n = "window" === t ? i.innerHeight : s.clientHeight, l = Object.keys(e).map((e => { if ("string" == typeof e && 0 === e.indexOf("@")) { const t = parseFloat(e.substr(1)); return { value: n * t, point: e } } return { value: e, point: e } })); l.sort(((e, t) => parseInt(e.value, 10) - parseInt(t.value, 10))); for (let e = 0; e < l.length; e += 1) { const { point: r, value: n } = l[e]; "window" === t ? i.matchMedia(`(min-width: ${n}px)`).matches && (a = r) : n <= s.clientWidth && (a = r) } return a || "max" } }, checkOverflow: { checkOverflow: function () { const e = this, { isLocked: t, params: s } = e, { slidesOffsetBefore: a } = s; if (a) { const t = e.slides.length - 1, s = e.slidesGrid[t] + e.slidesSizesGrid[t] + 2 * a; e.isLocked = e.size > s } else e.isLocked = 1 === e.snapGrid.length; !0 === s.allowSlideNext && (e.allowSlideNext = !e.isLocked), !0 === s.allowSlidePrev && (e.allowSlidePrev = !e.isLocked), t && t !== e.isLocked && (e.isEnd = !1), t !== e.isLocked && e.emit(e.isLocked ? "lock" : "unlock") } }, classes: R, images: { loadImage: function (e, t, s, a, i, n) { const l = r(); let o; function c() { n && n() } d(e).parent("picture")[0] || e.complete && i ? c() : t ? (o = new l.Image, o.onload = c, o.onerror = c, a && (o.sizes = a), s && (o.srcset = s), t && (o.src = t)) : c() }, preloadImages: function () { const e = this; function t() { null != e && e && !e.destroyed && (void 0 !== e.imagesLoaded && (e.imagesLoaded += 1), e.imagesLoaded === e.imagesToLoad.length && (e.params.updateOnImagesReady && e.update(), e.emit("imagesReady"))) } e.imagesToLoad = e.$el.find("img"); for (let s = 0; s < e.imagesToLoad.length; s += 1) { const a = e.imagesToLoad[s]; e.loadImage(a, a.currentSrc || a.getAttribute("src"), a.srcset || a.getAttribute("srcset"), a.sizes || a.getAttribute("sizes"), !0, t) } } } }, _ = {}; class V { constructor() { let e, t; for (var s = arguments.length, a = new Array(s), i = 0; i < s; i++)a[i] = arguments[i]; if (1 === a.length && a[0].constructor && "Object" === Object.prototype.toString.call(a[0]).slice(8, -1) ? t = a[0] : [e, t] = a, t || (t = {}), t = g({}, t), e && !t.el && (t.el = e), t.el && d(t.el).length > 1) { const e = []; return d(t.el).each((s => { const a = g({}, t, { el: s }); e.push(new V(a)) })), e } const r = this; r.__swiper__ = !0, r.support = E(), r.device = C({ userAgent: t.userAgent }), r.browser = T(), r.eventsListeners = {}, r.eventsAnyListeners = [], r.modules = [...r.__modules__], t.modules && Array.isArray(t.modules) && r.modules.push(...t.modules); const n = {}; r.modules.forEach((e => { e({ swiper: r, extendParams: q(t, n), on: r.on.bind(r), once: r.once.bind(r), off: r.off.bind(r), emit: r.emit.bind(r) }) })); const l = g({}, W, n); return r.params = g({}, l, _, t), r.originalParams = g({}, r.params), r.passedParams = g({}, t), r.params && r.params.on && Object.keys(r.params.on).forEach((e => { r.on(e, r.params.on[e]) })), r.params && r.params.onAny && r.onAny(r.params.onAny), r.$ = d, Object.assign(r, { enabled: r.params.enabled, el: e, classNames: [], slides: d(), slidesGrid: [], snapGrid: [], slidesSizesGrid: [], isHorizontal: () => "horizontal" === r.params.direction, isVertical: () => "vertical" === r.params.direction, activeIndex: 0, realIndex: 0, isBeginning: !0, isEnd: !1, translate: 0, previousTranslate: 0, progress: 0, velocity: 0, animating: !1, allowSlideNext: r.params.allowSlideNext, allowSlidePrev: r.params.allowSlidePrev, touchEvents: function () { const e = ["touchstart", "touchmove", "touchend", "touchcancel"], t = ["pointerdown", "pointermove", "pointerup"]; return r.touchEventsTouch = { start: e[0], move: e[1], end: e[2], cancel: e[3] }, r.touchEventsDesktop = { start: t[0], move: t[1], end: t[2] }, r.support.touch || !r.params.simulateTouch ? r.touchEventsTouch : r.touchEventsDesktop }(), touchEventsData: { isTouched: void 0, isMoved: void 0, allowTouchCallbacks: void 0, touchStartTime: void 0, isScrolling: void 0, currentTranslate: void 0, startTranslate: void 0, allowThresholdMove: void 0, focusableElements: r.params.focusableElements, lastClickTime: u(), clickTimeout: void 0, velocities: [], allowMomentumBounce: void 0, isTouchEvent: void 0, startMoving: void 0 }, allowClick: !0, allowTouchMove: r.params.allowTouchMove, touches: { startX: 0, startY: 0, currentX: 0, currentY: 0, diff: 0 }, imagesToLoad: [], imagesLoaded: 0 }), r.emit("_swiper"), r.params.init && r.init(), r } enable() { const e = this; e.enabled || (e.enabled = !0, e.params.grabCursor && e.setGrabCursor(), e.emit("enable")) } disable() { const e = this; e.enabled && (e.enabled = !1, e.params.grabCursor && e.unsetGrabCursor(), e.emit("disable")) } setProgress(e, t) { const s = this; e = Math.min(Math.max(e, 0), 1); const a = s.minTranslate(), i = (s.maxTranslate() - a) * e + a; s.translateTo(i, void 0 === t ? 0 : t), s.updateActiveIndex(), s.updateSlidesClasses() } emitContainerClasses() { const e = this; if (!e.params._emitClasses || !e.el) return; const t = e.el.className.split(" ").filter((t => 0 === t.indexOf("swiper") || 0 === t.indexOf(e.params.containerModifierClass))); e.emit("_containerClasses", t.join(" ")) } getSlideClasses(e) { const t = this; return t.destroyed ? "" : e.className.split(" ").filter((e => 0 === e.indexOf("swiper-slide") || 0 === e.indexOf(t.params.slideClass))).join(" ") } emitSlidesClasses() { const e = this; if (!e.params._emitClasses || !e.el) return; const t = []; e.slides.each((s => { const a = e.getSlideClasses(s); t.push({ slideEl: s, classNames: a }), e.emit("_slideClass", s, a) })), e.emit("_slideClasses", t) } slidesPerViewDynamic(e, t) { void 0 === e && (e = "current"), void 0 === t && (t = !1); const { params: s, slides: a, slidesGrid: i, slidesSizesGrid: r, size: n, activeIndex: l } = this; let o = 1; if (s.centeredSlides) { let e, t = a[l].swiperSlideSize; for (let s = l + 1; s < a.length; s += 1)a[s] && !e && (t += a[s].swiperSlideSize, o += 1, t > n && (e = !0)); for (let s = l - 1; s >= 0; s -= 1)a[s] && !e && (t += a[s].swiperSlideSize, o += 1, t > n && (e = !0)) } else if ("current" === e) for (let e = l + 1; e < a.length; e += 1) { (t ? i[e] + r[e] - i[l] < n : i[e] - i[l] < n) && (o += 1) } else for (let e = l - 1; e >= 0; e -= 1) { i[l] - i[e] < n && (o += 1) } return o } update() { const e = this; if (!e || e.destroyed) return; const { snapGrid: t, params: s } = e; function a() { const t = e.rtlTranslate ? -1 * e.translate : e.translate, s = Math.min(Math.max(t, e.maxTranslate()), e.minTranslate()); e.setTranslate(s), e.updateActiveIndex(), e.updateSlidesClasses() } let i; s.breakpoints && e.setBreakpoint(), e.updateSize(), e.updateSlides(), e.updateProgress(), e.updateSlidesClasses(), e.params.freeMode && e.params.freeMode.enabled ? (a(), e.params.autoHeight && e.updateAutoHeight()) : (i = ("auto" === e.params.slidesPerView || e.params.slidesPerView > 1) && e.isEnd && !e.params.centeredSlides ? e.slideTo(e.slides.length - 1, 0, !1, !0) : e.slideTo(e.activeIndex, 0, !1, !0), i || a()), s.watchOverflow && t !== e.snapGrid && e.checkOverflow(), e.emit("update") } changeDirection(e, t) { void 0 === t && (t = !0); const s = this, a = s.params.direction; return e || (e = "horizontal" === a ? "vertical" : "horizontal"), e === a || "horizontal" !== e && "vertical" !== e || (s.$el.removeClass(`${s.params.containerModifierClass}${a}`).addClass(`${s.params.containerModifierClass}${e}`), s.emitContainerClasses(), s.params.direction = e, s.slides.each((t => { "vertical" === e ? t.style.width = "" : t.style.height = "" })), s.emit("changeDirection"), t && s.update()), s } changeLanguageDirection(e) { const t = this; t.rtl && "rtl" === e || !t.rtl && "ltr" === e || (t.rtl = "rtl" === e, t.rtlTranslate = "horizontal" === t.params.direction && t.rtl, t.rtl ? (t.$el.addClass(`${t.params.containerModifierClass}rtl`), t.el.dir = "rtl") : (t.$el.removeClass(`${t.params.containerModifierClass}rtl`), t.el.dir = "ltr"), t.update()) } mount(e) { const t = this; if (t.mounted) return !0; const s = d(e || t.params.el); if (!(e = s[0])) return !1; e.swiper = t; const i = () => `.${(t.params.wrapperClass || "").trim().split(" ").join(".")}`; let r = (() => { if (e && e.shadowRoot && e.shadowRoot.querySelector) { const t = d(e.shadowRoot.querySelector(i())); return t.children = e => s.children(e), t } return s.children ? s.children(i()) : d(s).children(i()) })(); if (0 === r.length && t.params.createElements) { const e = a().createElement("div"); r = d(e), e.className = t.params.wrapperClass, s.append(e), s.children(`.${t.params.slideClass}`).each((e => { r.append(e) })) } return Object.assign(t, { $el: s, el: e, $wrapperEl: r, wrapperEl: r[0], mounted: !0, rtl: "rtl" === e.dir.toLowerCase() || "rtl" === s.css("direction"), rtlTranslate: "horizontal" === t.params.direction && ("rtl" === e.dir.toLowerCase() || "rtl" === s.css("direction")), wrongRTL: "-webkit-box" === r.css("display") }), !0 } init(e) { const t = this; if (t.initialized) return t; return !1 === t.mount(e) || (t.emit("beforeInit"), t.params.breakpoints && t.setBreakpoint(), t.addClasses(), t.params.loop && t.loopCreate(), t.updateSize(), t.updateSlides(), t.params.watchOverflow && t.checkOverflow(), t.params.grabCursor && t.enabled && t.setGrabCursor(), t.params.preloadImages && t.preloadImages(), t.params.loop ? t.slideTo(t.params.initialSlide + t.loopedSlides, 0, t.params.runCallbacksOnInit, !1, !0) : t.slideTo(t.params.initialSlide, 0, t.params.runCallbacksOnInit, !1, !0), t.attachEvents(), t.initialized = !0, t.emit("init"), t.emit("afterInit")), t } destroy(e, t) { void 0 === e && (e = !0), void 0 === t && (t = !0); const s = this, { params: a, $el: i, $wrapperEl: r, slides: n } = s; return void 0 === s.params || s.destroyed || (s.emit("beforeDestroy"), s.initialized = !1, s.detachEvents(), a.loop && s.loopDestroy(), t && (s.removeClasses(), i.removeAttr("style"), r.removeAttr("style"), n && n.length && n.removeClass([a.slideVisibleClass, a.slideActiveClass, a.slideNextClass, a.slidePrevClass].join(" ")).removeAttr("style").removeAttr("data-swiper-slide-index")), s.emit("destroy"), Object.keys(s.eventsListeners).forEach((e => { s.off(e) })), !1 !== e && (s.$el[0].swiper = null, function (e) { const t = e; Object.keys(t).forEach((e => { try { t[e] = null } catch (e) { } try { delete t[e] } catch (e) { } })) }(s)), s.destroyed = !0), null } static extendDefaults(e) { g(_, e) } static get extendedDefaults() { return _ } static get defaults() { return W } static installModule(e) { V.prototype.__modules__ || (V.prototype.__modules__ = []); const t = V.prototype.__modules__; "function" == typeof e && t.indexOf(e) < 0 && t.push(e) } static use(e) { return Array.isArray(e) ? (e.forEach((e => V.installModule(e))), V) : (V.installModule(e), V) } } function F(e, t, s, i) { const r = a(); return e.params.createElements && Object.keys(i).forEach((a => { if (!s[a] && !0 === s.auto) { let n = e.$el.children(`.${i[a]}`)[0]; n || (n = r.createElement("div"), n.className = i[a], e.$el.append(n)), s[a] = n, t[a] = n } })), s } function U(e) { return void 0 === e && (e = ""), `.${e.trim().replace(/([\.:!\/])/g, "\\$1").replace(/ /g, ".")}` } function K(e) { const t = this, { $wrapperEl: s, params: a } = t; if (a.loop && t.loopDestroy(), "object" == typeof e && "length" in e) for (let t = 0; t < e.length; t += 1)e[t] && s.append(e[t]); else s.append(e); a.loop && t.loopCreate(), a.observer || t.update() } function Z(e) { const t = this, { params: s, $wrapperEl: a, activeIndex: i } = t; s.loop && t.loopDestroy(); let r = i + 1; if ("object" == typeof e && "length" in e) { for (let t = 0; t < e.length; t += 1)e[t] && a.prepend(e[t]); r = i + e.length } else a.prepend(e); s.loop && t.loopCreate(), s.observer || t.update(), t.slideTo(r, 0, !1) } function Q(e, t) { const s = this, { $wrapperEl: a, params: i, activeIndex: r } = s; let n = r; i.loop && (n -= s.loopedSlides, s.loopDestroy(), s.slides = a.children(`.${i.slideClass}`)); const l = s.slides.length; if (e <= 0) return void s.prependSlide(t); if (e >= l) return void s.appendSlide(t); let o = n > e ? n + 1 : n; const d = []; for (let t = l - 1; t >= e; t -= 1) { const e = s.slides.eq(t); e.remove(), d.unshift(e) } if ("object" == typeof t && "length" in t) { for (let e = 0; e < t.length; e += 1)t[e] && a.append(t[e]); o = n > e ? n + t.length : n } else a.append(t); for (let e = 0; e < d.length; e += 1)a.append(d[e]); i.loop && s.loopCreate(), i.observer || s.update(), i.loop ? s.slideTo(o + s.loopedSlides, 0, !1) : s.slideTo(o, 0, !1) } function J(e) { const t = this, { params: s, $wrapperEl: a, activeIndex: i } = t; let r = i; s.loop && (r -= t.loopedSlides, t.loopDestroy(), t.slides = a.children(`.${s.slideClass}`)); let n, l = r; if ("object" == typeof e && "length" in e) { for (let s = 0; s < e.length; s += 1)n = e[s], t.slides[n] && t.slides.eq(n).remove(), n < l && (l -= 1); l = Math.max(l, 0) } else n = e, t.slides[n] && t.slides.eq(n).remove(), n < l && (l -= 1), l = Math.max(l, 0); s.loop && t.loopCreate(), s.observer || t.update(), s.loop ? t.slideTo(l + t.loopedSlides, 0, !1) : t.slideTo(l, 0, !1) } function ee() { const e = this, t = []; for (let s = 0; s < e.slides.length; s += 1)t.push(s); e.removeSlide(t) } function te(e) { const { effect: t, swiper: s, on: a, setTranslate: i, setTransition: r, overwriteParams: n, perspective: l, recreateShadows: o, getEffectParams: d } = e; let c; a("beforeInit", (() => { if (s.params.effect !== t) return; s.classNames.push(`${s.params.containerModifierClass}${t}`), l && l() && s.classNames.push(`${s.params.containerModifierClass}3d`); const e = n ? n() : {}; Object.assign(s.params, e), Object.assign(s.originalParams, e) })), a("setTranslate", (() => { s.params.effect === t && i() })), a("setTransition", ((e, a) => { s.params.effect === t && r(a) })), a("transitionEnd", (() => { if (s.params.effect === t && o) { if (!d || !d().slideShadows) return; s.slides.each((e => { s.$(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").remove() })), o() } })), a("virtualUpdate", (() => { s.params.effect === t && (s.slides.length || (c = !0), requestAnimationFrame((() => { c && s.slides && s.slides.length && (i(), c = !1) }))) })) } function se(e, t) { return e.transformEl ? t.find(e.transformEl).css({ "backface-visibility": "hidden", "-webkit-backface-visibility": "hidden" }) : t } function ae(e) { let { swiper: t, duration: s, transformEl: a, allSlides: i } = e; const { slides: r, activeIndex: n, $wrapperEl: l } = t; if (t.params.virtualTranslate && 0 !== s) { let e, s = !1; e = i ? a ? r.find(a) : r : a ? r.eq(n).find(a) : r.eq(n), e.transitionEnd((() => { if (s) return; if (!t || t.destroyed) return; s = !0, t.animating = !1; const e = ["webkitTransitionEnd", "transitionend"]; for (let t = 0; t < e.length; t += 1)l.trigger(e[t]) })) } } function ie(e, t, s) { const a = "swiper-slide-shadow" + (s ? `-${s}` : ""), i = e.transformEl ? t.find(e.transformEl) : t; let r = i.children(`.${a}`); return r.length || (r = d(`<div class="swiper-slide-shadow${s ? `-${s}` : ""}"></div>`), i.append(r)), r } Object.keys(j).forEach((e => { Object.keys(j[e]).forEach((t => { V.prototype[t] = j[e][t] })) })), V.use([function (e) { let { swiper: t, on: s, emit: a } = e; const i = r(); let n = null, l = null; const o = () => { t && !t.destroyed && t.initialized && (a("beforeResize"), a("resize")) }, d = () => { t && !t.destroyed && t.initialized && a("orientationchange") }; s("init", (() => { t.params.resizeObserver && void 0 !== i.ResizeObserver ? t && !t.destroyed && t.initialized && (n = new ResizeObserver((e => { l = i.requestAnimationFrame((() => { const { width: s, height: a } = t; let i = s, r = a; e.forEach((e => { let { contentBoxSize: s, contentRect: a, target: n } = e; n && n !== t.el || (i = a ? a.width : (s[0] || s).inlineSize, r = a ? a.height : (s[0] || s).blockSize) })), i === s && r === a || o() })) })), n.observe(t.el)) : (i.addEventListener("resize", o), i.addEventListener("orientationchange", d)) })), s("destroy", (() => { l && i.cancelAnimationFrame(l), n && n.unobserve && t.el && (n.unobserve(t.el), n = null), i.removeEventListener("resize", o), i.removeEventListener("orientationchange", d) })) }, function (e) { let { swiper: t, extendParams: s, on: a, emit: i } = e; const n = [], l = r(), o = function (e, t) { void 0 === t && (t = {}); const s = new (l.MutationObserver || l.WebkitMutationObserver)((e => { if (1 === e.length) return void i("observerUpdate", e[0]); const t = function () { i("observerUpdate", e[0]) }; l.requestAnimationFrame ? l.requestAnimationFrame(t) : l.setTimeout(t, 0) })); s.observe(e, { attributes: void 0 === t.attributes || t.attributes, childList: void 0 === t.childList || t.childList, characterData: void 0 === t.characterData || t.characterData }), n.push(s) }; s({ observer: !1, observeParents: !1, observeSlideChildren: !1 }), a("init", (() => { if (t.params.observer) { if (t.params.observeParents) { const e = t.$el.parents(); for (let t = 0; t < e.length; t += 1)o(e[t]) } o(t.$el[0], { childList: t.params.observeSlideChildren }), o(t.$wrapperEl[0], { attributes: !1 }) } })), a("destroy", (() => { n.forEach((e => { e.disconnect() })), n.splice(0, n.length) })) }]); const re = [function (e) { let t, { swiper: s, extendParams: a, on: i, emit: r } = e; function n(e, t) { const a = s.params.virtual; if (a.cache && s.virtual.cache[t]) return s.virtual.cache[t]; const i = a.renderSlide ? d(a.renderSlide.call(s, e, t)) : d(`<div class="${s.params.slideClass}" data-swiper-slide-index="${t}">${e}</div>`); return i.attr("data-swiper-slide-index") || i.attr("data-swiper-slide-index", t), a.cache && (s.virtual.cache[t] = i), i } function l(e) { const { slidesPerView: t, slidesPerGroup: a, centeredSlides: i } = s.params, { addSlidesBefore: l, addSlidesAfter: o } = s.params.virtual, { from: d, to: c, slides: p, slidesGrid: u, offset: h } = s.virtual; s.params.cssMode || s.updateActiveIndex(); const m = s.activeIndex || 0; let f, g, v; f = s.rtlTranslate ? "right" : s.isHorizontal() ? "left" : "top", i ? (g = Math.floor(t / 2) + a + o, v = Math.floor(t / 2) + a + l) : (g = t + (a - 1) + o, v = a + l); const w = Math.max((m || 0) - v, 0), b = Math.min((m || 0) + g, p.length - 1), x = (s.slidesGrid[w] || 0) - (s.slidesGrid[0] || 0); function y() { s.updateSlides(), s.updateProgress(), s.updateSlidesClasses(), s.lazy && s.params.lazy.enabled && s.lazy.load(), r("virtualUpdate") } if (Object.assign(s.virtual, { from: w, to: b, offset: x, slidesGrid: s.slidesGrid }), d === w && c === b && !e) return s.slidesGrid !== u && x !== h && s.slides.css(f, `${x}px`), s.updateProgress(), void r("virtualUpdate"); if (s.params.virtual.renderExternal) return s.params.virtual.renderExternal.call(s, { offset: x, from: w, to: b, slides: function () { const e = []; for (let t = w; t <= b; t += 1)e.push(p[t]); return e }() }), void (s.params.virtual.renderExternalUpdate ? y() : r("virtualUpdate")); const E = [], C = []; if (e) s.$wrapperEl.find(`.${s.params.slideClass}`).remove(); else for (let e = d; e <= c; e += 1)(e < w || e > b) && s.$wrapperEl.find(`.${s.params.slideClass}[data-swiper-slide-index="${e}"]`).remove(); for (let t = 0; t < p.length; t += 1)t >= w && t <= b && (void 0 === c || e ? C.push(t) : (t > c && C.push(t), t < d && E.push(t))); C.forEach((e => { s.$wrapperEl.append(n(p[e], e)) })), E.sort(((e, t) => t - e)).forEach((e => { s.$wrapperEl.prepend(n(p[e], e)) })), s.$wrapperEl.children(".swiper-slide").css(f, `${x}px`), y() } a({ virtual: { enabled: !1, slides: [], cache: !0, renderSlide: null, renderExternal: null, renderExternalUpdate: !0, addSlidesBefore: 0, addSlidesAfter: 0 } }), s.virtual = { cache: {}, from: void 0, to: void 0, slides: [], offset: 0, slidesGrid: [] }, i("beforeInit", (() => { s.params.virtual.enabled && (s.virtual.slides = s.params.virtual.slides, s.classNames.push(`${s.params.containerModifierClass}virtual`), s.params.watchSlidesProgress = !0, s.originalParams.watchSlidesProgress = !0, s.params.initialSlide || l()) })), i("setTranslate", (() => { s.params.virtual.enabled && (s.params.cssMode && !s._immediateVirtual ? (clearTimeout(t), t = setTimeout((() => { l() }), 100)) : l()) })), i("init update resize", (() => { s.params.virtual.enabled && s.params.cssMode && v(s.wrapperEl, "--swiper-virtual-size", `${s.virtualSize}px`) })), Object.assign(s.virtual, { appendSlide: function (e) { if ("object" == typeof e && "length" in e) for (let t = 0; t < e.length; t += 1)e[t] && s.virtual.slides.push(e[t]); else s.virtual.slides.push(e); l(!0) }, prependSlide: function (e) { const t = s.activeIndex; let a = t + 1, i = 1; if (Array.isArray(e)) { for (let t = 0; t < e.length; t += 1)e[t] && s.virtual.slides.unshift(e[t]); a = t + e.length, i = e.length } else s.virtual.slides.unshift(e); if (s.params.virtual.cache) { const e = s.virtual.cache, t = {}; Object.keys(e).forEach((s => { const a = e[s], r = a.attr("data-swiper-slide-index"); r && a.attr("data-swiper-slide-index", parseInt(r, 10) + i), t[parseInt(s, 10) + i] = a })), s.virtual.cache = t } l(!0), s.slideTo(a, 0) }, removeSlide: function (e) { if (null == e) return; let t = s.activeIndex; if (Array.isArray(e)) for (let a = e.length - 1; a >= 0; a -= 1)s.virtual.slides.splice(e[a], 1), s.params.virtual.cache && delete s.virtual.cache[e[a]], e[a] < t && (t -= 1), t = Math.max(t, 0); else s.virtual.slides.splice(e, 1), s.params.virtual.cache && delete s.virtual.cache[e], e < t && (t -= 1), t = Math.max(t, 0); l(!0), s.slideTo(t, 0) }, removeAllSlides: function () { s.virtual.slides = [], s.params.virtual.cache && (s.virtual.cache = {}), l(!0), s.slideTo(0, 0) }, update: l }) }, function (e) { let { swiper: t, extendParams: s, on: i, emit: n } = e; const l = a(), o = r(); function c(e) { if (!t.enabled) return; const { rtlTranslate: s } = t; let a = e; a.originalEvent && (a = a.originalEvent); const i = a.keyCode || a.charCode, r = t.params.keyboard.pageUpDown, d = r && 33 === i, c = r && 34 === i, p = 37 === i, u = 39 === i, h = 38 === i, m = 40 === i; if (!t.allowSlideNext && (t.isHorizontal() && u || t.isVertical() && m || c)) return !1; if (!t.allowSlidePrev && (t.isHorizontal() && p || t.isVertical() && h || d)) return !1; if (!(a.shiftKey || a.altKey || a.ctrlKey || a.metaKey || l.activeElement && l.activeElement.nodeName && ("input" === l.activeElement.nodeName.toLowerCase() || "textarea" === l.activeElement.nodeName.toLowerCase()))) { if (t.params.keyboard.onlyInViewport && (d || c || p || u || h || m)) { let e = !1; if (t.$el.parents(`.${t.params.slideClass}`).length > 0 && 0 === t.$el.parents(`.${t.params.slideActiveClass}`).length) return; const a = t.$el, i = a[0].clientWidth, r = a[0].clientHeight, n = o.innerWidth, l = o.innerHeight, d = t.$el.offset(); s && (d.left -= t.$el[0].scrollLeft); const c = [[d.left, d.top], [d.left + i, d.top], [d.left, d.top + r], [d.left + i, d.top + r]]; for (let t = 0; t < c.length; t += 1) { const s = c[t]; if (s[0] >= 0 && s[0] <= n && s[1] >= 0 && s[1] <= l) { if (0 === s[0] && 0 === s[1]) continue; e = !0 } } if (!e) return } t.isHorizontal() ? ((d || c || p || u) && (a.preventDefault ? a.preventDefault() : a.returnValue = !1), ((c || u) && !s || (d || p) && s) && t.slideNext(), ((d || p) && !s || (c || u) && s) && t.slidePrev()) : ((d || c || h || m) && (a.preventDefault ? a.preventDefault() : a.returnValue = !1), (c || m) && t.slideNext(), (d || h) && t.slidePrev()), n("keyPress", i) } } function p() { t.keyboard.enabled || (d(l).on("keydown", c), t.keyboard.enabled = !0) } function u() { t.keyboard.enabled && (d(l).off("keydown", c), t.keyboard.enabled = !1) } t.keyboard = { enabled: !1 }, s({ keyboard: { enabled: !1, onlyInViewport: !0, pageUpDown: !0 } }), i("init", (() => { t.params.keyboard.enabled && p() })), i("destroy", (() => { t.keyboard.enabled && u() })), Object.assign(t.keyboard, { enable: p, disable: u }) }, function (e) { let { swiper: t, extendParams: s, on: a, emit: i } = e; const n = r(); let l; s({ mousewheel: { enabled: !1, releaseOnEdges: !1, invert: !1, forceToAxis: !1, sensitivity: 1, eventsTarget: "container", thresholdDelta: null, thresholdTime: null } }), t.mousewheel = { enabled: !1 }; let o, c = u(); const h = []; function m() { t.enabled && (t.mouseEntered = !0) } function f() { t.enabled && (t.mouseEntered = !1) } function g(e) { return !(t.params.mousewheel.thresholdDelta && e.delta < t.params.mousewheel.thresholdDelta) && (!(t.params.mousewheel.thresholdTime && u() - c < t.params.mousewheel.thresholdTime) && (e.delta >= 6 && u() - c < 60 || (e.direction < 0 ? t.isEnd && !t.params.loop || t.animating || (t.slideNext(), i("scroll", e.raw)) : t.isBeginning && !t.params.loop || t.animating || (t.slidePrev(), i("scroll", e.raw)), c = (new n.Date).getTime(), !1))) } function v(e) { let s = e, a = !0; if (!t.enabled) return; const r = t.params.mousewheel; t.params.cssMode && s.preventDefault(); let n = t.$el; if ("container" !== t.params.mousewheel.eventsTarget && (n = d(t.params.mousewheel.eventsTarget)), !t.mouseEntered && !n[0].contains(s.target) && !r.releaseOnEdges) return !0; s.originalEvent && (s = s.originalEvent); let c = 0; const m = t.rtlTranslate ? -1 : 1, f = function (e) { let t = 0, s = 0, a = 0, i = 0; return "detail" in e && (s = e.detail), "wheelDelta" in e && (s = -e.wheelDelta / 120), "wheelDeltaY" in e && (s = -e.wheelDeltaY / 120), "wheelDeltaX" in e && (t = -e.wheelDeltaX / 120), "axis" in e && e.axis === e.HORIZONTAL_AXIS && (t = s, s = 0), a = 10 * t, i = 10 * s, "deltaY" in e && (i = e.deltaY), "deltaX" in e && (a = e.deltaX), e.shiftKey && !a && (a = i, i = 0), (a || i) && e.deltaMode && (1 === e.deltaMode ? (a *= 40, i *= 40) : (a *= 800, i *= 800)), a && !t && (t = a < 1 ? -1 : 1), i && !s && (s = i < 1 ? -1 : 1), { spinX: t, spinY: s, pixelX: a, pixelY: i } }(s); if (r.forceToAxis) if (t.isHorizontal()) { if (!(Math.abs(f.pixelX) > Math.abs(f.pixelY))) return !0; c = -f.pixelX * m } else { if (!(Math.abs(f.pixelY) > Math.abs(f.pixelX))) return !0; c = -f.pixelY } else c = Math.abs(f.pixelX) > Math.abs(f.pixelY) ? -f.pixelX * m : -f.pixelY; if (0 === c) return !0; r.invert && (c = -c); let v = t.getTranslate() + c * r.sensitivity; if (v >= t.minTranslate() && (v = t.minTranslate()), v <= t.maxTranslate() && (v = t.maxTranslate()), a = !!t.params.loop || !(v === t.minTranslate() || v === t.maxTranslate()), a && t.params.nested && s.stopPropagation(), t.params.freeMode && t.params.freeMode.enabled) { const e = { time: u(), delta: Math.abs(c), direction: Math.sign(c) }, a = o && e.time < o.time + 500 && e.delta <= o.delta && e.direction === o.direction; if (!a) { o = void 0, t.params.loop && t.loopFix(); let n = t.getTranslate() + c * r.sensitivity; const d = t.isBeginning, u = t.isEnd; if (n >= t.minTranslate() && (n = t.minTranslate()), n <= t.maxTranslate() && (n = t.maxTranslate()), t.setTransition(0), t.setTranslate(n), t.updateProgress(), t.updateActiveIndex(), t.updateSlidesClasses(), (!d && t.isBeginning || !u && t.isEnd) && t.updateSlidesClasses(), t.params.freeMode.sticky) { clearTimeout(l), l = void 0, h.length >= 15 && h.shift(); const s = h.length ? h[h.length - 1] : void 0, a = h[0]; if (h.push(e), s && (e.delta > s.delta || e.direction !== s.direction)) h.splice(0); else if (h.length >= 15 && e.time - a.time < 500 && a.delta - e.delta >= 1 && e.delta <= 6) { const s = c > 0 ? .8 : .2; o = e, h.splice(0), l = p((() => { t.slideToClosest(t.params.speed, !0, void 0, s) }), 0) } l || (l = p((() => { o = e, h.splice(0), t.slideToClosest(t.params.speed, !0, void 0, .5) }), 500)) } if (a || i("scroll", s), t.params.autoplay && t.params.autoplayDisableOnInteraction && t.autoplay.stop(), n === t.minTranslate() || n === t.maxTranslate()) return !0 } } else { const s = { time: u(), delta: Math.abs(c), direction: Math.sign(c), raw: e }; h.length >= 2 && h.shift(); const a = h.length ? h[h.length - 1] : void 0; if (h.push(s), a ? (s.direction !== a.direction || s.delta > a.delta || s.time > a.time + 150) && g(s) : g(s), function (e) { const s = t.params.mousewheel; if (e.direction < 0) { if (t.isEnd && !t.params.loop && s.releaseOnEdges) return !0 } else if (t.isBeginning && !t.params.loop && s.releaseOnEdges) return !0; return !1 }(s)) return !0 } return s.preventDefault ? s.preventDefault() : s.returnValue = !1, !1 } function w(e) { let s = t.$el; "container" !== t.params.mousewheel.eventsTarget && (s = d(t.params.mousewheel.eventsTarget)), s[e]("mouseenter", m), s[e]("mouseleave", f), s[e]("wheel", v) } function b() { return t.params.cssMode ? (t.wrapperEl.removeEventListener("wheel", v), !0) : !t.mousewheel.enabled && (w("on"), t.mousewheel.enabled = !0, !0) } function x() { return t.params.cssMode ? (t.wrapperEl.addEventListener(event, v), !0) : !!t.mousewheel.enabled && (w("off"), t.mousewheel.enabled = !1, !0) } a("init", (() => { !t.params.mousewheel.enabled && t.params.cssMode && x(), t.params.mousewheel.enabled && b() })), a("destroy", (() => { t.params.cssMode && b(), t.mousewheel.enabled && x() })), Object.assign(t.mousewheel, { enable: b, disable: x }) }, function (e) { let { swiper: t, extendParams: s, on: a, emit: i } = e; function r(e) { let s; return e && (s = d(e), t.params.uniqueNavElements && "string" == typeof e && s.length > 1 && 1 === t.$el.find(e).length && (s = t.$el.find(e))), s } function n(e, s) { const a = t.params.navigation; e && e.length > 0 && (e[s ? "addClass" : "removeClass"](a.disabledClass), e[0] && "BUTTON" === e[0].tagName && (e[0].disabled = s), t.params.watchOverflow && t.enabled && e[t.isLocked ? "addClass" : "removeClass"](a.lockClass)) } function l() { if (t.params.loop) return; const { $nextEl: e, $prevEl: s } = t.navigation; n(s, t.isBeginning && !t.params.rewind), n(e, t.isEnd && !t.params.rewind) } function o(e) { e.preventDefault(), (!t.isBeginning || t.params.loop || t.params.rewind) && (t.slidePrev(), i("navigationPrev")) } function c(e) { e.preventDefault(), (!t.isEnd || t.params.loop || t.params.rewind) && (t.slideNext(), i("navigationNext")) } function p() { const e = t.params.navigation; if (t.params.navigation = F(t, t.originalParams.navigation, t.params.navigation, { nextEl: "swiper-button-next", prevEl: "swiper-button-prev" }), !e.nextEl && !e.prevEl) return; const s = r(e.nextEl), a = r(e.prevEl); s && s.length > 0 && s.on("click", c), a && a.length > 0 && a.on("click", o), Object.assign(t.navigation, { $nextEl: s, nextEl: s && s[0], $prevEl: a, prevEl: a && a[0] }), t.enabled || (s && s.addClass(e.lockClass), a && a.addClass(e.lockClass)) } function u() { const { $nextEl: e, $prevEl: s } = t.navigation; e && e.length && (e.off("click", c), e.removeClass(t.params.navigation.disabledClass)), s && s.length && (s.off("click", o), s.removeClass(t.params.navigation.disabledClass)) } s({ navigation: { nextEl: null, prevEl: null, hideOnClick: !1, disabledClass: "swiper-button-disabled", hiddenClass: "swiper-button-hidden", lockClass: "swiper-button-lock", navigationDisabledClass: "swiper-navigation-disabled" } }), t.navigation = { nextEl: null, $nextEl: null, prevEl: null, $prevEl: null }, a("init", (() => { !1 === t.params.navigation.enabled ? h() : (p(), l()) })), a("toEdge fromEdge lock unlock", (() => { l() })), a("destroy", (() => { u() })), a("enable disable", (() => { const { $nextEl: e, $prevEl: s } = t.navigation; e && e[t.enabled ? "removeClass" : "addClass"](t.params.navigation.lockClass), s && s[t.enabled ? "removeClass" : "addClass"](t.params.navigation.lockClass) })), a("click", ((e, s) => { const { $nextEl: a, $prevEl: r } = t.navigation, n = s.target; if (t.params.navigation.hideOnClick && !d(n).is(r) && !d(n).is(a)) { if (t.pagination && t.params.pagination && t.params.pagination.clickable && (t.pagination.el === n || t.pagination.el.contains(n))) return; let e; a ? e = a.hasClass(t.params.navigation.hiddenClass) : r && (e = r.hasClass(t.params.navigation.hiddenClass)), i(!0 === e ? "navigationShow" : "navigationHide"), a && a.toggleClass(t.params.navigation.hiddenClass), r && r.toggleClass(t.params.navigation.hiddenClass) } })); const h = () => { t.$el.addClass(t.params.navigation.navigationDisabledClass), u() }; Object.assign(t.navigation, { enable: () => { t.$el.removeClass(t.params.navigation.navigationDisabledClass), p(), l() }, disable: h, update: l, init: p, destroy: u }) }, function (e) { let { swiper: t, extendParams: s, on: a, emit: i } = e; const r = "swiper-pagination"; let n; s({ pagination: { el: null, bulletElement: "span", clickable: !1, hideOnClick: !1, renderBullet: null, renderProgressbar: null, renderFraction: null, renderCustom: null, progressbarOpposite: !1, type: "bullets", dynamicBullets: !1, dynamicMainBullets: 1, formatFractionCurrent: e => e, formatFractionTotal: e => e, bulletClass: `${r}-bullet`, bulletActiveClass: `${r}-bullet-active`, modifierClass: `${r}-`, currentClass: `${r}-current`, totalClass: `${r}-total`, hiddenClass: `${r}-hidden`, progressbarFillClass: `${r}-progressbar-fill`, progressbarOppositeClass: `${r}-progressbar-opposite`, clickableClass: `${r}-clickable`, lockClass: `${r}-lock`, horizontalClass: `${r}-horizontal`, verticalClass: `${r}-vertical`, paginationDisabledClass: `${r}-disabled` } }), t.pagination = { el: null, $el: null, bullets: [] }; let l = 0; function o() { return !t.params.pagination.el || !t.pagination.el || !t.pagination.$el || 0 === t.pagination.$el.length } function c(e, s) { const { bulletActiveClass: a } = t.params.pagination; e[s]().addClass(`${a}-${s}`)[s]().addClass(`${a}-${s}-${s}`) } function p() { const e = t.rtl, s = t.params.pagination; if (o()) return; const a = t.virtual && t.params.virtual.enabled ? t.virtual.slides.length : t.slides.length, r = t.pagination.$el; let p; const u = t.params.loop ? Math.ceil((a - 2 * t.loopedSlides) / t.params.slidesPerGroup) : t.snapGrid.length; if (t.params.loop ? (p = Math.ceil((t.activeIndex - t.loopedSlides) / t.params.slidesPerGroup), p > a - 1 - 2 * t.loopedSlides && (p -= a - 2 * t.loopedSlides), p > u - 1 && (p -= u), p < 0 && "bullets" !== t.params.paginationType && (p = u + p)) : p = void 0 !== t.snapIndex ? t.snapIndex : t.activeIndex || 0, "bullets" === s.type && t.pagination.bullets && t.pagination.bullets.length > 0) { const a = t.pagination.bullets; let i, o, u; if (s.dynamicBullets && (n = a.eq(0)[t.isHorizontal() ? "outerWidth" : "outerHeight"](!0), r.css(t.isHorizontal() ? "width" : "height", n * (s.dynamicMainBullets + 4) + "px"), s.dynamicMainBullets > 1 && void 0 !== t.previousIndex && (l += p - (t.previousIndex - t.loopedSlides || 0), l > s.dynamicMainBullets - 1 ? l = s.dynamicMainBullets - 1 : l < 0 && (l = 0)), i = Math.max(p - l, 0), o = i + (Math.min(a.length, s.dynamicMainBullets) - 1), u = (o + i) / 2), a.removeClass(["", "-next", "-next-next", "-prev", "-prev-prev", "-main"].map((e => `${s.bulletActiveClass}${e}`)).join(" ")), r.length > 1) a.each((e => { const t = d(e), a = t.index(); a === p && t.addClass(s.bulletActiveClass), s.dynamicBullets && (a >= i && a <= o && t.addClass(`${s.bulletActiveClass}-main`), a === i && c(t, "prev"), a === o && c(t, "next")) })); else { const e = a.eq(p), r = e.index(); if (e.addClass(s.bulletActiveClass), s.dynamicBullets) { const e = a.eq(i), n = a.eq(o); for (let e = i; e <= o; e += 1)a.eq(e).addClass(`${s.bulletActiveClass}-main`); if (t.params.loop) if (r >= a.length) { for (let e = s.dynamicMainBullets; e >= 0; e -= 1)a.eq(a.length - e).addClass(`${s.bulletActiveClass}-main`); a.eq(a.length - s.dynamicMainBullets - 1).addClass(`${s.bulletActiveClass}-prev`) } else c(e, "prev"), c(n, "next"); else c(e, "prev"), c(n, "next") } } if (s.dynamicBullets) { const i = Math.min(a.length, s.dynamicMainBullets + 4), r = (n * i - n) / 2 - u * n, l = e ? "right" : "left"; a.css(t.isHorizontal() ? l : "top", `${r}px`) } } if ("fraction" === s.type && (r.find(U(s.currentClass)).text(s.formatFractionCurrent(p + 1)), r.find(U(s.totalClass)).text(s.formatFractionTotal(u))), "progressbar" === s.type) { let e; e = s.progressbarOpposite ? t.isHorizontal() ? "vertical" : "horizontal" : t.isHorizontal() ? "horizontal" : "vertical"; const a = (p + 1) / u; let i = 1, n = 1; "horizontal" === e ? i = a : n = a, r.find(U(s.progressbarFillClass)).transform(`translate3d(0,0,0) scaleX(${i}) scaleY(${n})`).transition(t.params.speed) } "custom" === s.type && s.renderCustom ? (r.html(s.renderCustom(t, p + 1, u)), i("paginationRender", r[0])) : i("paginationUpdate", r[0]), t.params.watchOverflow && t.enabled && r[t.isLocked ? "addClass" : "removeClass"](s.lockClass) } function u() { const e = t.params.pagination; if (o()) return; const s = t.virtual && t.params.virtual.enabled ? t.virtual.slides.length : t.slides.length, a = t.pagination.$el; let r = ""; if ("bullets" === e.type) { let i = t.params.loop ? Math.ceil((s - 2 * t.loopedSlides) / t.params.slidesPerGroup) : t.snapGrid.length; t.params.freeMode && t.params.freeMode.enabled && !t.params.loop && i > s && (i = s); for (let s = 0; s < i; s += 1)e.renderBullet ? r += e.renderBullet.call(t, s, e.bulletClass) : r += `<${e.bulletElement} class="${e.bulletClass}"></${e.bulletElement}>`; a.html(r), t.pagination.bullets = a.find(U(e.bulletClass)) } "fraction" === e.type && (r = e.renderFraction ? e.renderFraction.call(t, e.currentClass, e.totalClass) : `<span class="${e.currentClass}"></span> / <span class="${e.totalClass}"></span>`, a.html(r)), "progressbar" === e.type && (r = e.renderProgressbar ? e.renderProgressbar.call(t, e.progressbarFillClass) : `<span class="${e.progressbarFillClass}"></span>`, a.html(r)), "custom" !== e.type && i("paginationRender", t.pagination.$el[0]) } function h() { t.params.pagination = F(t, t.originalParams.pagination, t.params.pagination, { el: "swiper-pagination" }); const e = t.params.pagination; if (!e.el) return; let s = d(e.el); 0 !== s.length && (t.params.uniqueNavElements && "string" == typeof e.el && s.length > 1 && (s = t.$el.find(e.el), s.length > 1 && (s = s.filter((e => d(e).parents(".swiper")[0] === t.el)))), "bullets" === e.type && e.clickable && s.addClass(e.clickableClass), s.addClass(e.modifierClass + e.type), s.addClass(t.isHorizontal() ? e.horizontalClass : e.verticalClass), "bullets" === e.type && e.dynamicBullets && (s.addClass(`${e.modifierClass}${e.type}-dynamic`), l = 0, e.dynamicMainBullets < 1 && (e.dynamicMainBullets = 1)), "progressbar" === e.type && e.progressbarOpposite && s.addClass(e.progressbarOppositeClass), e.clickable && s.on("click", U(e.bulletClass), (function (e) { e.preventDefault(); let s = d(this).index() * t.params.slidesPerGroup; t.params.loop && (s += t.loopedSlides), t.slideTo(s) })), Object.assign(t.pagination, { $el: s, el: s[0] }), t.enabled || s.addClass(e.lockClass)) } function m() { const e = t.params.pagination; if (o()) return; const s = t.pagination.$el; s.removeClass(e.hiddenClass), s.removeClass(e.modifierClass + e.type), s.removeClass(t.isHorizontal() ? e.horizontalClass : e.verticalClass), t.pagination.bullets && t.pagination.bullets.removeClass && t.pagination.bullets.removeClass(e.bulletActiveClass), e.clickable && s.off("click", U(e.bulletClass)) } a("init", (() => { !1 === t.params.pagination.enabled ? f() : (h(), u(), p()) })), a("activeIndexChange", (() => { (t.params.loop || void 0 === t.snapIndex) && p() })), a("snapIndexChange", (() => { t.params.loop || p() })), a("slidesLengthChange", (() => { t.params.loop && (u(), p()) })), a("snapGridLengthChange", (() => { t.params.loop || (u(), p()) })), a("destroy", (() => { m() })), a("enable disable", (() => { const { $el: e } = t.pagination; e && e[t.enabled ? "removeClass" : "addClass"](t.params.pagination.lockClass) })), a("lock unlock", (() => { p() })), a("click", ((e, s) => { const a = s.target, { $el: r } = t.pagination; if (t.params.pagination.el && t.params.pagination.hideOnClick && r && r.length > 0 && !d(a).hasClass(t.params.pagination.bulletClass)) { if (t.navigation && (t.navigation.nextEl && a === t.navigation.nextEl || t.navigation.prevEl && a === t.navigation.prevEl)) return; const e = r.hasClass(t.params.pagination.hiddenClass); i(!0 === e ? "paginationShow" : "paginationHide"), r.toggleClass(t.params.pagination.hiddenClass) } })); const f = () => { t.$el.addClass(t.params.pagination.paginationDisabledClass), t.pagination.$el && t.pagination.$el.addClass(t.params.pagination.paginationDisabledClass), m() }; Object.assign(t.pagination, { enable: () => { t.$el.removeClass(t.params.pagination.paginationDisabledClass), t.pagination.$el && t.pagination.$el.removeClass(t.params.pagination.paginationDisabledClass), h(), u(), p() }, disable: f, render: u, update: p, init: h, destroy: m }) }, function (e) { let { swiper: t, extendParams: s, on: i, emit: r } = e; const n = a(); let l, o, c, u, h = !1, m = null, f = null; function g() { if (!t.params.scrollbar.el || !t.scrollbar.el) return; const { scrollbar: e, rtlTranslate: s, progress: a } = t, { $dragEl: i, $el: r } = e, n = t.params.scrollbar; let l = o, d = (c - o) * a; s ? (d = -d, d > 0 ? (l = o - d, d = 0) : -d + o > c && (l = c + d)) : d < 0 ? (l = o + d, d = 0) : d + o > c && (l = c - d), t.isHorizontal() ? (i.transform(`translate3d(${d}px, 0, 0)`), i[0].style.width = `${l}px`) : (i.transform(`translate3d(0px, ${d}px, 0)`), i[0].style.height = `${l}px`), n.hide && (clearTimeout(m), r[0].style.opacity = 1, m = setTimeout((() => { r[0].style.opacity = 0, r.transition(400) }), 1e3)) } function v() { if (!t.params.scrollbar.el || !t.scrollbar.el) return; const { scrollbar: e } = t, { $dragEl: s, $el: a } = e; s[0].style.width = "", s[0].style.height = "", c = t.isHorizontal() ? a[0].offsetWidth : a[0].offsetHeight, u = t.size / (t.virtualSize + t.params.slidesOffsetBefore - (t.params.centeredSlides ? t.snapGrid[0] : 0)), o = "auto" === t.params.scrollbar.dragSize ? c * u : parseInt(t.params.scrollbar.dragSize, 10), t.isHorizontal() ? s[0].style.width = `${o}px` : s[0].style.height = `${o}px`, a[0].style.display = u >= 1 ? "none" : "", t.params.scrollbar.hide && (a[0].style.opacity = 0), t.params.watchOverflow && t.enabled && e.$el[t.isLocked ? "addClass" : "removeClass"](t.params.scrollbar.lockClass) } function w(e) { return t.isHorizontal() ? "touchstart" === e.type || "touchmove" === e.type ? e.targetTouches[0].clientX : e.clientX : "touchstart" === e.type || "touchmove" === e.type ? e.targetTouches[0].clientY : e.clientY } function b(e) { const { scrollbar: s, rtlTranslate: a } = t, { $el: i } = s; let r; r = (w(e) - i.offset()[t.isHorizontal() ? "left" : "top"] - (null !== l ? l : o / 2)) / (c - o), r = Math.max(Math.min(r, 1), 0), a && (r = 1 - r); const n = t.minTranslate() + (t.maxTranslate() - t.minTranslate()) * r; t.updateProgress(n), t.setTranslate(n), t.updateActiveIndex(), t.updateSlidesClasses() } function x(e) { const s = t.params.scrollbar, { scrollbar: a, $wrapperEl: i } = t, { $el: n, $dragEl: o } = a; h = !0, l = e.target === o[0] || e.target === o ? w(e) - e.target.getBoundingClientRect()[t.isHorizontal() ? "left" : "top"] : null, e.preventDefault(), e.stopPropagation(), i.transition(100), o.transition(100), b(e), clearTimeout(f), n.transition(0), s.hide && n.css("opacity", 1), t.params.cssMode && t.$wrapperEl.css("scroll-snap-type", "none"), r("scrollbarDragStart", e) } function y(e) { const { scrollbar: s, $wrapperEl: a } = t, { $el: i, $dragEl: n } = s; h && (e.preventDefault ? e.preventDefault() : e.returnValue = !1, b(e), a.transition(0), i.transition(0), n.transition(0), r("scrollbarDragMove", e)) } function E(e) { const s = t.params.scrollbar, { scrollbar: a, $wrapperEl: i } = t, { $el: n } = a; h && (h = !1, t.params.cssMode && (t.$wrapperEl.css("scroll-snap-type", ""), i.transition("")), s.hide && (clearTimeout(f), f = p((() => { n.css("opacity", 0), n.transition(400) }), 1e3)), r("scrollbarDragEnd", e), s.snapOnRelease && t.slideToClosest()) } function C(e) { const { scrollbar: s, touchEventsTouch: a, touchEventsDesktop: i, params: r, support: l } = t, o = s.$el; if (!o) return; const d = o[0], c = !(!l.passiveListener || !r.passiveListeners) && { passive: !1, capture: !1 }, p = !(!l.passiveListener || !r.passiveListeners) && { passive: !0, capture: !1 }; if (!d) return; const u = "on" === e ? "addEventListener" : "removeEventListener"; l.touch ? (d[u](a.start, x, c), d[u](a.move, y, c), d[u](a.end, E, p)) : (d[u](i.start, x, c), n[u](i.move, y, c), n[u](i.end, E, p)) } function T() { const { scrollbar: e, $el: s } = t; t.params.scrollbar = F(t, t.originalParams.scrollbar, t.params.scrollbar, { el: "swiper-scrollbar" }); const a = t.params.scrollbar; if (!a.el) return; let i = d(a.el); t.params.uniqueNavElements && "string" == typeof a.el && i.length > 1 && 1 === s.find(a.el).length && (i = s.find(a.el)), i.addClass(t.isHorizontal() ? a.horizontalClass : a.verticalClass); let r = i.find(`.${t.params.scrollbar.dragClass}`); 0 === r.length && (r = d(`<div class="${t.params.scrollbar.dragClass}"></div>`), i.append(r)), Object.assign(e, { $el: i, el: i[0], $dragEl: r, dragEl: r[0] }), a.draggable && t.params.scrollbar.el && t.scrollbar.el && C("on"), i && i[t.enabled ? "removeClass" : "addClass"](t.params.scrollbar.lockClass) } function $() { const e = t.params.scrollbar, s = t.scrollbar.$el; s && s.removeClass(t.isHorizontal() ? e.horizontalClass : e.verticalClass), t.params.scrollbar.el && t.scrollbar.el && C("off") } s({ scrollbar: { el: null, dragSize: "auto", hide: !1, draggable: !1, snapOnRelease: !0, lockClass: "swiper-scrollbar-lock", dragClass: "swiper-scrollbar-drag", scrollbarDisabledClass: "swiper-scrollbar-disabled", horizontalClass: "swiper-scrollbar-horizontal", verticalClass: "swiper-scrollbar-vertical" } }), t.scrollbar = { el: null, dragEl: null, $el: null, $dragEl: null }, i("init", (() => { !1 === t.params.scrollbar.enabled ? S() : (T(), v(), g()) })), i("update resize observerUpdate lock unlock", (() => { v() })), i("setTranslate", (() => { g() })), i("setTransition", ((e, s) => { !function (e) { t.params.scrollbar.el && t.scrollbar.el && t.scrollbar.$dragEl.transition(e) }(s) })), i("enable disable", (() => { const { $el: e } = t.scrollbar; e && e[t.enabled ? "removeClass" : "addClass"](t.params.scrollbar.lockClass) })), i("destroy", (() => { $() })); const S = () => { t.$el.addClass(t.params.scrollbar.scrollbarDisabledClass), t.scrollbar.$el && t.scrollbar.$el.addClass(t.params.scrollbar.scrollbarDisabledClass), $() }; Object.assign(t.scrollbar, { enable: () => { t.$el.removeClass(t.params.scrollbar.scrollbarDisabledClass), t.scrollbar.$el && t.scrollbar.$el.removeClass(t.params.scrollbar.scrollbarDisabledClass), T(), v(), g() }, disable: S, updateSize: v, setTranslate: g, init: T, destroy: $ }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ parallax: { enabled: !1 } }); const i = (e, s) => { const { rtl: a } = t, i = d(e), r = a ? -1 : 1, n = i.attr("data-swiper-parallax") || "0"; let l = i.attr("data-swiper-parallax-x"), o = i.attr("data-swiper-parallax-y"); const c = i.attr("data-swiper-parallax-scale"), p = i.attr("data-swiper-parallax-opacity"); if (l || o ? (l = l || "0", o = o || "0") : t.isHorizontal() ? (l = n, o = "0") : (o = n, l = "0"), l = l.indexOf("%") >= 0 ? parseInt(l, 10) * s * r + "%" : l * s * r + "px", o = o.indexOf("%") >= 0 ? parseInt(o, 10) * s + "%" : o * s + "px", null != p) { const e = p - (p - 1) * (1 - Math.abs(s)); i[0].style.opacity = e } if (null == c) i.transform(`translate3d(${l}, ${o}, 0px)`); else { const e = c - (c - 1) * (1 - Math.abs(s)); i.transform(`translate3d(${l}, ${o}, 0px) scale(${e})`) } }, r = () => { const { $el: e, slides: s, progress: a, snapGrid: r } = t; e.children("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((e => { i(e, a) })), s.each(((e, s) => { let n = e.progress; t.params.slidesPerGroup > 1 && "auto" !== t.params.slidesPerView && (n += Math.ceil(s / 2) - a * (r.length - 1)), n = Math.min(Math.max(n, -1), 1), d(e).find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((e => { i(e, n) })) })) }; a("beforeInit", (() => { t.params.parallax.enabled && (t.params.watchSlidesProgress = !0, t.originalParams.watchSlidesProgress = !0) })), a("init", (() => { t.params.parallax.enabled && r() })), a("setTranslate", (() => { t.params.parallax.enabled && r() })), a("setTransition", ((e, s) => { t.params.parallax.enabled && function (e) { void 0 === e && (e = t.params.speed); const { $el: s } = t; s.find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((t => { const s = d(t); let a = parseInt(s.attr("data-swiper-parallax-duration"), 10) || e; 0 === e && (a = 0), s.transition(a) })) }(s) })) }, function (e) { let { swiper: t, extendParams: s, on: a, emit: i } = e; const n = r(); s({ zoom: { enabled: !1, maxRatio: 3, minRatio: 1, toggle: !0, containerClass: "swiper-zoom-container", zoomedSlideClass: "swiper-slide-zoomed" } }), t.zoom = { enabled: !1 }; let l, o, c, p = 1, u = !1; const m = { $slideEl: void 0, slideWidth: void 0, slideHeight: void 0, $imageEl: void 0, $imageWrapEl: void 0, maxRatio: 3 }, f = { isTouched: void 0, isMoved: void 0, currentX: void 0, currentY: void 0, minX: void 0, minY: void 0, maxX: void 0, maxY: void 0, width: void 0, height: void 0, startX: void 0, startY: void 0, touchesStart: {}, touchesCurrent: {} }, g = { x: void 0, y: void 0, prevPositionX: void 0, prevPositionY: void 0, prevTime: void 0 }; let v = 1; function w(e) { if (e.targetTouches.length < 2) return 1; const t = e.targetTouches[0].pageX, s = e.targetTouches[0].pageY, a = e.targetTouches[1].pageX, i = e.targetTouches[1].pageY; return Math.sqrt((a - t) ** 2 + (i - s) ** 2) } function b(e) { const s = t.support, a = t.params.zoom; if (o = !1, c = !1, !s.gestures) { if ("touchstart" !== e.type || "touchstart" === e.type && e.targetTouches.length < 2) return; o = !0, m.scaleStart = w(e) } m.$slideEl && m.$slideEl.length || (m.$slideEl = d(e.target).closest(`.${t.params.slideClass}`), 0 === m.$slideEl.length && (m.$slideEl = t.slides.eq(t.activeIndex)), m.$imageEl = m.$slideEl.find(`.${a.containerClass}`).eq(0).find("picture, img, svg, canvas, .swiper-zoom-target").eq(0), m.$imageWrapEl = m.$imageEl.parent(`.${a.containerClass}`), m.maxRatio = m.$imageWrapEl.attr("data-swiper-zoom") || a.maxRatio, 0 !== m.$imageWrapEl.length) ? (m.$imageEl && m.$imageEl.transition(0), u = !0) : m.$imageEl = void 0 } function x(e) { const s = t.support, a = t.params.zoom, i = t.zoom; if (!s.gestures) { if ("touchmove" !== e.type || "touchmove" === e.type && e.targetTouches.length < 2) return; c = !0, m.scaleMove = w(e) } m.$imageEl && 0 !== m.$imageEl.length ? (s.gestures ? i.scale = e.scale * p : i.scale = m.scaleMove / m.scaleStart * p, i.scale > m.maxRatio && (i.scale = m.maxRatio - 1 + (i.scale - m.maxRatio + 1) ** .5), i.scale < a.minRatio && (i.scale = a.minRatio + 1 - (a.minRatio - i.scale + 1) ** .5), m.$imageEl.transform(`translate3d(0,0,0) scale(${i.scale})`)) : "gesturechange" === e.type && b(e) } function y(e) { const s = t.device, a = t.support, i = t.params.zoom, r = t.zoom; if (!a.gestures) { if (!o || !c) return; if ("touchend" !== e.type || "touchend" === e.type && e.changedTouches.length < 2 && !s.android) return; o = !1, c = !1 } m.$imageEl && 0 !== m.$imageEl.length && (r.scale = Math.max(Math.min(r.scale, m.maxRatio), i.minRatio), m.$imageEl.transition(t.params.speed).transform(`translate3d(0,0,0) scale(${r.scale})`), p = r.scale, u = !1, 1 === r.scale && (m.$slideEl = void 0)) } function E(e) { const s = t.zoom; if (!m.$imageEl || 0 === m.$imageEl.length) return; if (t.allowClick = !1, !f.isTouched || !m.$slideEl) return; f.isMoved || (f.width = m.$imageEl[0].offsetWidth, f.height = m.$imageEl[0].offsetHeight, f.startX = h(m.$imageWrapEl[0], "x") || 0, f.startY = h(m.$imageWrapEl[0], "y") || 0, m.slideWidth = m.$slideEl[0].offsetWidth, m.slideHeight = m.$slideEl[0].offsetHeight, m.$imageWrapEl.transition(0)); const a = f.width * s.scale, i = f.height * s.scale; if (!(a < m.slideWidth && i < m.slideHeight)) { if (f.minX = Math.min(m.slideWidth / 2 - a / 2, 0), f.maxX = -f.minX, f.minY = Math.min(m.slideHeight / 2 - i / 2, 0), f.maxY = -f.minY, f.touchesCurrent.x = "touchmove" === e.type ? e.targetTouches[0].pageX : e.pageX, f.touchesCurrent.y = "touchmove" === e.type ? e.targetTouches[0].pageY : e.pageY, !f.isMoved && !u) { if (t.isHorizontal() && (Math.floor(f.minX) === Math.floor(f.startX) && f.touchesCurrent.x < f.touchesStart.x || Math.floor(f.maxX) === Math.floor(f.startX) && f.touchesCurrent.x > f.touchesStart.x)) return void (f.isTouched = !1); if (!t.isHorizontal() && (Math.floor(f.minY) === Math.floor(f.startY) && f.touchesCurrent.y < f.touchesStart.y || Math.floor(f.maxY) === Math.floor(f.startY) && f.touchesCurrent.y > f.touchesStart.y)) return void (f.isTouched = !1) } e.cancelable && e.preventDefault(), e.stopPropagation(), f.isMoved = !0, f.currentX = f.touchesCurrent.x - f.touchesStart.x + f.startX, f.currentY = f.touchesCurrent.y - f.touchesStart.y + f.startY, f.currentX < f.minX && (f.currentX = f.minX + 1 - (f.minX - f.currentX + 1) ** .8), f.currentX > f.maxX && (f.currentX = f.maxX - 1 + (f.currentX - f.maxX + 1) ** .8), f.currentY < f.minY && (f.currentY = f.minY + 1 - (f.minY - f.currentY + 1) ** .8), f.currentY > f.maxY && (f.currentY = f.maxY - 1 + (f.currentY - f.maxY + 1) ** .8), g.prevPositionX || (g.prevPositionX = f.touchesCurrent.x), g.prevPositionY || (g.prevPositionY = f.touchesCurrent.y), g.prevTime || (g.prevTime = Date.now()), g.x = (f.touchesCurrent.x - g.prevPositionX) / (Date.now() - g.prevTime) / 2, g.y = (f.touchesCurrent.y - g.prevPositionY) / (Date.now() - g.prevTime) / 2, Math.abs(f.touchesCurrent.x - g.prevPositionX) < 2 && (g.x = 0), Math.abs(f.touchesCurrent.y - g.prevPositionY) < 2 && (g.y = 0), g.prevPositionX = f.touchesCurrent.x, g.prevPositionY = f.touchesCurrent.y, g.prevTime = Date.now(), m.$imageWrapEl.transform(`translate3d(${f.currentX}px, ${f.currentY}px,0)`) } } function C() { const e = t.zoom; m.$slideEl && t.previousIndex !== t.activeIndex && (m.$imageEl && m.$imageEl.transform("translate3d(0,0,0) scale(1)"), m.$imageWrapEl && m.$imageWrapEl.transform("translate3d(0,0,0)"), e.scale = 1, p = 1, m.$slideEl = void 0, m.$imageEl = void 0, m.$imageWrapEl = void 0) } function T(e) { const s = t.zoom, a = t.params.zoom; if (m.$slideEl || (e && e.target && (m.$slideEl = d(e.target).closest(`.${t.params.slideClass}`)), m.$slideEl || (t.params.virtual && t.params.virtual.enabled && t.virtual ? m.$slideEl = t.$wrapperEl.children(`.${t.params.slideActiveClass}`) : m.$slideEl = t.slides.eq(t.activeIndex)), m.$imageEl = m.$slideEl.find(`.${a.containerClass}`).eq(0).find("picture, img, svg, canvas, .swiper-zoom-target").eq(0), m.$imageWrapEl = m.$imageEl.parent(`.${a.containerClass}`)), !m.$imageEl || 0 === m.$imageEl.length || !m.$imageWrapEl || 0 === m.$imageWrapEl.length) return; let i, r, l, o, c, u, h, g, v, w, b, x, y, E, C, T, $, S; t.params.cssMode && (t.wrapperEl.style.overflow = "hidden", t.wrapperEl.style.touchAction = "none"), m.$slideEl.addClass(`${a.zoomedSlideClass}`), void 0 === f.touchesStart.x && e ? (i = "touchend" === e.type ? e.changedTouches[0].pageX : e.pageX, r = "touchend" === e.type ? e.changedTouches[0].pageY : e.pageY) : (i = f.touchesStart.x, r = f.touchesStart.y), s.scale = m.$imageWrapEl.attr("data-swiper-zoom") || a.maxRatio, p = m.$imageWrapEl.attr("data-swiper-zoom") || a.maxRatio, e ? ($ = m.$slideEl[0].offsetWidth, S = m.$slideEl[0].offsetHeight, l = m.$slideEl.offset().left + n.scrollX, o = m.$slideEl.offset().top + n.scrollY, c = l + $ / 2 - i, u = o + S / 2 - r, v = m.$imageEl[0].offsetWidth, w = m.$imageEl[0].offsetHeight, b = v * s.scale, x = w * s.scale, y = Math.min($ / 2 - b / 2, 0), E = Math.min(S / 2 - x / 2, 0), C = -y, T = -E, h = c * s.scale, g = u * s.scale, h < y && (h = y), h > C && (h = C), g < E && (g = E), g > T && (g = T)) : (h = 0, g = 0), m.$imageWrapEl.transition(300).transform(`translate3d(${h}px, ${g}px,0)`), m.$imageEl.transition(300).transform(`translate3d(0,0,0) scale(${s.scale})`) } function $() { const e = t.zoom, s = t.params.zoom; m.$slideEl || (t.params.virtual && t.params.virtual.enabled && t.virtual ? m.$slideEl = t.$wrapperEl.children(`.${t.params.slideActiveClass}`) : m.$slideEl = t.slides.eq(t.activeIndex), m.$imageEl = m.$slideEl.find(`.${s.containerClass}`).eq(0).find("picture, img, svg, canvas, .swiper-zoom-target").eq(0), m.$imageWrapEl = m.$imageEl.parent(`.${s.containerClass}`)), m.$imageEl && 0 !== m.$imageEl.length && m.$imageWrapEl && 0 !== m.$imageWrapEl.length && (t.params.cssMode && (t.wrapperEl.style.overflow = "", t.wrapperEl.style.touchAction = ""), e.scale = 1, p = 1, m.$imageWrapEl.transition(300).transform("translate3d(0,0,0)"), m.$imageEl.transition(300).transform("translate3d(0,0,0) scale(1)"), m.$slideEl.removeClass(`${s.zoomedSlideClass}`), m.$slideEl = void 0) } function S(e) { const s = t.zoom; s.scale && 1 !== s.scale ? $() : T(e) } function M() { const e = t.support; return { passiveListener: !("touchstart" !== t.touchEvents.start || !e.passiveListener || !t.params.passiveListeners) && { passive: !0, capture: !1 }, activeListenerWithCapture: !e.passiveListener || { passive: !1, capture: !0 } } } function P() { return `.${t.params.slideClass}` } function k(e) { const { passiveListener: s } = M(), a = P(); t.$wrapperEl[e]("gesturestart", a, b, s), t.$wrapperEl[e]("gesturechange", a, x, s), t.$wrapperEl[e]("gestureend", a, y, s) } function z() { l || (l = !0, k("on")) } function L() { l && (l = !1, k("off")) } function O() { const e = t.zoom; if (e.enabled) return; e.enabled = !0; const s = t.support, { passiveListener: a, activeListenerWithCapture: i } = M(), r = P(); s.gestures ? (t.$wrapperEl.on(t.touchEvents.start, z, a), t.$wrapperEl.on(t.touchEvents.end, L, a)) : "touchstart" === t.touchEvents.start && (t.$wrapperEl.on(t.touchEvents.start, r, b, a), t.$wrapperEl.on(t.touchEvents.move, r, x, i), t.$wrapperEl.on(t.touchEvents.end, r, y, a), t.touchEvents.cancel && t.$wrapperEl.on(t.touchEvents.cancel, r, y, a)), t.$wrapperEl.on(t.touchEvents.move, `.${t.params.zoom.containerClass}`, E, i) } function I() { const e = t.zoom; if (!e.enabled) return; const s = t.support; e.enabled = !1; const { passiveListener: a, activeListenerWithCapture: i } = M(), r = P(); s.gestures ? (t.$wrapperEl.off(t.touchEvents.start, z, a), t.$wrapperEl.off(t.touchEvents.end, L, a)) : "touchstart" === t.touchEvents.start && (t.$wrapperEl.off(t.touchEvents.start, r, b, a), t.$wrapperEl.off(t.touchEvents.move, r, x, i), t.$wrapperEl.off(t.touchEvents.end, r, y, a), t.touchEvents.cancel && t.$wrapperEl.off(t.touchEvents.cancel, r, y, a)), t.$wrapperEl.off(t.touchEvents.move, `.${t.params.zoom.containerClass}`, E, i) } Object.defineProperty(t.zoom, "scale", { get: () => v, set(e) { if (v !== e) { const t = m.$imageEl ? m.$imageEl[0] : void 0, s = m.$slideEl ? m.$slideEl[0] : void 0; i("zoomChange", e, t, s) } v = e } }), a("init", (() => { t.params.zoom.enabled && O() })), a("destroy", (() => { I() })), a("touchStart", ((e, s) => { t.zoom.enabled && function (e) { const s = t.device; m.$imageEl && 0 !== m.$imageEl.length && (f.isTouched || (s.android && e.cancelable && e.preventDefault(), f.isTouched = !0, f.touchesStart.x = "touchstart" === e.type ? e.targetTouches[0].pageX : e.pageX, f.touchesStart.y = "touchstart" === e.type ? e.targetTouches[0].pageY : e.pageY)) }(s) })), a("touchEnd", ((e, s) => { t.zoom.enabled && function () { const e = t.zoom; if (!m.$imageEl || 0 === m.$imageEl.length) return; if (!f.isTouched || !f.isMoved) return f.isTouched = !1, void (f.isMoved = !1); f.isTouched = !1, f.isMoved = !1; let s = 300, a = 300; const i = g.x * s, r = f.currentX + i, n = g.y * a, l = f.currentY + n; 0 !== g.x && (s = Math.abs((r - f.currentX) / g.x)), 0 !== g.y && (a = Math.abs((l - f.currentY) / g.y)); const o = Math.max(s, a); f.currentX = r, f.currentY = l; const d = f.width * e.scale, c = f.height * e.scale; f.minX = Math.min(m.slideWidth / 2 - d / 2, 0), f.maxX = -f.minX, f.minY = Math.min(m.slideHeight / 2 - c / 2, 0), f.maxY = -f.minY, f.currentX = Math.max(Math.min(f.currentX, f.maxX), f.minX), f.currentY = Math.max(Math.min(f.currentY, f.maxY), f.minY), m.$imageWrapEl.transition(o).transform(`translate3d(${f.currentX}px, ${f.currentY}px,0)`) }() })), a("doubleTap", ((e, s) => { !t.animating && t.params.zoom.enabled && t.zoom.enabled && t.params.zoom.toggle && S(s) })), a("transitionEnd", (() => { t.zoom.enabled && t.params.zoom.enabled && C() })), a("slideChange", (() => { t.zoom.enabled && t.params.zoom.enabled && t.params.cssMode && C() })), Object.assign(t.zoom, { enable: O, disable: I, in: T, out: $, toggle: S }) }, function (e) { let { swiper: t, extendParams: s, on: a, emit: i } = e; s({ lazy: { checkInView: !1, enabled: !1, loadPrevNext: !1, loadPrevNextAmount: 1, loadOnTransitionStart: !1, scrollingElement: "", elementClass: "swiper-lazy", loadingClass: "swiper-lazy-loading", loadedClass: "swiper-lazy-loaded", preloaderClass: "swiper-lazy-preloader" } }), t.lazy = {}; let n = !1, l = !1; function o(e, s) { void 0 === s && (s = !0); const a = t.params.lazy; if (void 0 === e) return; if (0 === t.slides.length) return; const r = t.virtual && t.params.virtual.enabled ? t.$wrapperEl.children(`.${t.params.slideClass}[data-swiper-slide-index="${e}"]`) : t.slides.eq(e), n = r.find(`.${a.elementClass}:not(.${a.loadedClass}):not(.${a.loadingClass})`); !r.hasClass(a.elementClass) || r.hasClass(a.loadedClass) || r.hasClass(a.loadingClass) || n.push(r[0]), 0 !== n.length && n.each((e => { const n = d(e); n.addClass(a.loadingClass); const l = n.attr("data-background"), c = n.attr("data-src"), p = n.attr("data-srcset"), u = n.attr("data-sizes"), h = n.parent("picture"); t.loadImage(n[0], c || l, p, u, !1, (() => { if (null != t && t && (!t || t.params) && !t.destroyed) { if (l ? (n.css("background-image", `url("${l}")`), n.removeAttr("data-background")) : (p && (n.attr("srcset", p), n.removeAttr("data-srcset")), u && (n.attr("sizes", u), n.removeAttr("data-sizes")), h.length && h.children("source").each((e => { const t = d(e); t.attr("data-srcset") && (t.attr("srcset", t.attr("data-srcset")), t.removeAttr("data-srcset")) })), c && (n.attr("src", c), n.removeAttr("data-src"))), n.addClass(a.loadedClass).removeClass(a.loadingClass), r.find(`.${a.preloaderClass}`).remove(), t.params.loop && s) { const e = r.attr("data-swiper-slide-index"); if (r.hasClass(t.params.slideDuplicateClass)) { o(t.$wrapperEl.children(`[data-swiper-slide-index="${e}"]:not(.${t.params.slideDuplicateClass})`).index(), !1) } else { o(t.$wrapperEl.children(`.${t.params.slideDuplicateClass}[data-swiper-slide-index="${e}"]`).index(), !1) } } i("lazyImageReady", r[0], n[0]), t.params.autoHeight && t.updateAutoHeight() } })), i("lazyImageLoad", r[0], n[0]) })) } function c() { const { $wrapperEl: e, params: s, slides: a, activeIndex: i } = t, r = t.virtual && s.virtual.enabled, n = s.lazy; let c = s.slidesPerView; function p(t) { if (r) { if (e.children(`.${s.slideClass}[data-swiper-slide-index="${t}"]`).length) return !0 } else if (a[t]) return !0; return !1 } function u(e) { return r ? d(e).attr("data-swiper-slide-index") : d(e).index() } if ("auto" === c && (c = 0), l || (l = !0), t.params.watchSlidesProgress) e.children(`.${s.slideVisibleClass}`).each((e => { o(r ? d(e).attr("data-swiper-slide-index") : d(e).index()) })); else if (c > 1) for (let e = i; e < i + c; e += 1)p(e) && o(e); else o(i); if (n.loadPrevNext) if (c > 1 || n.loadPrevNextAmount && n.loadPrevNextAmount > 1) { const e = n.loadPrevNextAmount, t = Math.ceil(c), s = Math.min(i + t + Math.max(e, t), a.length), r = Math.max(i - Math.max(t, e), 0); for (let e = i + t; e < s; e += 1)p(e) && o(e); for (let e = r; e < i; e += 1)p(e) && o(e) } else { const t = e.children(`.${s.slideNextClass}`); t.length > 0 && o(u(t)); const a = e.children(`.${s.slidePrevClass}`); a.length > 0 && o(u(a)) } } function p() { const e = r(); if (!t || t.destroyed) return; const s = t.params.lazy.scrollingElement ? d(t.params.lazy.scrollingElement) : d(e), a = s[0] === e, i = a ? e.innerWidth : s[0].offsetWidth, l = a ? e.innerHeight : s[0].offsetHeight, o = t.$el.offset(), { rtlTranslate: u } = t; let h = !1; u && (o.left -= t.$el[0].scrollLeft); const m = [[o.left, o.top], [o.left + t.width, o.top], [o.left, o.top + t.height], [o.left + t.width, o.top + t.height]]; for (let e = 0; e < m.length; e += 1) { const t = m[e]; if (t[0] >= 0 && t[0] <= i && t[1] >= 0 && t[1] <= l) { if (0 === t[0] && 0 === t[1]) continue; h = !0 } } const f = !("touchstart" !== t.touchEvents.start || !t.support.passiveListener || !t.params.passiveListeners) && { passive: !0, capture: !1 }; h ? (c(), s.off("scroll", p, f)) : n || (n = !0, s.on("scroll", p, f)) } a("beforeInit", (() => { t.params.lazy.enabled && t.params.preloadImages && (t.params.preloadImages = !1) })), a("init", (() => { t.params.lazy.enabled && (t.params.lazy.checkInView ? p() : c()) })), a("scroll", (() => { t.params.freeMode && t.params.freeMode.enabled && !t.params.freeMode.sticky && c() })), a("scrollbarDragMove resize _freeModeNoMomentumRelease", (() => { t.params.lazy.enabled && (t.params.lazy.checkInView ? p() : c()) })), a("transitionStart", (() => { t.params.lazy.enabled && (t.params.lazy.loadOnTransitionStart || !t.params.lazy.loadOnTransitionStart && !l) && (t.params.lazy.checkInView ? p() : c()) })), a("transitionEnd", (() => { t.params.lazy.enabled && !t.params.lazy.loadOnTransitionStart && (t.params.lazy.checkInView ? p() : c()) })), a("slideChange", (() => { const { lazy: e, cssMode: s, watchSlidesProgress: a, touchReleaseOnEdges: i, resistanceRatio: r } = t.params; e.enabled && (s || a && (i || 0 === r)) && c() })), a("destroy", (() => { t.$el && t.$el.find(`.${t.params.lazy.loadingClass}`).removeClass(t.params.lazy.loadingClass) })), Object.assign(t.lazy, { load: c, loadInSlide: o }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; function i(e, t) { const s = function () { let e, t, s; return (a, i) => { for (t = -1, e = a.length; e - t > 1;)s = e + t >> 1, a[s] <= i ? t = s : e = s; return e } }(); let a, i; return this.x = e, this.y = t, this.lastIndex = e.length - 1, this.interpolate = function (e) { return e ? (i = s(this.x, e), a = i - 1, (e - this.x[a]) * (this.y[i] - this.y[a]) / (this.x[i] - this.x[a]) + this.y[a]) : 0 }, this } function r() { t.controller.control && t.controller.spline && (t.controller.spline = void 0, delete t.controller.spline) } s({ controller: { control: void 0, inverse: !1, by: "slide" } }), t.controller = { control: void 0 }, a("beforeInit", (() => { t.controller.control = t.params.controller.control })), a("update", (() => { r() })), a("resize", (() => { r() })), a("observerUpdate", (() => { r() })), a("setTranslate", ((e, s, a) => { t.controller.control && t.controller.setTranslate(s, a) })), a("setTransition", ((e, s, a) => { t.controller.control && t.controller.setTransition(s, a) })), Object.assign(t.controller, { setTranslate: function (e, s) { const a = t.controller.control; let r, n; const l = t.constructor; function o(e) { const s = t.rtlTranslate ? -t.translate : t.translate; "slide" === t.params.controller.by && (!function (e) { t.controller.spline || (t.controller.spline = t.params.loop ? new i(t.slidesGrid, e.slidesGrid) : new i(t.snapGrid, e.snapGrid)) }(e), n = -t.controller.spline.interpolate(-s)), n && "container" !== t.params.controller.by || (r = (e.maxTranslate() - e.minTranslate()) / (t.maxTranslate() - t.minTranslate()), n = (s - t.minTranslate()) * r + e.minTranslate()), t.params.controller.inverse && (n = e.maxTranslate() - n), e.updateProgress(n), e.setTranslate(n, t), e.updateActiveIndex(), e.updateSlidesClasses() } if (Array.isArray(a)) for (let e = 0; e < a.length; e += 1)a[e] !== s && a[e] instanceof l && o(a[e]); else a instanceof l && s !== a && o(a) }, setTransition: function (e, s) { const a = t.constructor, i = t.controller.control; let r; function n(s) { s.setTransition(e, t), 0 !== e && (s.transitionStart(), s.params.autoHeight && p((() => { s.updateAutoHeight() })), s.$wrapperEl.transitionEnd((() => { i && (s.params.loop && "slide" === t.params.controller.by && s.loopFix(), s.transitionEnd()) }))) } if (Array.isArray(i)) for (r = 0; r < i.length; r += 1)i[r] !== s && i[r] instanceof a && n(i[r]); else i instanceof a && s !== i && n(i) } }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ a11y: { enabled: !0, notificationClass: "swiper-notification", prevSlideMessage: "Previous slide", nextSlideMessage: "Next slide", firstSlideMessage: "This is the first slide", lastSlideMessage: "This is the last slide", paginationBulletMessage: "Go to slide {{index}}", slideLabelMessage: "{{index}} / {{slidesLength}}", containerMessage: null, containerRoleDescriptionMessage: null, itemRoleDescriptionMessage: null, slideRole: "group", id: null } }), t.a11y = { clicked: !1 }; let i = null; function r(e) { const t = i; 0 !== t.length && (t.html(""), t.html(e)) } function n(e) { e.attr("tabIndex", "0") } function l(e) { e.attr("tabIndex", "-1") } function o(e, t) { e.attr("role", t) } function c(e, t) { e.attr("aria-roledescription", t) } function p(e, t) { e.attr("aria-label", t) } function u(e) { e.attr("aria-disabled", !0) } function h(e) { e.attr("aria-disabled", !1) } function m(e) { if (13 !== e.keyCode && 32 !== e.keyCode) return; const s = t.params.a11y, a = d(e.target); t.navigation && t.navigation.$nextEl && a.is(t.navigation.$nextEl) && (t.isEnd && !t.params.loop || t.slideNext(), t.isEnd ? r(s.lastSlideMessage) : r(s.nextSlideMessage)), t.navigation && t.navigation.$prevEl && a.is(t.navigation.$prevEl) && (t.isBeginning && !t.params.loop || t.slidePrev(), t.isBeginning ? r(s.firstSlideMessage) : r(s.prevSlideMessage)), t.pagination && a.is(U(t.params.pagination.bulletClass)) && a[0].click() } function f() { return t.pagination && t.pagination.bullets && t.pagination.bullets.length } function g() { return f() && t.params.pagination.clickable } const v = (e, t, s) => { n(e), "BUTTON" !== e[0].tagName && (o(e, "button"), e.on("keydown", m)), p(e, s), function (e, t) { e.attr("aria-controls", t) }(e, t) }, w = () => { t.a11y.clicked = !0 }, b = () => { requestAnimationFrame((() => { requestAnimationFrame((() => { t.a11y.clicked = !1 })) })) }, x = e => { if (t.a11y.clicked) return; const s = e.target.closest(`.${t.params.slideClass}`); if (!s || !t.slides.includes(s)) return; const a = t.slides.indexOf(s) === t.activeIndex, i = t.params.watchSlidesProgress && t.visibleSlides && t.visibleSlides.includes(s); a || i || (t.isHorizontal() ? t.el.scrollLeft = 0 : t.el.scrollTop = 0, t.slideTo(t.slides.indexOf(s), 0)) }, y = () => { const e = t.params.a11y; e.itemRoleDescriptionMessage && c(d(t.slides), e.itemRoleDescriptionMessage), e.slideRole && o(d(t.slides), e.slideRole); const s = t.params.loop ? t.slides.filter((e => !e.classList.contains(t.params.slideDuplicateClass))).length : t.slides.length; e.slideLabelMessage && t.slides.each(((a, i) => { const r = d(a), n = t.params.loop ? parseInt(r.attr("data-swiper-slide-index"), 10) : i; p(r, e.slideLabelMessage.replace(/\{\{index\}\}/, n + 1).replace(/\{\{slidesLength\}\}/, s)) })) }, E = () => { const e = t.params.a11y; t.$el.append(i); const s = t.$el; e.containerRoleDescriptionMessage && c(s, e.containerRoleDescriptionMessage), e.containerMessage && p(s, e.containerMessage); const a = t.$wrapperEl, r = e.id || a.attr("id") || `swiper-wrapper-${n = 16, void 0 === n && (n = 16), "x".repeat(n).replace(/x/g, (() => Math.round(16 * Math.random()).toString(16)))}`; var n; const l = t.params.autoplay && t.params.autoplay.enabled ? "off" : "polite"; var o; let d, u; o = r, a.attr("id", o), function (e, t) { e.attr("aria-live", t) }(a, l), y(), t.navigation && t.navigation.$nextEl && (d = t.navigation.$nextEl), t.navigation && t.navigation.$prevEl && (u = t.navigation.$prevEl), d && d.length && v(d, r, e.nextSlideMessage), u && u.length && v(u, r, e.prevSlideMessage), g() && t.pagination.$el.on("keydown", U(t.params.pagination.bulletClass), m), t.$el.on("focus", x, !0), t.$el.on("pointerdown", w, !0), t.$el.on("pointerup", b, !0) }; a("beforeInit", (() => { i = d(`<span class="${t.params.a11y.notificationClass}" aria-live="assertive" aria-atomic="true"></span>`) })), a("afterInit", (() => { t.params.a11y.enabled && E() })), a("slidesLengthChange snapGridLengthChange slidesGridLengthChange", (() => { t.params.a11y.enabled && y() })), a("fromEdge toEdge afterInit lock unlock", (() => { t.params.a11y.enabled && function () { if (t.params.loop || t.params.rewind || !t.navigation) return; const { $nextEl: e, $prevEl: s } = t.navigation; s && s.length > 0 && (t.isBeginning ? (u(s), l(s)) : (h(s), n(s))), e && e.length > 0 && (t.isEnd ? (u(e), l(e)) : (h(e), n(e))) }() })), a("paginationUpdate", (() => { t.params.a11y.enabled && function () { const e = t.params.a11y; f() && t.pagination.bullets.each((s => { const a = d(s); t.params.pagination.clickable && (n(a), t.params.pagination.renderBullet || (o(a, "button"), p(a, e.paginationBulletMessage.replace(/\{\{index\}\}/, a.index() + 1)))), a.is(`.${t.params.pagination.bulletActiveClass}`) ? a.attr("aria-current", "true") : a.removeAttr("aria-current") })) }() })), a("destroy", (() => { t.params.a11y.enabled && function () { let e, s; i && i.length > 0 && i.remove(), t.navigation && t.navigation.$nextEl && (e = t.navigation.$nextEl), t.navigation && t.navigation.$prevEl && (s = t.navigation.$prevEl), e && e.off("keydown", m), s && s.off("keydown", m), g() && t.pagination.$el.off("keydown", U(t.params.pagination.bulletClass), m), t.$el.off("focus", x, !0), t.$el.off("pointerdown", w, !0), t.$el.off("pointerup", b, !0) }() })) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ history: { enabled: !1, root: "", replaceState: !1, key: "slides", keepQuery: !1 } }); let i = !1, n = {}; const l = e => e.toString().replace(/\s+/g, "-").replace(/[^\w-]+/g, "").replace(/--+/g, "-").replace(/^-+/, "").replace(/-+$/, ""), o = e => { const t = r(); let s; s = e ? new URL(e) : t.location; const a = s.pathname.slice(1).split("/").filter((e => "" !== e)), i = a.length; return { key: a[i - 2], value: a[i - 1] } }, d = (e, s) => { const a = r(); if (!i || !t.params.history.enabled) return; let n; n = t.params.url ? new URL(t.params.url) : a.location; const o = t.slides.eq(s); let d = l(o.attr("data-history")); if (t.params.history.root.length > 0) { let s = t.params.history.root; "/" === s[s.length - 1] && (s = s.slice(0, s.length - 1)), d = `${s}/${e}/${d}` } else n.pathname.includes(e) || (d = `${e}/${d}`); t.params.history.keepQuery && (d += n.search); const c = a.history.state; c && c.value === d || (t.params.history.replaceState ? a.history.replaceState({ value: d }, null, d) : a.history.pushState({ value: d }, null, d)) }, c = (e, s, a) => { if (s) for (let i = 0, r = t.slides.length; i < r; i += 1) { const r = t.slides.eq(i); if (l(r.attr("data-history")) === s && !r.hasClass(t.params.slideDuplicateClass)) { const s = r.index(); t.slideTo(s, e, a) } } else t.slideTo(0, e, a) }, p = () => { n = o(t.params.url), c(t.params.speed, n.value, !1) }; a("init", (() => { t.params.history.enabled && (() => { const e = r(); if (t.params.history) { if (!e.history || !e.history.pushState) return t.params.history.enabled = !1, void (t.params.hashNavigation.enabled = !0); i = !0, n = o(t.params.url), (n.key || n.value) && (c(0, n.value, t.params.runCallbacksOnInit), t.params.history.replaceState || e.addEventListener("popstate", p)) } })() })), a("destroy", (() => { t.params.history.enabled && (() => { const e = r(); t.params.history.replaceState || e.removeEventListener("popstate", p) })() })), a("transitionEnd _freeModeNoMomentumRelease", (() => { i && d(t.params.history.key, t.activeIndex) })), a("slideChange", (() => { i && t.params.cssMode && d(t.params.history.key, t.activeIndex) })) }, function (e) { let { swiper: t, extendParams: s, emit: i, on: n } = e, l = !1; const o = a(), c = r(); s({ hashNavigation: { enabled: !1, replaceState: !1, watchState: !1 } }); const p = () => { i("hashChange"); const e = o.location.hash.replace("#", ""); if (e !== t.slides.eq(t.activeIndex).attr("data-hash")) { const s = t.$wrapperEl.children(`.${t.params.slideClass}[data-hash="${e}"]`).index(); if (void 0 === s) return; t.slideTo(s) } }, u = () => { if (l && t.params.hashNavigation.enabled) if (t.params.hashNavigation.replaceState && c.history && c.history.replaceState) c.history.replaceState(null, null, `#${t.slides.eq(t.activeIndex).attr("data-hash")}` || ""), i("hashSet"); else { const e = t.slides.eq(t.activeIndex), s = e.attr("data-hash") || e.attr("data-history"); o.location.hash = s || "", i("hashSet") } }; n("init", (() => { t.params.hashNavigation.enabled && (() => { if (!t.params.hashNavigation.enabled || t.params.history && t.params.history.enabled) return; l = !0; const e = o.location.hash.replace("#", ""); if (e) { const s = 0; for (let a = 0, i = t.slides.length; a < i; a += 1) { const i = t.slides.eq(a); if ((i.attr("data-hash") || i.attr("data-history")) === e && !i.hasClass(t.params.slideDuplicateClass)) { const e = i.index(); t.slideTo(e, s, t.params.runCallbacksOnInit, !0) } } } t.params.hashNavigation.watchState && d(c).on("hashchange", p) })() })), n("destroy", (() => { t.params.hashNavigation.enabled && t.params.hashNavigation.watchState && d(c).off("hashchange", p) })), n("transitionEnd _freeModeNoMomentumRelease", (() => { l && u() })), n("slideChange", (() => { l && t.params.cssMode && u() })) }, function (e) { let t, { swiper: s, extendParams: i, on: r, emit: n } = e; function l() { if (!s.size) return s.autoplay.running = !1, void (s.autoplay.paused = !1); const e = s.slides.eq(s.activeIndex); let a = s.params.autoplay.delay; e.attr("data-swiper-autoplay") && (a = e.attr("data-swiper-autoplay") || s.params.autoplay.delay), clearTimeout(t), t = p((() => { let e; s.params.autoplay.reverseDirection ? s.params.loop ? (s.loopFix(), e = s.slidePrev(s.params.speed, !0, !0), n("autoplay")) : s.isBeginning ? s.params.autoplay.stopOnLastSlide ? d() : (e = s.slideTo(s.slides.length - 1, s.params.speed, !0, !0), n("autoplay")) : (e = s.slidePrev(s.params.speed, !0, !0), n("autoplay")) : s.params.loop ? (s.loopFix(), e = s.slideNext(s.params.speed, !0, !0), n("autoplay")) : s.isEnd ? s.params.autoplay.stopOnLastSlide ? d() : (e = s.slideTo(0, s.params.speed, !0, !0), n("autoplay")) : (e = s.slideNext(s.params.speed, !0, !0), n("autoplay")), (s.params.cssMode && s.autoplay.running || !1 === e) && l() }), a) } function o() { return void 0 === t && (!s.autoplay.running && (s.autoplay.running = !0, n("autoplayStart"), l(), !0)) } function d() { return !!s.autoplay.running && (void 0 !== t && (t && (clearTimeout(t), t = void 0), s.autoplay.running = !1, n("autoplayStop"), !0)) } function c(e) { s.autoplay.running && (s.autoplay.paused || (t && clearTimeout(t), s.autoplay.paused = !0, 0 !== e && s.params.autoplay.waitForTransition ? ["transitionend", "webkitTransitionEnd"].forEach((e => { s.$wrapperEl[0].addEventListener(e, h) })) : (s.autoplay.paused = !1, l()))) } function u() { const e = a(); "hidden" === e.visibilityState && s.autoplay.running && c(), "visible" === e.visibilityState && s.autoplay.paused && (l(), s.autoplay.paused = !1) } function h(e) { s && !s.destroyed && s.$wrapperEl && e.target === s.$wrapperEl[0] && (["transitionend", "webkitTransitionEnd"].forEach((e => { s.$wrapperEl[0].removeEventListener(e, h) })), s.autoplay.paused = !1, s.autoplay.running ? l() : d()) } function m() { s.params.autoplay.disableOnInteraction ? d() : (n("autoplayPause"), c()), ["transitionend", "webkitTransitionEnd"].forEach((e => { s.$wrapperEl[0].removeEventListener(e, h) })) } function f() { s.params.autoplay.disableOnInteraction || (s.autoplay.paused = !1, n("autoplayResume"), l()) } s.autoplay = { running: !1, paused: !1 }, i({ autoplay: { enabled: !1, delay: 3e3, waitForTransition: !0, disableOnInteraction: !0, stopOnLastSlide: !1, reverseDirection: !1, pauseOnMouseEnter: !1 } }), r("init", (() => { if (s.params.autoplay.enabled) { o(); a().addEventListener("visibilitychange", u), s.params.autoplay.pauseOnMouseEnter && (s.$el.on("mouseenter", m), s.$el.on("mouseleave", f)) } })), r("beforeTransitionStart", ((e, t, a) => { s.autoplay.running && (a || !s.params.autoplay.disableOnInteraction ? s.autoplay.pause(t) : d()) })), r("sliderFirstMove", (() => { s.autoplay.running && (s.params.autoplay.disableOnInteraction ? d() : c()) })), r("touchEnd", (() => { s.params.cssMode && s.autoplay.paused && !s.params.autoplay.disableOnInteraction && l() })), r("destroy", (() => { s.$el.off("mouseenter", m), s.$el.off("mouseleave", f), s.autoplay.running && d(); a().removeEventListener("visibilitychange", u) })), Object.assign(s.autoplay, { pause: c, run: l, start: o, stop: d }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ thumbs: { swiper: null, multipleActiveThumbs: !0, autoScrollOffset: 0, slideThumbActiveClass: "swiper-slide-thumb-active", thumbsContainerClass: "swiper-thumbs" } }); let i = !1, r = !1; function n() { const e = t.thumbs.swiper; if (!e || e.destroyed) return; const s = e.clickedIndex, a = e.clickedSlide; if (a && d(a).hasClass(t.params.thumbs.slideThumbActiveClass)) return; if (null == s) return; let i; if (i = e.params.loop ? parseInt(d(e.clickedSlide).attr("data-swiper-slide-index"), 10) : s, t.params.loop) { let e = t.activeIndex; t.slides.eq(e).hasClass(t.params.slideDuplicateClass) && (t.loopFix(), t._clientLeft = t.$wrapperEl[0].clientLeft, e = t.activeIndex); const s = t.slides.eq(e).prevAll(`[data-swiper-slide-index="${i}"]`).eq(0).index(), a = t.slides.eq(e).nextAll(`[data-swiper-slide-index="${i}"]`).eq(0).index(); i = void 0 === s ? a : void 0 === a ? s : a - e < e - s ? a : s } t.slideTo(i) } function l() { const { thumbs: e } = t.params; if (i) return !1; i = !0; const s = t.constructor; if (e.swiper instanceof s) t.thumbs.swiper = e.swiper, Object.assign(t.thumbs.swiper.originalParams, { watchSlidesProgress: !0, slideToClickedSlide: !1 }), Object.assign(t.thumbs.swiper.params, { watchSlidesProgress: !0, slideToClickedSlide: !1 }); else if (m(e.swiper)) { const a = Object.assign({}, e.swiper); Object.assign(a, { watchSlidesProgress: !0, slideToClickedSlide: !1 }), t.thumbs.swiper = new s(a), r = !0 } return t.thumbs.swiper.$el.addClass(t.params.thumbs.thumbsContainerClass), t.thumbs.swiper.on("tap", n), !0 } function o(e) { const s = t.thumbs.swiper; if (!s || s.destroyed) return; const a = "auto" === s.params.slidesPerView ? s.slidesPerViewDynamic() : s.params.slidesPerView; let i = 1; const r = t.params.thumbs.slideThumbActiveClass; if (t.params.slidesPerView > 1 && !t.params.centeredSlides && (i = t.params.slidesPerView), t.params.thumbs.multipleActiveThumbs || (i = 1), i = Math.floor(i), s.slides.removeClass(r), s.params.loop || s.params.virtual && s.params.virtual.enabled) for (let e = 0; e < i; e += 1)s.$wrapperEl.children(`[data-swiper-slide-index="${t.realIndex + e}"]`).addClass(r); else for (let e = 0; e < i; e += 1)s.slides.eq(t.realIndex + e).addClass(r); const n = t.params.thumbs.autoScrollOffset, l = n && !s.params.loop; if (t.realIndex !== s.realIndex || l) { let i, r, o = s.activeIndex; if (s.params.loop) { s.slides.eq(o).hasClass(s.params.slideDuplicateClass) && (s.loopFix(), s._clientLeft = s.$wrapperEl[0].clientLeft, o = s.activeIndex); const e = s.slides.eq(o).prevAll(`[data-swiper-slide-index="${t.realIndex}"]`).eq(0).index(), a = s.slides.eq(o).nextAll(`[data-swiper-slide-index="${t.realIndex}"]`).eq(0).index(); i = void 0 === e ? a : void 0 === a ? e : a - o == o - e ? s.params.slidesPerGroup > 1 ? a : o : a - o < o - e ? a : e, r = t.activeIndex > t.previousIndex ? "next" : "prev" } else i = t.realIndex, r = i > t.previousIndex ? "next" : "prev"; l && (i += "next" === r ? n : -1 * n), s.visibleSlidesIndexes && s.visibleSlidesIndexes.indexOf(i) < 0 && (s.params.centeredSlides ? i = i > o ? i - Math.floor(a / 2) + 1 : i + Math.floor(a / 2) - 1 : i > o && s.params.slidesPerGroup, s.slideTo(i, e ? 0 : void 0)) } } t.thumbs = { swiper: null }, a("beforeInit", (() => { const { thumbs: e } = t.params; e && e.swiper && (l(), o(!0)) })), a("slideChange update resize observerUpdate", (() => { o() })), a("setTransition", ((e, s) => { const a = t.thumbs.swiper; a && !a.destroyed && a.setTransition(s) })), a("beforeDestroy", (() => { const e = t.thumbs.swiper; e && !e.destroyed && r && e.destroy() })), Object.assign(t.thumbs, { init: l, update: o }) }, function (e) { let { swiper: t, extendParams: s, emit: a, once: i } = e; s({ freeMode: { enabled: !1, momentum: !0, momentumRatio: 1, momentumBounce: !0, momentumBounceRatio: 1, momentumVelocityRatio: 1, sticky: !1, minimumVelocity: .02 } }), Object.assign(t, { freeMode: { onTouchStart: function () { const e = t.getTranslate(); t.setTranslate(e), t.setTransition(0), t.touchEventsData.velocities.length = 0, t.freeMode.onTouchEnd({ currentPos: t.rtl ? t.translate : -t.translate }) }, onTouchMove: function () { const { touchEventsData: e, touches: s } = t; 0 === e.velocities.length && e.velocities.push({ position: s[t.isHorizontal() ? "startX" : "startY"], time: e.touchStartTime }), e.velocities.push({ position: s[t.isHorizontal() ? "currentX" : "currentY"], time: u() }) }, onTouchEnd: function (e) { let { currentPos: s } = e; const { params: r, $wrapperEl: n, rtlTranslate: l, snapGrid: o, touchEventsData: d } = t, c = u() - d.touchStartTime; if (s < -t.minTranslate()) t.slideTo(t.activeIndex); else if (s > -t.maxTranslate()) t.slides.length < o.length ? t.slideTo(o.length - 1) : t.slideTo(t.slides.length - 1); else { if (r.freeMode.momentum) { if (d.velocities.length > 1) { const e = d.velocities.pop(), s = d.velocities.pop(), a = e.position - s.position, i = e.time - s.time; t.velocity = a / i, t.velocity /= 2, Math.abs(t.velocity) < r.freeMode.minimumVelocity && (t.velocity = 0), (i > 150 || u() - e.time > 300) && (t.velocity = 0) } else t.velocity = 0; t.velocity *= r.freeMode.momentumVelocityRatio, d.velocities.length = 0; let e = 1e3 * r.freeMode.momentumRatio; const s = t.velocity * e; let c = t.translate + s; l && (c = -c); let p, h = !1; const m = 20 * Math.abs(t.velocity) * r.freeMode.momentumBounceRatio; let f; if (c < t.maxTranslate()) r.freeMode.momentumBounce ? (c + t.maxTranslate() < -m && (c = t.maxTranslate() - m), p = t.maxTranslate(), h = !0, d.allowMomentumBounce = !0) : c = t.maxTranslate(), r.loop && r.centeredSlides && (f = !0); else if (c > t.minTranslate()) r.freeMode.momentumBounce ? (c - t.minTranslate() > m && (c = t.minTranslate() + m), p = t.minTranslate(), h = !0, d.allowMomentumBounce = !0) : c = t.minTranslate(), r.loop && r.centeredSlides && (f = !0); else if (r.freeMode.sticky) { let e; for (let t = 0; t < o.length; t += 1)if (o[t] > -c) { e = t; break } c = Math.abs(o[e] - c) < Math.abs(o[e - 1] - c) || "next" === t.swipeDirection ? o[e] : o[e - 1], c = -c } if (f && i("transitionEnd", (() => { t.loopFix() })), 0 !== t.velocity) { if (e = l ? Math.abs((-c - t.translate) / t.velocity) : Math.abs((c - t.translate) / t.velocity), r.freeMode.sticky) { const s = Math.abs((l ? -c : c) - t.translate), a = t.slidesSizesGrid[t.activeIndex]; e = s < a ? r.speed : s < 2 * a ? 1.5 * r.speed : 2.5 * r.speed } } else if (r.freeMode.sticky) return void t.slideToClosest(); r.freeMode.momentumBounce && h ? (t.updateProgress(p), t.setTransition(e), t.setTranslate(c), t.transitionStart(!0, t.swipeDirection), t.animating = !0, n.transitionEnd((() => { t && !t.destroyed && d.allowMomentumBounce && (a("momentumBounce"), t.setTransition(r.speed), setTimeout((() => { t.setTranslate(p), n.transitionEnd((() => { t && !t.destroyed && t.transitionEnd() })) }), 0)) }))) : t.velocity ? (a("_freeModeNoMomentumRelease"), t.updateProgress(c), t.setTransition(e), t.setTranslate(c), t.transitionStart(!0, t.swipeDirection), t.animating || (t.animating = !0, n.transitionEnd((() => { t && !t.destroyed && t.transitionEnd() })))) : t.updateProgress(c), t.updateActiveIndex(), t.updateSlidesClasses() } else { if (r.freeMode.sticky) return void t.slideToClosest(); r.freeMode && a("_freeModeNoMomentumRelease") } (!r.freeMode.momentum || c >= r.longSwipesMs) && (t.updateProgress(), t.updateActiveIndex(), t.updateSlidesClasses()) } } } }) }, function (e) { let t, s, a, { swiper: i, extendParams: r } = e; r({ grid: { rows: 1, fill: "column" } }), i.grid = { initSlides: e => { const { slidesPerView: r } = i.params, { rows: n, fill: l } = i.params.grid; s = t / n, a = Math.floor(e / n), t = Math.floor(e / n) === e / n ? e : Math.ceil(e / n) * n, "auto" !== r && "row" === l && (t = Math.max(t, r * n)) }, updateSlide: (e, r, n, l) => { const { slidesPerGroup: o, spaceBetween: d } = i.params, { rows: c, fill: p } = i.params.grid; let u, h, m; if ("row" === p && o > 1) { const s = Math.floor(e / (o * c)), a = e - c * o * s, i = 0 === s ? o : Math.min(Math.ceil((n - s * c * o) / c), o); m = Math.floor(a / i), h = a - m * i + s * o, u = h + m * t / c, r.css({ "-webkit-order": u, order: u }) } else "column" === p ? (h = Math.floor(e / c), m = e - h * c, (h > a || h === a && m === c - 1) && (m += 1, m >= c && (m = 0, h += 1))) : (m = Math.floor(e / s), h = e - m * s); r.css(l("margin-top"), 0 !== m ? d && `${d}px` : "") }, updateWrapperSize: (e, s, a) => { const { spaceBetween: r, centeredSlides: n, roundLengths: l } = i.params, { rows: o } = i.params.grid; if (i.virtualSize = (e + r) * t, i.virtualSize = Math.ceil(i.virtualSize / o) - r, i.$wrapperEl.css({ [a("width")]: `${i.virtualSize + r}px` }), n) { s.splice(0, s.length); const e = []; for (let t = 0; t < s.length; t += 1) { let a = s[t]; l && (a = Math.floor(a)), s[t] < i.virtualSize + s[0] && e.push(a) } s.push(...e) } } } }, function (e) { let { swiper: t } = e; Object.assign(t, { appendSlide: K.bind(t), prependSlide: Z.bind(t), addSlide: Q.bind(t), removeSlide: J.bind(t), removeAllSlides: ee.bind(t) }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ fadeEffect: { crossFade: !1, transformEl: null } }), te({ effect: "fade", swiper: t, on: a, setTranslate: () => { const { slides: e } = t, s = t.params.fadeEffect; for (let a = 0; a < e.length; a += 1) { const e = t.slides.eq(a); let i = -e[0].swiperSlideOffset; t.params.virtualTranslate || (i -= t.translate); let r = 0; t.isHorizontal() || (r = i, i = 0); const n = t.params.fadeEffect.crossFade ? Math.max(1 - Math.abs(e[0].progress), 0) : 1 + Math.min(Math.max(e[0].progress, -1), 0); se(s, e).css({ opacity: n }).transform(`translate3d(${i}px, ${r}px, 0px)`) } }, setTransition: e => { const { transformEl: s } = t.params.fadeEffect; (s ? t.slides.find(s) : t.slides).transition(e), ae({ swiper: t, duration: e, transformEl: s, allSlides: !0 }) }, overwriteParams: () => ({ slidesPerView: 1, slidesPerGroup: 1, watchSlidesProgress: !0, spaceBetween: 0, virtualTranslate: !t.params.cssMode }) }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ cubeEffect: { slideShadows: !0, shadow: !0, shadowOffset: 20, shadowScale: .94 } }); const i = (e, t, s) => { let a = s ? e.find(".swiper-slide-shadow-left") : e.find(".swiper-slide-shadow-top"), i = s ? e.find(".swiper-slide-shadow-right") : e.find(".swiper-slide-shadow-bottom"); 0 === a.length && (a = d(`<div class="swiper-slide-shadow-${s ? "left" : "top"}"></div>`), e.append(a)), 0 === i.length && (i = d(`<div class="swiper-slide-shadow-${s ? "right" : "bottom"}"></div>`), e.append(i)), a.length && (a[0].style.opacity = Math.max(-t, 0)), i.length && (i[0].style.opacity = Math.max(t, 0)) }; te({ effect: "cube", swiper: t, on: a, setTranslate: () => { const { $el: e, $wrapperEl: s, slides: a, width: r, height: n, rtlTranslate: l, size: o, browser: c } = t, p = t.params.cubeEffect, u = t.isHorizontal(), h = t.virtual && t.params.virtual.enabled; let m, f = 0; p.shadow && (u ? (m = s.find(".swiper-cube-shadow"), 0 === m.length && (m = d('<div class="swiper-cube-shadow"></div>'), s.append(m)), m.css({ height: `${r}px` })) : (m = e.find(".swiper-cube-shadow"), 0 === m.length && (m = d('<div class="swiper-cube-shadow"></div>'), e.append(m)))); for (let e = 0; e < a.length; e += 1) { const t = a.eq(e); let s = e; h && (s = parseInt(t.attr("data-swiper-slide-index"), 10)); let r = 90 * s, n = Math.floor(r / 360); l && (r = -r, n = Math.floor(-r / 360)); const d = Math.max(Math.min(t[0].progress, 1), -1); let c = 0, m = 0, g = 0; s % 4 == 0 ? (c = 4 * -n * o, g = 0) : (s - 1) % 4 == 0 ? (c = 0, g = 4 * -n * o) : (s - 2) % 4 == 0 ? (c = o + 4 * n * o, g = o) : (s - 3) % 4 == 0 && (c = -o, g = 3 * o + 4 * o * n), l && (c = -c), u || (m = c, c = 0); const v = `rotateX(${u ? 0 : -r}deg) rotateY(${u ? r : 0}deg) translate3d(${c}px, ${m}px, ${g}px)`; d <= 1 && d > -1 && (f = 90 * s + 90 * d, l && (f = 90 * -s - 90 * d)), t.transform(v), p.slideShadows && i(t, d, u) } if (s.css({ "-webkit-transform-origin": `50% 50% -${o / 2}px`, "transform-origin": `50% 50% -${o / 2}px` }), p.shadow) if (u) m.transform(`translate3d(0px, ${r / 2 + p.shadowOffset}px, ${-r / 2}px) rotateX(90deg) rotateZ(0deg) scale(${p.shadowScale})`); else { const e = Math.abs(f) - 90 * Math.floor(Math.abs(f) / 90), t = 1.5 - (Math.sin(2 * e * Math.PI / 360) / 2 + Math.cos(2 * e * Math.PI / 360) / 2), s = p.shadowScale, a = p.shadowScale / t, i = p.shadowOffset; m.transform(`scale3d(${s}, 1, ${a}) translate3d(0px, ${n / 2 + i}px, ${-n / 2 / a}px) rotateX(-90deg)`) } const g = c.isSafari || c.isWebView ? -o / 2 : 0; s.transform(`translate3d(0px,0,${g}px) rotateX(${t.isHorizontal() ? 0 : f}deg) rotateY(${t.isHorizontal() ? -f : 0}deg)`), s[0].style.setProperty("--swiper-cube-translate-z", `${g}px`) }, setTransition: e => { const { $el: s, slides: a } = t; a.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e), t.params.cubeEffect.shadow && !t.isHorizontal() && s.find(".swiper-cube-shadow").transition(e) }, recreateShadows: () => { const e = t.isHorizontal(); t.slides.each((t => { const s = Math.max(Math.min(t.progress, 1), -1); i(d(t), s, e) })) }, getEffectParams: () => t.params.cubeEffect, perspective: () => !0, overwriteParams: () => ({ slidesPerView: 1, slidesPerGroup: 1, watchSlidesProgress: !0, resistanceRatio: 0, spaceBetween: 0, centeredSlides: !1, virtualTranslate: !0 }) }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ flipEffect: { slideShadows: !0, limitRotation: !0, transformEl: null } }); const i = (e, s, a) => { let i = t.isHorizontal() ? e.find(".swiper-slide-shadow-left") : e.find(".swiper-slide-shadow-top"), r = t.isHorizontal() ? e.find(".swiper-slide-shadow-right") : e.find(".swiper-slide-shadow-bottom"); 0 === i.length && (i = ie(a, e, t.isHorizontal() ? "left" : "top")), 0 === r.length && (r = ie(a, e, t.isHorizontal() ? "right" : "bottom")), i.length && (i[0].style.opacity = Math.max(-s, 0)), r.length && (r[0].style.opacity = Math.max(s, 0)) }; te({ effect: "flip", swiper: t, on: a, setTranslate: () => { const { slides: e, rtlTranslate: s } = t, a = t.params.flipEffect; for (let r = 0; r < e.length; r += 1) { const n = e.eq(r); let l = n[0].progress; t.params.flipEffect.limitRotation && (l = Math.max(Math.min(n[0].progress, 1), -1)); const o = n[0].swiperSlideOffset; let d = -180 * l, c = 0, p = t.params.cssMode ? -o - t.translate : -o, u = 0; t.isHorizontal() ? s && (d = -d) : (u = p, p = 0, c = -d, d = 0), n[0].style.zIndex = -Math.abs(Math.round(l)) + e.length, a.slideShadows && i(n, l, a); const h = `translate3d(${p}px, ${u}px, 0px) rotateX(${c}deg) rotateY(${d}deg)`; se(a, n).transform(h) } }, setTransition: e => { const { transformEl: s } = t.params.flipEffect; (s ? t.slides.find(s) : t.slides).transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e), ae({ swiper: t, duration: e, transformEl: s }) }, recreateShadows: () => { const e = t.params.flipEffect; t.slides.each((s => { const a = d(s); let r = a[0].progress; t.params.flipEffect.limitRotation && (r = Math.max(Math.min(s.progress, 1), -1)), i(a, r, e) })) }, getEffectParams: () => t.params.flipEffect, perspective: () => !0, overwriteParams: () => ({ slidesPerView: 1, slidesPerGroup: 1, watchSlidesProgress: !0, spaceBetween: 0, virtualTranslate: !t.params.cssMode }) }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ coverflowEffect: { rotate: 50, stretch: 0, depth: 100, scale: 1, modifier: 1, slideShadows: !0, transformEl: null } }), te({ effect: "coverflow", swiper: t, on: a, setTranslate: () => { const { width: e, height: s, slides: a, slidesSizesGrid: i } = t, r = t.params.coverflowEffect, n = t.isHorizontal(), l = t.translate, o = n ? e / 2 - l : s / 2 - l, d = n ? r.rotate : -r.rotate, c = r.depth; for (let e = 0, t = a.length; e < t; e += 1) { const t = a.eq(e), s = i[e], l = (o - t[0].swiperSlideOffset - s / 2) / s, p = "function" == typeof r.modifier ? r.modifier(l) : l * r.modifier; let u = n ? d * p : 0, h = n ? 0 : d * p, m = -c * Math.abs(p), f = r.stretch; "string" == typeof f && -1 !== f.indexOf("%") && (f = parseFloat(r.stretch) / 100 * s); let g = n ? 0 : f * p, v = n ? f * p : 0, w = 1 - (1 - r.scale) * Math.abs(p); Math.abs(v) < .001 && (v = 0), Math.abs(g) < .001 && (g = 0), Math.abs(m) < .001 && (m = 0), Math.abs(u) < .001 && (u = 0), Math.abs(h) < .001 && (h = 0), Math.abs(w) < .001 && (w = 0); const b = `translate3d(${v}px,${g}px,${m}px) rotateX(${h}deg) rotateY(${u}deg) scale(${w})`; if (se(r, t).transform(b), t[0].style.zIndex = 1 - Math.abs(Math.round(p)), r.slideShadows) { let e = n ? t.find(".swiper-slide-shadow-left") : t.find(".swiper-slide-shadow-top"), s = n ? t.find(".swiper-slide-shadow-right") : t.find(".swiper-slide-shadow-bottom"); 0 === e.length && (e = ie(r, t, n ? "left" : "top")), 0 === s.length && (s = ie(r, t, n ? "right" : "bottom")), e.length && (e[0].style.opacity = p > 0 ? p : 0), s.length && (s[0].style.opacity = -p > 0 ? -p : 0) } } }, setTransition: e => { const { transformEl: s } = t.params.coverflowEffect; (s ? t.slides.find(s) : t.slides).transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e) }, perspective: () => !0, overwriteParams: () => ({ watchSlidesProgress: !0 }) }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ creativeEffect: { transformEl: null, limitProgress: 1, shadowPerProgress: !1, progressMultiplier: 1, perspective: !0, prev: { translate: [0, 0, 0], rotate: [0, 0, 0], opacity: 1, scale: 1 }, next: { translate: [0, 0, 0], rotate: [0, 0, 0], opacity: 1, scale: 1 } } }); const i = e => "string" == typeof e ? e : `${e}px`; te({ effect: "creative", swiper: t, on: a, setTranslate: () => { const { slides: e, $wrapperEl: s, slidesSizesGrid: a } = t, r = t.params.creativeEffect, { progressMultiplier: n } = r, l = t.params.centeredSlides; if (l) { const e = a[0] / 2 - t.params.slidesOffsetBefore || 0; s.transform(`translateX(calc(50% - ${e}px))`) } for (let s = 0; s < e.length; s += 1) { const a = e.eq(s), o = a[0].progress, d = Math.min(Math.max(a[0].progress, -r.limitProgress), r.limitProgress); let c = d; l || (c = Math.min(Math.max(a[0].originalProgress, -r.limitProgress), r.limitProgress)); const p = a[0].swiperSlideOffset, u = [t.params.cssMode ? -p - t.translate : -p, 0, 0], h = [0, 0, 0]; let m = !1; t.isHorizontal() || (u[1] = u[0], u[0] = 0); let f = { translate: [0, 0, 0], rotate: [0, 0, 0], scale: 1, opacity: 1 }; d < 0 ? (f = r.next, m = !0) : d > 0 && (f = r.prev, m = !0), u.forEach(((e, t) => { u[t] = `calc(${e}px + (${i(f.translate[t])} * ${Math.abs(d * n)}))` })), h.forEach(((e, t) => { h[t] = f.rotate[t] * Math.abs(d * n) })), a[0].style.zIndex = -Math.abs(Math.round(o)) + e.length; const g = u.join(", "), v = `rotateX(${h[0]}deg) rotateY(${h[1]}deg) rotateZ(${h[2]}deg)`, w = c < 0 ? `scale(${1 + (1 - f.scale) * c * n})` : `scale(${1 - (1 - f.scale) * c * n})`, b = c < 0 ? 1 + (1 - f.opacity) * c * n : 1 - (1 - f.opacity) * c * n, x = `translate3d(${g}) ${v} ${w}`; if (m && f.shadow || !m) { let e = a.children(".swiper-slide-shadow"); if (0 === e.length && f.shadow && (e = ie(r, a)), e.length) { const t = r.shadowPerProgress ? d * (1 / r.limitProgress) : d; e[0].style.opacity = Math.min(Math.max(Math.abs(t), 0), 1) } } const y = se(r, a); y.transform(x).css({ opacity: b }), f.origin && y.css("transform-origin", f.origin) } }, setTransition: e => { const { transformEl: s } = t.params.creativeEffect; (s ? t.slides.find(s) : t.slides).transition(e).find(".swiper-slide-shadow").transition(e), ae({ swiper: t, duration: e, transformEl: s, allSlides: !0 }) }, perspective: () => t.params.creativeEffect.perspective, overwriteParams: () => ({ watchSlidesProgress: !0, virtualTranslate: !t.params.cssMode }) }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ cardsEffect: { slideShadows: !0, transformEl: null, rotate: !0, perSlideRotate: 2, perSlideOffset: 8 } }), te({ effect: "cards", swiper: t, on: a, setTranslate: () => { const { slides: e, activeIndex: s } = t, a = t.params.cardsEffect, { startTranslate: i, isTouched: r } = t.touchEventsData, n = t.translate; for (let l = 0; l < e.length; l += 1) { const o = e.eq(l), d = o[0].progress, c = Math.min(Math.max(d, -4), 4); let p = o[0].swiperSlideOffset; t.params.centeredSlides && !t.params.cssMode && t.$wrapperEl.transform(`translateX(${t.minTranslate()}px)`), t.params.centeredSlides && t.params.cssMode && (p -= e[0].swiperSlideOffset); let u = t.params.cssMode ? -p - t.translate : -p, h = 0; const m = -100 * Math.abs(c); let f = 1, g = -a.perSlideRotate * c, v = a.perSlideOffset - .75 * Math.abs(c); const w = t.virtual && t.params.virtual.enabled ? t.virtual.from + l : l, b = (w === s || w === s - 1) && c > 0 && c < 1 && (r || t.params.cssMode) && n < i, x = (w === s || w === s + 1) && c < 0 && c > -1 && (r || t.params.cssMode) && n > i; if (b || x) { const e = (1 - Math.abs((Math.abs(c) - .5) / .5)) ** .5; g += -28 * c * e, f += -.5 * e, v += 96 * e, h = -25 * e * Math.abs(c) + "%" } if (u = c < 0 ? `calc(${u}px + (${v * Math.abs(c)}%))` : c > 0 ? `calc(${u}px + (-${v * Math.abs(c)}%))` : `${u}px`, !t.isHorizontal()) { const e = h; h = u, u = e } const y = c < 0 ? "" + (1 + (1 - f) * c) : "" + (1 - (1 - f) * c), E = `\n translate3d(${u}, ${h}, ${m}px)\n rotateZ(${a.rotate ? g : 0}deg)\n scale(${y})\n `; if (a.slideShadows) { let e = o.find(".swiper-slide-shadow"); 0 === e.length && (e = ie(a, o)), e.length && (e[0].style.opacity = Math.min(Math.max((Math.abs(c) - .5) / .5, 0), 1)) } o[0].style.zIndex = -Math.abs(Math.round(d)) + e.length; se(a, o).transform(E) } }, setTransition: e => { const { transformEl: s } = t.params.cardsEffect; (s ? t.slides.find(s) : t.slides).transition(e).find(".swiper-slide-shadow").transition(e), ae({ swiper: t, duration: e, transformEl: s }) }, perspective: () => !0, overwriteParams: () => ({ watchSlidesProgress: !0, virtualTranslate: !t.params.cssMode }) }) }]; return V.use(re), V })); </script> <script> var swiper = new Swiper(".latest-news", { loop: false, slidesPerView: 1, slidesPerGroup: 1, spaceBetween: 30, navigation: { nextEl: ".latest-news .s-button-next", prevEl: ".latest-news .s-button-prev", }, breakpoints: { 999: { slidesPerView: 3, slidesPerGroup: 3, spaceBetween: 30, }, 768: { slidesPerView: 2, slidesPerGroup: 2, spaceBetween: 30, } } }); </script> <script> var swiper = new Swiper(".g-review-page-slider", { loop: false, slidesPerView: 1, slidesPerGroup: 1, spaceBetween: 30, navigation: { nextEl: ".g-review-page-slider .g-button-next", prevEl: ".g-review-page-slider .g-button-prev", }, pagination: { el: ".g-review-page-slider .g-pagination", dynamicBullets: false, } }); </script> </body> </html> <!-- Dynamic page generated in 0.523 seconds. --> <!-- Cached page generated by WP-Super-Cache on 2025-02-21 12:14:53 --> <!-- Compression = gzip -->