1/** 2 * ìì§ì´ë ë°°ë Jquery Plug-in 3 * @author cafe24 4 */ 5 6(function($){ 7 8 $.fn.floatBanner = function(options) { 9 options = $.extend({}, $.fn.floatBanner.defaults , options); 10 11 return this.each(function() { 12 var aPosition = $(this).position(); 13 var jbOffset = $(this).offset(); 14 var node = this; 15 16 $(window).on('scroll', function() { 17 var _top = $(document).scrollTop(); 18 _top = (aPosition.top < _top) ? _top : aPosition.top; 19 20 setTimeout(function () { 21 var newinit = $(document).scrollTop(); 22 23 if ( newinit > jbOffset.top ) { 24 _top -= jbOffset.top; 25 var container_height = $("#wrap").height(); 26 var quick_height = $(node).height(); 27 var cul = container_height - quick_height; 28 if(_top > cul){ 29 _top = cul; 30 } 31 } else { 32 _top = 0; 33 } 34 35 $(node).stop().animate({top: _top}, options.animate); 36 }, options.delay); 37 }); 38 }); 39 }; 40 41 $.fn.floatBanner.defaults = { 42 'animate' : 500, 43 'delay' : 500 44 }; 45 46})(jQuery); 47 48/** 49 * 문ì 구ëí ìì 50 */ 51$(function(){ 52 $('#banner:visible, #quick:visible').floatBanner(); 53 54 //placeholder 55 $(".ePlaceholder input, .ePlaceholder textarea").each(function(i){ 56 var placeholderName = $(this).parents().attr('title'); 57 $(this).attr("placeholder", placeholderName); 58 }); 59 /* placeholder ie8, ie9 */ 60 $.fn.extend({ 61 placeholder : function() { 62 //IE 8 ë²ì ìë hasPlaceholderSupport() ê°ì´ false를 ë¦¬í´ 63 if (hasPlaceholderSupport() === true) { 64 return this; 65 } 66 //hasPlaceholderSupport() ê°ì´ false ì¼ ê²½ì° ìë ì½ë를 ì¤í 67 return this.each(function(){ 68 var findThis = $(this); 69 var sPlaceholder = findThis.attr('placeholder'); 70 if ( ! sPlaceholder) { 71 return; 72 } 73 findThis.wrap('<label class="ePlaceholder" />'); 74 var sDisplayPlaceHolder = $(this).val() ? ' style="display:none;"' : ''; 75 findThis.before('<span' + sDisplayPlaceHolder + '>' + sPlaceholder + '</span>'); 76 this.onpropertychange = function(e){ 77 e = event || e; 78 if (e.propertyName == 'value') { 79 $(this).trigger('focusout'); 80 } 81 }; 82 //ê³µíµ class 83 var agent = navigator.userAgent.toLowerCase(); 84 if (agent.indexOf("msie") != -1) { 85 $(".ePlaceholder").css({"position":"relative"}); 86 $(".ePlaceholder span").css({"position":"absolute", "padding":"0 4px", "color":"#878787"}); 87 $(".ePlaceholder label").css({"padding":"0"}); 88 } 89 }); 90 } 91 }); 92 93 $(':input[placeholder]').placeholder(); //placeholder() í¨ì를 í¸ì¶ 94 95 //í´ë¦íë©´ placeholder ì¨ê¹ 96 $('body').on('click', '.ePlaceholder span', function(){ 97 $(this).hide(); 98 }); 99 100 //inputì°½ í¬ì»¤ì¤ ì¸ ì¼ë placeholder ì¨ê¹ 101 $('body').on('focusin', '.ePlaceholder :input', function(){ 102 $(this).prev('span').hide(); 103 }); 104 105 //inputì°½ í¬ì»¤ì¤ ìì ì¼ë value ê° true ì´ë©´ ì¨ê¹, false ì´ë©´ ë³´ì¬ì§ 106 $('body').on('focusout', '.ePlaceholder :input', function(){ 107 if (this.value) { 108 $(this).prev('span').hide(); 109 } else { 110 $(this).prev('span').show(); 111 } 112 }); 113 114 //inputì placeholderê° ì§ìì´ ëë©´ true를 ìëë©´ false를 리í´ê°ì¼ë¡ ëì ¸ì¤ 115 function hasPlaceholderSupport() { 116 if ('placeholder' in document.createElement('input')) { 117 return true; 118 } else { 119 return false;
120 } 121 } 122}); 123 124/** 125 * ì¸ë¤ì¼ ì´ë¯¸ì§ ìë°ì¼ê²½ì° ê¸°ë³¸ê° ì¤ì 126 */ 127$(window).on('load', function() { 128 $("img.thumb,img.ThumbImage,img.BigImage").each(function($i,$item){ 129 var $img = new Image(); 130 $img.onerror = function () { 131 $item.src="//img.echosting.cafe24.com/thumb/img_product_big.gif"; 132 } 133 $img.src = this.src; 134 }); 135}); 136 137/** 138 * tooltip 139 */ 140$('.eTooltip').each(function(i){ 141 $(this).find('.btnClose').attr('tabIndex','-1'); 142}); 143//tooltip input focus 144$('.eTooltip').find('input').on('focus', function() { 145 var targetName = returnTagetName(this); 146 targetName.siblings('.ec-base-tooltip').show(); 147}); 148$('.eTooltip').find('input').on('focusout', function() { 149 var targetName = returnTagetName(this); 150 targetName.siblings('.ec-base-tooltip').hide(); 151}); 152function returnTagetName(_this){ 153 var ePlacename = $(_this).parent().attr("class"); 154 var targetName; 155 if(ePlacename == "ePlaceholder"){ //ePlaceholder ëì 156 targetName = $(_this).parents(); 157 }else{ 158 targetName = $(_this); 159 } 160 return targetName; 161} 162 163/** 164 * eTab 165 */ 166$("body").on("click", ".eTab a", function(e){ 167 // í´ë¦í li ì selected í´ëì¤ ì¶ê°, 기존 liì ìë selected í´ëì¤ë ìì . 168 var _li = $(this).parent("li").addClass("selected").siblings().removeClass("selected"), 169 _target = $(this).attr("href"), 170 _siblings = $(_target).attr("class"), 171 _arr = _siblings.split(" "), 172 _classSiblings = "."+_arr[0]; 173 174 //í´ë¦í íì í´ë¹íë ììë íì±í, 기존 ììë ë¹íì±í í¨. 175 $(_target).show().siblings(_classSiblings).hide(); 176 177 178 //preventDefault ë a íê·¸ ì²ë¼ í´ë¦ ì´ë²¤í¸ ì¸ì ë³ëì ë¸ë¼ì°ì íëì ë§ê¸° ìí´ ì¬ì©ë¨. 179 e.preventDefault(); 180}); 181 182 183 184//window popup script 185function winPop(url) { 186 window.open(url, "popup", "width=300,height=300,left=10,top=10,resizable=no,scrollbars=no"); 187} 188 189//const newDomain = "https://m.mnkl.co.kr"; 190// íì¬ URLì ê²½ë¡ì 쿼리 문ìì´ ì¶ì¶ 191//const path = window.location.pathname; 192//const queryString = window.location.search; 193// ìµì¢ URL ìì± ë° ë¦¬ëë ì 194//const newUrl = newDomain + path + queryString; 195//window.location.href = newUrl; 196 197var currentHost = window.location.host; 198var newDomain = "https://m.mnkl.co.kr"; 199 200if (currentHost === "mnkl.co.kr" || currentHost === "www.mnkl.co.kr" || currentHost === "officialmnkl.cafe24.com") { 201 var path = window.location.pathname; 202 var queryString = window.location.search; 203 var newUrl = newDomain + path + queryString; 204 window.location.href = newUrl; 205} 206 207/** 208 * document.location.href split 209 * return array Param 210 */ 211function getQueryString(sKey) 212{ 213 var sQueryString = document.location.search.substring(1); 214 var aParam = {}; 215 216 if (sQueryString) { 217 var aFields = sQueryString.split("&"); 218 var aField = []; 219 for (var i=0; i<aFields.length; i++) { 220 aField = aFields[i].split('='); 221 aParam[aField[0]] = aField[1]; 222 } 223 } 224 225 aParam.page = aParam.page ? aParam.page : 1; 226 return sKey ? aParam[sKey] : aParam; 227}; 228 229$(function(){ 230 // tab 231 $.eTab = function(ul){ 232 $(ul).find('a').on('click', function(){ 233 var _li = $(this).parent('li').addClass('selected').siblings().removeClass('selected'), 234 _target = $(this).attr('href'), 235 _siblings = '.' + $(_target).attr('class'); 236 $(_target).show().siblings(_siblings).hide(); 237 return false 238 }); 239 } 240 if ( window.call_eTab ) { 241 call_eTab(); 242 }; 243}); 244(function($){ 245 $.fn.extend({ 246 center: function() { 247 this.each(function() { 248 var 249 $this = $(this), 250 $w = $(window); 251 $this.css({ 252 position: "absolute", 253 top: ~~(($w.height() - $this.outerHeight()) / 2) + $w.scrollTop() + "px", 254 left: ~~(($w.width() - $this.outerWidth()) / 2) + $w.scrollLeft() + "px" 255 }); 256 }); 257 return this; 258 } 259 }); 260 $(function() { 261 var $container = function(){/* 262 <div id="modalContainer"> 263 <iframe id="modalContent" scroll="0" scrolling="no" frameBorder="0"></iframe> 264 </div>'); 265 */}.toString().slice(14,-3); 266 $('body') 267 .append($('<div id="modalBackpanel"></div>')) 268 .append($($container)); 269 function closeModal () { 270 $('#modalContainer').hide(); 271 $('#modalBackpanel').hide(); 272 } 273 $('#modalBackpanel').on('click',closeModal); 274 zoom = function ($piProductNo, $piCategoryNo, $piDisplayGroup) { 275 var $url = '/product/image_zoom.html?product_no=' + $piProductNo + '&cate_no=' + $piCategoryNo + '&display_group=' + $piDisplayGroup; 276 $('#modalContent').attr('src', $url); 277 $('#modalContent').on("load",function(){ 278 $(".header .close",this.contentWindow.document.body).on("click", closeModal); 279 }); 280 $('#modalBackpanel').css({width:$("body").width(),height:$("body").height(),opacity:.4}).show(); 281 $('#modalContainer').center().show(); 282 } 283 }); 284})(jQuery); 285/* Slide menu */ 286/* morenvy.com 190610 ì í ìì */ 287 288var aCategory = []; 289$(document).ready(function(){ 290 $('#header').append('<div id="dimmedSlider"></div>'); 291 var methods = { 292 aCategory : [], 293 aSubCategory : {}, 294 get: function() 295 { 296 $.ajax({ 297 url : '/exec/front/Product/SubCategory', 298 dataType: 'json', 299 success: function(aData) { 300 if (aData == null || aData == 'undefined') { 301 methods.checkSub(); 302 return; 303 } 304 for (var i=0; i<aData.length; i++) 305 { 306 var sParentCateNo = aData[i].parent_cate_no; 307 var sCateNo = aData[i].cate_no; 308 if (!methods.aSubCategory[sParentCateNo]) { 309 methods.aSubCategory[sParentCateNo] = []; 310 } 311 if (!aCategory[sCateNo]) { 312 aCategory[sCateNo] = []; 313 } 314 methods.aSubCategory[sParentCateNo].push( aData[i] ); 315 aCategory[sCateNo] = aData[i]; 316 } 317 methods.checkSub(); 318 } 319 }); 320 }, 321 getParam: function(sUrl, sKey) { 322 var aUrl = sUrl.split('?'); 323 var sQueryString = aUrl[1]; 324 var aParam = {};
325 if (sQueryString) { 326 var aFields = sQueryString.split("&"); 327 var aField = []; 328 for (var i=0; i<aFields.length; i++) { 329 aField = aFields[i].split('='); 330 aParam[aField[0]] = aField[1]; 331 } 332 } 333 return sKey ? aParam[sKey] : aParam; 334 }, 335 336 show: function(overNode, iCateNo) { 337 var oParentNode = overNode; 338 var aHtml = []; 339 var sMyCateList = localStorage.getItem("myCateList"); 340 if (methods.aSubCategory[iCateNo] != undefined) { 341 aHtml.push('<div class="sub_depth"><ul class="slideSubMenu">'); 342 $(methods.aSubCategory[iCateNo]).each(function() { 343 var sNextParentNo = this.cate_no; 344 var sCateSelected = (checkInArray(sMyCateList, this.cate_no) == true) ? ' selected' : ''; 345 if (methods.aSubCategory[sNextParentNo] == undefined) { 346 aHtml.push('<li class="noChild" id="cate'+this.cate_no+'">'); 347 var sHref = '' 348 } else { 349 aHtml.push('<li id="cate'+this.cate_no+'">'); 350 var sHref = '#none'; 351 } 352 aHtml.push('<a href="'+this.link_product_list+'" class="cate" cate="'+this.param+'" onmouseover="subMenuon(this);">'+this.name+'</a>'); // ì¤ë¶ë¥ 353 354 if (methods.aSubCategory[sNextParentNo] != undefined) { 355 aHtml.push('<ul>'); 356 $(methods.aSubCategory[sNextParentNo]).each(function() { 357 var sNextParentNo2 = this.cate_no; 358 var sCateSelected = (checkInArray(sMyCateList, this.cate_no) == true) ? ' selected' : ''; 359 if (methods.aSubCategory[sNextParentNo2] == undefined) { 360 aHtml.push('<li class="noChild" id="cate'+this.cate_no+'">'); 361 var sHref = '' 362 } else { 363 aHtml.push('<li id="cate'+this.cate_no+'">'); 364 var sHref = '#none'; 365 } 366 aHtml.push('<a href="'+this.link_product_list+'" class="cate" cate="'+this.param+'" onmouseover="subMenuon(this);">'+this.name+'</a>'); // ìë¶ë¥ 367 368 369 if (methods.aSubCategory[sNextParentNo2] != undefined) { 370 aHtml.push('<ul>'); 371 372 $(methods.aSubCategory[sNextParentNo2]).each(function() { 373 aHtml.push('<li class="noChild" id="cate'+this.cate_no+'">'); 374 var sCateSelected = (checkInArray(sMyCateList, this.cate_no) == true) ? ' selected' : ''; 375 aHtml.push('<a href="'+this.link_product_list+'" class="cate" cate="'+this.param+'" onmouseover="subMenuon(this);">'+this.name+'</a>'); // íìë¶ë¥ 376 aHtml.push('</li>'); 377 }); 378 aHtml.push('</ul>'); 379 } 380 aHtml.push('</li>'); 381 }); 382 aHtml.push('</ul>'); 383 } 384 aHtml.push('</li>'); 385 }); 386 aHtml.push('</ul></div>'); 387 } 388 $(oParentNode).append(aHtml.join('')); 389 }, 390 close: function() { 391 $('.slideSubMenu').remove(); 392 }, 393 checkSub: function() { 394 $('.cate').each(function(){ 395 var iCateNo = Number(methods.getParam($(this).attr('cate'), 'cate_no')); 396 var result = methods.aSubCategory[iCateNo]; 397 if (result == undefined) { 398 var sHref = '/product/list.html'+$(this).attr('cate'); // ì¤ë¶ë¥ ìë ëë¶ë¥ 399 $(this).attr('href', sHref); 400 $(this).parent().attr('class', 'noChild'); 401 } 402 }); 403 }, 404 }; 405 406 methods.get(); 407 408 setTimeout(function(){ 409 $('#slideCateList li > a.cate').each(function(e) { 410 var iCateNo = Number(methods.getParam($(this).attr('cate'), 'cate_no')); 411 if ($(this).parent().attr('class') == 'xans-record- selected') { 412 } else { 413 if (!iCateNo) return; 414 $('#mcategory #slideCateList li').removeClass('selected'); 415 methods.show(this.parentNode, iCateNo); 416 } 417 }); 418 },300) 419 420 421 jQuery('#mcategory ul li').mouseenter(function(e){ 422 e.preventDefault(); 423 $(this).addClass('selected'); 424 }).mouseleave(function(e){ 425 e.preventDefault(); 426 $(this).removeClass('selected'); 427 $(this).find('.selected').removeClass('selected'); 428 }); 429 430 /* morenvy.com ìë¨ ì¤í ì¹´í ê³ ë¦¬ ê°ë¡ê° */ 431 var cate_area01 = jQuery('#mheader #comment_top .area01').outerWidth(true); 432 var cate_area02 = jQuery('#mheader #comment_top .area02').outerWidth(true); 433 jQuery('#mheader #comment_top .area01 .sub_depth .slideSubMenu').css('width',cate_area01 + cate_area02) 434 jQuery('#mheader #comment_top .area01 .sub_depth').css('width',jQuery(window).width()) 435 436 jQuery(window).resize(function(){ 437 jQuery('#mheader #comment_top .area01 .sub_depth').css('width',jQuery(window).width()) 438 }) 439}); 440 441function subMenuon(obj) { 442 $(obj).parent().find('li').removeClass('selected'); 443 $(obj).parent().addClass('selected'); 444 $(obj).parent().siblings().removeClass("selected"); 445} 446 447function subArea() { 448 var cate_area01 = jQuery('#mheader #comment_top .area01').outerWidth(true); 449 var cate_area02 = jQuery('#mheader #comment_top .area02').outerWidth(true); 450 jQuery('#mheader #comment_top .area01 .sub_depth .slideSubMenu').css('width',cate_area01 + cate_area02) 451 jQuery('#mheader #comment_top .area01 .sub_depth').css('width',jQuery(window).width()) 452} 453
454function checkInArray(sBookmarkList, iCateNo) { 455 return false; 456} 457 458/* morenvy.com 220628 주ìê´ */ 459jQuery(document).ready(function() { 460 /* morenvy.com ìë¨ ì¤í¬ë¡¤ ê³ ì */ 461 var msie6 = $.browser == 'msie' && $.browser.version < 7; 462 if (!msie6) { 463 var top = jQuery('#comment_top').offset().top - parseFloat(jQuery('#comment_top').css('margin-top').replace(/auto/, 0)); 464 jQuery(window).scroll(function (event) { 465 // what the y position of the scroll is 466 var y = jQuery(this).scrollTop(); 467 // whether that's below the form 468 if(jQuery('#m_onoffmulti_top').css('display') == 'none'){ //ìµìë¨ ë°°ë ë«ììë 469 if (y >= 86){ 470 jQuery('#comment_top').addClass('fixed'); 471 } else { 472 jQuery('#comment_top').removeClass('fixed'); 473 jQuery('#layer_shadow').fadeOut(300) 474 jQuery('.top_search_area').removeClass('open') 475 } 476 } else { //ìµìë¨ ë°°ë ì´ë ¤ììë 477 if (y >= top) { 478 // if so, ad the fixed class 479 jQuery('#comment_top').addClass('fixed'); 480 } else { 481 // otherwise remove it 482 jQuery('#comment_top').removeClass('fixed'); 483 jQuery('#layer_shadow').fadeOut(300) 484 jQuery('.top_search_area').removeClass('open') 485 } 486 } 487 }); 488 } 489 490 /* morenvy.com ìµìë¨ ë°°ë */ 491 jQuery('.closebtn').bind('click', function() { 492 var that = jQuery(this); 493 if (that.hasClass('is-open')) { 494 that.removeClass('is-open').addClass('is-closed'); 495 jQuery('#m_onoffmulti_top').slideDown('fast'); 496 } else { 497 that.removeClass('is-closed').addClass('is-open'); 498 jQuery('#m_onoffmulti_top').slideUp('fast'); 499 } 500 }); 501 502 /* morenvy.com ê²ìì°½ íì */ 503 jQuery('.top_menu_search > a').click(function(){ 504 jQuery('#layer_shadow').fadeIn(300) 505 jQuery('.top_search_area').addClass('open') 506 }) 507 jQuery('#layer_shadow, .search_close').click(function(){ 508 jQuery('#layer_shadow').fadeOut(300) 509 jQuery('.top_search_area').removeClass('open') 510 }) 511 512 /* morenvy.com ê²ìì°½ 기본í ì¤í¸ ì¶ê° */ 513 jQuery( ".top_search .xans-layout-searchheader fieldset" ).each(function() { 514 var searchheader_text = jQuery(this).attr('title'); 515 jQuery('.xans-layout-searchheader #keyword').attr('placeholder',searchheader_text); 516 }); 517 518 /* morenvy.com ì¸ê¸° ê²ìì´ */ 519 var swiper_hot = new Swiper('.swiper_hot', { 520 direction: 'vertical', 521 loop: true, 522 roundLengths: true, 523 spaceBetween: 10, 524 speed:700, 525 observer: true, 526 observeParents: true, 527 autoplay: { 528 delay: 3000, 529 disableOnInteraction: false, 530 }, 531 }); 532 jQuery('.hot_keyword').hover( 533 function(){ 534 jQuery('.keyword_sub').stop().fadeIn(300); 535 }, 536 function(){ 537 jQuery('.keyword_sub').stop().fadeOut(300); 538 } 539 ) 540 jQuery('.hot_keyword .swiper_hot .swiper-slide span').each(function(index){ 541 jQuery(this).append(index + ". "); 542 }); 543 jQuery('.hot_keyword .swiper_hot .swiper-slide:last-child span').each(function(index){ 544 jQuery(this).text(1 + ". "); 545 }); 546 jQuery('.hot_keyword .keyword_sub a span').each(function(index){ 547 jQuery(this).append(index+1 + ". "); 548 }); 549 setTimeout(function(){ // í¬ë¡¬ë문ì ëë ì´ ë£ì´ì¤ì¼í¨ 550 jQuery(".hot_keyword").addClass("delay"); 551 }, 10); 552 553 /* morenvy.com í¤ë ë§ì´íì´ì§ í¸ë² */ 554 jQuery('#mheader .top_menu > div.top_login').hover( 555 function(){ 556 jQuery(this).find('.login_menu').stop().fadeIn(300); 557 }, 558 function(){ 559 jQuery(this).find('.login_menu').stop().fadeOut(300); 560 } 561 ) 562 /* morenvy.com í¤ë ì¸ê¸°ê²ìì´,ë§ì´íì´ì§ í¸ë² ì¤í¬ë¡¤ ë²ê·¸ í´ê²° */ 563 var f = true; 564 jQuery(window).scroll(function(){ // í¤ëì .fixed í´ëì¤ê° ììë,ììë를 ì¤í¬ë¡¤ì¤ íë²ì©ë§ ì²´í¬í¨ 565 if (jQuery('#comment_top').hasClass('fixed') && f == true){ 566 jQuery('.keyword_sub').css('display','none'); 567 jQuery('.login_menu').css('display','none'); 568 f = false;
569 } 570 else if (jQuery('#comment_top').hasClass('') && f == false) { 571 jQuery('.keyword_sub').css('display','none'); 572 jQuery('.login_menu').css('display','none'); 573 f = true; 574 } 575 }) 576 577 /* morenvy.com íë¨ íµë° */ 578 jQuery(window).scroll(function(){ 579 s_t = jQuery(this).scrollTop(); 580 if (s_t >= jQuery(window).height()){ // scrollTop ê°ì´ 100vh ëì¼ë©´ 581 jQuery('#right_quick .q_arrow_top').stop().fadeIn(200) 582 } else {jQuery('#right_quick .q_arrow_top').stop().fadeOut(200)} 583 584 }) 585 586 /* morenvy.com ìí ê³µíµ */ 587 setTimeout(function(){ 588 children_title(); //ì ë³´íì 589 brand_title(); 590 cal_percent (); //í ì¸ì¨ 591 noOpt(); //ìµì 미리보기 592 noCart(); //ì¥ë°êµ¬ë 593 },300); 594 595 jQuery(".btnMore").click( function( ){ 596 setTimeout(function(){ 597 rank(); 598 children_title(); 599 brand_title(); 600 cal_percent (); 601 noOpt(); 602 noCart(); 603 },600); 604 }); 605 606}); 607 608/* morenvy.com ìíì ë³´íì ë¸ëë */ 609function brand_title () { 610 jQuery('.ec-base-product .prdList > li').each(function(){ 611 if( jQuery(this).find("[rel='ë¸ëë']").length == 0 ){ 612 jQuery(this).find('.description').addClass('exist_b'); 613 } 614 }); 615} 616 617/* morenvy.com ìíì ë³´íì */ 618function children_title () { 619 jQuery('.description ul.spec li').not('.swiper_rel .description ul.spec li , .swiper_add .description ul.spec li').each(function(){ 620 var isTitle = jQuery(this).children('.title').children('span').text() 621 jQuery(this).attr('rel',isTitle) 622 }) 623} 624 625/* morenvy.com í ì¸ì¨ */ 626function cal_percent () { 627 jQuery("[rel='í매ê°']").each(function(){ 628 var m_custom = jQuery(this).siblings("[rel='ìë¹ìê°']").find('.m_item').text().replace(/[^0-9]/g,''); //ìë¹ìê° 629 var m_price = jQuery(this).find('.m_item').text().replace(/[^0-9]/g,''); // íë§¤ê° 630 var m_sale = ''; 631 if (jQuery(this).siblings("[rel='í ì¸í매ê°']").find('#span_product_price_sale').length != 0 ){ 632 m_sale = jQuery(this).siblings("[rel='í ì¸í매ê°']").find('#span_product_price_sale').html().split('<')[0].replace(/[^0-9]/g,''); //ìì¸íì´ì§ í ì¸íë§¤ê° 633 } else { 634 m_sale = jQuery(this).siblings("[rel='í ì¸í매ê°']").find('.m_item').text().replace(/[^0-9]/g,''); //ìíëª©ë¡ í ì¸íë§¤ê° 635 } 636 if( typeof m_sale == "undefined" || m_sale == "" || m_sale == null ) { //í ì¸í매ê°ê° ê³µë°±ì¼ ë 637 m_sale = m_price 638 } 639 640 641 /* í ì¸ì¨ ê³ì° */ 642 if((jQuery(this).siblings("[rel='í ì¸í매ê°']").length != 0 && m_price != m_sale) || (jQuery(this).siblings("[rel='ìë¹ìê°']").length == 0 && jQuery(this).siblings("[rel='í ì¸í매ê°']").length != 0 && m_sale != m_price)){ 643 //var c_sale = Math.round( ( m_custom - m_sale ) / m_custom * 100 ); //ìë¹ìê°ì í ì¸íë§¤ê° 644 var p_sale = Math.round( ( m_price - m_sale ) / m_price * 100 ); //í매ê°ì í ì¸íë§¤ê° 645 646 jQuery(this).parents('.box').find('.sale_box').text(p_sale + '%').insertAfter(jQuery(this)); // ìíëª©ë¡ í ì¸ì¨ ì¶ë ¥ 647 jQuery(this).parents('.xans-product-detail').find('.price_box .sale_box').show().text(p_sale + '%'); // ìì¸íì´ì§ í ì¸ì¨ ì¶ë ¥ 648 649 /* ìíëª©ë¡ */ 650 jQuery(this).addClass('through'); 651 jQuery(this).siblings("[rel='ìë¹ìê°']").hide(); 652 jQuery(this).siblings("[rel='í ì¸í매ê°']").addClass('msale'); 653 654 /* ìì¸íì´ì§ */ 655 jQuery(this).parents('.xans-product-detail').find('.sale').addClass('msale'); 656 jQuery(this).parents('.xans-product-detail').find('.price').addClass('through'); 657 jQuery(this).parents('.xans-product-detail').find('.custom').hide(); 658 659 } else if (jQuery(this).siblings("[rel='ìë¹ìê°']").length != 0){ 660 if (m_custom != m_price){ 661 var sale_cnt = Math.round( ( m_custom - m_price ) / m_custom * 100 ); //ìë¹ìê°ì íë§¤ê° 662 663 jQuery(this).parents('.box').find('.sale_box').text(sale_cnt + '%').insertAfter(jQuery(this).next()); // ìíëª©ë¡ í ì¸ì¨ ì¶ë ¥ 664 jQuery(this).parents('.xans-product-detail').find('.price_box .sale_box').show().text(sale_cnt + '%'); // ìì¸íì´ì§ í ì¸ì¨ ì¶ë ¥ 665 666 /* ìíëª©ë¡ */ 667 jQuery(this).addClass('msale'); 668 jQuery(this).siblings("[rel='ìë¹ìê°']").addClass('through'); 669 670 /* ìì¸íì´ì§ */ 671 jQuery(this).parents('.xans-product-detail').find('.price').addClass('msale'); 672 jQuery(this).parents('.xans-product-detail').find('.custom').addClass('through'); 673 } else { 674 /* ìíëª©ë¡ */ 675 jQuery(this).addClass('msale'); 676 jQuery(this).siblings("[rel='ìë¹ìê°']").hide(); 677 678 /* ìì¸íì´ì§ */ 679 jQuery(this).parents('.xans-product-detail').find('.custom').hide(); 680 } 681 } else { 682 jQuery(this).addClass('msale'); 683 } 684 }) 685}; 686 687/* morenvy.com ìµì 미리보기 ìì¼ë©´ 미ì¶ë ¥ */ 688function noOpt () { 689 jQuery('.wrap_icon_box .option').each(function(){ 690 if(jQuery(this).find('img').length == 0){ 691 jQuery(this).hide(); 692 } 693 }) 694} 695 696/* morenvy.com ì¥ë°êµ¬ë ì¬ì©ìí ì ì¨ê¹ */ 697function noCart () { 698 jQuery('.wrap_icon_box .m_cart').each(function(){ 699 if(jQuery(this).find('.ec-admin-icon').length == 0){ 700 jQuery(this).hide(); 701 } 702 }) 703} 704
vendor: 146,326 bytes, lines 705-717
705/** 706 * Swiper 6.8.4 707 * Most modern mobile touch slider and framework with hardware accelerated transitions 708 * https://swiperjs.com 709 * 710 * Copyright 2014-2021 Vladimir Kharlampidi 711 * 712 * Released under the MIT License 713 * 714 * Released on: August 23, 2021 715 */ 716 717!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,t){for(var a=0;a<t.length;a++){var i=t[a];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function t(){return(t=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var i in a)Object.prototype.hasOwnProperty.call(a,i)&&(e[i]=a[i])}return e}).apply(this,arguments)}function a(e){return null!==e&&"object"==typeof e&&"constructor"in e&&e.constructor===Object}function i(e,t){void 0===e&&(e={}),void 0===t&&(t={}),Object.keys(t).forEach((function(s){void 0===e[s]?e[s]=t[s]:a(t[s])&&a(e[s])&&Object.keys(t[s]).length>0&&i(e[s],t[s])}))}var s={body:{},addEventListener:function(){},removeEventListener:function(){},activeElement:{blur:function(){},nodeName:""},querySelector:function(){return null},querySelectorAll:function(){return[]},getElementById:function(){return null},createEvent:function(){return{initEvent:function(){}}},createElement:function(){return{children:[],childNodes:[],style:{},setAttribute:function(){},getElementsByTagName:function(){return[]}}},createElementNS:function(){return{}},importNode:function(){return null},location:{hash:"",host:"",hostname:"",href:"",origin:"",pathname:"",protocol:"",search:""}};function r(){var e="undefined"!=typeof document?document:{};return i(e,s),e}var n={document:s,navigator:{userAgent:""},location:{hash:"",host:"",hostname:"",href:"",origin:"",pathname:"",protocol:"",search:""},history:{replaceState:function(){},pushState:function(){},go:function(){},back:function(){}},CustomEvent:function(){return this},addEventListener:function(){},removeEventListener:function(){},getComputedStyle:function(){return{getPropertyValue:function(){return""}}},Image:function(){},Date:function(){},screen:{},setTimeout:function(){},clearTimeout:function(){},matchMedia:function(){return{}},requestAnimationFrame:function(e){return"undefined"==typeof setTimeout?(e(),null):setTimeout(e,0)},cancelAnimationFrame:function(e){"undefined"!=typeof setTimeout&&clearTimeout(e)}};function l(){var e="undefined"!=typeof window?window:{};return i(e,n),e}function o(e){return(o=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function d(e,t){return(d=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function p(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}function u(e,t,a){return(u=p()?Reflect.construct:function(e,t,a){var i=[null];i.push.apply(i,t);var s=new(Function.bind.apply(e,i));return a&&d(s,a.prototype),s}).apply(null,arguments)}function c(e){var t="function"==typeof Map?new Map:void 0;return(c=function(e){if(null===e||(a=e,-1===Function.toString.call(a).indexOf("[native code]")))return e;var a;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,i)}function i(){return u(e,arguments,o(this).constructor)}return i.prototype=Object.create(e.prototype,{constructor:{value:i,enumerable:!1,writable:!0,configurable:!0}}),d(i,e)})(e)}var h=function(e){var t,a;function i(t){var a,i,s;return a=e.call.apply(e,[this].concat(t))||this,i=function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(a),s=i.__proto__,Object.defineProperty(i,"__proto__",{get:function(){return s},set:function(e){s.__proto__=e}}),a}return a=e,(t=i).prototype=Object.create(a.prototype),t.prototype.constructor=t,t.__proto__=a,i}(c(Array));function v(e){void 0===e&&(e=[]);var t=[];return e.forEach((function(e){Array.isArray(e)?t.push.apply(t,v(e)):t.push(e)})),t}function f(e,t){return Array.prototype.filter.call(e,t)}function m(e,t){var a=l(),i=r(),s=[];if(!t&&e instanceof h)return e;if(!e)return new h(s);if("string"==typeof e){var n=e.trim();if(n.indexOf("<")>=0&&n.indexOf(">")>=0){var o="div";0===n.indexOf("<li")&&(o="ul"),0===n.indexOf("<tr")&&(o="tbody"),0!==n.indexOf("<td")&&0!==n.indexOf("<th")||(o="tr"),0===n.indexOf("<tbody")&&(o="table"),0===n.indexOf("<option")&&(o="select");var d=i.createElement(o);d.innerHTML=n;for(var p=0;p<d.childNodes.length;p+=1)s.push(d.childNodes[p])}else s=function(e,t){if("string"!=typeof e)return[e];for(var a=[],i=t.querySelectorAll(e),s=0;s<i.length;s+=1)a.push(i[s]);return a}(e.trim(),t||i)}else if(e.nodeType||e===a||e===i)s.push(e);else if(Array.isArray(e)){if(e instanceof h)return e;s=e}return new h(function(e){for(var t=[],a=0;a<e.length;a+=1)-1===t.indexOf(e[a])&&t.push(e[a]);return t}(s))}m.fn=h.prototype;var g,b,w,y={addClass:function(){for(var e=arguments.length,t=new Array(e),a=0;a<e;a++)t[a]=arguments[a];var i=v(t.map((function(e){return e.split(" ")})));return this.forEach((function(e){var t;(t=e.classList).add.apply(t,i)})),this},removeClass:function(){for(var e=arguments.length,t=new Array(e),a=0;a<e;a++)t[a]=arguments[a];var i=v(t.map((function(e){return e.split(" ")})));return this.forEach((function(e){var t;(t=e.classList).remove.apply(t,i)})),this},hasClass:function(){for(var e=arguments.length,t=new Array(e),a=0;a<e;a++)t[a]=arguments[a];var i=v(t.map((function(e){return e.split(" ")})));return f(this,(function(e){return i.filter((function(t){return e.classList.contains(t)})).length>0})).length>0},toggleClass:function(){for(var e=arguments.length,t=new Array(e),a=0;a<e;a++)t[a]=arguments[a];var i=v(t.map((function(e){return e.split(" ")})));this.forEach((function(e){i.forEach((function(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(var a=0;a<this.length;a+=1)if(2===arguments.length)this[a].setAttribute(e,t);else for(var i in e)this[a][i]=e[i],this[a].setAttribute(i,e[i]);return this},removeAttr:function(e){for(var t=0;t<this.length;t+=1)this[t].removeAttribute(e);return this},transform:function(e){for(var t=0;t<this.length;t+=1)this[t].style.transform=e;return this},transition:function(e){for(var 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),a=0;a<e;a++)t[a]=arguments[a];var i=t[0],s=t[1],r=t[2],n=t[3];function l(e){var t=e.target;if(t){var a=e.target.dom7EventData||[];if(a.indexOf(e)<0&&a.unshift(e),m(t).is(s))r.apply(t,a);else for(var i=m(t).parents(),n=0;n<i.length;n+=1)m(i[n]).is(s)&&r.apply(i[n],a)}}function o(e){var t=e&&e.target&&e.target.dom7EventData||[];t.indexOf(e)<0&&t.unshift(e),r.apply(this,t)}"function"==typeof t[1]&&(i=t[0],r=t[1],n=t[2],s=void 0),n||(n=!1);for(var d,p=i.split(" "),u=0;u<this.length;u+=1){var c=this[u];if(s)for(d=0;d<p.length;d+=1){var h=p[d];c.dom7LiveListeners||(c.dom7LiveListeners={}),c.dom7LiveListeners[h]||(c.dom7LiveListeners[h]=[]),c.dom7LiveListeners[h].push({listener:r,proxyListener:l}),c.addEventListener(h,l,n)}else for(d=0;d<p.length;d+=1){var v=p[d];c.dom7Listeners||(c.dom7Listeners={}),c.dom7Listeners[v]||(c.dom7Listeners[v]=[]),c.dom7Listeners[v].push({listener:r,proxyListener:o}),c.addEventListener(v,o,n)}}return this},off:function(){for(var e=arguments.length,t=new Array(e),a=0;a<e;a++)t[a]=arguments[a];var i=t[0],s=t[1],r=t[2],n=t[3];"function"==typeof t[1]&&(i=t[0],r=t[1],n=t[2],s=void 0),n||(n=!1);for(var l=i.split(" "),o=0;o<l.length;o+=1)for(var d=l[o],p=0;p<this.length;p+=1){var u=this[p],c=void 0;if(!s&&u.dom7Listeners?c=u.dom7Listeners[d]:s&&u.dom7LiveListeners&&(c=u.dom7LiveListeners[d]),c&&c.length)for(var h=c.length-1;h>=0;h-=1){var v=c[h];r&&v.listener===r||r&&v.listener&&v.listener.dom7proxy&&v.listener.dom7proxy===r?(u.removeEventListener(d,v.proxyListener,n),c.splice(h,1)):r||(u.removeEventListener(d,v.proxyListener,n),c.splice(h,1))}}return this},trigger:function(){for(var e=l(),t=arguments.length,a=new Array(t),i=0;i<t;i++)a[i]=arguments[i];for(var s=a[0].split(" "),r=a[1],n=0;n<s.length;n+=1)for(var o=s[n],d=0;d<this.length;d+=1){var p=this[d];if(e.CustomEvent){var u=new e.CustomEvent(o,{detail:r,bubbles:!0,cancelable:!0});p.dom7EventData=a.filter((function(e,t){return t>0})),p.dispatchEvent(u),p.dom7EventData=[],delete p.dom7EventData}}return this},transitionEnd:function(e){var t=this;return e&&t.on("transitionend",(function a(i){i.target===this&&(e.call(this,i),t.off("transitionend",a))})),this},outerWidth:function(e){if(this.length>0){if(e){var t=this.styles();return this[0].offsetWidth+parseFloat(t.getPropertyValue("margin-right"))+parseFloat(t.getPropertyValue("margin-left"))}return this[0].offsetWidth}return null},outerHeight:function(e){if(this.length>0){if(e){var t=this.styles();return this[0].offsetHeight+parseFloat(t.getPropertyValue("margin-top"))+parseFloat(t.getPropertyValue("margin-bottom"))}return this[0].offsetHeight}return null},styles:function(){var e=l();return this[0]?e.getComputedStyle(this[0],null):{}},offset:function(){if(this.length>0){var e=l(),t=r(),a=this[0],i=a.getBoundingClientRect(),s=t.body,n=a.clientTop||s.clientTop||0,o=a.clientLeft||s.clientLeft||0,d=a===e?e.scrollY:a.scrollTop,p=a===e?e.scrollX:a.scrollLeft;return{top:i.top+d-n,left:i.left+p-o}}return null},css:function(e,t){var a,i=l();if(1===arguments.length){if("string"!=typeof e){for(a=0;a<this.length;a+=1)for(var s in e)this[a].style[s]=e[s];return this}if(this[0])return i.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((function(t,a){e.apply(t,[t,a])})),this):this},html:function(e){if(void 0===e)return this[0]?this[0].innerHTML:null;for(var 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(var t=0;t<this.length;t+=1)this[t].textContent=e;return this},is:function(e){var t,a,i=l(),s=r(),n=this[0];if(!n||void 0===e)return!1;if("string"==typeof e){if(n.matches)return n.matches(e);if(n.webkitMatchesSelector)return n.webkitMatchesSelector(e);if(n.msMatchesSelector)return n.msMatchesSelector(e);for(t=m(e),a=0;a<t.length;a+=1)if(t[a]===n)return!0;return!1}if(e===s)return n===s;if(e===i)return n===i;if(e.nodeType||e instanceof h){for(t=e.nodeType?[e]:e,a=0;a<t.length;a+=1)if(t[a]===n)return!0;return!1}return!1},index:function(){var 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;var t=this.length;if(e>t-1)return m([]);if(e<0){var a=t+e;return m(a<0?[]:[this[a]])}return m([this[e]])},append:function(){for(var e,t=r(),a=0;a<arguments.length;a+=1){e=a<0||arguments.length<=a?void 0:arguments[a];for(var i=0;i<this.length;i+=1)if("string"==typeof e){var s=t.createElement("div");for(s.innerHTML=e;s.firstChild;)this[i].appendChild(s.firstChild)}else if(e instanceof h)for(var n=0;n<e.length;n+=1)this[i].appendChild(e[n]);else this[i].appendChild(e)}return this},prepend:function(e){var t,a,i=r();for(t=0;t<this.length;t+=1)if("string"==typeof e){var s=i.createElement("div");for(s.innerHTML=e,a=s.childNodes.length-1;a>=0;a-=1)this[t].insertBefore(s.childNodes[a],this[t].childNodes[0])}else if(e instanceof h)for(a=0;a<e.length;a+=1)this[t].insertBefore(e[a],this[t].childNodes[0]);else this[t].insertBefore(e,this[t].childNodes[0]);return this},next:function(e){return this.length>0?e?this[0].nextElementSibling&&m(this[0].nextElementSibling).is(e)?m([this[0].nextElementSibling]):m([]):this[0].nextElementSibling?m([this[0].nextElementSibling]):m([]):m([])},nextAll:function(e){var t=[],a=this[0];if(!a)return m([]);for(;a.nextElementSibling;){var i=a.nextElementSibling;e?m(i).is(e)&&t.push(i):t.push(i),a=i}return m(t)},prev:function(e){if(this.length>0){var t=this[0];return e?t.previousElementSibling&&m(t.previousElementSibling).is(e)?m([t.previousElementSibling]):m([]):t.previousElementSibling?m([t.previousElementSibling]):m([])}return m([])},prevAll:function(e){var t=[],a=this[0];if(!a)return m([]);for(;a.previousElementSibling;){var i=a.previousElementSibling;e?m(i).is(e)&&t.push(i):t.push(i),a=i}return m(t)},parent:function(e){for(var t=[],a=0;a<this.length;a+=1)null!==this[a].parentNode&&(e?m(this[a].parentNode).is(e)&&t.push(this[a].parentNode):t.push(this[a].parentNode));return m(t)},parents:function(e){for(var t=[],a=0;a<this.length;a+=1)for(var i=this[a].parentNode;i;)e?m(i).is(e)&&t.push(i):t.push(i),i=i.parentNode;return m(t)},closest:function(e){var t=this;return void 0===e?m([]):(t.is(e)||(t=t.parents(e).eq(0)),t)},find:function(e){for(var t=[],a=0;a<this.length;a+=1)for(var i=this[a].querySelectorAll(e),s=0;s<i.length;s+=1)t.push(i[s]);return m(t)},children:function(e){for(var t=[],a=0;a<this.length;a+=1)for(var i=this[a].children,s=0;s<i.length;s+=1)e&&!m(i[s]).is(e)||t.push(i[s]);return m(t)},filter:function(e){return m(f(this,e))},remove:function(){for(var e=0;e<this.length;e+=1)this[e].parentNode&&this[e].parentNode.removeChild(this[e]);return this}};function E(e,t){return void 0===t&&(t=0),setTimeout(e,t)}function x(){return Date.now()}function T(e,t){void 0===t&&(t="x");var a,i,s,r=l(),n=function(e){var t,a=l();return a.getComputedStyle&&(t=a.getComputedStyle(e,null)),!t&&e.currentStyle&&(t=e.currentStyle),t||(t=e.style),t}(e);return r.WebKitCSSMatrix?((i=n.transform||n.webkitTransform).split(",").length>6&&(i=i.split(", ").map((function(e){return e.replace(",",".")})).join(", ")),s=new r.WebKitCSSMatrix("none"===i?"":i)):a=(s=n.MozTransform||n.OTransform||n.MsTransform||n.msTransform||n.transform||n.getPropertyValue("transform").replace("translate(","matrix(1, 0, 0, 1,")).toString().split(","),"x"===t&&(i=r.WebKitCSSMatrix?s.m41:16===a.length?parseFloat(a[12]):parseFloat(a[4])),"y"===t&&(i=r.WebKitCSSMatrix?s.m42:16===a.length?parseFloat(a[13]):parseFloat(a[5])),i||0}function C(e){return"object"==typeof e&&null!==e&&e.constructor&&"Object"===Object.prototype.toString.call(e).slice(8,-1)}function S(e){return"undefined"!=typeof window&&void 0!==window.HTMLElement?e instanceof HTMLElement:e&&(1===e.nodeType||11===e.nodeType)}function M(){for(var e=Object(arguments.length<=0?void 0:arguments[0]),t=["__proto__","constructor","prototype"],a=1;a<arguments.length;a+=1){var i=a<0||arguments.length<=a?void 0:arguments[a];if(null!=i&&!S(i))for(var s=Object.keys(Object(i)).filter((function(e){return t.indexOf(e)<0})),r=0,n=s.length;r<n;r+=1){var l=s[r],o=Object.getOwnPropertyDescriptor(i,l);void 0!==o&&o.enumerable&&(C(e[l])&&C(i[l])?i[l].__swiper__?e[l]=i[l]:M(e[l],i[l]):!C(e[l])&&C(i[l])?(e[l]={},i[l].__swiper__?e[l]=i[l]:M(e[l],i[l])):e[l]=i[l])}}return e}function z(e,t){Object.keys(t).forEach((function(a){C(t[a])&&Object.keys(t[a]).forEach((function(i){"function"==typeof t[a][i]&&(t[a][i]=t[a][i].bind(e))})),e[a]=t[a]}))}function P(e){return void 0===e&&(e=""),"."+e.trim().replace(/([\.:!\/])/g,"\\$1").replace(/ /g,".")}function k(e,t,a,i){var s=r();return a&&Object.keys(i).forEach((function(a){if(!t[a]&&!0===t.auto){var r=s.createElement("div");r.className=i[a],e.append(r),t[a]=r}})),t}function $(){return g||(g=function(){var e=l(),t=r();return{touch:!!("ontouchstart"in e||e.DocumentTouch&&t instanceof e.DocumentTouch),pointerEvents:!!e.PointerEvent&&"maxTouchPoints"in e.navigator&&e.navigator.maxTouchPoints>=0,observer:"MutationObserver"in e||"WebkitMutationObserver"in e,passiveListener:function(){var t=!1;try{var a=Object.defineProperty({},"passive",{get:function(){t=!0}});e.addEventListener("testPassiveListener",null,a)}catch(e){}return t}(),gestures:"ongesturestart"in e}}()),g}function L(e){return void 0===e&&(e={}),b||(b=function(e){var t=(void 0===e?{}:e).userAgent,a=$(),i=l(),s=i.navigator.platform,r=t||i.navigator.userAgent,n={ios:!1,android:!1},o=i.screen.width,d=i.screen.height,p=r.match(/(Android);?[\s\/]+([\d.]+)?/),u=r.match(/(iPad).*OS\s([\d_]+)/),c=r.match(/(iPod)(.*OS\s([\d_]+))?/),h=!u&&r.match(/(iPhone\sOS|iOS)\s([\d_]+)/),v="Win32"===s,f="MacIntel"===s;return!u&&f&&a.touch&&["1024x1366","1366x1024","834x1194","1194x834","834x1112","1112x834","768x1024","1024x768","820x1180","1180x820","810x1080","1080x810"].indexOf(o+"x"+d)>=0&&((u=r.match(/(Version)\/([\d.]+)/))||(u=[0,1,"13_0_0"]),f=!1),p&&!v&&(n.os="android",n.android=!0),(u||h||c)&&(n.os="ios",n.ios=!0),n}(e)),b}function I(){return w||(w=function(){var e,t=l();return{isEdge:!!t.navigator.userAgent.match(/Edge/g),isSafari:(e=t.navigator.userAgent.toLowerCase(),e.indexOf("safari")>=0&&e.indexOf("chrome")<0&&e.indexOf("android")<0),isWebView:/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(t.navigator.userAgent)}}()),w}Object.keys(y).forEach((function(e){Object.defineProperty(m.fn,e,{value:y[e],writable:!0})}));var O={name:"resize",create:function(){var e=this;M(e,{resize:{observer:null,createObserver:function(){e&&!e.destroyed&&e.initialized&&(e.resize.observer=new ResizeObserver((function(t){var a=e.width,i=e.height,s=a,r=i;t.forEach((function(t){var a=t.contentBoxSize,i=t.contentRect,n=t.target;n&&n!==e.el||(s=i?i.width:(a[0]||a).inlineSize,r=i?i.height:(a[0]||a).blockSize)})),s===a&&r===i||e.resize.resizeHandler()})),e.resize.observer.observe(e.el))},removeObserver:function(){e.resize.observer&&e.resize.observer.unobserve&&e.el&&(e.resize.observer.unobserve(e.el),e.resize.observer=null)},resizeHandler:function(){e&&!e.destroyed&&e.initialized&&(e.emit("beforeResize"),e.emit("resize"))},orientationChangeHandler:function(){e&&!e.destroyed&&e.initialized&&e.emit("orientationchange")}}})},on:{init:function(e){var t=l();e.params.resizeObserver&&void 0!==l().ResizeObserver?e.resize.createObserver():(t.addEventListener("resize",e.resize.resizeHandler),t.addEventListener("orientationchange",e.resize.orientationChangeHandler))},destroy:function(e){var t=l();e.resize.removeObserver(),t.removeEventListener("resize",e.resize.resizeHandler),t.removeEventListener("orientationchange",e.resize.orientationChangeHandler)}}},A={attach:function(e,t){void 0===t&&(t={});var a=l(),i=this,s=new(a.MutationObserver||a.WebkitMutationObserver)((function(e){if(1!==e.length){var t=function(){i.emit("observerUpdate",e[0])};a.requestAnimationFrame?a.requestAnimationFrame(t):a.setTimeout(t,0)}else i.emit("observerUpdate",e[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}),i.observer.observers.push(s)},init:function(){var e=this;if(e.support.observer&&e.params.observer){if(e.params.observeParents)for(var t=e.$el.parents(),a=0;a<t.length;a+=1)e.observer.attach(t[a]);e.observer.attach(e.$el[0],{childList:e.params.observeSlideChildren}),e.observer.attach(e.$wrapperEl[0],{attributes:!1})}},destroy:function(){this.observer.observers.forEach((function(e){e.disconnect()})),this.observer.observers=[]}},D={name:"observer",params:{observer:!1,observeParents:!1,observeSlideChildren:!1},create:function(){z(this,{observer:t({},A,{observers:[]})})},on:{init:function(e){e.observer.init()},destroy:function(e){e.observer.destroy()}}};function N(e){var t=this,a=r(),i=l(),s=t.touchEventsData,n=t.params,o=t.touches;if(t.enabled&&(!t.animating||!n.preventInteractionOnTransition)){var d=e;d.originalEvent&&(d=d.originalEvent);var p=m(d.target);if(("wrapper"!==n.touchEventsTarget||p.closest(t.wrapperEl).length)&&(s.isTouchEvent="touchstart"===d.type,(s.isTouchEvent||!("which"in d)||3!==d.which)&&!(!s.isTouchEvent&&"button"in d&&d.button>0||s.isTouched&&s.isMoved))){!!n.noSwipingClass&&""!==n.noSwipingClass&&d.target&&d.target.shadowRoot&&e.path&&e.path[0]&&(p=m(e.path[0]));var u=n.noSwipingSelector?n.noSwipingSelector:"."+n.noSwipingClass,c=!(!d.target||!d.target.shadowRoot);if(n.noSwiping&&(c?function(e,t){return void 0===t&&(t=this),function t(a){return a&&a!==r()&&a!==l()?(a.assignedSlot&&(a=a.assignedSlot),a.closest(e)||t(a.getRootNode().host)):null}(t)}(u,d.target):p.closest(u)[0]))t.allowClick=!0;else if(!n.swipeHandler||p.closest(n.swipeHandler)[0]){o.currentX="touchstart"===d.type?d.targetTouches[0].pageX:d.pageX,o.currentY="touchstart"===d.type?d.targetTouches[0].pageY:d.pageY;var h=o.currentX,v=o.currentY,f=n.edgeSwipeDetection||n.iOSEdgeSwipeDetection,g=n.edgeSwipeThreshold||n.iOSEdgeSwipeThreshold;if(f&&(h<=g||h>=i.innerWidth-g)){if("prevent"!==f)return;e.preventDefault()}if(M(s,{isTouched:!0,isMoved:!1,allowTouchCallbacks:!0,isScrolling:void 0,startMoving:void 0}),o.startX=h,o.startY=v,s.touchStartTime=x(),t.allowClick=!0,t.updateSize(),t.swipeDirection=void 0,n.threshold>0&&(s.allowThresholdMove=!1),"touchstart"!==d.type){var b=!0;p.is(s.focusableElements)&&(b=!1),a.activeElement&&m(a.activeElement).is(s.focusableElements)&&a.activeElement!==p[0]&&a.activeElement.blur();var w=b&&t.allowTouchMove&&n.touchStartPreventDefault;!n.touchStartForcePreventDefault&&!w||p[0].isContentEditable||d.preventDefault()}t.emit("touchStart",d)}}}}function G(e){var t=r(),a=this,i=a.touchEventsData,s=a.params,n=a.touches,l=a.rtlTranslate;if(a.enabled){var o=e;if(o.originalEvent&&(o=o.originalEvent),i.isTouched){if(!i.isTouchEvent||"touchmove"===o.type){var d="touchmove"===o.type&&o.targetTouches&&(o.targetTouches[0]||o.changedTouches[0]),p="touchmove"===o.type?d.pageX:o.pageX,u="touchmove"===o.type?d.pageY:o.pageY;if(o.preventedByNestedSwiper)return n.startX=p,void(n.startY=u);if(!a.allowTouchMove)return a.allowClick=!1,void(i.isTouched&&(M(n,{startX:p,startY:u,currentX:p,currentY:u}),i.touchStartTime=x()));if(i.isTouchEvent&&s.touchReleaseOnEdges&&!s.loop)if(a.isVertical()){if(u<n.startY&&a.translate<=a.maxTranslate()||u>n.startY&&a.translate>=a.minTranslate())return i.isTouched=!1,void(i.isMoved=!1)}else if(p<n.startX&&a.translate<=a.maxTranslate()||p>n.startX&&a.translate>=a.minTranslate())return;if(i.isTouchEvent&&t.activeElement&&o.target===t.activeElement&&m(o.target).is(i.focusableElements))return i.isMoved=!0,void(a.allowClick=!1);if(i.allowTouchCallbacks&&a.emit("touchMove",o),!(o.targetTouches&&o.targetTouches.length>1)){n.currentX=p,n.currentY=u;var c=n.currentX-n.startX,h=n.currentY-n.startY;if(!(a.params.threshold&&Math.sqrt(Math.pow(c,2)+Math.pow(h,2))<a.params.threshold)){var v;if(void 0===i.isScrolling)a.isHorizontal()&&n.currentY===n.startY||a.isVertical()&&n.currentX===n.startX?i.isScrolling=!1:c*c+h*h>=25&&(v=180*Math.atan2(Math.abs(h),Math.abs(c))/Math.PI,i.isScrolling=a.isHorizontal()?v>s.touchAngle:90-v>s.touchAngle);if(i.isScrolling&&a.emit("touchMoveOpposite",o),void 0===i.startMoving&&(n.currentX===n.startX&&n.currentY===n.startY||(i.startMoving=!0)),i.isScrolling)i.isTouched=!1;else if(i.startMoving){a.allowClick=!1,!s.cssMode&&o.cancelable&&o.preventDefault(),s.touchMoveStopPropagation&&!s.nested&&o.stopPropagation(),i.isMoved||(s.loop&&a.loopFix(),i.startTranslate=a.getTranslate(),a.setTransition(0),a.animating&&a.$wrapperEl.trigger("webkitTransitionEnd transitionend"),i.allowMomentumBounce=!1,!s.grabCursor||!0!==a.allowSlideNext&&!0!==a.allowSlidePrev||a.setGrabCursor(!0),a.emit("sliderFirstMove",o)),a.emit("sliderMove",o),i.isMoved=!0;var f=a.isHorizontal()?c:h;n.diff=f,f*=s.touchRatio,l&&(f=-f),a.swipeDirection=f>0?"prev":"next",i.currentTranslate=f+i.startTranslate;var g=!0,b=s.resistanceRatio;if(s.touchReleaseOnEdges&&(b=0),f>0&&i.currentTranslate>a.minTranslate()?(g=!1,s.resistance&&(i.currentTranslate=a.minTranslate()-1+Math.pow(-a.minTranslate()+i.startTranslate+f,b))):f<0&&i.currentTranslate<a.maxTranslate()&&(g=!1,s.resistance&&(i.currentTranslate=a.maxTranslate()+1-Math.pow(a.maxTranslate()-i.startTranslate-f,b))),g&&(o.preventedByNestedSwiper=!0),!a.allowSlideNext&&"next"===a.swipeDirection&&i.currentTranslate<i.startTranslate&&(i.currentTranslate=i.startTranslate),!a.allowSlidePrev&&"prev"===a.swipeDirection&&i.currentTranslate>i.startTranslate&&(i.currentTranslate=i.startTranslate),a.allowSlidePrev||a.allowSlideNext||(i.currentTranslate=i.startTranslate),s.threshold>0){if(!(Math.abs(f)>s.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=a.isHorizontal()?n.currentX-n.startX:n.currentY-n.startY)}s.followFinger&&!s.cssMode&&((s.freeMode||s.watchSlidesProgress||s.watchSlidesVisibility)&&(a.updateActiveIndex(),a.updateSlidesClasses()),s.freeMode&&(0===i.velocities.length&&i.velocities.push({position:n[a.isHorizontal()?"startX":"startY"],time:i.touchStartTime}),i.velocities.push({position:n[a.isHorizontal()?"currentX":"currentY"],time:x()})),a.updateProgress(i.currentTranslate),a.setTranslate(i.currentTranslate))}}}}}else i.startMoving&&i.isScrolling&&a.emit("touchMoveOpposite",o)}}function B(e){var t=this,a=t.touchEventsData,i=t.params,s=t.touches,r=t.rtlTranslate,n=t.$wrapperEl,l=t.slidesGrid,o=t.snapGrid;if(t.enabled){var d=e;if(d.originalEvent&&(d=d.originalEvent),a.allowTouchCallbacks&&t.emit("touchEnd",d),a.allowTouchCallbacks=!1,!a.isTouched)return a.isMoved&&i.grabCursor&&t.setGrabCursor(!1),a.isMoved=!1,void(a.startMoving=!1);i.grabCursor&&a.isMoved&&a.isTouched&&(!0===t.allowSlideNext||!0===t.allowSlidePrev)&&t.setGrabCursor(!1);var p,u=x(),c=u-a.touchStartTime;if(t.allowClick&&(t.updateClickedSlide(d),t.emit("tap click",d),c<300&&u-a.lastClickTime<300&&t.emit("doubleTap doubleClick",d)),a.lastClickTime=x(),E((function(){t.destroyed||(t.allowClick=!0)})),!a.isTouched||!a.isMoved||!t.swipeDirection||0===s.diff||a.currentTranslate===a.startTranslate)return a.isTouched=!1,a.isMoved=!1,void(a.startMoving=!1);if(a.isTouched=!1,a.isMoved=!1,a.startMoving=!1,p=i.followFinger?r?t.translate:-t.translate:-a.currentTranslate,!i.cssMode)if(i.freeMode){if(p<-t.minTranslate())return void t.slideTo(t.activeIndex);if(p>-t.maxTranslate())return void(t.slides.length<o.length?t.slideTo(o.length-1):t.slideTo(t.slides.length-1));if(i.freeModeMomentum){if(a.velocities.length>1){var h=a.velocities.pop(),v=a.velocities.pop(),f=h.position-v.position,m=h.time-v.time;t.velocity=f/m,t.velocity/=2,Math.abs(t.velocity)<i.freeModeMinimumVelocity&&(t.velocity=0),(m>150||x()-h.time>300)&&(t.velocity=0)}else t.velocity=0;t.velocity*=i.freeModeMomentumVelocityRatio,a.velocities.length=0;var g=1e3*i.freeModeMomentumRatio,b=t.velocity*g,w=t.translate+b;r&&(w=-w);var y,T,C=!1,S=20*Math.abs(t.velocity)*i.freeModeMomentumBounceRatio;if(w<t.maxTranslate())i.freeModeMomentumBounce?(w+t.maxTranslate()<-S&&(w=t.maxTranslate()-S),y=t.maxTranslate(),C=!0,a.allowMomentumBounce=!0):w=t.maxTranslate(),i.loop&&i.centeredSlides&&(T=!0);else if(w>t.minTranslate())i.freeModeMomentumBounce?(w-t.minTranslate()>S&&(w=t.minTranslate()+S),y=t.minTranslate(),C=!0,a.allowMomentumBounce=!0):w=t.minTranslate(),i.loop&&i.centeredSlides&&(T=!0);else if(i.freeModeSticky){for(var M,z=0;z<o.length;z+=1)if(o[z]>-w){M=z;break}w=-(w=Math.abs(o[M]-w)<Math.abs(o[M-1]-w)||"next"===t.swipeDirection?o[M]:o[M-1])}if(T&&t.once("transitionEnd",(function(){t.loopFix()})),0!==t.velocity){if(g=r?Math.abs((-w-t.translate)/t.velocity):Math.abs((w-t.translate)/t.velocity),i.freeModeSticky){var P=Math.abs((r?-w:w)-t.translate),k=t.slidesSizesGrid[t.activeIndex];g=P<k?i.speed:P<2*k?1.5*i.speed:2.5*i.speed}}else if(i.freeModeSticky)return void t.slideToClosest();i.freeModeMomentumBounce&&C?(t.updateProgress(y),t.setTransition(g),t.setTranslate(w),t.transitionStart(!0,t.swipeDirection),t.animating=!0,n.transitionEnd((function(){t&&!t.destroyed&&a.allowMomentumBounce&&(t.emit("momentumBounce"),t.setTransition(i.speed),setTimeout((function(){t.setTranslate(y),n.transitionEnd((function(){t&&!t.destroyed&&t.transitionEnd()}))}),0))}))):t.velocity?(t.updateProgress(w),t.setTransition(g),t.setTranslate(w),t.transitionStart(!0,t.swipeDirection),t.animating||(t.animating=!0,n.transitionEnd((function(){t&&!t.destroyed&&t.transitionEnd()})))):(t.emit("_freeModeNoMomentumRelease"),t.updateProgress(w)),t.updateActiveIndex(),t.updateSlidesClasses()}else{if(i.freeModeSticky)return void t.slideToClosest();i.freeMode&&t.emit("_freeModeNoMomentumRelease")}(!i.freeModeMomentum||c>=i.longSwipesMs)&&(t.updateProgress(),t.updateActiveIndex(),t.updateSlidesClasses())}else{for(var $=0,L=t.slidesSizesGrid[0],I=0;I<l.length;I+=I<i.slidesPerGroupSkip?1:i.slidesPerGroup){var O=I<i.slidesPerGroupSkip-1?1:i.slidesPerGroup;void 0!==l[I+O]?p>=l[I]&&p<l[I+O]&&($=I,L=l[I+O]-l[I]):p>=l[I]&&($=I,L=l[l.length-1]-l[l.length-2])}var A=(p-l[$])/L,D=$<i.slidesPerGroupSkip-1?1:i.slidesPerGroup;if(c>i.longSwipesMs){if(!i.longSwipes)return void t.slideTo(t.activeIndex);"next"===t.swipeDirection&&(A>=i.longSwipesRatio?t.slideTo($+D):t.slideTo($)),"prev"===t.swipeDirection&&(A>1-i.longSwipesRatio?t.slideTo($+D):t.slideTo($))}else{if(!i.shortSwipes)return void t.slideTo(t.activeIndex);t.navigation&&(d.target===t.navigation.nextEl||d.target===t.navigation.prevEl)?d.target===t.navigation.nextEl?t.slideTo($+D):t.slideTo($):("next"===t.swipeDirection&&t.slideTo($+D),"prev"===t.swipeDirection&&t.slideTo($))}}}}function H(){var e=this,t=e.params,a=e.el;if(!a||0!==a.offsetWidth){t.breakpoints&&e.setBreakpoint();var i=e.allowSlideNext,s=e.allowSlidePrev,r=e.snapGrid;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=s,e.allowSlideNext=i,e.params.watchOverflow&&r!==e.snapGrid&&e.checkOverflow()}}function R(e){var t=this;t.enabled&&(t.allowClick||(t.params.preventClicks&&e.preventDefault(),t.params.preventClicksPropagation&&t.animating&&(e.stopPropagation(),e.stopImmediatePropagation())))}function X(){var e=this,t=e.wrapperEl,a=e.rtlTranslate;if(e.enabled){e.previousTranslate=e.translate,e.isHorizontal()?e.translate=a?t.scrollWidth-t.offsetWidth-t.scrollLeft:-t.scrollLeft:e.translate=-t.scrollTop,-0===e.translate&&(e.translate=0),e.updateActiveIndex(),e.updateSlidesClasses();var i=e.maxTranslate()-e.minTranslate();(0===i?0:(e.translate-e.minTranslate())/i)!==e.progress&&e.updateProgress(a?-e.translate:e.translate),e.emit("setTranslate",e.translate,!1)}}var Y=!1;function V(){}var W={init:!0,direction:"horizontal",touchEventsTarget:"container",initialSlide:0,speed:300,cssMode:!1,updateOnWindowResize:!0,resizeObserver:!1,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,freeMode:!1,freeModeMomentum:!0,freeModeMomentumRatio:1,freeModeMomentumBounce:!0,freeModeMomentumBounceRatio:1,freeModeMomentumVelocityRatio:1,freeModeSticky:!1,freeModeMinimumVelocity:.02,autoHeight:!1,setWrapperSize:!1,virtualTranslate:!1,effect:"slide",breakpoints:void 0,breakpointsBase:"window",spaceBetween:0,slidesPerView:1,slidesPerColumn:1,slidesPerColumnFill:"column",slidesPerGroup:1,slidesPerGroupSkip:0,centeredSlides:!1,centeredSlidesBounds:!1,slidesOffsetBefore:0,slidesOffsetAfter:0,normalizeSlideIndex:!0,centerInsufficientSlides:!1,watchOverflow:!1,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,watchSlidesVisibility:!1,grabCursor:!1,preventClicks:!0,preventClicksPropagation:!0,slideToClickedSlide:!1,preloadImages:!0,updateOnImagesReady:!0,loop:!1,loopAdditionalSlides:0,loopedSlides:null,loopFillGroupWithBlank:!1,loopPreventsSlide:!0,allowSlidePrev:!0,allowSlideNext:!0,swipeHandler:null,noSwiping:!0,noSwipingClass:"swiper-no-swiping",noSwipingSelector:null,passiveListeners:!0,containerModifierClass:"swiper-container-",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},F={modular:{useParams:function(e){var t=this;t.modules&&Object.keys(t.modules).forEach((function(a){var i=t.modules[a];i.params&&M(e,i.params)}))},useModules:function(e){void 0===e&&(e={});var t=this;t.modules&&Object.keys(t.modules).forEach((function(a){var i=t.modules[a],s=e[a]||{};i.on&&t.on&&Object.keys(i.on).forEach((function(e){t.on(e,i.on[e])})),i.create&&i.create.bind(t)(s)}))}},eventsEmitter:{on:function(e,t,a){var i=this;if("function"!=typeof t)return i;var s=a?"unshift":"push";return e.split(" ").forEach((function(e){i.eventsListeners[e]||(i.eventsListeners[e]=[]),i.eventsListeners[e][s](t)})),i},once:function(e,t,a){var i=this;if("function"!=typeof t)return i;function s(){i.off(e,s),s.__emitterProxy&&delete s.__emitterProxy;for(var a=arguments.length,r=new Array(a),n=0;n<a;n++)r[n]=arguments[n];t.apply(i,r)}return s.__emitterProxy=t,i.on(e,s,a)},onAny:function(e,t){var a=this;if("function"!=typeof e)return a;var i=t?"unshift":"push";return a.eventsAnyListeners.indexOf(e)<0&&a.eventsAnyListeners[i](e),a},offAny:function(e){var t=this;if(!t.eventsAnyListeners)return t;var a=t.eventsAnyListeners.indexOf(e);return a>=0&&t.eventsAnyListeners.splice(a,1),t},off:function(e,t){var a=this;return a.eventsListeners?(e.split(" ").forEach((function(e){void 0===t?a.eventsListeners[e]=[]:a.eventsListeners[e]&&a.eventsListeners[e].forEach((function(i,s){(i===t||i.__emitterProxy&&i.__emitterProxy===t)&&a.eventsListeners[e].splice(s,1)}))})),a):a},emit:function(){var e,t,a,i=this;if(!i.eventsListeners)return i;for(var s=arguments.length,r=new Array(s),n=0;n<s;n++)r[n]=arguments[n];"string"==typeof r[0]||Array.isArray(r[0])?(e=r[0],t=r.slice(1,r.length),a=i):(e=r[0].events,t=r[0].data,a=r[0].context||i),t.unshift(a);var l=Array.isArray(e)?e:e.split(" ");return l.forEach((function(e){i.eventsAnyListeners&&i.eventsAnyListeners.length&&i.eventsAnyListeners.forEach((function(i){i.apply(a,[e].concat(t))})),i.eventsListeners&&i.eventsListeners[e]&&i.eventsListeners[e].forEach((function(e){e.apply(a,t)}))})),i}},update:{updateSize:function(){var e,t,a=this,i=a.$el;e=void 0!==a.params.width&&null!==a.params.width?a.params.width:i[0].clientWidth,t=void 0!==a.params.height&&null!==a.params.height?a.params.height:i[0].clientHeight,0===e&&a.isHorizontal()||0===t&&a.isVertical()||(e=e-parseInt(i.css("padding-left")||0,10)-parseInt(i.css("padding-right")||0,10),t=t-parseInt(i.css("padding-top")||0,10)-parseInt(i.css("padding-bottom")||0,10),Number.isNaN(e)&&(e=0),Number.isNaN(t)&&(t=0),M(a,{width:e,height:t,size:a.isHorizontal()?e:t}))},updateSlides:function(){var 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 a(e,a){return parseFloat(e.getPropertyValue(t(a))||0)}var i=e.params,s=e.$wrapperEl,r=e.size,n=e.rtlTranslate,l=e.wrongRTL,o=e.virtual&&i.virtual.enabled,d=o?e.virtual.slides.length:e.slides.length,p=s.children("."+e.params.slideClass),u=o?e.virtual.slides.length:p.length,c=[],h=[],v=[],f=i.slidesOffsetBefore;"function"==typeof f&&(f=i.slidesOffsetBefore.call(e));var m=i.slidesOffsetAfter;"function"==typeof m&&(m=i.slidesOffsetAfter.call(e));var g=e.snapGrid.length,b=e.slidesGrid.length,w=i.spaceBetween,y=-f,E=0,x=0;if(void 0!==r){var T,C;"string"==typeof w&&w.indexOf("%")>=0&&(w=parseFloat(w.replace("%",""))/100*r),e.virtualSize=-w,n?p.css({marginLeft:"",marginBottom:"",marginTop:""}):p.css({marginRight:"",marginBottom:"",marginTop:""}),i.slidesPerColumn>1&&(T=Math.floor(u/i.slidesPerColumn)===u/e.params.slidesPerColumn?u:Math.ceil(u/i.slidesPerColumn)*i.slidesPerColumn,"auto"!==i.slidesPerView&&"row"===i.slidesPerColumnFill&&(T=Math.max(T,i.slidesPerView*i.slidesPerColumn)));for(var S,z,P,k=i.slidesPerColumn,$=T/k,L=Math.floor(u/i.slidesPerColumn),I=0;I<u;I+=1){C=0;var O=p.eq(I);if(i.slidesPerColumn>1){var A=void 0,D=void 0,N=void 0;if("row"===i.slidesPerColumnFill&&i.slidesPerGroup>1){var G=Math.floor(I/(i.slidesPerGroup*i.slidesPerColumn)),B=I-i.slidesPerColumn*i.slidesPerGroup*G,H=0===G?i.slidesPerGroup:Math.min(Math.ceil((u-G*k*i.slidesPerGroup)/k),i.slidesPerGroup);A=(D=B-(N=Math.floor(B/H))*H+G*i.slidesPerGroup)+N*T/k,O.css({"-webkit-box-ordinal-group":A,"-moz-box-ordinal-group":A,"-ms-flex-order":A,"-webkit-order":A,order:A})}else"column"===i.slidesPerColumnFill?(N=I-(D=Math.floor(I/k))*k,(D>L||D===L&&N===k-1)&&(N+=1)>=k&&(N=0,D+=1)):D=I-(N=Math.floor(I/$))*$;O.css(t("margin-top"),0!==N?i.spaceBetween&&i.spaceBetween+"px":"")}if("none"!==O.css("display")){if("auto"===i.slidesPerView){var R=getComputedStyle(O[0]),X=O[0].style.transform,Y=O[0].style.webkitTransform;if(X&&(O[0].style.transform="none"),Y&&(O[0].style.webkitTransform="none"),i.roundLengths)C=e.isHorizontal()?O.outerWidth(!0):O.outerHeight(!0);else{var V=a(R,"width"),W=a(R,"padding-left"),F=a(R,"padding-right"),_=a(R,"margin-left"),q=a(R,"margin-right"),j=R.getPropertyValue("box-sizing");if(j&&"border-box"===j)C=V+_+q;else{var U=O[0],K=U.clientWidth;C=V+W+F+_+q+(U.offsetWidth-K)}}X&&(O[0].style.transform=X),Y&&(O[0].style.webkitTransform=Y),i.roundLengths&&(C=Math.floor(C))}else C=(r-(i.slidesPerView-1)*w)/i.slidesPerView,i.roundLengths&&(C=Math.floor(C)),p[I]&&(p[I].style[t("width")]=C+"px");p[I]&&(p[I].swiperSlideSize=C),v.push(C),i.centeredSlides?(y=y+C/2+E/2+w,0===E&&0!==I&&(y=y-r/2-w),0===I&&(y=y-r/2-w),Math.abs(y)<.001&&(y=0),i.roundLengths&&(y=Math.floor(y)),x%i.slidesPerGroup==0&&c.push(y),h.push(y)):(i.roundLengths&&(y=Math.floor(y)),(x-Math.min(e.params.slidesPerGroupSkip,x))%e.params.slidesPerGroup==0&&c.push(y),h.push(y),y=y+C+w),e.virtualSize+=C+w,E=C,x+=1}}if(e.virtualSize=Math.max(e.virtualSize,r)+m,n&&l&&("slide"===i.effect||"coverflow"===i.effect)&&s.css({width:e.virtualSize+i.spaceBetween+"px"}),i.setWrapperSize)s.css(((z={})[t("width")]=e.virtualSize+i.spaceBetween+"px",z));if(i.slidesPerColumn>1)if(e.virtualSize=(C+i.spaceBetween)*T,e.virtualSize=Math.ceil(e.virtualSize/i.slidesPerColumn)-i.spaceBetween,s.css(((P={})[t("width")]=e.virtualSize+i.spaceBetween+"px",P)),i.centeredSlides){S=[];for(var Z=0;Z<c.length;Z+=1){var J=c[Z];i.roundLengths&&(J=Math.floor(J)),c[Z]<e.virtualSize+c[0]&&S.push(J)}c=S}if(!i.centeredSlides){S=[];for(var Q=0;Q<c.length;Q+=1){var ee=c[Q];i.roundLengths&&(ee=Math.floor(ee)),c[Q]<=e.virtualSize-r&&S.push(ee)}c=S,Math.floor(e.virtualSize-r)-Math.floor(c[c.length-1])>1&&c.push(e.virtualSize-r)}if(0===c.length&&(c=[0]),0!==i.spaceBetween){var te,ae=e.isHorizontal()&&n?"marginLeft":t("marginRight");p.filter((function(e,t){return!i.cssMode||t!==p.length-1})).css(((te={})[ae]=w+"px",te))}if(i.centeredSlides&&i.centeredSlidesBounds){var ie=0;v.forEach((function(e){ie+=e+(i.spaceBetween?i.spaceBetween:0)}));var se=(ie-=i.spaceBetween)-r;c=c.map((function(e){return e<0?-f:e>se?se+m:e}))}if(i.centerInsufficientSlides){var re=0;if(v.forEach((function(e){re+=e+(i.spaceBetween?i.spaceBetween:0)})),(re-=i.spaceBetween)<r){var ne=(r-re)/2;c.forEach((function(e,t){c[t]=e-ne})),h.forEach((function(e,t){h[t]=e+ne}))}}M(e,{slides:p,snapGrid:c,slidesGrid:h,slidesSizesGrid:v}),u!==d&&e.emit("slidesLengthChange"),c.length!==g&&(e.params.watchOverflow&&e.checkOverflow(),e.emit("snapGridLengthChange")),h.length!==b&&e.emit("slidesGridLengthChange"),(i.watchSlidesProgress||i.watchSlidesVisibility)&&e.updateSlidesOffset()}},updateAutoHeight:function(e){var t,a=this,i=[],s=a.virtual&&a.params.virtual.enabled,r=0;"number"==typeof e?a.setTransition(e):!0===e&&a.setTransition(a.params.speed);var n=function(e){return s?a.slides.filter((function(t){return parseInt(t.getAttribute("data-swiper-slide-index"),10)===e}))[0]:a.slides.eq(e)[0]};if("auto"!==a.params.slidesPerView&&a.params.slidesPerView>1)if(a.params.centeredSlides)a.visibleSlides.each((function(e){i.push(e)}));else for(t=0;t<Math.ceil(a.params.slidesPerView);t+=1){var l=a.activeIndex+t;if(l>a.slides.length&&!s)break;i.push(n(l))}else i.push(n(a.activeIndex));for(t=0;t<i.length;t+=1)if(void 0!==i[t]){var o=i[t].offsetHeight;r=o>r?o:r}r&&a.$wrapperEl.css("height",r+"px")},updateSlidesOffset:function(){for(var e=this.slides,t=0;t<e.length;t+=1)e[t].swiperSlideOffset=this.isHorizontal()?e[t].offsetLeft:e[t].offsetTop},updateSlidesProgress:function(e){void 0===e&&(e=this&&this.translate||0);var t=this,a=t.params,i=t.slides,s=t.rtlTranslate;if(0!==i.length){void 0===i[0].swiperSlideOffset&&t.updateSlidesOffset();var r=-e;s&&(r=e),i.removeClass(a.slideVisibleClass),t.visibleSlidesIndexes=[],t.visibleSlides=[];for(var n=0;n<i.length;n+=1){var l=i[n],o=(r+(a.centeredSlides?t.minTranslate():0)-l.swiperSlideOffset)/(l.swiperSlideSize+a.spaceBetween);if(a.watchSlidesVisibility||a.centeredSlides&&a.autoHeight){var d=-(r-l.swiperSlideOffset),p=d+t.slidesSizesGrid[n];(d>=0&&d<t.size-1||p>1&&p<=t.size||d<=0&&p>=t.size)&&(t.visibleSlides.push(l),t.visibleSlidesIndexes.push(n),i.eq(n).addClass(a.slideVisibleClass))}l.progress=s?-o:o}t.visibleSlides=m(t.visibleSlides)}},updateProgress:function(e){var t=this;if(void 0===e){var a=t.rtlTranslate?-1:1;e=t&&t.translate&&t.translate*a||0}var i=t.params,s=t.maxTranslate()-t.minTranslate(),r=t.progress,n=t.isBeginning,l=t.isEnd,o=n,d=l;0===s?(r=0,n=!0,l=!0):(n=(r=(e-t.minTranslate())/s)<=0,l=r>=1),M(t,{progress:r,isBeginning:n,isEnd:l}),(i.watchSlidesProgress||i.watchSlidesVisibility||i.centeredSlides&&i.autoHeight)&&t.updateSlidesProgress(e),n&&!o&&t.emit("reachBeginning toEdge"),l&&!d&&t.emit("reachEnd toEdge"),(o&&!n||d&&!l)&&t.emit("fromEdge"),t.emit("progress",r)},updateSlidesClasses:function(){var e,t=this,a=t.slides,i=t.params,s=t.$wrapperEl,r=t.activeIndex,n=t.realIndex,l=t.virtual&&i.virtual.enabled;a.removeClass(i.slideActiveClass+" "+i.slideNextClass+" "+i.slidePrevClass+" "+i.slideDuplicateActiveClass+" "+i.slideDuplicateNextClass+" "+i.slideDuplicatePrevClass),(e=l?t.$wrapperEl.find("."+i.slideClass+'[data-swiper-slide-index="'+r+'"]'):a.eq(r)).addClass(i.slideActiveClass),i.loop&&(e.hasClass(i.slideDuplicateClass)?s.children("."+i.slideClass+":not(."+i.slideDuplicateClass+')[data-swiper-slide-index="'+n+'"]').addClass(i.slideDuplicateActiveClass):s.children("."+i.slideClass+"."+i.slideDuplicateClass+'[data-swiper-slide-index="'+n+'"]').addClass(i.slideDuplicateActiveClass));var o=e.nextAll("."+i.slideClass).eq(0).addClass(i.slideNextClass);i.loop&&0===o.length&&(o=a.eq(0)).addClass(i.slideNextClass);var d=e.prevAll("."+i.slideClass).eq(0).addClass(i.slidePrevClass);i.loop&&0===d.length&&(d=a.eq(-1)).addClass(i.slidePrevClass),i.loop&&(o.hasClass(i.slideDuplicateClass)?s.children("."+i.slideClass+":not(."+i.slideDuplicateClass+')[data-swiper-slide-index="'+o.attr("data-swiper-slide-index")+'"]').addClass(i.slideDuplicateNextClass):s.children("."+i.slideClass+"."+i.slideDuplicateClass+'[data-swiper-slide-index="'+o.attr("data-swiper-slide-index")+'"]').addClass(i.slideDuplicateNextClass),d.hasClass(i.slideDuplicateClass)?s.children("."+i.slideClass+":not(."+i.slideDuplicateClass+')[data-swiper-slide-index="'+d.attr("data-swiper-slide-index")+'"]').addClass(i.slideDuplicatePrevClass):s.children("."+i.slideClass+"."+i.slideDuplicateClass+'[data-swiper-slide-index="'+d.attr("data-swiper-slide-index")+'"]').addClass(i.slideDuplicatePrevClass)),t.emitSlidesClasses()},updateActiveIndex:function(e){var t,a=this,i=a.rtlTranslate?a.translate:-a.translate,s=a.slidesGrid,r=a.snapGrid,n=a.params,l=a.activeIndex,o=a.realIndex,d=a.snapIndex,p=e;if(void 0===p){for(var u=0;u<s.length;u+=1)void 0!==s[u+1]?i>=s[u]&&i<s[u+1]-(s[u+1]-s[u])/2?p=u:i>=s[u]&&i<s[u+1]&&(p=u+1):i>=s[u]&&(p=u);n.normalizeSlideIndex&&(p<0||void 0===p)&&(p=0)}if(r.indexOf(i)>=0)t=r.indexOf(i);else{var c=Math.min(n.slidesPerGroupSkip,p);t=c+Math.floor((p-c)/n.slidesPerGroup)}if(t>=r.length&&(t=r.length-1),p!==l){var h=parseInt(a.slides.eq(p).attr("data-swiper-slide-index")||p,10);M(a,{snapIndex:t,realIndex:h,previousIndex:l,activeIndex:p}),a.emit("activeIndexChange"),a.emit("snapIndexChange"),o!==h&&a.emit("realIndexChange"),(a.initialized||a.params.runCallbacksOnInit)&&a.emit("slideChange")}else t!==d&&(a.snapIndex=t,a.emit("snapIndexChange"))},updateClickedSlide:function(e){var t,a=this,i=a.params,s=m(e.target).closest("."+i.slideClass)[0],r=!1;if(s)for(var n=0;n<a.slides.length;n+=1)if(a.slides[n]===s){r=!0,t=n;break}if(!s||!r)return a.clickedSlide=void 0,void(a.clickedIndex=void 0);a.clickedSlide=s,a.virtual&&a.params.virtual.enabled?a.clickedIndex=parseInt(m(s).attr("data-swiper-slide-index"),10):a.clickedIndex=t,i.slideToClickedSlide&&void 0!==a.clickedIndex&&a.clickedIndex!==a.activeIndex&&a.slideToClickedSlide()}},translate:{getTranslate:function(e){void 0===e&&(e=this.isHorizontal()?"x":"y");var t=this,a=t.params,i=t.rtlTranslate,s=t.translate,r=t.$wrapperEl;if(a.virtualTranslate)return i?-s:s;if(a.cssMode)return s;var n=T(r[0],e);return i&&(n=-n),n||0},setTranslate:function(e,t){var a=this,i=a.rtlTranslate,s=a.params,r=a.$wrapperEl,n=a.wrapperEl,l=a.progress,o=0,d=0;a.isHorizontal()?o=i?-e:e:d=e,s.roundLengths&&(o=Math.floor(o),d=Math.floor(d)),s.cssMode?n[a.isHorizontal()?"scrollLeft":"scrollTop"]=a.isHorizontal()?-o:-d:s.virtualTranslate||r.transform("translate3d("+o+"px, "+d+"px, 0px)"),a.previousTranslate=a.translate,a.translate=a.isHorizontal()?o:d;var p=a.maxTranslate()-a.minTranslate();(0===p?0:(e-a.minTranslate())/p)!==l&&a.updateProgress(e),a.emit("setTranslate",a.translate,t)},minTranslate:function(){return-this.snapGrid[0]},maxTranslate:function(){return-this.snapGrid[this.snapGrid.length-1]},translateTo:function(e,t,a,i,s){void 0===e&&(e=0),void 0===t&&(t=this.params.speed),void 0===a&&(a=!0),void 0===i&&(i=!0);var r=this,n=r.params,l=r.wrapperEl;if(r.animating&&n.preventInteractionOnTransition)return!1;var o,d=r.minTranslate(),p=r.maxTranslate();if(o=i&&e>d?d:i&&e<p?p:e,r.updateProgress(o),n.cssMode){var u,c=r.isHorizontal();if(0===t)l[c?"scrollLeft":"scrollTop"]=-o;else if(l.scrollTo)l.scrollTo(((u={})[c?"left":"top"]=-o,u.behavior="smooth",u));else l[c?"scrollLeft":"scrollTop"]=-o;return!0}return 0===t?(r.setTransition(0),r.setTranslate(o),a&&(r.emit("beforeTransitionStart",t,s),r.emit("transitionEnd"))):(r.setTransition(t),r.setTranslate(o),a&&(r.emit("beforeTransitionStart",t,s),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,a&&r.emit("transitionEnd"))}),r.$wrapperEl[0].addEventListener("transitionend",r.onTranslateToWrapperTransitionEnd),r.$wrapperEl[0].addEventListener("webkitTransitionEnd",r.onTranslateToWrapperTransitionEnd))),!0}},transition:{setTransition:function(e,t){var a=this;a.params.cssMode||a.$wrapperEl.transition(e),a.emit("setTransition",e,t)},transitionStart:function(e,t){void 0===e&&(e=!0);var a=this,i=a.activeIndex,s=a.params,r=a.previousIndex;if(!s.cssMode){s.autoHeight&&a.updateAutoHeight();var n=t;if(n||(n=i>r?"next":i<r?"prev":"reset"),a.emit("transitionStart"),e&&i!==r){if("reset"===n)return void a.emit("slideResetTransitionStart");a.emit("slideChangeTransitionStart"),"next"===n?a.emit("slideNextTransitionStart"):a.emit("slidePrevTransitionStart")}}},transitionEnd:function(e,t){void 0===e&&(e=!0);var a=this,i=a.activeIndex,s=a.previousIndex,r=a.params;if(a.animating=!1,!r.cssMode){a.setTransition(0);var n=t;if(n||(n=i>s?"next":i<s?"prev":"reset"),a.emit("transitionEnd"),e&&i!==s){if("reset"===n)return void a.emit("slideResetTransitionEnd");a.emit("slideChangeTransitionEnd"),"next"===n?a.emit("slideNextTransitionEnd"):a.emit("slidePrevTransitionEnd")}}}},slide:{slideTo:function(e,t,a,i,s){if(void 0===e&&(e=0),void 0===t&&(t=this.params.speed),void 0===a&&(a=!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){var r=parseInt(e,10);if(!isFinite(r))throw new Error("The passed-in 'index' (string) couldn't be converted to 'number'. ["+e+"] given.");e=r}var n=this,l=e;l<0&&(l=0);var o=n.params,d=n.snapGrid,p=n.slidesGrid,u=n.previousIndex,c=n.activeIndex,h=n.rtlTranslate,v=n.wrapperEl,f=n.enabled;if(n.animating&&o.preventInteractionOnTransition||!f&&!i&&!s)return!1;var m=Math.min(n.params.slidesPerGroupSkip,l),g=m+Math.floor((l-m)/n.params.slidesPerGroup);g>=d.length&&(g=d.length-1),(c||o.initialSlide||0)===(u||0)&&a&&n.emit("beforeSlideChangeStart");var b,w=-d[g];if(n.updateProgress(w),o.normalizeSlideIndex)for(var y=0;y<p.length;y+=1){var E=-Math.floor(100*w),x=Math.floor(100*p[y]),T=Math.floor(100*p[y+1]);void 0!==p[y+1]?E>=x&&E<T-(T-x)/2?l=y:E>=x&&E<T&&(l=y+1):E>=x&&(l=y)}if(n.initialized&&l!==c){if(!n.allowSlideNext&&w<n.translate&&w<n.minTranslate())return!1;if(!n.allowSlidePrev&&w>n.translate&&w>n.maxTranslate()&&(c||0)!==l)return!1}if(b=l>c?"next":l<c?"prev":"reset",h&&-w===n.translate||!h&&w===n.translate)return n.updateActiveIndex(l),o.autoHeight&&n.updateAutoHeight(),n.updateSlidesClasses(),"slide"!==o.effect&&n.setTranslate(w),"reset"!==b&&(n.transitionStart(a,b),n.transitionEnd(a,b)),!1;if(o.cssMode){var C,S=n.isHorizontal(),M=-w;if(h&&(M=v.scrollWidth-v.offsetWidth-M),0===t)v[S?"scrollLeft":"scrollTop"]=M;else if(v.scrollTo)v.scrollTo(((C={})[S?"left":"top"]=M,C.behavior="smooth",C));else v[S?"scrollLeft":"scrollTop"]=M;return!0}return 0===t?(n.setTransition(0),n.setTranslate(w),n.updateActiveIndex(l),n.updateSlidesClasses(),n.emit("beforeTransitionStart",t,i),n.transitionStart(a,b),n.transitionEnd(a,b)):(n.setTransition(t),n.setTranslate(w),n.updateActiveIndex(l),n.updateSlidesClasses(),n.emit("beforeTransitionStart",t,i),n.transitionStart(a,b),n.animating||(n.animating=!0,n.onSlideToWrapperTransitionEnd||(n.onSlideToWrapperTransitionEnd=function(e){n&&!n.destroyed&&e.target===this&&(n.$wrapperEl[0].removeEventListener("transitionend",n.onSlideToWrapperTransitionEnd),n.$wrapperEl[0].removeEventListener("webkitTransitionEnd",n.onSlideToWrapperTransitionEnd),n.onSlideToWrapperTransitionEnd=null,delete n.onSlideToWrapperTransitionEnd,n.transitionEnd(a,b))}),n.$wrapperEl[0].addEventListener("transitionend",n.onSlideToWrapperTransitionEnd),n.$wrapperEl[0].addEventListener("webkitTransitionEnd",n.onSlideToWrapperTransitionEnd))),!0},slideToLoop:function(e,t,a,i){void 0===e&&(e=0),void 0===t&&(t=this.params.speed),void 0===a&&(a=!0);var s=this,r=e;return s.params.loop&&(r+=s.loopedSlides),s.slideTo(r,t,a,i)},slideNext:function(e,t,a){void 0===e&&(e=this.params.speed),void 0===t&&(t=!0);var i=this,s=i.params,r=i.animating;if(!i.enabled)return i;var n=i.activeIndex<s.slidesPerGroupSkip?1:s.slidesPerGroup;if(s.loop){if(r&&s.loopPreventsSlide)return!1;i.loopFix(),i._clientLeft=i.$wrapperEl[0].clientLeft}return i.slideTo(i.activeIndex+n,e,t,a)},slidePrev:function(e,t,a){void 0===e&&(e=this.params.speed),void 0===t&&(t=!0);var i=this,s=i.params,r=i.animating,n=i.snapGrid,l=i.slidesGrid,o=i.rtlTranslate;if(!i.enabled)return i;if(s.loop){if(r&&s.loopPreventsSlide)return!1;i.loopFix(),i._clientLeft=i.$wrapperEl[0].clientLeft}function d(e){return e<0?-Math.floor(Math.abs(e)):Math.floor(e)}var p,u=d(o?i.translate:-i.translate),c=n.map((function(e){return d(e)})),h=n[c.indexOf(u)-1];return void 0===h&&s.cssMode&&n.forEach((function(e){!h&&u>=e&&(h=e)})),void 0!==h&&(p=l.indexOf(h))<0&&(p=i.activeIndex-1),i.slideTo(p,e,t,a)},slideReset:function(e,t,a){return void 0===e&&(e=this.params.speed),void 0===t&&(t=!0),this.slideTo(this.activeIndex,e,t,a)},slideToClosest:function(e,t,a,i){void 0===e&&(e=this.params.speed),void 0===t&&(t=!0),void 0===i&&(i=.5);var s=this,r=s.activeIndex,n=Math.min(s.params.slidesPerGroupSkip,r),l=n+Math.floor((r-n)/s.params.slidesPerGroup),o=s.rtlTranslate?s.translate:-s.translate;if(o>=s.snapGrid[l]){var d=s.snapGrid[l];o-d>(s.snapGrid[l+1]-d)*i&&(r+=s.params.slidesPerGroup)}else{var p=s.snapGrid[l-1];o-p<=(s.snapGrid[l]-p)*i&&(r-=s.params.slidesPerGroup)}return r=Math.max(r,0),r=Math.min(r,s.slidesGrid.length-1),s.slideTo(r,e,t,a)},slideToClickedSlide:function(){var e,t=this,a=t.params,i=t.$wrapperEl,s="auto"===a.slidesPerView?t.slidesPerViewDynamic():a.slidesPerView,r=t.clickedIndex;if(a.loop){if(t.animating)return;e=parseInt(m(t.clickedSlide).attr("data-swiper-slide-index"),10),a.centeredSlides?r<t.loopedSlides-s/2||r>t.slides.length-t.loopedSlides+s/2?(t.loopFix(),r=i.children("."+a.slideClass+'[data-swiper-slide-index="'+e+'"]:not(.'+a.slideDuplicateClass+")").eq(0).index(),E((function(){t.slideTo(r)}))):t.slideTo(r):r>t.slides.length-s?(t.loopFix(),r=i.children("."+a.slideClass+'[data-swiper-slide-index="'+e+'"]:not(.'+a.slideDuplicateClass+")").eq(0).index(),E((function(){t.slideTo(r)}))):t.slideTo(r)}else t.slideTo(r)}},loop:{loopCreate:function(){var e=this,t=r(),a=e.params,i=e.$wrapperEl;i.children("."+a.slideClass+"."+a.slideDuplicateClass).remove();var s=i.children("."+a.slideClass);if(a.loopFillGroupWithBlank){var n=a.slidesPerGroup-s.length%a.slidesPerGroup;if(n!==a.slidesPerGroup){for(var l=0;l<n;l+=1){var o=m(t.createElement("div")).addClass(a.slideClass+" "+a.slideBlankClass);i.append(o)}s=i.children("."+a.slideClass)}}"auto"!==a.slidesPerView||a.loopedSlides||(a.loopedSlides=s.length),e.loopedSlides=Math.ceil(parseFloat(a.loopedSlides||a.slidesPerView,10)),e.loopedSlides+=a.loopAdditionalSlides,e.loopedSlides>s.length&&(e.loopedSlides=s.length);var d=[],p=[];s.each((function(t,a){var i=m(t);a<e.loopedSlides&&p.push(t),a<s.length&&a>=s.length-e.loopedSlides&&d.push(t),i.attr("data-swiper-slide-index",a)}));for(var u=0;u<p.length;u+=1)i.append(m(p[u].cloneNode(!0)).addClass(a.slideDuplicateClass));for(var c=d.length-1;c>=0;c-=1)i.prepend(m(d[c].cloneNode(!0)).addClass(a.slideDuplicateClass))},loopFix:function(){var e=this;e.emit("beforeLoopFix");var t,a=e.activeIndex,i=e.slides,s=e.loopedSlides,r=e.allowSlidePrev,n=e.allowSlideNext,l=e.snapGrid,o=e.rtlTranslate;e.allowSlidePrev=!0,e.allowSlideNext=!0;var d=-l[a]-e.getTranslate();if(a<s)t=i.length-3*s+a,t+=s,e.slideTo(t,0,!1,!0)&&0!==d&&e.setTranslate((o?-e.translate:e.translate)-d);else if(a>=i.length-s){t=-i.length+a+s,t+=s,e.slideTo(t,0,!1,!0)&&0!==d&&e.setTranslate((o?-e.translate:e.translate)-d)}e.allowSlidePrev=r,e.allowSlideNext=n,e.emit("loopFix")},loopDestroy:function(){var e=this,t=e.$wrapperEl,a=e.params,i=e.slides;t.children("."+a.slideClass+"."+a.slideDuplicateClass+",."+a.slideClass+"."+a.slideBlankClass).remove(),i.removeAttr("data-swiper-slide-index")}},grabCursor:{setGrabCursor:function(e){var t=this;if(!(t.support.touch||!t.params.simulateTouch||t.params.watchOverflow&&t.isLocked||t.params.cssMode)){var a=t.el;a.style.cursor="move",a.style.cursor=e?"-webkit-grabbing":"-webkit-grab",a.style.cursor=e?"-moz-grabbin":"-moz-grab",a.style.cursor=e?"grabbing":"grab"}},unsetGrabCursor:function(){var e=this;e.support.touch||e.params.watchOverflow&&e.isLocked||e.params.cssMode||(e.el.style.cursor="")}},manipulation:{appendSlide:function(e){var t=this,a=t.$wrapperEl,i=t.params;if(i.loop&&t.loopDestroy(),"object"==typeof e&&"length"in e)for(var s=0;s<e.length;s+=1)e[s]&&a.append(e[s]);else a.append(e);i.loop&&t.loopCreate(),i.observer&&t.support.observer||t.update()},prependSlide:function(e){var t=this,a=t.params,i=t.$wrapperEl,s=t.activeIndex;a.loop&&t.loopDestroy();var r=s+1;if("object"==typeof e&&"length"in e){for(var n=0;n<e.length;n+=1)e[n]&&i.prepend(e[n]);r=s+e.length}else i.prepend(e);a.loop&&t.loopCreate(),a.observer&&t.support.observer||t.update(),t.slideTo(r,0,!1)},addSlide:function(e,t){var a=this,i=a.$wrapperEl,s=a.params,r=a.activeIndex;s.loop&&(r-=a.loopedSlides,a.loopDestroy(),a.slides=i.children("."+s.slideClass));var n=a.slides.length;if(e<=0)a.prependSlide(t);else if(e>=n)a.appendSlide(t);else{for(var l=r>e?r+1:r,o=[],d=n-1;d>=e;d-=1){var p=a.slides.eq(d);p.remove(),o.unshift(p)}if("object"==typeof t&&"length"in t){for(var u=0;u<t.length;u+=1)t[u]&&i.append(t[u]);l=r>e?r+t.length:r}else i.append(t);for(var c=0;c<o.length;c+=1)i.append(o[c]);s.loop&&a.loopCreate(),s.observer&&a.support.observer||a.update(),s.loop?a.slideTo(l+a.loopedSlides,0,!1):a.slideTo(l,0,!1)}},removeSlide:function(e){var t=this,a=t.params,i=t.$wrapperEl,s=t.activeIndex;a.loop&&(s-=t.loopedSlides,t.loopDestroy(),t.slides=i.children("."+a.slideClass));var r,n=s;if("object"==typeof e&&"length"in e){for(var l=0;l<e.length;l+=1)r=e[l],t.slides[r]&&t.slides.eq(r).remove(),r<n&&(n-=1);n=Math.max(n,0)}else r=e,t.slides[r]&&t.slides.eq(r).remove(),r<n&&(n-=1),n=Math.max(n,0);a.loop&&t.loopCreate(),a.observer&&t.support.observer||t.update(),a.loop?t.slideTo(n+t.loopedSlides,0,!1):t.slideTo(n,0,!1)},removeAllSlides:function(){for(var e=[],t=0;t<this.slides.length;t+=1)e.push(t);this.removeSlide(e)}},events:{attachEvents:function(){var e=this,t=r(),a=e.params,i=e.touchEvents,s=e.el,n=e.wrapperEl,l=e.device,o=e.support;e.onTouchStart=N.bind(e),e.onTouchMove=G.bind(e),e.onTouchEnd=B.bind(e),a.cssMode&&(e.onScroll=X.bind(e)),e.onClick=R.bind(e);var d=!!a.nested;if(!o.touch&&o.pointerEvents)s.addEventListener(i.start,e.onTouchStart,!1),t.addEventListener(i.move,e.onTouchMove,d),t.addEventListener(i.end,e.onTouchEnd,!1);else{if(o.touch){var p=!("touchstart"!==i.start||!o.passiveListener||!a.passiveListeners)&&{passive:!0,capture:!1};s.addEventListener(i.start,e.onTouchStart,p),s.addEventListener(i.move,e.onTouchMove,o.passiveListener?{passive:!1,capture:d}:d),s.addEventListener(i.end,e.onTouchEnd,p),i.cancel&&s.addEventListener(i.cancel,e.onTouchEnd,p),Y||(t.addEventListener("touchstart",V),Y=!0)}(a.simulateTouch&&!l.ios&&!l.android||a.simulateTouch&&!o.touch&&l.ios)&&(s.addEventListener("mousedown",e.onTouchStart,!1),t.addEventListener("mousemove",e.onTouchMove,d),t.addEventListener("mouseup",e.onTouchEnd,!1))}(a.preventClicks||a.preventClicksPropagation)&&s.addEventListener("click",e.onClick,!0),a.cssMode&&n.addEventListener("scroll",e.onScroll),a.updateOnWindowResize?e.on(l.ios||l.android?"resize orientationchange observerUpdate":"resize observerUpdate",H,!0):e.on("observerUpdate",H,!0)},detachEvents:function(){var e=this,t=r(),a=e.params,i=e.touchEvents,s=e.el,n=e.wrapperEl,l=e.device,o=e.support,d=!!a.nested;if(!o.touch&&o.pointerEvents)s.removeEventListener(i.start,e.onTouchStart,!1),t.removeEventListener(i.move,e.onTouchMove,d),t.removeEventListener(i.end,e.onTouchEnd,!1);else{if(o.touch){var p=!("onTouchStart"!==i.start||!o.passiveListener||!a.passiveListeners)&&{passive:!0,capture:!1};s.removeEventListener(i.start,e.onTouchStart,p),s.removeEventListener(i.move,e.onTouchMove,d),s.removeEventListener(i.end,e.onTouchEnd,p),i.cancel&&s.removeEventListener(i.cancel,e.onTouchEnd,p)}(a.simulateTouch&&!l.ios&&!l.android||a.simulateTouch&&!o.touch&&l.ios)&&(s.removeEventListener("mousedown",e.onTouchStart,!1),t.removeEventListener("mousemove",e.onTouchMove,d),t.removeEventListener("mouseup",e.onTouchEnd,!1))}(a.preventClicks||a.preventClicksPropagation)&&s.removeEventListener("click",e.onClick,!0),a.cssMode&&n.removeEventListener("scroll",e.onScroll),e.off(l.ios||l.android?"resize orientationchange observerUpdate":"resize observerUpdate",H)}},breakpoints:{setBreakpoint:function(){var e=this,t=e.activeIndex,a=e.initialized,i=e.loopedSlides,s=void 0===i?0:i,r=e.params,n=e.$el,l=r.breakpoints;if(l&&(!l||0!==Object.keys(l).length)){var o=e.getBreakpoint(l,e.params.breakpointsBase,e.el);if(o&&e.currentBreakpoint!==o){var d=o in l?l[o]:void 0;d&&["slidesPerView","spaceBetween","slidesPerGroup","slidesPerGroupSkip","slidesPerColumn"].forEach((function(e){var t=d[e];void 0!==t&&(d[e]="slidesPerView"!==e||"AUTO"!==t&&"auto"!==t?"slidesPerView"===e?parseFloat(t):parseInt(t,10):"auto")}));var p=d||e.originalParams,u=r.slidesPerColumn>1,c=p.slidesPerColumn>1,h=r.enabled;u&&!c?(n.removeClass(r.containerModifierClass+"multirow "+r.containerModifierClass+"multirow-column"),e.emitContainerClasses()):!u&&c&&(n.addClass(r.containerModifierClass+"multirow"),(p.slidesPerColumnFill&&"column"===p.slidesPerColumnFill||!p.slidesPerColumnFill&&"column"===r.slidesPerColumnFill)&&n.addClass(r.containerModifierClass+"multirow-column"),e.emitContainerClasses());var v=p.direction&&p.direction!==r.direction,f=r.loop&&(p.slidesPerView!==r.slidesPerView||v);v&&a&&e.changeDirection(),M(e.params,p);var m=e.params.enabled;M(e,{allowTouchMove:e.params.allowTouchMove,allowSlideNext:e.params.allowSlideNext,allowSlidePrev:e.params.allowSlidePrev}),h&&!m?e.disable():!h&&m&&e.enable(),e.currentBreakpoint=o,e.emit("_beforeBreakpoint",p),f&&a&&(e.loopDestroy(),e.loopCreate(),e.updateSlides(),e.slideTo(t-s+e.loopedSlides,0,!1)),e.emit("breakpoint",p)}}},getBreakpoint:function(e,t,a){if(void 0===t&&(t="window"),e&&("container"!==t||a)){var i=!1,s=l(),r="window"===t?s.innerHeight:a.clientHeight,n=Object.keys(e).map((function(e){if("string"==typeof e&&0===e.indexOf("@")){var t=parseFloat(e.substr(1));return{value:r*t,point:e}}return{value:e,point:e}}));n.sort((function(e,t){return parseInt(e.value,10)-parseInt(t.value,10)}));for(var o=0;o<n.length;o+=1){var d=n[o],p=d.point,u=d.value;"window"===t?s.matchMedia("(min-width: "+u+"px)").matches&&(i=p):u<=a.clientWidth&&(i=p)}return i||"max"}}},checkOverflow:{checkOverflow:function(){var e=this,t=e.params,a=e.isLocked,i=e.slides.length>0&&t.slidesOffsetBefore+t.spaceBetween*(e.slides.length-1)+e.slides[0].offsetWidth*e.slides.length;t.slidesOffsetBefore&&t.slidesOffsetAfter&&i?e.isLocked=i<=e.size:e.isLocked=1===e.snapGrid.length,e.allowSlideNext=!e.isLocked,e.allowSlidePrev=!e.isLocked,a!==e.isLocked&&e.emit(e.isLocked?"lock":"unlock"),a&&a!==e.isLocked&&(e.isEnd=!1,e.navigation&&e.navigation.update())}},classes:{addClasses:function(){var e,t,a,i=this,s=i.classNames,r=i.params,n=i.rtl,l=i.$el,o=i.device,d=i.support,p=(e=["initialized",r.direction,{"pointer-events":d.pointerEvents&&!d.touch},{"free-mode":r.freeMode},{autoheight:r.autoHeight},{rtl:n},{multirow:r.slidesPerColumn>1},{"multirow-column":r.slidesPerColumn>1&&"column"===r.slidesPerColumnFill},{android:o.android},{ios:o.ios},{"css-mode":r.cssMode}],t=r.containerModifierClass,a=[],e.forEach((function(e){"object"==typeof e?Object.keys(e).forEach((function(i){e[i]&&a.push(t+i)})):"string"==typeof e&&a.push(t+e)})),a);s.push.apply(s,p),l.addClass([].concat(s).join(" ")),i.emitContainerClasses()},removeClasses:function(){var e=this,t=e.$el,a=e.classNames;t.removeClass(a.join(" ")),e.emitContainerClasses()}},images:{loadImage:function(e,t,a,i,s,r){var n,o=l();function d(){r&&r()}m(e).parent("picture")[0]||e.complete&&s?d():t?((n=new o.Image).onload=d,n.onerror=d,i&&(n.sizes=i),a&&(n.srcset=a),t&&(n.src=t)):d()},preloadImages:function(){var 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(var a=0;a<e.imagesToLoad.length;a+=1){var i=e.imagesToLoad[a];e.loadImage(i,i.currentSrc||i.getAttribute("src"),i.srcset||i.getAttribute("srcset"),i.sizes||i.getAttribute("sizes"),!0,t)}}}},_={},q=function(){function t(){for(var e,a,i=arguments.length,s=new Array(i),r=0;r<i;r++)s[r]=arguments[r];if(1===s.length&&s[0].constructor&&"Object"===Object.prototype.toString.call(s[0]).slice(8,-1)?a=s[0]:(e=s[0],a=s[1]),a||(a={}),a=M({},a),e&&!a.el&&(a.el=e),a.el&&m(a.el).length>1){var n=[];return m(a.el).each((function(e){var i=M({},a,{el:e});n.push(new t(i))})),n}var l=this;l.__swiper__=!0,l.support=$(),l.device=L({userAgent:a.userAgent}),l.browser=I(),l.eventsListeners={},l.eventsAnyListeners=[],void 0===l.modules&&(l.modules={}),Object.keys(l.modules).forEach((function(e){var t=l.modules[e];if(t.params){var i=Object.keys(t.params)[0],s=t.params[i];if("object"!=typeof s||null===s)return;if(["navigation","pagination","scrollbar"].indexOf(i)>=0&&!0===a[i]&&(a[i]={auto:!0}),!(i in a)||!("enabled"in s))return;!0===a[i]&&(a[i]={enabled:!0}),"object"!=typeof a[i]||"enabled"in a[i]||(a[i].enabled=!0),a[i]||(a[i]={enabled:!1})}}));var o,d,p=M({},W);return l.useParams(p),l.params=M({},p,_,a),l.originalParams=M({},l.params),l.passedParams=M({},a),l.params&&l.params.on&&Object.keys(l.params.on).forEach((function(e){l.on(e,l.params.on[e])})),l.params&&l.params.onAny&&l.onAny(l.params.onAny),l.$=m,M(l,{enabled:l.params.enabled,el:e,classNames:[],slides:m(),slidesGrid:[],snapGrid:[],slidesSizesGrid:[],isHorizontal:function(){return"horizontal"===l.params.direction},isVertical:function(){return"vertical"===l.params.direction},activeIndex:0,realIndex:0,isBeginning:!0,isEnd:!1,translate:0,previousTranslate:0,progress:0,velocity:0,animating:!1,allowSlideNext:l.params.allowSlideNext,allowSlidePrev:l.params.allowSlidePrev,touchEvents:(o=["touchstart","touchmove","touchend","touchcancel"],d=["mousedown","mousemove","mouseup"],l.support.pointerEvents&&(d=["pointerdown","pointermove","pointerup"]),l.touchEventsTouch={start:o[0],move:o[1],end:o[2],cancel:o[3]},l.touchEventsDesktop={start:d[0],move:d[1],end:d[2]},l.support.touch||!l.params.simulateTouch?l.touchEventsTouch:l.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:l.params.focusableElements,lastClickTime:x(),clickTimeout:void 0,velocities:[],allowMomentumBounce:void 0,isTouchEvent:void 0,startMoving:void 0},allowClick:!0,allowTouchMove:l.params.allowTouchMove,touches:{startX:0,startY:0,currentX:0,currentY:0,diff:0},imagesToLoad:[],imagesLoaded:0}),l.useModules(),l.emit("_swiper"),l.params.init&&l.init(),l}var a,i,s,n=t.prototype;return n.enable=function(){var e=this;e.enabled||(e.enabled=!0,e.params.grabCursor&&e.setGrabCursor(),e.emit("enable"))},n.disable=function(){var e=this;e.enabled&&(e.enabled=!1,e.params.grabCursor&&e.unsetGrabCursor(),e.emit("disable"))},n.setProgress=function(e,t){var a=this;e=Math.min(Math.max(e,0),1);var i=a.minTranslate(),s=(a.maxTranslate()-i)*e+i;a.translateTo(s,void 0===t?0:t),a.updateActiveIndex(),a.updateSlidesClasses()},n.emitContainerClasses=function(){var e=this;if(e.params._emitClasses&&e.el){var t=e.el.className.split(" ").filter((function(t){return 0===t.indexOf("swiper-container")||0===t.indexOf(e.params.containerModifierClass)}));e.emit("_containerClasses",t.join(" "))}},n.getSlideClasses=function(e){var t=this;return e.className.split(" ").filter((function(e){return 0===e.indexOf("swiper-slide")||0===e.indexOf(t.params.slideClass)})).join(" ")},n.emitSlidesClasses=function(){var e=this;if(e.params._emitClasses&&e.el){var t=[];e.slides.each((function(a){var i=e.getSlideClasses(a);t.push({slideEl:a,classNames:i}),e.emit("_slideClass",a,i)})),e.emit("_slideClasses",t)}},n.slidesPerViewDynamic=function(){var e=this,t=e.params,a=e.slides,i=e.slidesGrid,s=e.size,r=e.activeIndex,n=1;if(t.centeredSlides){for(var l,o=a[r].swiperSlideSize,d=r+1;d<a.length;d+=1)a[d]&&!l&&(n+=1,(o+=a[d].swiperSlideSize)>s&&(l=!0));for(var p=r-1;p>=0;p-=1)a[p]&&!l&&(n+=1,(o+=a[p].swiperSlideSize)>s&&(l=!0))}else for(var u=r+1;u<a.length;u+=1)i[u]-i[r]<s&&(n+=1);return n},n.update=function(){var e=this;if(e&&!e.destroyed){var t=e.snapGrid,a=e.params;a.breakpoints&&e.setBreakpoint(),e.updateSize(),e.updateSlides(),e.updateProgress(),e.updateSlidesClasses(),e.params.freeMode?(i(),e.params.autoHeight&&e.updateAutoHeight()):(("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.watchOverflow&&t!==e.snapGrid&&e.checkOverflow(),e.emit("update")}function i(){var t=e.rtlTranslate?-1*e.translate:e.translate,a=Math.min(Math.max(t,e.maxTranslate()),e.minTranslate());e.setTranslate(a),e.updateActiveIndex(),e.updateSlidesClasses()}},n.changeDirection=function(e,t){void 0===t&&(t=!0);var a=this,i=a.params.direction;return e||(e="horizontal"===i?"vertical":"horizontal"),e===i||"horizontal"!==e&&"vertical"!==e||(a.$el.removeClass(""+a.params.containerModifierClass+i).addClass(""+a.params.containerModifierClass+e),a.emitContainerClasses(),a.params.direction=e,a.slides.each((function(t){"vertical"===e?t.style.width="":t.style.height=""})),a.emit("changeDirection"),t&&a.update()),a},n.mount=function(e){var t=this;if(t.mounted)return!0;var a=m(e||t.params.el);if(!(e=a[0]))return!1;e.swiper=t;var i=function(){return"."+(t.params.wrapperClass||"").trim().split(" ").join(".")},s=function(){if(e&&e.shadowRoot&&e.shadowRoot.querySelector){var t=m(e.shadowRoot.querySelector(i()));return t.children=function(e){return a.children(e)},t}return a.children(i())}();if(0===s.length&&t.params.createElements){var n=r().createElement("div");s=m(n),n.className=t.params.wrapperClass,a.append(n),a.children("."+t.params.slideClass).each((function(e){s.append(e)}))}return M(t,{$el:a,el:e,$wrapperEl:s,wrapperEl:s[0],mounted:!0,rtl:"rtl"===e.dir.toLowerCase()||"rtl"===a.css("direction"),rtlTranslate:"horizontal"===t.params.direction&&("rtl"===e.dir.toLowerCase()||"rtl"===a.css("direction")),wrongRTL:"-webkit-box"===s.css("display")}),!0},n.init=function(e){var t=this;return t.initialized||!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},n.destroy=function(e,t){void 0===e&&(e=!0),void 0===t&&(t=!0);var a,i=this,s=i.params,r=i.$el,n=i.$wrapperEl,l=i.slides;return void 0===i.params||i.destroyed||(i.emit("beforeDestroy"),i.initialized=!1,i.detachEvents(),s.loop&&i.loopDestroy(),t&&(i.removeClasses(),r.removeAttr("style"),n.removeAttr("style"),l&&l.length&&l.removeClass([s.slideVisibleClass,s.slideActiveClass,s.slideNextClass,s.slidePrevClass].join(" ")).removeAttr("style").removeAttr("data-swiper-slide-index")),i.emit("destroy"),Object.keys(i.eventsListeners).forEach((function(e){i.off(e)})),!1!==e&&(i.$el[0].swiper=null,a=i,Object.keys(a).forEach((function(e){try{a[e]=null}catch(e){}try{delete a[e]}catch(e){}}))),i.destroyed=!0),null},t.extendDefaults=function(e){M(_,e)},t.installModule=function(e){t.prototype.modules||(t.prototype.modules={});var a=e.name||Object.keys(t.prototype.modules).length+"_"+x();t.prototype.modules[a]=e},t.use=function(e){return Array.isArray(e)?(e.forEach((function(e){return t.installModule(e)})),t):(t.installModule(e),t)},a=t,s=[{key:"extendedDefaults",get:function(){return _}},{key:"defaults",get:function(){return W}}],(i=null)&&e(a.prototype,i),s&&e(a,s),t}();Object.keys(F).forEach((function(e){Object.keys(F[e]).forEach((function(t){q.prototype[t]=F[e][t]}))})),q.use([O,D]);var j={update:function(e){var t=this,a=t.params,i=a.slidesPerView,s=a.slidesPerGroup,r=a.centeredSlides,n=t.params.virtual,l=n.addSlidesBefore,o=n.addSlidesAfter,d=t.virtual,p=d.from,u=d.to,c=d.slides,h=d.slidesGrid,v=d.renderSlide,f=d.offset;t.updateActiveIndex();var m,g,b,w=t.activeIndex||0;m=t.rtlTranslate?"right":t.isHorizontal()?"left":"top",r?(g=Math.floor(i/2)+s+o,b=Math.floor(i/2)+s+l):(g=i+(s-1)+o,b=s+l);var y=Math.max((w||0)-b,0),E=Math.min((w||0)+g,c.length-1),x=(t.slidesGrid[y]||0)-(t.slidesGrid[0]||0);function T(){t.updateSlides(),t.updateProgress(),t.updateSlidesClasses(),t.lazy&&t.params.lazy.enabled&&t.lazy.load()}if(M(t.virtual,{from:y,to:E,offset:x,slidesGrid:t.slidesGrid}),p===y&&u===E&&!e)return t.slidesGrid!==h&&x!==f&&t.slides.css(m,x+"px"),void t.updateProgress();if(t.params.virtual.renderExternal)return t.params.virtual.renderExternal.call(t,{offset:x,from:y,to:E,slides:function(){for(var e=[],t=y;t<=E;t+=1)e.push(c[t]);return e}()}),void(t.params.virtual.renderExternalUpdate&&T());var C=[],S=[];if(e)t.$wrapperEl.find("."+t.params.slideClass).remove();else for(var z=p;z<=u;z+=1)(z<y||z>E)&&t.$wrapperEl.find("."+t.params.slideClass+'[data-swiper-slide-index="'+z+'"]').remove();for(var P=0;P<c.length;P+=1)P>=y&&P<=E&&(void 0===u||e?S.push(P):(P>u&&S.push(P),P<p&&C.push(P)));S.forEach((function(e){t.$wrapperEl.append(v(c[e],e))})),C.sort((function(e,t){return t-e})).forEach((function(e){t.$wrapperEl.prepend(v(c[e],e))})),t.$wrapperEl.children(".swiper-slide").css(m,x+"px"),T()},renderSlide:function(e,t){var a=this,i=a.params.virtual;if(i.cache&&a.virtual.cache[t])return a.virtual.cache[t];var s=i.renderSlide?m(i.renderSlide.call(a,e,t)):m('<div class="'+a.params.slideClass+'" data-swiper-slide-index="'+t+'">'+e+"</div>");return s.attr("data-swiper-slide-index")||s.attr("data-swiper-slide-index",t),i.cache&&(a.virtual.cache[t]=s),s},appendSlide:function(e){var t=this;if("object"==typeof e&&"length"in e)for(var a=0;a<e.length;a+=1)e[a]&&t.virtual.slides.push(e[a]);else t.virtual.slides.push(e);t.virtual.update(!0)},prependSlide:function(e){var t=this,a=t.activeIndex,i=a+1,s=1;if(Array.isArray(e)){for(var r=0;r<e.length;r+=1)e[r]&&t.virtual.slides.unshift(e[r]);i=a+e.length,s=e.length}else t.virtual.slides.unshift(e);if(t.params.virtual.cache){var n=t.virtual.cache,l={};Object.keys(n).forEach((function(e){var t=n[e],a=t.attr("data-swiper-slide-index");a&&t.attr("data-swiper-slide-index",parseInt(a,10)+1),l[parseInt(e,10)+s]=t})),t.virtual.cache=l}t.virtual.update(!0),t.slideTo(i,0)},removeSlide:function(e){var t=this;if(null!=e){var a=t.activeIndex;if(Array.isArray(e))for(var i=e.length-1;i>=0;i-=1)t.virtual.slides.splice(e[i],1),t.params.virtual.cache&&delete t.virtual.cache[e[i]],e[i]<a&&(a-=1),a=Math.max(a,0);else t.virtual.slides.splice(e,1),t.params.virtual.cache&&delete t.virtual.cache[e],e<a&&(a-=1),a=Math.max(a,0);t.virtual.update(!0),t.slideTo(a,0)}},removeAllSlides:function(){var e=this;e.virtual.slides=[],e.params.virtual.cache&&(e.virtual.cache={}),e.virtual.update(!0),e.slideTo(0,0)}},U={name:"virtual",params:{virtual:{enabled:!1,slides:[],cache:!0,renderSlide:null,renderExternal:null,renderExternalUpdate:!0,addSlidesBefore:0,addSlidesAfter:0}},create:function(){z(this,{virtual:t({},j,{slides:this.params.virtual.slides,cache:{}})})},on:{beforeInit:function(e){if(e.params.virtual.enabled){e.classNames.push(e.params.containerModifierClass+"virtual");var t={watchSlidesProgress:!0};M(e.params,t),M(e.originalParams,t),e.params.initialSlide||e.virtual.update()}},setTranslate:function(e){e.params.virtual.enabled&&e.virtual.update()}}},K={handle:function(e){var t=this;if(t.enabled){var a=l(),i=r(),s=t.rtlTranslate,n=e;n.originalEvent&&(n=n.originalEvent);var o=n.keyCode||n.charCode,d=t.params.keyboard.pageUpDown,p=d&&33===o,u=d&&34===o,c=37===o,h=39===o,v=38===o,f=40===o;if(!t.allowSlideNext&&(t.isHorizontal()&&h||t.isVertical()&&f||u))return!1;if(!t.allowSlidePrev&&(t.isHorizontal()&&c||t.isVertical()&&v||p))return!1;if(!(n.shiftKey||n.altKey||n.ctrlKey||n.metaKey||i.activeElement&&i.activeElement.nodeName&&("input"===i.activeElement.nodeName.toLowerCase()||"textarea"===i.activeElement.nodeName.toLowerCase()))){if(t.params.keyboard.onlyInViewport&&(p||u||c||h||v||f)){var m=!1;if(t.$el.parents("."+t.params.slideClass).length>0&&0===t.$el.parents("."+t.params.slideActiveClass).length)return;var g=t.$el,b=g[0].clientWidth,w=g[0].clientHeight,y=a.innerWidth,E=a.innerHeight,x=t.$el.offset();s&&(x.left-=t.$el[0].scrollLeft);for(var T=[[x.left,x.top],[x.left+b,x.top],[x.left,x.top+w],[x.left+b,x.top+w]],C=0;C<T.length;C+=1){var S=T[C];if(S[0]>=0&&S[0]<=y&&S[1]>=0&&S[1]<=E){if(0===S[0]&&0===S[1])continue;m=!0}}if(!m)return}t.isHorizontal()?((p||u||c||h)&&(n.preventDefault?n.preventDefault():n.returnValue=!1),((u||h)&&!s||(p||c)&&s)&&t.slideNext(),((p||c)&&!s||(u||h)&&s)&&t.slidePrev()):((p||u||v||f)&&(n.preventDefault?n.preventDefault():n.returnValue=!1),(u||f)&&t.slideNext(),(p||v)&&t.slidePrev()),t.emit("keyPress",o)}}},enable:function(){var e=this,t=r();e.keyboard.enabled||(m(t).on("keydown",e.keyboard.handle),e.keyboard.enabled=!0)},disable:function(){var e=this,t=r();e.keyboard.enabled&&(m(t).off("keydown",e.keyboard.handle),e.keyboard.enabled=!1)}},Z={name:"keyboard",params:{keyboard:{enabled:!1,onlyInViewport:!0,pageUpDown:!0}},create:function(){z(this,{keyboard:t({enabled:!1},K)})},on:{init:function(e){e.params.keyboard.enabled&&e.keyboard.enable()},destroy:function(e){e.keyboard.enabled&&e.keyboard.disable()}}};var J={lastScrollTime:x(),lastEventBeforeSnap:void 0,recentWheelEvents:[],event:function(){return l().navigator.userAgent.indexOf("firefox")>-1?"DOMMouseScroll":function(){var e=r(),t="onwheel",a=t in e;if(!a){var i=e.createElement("div");i.setAttribute(t,"return;"),a="function"==typeof i.onwheel}return!a&&e.implementation&&e.implementation.hasFeature&&!0!==e.implementation.hasFeature("","")&&(a=e.implementation.hasFeature("Events.wheel","3.0")),a}()?"wheel":"mousewheel"},normalize:function(e){var t=0,a=0,i=0,s=0;return"detail"in e&&(a=e.detail),"wheelDelta"in e&&(a=-e.wheelDelta/120),"wheelDeltaY"in e&&(a=-e.wheelDeltaY/120),"wheelDeltaX"in e&&(t=-e.wheelDeltaX/120),"axis"in e&&e.axis===e.HORIZONTAL_AXIS&&(t=a,a=0),i=10*t,s=10*a,"deltaY"in e&&(s=e.deltaY),"deltaX"in e&&(i=e.deltaX),e.shiftKey&&!i&&(i=s,s=0),(i||s)&&e.deltaMode&&(1===e.deltaMode?(i*=40,s*=40):(i*=800,s*=800)),i&&!t&&(t=i<1?-1:1),s&&!a&&(a=s<1?-1:1),{spinX:t,spinY:a,pixelX:i,pixelY:s}},handleMouseEnter:function(){this.enabled&&(this.mouseEntered=!0)},handleMouseLeave:function(){this.enabled&&(this.mouseEntered=!1)},handle:function(e){var t=e,a=this;if(a.enabled){var i=a.params.mousewheel;a.params.cssMode&&t.preventDefault();var s=a.$el;if("container"!==a.params.mousewheel.eventsTarget&&(s=m(a.params.mousewheel.eventsTarget)),!a.mouseEntered&&!s[0].contains(t.target)&&!i.releaseOnEdges)return!0;t.originalEvent&&(t=t.originalEvent);var r=0,n=a.rtlTranslate?-1:1,l=J.normalize(t);if(i.forceToAxis)if(a.isHorizontal()){if(!(Math.abs(l.pixelX)>Math.abs(l.pixelY)))return!0;r=-l.pixelX*n}else{if(!(Math.abs(l.pixelY)>Math.abs(l.pixelX)))return!0;r=-l.pixelY}else r=Math.abs(l.pixelX)>Math.abs(l.pixelY)?-l.pixelX*n:-l.pixelY;if(0===r)return!0;i.invert&&(r=-r);var o=a.getTranslate()+r*i.sensitivity;if(o>=a.minTranslate()&&(o=a.minTranslate()),o<=a.maxTranslate()&&(o=a.maxTranslate()),(!!a.params.loop||!(o===a.minTranslate()||o===a.maxTranslate()))&&a.params.nested&&t.stopPropagation(),a.params.freeMode){var d={time:x(),delta:Math.abs(r),direction:Math.sign(r)},p=a.mousewheel.lastEventBeforeSnap,u=p&&d.time<p.time+500&&d.delta<=p.delta&&d.direction===p.direction;if(!u){a.mousewheel.lastEventBeforeSnap=void 0,a.params.loop&&a.loopFix();var c=a.getTranslate()+r*i.sensitivity,h=a.isBeginning,v=a.isEnd;if(c>=a.minTranslate()&&(c=a.minTranslate()),c<=a.maxTranslate()&&(c=a.maxTranslate()),a.setTransition(0),a.setTranslate(c),a.updateProgress(),a.updateActiveIndex(),a.updateSlidesClasses(),(!h&&a.isBeginning||!v&&a.isEnd)&&a.updateSlidesClasses(),a.params.freeModeSticky){clearTimeout(a.mousewheel.timeout),a.mousewheel.timeout=void 0;var f=a.mousewheel.recentWheelEvents;f.length>=15&&f.shift();var g=f.length?f[f.length-1]:void 0,b=f[0];if(f.push(d),g&&(d.delta>g.delta||d.direction!==g.direction))f.splice(0);else if(f.length>=15&&d.time-b.time<500&&b.delta-d.delta>=1&&d.delta<=6){var w=r>0?.8:.2;a.mousewheel.lastEventBeforeSnap=d,f.splice(0),a.mousewheel.timeout=E((function(){a.slideToClosest(a.params.speed,!0,void 0,w)}),0)}a.mousewheel.timeout||(a.mousewheel.timeout=E((function(){a.mousewheel.lastEventBeforeSnap=d,f.splice(0),a.slideToClosest(a.params.speed,!0,void 0,.5)}),500))}if(u||a.emit("scroll",t),a.params.autoplay&&a.params.autoplayDisableOnInteraction&&a.autoplay.stop(),c===a.minTranslate()||c===a.maxTranslate())return!0}}else{var y={time:x(),delta:Math.abs(r),direction:Math.sign(r),raw:e},T=a.mousewheel.recentWheelEvents;T.length>=2&&T.shift();var C=T.length?T[T.length-1]:void 0;if(T.push(y),C?(y.direction!==C.direction||y.delta>C.delta||y.time>C.time+150)&&a.mousewheel.animateSlider(y):a.mousewheel.animateSlider(y),a.mousewheel.releaseScroll(y))return!0}return t.preventDefault?t.preventDefault():t.returnValue=!1,!1}},animateSlider:function(e){var t=this,a=l();return!(this.params.mousewheel.thresholdDelta&&e.delta<this.params.mousewheel.thresholdDelta)&&(!(this.params.mousewheel.thresholdTime&&x()-t.mousewheel.lastScrollTime<this.params.mousewheel.thresholdTime)&&(e.delta>=6&&x()-t.mousewheel.lastScrollTime<60||(e.direction<0?t.isEnd&&!t.params.loop||t.animating||(t.slideNext(),t.emit("scroll",e.raw)):t.isBeginning&&!t.params.loop||t.animating||(t.slidePrev(),t.emit("scroll",e.raw)),t.mousewheel.lastScrollTime=(new a.Date).getTime(),!1)))},releaseScroll:function(e){var t=this,a=t.params.mousewheel;if(e.direction<0){if(t.isEnd&&!t.params.loop&&a.releaseOnEdges)return!0}else if(t.isBeginning&&!t.params.loop&&a.releaseOnEdges)return!0;return!1},enable:function(){var e=this,t=J.event();if(e.params.cssMode)return e.wrapperEl.removeEventListener(t,e.mousewheel.handle),!0;if(!t)return!1;if(e.mousewheel.enabled)return!1;var a=e.$el;return"container"!==e.params.mousewheel.eventsTarget&&(a=m(e.params.mousewheel.eventsTarget)),a.on("mouseenter",e.mousewheel.handleMouseEnter),a.on("mouseleave",e.mousewheel.handleMouseLeave),a.on(t,e.mousewheel.handle),e.mousewheel.enabled=!0,!0},disable:function(){var e=this,t=J.event();if(e.params.cssMode)return e.wrapperEl.addEventListener(t,e.mousewheel.handle),!0;if(!t)return!1;if(!e.mousewheel.enabled)return!1;var a=e.$el;return"container"!==e.params.mousewheel.eventsTarget&&(a=m(e.params.mousewheel.eventsTarget)),a.off(t,e.mousewheel.handle),e.mousewheel.enabled=!1,!0}},Q={toggleEl:function(e,t){e[t?"addClass":"removeClass"](this.params.navigation.disabledClass),e[0]&&"BUTTON"===e[0].tagName&&(e[0].disabled=t)},update:function(){var e=this,t=e.params.navigation,a=e.navigation.toggleEl;if(!e.params.loop){var i=e.navigation,s=i.$nextEl,r=i.$prevEl;r&&r.length>0&&(e.isBeginning?a(r,!0):a(r,!1),e.params.watchOverflow&&e.enabled&&r[e.isLocked?"addClass":"removeClass"](t.lockClass)),s&&s.length>0&&(e.isEnd?a(s,!0):a(s,!1),e.params.watchOverflow&&e.enabled&&s[e.isLocked?"addClass":"removeClass"](t.lockClass))}},onPrevClick:function(e){var t=this;e.preventDefault(),t.isBeginning&&!t.params.loop||t.slidePrev()},onNextClick:function(e){var t=this;e.preventDefault(),t.isEnd&&!t.params.loop||t.slideNext()},init:function(){var e,t,a=this,i=a.params.navigation;(a.params.navigation=k(a.$el,a.params.navigation,a.params.createElements,{nextEl:"swiper-button-next",prevEl:"swiper-button-prev"}),i.nextEl||i.prevEl)&&(i.nextEl&&(e=m(i.nextEl),a.params.uniqueNavElements&&"string"==typeof i.nextEl&&e.length>1&&1===a.$el.find(i.nextEl).length&&(e=a.$el.find(i.nextEl))),i.prevEl&&(t=m(i.prevEl),a.params.uniqueNavElements&&"string"==typeof i.prevEl&&t.length>1&&1===a.$el.find(i.prevEl).length&&(t=a.$el.find(i.prevEl))),e&&e.length>0&&e.on("click",a.navigation.onNextClick),t&&t.length>0&&t.on("click",a.navigation.onPrevClick),M(a.navigation,{$nextEl:e,nextEl:e&&e[0],$prevEl:t,prevEl:t&&t[0]}),a.enabled||(e&&e.addClass(i.lockClass),t&&t.addClass(i.lockClass)))},destroy:function(){var e=this,t=e.navigation,a=t.$nextEl,i=t.$prevEl;a&&a.length&&(a.off("click",e.navigation.onNextClick),a.removeClass(e.params.navigation.disabledClass)),i&&i.length&&(i.off("click",e.navigation.onPrevClick),i.removeClass(e.params.navigation.disabledClass))}},ee={update:function(){var e=this,t=e.rtl,a=e.params.pagination;if(a.el&&e.pagination.el&&e.pagination.$el&&0!==e.pagination.$el.length){var i,s=e.virtual&&e.params.virtual.enabled?e.virtual.slides.length:e.slides.length,r=e.pagination.$el,n=e.params.loop?Math.ceil((s-2*e.loopedSlides)/e.params.slidesPerGroup):e.snapGrid.length;if(e.params.loop?((i=Math.ceil((e.activeIndex-e.loopedSlides)/e.params.slidesPerGroup))>s-1-2*e.loopedSlides&&(i-=s-2*e.loopedSlides),i>n-1&&(i-=n),i<0&&"bullets"!==e.params.paginationType&&(i=n+i)):i=void 0!==e.snapIndex?e.snapIndex:e.activeIndex||0,"bullets"===a.type&&e.pagination.bullets&&e.pagination.bullets.length>0){var l,o,d,p=e.pagination.bullets;if(a.dynamicBullets&&(e.pagination.bulletSize=p.eq(0)[e.isHorizontal()?"outerWidth":"outerHeight"](!0),r.css(e.isHorizontal()?"width":"height",e.pagination.bulletSize*(a.dynamicMainBullets+4)+"px"),a.dynamicMainBullets>1&&void 0!==e.previousIndex&&(e.pagination.dynamicBulletIndex+=i-e.previousIndex,e.pagination.dynamicBulletIndex>a.dynamicMainBullets-1?e.pagination.dynamicBulletIndex=a.dynamicMainBullets-1:e.pagination.dynamicBulletIndex<0&&(e.pagination.dynamicBulletIndex=0)),l=i-e.pagination.dynamicBulletIndex,d=((o=l+(Math.min(p.length,a.dynamicMainBullets)-1))+l)/2),p.removeClass(a.bulletActiveClass+" "+a.bulletActiveClass+"-next "+a.bulletActiveClass+"-next-next "+a.bulletActiveClass+"-prev "+a.bulletActiveClass+"-prev-prev "+a.bulletActiveClass+"-main"),r.length>1)p.each((function(e){var t=m(e),s=t.index();s===i&&t.addClass(a.bulletActiveClass),a.dynamicBullets&&(s>=l&&s<=o&&t.addClass(a.bulletActiveClass+"-main"),s===l&&t.prev().addClass(a.bulletActiveClass+"-prev").prev().addClass(a.bulletActiveClass+"-prev-prev"),s===o&&t.next().addClass(a.bulletActiveClass+"-next").next().addClass(a.bulletActiveClass+"-next-next"))}));else{var u=p.eq(i),c=u.index();if(u.addClass(a.bulletActiveClass),a.dynamicBullets){for(var h=p.eq(l),v=p.eq(o),f=l;f<=o;f+=1)p.eq(f).addClass(a.bulletActiveClass+"-main");if(e.params.loop)if(c>=p.length-a.dynamicMainBullets){for(var g=a.dynamicMainBullets;g>=0;g-=1)p.eq(p.length-g).addClass(a.bulletActiveClass+"-main");p.eq(p.length-a.dynamicMainBullets-1).addClass(a.bulletActiveClass+"-prev")}else h.prev().addClass(a.bulletActiveClass+"-prev").prev().addClass(a.bulletActiveClass+"-prev-prev"),v.next().addClass(a.bulletActiveClass+"-next").next().addClass(a.bulletActiveClass+"-next-next");else h.prev().addClass(a.bulletActiveClass+"-prev").prev().addClass(a.bulletActiveClass+"-prev-prev"),v.next().addClass(a.bulletActiveClass+"-next").next().addClass(a.bulletActiveClass+"-next-next")}}if(a.dynamicBullets){var b=Math.min(p.length,a.dynamicMainBullets+4),w=(e.pagination.bulletSize*b-e.pagination.bulletSize)/2-d*e.pagination.bulletSize,y=t?"right":"left";p.css(e.isHorizontal()?y:"top",w+"px")}}if("fraction"===a.type&&(r.find(P(a.currentClass)).text(a.formatFractionCurrent(i+1)),r.find(P(a.totalClass)).text(a.formatFractionTotal(n))),"progressbar"===a.type){var E;E=a.progressbarOpposite?e.isHorizontal()?"vertical":"horizontal":e.isHorizontal()?"horizontal":"vertical";var x=(i+1)/n,T=1,C=1;"horizontal"===E?T=x:C=x,r.find(P(a.progressbarFillClass)).transform("translate3d(0,0,0) scaleX("+T+") scaleY("+C+")").transition(e.params.speed)}"custom"===a.type&&a.renderCustom?(r.html(a.renderCustom(e,i+1,n)),e.emit("paginationRender",r[0])):e.emit("paginationUpdate",r[0]),e.params.watchOverflow&&e.enabled&&r[e.isLocked?"addClass":"removeClass"](a.lockClass)}},render:function(){var e=this,t=e.params.pagination;if(t.el&&e.pagination.el&&e.pagination.$el&&0!==e.pagination.$el.length){var a=e.virtual&&e.params.virtual.enabled?e.virtual.slides.length:e.slides.length,i=e.pagination.$el,s="";if("bullets"===t.type){var r=e.params.loop?Math.ceil((a-2*e.loopedSlides)/e.params.slidesPerGroup):e.snapGrid.length;e.params.freeMode&&!e.params.loop&&r>a&&(r=a);for(var n=0;n<r;n+=1)t.renderBullet?s+=t.renderBullet.call(e,n,t.bulletClass):s+="<"+t.bulletElement+' class="'+t.bulletClass+'"></'+t.bulletElement+">";i.html(s),e.pagination.bullets=i.find(P(t.bulletClass))}"fraction"===t.type&&(s=t.renderFraction?t.renderFraction.call(e,t.currentClass,t.totalClass):'<span class="'+t.currentClass+'"></span> / <span class="'+t.totalClass+'"></span>',i.html(s)),"progressbar"===t.type&&(s=t.renderProgressbar?t.renderProgressbar.call(e,t.progressbarFillClass):'<span class="'+t.progressbarFillClass+'"></span>',i.html(s)),"custom"!==t.type&&e.emit("paginationRender",e.pagination.$el[0])}},init:function(){var e=this;e.params.pagination=k(e.$el,e.params.pagination,e.params.createElements,{el:"swiper-pagination"});var t=e.params.pagination;if(t.el){var a=m(t.el);0!==a.length&&(e.params.uniqueNavElements&&"string"==typeof t.el&&a.length>1&&(a=e.$el.find(t.el)),"bullets"===t.type&&t.clickable&&a.addClass(t.clickableClass),a.addClass(t.modifierClass+t.type),"bullets"===t.type&&t.dynamicBullets&&(a.addClass(""+t.modifierClass+t.type+"-dynamic"),e.pagination.dynamicBulletIndex=0,t.dynamicMainBullets<1&&(t.dynamicMainBullets=1)),"progressbar"===t.type&&t.progressbarOpposite&&a.addClass(t.progressbarOppositeClass),t.clickable&&a.on("click",P(t.bulletClass),(function(t){t.preventDefault();var a=m(this).index()*e.params.slidesPerGroup;e.params.loop&&(a+=e.loopedSlides),e.slideTo(a)})),M(e.pagination,{$el:a,el:a[0]}),e.enabled||a.addClass(t.lockClass))}},destroy:function(){var e=this,t=e.params.pagination;if(t.el&&e.pagination.el&&e.pagination.$el&&0!==e.pagination.$el.length){var a=e.pagination.$el;a.removeClass(t.hiddenClass),a.removeClass(t.modifierClass+t.type),e.pagination.bullets&&e.pagination.bullets.removeClass(t.bulletActiveClass),t.clickable&&a.off("click",P(t.bulletClass))}}},te={setTranslate:function(){var e=this;if(e.params.scrollbar.el&&e.scrollbar.el){var t=e.scrollbar,a=e.rtlTranslate,i=e.progress,s=t.dragSize,r=t.trackSize,n=t.$dragEl,l=t.$el,o=e.params.scrollbar,d=s,p=(r-s)*i;a?(p=-p)>0?(d=s-p,p=0):-p+s>r&&(d=r+p):p<0?(d=s+p,p=0):p+s>r&&(d=r-p),e.isHorizontal()?(n.transform("translate3d("+p+"px, 0, 0)"),n[0].style.width=d+"px"):(n.transform("translate3d(0px, "+p+"px, 0)"),n[0].style.height=d+"px"),o.hide&&(clearTimeout(e.scrollbar.timeout),l[0].style.opacity=1,e.scrollbar.timeout=setTimeout((function(){l[0].style.opacity=0,l.transition(400)}),1e3))}},setTransition:function(e){var t=this;t.params.scrollbar.el&&t.scrollbar.el&&t.scrollbar.$dragEl.transition(e)},updateSize:function(){var e=this;if(e.params.scrollbar.el&&e.scrollbar.el){var t=e.scrollbar,a=t.$dragEl,i=t.$el;a[0].style.width="",a[0].style.height="";var s,r=e.isHorizontal()?i[0].offsetWidth:i[0].offsetHeight,n=e.size/e.virtualSize,l=n*(r/e.size);s="auto"===e.params.scrollbar.dragSize?r*n:parseInt(e.params.scrollbar.dragSize,10),e.isHorizontal()?a[0].style.width=s+"px":a[0].style.height=s+"px",i[0].style.display=n>=1?"none":"",e.params.scrollbar.hide&&(i[0].style.opacity=0),M(t,{trackSize:r,divider:n,moveDivider:l,dragSize:s}),e.params.watchOverflow&&e.enabled&&t.$el[e.isLocked?"addClass":"removeClass"](e.params.scrollbar.lockClass)}},getPointerPosition:function(e){return this.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},setDragPosition:function(e){var t,a=this,i=a.scrollbar,s=a.rtlTranslate,r=i.$el,n=i.dragSize,l=i.trackSize,o=i.dragStartPos;t=(i.getPointerPosition(e)-r.offset()[a.isHorizontal()?"left":"top"]-(null!==o?o:n/2))/(l-n),t=Math.max(Math.min(t,1),0),s&&(t=1-t);var d=a.minTranslate()+(a.maxTranslate()-a.minTranslate())*t;a.updateProgress(d),a.setTranslate(d),a.updateActiveIndex(),a.updateSlidesClasses()},onDragStart:function(e){var t=this,a=t.params.scrollbar,i=t.scrollbar,s=t.$wrapperEl,r=i.$el,n=i.$dragEl;t.scrollbar.isTouched=!0,t.scrollbar.dragStartPos=e.target===n[0]||e.target===n?i.getPointerPosition(e)-e.target.getBoundingClientRect()[t.isHorizontal()?"left":"top"]:null,e.preventDefault(),e.stopPropagation(),s.transition(100),n.transition(100),i.setDragPosition(e),clearTimeout(t.scrollbar.dragTimeout),r.transition(0),a.hide&&r.css("opacity",1),t.params.cssMode&&t.$wrapperEl.css("scroll-snap-type","none"),t.emit("scrollbarDragStart",e)},onDragMove:function(e){var t=this,a=t.scrollbar,i=t.$wrapperEl,s=a.$el,r=a.$dragEl;t.scrollbar.isTouched&&(e.preventDefault?e.preventDefault():e.returnValue=!1,a.setDragPosition(e),i.transition(0),s.transition(0),r.transition(0),t.emit("scrollbarDragMove",e))},onDragEnd:function(e){var t=this,a=t.params.scrollbar,i=t.scrollbar,s=t.$wrapperEl,r=i.$el;t.scrollbar.isTouched&&(t.scrollbar.isTouched=!1,t.params.cssMode&&(t.$wrapperEl.css("scroll-snap-type",""),s.transition("")),a.hide&&(clearTimeout(t.scrollbar.dragTimeout),t.scrollbar.dragTimeout=E((function(){r.css("opacity",0),r.transition(400)}),1e3)),t.emit("scrollbarDragEnd",e),a.snapOnRelease&&t.slideToClosest())},enableDraggable:function(){var e=this;if(e.params.scrollbar.el){var t=r(),a=e.scrollbar,i=e.touchEventsTouch,s=e.touchEventsDesktop,n=e.params,l=e.support,o=a.$el[0],d=!(!l.passiveListener||!n.passiveListeners)&&{passive:!1,capture:!1},p=!(!l.passiveListener||!n.passiveListeners)&&{passive:!0,capture:!1};o&&(l.touch?(o.addEventListener(i.start,e.scrollbar.onDragStart,d),o.addEventListener(i.move,e.scrollbar.onDragMove,d),o.addEventListener(i.end,e.scrollbar.onDragEnd,p)):(o.addEventListener(s.start,e.scrollbar.onDragStart,d),t.addEventListener(s.move,e.scrollbar.onDragMove,d),t.addEventListener(s.end,e.scrollbar.onDragEnd,p)))}},disableDraggable:function(){var e=this;if(e.params.scrollbar.el){var t=r(),a=e.scrollbar,i=e.touchEventsTouch,s=e.touchEventsDesktop,n=e.params,l=e.support,o=a.$el[0],d=!(!l.passiveListener||!n.passiveListeners)&&{passive:!1,capture:!1},p=!(!l.passiveListener||!n.passiveListeners)&&{passive:!0,capture:!1};o&&(l.touch?(o.removeEventListener(i.start,e.scrollbar.onDragStart,d),o.removeEventListener(i.move,e.scrollbar.onDragMove,d),o.removeEventListener(i.end,e.scrollbar.onDragEnd,p)):(o.removeEventListener(s.start,e.scrollbar.onDragStart,d),t.removeEventListener(s.move,e.scrollbar.onDragMove,d),t.removeEventListener(s.end,e.scrollbar.onDragEnd,p)))}},init:function(){var e=this,t=e.scrollbar,a=e.$el;e.params.scrollbar=k(a,e.params.scrollbar,e.params.createElements,{el:"swiper-scrollbar"});var i=e.params.scrollbar;if(i.el){var s=m(i.el);e.params.uniqueNavElements&&"string"==typeof i.el&&s.length>1&&1===a.find(i.el).length&&(s=a.find(i.el));var r=s.find("."+e.params.scrollbar.dragClass);0===r.length&&(r=m('<div class="'+e.params.scrollbar.dragClass+'"></div>'),s.append(r)),M(t,{$el:s,el:s[0],$dragEl:r,dragEl:r[0]}),i.draggable&&t.enableDraggable(),s&&s[e.enabled?"removeClass":"addClass"](e.params.scrollbar.lockClass)}},destroy:function(){this.scrollbar.disableDraggable()}},ae={setTransform:function(e,t){var a=this.rtl,i=m(e),s=a?-1:1,r=i.attr("data-swiper-parallax")||"0",n=i.attr("data-swiper-parallax-x"),l=i.attr("data-swiper-parallax-y"),o=i.attr("data-swiper-parallax-scale"),d=i.attr("data-swiper-parallax-opacity");if(n||l?(n=n||"0",l=l||"0"):this.isHorizontal()?(n=r,l="0"):(l=r,n="0"),n=n.indexOf("%")>=0?parseInt(n,10)*t*s+"%":n*t*s+"px",l=l.indexOf("%")>=0?parseInt(l,10)*t+"%":l*t+"px",null!=d){var p=d-(d-1)*(1-Math.abs(t));i[0].style.opacity=p}if(null==o)i.transform("translate3d("+n+", "+l+", 0px)");else{var u=o-(o-1)*(1-Math.abs(t));i.transform("translate3d("+n+", "+l+", 0px) scale("+u+")")}},setTranslate:function(){var e=this,t=e.$el,a=e.slides,i=e.progress,s=e.snapGrid;t.children("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((function(t){e.parallax.setTransform(t,i)})),a.each((function(t,a){var r=t.progress;e.params.slidesPerGroup>1&&"auto"!==e.params.slidesPerView&&(r+=Math.ceil(a/2)-i*(s.length-1)),r=Math.min(Math.max(r,-1),1),m(t).find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((function(t){e.parallax.setTransform(t,r)}))}))},setTransition:function(e){void 0===e&&(e=this.params.speed);this.$el.find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((function(t){var a=m(t),i=parseInt(a.attr("data-swiper-parallax-duration"),10)||e;0===e&&(i=0),a.transition(i)}))}},ie={getDistanceBetweenTouches:function(e){if(e.targetTouches.length<2)return 1;var t=e.targetTouches[0].pageX,a=e.targetTouches[0].pageY,i=e.targetTouches[1].pageX,s=e.targetTouches[1].pageY;return Math.sqrt(Math.pow(i-t,2)+Math.pow(s-a,2))},onGestureStart:function(e){var t=this,a=t.support,i=t.params.zoom,s=t.zoom,r=s.gesture;if(s.fakeGestureTouched=!1,s.fakeGestureMoved=!1,!a.gestures){if("touchstart"!==e.type||"touchstart"===e.type&&e.targetTouches.length<2)return;s.fakeGestureTouched=!0,r.scaleStart=ie.getDistanceBetweenTouches(e)}r.$slideEl&&r.$slideEl.length||(r.$slideEl=m(e.target).closest("."+t.params.slideClass),0===r.$slideEl.length&&(r.$slideEl=t.slides.eq(t.activeIndex)),r.$imageEl=r.$slideEl.find("img, svg, canvas, picture, .swiper-zoom-target"),r.$imageWrapEl=r.$imageEl.parent("."+i.containerClass),r.maxRatio=r.$imageWrapEl.attr("data-swiper-zoom")||i.maxRatio,0!==r.$imageWrapEl.length)?(r.$imageEl&&r.$imageEl.transition(0),t.zoom.isScaling=!0):r.$imageEl=void 0},onGestureChange:function(e){var t=this,a=t.support,i=t.params.zoom,s=t.zoom,r=s.gesture;if(!a.gestures){if("touchmove"!==e.type||"touchmove"===e.type&&e.targetTouches.length<2)return;s.fakeGestureMoved=!0,r.scaleMove=ie.getDistanceBetweenTouches(e)}r.$imageEl&&0!==r.$imageEl.length?(a.gestures?s.scale=e.scale*s.currentScale:s.scale=r.scaleMove/r.scaleStart*s.currentScale,s.scale>r.maxRatio&&(s.scale=r.maxRatio-1+Math.pow(s.scale-r.maxRatio+1,.5)),s.scale<i.minRatio&&(s.scale=i.minRatio+1-Math.pow(i.minRatio-s.scale+1,.5)),r.$imageEl.transform("translate3d(0,0,0) scale("+s.scale+")")):"gesturechange"===e.type&&s.onGestureStart(e)},onGestureEnd:function(e){var t=this,a=t.device,i=t.support,s=t.params.zoom,r=t.zoom,n=r.gesture;if(!i.gestures){if(!r.fakeGestureTouched||!r.fakeGestureMoved)return;if("touchend"!==e.type||"touchend"===e.type&&e.changedTouches.length<2&&!a.android)return;r.fakeGestureTouched=!1,r.fakeGestureMoved=!1}n.$imageEl&&0!==n.$imageEl.length&&(r.scale=Math.max(Math.min(r.scale,n.maxRatio),s.minRatio),n.$imageEl.transition(t.params.speed).transform("translate3d(0,0,0) scale("+r.scale+")"),r.currentScale=r.scale,r.isScaling=!1,1===r.scale&&(n.$slideEl=void 0))},onTouchStart:function(e){var t=this.device,a=this.zoom,i=a.gesture,s=a.image;i.$imageEl&&0!==i.$imageEl.length&&(s.isTouched||(t.android&&e.cancelable&&e.preventDefault(),s.isTouched=!0,s.touchesStart.x="touchstart"===e.type?e.targetTouches[0].pageX:e.pageX,s.touchesStart.y="touchstart"===e.type?e.targetTouches[0].pageY:e.pageY))},onTouchMove:function(e){var t=this,a=t.zoom,i=a.gesture,s=a.image,r=a.velocity;if(i.$imageEl&&0!==i.$imageEl.length&&(t.allowClick=!1,s.isTouched&&i.$slideEl)){s.isMoved||(s.width=i.$imageEl[0].offsetWidth,s.height=i.$imageEl[0].offsetHeight,s.startX=T(i.$imageWrapEl[0],"x")||0,s.startY=T(i.$imageWrapEl[0],"y")||0,i.slideWidth=i.$slideEl[0].offsetWidth,i.slideHeight=i.$slideEl[0].offsetHeight,i.$imageWrapEl.transition(0));var n=s.width*a.scale,l=s.height*a.scale;if(!(n<i.slideWidth&&l<i.slideHeight)){if(s.minX=Math.min(i.slideWidth/2-n/2,0),s.maxX=-s.minX,s.minY=Math.min(i.slideHeight/2-l/2,0),s.maxY=-s.minY,s.touchesCurrent.x="touchmove"===e.type?e.targetTouches[0].pageX:e.pageX,s.touchesCurrent.y="touchmove"===e.type?e.targetTouches[0].pageY:e.pageY,!s.isMoved&&!a.isScaling){if(t.isHorizontal()&&(Math.floor(s.minX)===Math.floor(s.startX)&&s.touchesCurrent.x<s.touchesStart.x||Math.floor(s.maxX)===Math.floor(s.startX)&&s.touchesCurrent.x>s.touchesStart.x))return void(s.isTouched=!1);if(!t.isHorizontal()&&(Math.floor(s.minY)===Math.floor(s.startY)&&s.touchesCurrent.y<s.touchesStart.y||Math.floor(s.maxY)===Math.floor(s.startY)&&s.touchesCurrent.y>s.touchesStart.y))return void(s.isTouched=!1)}e.cancelable&&e.preventDefault(),e.stopPropagation(),s.isMoved=!0,s.currentX=s.touchesCurrent.x-s.touchesStart.x+s.startX,s.currentY=s.touchesCurrent.y-s.touchesStart.y+s.startY,s.currentX<s.minX&&(s.currentX=s.minX+1-Math.pow(s.minX-s.currentX+1,.8)),s.currentX>s.maxX&&(s.currentX=s.maxX-1+Math.pow(s.currentX-s.maxX+1,.8)),s.currentY<s.minY&&(s.currentY=s.minY+1-Math.pow(s.minY-s.currentY+1,.8)),s.currentY>s.maxY&&(s.currentY=s.maxY-1+Math.pow(s.currentY-s.maxY+1,.8)),r.prevPositionX||(r.prevPositionX=s.touchesCurrent.x),r.prevPositionY||(r.prevPositionY=s.touchesCurrent.y),r.prevTime||(r.prevTime=Date.now()),r.x=(s.touchesCurrent.x-r.prevPositionX)/(Date.now()-r.prevTime)/2,r.y=(s.touchesCurrent.y-r.prevPositionY)/(Date.now()-r.prevTime)/2,Math.abs(s.touchesCurrent.x-r.prevPositionX)<2&&(r.x=0),Math.abs(s.touchesCurrent.y-r.prevPositionY)<2&&(r.y=0),r.prevPositionX=s.touchesCurrent.x,r.prevPositionY=s.touchesCurrent.y,r.prevTime=Date.now(),i.$imageWrapEl.transform("translate3d("+s.currentX+"px, "+s.currentY+"px,0)")}}},onTouchEnd:function(){var e=this.zoom,t=e.gesture,a=e.image,i=e.velocity;if(t.$imageEl&&0!==t.$imageEl.length){if(!a.isTouched||!a.isMoved)return a.isTouched=!1,void(a.isMoved=!1);a.isTouched=!1,a.isMoved=!1;var s=300,r=300,n=i.x*s,l=a.currentX+n,o=i.y*r,d=a.currentY+o;0!==i.x&&(s=Math.abs((l-a.currentX)/i.x)),0!==i.y&&(r=Math.abs((d-a.currentY)/i.y));var p=Math.max(s,r);a.currentX=l,a.currentY=d;var u=a.width*e.scale,c=a.height*e.scale;a.minX=Math.min(t.slideWidth/2-u/2,0),a.maxX=-a.minX,a.minY=Math.min(t.slideHeight/2-c/2,0),a.maxY=-a.minY,a.currentX=Math.max(Math.min(a.currentX,a.maxX),a.minX),a.currentY=Math.max(Math.min(a.currentY,a.maxY),a.minY),t.$imageWrapEl.transition(p).transform("translate3d("+a.currentX+"px, "+a.currentY+"px,0)")}},onTransitionEnd:function(){var e=this,t=e.zoom,a=t.gesture;a.$slideEl&&e.previousIndex!==e.activeIndex&&(a.$imageEl&&a.$imageEl.transform("translate3d(0,0,0) scale(1)"),a.$imageWrapEl&&a.$imageWrapEl.transform("translate3d(0,0,0)"),t.scale=1,t.currentScale=1,a.$slideEl=void 0,a.$imageEl=void 0,a.$imageWrapEl=void 0)},toggle:function(e){var t=this.zoom;t.scale&&1!==t.scale?t.out():t.in(e)},in:function(e){var t,a,i,s,r,n,o,d,p,u,c,h,v,f,g,b,w=this,y=l(),E=w.zoom,x=w.params.zoom,T=E.gesture,C=E.image;(T.$slideEl||(e&&e.target&&(T.$slideEl=m(e.target).closest("."+w.params.slideClass)),T.$slideEl||(w.params.virtual&&w.params.virtual.enabled&&w.virtual?T.$slideEl=w.$wrapperEl.children("."+w.params.slideActiveClass):T.$slideEl=w.slides.eq(w.activeIndex)),T.$imageEl=T.$slideEl.find("img, svg, canvas, picture, .swiper-zoom-target"),T.$imageWrapEl=T.$imageEl.parent("."+x.containerClass)),T.$imageEl&&0!==T.$imageEl.length&&T.$imageWrapEl&&0!==T.$imageWrapEl.length)&&(T.$slideEl.addClass(""+x.zoomedSlideClass),void 0===C.touchesStart.x&&e?(t="touchend"===e.type?e.changedTouches[0].pageX:e.pageX,a="touchend"===e.type?e.changedTouches[0].pageY:e.pageY):(t=C.touchesStart.x,a=C.touchesStart.y),E.scale=T.$imageWrapEl.attr("data-swiper-zoom")||x.maxRatio,E.currentScale=T.$imageWrapEl.attr("data-swiper-zoom")||x.maxRatio,e?(g=T.$slideEl[0].offsetWidth,b=T.$slideEl[0].offsetHeight,i=T.$slideEl.offset().left+y.scrollX+g/2-t,s=T.$slideEl.offset().top+y.scrollY+b/2-a,o=T.$imageEl[0].offsetWidth,d=T.$imageEl[0].offsetHeight,p=o*E.scale,u=d*E.scale,v=-(c=Math.min(g/2-p/2,0)),f=-(h=Math.min(b/2-u/2,0)),(r=i*E.scale)<c&&(r=c),r>v&&(r=v),(n=s*E.scale)<h&&(n=h),n>f&&(n=f)):(r=0,n=0),T.$imageWrapEl.transition(300).transform("translate3d("+r+"px, "+n+"px,0)"),T.$imageEl.transition(300).transform("translate3d(0,0,0) scale("+E.scale+")"))},out:function(){var e=this,t=e.zoom,a=e.params.zoom,i=t.gesture;i.$slideEl||(e.params.virtual&&e.params.virtual.enabled&&e.virtual?i.$slideEl=e.$wrapperEl.children("."+e.params.slideActiveClass):i.$slideEl=e.slides.eq(e.activeIndex),i.$imageEl=i.$slideEl.find("img, svg, canvas, picture, .swiper-zoom-target"),i.$imageWrapEl=i.$imageEl.parent("."+a.containerClass)),i.$imageEl&&0!==i.$imageEl.length&&i.$imageWrapEl&&0!==i.$imageWrapEl.length&&(t.scale=1,t.currentScale=1,i.$imageWrapEl.transition(300).transform("translate3d(0,0,0)"),i.$imageEl.transition(300).transform("translate3d(0,0,0) scale(1)"),i.$slideEl.removeClass(""+a.zoomedSlideClass),i.$slideEl=void 0)},toggleGestures:function(e){var t=this,a=t.zoom,i=a.slideSelector,s=a.passiveListener;t.$wrapperEl[e]("gesturestart",i,a.onGestureStart,s),t.$wrapperEl[e]("gesturechange",i,a.onGestureChange,s),t.$wrapperEl[e]("gestureend",i,a.onGestureEnd,s)},enableGestures:function(){this.zoom.gesturesEnabled||(this.zoom.gesturesEnabled=!0,this.zoom.toggleGestures("on"))},disableGestures:function(){this.zoom.gesturesEnabled&&(this.zoom.gesturesEnabled=!1,this.zoom.toggleGestures("off"))},enable:function(){var e=this,t=e.support,a=e.zoom;if(!a.enabled){a.enabled=!0;var i=!("touchstart"!==e.touchEvents.start||!t.passiveListener||!e.params.passiveListeners)&&{passive:!0,capture:!1},s=!t.passiveListener||{passive:!1,capture:!0},r="."+e.params.slideClass;e.zoom.passiveListener=i,e.zoom.slideSelector=r,t.gestures?(e.$wrapperEl.on(e.touchEvents.start,e.zoom.enableGestures,i),e.$wrapperEl.on(e.touchEvents.end,e.zoom.disableGestures,i)):"touchstart"===e.touchEvents.start&&(e.$wrapperEl.on(e.touchEvents.start,r,a.onGestureStart,i),e.$wrapperEl.on(e.touchEvents.move,r,a.onGestureChange,s),e.$wrapperEl.on(e.touchEvents.end,r,a.onGestureEnd,i),e.touchEvents.cancel&&e.$wrapperEl.on(e.touchEvents.cancel,r,a.onGestureEnd,i)),e.$wrapperEl.on(e.touchEvents.move,"."+e.params.zoom.containerClass,a.onTouchMove,s)}},disable:function(){var e=this,t=e.zoom;if(t.enabled){var a=e.support;e.zoom.enabled=!1;var i=!("touchstart"!==e.touchEvents.start||!a.passiveListener||!e.params.passiveListeners)&&{passive:!0,capture:!1},s=!a.passiveListener||{passive:!1,capture:!0},r="."+e.params.slideClass;a.gestures?(e.$wrapperEl.off(e.touchEvents.start,e.zoom.enableGestures,i),e.$wrapperEl.off(e.touchEvents.end,e.zoom.disableGestures,i)):"touchstart"===e.touchEvents.start&&(e.$wrapperEl.off(e.touchEvents.start,r,t.onGestureStart,i),e.$wrapperEl.off(e.touchEvents.move,r,t.onGestureChange,s),e.$wrapperEl.off(e.touchEvents.end,r,t.onGestureEnd,i),e.touchEvents.cancel&&e.$wrapperEl.off(e.touchEvents.cancel,r,t.onGestureEnd,i)),e.$wrapperEl.off(e.touchEvents.move,"."+e.params.zoom.containerClass,t.onTouchMove,s)}}},se={loadInSlide:function(e,t){void 0===t&&(t=!0);var a=this,i=a.params.lazy;if(void 0!==e&&0!==a.slides.length){var s=a.virtual&&a.params.virtual.enabled?a.$wrapperEl.children("."+a.params.slideClass+'[data-swiper-slide-index="'+e+'"]'):a.slides.eq(e),r=s.find("."+i.elementClass+":not(."+i.loadedClass+"):not(."+i.loadingClass+")");!s.hasClass(i.elementClass)||s.hasClass(i.loadedClass)||s.hasClass(i.loadingClass)||r.push(s[0]),0!==r.length&&r.each((function(e){var r=m(e);r.addClass(i.loadingClass);var n=r.attr("data-background"),l=r.attr("data-src"),o=r.attr("data-srcset"),d=r.attr("data-sizes"),p=r.parent("picture");a.loadImage(r[0],l||n,o,d,!1,(function(){if(null!=a&&a&&(!a||a.params)&&!a.destroyed){if(n?(r.css("background-image",'url("'+n+'")'),r.removeAttr("data-background")):(o&&(r.attr("srcset",o),r.removeAttr("data-srcset")),d&&(r.attr("sizes",d),r.removeAttr("data-sizes")),p.length&&p.children("source").each((function(e){var t=m(e);t.attr("data-srcset")&&(t.attr("srcset",t.attr("data-srcset")),t.removeAttr("data-srcset"))})),l&&(r.attr("src",l),r.removeAttr("data-src"))),r.addClass(i.loadedClass).removeClass(i.loadingClass),s.find("."+i.preloaderClass).remove(),a.params.loop&&t){var e=s.attr("data-swiper-slide-index");if(s.hasClass(a.params.slideDuplicateClass)){var u=a.$wrapperEl.children('[data-swiper-slide-index="'+e+'"]:not(.'+a.params.slideDuplicateClass+")");a.lazy.loadInSlide(u.index(),!1)}else{var c=a.$wrapperEl.children("."+a.params.slideDuplicateClass+'[data-swiper-slide-index="'+e+'"]');a.lazy.loadInSlide(c.index(),!1)}}a.emit("lazyImageReady",s[0],r[0]),a.params.autoHeight&&a.updateAutoHeight()}})),a.emit("lazyImageLoad",s[0],r[0])}))}},load:function(){var e=this,t=e.$wrapperEl,a=e.params,i=e.slides,s=e.activeIndex,r=e.virtual&&a.virtual.enabled,n=a.lazy,l=a.slidesPerView;function o(e){if(r){if(t.children("."+a.slideClass+'[data-swiper-slide-index="'+e+'"]').length)return!0}else if(i[e])return!0;return!1}function d(e){return r?m(e).attr("data-swiper-slide-index"):m(e).index()}if("auto"===l&&(l=0),e.lazy.initialImageLoaded||(e.lazy.initialImageLoaded=!0),e.params.watchSlidesVisibility)t.children("."+a.slideVisibleClass).each((function(t){var a=r?m(t).attr("data-swiper-slide-index"):m(t).index();e.lazy.loadInSlide(a)}));else if(l>1)for(var p=s;p<s+l;p+=1)o(p)&&e.lazy.loadInSlide(p);else e.lazy.loadInSlide(s);if(n.loadPrevNext)if(l>1||n.loadPrevNextAmount&&n.loadPrevNextAmount>1){for(var u=n.loadPrevNextAmount,c=l,h=Math.min(s+c+Math.max(u,c),i.length),v=Math.max(s-Math.max(c,u),0),f=s+l;f<h;f+=1)o(f)&&e.lazy.loadInSlide(f);for(var g=v;g<s;g+=1)o(g)&&e.lazy.loadInSlide(g)}else{var b=t.children("."+a.slideNextClass);b.length>0&&e.lazy.loadInSlide(d(b));var w=t.children("."+a.slidePrevClass);w.length>0&&e.lazy.loadInSlide(d(w))}},checkInViewOnLoad:function(){var e=l(),t=this;if(t&&!t.destroyed){var a=t.params.lazy.scrollingElement?m(t.params.lazy.scrollingElement):m(e),i=a[0]===e,s=i?e.innerWidth:a[0].offsetWidth,r=i?e.innerHeight:a[0].offsetHeight,n=t.$el.offset(),o=!1;t.rtlTranslate&&(n.left-=t.$el[0].scrollLeft);for(var d=[[n.left,n.top],[n.left+t.width,n.top],[n.left,n.top+t.height],[n.left+t.width,n.top+t.height]],p=0;p<d.length;p+=1){var u=d[p];if(u[0]>=0&&u[0]<=s&&u[1]>=0&&u[1]<=r){if(0===u[0]&&0===u[1])continue;o=!0}}var c=!("touchstart"!==t.touchEvents.start||!t.support.passiveListener||!t.params.passiveListeners)&&{passive:!0,capture:!1};o?(t.lazy.load(),a.off("scroll",t.lazy.checkInViewOnLoad,c)):t.lazy.scrollHandlerAttached||(t.lazy.scrollHandlerAttached=!0,a.on("scroll",t.lazy.checkInViewOnLoad,c))}}},re={LinearSpline:function(e,t){var a,i,s,r,n,l=function(e,t){for(i=-1,a=e.length;a-i>1;)e[s=a+i>>1]<=t?i=s:a=s;return a};return this.x=e,this.y=t,this.lastIndex=e.length-1,this.interpolate=function(e){return e?(n=l(this.x,e),r=n-1,(e-this.x[r])*(this.y[n]-this.y[r])/(this.x[n]-this.x[r])+this.y[r]):0},this},getInterpolateFunction:function(e){var t=this;t.controller.spline||(t.controller.spline=t.params.loop?new re.LinearSpline(t.slidesGrid,e.slidesGrid):new re.LinearSpline(t.snapGrid,e.snapGrid))},setTranslate:function(e,t){var a,i,s=this,r=s.controller.control,n=s.constructor;function l(e){var t=s.rtlTranslate?-s.translate:s.translate;"slide"===s.params.controller.by&&(s.controller.getInterpolateFunction(e),i=-s.controller.spline.interpolate(-t)),i&&"container"!==s.params.controller.by||(a=(e.maxTranslate()-e.minTranslate())/(s.maxTranslate()-s.minTranslate()),i=(t-s.minTranslate())*a+e.minTranslate()),s.params.controller.inverse&&(i=e.maxTranslate()-i),e.updateProgress(i),e.setTranslate(i,s),e.updateActiveIndex(),e.updateSlidesClasses()}if(Array.isArray(r))for(var o=0;o<r.length;o+=1)r[o]!==t&&r[o]instanceof n&&l(r[o]);else r instanceof n&&t!==r&&l(r)},setTransition:function(e,t){var a,i=this,s=i.constructor,r=i.controller.control;function n(t){t.setTransition(e,i),0!==e&&(t.transitionStart(),t.params.autoHeight&&E((function(){t.updateAutoHeight()})),t.$wrapperEl.transitionEnd((function(){r&&(t.params.loop&&"slide"===i.params.controller.by&&t.loopFix(),t.transitionEnd())})))}if(Array.isArray(r))for(a=0;a<r.length;a+=1)r[a]!==t&&r[a]instanceof s&&n(r[a]);else r instanceof s&&t!==r&&n(r)}},ne={getRandomNumber:function(e){void 0===e&&(e=16);return"x".repeat(e).replace(/x/g,(function(){return Math.round(16*Math.random()).toString(16)}))},makeElFocusable:function(e){return e.attr("tabIndex","0"),e},makeElNotFocusable:function(e){return e.attr("tabIndex","-1"),e},addElRole:function(e,t){return e.attr("role",t),e},addElRoleDescription:function(e,t){return e.attr("aria-roledescription",t),e},addElControls:function(e,t){return e.attr("aria-controls",t),e},addElLabel:function(e,t){return e.attr("aria-label",t),e},addElId:function(e,t){return e.attr("id",t),e},addElLive:function(e,t){return e.attr("aria-live",t),e},disableEl:function(e){return e.attr("aria-disabled",!0),e},enableEl:function(e){return e.attr("aria-disabled",!1),e},onEnterOrSpaceKey:function(e){if(13===e.keyCode||32===e.keyCode){var t=this,a=t.params.a11y,i=m(e.target);t.navigation&&t.navigation.$nextEl&&i.is(t.navigation.$nextEl)&&(t.isEnd&&!t.params.loop||t.slideNext(),t.isEnd?t.a11y.notify(a.lastSlideMessage):t.a11y.notify(a.nextSlideMessage)),t.navigation&&t.navigation.$prevEl&&i.is(t.navigation.$prevEl)&&(t.isBeginning&&!t.params.loop||t.slidePrev(),t.isBeginning?t.a11y.notify(a.firstSlideMessage):t.a11y.notify(a.prevSlideMessage)),t.pagination&&i.is(P(t.params.pagination.bulletClass))&&i[0].click()}},notify:function(e){var t=this.a11y.liveRegion;0!==t.length&&(t.html(""),t.html(e))},updateNavigation:function(){var e=this;if(!e.params.loop&&e.navigation){var t=e.navigation,a=t.$nextEl,i=t.$prevEl;i&&i.length>0&&(e.isBeginning?(e.a11y.disableEl(i),e.a11y.makeElNotFocusable(i)):(e.a11y.enableEl(i),e.a11y.makeElFocusable(i))),a&&a.length>0&&(e.isEnd?(e.a11y.disableEl(a),e.a11y.makeElNotFocusable(a)):(e.a11y.enableEl(a),e.a11y.makeElFocusable(a)))}},updatePagination:function(){var e=this,t=e.params.a11y;e.pagination&&e.params.pagination.clickable&&e.pagination.bullets&&e.pagination.bullets.length&&e.pagination.bullets.each((function(a){var i=m(a);e.a11y.makeElFocusable(i),e.params.pagination.renderBullet||(e.a11y.addElRole(i,"button"),e.a11y.addElLabel(i,t.paginationBulletMessage.replace(/\{\{index\}\}/,i.index()+1)))}))},init:function(){var e=this,t=e.params.a11y;e.$el.append(e.a11y.liveRegion);var a=e.$el;t.containerRoleDescriptionMessage&&e.a11y.addElRoleDescription(a,t.containerRoleDescriptionMessage),t.containerMessage&&e.a11y.addElLabel(a,t.containerMessage);var i=e.$wrapperEl,s=i.attr("id")||"swiper-wrapper-"+e.a11y.getRandomNumber(16),r=e.params.autoplay&&e.params.autoplay.enabled?"off":"polite";e.a11y.addElId(i,s),e.a11y.addElLive(i,r),t.itemRoleDescriptionMessage&&e.a11y.addElRoleDescription(m(e.slides),t.itemRoleDescriptionMessage),e.a11y.addElRole(m(e.slides),t.slideRole);var n,l,o=e.params.loop?e.slides.filter((function(t){return!t.classList.contains(e.params.slideDuplicateClass)})).length:e.slides.length;e.slides.each((function(a,i){var s=m(a),r=e.params.loop?parseInt(s.attr("data-swiper-slide-index"),10):i,n=t.slideLabelMessage.replace(/\{\{index\}\}/,r+1).replace(/\{\{slidesLength\}\}/,o);e.a11y.addElLabel(s,n)})),e.navigation&&e.navigation.$nextEl&&(n=e.navigation.$nextEl),e.navigation&&e.navigation.$prevEl&&(l=e.navigation.$prevEl),n&&n.length&&(e.a11y.makeElFocusable(n),"BUTTON"!==n[0].tagName&&(e.a11y.addElRole(n,"button"),n.on("keydown",e.a11y.onEnterOrSpaceKey)),e.a11y.addElLabel(n,t.nextSlideMessage),e.a11y.addElControls(n,s)),l&&l.length&&(e.a11y.makeElFocusable(l),"BUTTON"!==l[0].tagName&&(e.a11y.addElRole(l,"button"),l.on("keydown",e.a11y.onEnterOrSpaceKey)),e.a11y.addElLabel(l,t.prevSlideMessage),e.a11y.addElControls(l,s)),e.pagination&&e.params.pagination.clickable&&e.pagination.bullets&&e.pagination.bullets.length&&e.pagination.$el.on("keydown",P(e.params.pagination.bulletClass),e.a11y.onEnterOrSpaceKey)},destroy:function(){var e,t,a=this;a.a11y.liveRegion&&a.a11y.liveRegion.length>0&&a.a11y.liveRegion.remove(),a.navigation&&a.navigation.$nextEl&&(e=a.navigation.$nextEl),a.navigation&&a.navigation.$prevEl&&(t=a.navigation.$prevEl),e&&e.off("keydown",a.a11y.onEnterOrSpaceKey),t&&t.off("keydown",a.a11y.onEnterOrSpaceKey),a.pagination&&a.params.pagination.clickable&&a.pagination.bullets&&a.pagination.bullets.length&&a.pagination.$el.off("keydown",P(a.params.pagination.bulletClass),a.a11y.onEnterOrSpaceKey)}},le={init:function(){var e=this,t=l();if(e.params.history){if(!t.history||!t.history.pushState)return e.params.history.enabled=!1,void(e.params.hashNavigation.enabled=!0);var a=e.history;a.initialized=!0,a.paths=le.getPathValues(e.params.url),(a.paths.key||a.paths.value)&&(a.scrollToSlide(0,a.paths.value,e.params.runCallbacksOnInit),e.params.history.replaceState||t.addEventListener("popstate",e.history.setHistoryPopState))}},destroy:function(){var e=l();this.params.history.replaceState||e.removeEventListener("popstate",this.history.setHistoryPopState)},setHistoryPopState:function(){var e=this;e.history.paths=le.getPathValues(e.params.url),e.history.scrollToSlide(e.params.speed,e.history.paths.value,!1)},getPathValues:function(e){var t=l(),a=(e?new URL(e):t.location).pathname.slice(1).split("/").filter((function(e){return""!==e})),i=a.length;return{key:a[i-2],value:a[i-1]}},setHistory:function(e,t){var a=this,i=l();if(a.history.initialized&&a.params.history.enabled){var s;s=a.params.url?new URL(a.params.url):i.location;var r=a.slides.eq(t),n=le.slugify(r.attr("data-history"));if(a.params.history.root.length>0){var o=a.params.history.root;"/"===o[o.length-1]&&(o=o.slice(0,o.length-1)),n=o+"/"+e+"/"+n}else s.pathname.includes(e)||(n=e+"/"+n);var d=i.history.state;d&&d.value===n||(a.params.history.replaceState?i.history.replaceState({value:n},null,n):i.history.pushState({value:n},null,n))}},slugify:function(e){return e.toString().replace(/\s+/g,"-").replace(/[^\w-]+/g,"").replace(/--+/g,"-").replace(/^-+/,"").replace(/-+$/,"")},scrollToSlide:function(e,t,a){var i=this;if(t)for(var s=0,r=i.slides.length;s<r;s+=1){var n=i.slides.eq(s);if(le.slugify(n.attr("data-history"))===t&&!n.hasClass(i.params.slideDuplicateClass)){var l=n.index();i.slideTo(l,e,a)}}else i.slideTo(0,e,a)}},oe={onHashChange:function(){var e=this,t=r();e.emit("hashChange");var a=t.location.hash.replace("#","");if(a!==e.slides.eq(e.activeIndex).attr("data-hash")){var i=e.$wrapperEl.children("."+e.params.slideClass+'[data-hash="'+a+'"]').index();if(void 0===i)return;e.slideTo(i)}},setHash:function(){var e=this,t=l(),a=r();if(e.hashNavigation.initialized&&e.params.hashNavigation.enabled)if(e.params.hashNavigation.replaceState&&t.history&&t.history.replaceState)t.history.replaceState(null,null,"#"+e.slides.eq(e.activeIndex).attr("data-hash")||""),e.emit("hashSet");else{var i=e.slides.eq(e.activeIndex),s=i.attr("data-hash")||i.attr("data-history");a.location.hash=s||"",e.emit("hashSet")}},init:function(){var e=this,t=r(),a=l();if(!(!e.params.hashNavigation.enabled||e.params.history&&e.params.history.enabled)){e.hashNavigation.initialized=!0;var i=t.location.hash.replace("#","");if(i)for(var s=0,n=e.slides.length;s<n;s+=1){var o=e.slides.eq(s);if((o.attr("data-hash")||o.attr("data-history"))===i&&!o.hasClass(e.params.slideDuplicateClass)){var d=o.index();e.slideTo(d,0,e.params.runCallbacksOnInit,!0)}}e.params.hashNavigation.watchState&&m(a).on("hashchange",e.hashNavigation.onHashChange)}},destroy:function(){var e=l();this.params.hashNavigation.watchState&&m(e).off("hashchange",this.hashNavigation.onHashChange)}},de={run:function(){var e=this,t=e.slides.eq(e.activeIndex),a=e.params.autoplay.delay;t.attr("data-swiper-autoplay")&&(a=t.attr("data-swiper-autoplay")||e.params.autoplay.delay),clearTimeout(e.autoplay.timeout),e.autoplay.timeout=E((function(){var t;e.params.autoplay.reverseDirection?e.params.loop?(e.loopFix(),t=e.slidePrev(e.params.speed,!0,!0),e.emit("autoplay")):e.isBeginning?e.params.autoplay.stopOnLastSlide?e.autoplay.stop():(t=e.slideTo(e.slides.length-1,e.params.speed,!0,!0),e.emit("autoplay")):(t=e.slidePrev(e.params.speed,!0,!0),e.emit("autoplay")):e.params.loop?(e.loopFix(),t=e.slideNext(e.params.speed,!0,!0),e.emit("autoplay")):e.isEnd?e.params.autoplay.stopOnLastSlide?e.autoplay.stop():(t=e.slideTo(0,e.params.speed,!0,!0),e.emit("autoplay")):(t=e.slideNext(e.params.speed,!0,!0),e.emit("autoplay")),(e.params.cssMode&&e.autoplay.running||!1===t)&&e.autoplay.run()}),a)},start:function(){var e=this;return void 0===e.autoplay.timeout&&(!e.autoplay.running&&(e.autoplay.running=!0,e.emit("autoplayStart"),e.autoplay.run(),!0))},stop:function(){var e=this;return!!e.autoplay.running&&(void 0!==e.autoplay.timeout&&(e.autoplay.timeout&&(clearTimeout(e.autoplay.timeout),e.autoplay.timeout=void 0),e.autoplay.running=!1,e.emit("autoplayStop"),!0))},pause:function(e){var t=this;t.autoplay.running&&(t.autoplay.paused||(t.autoplay.timeout&&clearTimeout(t.autoplay.timeout),t.autoplay.paused=!0,0!==e&&t.params.autoplay.waitForTransition?["transitionend","webkitTransitionEnd"].forEach((function(e){t.$wrapperEl[0].addEventListener(e,t.autoplay.onTransitionEnd)})):(t.autoplay.paused=!1,t.autoplay.run())))},onVisibilityChange:function(){var e=this,t=r();"hidden"===t.visibilityState&&e.autoplay.running&&e.autoplay.pause(),"visible"===t.visibilityState&&e.autoplay.paused&&(e.autoplay.run(),e.autoplay.paused=!1)},onTransitionEnd:function(e){var t=this;t&&!t.destroyed&&t.$wrapperEl&&e.target===t.$wrapperEl[0]&&(["transitionend","webkitTransitionEnd"].forEach((function(e){t.$wrapperEl[0].removeEventListener(e,t.autoplay.onTransitionEnd)})),t.autoplay.paused=!1,t.autoplay.running?t.autoplay.run():t.autoplay.stop())},onMouseEnter:function(){var e=this;e.params.autoplay.disableOnInteraction?e.autoplay.stop():e.autoplay.pause(),["transitionend","webkitTransitionEnd"].forEach((function(t){e.$wrapperEl[0].removeEventListener(t,e.autoplay.onTransitionEnd)}))},onMouseLeave:function(){var e=this;e.params.autoplay.disableOnInteraction||(e.autoplay.paused=!1,e.autoplay.run())},attachMouseEvents:function(){var e=this;e.params.autoplay.pauseOnMouseEnter&&(e.$el.on("mouseenter",e.autoplay.onMouseEnter),e.$el.on("mouseleave",e.autoplay.onMouseLeave))},detachMouseEvents:function(){var e=this;e.$el.off("mouseenter",e.autoplay.onMouseEnter),e.$el.off("mouseleave",e.autoplay.onMouseLeave)}},pe={setTranslate:function(){for(var e=this,t=e.slides,a=0;a<t.length;a+=1){var i=e.slides.eq(a),s=-i[0].swiperSlideOffset;e.params.virtualTranslate||(s-=e.translate);var r=0;e.isHorizontal()||(r=s,s=0);var n=e.params.fadeEffect.crossFade?Math.max(1-Math.abs(i[0].progress),0):1+Math.min(Math.max(i[0].progress,-1),0);i.css({opacity:n}).transform("translate3d("+s+"px, "+r+"px, 0px)")}},setTransition:function(e){var t=this,a=t.slides,i=t.$wrapperEl;if(a.transition(e),t.params.virtualTranslate&&0!==e){var s=!1;a.transitionEnd((function(){if(!s&&t&&!t.destroyed){s=!0,t.animating=!1;for(var e=["webkitTransitionEnd","transitionend"],a=0;a<e.length;a+=1)i.trigger(e[a])}}))}}},ue={setTranslate:function(){var e,t=this,a=t.$el,i=t.$wrapperEl,s=t.slides,r=t.width,n=t.height,l=t.rtlTranslate,o=t.size,d=t.browser,p=t.params.cubeEffect,u=t.isHorizontal(),c=t.virtual&&t.params.virtual.enabled,h=0;p.shadow&&(u?(0===(e=i.find(".swiper-cube-shadow")).length&&(e=m('<div class="swiper-cube-shadow"></div>'),i.append(e)),e.css({height:r+"px"})):0===(e=a.find(".swiper-cube-shadow")).length&&(e=m('<div class="swiper-cube-shadow"></div>'),a.append(e)));for(var v=0;v<s.length;v+=1){var f=s.eq(v),g=v;c&&(g=parseInt(f.attr("data-swiper-slide-index"),10));var b=90*g,w=Math.floor(b/360);l&&(b=-b,w=Math.floor(-b/360));var y=Math.max(Math.min(f[0].progress,1),-1),E=0,x=0,T=0;g%4==0?(E=4*-w*o,T=0):(g-1)%4==0?(E=0,T=4*-w*o):(g-2)%4==0?(E=o+4*w*o,T=o):(g-3)%4==0&&(E=-o,T=3*o+4*o*w),l&&(E=-E),u||(x=E,E=0);var C="rotateX("+(u?0:-b)+"deg) rotateY("+(u?b:0)+"deg) translate3d("+E+"px, "+x+"px, "+T+"px)";if(y<=1&&y>-1&&(h=90*g+90*y,l&&(h=90*-g-90*y)),f.transform(C),p.slideShadows){var S=u?f.find(".swiper-slide-shadow-left"):f.find(".swiper-slide-shadow-top"),M=u?f.find(".swiper-slide-shadow-right"):f.find(".swiper-slide-shadow-bottom");0===S.length&&(S=m('<div class="swiper-slide-shadow-'+(u?"left":"top")+'"></div>'),f.append(S)),0===M.length&&(M=m('<div class="swiper-slide-shadow-'+(u?"right":"bottom")+'"></div>'),f.append(M)),S.length&&(S[0].style.opacity=Math.max(-y,0)),M.length&&(M[0].style.opacity=Math.max(y,0))}}if(i.css({"-webkit-transform-origin":"50% 50% -"+o/2+"px","-moz-transform-origin":"50% 50% -"+o/2+"px","-ms-transform-origin":"50% 50% -"+o/2+"px","transform-origin":"50% 50% -"+o/2+"px"}),p.shadow)if(u)e.transform("translate3d(0px, "+(r/2+p.shadowOffset)+"px, "+-r/2+"px) rotateX(90deg) rotateZ(0deg) scale("+p.shadowScale+")");else{var z=Math.abs(h)-90*Math.floor(Math.abs(h)/90),P=1.5-(Math.sin(2*z*Math.PI/360)/2+Math.cos(2*z*Math.PI/360)/2),k=p.shadowScale,$=p.shadowScale/P,L=p.shadowOffset;e.transform("scale3d("+k+", 1, "+$+") translate3d(0px, "+(n/2+L)+"px, "+-n/2/$+"px) rotateX(-90deg)")}var I=d.isSafari||d.isWebView?-o/2:0;i.transform("translate3d(0px,0,"+I+"px) rotateX("+(t.isHorizontal()?0:h)+"deg) rotateY("+(t.isHorizontal()?-h:0)+"deg)")},setTransition:function(e){var t=this,a=t.$el;t.slides.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()&&a.find(".swiper-cube-shadow").transition(e)}},ce={setTranslate:function(){for(var e=this,t=e.slides,a=e.rtlTranslate,i=0;i<t.length;i+=1){var s=t.eq(i),r=s[0].progress;e.params.flipEffect.limitRotation&&(r=Math.max(Math.min(s[0].progress,1),-1));var n=-180*r,l=0,o=-s[0].swiperSlideOffset,d=0;if(e.isHorizontal()?a&&(n=-n):(d=o,o=0,l=-n,n=0),s[0].style.zIndex=-Math.abs(Math.round(r))+t.length,e.params.flipEffect.slideShadows){var p=e.isHorizontal()?s.find(".swiper-slide-shadow-left"):s.find(".swiper-slide-shadow-top"),u=e.isHorizontal()?s.find(".swiper-slide-shadow-right"):s.find(".swiper-slide-shadow-bottom");0===p.length&&(p=m('<div class="swiper-slide-shadow-'+(e.isHorizontal()?"left":"top")+'"></div>'),s.append(p)),0===u.length&&(u=m('<div class="swiper-slide-shadow-'+(e.isHorizontal()?"right":"bottom")+'"></div>'),s.append(u)),p.length&&(p[0].style.opacity=Math.max(-r,0)),u.length&&(u[0].style.opacity=Math.max(r,0))}s.transform("translate3d("+o+"px, "+d+"px, 0px) rotateX("+l+"deg) rotateY("+n+"deg)")}},setTransition:function(e){var t=this,a=t.slides,i=t.activeIndex,s=t.$wrapperEl;if(a.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e),t.params.virtualTranslate&&0!==e){var r=!1;a.eq(i).transitionEnd((function(){if(!r&&t&&!t.destroyed){r=!0,t.animating=!1;for(var e=["webkitTransitionEnd","transitionend"],a=0;a<e.length;a+=1)s.trigger(e[a])}}))}}},he={setTranslate:function(){for(var e=this,t=e.width,a=e.height,i=e.slides,s=e.slidesSizesGrid,r=e.params.coverflowEffect,n=e.isHorizontal(),l=e.translate,o=n?t/2-l:a/2-l,d=n?r.rotate:-r.rotate,p=r.depth,u=0,c=i.length;u<c;u+=1){var h=i.eq(u),v=s[u],f=(o-h[0].swiperSlideOffset-v/2)/v*r.modifier,g=n?d*f:0,b=n?0:d*f,w=-p*Math.abs(f),y=r.stretch;"string"==typeof y&&-1!==y.indexOf("%")&&(y=parseFloat(r.stretch)/100*v);var E=n?0:y*f,x=n?y*f:0,T=1-(1-r.scale)*Math.abs(f);Math.abs(x)<.001&&(x=0),Math.abs(E)<.001&&(E=0),Math.abs(w)<.001&&(w=0),Math.abs(g)<.001&&(g=0),Math.abs(b)<.001&&(b=0),Math.abs(T)<.001&&(T=0);var C="translate3d("+x+"px,"+E+"px,"+w+"px) rotateX("+b+"deg) rotateY("+g+"deg) scale("+T+")";if(h.transform(C),h[0].style.zIndex=1-Math.abs(Math.round(f)),r.slideShadows){var S=n?h.find(".swiper-slide-shadow-left"):h.find(".swiper-slide-shadow-top"),M=n?h.find(".swiper-slide-shadow-right"):h.find(".swiper-slide-shadow-bottom");0===S.length&&(S=m('<div class="swiper-slide-shadow-'+(n?"left":"top")+'"></div>'),h.append(S)),0===M.length&&(M=m('<div class="swiper-slide-shadow-'+(n?"right":"bottom")+'"></div>'),h.append(M)),S.length&&(S[0].style.opacity=f>0?f:0),M.length&&(M[0].style.opacity=-f>0?-f:0)}}},setTransition:function(e){this.slides.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e)}},ve={init:function(){var e=this,t=e.params.thumbs;if(e.thumbs.initialized)return!1;e.thumbs.initialized=!0;var a=e.constructor;return t.swiper instanceof a?(e.thumbs.swiper=t.swiper,M(e.thumbs.swiper.originalParams,{watchSlidesProgress:!0,slideToClickedSlide:!1}),M(e.thumbs.swiper.params,{watchSlidesProgress:!0,slideToClickedSlide:!1})):C(t.swiper)&&(e.thumbs.swiper=new a(M({},t.swiper,{watchSlidesVisibility:!0,watchSlidesProgress:!0,slideToClickedSlide:!1})),e.thumbs.swiperCreated=!0),e.thumbs.swiper.$el.addClass(e.params.thumbs.thumbsContainerClass),e.thumbs.swiper.on("tap",e.thumbs.onThumbClick),!0},onThumbClick:function(){var e=this,t=e.thumbs.swiper;if(t){var a=t.clickedIndex,i=t.clickedSlide;if(!(i&&m(i).hasClass(e.params.thumbs.slideThumbActiveClass)||null==a)){var s;if(s=t.params.loop?parseInt(m(t.clickedSlide).attr("data-swiper-slide-index"),10):a,e.params.loop){var r=e.activeIndex;e.slides.eq(r).hasClass(e.params.slideDuplicateClass)&&(e.loopFix(),e._clientLeft=e.$wrapperEl[0].clientLeft,r=e.activeIndex);var n=e.slides.eq(r).prevAll('[data-swiper-slide-index="'+s+'"]').eq(0).index(),l=e.slides.eq(r).nextAll('[data-swiper-slide-index="'+s+'"]').eq(0).index();s=void 0===n?l:void 0===l?n:l-r<r-n?l:n}e.slideTo(s)}}},update:function(e){var t=this,a=t.thumbs.swiper;if(a){var i="auto"===a.params.slidesPerView?a.slidesPerViewDynamic():a.params.slidesPerView,s=t.params.thumbs.autoScrollOffset,r=s&&!a.params.loop;if(t.realIndex!==a.realIndex||r){var n,l,o=a.activeIndex;if(a.params.loop){a.slides.eq(o).hasClass(a.params.slideDuplicateClass)&&(a.loopFix(),a._clientLeft=a.$wrapperEl[0].clientLeft,o=a.activeIndex);var d=a.slides.eq(o).prevAll('[data-swiper-slide-index="'+t.realIndex+'"]').eq(0).index(),p=a.slides.eq(o).nextAll('[data-swiper-slide-index="'+t.realIndex+'"]').eq(0).index();n=void 0===d?p:void 0===p?d:p-o==o-d?a.params.slidesPerGroup>1?p:o:p-o<o-d?p:d,l=t.activeIndex>t.previousIndex?"next":"prev"}else l=(n=t.realIndex)>t.previousIndex?"next":"prev";r&&(n+="next"===l?s:-1*s),a.visibleSlidesIndexes&&a.visibleSlidesIndexes.indexOf(n)<0&&(a.params.centeredSlides?n=n>o?n-Math.floor(i/2)+1:n+Math.floor(i/2)-1:n>o&&a.params.slidesPerGroup,a.slideTo(n,e?0:void 0))}var u=1,c=t.params.thumbs.slideThumbActiveClass;if(t.params.slidesPerView>1&&!t.params.centeredSlides&&(u=t.params.slidesPerView),t.params.thumbs.multipleActiveThumbs||(u=1),u=Math.floor(u),a.slides.removeClass(c),a.params.loop||a.params.virtual&&a.params.virtual.enabled)for(var h=0;h<u;h+=1)a.$wrapperEl.children('[data-swiper-slide-index="'+(t.realIndex+h)+'"]').addClass(c);else for(var v=0;v<u;v+=1)a.slides.eq(t.realIndex+v).addClass(c)}}},fe=[U,Z,{name:"mousewheel",params:{mousewheel:{enabled:!1,releaseOnEdges:!1,invert:!1,forceToAxis:!1,sensitivity:1,eventsTarget:"container",thresholdDelta:null,thresholdTime:null}},create:function(){z(this,{mousewheel:{enabled:!1,lastScrollTime:x(),lastEventBeforeSnap:void 0,recentWheelEvents:[],enable:J.enable,disable:J.disable,handle:J.handle,handleMouseEnter:J.handleMouseEnter,handleMouseLeave:J.handleMouseLeave,animateSlider:J.animateSlider,releaseScroll:J.releaseScroll}})},on:{init:function(e){!e.params.mousewheel.enabled&&e.params.cssMode&&e.mousewheel.disable(),e.params.mousewheel.enabled&&e.mousewheel.enable()},destroy:function(e){e.params.cssMode&&e.mousewheel.enable(),e.mousewheel.enabled&&e.mousewheel.disable()}}},{name:"navigation",params:{navigation:{nextEl:null,prevEl:null,hideOnClick:!1,disabledClass:"swiper-button-disabled",hiddenClass:"swiper-button-hidden",lockClass:"swiper-button-lock"}},create:function(){z(this,{navigation:t({},Q)})},on:{init:function(e){e.navigation.init(),e.navigation.update()},toEdge:function(e){e.navigation.update()},fromEdge:function(e){e.navigation.update()},destroy:function(e){e.navigation.destroy()},"enable disable":function(e){var t=e.navigation,a=t.$nextEl,i=t.$prevEl;a&&a[e.enabled?"removeClass":"addClass"](e.params.navigation.lockClass),i&&i[e.enabled?"removeClass":"addClass"](e.params.navigation.lockClass)},click:function(e,t){var a=e.navigation,i=a.$nextEl,s=a.$prevEl,r=t.target;if(e.params.navigation.hideOnClick&&!m(r).is(s)&&!m(r).is(i)){if(e.pagination&&e.params.pagination&&e.params.pagination.clickable&&(e.pagination.el===r||e.pagination.el.contains(r)))return;var n;i?n=i.hasClass(e.params.navigation.hiddenClass):s&&(n=s.hasClass(e.params.navigation.hiddenClass)),!0===n?e.emit("navigationShow"):e.emit("navigationHide"),i&&i.toggleClass(e.params.navigation.hiddenClass),s&&s.toggleClass(e.params.navigation.hiddenClass)}}}},{name:"pagination",params:{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:function(e){return e},formatFractionTotal:function(e){return e},bulletClass:"swiper-pagination-bullet",bulletActiveClass:"swiper-pagination-bullet-active",modifierClass:"swiper-pagination-",currentClass:"swiper-pagination-current",totalClass:"swiper-pagination-total",hiddenClass:"swiper-pagination-hidden",progressbarFillClass:"swiper-pagination-progressbar-fill",progressbarOppositeClass:"swiper-pagination-progressbar-opposite",clickableClass:"swiper-pagination-clickable",lockClass:"swiper-pagination-lock"}},create:function(){z(this,{pagination:t({dynamicBulletIndex:0},ee)})},on:{init:function(e){e.pagination.init(),e.pagination.render(),e.pagination.update()},activeIndexChange:function(e){(e.params.loop||void 0===e.snapIndex)&&e.pagination.update()},snapIndexChange:function(e){e.params.loop||e.pagination.update()},slidesLengthChange:function(e){e.params.loop&&(e.pagination.render(),e.pagination.update())},snapGridLengthChange:function(e){e.params.loop||(e.pagination.render(),e.pagination.update())},destroy:function(e){e.pagination.destroy()},"enable disable":function(e){var t=e.pagination.$el;t&&t[e.enabled?"removeClass":"addClass"](e.params.pagination.lockClass)},click:function(e,t){var a=t.target;if(e.params.pagination.el&&e.params.pagination.hideOnClick&&e.pagination.$el.length>0&&!m(a).hasClass(e.params.pagination.bulletClass)){if(e.navigation&&(e.navigation.nextEl&&a===e.navigation.nextEl||e.navigation.prevEl&&a===e.navigation.prevEl))return;!0===e.pagination.$el.hasClass(e.params.pagination.hiddenClass)?e.emit("paginationShow"):e.emit("paginationHide"),e.pagination.$el.toggleClass(e.params.pagination.hiddenClass)}}}},{name:"scrollbar",params:{scrollbar:{el:null,dragSize:"auto",hide:!1,draggable:!1,snapOnRelease:!0,lockClass:"swiper-scrollbar-lock",dragClass:"swiper-scrollbar-drag"}},create:function(){z(this,{scrollbar:t({isTouched:!1,timeout:null,dragTimeout:null},te)})},on:{init:function(e){e.scrollbar.init(),e.scrollbar.updateSize(),e.scrollbar.setTranslate()},update:function(e){e.scrollbar.updateSize()},resize:function(e){e.scrollbar.updateSize()},observerUpdate:function(e){e.scrollbar.updateSize()},setTranslate:function(e){e.scrollbar.setTranslate()},setTransition:function(e,t){e.scrollbar.setTransition(t)},"enable disable":function(e){var t=e.scrollbar.$el;t&&t[e.enabled?"removeClass":"addClass"](e.params.scrollbar.lockClass)},destroy:function(e){e.scrollbar.destroy()}}},{name:"parallax",params:{parallax:{enabled:!1}},create:function(){z(this,{parallax:t({},ae)})},on:{beforeInit:function(e){e.params.parallax.enabled&&(e.params.watchSlidesProgress=!0,e.originalParams.watchSlidesProgress=!0)},init:function(e){e.params.parallax.enabled&&e.parallax.setTranslate()},setTranslate:function(e){e.params.parallax.enabled&&e.parallax.setTranslate()},setTransition:function(e,t){e.params.parallax.enabled&&e.parallax.setTransition(t)}}},{name:"zoom",params:{zoom:{enabled:!1,maxRatio:3,minRatio:1,toggle:!0,containerClass:"swiper-zoom-container",zoomedSlideClass:"swiper-slide-zoomed"}},create:function(){var e=this;z(e,{zoom:t({enabled:!1,scale:1,currentScale:1,isScaling:!1,gesture:{$slideEl:void 0,slideWidth:void 0,slideHeight:void 0,$imageEl:void 0,$imageWrapEl:void 0,maxRatio:3},image:{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:{}},velocity:{x:void 0,y:void 0,prevPositionX:void 0,prevPositionY:void 0,prevTime:void 0}},ie)});var a=1;Object.defineProperty(e.zoom,"scale",{get:function(){return a},set:function(t){if(a!==t){var i=e.zoom.gesture.$imageEl?e.zoom.gesture.$imageEl[0]:void 0,s=e.zoom.gesture.$slideEl?e.zoom.gesture.$slideEl[0]:void 0;e.emit("zoomChange",t,i,s)}a=t}})},on:{init:function(e){e.params.zoom.enabled&&e.zoom.enable()},destroy:function(e){e.zoom.disable()},touchStart:function(e,t){e.zoom.enabled&&e.zoom.onTouchStart(t)},touchEnd:function(e,t){e.zoom.enabled&&e.zoom.onTouchEnd(t)},doubleTap:function(e,t){!e.animating&&e.params.zoom.enabled&&e.zoom.enabled&&e.params.zoom.toggle&&e.zoom.toggle(t)},transitionEnd:function(e){e.zoom.enabled&&e.params.zoom.enabled&&e.zoom.onTransitionEnd()},slideChange:function(e){e.zoom.enabled&&e.params.zoom.enabled&&e.params.cssMode&&e.zoom.onTransitionEnd()}}},{name:"lazy",params:{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"}},create:function(){z(this,{lazy:t({initialImageLoaded:!1},se)})},on:{beforeInit:function(e){e.params.lazy.enabled&&e.params.preloadImages&&(e.params.preloadImages=!1)},init:function(e){e.params.lazy.enabled&&!e.params.loop&&0===e.params.initialSlide&&(e.params.lazy.checkInView?e.lazy.checkInViewOnLoad():e.lazy.load())},scroll:function(e){e.params.freeMode&&!e.params.freeModeSticky&&e.lazy.load()},"scrollbarDragMove resize _freeModeNoMomentumRelease":function(e){e.params.lazy.enabled&&e.lazy.load()},transitionStart:function(e){e.params.lazy.enabled&&(e.params.lazy.loadOnTransitionStart||!e.params.lazy.loadOnTransitionStart&&!e.lazy.initialImageLoaded)&&e.lazy.load()},transitionEnd:function(e){e.params.lazy.enabled&&!e.params.lazy.loadOnTransitionStart&&e.lazy.load()},slideChange:function(e){var t=e.params,a=t.lazy,i=t.cssMode,s=t.watchSlidesVisibility,r=t.watchSlidesProgress,n=t.touchReleaseOnEdges,l=t.resistanceRatio;a.enabled&&(i||(s||r)&&(n||0===l))&&e.lazy.load()}}},{name:"controller",params:{controller:{control:void 0,inverse:!1,by:"slide"}},create:function(){z(this,{controller:t({control:this.params.controller.control},re)})},on:{update:function(e){e.controller.control&&e.controller.spline&&(e.controller.spline=void 0,delete e.controller.spline)},resize:function(e){e.controller.control&&e.controller.spline&&(e.controller.spline=void 0,delete e.controller.spline)},observerUpdate:function(e){e.controller.control&&e.controller.spline&&(e.controller.spline=void 0,delete e.controller.spline)},setTranslate:function(e,t,a){e.controller.control&&e.controller.setTranslate(t,a)},setTransition:function(e,t,a){e.controller.control&&e.controller.setTransition(t,a)}}},{name:"a11y",params:{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"}},create:function(){z(this,{a11y:t({},ne,{liveRegion:m('<span class="'+this.params.a11y.notificationClass+'" aria-live="assertive" aria-atomic="true"></span>')})})},on:{afterInit:function(e){e.params.a11y.enabled&&(e.a11y.init(),e.a11y.updateNavigation())},toEdge:function(e){e.params.a11y.enabled&&e.a11y.updateNavigation()},fromEdge:function(e){e.params.a11y.enabled&&e.a11y.updateNavigation()},paginationUpdate:function(e){e.params.a11y.enabled&&e.a11y.updatePagination()},destroy:function(e){e.params.a11y.enabled&&e.a11y.destroy()}}},{name:"history",params:{history:{enabled:!1,root:"",replaceState:!1,key:"slides"}},create:function(){z(this,{history:t({},le)})},on:{init:function(e){e.params.history.enabled&&e.history.init()},destroy:function(e){e.params.history.enabled&&e.history.destroy()},"transitionEnd _freeModeNoMomentumRelease":function(e){e.history.initialized&&e.history.setHistory(e.params.history.key,e.activeIndex)},slideChange:function(e){e.history.initialized&&e.params.cssMode&&e.history.setHistory(e.params.history.key,e.activeIndex)}}},{name:"hash-navigation",params:{hashNavigation:{enabled:!1,replaceState:!1,watchState:!1}},create:function(){z(this,{hashNavigation:t({initialized:!1},oe)})},on:{init:function(e){e.params.hashNavigation.enabled&&e.hashNavigation.init()},destroy:function(e){e.params.hashNavigation.enabled&&e.hashNavigation.destroy()},"transitionEnd _freeModeNoMomentumRelease":function(e){e.hashNavigation.initialized&&e.hashNavigation.setHash()},slideChange:function(e){e.hashNavigation.initialized&&e.params.cssMode&&e.hashNavigation.setHash()}}},{name:"autoplay",params:{autoplay:{enabled:!1,delay:3e3,waitForTransition:!0,disableOnInteraction:!0,stopOnLastSlide:!1,reverseDirection:!1,pauseOnMouseEnter:!1}},create:function(){z(this,{autoplay:t({},de,{running:!1,paused:!1})})},on:{init:function(e){e.params.autoplay.enabled&&(e.autoplay.start(),r().addEventListener("visibilitychange",e.autoplay.onVisibilityChange),e.autoplay.attachMouseEvents())},beforeTransitionStart:function(e,t,a){e.autoplay.running&&(a||!e.params.autoplay.disableOnInteraction?e.autoplay.pause(t):e.autoplay.stop())},sliderFirstMove:function(e){e.autoplay.running&&(e.params.autoplay.disableOnInteraction?e.autoplay.stop():e.autoplay.pause())},touchEnd:function(e){e.params.cssMode&&e.autoplay.paused&&!e.params.autoplay.disableOnInteraction&&e.autoplay.run()},destroy:function(e){e.autoplay.detachMouseEvents(),e.autoplay.running&&e.autoplay.stop(),r().removeEventListener("visibilitychange",e.autoplay.onVisibilityChange)}}},{name:"effect-fade",params:{fadeEffect:{crossFade:!1}},create:function(){z(this,{fadeEffect:t({},pe)})},on:{beforeInit:function(e){if("fade"===e.params.effect){e.classNames.push(e.params.containerModifierClass+"fade");var t={slidesPerView:1,slidesPerColumn:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!0};M(e.params,t),M(e.originalParams,t)}},setTranslate:function(e){"fade"===e.params.effect&&e.fadeEffect.setTranslate()},setTransition:function(e,t){"fade"===e.params.effect&&e.fadeEffect.setTransition(t)}}},{name:"effect-cube",params:{cubeEffect:{slideShadows:!0,shadow:!0,shadowOffset:20,shadowScale:.94}},create:function(){z(this,{cubeEffect:t({},ue)})},on:{beforeInit:function(e){if("cube"===e.params.effect){e.classNames.push(e.params.containerModifierClass+"cube"),e.classNames.push(e.params.containerModifierClass+"3d");var t={slidesPerView:1,slidesPerColumn:1,slidesPerGroup:1,watchSlidesProgress:!0,resistanceRatio:0,spaceBetween:0,centeredSlides:!1,virtualTranslate:!0};M(e.params,t),M(e.originalParams,t)}},setTranslate:function(e){"cube"===e.params.effect&&e.cubeEffect.setTranslate()},setTransition:function(e,t){"cube"===e.params.effect&&e.cubeEffect.setTransition(t)}}},{name:"effect-flip",params:{flipEffect:{slideShadows:!0,limitRotation:!0}},create:function(){z(this,{flipEffect:t({},ce)})},on:{beforeInit:function(e){if("flip"===e.params.effect){e.classNames.push(e.params.containerModifierClass+"flip"),e.classNames.push(e.params.containerModifierClass+"3d");var t={slidesPerView:1,slidesPerColumn:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!0};M(e.params,t),M(e.originalParams,t)}},setTranslate:function(e){"flip"===e.params.effect&&e.flipEffect.setTranslate()},setTransition:function(e,t){"flip"===e.params.effect&&e.flipEffect.setTransition(t)}}},{name:"effect-coverflow",params:{coverflowEffect:{rotate:50,stretch:0,depth:100,scale:1,modifier:1,slideShadows:!0}},create:function(){z(this,{coverflowEffect:t({},he)})},on:{beforeInit:function(e){"coverflow"===e.params.effect&&(e.classNames.push(e.params.containerModifierClass+"coverflow"),e.classNames.push(e.params.containerModifierClass+"3d"),e.params.watchSlidesProgress=!0,e.originalParams.watchSlidesProgress=!0)},setTranslate:function(e){"coverflow"===e.params.effect&&e.coverflowEffect.setTranslate()},setTransition:function(e,t){"coverflow"===e.params.effect&&e.coverflowEffect.setTransition(t)}}},{name:"thumbs",params:{thumbs:{swiper:null,multipleActiveThumbs:!0,autoScrollOffset:0,slideThumbActiveClass:"swiper-slide-thumb-active",thumbsContainerClass:"swiper-container-thumbs"}},create:function(){z(this,{thumbs:t({swiper:null,initialized:!1},ve)})},on:{beforeInit:function(e){var t=e.params.thumbs;t&&t.swiper&&(e.thumbs.init(),e.thumbs.update(!0))},slideChange:function(e){e.thumbs.swiper&&e.thumbs.update()},update:function(e){e.thumbs.swiper&&e.thumbs.update()},resize:function(e){e.thumbs.swiper&&e.thumbs.update()},observerUpdate:function(e){e.thumbs.swiper&&e.thumbs.update()},setTransition:function(e,t){var a=e.thumbs.swiper;a&&a.setTransition(t)},beforeDestroy:function(e){var t=e.thumbs.swiper;t&&e.thumbs.swiperCreated&&t&&t.destroy()}}}];return q.use(fe),q}));
718 719/*================================================================================ 720 * @name: bPopup - if you can't get it up, use bPopup 721 * @author: (c)Bjoern Klinggaard (twitter@bklinggaard) 722 * @demo: http://dinbror.dk/bpopup 723 * @version: 0.11.0.min 724 ================================================================================*/ 725 (function(c){c.fn.bPopup=function(A,E){function L(){a.contentContainer=c(a.contentContainer||b);switch(a.content){case "iframe":var d=c('<iframe class="b-iframe" '+a.iframeAttr+"></iframe>");d.appendTo(a.contentContainer);t=b.outerHeight(!0);u=b.outerWidth(!0);B();d.attr("src",a.loadUrl);l(a.loadCallback);break;case "image":B();c("<img />").load(function(){l(a.loadCallback);F(c(this))}).attr("src",a.loadUrl).hide().appendTo(a.contentContainer);break;default:B(),c('<div class="b-ajax-wrapper"></div>').load(a.loadUrl,a.loadData,function(d,b,e){l(a.loadCallback,b);F(c(this))}).hide().appendTo(a.contentContainer)}}function B(){a.modal&&c('<div class="b-modal '+e+'"></div>').css({backgroundColor:a.modalColor,position:"fixed",top:0,right:0,bottom:0,left:0,opacity:0,zIndex:a.zIndex+v}).appendTo(a.appendTo).fadeTo(a.speed,a.opacity);C();b.data("bPopup",a).data("id",e).css({left:"slideIn"==a.transition||"slideBack"==a.transition?"slideBack"==a.transition?f.scrollLeft()+w:-1*(x+u):m(!(!a.follow[0]&&n||g)),position:a.positionStyle||"absolute",top:"slideDown"==a.transition||"slideUp"==a.transition?"slideUp"==a.transition?f.scrollTop()+y:z+-1*t:p(!(!a.follow[1]&&q||g)),"z-index":a.zIndex+v+1}).each(function(){a.appending&&c(this).appendTo(a.appendTo)});G(!0)}function r(){a.modal&&c(".b-modal."+b.data("id")).fadeTo(a.speed,0,function(){c(this).remove()});a.scrollBar||c("html").css("overflow","auto");c(".b-modal."+e).unbind("click");f.unbind("keydown."+e);k.unbind("."+e).data("bPopup",0<k.data("bPopup")-1?k.data("bPopup")-1:null);b.undelegate(".bClose, ."+a.closeClass,"click."+e,r).data("bPopup",
725null);clearTimeout(H);G();return!1}function I(d){y=k.height();w=k.width();h=D();if(h.x||h.y)clearTimeout(J),J=setTimeout(function(){C();d=d||a.followSpeed;var e={};h.x&&(e.left=a.follow[0]?m(!0):"auto");h.y&&(e.top=a.follow[1]?p(!0):"auto");b.dequeue().each(function(){g?c(this).css({left:x,top:z}):c(this).animate(e,d,a.followEasing)})},50)}function F(d){var c=d.width(),e=d.height(),f={};a.contentContainer.css({height:e,width:c});e>=b.height()&&(f.height=b.height());c>=b.width()&&(f.width=b.width());t=b.outerHeight(!0);u=b.outerWidth(!0);C();a.contentContainer.css({height:"auto",width:"auto"});f.left=m(!(!a.follow[0]&&n||g));f.top=p(!(!a.follow[1]&&q||g));b.animate(f,250,function(){d.show();h=D()})}function M(){k.data("bPopup",v);b.delegate(".bClose, ."+a.closeClass,"click."+e,r);a.modalClose&&c(".b-modal."+e).css("cursor","pointer").bind("click",r);N||!a.follow[0]&&!a.follow[1]||k.bind("scroll."+e,function(){if(h.x||h.y){var d={};h.x&&(d.left=a.follow[0]?m(!g):"auto");h.y&&(d.top=a.follow[1]?p(!g):"auto");b.dequeue().animate(d,a.followSpeed,a.followEasing)}}).bind("resize."+e,function(){I()});a.escClose&&f.bind("keydown."+e,function(a){27==a.which&&r()})}function G(d){function c(e){b.css({display:"block",opacity:1}).animate(e,a.speed,a.easing,function(){K(d)})}switch(d?a.transition:a.transitionClose||a.transition){case "slideIn":c({left:d?m(!(!a.follow[0]&&n||g)):f.scrollLeft()-(u||b.outerWidth(!0))-200});break;case "slideBack":c({left:d?m(!(!a.follow[0]&&n||g)):f.scrollLeft()+w+200});break;case "slideDown":c({top:d?p(!(!a.follow[1]&&q||g)):f.scrollTop()-(t||b.outerHeight(!0))-200});break;case "slideUp":c({top:d?p(!(!a.follow[1]&&q||g)):f.scrollTop()+y+200});break;default:b.stop().fadeTo(a.speed,d?1:0,function(){K(d)})}}function K(d){d?(M(),l(E),a.autoClose&&(H=setTimeout(r,a.autoClose))):(b.hide(),l(a.onClose),a.loadUrl&&(a.contentContainer.empty(),b.css({height:"auto",width:"auto"})))}function m(a){return a?x+f.scrollLeft():x}function p(a){return a?z+f.scrollTop():z}function l(a,e){c.isFunction(a)&&a.call(b,e)}function C(){z=q?a.position[1]:Math.max(0,(y-b.outerHeight(!0))/2-a.amsl);x=n?a.position[0]:(w-b.outerWidth(!0))/2;h=D()}function D(){return{x:w>b.outerWidth(!0),y:y>b.outerHeight(!0)}}c.isFunction(A)&&(E=A,A=null);var a=c.extend({},c.fn.bPopup.defaults,A);a.scrollBar||c("html").css("overflow","hidden");var b=this,f=c(document),k=c(window),y=k.height(),w=k.width(),N=/OS 6(_\d)+/i.test(navigator.userAgent),v=0,e,h,q,n,g,z,x,t,u,J,H;b.close=function(){r()};b.reposition=function(a){I(a)};return b.each(function(){c(this).data("bPopup")||(l(a.onOpen),v=(k.data("bPopup")||0)+1,e="__b-popup"+v+"__",q="auto"!==a.position[1],n="auto"!==a.position[0],g="fixed"===a.positionStyle,t=b.outerHeight(!0),u=b.outerWidth(!0),a.loadUrl?L():B())})};c.fn.bPopup.defaults={amsl:50,appending:!0,appendTo:"body",autoClose:!1,closeClass:"b-close",content:"ajax",contentContainer:!1,easing:"swing",escClose:!0,follow:[!0,!0],followEasing:"swing",followSpeed:500,iframeAttr:'scrolling="no" frameborder="0"',loadCallback:!1,loadData:!1,loadUrl:!1,modal:!0,modalClose:!0,modalColor:"#000",onClose:!1,onOpen:!1,opacity:.7,position:["auto","auto"],positionStyle:"absolute",scrollBar:!0,speed:250,transition:"fadeIn",transitionClose:!1,zIndex:9997}})(jQuery); 726 727/******/ (function(modules) { // webpackBootstrap 728/******/ // The module cache 729/******/ var installedModules = {}; 730/******/ 731/******/ // The require function 732/******/ function __webpack_require__(moduleId) { 733/******/ 734/******/ // Check if module is in cache 735/******/ if(installedModules[moduleId]) { 736/******/ return installedModules[moduleId].exports; 737/******/ } 738/******/ // Create a new module (and put it into the cache) 739/******/ var module = installedModules[moduleId] = { 740/******/ i: moduleId, 741/******/ l: false, 742/******/ exports: {} 743/******/ }; 744/******/ 745/******/ // Execute the module function 746/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 747/******/ 748/******/ // Flag the module as loaded
vendor: 2,851 bytes, lines 749-814
749/******/ module.l = true; 750/******/ 751/******/ // Return the exports of the module 752/******/ return module.exports; 753/******/ } 754/******/ 755/******/ 756/******/ // expose the modules object (__webpack_modules__) 757/******/ __webpack_require__.m = modules; 758/******/ 759/******/ // expose the module cache 760/******/ __webpack_require__.c = installedModules; 761/******/ 762/******/ // define getter function for harmony exports 763/******/ __webpack_require__.d = function(exports, name, getter) { 764/******/ if(!__webpack_require__.o(exports, name)) { 765/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); 766/******/ } 767/******/ }; 768/******/ 769/******/ // define __esModule on exports 770/******/ __webpack_require__.r = function(exports) { 771/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { 772/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 773/******/ } 774/******/ Object.defineProperty(exports, '__esModule', { value: true }); 775/******/ }; 776/******/ 777/******/ // create a fake namespace object 778/******/ // mode & 1: value is a module id, require it 779/******/ // mode & 2: merge all properties of value into the ns 780/******/ // mode & 4: return value when already ns object 781/******/ // mode & 8|1: behave like require 782/******/ __webpack_require__.t = function(value, mode) { 783/******/ if(mode & 1) value = __webpack_require__(value); 784/******/ if(mode & 8) return value; 785/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; 786/******/ var ns = Object.create(null); 787/******/ __webpack_require__.r(ns); 788/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); 789/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); 790/******/ return ns; 791/******/ }; 792/******/ 793/******/ // getDefaultExport function for compatibility with non-harmony modules 794/******/ __webpack_require__.n = function(module) { 795/******/ var getter = module && module.__esModule ? 796/******/ function getDefault() { return module['default']; } : 797/******/ function getModuleExports() { return module; }; 798/******/ __webpack_require__.d(getter, 'a', getter); 799/******/ return getter; 800/******/ }; 801/******/ 802/******/ // Object.prototype.hasOwnProperty.call 803/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; 804/******/ 805/******/ // __webpack_public_path__ 806/******/ __webpack_require__.p = "/assets/js/"; 807/******/ 808/******/ 809/******/ // Load entry module and return exports 810/******/ return __webpack_require__(__webpack_require__.s = "./src/js/index.js"); 811/******/ }) 812/************************************************************************/ 813/******/ ({ 814
vendor: 60,623 bytes, lines 815-2251
815/***/ "./node_modules/gsap/CSSPlugin.js": 816/*!****************************************!*\ 817 !*** ./node_modules/gsap/CSSPlugin.js ***! 818 \****************************************/ 819/*! exports provided: CSSPlugin, default, _getBBox, _createElement, checkPrefix */ 820/***/ (function(module, __webpack_exports__, __webpack_require__) { 821 822"use strict"; 823__webpack_require__.r(__webpack_exports__); 824/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CSSPlugin", function() { return CSSPlugin; }); 825/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CSSPlugin; }); 826/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_getBBox", function() { return _getBBox; }); 827/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_createElement", function() { return _createElement; }); 828/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkPrefix", function() { return _checkPropPrefix; }); 829/* harmony import */ var _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./gsap-core.js */ "./node_modules/gsap/gsap-core.js"); 830/*** IMPORTS FROM imports-loader ***/ 831var define = false; 832 833/*! 834 * CSSPlugin 3.6.1 835 * https://greensock.com 836 * 837 * Copyright 2008-2021, GreenSock. All rights reserved. 838 * Subject to the terms at https://greensock.com/standard-license or for 839 * Club GreenSock members, the agreement issued with that membership. 840 * @author: Jack Doyle, [email protected] 841*/ 842 843/* eslint-disable */ 844 845 846var _win, 847 _doc, 848 _docElement, 849 _pluginInitted, 850 _tempDiv, 851 _tempDivStyler, 852 _recentSetterPlugin, 853 _windowExists = function _windowExists() { 854 return typeof window !== "undefined"; 855}, 856 _transformProps = {}, 857 _RAD2DEG = 180 / Math.PI, 858 _DEG2RAD = Math.PI / 180, 859 _atan2 = Math.atan2, 860 _bigNum = 1e8, 861 _capsExp = /([A-Z])/g, 862 _horizontalExp = /(?:left|right|width|margin|padding|x)/i, 863 _complexExp = /[\s,\(]\S/, 864 _propertyAliases = { 865 autoAlpha: "opacity,visibility", 866 scale: "scaleX,scaleY", 867 alpha: "opacity" 868}, 869 _renderCSSProp = function _renderCSSProp(ratio, data) { 870 return data.set(data.t, data.p, Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u, data); 871}, 872 _renderPropWithEnd = function _renderPropWithEnd(ratio, data) { 873 return data.set(data.t, data.p, ratio === 1 ? data.e : Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u, data); 874}, 875 _renderCSSPropWithBeginning = function _renderCSSPropWithBeginning(ratio, data) { 876 return data.set(data.t, data.p, ratio ? Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u : data.b, data); 877}, 878 //if units change, we need a way to render the original unit/value when the tween goes all the way back to the beginning (ratio:0) 879_renderRoundedCSSProp = function _renderRoundedCSSProp(ratio, data) { 880 var value = data.s + data.c * ratio; 881 data.set(data.t, data.p, ~~(value + (value < 0 ? -.5 : .5)) + data.u, data); 882}, 883 _renderNonTweeningValue = function _renderNonTweeningValue(ratio, data) { 884 return data.set(data.t, data.p, ratio ? data.e : data.b, data); 885}, 886 _renderNonTweeningValueOnlyAtEnd = function _renderNonTweeningValueOnlyAtEnd(ratio, data) { 887 return data.set(data.t, data.p, ratio !== 1 ? data.b : data.e, data); 888}, 889 _setterCSSStyle = function _setterCSSStyle(target, property, value) { 890 return target.style[property] = value; 891}, 892 _setterCSSProp = function _setterCSSProp(target, property, value) { 893 return target.style.setProperty(property, value); 894}, 895 _setterTransform = function _setterTransform(target, property, value) { 896 return target._gsap[property] = value; 897}, 898 _setterScale = function _setterScale(target, property, value) { 899 return target._gsap.scaleX = target._gsap.scaleY = value; 900}, 901 _setterScaleWithRender = function _setterScaleWithRender(target, property, value, data, ratio) { 902 var cache = target._gsap; 903 cache.scaleX = cache.scaleY = value; 904 cache.renderTransform(ratio, cache); 905}, 906 _setterTransformWithRender = function _setterTransformWithRender(target, property, value, data, ratio) { 907 var cache = target._gsap; 908 cache[property] = value; 909 cache.renderTransform(ratio, cache); 910}, 911 _transformProp = "transform", 912 _transformOriginProp = _transformProp + "Origin", 913 _supports3D, 914 _createElement = function _createElement(type, ns) { 915 var e = _doc.createElementNS ? _doc.createElementNS((ns || "http://www.w3.org/1999/xhtml").replace(/^https/, "http"), type) : _doc.createElement(type); //some servers swap in https for http in the namespace which can break things, making "style" inaccessible. 916 917 return e.style ? e : _doc.createElement(type); //some environments won't allow access to the element's style when created with a namespace in which case we default to the standard createElement() to work around the issue. Also note that when GSAP is embedded directly inside an SVG file, createElement() won't allow access to the style object in Firefox (see https://greensock.com/forums/topic/20215-problem-using-tweenmax-in-standalone-self-containing-svg-file-err-cannot-set-property-csstext-of-undefined/). 918}, 919 _getComputedProperty = function _getComputedProperty(target, property, skipPrefixFallback) { 920 var cs = getComputedStyle(target); 921 return cs[property] || cs.getPropertyValue(property.replace(_capsExp, "-$1").toLowerCase()) || cs.getPropertyValue(property) || !skipPrefixFallback && _getComputedProperty(target, _checkPropPrefix(property) || property, 1) || ""; //css variables may not need caps swapped out for dashes and lowercase. 922}, 923 _prefixes = "O,Moz,ms,Ms,Webkit".split(","), 924 _checkPropPrefix = function _checkPropPrefix(property, element, preferPrefix) { 925 var e = element || _tempDiv, 926 s = e.style, 927 i = 5; 928 929 if (property in s && !preferPrefix) { 930 return property; 931 } 932 933 property = property.charAt(0).toUpperCase() + property.substr(1); 934 935 while (i-- && !(_prefixes[i] + property in s)) {} 936 937 return i < 0 ? null : (i === 3 ? "ms" : i >= 0 ? _prefixes[i] : "") + property; 938}, 939 _initCore = function _initCore() { 940 if (_windowExists() && window.document) { 941 _win = window; 942 _doc = _win.document; 943 _docElement = _doc.documentElement; 944 _tempDiv = _createElement("div") || { 945 style: {} 946 }; 947 _tempDivStyler = _createElement("div"); 948 _transformProp = _checkPropPrefix(_transformProp); 949 _transformOriginProp = _transformProp + "Origin"; 950 _tempDiv.style.cssText = "border-width:0;line-height:0;position:absolute;padding:0"; //make sure to override certain properties that may contaminate measurements, in case the user has overreaching style sheets. 951 952 _supports3D = !!_checkPropPrefix("perspective"); 953 _pluginInitted = 1; 954 } 955}, 956 _getBBoxHack = function _getBBoxHack(swapIfPossible) { 957 //works around issues in some browsers (like Firefox) that don't correctly report getBBox() on SVG elements inside a <defs> element and/or <mask>. We try creating an SVG, adding it to the documentElement and toss the element in there so that it's definitely part of the rendering tree, then grab the bbox and if it works, we actually swap out the original getBBox() method for our own that does these extra steps whenever getBBox is needed. This helps ensure that performance is optimal (only do all these extra steps when absolutely necessary...most elements don't need it). 958 var svg = _createElement("svg", this.ownerSVGElement && this.ownerSVGElement.getAttribute("xmlns") || "http://www.w3.org/2000/svg"), 959 oldParent = this.parentNode, 960 oldSibling = this.nextSibling, 961 oldCSS = this.style.cssText, 962 bbox; 963 964 _docElement.appendChild(svg); 965 966 svg.appendChild(this); 967 this.style.display = "block"; 968 969 if (swapIfPossible) { 970 try { 971 bbox = this.getBBox(); 972 this._gsapBBox = this.getBBox; //store the original 973 974 this.getBBox = _getBBoxHack; 975 } catch (e) {} 976 } else if (this._gsapBBox) { 977 bbox = this._gsapBBox(); 978 } 979 980 if (oldParent) { 981 if (oldSibling) { 982 oldParent.insertBefore(this, oldSibling); 983 } else { 984 oldParent.appendChild(this); 985 } 986 } 987 988 _docElement.removeChild(svg); 989 990 this.style.cssText = oldCSS; 991 return bbox; 992}, 993 _getAttributeFallbacks = function _getAttributeFallbacks(target, attributesArray) { 994 var i = attributesArray.length; 995 996 while (i--) { 997 if (target.hasAttribute(attributesArray[i])) { 998 return target.getAttribute(attributesArray[i]); 999 } 1000 } 1001}, 1002 _getBBox = function _getBBox(target) { 1003 var bounds; 1004 1005 try { 1006 bounds = target.getBBox(); //Firefox throws errors if you try calling getBBox() on an SVG element that's not rendered (like in a <symbol> or <defs>). https://bugzilla.mozilla.org/show_bug.cgi?id=612118 1007 } catch (error) { 1008 bounds = _getBBoxHack.call(target, true); 1009 } 1010 1011 bounds && (bounds.width || bounds.height) || target.getBBox === _getBBoxHack || (bounds = _getBBoxHack.call(target, true)); //some browsers (like Firefox) misreport the bounds if the element has zero width and height (it just assumes it's at x:0, y:0), thus we need to manually grab the position in that case. 1012 1013 return bounds && !bounds.width && !bounds.x && !bounds.y ? { 1014 x: +_getAttributeFallbacks(target, ["x", "cx", "x1"]) || 0, 1015 y: +_getAttributeFallbacks(target, ["y", "cy", "y1"]) || 0, 1016 width: 0, 1017 height: 0 1018 } : bounds; 1019}, 1020 _isSVG = function _isSVG(e) { 1021 return !!(e.getCTM && (!e.parentNode || e.ownerSVGElement) && _getBBox(e)); 1022}, 1023 //reports if the element is an SVG on which getBBox() actually works 1024_removeProperty = function _removeProperty(target, property) { 1025 if (property) { 1026 var style = target.style; 1027 1028 if (property in _transformProps && property !== _transformOriginProp) { 1029 property = _transformProp; 1030 } 1031 1032 if (style.removeProperty) { 1033 if (property.substr(0, 2) === "ms" || property.substr(0, 6) === "webkit") { 1034 //Microsoft and some Webkit browsers don't conform to the standard of capitalizing the first prefix character, so we adjust so that when we prefix the caps with a dash, it's correct (otherwise it'd be "ms-transform" instead of "-ms-transform" for IE9, for example) 1035 property = "-" + property; 1036 } 1037 1038 style.removeProperty(property.replace(_capsExp, "-$1").toLowerCase()); 1039 } else { 1040 //note: old versions of IE use "removeAttribute()" instead of "removeProperty()" 1041 style.removeAttribute(property); 1042 } 1043 } 1044}, 1045 _addNonTweeningPT = function _addNonTweeningPT(plugin, target, property, beginning, end, onlySetAtEnd) { 1046 var pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](plugin._pt, target, property, 0, 1, onlySetAtEnd ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue); 1047 plugin._pt = pt; 1048 pt.b = beginning; 1049 pt.e = end; 1050 1051 plugin._props.push(property); 1052 1053 return pt; 1054}, 1055 _nonConvertibleUnits = { 1056 deg: 1, 1057 rad: 1, 1058 turn: 1 1059}, 1060 //takes a single value like 20px and converts it to the unit specified, like "%", returning only the numeric amount. 1061_convertToUnit = function _convertToUnit(target, property, value, unit) { 1062 var curValue = parseFloat(value) || 0, 1063 curUnit = (value + "").trim().substr((curValue + "").length) || "px", 1064 // some browsers leave extra whitespace at the beginning of CSS variables, hence the need to trim() 1065 style = _tempDiv.style, 1066 horizontal = _horizontalExp.test(property), 1067 isRootSVG = target.tagName.toLowerCase() === "svg", 1068 measureProperty = (isRootSVG ? "client" : "offset") + (horizontal ? "Width" : "Height"), 1069 amount = 100, 1070 toPixels = unit === "px", 1071 toPercent = unit === "%", 1072 px, 1073 parent, 1074 cache, 1075 isSVG; 1076 1077 if (unit === curUnit || !curValue || _nonConvertibleUnits[unit] || _nonConvertibleUnits[curUnit]) { 1078 return curValue; 1079 } 1080 1081 curUnit !== "px" && !toPixels && (curValue = _convertToUnit(target, property, value, "px")); 1082 isSVG = target.getCTM && _isSVG(target); 1083 1084 if ((toPercent || curUnit === "%") && (_transformProps[property] || ~property.indexOf("adius"))) { 1085 px = isSVG ? target.getBBox()[horizontal ? "width" : "height"] : target[measureProperty]; 1086 return Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(toPercent ? curValue / px * amount : curValue / 100 * px); 1087 } 1088 1089 style[horizontal ? "width" : "height"] = amount + (toPixels ? curUnit : unit); 1090 parent = ~property.indexOf("adius") || unit === "em" && target.appendChild && !isRootSVG ? target : target.parentNode; 1091 1092 if (isSVG) { 1093 parent = (target.ownerSVGElement || {}).parentNode; 1094 } 1095 1096 if (!parent || parent === _doc || !parent.appendChild) { 1097 parent = _doc.body; 1098 } 1099 1100 cache = parent._gsap; 1101 1102 if (cache && toPercent && cache.width && horizontal && cache.time === _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_ticker"].time) { 1103 return Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(curValue / cache.width * amount); 1104 } else { 1105 (toPercent || curUnit === "%") && (style.position = _getComputedProperty(target, "position")); 1106 parent === target && (style.position = "static"); // like for borderRadius, if it's a % we must have it relative to the target itself but that may not have position: relative or position: absolute in which case it'd go up the chain until it finds its offsetParent (bad). position: static protects against that. 1107 1108 parent.appendChild(_tempDiv); 1109 px = _tempDiv[measureProperty]; 1110 parent.removeChild(_tempDiv); 1111 style.position = "absolute"; 1112 1113 if (horizontal && toPercent) { 1114 cache = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_getCache"])(parent); 1115 cache.time = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_ticker"].time; 1116 cache.width = parent[measureProperty]; 1117 } 1118 } 1119 1120 return Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(toPixels ? px * curValue / amount : px && curValue ? amount / px * curValue : 0); 1121}, 1122 _get = function _get(target, property, unit, uncache) { 1123 var value; 1124 _pluginInitted || _initCore(); 1125 1126 if (property in _propertyAliases && property !== "transform") { 1127 property = _propertyAliases[property]; 1128 1129 if (~property.indexOf(",")) { 1130 property = property.split(",")[0]; 1131 } 1132 } 1133 1134 if (_transformProps[property] && property !== "transform") { 1135 value = _parseTransform(target, uncache); 1136 value = property !== "transformOrigin" ? value[property] : _firstTwoOnly(_getComputedProperty(target, _transformOriginProp)) + " " + value.zOrigin + "px"; 1137 } else { 1138 value = target.style[property]; 1139 1140 if (!value || value === "auto" || uncache || ~(value + "").indexOf("calc(")) { 1141 value = _specialProps[property] && _specialProps[property](target, property, unit) || _getComputedProperty(target, property) || Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_getProperty"])(target, property) || (property === "opacity" ? 1 : 0); // note: some browsers, like Firefox, don't report borderRadius correctly! Instead, it only reports every corner like borderTopLeftRadius 1142 } 1143 } 1144 1145 return unit && !~(value + "").trim().indexOf(" ") ? _convertToUnit(target, property, value, unit) + unit : value; 1146}, 1147 _tweenComplexCSSString = function _tweenComplexCSSString(target, prop, start, end) { 1148 //note: we call _tweenComplexCSSString.call(pluginInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus "this" would refer to the plugin. 1149 if (!start || start === "none") { 1150 // some browsers like Safari actually PREFER the prefixed property and mis-report the unprefixed value like clipPath (BUG). In other words, even though clipPath exists in the style ("clipPath" in target.style) and it's set in the CSS properly (along with -webkit-clip-path), Safari reports clipPath as "none" whereas WebkitClipPath reports accurately like "ellipse(100% 0% at 50% 0%)", so in this case we must SWITCH to using the prefixed property instead. See https://greensock.com/forums/topic/18310-clippath-doesnt-work-on-ios/ 1151 var p = _checkPropPrefix(prop, target, 1), 1152 s = p && _getComputedProperty(target, p, 1); 1153 1154 if (s && s !== start) { 1155 prop = p; 1156 start = s; 1157 } else if (prop === "borderColor") { 1158 start = _getComputedProperty(target, "borderTopColor"); // Firefox bug: always reports "borderColor" as "", so we must fall back to borderTopColor. See https://greensock.com/forums/topic/24583-how-to-return-colors-that-i-had-after-reverse/ 1159 } 1160 } 1161 1162 var pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](this._pt, target.style, prop, 0, 1, _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_renderComplexString"]), 1163 index = 0, 1164 matchIndex = 0, 1165 a, 1166 result, 1167 startValues, 1168 startNum, 1169 color, 1170 startValue, 1171 endValue, 1172 endNum, 1173 chunk, 1174 endUnit, 1175 startUnit, 1176 relative, 1177 endValues; 1178 pt.b = start; 1179 pt.e = end; 1180 start += ""; //ensure values are strings 1181 1182 end += ""; 1183 1184 if (end === "auto") { 1185 target.style[prop] = end; 1186 end = _getComputedProperty(target, prop) || end; 1187 target.style[prop] = start; 1188 } 1189 1190 a = [start, end]; 1191 1192 Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_colorStringFilter"])(a); //pass an array with the starting and ending values and let the filter do whatever it needs to the values. If colors are found, it returns true and then we must match where the color shows up order-wise because for things like boxShadow, sometimes the browser provides the computed values with the color FIRST, but the user provides it with the color LAST, so flip them if necessary. Same for drop-shadow(). 1193 1194 1195 start = a[0]; 1196 end = a[1]; 1197 startValues = start.match(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_numWithUnitExp"]) || []; 1198 endValues = end.match(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_numWithUnitExp"]) || []; 1199 1200 if (endValues.length) { 1201 while (result = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_numWithUnitExp"].exec(end)) { 1202 endValue = result[0]; 1203 chunk = end.substring(index, result.index); 1204 1205 if (color) { 1206 color = (color + 1) % 5; 1207 } else if (chunk.substr(-5) === "rgba(" || chunk.substr(-5) === "hsla(") { 1208 color = 1; 1209 } 1210 1211 if (endValue !== (startValue = startValues[matchIndex++] || "")) { 1212 startNum = parseFloat(startValue) || 0; 1213 startUnit = startValue.substr((startNum + "").length); 1214 relative = endValue.charAt(1) === "=" ? +(endValue.charAt(0) + "1") : 0; 1215 1216 if (relative) { 1217 endValue = endValue.substr(2); 1218 } 1219 1220 endNum = parseFloat(endValue); 1221 endUnit = endValue.substr((endNum + "").length); 1222 index = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_numWithUnitExp"].lastIndex - endUnit.length; 1223 1224 if (!endUnit) { 1225 //if something like "perspective:300" is passed in and we must add a unit to the end 1226 endUnit = endUnit || _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units[prop] || startUnit; 1227 1228 if (index === end.length) { 1229 end += endUnit; 1230 pt.e += endUnit; 1231 } 1232 } 1233 1234 if (startUnit !== endUnit) { 1235 startNum = _convertToUnit(target, prop, startValue, endUnit) || 0; 1236 } //these nested PropTweens are handled in a special way - we'll never actually call a render or setter method on them. We'll just loop through them in the parent complex string PropTween's render method. 1237 1238 1239 pt._pt = { 1240 _next: pt._pt, 1241 p: chunk || matchIndex === 1 ? chunk : ",", 1242 //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case. 1243 s: startNum, 1244 c: relative ? relative * endNum : endNum - startNum, 1245 m: color && color < 4 || prop === "zIndex" ? Math.round : 0 1246 }; 1247 } 1248 } 1249 1250 pt.c = index < end.length ? end.substring(index, end.length) : ""; //we use the "c" of the PropTween to store the final part of the string (after the last number) 1251 } else { 1252 pt.r = prop === "display" && end === "none" ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue; 1253 } 1254 1255 _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_relExp"].test(end) && (pt.e = 0); //if the end string contains relative values or dynamic random(...) values, delete the end it so that on the final render we don't actually set it to the string with += or -= characters (forces it to use the calculated value). 1256 1257 this._pt = pt; //start the linked list with this new PropTween. Remember, we call _tweenComplexCSSString.call(pluginInstance...) to ensure that it's scoped properly. We may call it from within another plugin too, thus "this" would refer to the plugin. 1258 1259 return pt; 1260}, 1261 _keywordToPercent = { 1262 top: "0%", 1263 bottom: "100%", 1264 left: "0%", 1265 right: "100%", 1266 center: "50%" 1267}, 1268 _convertKeywordsToPercentages = function _convertKeywordsToPercentages(value) { 1269 var split = value.split(" "), 1270 x = split[0], 1271 y = split[1] || "50%"; 1272 1273 if (x === "top" || x === "bottom" || y === "left" || y === "right") { 1274 //the user provided them in the wrong order, so flip them 1275 value = x; 1276 x = y; 1277 y = value; 1278 } 1279 1280 split[0] = _keywordToPercent[x] || x; 1281 split[1] = _keywordToPercent[y] || y; 1282 return split.join(" "); 1283}, 1284 _renderClearProps = function _renderClearProps(ratio, data) { 1285 if (data.tween && data.tween._time === data.tween._dur) { 1286 var target = data.t, 1287 style = target.style, 1288 props = data.u, 1289 cache = target._gsap, 1290 prop, 1291 clearTransforms, 1292 i; 1293 1294 if (props === "all" || props === true) { 1295 style.cssText = ""; 1296 clearTransforms = 1; 1297 } else { 1298 props = props.split(","); 1299 i = props.length; 1300 1301 while (--i > -1) { 1302 prop = props[i]; 1303 1304 if (_transformProps[prop]) { 1305 clearTransforms = 1; 1306 prop = prop === "transformOrigin" ? _transformOriginProp : _transformProp; 1307 } 1308 1309 _removeProperty(target, prop); 1310 } 1311 } 1312 1313 if (clearTransforms) { 1314 _removeProperty(target, _transformProp); 1315 1316 if (cache) { 1317 cache.svg && target.removeAttribute("transform"); 1318 1319 _parseTransform(target, 1); // force all the cached values back to "normal"/identity, otherwise if there's another tween that's already set to render transforms on this element, it could display the wrong values. 1320 1321 1322 cache.uncache = 1; 1323 } 1324 } 1325 } 1326}, 1327 // note: specialProps should return 1 if (and only if) they have a non-zero priority. It indicates we need to sort the linked list. 1328_specialProps = { 1329 clearProps: function clearProps(plugin, target, property, endValue, tween) { 1330 if (tween.data !== "isFromStart") { 1331 var pt = plugin._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](plugin._pt, target, property, 0, 0, _renderClearProps); 1332 pt.u = endValue; 1333 pt.pr = -10; 1334 pt.tween = tween; 1335 1336 plugin._props.push(property); 1337 1338 return 1; 1339 } 1340 } 1341 /* className feature (about 0.4kb gzipped). 1342 , className(plugin, target, property, endValue, tween) { 1343 let _renderClassName = (ratio, data) => { 1344 data.css.render(ratio, data.css); 1345 if (!ratio || ratio === 1) { 1346 let inline = data.rmv, 1347 target = data.t, 1348 p; 1349 target.setAttribute("class", ratio ? data.e : data.b); 1350 for (p in inline) { 1351 _removeProperty(target, p); 1352 } 1353 } 1354 }, 1355 _getAllStyles = (target) => { 1356 let styles = {}, 1357 computed = getComputedStyle(target), 1358 p; 1359 for (p in computed) { 1360 if (isNaN(p) && p !== "cssText" && p !== "length") { 1361 styles[p] = computed[p]; 1362 } 1363 } 1364 _setDefaults(styles, _parseTransform(target, 1)); 1365 return styles; 1366 }, 1367 startClassList = target.getAttribute("class"), 1368 style = target.style, 1369 cssText = style.cssText, 1370 cache = target._gsap, 1371 classPT = cache.classPT, 1372 inlineToRemoveAtEnd = {}, 1373 data = {t:target, plugin:plugin, rmv:inlineToRemoveAtEnd, b:startClassList, e:(endValue.charAt(1) !== "=") ? endValue : startClassList.replace(new RegExp("(?:\\s|^)" + endValue.substr(2) + "(?![\\w-])"), "") + ((endValue.charAt(0) === "+") ? " " + endValue.substr(2) : "")}, 1374 changingVars = {}, 1375 startVars = _getAllStyles(target), 1376 transformRelated = /(transform|perspective)/i, 1377 endVars, p; 1378 if (classPT) { 1379 classPT.r(1, classPT.d); 1380 _removeLinkedListItem(classPT.d.plugin, classPT, "_pt"); 1381 } 1382 target.setAttribute("class", data.e); 1383 endVars = _getAllStyles(target, true); 1384 target.setAttribute("class", startClassList); 1385 for (p in endVars) { 1386 if (endVars[p] !== startVars[p] && !transformRelated.test(p)) { 1387 changingVars[p] = endVars[p]; 1388 if (!style[p] && style[p] !== "0") { 1389 inlineToRemoveAtEnd[p] = 1; 1390 } 1391 } 1392 } 1393 cache.classPT = plugin._pt = new PropTween(plugin._pt, target, "className", 0, 0, _renderClassName, data, 0, -11); 1394 if (style.cssText !== cssText) { //only apply if things change. Otherwise, in cases like a background-image that's pulled dynamically, it could cause a refresh. See https://greensock.com/forums/topic/20368-possible-gsap-bug-switching-classnames-in-chrome/. 1395 style.cssText = cssText; //we recorded cssText before we swapped classes and ran _getAllStyles() because in cases when a className tween is overwritten, we remove all the related tweening properties from that class change (otherwise class-specific stuff can't override properties we've directly set on the target's style object due to specificity). 1396 } 1397 _parseTransform(target, true); //to clear the caching of transforms 1398 data.css = new gsap.plugins.css(); 1399 data.css.init(target, changingVars, tween); 1400 plugin._props.push(...data.css._props); 1401 return 1; 1402 } 1403 */ 1404 1405}, 1406 1407/* 1408 * -------------------------------------------------------------------------------------- 1409 * TRANSFORMS 1410 * -------------------------------------------------------------------------------------- 1411 */ 1412_identity2DMatrix = [1, 0, 0, 1, 0, 0], 1413 _rotationalProperties = {}, 1414 _isNullTransform = function _isNullTransform(value) { 1415 return value === "matrix(1, 0, 0, 1, 0, 0)" || value === "none" || !value; 1416}, 1417 _getComputedTransformMatrixAsArray = function _getComputedTransformMatrixAsArray(target) { 1418 var matrixString = _getComputedProperty(target, _transformProp); 1419 1420 return _isNullTransform(matrixString) ? _identity2DMatrix : matrixString.substr(7).match(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_numExp"]).map(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"]); 1421}, 1422 _getMatrix = function _getMatrix(target, force2D) { 1423 var cache = target._gsap || Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_getCache"])(target), 1424 style = target.style, 1425 matrix = _getComputedTransformMatrixAsArray(target), 1426 parent, 1427 nextSibling, 1428 temp, 1429 addedToDOM; 1430 1431 if (cache.svg && target.getAttribute("transform")) { 1432 temp = target.transform.baseVal.consolidate().matrix; //ensures that even complex values like "translate(50,60) rotate(135,0,0)" are parsed because it mashes it into a matrix. 1433 1434 matrix = [temp.a, temp.b, temp.c, temp.d, temp.e, temp.f]; 1435 return matrix.join(",") === "1,0,0,1,0,0" ? _identity2DMatrix : matrix; 1436 } else if (matrix === _identity2DMatrix && !target.offsetParent && target !== _docElement && !cache.svg) { 1437 //note: if offsetParent is null, that means the element isn't in the normal document flow, like if it has display:none or one of its ancestors has display:none). Firefox returns null for getComputedStyle() if the element is in an iframe that has display:none. https://bugzilla.mozilla.org/show_bug.cgi?id=548397 1438 //browsers don't report transforms accurately unless the element is in the DOM and has a display value that's not "none". Firefox and Microsoft browsers have a partial bug where they'll report transforms even if display:none BUT not any percentage-based values like translate(-50%, 8px) will be reported as if it's translate(0, 8px). 1439 temp = style.display; 1440 style.display = "block"; 1441 parent = target.parentNode; 1442 1443 if (!parent || !target.offsetParent) { 1444 // note: in 3.3.0 we switched target.offsetParent to _doc.body.contains(target) to avoid [sometimes unnecessary] MutationObserver calls but that wasn't adequate because there are edge cases where nested position: fixed elements need to get reparented to accurately sense transforms. See https://github.com/greensock/GSAP/issues/388 and https://github.com/greensock/GSAP/issues/375 1445 addedToDOM = 1; //flag 1446 1447 nextSibling = target.nextSibling; 1448 1449 _docElement.appendChild(target); //we must add it to the DOM in order to get values properly 1450 1451 } 1452 1453 matrix = _getComputedTransformMatrixAsArray(target); 1454 temp ? style.display = temp : _removeProperty(target, "display"); 1455 1456 if (addedToDOM) { 1457 nextSibling ? parent.insertBefore(target, nextSibling) : parent ? parent.appendChild(target) : _docElement.removeChild(target); 1458 } 1459 } 1460 1461 return force2D && matrix.length > 6 ? [matrix[0], matrix[1], matrix[4], matrix[5], matrix[12], matrix[13]] : matrix; 1462}, 1463 _applySVGOrigin = function _applySVGOrigin(target, origin, originIsAbsolute, smooth, matrixArray, pluginToAddPropTweensTo) { 1464 var cache = target._gsap, 1465 matrix = matrixArray || _getMatrix(target, true), 1466 xOriginOld = cache.xOrigin || 0, 1467 yOriginOld = cache.yOrigin || 0, 1468 xOffsetOld = cache.xOffset || 0, 1469 yOffsetOld = cache.yOffset || 0, 1470 a = matrix[0], 1471 b = matrix[1], 1472 c = matrix[2], 1473 d = matrix[3], 1474 tx = matrix[4], 1475 ty = matrix[5], 1476 originSplit = origin.split(" "), 1477 xOrigin = parseFloat(originSplit[0]) || 0, 1478 yOrigin = parseFloat(originSplit[1]) || 0, 1479 bounds, 1480 determinant, 1481 x, 1482 y; 1483 1484 if (!originIsAbsolute) { 1485 bounds = _getBBox(target); 1486 xOrigin = bounds.x + (~originSplit[0].indexOf("%") ? xOrigin / 100 * bounds.width : xOrigin); 1487 yOrigin = bounds.y + (~(originSplit[1] || originSplit[0]).indexOf("%") ? yOrigin / 100 * bounds.height : yOrigin); 1488 } else if (matrix !== _identity2DMatrix && (determinant = a * d - b * c)) { 1489 //if it's zero (like if scaleX and scaleY are zero), skip it to avoid errors with dividing by zero. 1490 x = xOrigin * (d / determinant) + yOrigin * (-c / determinant) + (c * ty - d * tx) / determinant; 1491 y = xOrigin * (-b / determinant) + yOrigin * (a / determinant) - (a * ty - b * tx) / determinant; 1492 xOrigin = x; 1493 yOrigin = y; 1494 } 1495 1496 if (smooth || smooth !== false && cache.smooth) { 1497 tx = xOrigin - xOriginOld; 1498 ty = yOrigin - yOriginOld; 1499 cache.xOffset = xOffsetOld + (tx * a + ty * c) - tx; 1500 cache.yOffset = yOffsetOld + (tx * b + ty * d) - ty; 1501 } else { 1502 cache.xOffset = cache.yOffset = 0; 1503 } 1504 1505 cache.xOrigin = xOrigin; 1506 cache.yOrigin = yOrigin; 1507 cache.smooth = !!smooth; 1508 cache.origin = origin; 1509 cache.originIsAbsolute = !!originIsAbsolute; 1510 target.style[_transformOriginProp] = "0px 0px"; //otherwise, if someone sets an origin via CSS, it will likely interfere with the SVG transform attribute ones (because remember, we're baking the origin into the matrix() value). 1511 1512 if (pluginToAddPropTweensTo) { 1513 _addNonTweeningPT(pluginToAddPropTweensTo, cache, "xOrigin", xOriginOld, xOrigin); 1514 1515 _addNonTweeningPT(pluginToAddPropTweensTo, cache, "yOrigin", yOriginOld, yOrigin); 1516 1517 _addNonTweeningPT(pluginToAddPropTweensTo, cache, "xOffset", xOffsetOld, cache.xOffset); 1518 1519 _addNonTweeningPT(pluginToAddPropTweensTo, cache, "yOffset", yOffsetOld, cache.yOffset); 1520 } 1521 1522 target.setAttribute("data-svg-origin", xOrigin + " " + yOrigin); 1523}, 1524 _parseTransform = function _parseTransform(target, uncache) { 1525 var cache = target._gsap || new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["GSCache"](target); 1526 1527 if ("x" in cache && !uncache && !cache.uncache) { 1528 return cache; 1529 } 1530 1531 var style = target.style, 1532 invertedScaleX = cache.scaleX < 0, 1533 px = "px", 1534 deg = "deg", 1535 origin = _getComputedProperty(target, _transformOriginProp) || "0", 1536 x, 1537 y, 1538 z, 1539 scaleX, 1540 scaleY, 1541 rotation, 1542 rotationX, 1543 rotationY, 1544 skewX, 1545 skewY, 1546 perspective, 1547 xOrigin, 1548 yOrigin, 1549 matrix, 1550 angle, 1551 cos, 1552 sin, 1553 a, 1554 b, 1555 c, 1556 d, 1557 a12, 1558 a22, 1559 t1, 1560 t2, 1561 t3, 1562 a13, 1563 a23, 1564 a33, 1565 a42, 1566 a43, 1567 a32; 1568 x = y = z = rotation = rotationX = rotationY = skewX = skewY = perspective = 0; 1569 scaleX = scaleY = 1; 1570 cache.svg = !!(target.getCTM && _isSVG(target)); 1571 matrix = _getMatrix(target, cache.svg); 1572 1573 if (cache.svg) { 1574 t1 = !cache.uncache && !uncache && target.getAttribute("data-svg-origin"); 1575 1576 _applySVGOrigin(target, t1 || origin, !!t1 || cache.originIsAbsolute, cache.smooth !== false, matrix); 1577 } 1578 1579 xOrigin = cache.xOrigin || 0; 1580 yOrigin = cache.yOrigin || 0; 1581 1582 if (matrix !== _identity2DMatrix) { 1583 a = matrix[0]; //a11 1584 1585 b = matrix[1]; //a21 1586 1587 c = matrix[2]; //a31 1588 1589 d = matrix[3]; //a41 1590 1591 x = a12 = matrix[4]; 1592 y = a22 = matrix[5]; //2D matrix 1593 1594 if (matrix.length === 6) { 1595 scaleX = Math.sqrt(a * a + b * b); 1596 scaleY = Math.sqrt(d * d + c * c); 1597 rotation = a || b ? _atan2(b, a) * _RAD2DEG : 0; //note: if scaleX is 0, we cannot accurately measure rotation. Same for skewX with a scaleY of 0. Therefore, we default to the previously recorded value (or zero if that doesn't exist). 1598 1599 skewX = c || d ? _atan2(c, d) * _RAD2DEG + rotation : 0; 1600 skewX && (scaleY *= Math.abs(Math.cos(skewX * _DEG2RAD))); 1601 1602 if (cache.svg) { 1603 x -= xOrigin - (xOrigin * a + yOrigin * c); 1604 y -= yOrigin - (xOrigin * b + yOrigin * d); 1605 } //3D matrix 1606 1607 } else { 1608 a32 = matrix[6]; 1609 a42 = matrix[7]; 1610 a13 = matrix[8]; 1611 a23 = matrix[9]; 1612 a33 = matrix[10]; 1613 a43 = matrix[11]; 1614 x = matrix[12]; 1615 y = matrix[13]; 1616 z = matrix[14]; 1617 angle = _atan2(a32, a33); 1618 rotationX = angle * _RAD2DEG; //rotationX 1619 1620 if (angle) { 1621 cos = Math.cos(-angle); 1622 sin = Math.sin(-angle); 1623 t1 = a12 * cos + a13 * sin; 1624 t2 = a22 * cos + a23 * sin; 1625 t3 = a32 * cos + a33 * sin; 1626 a13 = a12 * -sin + a13 * cos; 1627 a23 = a22 * -sin + a23 * cos; 1628 a33 = a32 * -sin + a33 * cos; 1629 a43 = a42 * -sin + a43 * cos; 1630 a12 = t1; 1631 a22 = t2; 1632 a32 = t3; 1633 } //rotationY 1634 1635 1636 angle = _atan2(-c, a33); 1637 rotationY = angle * _RAD2DEG; 1638 1639 if (angle) { 1640 cos = Math.cos(-angle); 1641 sin = Math.sin(-angle); 1642 t1 = a * cos - a13 * sin; 1643 t2 = b * cos - a23 * sin; 1644 t3 = c * cos - a33 * sin; 1645 a43 = d * sin + a43 * cos; 1646 a = t1; 1647 b = t2; 1648 c = t3; 1649 } //rotationZ 1650 1651 1652 angle = _atan2(b, a); 1653 rotation = angle * _RAD2DEG; 1654 1655 if (angle) { 1656 cos = Math.cos(angle); 1657 sin = Math.sin(angle); 1658 t1 = a * cos + b * sin; 1659 t2 = a12 * cos + a22 * sin; 1660 b = b * cos - a * sin; 1661 a22 = a22 * cos - a12 * sin; 1662 a = t1; 1663 a12 = t2; 1664 } 1665 1666 if (rotationX && Math.abs(rotationX) + Math.abs(rotation) > 359.9) { 1667 //when rotationY is set, it will often be parsed as 180 degrees different than it should be, and rotationX and rotation both being 180 (it looks the same), so we adjust for that here. 1668 rotationX = rotation = 0; 1669 rotationY = 180 - rotationY; 1670 } 1671 1672 scaleX = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(Math.sqrt(a * a + b * b + c * c)); 1673 scaleY = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(Math.sqrt(a22 * a22 + a32 * a32)); 1674 angle = _atan2(a12, a22); 1675 skewX = Math.abs(angle) > 0.0002 ? angle * _RAD2DEG : 0; 1676 perspective = a43 ? 1 / (a43 < 0 ? -a43 : a43) : 0; 1677 } 1678 1679 if (cache.svg) { 1680 //sense if there are CSS transforms applied on an SVG element in which case we must overwrite them when rendering. The transform attribute is more reliable cross-browser, but we can't just remove the CSS ones because they may be applied in a CSS rule somewhere (not just inline). 1681 t1 = target.getAttribute("transform"); 1682 cache.forceCSS = target.setAttribute("transform", "") || !_isNullTransform(_getComputedProperty(target, _transformProp)); 1683 t1 && target.setAttribute("transform", t1); 1684 } 1685 } 1686 1687 if (Math.abs(skewX) > 90 && Math.abs(skewX) < 270) { 1688 if (invertedScaleX) { 1689 scaleX *= -1; 1690 skewX += rotation <= 0 ? 180 : -180; 1691 rotation += rotation <= 0 ? 180 : -180; 1692 } else { 1693 scaleY *= -1; 1694 skewX += skewX <= 0 ? 180 : -180; 1695 } 1696 } 1697 1698 cache.x = x - ((cache.xPercent = x && (cache.xPercent || (Math.round(target.offsetWidth / 2) === Math.round(-x) ? -50 : 0))) ? target.offsetWidth * cache.xPercent / 100 : 0) + px; 1699 cache.y = y - ((cache.yPercent = y && (cache.yPercent || (Math.round(target.offsetHeight / 2) === Math.round(-y) ? -50 : 0))) ? target.offsetHeight * cache.yPercent / 100 : 0) + px; 1700 cache.z = z + px; 1701 cache.scaleX = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(scaleX); 1702 cache.scaleY = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(scaleY); 1703 cache.rotation = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(rotation) + deg; 1704 cache.rotationX = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(rotationX) + deg; 1705 cache.rotationY = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(rotationY) + deg; 1706 cache.skewX = skewX + deg; 1707 cache.skewY = skewY + deg; 1708 cache.transformPerspective = perspective + px; 1709 1710 if (cache.zOrigin = parseFloat(origin.split(" ")[2]) || 0) { 1711 style[_transformOriginProp] = _firstTwoOnly(origin); 1712 } 1713 1714 cache.xOffset = cache.yOffset = 0; 1715 cache.force3D = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].force3D; 1716 cache.renderTransform = cache.svg ? _renderSVGTransforms : _supports3D ? _renderCSSTransforms : _renderNon3DTransforms; 1717 cache.uncache = 0; 1718 return cache; 1719}, 1720 _firstTwoOnly = function _firstTwoOnly(value) { 1721 return (value = value.split(" "))[0] + " " + value[1]; 1722}, 1723 //for handling transformOrigin values, stripping out the 3rd dimension 1724_addPxTranslate = function _addPxTranslate(target, start, value) { 1725 var unit = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(start); 1726 return Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(parseFloat(start) + parseFloat(_convertToUnit(target, "x", value + "px", unit))) + unit; 1727}, 1728 _renderNon3DTransforms = function _renderNon3DTransforms(ratio, cache) { 1729 cache.z = "0px"; 1730 cache.rotationY = cache.rotationX = "0deg"; 1731 cache.force3D = 0; 1732 1733 _renderCSSTransforms(ratio, cache); 1734}, 1735 _zeroDeg = "0deg", 1736 _zeroPx = "0px", 1737 _endParenthesis = ") ", 1738 _renderCSSTransforms = function _renderCSSTransforms(ratio, cache) { 1739 var _ref = cache || this, 1740 xPercent = _ref.xPercent, 1741 yPercent = _ref.yPercent, 1742 x = _ref.x, 1743 y = _ref.y, 1744 z = _ref.z, 1745 rotation = _ref.rotation, 1746 rotationY = _ref.rotationY, 1747 rotationX = _ref.rotationX, 1748 skewX = _ref.skewX, 1749 skewY = _ref.skewY, 1750 scaleX = _ref.scaleX, 1751 scaleY = _ref.scaleY, 1752 transformPerspective = _ref.transformPerspective, 1753 force3D = _ref.force3D, 1754 target = _ref.target, 1755 zOrigin = _ref.zOrigin, 1756 transforms = "", 1757 use3D = force3D === "auto" && ratio && ratio !== 1 || force3D === true; // Safari has a bug that causes it not to render 3D transform-origin values properly, so we force the z origin to 0, record it in the cache, and then do the math here to offset the translate values accordingly (basically do the 3D transform-origin part manually) 1758 1759 1760 if (zOrigin && (rotationX !== _zeroDeg || rotationY !== _zeroDeg)) { 1761 var angle = parseFloat(rotationY) * _DEG2RAD, 1762 a13 = Math.sin(angle), 1763 a33 = Math.cos(angle), 1764 cos; 1765 1766 angle = parseFloat(rotationX) * _DEG2RAD; 1767 cos = Math.cos(angle); 1768 x = _addPxTranslate(target, x, a13 * cos * -zOrigin); 1769 y = _addPxTranslate(target, y, -Math.sin(angle) * -zOrigin); 1770 z = _addPxTranslate(target, z, a33 * cos * -zOrigin + zOrigin); 1771 } 1772 1773 if (transformPerspective !== _zeroPx) { 1774 transforms += "perspective(" + transformPerspective + _endParenthesis; 1775 } 1776 1777 if (xPercent || yPercent) { 1778 transforms += "translate(" + xPercent + "%, " + yPercent + "%) "; 1779 } 1780 1781 if (use3D || x !== _zeroPx || y !== _zeroPx || z !== _zeroPx) { 1782 transforms += z !== _zeroPx || use3D ? "translate3d(" + x + ", " + y + ", " + z + ") " : "translate(" + x + ", " + y + _endParenthesis; 1783 } 1784 1785 if (rotation !== _zeroDeg) { 1786 transforms += "rotate(" + rotation + _endParenthesis; 1787 } 1788 1789 if (rotationY !== _zeroDeg) { 1790 transforms += "rotateY(" + rotationY + _endParenthesis; 1791 } 1792 1793 if (rotationX !== _zeroDeg) { 1794 transforms += "rotateX(" + rotationX + _endParenthesis; 1795 } 1796 1797 if (skewX !== _zeroDeg || skewY !== _zeroDeg) { 1798 transforms += "skew(" + skewX + ", " + skewY + _endParenthesis; 1799 } 1800 1801 if (scaleX !== 1 || scaleY !== 1) { 1802 transforms += "scale(" + scaleX + ", " + scaleY + _endParenthesis; 1803 } 1804 1805 target.style[_transformProp] = transforms || "translate(0, 0)"; 1806}, 1807 _renderSVGTransforms = function _renderSVGTransforms(ratio, cache) { 1808 var _ref2 = cache || this, 1809 xPercent = _ref2.xPercent, 1810 yPercent = _ref2.yPercent, 1811 x = _ref2.x, 1812 y = _ref2.y, 1813 rotation = _ref2.rotation, 1814 skewX = _ref2.skewX, 1815 skewY = _ref2.skewY, 1816 scaleX = _ref2.scaleX, 1817 scaleY = _ref2.scaleY, 1818 target = _ref2.target, 1819 xOrigin = _ref2.xOrigin, 1820 yOrigin = _ref2.yOrigin, 1821 xOffset = _ref2.xOffset, 1822 yOffset = _ref2.yOffset, 1823 forceCSS = _ref2.forceCSS, 1824 tx = parseFloat(x), 1825 ty = parseFloat(y), 1826 a11, 1827 a21, 1828 a12, 1829 a22, 1830 temp; 1831 1832 rotation = parseFloat(rotation); 1833 skewX = parseFloat(skewX); 1834 skewY = parseFloat(skewY); 1835 1836 if (skewY) { 1837 //for performance reasons, we combine all skewing into the skewX and rotation values. Remember, a skewY of 10 degrees looks the same as a rotation of 10 degrees plus a skewX of 10 degrees. 1838 skewY = parseFloat(skewY); 1839 skewX += skewY; 1840 rotation += skewY; 1841 } 1842 1843 if (rotation || skewX) { 1844 rotation *= _DEG2RAD; 1845 skewX *= _DEG2RAD; 1846 a11 = Math.cos(rotation) * scaleX; 1847 a21 = Math.sin(rotation) * scaleX; 1848 a12 = Math.sin(rotation - skewX) * -scaleY; 1849 a22 = Math.cos(rotation - skewX) * scaleY; 1850 1851 if (skewX) { 1852 skewY *= _DEG2RAD; 1853 temp = Math.tan(skewX - skewY); 1854 temp = Math.sqrt(1 + temp * temp); 1855 a12 *= temp; 1856 a22 *= temp; 1857 1858 if (skewY) { 1859 temp = Math.tan(skewY); 1860 temp = Math.sqrt(1 + temp * temp); 1861 a11 *= temp; 1862 a21 *= temp; 1863 } 1864 } 1865 1866 a11 = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(a11); 1867 a21 = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(a21); 1868 a12 = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(a12); 1869 a22 = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(a22); 1870 } else { 1871 a11 = scaleX; 1872 a22 = scaleY; 1873 a21 = a12 = 0; 1874 } 1875 1876 if (tx && !~(x + "").indexOf("px") || ty && !~(y + "").indexOf("px")) { 1877 tx = _convertToUnit(target, "x", x, "px"); 1878 ty = _convertToUnit(target, "y", y, "px"); 1879 } 1880 1881 if (xOrigin || yOrigin || xOffset || yOffset) { 1882 tx = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(tx + xOrigin - (xOrigin * a11 + yOrigin * a12) + xOffset); 1883 ty = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(ty + yOrigin - (xOrigin * a21 + yOrigin * a22) + yOffset); 1884 } 1885 1886 if (xPercent || yPercent) { 1887 //The SVG spec doesn't support percentage-based translation in the "transform" attribute, so we merge it into the translation to simulate it. 1888 temp = target.getBBox(); 1889 tx = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(tx + xPercent / 100 * temp.width); 1890 ty = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(ty + yPercent / 100 * temp.height); 1891 } 1892 1893 temp = "matrix(" + a11 + "," + a21 + "," + a12 + "," + a22 + "," + tx + "," + ty + ")"; 1894 target.setAttribute("transform", temp); 1895 forceCSS && (target.style[_transformProp] = temp); //some browsers prioritize CSS transforms over the transform attribute. When we sense that the user has CSS transforms applied, we must overwrite them this way (otherwise some browser simply won't render the transform attribute changes!) 1896}, 1897 _addRotationalPropTween = function _addRotationalPropTween(plugin, target, property, startNum, endValue, relative) { 1898 var cap = 360, 1899 isString = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_isString"])(endValue), 1900 endNum = parseFloat(endValue) * (isString && ~endValue.indexOf("rad") ? _RAD2DEG : 1), 1901 change = relative ? endNum * relative : endNum - startNum, 1902 finalValue = startNum + change + "deg", 1903 direction, 1904 pt; 1905 1906 if (isString) { 1907 direction = endValue.split("_")[1]; 1908 1909 if (direction === "short") { 1910 change %= cap; 1911 1912 if (change !== change % (cap / 2)) { 1913 change += change < 0 ? cap : -cap; 1914 } 1915 } 1916 1917 if (direction === "cw" && change < 0) { 1918 change = (change + cap * _bigNum) % cap - ~~(change / cap) * cap; 1919 } else if (direction === "ccw" && change > 0) { 1920 change = (change - cap * _bigNum) % cap - ~~(change / cap) * cap; 1921 } 1922 } 1923 1924 plugin._pt = pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](plugin._pt, target, property, startNum, change, _renderPropWithEnd); 1925 pt.e = finalValue; 1926 pt.u = "deg"; 1927 1928 plugin._props.push(property); 1929 1930 return pt; 1931}, 1932 _assign = function _assign(target, source) { 1933 // Internet Explorer doesn't have Object.assign(), so we recreate it here. 1934 for (var p in source) { 1935 target[p] = source[p]; 1936 } 1937 1938 return target; 1939}, 1940 _addRawTransformPTs = function _addRawTransformPTs(plugin, transforms, target) { 1941 //for handling cases where someone passes in a whole transform string, like transform: "scale(2, 3) rotate(20deg) translateY(30em)" 1942 var startCache = _assign({}, target._gsap), 1943 exclude = "perspective,force3D,transformOrigin,svgOrigin", 1944 style = target.style, 1945 endCache, 1946 p, 1947 startValue, 1948 endValue, 1949 startNum, 1950 endNum, 1951 startUnit, 1952 endUnit; 1953 1954 if (startCache.svg) { 1955 startValue = target.getAttribute("transform"); 1956 target.setAttribute("transform", ""); 1957 style[_transformProp] = transforms; 1958 endCache = _parseTransform(target, 1); 1959 1960 _removeProperty(target, _transformProp); 1961 1962 target.setAttribute("transform", startValue); 1963 } else { 1964 startValue = getComputedStyle(target)[_transformProp]; 1965 style[_transformProp] = transforms; 1966 endCache = _parseTransform(target, 1); 1967 style[_transformProp] = startValue; 1968 } 1969 1970 for (p in _transformProps) { 1971 startValue = startCache[p]; 1972 endValue = endCache[p]; 1973 1974 if (startValue !== endValue && exclude.indexOf(p) < 0) { 1975 //tweening to no perspective gives very unintuitive results - just keep the same perspective in that case. 1976 startUnit = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(startValue); 1977 endUnit = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(endValue); 1978 startNum = startUnit !== endUnit ? _convertToUnit(target, p, startValue, endUnit) : parseFloat(startValue); 1979 endNum = parseFloat(endValue); 1980 plugin._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](plugin._pt, endCache, p, startNum, endNum - startNum, _renderCSSProp); 1981 plugin._pt.u = endUnit || 0; 1982 1983 plugin._props.push(p); 1984 } 1985 } 1986 1987 _assign(endCache, startCache); 1988}; // handle splitting apart padding, margin, borderWidth, and borderRadius into their 4 components. Firefox, for example, won't report borderRadius correctly - it will only do borderTopLeftRadius and the other corners. We also want to handle paddingTop, marginLeft, borderRightWidth, etc. 1989 1990 1991Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_forEachName"])("padding,margin,Width,Radius", function (name, index) { 1992 var t = "Top", 1993 r = "Right", 1994 b = "Bottom", 1995 l = "Left", 1996 props = (index < 3 ? [t, r, b, l] : [t + l, t + r, b + r, b + l]).map(function (side) { 1997 return index < 2 ? name + side : "border" + side + name; 1998 }); 1999 2000 _specialProps[index > 1 ? "border" + name : name] = function (plugin, target, property, endValue, tween) { 2001 var a, vars; 2002 2003 if (arguments.length < 4) { 2004 // getter, passed target, property, and unit (from _get()) 2005 a = props.map(function (prop) { 2006 return _get(plugin, prop, property); 2007 }); 2008 vars = a.join(" "); 2009 return vars.split(a[0]).length === 5 ? a[0] : vars; 2010 } 2011 2012 a = (endValue + "").split(" "); 2013 vars = {}; 2014 props.forEach(function (prop, i) { 2015 return vars[prop] = a[i] = a[i] || a[(i - 1) / 2 | 0]; 2016 }); 2017 plugin.init(target, vars, tween); 2018 }; 2019}); 2020 2021var CSSPlugin = { 2022 name: "css", 2023 register: _initCore, 2024 targetTest: function targetTest(target) { 2025 return target.style && target.nodeType; 2026 }, 2027 init: function init(target, vars, tween, index, targets) { 2028 var props = this._props, 2029 style = target.style, 2030 startAt = tween.vars.startAt, 2031 startValue, 2032 endValue, 2033 endNum, 2034 startNum, 2035 type, 2036 specialProp, 2037 p, 2038 startUnit, 2039 endUnit, 2040 relative, 2041 isTransformRelated, 2042 transformPropTween, 2043 cache, 2044 smooth, 2045 hasPriority; 2046 _pluginInitted || _initCore(); 2047 2048 for (p in vars) { 2049 if (p === "autoRound") { 2050 continue; 2051 } 2052 2053 endValue = vars[p]; 2054 2055 if (_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_plugins"][p] && Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_checkPlugin"])(p, vars, tween, index, target, targets)) { 2056 // plugins 2057 continue; 2058 } 2059 2060 type = typeof endValue; 2061 specialProp = _specialProps[p]; 2062 2063 if (type === "function") { 2064 endValue = endValue.call(tween, index, target, targets); 2065 type = typeof endValue; 2066 } 2067 2068 if (type === "string" && ~endValue.indexOf("random(")) { 2069 endValue = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_replaceRandom"])(endValue); 2070 } 2071 2072 if (specialProp) { 2073 specialProp(this, target, p, endValue, tween) && (hasPriority = 1); 2074 } else if (p.substr(0, 2) === "--") { 2075 //CSS variable 2076 startValue = (getComputedStyle(target).getPropertyValue(p) + "").trim(); 2077 endValue += ""; 2078 _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_colorExp"].lastIndex = 0; 2079 2080 if (!_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_colorExp"].test(startValue)) { 2081 // colors don't have units 2082 startUnit = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(startValue); 2083 endUnit = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(endValue); 2084 } 2085 2086 endUnit ? startUnit !== endUnit && (startValue = _convertToUnit(target, p, startValue, endUnit) + endUnit) : startUnit && (endValue += startUnit); 2087 this.add(style, "setProperty", startValue, endValue, index, targets, 0, 0, p); 2088 } else if (type !== "undefined") { 2089 if (startAt && p in startAt) { 2090 // in case someone hard-codes a complex value as the start, like top: "calc(2vh / 2)". Without this, it'd use the computed value (always in px) 2091 startValue = typeof startAt[p] === "function" ? startAt[p].call(tween, index, target, targets) : startAt[p]; 2092 p in _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units && !Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(startValue) && (startValue += _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units[p]); // for cases when someone passes in a unitless value like {x: 100}; if we try setting translate(100, 0px) it won't work. 2093 2094 (startValue + "").charAt(1) === "=" && (startValue = _get(target, p)); // can't work with relative values 2095 } else { 2096 startValue = _get(target, p); 2097 } 2098 2099 startNum = parseFloat(startValue); 2100 relative = type === "string" && endValue.charAt(1) === "=" ? +(endValue.charAt(0) + "1") : 0; 2101 relative && (endValue = endValue.substr(2)); 2102 endNum = parseFloat(endValue); 2103 2104 if (p in _propertyAliases) { 2105 if (p === "autoAlpha") { 2106 //special case where we control the visibility along with opacity. We still allow the opacity value to pass through and get tweened. 2107 if (startNum === 1 && _get(target, "visibility") === "hidden" && endNum) { 2108 //if visibility is initially set to "hidden", we should interpret that as intent to make opacity 0 (a convenience) 2109 startNum = 0; 2110 } 2111 2112 _addNonTweeningPT(this, style, "visibility", startNum ? "inherit" : "hidden", endNum ? "inherit" : "hidden", !endNum); 2113 } 2114 2115 if (p !== "scale" && p !== "transform") { 2116 p = _propertyAliases[p]; 2117 ~p.indexOf(",") && (p = p.split(",")[0]); 2118 } 2119 } 2120 2121 isTransformRelated = p in _transformProps; //--- TRANSFORM-RELATED --- 2122 2123 if (isTransformRelated) { 2124 if (!transformPropTween) { 2125 cache = target._gsap; 2126 cache.renderTransform && !vars.parseTransform || _parseTransform(target, vars.parseTransform); // if, for example, gsap.set(... {transform:"translateX(50vw)"}), the _get() call doesn't parse the transform, thus cache.renderTransform won't be set yet so force the parsing of the transform here. 2127 2128 smooth = vars.smoothOrigin !== false && cache.smooth; 2129 transformPropTween = this._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](this._pt, style, _transformProp, 0, 1, cache.renderTransform, cache, 0, -1); //the first time through, create the rendering PropTween so that it runs LAST (in the linked list, we keep adding to the beginning) 2130 2131 transformPropTween.dep = 1; //flag it as dependent so that if things get killed/overwritten and this is the only PropTween left, we can safely kill the whole tween. 2132 } 2133 2134 if (p === "scale") { 2135 this._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](this._pt, cache, "scaleY", cache.scaleY, relative ? relative * endNum : endNum - cache.scaleY); 2136 props.push("scaleY", p); 2137 p += "X"; 2138 } else if (p === "transformOrigin") { 2139 endValue = _convertKeywordsToPercentages(endValue); //in case something like "left top" or "bottom right" is passed in. Convert to percentages. 2140 2141 if (cache.svg) { 2142 _applySVGOrigin(target, endValue, 0, smooth, 0, this); 2143 } else { 2144 endUnit = parseFloat(endValue.split(" ")[2]) || 0; //handle the zOrigin separately! 2145 2146 endUnit !== cache.zOrigin && _addNonTweeningPT(this, cache, "zOrigin", cache.zOrigin, endUnit); 2147 2148 _addNonTweeningPT(this, style, p, _firstTwoOnly(startValue), _firstTwoOnly(endValue)); 2149 } 2150 2151 continue; 2152 } else if (p === "svgOrigin") { 2153 _applySVGOrigin(target, endValue, 1, smooth, 0, this); 2154 2155 continue; 2156 } else if (p in _rotationalProperties) { 2157 _addRotationalPropTween(this, cache, p, startNum, endValue, relative); 2158 2159 continue; 2160 } else if (p === "smoothOrigin") { 2161 _addNonTweeningPT(this, cache, "smooth", cache.smooth, endValue); 2162 2163 continue; 2164 } else if (p === "force3D") { 2165 cache[p] = endValue; 2166 continue; 2167 } else if (p === "transform") { 2168 _addRawTransformPTs(this, endValue, target); 2169 2170 continue; 2171 } 2172 } else if (!(p in style)) { 2173 p = _checkPropPrefix(p) || p; 2174 } 2175 2176 if (isTransformRelated || (endNum || endNum === 0) && (startNum || startNum === 0) && !_complexExp.test(endValue) && p in style) { 2177 startUnit = (startValue + "").substr((startNum + "").length); 2178 endNum || (endNum = 0); // protect against NaN 2179 2180 endUnit = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(endValue) || (p in _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units ? _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units[p] : startUnit); 2181 startUnit !== endUnit && (startNum = _convertToUnit(target, p, startValue, endUnit)); 2182 this._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](this._pt, isTransformRelated ? cache : style, p, startNum, relative ? relative * endNum : endNum - startNum, !isTransformRelated && (endUnit === "px" || p === "zIndex") && vars.autoRound !== false ? _renderRoundedCSSProp : _renderCSSProp); 2183 this._pt.u = endUnit || 0; 2184 2185 if (startUnit !== endUnit) { 2186 //when the tween goes all the way back to the beginning, we need to revert it to the OLD/ORIGINAL value (with those units). We record that as a "b" (beginning) property and point to a render method that handles that. (performance optimization) 2187 this._pt.b = startValue; 2188 this._pt.r = _renderCSSPropWithBeginning; 2189 } 2190 } else if (!(p in style)) { 2191 if (p in target) { 2192 //maybe it's not a style - it could be a property added directly to an element in which case we'll try to animate that. 2193 this.add(target, p, target[p], endValue, index, targets); 2194 } else { 2195 Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_missingPlugin"])(p, endValue); 2196 2197 continue; 2198 } 2199 } else { 2200 _tweenComplexCSSString.call(this, target, p, startValue, endValue); 2201 } 2202 2203 props.push(p); 2204 } 2205 } 2206 2207 hasPriority && Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_sortPropTweensByPriority"])(this); 2208 }, 2209 get: _get, 2210 aliases: _propertyAliases, 2211 getSetter: function getSetter(target, property, plugin) { 2212 //returns a setter function that accepts target, property, value and applies it accordingly. Remember, properties like "x" aren't as simple as target.style.property = value because they've got to be applied to a proxy object and then merged into a transform string in a renderer. 2213 var p = _propertyAliases[property]; 2214 p && p.indexOf(",") < 0 && (property = p); 2215 return property in _transformProps && property !== _transformOriginProp && (target._gsap.x || _get(target, "x")) ? plugin && _recentSetterPlugin === plugin ? property === "scale" ? _setterScale : _setterTransform : (_recentSetterPlugin = plugin || {}) && (property === "scale" ? _setterScaleWithRender : _setterTransformWithRender) : target.style && !Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_isUndefined"])(target.style[property]) ? _setterCSSStyle : ~property.indexOf("-") ? _setterCSSProp : Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_getSetter"])(target, property); 2216 }, 2217 core: { 2218 _removeProperty: _removeProperty, 2219 _getMatrix: _getMatrix 2220 } 2221}; 2222_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["gsap"].utils.checkPrefix = _checkPropPrefix; 2223 2224(function (positionAndScale, rotation, others, aliases) { 2225 var all = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_forEachName"])(positionAndScale + "," + rotation + "," + others, function (name) { 2226 _transformProps[name] = 1; 2227 }); 2228 2229 Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_forEachName"])(rotation, function (name) { 2230 _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units[name] = "deg"; 2231 _rotationalProperties[name] = 1; 2232 }); 2233 2234 _propertyAliases[all[13]] = positionAndScale + "," + rotation; 2235 2236 Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_forEachName"])(aliases, function (name) { 2237 var split = name.split(":"); 2238 _propertyAliases[split[1]] = all[split[0]]; 2239 }); 2240})("x,y,z,scale,scaleX,scaleY,xPercent,yPercent", "rotation,rotationX,rotationY,skewX,skewY", "transform,transformOrigin,svgOrigin,force3D,smoothOrigin,transformPerspective", "0:translateX,1:translateY,2:translateZ,8:rotate,8:rotationZ,8:rotateZ,9:rotateX,10:rotateY"); 2241 2242Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_forEachName"])("x,y,z,top,right,bottom,left,width,height,fontSize,padding,margin,perspective", function (name) { 2243 _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units[name] = "px"; 2244}); 2245 2246_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["gsap"].registerPlugin(CSSPlugin); 2247 2248 2249 2250/***/ }), 2251
vendor: 151,606 bytes, lines 2252-6168
2252/***/ "./node_modules/gsap/gsap-core.js": 2253/*!****************************************!*\ 2254 !*** ./node_modules/gsap/gsap-core.js ***! 2255 \****************************************/ 2256/*! exports provided: GSCache, Animation, Timeline, Tween, PropTween, gsap, Power0, Power1, Power2, Power3, Power4, Linear, Quad, Cubic, Quart, Quint, Strong, Elastic, Back, SteppedEase, Bounce, Sine, Expo, Circ, TweenMax, TweenLite, TimelineMax, TimelineLite, default, wrap, wrapYoyo, distribute, random, snap, normalize, getUnit, clamp, splitColor, toArray, mapRange, pipe, unitize, interpolate, shuffle, _getProperty, _numExp, _numWithUnitExp, _isString, _isUndefined, _renderComplexString, _relExp, _setDefaults, _removeLinkedListItem, _forEachName, _sortPropTweensByPriority, _colorStringFilter, _replaceRandom, _checkPlugin, _plugins, _ticker, _config, _roundModifier, _round, _missingPlugin, _getSetter, _getCache, _colorExp */ 2257/***/ (function(module, __webpack_exports__, __webpack_require__) { 2258 2259"use strict"; 2260__webpack_require__.r(__webpack_exports__); 2261/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GSCache", function() { return GSCache; }); 2262/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Animation", function() { return Animation; }); 2263/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Timeline", function() { return Timeline; }); 2264/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Tween", function() { return Tween; }); 2265/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PropTween", function() { return PropTween; }); 2266/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "gsap", function() { return gsap; }); 2267/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Power0", function() { return Power0; }); 2268/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Power1", function() { return Power1; }); 2269/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Power2", function() { return Power2; }); 2270/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Power3", function() { return Power3; }); 2271/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Power4", function() { return Power4; }); 2272/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Linear", function() { return Linear; }); 2273/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Quad", function() { return Quad; }); 2274/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Cubic", function() { return Cubic; }); 2275/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Quart", function() { return Quart; }); 2276/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Quint", function() { return Quint; }); 2277/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Strong", function() { return Strong; }); 2278/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Elastic", function() { return Elastic; }); 2279/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Back", function() { return Back; }); 2280/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SteppedEase", function() { return SteppedEase; }); 2281/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Bounce", function() { return Bounce; }); 2282/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Sine", function() { return Sine; }); 2283/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Expo", function() { return Expo; }); 2284/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Circ", function() { return Circ; }); 2285/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TweenMax", function() { return Tween; }); 2286/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TweenLite", function() { return Tween; }); 2287/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimelineMax", function() { return Timeline; }); 2288/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimelineLite", function() { return Timeline; }); 2289/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return gsap; }); 2290/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wrap", function() { return wrap; }); 2291/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wrapYoyo", function() { return wrapYoyo; }); 2292/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distribute", function() { return distribute; }); 2293/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "random", function() { return random; }); 2294/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "snap", function() { return snap; }); 2295/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "normalize", function() { return normalize; }); 2296/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUnit", function() { return getUnit; }); 2297/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clamp", function() { return clamp; }); 2298/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "splitColor", function() { return splitColor; }); 2299/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toArray", function() { return toArray; }); 2300/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapRange", function() { return mapRange; }); 2301/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pipe", function() { return pipe; }); 2302/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unitize", function() { return unitize; }); 2303/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "interpolate", function() { return interpolate; }); 2304/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shuffle", function() { return shuffle; }); 2305/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_getProperty", function() { return _getProperty; }); 2306/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_numExp", function() { return _numExp; }); 2307/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_numWithUnitExp", function() { return _numWithUnitExp; }); 2308/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_isString", function() { return _isString; }); 2309/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_isUndefined", function() { return _isUndefined; }); 2310/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_renderComplexString", function() { return _renderComplexString; }); 2311/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_relExp", function() { return _relExp; }); 2312/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_setDefaults", function() { return _setDefaults; }); 2313/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_removeLinkedListItem", function() { return _removeLinkedListItem; }); 2314/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_forEachName", function() { return _forEachName; }); 2315/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_sortPropTweensByPriority", function() { return _sortPropTweensByPriority; }); 2316/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_colorStringFilter", function() { return _colorStringFilter; }); 2317/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_replaceRandom", function() { return _replaceRandom; }); 2318/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_checkPlugin", function() { return _checkPlugin; }); 2319/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_plugins", function() { return _plugins; }); 2320/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_ticker", function() { return _ticker; }); 2321/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_config", function() { return _config; }); 2322/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_roundModifier", function() { return _roundModifier; }); 2323/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_round", function() { return _round; }); 2324/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_missingPlugin", function() { return _missingPlugin; }); 2325/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_getSetter", function() { return _getSetter; }); 2326/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_getCache", function() { return _getCache; }); 2327/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_colorExp", function() { return _colorExp; }); 2328/*** IMPORTS FROM imports-loader ***/ 2329var define = false; 2330 2331function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } 2332 2333function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } 2334 2335/*! 2336 * GSAP 3.6.1 2337 * https://greensock.com 2338 * 2339 * @license Copyright 2008-2021, GreenSock. All rights reserved. 2340 * Subject to the terms at https://greensock.com/standard-license or for 2341 * Club GreenSock members, the agreement issued with that membership. 2342 * @author: Jack Doyle, [email protected] 2343*/ 2344 2345/* eslint-disable */ 2346var _config = { 2347 autoSleep: 120, 2348 force3D: "auto", 2349 nullTargetWarn: 1, 2350 units: { 2351 lineHeight: "" 2352 } 2353}, 2354 _defaults = { 2355 duration: .5, 2356 overwrite: false, 2357 delay: 0 2358}, 2359 _suppressOverwrites, 2360 _bigNum = 1e8, 2361 _tinyNum = 1 / _bigNum, 2362 _2PI = Math.PI * 2, 2363 _HALF_PI = _2PI / 4, 2364 _gsID = 0, 2365 _sqrt = Math.sqrt, 2366 _cos = Math.cos, 2367 _sin = Math.sin, 2368 _isString = function _isString(value) { 2369 return typeof value === "string"; 2370}, 2371 _isFunction = function _isFunction(value) { 2372 return typeof value === "function"; 2373}, 2374 _isNumber = function _isNumber(value) { 2375 return typeof value === "number"; 2376}, 2377 _isUndefined = function _isUndefined(value) { 2378 return typeof value === "undefined"; 2379}, 2380 _isObject = function _isObject(value) { 2381 return typeof value === "object"; 2382}, 2383 _isNotFalse = function _isNotFalse(value) { 2384 return value !== false; 2385}, 2386 _windowExists = function _windowExists() { 2387 return typeof window !== "undefined"; 2388}, 2389 _isFuncOrString = function _isFuncOrString(value) { 2390 return _isFunction(value) || _isString(value); 2391}, 2392 _isTypedArray = typeof ArrayBuffer === "function" && ArrayBuffer.isView || function () {}, 2393 // note: IE10 has ArrayBuffer, but NOT ArrayBuffer.isView(). 2394_isArray = Array.isArray, 2395 _strictNumExp = /(?:-?\.?\d|\.)+/gi, 2396 //only numbers (including negatives and decimals) but NOT relative values. 2397_numExp = /[-+=.]*\d+[.e\-+]*\d*[e\-+]*\d*/g, 2398 //finds any numbers, including ones that start with += or -=, negative numbers, and ones in scientific notation like 1e-8. 2399_numWithUnitExp = /[-+=.]*\d+[.e-]*\d*[a-z%]*/g, 2400 _complexStringNumExp = /[-+=.]*\d+\.?\d*(?:e-|e\+)?\d*/gi, 2401 //duplicate so that while we're looping through matches from exec(), it doesn't contaminate the lastIndex of _numExp which we use to search for colors too. 2402_relExp = /[+-]=-?[.\d]+/, 2403 _delimitedValueExp = /[#\-+.]*\b[a-z\d-=+%.]+/gi, 2404 _unitExp = /[\d.+\-=]+(?:e[-+]\d*)*/i, 2405 _globalTimeline, 2406 _win, 2407 _coreInitted, 2408 _doc, 2409 _globals = {}, 2410 _installScope = {}, 2411 _coreReady, 2412 _install = function _install(scope) { 2413 return (_installScope = _merge(scope, _globals)) && gsap; 2414}, 2415 _missingPlugin = function _missingPlugin(property, value) { 2416 return console.warn("Invalid property", property, "set to", value, "Missing plugin? gsap.registerPlugin()"); 2417}, 2418 _warn = function _warn(message, suppress) { 2419 return !suppress && console.warn(message); 2420}, 2421 _addGlobal = function _addGlobal(name, obj) { 2422 return name && (_globals[name] = obj) && _installScope && (_installScope[name] = obj) || _globals; 2423}, 2424 _emptyFunc = function _emptyFunc() { 2425 return 0; 2426}, 2427 _reservedProps = {}, 2428 _lazyTweens = [], 2429 _lazyLookup = {}, 2430 _lastRenderedFrame, 2431 _plugins = {}, 2432 _effects = {}, 2433 _nextGCFrame = 30, 2434 _harnessPlugins = [], 2435 _callbackNames = "", 2436 _harness = function _harness(targets) { 2437 var target = targets[0], 2438 harnessPlugin, 2439 i; 2440 _isObject(target) || _isFunction(target) || (targets = [targets]); 2441 2442 if (!(harnessPlugin = (target._gsap || {}).harness)) { 2443 // find the first target with a harness. We assume targets passed into an animation will be of similar type, meaning the same kind of harness can be used for them all (performance optimization) 2444 i = _harnessPlugins.length; 2445 2446 while (i-- && !_harnessPlugins[i].targetTest(target)) {} 2447 2448 harnessPlugin = _harnessPlugins[i]; 2449 } 2450 2451 i = targets.length; 2452 2453 while (i--) { 2454 targets[i] && (targets[i]._gsap || (targets[i]._gsap = new GSCache(targets[i], harnessPlugin))) || targets.splice(i, 1); 2455 } 2456 2457 return targets; 2458}, 2459 _getCache = function _getCache(target) { 2460 return target._gsap || _harness(toArray(target))[0]._gsap; 2461}, 2462 _getProperty = function _getProperty(target, property, v) { 2463 return (v = target[property]) && _isFunction(v) ? target[property]() : _isUndefined(v) && target.getAttribute && target.getAttribute(property) || v; 2464}, 2465 _forEachName = function _forEachName(names, func) { 2466 return (names = names.split(",")).forEach(func) || names; 2467}, 2468 //split a comma-delimited list of names into an array, then run a forEach() function and return the split array (this is just a way to consolidate/shorten some code). 2469_round = function _round(value) { 2470 return Math.round(value * 100000) / 100000 || 0; 2471}, 2472 _arrayContainsAny = function _arrayContainsAny(toSearch, toFind) { 2473 //searches one array to find matches for any of the items in the toFind array. As soon as one is found, it returns true. It does NOT return all the matches; it's simply a boolean search. 2474 var l = toFind.length, 2475 i = 0; 2476 2477 for (; toSearch.indexOf(toFind[i]) < 0 && ++i < l;) {} 2478 2479 return i < l; 2480}, 2481 _parseVars = function _parseVars(params, type, parent) { 2482 //reads the arguments passed to one of the key methods and figures out if the user is defining things with the OLD/legacy syntax where the duration is the 2nd parameter, and then it adjusts things accordingly and spits back the corrected vars object (with the duration added if necessary, as well as runBackwards or startAt or immediateRender). type 0 = to()/staggerTo(), 1 = from()/staggerFrom(), 2 = fromTo()/staggerFromTo() 2483 var isLegacy = _isNumber(params[1]), 2484 varsIndex = (isLegacy ? 2 : 1) + (type < 2 ? 0 : 1), 2485 vars = params[varsIndex], 2486 irVars; 2487 2488 isLegacy && (vars.duration = params[1]); 2489 vars.parent = parent; 2490 2491 if (type) { 2492 irVars = vars; 2493 2494 while (parent && !("immediateRender" in irVars)) { 2495 // inheritance hasn't happened yet, but someone may have set a default in an ancestor timeline. We could do vars.immediateRender = _isNotFalse(_inheritDefaults(vars).immediateRender) but that'd exact a slight performance penalty because _inheritDefaults() also runs in the Tween constructor. We're paying a small kb price here to gain speed. 2496 irVars = parent.vars.defaults || {}; 2497 parent = _isNotFalse(parent.vars.inherit) && parent.parent; 2498 } 2499 2500 vars.immediateRender = _isNotFalse(irVars.immediateRender); 2501 type < 2 ? vars.runBackwards = 1 : vars.startAt = params[varsIndex - 1]; // "from" vars 2502 } 2503 2504 return vars; 2505}, 2506 _lazyRender = function _lazyRender() { 2507 var l = _lazyTweens.length, 2508 a = _lazyTweens.slice(0), 2509 i, 2510 tween; 2511 2512 _lazyLookup = {}; 2513 _lazyTweens.length = 0; 2514 2515 for (i = 0; i < l; i++) { 2516 tween = a[i]; 2517 tween && tween._lazy && (tween.render(tween._lazy[0], tween._lazy[1], true)._lazy = 0); 2518 } 2519}, 2520 _lazySafeRender = function _lazySafeRender(animation, time, suppressEvents, force) { 2521 _lazyTweens.length && _lazyRender(); 2522 animation.render(time, suppressEvents, force); 2523 _lazyTweens.length && _lazyRender(); //in case rendering caused any tweens to lazy-init, we should render them because typically when someone calls seek() or time() or progress(), they expect an immediate render. 2524}, 2525 _numericIfPossible = function _numericIfPossible(value) { 2526 var n = parseFloat(value); 2527 return (n || n === 0) && (value + "").match(_delimitedValueExp).length < 2 ? n : _isString(value) ? value.trim() : value; 2528}, 2529 _passThrough = function _passThrough(p) { 2530 return p; 2531}, 2532 _setDefaults = function _setDefaults(obj, defaults) { 2533 for (var p in defaults) { 2534 p in obj || (obj[p] = defaults[p]); 2535 } 2536 2537 return obj; 2538}, 2539 _setKeyframeDefaults = function _setKeyframeDefaults(obj, defaults) { 2540 for (var p in defaults) { 2541 p in obj || p === "duration" || p === "ease" || (obj[p] = defaults[p]); 2542 } 2543}, 2544 _merge = function _merge(base, toMerge) { 2545 for (var p in toMerge) { 2546 base[p] = toMerge[p]; 2547 } 2548 2549 return base; 2550}, 2551 _mergeDeep = function _mergeDeep(base, toMerge) { 2552 for (var p in toMerge) { 2553 p !== "__proto__" && p !== "constructor" && p !== "prototype" && (base[p] = _isObject(toMerge[p]) ? _mergeDeep(base[p] || (base[p] = {}), toMerge[p]) : toMerge[p]); 2554 } 2555 2556 return base; 2557}, 2558 _copyExcluding = function _copyExcluding(obj, excluding) { 2559 var copy = {}, 2560 p; 2561 2562 for (p in obj) { 2563 p in excluding || (copy[p] = obj[p]); 2564 } 2565 2566 return copy; 2567}, 2568 _inheritDefaults = function _inheritDefaults(vars) { 2569 var parent = vars.parent || _globalTimeline, 2570 func = vars.keyframes ? _setKeyframeDefaults : _setDefaults; 2571 2572 if (_isNotFalse(vars.inherit)) { 2573 while (parent) { 2574 func(vars, parent.vars.defaults); 2575 parent = parent.parent || parent._dp; 2576 } 2577 } 2578 2579 return vars; 2580}, 2581 _arraysMatch = function _arraysMatch(a1, a2) { 2582 var i = a1.length, 2583 match = i === a2.length; 2584 2585 while (match && i-- && a1[i] === a2[i]) {} 2586 2587 return i < 0; 2588}, 2589 _addLinkedListItem = function _addLinkedListItem(parent, child, firstProp, lastProp, sortBy) { 2590 if (firstProp === void 0) { 2591 firstProp = "_first"; 2592 } 2593 2594 if (lastProp === void 0) { 2595 lastProp = "_last"; 2596 } 2597 2598 var prev = parent[lastProp], 2599 t; 2600 2601 if (sortBy) { 2602 t = child[sortBy]; 2603 2604 while (prev && prev[sortBy] > t) { 2605 prev = prev._prev; 2606 } 2607 } 2608 2609 if (prev) { 2610 child._next = prev._next; 2611 prev._next = child; 2612 } else { 2613 child._next = parent[firstProp]; 2614 parent[firstProp] = child; 2615 } 2616 2617 if (child._next) { 2618 child._next._prev = child; 2619 } else { 2620 parent[lastProp] = child; 2621 } 2622 2623 child._prev = prev; 2624 child.parent = child._dp = parent; 2625 return child; 2626}, 2627 _removeLinkedListItem = function _removeLinkedListItem(parent, child, firstProp, lastProp) { 2628 if (firstProp === void 0) { 2629 firstProp = "_first"; 2630 } 2631 2632 if (lastProp === void 0) { 2633 lastProp = "_last"; 2634 } 2635 2636 var prev = child._prev, 2637 next = child._next; 2638 2639 if (prev) { 2640 prev._next = next; 2641 } else if (parent[firstProp] === child) { 2642 parent[firstProp] = next; 2643 } 2644 2645 if (next) { 2646 next._prev = prev; 2647 } else if (parent[lastProp] === child) { 2648 parent[lastProp] = prev; 2649 } 2650 2651 child._next = child._prev = child.parent = null; // don't delete the _dp just so we can revert if necessary. But parent should be null to indicate the item isn't in a linked list. 2652}, 2653 _removeFromParent = function _removeFromParent(child, onlyIfParentHasAutoRemove) { 2654 child.parent && (!onlyIfParentHasAutoRemove || child.parent.autoRemoveChildren) && child.parent.remove(child); 2655 child._act = 0; 2656}, 2657 _uncache = function _uncache(animation, child) { 2658 if (animation && (!child || child._end > animation._dur || child._start < 0)) { 2659 // performance optimization: if a child animation is passed in we should only uncache if that child EXTENDS the animation (its end time is beyond the end) 2660 var a = animation; 2661 2662 while (a) { 2663 a._dirty = 1; 2664 a = a.parent; 2665 } 2666 } 2667 2668 return animation; 2669}, 2670 _recacheAncestors = function _recacheAncestors(animation) { 2671 var parent = animation.parent; 2672 2673 while (parent && parent.parent) { 2674 //sometimes we must force a re-sort of all children and update the duration/totalDuration of all ancestor timelines immediately in case, for example, in the middle of a render loop, one tween alters another tween's timeScale which shoves its startTime before 0, forcing the parent timeline to shift around and shiftChildren() which could affect that next tween's render (startTime). Doesn't matter for the root timeline though. 2675 parent._dirty = 1; 2676 parent.totalDuration(); 2677 parent = parent.parent; 2678 } 2679 2680 return animation; 2681}, 2682 _hasNoPausedAncestors = function _hasNoPausedAncestors(animation) { 2683 return !animation || animation._ts && _hasNoPausedAncestors(animation.parent); 2684}, 2685 _elapsedCycleDuration = function _elapsedCycleDuration(animation) { 2686 return animation._repeat ? _animationCycle(animation._tTime, animation = animation.duration() + animation._rDelay) * animation : 0; 2687}, 2688 // feed in the totalTime and cycleDuration and it'll return the cycle (iteration minus 1) and if the playhead is exactly at the very END, it will NOT bump up to the next cycle. 2689_animationCycle = function _animationCycle(tTime, cycleDuration) { 2690 var whole = Math.floor(tTime /= cycleDuration); 2691 return tTime && whole === tTime ? whole - 1 : whole; 2692}, 2693 _parentToChildTotalTime = function _parentToChildTotalTime(parentTime, child) { 2694 return (parentTime - child._start) * child._ts + (child._ts >= 0 ? 0 : child._dirty ? child.totalDuration() : child._tDur); 2695}, 2696 _setEnd = function _setEnd(animation) { 2697 return animation._end = _round(animation._start + (animation._tDur / Math.abs(animation._ts || animation._rts || _tinyNum) || 0)); 2698}, 2699 _alignPlayhead = function _alignPlayhead(animation, totalTime) { 2700 // adjusts the animation's _start and _end according to the provided totalTime (only if the parent's smoothChildTiming is true and the animation isn't paused). It doesn't do any rendering or forcing things back into parent timelines, etc. - that's what totalTime() is for. 2701 var parent = animation._dp; 2702 2703 if (parent && parent.smoothChildTiming && animation._ts) { 2704 animation._start = _round(parent._time - (animation._ts > 0 ? totalTime / animation._ts : ((animation._dirty ? animation.totalDuration() : animation._tDur) - totalTime) / -animation._ts)); 2705 2706 _setEnd(animation); 2707 2708 parent._dirty || _uncache(parent, animation); //for performance improvement. If the parent's cache is already dirty, it already took care of marking the ancestors as dirty too, so skip the function call here. 2709 } 2710 2711 return animation; 2712}, 2713 2714/* 2715_totalTimeToTime = (clampedTotalTime, duration, repeat, repeatDelay, yoyo) => { 2716 let cycleDuration = duration + repeatDelay, 2717 time = _round(clampedTotalTime % cycleDuration); 2718 if (time > duration) { 2719 time = duration; 2720 } 2721 return (yoyo && (~~(clampedTotalTime / cycleDuration) & 1)) ? duration - time : time; 2722}, 2723*/ 2724_postAddChecks = function _postAddChecks(timeline, child) { 2725 var t; 2726 2727 if (child._time || child._initted && !child._dur) { 2728 //in case, for example, the _start is moved on a tween that has already rendered. Imagine it's at its end state, then the startTime is moved WAY later (after the end of this timeline), it should render at its beginning. 2729 t = _parentToChildTotalTime(timeline.rawTime(), child); 2730 2731 if (!child._dur || _clamp(0, child.totalDuration(), t) - child._tTime > _tinyNum) { 2732 child.render(t, true); 2733 } 2734 } //if the timeline has already ended but the inserted tween/timeline extends the duration, we should enable this timeline again so that it renders properly. We should also align the playhead with the parent timeline's when appropriate. 2735 2736 2737 if (_uncache(timeline, child)._dp && timeline._initted && timeline._time >= timeline._dur && timeline._ts) { 2738 //in case any of the ancestors had completed but should now be enabled... 2739 if (timeline._dur < timeline.duration()) { 2740 t = timeline; 2741 2742 while (t._dp) { 2743 t.rawTime() >= 0 && t.totalTime(t._tTime); //moves the timeline (shifts its startTime) if necessary, and also enables it. If it's currently zero, though, it may not be scheduled to render until later so there's no need to force it to align with the current playhead position. Only move to catch up with the playhead. 2744 2745 t = t._dp; 2746 } 2747 } 2748 2749 timeline._zTime = -_tinyNum; // helps ensure that the next render() will be forced (crossingStart = true in render()), even if the duration hasn't changed (we're adding a child which would need to get rendered). Definitely an edge case. Note: we MUST do this AFTER the loop above where the totalTime() might trigger a render() because this _addToTimeline() method gets called from the Animation constructor, BEFORE tweens even record their targets, etc. so we wouldn't want things to get triggered in the wrong order. 2750 } 2751}, 2752 _addToTimeline = function _addToTimeline(timeline, child, position, skipChecks) { 2753 child.parent && _removeFromParent(child); 2754 child._start = _round(position + child._delay); 2755 child._end = _round(child._start + (child.totalDuration() / Math.abs(child.timeScale()) || 0)); 2756 2757 _addLinkedListItem(timeline, child, "_first", "_last", timeline._sort ? "_start" : 0); 2758 2759 timeline._recent = child; 2760 skipChecks || _postAddChecks(timeline, child); 2761 return timeline; 2762}, 2763 _scrollTrigger = function _scrollTrigger(animation, trigger) { 2764 return (_globals.ScrollTrigger || _missingPlugin("scrollTrigger", trigger)) && _globals.ScrollTrigger.create(trigger, animation); 2765}, 2766 _attemptInitTween = function _attemptInitTween(tween, totalTime, force, suppressEvents) { 2767 _initTween(tween, totalTime); 2768 2769 if (!tween._initted) { 2770 return 1; 2771 } 2772 2773 if (!force && tween._pt && (tween._dur && tween.vars.lazy !== false || !tween._dur && tween.vars.lazy) && _lastRenderedFrame !== _ticker.frame) { 2774 _lazyTweens.push(tween); 2775 2776 tween._lazy = [totalTime, suppressEvents]; 2777 return 1; 2778 } 2779}, 2780 _parentPlayheadIsBeforeStart = function _parentPlayheadIsBeforeStart(_ref) { 2781 var parent = _ref.parent; 2782 return parent && parent._ts && parent._initted && !parent._lock && (parent.rawTime() < 0 || _parentPlayheadIsBeforeStart(parent)); 2783}, 2784 // check parent's _lock because when a timeline repeats/yoyos and does its artificial wrapping, we shouldn't force the ratio back to 0 2785_renderZeroDurationTween = function _renderZeroDurationTween(tween, totalTime, suppressEvents, force) { 2786 var prevRatio = tween.ratio, 2787 ratio = totalTime < 0 || !totalTime && (!tween._start && _parentPlayheadIsBeforeStart(tween) || (tween._ts < 0 || tween._dp._ts < 0) && tween.data !== "isFromStart" && tween.data !== "isStart") ? 0 : 1, 2788 // if the tween or its parent is reversed and the totalTime is 0, we should go to a ratio of 0. 2789 repeatDelay = tween._rDelay, 2790 tTime = 0, 2791 pt, 2792 iteration, 2793 prevIteration; 2794 2795 if (repeatDelay && tween._repeat) { 2796 // in case there's a zero-duration tween that has a repeat with a repeatDelay 2797 tTime = _clamp(0, tween._tDur, totalTime); 2798 iteration = _animationCycle(tTime, repeatDelay); 2799 prevIteration = _animationCycle(tween._tTime, repeatDelay); 2800 tween._yoyo && iteration & 1 && (ratio = 1 - ratio); 2801 2802 if (iteration !== prevIteration) { 2803 prevRatio = 1 - ratio; 2804 tween.vars.repeatRefresh && tween._initted && tween.invalidate(); 2805 } 2806 } 2807 2808 if (ratio !== prevRatio || force || tween._zTime === _tinyNum || !totalTime && tween._zTime) { 2809 if (!tween._initted && _attemptInitTween(tween, totalTime, force, suppressEvents)) { 2810 // if we render the very beginning (time == 0) of a fromTo(), we must force the render (normal tweens wouldn't need to render at a time of 0 when the prevTime was also 0). This is also mandatory to make sure overwriting kicks in immediately. 2811 return; 2812 } 2813 2814 prevIteration = tween._zTime; 2815 tween._zTime = totalTime || (suppressEvents ? _tinyNum : 0); // when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect. 2816 2817 suppressEvents || (suppressEvents = totalTime && !prevIteration); // if it was rendered previously at exactly 0 (_zTime) and now the playhead is moving away, DON'T fire callbacks otherwise they'll seem like duplicates. 2818 2819 tween.ratio = ratio; 2820 tween._from && (ratio = 1 - ratio); 2821 tween._time = 0; 2822 tween._tTime = tTime; 2823 pt = tween._pt; 2824 2825 while (pt) { 2826 pt.r(ratio, pt.d); 2827 pt = pt._next; 2828 } 2829 2830 tween._startAt && totalTime < 0 && tween._startAt.render(totalTime, true, true); 2831 tween._onUpdate && !suppressEvents && _callback(tween, "onUpdate"); 2832 tTime && tween._repeat && !suppressEvents && tween.parent && _callback(tween, "onRepeat"); 2833 2834 if ((totalTime >= tween._tDur || totalTime < 0) && tween.ratio === ratio) { 2835 ratio && _removeFromParent(tween, 1); 2836 2837 if (!suppressEvents) { 2838 _callback(tween, ratio ? "onComplete" : "onReverseComplete", true); 2839 2840 tween._prom && tween._prom(); 2841 } 2842 } 2843 } else if (!tween._zTime) { 2844 tween._zTime = totalTime; 2845 } 2846}, 2847 _findNextPauseTween = function _findNextPauseTween(animation, prevTime, time) { 2848 var child; 2849 2850 if (time > prevTime) { 2851 child = animation._first; 2852 2853 while (child && child._start <= time) { 2854 if (!child._dur && child.data === "isPause" && child._start > prevTime) { 2855 return child; 2856 } 2857 2858 child = child._next; 2859 } 2860 } else { 2861 child = animation._last; 2862 2863 while (child && child._start >= time) { 2864 if (!child._dur && child.data === "isPause" && child._start < prevTime) { 2865 return child; 2866 } 2867 2868 child = child._prev; 2869 } 2870 } 2871}, 2872 _setDuration = function _setDuration(animation, duration, skipUncache, leavePlayhead) { 2873 var repeat = animation._repeat, 2874 dur = _round(duration) || 0, 2875 totalProgress = animation._tTime / animation._tDur; 2876 totalProgress && !leavePlayhead && (animation._time *= dur / animation._dur); 2877 animation._dur = dur; 2878 animation._tDur = !repeat ? dur : repeat < 0 ? 1e10 : _round(dur * (repeat + 1) + animation._rDelay * repeat); 2879 totalProgress && !leavePlayhead ? _alignPlayhead(animation, animation._tTime = animation._tDur * totalProgress) : animation.parent && _setEnd(animation); 2880 skipUncache || _uncache(animation.parent, animation); 2881 return animation; 2882}, 2883 _onUpdateTotalDuration = function _onUpdateTotalDuration(animation) { 2884 return animation instanceof Timeline ? _uncache(animation) : _setDuration(animation, animation._dur); 2885}, 2886 _zeroPosition = { 2887 _start: 0, 2888 endTime: _emptyFunc 2889}, 2890 _parsePosition = function _parsePosition(animation, position) { 2891 var labels = animation.labels, 2892 recent = animation._recent || _zeroPosition, 2893 clippedDuration = animation.duration() >= _bigNum ? recent.endTime(false) : animation._dur, 2894 //in case there's a child that infinitely repeats, users almost never intend for the insertion point of a new child to be based on a SUPER long value like that so we clip it and assume the most recently-added child's endTime should be used instead. 2895 i, 2896 offset; 2897 2898 if (_isString(position) && (isNaN(position) || position in labels)) { 2899 //if the string is a number like "1", check to see if there's a label with that name, otherwise interpret it as a number (absolute value). 2900 i = position.charAt(0); 2901 2902 if (i === "<" || i === ">") { 2903 return (i === "<" ? recent._start : recent.endTime(recent._repeat >= 0)) + (parseFloat(position.substr(1)) || 0); 2904 } 2905 2906 i = position.indexOf("="); 2907 2908 if (i < 0) { 2909 position in labels || (labels[position] = clippedDuration); 2910 return labels[position]; 2911 } 2912 2913 offset = +(position.charAt(i - 1) + position.substr(i + 1)); 2914 return i > 1 ? _parsePosition(animation, position.substr(0, i - 1)) + offset : clippedDuration + offset; 2915 } 2916 2917 return position == null ? clippedDuration : +position; 2918}, 2919 _conditionalReturn = function _conditionalReturn(value, func) { 2920 return value || value === 0 ? func(value) : func; 2921}, 2922 _clamp = function _clamp(min, max, value) { 2923 return value < min ? min : value > max ? max : value; 2924}, 2925 getUnit = function getUnit(value) { 2926 if (typeof value !== "string") { 2927 return ""; 2928 } 2929 2930 var v = _unitExp.exec(value); 2931 2932 return v ? value.substr(v.index + v[0].length) : ""; 2933}, 2934 // note: protect against padded numbers as strings, like "100.100". That shouldn't return "00" as the unit. If it's numeric, return no unit. 2935clamp = function clamp(min, max, value) { 2936 return _conditionalReturn(value, function (v) { 2937 return _clamp(min, max, v); 2938 }); 2939}, 2940 _slice = [].slice, 2941 _isArrayLike = function _isArrayLike(value, nonEmpty) { 2942 return value && _isObject(value) && "length" in value && (!nonEmpty && !value.length || value.length - 1 in value && _isObject(value[0])) && !value.nodeType && value !== _win; 2943}, 2944 _flatten = function _flatten(ar, leaveStrings, accumulator) { 2945 if (accumulator === void 0) { 2946 accumulator = []; 2947 } 2948 2949 return ar.forEach(function (value) { 2950 var _accumulator; 2951 2952 return _isString(value) && !leaveStrings || _isArrayLike(value, 1) ? (_accumulator = accumulator).push.apply(_accumulator, toArray(value)) : accumulator.push(value); 2953 }) || accumulator; 2954}, 2955 //takes any value and returns an array. If it's a string (and leaveStrings isn't true), it'll use document.querySelectorAll() and convert that to an array. It'll also accept iterables like jQuery objects. 2956toArray = function toArray(value, leaveStrings) { 2957 return _isString(value) && !leaveStrings && (_coreInitted || !_wake()) ? _slice.call(_doc.querySelectorAll(value), 0) : _isArray(value) ? _flatten(value, leaveStrings) : _isArrayLike(value) ? _slice.call(value, 0) : value ? [value] : []; 2958}, 2959 shuffle = function shuffle(a) { 2960 return a.sort(function () { 2961 return .5 - Math.random(); 2962 }); 2963}, 2964 // alternative that's a bit faster and more reliably diverse but bigger: for (let j, v, i = a.length; i; j = Math.floor(Math.random() * i), v = a[--i], a[i] = a[j], a[j] = v); return a; 2965//for distributing values across an array. Can accept a number, a function or (most commonly) a function which can contain the following properties: {base, amount, from, ease, grid, axis, length, each}. Returns a function that expects the following parameters: index, target, array. Recognizes the following 2966distribute = function distribute(v) { 2967 if (_isFunction(v)) { 2968 return v; 2969 } 2970 2971 var vars = _isObject(v) ? v : { 2972 each: v 2973 }, 2974 //n:1 is just to indicate v was a number; we leverage that later to set v according to the length we get. If a number is passed in, we treat it like the old stagger value where 0.1, for example, would mean that things would be distributed with 0.1 between each element in the array rather than a total "amount" that's chunked out among them all. 2975 ease = _parseEase(vars.ease), 2976 from = vars.from || 0, 2977 base = parseFloat(vars.base) || 0, 2978 cache = {}, 2979 isDecimal = from > 0 && from < 1, 2980 ratios = isNaN(from) || isDecimal, 2981 axis = vars.axis, 2982 ratioX = from, 2983 ratioY = from; 2984 2985 if (_isString(from)) { 2986 ratioX = ratioY = { 2987 center: .5, 2988 edges: .5, 2989 end: 1 2990 }[from] || 0; 2991 } else if (!isDecimal && ratios) { 2992 ratioX = from[0]; 2993 ratioY = from[1]; 2994 } 2995 2996 return function (i, target, a) { 2997 var l = (a || vars).length, 2998 distances = cache[l], 2999 originX, 3000 originY, 3001 x, 3002 y, 3003 d, 3004 j, 3005 max, 3006 min, 3007 wrapAt; 3008 3009 if (!distances) { 3010 wrapAt = vars.grid === "auto" ? 0 : (vars.grid || [1, _bigNum])[1]; 3011 3012 if (!wrapAt) { 3013 max = -_bigNum; 3014 3015 while (max < (max = a[wrapAt++].getBoundingClientRect().left) && wrapAt < l) {} 3016 3017 wrapAt--; 3018 } 3019 3020 distances = cache[l] = []; 3021 originX = ratios ? Math.min(wrapAt, l) * ratioX - .5 : from % wrapAt; 3022 originY = ratios ? l * ratioY / wrapAt - .5 : from / wrapAt | 0; 3023 max = 0; 3024 min = _bigNum; 3025 3026 for (j = 0; j < l; j++) { 3027 x = j % wrapAt - originX; 3028 y = originY - (j / wrapAt | 0); 3029 distances[j] = d = !axis ? _sqrt(x * x + y * y) : Math.abs(axis === "y" ? y : x); 3030 d > max && (max = d); 3031 d < min && (min = d); 3032 } 3033 3034 from === "random" && shuffle(distances); 3035 distances.max = max - min; 3036 distances.min = min; 3037 distances.v = l = (parseFloat(vars.amount) || parseFloat(vars.each) * (wrapAt > l ? l - 1 : !axis ? Math.max(wrapAt, l / wrapAt) : axis === "y" ? l / wrapAt : wrapAt) || 0) * (from === "edges" ? -1 : 1); 3038 distances.b = l < 0 ? base - l : base; 3039 distances.u = getUnit(vars.amount || vars.each) || 0; //unit 3040 3041 ease = ease && l < 0 ? _invertEase(ease) : ease; 3042 } 3043 3044 l = (distances[i] - distances.min) / distances.max || 0; 3045 return _round(distances.b + (ease ? ease(l) : l) * distances.v) + distances.u; //round in order to work around floating point errors 3046 }; 3047}, 3048 _roundModifier = function _roundModifier(v) { 3049 //pass in 0.1 get a function that'll round to the nearest tenth, or 5 to round to the closest 5, or 0.001 to the closest 1000th, etc. 3050 var p = v < 1 ? Math.pow(10, (v + "").length - 2) : 1; //to avoid floating point math errors (like 24 * 0.1 == 2.4000000000000004), we chop off at a specific number of decimal places (much faster than toFixed() 3051 3052 return function (raw) { 3053 var n = Math.round(parseFloat(raw) / v) * v * p; 3054 return (n - n % 1) / p + (_isNumber(raw) ? 0 : getUnit(raw)); // n - n % 1 replaces Math.floor() in order to handle negative values properly. For example, Math.floor(-150.00000000000003) is 151! 3055 }; 3056}, 3057 snap = function snap(snapTo, value) { 3058 var isArray = _isArray(snapTo), 3059 radius, 3060 is2D; 3061 3062 if (!isArray && _isObject(snapTo)) { 3063 radius = isArray = snapTo.radius || _bigNum; 3064 3065 if (snapTo.values) { 3066 snapTo = toArray(snapTo.values); 3067 3068 if (is2D = !_isNumber(snapTo[0])) { 3069 radius *= radius; //performance optimization so we don't have to Math.sqrt() in the loop. 3070 } 3071 } else { 3072 snapTo = _roundModifier(snapTo.increment); 3073 } 3074 } 3075 3076 return _conditionalReturn(value, !isArray ? _roundModifier(snapTo) : _isFunction(snapTo) ? function (raw) { 3077 is2D = snapTo(raw); 3078 return Math.abs(is2D - raw) <= radius ? is2D : raw; 3079 } : function (raw) { 3080 var x = parseFloat(is2D ? raw.x : raw), 3081 y = parseFloat(is2D ? raw.y : 0), 3082 min = _bigNum, 3083 closest = 0, 3084 i = snapTo.length, 3085 dx, 3086 dy; 3087 3088 while (i--) { 3089 if (is2D) { 3090 dx = snapTo[i].x - x; 3091 dy = snapTo[i].y - y; 3092 dx = dx * dx + dy * dy; 3093 } else { 3094 dx = Math.abs(snapTo[i] - x); 3095 } 3096 3097 if (dx < min) { 3098 min = dx; 3099 closest = i; 3100 } 3101 } 3102 3103 closest = !radius || min <= radius ? snapTo[closest] : raw; 3104 return is2D || closest === raw || _isNumber(raw) ? closest : closest + getUnit(raw); 3105 }); 3106}, 3107 random = function random(min, max, roundingIncrement, returnFunction) { 3108 return _conditionalReturn(_isArray(min) ? !max : roundingIncrement === true ? !!(roundingIncrement = 0) : !returnFunction, function () { 3109 return _isArray(min) ? min[~~(Math.random() * min.length)] : (roundingIncrement = roundingIncrement || 1e-5) && (returnFunction = roundingIncrement < 1 ? Math.pow(10, (roundingIncrement + "").length - 2) : 1) && Math.floor(Math.round((min - roundingIncrement / 2 + Math.random() * (max - min + roundingIncrement * .99)) / roundingIncrement) * roundingIncrement * returnFunction) / returnFunction; 3110 }); 3111}, 3112 pipe = function pipe() { 3113 for (var _len = arguments.length, functions = new Array(_len), _key = 0; _key < _len; _key++) { 3114 functions[_key] = arguments[_key]; 3115 } 3116 3117 return function (value) { 3118 return functions.reduce(function (v, f) { 3119 return f(v); 3120 }, value); 3121 }; 3122}, 3123 unitize = function unitize(func, unit) { 3124 return function (value) { 3125 return func(parseFloat(value)) + (unit || getUnit(value)); 3126 }; 3127}, 3128 normalize = function normalize(min, max, value) { 3129 return mapRange(min, max, 0, 1, value); 3130}, 3131 _wrapArray = function _wrapArray(a, wrapper, value) { 3132 return _conditionalReturn(value, function (index) { 3133 return a[~~wrapper(index)]; 3134 }); 3135}, 3136 wrap = function wrap(min, max, value) { 3137 // NOTE: wrap() CANNOT be an arrow function! A very odd compiling bug causes problems (unrelated to GSAP). 3138 var range = max - min; 3139 return _isArray(min) ? _wrapArray(min, wrap(0, min.length), max) : _conditionalReturn(value, function (value) { 3140 return (range + (value - min) % range) % range + min; 3141 }); 3142}, 3143 wrapYoyo = function wrapYoyo(min, max, value) { 3144 var range = max - min, 3145 total = range * 2; 3146 return _isArray(min) ? _wrapArray(min, wrapYoyo(0, min.length - 1), max) : _conditionalReturn(value, function (value) { 3147 value = (total + (value - min) % total) % total || 0; 3148 return min + (value > range ? total - value : value); 3149 }); 3150}, 3151 _replaceRandom = function _replaceRandom(value) { 3152 //replaces all occurrences of random(...) in a string with the calculated random value. can be a range like random(-100, 100, 5) or an array like random([0, 100, 500]) 3153 var prev = 0, 3154 s = "", 3155 i, 3156 nums, 3157 end, 3158 isArray; 3159 3160 while (~(i = value.indexOf("random(", prev))) { 3161 end = value.indexOf(")", i); 3162 isArray = value.charAt(i + 7) === "["; 3163 nums = value.substr(i + 7, end - i - 7).match(isArray ? _delimitedValueExp : _strictNumExp); 3164 s += value.substr(prev, i - prev) + random(isArray ? nums : +nums[0], isArray ? 0 : +nums[1], +nums[2] || 1e-5); 3165 prev = end + 1; 3166 } 3167 3168 return s + value.substr(prev, value.length - prev); 3169}, 3170 mapRange = function mapRange(inMin, inMax, outMin, outMax, value) { 3171 var inRange = inMax - inMin, 3172 outRange = outMax - outMin; 3173 return _conditionalReturn(value, function (value) { 3174 return outMin + ((value - inMin) / inRange * outRange || 0); 3175 }); 3176}, 3177 interpolate = function interpolate(start, end, progress, mutate) { 3178 var func = isNaN(start + end) ? 0 : function (p) { 3179 return (1 - p) * start + p * end; 3180 }; 3181 3182 if (!func) { 3183 var isString = _isString(start), 3184 master = {}, 3185 p, 3186 i, 3187 interpolators, 3188 l, 3189 il; 3190 3191 progress === true && (mutate = 1) && (progress = null); 3192 3193 if (isString) { 3194 start = { 3195 p: start 3196 }; 3197 end = { 3198 p: end 3199 }; 3200 } else if (_isArray(start) && !_isArray(end)) { 3201 interpolators = []; 3202 l = start.length; 3203 il = l - 2; 3204 3205 for (i = 1; i < l; i++) { 3206 interpolators.push(interpolate(start[i - 1], start[i])); //build the interpolators up front as a performance optimization so that when the function is called many times, it can just reuse them. 3207 } 3208 3209 l--; 3210 3211 func = function func(p) { 3212 p *= l; 3213 var i = Math.min(il, ~~p); 3214 return interpolators[i](p - i); 3215 }; 3216 3217 progress = end; 3218 } else if (!mutate) { 3219 start = _merge(_isArray(start) ? [] : {}, start); 3220 } 3221 3222 if (!interpolators) { 3223 for (p in end) { 3224 _addPropTween.call(master, start, p, "get", end[p]); 3225 } 3226 3227 func = function func(p) { 3228 return _renderPropTweens(p, master) || (isString ? start.p : start); 3229 }; 3230 } 3231 } 3232 3233 return _conditionalReturn(progress, func); 3234}, 3235 _getLabelInDirection = function _getLabelInDirection(timeline, fromTime, backward) { 3236 //used for nextLabel() and previousLabel() 3237 var labels = timeline.labels, 3238 min = _bigNum, 3239 p, 3240 distance, 3241 label; 3242 3243 for (p in labels) { 3244 distance = labels[p] - fromTime; 3245 3246 if (distance < 0 === !!backward && distance && min > (distance = Math.abs(distance))) { 3247 label = p; 3248 min = distance; 3249 } 3250 } 3251 3252 return label; 3253}, 3254 _callback = function _callback(animation, type, executeLazyFirst) { 3255 var v = animation.vars, 3256 callback = v[type], 3257 params, 3258 scope; 3259 3260 if (!callback) { 3261 return; 3262 } 3263 3264 params = v[type + "Params"]; 3265 scope = v.callbackScope || animation; 3266 executeLazyFirst && _lazyTweens.length && _lazyRender(); //in case rendering caused any tweens to lazy-init, we should render them because typically when a timeline finishes, users expect things to have rendered fully. Imagine an onUpdate on a timeline that reports/checks tweened values. 3267 3268 return params ? callback.apply(scope, params) : callback.call(scope); 3269}, 3270 _interrupt = function _interrupt(animation) { 3271 _removeFromParent(animation); 3272 3273 animation.scrollTrigger && animation.scrollTrigger.kill(false); 3274 animation.progress() < 1 && _callback(animation, "onInterrupt"); 3275 return animation; 3276}, 3277 _quickTween, 3278 _createPlugin = function _createPlugin(config) { 3279 config = !config.name && config["default"] || config; //UMD packaging wraps things oddly, so for example MotionPathHelper becomes {MotionPathHelper:MotionPathHelper, default:MotionPathHelper}. 3280 3281 var name = config.name, 3282 isFunc = _isFunction(config), 3283 Plugin = name && !isFunc && config.init ? function () { 3284 this._props = []; 3285 } : config, 3286 //in case someone passes in an object that's not a plugin, like CustomEase 3287 instanceDefaults = { 3288 init: _emptyFunc, 3289 render: _renderPropTweens, 3290 add: _addPropTween, 3291 kill: _killPropTweensOf, 3292 modifier: _addPluginModifier, 3293 rawVars: 0 3294 }, 3295 statics = { 3296 targetTest: 0, 3297 get: 0, 3298 getSetter: _getSetter, 3299 aliases: {}, 3300 register: 0 3301 }; 3302 3303 _wake(); 3304 3305 if (config !== Plugin) { 3306 if (_plugins[name]) { 3307 return; 3308 } 3309 3310 _setDefaults(Plugin, _setDefaults(_copyExcluding(config, instanceDefaults), statics)); //static methods 3311 3312 3313 _merge(Plugin.prototype, _merge(instanceDefaults, _copyExcluding(config, statics))); //instance methods 3314 3315 3316 _plugins[Plugin.prop = name] = Plugin; 3317 3318 if (config.targetTest) { 3319 _harnessPlugins.push(Plugin); 3320 3321 _reservedProps[name] = 1; 3322 } 3323 3324 name = (name === "css" ? "CSS" : name.charAt(0).toUpperCase() + name.substr(1)) + "Plugin"; //for the global name. "motionPath" should become MotionPathPlugin 3325 } 3326 3327 _addGlobal(name, Plugin); 3328 3329 config.register && config.register(gsap, Plugin, PropTween); 3330}, 3331 3332/* 3333 * -------------------------------------------------------------------------------------- 3334 * COLORS 3335 * -------------------------------------------------------------------------------------- 3336 */ 3337_255 = 255, 3338 _colorLookup = { 3339 aqua: [0, _255, _255], 3340 lime: [0, _255, 0], 3341 silver: [192, 192, 192], 3342 black: [0, 0, 0], 3343 maroon: [128, 0, 0], 3344 teal: [0, 128, 128], 3345 blue: [0, 0, _255], 3346 navy: [0, 0, 128], 3347 white: [_255, _255, _255], 3348 olive: [128, 128, 0], 3349 yellow: [_255, _255, 0], 3350 orange: [_255, 165, 0], 3351 gray: [128, 128, 128], 3352 purple: [128, 0, 128], 3353 green: [0, 128, 0], 3354 red: [_255, 0, 0], 3355 pink: [_255, 192, 203], 3356 cyan: [0, _255, _255], 3357 transparent: [_255, _255, _255, 0] 3358}, 3359 _hue = function _hue(h, m1, m2) { 3360 h = h < 0 ? h + 1 : h > 1 ? h - 1 : h; 3361 return (h * 6 < 1 ? m1 + (m2 - m1) * h * 6 : h < .5 ? m2 : h * 3 < 2 ? m1 + (m2 - m1) * (2 / 3 - h) * 6 : m1) * _255 + .5 | 0; 3362}, 3363 splitColor = function splitColor(v, toHSL, forceAlpha) { 3364 var a = !v ? _colorLookup.black : _isNumber(v) ? [v >> 16, v >> 8 & _255, v & _255] : 0, 3365 r, 3366 g, 3367 b, 3368 h, 3369 s, 3370 l, 3371 max, 3372 min, 3373 d, 3374 wasHSL; 3375 3376 if (!a) { 3377 if (v.substr(-1) === ",") { 3378 //sometimes a trailing comma is included and we should chop it off (typically from a comma-delimited list of values like a textShadow:"2px 2px 2px blue, 5px 5px 5px rgb(255,0,0)" - in this example "blue," has a trailing comma. We could strip it out inside parseComplex() but we'd need to do it to the beginning and ending values plus it wouldn't provide protection from other potential scenarios like if the user passes in a similar value. 3379 v = v.substr(0, v.length - 1); 3380 } 3381 3382 if (_colorLookup[v]) { 3383 a = _colorLookup[v]; 3384 } else if (v.charAt(0) === "#") { 3385 if (v.length < 6) { 3386 //for shorthand like #9F0 or #9F0F (could have alpha) 3387 r = v.charAt(1); 3388 g = v.charAt(2); 3389 b = v.charAt(3); 3390 v = "#" + r + r + g + g + b + b + (v.length === 5 ? v.charAt(4) + v.charAt(4) : ""); 3391 } 3392 3393 if (v.length === 9) { 3394 // hex with alpha, like #fd5e53ff 3395 a = parseInt(v.substr(1, 6), 16); 3396 return [a >> 16, a >> 8 & _255, a & _255, parseInt(v.substr(7), 16) / 255]; 3397 } 3398 3399 v = parseInt(v.substr(1), 16); 3400 a = [v >> 16, v >> 8 & _255, v & _255]; 3401 } else if (v.substr(0, 3) === "hsl") { 3402 a = wasHSL = v.match(_strictNumExp); 3403 3404 if (!toHSL) { 3405 h = +a[0] % 360 / 360; 3406 s = +a[1] / 100; 3407 l = +a[2] / 100; 3408 g = l <= .5 ? l * (s + 1) : l + s - l * s; 3409 r = l * 2 - g; 3410 a.length > 3 && (a[3] *= 1); //cast as number 3411 3412 a[0] = _hue(h + 1 / 3, r, g); 3413 a[1] = _hue(h, r, g); 3414 a[2] = _hue(h - 1 / 3, r, g); 3415 } else if (~v.indexOf("=")) { 3416 //if relative values are found, just return the raw strings with the relative prefixes in place. 3417 a = v.match(_numExp); 3418 forceAlpha && a.length < 4 && (a[3] = 1); 3419 return a; 3420 } 3421 } else { 3422 a = v.match(_strictNumExp) || _colorLookup.transparent; 3423 } 3424 3425 a = a.map(Number); 3426 } 3427 3428 if (toHSL && !wasHSL) { 3429 r = a[0] / _255; 3430 g = a[1] / _255; 3431 b = a[2] / _255; 3432 max = Math.max(r, g, b); 3433 min = Math.min(r, g, b); 3434 l = (max + min) / 2; 3435 3436 if (max === min) { 3437 h = s = 0; 3438 } else { 3439 d = max - min; 3440 s = l > 0.5 ? d / (2 - max - min) : d / (max + min); 3441 h = max === r ? (g - b) / d + (g < b ? 6 : 0) : max === g ? (b - r) / d + 2 : (r - g) / d + 4; 3442 h *= 60; 3443 } 3444 3445 a[0] = ~~(h + .5); 3446 a[1] = ~~(s * 100 + .5); 3447 a[2] = ~~(l * 100 + .5); 3448 } 3449 3450 forceAlpha && a.length < 4 && (a[3] = 1); 3451 return a; 3452}, 3453 _colorOrderData = function _colorOrderData(v) { 3454 // strips out the colors from the string, finds all the numeric slots (with units) and returns an array of those. The Array also has a "c" property which is an Array of the index values where the colors belong. This is to help work around issues where there's a mis-matched order of color/numeric data like drop-shadow(#f00 0px 1px 2px) and drop-shadow(0x 1px 2px #f00). This is basically a helper function used in _formatColors() 3455 var values = [], 3456 c = [], 3457 i = -1; 3458 v.split(_colorExp).forEach(function (v) { 3459 var a = v.match(_numWithUnitExp) || []; 3460 values.push.apply(values, a); 3461 c.push(i += a.length + 1); 3462 }); 3463 values.c = c; 3464 return values; 3465}, 3466 _formatColors = function _formatColors(s, toHSL, orderMatchData) { 3467 var result = "", 3468 colors = (s + result).match(_colorExp), 3469 type = toHSL ? "hsla(" : "rgba(", 3470 i = 0, 3471 c, 3472 shell, 3473 d, 3474 l; 3475 3476 if (!colors) { 3477 return s; 3478 } 3479 3480 colors = colors.map(function (color) { 3481 return (color = splitColor(color, toHSL, 1)) && type + (toHSL ? color[0] + "," + color[1] + "%," + color[2] + "%," + color[3] : color.join(",")) + ")"; 3482 }); 3483 3484 if (orderMatchData) { 3485 d = _colorOrderData(s); 3486 c = orderMatchData.c; 3487 3488 if (c.join(result) !== d.c.join(result)) { 3489 shell = s.replace(_colorExp, "1").split(_numWithUnitExp); 3490 l = shell.length - 1; 3491 3492 for (; i < l; i++) { 3493 result += shell[i] + (~c.indexOf(i) ? colors.shift() || type + "0,0,0,0)" : (d.length ? d : colors.length ? colors : orderMatchData).shift()); 3494 } 3495 } 3496 } 3497 3498 if (!shell) { 3499 shell = s.split(_colorExp); 3500 l = shell.length - 1; 3501 3502 for (; i < l; i++) { 3503 result += shell[i] + colors[i]; 3504 } 3505 } 3506 3507 return result + shell[l]; 3508}, 3509 _colorExp = function () { 3510 var s = "(?:\\b(?:(?:rgb|rgba|hsl|hsla)\\(.+?\\))|\\B#(?:[0-9a-f]{3,4}){1,2}\\b", 3511 //we'll dynamically build this Regular Expression to conserve file size. After building it, it will be able to find rgb(), rgba(), # (hexadecimal), and named color values like red, blue, purple, etc., 3512 p; 3513 3514 for (p in _colorLookup) { 3515 s += "|" + p + "\\b"; 3516 } 3517 3518 return new RegExp(s + ")", "gi"); 3519}(), 3520 _hslExp = /hsl[a]?\(/, 3521 _colorStringFilter = function _colorStringFilter(a) { 3522 var combined = a.join(" "), 3523 toHSL; 3524 _colorExp.lastIndex = 0; 3525 3526 if (_colorExp.test(combined)) { 3527 toHSL = _hslExp.test(combined); 3528 a[1] = _formatColors(a[1], toHSL); 3529 a[0] = _formatColors(a[0], toHSL, _colorOrderData(a[1])); // make sure the order of numbers/colors match with the END value. 3530 3531 return true; 3532 } 3533}, 3534 3535/* 3536 * -------------------------------------------------------------------------------------- 3537 * TICKER 3538 * -------------------------------------------------------------------------------------- 3539 */ 3540_tickerActive, 3541 _ticker = function () { 3542 var _getTime = Date.now, 3543 _lagThreshold = 500, 3544 _adjustedLag = 33, 3545 _startTime = _getTime(), 3546 _lastUpdate = _startTime, 3547 _gap = 1000 / 240, 3548 _nextTime = _gap, 3549 _listeners = [], 3550 _id, 3551 _req, 3552 _raf, 3553 _self, 3554 _delta, 3555 _i, 3556 _tick = function _tick(v) { 3557 var elapsed = _getTime() - _lastUpdate, 3558 manual = v === true, 3559 overlap, 3560 dispatch, 3561 time, 3562 frame; 3563 3564 elapsed > _lagThreshold && (_startTime += elapsed - _adjustedLag); 3565 _lastUpdate += elapsed; 3566 time = _lastUpdate - _startTime; 3567 overlap = time - _nextTime; 3568 3569 if (overlap > 0 || manual) { 3570 frame = ++_self.frame; 3571 _delta = time - _self.time * 1000; 3572 _self.time = time = time / 1000; 3573 _nextTime += overlap + (overlap >= _gap ? 4 : _gap - overlap); 3574 dispatch = 1; 3575 } 3576 3577 manual || (_id = _req(_tick)); //make sure the request is made before we dispatch the "tick" event so that timing is maintained. Otherwise, if processing the "tick" requires a bunch of time (like 15ms) and we're using a setTimeout() that's based on 16.7ms, it'd technically take 31.7ms between frames otherwise. 3578 3579 if (dispatch) { 3580 for (_i = 0; _i < _listeners.length; _i++) { 3581 // use _i and check _listeners.length instead of a variable because a listener could get removed during the loop, and if that happens to an element less than the current index, it'd throw things off in the loop. 3582 _listeners[_i](time, _delta, frame, v); 3583 } 3584 } 3585 }; 3586 3587 _self = { 3588 time: 0, 3589 frame: 0, 3590 tick: function tick() { 3591 _tick(true); 3592 }, 3593 deltaRatio: function deltaRatio(fps) { 3594 return _delta / (1000 / (fps || 60)); 3595 }, 3596 wake: function wake() { 3597 if (_coreReady) { 3598 if (!_coreInitted && _windowExists()) { 3599 _win = _coreInitted = window; 3600 _doc = _win.document || {}; 3601 _globals.gsap = gsap; 3602 (_win.gsapVersions || (_win.gsapVersions = [])).push(gsap.version); 3603 3604 _install(_installScope || _win.GreenSockGlobals || !_win.gsap && _win || {}); 3605 3606 _raf = _win.requestAnimationFrame; 3607 } 3608 3609 _id && _self.sleep(); 3610 3611 _req = _raf || function (f) { 3612 return setTimeout(f, _nextTime - _self.time * 1000 + 1 | 0); 3613 }; 3614 3615 _tickerActive = 1; 3616 3617 _tick(2); 3618 } 3619 }, 3620 sleep: function sleep() { 3621 (_raf ? _win.cancelAnimationFrame : clearTimeout)(_id); 3622 _tickerActive = 0; 3623 _req = _emptyFunc; 3624 }, 3625 lagSmoothing: function lagSmoothing(threshold, adjustedLag) { 3626 _lagThreshold = threshold || 1 / _tinyNum; //zero should be interpreted as basically unlimited 3627 3628 _adjustedLag = Math.min(adjustedLag, _lagThreshold, 0); 3629 }, 3630 fps: function fps(_fps) { 3631 _gap = 1000 / (_fps || 240); 3632 _nextTime = _self.time * 1000 + _gap; 3633 }, 3634 add: function add(callback) { 3635 _listeners.indexOf(callback) < 0 && _listeners.push(callback); 3636 3637 _wake(); 3638 }, 3639 remove: function remove(callback) { 3640 var i; 3641 ~(i = _listeners.indexOf(callback)) && _listeners.splice(i, 1) && _i >= i && _i--; 3642 }, 3643 _listeners: _listeners 3644 }; 3645 return _self; 3646}(), 3647 _wake = function _wake() { 3648 return !_tickerActive && _ticker.wake(); 3649}, 3650 //also ensures the core classes are initialized. 3651 3652/* 3653* ------------------------------------------------- 3654* EASING 3655* ------------------------------------------------- 3656*/ 3657_easeMap = {}, 3658 _customEaseExp = /^[\d.\-M][\d.\-,\s]/, 3659 _quotesExp = /["']/g, 3660 _parseObjectInString = function _parseObjectInString(value) { 3661 //takes a string like "{wiggles:10, type:anticipate})" and turns it into a real object. Notice it ends in ")" and includes the {} wrappers. This is because we only use this function for parsing ease configs and prioritized optimization rather than reusability. 3662 var obj = {}, 3663 split = value.substr(1, value.length - 3).split(":"), 3664 key = split[0], 3665 i = 1, 3666 l = split.length, 3667 index, 3668 val, 3669 parsedVal; 3670 3671 for (; i < l; i++) { 3672 val = split[i]; 3673 index = i !== l - 1 ? val.lastIndexOf(",") : val.length; 3674 parsedVal = val.substr(0, index); 3675 obj[key] = isNaN(parsedVal) ? parsedVal.replace(_quotesExp, "").trim() : +parsedVal; 3676 key = val.substr(index + 1).trim(); 3677 } 3678 3679 return obj; 3680}, 3681 _valueInParentheses = function _valueInParentheses(value) { 3682 var open = value.indexOf("(") + 1, 3683 close = value.indexOf(")"), 3684 nested = value.indexOf("(", open); 3685 return value.substring(open, ~nested && nested < close ? value.indexOf(")", close + 1) : close); 3686}, 3687 _configEaseFromString = function _configEaseFromString(name) { 3688 //name can be a string like "elastic.out(1,0.5)", and pass in _easeMap as obj and it'll parse it out and call the actual function like _easeMap.Elastic.easeOut.config(1,0.5). It will also parse custom ease strings as long as CustomEase is loaded and registered (internally as _easeMap._CE). 3689 var split = (name + "").split("("), 3690 ease = _easeMap[split[0]]; 3691 return ease && split.length > 1 && ease.config ? ease.config.apply(null, ~name.indexOf("{") ? [_parseObjectInString(split[1])] : _valueInParentheses(name).split(",").map(_numericIfPossible)) : _easeMap._CE && _customEaseExp.test(name) ? _easeMap._CE("", name) : ease; 3692}, 3693 _invertEase = function _invertEase(ease) { 3694 return function (p) { 3695 return 1 - ease(1 - p); 3696 }; 3697}, 3698 // allow yoyoEase to be set in children and have those affected when the parent/ancestor timeline yoyos. 3699_propagateYoyoEase = function _propagateYoyoEase(timeline, isYoyo) { 3700 var child = timeline._first, 3701 ease; 3702 3703 while (child) { 3704 if (child instanceof Timeline) { 3705 _propagateYoyoEase(child, isYoyo); 3706 } else if (child.vars.yoyoEase && (!child._yoyo || !child._repeat) && child._yoyo !== isYoyo) { 3707 if (child.timeline) { 3708 _propagateYoyoEase(child.timeline, isYoyo); 3709 } else { 3710 ease = child._ease; 3711 child._ease = child._yEase; 3712 child._yEase = ease; 3713 child._yoyo = isYoyo; 3714 } 3715 } 3716 3717 child = child._next; 3718 } 3719}, 3720 _parseEase = function _parseEase(ease, defaultEase) { 3721 return !ease ? defaultEase : (_isFunction(ease) ? ease : _easeMap[ease] || _configEaseFromString(ease)) || defaultEase; 3722}, 3723 _insertEase = function _insertEase(names, easeIn, easeOut, easeInOut) { 3724 if (easeOut === void 0) { 3725 easeOut = function easeOut(p) { 3726 return 1 - easeIn(1 - p); 3727 }; 3728 } 3729 3730 if (easeInOut === void 0) { 3731 easeInOut = function easeInOut(p) { 3732 return p < .5 ? easeIn(p * 2) / 2 : 1 - easeIn((1 - p) * 2) / 2; 3733 }; 3734 } 3735 3736 var ease = { 3737 easeIn: easeIn, 3738 easeOut: easeOut, 3739 easeInOut: easeInOut 3740 }, 3741 lowercaseName; 3742 3743 _forEachName(names, function (name) { 3744 _easeMap[name] = _globals[name] = ease; 3745 _easeMap[lowercaseName = name.toLowerCase()] = easeOut; 3746 3747 for (var p in ease) { 3748 _easeMap[lowercaseName + (p === "easeIn" ? ".in" : p === "easeOut" ? ".out" : ".inOut")] = _easeMap[name + "." + p] = ease[p]; 3749 } 3750 }); 3751 3752 return ease; 3753}, 3754 _easeInOutFromOut = function _easeInOutFromOut(easeOut) { 3755 return function (p) { 3756 return p < .5 ? (1 - easeOut(1 - p * 2)) / 2 : .5 + easeOut((p - .5) * 2) / 2; 3757 }; 3758}, 3759 _configElastic = function _configElastic(type, amplitude, period) { 3760 var p1 = amplitude >= 1 ? amplitude : 1, 3761 //note: if amplitude is < 1, we simply adjust the period for a more natural feel. Otherwise the math doesn't work right and the curve starts at 1. 3762 p2 = (period || (type ? .3 : .45)) / (amplitude < 1 ? amplitude : 1), 3763 p3 = p2 / _2PI * (Math.asin(1 / p1) || 0), 3764 easeOut = function easeOut(p) { 3765 return p === 1 ? 1 : p1 * Math.pow(2, -10 * p) * _sin((p - p3) * p2) + 1; 3766 }, 3767 ease = type === "out" ? easeOut : type === "in" ? function (p) { 3768 return 1 - easeOut(1 - p); 3769 } : _easeInOutFromOut(easeOut); 3770 3771 p2 = _2PI / p2; //precalculate to optimize 3772 3773 ease.config = function (amplitude, period) { 3774 return _configElastic(type, amplitude, period); 3775 }; 3776 3777 return ease; 3778}, 3779 _configBack = function _configBack(type, overshoot) { 3780 if (overshoot === void 0) { 3781 overshoot = 1.70158; 3782 } 3783 3784 var easeOut = function easeOut(p) { 3785 return p ? --p * p * ((overshoot + 1) * p + overshoot) + 1 : 0; 3786 }, 3787 ease = type === "out" ? easeOut : type === "in" ? function (p) { 3788 return 1 - easeOut(1 - p); 3789 } : _easeInOutFromOut(easeOut); 3790 3791 ease.config = function (overshoot) { 3792 return _configBack(type, overshoot); 3793 }; 3794 3795 return ease; 3796}; // a cheaper (kb and cpu) but more mild way to get a parameterized weighted ease by feeding in a value between -1 (easeIn) and 1 (easeOut) where 0 is linear. 3797// _weightedEase = ratio => { 3798// let y = 0.5 + ratio / 2; 3799// return p => (2 * (1 - p) * p * y + p * p); 3800// }, 3801// a stronger (but more expensive kb/cpu) parameterized weighted ease that lets you feed in a value between -1 (easeIn) and 1 (easeOut) where 0 is linear. 3802// _weightedEaseStrong = ratio => { 3803// ratio = .5 + ratio / 2; 3804// let o = 1 / 3 * (ratio < .5 ? ratio : 1 - ratio), 3805// b = ratio - o, 3806// c = ratio + o; 3807// return p => p === 1 ? p : 3 * b * (1 - p) * (1 - p) * p + 3 * c * (1 - p) * p * p + p * p * p; 3808// }; 3809 3810 3811_forEachName("Linear,Quad,Cubic,Quart,Quint,Strong", function (name, i) { 3812 var power = i < 5 ? i + 1 : i; 3813 3814 _insertEase(name + ",Power" + (power - 1), i ? function (p) { 3815 return Math.pow(p, power); 3816 } : function (p) { 3817 return p; 3818 }, function (p) { 3819 return 1 - Math.pow(1 - p, power); 3820 }, function (p) { 3821 return p < .5 ? Math.pow(p * 2, power) / 2 : 1 - Math.pow((1 - p) * 2, power) / 2; 3822 }); 3823}); 3824 3825_easeMap.Linear.easeNone = _easeMap.none = _easeMap.Linear.easeIn; 3826 3827_insertEase("Elastic", _configElastic("in"), _configElastic("out"), _configElastic()); 3828 3829(function (n, c) { 3830 var n1 = 1 / c, 3831 n2 = 2 * n1, 3832 n3 = 2.5 * n1, 3833 easeOut = function easeOut(p) { 3834 return p < n1 ? n * p * p : p < n2 ? n * Math.pow(p - 1.5 / c, 2) + .75 : p < n3 ? n * (p -= 2.25 / c) * p + .9375 : n * Math.pow(p - 2.625 / c, 2) + .984375; 3835 }; 3836 3837 _insertEase("Bounce", function (p) { 3838 return 1 - easeOut(1 - p); 3839 }, easeOut); 3840})(7.5625, 2.75); 3841 3842_insertEase("Expo", function (p) { 3843 return p ? Math.pow(2, 10 * (p - 1)) : 0; 3844}); 3845 3846_insertEase("Circ", function (p) { 3847 return -(_sqrt(1 - p * p) - 1); 3848}); 3849 3850_insertEase("Sine", function (p) { 3851 return p === 1 ? 1 : -_cos(p * _HALF_PI) + 1; 3852}); 3853 3854_insertEase("Back", _configBack("in"), _configBack("out"), _configBack()); 3855 3856_easeMap.SteppedEase = _easeMap.steps = _globals.SteppedEase = { 3857 config: function config(steps, immediateStart) { 3858 if (steps === void 0) { 3859 steps = 1; 3860 } 3861 3862 var p1 = 1 / steps, 3863 p2 = steps + (immediateStart ? 0 : 1), 3864 p3 = immediateStart ? 1 : 0, 3865 max = 1 - _tinyNum; 3866 return function (p) { 3867 return ((p2 * _clamp(0, max, p) | 0) + p3) * p1; 3868 }; 3869 } 3870}; 3871_defaults.ease = _easeMap["quad.out"]; 3872 3873_forEachName("onComplete,onUpdate,onStart,onRepeat,onReverseComplete,onInterrupt", function (name) { 3874 return _callbackNames += name + "," + name + "Params,"; 3875}); 3876/* 3877 * -------------------------------------------------------------------------------------- 3878 * CACHE 3879 * -------------------------------------------------------------------------------------- 3880 */ 3881 3882 3883var GSCache = function GSCache(target, harness) { 3884 this.id = _gsID++; 3885 target._gsap = this; 3886 this.target = target; 3887 this.harness = harness; 3888 this.get = harness ? harness.get : _getProperty; 3889 this.set = harness ? harness.getSetter : _getSetter; 3890}; 3891/* 3892 * -------------------------------------------------------------------------------------- 3893 * ANIMATION 3894 * -------------------------------------------------------------------------------------- 3895 */ 3896 3897var Animation = /*#__PURE__*/function () { 3898 function Animation(vars, time) { 3899 var parent = vars.parent || _globalTimeline; 3900 this.vars = vars; 3901 this._delay = +vars.delay || 0; 3902 3903 if (this._repeat = vars.repeat === Infinity ? -2 : vars.repeat || 0) { 3904 // TODO: repeat: Infinity on a timeline's children must flag that timeline internally and affect its totalDuration, otherwise it'll stop in the negative direction when reaching the start. 3905 this._rDelay = vars.repeatDelay || 0; 3906 this._yoyo = !!vars.yoyo || !!vars.yoyoEase; 3907 } 3908 3909 this._ts = 1; 3910 3911 _setDuration(this, +vars.duration, 1, 1); 3912 3913 this.data = vars.data; 3914 _tickerActive || _ticker.wake(); 3915 parent && _addToTimeline(parent, this, time || time === 0 ? time : parent._time, 1); 3916 vars.reversed && this.reverse(); 3917 vars.paused && this.paused(true); 3918 } 3919 3920 var _proto = Animation.prototype; 3921 3922 _proto.delay = function delay(value) { 3923 if (value || value === 0) { 3924 this.parent && this.parent.smoothChildTiming && this.startTime(this._start + value - this._delay); 3925 this._delay = value; 3926 return this; 3927 } 3928 3929 return this._delay; 3930 }; 3931 3932 _proto.duration = function duration(value) { 3933 return arguments.length ? this.totalDuration(this._repeat > 0 ? value + (value + this._rDelay) * this._repeat : value) : this.totalDuration() && this._dur; 3934 }; 3935 3936 _proto.totalDuration = function totalDuration(value) { 3937 if (!arguments.length) { 3938 return this._tDur; 3939 } 3940 3941 this._dirty = 0; 3942 return _setDuration(this, this._repeat < 0 ? value : (value - this._repeat * this._rDelay) / (this._repeat + 1)); 3943 }; 3944 3945 _proto.totalTime = function totalTime(_totalTime, suppressEvents) { 3946 _wake(); 3947 3948 if (!arguments.length) { 3949 return this._tTime; 3950 } 3951 3952 var parent = this._dp; 3953 3954 if (parent && parent.smoothChildTiming && this._ts) { 3955 _alignPlayhead(this, _totalTime); 3956 3957 !parent._dp || parent.parent || _postAddChecks(parent, this); // edge case: if this is a child of a timeline that already completed, for example, we must re-activate the parent. 3958 //in case any of the ancestor timelines had completed but should now be enabled, we should reset their totalTime() which will also ensure that they're lined up properly and enabled. Skip for animations that are on the root (wasteful). Example: a TimelineLite.exportRoot() is performed when there's a paused tween on the root, the export will not complete until that tween is unpaused, but imagine a child gets restarted later, after all [unpaused] tweens have completed. The start of that child would get pushed out, but one of the ancestors may have completed. 3959 3960 while (parent.parent) { 3961 if (parent.parent._time !== parent._start + (parent._ts >= 0 ? parent._tTime / parent._ts : (parent.totalDuration() - parent._tTime) / -parent._ts)) { 3962 parent.totalTime(parent._tTime, true); 3963 } 3964 3965 parent = parent.parent; 3966 } 3967 3968 if (!this.parent && this._dp.autoRemoveChildren && (this._ts > 0 && _totalTime < this._tDur || this._ts < 0 && _totalTime > 0 || !this._tDur && !_totalTime)) { 3969 //if the animation doesn't have a parent, put it back into its last parent (recorded as _dp for exactly cases like this). Limit to parents with autoRemoveChildren (like globalTimeline) so that if the user manually removes an animation from a timeline and then alters its playhead, it doesn't get added back in. 3970 _addToTimeline(this._dp, this, this._start - this._delay); 3971 } 3972 } 3973 3974 if (this._tTime !== _totalTime || !this._dur && !suppressEvents || this._initted && Math.abs(this._zTime) === _tinyNum || !_totalTime && !this._initted && (this.add || this._ptLookup)) { 3975 // check for _ptLookup on a Tween instance to ensure it has actually finished being instantiated, otherwise if this.reverse() gets called in the Animation constructor, it could trigger a render() here even though the _targets weren't populated, thus when _init() is called there won't be any PropTweens (it'll act like the tween is non-functional) 3976 this._ts || (this._pTime = _totalTime); // otherwise, if an animation is paused, then the playhead is moved back to zero, then resumed, it'd revert back to the original time at the pause 3977 //if (!this._lock) { // avoid endless recursion (not sure we need this yet or if it's worth the performance hit) 3978 // this._lock = 1; 3979 3980 _lazySafeRender(this, _totalTime, suppressEvents); // this._lock = 0; 3981 //} 3982 3983 } 3984 3985 return this; 3986 }; 3987 3988 _proto.time = function time(value, suppressEvents) { 3989 return arguments.length ? this.totalTime(Math.min(this.totalDuration(), value + _elapsedCycleDuration(this)) % this._dur || (value ? this._dur : 0), suppressEvents) : this._time; // note: if the modulus results in 0, the playhead could be exactly at the end or the beginning, and we always defer to the END with a non-zero value, otherwise if you set the time() to the very end (duration()), it would render at the START! 3990 }; 3991 3992 _proto.totalProgress = function totalProgress(value, suppressEvents) { 3993 return arguments.length ? this.totalTime(this.totalDuration() * value, suppressEvents) : this.totalDuration() ? Math.min(1, this._tTime / this._tDur) : this.ratio; 3994 }; 3995 3996 _proto.progress = function progress(value, suppressEvents) { 3997 return arguments.length ? this.totalTime(this.duration() * (this._yoyo && !(this.iteration() & 1) ? 1 - value : value) + _elapsedCycleDuration(this), suppressEvents) : this.duration() ? Math.min(1, this._time / this._dur) : this.ratio; 3998 }; 3999 4000 _proto.iteration = function iteration(value, suppressEvents) { 4001 var cycleDuration = this.duration() + this._rDelay; 4002 4003 return arguments.length ? this.totalTime(this._time + (value - 1) * cycleDuration, suppressEvents) : this._repeat ? _animationCycle(this._tTime, cycleDuration) + 1 : 1; 4004 } // potential future addition: 4005 // isPlayingBackwards() { 4006 // let animation = this, 4007 // orientation = 1; // 1 = forward, -1 = backward 4008 // while (animation) { 4009 // orientation *= animation.reversed() || (animation.repeat() && !(animation.iteration() & 1)) ? -1 : 1; 4010 // animation = animation.parent; 4011 // } 4012 // return orientation < 0; 4013 // } 4014 ; 4015 4016 _proto.timeScale = function timeScale(value) { 4017 if (!arguments.length) { 4018 return this._rts === -_tinyNum ? 0 : this._rts; // recorded timeScale. Special case: if someone calls reverse() on an animation with timeScale of 0, we assign it -_tinyNum to remember it's reversed. 4019 } 4020 4021 if (this._rts === value) { 4022 return this; 4023 } 4024 4025 var tTime = this.parent && this._ts ? _parentToChildTotalTime(this.parent._time, this) : this._tTime; // make sure to do the parentToChildTotalTime() BEFORE setting the new _ts because the old one must be used in that calculation. 4026 // prioritize rendering where the parent's playhead lines up instead of this._tTime because there could be a tween that's animating another tween's timeScale in the same rendering loop (same parent), thus if the timeScale tween renders first, it would alter _start BEFORE _tTime was set on that tick (in the rendering loop), effectively freezing it until the timeScale tween finishes. 4027 4028 this._rts = +value || 0; 4029 this._ts = this._ps || value === -_tinyNum ? 0 : this._rts; // _ts is the functional timeScale which would be 0 if the animation is paused. 4030 4031 return _recacheAncestors(this.totalTime(_clamp(-this._delay, this._tDur, tTime), true)); 4032 }; 4033 4034 _proto.paused = function paused(value) { 4035 if (!arguments.length) { 4036 return this._ps; 4037 } 4038 4039 if (this._ps !== value) { 4040 this._ps = value; 4041 4042 if (value) { 4043 this._pTime = this._tTime || Math.max(-this._delay, this.rawTime()); // if the pause occurs during the delay phase, make sure that's factored in when resuming. 4044 4045 this._ts = this._act = 0; // _ts is the functional timeScale, so a paused tween would effectively have a timeScale of 0. We record the "real" timeScale as _rts (recorded time scale) 4046 } else { 4047 _wake(); 4048 4049 this._ts = this._rts; //only defer to _pTime (pauseTime) if tTime is zero. Remember, someone could pause() an animation, then scrub the playhead and resume(). If the parent doesn't have smoothChildTiming, we render at the rawTime() because the startTime won't get updated. 4050 4051 this.totalTime(this.parent && !this.parent.smoothChildTiming ? this.rawTime() : this._tTime || this._pTime, this.progress() === 1 && (this._tTime -= _tinyNum) && Math.abs(this._zTime) !== _tinyNum); // edge case: animation.progress(1).pause().play() wouldn't render again because the playhead is already at the end, but the call to totalTime() below will add it back to its parent...and not remove it again (since removing only happens upon rendering at a new time). Offsetting the _tTime slightly is done simply to cause the final render in totalTime() that'll pop it off its timeline (if autoRemoveChildren is true, of course). Check to make sure _zTime isn't -_tinyNum to avoid an edge case where the playhead is pushed to the end but INSIDE a tween/callback, the timeline itself is paused thus halting rendering and leaving a few unrendered. When resuming, it wouldn't render those otherwise. 4052 } 4053 } 4054 4055 return this; 4056 }; 4057 4058 _proto.startTime = function startTime(value) { 4059 if (arguments.length) { 4060 this._start = value; 4061 var parent = this.parent || this._dp; 4062 parent && (parent._sort || !this.parent) && _addToTimeline(parent, this, value - this._delay); 4063 return this; 4064 } 4065 4066 return this._start; 4067 }; 4068 4069 _proto.endTime = function endTime(includeRepeats) { 4070 return this._start + (_isNotFalse(includeRepeats) ? this.totalDuration() : this.duration()) / Math.abs(this._ts); 4071 }; 4072 4073 _proto.rawTime = function rawTime(wrapRepeats) { 4074 var parent = this.parent || this._dp; // _dp = detatched parent 4075 4076 return !parent ? this._tTime : wrapRepeats && (!this._ts || this._repeat && this._time && this.totalProgress() < 1) ? this._tTime % (this._dur + this._rDelay) : !this._ts ? this._tTime : _parentToChildTotalTime(parent.rawTime(wrapRepeats), this); 4077 }; 4078 4079 _proto.globalTime = function globalTime(rawTime) { 4080 var animation = this, 4081 time = arguments.length ? rawTime : animation.rawTime(); 4082 4083 while (animation) { 4084 time = animation._start + time / (animation._ts || 1); 4085 animation = animation._dp; 4086 } 4087 4088 return time; 4089 }; 4090 4091 _proto.repeat = function repeat(value) { 4092 if (arguments.length) { 4093 this._repeat = value === Infinity ? -2 : value; 4094 return _onUpdateTotalDuration(this); 4095 } 4096 4097 return this._repeat === -2 ? Infinity : this._repeat; 4098 }; 4099 4100 _proto.repeatDelay = function repeatDelay(value) { 4101 if (arguments.length) { 4102 this._rDelay = value; 4103 return _onUpdateTotalDuration(this); 4104 } 4105 4106 return this._rDelay; 4107 }; 4108 4109 _proto.yoyo = function yoyo(value) { 4110 if (arguments.length) { 4111 this._yoyo = value; 4112 return this; 4113 } 4114 4115 return this._yoyo; 4116 }; 4117 4118 _proto.seek = function seek(position, suppressEvents) { 4119 return this.totalTime(_parsePosition(this, position), _isNotFalse(suppressEvents)); 4120 }; 4121 4122 _proto.restart = function restart(includeDelay, suppressEvents) { 4123 return this.play().totalTime(includeDelay ? -this._delay : 0, _isNotFalse(suppressEvents)); 4124 }; 4125 4126 _proto.play = function play(from, suppressEvents) { 4127 from != null && this.seek(from, suppressEvents); 4128 return this.reversed(false).paused(false); 4129 }; 4130 4131 _proto.reverse = function reverse(from, suppressEvents) { 4132 from != null && this.seek(from || this.totalDuration(), suppressEvents); 4133 return this.reversed(true).paused(false); 4134 }; 4135 4136 _proto.pause = function pause(atTime, suppressEvents) { 4137 atTime != null && this.seek(atTime, suppressEvents); 4138 return this.paused(true); 4139 }; 4140 4141 _proto.resume = function resume() { 4142 return this.paused(false); 4143 }; 4144 4145 _proto.reversed = function reversed(value) { 4146 if (arguments.length) { 4147 !!value !== this.reversed() && this.timeScale(-this._rts || (value ? -_tinyNum : 0)); // in case timeScale is zero, reversing would have no effect so we use _tinyNum. 4148 4149 return this; 4150 } 4151 4152 return this._rts < 0; 4153 }; 4154 4155 _proto.invalidate = function invalidate() { 4156 this._initted = this._act = 0; 4157 this._zTime = -_tinyNum; 4158 return this; 4159 }; 4160 4161 _proto.isActive = function isActive() { 4162 var parent = this.parent || this._dp, 4163 start = this._start, 4164 rawTime; 4165 return !!(!parent || this._ts && this._initted && parent.isActive() && (rawTime = parent.rawTime(true)) >= start && rawTime < this.endTime(true) - _tinyNum); 4166 }; 4167 4168 _proto.eventCallback = function eventCallback(type, callback, params) { 4169 var vars = this.vars; 4170 4171 if (arguments.length > 1) { 4172 if (!callback) { 4173 delete vars[type]; 4174 } else { 4175 vars[type] = callback; 4176 params && (vars[type + "Params"] = params); 4177 type === "onUpdate" && (this._onUpdate = callback); 4178 } 4179 4180 return this; 4181 } 4182 4183 return vars[type]; 4184 }; 4185 4186 _proto.then = function then(onFulfilled) { 4187 var self = this; 4188 return new Promise(function (resolve) { 4189 var f = _isFunction(onFulfilled) ? onFulfilled : _passThrough, 4190 _resolve = function _resolve() { 4191 var _then = self.then; 4192 self.then = null; // temporarily null the then() method to avoid an infinite loop (see https://github.com/greensock/GSAP/issues/322) 4193 4194 _isFunction(f) && (f = f(self)) && (f.then || f === self) && (self.then = _then); 4195 resolve(f); 4196 self.then = _then; 4197 }; 4198 4199 if (self._initted && self.totalProgress() === 1 && self._ts >= 0 || !self._tTime && self._ts < 0) { 4200 _resolve(); 4201 } else { 4202 self._prom = _resolve; 4203 } 4204 }); 4205 }; 4206 4207 _proto.kill = function kill() { 4208 _interrupt(this); 4209 }; 4210 4211 return Animation; 4212}(); 4213 4214_setDefaults(Animation.prototype, { 4215 _time: 0, 4216 _start: 0, 4217 _end: 0, 4218 _tTime: 0, 4219 _tDur: 0, 4220 _dirty: 0, 4221 _repeat: 0, 4222 _yoyo: false, 4223 parent: null, 4224 _initted: false, 4225 _rDelay: 0, 4226 _ts: 1, 4227 _dp: 0, 4228 ratio: 0, 4229 _zTime: -_tinyNum, 4230 _prom: 0, 4231 _ps: false, 4232 _rts: 1 4233}); 4234/* 4235 * ------------------------------------------------- 4236 * TIMELINE 4237 * ------------------------------------------------- 4238 */ 4239 4240 4241var Timeline = /*#__PURE__*/function (_Animation) { 4242 _inheritsLoose(Timeline, _Animation); 4243 4244 function Timeline(vars, time) { 4245 var _this; 4246 4247 if (vars === void 0) { 4248 vars = {}; 4249 } 4250 4251 _this = _Animation.call(this, vars, time) || this; 4252 _this.labels = {}; 4253 _this.smoothChildTiming = !!vars.smoothChildTiming; 4254 _this.autoRemoveChildren = !!vars.autoRemoveChildren; 4255 _this._sort = _isNotFalse(vars.sortChildren); 4256 _this.parent && _postAddChecks(_this.parent, _assertThisInitialized(_this)); 4257 vars.scrollTrigger && _scrollTrigger(_assertThisInitialized(_this), vars.scrollTrigger); 4258 return _this; 4259 } 4260 4261 var _proto2 = Timeline.prototype; 4262 4263 _proto2.to = function to(targets, vars, position) { 4264 new Tween(targets, _parseVars(arguments, 0, this), _parsePosition(this, _isNumber(vars) ? arguments[3] : position)); 4265 return this; 4266 }; 4267 4268 _proto2.from = function from(targets, vars, position) { 4269 new Tween(targets, _parseVars(arguments, 1, this), _parsePosition(this, _isNumber(vars) ? arguments[3] : position)); 4270 return this; 4271 }; 4272 4273 _proto2.fromTo = function fromTo(targets, fromVars, toVars, position) { 4274 new Tween(targets, _parseVars(arguments, 2, this), _parsePosition(this, _isNumber(fromVars) ? arguments[4] : position)); 4275 return this; 4276 }; 4277 4278 _proto2.set = function set(targets, vars, position) { 4279 vars.duration = 0; 4280 vars.parent = this; 4281 _inheritDefaults(vars).repeatDelay || (vars.repeat = 0); 4282 vars.immediateRender = !!vars.immediateRender; 4283 new Tween(targets, vars, _parsePosition(this, position), 1); 4284 return this; 4285 }; 4286 4287 _proto2.call = function call(callback, params, position) { 4288 return _addToTimeline(this, Tween.delayedCall(0, callback, params), _parsePosition(this, position)); 4289 } //ONLY for backward compatibility! Maybe delete? 4290 ; 4291 4292 _proto2.staggerTo = function staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams) { 4293 vars.duration = duration; 4294 vars.stagger = vars.stagger || stagger; 4295 vars.onComplete = onCompleteAll; 4296 vars.onCompleteParams = onCompleteAllParams; 4297 vars.parent = this; 4298 new Tween(targets, vars, _parsePosition(this, position)); 4299 return this; 4300 }; 4301 4302 _proto2.staggerFrom = function staggerFrom(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams) { 4303 vars.runBackwards = 1; 4304 _inheritDefaults(vars).immediateRender = _isNotFalse(vars.immediateRender); 4305 return this.staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams); 4306 }; 4307 4308 _proto2.staggerFromTo = function staggerFromTo(targets, duration, fromVars, toVars, stagger, position, onCompleteAll, onCompleteAllParams) { 4309 toVars.startAt = fromVars; 4310 _inheritDefaults(toVars).immediateRender = _isNotFalse(toVars.immediateRender); 4311 return this.staggerTo(targets, duration, toVars, stagger, position, onCompleteAll, onCompleteAllParams); 4312 }; 4313 4314 _proto2.render = function render(totalTime, suppressEvents, force) { 4315 var prevTime = this._time, 4316 tDur = this._dirty ? this.totalDuration() : this._tDur, 4317 dur = this._dur, 4318 tTime = this !== _globalTimeline && totalTime > tDur - _tinyNum && totalTime >= 0 ? tDur : totalTime < _tinyNum ? 0 : totalTime, 4319 crossingStart = this._zTime < 0 !== totalTime < 0 && (this._initted || !dur), 4320 time, 4321 child, 4322 next, 4323 iteration, 4324 cycleDuration, 4325 prevPaused, 4326 pauseTween, 4327 timeScale, 4328 prevStart, 4329 prevIteration, 4330 yoyo, 4331 isYoyo; 4332 4333 if (tTime !== this._tTime || force || crossingStart) { 4334 if (prevTime !== this._time && dur) { 4335 //if totalDuration() finds a child with a negative startTime and smoothChildTiming is true, things get shifted around internally so we need to adjust the time accordingly. For example, if a tween starts at -30 we must shift EVERYTHING forward 30 seconds and move this timeline's startTime backward by 30 seconds so that things align with the playhead (no jump). 4336 tTime += this._time - prevTime; 4337 totalTime += this._time - prevTime; 4338 } 4339 4340 time = tTime; 4341 prevStart = this._start; 4342 timeScale = this._ts; 4343 prevPaused = !timeScale; 4344 4345 if (crossingStart) { 4346 dur || (prevTime = this._zTime); //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration timeline, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect. 4347 4348 (totalTime || !suppressEvents) && (this._zTime = totalTime); 4349 } 4350 4351 if (this._repeat) { 4352 //adjust the time for repeats and yoyos 4353 yoyo = this._yoyo; 4354 cycleDuration = dur + this._rDelay; 4355 4356 if (this._repeat < -1 && totalTime < 0) { 4357 return this.totalTime(cycleDuration * 100 + totalTime, suppressEvents, force); 4358 } 4359 4360 time = _round(tTime % cycleDuration); //round to avoid floating point errors. (4 % 0.8 should be 0 but some browsers report it as 0.79999999!) 4361 4362 if (tTime === tDur) { 4363 // the tDur === tTime is for edge cases where there's a lengthy decimal on the duration and it may reach the very end but the time is rendered as not-quite-there (remember, tDur is rounded to 4 decimals whereas dur isn't) 4364 iteration = this._repeat; 4365 time = dur; 4366 } else { 4367 iteration = ~~(tTime / cycleDuration); 4368 4369 if (iteration && iteration === tTime / cycleDuration) { 4370 time = dur; 4371 iteration--; 4372 } 4373 4374 time > dur && (time = dur); 4375 } 4376 4377 prevIteration = _animationCycle(this._tTime, cycleDuration); 4378 !prevTime && this._tTime && prevIteration !== iteration && (prevIteration = iteration); // edge case - if someone does addPause() at the very beginning of a repeating timeline, that pause is technically at the same spot as the end which causes this._time to get set to 0 when the totalTime would normally place the playhead at the end. See https://greensock.com/forums/topic/23823-closing-nav-animation-not-working-on-ie-and-iphone-6-maybe-other-older-browser/?tab=comments#comment-113005 4379 4380 if (yoyo && iteration & 1) { 4381 time = dur - time; 4382 isYoyo = 1; 4383 } 4384 /* 4385 make sure children at the end/beginning of the timeline are rendered properly. If, for example, 4386 a 3-second long timeline rendered at 2.9 seconds previously, and now renders at 3.2 seconds (which 4387 would get translated to 2.8 seconds if the timeline yoyos or 0.2 seconds if it just repeats), there 4388 could be a callback or a short tween that's at 2.95 or 3 seconds in which wouldn't render. So 4389 we need to push the timeline to the end (and/or beginning depending on its yoyo value). Also we must 4390 ensure that zero-duration tweens at the very beginning or end of the Timeline work. 4391 */ 4392 4393 4394 if (iteration !== prevIteration && !this._lock) { 4395 var rewinding = yoyo && prevIteration & 1, 4396 doesWrap = rewinding === (yoyo && iteration & 1); 4397 iteration < prevIteration && (rewinding = !rewinding); 4398 prevTime = rewinding ? 0 : dur; 4399 this._lock = 1; 4400 this.render(prevTime || (isYoyo ? 0 : _round(iteration * cycleDuration)), suppressEvents, !dur)._lock = 0; 4401 !suppressEvents && this.parent && _callback(this, "onRepeat"); 4402 this.vars.repeatRefresh && !isYoyo && (this.invalidate()._lock = 1); 4403 4404 if (prevTime && prevTime !== this._time || prevPaused !== !this._ts || this.vars.onRepeat && !this.parent && !this._act) { 4405 // if prevTime is 0 and we render at the very end, _time will be the end, thus won't match. So in this edge case, prevTime won't match _time but that's okay. If it gets killed in the onRepeat, eject as well. 4406 return this; 4407 } 4408 4409 dur = this._dur; // in case the duration changed in the onRepeat 4410 4411 tDur = this._tDur; 4412 4413 if (doesWrap) { 4414 this._lock = 2; 4415 prevTime = rewinding ? dur : -0.0001; 4416 this.render(prevTime, true); 4417 } 4418 4419 this._lock = 0; 4420 4421 if (!this._ts && !prevPaused) { 4422 return this; 4423 } //in order for yoyoEase to work properly when there's a stagger, we must swap out the ease in each sub-tween. 4424 4425 4426 _propagateYoyoEase(this, isYoyo); 4427 } 4428 } 4429 4430 if (this._hasPause && !this._forcing && this._lock < 2) { 4431 pauseTween = _findNextPauseTween(this, _round(prevTime), _round(time)); 4432 4433 if (pauseTween) { 4434 tTime -= time - (time = pauseTween._start); 4435 } 4436 } 4437 4438 this._tTime = tTime; 4439 this._time = time; 4440 this._act = !timeScale; //as long as it's not paused, force it to be active so that if the user renders independent of the parent timeline, it'll be forced to re-render on the next tick. 4441 4442 if (!this._initted) { 4443 this._onUpdate = this.vars.onUpdate; 4444 this._initted = 1; 4445 this._zTime = totalTime; 4446 prevTime = 0; // upon init, the playhead should always go forward; someone could invalidate() a completed timeline and then if they restart(), that would make child tweens render in reverse order which could lock in the wrong starting values if they build on each other, like tl.to(obj, {x: 100}).to(obj, {x: 0}). 4447 } 4448 4449 !prevTime && time && !suppressEvents && _callback(this, "onStart"); 4450 4451 if (time >= prevTime && totalTime >= 0) { 4452 child = this._first; 4453 4454 while (child) { 4455 next = child._next; 4456 4457 if ((child._act || time >= child._start) && child._ts && pauseTween !== child) { 4458 if (child.parent !== this) { 4459 // an extreme edge case - the child's render could do something like kill() the "next" one in the linked list, or reparent it. In that case we must re-initiate the whole render to be safe. 4460 return this.render(totalTime, suppressEvents, force); 4461 } 4462 4463 child.render(child._ts > 0 ? (time - child._start) * child._ts : (child._dirty ? child.totalDuration() : child._tDur) + (time - child._start) * child._ts, suppressEvents, force); 4464 4465 if (time !== this._time || !this._ts && !prevPaused) { 4466 //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete 4467 pauseTween = 0; 4468 next && (tTime += this._zTime = -_tinyNum); // it didn't finish rendering, so flag zTime as negative so that so that the next time render() is called it'll be forced (to render any remaining children) 4469 4470 break; 4471 } 4472 } 4473 4474 child = next; 4475 } 4476 } else { 4477 child = this._last; 4478 var adjustedTime = totalTime < 0 ? totalTime : time; //when the playhead goes backward beyond the start of this timeline, we must pass that information down to the child animations so that zero-duration tweens know whether to render their starting or ending values. 4479 4480 while (child) { 4481 next = child._prev; 4482 4483 if ((child._act || adjustedTime <= child._end) && child._ts && pauseTween !== child) { 4484 if (child.parent !== this) { 4485 // an extreme edge case - the child's render could do something like kill() the "next" one in the linked list, or reparent it. In that case we must re-initiate the whole render to be safe. 4486 return this.render(totalTime, suppressEvents, force); 4487 } 4488 4489 child.render(child._ts > 0 ? (adjustedTime - child._start) * child._ts : (child._dirty ? child.totalDuration() : child._tDur) + (adjustedTime - child._start) * child._ts, suppressEvents, force); 4490 4491 if (time !== this._time || !this._ts && !prevPaused) { 4492 //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete 4493 pauseTween = 0; 4494 next && (tTime += this._zTime = adjustedTime ? -_tinyNum : _tinyNum); // it didn't finish rendering, so adjust zTime so that so that the next time render() is called it'll be forced (to render any remaining children) 4495 4496 break; 4497 } 4498 } 4499 4500 child = next; 4501 } 4502 } 4503 4504 if (pauseTween && !suppressEvents) { 4505 this.pause(); 4506 pauseTween.render(time >= prevTime ? 0 : -_tinyNum)._zTime = time >= prevTime ? 1 : -1; 4507 4508 if (this._ts) { 4509 //the callback resumed playback! So since we may have held back the playhead due to where the pause is positioned, go ahead and jump to where it's SUPPOSED to be (if no pause happened). 4510 this._start = prevStart; //if the pause was at an earlier time and the user resumed in the callback, it could reposition the timeline (changing its startTime), throwing things off slightly, so we make sure the _start doesn't shift. 4511 4512 _setEnd(this); 4513 4514 return this.render(totalTime, suppressEvents, force); 4515 } 4516 } 4517 4518 this._onUpdate && !suppressEvents && _callback(this, "onUpdate", true); 4519 if (tTime === tDur && tDur >= this.totalDuration() || !tTime && prevTime) if (prevStart === this._start || Math.abs(timeScale) !== Math.abs(this._ts)) if (!this._lock) { 4520 (totalTime || !dur) && (tTime === tDur && this._ts > 0 || !tTime && this._ts < 0) && _removeFromParent(this, 1); // don't remove if the timeline is reversed and the playhead isn't at 0, otherwise tl.progress(1).reverse() won't work. Only remove if the playhead is at the end and timeScale is positive, or if the playhead is at 0 and the timeScale is negative. 4521 4522 if (!suppressEvents && !(totalTime < 0 && !prevTime) && (tTime || prevTime)) { 4523 _callback(this, tTime === tDur ? "onComplete" : "onReverseComplete", true); 4524 4525 this._prom && !(tTime < tDur && this.timeScale() > 0) && this._prom(); 4526 } 4527 } 4528 } 4529 4530 return this; 4531 }; 4532 4533 _proto2.add = function add(child, position) { 4534 var _this2 = this; 4535 4536 _isNumber(position) || (position = _parsePosition(this, position)); 4537 4538 if (!(child instanceof Animation)) { 4539 if (_isArray(child)) { 4540 child.forEach(function (obj) { 4541 return _this2.add(obj, position); 4542 }); 4543 return this; 4544 } 4545 4546 if (_isString(child)) { 4547 return this.addLabel(child, position); 4548 } 4549 4550 if (_isFunction(child)) { 4551 child = Tween.delayedCall(0, child); 4552 } else { 4553 return this; 4554 } 4555 } 4556 4557 return this !== child ? _addToTimeline(this, child, position) : this; //don't allow a timeline to be added to itself as a child! 4558 }; 4559 4560 _proto2.getChildren = function getChildren(nested, tweens, timelines, ignoreBeforeTime) { 4561 if (nested === void 0) { 4562 nested = true; 4563 } 4564 4565 if (tweens === void 0) { 4566 tweens = true; 4567 } 4568 4569 if (timelines === void 0) { 4570 timelines = true; 4571 } 4572 4573 if (ignoreBeforeTime === void 0) { 4574 ignoreBeforeTime = -_bigNum; 4575 } 4576 4577 var a = [], 4578 child = this._first; 4579 4580 while (child) { 4581 if (child._start >= ignoreBeforeTime) { 4582 if (child instanceof Tween) { 4583 tweens && a.push(child); 4584 } else { 4585 timelines && a.push(child); 4586 nested && a.push.apply(a, child.getChildren(true, tweens, timelines)); 4587 } 4588 } 4589 4590 child = child._next; 4591 } 4592 4593 return a; 4594 }; 4595 4596 _proto2.getById = function getById(id) { 4597 var animations = this.getChildren(1, 1, 1), 4598 i = animations.length; 4599 4600 while (i--) { 4601 if (animations[i].vars.id === id) { 4602 return animations[i]; 4603 } 4604 } 4605 }; 4606 4607 _proto2.remove = function remove(child) { 4608 if (_isString(child)) { 4609 return this.removeLabel(child); 4610 } 4611 4612 if (_isFunction(child)) { 4613 return this.killTweensOf(child); 4614 } 4615 4616 _removeLinkedListItem(this, child); 4617 4618 if (child === this._recent) { 4619 this._recent = this._last; 4620 } 4621 4622 return _uncache(this); 4623 }; 4624 4625 _proto2.totalTime = function totalTime(_totalTime2, suppressEvents) { 4626 if (!arguments.length) { 4627 return this._tTime; 4628 } 4629 4630 this._forcing = 1; 4631 4632 if (!this._dp && this._ts) { 4633 //special case for the global timeline (or any other that has no parent or detached parent). 4634 this._start = _round(_ticker.time - (this._ts > 0 ? _totalTime2 / this._ts : (this.totalDuration() - _totalTime2) / -this._ts)); 4635 } 4636 4637 _Animation.prototype.totalTime.call(this, _totalTime2, suppressEvents); 4638 4639 this._forcing = 0; 4640 return this; 4641 }; 4642 4643 _proto2.addLabel = function addLabel(label, position) { 4644 this.labels[label] = _parsePosition(this, position); 4645 return this; 4646 }; 4647 4648 _proto2.removeLabel = function removeLabel(label) { 4649 delete this.labels[label]; 4650 return this; 4651 }; 4652 4653 _proto2.addPause = function addPause(position, callback, params) { 4654 var t = Tween.delayedCall(0, callback || _emptyFunc, params); 4655 t.data = "isPause"; 4656 this._hasPause = 1; 4657 return _addToTimeline(this, t, _parsePosition(this, position)); 4658 }; 4659 4660 _proto2.removePause = function removePause(position) { 4661 var child = this._first; 4662 position = _parsePosition(this, position); 4663 4664 while (child) { 4665 if (child._start === position && child.data === "isPause") { 4666 _removeFromParent(child); 4667 } 4668 4669 child = child._next; 4670 } 4671 }; 4672 4673 _proto2.killTweensOf = function killTweensOf(targets, props, onlyActive) { 4674 var tweens = this.getTweensOf(targets, onlyActive), 4675 i = tweens.length; 4676 4677 while (i--) { 4678 _overwritingTween !== tweens[i] && tweens[i].kill(targets, props); 4679 } 4680 4681 return this; 4682 }; 4683 4684 _proto2.getTweensOf = function getTweensOf(targets, onlyActive) { 4685 var a = [], 4686 parsedTargets = toArray(targets), 4687 child = this._first, 4688 isGlobalTime = _isNumber(onlyActive), 4689 // a number is interpreted as a global time. If the animation spans 4690 children; 4691 4692 while (child) { 4693 if (child instanceof Tween) { 4694 if (_arrayContainsAny(child._targets, parsedTargets) && (isGlobalTime ? (!_overwritingTween || child._initted && child._ts) && child.globalTime(0) <= onlyActive && child.globalTime(child.totalDuration()) > onlyActive : !onlyActive || child.isActive())) { 4695 // note: if this is for overwriting, it should only be for tweens that aren't paused and are initted. 4696 a.push(child); 4697 } 4698 } else if ((children = child.getTweensOf(parsedTargets, onlyActive)).length) { 4699 a.push.apply(a, children); 4700 } 4701 4702 child = child._next; 4703 } 4704 4705 return a; 4706 } // potential future feature - targets() on timelines 4707 // targets() { 4708 // let result = []; 4709 // this.getChildren(true, true, false).forEach(t => result.push(...t.targets())); 4710 // return result; 4711 // } 4712 ; 4713 4714 _proto2.tweenTo = function tweenTo(position, vars) { 4715 vars = vars || {}; 4716 4717 var tl = this, 4718 endTime = _parsePosition(tl, position), 4719 _vars = vars, 4720 startAt = _vars.startAt, 4721 _onStart = _vars.onStart, 4722 onStartParams = _vars.onStartParams, 4723 immediateRender = _vars.immediateRender, 4724 tween = Tween.to(tl, _setDefaults({ 4725 ease: vars.ease || "none", 4726 lazy: false, 4727 immediateRender: false, 4728 time: endTime, 4729 overwrite: "auto", 4730 duration: vars.duration || Math.abs((endTime - (startAt && "time" in startAt ? startAt.time : tl._time)) / tl.timeScale()) || _tinyNum, 4731 onStart: function onStart() { 4732 tl.pause(); 4733 var duration = vars.duration || Math.abs((endTime - tl._time) / tl.timeScale()); 4734 tween._dur !== duration && _setDuration(tween, duration, 0, 1).render(tween._time, true, true); 4735 _onStart && _onStart.apply(tween, onStartParams || []); //in case the user had an onStart in the vars - we don't want to overwrite it. 4736 } 4737 }, vars)); 4738 4739 return immediateRender ? tween.render(0) : tween; 4740 }; 4741 4742 _proto2.tweenFromTo = function tweenFromTo(fromPosition, toPosition, vars) { 4743 return this.tweenTo(toPosition, _setDefaults({ 4744 startAt: { 4745 time: _parsePosition(this, fromPosition) 4746 } 4747 }, vars)); 4748 }; 4749 4750 _proto2.recent = function recent() { 4751 return this._recent; 4752 }; 4753 4754 _proto2.nextLabel = function nextLabel(afterTime) { 4755 if (afterTime === void 0) { 4756 afterTime = this._time; 4757 } 4758 4759 return _getLabelInDirection(this, _parsePosition(this, afterTime)); 4760 }; 4761 4762 _proto2.previousLabel = function previousLabel(beforeTime) { 4763 if (beforeTime === void 0) { 4764 beforeTime = this._time; 4765 } 4766 4767 return _getLabelInDirection(this, _parsePosition(this, beforeTime), 1); 4768 }; 4769 4770 _proto2.currentLabel = function currentLabel(value) { 4771 return arguments.length ? this.seek(value, true) : this.previousLabel(this._time + _tinyNum); 4772 }; 4773 4774 _proto2.shiftChildren = function shiftChildren(amount, adjustLabels, ignoreBeforeTime) { 4775 if (ignoreBeforeTime === void 0) { 4776 ignoreBeforeTime = 0; 4777 } 4778 4779 var child = this._first, 4780 labels = this.labels, 4781 p; 4782 4783 while (child) { 4784 if (child._start >= ignoreBeforeTime) { 4785 child._start += amount; 4786 child._end += amount; 4787 } 4788 4789 child = child._next; 4790 } 4791 4792 if (adjustLabels) { 4793 for (p in labels) { 4794 if (labels[p] >= ignoreBeforeTime) { 4795 labels[p] += amount; 4796 } 4797 } 4798 } 4799 4800 return _uncache(this); 4801 }; 4802 4803 _proto2.invalidate = function invalidate() { 4804 var child = this._first; 4805 this._lock = 0; 4806 4807 while (child) { 4808 child.invalidate(); 4809 child = child._next; 4810 } 4811 4812 return _Animation.prototype.invalidate.call(this); 4813 }; 4814 4815 _proto2.clear = function clear(includeLabels) { 4816 if (includeLabels === void 0) { 4817 includeLabels = true; 4818 } 4819 4820 var child = this._first, 4821 next; 4822 4823 while (child) { 4824 next = child._next; 4825 this.remove(child); 4826 child = next; 4827 } 4828 4829 this._dp && (this._time = this._tTime = this._pTime = 0); 4830 includeLabels && (this.labels = {}); 4831 return _uncache(this); 4832 }; 4833 4834 _proto2.totalDuration = function totalDuration(value) { 4835 var max = 0, 4836 self = this, 4837 child = self._last, 4838 prevStart = _bigNum, 4839 prev, 4840 start, 4841 parent; 4842 4843 if (arguments.length) { 4844 return self.timeScale((self._repeat < 0 ? self.duration() : self.totalDuration()) / (self.reversed() ? -value : value)); 4845 } 4846 4847 if (self._dirty) { 4848 parent = self.parent; 4849 4850 while (child) { 4851 prev = child._prev; //record it here in case the tween changes position in the sequence... 4852 4853 child._dirty && child.totalDuration(); //could change the tween._startTime, so make sure the animation's cache is clean before analyzing it. 4854 4855 start = child._start; 4856 4857 if (start > prevStart && self._sort && child._ts && !self._lock) { 4858 //in case one of the tweens shifted out of order, it needs to be re-inserted into the correct position in the sequence 4859 self._lock = 1; //prevent endless recursive calls - there are methods that get triggered that check duration/totalDuration when we add(). 4860 4861 _addToTimeline(self, child, start - child._delay, 1)._lock = 0; 4862 } else { 4863 prevStart = start; 4864 } 4865 4866 if (start < 0 && child._ts) { 4867 //children aren't allowed to have negative startTimes unless smoothChildTiming is true, so adjust here if one is found. 4868 max -= start; 4869 4870 if (!parent && !self._dp || parent && parent.smoothChildTiming) { 4871 self._start += start / self._ts; 4872 self._time -= start; 4873 self._tTime -= start; 4874 } 4875 4876 self.shiftChildren(-start, false, -1e999); 4877 prevStart = 0; 4878 } 4879 4880 child._end > max && child._ts && (max = child._end); 4881 child = prev; 4882 } 4883 4884 _setDuration(self, self === _globalTimeline && self._time > max ? self._time : max, 1, 1); 4885 4886 self._dirty = 0; 4887 } 4888 4889 return self._tDur; 4890 }; 4891 4892 Timeline.updateRoot = function updateRoot(time) { 4893 if (_globalTimeline._ts) { 4894 _lazySafeRender(_globalTimeline, _parentToChildTotalTime(time, _globalTimeline)); 4895 4896 _lastRenderedFrame = _ticker.frame; 4897 } 4898 4899 if (_ticker.frame >= _nextGCFrame) { 4900 _nextGCFrame += _config.autoSleep || 120; 4901 var child = _globalTimeline._first; 4902 if (!child || !child._ts) if (_config.autoSleep && _ticker._listeners.length < 2) { 4903 while (child && !child._ts) { 4904 child = child._next; 4905 } 4906 4907 child || _ticker.sleep(); 4908 } 4909 } 4910 }; 4911 4912 return Timeline; 4913}(Animation); 4914 4915_setDefaults(Timeline.prototype, { 4916 _lock: 0, 4917 _hasPause: 0, 4918 _forcing: 0 4919}); 4920 4921var _addComplexStringPropTween = function _addComplexStringPropTween(target, prop, start, end, setter, stringFilter, funcParam) { 4922 //note: we call _addComplexStringPropTween.call(tweenInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus "this" would refer to the plugin. 4923 var pt = new PropTween(this._pt, target, prop, 0, 1, _renderComplexString, null, setter), 4924 index = 0, 4925 matchIndex = 0, 4926 result, 4927 startNums, 4928 color, 4929 endNum, 4930 chunk, 4931 startNum, 4932 hasRandom, 4933 a; 4934 pt.b = start; 4935 pt.e = end; 4936 start += ""; //ensure values are strings 4937 4938 end += ""; 4939 4940 if (hasRandom = ~end.indexOf("random(")) { 4941 end = _replaceRandom(end); 4942 } 4943 4944 if (stringFilter) { 4945 a = [start, end]; 4946 stringFilter(a, target, prop); //pass an array with the starting and ending values and let the filter do whatever it needs to the values. 4947 4948 start = a[0]; 4949 end = a[1]; 4950 } 4951 4952 startNums = start.match(_complexStringNumExp) || []; 4953 4954 while (result = _complexStringNumExp.exec(end)) { 4955 endNum = result[0]; 4956 chunk = end.substring(index, result.index); 4957 4958 if (color) { 4959 color = (color + 1) % 5; 4960 } else if (chunk.substr(-5) === "rgba(") { 4961 color = 1; 4962 } 4963 4964 if (endNum !== startNums[matchIndex++]) { 4965 startNum = parseFloat(startNums[matchIndex - 1]) || 0; //these nested PropTweens are handled in a special way - we'll never actually call a render or setter method on them. We'll just loop through them in the parent complex string PropTween's render method. 4966 4967 pt._pt = { 4968 _next: pt._pt, 4969 p: chunk || matchIndex === 1 ? chunk : ",", 4970 //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case. 4971 s: startNum, 4972 c: endNum.charAt(1) === "=" ? parseFloat(endNum.substr(2)) * (endNum.charAt(0) === "-" ? -1 : 1) : parseFloat(endNum) - startNum, 4973 m: color && color < 4 ? Math.round : 0 4974 }; 4975 index = _complexStringNumExp.lastIndex; 4976 } 4977 } 4978 4979 pt.c = index < end.length ? end.substring(index, end.length) : ""; //we use the "c" of the PropTween to store the final part of the string (after the last number) 4980 4981 pt.fp = funcParam; 4982 4983 if (_relExp.test(end) || hasRandom) { 4984 pt.e = 0; //if the end string contains relative values or dynamic random(...) values, delete the end it so that on the final render we don't actually set it to the string with += or -= characters (forces it to use the calculated value). 4985 } 4986 4987 this._pt = pt; //start the linked list with this new PropTween. Remember, we call _addComplexStringPropTween.call(tweenInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus "this" would refer to the plugin. 4988 4989 return pt; 4990}, 4991 _addPropTween = function _addPropTween(target, prop, start, end, index, targets, modifier, stringFilter, funcParam) { 4992 _isFunction(end) && (end = end(index || 0, target, targets)); 4993 var currentValue = target[prop], 4994 parsedStart = start !== "get" ? start : !_isFunction(currentValue) ? currentValue : funcParam ? target[prop.indexOf("set") || !_isFunction(target["get" + prop.substr(3)]) ? prop : "get" + prop.substr(3)](funcParam) : target[prop](), 4995 setter = !_isFunction(currentValue) ? _setterPlain : funcParam ? _setterFuncWithParam : _setterFunc, 4996 pt; 4997 4998 if (_isString(end)) { 4999 if (~end.indexOf("random(")) { 5000 end = _replaceRandom(end); 5001 } 5002 5003 if (end.charAt(1) === "=") { 5004 end = parseFloat(parsedStart) + parseFloat(end.substr(2)) * (end.charAt(0) === "-" ? -1 : 1) + (getUnit(parsedStart) || 0); 5005 } 5006 } 5007 5008 if (parsedStart !== end) { 5009 if (!isNaN(parsedStart * end)) { 5010 pt = new PropTween(this._pt, target, prop, +parsedStart || 0, end - (parsedStart || 0), typeof currentValue === "boolean" ? _renderBoolean : _renderPlain, 0, setter); 5011 funcParam && (pt.fp = funcParam); 5012 modifier && pt.modifier(modifier, this, target); 5013 return this._pt = pt; 5014 } 5015 5016 !currentValue && !(prop in target) && _missingPlugin(prop, end); 5017 return _addComplexStringPropTween.call(this, target, prop, parsedStart, end, setter, stringFilter || _config.stringFilter, funcParam); 5018 } 5019}, 5020 //creates a copy of the vars object and processes any function-based values (putting the resulting values directly into the copy) as well as strings with "random()" in them. It does NOT process relative values. 5021_processVars = function _processVars(vars, index, target, targets, tween) { 5022 _isFunction(vars) && (vars = _parseFuncOrString(vars, tween, index, target, targets)); 5023 5024 if (!_isObject(vars) || vars.style && vars.nodeType || _isArray(vars) || _isTypedArray(vars)) { 5025 return _isString(vars) ? _parseFuncOrString(vars, tween, index, target, targets) : vars; 5026 } 5027 5028 var copy = {}, 5029 p; 5030 5031 for (p in vars) { 5032 copy[p] = _parseFuncOrString(vars[p], tween, index, target, targets); 5033 } 5034 5035 return copy; 5036}, 5037 _checkPlugin = function _checkPlugin(property, vars, tween, index, target, targets) { 5038 var plugin, pt, ptLookup, i; 5039 5040 if (_plugins[property] && (plugin = new _plugins[property]()).init(target, plugin.rawVars ? vars[property] : _processVars(vars[property], index, target, targets, tween), tween, index, targets) !== false) { 5041 tween._pt = pt = new PropTween(tween._pt, target, property, 0, 1, plugin.render, plugin, 0, plugin.priority); 5042 5043 if (tween !== _quickTween) { 5044 ptLookup = tween._ptLookup[tween._targets.indexOf(target)]; //note: we can't use tween._ptLookup[index] because for staggered tweens, the index from the fullTargets array won't match what it is in each individual tween that spawns from the stagger. 5045 5046 i = plugin._props.length; 5047 5048 while (i--) { 5049 ptLookup[plugin._props[i]] = pt; 5050 } 5051 } 5052 } 5053 5054 return plugin; 5055}, 5056 _overwritingTween, 5057 //store a reference temporarily so we can avoid overwriting itself. 5058_initTween = function _initTween(tween, time) { 5059 var vars = tween.vars, 5060 ease = vars.ease, 5061 startAt = vars.startAt, 5062 immediateRender = vars.immediateRender, 5063 lazy = vars.lazy, 5064 onUpdate = vars.onUpdate, 5065 onUpdateParams = vars.onUpdateParams, 5066 callbackScope = vars.callbackScope, 5067 runBackwards = vars.runBackwards, 5068 yoyoEase = vars.yoyoEase, 5069 keyframes = vars.keyframes, 5070 autoRevert = vars.autoRevert, 5071 dur = tween._dur, 5072 prevStartAt = tween._startAt, 5073 targets = tween._targets, 5074 parent = tween.parent, 5075 fullTargets = parent && parent.data === "nested" ? parent.parent._targets : targets, 5076 autoOverwrite = tween._overwrite === "auto" && !_suppressOverwrites, 5077 tl = tween.timeline, 5078 cleanVars, 5079 i, 5080 p, 5081 pt, 5082 target, 5083 hasPriority, 5084 gsData, 5085 harness, 5086 plugin, 5087 ptLookup, 5088 index, 5089 harnessVars, 5090 overwritten; 5091 tl && (!keyframes || !ease) && (ease = "none"); 5092 tween._ease = _parseEase(ease, _defaults.ease); 5093 tween._yEase = yoyoEase ? _invertEase(_parseEase(yoyoEase === true ? ease : yoyoEase, _defaults.ease)) : 0; 5094 5095 if (yoyoEase && tween._yoyo && !tween._repeat) { 5096 //there must have been a parent timeline with yoyo:true that is currently in its yoyo phase, so flip the eases. 5097 yoyoEase = tween._yEase; 5098 tween._yEase = tween._ease; 5099 tween._ease = yoyoEase; 5100 } 5101 5102 if (!tl) { 5103 //if there's an internal timeline, skip all the parsing because we passed that task down the chain. 5104 harness = targets[0] ? _getCache(targets[0]).harness : 0; 5105 harnessVars = harness && vars[harness.prop]; //someone may need to specify CSS-specific values AND non-CSS values, like if the element has an "x" property plus it's a standard DOM element. We allow people to distinguish by wrapping plugin-specific stuff in a css:{} object for example. 5106 5107 cleanVars = _copyExcluding(vars, _reservedProps); 5108 prevStartAt && prevStartAt.render(-1, true).kill(); 5109 5110 if (startAt) { 5111 _removeFromParent(tween._startAt = Tween.set(targets, _setDefaults({ 5112 data: "isStart", 5113 overwrite: false, 5114 parent: parent, 5115 immediateRender: true, 5116 lazy: _isNotFalse(lazy), 5117 startAt: null, 5118 delay: 0, 5119 onUpdate: onUpdate, 5120 onUpdateParams: onUpdateParams, 5121 callbackScope: callbackScope, 5122 stagger: 0 5123 }, startAt))); //copy the properties/values into a new object to avoid collisions, like var to = {x:0}, from = {x:500}; timeline.fromTo(e, from, to).fromTo(e, to, from); 5124 5125 5126 if (immediateRender) { 5127 if (time > 0) { 5128 autoRevert || (tween._startAt = 0); //tweens that render immediately (like most from() and fromTo() tweens) shouldn't revert when their parent timeline's playhead goes backward past the startTime because the initial render could have happened anytime and it shouldn't be directly correlated to this tween's startTime. Imagine setting up a complex animation where the beginning states of various objects are rendered immediately but the tween doesn't happen for quite some time - if we revert to the starting values as soon as the playhead goes backward past the tween's startTime, it will throw things off visually. Reversion should only happen in Timeline instances where immediateRender was false or when autoRevert is explicitly set to true. 5129 } else if (dur && !(time < 0 && prevStartAt)) { 5130 time && (tween._zTime = time); 5131 return; //we skip initialization here so that overwriting doesn't occur until the tween actually begins. Otherwise, if you create several immediateRender:true tweens of the same target/properties to drop into a Timeline, the last one created would overwrite the first ones because they didn't get placed into the timeline yet before the first render occurs and kicks in overwriting. 5132 } 5133 } else if (autoRevert === false) { 5134 tween._startAt = 0; 5135 } 5136 } else if (runBackwards && dur) { 5137 //from() tweens must be handled uniquely: their beginning values must be rendered but we don't want overwriting to occur yet (when time is still 0). Wait until the tween actually begins before doing all the routines like overwriting. At that time, we should render at the END of the tween to ensure that things initialize correctly (remember, from() tweens go backwards) 5138 if (prevStartAt) { 5139 !autoRevert && (tween._startAt = 0); 5140 } else { 5141 time && (immediateRender = false); //in rare cases (like if a from() tween runs and then is invalidate()-ed), immediateRender could be true but the initial forced-render gets skipped, so there's no need to force the render in this context when the _time is greater than 0 5142 5143 p = _setDefaults({ 5144 overwrite: false, 5145 data: "isFromStart", 5146 //we tag the tween with as "isFromStart" so that if [inside a plugin] we need to only do something at the very END of a tween, we have a way of identifying this tween as merely the one that's setting the beginning values for a "from()" tween. For example, clearProps in CSSPlugin should only get applied at the very END of a tween and without this tag, from(...{height:100, clearProps:"height", delay:1}) would wipe the height at the beginning of the tween and after 1 second, it'd kick back in. 5147 lazy: immediateRender && _isNotFalse(lazy), 5148 immediateRender: immediateRender, 5149 //zero-duration tweens render immediately by default, but if we're not specifically instructed to render this tween immediately, we should skip this and merely _init() to record the starting values (rendering them immediately would push them to completion which is wasteful in that case - we'd have to render(-1) immediately after) 5150 stagger: 0, 5151 parent: parent //ensures that nested tweens that had a stagger are handled properly, like gsap.from(".class", {y:gsap.utils.wrap([-100,100])}) 5152 5153 }, cleanVars); 5154 harnessVars && (p[harness.prop] = harnessVars); // in case someone does something like .from(..., {css:{}}) 5155 5156 _removeFromParent(tween._startAt = Tween.set(targets, p)); 5157 5158 if (!immediateRender) { 5159 _initTween(tween._startAt, _tinyNum); //ensures that the initial values are recorded 5160 5161 } else if (!time) { 5162 return; 5163 } 5164 } 5165 } 5166 5167 tween._pt = 0; 5168 lazy = dur && _isNotFalse(lazy) || lazy && !dur; 5169 5170 for (i = 0; i < targets.length; i++) { 5171 target = targets[i]; 5172 gsData = target._gsap || _harness(targets)[i]._gsap; 5173 tween._ptLookup[i] = ptLookup = {}; 5174 _lazyLookup[gsData.id] && _lazyTweens.length && _lazyRender(); //if other tweens of the same target have recently initted but haven't rendered yet, we've got to force the render so that the starting values are correct (imagine populating a timeline with a bunch of sequential tweens and then jumping to the end) 5175 5176 index = fullTargets === targets ? i : fullTargets.indexOf(target); 5177 5178 if (harness && (plugin = new harness()).init(target, harnessVars || cleanVars, tween, index, fullTargets) !== false) { 5179 tween._pt = pt = new PropTween(tween._pt, target, plugin.name, 0, 1, plugin.render, plugin, 0, plugin.priority); 5180 5181 plugin._props.forEach(function (name) { 5182 ptLookup[name] = pt; 5183 }); 5184 5185 plugin.priority && (hasPriority = 1); 5186 } 5187 5188 if (!harness || harnessVars) { 5189 for (p in cleanVars) { 5190 if (_plugins[p] && (plugin = _checkPlugin(p, cleanVars, tween, index, target, fullTargets))) { 5191 plugin.priority && (hasPriority = 1); 5192 } else { 5193 ptLookup[p] = pt = _addPropTween.call(tween, target, p, "get", cleanVars[p], index, fullTargets, 0, vars.stringFilter); 5194 } 5195 } 5196 } 5197 5198 tween._op && tween._op[i] && tween.kill(target, tween._op[i]); 5199 5200 if (autoOverwrite && tween._pt) { 5201 _overwritingTween = tween; 5202 5203 _globalTimeline.killTweensOf(target, ptLookup, tween.globalTime(0)); //Also make sure the overwriting doesn't overwrite THIS tween!!! 5204 5205 5206 overwritten = !tween.parent; 5207 _overwritingTween = 0; 5208 } 5209 5210 tween._pt && lazy && (_lazyLookup[gsData.id] = 1); 5211 } 5212 5213 hasPriority && _sortPropTweensByPriority(tween); 5214 tween._onInit && tween._onInit(tween); //plugins like RoundProps must wait until ALL of the PropTweens are instantiated. In the plugin's init() function, it sets the _onInit on the tween instance. May not be pretty/intuitive, but it's fast and keeps file size down. 5215 } 5216 5217 tween._from = !tl && !!vars.runBackwards; //nested timelines should never run backwards - the backwards-ness is in the child tweens. 5218 5219 tween._onUpdate = onUpdate; 5220 tween._initted = (!tween._op || tween._pt) && !overwritten; // if overwrittenProps resulted in the entire tween being killed, do NOT flag it as initted or else it may render for one tick. 5221}, 5222 _addAliasesToVars = function _addAliasesToVars(targets, vars) { 5223 var harness = targets[0] ? _getCache(targets[0]).harness : 0, 5224 propertyAliases = harness && harness.aliases, 5225 copy, 5226 p, 5227 i, 5228 aliases; 5229 5230 if (!propertyAliases) { 5231 return vars; 5232 } 5233 5234 copy = _merge({}, vars); 5235 5236 for (p in propertyAliases) { 5237 if (p in copy) { 5238 aliases = propertyAliases[p].split(","); 5239 i = aliases.length; 5240 5241 while (i--) { 5242 copy[aliases[i]] = copy[p]; 5243 } 5244 } 5245 } 5246 5247 return copy; 5248}, 5249 _parseFuncOrString = function _parseFuncOrString(value, tween, i, target, targets) { 5250 return _isFunction(value) ? value.call(tween, i, target, targets) : _isString(value) && ~value.indexOf("random(") ? _replaceRandom(value) : value; 5251}, 5252 _staggerTweenProps = _callbackNames + "repeat,repeatDelay,yoyo,repeatRefresh,yoyoEase", 5253 _staggerPropsToSkip = (_staggerTweenProps + ",id,stagger,delay,duration,paused,scrollTrigger").split(","); 5254/* 5255 * -------------------------------------------------------------------------------------- 5256 * TWEEN 5257 * -------------------------------------------------------------------------------------- 5258 */ 5259 5260 5261var Tween = /*#__PURE__*/function (_Animation2) { 5262 _inheritsLoose(Tween, _Animation2); 5263 5264 function Tween(targets, vars, time, skipInherit) { 5265 var _this3; 5266 5267 if (typeof vars === "number") { 5268 time.duration = vars; 5269 vars = time; 5270 time = null; 5271 } 5272 5273 _this3 = _Animation2.call(this, skipInherit ? vars : _inheritDefaults(vars), time) || this; 5274 var _this3$vars = _this3.vars, 5275 duration = _this3$vars.duration, 5276 delay = _this3$vars.delay, 5277 immediateRender = _this3$vars.immediateRender, 5278 stagger = _this3$vars.stagger, 5279 overwrite = _this3$vars.overwrite, 5280 keyframes = _this3$vars.keyframes, 5281 defaults = _this3$vars.defaults, 5282 scrollTrigger = _this3$vars.scrollTrigger, 5283 yoyoEase = _this3$vars.yoyoEase, 5284 parent = _this3.parent, 5285 parsedTargets = (_isArray(targets) || _isTypedArray(targets) ? _isNumber(targets[0]) : "length" in vars) ? [targets] : toArray(targets), 5286 tl, 5287 i, 5288 copy, 5289 l, 5290 p, 5291 curTarget, 5292 staggerFunc, 5293 staggerVarsToMerge; 5294 _this3._targets = parsedTargets.length ? _harness(parsedTargets) : _warn("GSAP target " + targets + " not found. https://greensock.com", !_config.nullTargetWarn) || []; 5295 _this3._ptLookup = []; //PropTween lookup. An array containing an object for each target, having keys for each tweening property 5296 5297 _this3._overwrite = overwrite; 5298 5299 if (keyframes || stagger || _isFuncOrString(duration) || _isFuncOrString(delay)) { 5300 vars = _this3.vars; 5301 tl = _this3.timeline = new Timeline({ 5302 data: "nested", 5303 defaults: defaults || {} 5304 }); 5305 tl.kill(); 5306 tl.parent = tl._dp = _assertThisInitialized(_this3); 5307 tl._start = 0; 5308 5309 if (keyframes) { 5310 _setDefaults(tl.vars.defaults, { 5311 ease: "none" 5312 }); 5313 5314 keyframes.forEach(function (frame) { 5315 return tl.to(parsedTargets, frame, ">"); 5316 }); 5317 } else { 5318 l = parsedTargets.length; 5319 staggerFunc = stagger ? distribute(stagger) : _emptyFunc; 5320 5321 if (_isObject(stagger)) { 5322 //users can pass in callbacks like onStart/onComplete in the stagger object. These should fire with each individual tween. 5323 for (p in stagger) { 5324 if (~_staggerTweenProps.indexOf(p)) { 5325 staggerVarsToMerge || (staggerVarsToMerge = {}); 5326 staggerVarsToMerge[p] = stagger[p]; 5327 } 5328 } 5329 } 5330 5331 for (i = 0; i < l; i++) { 5332 copy = {}; 5333 5334 for (p in vars) { 5335 if (_staggerPropsToSkip.indexOf(p) < 0) { 5336 copy[p] = vars[p]; 5337 } 5338 } 5339 5340 copy.stagger = 0; 5341 yoyoEase && (copy.yoyoEase = yoyoEase); 5342 staggerVarsToMerge && _merge(copy, staggerVarsToMerge); 5343 curTarget = parsedTargets[i]; //don't just copy duration or delay because if they're a string or function, we'd end up in an infinite loop because _isFuncOrString() would evaluate as true in the child tweens, entering this loop, etc. So we parse the value straight from vars and default to 0. 5344 5345 copy.duration = +_parseFuncOrString(duration, _assertThisInitialized(_this3), i, curTarget, parsedTargets); 5346 copy.delay = (+_parseFuncOrString(delay, _assertThisInitialized(_this3), i, curTarget, parsedTargets) || 0) - _this3._delay; 5347 5348 if (!stagger && l === 1 && copy.delay) { 5349 // if someone does delay:"random(1, 5)", repeat:-1, for example, the delay shouldn't be inside the repeat. 5350 _this3._delay = delay = copy.delay; 5351 _this3._start += delay; 5352 copy.delay = 0; 5353 } 5354 5355 tl.to(curTarget, copy, staggerFunc(i, curTarget, parsedTargets)); 5356 } 5357 5358 tl.duration() ? duration = delay = 0 : _this3.timeline = 0; // if the timeline's duration is 0, we don't need a timeline internally! 5359 } 5360 5361 duration || _this3.duration(duration = tl.duration()); 5362 } else { 5363 _this3.timeline = 0; //speed optimization, faster lookups (no going up the prototype chain) 5364 } 5365 5366 if (overwrite === true && !_suppressOverwrites) { 5367 _overwritingTween = _assertThisInitialized(_this3); 5368 5369 _globalTimeline.killTweensOf(parsedTargets); 5370 5371 _overwritingTween = 0; 5372 } 5373 5374 parent && _postAddChecks(parent, _assertThisInitialized(_this3)); 5375 5376 if (immediateRender || !duration && !keyframes && _this3._start === _round(parent._time) && _isNotFalse(immediateRender) && _hasNoPausedAncestors(_assertThisInitialized(_this3)) && parent.data !== "nested") { 5377 _this3._tTime = -_tinyNum; //forces a render without having to set the render() "force" parameter to true because we want to allow lazying by default (using the "force" parameter always forces an immediate full render) 5378 5379 _this3.render(Math.max(0, -delay)); //in case delay is negative 5380 5381 } 5382 5383 scrollTrigger && _scrollTrigger(_assertThisInitialized(_this3), scrollTrigger); 5384 return _this3; 5385 } 5386 5387 var _proto3 = Tween.prototype; 5388 5389 _proto3.render = function render(totalTime, suppressEvents, force) { 5390 var prevTime = this._time, 5391 tDur = this._tDur, 5392 dur = this._dur, 5393 tTime = totalTime > tDur - _tinyNum && totalTime >= 0 ? tDur : totalTime < _tinyNum ? 0 : totalTime, 5394 time, 5395 pt, 5396 iteration, 5397 cycleDuration, 5398 prevIteration, 5399 isYoyo, 5400 ratio, 5401 timeline, 5402 yoyoEase; 5403 5404 if (!dur) { 5405 _renderZeroDurationTween(this, totalTime, suppressEvents, force); 5406 } else if (tTime !== this._tTime || !totalTime || force || !this._initted && this._tTime || this._startAt && this._zTime < 0 !== totalTime < 0) { 5407 //this senses if we're crossing over the start time, in which case we must record _zTime and force the render, but we do it in this lengthy conditional way for performance reasons (usually we can skip the calculations): this._initted && (this._zTime < 0) !== (totalTime < 0) 5408 time = tTime; 5409 timeline = this.timeline; 5410 5411 if (this._repeat) { 5412 //adjust the time for repeats and yoyos 5413 cycleDuration = dur + this._rDelay; 5414 5415 if (this._repeat < -1 && totalTime < 0) { 5416 return this.totalTime(cycleDuration * 100 + totalTime, suppressEvents, force); 5417 } 5418 5419 time = _round(tTime % cycleDuration); //round to avoid floating point errors. (4 % 0.8 should be 0 but some browsers report it as 0.79999999!) 5420 5421 if (tTime === tDur) { 5422 // the tDur === tTime is for edge cases where there's a lengthy decimal on the duration and it may reach the very end but the time is rendered as not-quite-there (remember, tDur is rounded to 4 decimals whereas dur isn't) 5423 iteration = this._repeat; 5424 time = dur; 5425 } else { 5426 iteration = ~~(tTime / cycleDuration); 5427 5428 if (iteration && iteration === tTime / cycleDuration) { 5429 time = dur; 5430 iteration--; 5431 } 5432 5433 time > dur && (time = dur); 5434 } 5435 5436 isYoyo = this._yoyo && iteration & 1; 5437 5438 if (isYoyo) { 5439 yoyoEase = this._yEase; 5440 time = dur - time; 5441 } 5442 5443 prevIteration = _animationCycle(this._tTime, cycleDuration); 5444 5445 if (time === prevTime && !force && this._initted) { 5446 //could be during the repeatDelay part. No need to render and fire callbacks. 5447 return this; 5448 } 5449 5450 if (iteration !== prevIteration) { 5451 timeline && this._yEase && _propagateYoyoEase(timeline, isYoyo); //repeatRefresh functionality 5452 5453 if (this.vars.repeatRefresh && !isYoyo && !this._lock) { 5454 this._lock = force = 1; //force, otherwise if lazy is true, the _attemptInitTween() will return and we'll jump out and get caught bouncing on each tick. 5455 5456 this.render(_round(cycleDuration * iteration), true).invalidate()._lock = 0; 5457 } 5458 } 5459 } 5460 5461 if (!this._initted) { 5462 if (_attemptInitTween(this, totalTime < 0 ? totalTime : time, force, suppressEvents)) { 5463 this._tTime = 0; // in constructor if immediateRender is true, we set _tTime to -_tinyNum to have the playhead cross the starting point but we can't leave _tTime as a negative number. 5464 5465 return this; 5466 } 5467 5468 if (dur !== this._dur) { 5469 // while initting, a plugin like InertiaPlugin might alter the duration, so rerun from the start to ensure everything renders as it should. 5470 return this.render(totalTime, suppressEvents, force); 5471 } 5472 } 5473 5474 this._tTime = tTime; 5475 this._time = time; 5476 5477 if (!this._act && this._ts) { 5478 this._act = 1; //as long as it's not paused, force it to be active so that if the user renders independent of the parent timeline, it'll be forced to re-render on the next tick. 5479 5480 this._lazy = 0; 5481 } 5482 5483 this.ratio = ratio = (yoyoEase || this._ease)(time / dur); 5484 5485 if (this._from) { 5486 this.ratio = ratio = 1 - ratio; 5487 } 5488 5489 time && !prevTime && !suppressEvents && _callback(this, "onStart"); 5490 pt = this._pt; 5491 5492 while (pt) { 5493 pt.r(ratio, pt.d); 5494 pt = pt._next; 5495 } 5496 5497 timeline && timeline.render(totalTime < 0 ? totalTime : !time && isYoyo ? -_tinyNum : timeline._dur * ratio, suppressEvents, force) || this._startAt && (this._zTime = totalTime); 5498 5499 if (this._onUpdate && !suppressEvents) { 5500 totalTime < 0 && this._startAt && this._startAt.render(totalTime, true, force); //note: for performance reasons, we tuck this conditional logic inside less traveled areas (most tweens don't have an onUpdate). We'd just have it at the end before the onComplete, but the values should be updated before any onUpdate is called, so we ALSO put it here and then if it's not called, we do so later near the onComplete. 5501 5502 _callback(this, "onUpdate"); 5503 } 5504 5505 this._repeat && iteration !== prevIteration && this.vars.onRepeat && !suppressEvents && this.parent && _callback(this, "onRepeat"); 5506 5507 if ((tTime === this._tDur || !tTime) && this._tTime === tTime) { 5508 totalTime < 0 && this._startAt && !this._onUpdate && this._startAt.render(totalTime, true, true); 5509 (totalTime || !dur) && (tTime === this._tDur && this._ts > 0 || !tTime && this._ts < 0) && _removeFromParent(this, 1); // don't remove if we're rendering at exactly a time of 0, as there could be autoRevert values that should get set on the next tick (if the playhead goes backward beyond the startTime, negative totalTime). Don't remove if the timeline is reversed and the playhead isn't at 0, otherwise tl.progress(1).reverse() won't work. Only remove if the playhead is at the end and timeScale is positive, or if the playhead is at 0 and the timeScale is negative. 5510 5511 if (!suppressEvents && !(totalTime < 0 && !prevTime) && (tTime || prevTime)) { 5512 // if prevTime and tTime are zero, we shouldn't fire the onReverseComplete. This could happen if you gsap.to(... {paused:true}).play(); 5513 _callback(this, tTime === tDur ? "onComplete" : "onReverseComplete", true); 5514 5515 this._prom && !(tTime < tDur && this.timeScale() > 0) && this._prom(); 5516 } 5517 } 5518 } 5519 5520 return this; 5521 }; 5522 5523 _proto3.targets = function targets() { 5524 return this._targets; 5525 }; 5526 5527 _proto3.invalidate = function invalidate() { 5528 this._pt = this._op = this._startAt = this._onUpdate = this._lazy = this.ratio = 0; 5529 this._ptLookup = []; 5530 this.timeline && this.timeline.invalidate(); 5531 return _Animation2.prototype.invalidate.call(this); 5532 }; 5533 5534 _proto3.kill = function kill(targets, vars) { 5535 if (vars === void 0) { 5536 vars = "all"; 5537 } 5538 5539 if (!targets && (!vars || vars === "all")) { 5540 this._lazy = this._pt = 0; 5541 return this.parent ? _interrupt(this) : this; 5542 } 5543 5544 if (this.timeline) { 5545 var tDur = this.timeline.totalDuration(); 5546 this.timeline.killTweensOf(targets, vars, _overwritingTween && _overwritingTween.vars.overwrite !== true)._first || _interrupt(this); // if nothing is left tweening, interrupt. 5547 5548 this.parent && tDur !== this.timeline.totalDuration() && _setDuration(this, this._dur * this.timeline._tDur / tDur, 0, 1); // if a nested tween is killed that changes the duration, it should affect this tween's duration. We must use the ratio, though, because sometimes the internal timeline is stretched like for keyframes where they don't all add up to whatever the parent tween's duration was set to. 5549 5550 return this; 5551 } 5552 5553 var parsedTargets = this._targets, 5554 killingTargets = targets ? toArray(targets) : parsedTargets, 5555 propTweenLookup = this._ptLookup, 5556 firstPT = this._pt, 5557 overwrittenProps, 5558 curLookup, 5559 curOverwriteProps, 5560 props, 5561 p, 5562 pt, 5563 i; 5564 5565 if ((!vars || vars === "all") && _arraysMatch(parsedTargets, killingTargets)) { 5566 vars === "all" && (this._pt = 0); 5567 return _interrupt(this); 5568 } 5569 5570 overwrittenProps = this._op = this._op || []; 5571 5572 if (vars !== "all") { 5573 //so people can pass in a comma-delimited list of property names 5574 if (_isString(vars)) { 5575 p = {}; 5576 5577 _forEachName(vars, function (name) { 5578 return p[name] = 1; 5579 }); 5580 5581 vars = p; 5582 } 5583 5584 vars = _addAliasesToVars(parsedTargets, vars); 5585 } 5586 5587 i = parsedTargets.length; 5588 5589 while (i--) { 5590 if (~killingTargets.indexOf(parsedTargets[i])) { 5591 curLookup = propTweenLookup[i]; 5592 5593 if (vars === "all") { 5594 overwrittenProps[i] = vars; 5595 props = curLookup; 5596 curOverwriteProps = {}; 5597 } else { 5598 curOverwriteProps = overwrittenProps[i] = overwrittenProps[i] || {}; 5599 props = vars; 5600 } 5601 5602 for (p in props) { 5603 pt = curLookup && curLookup[p]; 5604 5605 if (pt) { 5606 if (!("kill" in pt.d) || pt.d.kill(p) === true) { 5607 _removeLinkedListItem(this, pt, "_pt"); 5608 } 5609 5610 delete curLookup[p]; 5611 } 5612 5613 if (curOverwriteProps !== "all") { 5614 curOverwriteProps[p] = 1; 5615 } 5616 } 5617 } 5618 } 5619 5620 this._initted && !this._pt && firstPT && _interrupt(this); //if all tweening properties are killed, kill the tween. Without this line, if there's a tween with multiple targets and then you killTweensOf() each target individually, the tween would technically still remain active and fire its onComplete even though there aren't any more properties tweening. 5621 5622 return this; 5623 }; 5624 5625 Tween.to = function to(targets, vars) { 5626 return new Tween(targets, vars, arguments[2]); 5627 }; 5628 5629 Tween.from = function from(targets, vars) { 5630 return new Tween(targets, _parseVars(arguments, 1)); 5631 }; 5632 5633 Tween.delayedCall = function delayedCall(delay, callback, params, scope) { 5634 return new Tween(callback, 0, { 5635 immediateRender: false, 5636 lazy: false, 5637 overwrite: false, 5638 delay: delay, 5639 onComplete: callback, 5640 onReverseComplete: callback, 5641 onCompleteParams: params, 5642 onReverseCompleteParams: params, 5643 callbackScope: scope 5644 }); 5645 }; 5646 5647 Tween.fromTo = function fromTo(targets, fromVars, toVars) { 5648 return new Tween(targets, _parseVars(arguments, 2)); 5649 }; 5650 5651 Tween.set = function set(targets, vars) { 5652 vars.duration = 0; 5653 vars.repeatDelay || (vars.repeat = 0); 5654 return new Tween(targets, vars); 5655 }; 5656 5657 Tween.killTweensOf = function killTweensOf(targets, props, onlyActive) { 5658 return _globalTimeline.killTweensOf(targets, props, onlyActive); 5659 }; 5660 5661 return Tween; 5662}(Animation); 5663 5664_setDefaults(Tween.prototype, { 5665 _targets: [], 5666 _lazy: 0, 5667 _startAt: 0, 5668 _op: 0, 5669 _onInit: 0 5670}); //add the pertinent timeline methods to Tween instances so that users can chain conveniently and create a timeline automatically. (removed due to concerns that it'd ultimately add to more confusion especially for beginners) 5671// _forEachName("to,from,fromTo,set,call,add,addLabel,addPause", name => { 5672// Tween.prototype[name] = function() { 5673// let tl = new Timeline(); 5674// return _addToTimeline(tl, this)[name].apply(tl, toArray(arguments)); 5675// } 5676// }); 5677//for backward compatibility. Leverage the timeline calls. 5678 5679 5680_forEachName("staggerTo,staggerFrom,staggerFromTo", function (name) { 5681 Tween[name] = function () { 5682 var tl = new Timeline(), 5683 params = _slice.call(arguments, 0); 5684 5685 params.splice(name === "staggerFromTo" ? 5 : 4, 0, 0); 5686 return tl[name].apply(tl, params); 5687 }; 5688}); 5689/* 5690 * -------------------------------------------------------------------------------------- 5691 * PROPTWEEN 5692 * -------------------------------------------------------------------------------------- 5693 */ 5694 5695 5696var _setterPlain = function _setterPlain(target, property, value) { 5697 return target[property] = value; 5698}, 5699 _setterFunc = function _setterFunc(target, property, value) { 5700 return target[property](value); 5701}, 5702 _setterFuncWithParam = function _setterFuncWithParam(target, property, value, data) { 5703 return target[property](data.fp, value); 5704}, 5705 _setterAttribute = function _setterAttribute(target, property, value) { 5706 return target.setAttribute(property, value); 5707}, 5708 _getSetter = function _getSetter(target, property) { 5709 return _isFunction(target[property]) ? _setterFunc : _isUndefined(target[property]) && target.setAttribute ? _setterAttribute : _setterPlain; 5710}, 5711 _renderPlain = function _renderPlain(ratio, data) { 5712 return data.set(data.t, data.p, Math.round((data.s + data.c * ratio) * 10000) / 10000, data); 5713}, 5714 _renderBoolean = function _renderBoolean(ratio, data) { 5715 return data.set(data.t, data.p, !!(data.s + data.c * ratio), data); 5716}, 5717 _renderComplexString = function _renderComplexString(ratio, data) { 5718 var pt = data._pt, 5719 s = ""; 5720 5721 if (!ratio && data.b) { 5722 //b = beginning string 5723 s = data.b; 5724 } else if (ratio === 1 && data.e) { 5725 //e = ending string 5726 s = data.e; 5727 } else { 5728 while (pt) { 5729 s = pt.p + (pt.m ? pt.m(pt.s + pt.c * ratio) : Math.round((pt.s + pt.c * ratio) * 10000) / 10000) + s; //we use the "p" property for the text inbetween (like a suffix). And in the context of a complex string, the modifier (m) is typically just Math.round(), like for RGB colors. 5730 5731 pt = pt._next; 5732 } 5733 5734 s += data.c; //we use the "c" of the PropTween to store the final chunk of non-numeric text. 5735 } 5736 5737 data.set(data.t, data.p, s, data); 5738}, 5739 _renderPropTweens = function _renderPropTweens(ratio, data) { 5740 var pt = data._pt; 5741 5742 while (pt) { 5743 pt.r(ratio, pt.d); 5744 pt = pt._next; 5745 } 5746}, 5747 _addPluginModifier = function _addPluginModifier(modifier, tween, target, property) { 5748 var pt = this._pt, 5749 next; 5750 5751 while (pt) { 5752 next = pt._next; 5753 pt.p === property && pt.modifier(modifier, tween, target); 5754 pt = next; 5755 } 5756}, 5757 _killPropTweensOf = function _killPropTweensOf(property) { 5758 var pt = this._pt, 5759 hasNonDependentRemaining, 5760 next; 5761 5762 while (pt) { 5763 next = pt._next; 5764 5765 if (pt.p === property && !pt.op || pt.op === property) { 5766 _removeLinkedListItem(this, pt, "_pt"); 5767 } else if (!pt.dep) { 5768 hasNonDependentRemaining = 1; 5769 } 5770 5771 pt = next; 5772 } 5773 5774 return !hasNonDependentRemaining; 5775}, 5776 _setterWithModifier = function _setterWithModifier(target, property, value, data) { 5777 data.mSet(target, property, data.m.call(data.tween, value, data.mt), data); 5778}, 5779 _sortPropTweensByPriority = function _sortPropTweensByPriority(parent) { 5780 var pt = parent._pt, 5781 next, 5782 pt2, 5783 first, 5784 last; //sorts the PropTween linked list in order of priority because some plugins need to do their work after ALL of the PropTweens were created (like RoundPropsPlugin and ModifiersPlugin) 5785 5786 while (pt) { 5787 next = pt._next; 5788 pt2 = first; 5789 5790 while (pt2 && pt2.pr > pt.pr) { 5791 pt2 = pt2._next; 5792 } 5793 5794 if (pt._prev = pt2 ? pt2._prev : last) { 5795 pt._prev._next = pt; 5796 } else { 5797 first = pt; 5798 } 5799 5800 if (pt._next = pt2) { 5801 pt2._prev = pt; 5802 } else { 5803 last = pt; 5804 } 5805 5806 pt = next; 5807 } 5808 5809 parent._pt = first; 5810}; //PropTween key: t = target, p = prop, r = renderer, d = data, s = start, c = change, op = overwriteProperty (ONLY populated when it's different than p), pr = priority, _next/_prev for the linked list siblings, set = setter, m = modifier, mSet = modifierSetter (the original setter, before a modifier was added) 5811 5812 5813var PropTween = /*#__PURE__*/function () { 5814 function PropTween(next, target, prop, start, change, renderer, data, setter, priority) { 5815 this.t = target; 5816 this.s = start; 5817 this.c = change; 5818 this.p = prop; 5819 this.r = renderer || _renderPlain; 5820 this.d = data || this; 5821 this.set = setter || _setterPlain; 5822 this.pr = priority || 0; 5823 this._next = next; 5824 5825 if (next) { 5826 next._prev = this; 5827 } 5828 } 5829 5830 var _proto4 = PropTween.prototype; 5831 5832 _proto4.modifier = function modifier(func, tween, target) { 5833 this.mSet = this.mSet || this.set; //in case it was already set (a PropTween can only have one modifier) 5834 5835 this.set = _setterWithModifier; 5836 this.m = func; 5837 this.mt = target; //modifier target 5838 5839 this.tween = tween; 5840 }; 5841 5842 return PropTween; 5843}(); //Initialization tasks 5844 5845_forEachName(_callbackNames + "parent,duration,ease,delay,overwrite,runBackwards,startAt,yoyo,immediateRender,repeat,repeatDelay,data,paused,reversed,lazy,callbackScope,stringFilter,id,yoyoEase,stagger,inherit,repeatRefresh,keyframes,autoRevert,scrollTrigger", function (name) { 5846 return _reservedProps[name] = 1; 5847}); 5848 5849_globals.TweenMax = _globals.TweenLite = Tween; 5850_globals.TimelineLite = _globals.TimelineMax = Timeline; 5851_globalTimeline = new Timeline({ 5852 sortChildren: false, 5853 defaults: _defaults, 5854 autoRemoveChildren: true, 5855 id: "root", 5856 smoothChildTiming: true 5857}); 5858_config.stringFilter = _colorStringFilter; 5859/* 5860 * -------------------------------------------------------------------------------------- 5861 * GSAP 5862 * -------------------------------------------------------------------------------------- 5863 */ 5864 5865var _gsap = { 5866 registerPlugin: function registerPlugin() { 5867 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { 5868 args[_key2] = arguments[_key2]; 5869 } 5870 5871 args.forEach(function (config) { 5872 return _createPlugin(config); 5873 }); 5874 }, 5875 timeline: function timeline(vars) { 5876 return new Timeline(vars); 5877 }, 5878 getTweensOf: function getTweensOf(targets, onlyActive) { 5879 return _globalTimeline.getTweensOf(targets, onlyActive); 5880 }, 5881 getProperty: function getProperty(target, property, unit, uncache) { 5882 _isString(target) && (target = toArray(target)[0]); //in case selector text or an array is passed in 5883 5884 var getter = _getCache(target || {}).get, 5885 format = unit ? _passThrough : _numericIfPossible; 5886 5887 unit === "native" && (unit = ""); 5888 return !target ? target : !property ? function (property, unit, uncache) { 5889 return format((_plugins[property] && _plugins[property].get || getter)(target, property, unit, uncache)); 5890 } : format((_plugins[property] && _plugins[property].get || getter)(target, property, unit, uncache)); 5891 }, 5892 quickSetter: function quickSetter(target, property, unit) { 5893 target = toArray(target); 5894 5895 if (target.length > 1) { 5896 var setters = target.map(function (t) { 5897 return gsap.quickSetter(t, property, unit); 5898 }), 5899 l = setters.length; 5900 return function (value) { 5901 var i = l; 5902 5903 while (i--) { 5904 setters[i](value); 5905 } 5906 }; 5907 } 5908 5909 target = target[0] || {}; 5910 5911 var Plugin = _plugins[property], 5912 cache = _getCache(target), 5913 p = cache.harness && (cache.harness.aliases || {})[property] || property, 5914 // in case it's an alias, like "rotate" for "rotation". 5915 setter = Plugin ? function (value) { 5916 var p = new Plugin(); 5917 _quickTween._pt = 0; 5918 p.init(target, unit ? value + unit : value, _quickTween, 0, [target]); 5919 p.render(1, p); 5920 _quickTween._pt && _renderPropTweens(1, _quickTween); 5921 } : cache.set(target, p); 5922 5923 return Plugin ? setter : function (value) { 5924 return setter(target, p, unit ? value + unit : value, cache, 1); 5925 }; 5926 }, 5927 isTweening: function isTweening(targets) { 5928 return _globalTimeline.getTweensOf(targets, true).length > 0; 5929 }, 5930 defaults: function defaults(value) { 5931 value && value.ease && (value.ease = _parseEase(value.ease, _defaults.ease)); 5932 return _mergeDeep(_defaults, value || {}); 5933 }, 5934 config: function config(value) { 5935 return _mergeDeep(_config, value || {}); 5936 }, 5937 registerEffect: function registerEffect(_ref2) { 5938 var name = _ref2.name, 5939 effect = _ref2.effect, 5940 plugins = _ref2.plugins, 5941 defaults = _ref2.defaults, 5942 extendTimeline = _ref2.extendTimeline; 5943 (plugins || "").split(",").forEach(function (pluginName) { 5944 return pluginName && !_plugins[pluginName] && !_globals[pluginName] && _warn(name + " effect requires " + pluginName + " plugin."); 5945 }); 5946 5947 _effects[name] = function (targets, vars, tl) { 5948 return effect(toArray(targets), _setDefaults(vars || {}, defaults), tl); 5949 }; 5950 5951 if (extendTimeline) { 5952 Timeline.prototype[name] = function (targets, vars, position) { 5953 return this.add(_effects[name](targets, _isObject(vars) ? vars : (position = vars) && {}, this), position); 5954 }; 5955 } 5956 }, 5957 registerEase: function registerEase(name, ease) { 5958 _easeMap[name] = _parseEase(ease); 5959 }, 5960 parseEase: function parseEase(ease, defaultEase) { 5961 return arguments.length ? _parseEase(ease, defaultEase) : _easeMap; 5962 }, 5963 getById: function getById(id) { 5964 return _globalTimeline.getById(id); 5965 }, 5966 exportRoot: function exportRoot(vars, includeDelayedCalls) { 5967 if (vars === void 0) { 5968 vars = {}; 5969 } 5970 5971 var tl = new Timeline(vars), 5972 child, 5973 next; 5974 tl.smoothChildTiming = _isNotFalse(vars.smoothChildTiming); 5975 5976 _globalTimeline.remove(tl); 5977 5978 tl._dp = 0; //otherwise it'll get re-activated when adding children and be re-introduced into _globalTimeline's linked list (then added to itself). 5979 5980 tl._time = tl._tTime = _globalTimeline._time; 5981 child = _globalTimeline._first; 5982 5983 while (child) { 5984 next = child._next; 5985 5986 if (includeDelayedCalls || !(!child._dur && child instanceof Tween && child.vars.onComplete === child._targets[0])) { 5987 _addToTimeline(tl, child, child._start - child._delay); 5988 } 5989 5990 child = next; 5991 } 5992 5993 _addToTimeline(_globalTimeline, tl, 0); 5994 5995 return tl; 5996 }, 5997 utils: { 5998 wrap: wrap, 5999 wrapYoyo: wrapYoyo, 6000 distribute: distribute, 6001 random: random, 6002 snap: snap, 6003 normalize: normalize, 6004 getUnit: getUnit, 6005 clamp: clamp, 6006 splitColor: splitColor, 6007 toArray: toArray, 6008 mapRange: mapRange, 6009 pipe: pipe, 6010 unitize: unitize, 6011 interpolate: interpolate, 6012 shuffle: shuffle 6013 }, 6014 install: _install, 6015 effects: _effects, 6016 ticker: _ticker, 6017 updateRoot: Timeline.updateRoot, 6018 plugins: _plugins, 6019 globalTimeline: _globalTimeline, 6020 core: { 6021 PropTween: PropTween, 6022 globals: _addGlobal, 6023 Tween: Tween, 6024 Timeline: Timeline, 6025 Animation: Animation, 6026 getCache: _getCache, 6027 _removeLinkedListItem: _removeLinkedListItem, 6028 suppressOverwrites: function suppressOverwrites(value) { 6029 return _suppressOverwrites = value; 6030 } 6031 } 6032}; 6033 6034_forEachName("to,from,fromTo,delayedCall,set,killTweensOf", function (name) { 6035 return _gsap[name] = Tween[name]; 6036}); 6037 6038_ticker.add(Timeline.updateRoot); 6039 6040_quickTween = _gsap.to({}, { 6041 duration: 0 6042}); // ---- EXTRA PLUGINS -------------------------------------------------------- 6043 6044var _getPluginPropTween = function _getPluginPropTween(plugin, prop) { 6045 var pt = plugin._pt; 6046 6047 while (pt && pt.p !== prop && pt.op !== prop && pt.fp !== prop) { 6048 pt = pt._next; 6049 } 6050 6051 return pt; 6052}, 6053 _addModifiers = function _addModifiers(tween, modifiers) { 6054 var targets = tween._targets, 6055 p, 6056 i, 6057 pt; 6058 6059 for (p in modifiers) { 6060 i = targets.length; 6061 6062 while (i--) { 6063 pt = tween._ptLookup[i][p]; 6064 6065 if (pt && (pt = pt.d)) { 6066 if (pt._pt) { 6067 // is a plugin 6068 pt = _getPluginPropTween(pt, p); 6069 } 6070 6071 pt && pt.modifier && pt.modifier(modifiers[p], tween, targets[i], p); 6072 } 6073 } 6074 } 6075}, 6076 _buildModifierPlugin = function _buildModifierPlugin(name, modifier) { 6077 return { 6078 name: name, 6079 rawVars: 1, 6080 //don't pre-process function-based values or "random()" strings. 6081 init: function init(target, vars, tween) { 6082 tween._onInit = function (tween) { 6083 var temp, p; 6084 6085 if (_isString(vars)) { 6086 temp = {}; 6087 6088 _forEachName(vars, function (name) { 6089 return temp[name] = 1; 6090 }); //if the user passes in a comma-delimited list of property names to roundProps, like "x,y", we round to whole numbers. 6091 6092 6093 vars = temp; 6094 } 6095 6096 if (modifier) { 6097 temp = {}; 6098 6099 for (p in vars) { 6100 temp[p] = modifier(vars[p]); 6101 } 6102 6103 vars = temp; 6104 } 6105 6106 _addModifiers(tween, vars); 6107 }; 6108 } 6109 }; 6110}; //register core plugins 6111 6112 6113var gsap = _gsap.registerPlugin({ 6114 name: "attr", 6115 init: function init(target, vars, tween, index, targets) { 6116 var p, pt; 6117 6118 for (p in vars) { 6119 pt = this.add(target, "setAttribute", (target.getAttribute(p) || 0) + "", vars[p], index, targets, 0, 0, p); 6120 pt && (pt.op = p); 6121 6122 this._props.push(p); 6123 } 6124 } 6125}, { 6126 name: "endArray", 6127 init: function init(target, value) { 6128 var i = value.length; 6129 6130 while (i--) { 6131 this.add(target, i, target[i] || 0, value[i]); 6132 } 6133 } 6134}, _buildModifierPlugin("roundProps", _roundModifier), _buildModifierPlugin("modifiers"), _buildModifierPlugin("snap", snap)) || _gsap; //to prevent the core plugins from being dropped via aggressive tree shaking, we must include them in the variable declaration in this way. 6135 6136Tween.version = Timeline.version = gsap.version = "3.6.1"; 6137_coreReady = 1; 6138 6139if (_windowExists()) { 6140 _wake(); 6141} 6142 6143var Power0 = _easeMap.Power0, 6144 Power1 = _easeMap.Power1, 6145 Power2 = _easeMap.Power2, 6146 Power3 = _easeMap.Power3, 6147 Power4 = _easeMap.Power4, 6148 Linear = _easeMap.Linear, 6149 Quad = _easeMap.Quad, 6150 Cubic = _easeMap.Cubic, 6151 Quart = _easeMap.Quart, 6152 Quint = _easeMap.Quint, 6153 Strong = _easeMap.Strong, 6154 Elastic = _easeMap.Elastic, 6155 Back = _easeMap.Back, 6156 SteppedEase = _easeMap.SteppedEase, 6157 Bounce = _easeMap.Bounce, 6158 Sine = _easeMap.Sine, 6159 Expo = _easeMap.Expo, 6160 Circ = _easeMap.Circ; 6161 6162 //export some internal methods/orojects for use in CSSPlugin so that we can externalize that file and allow custom builds that exclude it. 6163 6164 6165 6166 6167/***/ }), 6168
vendor: 5,124 bytes, lines 6169-6239
6169/***/ "./node_modules/gsap/index.js": 6170/*!************************************!*\ 6171 !*** ./node_modules/gsap/index.js ***! 6172 \************************************/ 6173/*! exports provided: gsap, default, CSSPlugin, TweenMax, TweenLite, TimelineMax, TimelineLite, Power0, Power1, Power2, Power3, Power4, Linear, Quad, Cubic, Quart, Quint, Strong, Elastic, Back, SteppedEase, Bounce, Sine, Expo, Circ */ 6174/***/ (function(module, __webpack_exports__, __webpack_require__) { 6175 6176"use strict"; 6177__webpack_require__.r(__webpack_exports__); 6178/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "gsap", function() { return gsapWithCSS; }); 6179/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return gsapWithCSS; }); 6180/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TweenMax", function() { return TweenMaxWithCSS; }); 6181/* harmony import */ var _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./gsap-core.js */ "./node_modules/gsap/gsap-core.js"); 6182/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TweenLite", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["TweenLite"]; }); 6183 6184/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TimelineMax", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["TimelineMax"]; }); 6185 6186/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TimelineLite", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["TimelineLite"]; }); 6187 6188/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Power0", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Power0"]; }); 6189 6190/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Power1", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Power1"]; }); 6191 6192/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Power2", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Power2"]; }); 6193 6194/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Power3", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Power3"]; }); 6195 6196/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Power4", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Power4"]; }); 6197 6198/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Linear", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Linear"]; }); 6199 6200/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Quad", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Quad"]; }); 6201 6202/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Cubic", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Cubic"]; }); 6203 6204/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Quart", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Quart"]; }); 6205 6206/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Quint", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Quint"]; }); 6207 6208/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Strong", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Strong"]; }); 6209 6210/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Elastic", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Elastic"]; }); 6211 6212/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Back", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Back"]; }); 6213 6214/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SteppedEase", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["SteppedEase"]; }); 6215 6216/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Bounce", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Bounce"]; }); 6217 6218/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Sine", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Sine"]; }); 6219 6220/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Expo", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Expo"]; }); 6221 6222/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Circ", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Circ"]; }); 6223 6224/* harmony import */ var _CSSPlugin_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./CSSPlugin.js */ "./node_modules/gsap/CSSPlugin.js"); 6225/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CSSPlugin", function() { return _CSSPlugin_js__WEBPACK_IMPORTED_MODULE_1__["CSSPlugin"]; }); 6226 6227/*** IMPORTS FROM imports-loader ***/ 6228var define = false; 6229 6230 6231 6232var gsapWithCSS = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["gsap"].registerPlugin(_CSSPlugin_js__WEBPACK_IMPORTED_MODULE_1__["CSSPlugin"]) || _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["gsap"], 6233 // to protect from tree shaking 6234TweenMaxWithCSS = gsapWithCSS.core.Tween; 6235 6236 6237 6238/***/ }), 6239
vendor: 288,915 bytes, lines 6240-17135
6240/***/ "./node_modules/jquery/dist/jquery.js": 6241/*!********************************************!*\ 6242 !*** ./node_modules/jquery/dist/jquery.js ***! 6243 \********************************************/ 6244/*! no static exports found */ 6245/***/ (function(module, exports, __webpack_require__) { 6246 6247/*** IMPORTS FROM imports-loader ***/ 6248var define = false; 6249 6250/*! 6251 * jQuery JavaScript Library v3.6.0 6252 * https://jquery.com/ 6253 * 6254 * Includes Sizzle.js 6255 * https://sizzlejs.com/ 6256 * 6257 * Copyright OpenJS Foundation and other contributors 6258 * Released under the MIT license 6259 * https://jquery.org/license 6260 * 6261 * Date: 2021-03-02T17:08Z 6262 */ 6263( function( global, factory ) { 6264 6265 "use strict"; 6266 6267 if ( true && typeof module.exports === "object" ) { 6268 6269 // For CommonJS and CommonJS-like environments where a proper `window` 6270 // is present, execute the factory and get jQuery. 6271 // For environments that do not have a `window` with a `document` 6272 // (such as Node.js), expose a factory as module.exports. 6273 // This accentuates the need for the creation of a real `window`. 6274 // e.g. var jQuery = require("jquery")(window); 6275 // See ticket #14549 for more info. 6276 module.exports = global.document ? 6277 factory( global, true ) : 6278 function( w ) { 6279 if ( !w.document ) { 6280 throw new Error( "jQuery requires a window with a document" ); 6281 } 6282 return factory( w ); 6283 }; 6284 } else { 6285 factory( global ); 6286 } 6287 6288// Pass this if window is not defined yet 6289} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { 6290 6291// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 6292// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode 6293// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common 6294// enough that all such attempts are guarded in a try block. 6295"use strict"; 6296 6297var arr = []; 6298 6299var getProto = Object.getPrototypeOf; 6300 6301var slice = arr.slice; 6302 6303var flat = arr.flat ? function( array ) { 6304 return arr.flat.call( array ); 6305} : function( array ) { 6306 return arr.concat.apply( [], array ); 6307}; 6308 6309 6310var push = arr.push; 6311 6312var indexOf = arr.indexOf; 6313 6314var class2type = {}; 6315 6316var toString = class2type.toString; 6317 6318var hasOwn = class2type.hasOwnProperty; 6319 6320var fnToString = hasOwn.toString; 6321 6322var ObjectFunctionString = fnToString.call( Object ); 6323 6324var support = {}; 6325 6326var isFunction = function isFunction( obj ) { 6327 6328 // Support: Chrome <=57, Firefox <=52 6329 // In some browsers, typeof returns "function" for HTML <object> elements 6330 // (i.e., `typeof document.createElement( "object" ) === "function"`). 6331 // We don't want to classify *any* DOM node as a function. 6332 // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 6333 // Plus for old WebKit, typeof returns "function" for HTML collections 6334 // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) 6335 return typeof obj === "function" && typeof obj.nodeType !== "number" && 6336 typeof obj.item !== "function"; 6337 }; 6338 6339 6340var isWindow = function isWindow( obj ) { 6341 return obj != null && obj === obj.window; 6342 }; 6343 6344 6345var document = window.document; 6346 6347 6348 6349 var preservedScriptAttributes = { 6350 type: true, 6351 src: true, 6352 nonce: true, 6353 noModule: true 6354 }; 6355 6356 function DOMEval( code, node, doc ) { 6357 doc = doc || document; 6358 6359 var i, val, 6360 script = doc.createElement( "script" ); 6361 6362 script.text = code; 6363 if ( node ) { 6364 for ( i in preservedScriptAttributes ) { 6365 6366 // Support: Firefox 64+, Edge 18+ 6367 // Some browsers don't support the "nonce" property on scripts. 6368 // On the other hand, just using `getAttribute` is not enough as 6369 // the `nonce` attribute is reset to an empty string whenever it 6370 // becomes browsing-context connected. 6371 // See https://github.com/whatwg/html/issues/2369 6372 // See https://html.spec.whatwg.org/#nonce-attributes 6373 // The `node.getAttribute` check was added for the sake of 6374 // `jQuery.globalEval` so that it can fake a nonce-containing node 6375 // via an object. 6376 val = node[ i ] || node.getAttribute && node.getAttribute( i ); 6377 if ( val ) { 6378 script.setAttribute( i, val ); 6379 } 6380 } 6381 } 6382 doc.head.appendChild( script ).parentNode.removeChild( script ); 6383 } 6384 6385 6386function toType( obj ) { 6387 if ( obj == null ) { 6388 return obj + ""; 6389 } 6390 6391 // Support: Android <=2.3 only (functionish RegExp) 6392 return typeof obj === "object" || typeof obj === "function" ? 6393 class2type[ toString.call( obj ) ] || "object" : 6394 typeof obj; 6395} 6396/* global Symbol */ 6397// Defining this global in .eslintrc.json would create a danger of using the global 6398// unguarded in another place, it seems safer to define global only for this module 6399 6400 6401 6402var 6403 version = "3.6.0", 6404 6405 // Define a local copy of jQuery 6406 jQuery = function( selector, context ) { 6407 6408 // The jQuery object is actually just the init constructor 'enhanced' 6409 // Need init if jQuery is called (just allow error to be thrown if not included) 6410 return new jQuery.fn.init( selector, context ); 6411 }; 6412 6413jQuery.fn = jQuery.prototype = { 6414 6415 // The current version of jQuery being used 6416 jquery: version, 6417 6418 constructor: jQuery, 6419 6420 // The default length of a jQuery object is 0 6421 length: 0, 6422 6423 toArray: function() { 6424 return slice.call( this ); 6425 }, 6426 6427 // Get the Nth element in the matched element set OR 6428 // Get the whole matched element set as a clean array 6429 get: function( num ) { 6430 6431 // Return all the elements in a clean array 6432 if ( num == null ) { 6433 return slice.call( this ); 6434 } 6435 6436 // Return just the one element from the set 6437 return num < 0 ? this[ num + this.length ] : this[ num ]; 6438 }, 6439 6440 // Take an array of elements and push it onto the stack 6441 // (returning the new matched element set) 6442 pushStack: function( elems ) { 6443 6444 // Build a new jQuery matched element set 6445 var ret = jQuery.merge( this.constructor(), elems ); 6446 6447 // Add the old object onto the stack (as a reference) 6448 ret.prevObject = this; 6449 6450 // Return the newly-formed element set 6451 return ret; 6452 }, 6453 6454 // Execute a callback for every element in the matched set. 6455 each: function( callback ) { 6456 return jQuery.each( this, callback ); 6457 }, 6458 6459 map: function( callback ) { 6460 return this.pushStack( jQuery.map( this, function( elem, i ) { 6461 return callback.call( elem, i, elem ); 6462 } ) ); 6463 }, 6464 6465 slice: function() { 6466 return this.pushStack( slice.apply( this, arguments ) ); 6467 }, 6468 6469 first: function() { 6470 return this.eq( 0 ); 6471 }, 6472 6473 last: function() { 6474 return this.eq( -1 ); 6475 }, 6476 6477 even: function() { 6478 return this.pushStack( jQuery.grep( this, function( _elem, i ) { 6479 return ( i + 1 ) % 2; 6480 } ) ); 6481 }, 6482 6483 odd: function() { 6484 return this.pushStack( jQuery.grep( this, function( _elem, i ) { 6485 return i % 2; 6486 } ) ); 6487 }, 6488 6489 eq: function( i ) { 6490 var len = this.length, 6491 j = +i + ( i < 0 ? len : 0 ); 6492 return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); 6493 }, 6494 6495 end: function() { 6496 return this.prevObject || this.constructor(); 6497 }, 6498 6499 // For internal use only. 6500 // Behaves like an Array's method, not like a jQuery method. 6501 push: push, 6502 sort: arr.sort, 6503 splice: arr.splice 6504}; 6505 6506jQuery.extend = jQuery.fn.extend = function() { 6507 var options, name, src, copy, copyIsArray, clone, 6508 target = arguments[ 0 ] || {}, 6509 i = 1, 6510 length = arguments.length, 6511 deep = false; 6512 6513 // Handle a deep copy situation 6514 if ( typeof target === "boolean" ) { 6515 deep = target; 6516 6517 // Skip the boolean and the target 6518 target = arguments[ i ] || {}; 6519 i++; 6520 } 6521 6522 // Handle case when target is a string or something (possible in deep copy) 6523 if ( typeof target !== "object" && !isFunction( target ) ) { 6524 target = {}; 6525 } 6526 6527 // Extend jQuery itself if only one argument is passed 6528 if ( i === length ) { 6529 target = this; 6530 i--; 6531 } 6532 6533 for ( ; i < length; i++ ) { 6534 6535 // Only deal with non-null/undefined values 6536 if ( ( options = arguments[ i ] ) != null ) { 6537 6538 // Extend the base object 6539 for ( name in options ) { 6540 copy = options[ name ]; 6541 6542 // Prevent Object.prototype pollution 6543 // Prevent never-ending loop 6544 if ( name === "__proto__" || target === copy ) { 6545 continue; 6546 } 6547 6548 // Recurse if we're merging plain objects or arrays 6549 if ( deep && copy && ( jQuery.isPlainObject( copy ) || 6550 ( copyIsArray = Array.isArray( copy ) ) ) ) { 6551 src = target[ name ]; 6552 6553 // Ensure proper type for the source value 6554 if ( copyIsArray && !Array.isArray( src ) ) { 6555 clone = []; 6556 } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { 6557 clone = {}; 6558 } else { 6559 clone = src; 6560 } 6561 copyIsArray = false; 6562 6563 // Never move original objects, clone them 6564 target[ name ] = jQuery.extend( deep, clone, copy ); 6565 6566 // Don't bring in undefined values 6567 } else if ( copy !== undefined ) { 6568 target[ name ] = copy; 6569 } 6570 } 6571 } 6572 } 6573 6574 // Return the modified object 6575 return target; 6576}; 6577 6578jQuery.extend( { 6579 6580 // Unique for each copy of jQuery on the page 6581 expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), 6582 6583 // Assume jQuery is ready without the ready module 6584 isReady: true, 6585 6586 error: function( msg ) { 6587 throw new Error( msg ); 6588 }, 6589 6590 noop: function() {}, 6591 6592 isPlainObject: function( obj ) { 6593 var proto, Ctor; 6594 6595 // Detect obvious negatives 6596 // Use toString instead of jQuery.type to catch host objects 6597 if ( !obj || toString.call( obj ) !== "[object Object]" ) { 6598 return false; 6599 } 6600 6601 proto = getProto( obj ); 6602 6603 // Objects with no prototype (e.g., `Object.create( null )`) are plain 6604 if ( !proto ) { 6605 return true; 6606 } 6607 6608 // Objects with prototype are plain iff they were constructed by a global Object function 6609 Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; 6610 return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; 6611 }, 6612 6613 isEmptyObject: function( obj ) { 6614 var name; 6615 6616 for ( name in obj ) { 6617 return false; 6618 } 6619 return true; 6620 }, 6621 6622 // Evaluates a script in a provided context; falls back to the global one 6623 // if not specified. 6624 globalEval: function( code, options, doc ) { 6625 DOMEval( code, { nonce: options && options.nonce }, doc ); 6626 }, 6627 6628 each: function( obj, callback ) { 6629 var length, i = 0; 6630 6631 if ( isArrayLike( obj ) ) { 6632 length = obj.length; 6633 for ( ; i < length; i++ ) { 6634 if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { 6635 break; 6636 } 6637 } 6638 } else { 6639 for ( i in obj ) { 6640 if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { 6641 break; 6642 } 6643 } 6644 } 6645 6646 return obj; 6647 }, 6648 6649 // results is for internal usage only 6650 makeArray: function( arr, results ) { 6651 var ret = results || []; 6652 6653 if ( arr != null ) { 6654 if ( isArrayLike( Object( arr ) ) ) { 6655 jQuery.merge( ret, 6656 typeof arr === "string" ? 6657 [ arr ] : arr 6658 ); 6659 } else { 6660 push.call( ret, arr ); 6661 } 6662 } 6663 6664 return ret; 6665 }, 6666 6667 inArray: function( elem, arr, i ) { 6668 return arr == null ? -1 : indexOf.call( arr, elem, i ); 6669 }, 6670 6671 // Support: Android <=4.0 only, PhantomJS 1 only 6672 // push.apply(_, arraylike) throws on ancient WebKit 6673 merge: function( first, second ) { 6674 var len = +second.length, 6675 j = 0, 6676 i = first.length; 6677 6678 for ( ; j < len; j++ ) { 6679 first[ i++ ] = second[ j ]; 6680 } 6681 6682 first.length = i; 6683 6684 return first; 6685 }, 6686 6687 grep: function( elems, callback, invert ) { 6688 var callbackInverse, 6689 matches = [], 6690 i = 0, 6691 length = elems.length, 6692 callbackExpect = !invert; 6693 6694 // Go through the array, only saving the items 6695 // that pass the validator function 6696 for ( ; i < length; i++ ) { 6697 callbackInverse = !callback( elems[ i ], i ); 6698 if ( callbackInverse !== callbackExpect ) { 6699 matches.push( elems[ i ] ); 6700 } 6701 } 6702 6703 return matches; 6704 }, 6705 6706 // arg is for internal usage only 6707 map: function( elems, callback, arg ) { 6708 var length, value, 6709 i = 0, 6710 ret = []; 6711 6712 // Go through the array, translating each of the items to their new values 6713 if ( isArrayLike( elems ) ) { 6714 length = elems.length; 6715 for ( ; i < length; i++ ) { 6716 value = callback( elems[ i ], i, arg ); 6717 6718 if ( value != null ) { 6719 ret.push( value ); 6720 } 6721 } 6722 6723 // Go through every key on the object, 6724 } else { 6725 for ( i in elems ) { 6726 value = callback( elems[ i ], i, arg ); 6727 6728 if ( value != null ) { 6729 ret.push( value ); 6730 } 6731 } 6732 } 6733 6734 // Flatten any nested arrays 6735 return flat( ret ); 6736 }, 6737 6738 // A global GUID counter for objects 6739 guid: 1, 6740 6741 // jQuery.support is not used in Core but other projects attach their 6742 // properties to it so it needs to exist. 6743 support: support 6744} ); 6745 6746if ( typeof Symbol === "function" ) { 6747 jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; 6748} 6749 6750// Populate the class2type map 6751jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), 6752 function( _i, name ) { 6753 class2type[ "[object " + name + "]" ] = name.toLowerCase(); 6754 } ); 6755 6756function isArrayLike( obj ) { 6757 6758 // Support: real iOS 8.2 only (not reproducible in simulator) 6759 // `in` check used to prevent JIT error (gh-2145) 6760 // hasOwn isn't used here due to false negatives 6761 // regarding Nodelist length in IE 6762 var length = !!obj && "length" in obj && obj.length, 6763 type = toType( obj ); 6764 6765 if ( isFunction( obj ) || isWindow( obj ) ) { 6766 return false; 6767 } 6768 6769 return type === "array" || length === 0 || 6770 typeof length === "number" && length > 0 && ( length - 1 ) in obj; 6771} 6772var Sizzle = 6773/*! 6774 * Sizzle CSS Selector Engine v2.3.6 6775 * https://sizzlejs.com/ 6776 * 6777 * Copyright JS Foundation and other contributors 6778 * Released under the MIT license 6779 * https://js.foundation/ 6780 * 6781 * Date: 2021-02-16 6782 */ 6783( function( window ) { 6784var i, 6785 support, 6786 Expr, 6787 getText, 6788 isXML, 6789 tokenize, 6790 compile, 6791 select, 6792 outermostContext, 6793 sortInput, 6794 hasDuplicate, 6795 6796 // Local document vars 6797 setDocument, 6798 document, 6799 docElem, 6800 documentIsHTML, 6801 rbuggyQSA, 6802 rbuggyMatches, 6803 matches, 6804 contains, 6805 6806 // Instance-specific data 6807 expando = "sizzle" + 1 * new Date(), 6808 preferredDoc = window.document, 6809 dirruns = 0, 6810 done = 0, 6811 classCache = createCache(), 6812 tokenCache = createCache(), 6813 compilerCache = createCache(), 6814 nonnativeSelectorCache = createCache(), 6815 sortOrder = function( a, b ) { 6816 if ( a === b ) { 6817 hasDuplicate = true; 6818 } 6819 return 0; 6820 }, 6821 6822 // Instance methods 6823 hasOwn = ( {} ).hasOwnProperty, 6824 arr = [], 6825 pop = arr.pop, 6826 pushNative = arr.push, 6827 push = arr.push, 6828 slice = arr.slice, 6829 6830 // Use a stripped-down indexOf as it's faster than native 6831 // https://jsperf.com/thor-indexof-vs-for/5 6832 indexOf = function( list, elem ) { 6833 var i = 0, 6834 len = list.length; 6835 for ( ; i < len; i++ ) { 6836 if ( list[ i ] === elem ) { 6837 return i; 6838 } 6839 } 6840 return -1; 6841 }, 6842 6843 booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + 6844 "ismap|loop|multiple|open|readonly|required|scoped", 6845 6846 // Regular expressions 6847 6848 // http://www.w3.org/TR/css3-selectors/#whitespace 6849 whitespace = "[\\x20\\t\\r\\n\\f]", 6850 6851 // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram 6852 identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + 6853 "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", 6854 6855 // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors 6856 attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + 6857 6858 // Operator (capture 2) 6859 "*([*^$|!~]?=)" + whitespace + 6860 6861 // "Attribute values must be CSS identifiers [capture 5] 6862 // or strings [capture 3 or capture 4]" 6863 "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + 6864 whitespace + "*\\]", 6865 6866 pseudos = ":(" + identifier + ")(?:\\((" + 6867 6868 // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: 6869 // 1. quoted (capture 3; capture 4 or capture 5) 6870 "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + 6871 6872 // 2. simple (capture 6) 6873 "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + 6874 6875 // 3. anything else (capture 2) 6876 ".*" + 6877 ")\\)|)", 6878 6879 // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter 6880 rwhitespace = new RegExp( whitespace + "+", "g" ), 6881 rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + 6882 whitespace + "+$", "g" ), 6883 6884 rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), 6885 rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + 6886 "*" ), 6887 rdescend = new RegExp( whitespace + "|>" ), 6888 6889 rpseudo = new RegExp( pseudos ), 6890 ridentifier = new RegExp( "^" + identifier + "$" ), 6891 6892 matchExpr = { 6893 "ID": new RegExp( "^#(" + identifier + ")" ), 6894 "CLASS": new RegExp( "^\\.(" + identifier + ")" ), 6895 "TAG": new RegExp( "^(" + identifier + "|[*])" ), 6896 "ATTR": new RegExp( "^" + attributes ), 6897 "PSEUDO": new RegExp( "^" + pseudos ), 6898 "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + 6899 whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + 6900 whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), 6901 "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), 6902 6903 // For use in libraries implementing .is() 6904 // We use this for POS matching in `select` 6905 "needsContext": new RegExp( "^" + whitespace + 6906 "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + 6907 "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) 6908 }, 6909 6910 rhtml = /HTML$/i, 6911 rinputs = /^(?:input|select|textarea|button)$/i, 6912 rheader = /^h\d$/i, 6913 6914 rnative = /^[^{]+\{\s*\[native \w/, 6915 6916 // Easily-parseable/retrievable ID or TAG or CLASS selectors 6917 rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, 6918 6919 rsibling = /[+~]/, 6920 6921 // CSS escapes 6922 // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters 6923 runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), 6924 funescape = function( escape, nonHex ) { 6925 var high = "0x" + escape.slice( 1 ) - 0x10000; 6926 6927 return nonHex ? 6928 6929 // Strip the backslash prefix from a non-hex escape sequence 6930 nonHex : 6931 6932 // Replace a hexadecimal escape sequence with the encoded Unicode code point 6933 // Support: IE <=11+ 6934 // For values outside the Basic Multilingual Plane (BMP), manually construct a 6935 // surrogate pair 6936 high < 0 ? 6937 String.fromCharCode( high + 0x10000 ) : 6938 String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); 6939 }, 6940 6941 // CSS string/identifier serialization 6942 // https://drafts.csswg.org/cssom/#common-serializing-idioms 6943 rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, 6944 fcssescape = function( ch, asCodePoint ) { 6945 if ( asCodePoint ) { 6946 6947 // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER 6948 if ( ch === "\0" ) { 6949 return "\uFFFD"; 6950 } 6951 6952 // Control characters and (dependent upon position) numbers get escaped as code points 6953 return ch.slice( 0, -1 ) + "\\" + 6954 ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; 6955 } 6956 6957 // Other potentially-special ASCII characters get backslash-escaped 6958 return "\\" + ch; 6959 }, 6960 6961 // Used for iframes 6962 // See setDocument() 6963 // Removing the function wrapper causes a "Permission Denied" 6964 // error in IE 6965 unloadHandler = function() { 6966 setDocument(); 6967 }, 6968 6969 inDisabledFieldset = addCombinator( 6970 function( elem ) { 6971 return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; 6972 }, 6973 { dir: "parentNode", next: "legend" } 6974 ); 6975 6976// Optimize for push.apply( _, NodeList ) 6977try { 6978 push.apply( 6979 ( arr = slice.call( preferredDoc.childNodes ) ), 6980 preferredDoc.childNodes 6981 ); 6982 6983 // Support: Android<4.0 6984 // Detect silently failing push.apply 6985 // eslint-disable-next-line no-unused-expressions 6986 arr[ preferredDoc.childNodes.length ].nodeType; 6987} catch ( e ) { 6988 push = { apply: arr.length ? 6989 6990 // Leverage slice if possible 6991 function( target, els ) { 6992 pushNative.apply( target, slice.call( els ) ); 6993 } : 6994 6995 // Support: IE<9 6996 // Otherwise append directly 6997 function( target, els ) { 6998 var j = target.length, 6999 i = 0; 7000 7001 // Can't trust NodeList.length 7002 while ( ( target[ j++ ] = els[ i++ ] ) ) {} 7003 target.length = j - 1; 7004 } 7005 }; 7006} 7007 7008function Sizzle( selector, context, results, seed ) { 7009 var m, i, elem, nid, match, groups, newSelector, 7010 newContext = context && context.ownerDocument, 7011 7012 // nodeType defaults to 9, since context defaults to document 7013 nodeType = context ? context.nodeType : 9; 7014 7015 results = results || []; 7016 7017 // Return early from calls with invalid selector or context 7018 if ( typeof selector !== "string" || !selector || 7019 nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { 7020 7021 return results; 7022 } 7023 7024 // Try to shortcut find operations (as opposed to filters) in HTML documents 7025 if ( !seed ) { 7026 setDocument( context ); 7027 context = context || document; 7028 7029 if ( documentIsHTML ) { 7030 7031 // If the selector is sufficiently simple, try using a "get*By*" DOM method 7032 // (excepting DocumentFragment context, where the methods don't exist) 7033 if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { 7034 7035 // ID selector 7036 if ( ( m = match[ 1 ] ) ) { 7037 7038 // Document context 7039 if ( nodeType === 9 ) { 7040 if ( ( elem = context.getElementById( m ) ) ) { 7041 7042 // Support: IE, Opera, Webkit 7043 // TODO: identify versions 7044 // getElementById can match elements by name instead of ID 7045 if ( elem.id === m ) { 7046 results.push( elem ); 7047 return results; 7048 } 7049 } else { 7050 return results; 7051 } 7052 7053 // Element context 7054 } else { 7055 7056 // Support: IE, Opera, Webkit 7057 // TODO: identify versions 7058 // getElementById can match elements by name instead of ID 7059 if ( newContext && ( elem = newContext.getElementById( m ) ) && 7060 contains( context, elem ) && 7061 elem.id === m ) { 7062 7063 results.push( elem ); 7064 return results; 7065 } 7066 } 7067 7068 // Type selector 7069 } else if ( match[ 2 ] ) { 7070 push.apply( results, context.getElementsByTagName( selector ) ); 7071 return results; 7072 7073 // Class selector 7074 } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && 7075 context.getElementsByClassName ) { 7076 7077 push.apply( results, context.getElementsByClassName( m ) ); 7078 return results; 7079 } 7080 } 7081 7082 // Take advantage of querySelectorAll 7083 if ( support.qsa && 7084 !nonnativeSelectorCache[ selector + " " ] && 7085 ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && 7086 7087 // Support: IE 8 only 7088 // Exclude object elements 7089 ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { 7090 7091 newSelector = selector; 7092 newContext = context; 7093 7094 // qSA considers elements outside a scoping root when evaluating child or 7095 // descendant combinators, which is not what we want. 7096 // In such cases, we work around the behavior by prefixing every selector in the 7097 // list with an ID selector referencing the scope context. 7098 // The technique has to be used as well when a leading combinator is used 7099 // as such selectors are not recognized by querySelectorAll. 7100 // Thanks to Andrew Dupont for this technique. 7101 if ( nodeType === 1 && 7102 ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { 7103 7104 // Expand context for sibling selectors 7105 newContext = rsibling.test( selector ) && testContext( context.parentNode ) || 7106 context; 7107 7108 // We can use :scope instead of the ID hack if the browser 7109 // supports it & if we're not changing the context. 7110 if ( newContext !== context || !support.scope ) { 7111 7112 // Capture the context ID, setting it first if necessary 7113 if ( ( nid = context.getAttribute( "id" ) ) ) { 7114 nid = nid.replace( rcssescape, fcssescape ); 7115 } else { 7116 context.setAttribute( "id", ( nid = expando ) ); 7117 } 7118 } 7119 7120 // Prefix every selector in the list 7121 groups = tokenize( selector ); 7122 i = groups.length; 7123 while ( i-- ) { 7124 groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + 7125 toSelector( groups[ i ] ); 7126 } 7127 newSelector = groups.join( "," ); 7128 } 7129 7130 try { 7131 push.apply( results, 7132 newContext.querySelectorAll( newSelector ) 7133 ); 7134 return results; 7135 } catch ( qsaError ) { 7136 nonnativeSelectorCache( selector, true ); 7137 } finally { 7138 if ( nid === expando ) { 7139 context.removeAttribute( "id" ); 7140 } 7141 } 7142 } 7143 } 7144 } 7145 7146 // All others 7147 return select( selector.replace( rtrim, "$1" ), context, results, seed ); 7148} 7149 7150/** 7151 * Create key-value caches of limited size 7152 * @returns {function(string, object)} Returns the Object data after storing it on itself with 7153 * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) 7154 * deleting the oldest entry 7155 */ 7156function createCache() { 7157 var keys = []; 7158 7159 function cache( key, value ) { 7160 7161 // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) 7162 if ( keys.push( key + " " ) > Expr.cacheLength ) { 7163 7164 // Only keep the most recent entries 7165 delete cache[ keys.shift() ]; 7166 } 7167 return ( cache[ key + " " ] = value ); 7168 } 7169 return cache; 7170} 7171 7172/** 7173 * Mark a function for special use by Sizzle 7174 * @param {Function} fn The function to mark 7175 */ 7176function markFunction( fn ) { 7177 fn[ expando ] = true; 7178 return fn; 7179} 7180 7181/** 7182 * Support testing using an element 7183 * @param {Function} fn Passed the created element and returns a boolean result 7184 */ 7185function assert( fn ) { 7186 var el = document.createElement( "fieldset" ); 7187 7188 try { 7189 return !!fn( el ); 7190 } catch ( e ) { 7191 return false; 7192 } finally { 7193 7194 // Remove from its parent by default 7195 if ( el.parentNode ) { 7196 el.parentNode.removeChild( el ); 7197 } 7198 7199 // release memory in IE 7200 el = null; 7201 } 7202} 7203 7204/** 7205 * Adds the same handler for all of the specified attrs 7206 * @param {String} attrs Pipe-separated list of attributes 7207 * @param {Function} handler The method that will be applied 7208 */ 7209function addHandle( attrs, handler ) { 7210 var arr = attrs.split( "|" ), 7211 i = arr.length; 7212 7213 while ( i-- ) { 7214 Expr.attrHandle[ arr[ i ] ] = handler; 7215 } 7216} 7217 7218/** 7219 * Checks document order of two siblings 7220 * @param {Element} a 7221 * @param {Element} b 7222 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b 7223 */ 7224function siblingCheck( a, b ) { 7225 var cur = b && a, 7226 diff = cur && a.nodeType === 1 && b.nodeType === 1 && 7227 a.sourceIndex - b.sourceIndex; 7228 7229 // Use IE sourceIndex if available on both nodes 7230 if ( diff ) { 7231 return diff; 7232 } 7233 7234 // Check if b follows a 7235 if ( cur ) { 7236 while ( ( cur = cur.nextSibling ) ) { 7237 if ( cur === b ) { 7238 return -1; 7239 } 7240 } 7241 } 7242 7243 return a ? 1 : -1; 7244} 7245 7246/** 7247 * Returns a function to use in pseudos for input types 7248 * @param {String} type 7249 */ 7250function createInputPseudo( type ) { 7251 return function( elem ) { 7252 var name = elem.nodeName.toLowerCase(); 7253 return name === "input" && elem.type === type; 7254 }; 7255} 7256 7257/** 7258 * Returns a function to use in pseudos for buttons 7259 * @param {String} type 7260 */ 7261function createButtonPseudo( type ) { 7262 return function( elem ) { 7263 var name = elem.nodeName.toLowerCase(); 7264 return ( name === "input" || name === "button" ) && elem.type === type; 7265 }; 7266} 7267 7268/** 7269 * Returns a function to use in pseudos for :enabled/:disabled 7270 * @param {Boolean} disabled true for :disabled; false for :enabled 7271 */ 7272function createDisabledPseudo( disabled ) { 7273 7274 // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable 7275 return function( elem ) { 7276 7277 // Only certain elements can match :enabled or :disabled 7278 // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled 7279 // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled 7280 if ( "form" in elem ) { 7281 7282 // Check for inherited disabledness on relevant non-disabled elements: 7283 // * listed form-associated elements in a disabled fieldset 7284 // https://html.spec.whatwg.org/multipage/forms.html#category-listed 7285 // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled 7286 // * option elements in a disabled optgroup 7287 // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled 7288 // All such elements have a "form" property. 7289 if ( elem.parentNode && elem.disabled === false ) { 7290 7291 // Option elements defer to a parent optgroup if present 7292 if ( "label" in elem ) { 7293 if ( "label" in elem.parentNode ) { 7294 return elem.parentNode.disabled === disabled; 7295 } else { 7296 return elem.disabled === disabled; 7297 } 7298 } 7299 7300 // Support: IE 6 - 11 7301 // Use the isDisabled shortcut property to check for disabled fieldset ancestors 7302 return elem.isDisabled === disabled || 7303 7304 // Where there is no isDisabled, check manually 7305 /* jshint -W018 */ 7306 elem.isDisabled !== !disabled && 7307 inDisabledFieldset( elem ) === disabled; 7308 } 7309 7310 return elem.disabled === disabled; 7311 7312 // Try to winnow out elements that can't be disabled before trusting the disabled property. 7313 // Some victims get caught in our net (label, legend, menu, track), but it shouldn't 7314 // even exist on them, let alone have a boolean value. 7315 } else if ( "label" in elem ) { 7316 return elem.disabled === disabled; 7317 } 7318 7319 // Remaining elements are neither :enabled nor :disabled 7320 return false; 7321 }; 7322} 7323 7324/** 7325 * Returns a function to use in pseudos for positionals 7326 * @param {Function} fn 7327 */ 7328function createPositionalPseudo( fn ) { 7329 return markFunction( function( argument ) { 7330 argument = +argument; 7331 return markFunction( function( seed, matches ) { 7332 var j, 7333 matchIndexes = fn( [], seed.length, argument ), 7334 i = matchIndexes.length; 7335 7336 // Match elements found at the specified indexes 7337 while ( i-- ) { 7338 if ( seed[ ( j = matchIndexes[ i ] ) ] ) { 7339 seed[ j ] = !( matches[ j ] = seed[ j ] ); 7340 } 7341 } 7342 } ); 7343 } ); 7344} 7345 7346/** 7347 * Checks a node for validity as a Sizzle context 7348 * @param {Element|Object=} context 7349 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value 7350 */ 7351function testContext( context ) { 7352 return context && typeof context.getElementsByTagName !== "undefined" && context; 7353} 7354 7355// Expose support vars for convenience 7356support = Sizzle.support = {}; 7357 7358/** 7359 * Detects XML nodes 7360 * @param {Element|Object} elem An element or a document 7361 * @returns {Boolean} True iff elem is a non-HTML XML node 7362 */ 7363isXML = Sizzle.isXML = function( elem ) { 7364 var namespace = elem && elem.namespaceURI, 7365 docElem = elem && ( elem.ownerDocument || elem ).documentElement; 7366 7367 // Support: IE <=8 7368 // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes 7369 // https://bugs.jquery.com/ticket/4833 7370 return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); 7371}; 7372 7373/** 7374 * Sets document-related variables once based on the current document 7375 * @param {Element|Object} [doc] An element or document object to use to set the document 7376 * @returns {Object} Returns the current document 7377 */ 7378setDocument = Sizzle.setDocument = function( node ) { 7379 var hasCompare, subWindow, 7380 doc = node ? node.ownerDocument || node : preferredDoc; 7381 7382 // Return early if doc is invalid or already selected 7383 // Support: IE 11+, Edge 17 - 18+ 7384 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 7385 // two documents; shallow comparisons work. 7386 // eslint-disable-next-line eqeqeq 7387 if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { 7388 return document; 7389 } 7390 7391 // Update global variables 7392 document = doc; 7393 docElem = document.documentElement; 7394 documentIsHTML = !isXML( document ); 7395 7396 // Support: IE 9 - 11+, Edge 12 - 18+ 7397 // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) 7398 // Support: IE 11+, Edge 17 - 18+ 7399 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 7400 // two documents; shallow comparisons work. 7401 // eslint-disable-next-line eqeqeq 7402 if ( preferredDoc != document && 7403 ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { 7404 7405 // Support: IE 11, Edge 7406 if ( subWindow.addEventListener ) { 7407 subWindow.addEventListener( "unload", unloadHandler, false ); 7408 7409 // Support: IE 9 - 10 only 7410 } else if ( subWindow.attachEvent ) { 7411 subWindow.attachEvent( "onunload", unloadHandler ); 7412 } 7413 } 7414 7415 // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, 7416 // Safari 4 - 5 only, Opera <=11.6 - 12.x only 7417 // IE/Edge & older browsers don't support the :scope pseudo-class. 7418 // Support: Safari 6.0 only 7419 // Safari 6.0 supports :scope but it's an alias of :root there. 7420 support.scope = assert( function( el ) { 7421 docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); 7422 return typeof el.querySelectorAll !== "undefined" && 7423 !el.querySelectorAll( ":scope fieldset div" ).length; 7424 } ); 7425 7426 /* Attributes 7427 ---------------------------------------------------------------------- */ 7428 7429 // Support: IE<8 7430 // Verify that getAttribute really returns attributes and not properties 7431 // (excepting IE8 booleans) 7432 support.attributes = assert( function( el ) { 7433 el.className = "i"; 7434 return !el.getAttribute( "className" ); 7435 } ); 7436 7437 /* getElement(s)By* 7438 ---------------------------------------------------------------------- */ 7439 7440 // Check if getElementsByTagName("*") returns only elements 7441 support.getElementsByTagName = assert( function( el ) { 7442 el.appendChild( document.createComment( "" ) ); 7443 return !el.getElementsByTagName( "*" ).length; 7444 } ); 7445 7446 // Support: IE<9 7447 support.getElementsByClassName = rnative.test( document.getElementsByClassName ); 7448 7449 // Support: IE<10 7450 // Check if getElementById returns elements by name 7451 // The broken getElementById methods don't pick up programmatically-set names, 7452 // so use a roundabout getElementsByName test 7453 support.getById = assert( function( el ) { 7454 docElem.appendChild( el ).id = expando; 7455 return !document.getElementsByName || !document.getElementsByName( expando ).length; 7456 } ); 7457 7458 // ID filter and find 7459 if ( support.getById ) { 7460 Expr.filter[ "ID" ] = function( id ) { 7461 var attrId = id.replace( runescape, funescape ); 7462 return function( elem ) { 7463 return elem.getAttribute( "id" ) === attrId; 7464 }; 7465 }; 7466 Expr.find[ "ID" ] = function( id, context ) { 7467 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { 7468 var elem = context.getElementById( id ); 7469 return elem ? [ elem ] : []; 7470 } 7471 }; 7472 } else { 7473 Expr.filter[ "ID" ] = function( id ) { 7474 var attrId = id.replace( runescape, funescape ); 7475 return function( elem ) { 7476 var node = typeof elem.getAttributeNode !== "undefined" && 7477 elem.getAttributeNode( "id" ); 7478 return node && node.value === attrId; 7479 }; 7480 }; 7481 7482 // Support: IE 6 - 7 only 7483 // getElementById is not reliable as a find shortcut 7484 Expr.find[ "ID" ] = function( id, context ) { 7485 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { 7486 var node, i, elems, 7487 elem = context.getElementById( id ); 7488 7489 if ( elem ) { 7490 7491 // Verify the id attribute 7492 node = elem.getAttributeNode( "id" ); 7493 if ( node && node.value === id ) { 7494 return [ elem ]; 7495 } 7496 7497 // Fall back on getElementsByName 7498 elems = context.getElementsByName( id ); 7499 i = 0; 7500 while ( ( elem = elems[ i++ ] ) ) { 7501 node = elem.getAttributeNode( "id" ); 7502 if ( node && node.value === id ) { 7503 return [ elem ]; 7504 } 7505 } 7506 } 7507 7508 return []; 7509 } 7510 }; 7511 } 7512 7513 // Tag 7514 Expr.find[ "TAG" ] = support.getElementsByTagName ? 7515 function( tag, context ) { 7516 if ( typeof context.getElementsByTagName !== "undefined" ) { 7517 return context.getElementsByTagName( tag ); 7518 7519 // DocumentFragment nodes don't have gEBTN 7520 } else if ( support.qsa ) { 7521 return context.querySelectorAll( tag ); 7522 } 7523 } : 7524 7525 function( tag, context ) { 7526 var elem, 7527 tmp = [], 7528 i = 0, 7529 7530 // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too 7531 results = context.getElementsByTagName( tag ); 7532 7533 // Filter out possible comments 7534 if ( tag === "*" ) { 7535 while ( ( elem = results[ i++ ] ) ) { 7536 if ( elem.nodeType === 1 ) { 7537 tmp.push( elem ); 7538 } 7539 } 7540 7541 return tmp; 7542 } 7543 return results; 7544 }; 7545 7546 // Class 7547 Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { 7548 if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { 7549 return context.getElementsByClassName( className ); 7550 } 7551 }; 7552 7553 /* QSA/matchesSelector 7554 ---------------------------------------------------------------------- */ 7555 7556 // QSA and matchesSelector support 7557 7558 // matchesSelector(:active) reports false when true (IE9/Opera 11.5) 7559 rbuggyMatches = []; 7560 7561 // qSa(:focus) reports false when true (Chrome 21) 7562 // We allow this because of a bug in IE8/9 that throws an error 7563 // whenever `document.activeElement` is accessed on an iframe 7564 // So, we allow :focus to pass through QSA all the time to avoid the IE error 7565 // See https://bugs.jquery.com/ticket/13378 7566 rbuggyQSA = []; 7567 7568 if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { 7569 7570 // Build QSA regex 7571 // Regex strategy adopted from Diego Perini 7572 assert( function( el ) { 7573 7574 var input; 7575 7576 // Select is set to empty string on purpose 7577 // This is to test IE's treatment of not explicitly 7578 // setting a boolean content attribute, 7579 // since its presence should be enough 7580 // https://bugs.jquery.com/ticket/12359 7581 docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" + 7582 "<select id='" + expando + "-\r\\' msallowcapture=''>" + 7583 "<option selected=''></option></select>"; 7584 7585 // Support: IE8, Opera 11-12.16 7586 // Nothing should be selected when empty strings follow ^= or $= or *= 7587 // The test attribute must be unknown in Opera but "safe" for WinRT 7588 // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section 7589 if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { 7590 rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); 7591 } 7592 7593 // Support: IE8 7594 // Boolean attributes and "value" are not treated correctly 7595 if ( !el.querySelectorAll( "[selected]" ).length ) { 7596 rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); 7597 } 7598 7599 // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ 7600 if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { 7601 rbuggyQSA.push( "~=" ); 7602 } 7603 7604 // Support: IE 11+, Edge 15 - 18+ 7605 // IE 11/Edge don't find elements on a `[name='']` query in some cases. 7606 // Adding a temporary attribute to the document before the selection works 7607 // around the issue. 7608 // Interestingly, IE 10 & older don't seem to have the issue. 7609 input = document.createElement( "input" ); 7610 input.setAttribute( "name", "" ); 7611 el.appendChild( input ); 7612 if ( !el.querySelectorAll( "[name='']" ).length ) { 7613 rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + 7614 whitespace + "*(?:''|\"\")" ); 7615 } 7616 7617 // Webkit/Opera - :checked should return selected option elements 7618 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 7619 // IE8 throws error here and will not see later tests 7620 if ( !el.querySelectorAll( ":checked" ).length ) { 7621 rbuggyQSA.push( ":checked" ); 7622 } 7623 7624 // Support: Safari 8+, iOS 8+ 7625 // https://bugs.webkit.org/show_bug.cgi?id=136851 7626 // In-page `selector#id sibling-combinator selector` fails 7627 if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { 7628 rbuggyQSA.push( ".#.+[+~]" ); 7629 } 7630 7631 // Support: Firefox <=3.6 - 5 only 7632 // Old Firefox doesn't throw on a badly-escaped identifier. 7633 el.querySelectorAll( "\\\f" ); 7634 rbuggyQSA.push( "[\\r\\n\\f]" ); 7635 } ); 7636 7637 assert( function( el ) { 7638 el.innerHTML = "<a href='' disabled='disabled'></a>" + 7639 "<select disabled='disabled'><option/></select>"; 7640 7641 // Support: Windows 8 Native Apps 7642 // The type and name attributes are restricted during .innerHTML assignment 7643 var input = document.createElement( "input" ); 7644 input.setAttribute( "type", "hidden" ); 7645 el.appendChild( input ).setAttribute( "name", "D" ); 7646 7647 // Support: IE8 7648 // Enforce case-sensitivity of name attribute 7649 if ( el.querySelectorAll( "[name=d]" ).length ) { 7650 rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); 7651 } 7652 7653 // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) 7654 // IE8 throws error here and will not see later tests 7655 if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { 7656 rbuggyQSA.push( ":enabled", ":disabled" ); 7657 } 7658 7659 // Support: IE9-11+ 7660 // IE's :disabled selector does not pick up the children of disabled fieldsets 7661 docElem.appendChild( el ).disabled = true; 7662 if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { 7663 rbuggyQSA.push( ":enabled", ":disabled" ); 7664 } 7665 7666 // Support: Opera 10 - 11 only 7667 // Opera 10-11 does not throw on post-comma invalid pseudos 7668 el.querySelectorAll( "*,:x" ); 7669 rbuggyQSA.push( ",.*:" ); 7670 } ); 7671 } 7672 7673 if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || 7674 docElem.webkitMatchesSelector || 7675 docElem.mozMatchesSelector || 7676 docElem.oMatchesSelector || 7677 docElem.msMatchesSelector ) ) ) ) { 7678 7679 assert( function( el ) { 7680 7681 // Check to see if it's possible to do matchesSelector 7682 // on a disconnected node (IE 9) 7683 support.disconnectedMatch = matches.call( el, "*" ); 7684 7685 // This should fail with an exception 7686 // Gecko does not error, returns false instead 7687 matches.call( el, "[s!='']:x" ); 7688 rbuggyMatches.push( "!=", pseudos ); 7689 } ); 7690 } 7691 7692 rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); 7693 rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); 7694 7695 /* Contains 7696 ---------------------------------------------------------------------- */ 7697 hasCompare = rnative.test( docElem.compareDocumentPosition ); 7698 7699 // Element contains another 7700 // Purposefully self-exclusive 7701 // As in, an element does not contain itself 7702 contains = hasCompare || rnative.test( docElem.contains ) ? 7703 function( a, b ) { 7704 var adown = a.nodeType === 9 ? a.documentElement : a, 7705 bup = b && b.parentNode; 7706 return a === bup || !!( bup && bup.nodeType === 1 && ( 7707 adown.contains ? 7708 adown.contains( bup ) : 7709 a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 7710 ) ); 7711 } : 7712 function( a, b ) { 7713 if ( b ) { 7714 while ( ( b = b.parentNode ) ) { 7715 if ( b === a ) { 7716 return true; 7717 } 7718 } 7719 } 7720 return false; 7721 }; 7722 7723 /* Sorting 7724 ---------------------------------------------------------------------- */ 7725 7726 // Document order sorting 7727 sortOrder = hasCompare ? 7728 function( a, b ) { 7729 7730 // Flag for duplicate removal 7731 if ( a === b ) { 7732 hasDuplicate = true; 7733 return 0; 7734 } 7735 7736 // Sort on method existence if only one input has compareDocumentPosition 7737 var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; 7738 if ( compare ) { 7739 return compare; 7740 } 7741 7742 // Calculate position if both inputs belong to the same document 7743 // Support: IE 11+, Edge 17 - 18+ 7744 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 7745 // two documents; shallow comparisons work. 7746 // eslint-disable-next-line eqeqeq 7747 compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? 7748 a.compareDocumentPosition( b ) : 7749 7750 // Otherwise we know they are disconnected 7751 1; 7752 7753 // Disconnected nodes 7754 if ( compare & 1 || 7755 ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { 7756 7757 // Choose the first element that is related to our preferred document 7758 // Support: IE 11+, Edge 17 - 18+ 7759 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 7760 // two documents; shallow comparisons work. 7761 // eslint-disable-next-line eqeqeq 7762 if ( a == document || a.ownerDocument == preferredDoc && 7763 contains( preferredDoc, a ) ) { 7764 return -1; 7765 } 7766 7767 // Support: IE 11+, Edge 17 - 18+ 7768 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 7769 // two documents; shallow comparisons work. 7770 // eslint-disable-next-line eqeqeq 7771 if ( b == document || b.ownerDocument == preferredDoc && 7772 contains( preferredDoc, b ) ) { 7773 return 1; 7774 } 7775 7776 // Maintain original order 7777 return sortInput ? 7778 ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 7779 0; 7780 } 7781 7782 return compare & 4 ? -1 : 1; 7783 } : 7784 function( a, b ) { 7785 7786 // Exit early if the nodes are identical 7787 if ( a === b ) { 7788 hasDuplicate = true; 7789 return 0; 7790 } 7791 7792 var cur, 7793 i = 0, 7794 aup = a.parentNode, 7795 bup = b.parentNode, 7796 ap = [ a ], 7797 bp = [ b ]; 7798 7799 // Parentless nodes are either documents or disconnected 7800 if ( !aup || !bup ) { 7801 7802 // Support: IE 11+, Edge 17 - 18+ 7803 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 7804 // two documents; shallow comparisons work. 7805 /* eslint-disable eqeqeq */ 7806 return a == document ? -1 : 7807 b == document ? 1 : 7808 /* eslint-enable eqeqeq */ 7809 aup ? -1 : 7810 bup ? 1 : 7811 sortInput ? 7812 ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 7813 0; 7814 7815 // If the nodes are siblings, we can do a quick check 7816 } else if ( aup === bup ) { 7817 return siblingCheck( a, b ); 7818 } 7819 7820 // Otherwise we need full lists of their ancestors for comparison 7821 cur = a; 7822 while ( ( cur = cur.parentNode ) ) { 7823 ap.unshift( cur ); 7824 } 7825 cur = b; 7826 while ( ( cur = cur.parentNode ) ) { 7827 bp.unshift( cur ); 7828 } 7829 7830 // Walk down the tree looking for a discrepancy 7831 while ( ap[ i ] === bp[ i ] ) { 7832 i++; 7833 } 7834 7835 return i ? 7836 7837 // Do a sibling check if the nodes have a common ancestor 7838 siblingCheck( ap[ i ], bp[ i ] ) : 7839 7840 // Otherwise nodes in our document sort first 7841 // Support: IE 11+, Edge 17 - 18+ 7842 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 7843 // two documents; shallow comparisons work. 7844 /* eslint-disable eqeqeq */ 7845 ap[ i ] == preferredDoc ? -1 : 7846 bp[ i ] == preferredDoc ? 1 : 7847 /* eslint-enable eqeqeq */ 7848 0; 7849 }; 7850 7851 return document; 7852}; 7853 7854Sizzle.matches = function( expr, elements ) { 7855 return Sizzle( expr, null, null, elements ); 7856}; 7857 7858Sizzle.matchesSelector = function( elem, expr ) { 7859 setDocument( elem ); 7860 7861 if ( support.matchesSelector && documentIsHTML && 7862 !nonnativeSelectorCache[ expr + " " ] && 7863 ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && 7864 ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { 7865 7866 try { 7867 var ret = matches.call( elem, expr ); 7868 7869 // IE 9's matchesSelector returns false on disconnected nodes 7870 if ( ret || support.disconnectedMatch || 7871 7872 // As well, disconnected nodes are said to be in a document 7873 // fragment in IE 9 7874 elem.document && elem.document.nodeType !== 11 ) { 7875 return ret; 7876 } 7877 } catch ( e ) { 7878 nonnativeSelectorCache( expr, true ); 7879 } 7880 } 7881 7882 return Sizzle( expr, document, null, [ elem ] ).length > 0; 7883}; 7884 7885Sizzle.contains = function( context, elem ) { 7886 7887 // Set document vars if needed 7888 // Support: IE 11+, Edge 17 - 18+ 7889 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 7890 // two documents; shallow comparisons work. 7891 // eslint-disable-next-line eqeqeq 7892 if ( ( context.ownerDocument || context ) != document ) { 7893 setDocument( context ); 7894 } 7895 return contains( context, elem ); 7896}; 7897 7898Sizzle.attr = function( elem, name ) { 7899 7900 // Set document vars if needed 7901 // Support: IE 11+, Edge 17 - 18+ 7902 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 7903 // two documents; shallow comparisons work. 7904 // eslint-disable-next-line eqeqeq 7905 if ( ( elem.ownerDocument || elem ) != document ) { 7906 setDocument( elem ); 7907 } 7908 7909 var fn = Expr.attrHandle[ name.toLowerCase() ], 7910 7911 // Don't get fooled by Object.prototype properties (jQuery #13807) 7912 val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? 7913 fn( elem, name, !documentIsHTML ) : 7914 undefined; 7915 7916 return val !== undefined ? 7917 val : 7918 support.attributes || !documentIsHTML ? 7919 elem.getAttribute( name ) : 7920 ( val = elem.getAttributeNode( name ) ) && val.specified ? 7921 val.value : 7922 null; 7923}; 7924 7925Sizzle.escape = function( sel ) { 7926 return ( sel + "" ).replace( rcssescape, fcssescape ); 7927}; 7928 7929Sizzle.error = function( msg ) { 7930 throw new Error( "Syntax error, unrecognized expression: " + msg ); 7931}; 7932 7933/** 7934 * Document sorting and removing duplicates 7935 * @param {ArrayLike} results 7936 */ 7937Sizzle.uniqueSort = function( results ) { 7938 var elem, 7939 duplicates = [], 7940 j = 0, 7941 i = 0; 7942 7943 // Unless we *know* we can detect duplicates, assume their presence 7944 hasDuplicate = !support.detectDuplicates; 7945 sortInput = !support.sortStable && results.slice( 0 ); 7946 results.sort( sortOrder ); 7947 7948 if ( hasDuplicate ) { 7949 while ( ( elem = results[ i++ ] ) ) { 7950 if ( elem === results[ i ] ) { 7951 j = duplicates.push( i ); 7952 } 7953 } 7954 while ( j-- ) { 7955 results.splice( duplicates[ j ], 1 ); 7956 } 7957 } 7958 7959 // Clear input after sorting to release objects 7960 // See https://github.com/jquery/sizzle/pull/225 7961 sortInput = null; 7962 7963 return results; 7964}; 7965 7966/** 7967 * Utility function for retrieving the text value of an array of DOM nodes 7968 * @param {Array|Element} elem 7969 */ 7970getText = Sizzle.getText = function( elem ) { 7971 var node, 7972 ret = "", 7973 i = 0, 7974 nodeType = elem.nodeType; 7975 7976 if ( !nodeType ) { 7977 7978 // If no nodeType, this is expected to be an array 7979 while ( ( node = elem[ i++ ] ) ) { 7980 7981 // Do not traverse comment nodes 7982 ret += getText( node ); 7983 } 7984 } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { 7985 7986 // Use textContent for elements 7987 // innerText usage removed for consistency of new lines (jQuery #11153) 7988 if ( typeof elem.textContent === "string" ) { 7989 return elem.textContent; 7990 } else { 7991 7992 // Traverse its children 7993 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { 7994 ret += getText( elem ); 7995 } 7996 } 7997 } else if ( nodeType === 3 || nodeType === 4 ) { 7998 return elem.nodeValue; 7999 } 8000 8001 // Do not include comment or processing instruction nodes 8002 8003 return ret; 8004}; 8005 8006Expr = Sizzle.selectors = { 8007 8008 // Can be adjusted by the user 8009 cacheLength: 50, 8010 8011 createPseudo: markFunction, 8012 8013 match: matchExpr, 8014 8015 attrHandle: {}, 8016 8017 find: {}, 8018 8019 relative: { 8020 ">": { dir: "parentNode", first: true }, 8021 " ": { dir: "parentNode" }, 8022 "+": { dir: "previousSibling", first: true }, 8023 "~": { dir: "previousSibling" } 8024 }, 8025 8026 preFilter: { 8027 "ATTR": function( match ) { 8028 match[ 1 ] = match[ 1 ].replace( runescape, funescape ); 8029 8030 // Move the given value to match[3] whether quoted or unquoted 8031 match[ 3 ] = ( match[ 3 ] || match[ 4 ] || 8032 match[ 5 ] || "" ).replace( runescape, funescape ); 8033 8034 if ( match[ 2 ] === "~=" ) { 8035 match[ 3 ] = " " + match[ 3 ] + " "; 8036 } 8037 8038 return match.slice( 0, 4 ); 8039 }, 8040 8041 "CHILD": function( match ) { 8042 8043 /* matches from matchExpr["CHILD"] 8044 1 type (only|nth|...) 8045 2 what (child|of-type) 8046 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 8047 4 xn-component of xn+y argument ([+-]?\d*n|) 8048 5 sign of xn-component 8049 6 x of xn-component 8050 7 sign of y-component 8051 8 y of y-component 8052 */ 8053 match[ 1 ] = match[ 1 ].toLowerCase(); 8054 8055 if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { 8056 8057 // nth-* requires argument 8058 if ( !match[ 3 ] ) { 8059 Sizzle.error( match[ 0 ] ); 8060 } 8061 8062 // numeric x and y parameters for Expr.filter.CHILD 8063 // remember that false/true cast respectively to 0/1 8064 match[ 4 ] = +( match[ 4 ] ? 8065 match[ 5 ] + ( match[ 6 ] || 1 ) : 8066 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); 8067 match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); 8068 8069 // other types prohibit arguments 8070 } else if ( match[ 3 ] ) { 8071 Sizzle.error( match[ 0 ] ); 8072 } 8073 8074 return match; 8075 }, 8076 8077 "PSEUDO": function( match ) { 8078 var excess, 8079 unquoted = !match[ 6 ] && match[ 2 ]; 8080 8081 if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { 8082 return null; 8083 } 8084 8085 // Accept quoted arguments as-is 8086 if ( match[ 3 ] ) { 8087 match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; 8088 8089 // Strip excess characters from unquoted arguments 8090 } else if ( unquoted && rpseudo.test( unquoted ) && 8091 8092 // Get excess from tokenize (recursively) 8093 ( excess = tokenize( unquoted, true ) ) && 8094 8095 // advance to the next closing parenthesis 8096 ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { 8097 8098 // excess is a negative index 8099 match[ 0 ] = match[ 0 ].slice( 0, excess ); 8100 match[ 2 ] = unquoted.slice( 0, excess ); 8101 } 8102 8103 // Return only captures needed by the pseudo filter method (type and argument) 8104 return match.slice( 0, 3 ); 8105 } 8106 }, 8107 8108 filter: { 8109 8110 "TAG": function( nodeNameSelector ) { 8111 var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); 8112 return nodeNameSelector === "*" ? 8113 function() { 8114 return true; 8115 } : 8116 function( elem ) { 8117 return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; 8118 }; 8119 }, 8120 8121 "CLASS": function( className ) { 8122 var pattern = classCache[ className + " " ]; 8123 8124 return pattern || 8125 ( pattern = new RegExp( "(^|" + whitespace + 8126 ")" + className + "(" + whitespace + "|$)" ) ) && classCache( 8127 className, function( elem ) { 8128 return pattern.test( 8129 typeof elem.className === "string" && elem.className || 8130 typeof elem.getAttribute !== "undefined" && 8131 elem.getAttribute( "class" ) || 8132 "" 8133 ); 8134 } ); 8135 }, 8136 8137 "ATTR": function( name, operator, check ) { 8138 return function( elem ) { 8139 var result = Sizzle.attr( elem, name ); 8140 8141 if ( result == null ) { 8142 return operator === "!="; 8143 } 8144 if ( !operator ) { 8145 return true; 8146 } 8147 8148 result += ""; 8149 8150 /* eslint-disable max-len */ 8151 8152 return operator === "=" ? result === check : 8153 operator === "!=" ? result !== check : 8154 operator === "^=" ? check && result.indexOf( check ) === 0 : 8155 operator === "*=" ? check && result.indexOf( check ) > -1 : 8156 operator === "$=" ? check && result.slice( -check.length ) === check : 8157 operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : 8158 operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : 8159 false; 8160 /* eslint-enable max-len */ 8161 8162 }; 8163 }, 8164 8165 "CHILD": function( type, what, _argument, first, last ) { 8166 var simple = type.slice( 0, 3 ) !== "nth", 8167 forward = type.slice( -4 ) !== "last", 8168 ofType = what === "of-type"; 8169 8170 return first === 1 && last === 0 ? 8171 8172 // Shortcut for :nth-*(n) 8173 function( elem ) { 8174 return !!elem.parentNode; 8175 } : 8176 8177 function( elem, _context, xml ) { 8178 var cache, uniqueCache, outerCache, node, nodeIndex, start, 8179 dir = simple !== forward ? "nextSibling" : "previousSibling", 8180 parent = elem.parentNode, 8181 name = ofType && elem.nodeName.toLowerCase(), 8182 useCache = !xml && !ofType, 8183 diff = false; 8184 8185 if ( parent ) { 8186 8187 // :(first|last|only)-(child|of-type) 8188 if ( simple ) { 8189 while ( dir ) { 8190 node = elem; 8191 while ( ( node = node[ dir ] ) ) { 8192 if ( ofType ? 8193 node.nodeName.toLowerCase() === name : 8194 node.nodeType === 1 ) { 8195 8196 return false; 8197 } 8198 } 8199 8200 // Reverse direction for :only-* (if we haven't yet done so) 8201 start = dir = type === "only" && !start && "nextSibling"; 8202 } 8203 return true; 8204 } 8205 8206 start = [ forward ? parent.firstChild : parent.lastChild ]; 8207 8208 // non-xml :nth-child(...) stores cache data on `parent` 8209 if ( forward && useCache ) { 8210 8211 // Seek `elem` from a previously-cached index 8212 8213 // ...in a gzip-friendly way 8214 node = parent; 8215 outerCache = node[ expando ] || ( node[ expando ] = {} ); 8216 8217 // Support: IE <9 only 8218 // Defend against cloned attroperties (jQuery gh-1709) 8219 uniqueCache = outerCache[ node.uniqueID ] || 8220 ( outerCache[ node.uniqueID ] = {} ); 8221 8222 cache = uniqueCache[ type ] || []; 8223 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; 8224 diff = nodeIndex && cache[ 2 ]; 8225 node = nodeIndex && parent.childNodes[ nodeIndex ]; 8226 8227 while ( ( node = ++nodeIndex && node && node[ dir ] || 8228 8229 // Fallback to seeking `elem` from the start 8230 ( diff = nodeIndex = 0 ) || start.pop() ) ) { 8231 8232 // When found, cache indexes on `parent` and break 8233 if ( node.nodeType === 1 && ++diff && node === elem ) { 8234 uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; 8235 break; 8236 } 8237 } 8238 8239 } else { 8240 8241 // Use previously-cached element index if available 8242 if ( useCache ) { 8243 8244 // ...in a gzip-friendly way 8245 node = elem; 8246 outerCache = node[ expando ] || ( node[ expando ] = {} ); 8247 8248 // Support: IE <9 only 8249 // Defend against cloned attroperties (jQuery gh-1709) 8250 uniqueCache = outerCache[ node.uniqueID ] || 8251 ( outerCache[ node.uniqueID ] = {} ); 8252 8253 cache = uniqueCache[ type ] || []; 8254 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; 8255 diff = nodeIndex; 8256 } 8257 8258 // xml :nth-child(...) 8259 // or :nth-last-child(...) or :nth(-last)?-of-type(...) 8260 if ( diff === false ) { 8261 8262 // Use the same loop as above to seek `elem` from the start 8263 while ( ( node = ++nodeIndex && node && node[ dir ] || 8264 ( diff = nodeIndex = 0 ) || start.pop() ) ) { 8265 8266 if ( ( ofType ? 8267 node.nodeName.toLowerCase() === name : 8268 node.nodeType === 1 ) && 8269 ++diff ) { 8270 8271 // Cache the index of each encountered element 8272 if ( useCache ) { 8273 outerCache = node[ expando ] || 8274 ( node[ expando ] = {} ); 8275 8276 // Support: IE <9 only 8277 // Defend against cloned attroperties (jQuery gh-1709) 8278 uniqueCache = outerCache[ node.uniqueID ] || 8279 ( outerCache[ node.uniqueID ] = {} ); 8280 8281 uniqueCache[ type ] = [ dirruns, diff ]; 8282 } 8283 8284 if ( node === elem ) { 8285 break; 8286 } 8287 } 8288 } 8289 } 8290 } 8291 8292 // Incorporate the offset, then check against cycle size 8293 diff -= last; 8294 return diff === first || ( diff % first === 0 && diff / first >= 0 ); 8295 } 8296 }; 8297 }, 8298 8299 "PSEUDO": function( pseudo, argument ) { 8300 8301 // pseudo-class names are case-insensitive 8302 // http://www.w3.org/TR/selectors/#pseudo-classes 8303 // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters 8304 // Remember that setFilters inherits from pseudos 8305 var args, 8306 fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || 8307 Sizzle.error( "unsupported pseudo: " + pseudo ); 8308 8309 // The user may use createPseudo to indicate that 8310 // arguments are needed to create the filter function 8311 // just as Sizzle does 8312 if ( fn[ expando ] ) { 8313 return fn( argument ); 8314 } 8315 8316 // But maintain support for old signatures 8317 if ( fn.length > 1 ) { 8318 args = [ pseudo, pseudo, "", argument ]; 8319 return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? 8320 markFunction( function( seed, matches ) { 8321 var idx, 8322 matched = fn( seed, argument ), 8323 i = matched.length; 8324 while ( i-- ) { 8325 idx = indexOf( seed, matched[ i ] ); 8326 seed[ idx ] = !( matches[ idx ] = matched[ i ] ); 8327 } 8328 } ) : 8329 function( elem ) { 8330 return fn( elem, 0, args ); 8331 }; 8332 } 8333 8334 return fn; 8335 } 8336 }, 8337 8338 pseudos: { 8339 8340 // Potentially complex pseudos 8341 "not": markFunction( function( selector ) { 8342 8343 // Trim the selector passed to compile 8344 // to avoid treating leading and trailing 8345 // spaces as combinators 8346 var input = [], 8347 results = [], 8348 matcher = compile( selector.replace( rtrim, "$1" ) ); 8349 8350 return matcher[ expando ] ? 8351 markFunction( function( seed, matches, _context, xml ) { 8352 var elem, 8353 unmatched = matcher( seed, null, xml, [] ), 8354 i = seed.length; 8355 8356 // Match elements unmatched by `matcher` 8357 while ( i-- ) { 8358 if ( ( elem = unmatched[ i ] ) ) { 8359 seed[ i ] = !( matches[ i ] = elem ); 8360 } 8361 } 8362 } ) : 8363 function( elem, _context, xml ) { 8364 input[ 0 ] = elem; 8365 matcher( input, null, xml, results ); 8366 8367 // Don't keep the element (issue #299) 8368 input[ 0 ] = null; 8369 return !results.pop(); 8370 }; 8371 } ), 8372 8373 "has": markFunction( function( selector ) { 8374 return function( elem ) { 8375 return Sizzle( selector, elem ).length > 0; 8376 }; 8377 } ), 8378 8379 "contains": markFunction( function( text ) { 8380 text = text.replace( runescape, funescape ); 8381 return function( elem ) { 8382 return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; 8383 }; 8384 } ), 8385 8386 // "Whether an element is represented by a :lang() selector 8387 // is based solely on the element's language value 8388 // being equal to the identifier C, 8389 // or beginning with the identifier C immediately followed by "-". 8390 // The matching of C against the element's language value is performed case-insensitively. 8391 // The identifier C does not have to be a valid language name." 8392 // http://www.w3.org/TR/selectors/#lang-pseudo 8393 "lang": markFunction( function( lang ) { 8394 8395 // lang value must be a valid identifier 8396 if ( !ridentifier.test( lang || "" ) ) { 8397 Sizzle.error( "unsupported lang: " + lang ); 8398 } 8399 lang = lang.replace( runescape, funescape ).toLowerCase(); 8400 return function( elem ) { 8401 var elemLang; 8402 do { 8403 if ( ( elemLang = documentIsHTML ? 8404 elem.lang : 8405 elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { 8406 8407 elemLang = elemLang.toLowerCase(); 8408 return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; 8409 } 8410 } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); 8411 return false; 8412 }; 8413 } ), 8414 8415 // Miscellaneous 8416 "target": function( elem ) { 8417 var hash = window.location && window.location.hash; 8418 return hash && hash.slice( 1 ) === elem.id; 8419 }, 8420 8421 "root": function( elem ) { 8422 return elem === docElem; 8423 }, 8424 8425 "focus": function( elem ) { 8426 return elem === document.activeElement && 8427 ( !document.hasFocus || document.hasFocus() ) && 8428 !!( elem.type || elem.href || ~elem.tabIndex ); 8429 }, 8430 8431 // Boolean properties 8432 "enabled": createDisabledPseudo( false ), 8433 "disabled": createDisabledPseudo( true ), 8434 8435 "checked": function( elem ) { 8436 8437 // In CSS3, :checked should return both checked and selected elements 8438 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 8439 var nodeName = elem.nodeName.toLowerCase(); 8440 return ( nodeName === "input" && !!elem.checked ) || 8441 ( nodeName === "option" && !!elem.selected ); 8442 }, 8443 8444 "selected": function( elem ) { 8445 8446 // Accessing this property makes selected-by-default 8447 // options in Safari work properly 8448 if ( elem.parentNode ) { 8449 // eslint-disable-next-line no-unused-expressions 8450 elem.parentNode.selectedIndex; 8451 } 8452 8453 return elem.selected === true; 8454 }, 8455 8456 // Contents 8457 "empty": function( elem ) { 8458 8459 // http://www.w3.org/TR/selectors/#empty-pseudo 8460 // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), 8461 // but not by others (comment: 8; processing instruction: 7; etc.) 8462 // nodeType < 6 works because attributes (2) do not appear as children 8463 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { 8464 if ( elem.nodeType < 6 ) { 8465 return false; 8466 } 8467 } 8468 return true; 8469 }, 8470 8471 "parent": function( elem ) { 8472 return !Expr.pseudos[ "empty" ]( elem ); 8473 }, 8474 8475 // Element/input types 8476 "header": function( elem ) { 8477 return rheader.test( elem.nodeName ); 8478 }, 8479 8480 "input": function( elem ) { 8481 return rinputs.test( elem.nodeName ); 8482 }, 8483 8484 "button": function( elem ) { 8485 var name = elem.nodeName.toLowerCase(); 8486 return name === "input" && elem.type === "button" || name === "button"; 8487 }, 8488 8489 "text": function( elem ) { 8490 var attr; 8491 return elem.nodeName.toLowerCase() === "input" && 8492 elem.type === "text" && 8493 8494 // Support: IE<8 8495 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" 8496 ( ( attr = elem.getAttribute( "type" ) ) == null || 8497 attr.toLowerCase() === "text" ); 8498 }, 8499 8500 // Position-in-collection 8501 "first": createPositionalPseudo( function() { 8502 return [ 0 ]; 8503 } ), 8504 8505 "last": createPositionalPseudo( function( _matchIndexes, length ) { 8506 return [ length - 1 ]; 8507 } ), 8508 8509 "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { 8510 return [ argument < 0 ? argument + length : argument ]; 8511 } ), 8512 8513 "even": createPositionalPseudo( function( matchIndexes, length ) { 8514 var i = 0; 8515 for ( ; i < length; i += 2 ) { 8516 matchIndexes.push( i ); 8517 } 8518 return matchIndexes; 8519 } ), 8520 8521 "odd": createPositionalPseudo( function( matchIndexes, length ) { 8522 var i = 1; 8523 for ( ; i < length; i += 2 ) { 8524 matchIndexes.push( i ); 8525 } 8526 return matchIndexes; 8527 } ), 8528 8529 "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { 8530 var i = argument < 0 ? 8531 argument + length : 8532 argument > length ? 8533 length : 8534 argument; 8535 for ( ; --i >= 0; ) { 8536 matchIndexes.push( i ); 8537 } 8538 return matchIndexes; 8539 } ), 8540 8541 "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { 8542 var i = argument < 0 ? argument + length : argument; 8543 for ( ; ++i < length; ) { 8544 matchIndexes.push( i ); 8545 } 8546 return matchIndexes; 8547 } ) 8548 } 8549}; 8550 8551Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; 8552 8553// Add button/input type pseudos 8554for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { 8555 Expr.pseudos[ i ] = createInputPseudo( i ); 8556} 8557for ( i in { submit: true, reset: true } ) { 8558 Expr.pseudos[ i ] = createButtonPseudo( i ); 8559} 8560 8561// Easy API for creating new setFilters 8562function setFilters() {} 8563setFilters.prototype = Expr.filters = Expr.pseudos; 8564Expr.setFilters = new setFilters(); 8565 8566tokenize = Sizzle.tokenize = function( selector, parseOnly ) { 8567 var matched, match, tokens, type, 8568 soFar, groups, preFilters, 8569 cached = tokenCache[ selector + " " ]; 8570 8571 if ( cached ) { 8572 return parseOnly ? 0 : cached.slice( 0 ); 8573 } 8574 8575 soFar = selector; 8576 groups = []; 8577 preFilters = Expr.preFilter; 8578 8579 while ( soFar ) { 8580 8581 // Comma and first run 8582 if ( !matched || ( match = rcomma.exec( soFar ) ) ) { 8583 if ( match ) { 8584 8585 // Don't consume trailing commas as valid 8586 soFar = soFar.slice( match[ 0 ].length ) || soFar; 8587 } 8588 groups.push( ( tokens = [] ) ); 8589 } 8590 8591 matched = false; 8592 8593 // Combinators 8594 if ( ( match = rcombinators.exec( soFar ) ) ) { 8595 matched = match.shift(); 8596 tokens.push( { 8597 value: matched, 8598 8599 // Cast descendant combinators to space 8600 type: match[ 0 ].replace( rtrim, " " ) 8601 } ); 8602 soFar = soFar.slice( matched.length ); 8603 } 8604 8605 // Filters 8606 for ( type in Expr.filter ) { 8607 if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || 8608 ( match = preFilters[ type ]( match ) ) ) ) { 8609 matched = match.shift(); 8610 tokens.push( { 8611 value: matched, 8612 type: type, 8613 matches: match 8614 } ); 8615 soFar = soFar.slice( matched.length ); 8616 } 8617 } 8618 8619 if ( !matched ) { 8620 break; 8621 } 8622 } 8623 8624 // Return the length of the invalid excess 8625 // if we're just parsing 8626 // Otherwise, throw an error or return tokens 8627 return parseOnly ? 8628 soFar.length : 8629 soFar ? 8630 Sizzle.error( selector ) : 8631 8632 // Cache the tokens 8633 tokenCache( selector, groups ).slice( 0 ); 8634}; 8635 8636function toSelector( tokens ) { 8637 var i = 0, 8638 len = tokens.length, 8639 selector = ""; 8640 for ( ; i < len; i++ ) { 8641 selector += tokens[ i ].value; 8642 } 8643 return selector; 8644} 8645 8646function addCombinator( matcher, combinator, base ) { 8647 var dir = combinator.dir, 8648 skip = combinator.next, 8649 key = skip || dir, 8650 checkNonElements = base && key === "parentNode", 8651 doneName = done++; 8652 8653 return combinator.first ? 8654 8655 // Check against closest ancestor/preceding element 8656 function( elem, context, xml ) { 8657 while ( ( elem = elem[ dir ] ) ) { 8658 if ( elem.nodeType === 1 || checkNonElements ) { 8659 return matcher( elem, context, xml ); 8660 } 8661 } 8662 return false; 8663 } : 8664 8665 // Check against all ancestor/preceding elements 8666 function( elem, context, xml ) { 8667 var oldCache, uniqueCache, outerCache, 8668 newCache = [ dirruns, doneName ]; 8669 8670 // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching 8671 if ( xml ) { 8672 while ( ( elem = elem[ dir ] ) ) { 8673 if ( elem.nodeType === 1 || checkNonElements ) { 8674 if ( matcher( elem, context, xml ) ) { 8675 return true; 8676 } 8677 } 8678 } 8679 } else { 8680 while ( ( elem = elem[ dir ] ) ) { 8681 if ( elem.nodeType === 1 || checkNonElements ) { 8682 outerCache = elem[ expando ] || ( elem[ expando ] = {} ); 8683 8684 // Support: IE <9 only 8685 // Defend against cloned attroperties (jQuery gh-1709) 8686 uniqueCache = outerCache[ elem.uniqueID ] || 8687 ( outerCache[ elem.uniqueID ] = {} ); 8688 8689 if ( skip && skip === elem.nodeName.toLowerCase() ) { 8690 elem = elem[ dir ] || elem; 8691 } else if ( ( oldCache = uniqueCache[ key ] ) && 8692 oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { 8693 8694 // Assign to newCache so results back-propagate to previous elements 8695 return ( newCache[ 2 ] = oldCache[ 2 ] ); 8696 } else { 8697 8698 // Reuse newcache so results back-propagate to previous elements 8699 uniqueCache[ key ] = newCache; 8700 8701 // A match means we're done; a fail means we have to keep checking 8702 if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { 8703 return true; 8704 } 8705 } 8706 } 8707 } 8708 } 8709 return false; 8710 }; 8711} 8712 8713function elementMatcher( matchers ) { 8714 return matchers.length > 1 ? 8715 function( elem, context, xml ) { 8716 var i = matchers.length; 8717 while ( i-- ) { 8718 if ( !matchers[ i ]( elem, context, xml ) ) { 8719 return false; 8720 } 8721 } 8722 return true; 8723 } : 8724 matchers[ 0 ]; 8725} 8726 8727function multipleContexts( selector, contexts, results ) { 8728 var i = 0, 8729 len = contexts.length; 8730 for ( ; i < len; i++ ) { 8731 Sizzle( selector, contexts[ i ], results ); 8732 } 8733 return results; 8734} 8735 8736function condense( unmatched, map, filter, context, xml ) { 8737 var elem, 8738 newUnmatched = [], 8739 i = 0, 8740 len = unmatched.length, 8741 mapped = map != null; 8742 8743 for ( ; i < len; i++ ) { 8744 if ( ( elem = unmatched[ i ] ) ) { 8745 if ( !filter || filter( elem, context, xml ) ) { 8746 newUnmatched.push( elem ); 8747 if ( mapped ) { 8748 map.push( i ); 8749 } 8750 } 8751 } 8752 } 8753 8754 return newUnmatched; 8755} 8756 8757function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { 8758 if ( postFilter && !postFilter[ expando ] ) { 8759 postFilter = setMatcher( postFilter ); 8760 } 8761 if ( postFinder && !postFinder[ expando ] ) { 8762 postFinder = setMatcher( postFinder, postSelector ); 8763 } 8764 return markFunction( function( seed, results, context, xml ) { 8765 var temp, i, elem, 8766 preMap = [], 8767 postMap = [], 8768 preexisting = results.length, 8769 8770 // Get initial elements from seed or context 8771 elems = seed || multipleContexts( 8772 selector || "*", 8773 context.nodeType ? [ context ] : context, 8774 [] 8775 ), 8776 8777 // Prefilter to get matcher input, preserving a map for seed-results synchronization 8778 matcherIn = preFilter && ( seed || !selector ) ? 8779 condense( elems, preMap, preFilter, context, xml ) : 8780 elems, 8781 8782 matcherOut = matcher ? 8783 8784 // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, 8785 postFinder || ( seed ? preFilter : preexisting || postFilter ) ? 8786 8787 // ...intermediate processing is necessary 8788 [] : 8789 8790 // ...otherwise use results directly 8791 results : 8792 matcherIn; 8793 8794 // Find primary matches 8795 if ( matcher ) { 8796 matcher( matcherIn, matcherOut, context, xml ); 8797 } 8798 8799 // Apply postFilter 8800 if ( postFilter ) { 8801 temp = condense( matcherOut, postMap ); 8802 postFilter( temp, [], context, xml ); 8803 8804 // Un-match failing elements by moving them back to matcherIn 8805 i = temp.length; 8806 while ( i-- ) { 8807 if ( ( elem = temp[ i ] ) ) { 8808 matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); 8809 } 8810 } 8811 } 8812 8813 if ( seed ) { 8814 if ( postFinder || preFilter ) { 8815 if ( postFinder ) { 8816 8817 // Get the final matcherOut by condensing this intermediate into postFinder contexts 8818 temp = []; 8819 i = matcherOut.length; 8820 while ( i-- ) { 8821 if ( ( elem = matcherOut[ i ] ) ) { 8822 8823 // Restore matcherIn since elem is not yet a final match 8824 temp.push( ( matcherIn[ i ] = elem ) ); 8825 } 8826 } 8827 postFinder( null, ( matcherOut = [] ), temp, xml ); 8828 } 8829 8830 // Move matched elements from seed to results to keep them synchronized 8831 i = matcherOut.length; 8832 while ( i-- ) { 8833 if ( ( elem = matcherOut[ i ] ) && 8834 ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { 8835 8836 seed[ temp ] = !( results[ temp ] = elem ); 8837 } 8838 } 8839 } 8840 8841 // Add elements to results, through postFinder if defined 8842 } else { 8843 matcherOut = condense( 8844 matcherOut === results ? 8845 matcherOut.splice( preexisting, matcherOut.length ) : 8846 matcherOut 8847 ); 8848 if ( postFinder ) { 8849 postFinder( null, results, matcherOut, xml ); 8850 } else { 8851 push.apply( results, matcherOut ); 8852 } 8853 } 8854 } ); 8855} 8856 8857function matcherFromTokens( tokens ) { 8858 var checkContext, matcher, j, 8859 len = tokens.length, 8860 leadingRelative = Expr.relative[ tokens[ 0 ].type ], 8861 implicitRelative = leadingRelative || Expr.relative[ " " ], 8862 i = leadingRelative ? 1 : 0, 8863 8864 // The foundational matcher ensures that elements are reachable from top-level context(s) 8865 matchContext = addCombinator( function( elem ) { 8866 return elem === checkContext; 8867 }, implicitRelative, true ), 8868 matchAnyContext = addCombinator( function( elem ) { 8869 return indexOf( checkContext, elem ) > -1; 8870 }, implicitRelative, true ), 8871 matchers = [ function( elem, context, xml ) { 8872 var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( 8873 ( checkContext = context ).nodeType ? 8874 matchContext( elem, context, xml ) : 8875 matchAnyContext( elem, context, xml ) ); 8876 8877 // Avoid hanging onto element (issue #299) 8878 checkContext = null; 8879 return ret; 8880 } ]; 8881 8882 for ( ; i < len; i++ ) { 8883 if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { 8884 matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; 8885 } else { 8886 matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); 8887 8888 // Return special upon seeing a positional matcher 8889 if ( matcher[ expando ] ) { 8890 8891 // Find the next relative operator (if any) for proper handling 8892 j = ++i; 8893 for ( ; j < len; j++ ) { 8894 if ( Expr.relative[ tokens[ j ].type ] ) { 8895 break; 8896 } 8897 } 8898 return setMatcher( 8899 i > 1 && elementMatcher( matchers ), 8900 i > 1 && toSelector( 8901 8902 // If the preceding token was a descendant combinator, insert an implicit any-element `*` 8903 tokens 8904 .slice( 0, i - 1 ) 8905 .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) 8906 ).replace( rtrim, "$1" ), 8907 matcher, 8908 i < j && matcherFromTokens( tokens.slice( i, j ) ), 8909 j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), 8910 j < len && toSelector( tokens ) 8911 ); 8912 } 8913 matchers.push( matcher ); 8914 } 8915 } 8916 8917 return elementMatcher( matchers ); 8918} 8919 8920function matcherFromGroupMatchers( elementMatchers, setMatchers ) { 8921 var bySet = setMatchers.length > 0, 8922 byElement = elementMatchers.length > 0, 8923 superMatcher = function( seed, context, xml, results, outermost ) { 8924 var elem, j, matcher, 8925 matchedCount = 0, 8926 i = "0", 8927 unmatched = seed && [], 8928 setMatched = [], 8929 contextBackup = outermostContext, 8930 8931 // We must always have either seed elements or outermost context 8932 elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), 8933 8934 // Use integer dirruns iff this is the outermost matcher 8935 dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), 8936 len = elems.length; 8937 8938 if ( outermost ) { 8939 8940 // Support: IE 11+, Edge 17 - 18+ 8941 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 8942 // two documents; shallow comparisons work. 8943 // eslint-disable-next-line eqeqeq 8944 outermostContext = context == document || context || outermost; 8945 } 8946 8947 // Add elements passing elementMatchers directly to results 8948 // Support: IE<9, Safari 8949 // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id 8950 for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { 8951 if ( byElement && elem ) { 8952 j = 0; 8953 8954 // Support: IE 11+, Edge 17 - 18+ 8955 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 8956 // two documents; shallow comparisons work. 8957 // eslint-disable-next-line eqeqeq 8958 if ( !context && elem.ownerDocument != document ) { 8959 setDocument( elem ); 8960 xml = !documentIsHTML; 8961 } 8962 while ( ( matcher = elementMatchers[ j++ ] ) ) { 8963 if ( matcher( elem, context || document, xml ) ) { 8964 results.push( elem ); 8965 break; 8966 } 8967 } 8968 if ( outermost ) { 8969 dirruns = dirrunsUnique; 8970 } 8971 } 8972 8973 // Track unmatched elements for set filters 8974 if ( bySet ) { 8975 8976 // They will have gone through all possible matchers 8977 if ( ( elem = !matcher && elem ) ) { 8978 matchedCount--; 8979 } 8980 8981 // Lengthen the array for every element, matched or not 8982 if ( seed ) { 8983 unmatched.push( elem ); 8984 } 8985 } 8986 } 8987 8988 // `i` is now the count of elements visited above, and adding it to `matchedCount` 8989 // makes the latter nonnegative. 8990 matchedCount += i; 8991 8992 // Apply set filters to unmatched elements 8993 // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` 8994 // equals `i`), unless we didn't visit _any_ elements in the above loop because we have 8995 // no element matchers and no seed. 8996 // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that 8997 // case, which will result in a "00" `matchedCount` that differs from `i` but is also 8998 // numerically zero. 8999 if ( bySet && i !== matchedCount ) { 9000 j = 0; 9001 while ( ( matcher = setMatchers[ j++ ] ) ) { 9002 matcher( unmatched, setMatched, context, xml ); 9003 } 9004 9005 if ( seed ) { 9006 9007 // Reintegrate element matches to eliminate the need for sorting 9008 if ( matchedCount > 0 ) { 9009 while ( i-- ) { 9010 if ( !( unmatched[ i ] || setMatched[ i ] ) ) { 9011 setMatched[ i ] = pop.call( results ); 9012 } 9013 } 9014 } 9015 9016 // Discard index placeholder values to get only actual matches 9017 setMatched = condense( setMatched ); 9018 } 9019 9020 // Add matches to results 9021 push.apply( results, setMatched ); 9022 9023 // Seedless set matches succeeding multiple successful matchers stipulate sorting 9024 if ( outermost && !seed && setMatched.length > 0 && 9025 ( matchedCount + setMatchers.length ) > 1 ) { 9026 9027 Sizzle.uniqueSort( results ); 9028 } 9029 } 9030 9031 // Override manipulation of globals by nested matchers 9032 if ( outermost ) { 9033 dirruns = dirrunsUnique; 9034 outermostContext = contextBackup; 9035 } 9036 9037 return unmatched; 9038 }; 9039 9040 return bySet ? 9041 markFunction( superMatcher ) : 9042 superMatcher; 9043} 9044 9045compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { 9046 var i, 9047 setMatchers = [], 9048 elementMatchers = [], 9049 cached = compilerCache[ selector + " " ]; 9050 9051 if ( !cached ) { 9052 9053 // Generate a function of recursive functions that can be used to check each element 9054 if ( !match ) { 9055 match = tokenize( selector ); 9056 } 9057 i = match.length; 9058 while ( i-- ) { 9059 cached = matcherFromTokens( match[ i ] ); 9060 if ( cached[ expando ] ) { 9061 setMatchers.push( cached ); 9062 } else { 9063 elementMatchers.push( cached ); 9064 } 9065 } 9066 9067 // Cache the compiled function 9068 cached = compilerCache( 9069 selector, 9070 matcherFromGroupMatchers( elementMatchers, setMatchers ) 9071 ); 9072 9073 // Save selector and tokenization 9074 cached.selector = selector; 9075 } 9076 return cached; 9077}; 9078 9079/** 9080 * A low-level selection function that works with Sizzle's compiled 9081 * selector functions 9082 * @param {String|Function} selector A selector or a pre-compiled 9083 * selector function built with Sizzle.compile 9084 * @param {Element} context 9085 * @param {Array} [results] 9086 * @param {Array} [seed] A set of elements to match against 9087 */ 9088select = Sizzle.select = function( selector, context, results, seed ) { 9089 var i, tokens, token, type, find, 9090 compiled = typeof selector === "function" && selector, 9091 match = !seed && tokenize( ( selector = compiled.selector || selector ) ); 9092 9093 results = results || []; 9094 9095 // Try to minimize operations if there is only one selector in the list and no seed 9096 // (the latter of which guarantees us context) 9097 if ( match.length === 1 ) { 9098 9099 // Reduce context if the leading compound selector is an ID 9100 tokens = match[ 0 ] = match[ 0 ].slice( 0 ); 9101 if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && 9102 context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { 9103 9104 context = ( Expr.find[ "ID" ]( token.matches[ 0 ] 9105 .replace( runescape, funescape ), context ) || [] )[ 0 ]; 9106 if ( !context ) { 9107 return results; 9108 9109 // Precompiled matchers will still verify ancestry, so step up a level 9110 } else if ( compiled ) { 9111 context = context.parentNode; 9112 } 9113 9114 selector = selector.slice( tokens.shift().value.length ); 9115 } 9116 9117 // Fetch a seed set for right-to-left matching 9118 i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; 9119 while ( i-- ) { 9120 token = tokens[ i ]; 9121 9122 // Abort if we hit a combinator 9123 if ( Expr.relative[ ( type = token.type ) ] ) { 9124 break; 9125 } 9126 if ( ( find = Expr.find[ type ] ) ) { 9127 9128 // Search, expanding context for leading sibling combinators 9129 if ( ( seed = find( 9130 token.matches[ 0 ].replace( runescape, funescape ), 9131 rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || 9132 context 9133 ) ) ) { 9134 9135 // If seed is empty or no tokens remain, we can return early 9136 tokens.splice( i, 1 ); 9137 selector = seed.length && toSelector( tokens ); 9138 if ( !selector ) { 9139 push.apply( results, seed ); 9140 return results; 9141 } 9142 9143 break; 9144 } 9145 } 9146 } 9147 } 9148 9149 // Compile and execute a filtering function if one is not provided 9150 // Provide `match` to avoid retokenization if we modified the selector above 9151 ( compiled || compile( selector, match ) )( 9152 seed, 9153 context, 9154 !documentIsHTML, 9155 results, 9156 !context || rsibling.test( selector ) && testContext( context.parentNode ) || context 9157 ); 9158 return results; 9159}; 9160 9161// One-time assignments 9162 9163// Sort stability 9164support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; 9165 9166// Support: Chrome 14-35+ 9167// Always assume duplicates if they aren't passed to the comparison function 9168support.detectDuplicates = !!hasDuplicate; 9169 9170// Initialize against the default document 9171setDocument(); 9172 9173// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) 9174// Detached nodes confoundingly follow *each other* 9175support.sortDetached = assert( function( el ) { 9176 9177 // Should return 1, but returns 4 (following) 9178 return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; 9179} ); 9180 9181// Support: IE<8 9182// Prevent attribute/property "interpolation" 9183// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx 9184if ( !assert( function( el ) { 9185 el.innerHTML = "<a href='#'></a>"; 9186 return el.firstChild.getAttribute( "href" ) === "#"; 9187} ) ) { 9188 addHandle( "type|href|height|width", function( elem, name, isXML ) { 9189 if ( !isXML ) { 9190 return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); 9191 } 9192 } ); 9193} 9194 9195// Support: IE<9 9196// Use defaultValue in place of getAttribute("value") 9197if ( !support.attributes || !assert( function( el ) { 9198 el.innerHTML = "<input/>"; 9199 el.firstChild.setAttribute( "value", "" ); 9200 return el.firstChild.getAttribute( "value" ) === ""; 9201} ) ) { 9202 addHandle( "value", function( elem, _name, isXML ) { 9203 if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { 9204 return elem.defaultValue; 9205 } 9206 } ); 9207} 9208 9209// Support: IE<9 9210// Use getAttributeNode to fetch booleans when getAttribute lies 9211if ( !assert( function( el ) { 9212 return el.getAttribute( "disabled" ) == null; 9213} ) ) { 9214 addHandle( booleans, function( elem, name, isXML ) { 9215 var val; 9216 if ( !isXML ) { 9217 return elem[ name ] === true ? name.toLowerCase() : 9218 ( val = elem.getAttributeNode( name ) ) && val.specified ? 9219 val.value : 9220 null; 9221 } 9222 } ); 9223} 9224 9225return Sizzle; 9226 9227} )( window ); 9228 9229 9230 9231jQuery.find = Sizzle; 9232jQuery.expr = Sizzle.selectors; 9233 9234// Deprecated 9235jQuery.expr[ ":" ] = jQuery.expr.pseudos; 9236jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; 9237jQuery.text = Sizzle.getText; 9238jQuery.isXMLDoc = Sizzle.isXML; 9239jQuery.contains = Sizzle.contains; 9240jQuery.escapeSelector = Sizzle.escape; 9241 9242 9243 9244 9245var dir = function( elem, dir, until ) { 9246 var matched = [], 9247 truncate = until !== undefined; 9248 9249 while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { 9250 if ( elem.nodeType === 1 ) { 9251 if ( truncate && jQuery( elem ).is( until ) ) { 9252 break; 9253 } 9254 matched.push( elem ); 9255 } 9256 } 9257 return matched; 9258}; 9259 9260 9261var siblings = function( n, elem ) { 9262 var matched = []; 9263 9264 for ( ; n; n = n.nextSibling ) { 9265 if ( n.nodeType === 1 && n !== elem ) { 9266 matched.push( n ); 9267 } 9268 } 9269 9270 return matched; 9271}; 9272 9273 9274var rneedsContext = jQuery.expr.match.needsContext; 9275 9276 9277 9278function nodeName( elem, name ) { 9279 9280 return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); 9281 9282} 9283var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); 9284 9285 9286 9287// Implement the identical functionality for filter and not 9288function winnow( elements, qualifier, not ) { 9289 if ( isFunction( qualifier ) ) { 9290 return jQuery.grep( elements, function( elem, i ) { 9291 return !!qualifier.call( elem, i, elem ) !== not; 9292 } ); 9293 } 9294 9295 // Single element 9296 if ( qualifier.nodeType ) { 9297 return jQuery.grep( elements, function( elem ) { 9298 return ( elem === qualifier ) !== not; 9299 } ); 9300 } 9301 9302 // Arraylike of elements (jQuery, arguments, Array) 9303 if ( typeof qualifier !== "string" ) { 9304 return jQuery.grep( elements, function( elem ) { 9305 return ( indexOf.call( qualifier, elem ) > -1 ) !== not; 9306 } ); 9307 } 9308 9309 // Filtered directly for both simple and complex selectors 9310 return jQuery.filter( qualifier, elements, not ); 9311} 9312 9313jQuery.filter = function( expr, elems, not ) { 9314 var elem = elems[ 0 ]; 9315 9316 if ( not ) { 9317 expr = ":not(" + expr + ")"; 9318 } 9319 9320 if ( elems.length === 1 && elem.nodeType === 1 ) { 9321 return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; 9322 } 9323 9324 return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { 9325 return elem.nodeType === 1; 9326 } ) ); 9327}; 9328 9329jQuery.fn.extend( { 9330 find: function( selector ) { 9331 var i, ret, 9332 len = this.length, 9333 self = this; 9334 9335 if ( typeof selector !== "string" ) { 9336 return this.pushStack( jQuery( selector ).filter( function() { 9337 for ( i = 0; i < len; i++ ) { 9338 if ( jQuery.contains( self[ i ], this ) ) { 9339 return true; 9340 } 9341 } 9342 } ) ); 9343 } 9344 9345 ret = this.pushStack( [] ); 9346 9347 for ( i = 0; i < len; i++ ) { 9348 jQuery.find( selector, self[ i ], ret ); 9349 } 9350 9351 return len > 1 ? jQuery.uniqueSort( ret ) : ret; 9352 }, 9353 filter: function( selector ) { 9354 return this.pushStack( winnow( this, selector || [], false ) ); 9355 }, 9356 not: function( selector ) { 9357 return this.pushStack( winnow( this, selector || [], true ) ); 9358 }, 9359 is: function( selector ) { 9360 return !!winnow( 9361 this, 9362 9363 // If this is a positional/relative selector, check membership in the returned set 9364 // so $("p:first").is("p:last") won't return true for a doc with two "p". 9365 typeof selector === "string" && rneedsContext.test( selector ) ? 9366 jQuery( selector ) : 9367 selector || [], 9368 false 9369 ).length; 9370 } 9371} ); 9372 9373 9374// Initialize a jQuery object 9375 9376 9377// A central reference to the root jQuery(document) 9378var rootjQuery, 9379 9380 // A simple way to check for HTML strings 9381 // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) 9382 // Strict HTML recognition (#11290: must start with <) 9383 // Shortcut simple #id case for speed 9384 rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, 9385 9386 init = jQuery.fn.init = function( selector, context, root ) { 9387 var match, elem; 9388 9389 // HANDLE: $(""), $(null), $(undefined), $(false) 9390 if ( !selector ) { 9391 return this; 9392 } 9393 9394 // Method init() accepts an alternate rootjQuery 9395 // so migrate can support jQuery.sub (gh-2101) 9396 root = root || rootjQuery; 9397 9398 // Handle HTML strings 9399 if ( typeof selector === "string" ) { 9400 if ( selector[ 0 ] === "<" && 9401 selector[ selector.length - 1 ] === ">" && 9402 selector.length >= 3 ) { 9403 9404 // Assume that strings that start and end with <> are HTML and skip the regex check 9405 match = [ null, selector, null ]; 9406 9407 } else { 9408 match = rquickExpr.exec( selector ); 9409 } 9410 9411 // Match html or make sure no context is specified for #id 9412 if ( match && ( match[ 1 ] || !context ) ) { 9413 9414 // HANDLE: $(html) -> $(array) 9415 if ( match[ 1 ] ) { 9416 context = context instanceof jQuery ? context[ 0 ] : context; 9417 9418 // Option to run scripts is true for back-compat 9419 // Intentionally let the error be thrown if parseHTML is not present 9420 jQuery.merge( this, jQuery.parseHTML( 9421 match[ 1 ], 9422 context && context.nodeType ? context.ownerDocument || context : document, 9423 true 9424 ) ); 9425 9426 // HANDLE: $(html, props) 9427 if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { 9428 for ( match in context ) { 9429 9430 // Properties of context are called as methods if possible 9431 if ( isFunction( this[ match ] ) ) { 9432 this[ match ]( context[ match ] ); 9433 9434 // ...and otherwise set as attributes 9435 } else { 9436 this.attr( match, context[ match ] ); 9437 } 9438 } 9439 } 9440 9441 return this; 9442 9443 // HANDLE: $(#id) 9444 } else { 9445 elem = document.getElementById( match[ 2 ] ); 9446 9447 if ( elem ) { 9448 9449 // Inject the element directly into the jQuery object 9450 this[ 0 ] = elem; 9451 this.length = 1; 9452 } 9453 return this; 9454 } 9455 9456 // HANDLE: $(expr, $(...)) 9457 } else if ( !context || context.jquery ) { 9458 return ( context || root ).find( selector ); 9459 9460 // HANDLE: $(expr, context) 9461 // (which is just equivalent to: $(context).find(expr) 9462 } else { 9463 return this.constructor( context ).find( selector ); 9464 } 9465 9466 // HANDLE: $(DOMElement) 9467 } else if ( selector.nodeType ) { 9468 this[ 0 ] = selector; 9469 this.length = 1; 9470 return this; 9471 9472 // HANDLE: $(function) 9473 // Shortcut for document ready 9474 } else if ( isFunction( selector ) ) { 9475 return root.ready !== undefined ? 9476 root.ready( selector ) : 9477 9478 // Execute immediately if ready is not present 9479 selector( jQuery ); 9480 } 9481 9482 return jQuery.makeArray( selector, this ); 9483 }; 9484 9485// Give the init function the jQuery prototype for later instantiation 9486init.prototype = jQuery.fn; 9487 9488// Initialize central reference 9489rootjQuery = jQuery( document ); 9490 9491 9492var rparentsprev = /^(?:parents|prev(?:Until|All))/, 9493 9494 // Methods guaranteed to produce a unique set when starting from a unique set 9495 guaranteedUnique = { 9496 children: true, 9497 contents: true, 9498 next: true, 9499 prev: true 9500 }; 9501 9502jQuery.fn.extend( { 9503 has: function( target ) { 9504 var targets = jQuery( target, this ), 9505 l = targets.length; 9506 9507 return this.filter( function() { 9508 var i = 0; 9509 for ( ; i < l; i++ ) { 9510 if ( jQuery.contains( this, targets[ i ] ) ) { 9511 return true; 9512 } 9513 } 9514 } ); 9515 }, 9516 9517 closest: function( selectors, context ) { 9518 var cur, 9519 i = 0, 9520 l = this.length, 9521 matched = [], 9522 targets = typeof selectors !== "string" && jQuery( selectors ); 9523 9524 // Positional selectors never match, since there's no _selection_ context 9525 if ( !rneedsContext.test( selectors ) ) { 9526 for ( ; i < l; i++ ) { 9527 for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { 9528 9529 // Always skip document fragments 9530 if ( cur.nodeType < 11 && ( targets ? 9531 targets.index( cur ) > -1 : 9532 9533 // Don't pass non-elements to Sizzle 9534 cur.nodeType === 1 && 9535 jQuery.find.matchesSelector( cur, selectors ) ) ) { 9536 9537 matched.push( cur ); 9538 break; 9539 } 9540 } 9541 } 9542 } 9543 9544 return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); 9545 }, 9546 9547 // Determine the position of an element within the set 9548 index: function( elem ) { 9549 9550 // No argument, return index in parent 9551 if ( !elem ) { 9552 return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; 9553 } 9554 9555 // Index in selector 9556 if ( typeof elem === "string" ) { 9557 return indexOf.call( jQuery( elem ), this[ 0 ] ); 9558 } 9559 9560 // Locate the position of the desired element 9561 return indexOf.call( this, 9562 9563 // If it receives a jQuery object, the first element is used 9564 elem.jquery ? elem[ 0 ] : elem 9565 ); 9566 }, 9567 9568 add: function( selector, context ) { 9569 return this.pushStack( 9570 jQuery.uniqueSort( 9571 jQuery.merge( this.get(), jQuery( selector, context ) ) 9572 ) 9573 ); 9574 }, 9575 9576 addBack: function( selector ) { 9577 return this.add( selector == null ? 9578 this.prevObject : this.prevObject.filter( selector ) 9579 ); 9580 } 9581} ); 9582 9583function sibling( cur, dir ) { 9584 while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} 9585 return cur; 9586} 9587 9588jQuery.each( { 9589 parent: function( elem ) { 9590 var parent = elem.parentNode; 9591 return parent && parent.nodeType !== 11 ? parent : null; 9592 }, 9593 parents: function( elem ) { 9594 return dir( elem, "parentNode" ); 9595 }, 9596 parentsUntil: function( elem, _i, until ) { 9597 return dir( elem, "parentNode", until ); 9598 }, 9599 next: function( elem ) { 9600 return sibling( elem, "nextSibling" ); 9601 }, 9602 prev: function( elem ) { 9603 return sibling( elem, "previousSibling" ); 9604 }, 9605 nextAll: function( elem ) { 9606 return dir( elem, "nextSibling" ); 9607 }, 9608 prevAll: function( elem ) { 9609 return dir( elem, "previousSibling" ); 9610 }, 9611 nextUntil: function( elem, _i, until ) { 9612 return dir( elem, "nextSibling", until ); 9613 }, 9614 prevUntil: function( elem, _i, until ) { 9615 return dir( elem, "previousSibling", until ); 9616 }, 9617 siblings: function( elem ) { 9618 return siblings( ( elem.parentNode || {} ).firstChild, elem ); 9619 }, 9620 children: function( elem ) { 9621 return siblings( elem.firstChild ); 9622 }, 9623 contents: function( elem ) { 9624 if ( elem.contentDocument != null && 9625 9626 // Support: IE 11+ 9627 // <object> elements with no `data` attribute has an object 9628 // `contentDocument` with a `null` prototype. 9629 getProto( elem.contentDocument ) ) { 9630 9631 return elem.contentDocument; 9632 } 9633 9634 // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only 9635 // Treat the template element as a regular one in browsers that 9636 // don't support it. 9637 if ( nodeName( elem, "template" ) ) { 9638 elem = elem.content || elem; 9639 } 9640 9641 return jQuery.merge( [], elem.childNodes ); 9642 } 9643}, function( name, fn ) { 9644 jQuery.fn[ name ] = function( until, selector ) { 9645 var matched = jQuery.map( this, fn, until ); 9646 9647 if ( name.slice( -5 ) !== "Until" ) { 9648 selector = until; 9649 } 9650 9651 if ( selector && typeof selector === "string" ) { 9652 matched = jQuery.filter( selector, matched ); 9653 } 9654 9655 if ( this.length > 1 ) { 9656 9657 // Remove duplicates 9658 if ( !guaranteedUnique[ name ] ) { 9659 jQuery.uniqueSort( matched ); 9660 } 9661 9662 // Reverse order for parents* and prev-derivatives 9663 if ( rparentsprev.test( name ) ) { 9664 matched.reverse(); 9665 } 9666 } 9667 9668 return this.pushStack( matched ); 9669 }; 9670} ); 9671var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); 9672 9673 9674 9675// Convert String-formatted options into Object-formatted ones 9676function createOptions( options ) { 9677 var object = {}; 9678 jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { 9679 object[ flag ] = true; 9680 } ); 9681 return object; 9682} 9683 9684/* 9685 * Create a callback list using the following parameters: 9686 * 9687 * options: an optional list of space-separated options that will change how 9688 * the callback list behaves or a more traditional option object 9689 * 9690 * By default a callback list will act like an event callback list and can be 9691 * "fired" multiple times. 9692 * 9693 * Possible options: 9694 * 9695 * once: will ensure the callback list can only be fired once (like a Deferred) 9696 * 9697 * memory: will keep track of previous values and will call any callback added 9698 * after the list has been fired right away with the latest "memorized" 9699 * values (like a Deferred) 9700 * 9701 * unique: will ensure a callback can only be added once (no duplicate in the list) 9702 * 9703 * stopOnFalse: interrupt callings when a callback returns false 9704 * 9705 */ 9706jQuery.Callbacks = function( options ) { 9707 9708 // Convert options from String-formatted to Object-formatted if needed 9709 // (we check in cache first) 9710 options = typeof options === "string" ? 9711 createOptions( options ) : 9712 jQuery.extend( {}, options ); 9713 9714 var // Flag to know if list is currently firing 9715 firing, 9716 9717 // Last fire value for non-forgettable lists 9718 memory, 9719 9720 // Flag to know if list was already fired 9721 fired, 9722 9723 // Flag to prevent firing 9724 locked, 9725 9726 // Actual callback list 9727 list = [], 9728 9729 // Queue of execution data for repeatable lists 9730 queue = [], 9731 9732 // Index of currently firing callback (modified by add/remove as needed) 9733 firingIndex = -1, 9734 9735 // Fire callbacks 9736 fire = function() { 9737 9738 // Enforce single-firing 9739 locked = locked || options.once; 9740 9741 // Execute callbacks for all pending executions, 9742 // respecting firingIndex overrides and runtime changes 9743 fired = firing = true; 9744 for ( ; queue.length; firingIndex = -1 ) { 9745 memory = queue.shift(); 9746 while ( ++firingIndex < list.length ) { 9747 9748 // Run callback and check for early termination 9749 if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && 9750 options.stopOnFalse ) { 9751 9752 // Jump to end and forget the data so .add doesn't re-fire 9753 firingIndex = list.length; 9754 memory = false; 9755 } 9756 } 9757 } 9758 9759 // Forget the data if we're done with it 9760 if ( !options.memory ) { 9761 memory = false; 9762 } 9763 9764 firing = false; 9765 9766 // Clean up if we're done firing for good 9767 if ( locked ) { 9768 9769 // Keep an empty list if we have data for future add calls 9770 if ( memory ) { 9771 list = []; 9772 9773 // Otherwise, this object is spent 9774 } else { 9775 list = ""; 9776 } 9777 } 9778 }, 9779 9780 // Actual Callbacks object 9781 self = { 9782 9783 // Add a callback or a collection of callbacks to the list 9784 add: function() { 9785 if ( list ) { 9786 9787 // If we have memory from a past run, we should fire after adding 9788 if ( memory && !firing ) { 9789 firingIndex = list.length - 1; 9790 queue.push( memory ); 9791 } 9792 9793 ( function add( args ) { 9794 jQuery.each( args, function( _, arg ) { 9795 if ( isFunction( arg ) ) { 9796 if ( !options.unique || !self.has( arg ) ) { 9797 list.push( arg ); 9798 } 9799 } else if ( arg && arg.length && toType( arg ) !== "string" ) { 9800 9801 // Inspect recursively 9802 add( arg ); 9803 } 9804 } ); 9805 } )( arguments ); 9806 9807 if ( memory && !firing ) { 9808 fire(); 9809 } 9810 } 9811 return this; 9812 }, 9813 9814 // Remove a callback from the list 9815 remove: function() { 9816 jQuery.each( arguments, function( _, arg ) { 9817 var index; 9818 while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { 9819 list.splice( index, 1 ); 9820 9821 // Handle firing indexes 9822 if ( index <= firingIndex ) { 9823 firingIndex--; 9824 } 9825 } 9826 } ); 9827 return this; 9828 }, 9829 9830 // Check if a given callback is in the list. 9831 // If no argument is given, return whether or not list has callbacks attached. 9832 has: function( fn ) { 9833 return fn ? 9834 jQuery.inArray( fn, list ) > -1 : 9835 list.length > 0; 9836 }, 9837 9838 // Remove all callbacks from the list 9839 empty: function() { 9840 if ( list ) { 9841 list = []; 9842 } 9843 return this; 9844 }, 9845 9846 // Disable .fire and .add 9847 // Abort any current/pending executions 9848 // Clear all callbacks and values 9849 disable: function() { 9850 locked = queue = []; 9851 list = memory = ""; 9852 return this; 9853 }, 9854 disabled: function() { 9855 return !list; 9856 }, 9857 9858 // Disable .fire 9859 // Also disable .add unless we have memory (since it would have no effect) 9860 // Abort any pending executions 9861 lock: function() { 9862 locked = queue = []; 9863 if ( !memory && !firing ) { 9864 list = memory = ""; 9865 } 9866 return this; 9867 }, 9868 locked: function() { 9869 return !!locked; 9870 }, 9871 9872 // Call all callbacks with the given context and arguments 9873 fireWith: function( context, args ) { 9874 if ( !locked ) { 9875 args = args || []; 9876 args = [ context, args.slice ? args.slice() : args ]; 9877 queue.push( args ); 9878 if ( !firing ) { 9879 fire(); 9880 } 9881 } 9882 return this; 9883 }, 9884 9885 // Call all the callbacks with the given arguments 9886 fire: function() { 9887 self.fireWith( this, arguments ); 9888 return this; 9889 }, 9890 9891 // To know if the callbacks have already been called at least once 9892 fired: function() { 9893 return !!fired; 9894 } 9895 }; 9896 9897 return self; 9898}; 9899 9900 9901function Identity( v ) { 9902 return v; 9903} 9904function Thrower( ex ) { 9905 throw ex; 9906} 9907 9908function adoptValue( value, resolve, reject, noValue ) { 9909 var method; 9910 9911 try { 9912 9913 // Check for promise aspect first to privilege synchronous behavior 9914 if ( value && isFunction( ( method = value.promise ) ) ) { 9915 method.call( value ).done( resolve ).fail( reject ); 9916 9917 // Other thenables 9918 } else if ( value && isFunction( ( method = value.then ) ) ) { 9919 method.call( value, resolve, reject ); 9920 9921 // Other non-thenables 9922 } else { 9923 9924 // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: 9925 // * false: [ value ].slice( 0 ) => resolve( value ) 9926 // * true: [ value ].slice( 1 ) => resolve() 9927 resolve.apply( undefined, [ value ].slice( noValue ) ); 9928 } 9929 9930 // For Promises/A+, convert exceptions into rejections 9931 // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in 9932 // Deferred#then to conditionally suppress rejection. 9933 } catch ( value ) { 9934 9935 // Support: Android 4.0 only 9936 // Strict mode functions invoked without .call/.apply get global-object context 9937 reject.apply( undefined, [ value ] ); 9938 } 9939} 9940 9941jQuery.extend( { 9942 9943 Deferred: function( func ) { 9944 var tuples = [ 9945 9946 // action, add listener, callbacks, 9947 // ... .then handlers, argument index, [final state] 9948 [ "notify", "progress", jQuery.Callbacks( "memory" ), 9949 jQuery.Callbacks( "memory" ), 2 ], 9950 [ "resolve", "done", jQuery.Callbacks( "once memory" ), 9951 jQuery.Callbacks( "once memory" ), 0, "resolved" ], 9952 [ "reject", "fail", jQuery.Callbacks( "once memory" ), 9953 jQuery.Callbacks( "once memory" ), 1, "rejected" ] 9954 ], 9955 state = "pending", 9956 promise = { 9957 state: function() { 9958 return state; 9959 }, 9960 always: function() { 9961 deferred.done( arguments ).fail( arguments ); 9962 return this; 9963 }, 9964 "catch": function( fn ) { 9965 return promise.then( null, fn ); 9966 }, 9967 9968 // Keep pipe for back-compat 9969 pipe: function( /* fnDone, fnFail, fnProgress */ ) { 9970 var fns = arguments; 9971 9972 return jQuery.Deferred( function( newDefer ) { 9973 jQuery.each( tuples, function( _i, tuple ) { 9974 9975 // Map tuples (progress, done, fail) to arguments (done, fail, progress) 9976 var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; 9977 9978 // deferred.progress(function() { bind to newDefer or newDefer.notify }) 9979 // deferred.done(function() { bind to newDefer or newDefer.resolve }) 9980 // deferred.fail(function() { bind to newDefer or newDefer.reject }) 9981 deferred[ tuple[ 1 ] ]( function() { 9982 var returned = fn && fn.apply( this, arguments ); 9983 if ( returned && isFunction( returned.promise ) ) { 9984 returned.promise() 9985 .progress( newDefer.notify ) 9986 .done( newDefer.resolve ) 9987 .fail( newDefer.reject ); 9988 } else { 9989 newDefer[ tuple[ 0 ] + "With" ]( 9990 this, 9991 fn ? [ returned ] : arguments 9992 ); 9993 } 9994 } ); 9995 } ); 9996 fns = null; 9997 } ).promise(); 9998 }, 9999 then: function( onFulfilled, onRejected, onProgress ) { 10000 var maxDepth = 0; 10001 function resolve( depth, deferred, handler, special ) { 10002 return function() { 10003 var that = this, 10004 args = arguments, 10005 mightThrow = function() { 10006 var returned, then; 10007 10008 // Support: Promises/A+ section 2.3.3.3.3 10009 // https://promisesaplus.com/#point-59 10010 // Ignore double-resolution attempts 10011 if ( depth < maxDepth ) { 10012 return; 10013 } 10014 10015 returned = handler.apply( that, args ); 10016 10017 // Support: Promises/A+ section 2.3.1 10018 // https://promisesaplus.com/#point-48 10019 if ( returned === deferred.promise() ) { 10020 throw new TypeError( "Thenable self-resolution" ); 10021 } 10022 10023 // Support: Promises/A+ sections 2.3.3.1, 3.5 10024 // https://promisesaplus.com/#point-54 10025 // https://promisesaplus.com/#point-75 10026 // Retrieve `then` only once 10027 then = returned && 10028 10029 // Support: Promises/A+ section 2.3.4 10030 // https://promisesaplus.com/#point-64 10031 // Only check objects and functions for thenability 10032 ( typeof returned === "object" || 10033 typeof returned === "function" ) && 10034 returned.then; 10035 10036 // Handle a returned thenable 10037 if ( isFunction( then ) ) { 10038 10039 // Special processors (notify) just wait for resolution 10040 if ( special ) { 10041 then.call( 10042 returned, 10043 resolve( maxDepth, deferred, Identity, special ), 10044 resolve( maxDepth, deferred, Thrower, special ) 10045 ); 10046 10047 // Normal processors (resolve) also hook into progress 10048 } else { 10049 10050 // ...and disregard older resolution values 10051 maxDepth++; 10052 10053 then.call( 10054 returned, 10055 resolve( maxDepth, deferred, Identity, special ), 10056 resolve( maxDepth, deferred, Thrower, special ), 10057 resolve( maxDepth, deferred, Identity, 10058 deferred.notifyWith ) 10059 ); 10060 } 10061 10062 // Handle all other returned values 10063 } else { 10064 10065 // Only substitute handlers pass on context 10066 // and multiple values (non-spec behavior) 10067 if ( handler !== Identity ) { 10068 that = undefined; 10069 args = [ returned ]; 10070 } 10071 10072 // Process the value(s) 10073 // Default process is resolve 10074 ( special || deferred.resolveWith )( that, args ); 10075 } 10076 }, 10077 10078 // Only normal processors (resolve) catch and reject exceptions 10079 process = special ? 10080 mightThrow : 10081 function() { 10082 try { 10083 mightThrow(); 10084 } catch ( e ) { 10085 10086 if ( jQuery.Deferred.exceptionHook ) { 10087 jQuery.Deferred.exceptionHook( e, 10088 process.stackTrace ); 10089 } 10090 10091 // Support: Promises/A+ section 2.3.3.3.4.1 10092 // https://promisesaplus.com/#point-61 10093 // Ignore post-resolution exceptions 10094 if ( depth + 1 >= maxDepth ) { 10095 10096 // Only substitute handlers pass on context 10097 // and multiple values (non-spec behavior) 10098 if ( handler !== Thrower ) { 10099 that = undefined; 10100 args = [ e ]; 10101 } 10102 10103 deferred.rejectWith( that, args ); 10104 } 10105 } 10106 }; 10107 10108 // Support: Promises/A+ section 2.3.3.3.1 10109 // https://promisesaplus.com/#point-57 10110 // Re-resolve promises immediately to dodge false rejection from 10111 // subsequent errors 10112 if ( depth ) { 10113 process(); 10114 } else { 10115 10116 // Call an optional hook to record the stack, in case of exception 10117 // since it's otherwise lost when execution goes async 10118 if ( jQuery.Deferred.getStackHook ) { 10119 process.stackTrace = jQuery.Deferred.getStackHook(); 10120 } 10121 window.setTimeout( process ); 10122 } 10123 }; 10124 } 10125 10126 return jQuery.Deferred( function( newDefer ) { 10127 10128 // progress_handlers.add( ... ) 10129 tuples[ 0 ][ 3 ].add( 10130 resolve( 10131 0, 10132 newDefer, 10133 isFunction( onProgress ) ? 10134 onProgress : 10135 Identity, 10136 newDefer.notifyWith 10137 ) 10138 ); 10139 10140 // fulfilled_handlers.add( ... ) 10141 tuples[ 1 ][ 3 ].add( 10142 resolve( 10143 0, 10144 newDefer, 10145 isFunction( onFulfilled ) ? 10146 onFulfilled : 10147 Identity 10148 ) 10149 ); 10150 10151 // rejected_handlers.add( ... ) 10152 tuples[ 2 ][ 3 ].add( 10153 resolve( 10154 0, 10155 newDefer, 10156 isFunction( onRejected ) ? 10157 onRejected : 10158 Thrower 10159 ) 10160 ); 10161 } ).promise(); 10162 }, 10163 10164 // Get a promise for this deferred 10165 // If obj is provided, the promise aspect is added to the object 10166 promise: function( obj ) { 10167 return obj != null ? jQuery.extend( obj, promise ) : promise; 10168 } 10169 }, 10170 deferred = {}; 10171 10172 // Add list-specific methods 10173 jQuery.each( tuples, function( i, tuple ) { 10174 var list = tuple[ 2 ], 10175 stateString = tuple[ 5 ]; 10176 10177 // promise.progress = list.add 10178 // promise.done = list.add 10179 // promise.fail = list.add 10180 promise[ tuple[ 1 ] ] = list.add; 10181 10182 // Handle state 10183 if ( stateString ) { 10184 list.add( 10185 function() { 10186 10187 // state = "resolved" (i.e., fulfilled) 10188 // state = "rejected" 10189 state = stateString; 10190 }, 10191 10192 // rejected_callbacks.disable 10193 // fulfilled_callbacks.disable 10194 tuples[ 3 - i ][ 2 ].disable, 10195 10196 // rejected_handlers.disable 10197 // fulfilled_handlers.disable 10198 tuples[ 3 - i ][ 3 ].disable, 10199 10200 // progress_callbacks.lock 10201 tuples[ 0 ][ 2 ].lock, 10202 10203 // progress_handlers.lock 10204 tuples[ 0 ][ 3 ].lock 10205 ); 10206 } 10207 10208 // progress_handlers.fire 10209 // fulfilled_handlers.fire 10210 // rejected_handlers.fire 10211 list.add( tuple[ 3 ].fire ); 10212 10213 // deferred.notify = function() { deferred.notifyWith(...) } 10214 // deferred.resolve = function() { deferred.resolveWith(...) } 10215 // deferred.reject = function() { deferred.rejectWith(...) } 10216 deferred[ tuple[ 0 ] ] = function() { 10217 deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); 10218 return this; 10219 }; 10220 10221 // deferred.notifyWith = list.fireWith 10222 // deferred.resolveWith = list.fireWith 10223 // deferred.rejectWith = list.fireWith 10224 deferred[ tuple[ 0 ] + "With" ] = list.fireWith; 10225 } ); 10226 10227 // Make the deferred a promise 10228 promise.promise( deferred ); 10229 10230 // Call given func if any 10231 if ( func ) { 10232 func.call( deferred, deferred ); 10233 } 10234 10235 // All done! 10236 return deferred; 10237 }, 10238 10239 // Deferred helper 10240 when: function( singleValue ) { 10241 var 10242 10243 // count of uncompleted subordinates 10244 remaining = arguments.length, 10245 10246 // count of unprocessed arguments 10247 i = remaining, 10248 10249 // subordinate fulfillment data 10250 resolveContexts = Array( i ), 10251 resolveValues = slice.call( arguments ), 10252 10253 // the primary Deferred 10254 primary = jQuery.Deferred(), 10255 10256 // subordinate callback factory 10257 updateFunc = function( i ) { 10258 return function( value ) { 10259 resolveContexts[ i ] = this; 10260 resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; 10261 if ( !( --remaining ) ) { 10262 primary.resolveWith( resolveContexts, resolveValues ); 10263 } 10264 }; 10265 }; 10266 10267 // Single- and empty arguments are adopted like Promise.resolve 10268 if ( remaining <= 1 ) { 10269 adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, 10270 !remaining ); 10271 10272 // Use .then() to unwrap secondary thenables (cf. gh-3000) 10273 if ( primary.state() === "pending" || 10274 isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { 10275 10276 return primary.then(); 10277 } 10278 } 10279 10280 // Multiple arguments are aggregated like Promise.all array elements 10281 while ( i-- ) { 10282 adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); 10283 } 10284 10285 return primary.promise(); 10286 } 10287} ); 10288 10289 10290// These usually indicate a programmer mistake during development, 10291// warn about them ASAP rather than swallowing them by default. 10292var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; 10293 10294jQuery.Deferred.exceptionHook = function( error, stack ) { 10295 10296 // Support: IE 8 - 9 only 10297 // Console exists when dev tools are open, which can happen at any time 10298 if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { 10299 window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); 10300 } 10301}; 10302 10303 10304 10305 10306jQuery.readyException = function( error ) { 10307 window.setTimeout( function() { 10308 throw error; 10309 } ); 10310}; 10311 10312 10313 10314 10315// The deferred used on DOM ready 10316var readyList = jQuery.Deferred(); 10317 10318jQuery.fn.ready = function( fn ) { 10319 10320 readyList 10321 .then( fn ) 10322 10323 // Wrap jQuery.readyException in a function so that the lookup 10324 // happens at the time of error handling instead of callback 10325 // registration. 10326 .catch( function( error ) { 10327 jQuery.readyException( error ); 10328 } ); 10329 10330 return this; 10331}; 10332 10333jQuery.extend( { 10334 10335 // Is the DOM ready to be used? Set to true once it occurs. 10336 isReady: false, 10337 10338 // A counter to track how many items to wait for before 10339 // the ready event fires. See #6781 10340 readyWait: 1, 10341 10342 // Handle when the DOM is ready 10343 ready: function( wait ) { 10344 10345 // Abort if there are pending holds or we're already ready 10346 if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { 10347 return; 10348 } 10349 10350 // Remember that the DOM is ready 10351 jQuery.isReady = true; 10352 10353 // If a normal DOM Ready event fired, decrement, and wait if need be 10354 if ( wait !== true && --jQuery.readyWait > 0 ) { 10355 return; 10356 } 10357 10358 // If there are functions bound, to execute 10359 readyList.resolveWith( document, [ jQuery ] ); 10360 } 10361} ); 10362 10363jQuery.ready.then = readyList.then; 10364 10365// The ready event handler and self cleanup method 10366function completed() { 10367 document.removeEventListener( "DOMContentLoaded", completed ); 10368 window.removeEventListener( "load", completed ); 10369 jQuery.ready(); 10370} 10371 10372// Catch cases where $(document).ready() is called 10373// after the browser event has already occurred. 10374// Support: IE <=9 - 10 only 10375// Older IE sometimes signals "interactive" too soon 10376if ( document.readyState === "complete" || 10377 ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { 10378 10379 // Handle it asynchronously to allow scripts the opportunity to delay ready 10380 window.setTimeout( jQuery.ready ); 10381 10382} else { 10383 10384 // Use the handy event callback 10385 document.addEventListener( "DOMContentLoaded", completed ); 10386 10387 // A fallback to window.onload, that will always work 10388 window.addEventListener( "load", completed ); 10389} 10390 10391 10392 10393 10394// Multifunctional method to get and set values of a collection 10395// The value/s can optionally be executed if it's a function 10396var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { 10397 var i = 0, 10398 len = elems.length, 10399 bulk = key == null; 10400 10401 // Sets many values 10402 if ( toType( key ) === "object" ) { 10403 chainable = true; 10404 for ( i in key ) { 10405 access( elems, fn, i, key[ i ], true, emptyGet, raw ); 10406 } 10407 10408 // Sets one value 10409 } else if ( value !== undefined ) { 10410 chainable = true; 10411 10412 if ( !isFunction( value ) ) { 10413 raw = true; 10414 } 10415 10416 if ( bulk ) { 10417 10418 // Bulk operations run against the entire set 10419 if ( raw ) { 10420 fn.call( elems, value ); 10421 fn = null; 10422 10423 // ...except when executing function values 10424 } else { 10425 bulk = fn; 10426 fn = function( elem, _key, value ) { 10427 return bulk.call( jQuery( elem ), value ); 10428 }; 10429 } 10430 } 10431 10432 if ( fn ) { 10433 for ( ; i < len; i++ ) { 10434 fn( 10435 elems[ i ], key, raw ? 10436 value : 10437 value.call( elems[ i ], i, fn( elems[ i ], key ) ) 10438 ); 10439 } 10440 } 10441 } 10442 10443 if ( chainable ) { 10444 return elems; 10445 } 10446 10447 // Gets 10448 if ( bulk ) { 10449 return fn.call( elems ); 10450 } 10451 10452 return len ? fn( elems[ 0 ], key ) : emptyGet; 10453}; 10454 10455 10456// Matches dashed string for camelizing 10457var rmsPrefix = /^-ms-/, 10458 rdashAlpha = /-([a-z])/g; 10459 10460// Used by camelCase as callback to replace() 10461function fcamelCase( _all, letter ) { 10462 return letter.toUpperCase(); 10463} 10464 10465// Convert dashed to camelCase; used by the css and data modules 10466// Support: IE <=9 - 11, Edge 12 - 15 10467// Microsoft forgot to hump their vendor prefix (#9572) 10468function camelCase( string ) { 10469 return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); 10470} 10471var acceptData = function( owner ) { 10472 10473 // Accepts only: 10474 // - Node 10475 // - Node.ELEMENT_NODE 10476 // - Node.DOCUMENT_NODE 10477 // - Object 10478 // - Any 10479 return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); 10480}; 10481 10482 10483 10484 10485function Data() { 10486 this.expando = jQuery.expando + Data.uid++; 10487} 10488 10489Data.uid = 1; 10490 10491Data.prototype = { 10492 10493 cache: function( owner ) { 10494 10495 // Check if the owner object already has a cache 10496 var value = owner[ this.expando ]; 10497 10498 // If not, create one 10499 if ( !value ) { 10500 value = {}; 10501 10502 // We can accept data for non-element nodes in modern browsers, 10503 // but we should not, see #8335. 10504 // Always return an empty object. 10505 if ( acceptData( owner ) ) { 10506 10507 // If it is a node unlikely to be stringify-ed or looped over 10508 // use plain assignment 10509 if ( owner.nodeType ) { 10510 owner[ this.expando ] = value; 10511 10512 // Otherwise secure it in a non-enumerable property 10513 // configurable must be true to allow the property to be 10514 // deleted when data is removed 10515 } else { 10516 Object.defineProperty( owner, this.expando, { 10517 value: value, 10518 configurable: true 10519 } ); 10520 } 10521 } 10522 } 10523 10524 return value; 10525 }, 10526 set: function( owner, data, value ) { 10527 var prop, 10528 cache = this.cache( owner ); 10529 10530 // Handle: [ owner, key, value ] args 10531 // Always use camelCase key (gh-2257) 10532 if ( typeof data === "string" ) { 10533 cache[ camelCase( data ) ] = value; 10534 10535 // Handle: [ owner, { properties } ] args 10536 } else { 10537 10538 // Copy the properties one-by-one to the cache object 10539 for ( prop in data ) { 10540 cache[ camelCase( prop ) ] = data[ prop ]; 10541 } 10542 } 10543 return cache; 10544 }, 10545 get: function( owner, key ) { 10546 return key === undefined ? 10547 this.cache( owner ) : 10548 10549 // Always use camelCase key (gh-2257) 10550 owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; 10551 }, 10552 access: function( owner, key, value ) { 10553 10554 // In cases where either: 10555 // 10556 // 1. No key was specified 10557 // 2. A string key was specified, but no value provided 10558 // 10559 // Take the "read" path and allow the get method to determine 10560 // which value to return, respectively either: 10561 // 10562 // 1. The entire cache object 10563 // 2. The data stored at the key 10564 // 10565 if ( key === undefined || 10566 ( ( key && typeof key === "string" ) && value === undefined ) ) { 10567 10568 return this.get( owner, key ); 10569 } 10570 10571 // When the key is not a string, or both a key and value 10572 // are specified, set or extend (existing objects) with either: 10573 // 10574 // 1. An object of properties 10575 // 2. A key and value 10576 // 10577 this.set( owner, key, value ); 10578 10579 // Since the "set" path can have two possible entry points 10580 // return the expected data based on which path was taken[*] 10581 return value !== undefined ? value : key; 10582 }, 10583 remove: function( owner, key ) { 10584 var i, 10585 cache = owner[ this.expando ]; 10586 10587 if ( cache === undefined ) { 10588 return; 10589 } 10590 10591 if ( key !== undefined ) { 10592 10593 // Support array or space separated string of keys 10594 if ( Array.isArray( key ) ) { 10595 10596 // If key is an array of keys... 10597 // We always set camelCase keys, so remove that. 10598 key = key.map( camelCase ); 10599 } else { 10600 key = camelCase( key ); 10601 10602 // If a key with the spaces exists, use it. 10603 // Otherwise, create an array by matching non-whitespace 10604 key = key in cache ? 10605 [ key ] : 10606 ( key.match( rnothtmlwhite ) || [] ); 10607 } 10608 10609 i = key.length; 10610 10611 while ( i-- ) { 10612 delete cache[ key[ i ] ]; 10613 } 10614 } 10615 10616 // Remove the expando if there's no more data 10617 if ( key === undefined || jQuery.isEmptyObject( cache ) ) { 10618 10619 // Support: Chrome <=35 - 45 10620 // Webkit & Blink performance suffers when deleting properties 10621 // from DOM nodes, so set to undefined instead 10622 // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) 10623 if ( owner.nodeType ) { 10624 owner[ this.expando ] = undefined; 10625 } else { 10626 delete owner[ this.expando ]; 10627 } 10628 } 10629 }, 10630 hasData: function( owner ) { 10631 var cache = owner[ this.expando ]; 10632 return cache !== undefined && !jQuery.isEmptyObject( cache ); 10633 } 10634}; 10635var dataPriv = new Data(); 10636 10637var dataUser = new Data(); 10638 10639 10640 10641// Implementation Summary 10642// 10643// 1. Enforce API surface and semantic compatibility with 1.9.x branch 10644// 2. Improve the module's maintainability by reducing the storage 10645// paths to a single mechanism. 10646// 3. Use the same single mechanism to support "private" and "user" data. 10647// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) 10648// 5. Avoid exposing implementation details on user objects (eg. expando properties) 10649// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 10650 10651var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, 10652 rmultiDash = /[A-Z]/g; 10653 10654function getData( data ) { 10655 if ( data === "true" ) { 10656 return true; 10657 } 10658 10659 if ( data === "false" ) { 10660 return false; 10661 } 10662 10663 if ( data === "null" ) { 10664 return null; 10665 } 10666 10667 // Only convert to a number if it doesn't change the string 10668 if ( data === +data + "" ) { 10669 return +data; 10670 } 10671 10672 if ( rbrace.test( data ) ) { 10673 return JSON.parse( data ); 10674 } 10675 10676 return data; 10677} 10678 10679function dataAttr( elem, key, data ) { 10680 var name; 10681 10682 // If nothing was found internally, try to fetch any 10683 // data from the HTML5 data-* attribute 10684 if ( data === undefined && elem.nodeType === 1 ) { 10685 name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); 10686 data = elem.getAttribute( name ); 10687 10688 if ( typeof data === "string" ) { 10689 try { 10690 data = getData( data ); 10691 } catch ( e ) {} 10692 10693 // Make sure we set the data so it isn't changed later 10694 dataUser.set( elem, key, data ); 10695 } else { 10696 data = undefined; 10697 } 10698 } 10699 return data; 10700} 10701 10702jQuery.extend( { 10703 hasData: function( elem ) { 10704 return dataUser.hasData( elem ) || dataPriv.hasData( elem ); 10705 }, 10706 10707 data: function( elem, name, data ) { 10708 return dataUser.access( elem, name, data ); 10709 }, 10710 10711 removeData: function( elem, name ) { 10712 dataUser.remove( elem, name ); 10713 }, 10714 10715 // TODO: Now that all calls to _data and _removeData have been replaced 10716 // with direct calls to dataPriv methods, these can be deprecated. 10717 _data: function( elem, name, data ) { 10718 return dataPriv.access( elem, name, data ); 10719 }, 10720 10721 _removeData: function( elem, name ) { 10722 dataPriv.remove( elem, name ); 10723 } 10724} ); 10725 10726jQuery.fn.extend( { 10727 data: function( key, value ) { 10728 var i, name, data, 10729 elem = this[ 0 ], 10730 attrs = elem && elem.attributes; 10731 10732 // Gets all values 10733 if ( key === undefined ) { 10734 if ( this.length ) { 10735 data = dataUser.get( elem ); 10736 10737 if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { 10738 i = attrs.length; 10739 while ( i-- ) { 10740 10741 // Support: IE 11 only 10742 // The attrs elements can be null (#14894) 10743 if ( attrs[ i ] ) { 10744 name = attrs[ i ].name; 10745 if ( name.indexOf( "data-" ) === 0 ) { 10746 name = camelCase( name.slice( 5 ) ); 10747 dataAttr( elem, name, data[ name ] ); 10748 } 10749 } 10750 } 10751 dataPriv.set( elem, "hasDataAttrs", true ); 10752 } 10753 } 10754 10755 return data; 10756 } 10757 10758 // Sets multiple values 10759 if ( typeof key === "object" ) { 10760 return this.each( function() { 10761 dataUser.set( this, key ); 10762 } ); 10763 } 10764 10765 return access( this, function( value ) { 10766 var data; 10767 10768 // The calling jQuery object (element matches) is not empty 10769 // (and therefore has an element appears at this[ 0 ]) and the 10770 // `value` parameter was not undefined. An empty jQuery object 10771 // will result in `undefined` for elem = this[ 0 ] which will 10772 // throw an exception if an attempt to read a data cache is made. 10773 if ( elem && value === undefined ) { 10774 10775 // Attempt to get data from the cache 10776 // The key will always be camelCased in Data 10777 data = dataUser.get( elem, key ); 10778 if ( data !== undefined ) { 10779 return data; 10780 } 10781 10782 // Attempt to "discover" the data in 10783 // HTML5 custom data-* attrs 10784 data = dataAttr( elem, key ); 10785 if ( data !== undefined ) { 10786 return data; 10787 } 10788 10789 // We tried really hard, but the data doesn't exist. 10790 return; 10791 } 10792 10793 // Set the data... 10794 this.each( function() { 10795 10796 // We always store the camelCased key 10797 dataUser.set( this, key, value ); 10798 } ); 10799 }, null, value, arguments.length > 1, null, true ); 10800 }, 10801 10802 removeData: function( key ) { 10803 return this.each( function() { 10804 dataUser.remove( this, key ); 10805 } ); 10806 } 10807} ); 10808 10809 10810jQuery.extend( { 10811 queue: function( elem, type, data ) { 10812 var queue; 10813 10814 if ( elem ) { 10815 type = ( type || "fx" ) + "queue"; 10816 queue = dataPriv.get( elem, type ); 10817 10818 // Speed up dequeue by getting out quickly if this is just a lookup 10819 if ( data ) { 10820 if ( !queue || Array.isArray( data ) ) { 10821 queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); 10822 } else { 10823 queue.push( data ); 10824 } 10825 } 10826 return queue || []; 10827 } 10828 }, 10829 10830 dequeue: function( elem, type ) { 10831 type = type || "fx"; 10832 10833 var queue = jQuery.queue( elem, type ), 10834 startLength = queue.length, 10835 fn = queue.shift(), 10836 hooks = jQuery._queueHooks( elem, type ), 10837 next = function() { 10838 jQuery.dequeue( elem, type ); 10839 }; 10840 10841 // If the fx queue is dequeued, always remove the progress sentinel 10842 if ( fn === "inprogress" ) { 10843 fn = queue.shift(); 10844 startLength--; 10845 } 10846 10847 if ( fn ) { 10848 10849 // Add a progress sentinel to prevent the fx queue from being 10850 // automatically dequeued 10851 if ( type === "fx" ) { 10852 queue.unshift( "inprogress" ); 10853 } 10854 10855 // Clear up the last queue stop function 10856 delete hooks.stop; 10857 fn.call( elem, next, hooks ); 10858 } 10859 10860 if ( !startLength && hooks ) { 10861 hooks.empty.fire(); 10862 } 10863 }, 10864 10865 // Not public - generate a queueHooks object, or return the current one 10866 _queueHooks: function( elem, type ) { 10867 var key = type + "queueHooks"; 10868 return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { 10869 empty: jQuery.Callbacks( "once memory" ).add( function() { 10870 dataPriv.remove( elem, [ type + "queue", key ] ); 10871 } ) 10872 } ); 10873 } 10874} ); 10875 10876jQuery.fn.extend( { 10877 queue: function( type, data ) { 10878 var setter = 2; 10879 10880 if ( typeof type !== "string" ) { 10881 data = type; 10882 type = "fx"; 10883 setter--; 10884 } 10885 10886 if ( arguments.length < setter ) { 10887 return jQuery.queue( this[ 0 ], type ); 10888 } 10889 10890 return data === undefined ? 10891 this : 10892 this.each( function() { 10893 var queue = jQuery.queue( this, type, data ); 10894 10895 // Ensure a hooks for this queue 10896 jQuery._queueHooks( this, type ); 10897 10898 if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { 10899 jQuery.dequeue( this, type ); 10900 } 10901 } ); 10902 }, 10903 dequeue: function( type ) { 10904 return this.each( function() { 10905 jQuery.dequeue( this, type ); 10906 } ); 10907 }, 10908 clearQueue: function( type ) { 10909 return this.queue( type || "fx", [] ); 10910 }, 10911 10912 // Get a promise resolved when queues of a certain type 10913 // are emptied (fx is the type by default) 10914 promise: function( type, obj ) { 10915 var tmp, 10916 count = 1, 10917 defer = jQuery.Deferred(), 10918 elements = this, 10919 i = this.length, 10920 resolve = function() { 10921 if ( !( --count ) ) { 10922 defer.resolveWith( elements, [ elements ] ); 10923 } 10924 }; 10925 10926 if ( typeof type !== "string" ) { 10927 obj = type; 10928 type = undefined; 10929 } 10930 type = type || "fx"; 10931 10932 while ( i-- ) { 10933 tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); 10934 if ( tmp && tmp.empty ) { 10935 count++; 10936 tmp.empty.add( resolve ); 10937 } 10938 } 10939 resolve(); 10940 return defer.promise( obj ); 10941 } 10942} ); 10943var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; 10944 10945var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); 10946 10947 10948var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; 10949 10950var documentElement = document.documentElement; 10951 10952 10953 10954 var isAttached = function( elem ) { 10955 return jQuery.contains( elem.ownerDocument, elem ); 10956 }, 10957 composed = { composed: true }; 10958 10959 // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only 10960 // Check attachment across shadow DOM boundaries when possible (gh-3504) 10961 // Support: iOS 10.0-10.2 only 10962 // Early iOS 10 versions support `attachShadow` but not `getRootNode`, 10963 // leading to errors. We need to check for `getRootNode`. 10964 if ( documentElement.getRootNode ) { 10965 isAttached = function( elem ) { 10966 return jQuery.contains( elem.ownerDocument, elem ) || 10967 elem.getRootNode( composed ) === elem.ownerDocument; 10968 }; 10969 } 10970var isHiddenWithinTree = function( elem, el ) { 10971 10972 // isHiddenWithinTree might be called from jQuery#filter function; 10973 // in that case, element will be second argument 10974 elem = el || elem; 10975 10976 // Inline style trumps all 10977 return elem.style.display === "none" || 10978 elem.style.display === "" && 10979 10980 // Otherwise, check computed style 10981 // Support: Firefox <=43 - 45 10982 // Disconnected elements can have computed display: none, so first confirm that elem is 10983 // in the document. 10984 isAttached( elem ) && 10985 10986 jQuery.css( elem, "display" ) === "none"; 10987 }; 10988 10989 10990 10991function adjustCSS( elem, prop, valueParts, tween ) { 10992 var adjusted, scale, 10993 maxIterations = 20, 10994 currentValue = tween ? 10995 function() { 10996 return tween.cur(); 10997 } : 10998 function() { 10999 return jQuery.css( elem, prop, "" ); 11000 }, 11001 initial = currentValue(), 11002 unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), 11003 11004 // Starting value computation is required for potential unit mismatches 11005 initialInUnit = elem.nodeType && 11006 ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && 11007 rcssNum.exec( jQuery.css( elem, prop ) ); 11008 11009 if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { 11010 11011 // Support: Firefox <=54 11012 // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) 11013 initial = initial / 2; 11014 11015 // Trust units reported by jQuery.css 11016 unit = unit || initialInUnit[ 3 ]; 11017 11018 // Iteratively approximate from a nonzero starting point 11019 initialInUnit = +initial || 1; 11020 11021 while ( maxIterations-- ) { 11022 11023 // Evaluate and update our best guess (doubling guesses that zero out). 11024 // Finish if the scale equals or crosses 1 (making the old*new product non-positive). 11025 jQuery.style( elem, prop, initialInUnit + unit ); 11026 if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { 11027 maxIterations = 0; 11028 } 11029 initialInUnit = initialInUnit / scale; 11030 11031 } 11032 11033 initialInUnit = initialInUnit * 2; 11034 jQuery.style( elem, prop, initialInUnit + unit ); 11035 11036 // Make sure we update the tween properties later on 11037 valueParts = valueParts || []; 11038 } 11039 11040 if ( valueParts ) { 11041 initialInUnit = +initialInUnit || +initial || 0; 11042 11043 // Apply relative offset (+=/-=) if specified 11044 adjusted = valueParts[ 1 ] ? 11045 initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : 11046 +valueParts[ 2 ]; 11047 if ( tween ) { 11048 tween.unit = unit; 11049 tween.start = initialInUnit; 11050 tween.end = adjusted; 11051 } 11052 } 11053 return adjusted; 11054} 11055 11056 11057var defaultDisplayMap = {}; 11058 11059function getDefaultDisplay( elem ) { 11060 var temp, 11061 doc = elem.ownerDocument, 11062 nodeName = elem.nodeName, 11063 display = defaultDisplayMap[ nodeName ]; 11064 11065 if ( display ) { 11066 return display; 11067 } 11068 11069 temp = doc.body.appendChild( doc.createElement( nodeName ) ); 11070 display = jQuery.css( temp, "display" ); 11071 11072 temp.parentNode.removeChild( temp ); 11073 11074 if ( display === "none" ) { 11075 display = "block"; 11076 } 11077 defaultDisplayMap[ nodeName ] = display; 11078 11079 return display; 11080} 11081 11082function showHide( elements, show ) { 11083 var display, elem, 11084 values = [], 11085 index = 0, 11086 length = elements.length; 11087 11088 // Determine new display value for elements that need to change 11089 for ( ; index < length; index++ ) { 11090 elem = elements[ index ]; 11091 if ( !elem.style ) { 11092 continue; 11093 } 11094 11095 display = elem.style.display; 11096 if ( show ) { 11097 11098 // Since we force visibility upon cascade-hidden elements, an immediate (and slow) 11099 // check is required in this first loop unless we have a nonempty display value (either 11100 // inline or about-to-be-restored) 11101 if ( display === "none" ) { 11102 values[ index ] = dataPriv.get( elem, "display" ) || null; 11103 if ( !values[ index ] ) { 11104 elem.style.display = ""; 11105 } 11106 } 11107 if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { 11108 values[ index ] = getDefaultDisplay( elem ); 11109 } 11110 } else { 11111 if ( display !== "none" ) { 11112 values[ index ] = "none"; 11113 11114 // Remember what we're overwriting 11115 dataPriv.set( elem, "display", display ); 11116 } 11117 } 11118 } 11119 11120 // Set the display of the elements in a second loop to avoid constant reflow 11121 for ( index = 0; index < length; index++ ) { 11122 if ( values[ index ] != null ) { 11123 elements[ index ].style.display = values[ index ]; 11124 } 11125 } 11126 11127 return elements; 11128} 11129 11130jQuery.fn.extend( { 11131 show: function() { 11132 return showHide( this, true ); 11133 }, 11134 hide: function() { 11135 return showHide( this ); 11136 }, 11137 toggle: function( state ) { 11138 if ( typeof state === "boolean" ) { 11139 return state ? this.show() : this.hide(); 11140 } 11141 11142 return this.each( function() { 11143 if ( isHiddenWithinTree( this ) ) { 11144 jQuery( this ).show(); 11145 } else { 11146 jQuery( this ).hide(); 11147 } 11148 } ); 11149 } 11150} ); 11151var rcheckableType = ( /^(?:checkbox|radio)$/i ); 11152 11153var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); 11154 11155var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); 11156 11157 11158 11159( function() { 11160 var fragment = document.createDocumentFragment(), 11161 div = fragment.appendChild( document.createElement( "div" ) ), 11162 input = document.createElement( "input" ); 11163 11164 // Support: Android 4.0 - 4.3 only 11165 // Check state lost if the name is set (#11217) 11166 // Support: Windows Web Apps (WWA) 11167 // `name` and `type` must use .setAttribute for WWA (#14901) 11168 input.setAttribute( "type", "radio" ); 11169 input.setAttribute( "checked", "checked" ); 11170 input.setAttribute( "name", "t" ); 11171 11172 div.appendChild( input ); 11173 11174 // Support: Android <=4.1 only 11175 // Older WebKit doesn't clone checked state correctly in fragments 11176 support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; 11177 11178 // Support: IE <=11 only 11179 // Make sure textarea (and checkbox) defaultValue is properly cloned 11180 div.innerHTML = "<textarea>x</textarea>"; 11181 support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; 11182 11183 // Support: IE <=9 only 11184 // IE <=9 replaces <option> tags with their contents when inserted outside of 11185 // the select element. 11186 div.innerHTML = "<option></option>"; 11187 support.option = !!div.lastChild; 11188} )(); 11189 11190 11191// We have to close these tags to support XHTML (#13200) 11192var wrapMap = { 11193 11194 // XHTML parsers do not magically insert elements in the 11195 // same way that tag soup parsers do. So we cannot shorten 11196 // this by omitting <tbody> or other required elements. 11197 thead: [ 1, "<table>", "</table>" ], 11198 col: [ 2, "<table><colgroup>", "</colgroup></table>" ], 11199 tr: [ 2, "<table><tbody>", "</tbody></table>" ], 11200 td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], 11201 11202 _default: [ 0, "", "" ] 11203}; 11204 11205wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; 11206wrapMap.th = wrapMap.td; 11207 11208// Support: IE <=9 only 11209if ( !support.option ) { 11210 wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ]; 11211} 11212 11213 11214function getAll( context, tag ) { 11215 11216 // Support: IE <=9 - 11 only 11217 // Use typeof to avoid zero-argument method invocation on host objects (#15151) 11218 var ret; 11219 11220 if ( typeof context.getElementsByTagName !== "undefined" ) { 11221 ret = context.getElementsByTagName( tag || "*" ); 11222 11223 } else if ( typeof context.querySelectorAll !== "undefined" ) { 11224 ret = context.querySelectorAll( tag || "*" ); 11225 11226 } else { 11227 ret = []; 11228 } 11229 11230 if ( tag === undefined || tag && nodeName( context, tag ) ) { 11231 return jQuery.merge( [ context ], ret ); 11232 } 11233 11234 return ret; 11235} 11236 11237 11238// Mark scripts as having already been evaluated 11239function setGlobalEval( elems, refElements ) { 11240 var i = 0, 11241 l = elems.length; 11242 11243 for ( ; i < l; i++ ) { 11244 dataPriv.set( 11245 elems[ i ], 11246 "globalEval", 11247 !refElements || dataPriv.get( refElements[ i ], "globalEval" ) 11248 ); 11249 } 11250} 11251 11252 11253var rhtml = /<|&#?\w+;/; 11254 11255function buildFragment( elems, context, scripts, selection, ignored ) { 11256 var elem, tmp, tag, wrap, attached, j, 11257 fragment = context.createDocumentFragment(), 11258 nodes = [], 11259 i = 0, 11260 l = elems.length; 11261 11262 for ( ; i < l; i++ ) { 11263 elem = elems[ i ]; 11264 11265 if ( elem || elem === 0 ) { 11266 11267 // Add nodes directly 11268 if ( toType( elem ) === "object" ) { 11269 11270 // Support: Android <=4.0 only, PhantomJS 1 only 11271 // push.apply(_, arraylike) throws on ancient WebKit 11272 jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); 11273 11274 // Convert non-html into a text node 11275 } else if ( !rhtml.test( elem ) ) { 11276 nodes.push( context.createTextNode( elem ) ); 11277 11278 // Convert html into DOM nodes 11279 } else { 11280 tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); 11281 11282 // Deserialize a standard representation 11283 tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); 11284 wrap = wrapMap[ tag ] || wrapMap._default; 11285 tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; 11286 11287 // Descend through wrappers to the right content 11288 j = wrap[ 0 ]; 11289 while ( j-- ) { 11290 tmp = tmp.lastChild; 11291 } 11292 11293 // Support: Android <=4.0 only, PhantomJS 1 only 11294 // push.apply(_, arraylike) throws on ancient WebKit 11295 jQuery.merge( nodes, tmp.childNodes ); 11296 11297 // Remember the top-level container 11298 tmp = fragment.firstChild; 11299 11300 // Ensure the created nodes are orphaned (#12392) 11301 tmp.textContent = ""; 11302 } 11303 } 11304 } 11305 11306 // Remove wrapper from fragment 11307 fragment.textContent = ""; 11308 11309 i = 0; 11310 while ( ( elem = nodes[ i++ ] ) ) { 11311 11312 // Skip elements already in the context collection (trac-4087) 11313 if ( selection && jQuery.inArray( elem, selection ) > -1 ) { 11314 if ( ignored ) { 11315 ignored.push( elem ); 11316 } 11317 continue; 11318 } 11319 11320 attached = isAttached( elem ); 11321 11322 // Append to fragment 11323 tmp = getAll( fragment.appendChild( elem ), "script" ); 11324 11325 // Preserve script evaluation history 11326 if ( attached ) { 11327 setGlobalEval( tmp ); 11328 } 11329 11330 // Capture executables 11331 if ( scripts ) { 11332 j = 0; 11333 while ( ( elem = tmp[ j++ ] ) ) { 11334 if ( rscriptType.test( elem.type || "" ) ) { 11335 scripts.push( elem ); 11336 } 11337 } 11338 } 11339 } 11340 11341 return fragment; 11342} 11343 11344 11345var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; 11346 11347function returnTrue() { 11348 return true; 11349} 11350 11351function returnFalse() { 11352 return false; 11353} 11354 11355// Support: IE <=9 - 11+ 11356// focus() and blur() are asynchronous, except when they are no-op. 11357// So expect focus to be synchronous when the element is already active, 11358// and blur to be synchronous when the element is not already active. 11359// (focus and blur are always synchronous in other supported browsers, 11360// this just defines when we can count on it). 11361function expectSync( elem, type ) { 11362 return ( elem === safeActiveElement() ) === ( type === "focus" ); 11363} 11364 11365// Support: IE <=9 only 11366// Accessing document.activeElement can throw unexpectedly 11367// https://bugs.jquery.com/ticket/13393 11368function safeActiveElement() { 11369 try { 11370 return document.activeElement; 11371 } catch ( err ) { } 11372} 11373 11374function on( elem, types, selector, data, fn, one ) { 11375 var origFn, type; 11376 11377 // Types can be a map of types/handlers 11378 if ( typeof types === "object" ) { 11379 11380 // ( types-Object, selector, data ) 11381 if ( typeof selector !== "string" ) { 11382 11383 // ( types-Object, data ) 11384 data = data || selector; 11385 selector = undefined; 11386 } 11387 for ( type in types ) { 11388 on( elem, type, selector, data, types[ type ], one ); 11389 } 11390 return elem; 11391 } 11392 11393 if ( data == null && fn == null ) { 11394 11395 // ( types, fn ) 11396 fn = selector; 11397 data = selector = undefined; 11398 } else if ( fn == null ) { 11399 if ( typeof selector === "string" ) { 11400 11401 // ( types, selector, fn ) 11402 fn = data; 11403 data = undefined; 11404 } else { 11405 11406 // ( types, data, fn ) 11407 fn = data; 11408 data = selector; 11409 selector = undefined; 11410 } 11411 } 11412 if ( fn === false ) { 11413 fn = returnFalse; 11414 } else if ( !fn ) { 11415 return elem; 11416 } 11417 11418 if ( one === 1 ) { 11419 origFn = fn; 11420 fn = function( event ) { 11421 11422 // Can use an empty set, since event contains the info 11423 jQuery().off( event ); 11424 return origFn.apply( this, arguments ); 11425 }; 11426 11427 // Use same guid so caller can remove using origFn 11428 fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); 11429 } 11430 return elem.each( function() { 11431 jQuery.event.add( this, types, fn, data, selector ); 11432 } ); 11433} 11434 11435/* 11436 * Helper functions for managing events -- not part of the public interface. 11437 * Props to Dean Edwards' addEvent library for many of the ideas. 11438 */ 11439jQuery.event = { 11440 11441 global: {}, 11442 11443 add: function( elem, types, handler, data, selector ) { 11444 11445 var handleObjIn, eventHandle, tmp, 11446 events, t, handleObj, 11447 special, handlers, type, namespaces, origType, 11448 elemData = dataPriv.get( elem ); 11449 11450 // Only attach events to objects that accept data 11451 if ( !acceptData( elem ) ) { 11452 return; 11453 } 11454 11455 // Caller can pass in an object of custom data in lieu of the handler 11456 if ( handler.handler ) { 11457 handleObjIn = handler; 11458 handler = handleObjIn.handler; 11459 selector = handleObjIn.selector; 11460 } 11461 11462 // Ensure that invalid selectors throw exceptions at attach time 11463 // Evaluate against documentElement in case elem is a non-element node (e.g., document) 11464 if ( selector ) { 11465 jQuery.find.matchesSelector( documentElement, selector ); 11466 } 11467 11468 // Make sure that the handler has a unique ID, used to find/remove it later 11469 if ( !handler.guid ) { 11470 handler.guid = jQuery.guid++; 11471 } 11472 11473 // Init the element's event structure and main handler, if this is the first 11474 if ( !( events = elemData.events ) ) { 11475 events = elemData.events = Object.create( null ); 11476 } 11477 if ( !( eventHandle = elemData.handle ) ) { 11478 eventHandle = elemData.handle = function( e ) { 11479 11480 // Discard the second event of a jQuery.event.trigger() and 11481 // when an event is called after a page has unloaded 11482 return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? 11483 jQuery.event.dispatch.apply( elem, arguments ) : undefined; 11484 }; 11485 } 11486 11487 // Handle multiple events separated by a space 11488 types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; 11489 t = types.length; 11490 while ( t-- ) { 11491 tmp = rtypenamespace.exec( types[ t ] ) || []; 11492 type = origType = tmp[ 1 ]; 11493 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); 11494 11495 // There *must* be a type, no attaching namespace-only handlers 11496 if ( !type ) { 11497 continue; 11498 } 11499 11500 // If event changes its type, use the special event handlers for the changed type 11501 special = jQuery.event.special[ type ] || {}; 11502 11503 // If selector defined, determine special event api type, otherwise given type 11504 type = ( selector ? special.delegateType : special.bindType ) || type; 11505 11506 // Update special based on newly reset type 11507 special = jQuery.event.special[ type ] || {}; 11508 11509 // handleObj is passed to all event handlers 11510 handleObj = jQuery.extend( { 11511 type: type, 11512 origType: origType, 11513 data: data, 11514 handler: handler, 11515 guid: handler.guid, 11516 selector: selector, 11517 needsContext: selector && jQuery.expr.match.needsContext.test( selector ), 11518 namespace: namespaces.join( "." ) 11519 }, handleObjIn ); 11520 11521 // Init the event handler queue if we're the first 11522 if ( !( handlers = events[ type ] ) ) { 11523 handlers = events[ type ] = []; 11524 handlers.delegateCount = 0; 11525 11526 // Only use addEventListener if the special events handler returns false 11527 if ( !special.setup || 11528 special.setup.call( elem, data, namespaces, eventHandle ) === false ) { 11529 11530 if ( elem.addEventListener ) { 11531 elem.addEventListener( type, eventHandle ); 11532 } 11533 } 11534 } 11535 11536 if ( special.add ) { 11537 special.add.call( elem, handleObj ); 11538 11539 if ( !handleObj.handler.guid ) { 11540 handleObj.handler.guid = handler.guid; 11541 } 11542 } 11543 11544 // Add to the element's handler list, delegates in front 11545 if ( selector ) { 11546 handlers.splice( handlers.delegateCount++, 0, handleObj ); 11547 } else { 11548 handlers.push( handleObj ); 11549 } 11550 11551 // Keep track of which events have ever been used, for event optimization 11552 jQuery.event.global[ type ] = true; 11553 } 11554 11555 }, 11556 11557 // Detach an event or set of events from an element 11558 remove: function( elem, types, handler, selector, mappedTypes ) { 11559 11560 var j, origCount, tmp, 11561 events, t, handleObj, 11562 special, handlers, type, namespaces, origType, 11563 elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); 11564 11565 if ( !elemData || !( events = elemData.events ) ) { 11566 return; 11567 } 11568 11569 // Once for each type.namespace in types; type may be omitted 11570 types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; 11571 t = types.length; 11572 while ( t-- ) { 11573 tmp = rtypenamespace.exec( types[ t ] ) || []; 11574 type = origType = tmp[ 1 ]; 11575 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); 11576 11577 // Unbind all events (on this namespace, if provided) for the element 11578 if ( !type ) { 11579 for ( type in events ) { 11580 jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); 11581 } 11582 continue; 11583 } 11584 11585 special = jQuery.event.special[ type ] || {}; 11586 type = ( selector ? special.delegateType : special.bindType ) || type; 11587 handlers = events[ type ] || []; 11588 tmp = tmp[ 2 ] && 11589 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); 11590 11591 // Remove matching events 11592 origCount = j = handlers.length; 11593 while ( j-- ) { 11594 handleObj = handlers[ j ]; 11595 11596 if ( ( mappedTypes || origType === handleObj.origType ) && 11597 ( !handler || handler.guid === handleObj.guid ) && 11598 ( !tmp || tmp.test( handleObj.namespace ) ) && 11599 ( !selector || selector === handleObj.selector || 11600 selector === "**" && handleObj.selector ) ) { 11601 handlers.splice( j, 1 ); 11602 11603 if ( handleObj.selector ) { 11604 handlers.delegateCount--; 11605 } 11606 if ( special.remove ) { 11607 special.remove.call( elem, handleObj ); 11608 } 11609 } 11610 } 11611 11612 // Remove generic event handler if we removed something and no more handlers exist 11613 // (avoids potential for endless recursion during removal of special event handlers) 11614 if ( origCount && !handlers.length ) { 11615 if ( !special.teardown || 11616 special.teardown.call( elem, namespaces, elemData.handle ) === false ) { 11617 11618 jQuery.removeEvent( elem, type, elemData.handle ); 11619 } 11620 11621 delete events[ type ]; 11622 } 11623 } 11624 11625 // Remove data and the expando if it's no longer used 11626 if ( jQuery.isEmptyObject( events ) ) { 11627 dataPriv.remove( elem, "handle events" ); 11628 } 11629 }, 11630 11631 dispatch: function( nativeEvent ) { 11632 11633 var i, j, ret, matched, handleObj, handlerQueue, 11634 args = new Array( arguments.length ), 11635 11636 // Make a writable jQuery.Event from the native event object 11637 event = jQuery.event.fix( nativeEvent ), 11638 11639 handlers = ( 11640 dataPriv.get( this, "events" ) || Object.create( null ) 11641 )[ event.type ] || [], 11642 special = jQuery.event.special[ event.type ] || {}; 11643 11644 // Use the fix-ed jQuery.Event rather than the (read-only) native event 11645 args[ 0 ] = event; 11646 11647 for ( i = 1; i < arguments.length; i++ ) { 11648 args[ i ] = arguments[ i ]; 11649 } 11650 11651 event.delegateTarget = this; 11652 11653 // Call the preDispatch hook for the mapped type, and let it bail if desired 11654 if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { 11655 return; 11656 } 11657 11658 // Determine handlers 11659 handlerQueue = jQuery.event.handlers.call( this, event, handlers ); 11660 11661 // Run delegates first; they may want to stop propagation beneath us 11662 i = 0; 11663 while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { 11664 event.currentTarget = matched.elem; 11665 11666 j = 0; 11667 while ( ( handleObj = matched.handlers[ j++ ] ) && 11668 !event.isImmediatePropagationStopped() ) { 11669 11670 // If the event is namespaced, then each handler is only invoked if it is 11671 // specially universal or its namespaces are a superset of the event's. 11672 if ( !event.rnamespace || handleObj.namespace === false || 11673 event.rnamespace.test( handleObj.namespace ) ) { 11674 11675 event.handleObj = handleObj; 11676 event.data = handleObj.data; 11677 11678 ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || 11679 handleObj.handler ).apply( matched.elem, args ); 11680 11681 if ( ret !== undefined ) { 11682 if ( ( event.result = ret ) === false ) { 11683 event.preventDefault(); 11684 event.stopPropagation(); 11685 } 11686 } 11687 } 11688 } 11689 } 11690 11691 // Call the postDispatch hook for the mapped type 11692 if ( special.postDispatch ) { 11693 special.postDispatch.call( this, event ); 11694 } 11695 11696 return event.result; 11697 }, 11698 11699 handlers: function( event, handlers ) { 11700 var i, handleObj, sel, matchedHandlers, matchedSelectors, 11701 handlerQueue = [], 11702 delegateCount = handlers.delegateCount, 11703 cur = event.target; 11704 11705 // Find delegate handlers 11706 if ( delegateCount && 11707 11708 // Support: IE <=9 11709 // Black-hole SVG <use> instance trees (trac-13180) 11710 cur.nodeType && 11711 11712 // Support: Firefox <=42 11713 // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) 11714 // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click 11715 // Support: IE 11 only 11716 // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) 11717 !( event.type === "click" && event.button >= 1 ) ) { 11718 11719 for ( ; cur !== this; cur = cur.parentNode || this ) { 11720 11721 // Don't check non-elements (#13208) 11722 // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) 11723 if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { 11724 matchedHandlers = []; 11725 matchedSelectors = {}; 11726 for ( i = 0; i < delegateCount; i++ ) { 11727 handleObj = handlers[ i ]; 11728 11729 // Don't conflict with Object.prototype properties (#13203) 11730 sel = handleObj.selector + " "; 11731 11732 if ( matchedSelectors[ sel ] === undefined ) { 11733 matchedSelectors[ sel ] = handleObj.needsContext ? 11734 jQuery( sel, this ).index( cur ) > -1 : 11735 jQuery.find( sel, this, null, [ cur ] ).length; 11736 } 11737 if ( matchedSelectors[ sel ] ) { 11738 matchedHandlers.push( handleObj ); 11739 } 11740 } 11741 if ( matchedHandlers.length ) { 11742 handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); 11743 } 11744 } 11745 } 11746 } 11747 11748 // Add the remaining (directly-bound) handlers 11749 cur = this; 11750 if ( delegateCount < handlers.length ) { 11751 handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); 11752 } 11753 11754 return handlerQueue; 11755 }, 11756 11757 addProp: function( name, hook ) { 11758 Object.defineProperty( jQuery.Event.prototype, name, { 11759 enumerable: true, 11760 configurable: true, 11761 11762 get: isFunction( hook ) ? 11763 function() { 11764 if ( this.originalEvent ) { 11765 return hook( this.originalEvent ); 11766 } 11767 } : 11768 function() { 11769 if ( this.originalEvent ) { 11770 return this.originalEvent[ name ]; 11771 } 11772 }, 11773 11774 set: function( value ) { 11775 Object.defineProperty( this, name, { 11776 enumerable: true, 11777 configurable: true, 11778 writable: true, 11779 value: value 11780 } ); 11781 } 11782 } ); 11783 }, 11784 11785 fix: function( originalEvent ) { 11786 return originalEvent[ jQuery.expando ] ? 11787 originalEvent : 11788 new jQuery.Event( originalEvent ); 11789 }, 11790 11791 special: { 11792 load: { 11793 11794 // Prevent triggered image.load events from bubbling to window.load 11795 noBubble: true 11796 }, 11797 click: { 11798 11799 // Utilize native event to ensure correct state for checkable inputs 11800 setup: function( data ) { 11801 11802 // For mutual compressibility with _default, replace `this` access with a local var. 11803 // `|| data` is dead code meant only to preserve the variable through minification. 11804 var el = this || data; 11805 11806 // Claim the first handler 11807 if ( rcheckableType.test( el.type ) && 11808 el.click && nodeName( el, "input" ) ) { 11809 11810 // dataPriv.set( el, "click", ... ) 11811 leverageNative( el, "click", returnTrue ); 11812 } 11813 11814 // Return false to allow normal processing in the caller 11815 return false; 11816 }, 11817 trigger: function( data ) { 11818 11819 // For mutual compressibility with _default, replace `this` access with a local var. 11820 // `|| data` is dead code meant only to preserve the variable through minification. 11821 var el = this || data; 11822 11823 // Force setup before triggering a click 11824 if ( rcheckableType.test( el.type ) && 11825 el.click && nodeName( el, "input" ) ) { 11826 11827 leverageNative( el, "click" ); 11828 } 11829 11830 // Return non-false to allow normal event-path propagation 11831 return true; 11832 }, 11833 11834 // For cross-browser consistency, suppress native .click() on links 11835 // Also prevent it if we're currently inside a leveraged native-event stack 11836 _default: function( event ) { 11837 var target = event.target; 11838 return rcheckableType.test( target.type ) && 11839 target.click && nodeName( target, "input" ) && 11840 dataPriv.get( target, "click" ) || 11841 nodeName( target, "a" ); 11842 } 11843 }, 11844 11845 beforeunload: { 11846 postDispatch: function( event ) { 11847 11848 // Support: Firefox 20+ 11849 // Firefox doesn't alert if the returnValue field is not set. 11850 if ( event.result !== undefined && event.originalEvent ) { 11851 event.originalEvent.returnValue = event.result; 11852 } 11853 } 11854 } 11855 } 11856}; 11857 11858// Ensure the presence of an event listener that handles manually-triggered 11859// synthetic events by interrupting progress until reinvoked in response to 11860// *native* events that it fires directly, ensuring that state changes have 11861// already occurred before other listeners are invoked. 11862function leverageNative( el, type, expectSync ) { 11863 11864 // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add 11865 if ( !expectSync ) { 11866 if ( dataPriv.get( el, type ) === undefined ) { 11867 jQuery.event.add( el, type, returnTrue ); 11868 } 11869 return; 11870 } 11871 11872 // Register the controller as a special universal handler for all event namespaces 11873 dataPriv.set( el, type, false ); 11874 jQuery.event.add( el, type, { 11875 namespace: false, 11876 handler: function( event ) { 11877 var notAsync, result, 11878 saved = dataPriv.get( this, type ); 11879 11880 if ( ( event.isTrigger & 1 ) && this[ type ] ) { 11881 11882 // Interrupt processing of the outer synthetic .trigger()ed event 11883 // Saved data should be false in such cases, but might be a leftover capture object 11884 // from an async native handler (gh-4350) 11885 if ( !saved.length ) { 11886 11887 // Store arguments for use when handling the inner native event 11888 // There will always be at least one argument (an event object), so this array 11889 // will not be confused with a leftover capture object. 11890 saved = slice.call( arguments ); 11891 dataPriv.set( this, type, saved ); 11892 11893 // Trigger the native event and capture its result 11894 // Support: IE <=9 - 11+ 11895 // focus() and blur() are asynchronous 11896 notAsync = expectSync( this, type ); 11897 this[ type ](); 11898 result = dataPriv.get( this, type ); 11899 if ( saved !== result || notAsync ) { 11900 dataPriv.set( this, type, false ); 11901 } else { 11902 result = {}; 11903 } 11904 if ( saved !== result ) { 11905 11906 // Cancel the outer synthetic event 11907 event.stopImmediatePropagation(); 11908 event.preventDefault(); 11909 11910 // Support: Chrome 86+ 11911 // In Chrome, if an element having a focusout handler is blurred by 11912 // clicking outside of it, it invokes the handler synchronously. If 11913 // that handler calls `.remove()` on the element, the data is cleared, 11914 // leaving `result` undefined. We need to guard against this. 11915 return result && result.value; 11916 } 11917 11918 // If this is an inner synthetic event for an event with a bubbling surrogate 11919 // (focus or blur), assume that the surrogate already propagated from triggering the 11920 // native event and prevent that from happening again here. 11921 // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the 11922 // bubbling surrogate propagates *after* the non-bubbling base), but that seems 11923 // less bad than duplication. 11924 } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { 11925 event.stopPropagation(); 11926 } 11927 11928 // If this is a native event triggered above, everything is now in order 11929 // Fire an inner synthetic event with the original arguments 11930 } else if ( saved.length ) { 11931 11932 // ...and capture the result 11933 dataPriv.set( this, type, { 11934 value: jQuery.event.trigger( 11935 11936 // Support: IE <=9 - 11+ 11937 // Extend with the prototype to reset the above stopImmediatePropagation() 11938 jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), 11939 saved.slice( 1 ), 11940 this 11941 ) 11942 } ); 11943 11944 // Abort handling of the native event 11945 event.stopImmediatePropagation(); 11946 } 11947 } 11948 } ); 11949} 11950 11951jQuery.removeEvent = function( elem, type, handle ) { 11952 11953 // This "if" is needed for plain objects 11954 if ( elem.removeEventListener ) { 11955 elem.removeEventListener( type, handle ); 11956 } 11957}; 11958 11959jQuery.Event = function( src, props ) { 11960 11961 // Allow instantiation without the 'new' keyword 11962 if ( !( this instanceof jQuery.Event ) ) { 11963 return new jQuery.Event( src, props ); 11964 } 11965 11966 // Event object 11967 if ( src && src.type ) { 11968 this.originalEvent = src; 11969 this.type = src.type; 11970 11971 // Events bubbling up the document may have been marked as prevented 11972 // by a handler lower down the tree; reflect the correct value. 11973 this.isDefaultPrevented = src.defaultPrevented || 11974 src.defaultPrevented === undefined && 11975 11976 // Support: Android <=2.3 only 11977 src.returnValue === false ? 11978 returnTrue : 11979 returnFalse; 11980 11981 // Create target properties 11982 // Support: Safari <=6 - 7 only 11983 // Target should not be a text node (#504, #13143) 11984 this.target = ( src.target && src.target.nodeType === 3 ) ? 11985 src.target.parentNode : 11986 src.target; 11987 11988 this.currentTarget = src.currentTarget; 11989 this.relatedTarget = src.relatedTarget; 11990 11991 // Event type 11992 } else { 11993 this.type = src; 11994 } 11995 11996 // Put explicitly provided properties onto the event object 11997 if ( props ) { 11998 jQuery.extend( this, props ); 11999 } 12000 12001 // Create a timestamp if incoming event doesn't have one 12002 this.timeStamp = src && src.timeStamp || Date.now(); 12003 12004 // Mark it as fixed 12005 this[ jQuery.expando ] = true; 12006}; 12007 12008// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding 12009// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html 12010jQuery.Event.prototype = { 12011 constructor: jQuery.Event, 12012 isDefaultPrevented: returnFalse, 12013 isPropagationStopped: returnFalse, 12014 isImmediatePropagationStopped: returnFalse, 12015 isSimulated: false, 12016 12017 preventDefault: function() { 12018 var e = this.originalEvent; 12019 12020 this.isDefaultPrevented = returnTrue; 12021 12022 if ( e && !this.isSimulated ) { 12023 e.preventDefault(); 12024 } 12025 }, 12026 stopPropagation: function() { 12027 var e = this.originalEvent; 12028 12029 this.isPropagationStopped = returnTrue; 12030 12031 if ( e && !this.isSimulated ) { 12032 e.stopPropagation(); 12033 } 12034 }, 12035 stopImmediatePropagation: function() { 12036 var e = this.originalEvent; 12037 12038 this.isImmediatePropagationStopped = returnTrue; 12039 12040 if ( e && !this.isSimulated ) { 12041 e.stopImmediatePropagation(); 12042 } 12043 12044 this.stopPropagation(); 12045 } 12046}; 12047 12048// Includes all common event props including KeyEvent and MouseEvent specific props 12049jQuery.each( { 12050 altKey: true, 12051 bubbles: true, 12052 cancelable: true, 12053 changedTouches: true, 12054 ctrlKey: true, 12055 detail: true, 12056 eventPhase: true, 12057 metaKey: true, 12058 pageX: true, 12059 pageY: true, 12060 shiftKey: true, 12061 view: true, 12062 "char": true, 12063 code: true, 12064 charCode: true, 12065 key: true, 12066 keyCode: true, 12067 button: true, 12068 buttons: true, 12069 clientX: true, 12070 clientY: true, 12071 offsetX: true, 12072 offsetY: true, 12073 pointerId: true, 12074 pointerType: true, 12075 screenX: true, 12076 screenY: true, 12077 targetTouches: true, 12078 toElement: true, 12079 touches: true, 12080 which: true 12081}, jQuery.event.addProp ); 12082 12083jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { 12084 jQuery.event.special[ type ] = { 12085 12086 // Utilize native event if possible so blur/focus sequence is correct 12087 setup: function() { 12088 12089 // Claim the first handler 12090 // dataPriv.set( this, "focus", ... ) 12091 // dataPriv.set( this, "blur", ... ) 12092 leverageNative( this, type, expectSync ); 12093 12094 // Return false to allow normal processing in the caller 12095 return false; 12096 }, 12097 trigger: function() { 12098 12099 // Force setup before trigger 12100 leverageNative( this, type ); 12101 12102 // Return non-false to allow normal event-path propagation 12103 return true; 12104 }, 12105 12106 // Suppress native focus or blur as it's already being fired 12107 // in leverageNative. 12108 _default: function() { 12109 return true; 12110 }, 12111 12112 delegateType: delegateType 12113 }; 12114} ); 12115 12116// Create mouseenter/leave events using mouseover/out and event-time checks 12117// so that event delegation works in jQuery. 12118// Do the same for pointerenter/pointerleave and pointerover/pointerout 12119// 12120// Support: Safari 7 only 12121// Safari sends mouseenter too often; see: 12122// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 12123// for the description of the bug (it existed in older Chrome versions as well). 12124jQuery.each( { 12125 mouseenter: "mouseover", 12126 mouseleave: "mouseout", 12127 pointerenter: "pointerover", 12128 pointerleave: "pointerout" 12129}, function( orig, fix ) { 12130 jQuery.event.special[ orig ] = { 12131 delegateType: fix, 12132 bindType: fix, 12133 12134 handle: function( event ) { 12135 var ret, 12136 target = this, 12137 related = event.relatedTarget, 12138 handleObj = event.handleObj; 12139 12140 // For mouseenter/leave call the handler if related is outside the target. 12141 // NB: No relatedTarget if the mouse left/entered the browser window 12142 if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { 12143 event.type = handleObj.origType; 12144 ret = handleObj.handler.apply( this, arguments ); 12145 event.type = fix; 12146 } 12147 return ret; 12148 } 12149 }; 12150} ); 12151 12152jQuery.fn.extend( { 12153 12154 on: function( types, selector, data, fn ) { 12155 return on( this, types, selector, data, fn ); 12156 }, 12157 one: function( types, selector, data, fn ) { 12158 return on( this, types, selector, data, fn, 1 ); 12159 }, 12160 off: function( types, selector, fn ) { 12161 var handleObj, type; 12162 if ( types && types.preventDefault && types.handleObj ) { 12163 12164 // ( event ) dispatched jQuery.Event 12165 handleObj = types.handleObj; 12166 jQuery( types.delegateTarget ).off( 12167 handleObj.namespace ? 12168 handleObj.origType + "." + handleObj.namespace : 12169 handleObj.origType, 12170 handleObj.selector, 12171 handleObj.handler 12172 ); 12173 return this; 12174 } 12175 if ( typeof types === "object" ) { 12176 12177 // ( types-object [, selector] ) 12178 for ( type in types ) { 12179 this.off( type, selector, types[ type ] ); 12180 } 12181 return this; 12182 } 12183 if ( selector === false || typeof selector === "function" ) { 12184 12185 // ( types [, fn] ) 12186 fn = selector; 12187 selector = undefined; 12188 } 12189 if ( fn === false ) { 12190 fn = returnFalse; 12191 } 12192 return this.each( function() { 12193 jQuery.event.remove( this, types, fn, selector ); 12194 } ); 12195 } 12196} ); 12197 12198 12199var 12200 12201 // Support: IE <=10 - 11, Edge 12 - 13 only 12202 // In IE/Edge using regex groups here causes severe slowdowns. 12203 // See https://connect.microsoft.com/IE/feedback/details/1736512/ 12204 rnoInnerhtml = /<script|<style|<link/i, 12205 12206 // checked="checked" or checked 12207 rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, 12208 rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g; 12209 12210// Prefer a tbody over its parent table for containing new rows 12211function manipulationTarget( elem, content ) { 12212 if ( nodeName( elem, "table" ) && 12213 nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { 12214 12215 return jQuery( elem ).children( "tbody" )[ 0 ] || elem; 12216 } 12217 12218 return elem; 12219} 12220 12221// Replace/restore the type attribute of script elements for safe DOM manipulation 12222function disableScript( elem ) { 12223 elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; 12224 return elem; 12225} 12226function restoreScript( elem ) { 12227 if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { 12228 elem.type = elem.type.slice( 5 ); 12229 } else { 12230 elem.removeAttribute( "type" ); 12231 } 12232 12233 return elem; 12234} 12235 12236function cloneCopyEvent( src, dest ) { 12237 var i, l, type, pdataOld, udataOld, udataCur, events; 12238 12239 if ( dest.nodeType !== 1 ) { 12240 return; 12241 } 12242 12243 // 1. Copy private data: events, handlers, etc. 12244 if ( dataPriv.hasData( src ) ) { 12245 pdataOld = dataPriv.get( src ); 12246 events = pdataOld.events; 12247 12248 if ( events ) { 12249 dataPriv.remove( dest, "handle events" ); 12250 12251 for ( type in events ) { 12252 for ( i = 0, l = events[ type ].length; i < l; i++ ) { 12253 jQuery.event.add( dest, type, events[ type ][ i ] ); 12254 } 12255 } 12256 } 12257 } 12258 12259 // 2. Copy user data 12260 if ( dataUser.hasData( src ) ) { 12261 udataOld = dataUser.access( src ); 12262 udataCur = jQuery.extend( {}, udataOld ); 12263 12264 dataUser.set( dest, udataCur ); 12265 } 12266} 12267 12268// Fix IE bugs, see support tests 12269function fixInput( src, dest ) { 12270 var nodeName = dest.nodeName.toLowerCase(); 12271 12272 // Fails to persist the checked state of a cloned checkbox or radio button. 12273 if ( nodeName === "input" && rcheckableType.test( src.type ) ) { 12274 dest.checked = src.checked; 12275 12276 // Fails to return the selected option to the default selected state when cloning options 12277 } else if ( nodeName === "input" || nodeName === "textarea" ) { 12278 dest.defaultValue = src.defaultValue; 12279 } 12280} 12281 12282function domManip( collection, args, callback, ignored ) { 12283 12284 // Flatten any nested arrays 12285 args = flat( args ); 12286 12287 var fragment, first, scripts, hasScripts, node, doc, 12288 i = 0, 12289 l = collection.length, 12290 iNoClone = l - 1, 12291 value = args[ 0 ], 12292 valueIsFunction = isFunction( value ); 12293 12294 // We can't cloneNode fragments that contain checked, in WebKit 12295 if ( valueIsFunction || 12296 ( l > 1 && typeof value === "string" && 12297 !support.checkClone && rchecked.test( value ) ) ) { 12298 return collection.each( function( index ) { 12299 var self = collection.eq( index ); 12300 if ( valueIsFunction ) { 12301 args[ 0 ] = value.call( this, index, self.html() ); 12302 } 12303 domManip( self, args, callback, ignored ); 12304 } ); 12305 } 12306 12307 if ( l ) { 12308 fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); 12309 first = fragment.firstChild; 12310 12311 if ( fragment.childNodes.length === 1 ) { 12312 fragment = first; 12313 } 12314 12315 // Require either new content or an interest in ignored elements to invoke the callback 12316 if ( first || ignored ) { 12317 scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); 12318 hasScripts = scripts.length; 12319 12320 // Use the original fragment for the last item 12321 // instead of the first because it can end up 12322 // being emptied incorrectly in certain situations (#8070). 12323 for ( ; i < l; i++ ) { 12324 node = fragment; 12325 12326 if ( i !== iNoClone ) { 12327 node = jQuery.clone( node, true, true ); 12328 12329 // Keep references to cloned scripts for later restoration 12330 if ( hasScripts ) { 12331 12332 // Support: Android <=4.0 only, PhantomJS 1 only 12333 // push.apply(_, arraylike) throws on ancient WebKit 12334 jQuery.merge( scripts, getAll( node, "script" ) ); 12335 } 12336 } 12337 12338 callback.call( collection[ i ], node, i ); 12339 } 12340 12341 if ( hasScripts ) { 12342 doc = scripts[ scripts.length - 1 ].ownerDocument; 12343 12344 // Reenable scripts 12345 jQuery.map( scripts, restoreScript ); 12346 12347 // Evaluate executable scripts on first document insertion 12348 for ( i = 0; i < hasScripts; i++ ) { 12349 node = scripts[ i ]; 12350 if ( rscriptType.test( node.type || "" ) && 12351 !dataPriv.access( node, "globalEval" ) && 12352 jQuery.contains( doc, node ) ) { 12353 12354 if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { 12355 12356 // Optional AJAX dependency, but won't run scripts if not present 12357 if ( jQuery._evalUrl && !node.noModule ) { 12358 jQuery._evalUrl( node.src, { 12359 nonce: node.nonce || node.getAttribute( "nonce" ) 12360 }, doc ); 12361 } 12362 } else { 12363 DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); 12364 } 12365 } 12366 } 12367 } 12368 } 12369 } 12370 12371 return collection; 12372} 12373 12374function remove( elem, selector, keepData ) { 12375 var node, 12376 nodes = selector ? jQuery.filter( selector, elem ) : elem, 12377 i = 0; 12378 12379 for ( ; ( node = nodes[ i ] ) != null; i++ ) { 12380 if ( !keepData && node.nodeType === 1 ) { 12381 jQuery.cleanData( getAll( node ) ); 12382 } 12383 12384 if ( node.parentNode ) { 12385 if ( keepData && isAttached( node ) ) { 12386 setGlobalEval( getAll( node, "script" ) ); 12387 } 12388 node.parentNode.removeChild( node ); 12389 } 12390 } 12391 12392 return elem; 12393} 12394 12395jQuery.extend( { 12396 htmlPrefilter: function( html ) { 12397 return html; 12398 }, 12399 12400 clone: function( elem, dataAndEvents, deepDataAndEvents ) { 12401 var i, l, srcElements, destElements, 12402 clone = elem.cloneNode( true ), 12403 inPage = isAttached( elem ); 12404 12405 // Fix IE cloning issues 12406 if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && 12407 !jQuery.isXMLDoc( elem ) ) { 12408 12409 // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 12410 destElements = getAll( clone ); 12411 srcElements = getAll( elem ); 12412 12413 for ( i = 0, l = srcElements.length; i < l; i++ ) { 12414 fixInput( srcElements[ i ], destElements[ i ] ); 12415 } 12416 } 12417 12418 // Copy the events from the original to the clone 12419 if ( dataAndEvents ) { 12420 if ( deepDataAndEvents ) { 12421 srcElements = srcElements || getAll( elem ); 12422 destElements = destElements || getAll( clone ); 12423 12424 for ( i = 0, l = srcElements.length; i < l; i++ ) { 12425 cloneCopyEvent( srcElements[ i ], destElements[ i ] ); 12426 } 12427 } else { 12428 cloneCopyEvent( elem, clone ); 12429 } 12430 } 12431 12432 // Preserve script evaluation history 12433 destElements = getAll( clone, "script" ); 12434 if ( destElements.length > 0 ) { 12435 setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); 12436 } 12437 12438 // Return the cloned set 12439 return clone; 12440 }, 12441 12442 cleanData: function( elems ) { 12443 var data, elem, type, 12444 special = jQuery.event.special, 12445 i = 0; 12446 12447 for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { 12448 if ( acceptData( elem ) ) { 12449 if ( ( data = elem[ dataPriv.expando ] ) ) { 12450 if ( data.events ) { 12451 for ( type in data.events ) { 12452 if ( special[ type ] ) { 12453 jQuery.event.remove( elem, type ); 12454 12455 // This is a shortcut to avoid jQuery.event.remove's overhead 12456 } else { 12457 jQuery.removeEvent( elem, type, data.handle ); 12458 } 12459 } 12460 } 12461 12462 // Support: Chrome <=35 - 45+ 12463 // Assign undefined instead of using delete, see Data#remove 12464 elem[ dataPriv.expando ] = undefined; 12465 } 12466 if ( elem[ dataUser.expando ] ) { 12467 12468 // Support: Chrome <=35 - 45+ 12469 // Assign undefined instead of using delete, see Data#remove 12470 elem[ dataUser.expando ] = undefined; 12471 } 12472 } 12473 } 12474 } 12475} ); 12476 12477jQuery.fn.extend( { 12478 detach: function( selector ) { 12479 return remove( this, selector, true ); 12480 }, 12481 12482 remove: function( selector ) { 12483 return remove( this, selector ); 12484 }, 12485 12486 text: function( value ) { 12487 return access( this, function( value ) { 12488 return value === undefined ? 12489 jQuery.text( this ) : 12490 this.empty().each( function() { 12491 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 12492 this.textContent = value; 12493 } 12494 } ); 12495 }, null, value, arguments.length ); 12496 }, 12497 12498 append: function() { 12499 return domManip( this, arguments, function( elem ) { 12500 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 12501 var target = manipulationTarget( this, elem ); 12502 target.appendChild( elem ); 12503 } 12504 } ); 12505 }, 12506 12507 prepend: function() { 12508 return domManip( this, arguments, function( elem ) { 12509 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 12510 var target = manipulationTarget( this, elem ); 12511 target.insertBefore( elem, target.firstChild ); 12512 } 12513 } ); 12514 }, 12515 12516 before: function() { 12517 return domManip( this, arguments, function( elem ) { 12518 if ( this.parentNode ) { 12519 this.parentNode.insertBefore( elem, this ); 12520 } 12521 } ); 12522 }, 12523 12524 after: function() { 12525 return domManip( this, arguments, function( elem ) { 12526 if ( this.parentNode ) { 12527 this.parentNode.insertBefore( elem, this.nextSibling ); 12528 } 12529 } ); 12530 }, 12531 12532 empty: function() { 12533 var elem, 12534 i = 0; 12535 12536 for ( ; ( elem = this[ i ] ) != null; i++ ) { 12537 if ( elem.nodeType === 1 ) { 12538 12539 // Prevent memory leaks 12540 jQuery.cleanData( getAll( elem, false ) ); 12541 12542 // Remove any remaining nodes 12543 elem.textContent = ""; 12544 } 12545 } 12546 12547 return this; 12548 }, 12549 12550 clone: function( dataAndEvents, deepDataAndEvents ) { 12551 dataAndEvents = dataAndEvents == null ? false : dataAndEvents; 12552 deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; 12553 12554 return this.map( function() { 12555 return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); 12556 } ); 12557 }, 12558 12559 html: function( value ) { 12560 return access( this, function( value ) { 12561 var elem = this[ 0 ] || {}, 12562 i = 0, 12563 l = this.length; 12564 12565 if ( value === undefined && elem.nodeType === 1 ) { 12566 return elem.innerHTML; 12567 } 12568 12569 // See if we can take a shortcut and just use innerHTML 12570 if ( typeof value === "string" && !rnoInnerhtml.test( value ) && 12571 !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { 12572 12573 value = jQuery.htmlPrefilter( value ); 12574 12575 try { 12576 for ( ; i < l; i++ ) { 12577 elem = this[ i ] || {}; 12578 12579 // Remove element nodes and prevent memory leaks 12580 if ( elem.nodeType === 1 ) { 12581 jQuery.cleanData( getAll( elem, false ) ); 12582 elem.innerHTML = value; 12583 } 12584 } 12585 12586 elem = 0; 12587 12588 // If using innerHTML throws an exception, use the fallback method 12589 } catch ( e ) {} 12590 } 12591 12592 if ( elem ) { 12593 this.empty().append( value ); 12594 } 12595 }, null, value, arguments.length ); 12596 }, 12597 12598 replaceWith: function() { 12599 var ignored = []; 12600 12601 // Make the changes, replacing each non-ignored context element with the new content 12602 return domManip( this, arguments, function( elem ) { 12603 var parent = this.parentNode; 12604 12605 if ( jQuery.inArray( this, ignored ) < 0 ) { 12606 jQuery.cleanData( getAll( this ) ); 12607 if ( parent ) { 12608 parent.replaceChild( elem, this ); 12609 } 12610 } 12611 12612 // Force callback invocation 12613 }, ignored ); 12614 } 12615} ); 12616 12617jQuery.each( { 12618 appendTo: "append", 12619 prependTo: "prepend", 12620 insertBefore: "before", 12621 insertAfter: "after", 12622 replaceAll: "replaceWith" 12623}, function( name, original ) { 12624 jQuery.fn[ name ] = function( selector ) { 12625 var elems, 12626 ret = [], 12627 insert = jQuery( selector ), 12628 last = insert.length - 1, 12629 i = 0; 12630 12631 for ( ; i <= last; i++ ) { 12632 elems = i === last ? this : this.clone( true ); 12633 jQuery( insert[ i ] )[ original ]( elems ); 12634 12635 // Support: Android <=4.0 only, PhantomJS 1 only 12636 // .get() because push.apply(_, arraylike) throws on ancient WebKit 12637 push.apply( ret, elems.get() ); 12638 } 12639 12640 return this.pushStack( ret ); 12641 }; 12642} ); 12643var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); 12644 12645var getStyles = function( elem ) { 12646 12647 // Support: IE <=11 only, Firefox <=30 (#15098, #14150) 12648 // IE throws on elements created in popups 12649 // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" 12650 var view = elem.ownerDocument.defaultView; 12651 12652 if ( !view || !view.opener ) { 12653 view = window; 12654 } 12655 12656 return view.getComputedStyle( elem ); 12657 }; 12658 12659var swap = function( elem, options, callback ) { 12660 var ret, name, 12661 old = {}; 12662 12663 // Remember the old values, and insert the new ones 12664 for ( name in options ) { 12665 old[ name ] = elem.style[ name ]; 12666 elem.style[ name ] = options[ name ]; 12667 } 12668 12669 ret = callback.call( elem ); 12670 12671 // Revert the old values 12672 for ( name in options ) { 12673 elem.style[ name ] = old[ name ]; 12674 } 12675 12676 return ret; 12677}; 12678 12679 12680var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); 12681 12682 12683 12684( function() { 12685 12686 // Executing both pixelPosition & boxSizingReliable tests require only one layout 12687 // so they're executed at the same time to save the second computation. 12688 function computeStyleTests() { 12689 12690 // This is a singleton, we need to execute it only once 12691 if ( !div ) { 12692 return; 12693 } 12694 12695 container.style.cssText = "position:absolute;left:-11111px;width:60px;" + 12696 "margin-top:1px;padding:0;border:0"; 12697 div.style.cssText = 12698 "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + 12699 "margin:auto;border:1px;padding:1px;" + 12700 "width:60%;top:1%"; 12701 documentElement.appendChild( container ).appendChild( div ); 12702 12703 var divStyle = window.getComputedStyle( div ); 12704 pixelPositionVal = divStyle.top !== "1%"; 12705 12706 // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 12707 reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; 12708 12709 // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 12710 // Some styles come back with percentage values, even though they shouldn't 12711 div.style.right = "60%"; 12712 pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; 12713 12714 // Support: IE 9 - 11 only 12715 // Detect misreporting of content dimensions for box-sizing:border-box elements 12716 boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; 12717 12718 // Support: IE 9 only 12719 // Detect overflow:scroll screwiness (gh-3699) 12720 // Support: Chrome <=64 12721 // Don't get tricked when zoom affects offsetWidth (gh-4029) 12722 div.style.position = "absolute"; 12723 scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; 12724 12725 documentElement.removeChild( container ); 12726 12727 // Nullify the div so it wouldn't be stored in the memory and 12728 // it will also be a sign that checks already performed 12729 div = null; 12730 } 12731 12732 function roundPixelMeasures( measure ) { 12733 return Math.round( parseFloat( measure ) ); 12734 } 12735 12736 var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, 12737 reliableTrDimensionsVal, reliableMarginLeftVal, 12738 container = document.createElement( "div" ), 12739 div = document.createElement( "div" ); 12740 12741 // Finish early in limited (non-browser) environments 12742 if ( !div.style ) { 12743 return; 12744 } 12745 12746 // Support: IE <=9 - 11 only 12747 // Style of cloned element affects source element cloned (#8908) 12748 div.style.backgroundClip = "content-box"; 12749 div.cloneNode( true ).style.backgroundClip = ""; 12750 support.clearCloneStyle = div.style.backgroundClip === "content-box"; 12751 12752 jQuery.extend( support, { 12753 boxSizingReliable: function() { 12754 computeStyleTests(); 12755 return boxSizingReliableVal; 12756 }, 12757 pixelBoxStyles: function() { 12758 computeStyleTests(); 12759 return pixelBoxStylesVal; 12760 }, 12761 pixelPosition: function() { 12762 computeStyleTests(); 12763 return pixelPositionVal; 12764 }, 12765 reliableMarginLeft: function() { 12766 computeStyleTests(); 12767 return reliableMarginLeftVal; 12768 }, 12769 scrollboxSize: function() { 12770 computeStyleTests(); 12771 return scrollboxSizeVal; 12772 }, 12773 12774 // Support: IE 9 - 11+, Edge 15 - 18+ 12775 // IE/Edge misreport `getComputedStyle` of table rows with width/height 12776 // set in CSS while `offset*` properties report correct values. 12777 // Behavior in IE 9 is more subtle than in newer versions & it passes 12778 // some versions of this test; make sure not to make it pass there! 12779 // 12780 // Support: Firefox 70+ 12781 // Only Firefox includes border widths 12782 // in computed dimensions. (gh-4529) 12783 reliableTrDimensions: function() { 12784 var table, tr, trChild, trStyle; 12785 if ( reliableTrDimensionsVal == null ) { 12786 table = document.createElement( "table" ); 12787 tr = document.createElement( "tr" ); 12788 trChild = document.createElement( "div" ); 12789 12790 table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; 12791 tr.style.cssText = "border:1px solid"; 12792 12793 // Support: Chrome 86+ 12794 // Height set through cssText does not get applied. 12795 // Computed height then comes back as 0. 12796 tr.style.height = "1px"; 12797 trChild.style.height = "9px"; 12798 12799 // Support: Android 8 Chrome 86+ 12800 // In our bodyBackground.html iframe, 12801 // display for all div elements is set to "inline", 12802 // which causes a problem only in Android 8 Chrome 86. 12803 // Ensuring the div is display: block 12804 // gets around this issue. 12805 trChild.style.display = "block"; 12806 12807 documentElement 12808 .appendChild( table ) 12809 .appendChild( tr ) 12810 .appendChild( trChild ); 12811 12812 trStyle = window.getComputedStyle( tr ); 12813 reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + 12814 parseInt( trStyle.borderTopWidth, 10 ) + 12815 parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; 12816 12817 documentElement.removeChild( table ); 12818 } 12819 return reliableTrDimensionsVal; 12820 } 12821 } ); 12822} )(); 12823 12824 12825function curCSS( elem, name, computed ) { 12826 var width, minWidth, maxWidth, ret, 12827 12828 // Support: Firefox 51+ 12829 // Retrieving style before computed somehow 12830 // fixes an issue with getting wrong values 12831 // on detached elements 12832 style = elem.style; 12833 12834 computed = computed || getStyles( elem ); 12835 12836 // getPropertyValue is needed for: 12837 // .css('filter') (IE 9 only, #12537) 12838 // .css('--customProperty) (#3144) 12839 if ( computed ) { 12840 ret = computed.getPropertyValue( name ) || computed[ name ]; 12841 12842 if ( ret === "" && !isAttached( elem ) ) { 12843 ret = jQuery.style( elem, name ); 12844 } 12845 12846 // A tribute to the "awesome hack by Dean Edwards" 12847 // Android Browser returns percentage for some values, 12848 // but width seems to be reliably pixels. 12849 // This is against the CSSOM draft spec: 12850 // https://drafts.csswg.org/cssom/#resolved-values 12851 if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { 12852 12853 // Remember the original values 12854 width = style.width; 12855 minWidth = style.minWidth; 12856 maxWidth = style.maxWidth; 12857 12858 // Put in the new values to get a computed value out 12859 style.minWidth = style.maxWidth = style.width = ret; 12860 ret = computed.width; 12861 12862 // Revert the changed values 12863 style.width = width; 12864 style.minWidth = minWidth; 12865 style.maxWidth = maxWidth; 12866 } 12867 } 12868 12869 return ret !== undefined ? 12870 12871 // Support: IE <=9 - 11 only 12872 // IE returns zIndex value as an integer. 12873 ret + "" : 12874 ret; 12875} 12876 12877 12878function addGetHookIf( conditionFn, hookFn ) { 12879 12880 // Define the hook, we'll check on the first run if it's really needed. 12881 return { 12882 get: function() { 12883 if ( conditionFn() ) { 12884 12885 // Hook not needed (or it's not possible to use it due 12886 // to missing dependency), remove it. 12887 delete this.get; 12888 return; 12889 } 12890 12891 // Hook needed; redefine it so that the support test is not executed again. 12892 return ( this.get = hookFn ).apply( this, arguments ); 12893 } 12894 }; 12895} 12896 12897 12898var cssPrefixes = [ "Webkit", "Moz", "ms" ], 12899 emptyStyle = document.createElement( "div" ).style, 12900 vendorProps = {}; 12901 12902// Return a vendor-prefixed property or undefined 12903function vendorPropName( name ) { 12904 12905 // Check for vendor prefixed names 12906 var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), 12907 i = cssPrefixes.length; 12908 12909 while ( i-- ) { 12910 name = cssPrefixes[ i ] + capName; 12911 if ( name in emptyStyle ) { 12912 return name; 12913 } 12914 } 12915} 12916 12917// Return a potentially-mapped jQuery.cssProps or vendor prefixed property 12918function finalPropName( name ) { 12919 var final = jQuery.cssProps[ name ] || vendorProps[ name ]; 12920 12921 if ( final ) { 12922 return final; 12923 } 12924 if ( name in emptyStyle ) { 12925 return name; 12926 } 12927 return vendorProps[ name ] = vendorPropName( name ) || name; 12928} 12929 12930 12931var 12932 12933 // Swappable if display is none or starts with table 12934 // except "table", "table-cell", or "table-caption" 12935 // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display 12936 rdisplayswap = /^(none|table(?!-c[ea]).+)/, 12937 rcustomProp = /^--/, 12938 cssShow = { position: "absolute", visibility: "hidden", display: "block" }, 12939 cssNormalTransform = { 12940 letterSpacing: "0", 12941 fontWeight: "400" 12942 }; 12943 12944function setPositiveNumber( _elem, value, subtract ) { 12945 12946 // Any relative (+/-) values have already been 12947 // normalized at this point 12948 var matches = rcssNum.exec( value ); 12949 return matches ? 12950 12951 // Guard against undefined "subtract", e.g., when used as in cssHooks 12952 Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : 12953 value; 12954} 12955 12956function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { 12957 var i = dimension === "width" ? 1 : 0, 12958 extra = 0, 12959 delta = 0; 12960 12961 // Adjustment may not be necessary 12962 if ( box === ( isBorderBox ? "border" : "content" ) ) { 12963 return 0; 12964 } 12965 12966 for ( ; i < 4; i += 2 ) { 12967 12968 // Both box models exclude margin 12969 if ( box === "margin" ) { 12970 delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); 12971 } 12972 12973 // If we get here with a content-box, we're seeking "padding" or "border" or "margin" 12974 if ( !isBorderBox ) { 12975 12976 // Add padding 12977 delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); 12978 12979 // For "border" or "margin", add border 12980 if ( box !== "padding" ) { 12981 delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 12982 12983 // But still keep track of it otherwise 12984 } else { 12985 extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 12986 } 12987 12988 // If we get here with a border-box (content + padding + border), we're seeking "content" or 12989 // "padding" or "margin" 12990 } else { 12991 12992 // For "content", subtract padding 12993 if ( box === "content" ) { 12994 delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); 12995 } 12996 12997 // For "content" or "padding", subtract border 12998 if ( box !== "margin" ) { 12999 delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 13000 } 13001 } 13002 } 13003 13004 // Account for positive content-box scroll gutter when requested by providing computedVal 13005 if ( !isBorderBox && computedVal >= 0 ) { 13006 13007 // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border 13008 // Assuming integer scroll gutter, subtract the rest and round down 13009 delta += Math.max( 0, Math.ceil( 13010 elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - 13011 computedVal - 13012 delta - 13013 extra - 13014 0.5 13015 13016 // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter 13017 // Use an explicit zero to avoid NaN (gh-3964) 13018 ) ) || 0; 13019 } 13020 13021 return delta; 13022} 13023 13024function getWidthOrHeight( elem, dimension, extra ) { 13025 13026 // Start with computed style 13027 var styles = getStyles( elem ), 13028 13029 // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). 13030 // Fake content-box until we know it's needed to know the true value. 13031 boxSizingNeeded = !support.boxSizingReliable() || extra, 13032 isBorderBox = boxSizingNeeded && 13033 jQuery.css( elem, "boxSizing", false, styles ) === "border-box", 13034 valueIsBorderBox = isBorderBox, 13035 13036 val = curCSS( elem, dimension, styles ), 13037 offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); 13038 13039 // Support: Firefox <=54 13040 // Return a confounding non-pixel value or feign ignorance, as appropriate. 13041 if ( rnumnonpx.test( val ) ) { 13042 if ( !extra ) { 13043 return val; 13044 } 13045 val = "auto"; 13046 } 13047 13048 13049 // Support: IE 9 - 11 only 13050 // Use offsetWidth/offsetHeight for when box sizing is unreliable. 13051 // In those cases, the computed value can be trusted to be border-box. 13052 if ( ( !support.boxSizingReliable() && isBorderBox || 13053 13054 // Support: IE 10 - 11+, Edge 15 - 18+ 13055 // IE/Edge misreport `getComputedStyle` of table rows with width/height 13056 // set in CSS while `offset*` properties report correct values. 13057 // Interestingly, in some cases IE 9 doesn't suffer from this issue. 13058 !support.reliableTrDimensions() && nodeName( elem, "tr" ) || 13059 13060 // Fall back to offsetWidth/offsetHeight when value is "auto" 13061 // This happens for inline elements with no explicit setting (gh-3571) 13062 val === "auto" || 13063 13064 // Support: Android <=4.1 - 4.3 only 13065 // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) 13066 !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && 13067 13068 // Make sure the element is visible & connected 13069 elem.getClientRects().length ) { 13070 13071 isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; 13072 13073 // Where available, offsetWidth/offsetHeight approximate border box dimensions. 13074 // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the 13075 // retrieved value as a content box dimension. 13076 valueIsBorderBox = offsetProp in elem; 13077 if ( valueIsBorderBox ) { 13078 val = elem[ offsetProp ]; 13079 } 13080 } 13081 13082 // Normalize "" and auto 13083 val = parseFloat( val ) || 0; 13084 13085 // Adjust for the element's box model 13086 return ( val + 13087 boxModelAdjustment( 13088 elem, 13089 dimension, 13090 extra || ( isBorderBox ? "border" : "content" ), 13091 valueIsBorderBox, 13092 styles, 13093 13094 // Provide the current computed size to request scroll gutter calculation (gh-3589) 13095 val 13096 ) 13097 ) + "px"; 13098} 13099 13100jQuery.extend( { 13101 13102 // Add in style property hooks for overriding the default 13103 // behavior of getting and setting a style property 13104 cssHooks: { 13105 opacity: { 13106 get: function( elem, computed ) { 13107 if ( computed ) { 13108 13109 // We should always get a number back from opacity 13110 var ret = curCSS( elem, "opacity" ); 13111 return ret === "" ? "1" : ret; 13112 } 13113 } 13114 } 13115 }, 13116 13117 // Don't automatically add "px" to these possibly-unitless properties 13118 cssNumber: { 13119 "animationIterationCount": true, 13120 "columnCount": true, 13121 "fillOpacity": true, 13122 "flexGrow": true, 13123 "flexShrink": true, 13124 "fontWeight": true, 13125 "gridArea": true, 13126 "gridColumn": true, 13127 "gridColumnEnd": true, 13128 "gridColumnStart": true, 13129 "gridRow": true, 13130 "gridRowEnd": true, 13131 "gridRowStart": true, 13132 "lineHeight": true, 13133 "opacity": true, 13134 "order": true, 13135 "orphans": true, 13136 "widows": true, 13137 "zIndex": true, 13138 "zoom": true 13139 }, 13140 13141 // Add in properties whose names you wish to fix before 13142 // setting or getting the value 13143 cssProps: {}, 13144 13145 // Get and set the style property on a DOM Node 13146 style: function( elem, name, value, extra ) { 13147 13148 // Don't set styles on text and comment nodes 13149 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { 13150 return; 13151 } 13152 13153 // Make sure that we're working with the right name 13154 var ret, type, hooks, 13155 origName = camelCase( name ), 13156 isCustomProp = rcustomProp.test( name ), 13157 style = elem.style; 13158 13159 // Make sure that we're working with the right name. We don't 13160 // want to query the value if it is a CSS custom property 13161 // since they are user-defined. 13162 if ( !isCustomProp ) { 13163 name = finalPropName( origName ); 13164 } 13165 13166 // Gets hook for the prefixed version, then unprefixed version 13167 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; 13168 13169 // Check if we're setting a value 13170 if ( value !== undefined ) { 13171 type = typeof value; 13172 13173 // Convert "+=" or "-=" to relative numbers (#7345) 13174 if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { 13175 value = adjustCSS( elem, name, ret ); 13176 13177 // Fixes bug #9237 13178 type = "number"; 13179 } 13180 13181 // Make sure that null and NaN values aren't set (#7116) 13182 if ( value == null || value !== value ) { 13183 return; 13184 } 13185 13186 // If a number was passed in, add the unit (except for certain CSS properties) 13187 // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append 13188 // "px" to a few hardcoded values. 13189 if ( type === "number" && !isCustomProp ) { 13190 value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); 13191 } 13192 13193 // background-* props affect original clone's values 13194 if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { 13195 style[ name ] = "inherit"; 13196 } 13197 13198 // If a hook was provided, use that value, otherwise just set the specified value 13199 if ( !hooks || !( "set" in hooks ) || 13200 ( value = hooks.set( elem, value, extra ) ) !== undefined ) { 13201 13202 if ( isCustomProp ) { 13203 style.setProperty( name, value ); 13204 } else { 13205 style[ name ] = value; 13206 } 13207 } 13208 13209 } else { 13210 13211 // If a hook was provided get the non-computed value from there 13212 if ( hooks && "get" in hooks && 13213 ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { 13214 13215 return ret; 13216 } 13217 13218 // Otherwise just get the value from the style object 13219 return style[ name ]; 13220 } 13221 }, 13222 13223 css: function( elem, name, extra, styles ) { 13224 var val, num, hooks, 13225 origName = camelCase( name ), 13226 isCustomProp = rcustomProp.test( name ); 13227 13228 // Make sure that we're working with the right name. We don't 13229 // want to modify the value if it is a CSS custom property 13230 // since they are user-defined. 13231 if ( !isCustomProp ) { 13232 name = finalPropName( origName ); 13233 } 13234 13235 // Try prefixed name followed by the unprefixed name 13236 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; 13237 13238 // If a hook was provided get the computed value from there 13239 if ( hooks && "get" in hooks ) { 13240 val = hooks.get( elem, true, extra ); 13241 } 13242 13243 // Otherwise, if a way to get the computed value exists, use that 13244 if ( val === undefined ) { 13245 val = curCSS( elem, name, styles ); 13246 } 13247 13248 // Convert "normal" to computed value 13249 if ( val === "normal" && name in cssNormalTransform ) { 13250 val = cssNormalTransform[ name ]; 13251 } 13252 13253 // Make numeric if forced or a qualifier was provided and val looks numeric 13254 if ( extra === "" || extra ) { 13255 num = parseFloat( val ); 13256 return extra === true || isFinite( num ) ? num || 0 : val; 13257 } 13258 13259 return val; 13260 } 13261} ); 13262 13263jQuery.each( [ "height", "width" ], function( _i, dimension ) { 13264 jQuery.cssHooks[ dimension ] = { 13265 get: function( elem, computed, extra ) { 13266 if ( computed ) { 13267 13268 // Certain elements can have dimension info if we invisibly show them 13269 // but it must have a current display style that would benefit 13270 return rdisplayswap.test( jQuery.css( elem, "display" ) ) && 13271 13272 // Support: Safari 8+ 13273 // Table columns in Safari have non-zero offsetWidth & zero 13274 // getBoundingClientRect().width unless display is changed. 13275 // Support: IE <=11 only 13276 // Running getBoundingClientRect on a disconnected node 13277 // in IE throws an error. 13278 ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? 13279 swap( elem, cssShow, function() { 13280 return getWidthOrHeight( elem, dimension, extra ); 13281 } ) : 13282 getWidthOrHeight( elem, dimension, extra ); 13283 } 13284 }, 13285 13286 set: function( elem, value, extra ) { 13287 var matches, 13288 styles = getStyles( elem ), 13289 13290 // Only read styles.position if the test has a chance to fail 13291 // to avoid forcing a reflow. 13292 scrollboxSizeBuggy = !support.scrollboxSize() && 13293 styles.position === "absolute", 13294 13295 // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) 13296 boxSizingNeeded = scrollboxSizeBuggy || extra, 13297 isBorderBox = boxSizingNeeded && 13298 jQuery.css( elem, "boxSizing", false, styles ) === "border-box", 13299 subtract = extra ? 13300 boxModelAdjustment( 13301 elem, 13302 dimension, 13303 extra, 13304 isBorderBox, 13305 styles 13306 ) : 13307 0; 13308 13309 // Account for unreliable border-box dimensions by comparing offset* to computed and 13310 // faking a content-box to get border and padding (gh-3699) 13311 if ( isBorderBox && scrollboxSizeBuggy ) { 13312 subtract -= Math.ceil( 13313 elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - 13314 parseFloat( styles[ dimension ] ) - 13315 boxModelAdjustment( elem, dimension, "border", false, styles ) - 13316 0.5 13317 ); 13318 } 13319 13320 // Convert to pixels if value adjustment is needed 13321 if ( subtract && ( matches = rcssNum.exec( value ) ) && 13322 ( matches[ 3 ] || "px" ) !== "px" ) { 13323 13324 elem.style[ dimension ] = value; 13325 value = jQuery.css( elem, dimension ); 13326 } 13327 13328 return setPositiveNumber( elem, value, subtract ); 13329 } 13330 }; 13331} ); 13332 13333jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, 13334 function( elem, computed ) { 13335 if ( computed ) { 13336 return ( parseFloat( curCSS( elem, "marginLeft" ) ) || 13337 elem.getBoundingClientRect().left - 13338 swap( elem, { marginLeft: 0 }, function() { 13339 return elem.getBoundingClientRect().left; 13340 } ) 13341 ) + "px"; 13342 } 13343 } 13344); 13345 13346// These hooks are used by animate to expand properties 13347jQuery.each( { 13348 margin: "", 13349 padding: "", 13350 border: "Width" 13351}, function( prefix, suffix ) { 13352 jQuery.cssHooks[ prefix + suffix ] = { 13353 expand: function( value ) { 13354 var i = 0, 13355 expanded = {}, 13356 13357 // Assumes a single number if not a string 13358 parts = typeof value === "string" ? value.split( " " ) : [ value ]; 13359 13360 for ( ; i < 4; i++ ) { 13361 expanded[ prefix + cssExpand[ i ] + suffix ] = 13362 parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; 13363 } 13364 13365 return expanded; 13366 } 13367 }; 13368 13369 if ( prefix !== "margin" ) { 13370 jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; 13371 } 13372} ); 13373 13374jQuery.fn.extend( { 13375 css: function( name, value ) { 13376 return access( this, function( elem, name, value ) { 13377 var styles, len, 13378 map = {}, 13379 i = 0; 13380 13381 if ( Array.isArray( name ) ) { 13382 styles = getStyles( elem ); 13383 len = name.length; 13384 13385 for ( ; i < len; i++ ) { 13386 map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); 13387 } 13388 13389 return map; 13390 } 13391 13392 return value !== undefined ? 13393 jQuery.style( elem, name, value ) : 13394 jQuery.css( elem, name ); 13395 }, name, value, arguments.length > 1 ); 13396 } 13397} ); 13398 13399 13400function Tween( elem, options, prop, end, easing ) { 13401 return new Tween.prototype.init( elem, options, prop, end, easing ); 13402} 13403jQuery.Tween = Tween; 13404 13405Tween.prototype = { 13406 constructor: Tween, 13407 init: function( elem, options, prop, end, easing, unit ) { 13408 this.elem = elem; 13409 this.prop = prop; 13410 this.easing = easing || jQuery.easing._default; 13411 this.options = options; 13412 this.start = this.now = this.cur(); 13413 this.end = end; 13414 this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); 13415 }, 13416 cur: function() { 13417 var hooks = Tween.propHooks[ this.prop ]; 13418 13419 return hooks && hooks.get ? 13420 hooks.get( this ) : 13421 Tween.propHooks._default.get( this ); 13422 }, 13423 run: function( percent ) { 13424 var eased, 13425 hooks = Tween.propHooks[ this.prop ]; 13426 13427 if ( this.options.duration ) { 13428 this.pos = eased = jQuery.easing[ this.easing ]( 13429 percent, this.options.duration * percent, 0, 1, this.options.duration 13430 ); 13431 } else { 13432 this.pos = eased = percent; 13433 } 13434 this.now = ( this.end - this.start ) * eased + this.start; 13435 13436 if ( this.options.step ) { 13437 this.options.step.call( this.elem, this.now, this ); 13438 } 13439 13440 if ( hooks && hooks.set ) { 13441 hooks.set( this ); 13442 } else { 13443 Tween.propHooks._default.set( this ); 13444 } 13445 return this; 13446 } 13447}; 13448 13449Tween.prototype.init.prototype = Tween.prototype; 13450 13451Tween.propHooks = { 13452 _default: { 13453 get: function( tween ) { 13454 var result; 13455 13456 // Use a property on the element directly when it is not a DOM element, 13457 // or when there is no matching style property that exists. 13458 if ( tween.elem.nodeType !== 1 || 13459 tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { 13460 return tween.elem[ tween.prop ]; 13461 } 13462 13463 // Passing an empty string as a 3rd parameter to .css will automatically 13464 // attempt a parseFloat and fallback to a string if the parse fails. 13465 // Simple values such as "10px" are parsed to Float; 13466 // complex values such as "rotate(1rad)" are returned as-is. 13467 result = jQuery.css( tween.elem, tween.prop, "" ); 13468 13469 // Empty strings, null, undefined and "auto" are converted to 0. 13470 return !result || result === "auto" ? 0 : result; 13471 }, 13472 set: function( tween ) { 13473 13474 // Use step hook for back compat. 13475 // Use cssHook if its there. 13476 // Use .style if available and use plain properties where available. 13477 if ( jQuery.fx.step[ tween.prop ] ) { 13478 jQuery.fx.step[ tween.prop ]( tween ); 13479 } else if ( tween.elem.nodeType === 1 && ( 13480 jQuery.cssHooks[ tween.prop ] || 13481 tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { 13482 jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); 13483 } else { 13484 tween.elem[ tween.prop ] = tween.now; 13485 } 13486 } 13487 } 13488}; 13489 13490// Support: IE <=9 only 13491// Panic based approach to setting things on disconnected nodes 13492Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { 13493 set: function( tween ) { 13494 if ( tween.elem.nodeType && tween.elem.parentNode ) { 13495 tween.elem[ tween.prop ] = tween.now; 13496 } 13497 } 13498}; 13499 13500jQuery.easing = { 13501 linear: function( p ) { 13502 return p; 13503 }, 13504 swing: function( p ) { 13505 return 0.5 - Math.cos( p * Math.PI ) / 2; 13506 }, 13507 _default: "swing" 13508}; 13509 13510jQuery.fx = Tween.prototype.init; 13511 13512// Back compat <1.8 extension point 13513jQuery.fx.step = {}; 13514 13515 13516 13517 13518var 13519 fxNow, inProgress, 13520 rfxtypes = /^(?:toggle|show|hide)$/, 13521 rrun = /queueHooks$/; 13522 13523function schedule() { 13524 if ( inProgress ) { 13525 if ( document.hidden === false && window.requestAnimationFrame ) { 13526 window.requestAnimationFrame( schedule ); 13527 } else { 13528 window.setTimeout( schedule, jQuery.fx.interval ); 13529 } 13530 13531 jQuery.fx.tick(); 13532 } 13533} 13534 13535// Animations created synchronously will run synchronously 13536function createFxNow() { 13537 window.setTimeout( function() { 13538 fxNow = undefined; 13539 } ); 13540 return ( fxNow = Date.now() ); 13541} 13542 13543// Generate parameters to create a standard animation 13544function genFx( type, includeWidth ) { 13545 var which, 13546 i = 0, 13547 attrs = { height: type }; 13548 13549 // If we include width, step value is 1 to do all cssExpand values, 13550 // otherwise step value is 2 to skip over Left and Right 13551 includeWidth = includeWidth ? 1 : 0; 13552 for ( ; i < 4; i += 2 - includeWidth ) { 13553 which = cssExpand[ i ]; 13554 attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; 13555 } 13556 13557 if ( includeWidth ) { 13558 attrs.opacity = attrs.width = type; 13559 } 13560 13561 return attrs; 13562} 13563 13564function createTween( value, prop, animation ) { 13565 var tween, 13566 collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), 13567 index = 0, 13568 length = collection.length; 13569 for ( ; index < length; index++ ) { 13570 if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { 13571 13572 // We're done with this property 13573 return tween; 13574 } 13575 } 13576} 13577 13578function defaultPrefilter( elem, props, opts ) { 13579 var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, 13580 isBox = "width" in props || "height" in props, 13581 anim = this, 13582 orig = {}, 13583 style = elem.style, 13584 hidden = elem.nodeType && isHiddenWithinTree( elem ), 13585 dataShow = dataPriv.get( elem, "fxshow" ); 13586 13587 // Queue-skipping animations hijack the fx hooks 13588 if ( !opts.queue ) { 13589 hooks = jQuery._queueHooks( elem, "fx" ); 13590 if ( hooks.unqueued == null ) { 13591 hooks.unqueued = 0; 13592 oldfire = hooks.empty.fire; 13593 hooks.empty.fire = function() { 13594 if ( !hooks.unqueued ) { 13595 oldfire(); 13596 } 13597 }; 13598 } 13599 hooks.unqueued++; 13600 13601 anim.always( function() { 13602 13603 // Ensure the complete handler is called before this completes 13604 anim.always( function() { 13605 hooks.unqueued--; 13606 if ( !jQuery.queue( elem, "fx" ).length ) { 13607 hooks.empty.fire(); 13608 } 13609 } ); 13610 } ); 13611 } 13612 13613 // Detect show/hide animations 13614 for ( prop in props ) { 13615 value = props[ prop ]; 13616 if ( rfxtypes.test( value ) ) { 13617 delete props[ prop ]; 13618 toggle = toggle || value === "toggle"; 13619 if ( value === ( hidden ? "hide" : "show" ) ) { 13620 13621 // Pretend to be hidden if this is a "show" and 13622 // there is still data from a stopped show/hide 13623 if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { 13624 hidden = true; 13625 13626 // Ignore all other no-op show/hide data 13627 } else { 13628 continue; 13629 } 13630 } 13631 orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); 13632 } 13633 } 13634 13635 // Bail out if this is a no-op like .hide().hide() 13636 propTween = !jQuery.isEmptyObject( props ); 13637 if ( !propTween && jQuery.isEmptyObject( orig ) ) { 13638 return; 13639 } 13640 13641 // Restrict "overflow" and "display" styles during box animations 13642 if ( isBox && elem.nodeType === 1 ) { 13643 13644 // Support: IE <=9 - 11, Edge 12 - 15 13645 // Record all 3 overflow attributes because IE does not infer the shorthand 13646 // from identically-valued overflowX and overflowY and Edge just mirrors 13647 // the overflowX value there. 13648 opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; 13649 13650 // Identify a display type, preferring old show/hide data over the CSS cascade 13651 restoreDisplay = dataShow && dataShow.display; 13652 if ( restoreDisplay == null ) { 13653 restoreDisplay = dataPriv.get( elem, "display" ); 13654 } 13655 display = jQuery.css( elem, "display" ); 13656 if ( display === "none" ) { 13657 if ( restoreDisplay ) { 13658 display = restoreDisplay; 13659 } else { 13660 13661 // Get nonempty value(s) by temporarily forcing visibility 13662 showHide( [ elem ], true ); 13663 restoreDisplay = elem.style.display || restoreDisplay; 13664 display = jQuery.css( elem, "display" ); 13665 showHide( [ elem ] ); 13666 } 13667 } 13668 13669 // Animate inline elements as inline-block 13670 if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { 13671 if ( jQuery.css( elem, "float" ) === "none" ) { 13672 13673 // Restore the original display value at the end of pure show/hide animations 13674 if ( !propTween ) { 13675 anim.done( function() { 13676 style.display = restoreDisplay; 13677 } ); 13678 if ( restoreDisplay == null ) { 13679 display = style.display; 13680 restoreDisplay = display === "none" ? "" : display; 13681 } 13682 } 13683 style.display = "inline-block"; 13684 } 13685 } 13686 } 13687 13688 if ( opts.overflow ) { 13689 style.overflow = "hidden"; 13690 anim.always( function() { 13691 style.overflow = opts.overflow[ 0 ]; 13692 style.overflowX = opts.overflow[ 1 ]; 13693 style.overflowY = opts.overflow[ 2 ]; 13694 } ); 13695 } 13696 13697 // Implement show/hide animations 13698 propTween = false; 13699 for ( prop in orig ) { 13700 13701 // General show/hide setup for this element animation 13702 if ( !propTween ) { 13703 if ( dataShow ) { 13704 if ( "hidden" in dataShow ) { 13705 hidden = dataShow.hidden; 13706 } 13707 } else { 13708 dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); 13709 } 13710 13711 // Store hidden/visible for toggle so `.stop().toggle()` "reverses" 13712 if ( toggle ) { 13713 dataShow.hidden = !hidden; 13714 } 13715 13716 // Show elements before animating them 13717 if ( hidden ) { 13718 showHide( [ elem ], true ); 13719 } 13720 13721 /* eslint-disable no-loop-func */ 13722 13723 anim.done( function() { 13724 13725 /* eslint-enable no-loop-func */ 13726 13727 // The final step of a "hide" animation is actually hiding the element 13728 if ( !hidden ) { 13729 showHide( [ elem ] ); 13730 } 13731 dataPriv.remove( elem, "fxshow" ); 13732 for ( prop in orig ) { 13733 jQuery.style( elem, prop, orig[ prop ] ); 13734 } 13735 } ); 13736 } 13737 13738 // Per-property setup 13739 propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); 13740 if ( !( prop in dataShow ) ) { 13741 dataShow[ prop ] = propTween.start; 13742 if ( hidden ) { 13743 propTween.end = propTween.start; 13744 propTween.start = 0; 13745 } 13746 } 13747 } 13748} 13749 13750function propFilter( props, specialEasing ) { 13751 var index, name, easing, value, hooks; 13752 13753 // camelCase, specialEasing and expand cssHook pass 13754 for ( index in props ) { 13755 name = camelCase( index ); 13756 easing = specialEasing[ name ]; 13757 value = props[ index ]; 13758 if ( Array.isArray( value ) ) { 13759 easing = value[ 1 ]; 13760 value = props[ index ] = value[ 0 ]; 13761 } 13762 13763 if ( index !== name ) { 13764 props[ name ] = value; 13765 delete props[ index ]; 13766 } 13767 13768 hooks = jQuery.cssHooks[ name ]; 13769 if ( hooks && "expand" in hooks ) { 13770 value = hooks.expand( value ); 13771 delete props[ name ]; 13772 13773 // Not quite $.extend, this won't overwrite existing keys. 13774 // Reusing 'index' because we have the correct "name" 13775 for ( index in value ) { 13776 if ( !( index in props ) ) { 13777 props[ index ] = value[ index ]; 13778 specialEasing[ index ] = easing; 13779 } 13780 } 13781 } else { 13782 specialEasing[ name ] = easing; 13783 } 13784 } 13785} 13786 13787function Animation( elem, properties, options ) { 13788 var result, 13789 stopped, 13790 index = 0, 13791 length = Animation.prefilters.length, 13792 deferred = jQuery.Deferred().always( function() { 13793 13794 // Don't match elem in the :animated selector 13795 delete tick.elem; 13796 } ), 13797 tick = function() { 13798 if ( stopped ) { 13799 return false; 13800 } 13801 var currentTime = fxNow || createFxNow(), 13802 remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), 13803 13804 // Support: Android 2.3 only 13805 // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) 13806 temp = remaining / animation.duration || 0, 13807 percent = 1 - temp, 13808 index = 0, 13809 length = animation.tweens.length; 13810 13811 for ( ; index < length; index++ ) { 13812 animation.tweens[ index ].run( percent ); 13813 } 13814 13815 deferred.notifyWith( elem, [ animation, percent, remaining ] ); 13816 13817 // If there's more to do, yield 13818 if ( percent < 1 && length ) { 13819 return remaining; 13820 } 13821 13822 // If this was an empty animation, synthesize a final progress notification 13823 if ( !length ) { 13824 deferred.notifyWith( elem, [ animation, 1, 0 ] ); 13825 } 13826 13827 // Resolve the animation and report its conclusion 13828 deferred.resolveWith( elem, [ animation ] ); 13829 return false; 13830 }, 13831 animation = deferred.promise( { 13832 elem: elem, 13833 props: jQuery.extend( {}, properties ), 13834 opts: jQuery.extend( true, { 13835 specialEasing: {}, 13836 easing: jQuery.easing._default 13837 }, options ), 13838 originalProperties: properties, 13839 originalOptions: options, 13840 startTime: fxNow || createFxNow(), 13841 duration: options.duration, 13842 tweens: [], 13843 createTween: function( prop, end ) { 13844 var tween = jQuery.Tween( elem, animation.opts, prop, end, 13845 animation.opts.specialEasing[ prop ] || animation.opts.easing ); 13846 animation.tweens.push( tween ); 13847 return tween; 13848 }, 13849 stop: function( gotoEnd ) { 13850 var index = 0, 13851 13852 // If we are going to the end, we want to run all the tweens 13853 // otherwise we skip this part 13854 length = gotoEnd ? animation.tweens.length : 0; 13855 if ( stopped ) { 13856 return this; 13857 } 13858 stopped = true; 13859 for ( ; index < length; index++ ) { 13860 animation.tweens[ index ].run( 1 ); 13861 } 13862 13863 // Resolve when we played the last frame; otherwise, reject 13864 if ( gotoEnd ) { 13865 deferred.notifyWith( elem, [ animation, 1, 0 ] ); 13866 deferred.resolveWith( elem, [ animation, gotoEnd ] ); 13867 } else { 13868 deferred.rejectWith( elem, [ animation, gotoEnd ] ); 13869 } 13870 return this; 13871 } 13872 } ), 13873 props = animation.props; 13874 13875 propFilter( props, animation.opts.specialEasing ); 13876 13877 for ( ; index < length; index++ ) { 13878 result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); 13879 if ( result ) { 13880 if ( isFunction( result.stop ) ) { 13881 jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = 13882 result.stop.bind( result ); 13883 } 13884 return result; 13885 } 13886 } 13887 13888 jQuery.map( props, createTween, animation ); 13889 13890 if ( isFunction( animation.opts.start ) ) { 13891 animation.opts.start.call( elem, animation ); 13892 } 13893 13894 // Attach callbacks from options 13895 animation 13896 .progress( animation.opts.progress ) 13897 .done( animation.opts.done, animation.opts.complete ) 13898 .fail( animation.opts.fail ) 13899 .always( animation.opts.always ); 13900 13901 jQuery.fx.timer( 13902 jQuery.extend( tick, { 13903 elem: elem, 13904 anim: animation, 13905 queue: animation.opts.queue 13906 } ) 13907 ); 13908 13909 return animation; 13910} 13911 13912jQuery.Animation = jQuery.extend( Animation, { 13913 13914 tweeners: { 13915 "*": [ function( prop, value ) { 13916 var tween = this.createTween( prop, value ); 13917 adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); 13918 return tween; 13919 } ] 13920 }, 13921 13922 tweener: function( props, callback ) { 13923 if ( isFunction( props ) ) { 13924 callback = props; 13925 props = [ "*" ]; 13926 } else { 13927 props = props.match( rnothtmlwhite ); 13928 } 13929 13930 var prop, 13931 index = 0, 13932 length = props.length; 13933 13934 for ( ; index < length; index++ ) { 13935 prop = props[ index ]; 13936 Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; 13937 Animation.tweeners[ prop ].unshift( callback ); 13938 } 13939 }, 13940 13941 prefilters: [ defaultPrefilter ], 13942 13943 prefilter: function( callback, prepend ) { 13944 if ( prepend ) { 13945 Animation.prefilters.unshift( callback ); 13946 } else { 13947 Animation.prefilters.push( callback ); 13948 } 13949 } 13950} ); 13951 13952jQuery.speed = function( speed, easing, fn ) { 13953 var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { 13954 complete: fn || !fn && easing || 13955 isFunction( speed ) && speed, 13956 duration: speed, 13957 easing: fn && easing || easing && !isFunction( easing ) && easing 13958 }; 13959 13960 // Go to the end state if fx are off 13961 if ( jQuery.fx.off ) { 13962 opt.duration = 0; 13963 13964 } else { 13965 if ( typeof opt.duration !== "number" ) { 13966 if ( opt.duration in jQuery.fx.speeds ) { 13967 opt.duration = jQuery.fx.speeds[ opt.duration ]; 13968 13969 } else { 13970 opt.duration = jQuery.fx.speeds._default; 13971 } 13972 } 13973 } 13974 13975 // Normalize opt.queue - true/undefined/null -> "fx" 13976 if ( opt.queue == null || opt.queue === true ) { 13977 opt.queue = "fx"; 13978 } 13979 13980 // Queueing 13981 opt.old = opt.complete; 13982 13983 opt.complete = function() { 13984 if ( isFunction( opt.old ) ) { 13985 opt.old.call( this ); 13986 } 13987 13988 if ( opt.queue ) { 13989 jQuery.dequeue( this, opt.queue ); 13990 } 13991 }; 13992 13993 return opt; 13994}; 13995 13996jQuery.fn.extend( { 13997 fadeTo: function( speed, to, easing, callback ) { 13998 13999 // Show any hidden elements after setting opacity to 0 14000 return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() 14001 14002 // Animate to the value specified 14003 .end().animate( { opacity: to }, speed, easing, callback ); 14004 }, 14005 animate: function( prop, speed, easing, callback ) { 14006 var empty = jQuery.isEmptyObject( prop ), 14007 optall = jQuery.speed( speed, easing, callback ), 14008 doAnimation = function() { 14009 14010 // Operate on a copy of prop so per-property easing won't be lost 14011 var anim = Animation( this, jQuery.extend( {}, prop ), optall ); 14012 14013 // Empty animations, or finishing resolves immediately 14014 if ( empty || dataPriv.get( this, "finish" ) ) { 14015 anim.stop( true ); 14016 } 14017 }; 14018 14019 doAnimation.finish = doAnimation; 14020 14021 return empty || optall.queue === false ? 14022 this.each( doAnimation ) : 14023 this.queue( optall.queue, doAnimation ); 14024 }, 14025 stop: function( type, clearQueue, gotoEnd ) { 14026 var stopQueue = function( hooks ) { 14027 var stop = hooks.stop; 14028 delete hooks.stop; 14029 stop( gotoEnd ); 14030 }; 14031 14032 if ( typeof type !== "string" ) { 14033 gotoEnd = clearQueue; 14034 clearQueue = type; 14035 type = undefined; 14036 } 14037 if ( clearQueue ) { 14038 this.queue( type || "fx", [] ); 14039 } 14040 14041 return this.each( function() { 14042 var dequeue = true, 14043 index = type != null && type + "queueHooks", 14044 timers = jQuery.timers, 14045 data = dataPriv.get( this ); 14046 14047 if ( index ) { 14048 if ( data[ index ] && data[ index ].stop ) { 14049 stopQueue( data[ index ] ); 14050 } 14051 } else { 14052 for ( index in data ) { 14053 if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { 14054 stopQueue( data[ index ] ); 14055 } 14056 } 14057 } 14058 14059 for ( index = timers.length; index--; ) { 14060 if ( timers[ index ].elem === this && 14061 ( type == null || timers[ index ].queue === type ) ) { 14062 14063 timers[ index ].anim.stop( gotoEnd ); 14064 dequeue = false; 14065 timers.splice( index, 1 ); 14066 } 14067 } 14068 14069 // Start the next in the queue if the last step wasn't forced. 14070 // Timers currently will call their complete callbacks, which 14071 // will dequeue but only if they were gotoEnd. 14072 if ( dequeue || !gotoEnd ) { 14073 jQuery.dequeue( this, type ); 14074 } 14075 } ); 14076 }, 14077 finish: function( type ) { 14078 if ( type !== false ) { 14079 type = type || "fx"; 14080 } 14081 return this.each( function() { 14082 var index, 14083 data = dataPriv.get( this ), 14084 queue = data[ type + "queue" ], 14085 hooks = data[ type + "queueHooks" ], 14086 timers = jQuery.timers, 14087 length = queue ? queue.length : 0; 14088 14089 // Enable finishing flag on private data 14090 data.finish = true; 14091 14092 // Empty the queue first 14093 jQuery.queue( this, type, [] ); 14094 14095 if ( hooks && hooks.stop ) { 14096 hooks.stop.call( this, true ); 14097 } 14098 14099 // Look for any active animations, and finish them 14100 for ( index = timers.length; index--; ) { 14101 if ( timers[ index ].elem === this && timers[ index ].queue === type ) { 14102 timers[ index ].anim.stop( true ); 14103 timers.splice( index, 1 ); 14104 } 14105 } 14106 14107 // Look for any animations in the old queue and finish them 14108 for ( index = 0; index < length; index++ ) { 14109 if ( queue[ index ] && queue[ index ].finish ) { 14110 queue[ index ].finish.call( this ); 14111 } 14112 } 14113 14114 // Turn off finishing flag 14115 delete data.finish; 14116 } ); 14117 } 14118} ); 14119 14120jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { 14121 var cssFn = jQuery.fn[ name ]; 14122 jQuery.fn[ name ] = function( speed, easing, callback ) { 14123 return speed == null || typeof speed === "boolean" ? 14124 cssFn.apply( this, arguments ) : 14125 this.animate( genFx( name, true ), speed, easing, callback ); 14126 }; 14127} ); 14128 14129// Generate shortcuts for custom animations 14130jQuery.each( { 14131 slideDown: genFx( "show" ), 14132 slideUp: genFx( "hide" ), 14133 slideToggle: genFx( "toggle" ), 14134 fadeIn: { opacity: "show" }, 14135 fadeOut: { opacity: "hide" }, 14136 fadeToggle: { opacity: "toggle" } 14137}, function( name, props ) { 14138 jQuery.fn[ name ] = function( speed, easing, callback ) { 14139 return this.animate( props, speed, easing, callback ); 14140 }; 14141} ); 14142 14143jQuery.timers = []; 14144jQuery.fx.tick = function() { 14145 var timer, 14146 i = 0, 14147 timers = jQuery.timers; 14148 14149 fxNow = Date.now(); 14150 14151 for ( ; i < timers.length; i++ ) { 14152 timer = timers[ i ]; 14153 14154 // Run the timer and safely remove it when done (allowing for external removal) 14155 if ( !timer() && timers[ i ] === timer ) { 14156 timers.splice( i--, 1 ); 14157 } 14158 } 14159 14160 if ( !timers.length ) { 14161 jQuery.fx.stop(); 14162 } 14163 fxNow = undefined; 14164}; 14165 14166jQuery.fx.timer = function( timer ) { 14167 jQuery.timers.push( timer ); 14168 jQuery.fx.start(); 14169}; 14170 14171jQuery.fx.interval = 13; 14172jQuery.fx.start = function() { 14173 if ( inProgress ) { 14174 return; 14175 } 14176 14177 inProgress = true; 14178 schedule(); 14179}; 14180 14181jQuery.fx.stop = function() { 14182 inProgress = null; 14183}; 14184 14185jQuery.fx.speeds = { 14186 slow: 600, 14187 fast: 200, 14188 14189 // Default speed 14190 _default: 400 14191}; 14192 14193 14194// Based off of the plugin by Clint Helfers, with permission. 14195// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ 14196jQuery.fn.delay = function( time, type ) { 14197 time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; 14198 type = type || "fx"; 14199 14200 return this.queue( type, function( next, hooks ) { 14201 var timeout = window.setTimeout( next, time ); 14202 hooks.stop = function() { 14203 window.clearTimeout( timeout ); 14204 }; 14205 } ); 14206}; 14207 14208 14209( function() { 14210 var input = document.createElement( "input" ), 14211 select = document.createElement( "select" ), 14212 opt = select.appendChild( document.createElement( "option" ) ); 14213 14214 input.type = "checkbox"; 14215 14216 // Support: Android <=4.3 only 14217 // Default value for a checkbox should be "on" 14218 support.checkOn = input.value !== ""; 14219 14220 // Support: IE <=11 only 14221 // Must access selectedIndex to make default options select 14222 support.optSelected = opt.selected; 14223 14224 // Support: IE <=11 only 14225 // An input loses its value after becoming a radio 14226 input = document.createElement( "input" ); 14227 input.value = "t"; 14228 input.type = "radio"; 14229 support.radioValue = input.value === "t"; 14230} )(); 14231 14232 14233var boolHook, 14234 attrHandle = jQuery.expr.attrHandle; 14235 14236jQuery.fn.extend( { 14237 attr: function( name, value ) { 14238 return access( this, jQuery.attr, name, value, arguments.length > 1 ); 14239 }, 14240 14241 removeAttr: function( name ) { 14242 return this.each( function() { 14243 jQuery.removeAttr( this, name ); 14244 } ); 14245 } 14246} ); 14247 14248jQuery.extend( { 14249 attr: function( elem, name, value ) { 14250 var ret, hooks, 14251 nType = elem.nodeType; 14252 14253 // Don't get/set attributes on text, comment and attribute nodes 14254 if ( nType === 3 || nType === 8 || nType === 2 ) { 14255 return; 14256 } 14257 14258 // Fallback to prop when attributes are not supported 14259 if ( typeof elem.getAttribute === "undefined" ) { 14260 return jQuery.prop( elem, name, value ); 14261 } 14262 14263 // Attribute hooks are determined by the lowercase version 14264 // Grab necessary hook if one is defined 14265 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { 14266 hooks = jQuery.attrHooks[ name.toLowerCase() ] || 14267 ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); 14268 } 14269 14270 if ( value !== undefined ) { 14271 if ( value === null ) { 14272 jQuery.removeAttr( elem, name ); 14273 return; 14274 } 14275 14276 if ( hooks && "set" in hooks && 14277 ( ret = hooks.set( elem, value, name ) ) !== undefined ) { 14278 return ret; 14279 } 14280 14281 elem.setAttribute( name, value + "" ); 14282 return value; 14283 } 14284 14285 if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { 14286 return ret; 14287 } 14288 14289 ret = jQuery.find.attr( elem, name ); 14290 14291 // Non-existent attributes return null, we normalize to undefined 14292 return ret == null ? undefined : ret; 14293 }, 14294 14295 attrHooks: { 14296 type: { 14297 set: function( elem, value ) { 14298 if ( !support.radioValue && value === "radio" && 14299 nodeName( elem, "input" ) ) { 14300 var val = elem.value; 14301 elem.setAttribute( "type", value ); 14302 if ( val ) { 14303 elem.value = val; 14304 } 14305 return value; 14306 } 14307 } 14308 } 14309 }, 14310 14311 removeAttr: function( elem, value ) { 14312 var name, 14313 i = 0, 14314 14315 // Attribute names can contain non-HTML whitespace characters 14316 // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 14317 attrNames = value && value.match( rnothtmlwhite ); 14318 14319 if ( attrNames && elem.nodeType === 1 ) { 14320 while ( ( name = attrNames[ i++ ] ) ) { 14321 elem.removeAttribute( name ); 14322 } 14323 } 14324 } 14325} ); 14326 14327// Hooks for boolean attributes 14328boolHook = { 14329 set: function( elem, value, name ) { 14330 if ( value === false ) { 14331 14332 // Remove boolean attributes when set to false 14333 jQuery.removeAttr( elem, name ); 14334 } else { 14335 elem.setAttribute( name, name ); 14336 } 14337 return name; 14338 } 14339}; 14340 14341jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { 14342 var getter = attrHandle[ name ] || jQuery.find.attr; 14343 14344 attrHandle[ name ] = function( elem, name, isXML ) { 14345 var ret, handle, 14346 lowercaseName = name.toLowerCase(); 14347 14348 if ( !isXML ) { 14349 14350 // Avoid an infinite loop by temporarily removing this function from the getter 14351 handle = attrHandle[ lowercaseName ]; 14352 attrHandle[ lowercaseName ] = ret; 14353 ret = getter( elem, name, isXML ) != null ? 14354 lowercaseName : 14355 null; 14356 attrHandle[ lowercaseName ] = handle; 14357 } 14358 return ret; 14359 }; 14360} ); 14361 14362 14363 14364 14365var rfocusable = /^(?:input|select|textarea|button)$/i, 14366 rclickable = /^(?:a|area)$/i; 14367 14368jQuery.fn.extend( { 14369 prop: function( name, value ) { 14370 return access( this, jQuery.prop, name, value, arguments.length > 1 ); 14371 }, 14372 14373 removeProp: function( name ) { 14374 return this.each( function() { 14375 delete this[ jQuery.propFix[ name ] || name ]; 14376 } ); 14377 } 14378} ); 14379 14380jQuery.extend( { 14381 prop: function( elem, name, value ) { 14382 var ret, hooks, 14383 nType = elem.nodeType; 14384 14385 // Don't get/set properties on text, comment and attribute nodes 14386 if ( nType === 3 || nType === 8 || nType === 2 ) { 14387 return; 14388 } 14389 14390 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { 14391 14392 // Fix name and attach hooks 14393 name = jQuery.propFix[ name ] || name; 14394 hooks = jQuery.propHooks[ name ]; 14395 } 14396 14397 if ( value !== undefined ) { 14398 if ( hooks && "set" in hooks && 14399 ( ret = hooks.set( elem, value, name ) ) !== undefined ) { 14400 return ret; 14401 } 14402 14403 return ( elem[ name ] = value ); 14404 } 14405 14406 if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { 14407 return ret; 14408 } 14409 14410 return elem[ name ]; 14411 }, 14412 14413 propHooks: { 14414 tabIndex: { 14415 get: function( elem ) { 14416 14417 // Support: IE <=9 - 11 only 14418 // elem.tabIndex doesn't always return the 14419 // correct value when it hasn't been explicitly set 14420 // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ 14421 // Use proper attribute retrieval(#12072) 14422 var tabindex = jQuery.find.attr( elem, "tabindex" ); 14423 14424 if ( tabindex ) { 14425 return parseInt( tabindex, 10 ); 14426 } 14427 14428 if ( 14429 rfocusable.test( elem.nodeName ) || 14430 rclickable.test( elem.nodeName ) && 14431 elem.href 14432 ) { 14433 return 0; 14434 } 14435 14436 return -1; 14437 } 14438 } 14439 }, 14440 14441 propFix: { 14442 "for": "htmlFor", 14443 "class": "className" 14444 } 14445} ); 14446 14447// Support: IE <=11 only 14448// Accessing the selectedIndex property 14449// forces the browser to respect setting selected 14450// on the option 14451// The getter ensures a default option is selected 14452// when in an optgroup 14453// eslint rule "no-unused-expressions" is disabled for this code 14454// since it considers such accessions noop 14455if ( !support.optSelected ) { 14456 jQuery.propHooks.selected = { 14457 get: function( elem ) { 14458 14459 /* eslint no-unused-expressions: "off" */ 14460 14461 var parent = elem.parentNode; 14462 if ( parent && parent.parentNode ) { 14463 parent.parentNode.selectedIndex; 14464 } 14465 return null; 14466 }, 14467 set: function( elem ) { 14468 14469 /* eslint no-unused-expressions: "off" */ 14470 14471 var parent = elem.parentNode; 14472 if ( parent ) { 14473 parent.selectedIndex; 14474 14475 if ( parent.parentNode ) { 14476 parent.parentNode.selectedIndex; 14477 } 14478 } 14479 } 14480 }; 14481} 14482 14483jQuery.each( [ 14484 "tabIndex", 14485 "readOnly", 14486 "maxLength", 14487 "cellSpacing", 14488 "cellPadding", 14489 "rowSpan", 14490 "colSpan", 14491 "useMap", 14492 "frameBorder", 14493 "contentEditable" 14494], function() { 14495 jQuery.propFix[ this.toLowerCase() ] = this; 14496} ); 14497 14498 14499 14500 14501 // Strip and collapse whitespace according to HTML spec 14502 // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace 14503 function stripAndCollapse( value ) { 14504 var tokens = value.match( rnothtmlwhite ) || []; 14505 return tokens.join( " " ); 14506 } 14507 14508 14509function getClass( elem ) { 14510 return elem.getAttribute && elem.getAttribute( "class" ) || ""; 14511} 14512 14513function classesToArray( value ) { 14514 if ( Array.isArray( value ) ) { 14515 return value; 14516 } 14517 if ( typeof value === "string" ) { 14518 return value.match( rnothtmlwhite ) || []; 14519 } 14520 return []; 14521} 14522 14523jQuery.fn.extend( { 14524 addClass: function( value ) { 14525 var classes, elem, cur, curValue, clazz, j, finalValue, 14526 i = 0; 14527 14528 if ( isFunction( value ) ) { 14529 return this.each( function( j ) { 14530 jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); 14531 } ); 14532 } 14533 14534 classes = classesToArray( value ); 14535 14536 if ( classes.length ) { 14537 while ( ( elem = this[ i++ ] ) ) { 14538 curValue = getClass( elem ); 14539 cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); 14540 14541 if ( cur ) { 14542 j = 0; 14543 while ( ( clazz = classes[ j++ ] ) ) { 14544 if ( cur.indexOf( " " + clazz + " " ) < 0 ) { 14545 cur += clazz + " "; 14546 } 14547 } 14548 14549 // Only assign if different to avoid unneeded rendering. 14550 finalValue = stripAndCollapse( cur ); 14551 if ( curValue !== finalValue ) { 14552 elem.setAttribute( "class", finalValue ); 14553 } 14554 } 14555 } 14556 } 14557 14558 return this; 14559 }, 14560 14561 removeClass: function( value ) { 14562 var classes, elem, cur, curValue, clazz, j, finalValue, 14563 i = 0; 14564 14565 if ( isFunction( value ) ) { 14566 return this.each( function( j ) { 14567 jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); 14568 } ); 14569 } 14570 14571 if ( !arguments.length ) { 14572 return this.attr( "class", "" ); 14573 } 14574 14575 classes = classesToArray( value ); 14576 14577 if ( classes.length ) { 14578 while ( ( elem = this[ i++ ] ) ) { 14579 curValue = getClass( elem ); 14580 14581 // This expression is here for better compressibility (see addClass) 14582 cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); 14583 14584 if ( cur ) { 14585 j = 0; 14586 while ( ( clazz = classes[ j++ ] ) ) { 14587 14588 // Remove *all* instances 14589 while ( cur.indexOf( " " + clazz + " " ) > -1 ) { 14590 cur = cur.replace( " " + clazz + " ", " " ); 14591 } 14592 } 14593 14594 // Only assign if different to avoid unneeded rendering. 14595 finalValue = stripAndCollapse( cur ); 14596 if ( curValue !== finalValue ) { 14597 elem.setAttribute( "class", finalValue ); 14598 } 14599 } 14600 } 14601 } 14602 14603 return this; 14604 }, 14605 14606 toggleClass: function( value, stateVal ) { 14607 var type = typeof value, 14608 isValidValue = type === "string" || Array.isArray( value ); 14609 14610 if ( typeof stateVal === "boolean" && isValidValue ) { 14611 return stateVal ? this.addClass( value ) : this.removeClass( value ); 14612 } 14613 14614 if ( isFunction( value ) ) { 14615 return this.each( function( i ) { 14616 jQuery( this ).toggleClass( 14617 value.call( this, i, getClass( this ), stateVal ), 14618 stateVal 14619 ); 14620 } ); 14621 } 14622 14623 return this.each( function() { 14624 var className, i, self, classNames; 14625 14626 if ( isValidValue ) { 14627 14628 // Toggle individual class names 14629 i = 0; 14630 self = jQuery( this ); 14631 classNames = classesToArray( value ); 14632 14633 while ( ( className = classNames[ i++ ] ) ) { 14634 14635 // Check each className given, space separated list 14636 if ( self.hasClass( className ) ) { 14637 self.removeClass( className ); 14638 } else { 14639 self.addClass( className ); 14640 } 14641 } 14642 14643 // Toggle whole class name 14644 } else if ( value === undefined || type === "boolean" ) { 14645 className = getClass( this ); 14646 if ( className ) { 14647 14648 // Store className if set 14649 dataPriv.set( this, "__className__", className ); 14650 } 14651 14652 // If the element has a class name or if we're passed `false`, 14653 // then remove the whole classname (if there was one, the above saved it). 14654 // Otherwise bring back whatever was previously saved (if anything), 14655 // falling back to the empty string if nothing was stored. 14656 if ( this.setAttribute ) { 14657 this.setAttribute( "class", 14658 className || value === false ? 14659 "" : 14660 dataPriv.get( this, "__className__" ) || "" 14661 ); 14662 } 14663 } 14664 } ); 14665 }, 14666 14667 hasClass: function( selector ) { 14668 var className, elem, 14669 i = 0; 14670 14671 className = " " + selector + " "; 14672 while ( ( elem = this[ i++ ] ) ) { 14673 if ( elem.nodeType === 1 && 14674 ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { 14675 return true; 14676 } 14677 } 14678 14679 return false; 14680 } 14681} ); 14682 14683 14684 14685 14686var rreturn = /\r/g; 14687 14688jQuery.fn.extend( { 14689 val: function( value ) { 14690 var hooks, ret, valueIsFunction, 14691 elem = this[ 0 ]; 14692 14693 if ( !arguments.length ) { 14694 if ( elem ) { 14695 hooks = jQuery.valHooks[ elem.type ] || 14696 jQuery.valHooks[ elem.nodeName.toLowerCase() ]; 14697 14698 if ( hooks && 14699 "get" in hooks && 14700 ( ret = hooks.get( elem, "value" ) ) !== undefined 14701 ) { 14702 return ret; 14703 } 14704 14705 ret = elem.value; 14706 14707 // Handle most common string cases 14708 if ( typeof ret === "string" ) { 14709 return ret.replace( rreturn, "" ); 14710 } 14711 14712 // Handle cases where value is null/undef or number 14713 return ret == null ? "" : ret; 14714 } 14715 14716 return; 14717 } 14718 14719 valueIsFunction = isFunction( value ); 14720 14721 return this.each( function( i ) { 14722 var val; 14723 14724 if ( this.nodeType !== 1 ) { 14725 return; 14726 } 14727 14728 if ( valueIsFunction ) { 14729 val = value.call( this, i, jQuery( this ).val() ); 14730 } else { 14731 val = value; 14732 } 14733 14734 // Treat null/undefined as ""; convert numbers to string 14735 if ( val == null ) { 14736 val = ""; 14737 14738 } else if ( typeof val === "number" ) { 14739 val += ""; 14740 14741 } else if ( Array.isArray( val ) ) { 14742 val = jQuery.map( val, function( value ) { 14743 return value == null ? "" : value + ""; 14744 } ); 14745 } 14746 14747 hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; 14748 14749 // If set returns undefined, fall back to normal setting 14750 if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { 14751 this.value = val; 14752 } 14753 } ); 14754 } 14755} ); 14756 14757jQuery.extend( { 14758 valHooks: { 14759 option: { 14760 get: function( elem ) { 14761 14762 var val = jQuery.find.attr( elem, "value" ); 14763 return val != null ? 14764 val : 14765 14766 // Support: IE <=10 - 11 only 14767 // option.text throws exceptions (#14686, #14858) 14768 // Strip and collapse whitespace 14769 // https://html.spec.whatwg.org/#strip-and-collapse-whitespace 14770 stripAndCollapse( jQuery.text( elem ) ); 14771 } 14772 }, 14773 select: { 14774 get: function( elem ) { 14775 var value, option, i, 14776 options = elem.options, 14777 index = elem.selectedIndex, 14778 one = elem.type === "select-one", 14779 values = one ? null : [], 14780 max = one ? index + 1 : options.length; 14781 14782 if ( index < 0 ) { 14783 i = max; 14784 14785 } else { 14786 i = one ? index : 0; 14787 } 14788 14789 // Loop through all the selected options 14790 for ( ; i < max; i++ ) { 14791 option = options[ i ]; 14792 14793 // Support: IE <=9 only 14794 // IE8-9 doesn't update selected after form reset (#2551) 14795 if ( ( option.selected || i === index ) && 14796 14797 // Don't return options that are disabled or in a disabled optgroup 14798 !option.disabled && 14799 ( !option.parentNode.disabled || 14800 !nodeName( option.parentNode, "optgroup" ) ) ) { 14801 14802 // Get the specific value for the option 14803 value = jQuery( option ).val(); 14804 14805 // We don't need an array for one selects 14806 if ( one ) { 14807 return value; 14808 } 14809 14810 // Multi-Selects return an array 14811 values.push( value ); 14812 } 14813 } 14814 14815 return values; 14816 }, 14817 14818 set: function( elem, value ) { 14819 var optionSet, option, 14820 options = elem.options, 14821 values = jQuery.makeArray( value ), 14822 i = options.length; 14823 14824 while ( i-- ) { 14825 option = options[ i ]; 14826 14827 /* eslint-disable no-cond-assign */ 14828 14829 if ( option.selected = 14830 jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 14831 ) { 14832 optionSet = true; 14833 } 14834 14835 /* eslint-enable no-cond-assign */ 14836 } 14837 14838 // Force browsers to behave consistently when non-matching value is set 14839 if ( !optionSet ) { 14840 elem.selectedIndex = -1; 14841 } 14842 return values; 14843 } 14844 } 14845 } 14846} ); 14847 14848// Radios and checkboxes getter/setter 14849jQuery.each( [ "radio", "checkbox" ], function() { 14850 jQuery.valHooks[ this ] = { 14851 set: function( elem, value ) { 14852 if ( Array.isArray( value ) ) { 14853 return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); 14854 } 14855 } 14856 }; 14857 if ( !support.checkOn ) { 14858 jQuery.valHooks[ this ].get = function( elem ) { 14859 return elem.getAttribute( "value" ) === null ? "on" : elem.value; 14860 }; 14861 } 14862} ); 14863 14864 14865 14866 14867// Return jQuery for attributes-only inclusion 14868 14869 14870support.focusin = "onfocusin" in window; 14871 14872 14873var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, 14874 stopPropagationCallback = function( e ) { 14875 e.stopPropagation(); 14876 }; 14877 14878jQuery.extend( jQuery.event, { 14879 14880 trigger: function( event, data, elem, onlyHandlers ) { 14881 14882 var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, 14883 eventPath = [ elem || document ], 14884 type = hasOwn.call( event, "type" ) ? event.type : event, 14885 namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; 14886 14887 cur = lastElement = tmp = elem = elem || document; 14888 14889 // Don't do events on text and comment nodes 14890 if ( elem.nodeType === 3 || elem.nodeType === 8 ) { 14891 return; 14892 } 14893 14894 // focus/blur morphs to focusin/out; ensure we're not firing them right now 14895 if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { 14896 return; 14897 } 14898 14899 if ( type.indexOf( "." ) > -1 ) { 14900 14901 // Namespaced trigger; create a regexp to match event type in handle() 14902 namespaces = type.split( "." ); 14903 type = namespaces.shift(); 14904 namespaces.sort(); 14905 } 14906 ontype = type.indexOf( ":" ) < 0 && "on" + type; 14907 14908 // Caller can pass in a jQuery.Event object, Object, or just an event type string 14909 event = event[ jQuery.expando ] ? 14910 event : 14911 new jQuery.Event( type, typeof event === "object" && event ); 14912 14913 // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) 14914 event.isTrigger = onlyHandlers ? 2 : 3; 14915 event.namespace = namespaces.join( "." ); 14916 event.rnamespace = event.namespace ? 14917 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : 14918 null; 14919 14920 // Clean up the event in case it is being reused 14921 event.result = undefined; 14922 if ( !event.target ) { 14923 event.target = elem; 14924 } 14925 14926 // Clone any incoming data and prepend the event, creating the handler arg list 14927 data = data == null ? 14928 [ event ] : 14929 jQuery.makeArray( data, [ event ] ); 14930 14931 // Allow special events to draw outside the lines 14932 special = jQuery.event.special[ type ] || {}; 14933 if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { 14934 return; 14935 } 14936 14937 // Determine event propagation path in advance, per W3C events spec (#9951) 14938 // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) 14939 if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { 14940 14941 bubbleType = special.delegateType || type; 14942 if ( !rfocusMorph.test( bubbleType + type ) ) { 14943 cur = cur.parentNode; 14944 } 14945 for ( ; cur; cur = cur.parentNode ) { 14946 eventPath.push( cur ); 14947 tmp = cur; 14948 } 14949 14950 // Only add window if we got to document (e.g., not plain obj or detached DOM) 14951 if ( tmp === ( elem.ownerDocument || document ) ) { 14952 eventPath.push( tmp.defaultView || tmp.parentWindow || window ); 14953 } 14954 } 14955 14956 // Fire handlers on the event path 14957 i = 0; 14958 while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { 14959 lastElement = cur; 14960 event.type = i > 1 ? 14961 bubbleType : 14962 special.bindType || type; 14963 14964 // jQuery handler 14965 handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && 14966 dataPriv.get( cur, "handle" ); 14967 if ( handle ) { 14968 handle.apply( cur, data ); 14969 } 14970 14971 // Native handler 14972 handle = ontype && cur[ ontype ]; 14973 if ( handle && handle.apply && acceptData( cur ) ) { 14974 event.result = handle.apply( cur, data ); 14975 if ( event.result === false ) { 14976 event.preventDefault(); 14977 } 14978 } 14979 } 14980 event.type = type; 14981 14982 // If nobody prevented the default action, do it now 14983 if ( !onlyHandlers && !event.isDefaultPrevented() ) { 14984 14985 if ( ( !special._default || 14986 special._default.apply( eventPath.pop(), data ) === false ) && 14987 acceptData( elem ) ) { 14988 14989 // Call a native DOM method on the target with the same name as the event. 14990 // Don't do default actions on window, that's where global variables be (#6170) 14991 if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { 14992 14993 // Don't re-trigger an onFOO event when we call its FOO() method 14994 tmp = elem[ ontype ]; 14995 14996 if ( tmp ) { 14997 elem[ ontype ] = null; 14998 } 14999 15000 // Prevent re-triggering of the same event, since we already bubbled it above 15001 jQuery.event.triggered = type; 15002 15003 if ( event.isPropagationStopped() ) { 15004 lastElement.addEventListener( type, stopPropagationCallback ); 15005 } 15006 15007 elem[ type ](); 15008 15009 if ( event.isPropagationStopped() ) { 15010 lastElement.removeEventListener( type, stopPropagationCallback ); 15011 } 15012 15013 jQuery.event.triggered = undefined; 15014 15015 if ( tmp ) { 15016 elem[ ontype ] = tmp; 15017 } 15018 } 15019 } 15020 } 15021 15022 return event.result; 15023 }, 15024 15025 // Piggyback on a donor event to simulate a different one 15026 // Used only for `focus(in | out)` events 15027 simulate: function( type, elem, event ) { 15028 var e = jQuery.extend( 15029 new jQuery.Event(), 15030 event, 15031 { 15032 type: type, 15033 isSimulated: true 15034 } 15035 ); 15036 15037 jQuery.event.trigger( e, null, elem ); 15038 } 15039 15040} ); 15041 15042jQuery.fn.extend( { 15043 15044 trigger: function( type, data ) { 15045 return this.each( function() { 15046 jQuery.event.trigger( type, data, this ); 15047 } ); 15048 }, 15049 triggerHandler: function( type, data ) { 15050 var elem = this[ 0 ]; 15051 if ( elem ) { 15052 return jQuery.event.trigger( type, data, elem, true ); 15053 } 15054 } 15055} ); 15056 15057 15058// Support: Firefox <=44 15059// Firefox doesn't have focus(in | out) events 15060// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 15061// 15062// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 15063// focus(in | out) events fire after focus & blur events, 15064// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order 15065// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 15066if ( !support.focusin ) { 15067 jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { 15068 15069 // Attach a single capturing handler on the document while someone wants focusin/focusout 15070 var handler = function( event ) { 15071 jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); 15072 }; 15073 15074 jQuery.event.special[ fix ] = { 15075 setup: function() { 15076 15077 // Handle: regular nodes (via `this.ownerDocument`), window 15078 // (via `this.document`) & document (via `this`). 15079 var doc = this.ownerDocument || this.document || this, 15080 attaches = dataPriv.access( doc, fix ); 15081 15082 if ( !attaches ) { 15083 doc.addEventListener( orig, handler, true ); 15084 } 15085 dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); 15086 }, 15087 teardown: function() { 15088 var doc = this.ownerDocument || this.document || this, 15089 attaches = dataPriv.access( doc, fix ) - 1; 15090 15091 if ( !attaches ) { 15092 doc.removeEventListener( orig, handler, true ); 15093 dataPriv.remove( doc, fix ); 15094 15095 } else { 15096 dataPriv.access( doc, fix, attaches ); 15097 } 15098 } 15099 }; 15100 } ); 15101} 15102var location = window.location; 15103 15104var nonce = { guid: Date.now() }; 15105 15106var rquery = ( /\?/ ); 15107 15108 15109 15110// Cross-browser xml parsing 15111jQuery.parseXML = function( data ) { 15112 var xml, parserErrorElem; 15113 if ( !data || typeof data !== "string" ) { 15114 return null; 15115 } 15116 15117 // Support: IE 9 - 11 only 15118 // IE throws on parseFromString with invalid input. 15119 try { 15120 xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); 15121 } catch ( e ) {} 15122 15123 parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; 15124 if ( !xml || parserErrorElem ) { 15125 jQuery.error( "Invalid XML: " + ( 15126 parserErrorElem ? 15127 jQuery.map( parserErrorElem.childNodes, function( el ) { 15128 return el.textContent; 15129 } ).join( "\n" ) : 15130 data 15131 ) ); 15132 } 15133 return xml; 15134}; 15135 15136 15137var 15138 rbracket = /\[\]$/, 15139 rCRLF = /\r?\n/g, 15140 rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, 15141 rsubmittable = /^(?:input|select|textarea|keygen)/i; 15142 15143function buildParams( prefix, obj, traditional, add ) { 15144 var name; 15145 15146 if ( Array.isArray( obj ) ) { 15147 15148 // Serialize array item. 15149 jQuery.each( obj, function( i, v ) { 15150 if ( traditional || rbracket.test( prefix ) ) { 15151 15152 // Treat each array item as a scalar. 15153 add( prefix, v ); 15154 15155 } else { 15156 15157 // Item is non-scalar (array or object), encode its numeric index. 15158 buildParams( 15159 prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", 15160 v, 15161 traditional, 15162 add 15163 ); 15164 } 15165 } ); 15166 15167 } else if ( !traditional && toType( obj ) === "object" ) { 15168 15169 // Serialize object item. 15170 for ( name in obj ) { 15171 buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); 15172 } 15173 15174 } else { 15175 15176 // Serialize scalar item. 15177 add( prefix, obj ); 15178 } 15179} 15180 15181// Serialize an array of form elements or a set of 15182// key/values into a query string 15183jQuery.param = function( a, traditional ) { 15184 var prefix, 15185 s = [], 15186 add = function( key, valueOrFunction ) { 15187 15188 // If value is a function, invoke it and use its return value 15189 var value = isFunction( valueOrFunction ) ? 15190 valueOrFunction() : 15191 valueOrFunction; 15192 15193 s[ s.length ] = encodeURIComponent( key ) + "=" + 15194 encodeURIComponent( value == null ? "" : value ); 15195 }; 15196 15197 if ( a == null ) { 15198 return ""; 15199 } 15200 15201 // If an array was passed in, assume that it is an array of form elements. 15202 if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { 15203 15204 // Serialize the form elements 15205 jQuery.each( a, function() { 15206 add( this.name, this.value ); 15207 } ); 15208 15209 } else { 15210 15211 // If traditional, encode the "old" way (the way 1.3.2 or older 15212 // did it), otherwise encode params recursively. 15213 for ( prefix in a ) { 15214 buildParams( prefix, a[ prefix ], traditional, add ); 15215 } 15216 } 15217 15218 // Return the resulting serialization 15219 return s.join( "&" ); 15220}; 15221 15222jQuery.fn.extend( { 15223 serialize: function() { 15224 return jQuery.param( this.serializeArray() ); 15225 }, 15226 serializeArray: function() { 15227 return this.map( function() { 15228 15229 // Can add propHook for "elements" to filter or add form elements 15230 var elements = jQuery.prop( this, "elements" ); 15231 return elements ? jQuery.makeArray( elements ) : this; 15232 } ).filter( function() { 15233 var type = this.type; 15234 15235 // Use .is( ":disabled" ) so that fieldset[disabled] works 15236 return this.name && !jQuery( this ).is( ":disabled" ) && 15237 rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && 15238 ( this.checked || !rcheckableType.test( type ) ); 15239 } ).map( function( _i, elem ) { 15240 var val = jQuery( this ).val(); 15241 15242 if ( val == null ) { 15243 return null; 15244 } 15245 15246 if ( Array.isArray( val ) ) { 15247 return jQuery.map( val, function( val ) { 15248 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 15249 } ); 15250 } 15251 15252 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 15253 } ).get(); 15254 } 15255} ); 15256 15257 15258var 15259 r20 = /%20/g, 15260 rhash = /#.*$/, 15261 rantiCache = /([?&])_=[^&]*/, 15262 rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, 15263 15264 // #7653, #8125, #8152: local protocol detection 15265 rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, 15266 rnoContent = /^(?:GET|HEAD)$/, 15267 rprotocol = /^\/\//, 15268 15269 /* Prefilters 15270 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) 15271 * 2) These are called: 15272 * - BEFORE asking for a transport 15273 * - AFTER param serialization (s.data is a string if s.processData is true) 15274 * 3) key is the dataType 15275 * 4) the catchall symbol "*" can be used 15276 * 5) execution will start with transport dataType and THEN continue down to "*" if needed 15277 */ 15278 prefilters = {}, 15279 15280 /* Transports bindings 15281 * 1) key is the dataType 15282 * 2) the catchall symbol "*" can be used 15283 * 3) selection will start with transport dataType and THEN go to "*" if needed 15284 */ 15285 transports = {}, 15286 15287 // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression 15288 allTypes = "*/".concat( "*" ), 15289 15290 // Anchor tag for parsing the document origin 15291 originAnchor = document.createElement( "a" ); 15292 15293originAnchor.href = location.href; 15294 15295// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport 15296function addToPrefiltersOrTransports( structure ) { 15297 15298 // dataTypeExpression is optional and defaults to "*" 15299 return function( dataTypeExpression, func ) { 15300 15301 if ( typeof dataTypeExpression !== "string" ) { 15302 func = dataTypeExpression; 15303 dataTypeExpression = "*"; 15304 } 15305 15306 var dataType, 15307 i = 0, 15308 dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; 15309 15310 if ( isFunction( func ) ) { 15311 15312 // For each dataType in the dataTypeExpression 15313 while ( ( dataType = dataTypes[ i++ ] ) ) { 15314 15315 // Prepend if requested 15316 if ( dataType[ 0 ] === "+" ) { 15317 dataType = dataType.slice( 1 ) || "*"; 15318 ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); 15319 15320 // Otherwise append 15321 } else { 15322 ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); 15323 } 15324 } 15325 } 15326 }; 15327} 15328 15329// Base inspection function for prefilters and transports 15330function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { 15331 15332 var inspected = {}, 15333 seekingTransport = ( structure === transports ); 15334 15335 function inspect( dataType ) { 15336 var selected; 15337 inspected[ dataType ] = true; 15338 jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { 15339 var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); 15340 if ( typeof dataTypeOrTransport === "string" && 15341 !seekingTransport && !inspected[ dataTypeOrTransport ] ) { 15342 15343 options.dataTypes.unshift( dataTypeOrTransport ); 15344 inspect( dataTypeOrTransport ); 15345 return false; 15346 } else if ( seekingTransport ) { 15347 return !( selected = dataTypeOrTransport ); 15348 } 15349 } ); 15350 return selected; 15351 } 15352 15353 return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); 15354} 15355 15356// A special extend for ajax options 15357// that takes "flat" options (not to be deep extended) 15358// Fixes #9887 15359function ajaxExtend( target, src ) { 15360 var key, deep, 15361 flatOptions = jQuery.ajaxSettings.flatOptions || {}; 15362 15363 for ( key in src ) { 15364 if ( src[ key ] !== undefined ) { 15365 ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; 15366 } 15367 } 15368 if ( deep ) { 15369 jQuery.extend( true, target, deep ); 15370 } 15371 15372 return target; 15373} 15374 15375/* Handles responses to an ajax request: 15376 * - finds the right dataType (mediates between content-type and expected dataType) 15377 * - returns the corresponding response 15378 */ 15379function ajaxHandleResponses( s, jqXHR, responses ) { 15380 15381 var ct, type, finalDataType, firstDataType, 15382 contents = s.contents, 15383 dataTypes = s.dataTypes; 15384 15385 // Remove auto dataType and get content-type in the process 15386 while ( dataTypes[ 0 ] === "*" ) { 15387 dataTypes.shift(); 15388 if ( ct === undefined ) { 15389 ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); 15390 } 15391 } 15392 15393 // Check if we're dealing with a known content-type 15394 if ( ct ) { 15395 for ( type in contents ) { 15396 if ( contents[ type ] && contents[ type ].test( ct ) ) { 15397 dataTypes.unshift( type ); 15398 break; 15399 } 15400 } 15401 } 15402 15403 // Check to see if we have a response for the expected dataType 15404 if ( dataTypes[ 0 ] in responses ) { 15405 finalDataType = dataTypes[ 0 ]; 15406 } else { 15407 15408 // Try convertible dataTypes 15409 for ( type in responses ) { 15410 if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { 15411 finalDataType = type; 15412 break; 15413 } 15414 if ( !firstDataType ) { 15415 firstDataType = type; 15416 } 15417 } 15418 15419 // Or just use first one 15420 finalDataType = finalDataType || firstDataType; 15421 } 15422 15423 // If we found a dataType 15424 // We add the dataType to the list if needed 15425 // and return the corresponding response 15426 if ( finalDataType ) { 15427 if ( finalDataType !== dataTypes[ 0 ] ) { 15428 dataTypes.unshift( finalDataType ); 15429 } 15430 return responses[ finalDataType ]; 15431 } 15432} 15433 15434/* Chain conversions given the request and the original response 15435 * Also sets the responseXXX fields on the jqXHR instance 15436 */ 15437function ajaxConvert( s, response, jqXHR, isSuccess ) { 15438 var conv2, current, conv, tmp, prev, 15439 converters = {}, 15440 15441 // Work with a copy of dataTypes in case we need to modify it for conversion 15442 dataTypes = s.dataTypes.slice(); 15443 15444 // Create converters map with lowercased keys 15445 if ( dataTypes[ 1 ] ) { 15446 for ( conv in s.converters ) { 15447 converters[ conv.toLowerCase() ] = s.converters[ conv ]; 15448 } 15449 } 15450 15451 current = dataTypes.shift(); 15452 15453 // Convert to each sequential dataType 15454 while ( current ) { 15455 15456 if ( s.responseFields[ current ] ) { 15457 jqXHR[ s.responseFields[ current ] ] = response; 15458 } 15459 15460 // Apply the dataFilter if provided 15461 if ( !prev && isSuccess && s.dataFilter ) { 15462 response = s.dataFilter( response, s.dataType ); 15463 } 15464 15465 prev = current; 15466 current = dataTypes.shift(); 15467 15468 if ( current ) { 15469 15470 // There's only work to do if current dataType is non-auto 15471 if ( current === "*" ) { 15472 15473 current = prev; 15474 15475 // Convert response if prev dataType is non-auto and differs from current 15476 } else if ( prev !== "*" && prev !== current ) { 15477 15478 // Seek a direct converter 15479 conv = converters[ prev + " " + current ] || converters[ "* " + current ]; 15480 15481 // If none found, seek a pair 15482 if ( !conv ) { 15483 for ( conv2 in converters ) { 15484 15485 // If conv2 outputs current 15486 tmp = conv2.split( " " ); 15487 if ( tmp[ 1 ] === current ) { 15488 15489 // If prev can be converted to accepted input 15490 conv = converters[ prev + " " + tmp[ 0 ] ] || 15491 converters[ "* " + tmp[ 0 ] ]; 15492 if ( conv ) { 15493 15494 // Condense equivalence converters 15495 if ( conv === true ) { 15496 conv = converters[ conv2 ]; 15497 15498 // Otherwise, insert the intermediate dataType 15499 } else if ( converters[ conv2 ] !== true ) { 15500 current = tmp[ 0 ]; 15501 dataTypes.unshift( tmp[ 1 ] ); 15502 } 15503 break; 15504 } 15505 } 15506 } 15507 } 15508 15509 // Apply converter (if not an equivalence) 15510 if ( conv !== true ) { 15511 15512 // Unless errors are allowed to bubble, catch and return them 15513 if ( conv && s.throws ) { 15514 response = conv( response ); 15515 } else { 15516 try { 15517 response = conv( response ); 15518 } catch ( e ) { 15519 return { 15520 state: "parsererror", 15521 error: conv ? e : "No conversion from " + prev + " to " + current 15522 }; 15523 } 15524 } 15525 } 15526 } 15527 } 15528 } 15529 15530 return { state: "success", data: response }; 15531} 15532 15533jQuery.extend( { 15534 15535 // Counter for holding the number of active queries 15536 active: 0, 15537 15538 // Last-Modified header cache for next request 15539 lastModified: {}, 15540 etag: {}, 15541 15542 ajaxSettings: { 15543 url: location.href, 15544 type: "GET", 15545 isLocal: rlocalProtocol.test( location.protocol ), 15546 global: true, 15547 processData: true, 15548 async: true, 15549 contentType: "application/x-www-form-urlencoded; charset=UTF-8", 15550 15551 /* 15552 timeout: 0, 15553 data: null, 15554 dataType: null, 15555 username: null, 15556 password: null, 15557 cache: null, 15558 throws: false, 15559 traditional: false, 15560 headers: {}, 15561 */ 15562 15563 accepts: { 15564 "*": allTypes, 15565 text: "text/plain", 15566 html: "text/html", 15567 xml: "application/xml, text/xml", 15568 json: "application/json, text/javascript" 15569 }, 15570 15571 contents: { 15572 xml: /\bxml\b/, 15573 html: /\bhtml/, 15574 json: /\bjson\b/ 15575 }, 15576 15577 responseFields: { 15578 xml: "responseXML", 15579 text: "responseText", 15580 json: "responseJSON" 15581 }, 15582 15583 // Data converters 15584 // Keys separate source (or catchall "*") and destination types with a single space 15585 converters: { 15586 15587 // Convert anything to text 15588 "* text": String, 15589 15590 // Text to html (true = no transformation) 15591 "text html": true, 15592 15593 // Evaluate text as a json expression 15594 "text json": JSON.parse, 15595 15596 // Parse text as xml 15597 "text xml": jQuery.parseXML 15598 }, 15599 15600 // For options that shouldn't be deep extended: 15601 // you can add your own custom options here if 15602 // and when you create one that shouldn't be 15603 // deep extended (see ajaxExtend) 15604 flatOptions: { 15605 url: true, 15606 context: true 15607 } 15608 }, 15609 15610 // Creates a full fledged settings object into target 15611 // with both ajaxSettings and settings fields. 15612 // If target is omitted, writes into ajaxSettings. 15613 ajaxSetup: function( target, settings ) { 15614 return settings ? 15615 15616 // Building a settings object 15617 ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : 15618 15619 // Extending ajaxSettings 15620 ajaxExtend( jQuery.ajaxSettings, target ); 15621 }, 15622 15623 ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), 15624 ajaxTransport: addToPrefiltersOrTransports( transports ), 15625 15626 // Main method 15627 ajax: function( url, options ) { 15628 15629 // If url is an object, simulate pre-1.5 signature 15630 if ( typeof url === "object" ) { 15631 options = url; 15632 url = undefined; 15633 } 15634 15635 // Force options to be an object 15636 options = options || {}; 15637 15638 var transport, 15639 15640 // URL without anti-cache param 15641 cacheURL, 15642 15643 // Response headers 15644 responseHeadersString, 15645 responseHeaders, 15646 15647 // timeout handle 15648 timeoutTimer, 15649 15650 // Url cleanup var 15651 urlAnchor, 15652 15653 // Request state (becomes false upon send and true upon completion) 15654 completed, 15655 15656 // To know if global events are to be dispatched 15657 fireGlobals, 15658 15659 // Loop variable 15660 i, 15661 15662 // uncached part of the url 15663 uncached, 15664 15665 // Create the final options object 15666 s = jQuery.ajaxSetup( {}, options ), 15667 15668 // Callbacks context 15669 callbackContext = s.context || s, 15670 15671 // Context for global events is callbackContext if it is a DOM node or jQuery collection 15672 globalEventContext = s.context && 15673 ( callbackContext.nodeType || callbackContext.jquery ) ? 15674 jQuery( callbackContext ) : 15675 jQuery.event, 15676 15677 // Deferreds 15678 deferred = jQuery.Deferred(), 15679 completeDeferred = jQuery.Callbacks( "once memory" ), 15680 15681 // Status-dependent callbacks 15682 statusCode = s.statusCode || {}, 15683 15684 // Headers (they are sent all at once) 15685 requestHeaders = {}, 15686 requestHeadersNames = {}, 15687 15688 // Default abort message 15689 strAbort = "canceled", 15690 15691 // Fake xhr 15692 jqXHR = { 15693 readyState: 0, 15694 15695 // Builds headers hashtable if needed 15696 getResponseHeader: function( key ) { 15697 var match; 15698 if ( completed ) { 15699 if ( !responseHeaders ) { 15700 responseHeaders = {}; 15701 while ( ( match = rheaders.exec( responseHeadersString ) ) ) { 15702 responseHeaders[ match[ 1 ].toLowerCase() + " " ] = 15703 ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) 15704 .concat( match[ 2 ] ); 15705 } 15706 } 15707 match = responseHeaders[ key.toLowerCase() + " " ]; 15708 } 15709 return match == null ? null : match.join( ", " ); 15710 }, 15711 15712 // Raw string 15713 getAllResponseHeaders: function() { 15714 return completed ? responseHeadersString : null; 15715 }, 15716 15717 // Caches the header 15718 setRequestHeader: function( name, value ) { 15719 if ( completed == null ) { 15720 name = requestHeadersNames[ name.toLowerCase() ] = 15721 requestHeadersNames[ name.toLowerCase() ] || name; 15722 requestHeaders[ name ] = value; 15723 } 15724 return this; 15725 }, 15726 15727 // Overrides response content-type header 15728 overrideMimeType: function( type ) { 15729 if ( completed == null ) { 15730 s.mimeType = type; 15731 } 15732 return this; 15733 }, 15734 15735 // Status-dependent callbacks 15736 statusCode: function( map ) { 15737 var code; 15738 if ( map ) { 15739 if ( completed ) { 15740 15741 // Execute the appropriate callbacks 15742 jqXHR.always( map[ jqXHR.status ] ); 15743 } else { 15744 15745 // Lazy-add the new callbacks in a way that preserves old ones 15746 for ( code in map ) { 15747 statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; 15748 } 15749 } 15750 } 15751 return this; 15752 }, 15753 15754 // Cancel the request 15755 abort: function( statusText ) { 15756 var finalText = statusText || strAbort; 15757 if ( transport ) { 15758 transport.abort( finalText ); 15759 } 15760 done( 0, finalText ); 15761 return this; 15762 } 15763 }; 15764 15765 // Attach deferreds 15766 deferred.promise( jqXHR ); 15767 15768 // Add protocol if not provided (prefilters might expect it) 15769 // Handle falsy url in the settings object (#10093: consistency with old signature) 15770 // We also use the url parameter if available 15771 s.url = ( ( url || s.url || location.href ) + "" ) 15772 .replace( rprotocol, location.protocol + "//" ); 15773 15774 // Alias method option to type as per ticket #12004 15775 s.type = options.method || options.type || s.method || s.type; 15776 15777 // Extract dataTypes list 15778 s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; 15779 15780 // A cross-domain request is in order when the origin doesn't match the current origin. 15781 if ( s.crossDomain == null ) { 15782 urlAnchor = document.createElement( "a" ); 15783 15784 // Support: IE <=8 - 11, Edge 12 - 15 15785 // IE throws exception on accessing the href property if url is malformed, 15786 // e.g. http://example.com:80x/ 15787 try { 15788 urlAnchor.href = s.url; 15789 15790 // Support: IE <=8 - 11 only 15791 // Anchor's host property isn't correctly set when s.url is relative 15792 urlAnchor.href = urlAnchor.href; 15793 s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== 15794 urlAnchor.protocol + "//" + urlAnchor.host; 15795 } catch ( e ) { 15796 15797 // If there is an error parsing the URL, assume it is crossDomain, 15798 // it can be rejected by the transport if it is invalid 15799 s.crossDomain = true; 15800 } 15801 } 15802 15803 // Convert data if not already a string 15804 if ( s.data && s.processData && typeof s.data !== "string" ) { 15805 s.data = jQuery.param( s.data, s.traditional ); 15806 } 15807 15808 // Apply prefilters 15809 inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); 15810 15811 // If request was aborted inside a prefilter, stop there 15812 if ( completed ) { 15813 return jqXHR; 15814 } 15815 15816 // We can fire global events as of now if asked to 15817 // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) 15818 fireGlobals = jQuery.event && s.global; 15819 15820 // Watch for a new set of requests 15821 if ( fireGlobals && jQuery.active++ === 0 ) { 15822 jQuery.event.trigger( "ajaxStart" ); 15823 } 15824 15825 // Uppercase the type 15826 s.type = s.type.toUpperCase(); 15827 15828 // Determine if request has content 15829 s.hasContent = !rnoContent.test( s.type ); 15830 15831 // Save the URL in case we're toying with the If-Modified-Since 15832 // and/or If-None-Match header later on 15833 // Remove hash to simplify url manipulation 15834 cacheURL = s.url.replace( rhash, "" ); 15835 15836 // More options handling for requests with no content 15837 if ( !s.hasContent ) { 15838 15839 // Remember the hash so we can put it back 15840 uncached = s.url.slice( cacheURL.length ); 15841 15842 // If data is available and should be processed, append data to url 15843 if ( s.data && ( s.processData || typeof s.data === "string" ) ) { 15844 cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; 15845 15846 // #9682: remove data so that it's not used in an eventual retry 15847 delete s.data; 15848 } 15849 15850 // Add or update anti-cache param if needed 15851 if ( s.cache === false ) { 15852 cacheURL = cacheURL.replace( rantiCache, "$1" ); 15853 uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + 15854 uncached; 15855 } 15856 15857 // Put hash and anti-cache on the URL that will be requested (gh-1732) 15858 s.url = cacheURL + uncached; 15859 15860 // Change '%20' to '+' if this is encoded form body content (gh-2658) 15861 } else if ( s.data && s.processData && 15862 ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { 15863 s.data = s.data.replace( r20, "+" ); 15864 } 15865 15866 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 15867 if ( s.ifModified ) { 15868 if ( jQuery.lastModified[ cacheURL ] ) { 15869 jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); 15870 } 15871 if ( jQuery.etag[ cacheURL ] ) { 15872 jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); 15873 } 15874 } 15875 15876 // Set the correct header, if data is being sent 15877 if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { 15878 jqXHR.setRequestHeader( "Content-Type", s.contentType ); 15879 } 15880 15881 // Set the Accepts header for the server, depending on the dataType 15882 jqXHR.setRequestHeader( 15883 "Accept", 15884 s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? 15885 s.accepts[ s.dataTypes[ 0 ] ] + 15886 ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : 15887 s.accepts[ "*" ] 15888 ); 15889 15890 // Check for headers option 15891 for ( i in s.headers ) { 15892 jqXHR.setRequestHeader( i, s.headers[ i ] ); 15893 } 15894 15895 // Allow custom headers/mimetypes and early abort 15896 if ( s.beforeSend && 15897 ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { 15898 15899 // Abort if not done already and return 15900 return jqXHR.abort(); 15901 } 15902 15903 // Aborting is no longer a cancellation 15904 strAbort = "abort"; 15905 15906 // Install callbacks on deferreds 15907 completeDeferred.add( s.complete ); 15908 jqXHR.done( s.success ); 15909 jqXHR.fail( s.error ); 15910 15911 // Get transport 15912 transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); 15913 15914 // If no transport, we auto-abort 15915 if ( !transport ) { 15916 done( -1, "No Transport" ); 15917 } else { 15918 jqXHR.readyState = 1; 15919 15920 // Send global event 15921 if ( fireGlobals ) { 15922 globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); 15923 } 15924 15925 // If request was aborted inside ajaxSend, stop there 15926 if ( completed ) { 15927 return jqXHR; 15928 } 15929 15930 // Timeout 15931 if ( s.async && s.timeout > 0 ) { 15932 timeoutTimer = window.setTimeout( function() { 15933 jqXHR.abort( "timeout" ); 15934 }, s.timeout ); 15935 } 15936 15937 try { 15938 completed = false; 15939 transport.send( requestHeaders, done ); 15940 } catch ( e ) { 15941 15942 // Rethrow post-completion exceptions 15943 if ( completed ) { 15944 throw e; 15945 } 15946 15947 // Propagate others as results 15948 done( -1, e ); 15949 } 15950 } 15951 15952 // Callback for when everything is done 15953 function done( status, nativeStatusText, responses, headers ) { 15954 var isSuccess, success, error, response, modified, 15955 statusText = nativeStatusText; 15956 15957 // Ignore repeat invocations 15958 if ( completed ) { 15959 return; 15960 } 15961 15962 completed = true; 15963 15964 // Clear timeout if it exists 15965 if ( timeoutTimer ) { 15966 window.clearTimeout( timeoutTimer ); 15967 } 15968 15969 // Dereference transport for early garbage collection 15970 // (no matter how long the jqXHR object will be used) 15971 transport = undefined; 15972 15973 // Cache response headers 15974 responseHeadersString = headers || ""; 15975 15976 // Set readyState 15977 jqXHR.readyState = status > 0 ? 4 : 0; 15978 15979 // Determine if successful 15980 isSuccess = status >= 200 && status < 300 || status === 304; 15981 15982 // Get response data 15983 if ( responses ) { 15984 response = ajaxHandleResponses( s, jqXHR, responses ); 15985 } 15986 15987 // Use a noop converter for missing script but not if jsonp 15988 if ( !isSuccess && 15989 jQuery.inArray( "script", s.dataTypes ) > -1 && 15990 jQuery.inArray( "json", s.dataTypes ) < 0 ) { 15991 s.converters[ "text script" ] = function() {}; 15992 } 15993 15994 // Convert no matter what (that way responseXXX fields are always set) 15995 response = ajaxConvert( s, response, jqXHR, isSuccess ); 15996 15997 // If successful, handle type chaining 15998 if ( isSuccess ) { 15999 16000 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 16001 if ( s.ifModified ) { 16002 modified = jqXHR.getResponseHeader( "Last-Modified" ); 16003 if ( modified ) { 16004 jQuery.lastModified[ cacheURL ] = modified; 16005 } 16006 modified = jqXHR.getResponseHeader( "etag" ); 16007 if ( modified ) { 16008 jQuery.etag[ cacheURL ] = modified; 16009 } 16010 } 16011 16012 // if no content 16013 if ( status === 204 || s.type === "HEAD" ) { 16014 statusText = "nocontent"; 16015 16016 // if not modified 16017 } else if ( status === 304 ) { 16018 statusText = "notmodified"; 16019 16020 // If we have data, let's convert it 16021 } else { 16022 statusText = response.state; 16023 success = response.data; 16024 error = response.error; 16025 isSuccess = !error; 16026 } 16027 } else { 16028 16029 // Extract error from statusText and normalize for non-aborts 16030 error = statusText; 16031 if ( status || !statusText ) { 16032 statusText = "error"; 16033 if ( status < 0 ) { 16034 status = 0; 16035 } 16036 } 16037 } 16038 16039 // Set data for the fake xhr object 16040 jqXHR.status = status; 16041 jqXHR.statusText = ( nativeStatusText || statusText ) + ""; 16042 16043 // Success/Error 16044 if ( isSuccess ) { 16045 deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); 16046 } else { 16047 deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); 16048 } 16049 16050 // Status-dependent callbacks 16051 jqXHR.statusCode( statusCode ); 16052 statusCode = undefined; 16053 16054 if ( fireGlobals ) { 16055 globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", 16056 [ jqXHR, s, isSuccess ? success : error ] ); 16057 } 16058 16059 // Complete 16060 completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); 16061 16062 if ( fireGlobals ) { 16063 globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); 16064 16065 // Handle the global AJAX counter 16066 if ( !( --jQuery.active ) ) { 16067 jQuery.event.trigger( "ajaxStop" ); 16068 } 16069 } 16070 } 16071 16072 return jqXHR; 16073 }, 16074 16075 getJSON: function( url, data, callback ) { 16076 return jQuery.get( url, data, callback, "json" ); 16077 }, 16078 16079 getScript: function( url, callback ) { 16080 return jQuery.get( url, undefined, callback, "script" ); 16081 } 16082} ); 16083 16084jQuery.each( [ "get", "post" ], function( _i, method ) { 16085 jQuery[ method ] = function( url, data, callback, type ) { 16086 16087 // Shift arguments if data argument was omitted 16088 if ( isFunction( data ) ) { 16089 type = type || callback; 16090 callback = data; 16091 data = undefined; 16092 } 16093 16094 // The url can be an options object (which then must have .url) 16095 return jQuery.ajax( jQuery.extend( { 16096 url: url, 16097 type: method, 16098 dataType: type, 16099 data: data, 16100 success: callback 16101 }, jQuery.isPlainObject( url ) && url ) ); 16102 }; 16103} ); 16104 16105jQuery.ajaxPrefilter( function( s ) { 16106 var i; 16107 for ( i in s.headers ) { 16108 if ( i.toLowerCase() === "content-type" ) { 16109 s.contentType = s.headers[ i ] || ""; 16110 } 16111 } 16112} ); 16113 16114 16115jQuery._evalUrl = function( url, options, doc ) { 16116 return jQuery.ajax( { 16117 url: url, 16118 16119 // Make this explicit, since user can override this through ajaxSetup (#11264) 16120 type: "GET", 16121 dataType: "script", 16122 cache: true, 16123 async: false, 16124 global: false, 16125 16126 // Only evaluate the response if it is successful (gh-4126) 16127 // dataFilter is not invoked for failure responses, so using it instead 16128 // of the default converter is kludgy but it works. 16129 converters: { 16130 "text script": function() {} 16131 }, 16132 dataFilter: function( response ) { 16133 jQuery.globalEval( response, options, doc ); 16134 } 16135 } ); 16136}; 16137 16138 16139jQuery.fn.extend( { 16140 wrapAll: function( html ) { 16141 var wrap; 16142 16143 if ( this[ 0 ] ) { 16144 if ( isFunction( html ) ) { 16145 html = html.call( this[ 0 ] ); 16146 } 16147 16148 // The elements to wrap the target around 16149 wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); 16150 16151 if ( this[ 0 ].parentNode ) { 16152 wrap.insertBefore( this[ 0 ] ); 16153 } 16154 16155 wrap.map( function() { 16156 var elem = this; 16157 16158 while ( elem.firstElementChild ) { 16159 elem = elem.firstElementChild; 16160 } 16161 16162 return elem; 16163 } ).append( this ); 16164 } 16165 16166 return this; 16167 }, 16168 16169 wrapInner: function( html ) { 16170 if ( isFunction( html ) ) { 16171 return this.each( function( i ) { 16172 jQuery( this ).wrapInner( html.call( this, i ) ); 16173 } ); 16174 } 16175 16176 return this.each( function() { 16177 var self = jQuery( this ), 16178 contents = self.contents(); 16179 16180 if ( contents.length ) { 16181 contents.wrapAll( html ); 16182 16183 } else { 16184 self.append( html ); 16185 } 16186 } ); 16187 }, 16188 16189 wrap: function( html ) { 16190 var htmlIsFunction = isFunction( html ); 16191 16192 return this.each( function( i ) { 16193 jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); 16194 } ); 16195 }, 16196 16197 unwrap: function( selector ) { 16198 this.parent( selector ).not( "body" ).each( function() { 16199 jQuery( this ).replaceWith( this.childNodes ); 16200 } ); 16201 return this; 16202 } 16203} ); 16204 16205 16206jQuery.expr.pseudos.hidden = function( elem ) { 16207 return !jQuery.expr.pseudos.visible( elem ); 16208}; 16209jQuery.expr.pseudos.visible = function( elem ) { 16210 return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); 16211}; 16212 16213 16214 16215 16216jQuery.ajaxSettings.xhr = function() { 16217 try { 16218 return new window.XMLHttpRequest(); 16219 } catch ( e ) {} 16220}; 16221 16222var xhrSuccessStatus = { 16223 16224 // File protocol always yields status code 0, assume 200 16225 0: 200, 16226 16227 // Support: IE <=9 only 16228 // #1450: sometimes IE returns 1223 when it should be 204 16229 1223: 204 16230 }, 16231 xhrSupported = jQuery.ajaxSettings.xhr(); 16232 16233support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); 16234support.ajax = xhrSupported = !!xhrSupported; 16235 16236jQuery.ajaxTransport( function( options ) { 16237 var callback, errorCallback; 16238 16239 // Cross domain only allowed if supported through XMLHttpRequest 16240 if ( support.cors || xhrSupported && !options.crossDomain ) { 16241 return { 16242 send: function( headers, complete ) { 16243 var i, 16244 xhr = options.xhr(); 16245 16246 xhr.open( 16247 options.type, 16248 options.url, 16249 options.async, 16250 options.username, 16251 options.password 16252 ); 16253 16254 // Apply custom fields if provided 16255 if ( options.xhrFields ) { 16256 for ( i in options.xhrFields ) { 16257 xhr[ i ] = options.xhrFields[ i ]; 16258 } 16259 } 16260 16261 // Override mime type if needed 16262 if ( options.mimeType && xhr.overrideMimeType ) { 16263 xhr.overrideMimeType( options.mimeType ); 16264 } 16265 16266 // X-Requested-With header 16267 // For cross-domain requests, seeing as conditions for a preflight are 16268 // akin to a jigsaw puzzle, we simply never set it to be sure. 16269 // (it can always be set on a per-request basis or even using ajaxSetup) 16270 // For same-domain requests, won't change header if already provided. 16271 if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { 16272 headers[ "X-Requested-With" ] = "XMLHttpRequest"; 16273 } 16274 16275 // Set headers 16276 for ( i in headers ) { 16277 xhr.setRequestHeader( i, headers[ i ] ); 16278 } 16279 16280 // Callback 16281 callback = function( type ) { 16282 return function() { 16283 if ( callback ) { 16284 callback = errorCallback = xhr.onload = 16285 xhr.onerror = xhr.onabort = xhr.ontimeout = 16286 xhr.onreadystatechange = null; 16287 16288 if ( type === "abort" ) { 16289 xhr.abort(); 16290 } else if ( type === "error" ) { 16291 16292 // Support: IE <=9 only 16293 // On a manual native abort, IE9 throws 16294 // errors on any property access that is not readyState 16295 if ( typeof xhr.status !== "number" ) { 16296 complete( 0, "error" ); 16297 } else { 16298 complete( 16299 16300 // File: protocol always yields status 0; see #8605, #14207 16301 xhr.status, 16302 xhr.statusText 16303 ); 16304 } 16305 } else { 16306 complete( 16307 xhrSuccessStatus[ xhr.status ] || xhr.status, 16308 xhr.statusText, 16309 16310 // Support: IE <=9 only 16311 // IE9 has no XHR2 but throws on binary (trac-11426) 16312 // For XHR2 non-text, let the caller handle it (gh-2498) 16313 ( xhr.responseType || "text" ) !== "text" || 16314 typeof xhr.responseText !== "string" ? 16315 { binary: xhr.response } : 16316 { text: xhr.responseText }, 16317 xhr.getAllResponseHeaders() 16318 ); 16319 } 16320 } 16321 }; 16322 }; 16323 16324 // Listen to events 16325 xhr.onload = callback(); 16326 errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); 16327 16328 // Support: IE 9 only 16329 // Use onreadystatechange to replace onabort 16330 // to handle uncaught aborts 16331 if ( xhr.onabort !== undefined ) { 16332 xhr.onabort = errorCallback; 16333 } else { 16334 xhr.onreadystatechange = function() { 16335 16336 // Check readyState before timeout as it changes 16337 if ( xhr.readyState === 4 ) { 16338 16339 // Allow onerror to be called first, 16340 // but that will not handle a native abort 16341 // Also, save errorCallback to a variable 16342 // as xhr.onerror cannot be accessed 16343 window.setTimeout( function() { 16344 if ( callback ) { 16345 errorCallback(); 16346 } 16347 } ); 16348 } 16349 }; 16350 } 16351 16352 // Create the abort callback 16353 callback = callback( "abort" ); 16354 16355 try { 16356 16357 // Do send the request (this may raise an exception) 16358 xhr.send( options.hasContent && options.data || null ); 16359 } catch ( e ) { 16360 16361 // #14683: Only rethrow if this hasn't been notified as an error yet 16362 if ( callback ) { 16363 throw e; 16364 } 16365 } 16366 }, 16367 16368 abort: function() { 16369 if ( callback ) { 16370 callback(); 16371 } 16372 } 16373 }; 16374 } 16375} ); 16376 16377 16378 16379 16380// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) 16381jQuery.ajaxPrefilter( function( s ) { 16382 if ( s.crossDomain ) { 16383 s.contents.script = false; 16384 } 16385} ); 16386 16387// Install script dataType 16388jQuery.ajaxSetup( { 16389 accepts: { 16390 script: "text/javascript, application/javascript, " + 16391 "application/ecmascript, application/x-ecmascript" 16392 }, 16393 contents: { 16394 script: /\b(?:java|ecma)script\b/ 16395 }, 16396 converters: { 16397 "text script": function( text ) { 16398 jQuery.globalEval( text ); 16399 return text; 16400 } 16401 } 16402} ); 16403 16404// Handle cache's special case and crossDomain 16405jQuery.ajaxPrefilter( "script", function( s ) { 16406 if ( s.cache === undefined ) { 16407 s.cache = false; 16408 } 16409 if ( s.crossDomain ) { 16410 s.type = "GET"; 16411 } 16412} ); 16413 16414// Bind script tag hack transport 16415jQuery.ajaxTransport( "script", function( s ) { 16416 16417 // This transport only deals with cross domain or forced-by-attrs requests 16418 if ( s.crossDomain || s.scriptAttrs ) { 16419 var script, callback; 16420 return { 16421 send: function( _, complete ) { 16422 script = jQuery( "<script>" ) 16423 .attr( s.scriptAttrs || {} ) 16424 .prop( { charset: s.scriptCharset, src: s.url } ) 16425 .on( "load error", callback = function( evt ) { 16426 script.remove(); 16427 callback = null; 16428 if ( evt ) { 16429 complete( evt.type === "error" ? 404 : 200, evt.type ); 16430 } 16431 } ); 16432 16433 // Use native DOM manipulation to avoid our domManip AJAX trickery 16434 document.head.appendChild( script[ 0 ] ); 16435 }, 16436 abort: function() { 16437 if ( callback ) { 16438 callback(); 16439 } 16440 } 16441 }; 16442 } 16443} ); 16444 16445 16446 16447 16448var oldCallbacks = [], 16449 rjsonp = /(=)\?(?=&|$)|\?\?/; 16450 16451// Default jsonp settings 16452jQuery.ajaxSetup( { 16453 jsonp: "callback", 16454 jsonpCallback: function() { 16455 var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) ); 16456 this[ callback ] = true; 16457 return callback; 16458 } 16459} ); 16460 16461// Detect, normalize options and install callbacks for jsonp requests 16462jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { 16463 16464 var callbackName, overwritten, responseContainer, 16465 jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? 16466 "url" : 16467 typeof s.data === "string" && 16468 ( s.contentType || "" ) 16469 .indexOf( "application/x-www-form-urlencoded" ) === 0 && 16470 rjsonp.test( s.data ) && "data" 16471 ); 16472 16473 // Handle iff the expected data type is "jsonp" or we have a parameter to set 16474 if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { 16475 16476 // Get callback name, remembering preexisting value associated with it 16477 callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ? 16478 s.jsonpCallback() : 16479 s.jsonpCallback; 16480 16481 // Insert callback into url or form data 16482 if ( jsonProp ) { 16483 s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); 16484 } else if ( s.jsonp !== false ) { 16485 s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; 16486 } 16487 16488 // Use data converter to retrieve json after script execution 16489 s.converters[ "script json" ] = function() { 16490 if ( !responseContainer ) { 16491 jQuery.error( callbackName + " was not called" ); 16492 } 16493 return responseContainer[ 0 ]; 16494 }; 16495 16496 // Force json dataType 16497 s.dataTypes[ 0 ] = "json"; 16498 16499 // Install callback 16500 overwritten = window[ callbackName ]; 16501 window[ callbackName ] = function() { 16502 responseContainer = arguments; 16503 }; 16504 16505 // Clean-up function (fires after converters) 16506 jqXHR.always( function() { 16507 16508 // If previous value didn't exist - remove it 16509 if ( overwritten === undefined ) { 16510 jQuery( window ).removeProp( callbackName ); 16511 16512 // Otherwise restore preexisting value 16513 } else { 16514 window[ callbackName ] = overwritten; 16515 } 16516 16517 // Save back as free 16518 if ( s[ callbackName ] ) { 16519 16520 // Make sure that re-using the options doesn't screw things around 16521 s.jsonpCallback = originalSettings.jsonpCallback; 16522 16523 // Save the callback name for future use 16524 oldCallbacks.push( callbackName ); 16525 } 16526 16527 // Call if it was a function and we have a response 16528 if ( responseContainer && isFunction( overwritten ) ) { 16529 overwritten( responseContainer[ 0 ] ); 16530 } 16531 16532 responseContainer = overwritten = undefined; 16533 } ); 16534 16535 // Delegate to script 16536 return "script"; 16537 } 16538} ); 16539 16540 16541 16542 16543// Support: Safari 8 only 16544// In Safari 8 documents created via document.implementation.createHTMLDocument 16545// collapse sibling forms: the second one becomes a child of the first one. 16546// Because of that, this security measure has to be disabled in Safari 8. 16547// https://bugs.webkit.org/show_bug.cgi?id=137337 16548support.createHTMLDocument = ( function() { 16549 var body = document.implementation.createHTMLDocument( "" ).body; 16550 body.innerHTML = "<form></form><form></form>"; 16551 return body.childNodes.length === 2; 16552} )(); 16553 16554 16555// Argument "data" should be string of html 16556// context (optional): If specified, the fragment will be created in this context, 16557// defaults to document 16558// keepScripts (optional): If true, will include scripts passed in the html string 16559jQuery.parseHTML = function( data, context, keepScripts ) { 16560 if ( typeof data !== "string" ) { 16561 return []; 16562 } 16563 if ( typeof context === "boolean" ) { 16564 keepScripts = context; 16565 context = false; 16566 } 16567 16568 var base, parsed, scripts; 16569 16570 if ( !context ) { 16571 16572 // Stop scripts or inline event handlers from being executed immediately 16573 // by using document.implementation 16574 if ( support.createHTMLDocument ) { 16575 context = document.implementation.createHTMLDocument( "" ); 16576 16577 // Set the base href for the created document 16578 // so any parsed elements with URLs 16579 // are based on the document's URL (gh-2965) 16580 base = context.createElement( "base" ); 16581 base.href = document.location.href; 16582 context.head.appendChild( base ); 16583 } else { 16584 context = document; 16585 } 16586 } 16587 16588 parsed = rsingleTag.exec( data ); 16589 scripts = !keepScripts && []; 16590 16591 // Single tag 16592 if ( parsed ) { 16593 return [ context.createElement( parsed[ 1 ] ) ]; 16594 } 16595 16596 parsed = buildFragment( [ data ], context, scripts ); 16597 16598 if ( scripts && scripts.length ) { 16599 jQuery( scripts ).remove(); 16600 } 16601 16602 return jQuery.merge( [], parsed.childNodes ); 16603}; 16604 16605 16606/** 16607 * Load a url into a page 16608 */ 16609jQuery.fn.load = function( url, params, callback ) { 16610 var selector, type, response, 16611 self = this, 16612 off = url.indexOf( " " ); 16613 16614 if ( off > -1 ) { 16615 selector = stripAndCollapse( url.slice( off ) ); 16616 url = url.slice( 0, off ); 16617 } 16618 16619 // If it's a function 16620 if ( isFunction( params ) ) { 16621 16622 // We assume that it's the callback 16623 callback = params; 16624 params = undefined; 16625 16626 // Otherwise, build a param string 16627 } else if ( params && typeof params === "object" ) { 16628 type = "POST"; 16629 } 16630 16631 // If we have elements to modify, make the request 16632 if ( self.length > 0 ) { 16633 jQuery.ajax( { 16634 url: url, 16635 16636 // If "type" variable is undefined, then "GET" method will be used. 16637 // Make value of this field explicit since 16638 // user can override it through ajaxSetup method 16639 type: type || "GET", 16640 dataType: "html", 16641 data: params 16642 } ).done( function( responseText ) { 16643 16644 // Save response for use in complete callback 16645 response = arguments; 16646 16647 self.html( selector ? 16648 16649 // If a selector was specified, locate the right elements in a dummy div 16650 // Exclude scripts to avoid IE 'Permission Denied' errors 16651 jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) : 16652 16653 // Otherwise use the full result 16654 responseText ); 16655 16656 // If the request succeeds, this function gets "data", "status", "jqXHR" 16657 // but they are ignored because response was set above. 16658 // If it fails, this function gets "jqXHR", "status", "error" 16659 } ).always( callback && function( jqXHR, status ) { 16660 self.each( function() { 16661 callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] ); 16662 } ); 16663 } ); 16664 } 16665 16666 return this; 16667}; 16668 16669 16670 16671 16672jQuery.expr.pseudos.animated = function( elem ) { 16673 return jQuery.grep( jQuery.timers, function( fn ) { 16674 return elem === fn.elem; 16675 } ).length; 16676}; 16677 16678 16679 16680 16681jQuery.offset = { 16682 setOffset: function( elem, options, i ) { 16683 var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, 16684 position = jQuery.css( elem, "position" ), 16685 curElem = jQuery( elem ), 16686 props = {}; 16687 16688 // Set position first, in-case top/left are set even on static elem 16689 if ( position === "static" ) { 16690 elem.style.position = "relative"; 16691 } 16692 16693 curOffset = curElem.offset(); 16694 curCSSTop = jQuery.css( elem, "top" ); 16695 curCSSLeft = jQuery.css( elem, "left" ); 16696 calculatePosition = ( position === "absolute" || position === "fixed" ) && 16697 ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1; 16698 16699 // Need to be able to calculate position if either 16700 // top or left is auto and position is either absolute or fixed 16701 if ( calculatePosition ) { 16702 curPosition = curElem.position(); 16703 curTop = curPosition.top; 16704 curLeft = curPosition.left; 16705 16706 } else { 16707 curTop = parseFloat( curCSSTop ) || 0; 16708 curLeft = parseFloat( curCSSLeft ) || 0; 16709 } 16710 16711 if ( isFunction( options ) ) { 16712 16713 // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) 16714 options = options.call( elem, i, jQuery.extend( {}, curOffset ) ); 16715 } 16716 16717 if ( options.top != null ) { 16718 props.top = ( options.top - curOffset.top ) + curTop; 16719 } 16720 if ( options.left != null ) { 16721 props.left = ( options.left - curOffset.left ) + curLeft; 16722 } 16723 16724 if ( "using" in options ) { 16725 options.using.call( elem, props ); 16726 16727 } else { 16728 curElem.css( props ); 16729 } 16730 } 16731}; 16732 16733jQuery.fn.extend( { 16734 16735 // offset() relates an element's border box to the document origin 16736 offset: function( options ) { 16737 16738 // Preserve chaining for setter 16739 if ( arguments.length ) { 16740 return options === undefined ? 16741 this : 16742 this.each( function( i ) { 16743 jQuery.offset.setOffset( this, options, i ); 16744 } ); 16745 } 16746 16747 var rect, win, 16748 elem = this[ 0 ]; 16749 16750 if ( !elem ) { 16751 return; 16752 } 16753 16754 // Return zeros for disconnected and hidden (display: none) elements (gh-2310) 16755 // Support: IE <=11 only 16756 // Running getBoundingClientRect on a 16757 // disconnected node in IE throws an error 16758 if ( !elem.getClientRects().length ) { 16759 return { top: 0, left: 0 }; 16760 } 16761 16762 // Get document-relative position by adding viewport scroll to viewport-relative gBCR 16763 rect = elem.getBoundingClientRect(); 16764 win = elem.ownerDocument.defaultView; 16765 return { 16766 top: rect.top + win.pageYOffset, 16767 left: rect.left + win.pageXOffset 16768 }; 16769 }, 16770 16771 // position() relates an element's margin box to its offset parent's padding box 16772 // This corresponds to the behavior of CSS absolute positioning 16773 position: function() { 16774 if ( !this[ 0 ] ) { 16775 return; 16776 } 16777 16778 var offsetParent, offset, doc, 16779 elem = this[ 0 ], 16780 parentOffset = { top: 0, left: 0 }; 16781 16782 // position:fixed elements are offset from the viewport, which itself always has zero offset 16783 if ( jQuery.css( elem, "position" ) === "fixed" ) { 16784 16785 // Assume position:fixed implies availability of getBoundingClientRect 16786 offset = elem.getBoundingClientRect(); 16787 16788 } else { 16789 offset = this.offset(); 16790 16791 // Account for the *real* offset parent, which can be the document or its root element 16792 // when a statically positioned element is identified 16793 doc = elem.ownerDocument; 16794 offsetParent = elem.offsetParent || doc.documentElement; 16795 while ( offsetParent && 16796 ( offsetParent === doc.body || offsetParent === doc.documentElement ) && 16797 jQuery.css( offsetParent, "position" ) === "static" ) { 16798 16799 offsetParent = offsetParent.parentNode; 16800 } 16801 if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) { 16802 16803 // Incorporate borders into its offset, since they are outside its content origin 16804 parentOffset = jQuery( offsetParent ).offset(); 16805 parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true ); 16806 parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true ); 16807 } 16808 } 16809 16810 // Subtract parent offsets and element margins 16811 return { 16812 top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), 16813 left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true ) 16814 }; 16815 }, 16816 16817 // This method will return documentElement in the following cases: 16818 // 1) For the element inside the iframe without offsetParent, this method will return 16819 // documentElement of the parent window 16820 // 2) For the hidden or detached element 16821 // 3) For body or html element, i.e. in case of the html node - it will return itself 16822 // 16823 // but those exceptions were never presented as a real life use-cases 16824 // and might be considered as more preferable results. 16825 // 16826 // This logic, however, is not guaranteed and can change at any point in the future 16827 offsetParent: function() { 16828 return this.map( function() { 16829 var offsetParent = this.offsetParent; 16830 16831 while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) { 16832 offsetParent = offsetParent.offsetParent; 16833 } 16834 16835 return offsetParent || documentElement; 16836 } ); 16837 } 16838} ); 16839 16840// Create scrollLeft and scrollTop methods 16841jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { 16842 var top = "pageYOffset" === prop; 16843 16844 jQuery.fn[ method ] = function( val ) { 16845 return access( this, function( elem, method, val ) { 16846 16847 // Coalesce documents and windows 16848 var win; 16849 if ( isWindow( elem ) ) { 16850 win = elem; 16851 } else if ( elem.nodeType === 9 ) { 16852 win = elem.defaultView; 16853 } 16854 16855 if ( val === undefined ) { 16856 return win ? win[ prop ] : elem[ method ]; 16857 } 16858 16859 if ( win ) { 16860 win.scrollTo( 16861 !top ? val : win.pageXOffset, 16862 top ? val : win.pageYOffset 16863 ); 16864 16865 } else { 16866 elem[ method ] = val; 16867 } 16868 }, method, val, arguments.length ); 16869 }; 16870} ); 16871 16872// Support: Safari <=7 - 9.1, Chrome <=37 - 49 16873// Add the top/left cssHooks using jQuery.fn.position 16874// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 16875// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347 16876// getComputedStyle returns percent when specified for top/left/bottom/right; 16877// rather than make the css module depend on the offset module, just check for it here 16878jQuery.each( [ "top", "left" ], function( _i, prop ) { 16879 jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, 16880 function( elem, computed ) { 16881 if ( computed ) { 16882 computed = curCSS( elem, prop ); 16883 16884 // If curCSS returns percentage, fallback to offset 16885 return rnumnonpx.test( computed ) ? 16886 jQuery( elem ).position()[ prop ] + "px" : 16887 computed; 16888 } 16889 } 16890 ); 16891} ); 16892 16893 16894// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods 16895jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { 16896 jQuery.each( { 16897 padding: "inner" + name, 16898 content: type, 16899 "": "outer" + name 16900 }, function( defaultExtra, funcName ) { 16901 16902 // Margin is only for outerHeight, outerWidth 16903 jQuery.fn[ funcName ] = function( margin, value ) { 16904 var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), 16905 extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); 16906 16907 return access( this, function( elem, type, value ) { 16908 var doc; 16909 16910 if ( isWindow( elem ) ) { 16911 16912 // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729) 16913 return funcName.indexOf( "outer" ) === 0 ? 16914 elem[ "inner" + name ] : 16915 elem.document.documentElement[ "client" + name ]; 16916 } 16917 16918 // Get document width or height 16919 if ( elem.nodeType === 9 ) { 16920 doc = elem.documentElement; 16921 16922 // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], 16923 // whichever is greatest 16924 return Math.max( 16925 elem.body[ "scroll" + name ], doc[ "scroll" + name ], 16926 elem.body[ "offset" + name ], doc[ "offset" + name ], 16927 doc[ "client" + name ] 16928 ); 16929 } 16930 16931 return value === undefined ? 16932 16933 // Get width or height on the element, requesting but not forcing parseFloat 16934 jQuery.css( elem, type, extra ) : 16935 16936 // Set width or height on the element 16937 jQuery.style( elem, type, value, extra ); 16938 }, type, chainable ? margin : undefined, chainable ); 16939 }; 16940 } ); 16941} ); 16942 16943 16944jQuery.each( [ 16945 "ajaxStart", 16946 "ajaxStop", 16947 "ajaxComplete", 16948 "ajaxError", 16949 "ajaxSuccess", 16950 "ajaxSend" 16951], function( _i, type ) { 16952 jQuery.fn[ type ] = function( fn ) { 16953 return this.on( type, fn ); 16954 }; 16955} ); 16956 16957 16958 16959 16960jQuery.fn.extend( { 16961 16962 bind: function( types, data, fn ) { 16963 return this.on( types, null, data, fn ); 16964 }, 16965 unbind: function( types, fn ) { 16966 return this.off( types, null, fn ); 16967 }, 16968 16969 delegate: function( selector, types, data, fn ) { 16970 return this.on( types, selector, data, fn ); 16971 }, 16972 undelegate: function( selector, types, fn ) { 16973 16974 // ( namespace ) or ( selector, types [, fn] ) 16975 return arguments.length === 1 ? 16976 this.off( selector, "**" ) : 16977 this.off( types, selector || "**", fn ); 16978 }, 16979 16980 hover: function( fnOver, fnOut ) { 16981 return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); 16982 } 16983} ); 16984 16985jQuery.each( 16986 ( "blur focus focusin focusout resize scroll click dblclick " + 16987 "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + 16988 "change select submit keydown keypress keyup contextmenu" ).split( " " ), 16989 function( _i, name ) { 16990 16991 // Handle event binding 16992 jQuery.fn[ name ] = function( data, fn ) { 16993 return arguments.length > 0 ? 16994 this.on( name, null, data, fn ) : 16995 this.trigger( name ); 16996 }; 16997 } 16998); 16999 17000 17001 17002 17003// Support: Android <=4.0 only 17004// Make sure we trim BOM and NBSP 17005var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; 17006 17007// Bind a function to a context, optionally partially applying any 17008// arguments. 17009// jQuery.proxy is deprecated to promote standards (specifically Function#bind) 17010// However, it is not slated for removal any time soon 17011jQuery.proxy = function( fn, context ) { 17012 var tmp, args, proxy; 17013 17014 if ( typeof context === "string" ) { 17015 tmp = fn[ context ]; 17016 context = fn; 17017 fn = tmp; 17018 } 17019 17020 // Quick check to determine if target is callable, in the spec 17021 // this throws a TypeError, but we will just return undefined. 17022 if ( !isFunction( fn ) ) { 17023 return undefined; 17024 } 17025 17026 // Simulated bind 17027 args = slice.call( arguments, 2 ); 17028 proxy = function() { 17029 return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); 17030 }; 17031 17032 // Set the guid of unique handler to the same of original handler, so it can be removed 17033 proxy.guid = fn.guid = fn.guid || jQuery.guid++; 17034 17035 return proxy; 17036}; 17037 17038jQuery.holdReady = function( hold ) { 17039 if ( hold ) { 17040 jQuery.readyWait++; 17041 } else { 17042 jQuery.ready( true ); 17043 } 17044}; 17045jQuery.isArray = Array.isArray; 17046jQuery.parseJSON = JSON.parse; 17047jQuery.nodeName = nodeName; 17048jQuery.isFunction = isFunction; 17049jQuery.isWindow = isWindow; 17050jQuery.camelCase = camelCase; 17051jQuery.type = toType; 17052 17053jQuery.now = Date.now; 17054 17055jQuery.isNumeric = function( obj ) { 17056 17057 // As of jQuery 3.0, isNumeric is limited to 17058 // strings and numbers (primitives or objects) 17059 // that can be coerced to finite numbers (gh-2662) 17060 var type = jQuery.type( obj ); 17061 return ( type === "number" || type === "string" ) && 17062 17063 // parseFloat NaNs numeric-cast false positives ("") 17064 // ...but misinterprets leading-number strings, particularly hex literals ("0x...") 17065 // subtraction forces infinities to NaN 17066 !isNaN( obj - parseFloat( obj ) ); 17067}; 17068 17069jQuery.trim = function( text ) { 17070 return text == null ? 17071 "" : 17072 ( text + "" ).replace( rtrim, "" ); 17073}; 17074 17075 17076 17077// Register as a named AMD module, since jQuery can be concatenated with other 17078// files that may use define, but not via a proper concatenation script that 17079// understands anonymous AMD modules. A named AMD is safest and most robust 17080// way to register. Lowercase jquery is used because AMD module names are 17081// derived from file names, and jQuery is normally delivered in a lowercase 17082// file name. Do this after creating the global so that if an AMD module wants 17083// to call noConflict to hide this version of jQuery, it will work. 17084 17085// Note that for maximum portability, libraries that are not jQuery should 17086// declare themselves as anonymous modules, and avoid setting a global if an 17087// AMD loader is present. jQuery is a special case. For more information, see 17088// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon 17089 17090if ( typeof define === "function" && define.amd ) { 17091 define( "jquery", [], function() { 17092 return jQuery; 17093 } ); 17094} 17095 17096 17097 17098 17099var 17100 17101 // Map over jQuery in case of overwrite 17102 _jQuery = window.jQuery, 17103 17104 // Map over the $ in case of overwrite 17105 _$ = window.$; 17106 17107jQuery.noConflict = function( deep ) { 17108 if ( window.$ === jQuery ) { 17109 window.$ = _$; 17110 } 17111 17112 if ( deep && window.jQuery === jQuery ) { 17113 window.jQuery = _jQuery; 17114 } 17115 17116 return jQuery; 17117}; 17118 17119// Expose jQuery and $ identifiers, even in AMD 17120// (#7102#comment:10, https://github.com/jquery/jquery/pull/557) 17121// and CommonJS for browser emulators (#13566) 17122if ( typeof noGlobal === "undefined" ) { 17123 window.jQuery = window.$ = jQuery; 17124} 17125 17126 17127 17128 17129return jQuery; 17130} ); 17131 17132 17133 17134/***/ }), 17135
17136/***/ "./src/js/cursor.js": 17137/*!**************************!*\ 17138 !*** ./src/js/cursor.js ***! 17139 \**************************/ 17140/*! exports provided: default */ 17141/***/ (function(module, __webpack_exports__, __webpack_require__) { 17142 17143"use strict"; 17144__webpack_require__.r(__webpack_exports__); 17145/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Cursor; }); 17146/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); 17147/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__); 17148/* harmony import */ var gsap__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! gsap */ "./node_modules/gsap/index.js"); 17149function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor);}}function _createClass(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor;}/*** IMPORTS FROM imports-loader ***/var define=false;var Cursor=/*#__PURE__*/function(){function Cursor(options){_classCallCheck(this,Cursor);this.options=jquery__WEBPACK_IMPORTED_MODULE_0___default.a.extend(true,{container:"body",speed:0.7,ease:"expo.out",visibleTimeout:300},options);this.body=jquery__WEBPACK_IMPORTED_MODULE_0___default()(this.options.container);this.el=jquery__WEBPACK_IMPORTED_MODULE_0___default()('<div class="cb-cursor"></div>');this.text=jquery__WEBPACK_IMPORTED_MODULE_0___default()('<div class="cb-cursor-text"></div>');this.init();}_createClass(Cursor,[{key:"init",value:function init(){this.el.append(this.text);this.body.append(this.el);this.bind();this.move(-window.innerWidth,-window.innerHeight,0);}},{key:"bind",value:function bind(){var _this=this;var self=this;this.body.on('mouseleave',function(){self.hide();}).on('mouseenter',function(){self.show();}).on('mousemove',function(e){_this.pos={x:_this.stick?_this.stick.x-(_this.stick.x-e.clientX)*0.15:e.clientX,y:_this.stick?_this.stick.y-(_this.stick.y-e.clientY)*0.15:e.clientY};_this.update();}).on('mousedown',function(){self.setState('-active');}).on('mouseup',function(){self.removeState('-active');}).on('mouseenter','a,input,textarea,button',function(){self.setState('-pointer');}).on('mouseleave','a,input,textarea,button',function(){self.removeState('-pointer');}).on('mouseenter','iframe',function(){self.hide();}).on('mouseleave','iframe',function(){self.show();}).on('mouseenter','[data-cursor]',function(){self.setState(this.dataset.cursor);}).on('mouseleave','[data-cursor]',function(){self.removeState(this.dataset.cursor);}).on('mouseenter','[data-cursor-text]',function(){self.setText(this.dataset.cursorText);}).on('mouseleave','[data-cursor-text]',function(){self.removeText();}).on('mouseenter','[data-cursor-stick]',function(){self.setStick(this.dataset.cursorStick);}).on('mouseleave','[data-cursor-stick]',function(){self.removeStick();});}},{key:"setState",value:function setState(state){this.el.addClass(state);}},{key:"removeState",value:function removeState(state){this.el.removeClass(state);}},{key:"toggleState",value:function toggleState(state){this.el.toggleClass(state);}},{key:"setText",value:function setText(text){this.text.html(text);this.el.addClass('-text');}},{key:"removeText",value:function removeText(){this.el.removeClass('-text');}},{key:"setStick",value:function setStick(el){var target=jquery__WEBPACK_IMPORTED_MODULE_0___default()(el);var bound=target.get(0).getBoundingClientRect();this.stick={y:bound.top+target.height()/2,x:bound.left+target.width()/2};this.move(this.stick.x,this.stick.y,5);}},{key:"removeStick",value:function removeStick(){this.stick=false;}}
17149,{key:"update",value:function update(){this.move();this.show();}},{key:"move",value:function move(x,y,duration){gsap__WEBPACK_IMPORTED_MODULE_1__["default"].to(this.el,{x:x||this.pos.x,y:y||this.pos.y,force3D:true,overwrite:true,ease:this.options.ease,duration:this.visible?duration||this.options.speed:0});}},{key:"show",value:function show(){var _this2=this;if(this.visible)return;clearInterval(this.visibleInt);this.el.addClass('-visible');this.visibleInt=setTimeout(function(){return _this2.visible=true;});}},{key:"hide",value:function hide(){var _this3=this;clearInterval(this.visibleInt);this.el.removeClass('-visible');this.visibleInt=setTimeout(function(){return _this3.visible=false;},this.options.visibleTimeout);}}]);return Cursor;}(); 17150 17151/***/ }), 17152
17153/***/ "./src/js/index.js": 17154/*!*************************!*\ 17155 !*** ./src/js/index.js ***! 17156 \*************************/ 17157/*! no exports provided */ 17158/***/ (function(module, __webpack_exports__, __webpack_require__) { 17159 17160"use strict"; 17161__webpack_require__.r(__webpack_exports__); 17162/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); 17163/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__); 17164/* harmony import */ var cursor__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! cursor */ "./src/js/cursor.js"); 17165/* harmony import */ var magnetic__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! magnetic */ "./src/js/magnetic.js"); 17166/*** IMPORTS FROM imports-loader ***/var define=false;// Init cursor 17167var cursor=new cursor__WEBPACK_IMPORTED_MODULE_1__["default"]();// Init magnetic 17168jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-magnetic]').each(function(){new magnetic__WEBPACK_IMPORTED_MODULE_2__["default"](this);}); 17169 17170/***/ }), 17171
17172/***/ "./src/js/magnetic.js": 17173/*!****************************!*\ 17174 !*** ./src/js/magnetic.js ***! 17175 \****************************/ 17176/*! exports provided: default */ 17177/***/ (function(module, __webpack_exports__, __webpack_require__) { 17178 17179"use strict"; 17180__webpack_require__.r(__webpack_exports__); 17181/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Magnetic; }); 17182/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); 17183/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__); 17184/* harmony import */ var gsap__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! gsap */ "./node_modules/gsap/index.js"); 17185function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor);}}function _createClass(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor;}/*** IMPORTS FROM imports-loader ***/var define=false;var Magnetic=/*#__PURE__*/function(){function Magnetic(el){var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};_classCallCheck(this,Magnetic);this.el=jquery__WEBPACK_IMPORTED_MODULE_0___default()(el);this.options=jquery__WEBPACK_IMPORTED_MODULE_0___default.a.extend(true,{y:0.2,x:0.2,s:0.2,rs:0.7},this.el.data('magnetic')||options);this.y=0;this.x=0;this.width=0;this.height=0;if(this.el.data('magnetic-init'))return;this.el.data('magnetic-init',true);this.bind();}_createClass(Magnetic,[{key:"bind",value:function bind(){var _this=this;this.el.on('mouseenter',function(){_this.y=_this.el.offset().top-window.pageYOffset;_this.x=_this.el.offset().left-window.pageXOffset;_this.width=_this.el.outerWidth();_this.height=_this.el.outerHeight();});this.el.on('mousemove',function(e){var y=(e.clientY-_this.y-_this.height/2)*_this.options.y;var x=(e.clientX-_this.x-_this.width/2)*_this.options.x;_this.move(x,y,_this.options.s);});this.el.on('mouseleave',function(e){_this.move(0,0,_this.options.rs);});}},{key:"move",value:function move(x,y,speed){gsap__WEBPACK_IMPORTED_MODULE_1__["default"].to(this.el,{y:y,x:x,force3D:true,overwrite:true,duration:speed});}}]);return Magnetic;}(); 17186 17187/***/ })
17187 17188 17189/******/ }); 17190//# sourceMappingURL=bundle.js.map 17191$(function(){ 17192 if (typeof(EC_SHOP_MULTISHOP_SHIPPING) != "undefined") { 17193 var sShippingCountryCode4Cookie = 'shippingCountryCode'; 17194 var bShippingCountryProc = false; 17195 17196 // ë°°ì¡êµê° ì í ì¤ì ì´ ì¬ì©ìí¨ì´ë©´ ì¨ê¹ 17197 if (EC_SHOP_MULTISHOP_SHIPPING.bMultishopShippingCountrySelection === false) { 17198 $('.xans-layout-multishopshipping .xans-layout-multishopshippingcountrylist').hide(); 17199 $('.xans-layout-multishoplist .xans-layout-multishoplistmultioption .xans-layout-multishoplistmultioptioncountry').hide(); 17200 } else { 17201 $('.thumb .xans-layout-multishoplistitem').hide(); 17202 var aShippingCountryCode = document.cookie.match('(^|;) ?'+sShippingCountryCode4Cookie+'=([^;]*)(;|$)'); 17203 if (typeof(aShippingCountryCode) != 'undefined' && aShippingCountryCode != null && aShippingCountryCode.length > 2) { 17204 var sShippingCountryValue = aShippingCountryCode[2]; 17205 } 17206 17207 // query stringì¼ë¡ ëì´ ì¨ ë°°ì¡êµê° ê°ì´ ìë¤ë©´, ê·¸ ê°ì ì ì©í¨ 17208 var aHrefCountryValue = decodeURIComponent(location.href).split("/?country="); 17209 17210 if (aHrefCountryValue.length == 2) { 17211 var sShippingCountryValue = aHrefCountryValue[1]; 17212 } 17213 17214 // ë©ì¸ íì´ì§ìì êµê°ì íì ìí ê²½ì°, ê·¸ ì¸ì íì´ì§ìì ì í ë ê°ì´ ì ëì¤ë íì ì²ë¦¬ 17215 if (location.href.split("/").length != 4 && $(".xans-layout-multishopshipping .xans-layout-multishopshippingcountrylist").val()) { 17216 $(".xans-layout-multishoplist .xans-layout-multishoplistmultioption a .ship span").text(" : "+$(".xans-layout-multishopshipping .xans-layout-multishopshippingcountrylist option:selected").text().split("SHIPPING TO : ").join("")); 17217 17218 if ($("#f_country").length > 0 && location.href.indexOf("orderform.html") > -1) { 17219 $("#f_country").val($(".xans-layout-multishopshipping .xans-layout-multishopshippingcountrylist").val()); 17220 } 17221 } 17222 if (typeof(sShippingCountryValue) != "undefined" && sShippingCountryValue != "" && sShippingCountryValue != null) { 17223 sShippingCountryValue = sShippingCountryValue.split("#")[0]; 17224 var bShippingCountryProc = true; 17225 17226 $(".xans-layout-multishopshipping .xans-layout-multishopshippingcountrylist").val(sShippingCountryValue); 17227 $(".xans-layout-multishoplist .xans-layout-multishoplistmultioption a .ship span").text(" : "+$(".xans-layout-multishopshipping .xans-layout-multishopshippingcountrylist option:selected").text().split("SHIPPING TO : ").join("")); 17228 var expires = new Date(); 17229 expires.setTime(expires.getTime() + (30 * 24 * 60 * 60 * 1000)); // 30ì¼ê° ì¿ í¤ ì ì§ 17230 document.cookie = sShippingCountryCode4Cookie+'=' + $(".xans-layout-multishopshipping .xans-layout-multishopshippingcountrylist").val() +';path=/'+ ';expires=' + expires.toUTCString(); 17231 if ($("#f_country").length > 0 && location.href.indexOf("orderform.html") > -1) { 17232 $("#f_country").val(sShippingCountryValue).change(); 17233 } 17234 } 17235 } 17236 // ì¸ì´ì í ì¤ì ì´ ì¬ì©ìí¨ì´ë©´ ì¨ê¹ 17237 if (EC_SHOP_MULTISHOP_SHIPPING.bMultishopShippingLanguageSelection === false) { 17238 $('.xans-layout-multishopshipping .xans-layout-multishopshippinglanguagelist').hide(); 17239 $('.xans-layout-multishoplist .xans-layout-multishoplistmultioption .xans-layout-multishoplistmultioptionlanguage').hide(); 17240 } else { 17241 $('.thumb .xans-layout-multishoplistitem').hide(); 17242 } 17243 17244 // ë°°ì¡êµê° ë° ì¸ì´ ì¤ì ì´ ë ë¤ ì¬ì©ìí¨ì´ë©´ ì¨ê¹ 17245 if (EC_SHOP_MULTISHOP_SHIPPING.bMultishopShipping === false) { 17246 $(".xans-layout-multishopshipping").hide(); 17247 $('.xans-layout-multishoplist .xans-layout-multishoplistmultioption').hide(); 17248 } else if (bShippingCountryProc === false && location.href.split("/").length == 4) { // ë°°ì¡êµê° ê°
17248ì ì²ë¦¬í ì ì´ ìê³ , ë©ì¸íë©´ì¼ ëë§ ì í ë ì´ì´ë¥¼ ëì 17249 var sShippingCountryValue = $(".xans-layout-multishopshipping .xans-layout-multishopshippingcountrylist").val(); 17250 $(".xans-layout-multishopshipping .xans-layout-multishopshippingcountrylist").val(sShippingCountryValue); 17251 $(".xans-layout-multishoplist .xans-layout-multishoplistmultioption a .ship span").text(" : "+$(".xans-layout-multishopshipping .xans-layout-multishopshippingcountrylist option:selected").text().split("SHIPPING TO : ").join("")); 17252 // ë°°ì¡êµê° ì íì ì¬ì©í´ì¼ ë ì´ì´ë¥¼ ë³´ì´ê² í¨ 17253 if (EC_SHOP_MULTISHOP_SHIPPING.bMultishopShippingCountrySelection === true) { 17254 $(".xans-layout-multishopshipping").show(); 17255 } 17256 } 17257 17258 $(".xans-layout-multishopshipping .close").on("click", function() { 17259 $(".xans-layout-multishopshipping").hide(); 17260 }); 17261 17262 $(".xans-layout-multishopshipping .ec-base-button a").on("click", function() { 17263 var expires = new Date(); 17264 expires.setTime(expires.getTime() + (30 * 24 * 60 * 60 * 1000)); // 30ì¼ê° ì¿ í¤ ì ì§ 17265 document.cookie = sShippingCountryCode4Cookie+'=' + $(".xans-layout-multishopshipping .xans-layout-multishopshippingcountrylist").val() +';path=/'+ ';expires=' + expires.toUTCString(); 17266 17267 // ëë©ì¸ 문ì ë¡ ì¿ í¤ë¡ ë°°ì¡êµê° ì¤ì ì´ ì ëë ê²½ì°ë¥¼ ìí´ query stringì¼ë¡ ë°°ì¡êµê° ê°ì ëê¹ 17268 var sQuerySting = (EC_SHOP_MULTISHOP_SHIPPING.bMultishopShippingCountrySelection === false) ? "" : "/?country="+encodeURIComponent($(".xans-layout-multishopshipping .xans-layout-multishopshippingcountrylist").val()); 17269 17270 location.href = '//'+$(".xans-layout-multishopshipping .xans-layout-multishopshippinglanguagelist").val()+sQuerySting; 17271 }); 17272 $(".xans-layout-multishoplist .xans-layout-multishoplistmultioption a").on("click", function() { 17273 $(".xans-layout-multishopshipping").show(); 17274 }); 17275 } 17276});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.