1( function () { 2 'use strict'; 3 4 var nextFrame; 5 var headerImage; 6 var brandingWrapper; 7 8 // Cool header image scroll 9 function handleScrollFrame() { 10 if ( document.documentElement.clientWidth > 800 ) { 11 var scrollY = window.scrollY || window.pageYOffset || 0; 12 headerImage.style.transform = 'translateY(' + scrollY / 3 + 'px)'; 13 14 var headerHeightPx = getComputedStyle( headerImage ).height || '0'; 15 var headerHeight = parseInt( headerHeightPx.replace( 'px', '' ), 10 ); 16 var opacity = headerHeight ? 1 - scrollY / headerHeight : 1; 17 brandingWrapper.style.opacity = opacity > 0 ? opacity : 0; 18 } else { 19 headerImage.style.transform = 'translateY(0)'; 20 brandingWrapper.style.opacity = 1; 21 } 22 nextFrame = null; 23 } 24 25 function onDocumentReady() { 26 headerImage = document.querySelector( '.site-header-image' ); 27 brandingWrapper = document.querySelector( '.site-branding-wrapper' ); 28 29 if ( headerImage && brandingWrapper ) { 30 window.addEventListener( 'scroll', function () { 31 // Schedule a new frame, if one hasn't been scheduled yet. 32 nextFrame = nextFrame || requestAnimationFrame( handleScrollFrame ); 33 } ); 34 } 35 36 // Smooth scroll to header 37 var toTheTop = document.querySelector( '.tothetop' ); 38 if ( toTheTop ) { 39 toTheTop.addEventListener( 'click', function ( e ) { 40 e.preventDefault(); 41 if ( 42 window.CSS && 43 window.CSS.supports && 44 window.CSS.supports( 'scroll-behavior', 'smooth' ) 45 ) { 46 window.scroll( { top: 0, behavior: 'smooth' } ); 47 } else { 48 window.scroll( 0, 0 ); 49 } 50 } ); 51 } 52 } 53 54 function onPageLoad() { 55 // Trigger resize event to make sure video widgets in the footer maintain the correct aspect ratio 56 setTimeout( function () { 57 if ( typeof Event === 'function' ) { 58 window.dispatchEvent( new Event( 'resize' ) ); 59 } else { 60 var event = window.document.createEvent( 'UIEvents' ); 61 event.initUIEvent( 'resize', true, false, window, 0 ); 62 window.dispatchEvent( event ); 63 } 64 } ); 65 } 66 67 if ( document.readyState !== 'loading' ) { 68 onDocumentReady(); 69 } else { 70 document.addEventListener( 'DOMContentLoaded', onDocumentReady ); 71 } 72 73 if ( document.readyState === 'complete' ) { 74 onPageLoad(); 75 } else { 76 window.addEventListener( 'load', onPageLoad ); 77 } 78} )(); 79; 80/** 81 * navigation.js 82 * 83 * Handles toggling the navigation menu and search menu for small screens. 84 */ 85( function() { 86 var container, button, menu, links, i, len; 87 88 container = document.getElementById( 'site-navigation' ); 89 if ( ! container ) { 90 return; 91 } 92 93 button = container.getElementsByTagName( 'button' )[0]; 94 if ( 'undefined' === typeof button ) { 95 return; 96 } 97 98 menu = container.getElementsByTagName( 'ul' )[0]; 99 100 // Hide menu toggle button if menu is empty and return early. 101 if ( 'undefined' === typeof menu ) { 102 button.style.display = 'none'; 103 return; 104 } 105 106 menu.setAttribute( 'aria-expanded', 'false' ); 107 if ( -1 === menu.className.indexOf( 'nav-menu' ) ) { 108 menu.className += ' nav-menu'; 109 } 110 111 button.onclick = function() { 112 if ( -1 !== container.className.indexOf( 'toggled' ) ) { 113 container.className = container.className.replace( ' toggled', '' ); 114 button.setAttribute( 'aria-expanded', 'false' ); 115 menu.setAttribute( 'aria-expanded', 'false' ); 116 } else { 117 container.className += ' toggled'; 118 button.setAttribute( 'aria-expanded', 'true' ); 119 menu.setAttribute( 'aria-expanded', 'true' ); 120 } 121 }; 122 123 // Get all the link elements within the menu. 124 links = menu.getElementsByTagName( 'a' ); 125 126 // Each time a menu link is focused or blurred, toggle focus. 127 for ( i = 0, len = links.length; i < len; i++ ) { 128 links[i].addEventListener( 'focus', toggleFocus, true ); 129 links[i].addEventListener( 'blur', toggleFocus, true ); 130 } 131 132 /** 133 * Sets or removes .focus class on an element. 134 */ 135 function toggleFocus() { 136 var self = this; 137 138 // Move up through the ancestors of the current link until we hit .nav-menu. 139 while ( -1 === self.className.indexOf( 'nav-menu' ) ) { 140 141 // On li elements toggle the class .focus. 142 if ( 'li' === self.tagName.toLowerCase() ) { 143 if ( -1 !== self.className.indexOf( 'focus' ) ) { 144 self.className = self.className.replace( ' focus', '' ); 145 } else { 146 self.className += ' focus'; 147 } 148 } 149 150 self = self.parentElement; 151 } 152 } 153
154 /** 155 * Toggles `focus` class to allow submenu access on tablets. 156 */ 157 ( function( container ) { 158 var touchStartFn, i, 159 parentLink = container.querySelectorAll( '.menu-item-has-children > a, .page_item_has_children > a' ); 160 161 if ( 'ontouchstart' in window ) { 162 touchStartFn = function( e ) { 163 var menuItem = this.parentNode, i; 164 165 if ( ! menuItem.classList.contains( 'focus' ) ) { 166 e.preventDefault(); 167 for ( i = 0; i < menuItem.parentNode.children.length; ++i ) { 168 if ( menuItem === menuItem.parentNode.children[i] ) { 169 continue; 170 } 171 menuItem.parentNode.children[i].classList.remove( 'focus' ); 172 } 173 menuItem.classList.add( 'focus' ); 174 } else { 175 menuItem.classList.remove( 'focus' ); 176 } 177 }; 178 179 for ( i = 0; i < parentLink.length; ++i ) { 180 parentLink[i].addEventListener( 'touchstart', touchStartFn, false ); 181 } 182 } 183 }( container ) ); 184 185 //Search form 186 var searchcontainer, searchbutton, searchmenu; 187 188 searchcontainer = document.getElementById( 'header-search' ); 189 if ( ! searchcontainer ) 190 return; 191 192 searchbutton = document.getElementById( 'header-search-toggle' ); 193 if ( 'undefined' === typeof searchbutton ) 194 return; 195 196 searchbutton.onclick = function() { 197 if ( -1 !== searchcontainer.className.indexOf( 'toggled' ) ) { 198 searchcontainer.className = searchcontainer.className.replace( 'toggled', '' ); 199 } 200 else { 201 searchcontainer.className += 'toggled'; 202 container.className = container.className.replace( ' toggled', '' ); 203 } 204 }; 205 206} )(); 207; 208( function() { 209 var is_webkit = navigator.userAgent.toLowerCase().indexOf( 'webkit' ) > -1, 210 is_opera = navigator.userAgent.toLowerCase().indexOf( 'opera' ) > -1, 211 is_ie = navigator.userAgent.toLowerCase().indexOf( 'msie' ) > -1; 212 213 if ( ( is_webkit || is_opera || is_ie ) && 'undefined' !== typeof( document.getElementById ) ) { 214 var eventMethod = ( window.addEventListener ) ? 'addEventListener' : 'attachEvent'; 215 window[ eventMethod ]( 'hashchange', function() { 216 var element = document.getElementById( location.hash.substring( 1 ) ); 217 218 if ( element ) { 219 if ( ! /^(?:a|select|input|button|textarea)$/i.test( element.tagName ) ) 220 element.tabIndex = -1; 221 222 element.focus(); 223 } 224 }, false ); 225 } 226})(); 227; 228/*! This file is auto-generated */ 229window.addComment=function(v){var I,C,h,E=v.document,b={commentReplyClass:"comment-reply-link",commentReplyTitleId:"reply-title",cancelReplyId:"cancel-comment-reply-link",commentFormId:"commentform",temporaryFormId:"wp-temp-form-div",parentIdFieldId:"comment_parent",postIdFieldId:"comment_post_ID"},e=v.MutationObserver||v.WebKitMutationObserver||v.MozMutationObserver,i="querySelector"in E&&"addEventListener"in v,n=!!E.documentElement.dataset;function t(){o(),e&&new e(d).observe(E.body,{childList:!0,subtree:!0})}function o(e){if(i&&(I=g(b.cancelReplyId),C=g(b.commentFormId),I)){I.addEventListener("click",l);function t(e){if((e.metaKey||e.ctrlKey)&&13===e.keyCode&&"a"!==E.activeElement.tagName.toLowerCase())return C.removeEventListener("keydown",t),e.preventDefault(),C.submit.click(),!1}C&&C.addEventListener("keydown",t);for(var n=function(e){var t=b.commentReplyClass;e&&e.childNodes||(e=E);e=E.getElementsByClassName?e.getElementsByClassName(t):e.querySelectorAll("."+t);return e}(e),o=0,d=n.length;o<d;o++)n[o].addEventListener("click",r)}}function l(e){var t,n,o=g(b.temporaryFormId);o&&h&&(g(b.parentIdFieldId).value="0",t=o.textContent,o.parentNode.replaceChild(h,o),this.style.display="none",n=(o=(o=g(b.commentReplyTitleId))&&o.firstChild)&&o.nextSibling,o&&o.nodeType===Node.TEXT_NODE&&t&&(n&&"A"===n.nodeName&&n.id!==b.cancelReplyId&&(n.style.display=""),o.textContent=t),e.preventDefault())}function r(e){var t=g(b.commentReplyTitleId),t=t&&t.firstChild.textContent,n=this,o=a(n,"belowelement"),d=a(n,"commentid"),i=a(n,"respondelement"),l=a(n,"postid"),n=a(n,"replyto")||t;o&&d&&i&&l&&!1===v.addComment.moveForm(o,d,i,l,n)&&e.preventDefault()}function d(e){for(var t=e.length;t--;)if(e[t].addedNodes.length)return void o()}function a(e,t){return n?e.dataset[t]:e.getAttribute("data-"+t)}function g(e){return E.getElementById(e)}return i&&"loading"!==E.readyState?t():i&&v.addEventListener("DOMContentLoaded",t,!1),{init:o,moveForm:function(e,t,n,o,d){var i,l,r,a,m,c,s,e=g(e),n=(h=g(n),g(b.parentIdFieldId)),y=g(b.postIdFieldId),p=g(b.commentReplyTitleId),u=(p=p&&p.firstChild)&&p.nextSibling;if(e&&h&&n){void 0===d&&(d=p&&p.textContent),a=h,m=b.temporaryFormId,c=g(m),s=(s=g(b.commentReplyTitleId))?s.firstChild.textContent:"",c||((c=E.createElement("div")).id=m,c.style.display="none",c.textContent=s,a.parentNode.insertBefore(c,a)),o&&y&&(y.value=o),n.value=t,I.style.display="",e.parentNode.insertBefore(h,e.nextSibling),p&&p.nodeType===Node.TEXT_NODE&&(u&&"A"===u.nodeName&&u.id!==b.cancelReplyId&&(u.style.display="none"),p.textContent=d),I.onclick=function(){return!1};try{for(var f=0;f<C.elements.length;f++)if(i=C.elements[f],l=!1,"getComputedStyle"in v?r=v.getComputedStyle(i):E.documentElement.currentStyle&&(r=i.currentStyle),(i.offsetWidth<=0&&i.offsetHeight<=0||"hidden"===r.visibility)&&(l=!0),"hidden"
229!==i.type&&!i.disabled&&!l){i.focus();break}}catch(e){}return!1}}}}(window);; 230( function () { 231 'use strict'; 232 233 function parsePx( val ) { 234 return parseInt( ( val || '' ).replace( 'px', '' ), 10 ) || 0; 235 } 236 237 function getOffset( el ) { 238 var rect = el.getBoundingClientRect(); 239 return { 240 top: rect.top + ( window.scrollY || window.pageYOffset || 0 ), 241 left: rect.left + ( window.scrollX || window.pageXOffset || 0 ), 242 }; 243 } 244 245 function getBubbleStyles( el ) { 246 el.style.display = 'block'; 247 var styles = JSON.parse( JSON.stringify( getComputedStyle( el ) ) ); 248 el.style.removeProperty( 'display' ); 249 return { 250 width: styles.width, 251 paddingLeft: styles.paddingLeft, 252 paddingRight: styles.paddingRight, 253 }; 254 } 255 256 function delayBubbleHide( bubble, gravatar ) { 257 // Small delay, so mouseenter has a chance to run and set hover to true 258 // if the mouse is back on the bubble. 259 setTimeout( function () { 260 if ( 261 ( ! bubble.hasAttribute( 'data-hover' ) || 262 bubble.getAttribute( 'data-hover' ) === 'false' ) && 263 ( ! gravatar.hasAttribute( 'data-hover' ) || 264 gravatar.getAttribute( 'data-hover' ) === 'false' ) 265 ) { 266 bubble.classList.remove( 'fadein' ); 267 } 268 }, 100 ); 269 } 270 271 function setupAvatarTips() { 272 document.querySelectorAll( '.wpcom-follow-gravatar > a' ).forEach( function ( link ) { 273 link.setAttribute( 'data-hover', 'false' ); 274 } ); 275 276 document.querySelectorAll( '.wpcom-follow-gravatar > a' ).forEach( function ( link ) { 277 link.addEventListener( 'mouseenter', function () { 278 link.setAttribute( 'data-hover', 'true' ); 279 var id = ( link.getAttribute( 'data-id' ) || '' ).replace( /[^a-z0-9_-]/gi, '' ); 280 281 if ( ! id ) { 282 return; 283 } 284 285 var bubble = document.querySelector( '#' + id ); 286 var img = link.querySelector( 'img' ); 287 if ( ! bubble || ! img ) { 288 return; 289 } 290 291 var avatarWidth = img.clientWidth; 292 var offset = getOffset( img ); 293 var top = offset.top + avatarWidth; 294 295 var bubbleWidth = parsePx( getBubbleStyles( bubble ).width ); 296 var bubbleLeft = offset.left - ( bubbleWidth - avatarWidth ) / 2; 297 var windowCollisionPadding = 10; 298 299 bubble.classList.remove( 'bubble-left' ); 300 bubble.classList.remove( 'bubble-right' ); 301 302 // Detect a collision on the left of the screen, and place the bubble at 303 // the edge of the window with a bit of padding. 304 if ( bubbleLeft < 0 ) { 305 bubbleLeft = offset.left - windowCollisionPadding; 306 bubble.classList.add( 'bubble-left' ); 307 } 308 309 // Detect a collision on the right of the screen, and place the bubble at 310 // the edge of the window with a bit of padding. 311 if ( bubbleLeft + bubbleWidth > document.documentElement.clientWidth ) { 312 var avatarPosition = getOffset( link ); 313 var avatarRight = avatarPosition.left + avatarWidth; 314 bubbleLeft = avatarRight - bubbleWidth - windowCollisionPadding; 315 bubble.classList.add( 'bubble-right' ); 316 } 317 318 bubble.style.left = bubbleLeft + 'px'; 319 bubble.style.top = top + 'px'; 320 bubble.classList.add( 'fadein' ); 321 } ); 322 } ); 323 324 document.querySelectorAll( '.wpcom-follow-bubbles > .wpcom-bubble' ).forEach( function ( div ) { 325 div.addEventListener( 'mouseenter', function () { 326 div.setAttribute( 'data-hover', 'true' ); 327 } ); 328 } ); 329 330 document 331 .querySelectorAll( '.wpcom-follow-bubbles > .wpcom-bubble' ) 332 .forEach( function ( bubble ) { 333 bubble.addEventListener( 'mouseleave', function () { 334 var id = ( bubble.getAttribute( 'id' ) || '' ).replace( /[^a-z0-9_-]/gi, '' ); 335 if ( ! id ) { 336 return; 337 } 338 339 var gravatar = document.querySelector( '.wpcom-follow-gravatar a[data-id="' + id + '"]' ); 340 bubble.setAttribute( 'data-hover', 'false' ); 341 delayBubbleHide( bubble, gravatar ); 342 } ); 343 } ); 344 345 document.querySelectorAll( '.wpcom-follow-gravatar > a' ).forEach( function ( link ) { 346 link.addEventListener( 'mouseleave', function () { 347 var id = ( link.getAttribute( 'data-id' ) || '' ).replace( /[^a-z0-9_-]/gi, '' ); 348 if ( ! id ) { 349 return; 350 } 351 352 var bubble = document.querySelector( '#' + id ); 353 link.setAttribute( 'data-hover', 'false' ); 354 delayBubbleHide( bubble, link ); 355 } ); 356 } ); 357 } 358 359 if ( document.readyState !== 'loading' ) { 360 setupAvatarTips(); 361 } else { 362 document.addEventListener( 'DOMContentLoaded', setupAvatarTips ); 363 } 364} )(); 365; 366!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exp
366orts.JetpackScriptDataModule=t():e.JetpackScriptDataModule=t()}(globalThis,()=>(()=>{"use strict";var e={729(e,t,r){r.d(t,{$8:()=>n.$8,IT:()=>n.IT,KS:()=>n.KS,L2:()=>n.L2,Sy:()=>n.Sy,au:()=>n.au,d_:()=>n.d_,e5:()=>n.e5,hT:()=>n.hT,lI:()=>n.lI,mH:()=>n.mH,oQ:()=>n.oQ,sV:()=>n.sV});var n=r(336)},336(e,t,r){function n(){return window.JetpackScriptData}function o(){return n()?.site}function i(e=""){return`${n()?.site.admin_url}${e}`}function a(e=""){return i(`admin.php?page=jetpack${e}`)}function u(e=""){return i(`admin.php?page=my-jetpack${e}`)}function p(){return n()?.site.plan?.features?.active??[]}function c(e){return-1!==p().indexOf(e)}function s(){return"wpcom"===n()?.site?.host}function f(){return"woa"===n()?.site?.host}function d(){return n()?.site?.is_wpcom_platform}function l(){return"unknown"===n()?.site?.host}function S(){return s()?"simple":f()?"woa":"jetpack"}function m(e){return n()?.user.current_user.capabilities[e]}r.d(t,{$8:()=>d,IT:()=>c,KS:()=>S,L2:()=>l,Sy:()=>s,au:()=>n,d_:()=>m,e5:()=>u,hT:()=>i,lI:()=>f,mH:()=>p,oQ:()=>a,sV:()=>o})}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,r),i.exports}r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n={};r.r(n),r.d(n,{currentUserCan:()=>o.d_,getActiveFeatures:()=>o.mH,getAdminUrl:()=>o.hT,getJetpackAdminPageUrl:()=>o.oQ,getMyJetpackUrl:()=>o.e5,getScriptData:()=>o.au,getSiteData:()=>o.sV,getSiteType:()=>o.KS,isJetpackSelfHostedSite:()=>o.L2,isSimpleSite:()=>o.Sy,isWoASite:()=>o.lI,isWpcomPlatformSite:()=>o.$8,siteHasFeature:()=>o.IT});var o=r(729);return n})());; 367/** 368 * Observe how the user enters content into the comment form in order to determine whether it's a bot or not. 369 * 370 * Note that no actual input is being saved here, only counts and timings between events. 371 */ 372 373( function() { 374 // Passive event listeners are guaranteed to never call e.preventDefault(), 375 // but they're not supported in all browsers. Use this feature detection 376 // to determine whether they're available for use. 377 var supportsPassive = false; 378 379 try { 380 var opts = Object.defineProperty( {}, 'passive', { 381 get : function() { 382 supportsPassive = true; 383 } 384 } ); 385 386 window.addEventListener( 'testPassive', null, opts ); 387 window.removeEventListener( 'testPassive', null, opts ); 388 } catch ( e ) {} 389 390 function init() { 391 var input_begin = ''; 392 393 var keydowns = {}; 394 var lastKeyup = null; 395 var lastKeydown = null; 396 var keypresses = []; 397 398 var modifierKeys = []; 399 var correctionKeys = []; 400 401 var lastMouseup = null; 402 var lastMousedown = null; 403 var mouseclicks = []; 404 var mouseclickCoordinates = []; 405 406 var mousemoveTimer = null; 407 var lastMousemoveX = null; 408 var lastMousemoveY = null; 409 var lastMousemoveTime = null; 410 var mousemoveStart = null; 411 var mousemoves = []; 412 var intervalsBetweenMousemovesAndClicks = []; 413 414 var touchmoveCountTimer = null; 415 var touchmoveCount = 0; 416 417 var lastTouchEnd = null; 418 var lastTouchStart = null; 419 var touchEvents = []; 420 421 var scrollCountTimer = null; 422 var scrollCount = 0; 423 424 var correctionKeyCodes = [ 'Backspace', 'Delete', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Home', 'End', 'PageUp', 'PageDown' ]; 425 var modifierKeyCodes = [ 'Shift', 'CapsLock' ]; 426 427 var forms = document.querySelectorAll( 'form[method=post]' ); 428 429 for ( var i = 0; i < forms.length; i++ ) { 430 var form = forms[i]; 431 432 var formAction = form.getAttribute( 'action' ); 433 434 // Ignore forms that POST directly to other domains; these could be things like payment forms. 435 if ( formAction ) { 436 // Check that the form is posting to an external URL, not a path. 437 if ( formAction.indexOf( 'http://' ) == 0 || formAction.indexOf( 'https://' ) == 0 ) { 438 if ( formAction.indexOf( 'http://' + window.location.hostname + '/' ) != 0 && formAction.indexOf( 'https://' + window.location.hostname + '/' ) != 0 ) { 439 continue; 440 } 441 } 442 } 443 444 form.addEventListener( 'submit', function () { 445 var ak_bkp = prepare_array_for_request( keypresses ); 446 var ak_bmc = prepare_array_for_request( mouseclicks ); 447 var ak_bte = prepare_array_for_request( touchEvents ); 448 var ak_bmm = prepare_array_for_request( mousemoves ); 449 var ak_bcc = prepare_array_for_request( mouseclickCoordinates ); 450 var ak_bibmac = intervalsBetweenMousemovesAndClicks.slice( 0, 100 ).join( ';' ); 451 452 var input_fields = { 453 // When did the user begin entering any input? 454 'bib': input_begin, 455 456 // When was the form submitted? 457 'bfs': Date.now(), 458 459 // How many keypresses did they make? 460 'bkpc': keypresses.length, 461
462 // How quickly did they press a sample of keys, and how long between them? 463 'bkp': ak_bkp, 464 465 // How quickly did they click the mouse, and how long between clicks? 466 'bmc': ak_bmc, 467 468 // How many mouseclicks did they make? 469 'bmcc': mouseclicks.length, 470 471 // When did they press modifier keys (like Shift or Capslock)? 472 'bmk': modifierKeys.join( ';' ), 473 474 // When did they correct themselves? e.g., press Backspace, or use the arrow keys to move the cursor back 475 'bck': correctionKeys.join( ';' ), 476 477 // How many times did they move the mouse? 478 'bmmc': mousemoves.length, 479 480 // How many times did they move around using a touchscreen? 481 'btmc': touchmoveCount, 482 483 // How many times did they scroll? 484 'bsc': scrollCount, 485 486 // How quickly did they perform touch events, and how long between them? 487 'bte': ak_bte, 488 489 // How many touch events were there? 490 'btec' : touchEvents.length, 491 492 // How quickly did they move the mouse, and how long between moves? 493 'bmm' : ak_bmm, 494 495 // Click coordinates 496 'bcc' : ak_bcc, 497 498 // Milliseconds between last mouse movement and each click 499 'bibmac' : ak_bibmac 500 }; 501 502 var akismet_field_prefix = 'ak_'; 503 504 if ( this.getElementsByClassName ) { 505 // Check to see if we've used an alternate field name prefix. We store this as an attribute of the container around some of the Akismet fields. 506 var possible_akismet_containers = this.getElementsByClassName( 'akismet-fields-container' ); 507 508 for ( var containerIndex = 0; containerIndex < possible_akismet_containers.length; containerIndex++ ) { 509 var container = possible_akismet_containers.item( containerIndex ); 510 511 if ( container.getAttribute( 'data-prefix' ) ) { 512 akismet_field_prefix = container.getAttribute( 'data-prefix' ); 513 break; 514 } 515 } 516 } 517 518 for ( var field_name in input_fields ) { 519 var field = document.createElement( 'input' ); 520 field.setAttribute( 'type', 'hidden' ); 521 field.setAttribute( 'name', akismet_field_prefix + field_name ); 522 field.setAttribute( 'value', input_fields[ field_name ] ); 523 this.appendChild( field ); 524 } 525 }, supportsPassive ? { passive: true } : false ); 526 527 form.addEventListener( 'keydown', function ( e ) { 528 // If you hold a key down, some browsers send multiple keydown events in a row. 529 // Ignore any keydown events for a key that hasn't come back up yet. 530 if ( e.key in keydowns ) { 531 return; 532 } 533 534 var keydownTime = ( new Date() ).getTime(); 535 keydowns[ e.key ] = [ keydownTime ]; 536 537 if ( ! input_begin ) { 538 input_begin = keydownTime; 539 } 540 541 // In some situations, we don't want to record an interval since the last keypress -- for example, 542 // on the first keypress, or on a keypress after focus has changed to another element. Normally, 543 // we want to record the time between the last keyup and this keydown. But if they press a 544 // key while already pressing a key, we want to record the time between the two keydowns. 545 546 var lastKeyEvent = Math.max( lastKeydown, lastKeyup ); 547 548 if ( lastKeyEvent ) { 549 keydowns[ e.key ].push( keydownTime - lastKeyEvent ); 550 } 551 552 lastKeydown = keydownTime; 553 }, supportsPassive ? { passive: true } : false ); 554 555 form.addEventListener( 'keyup', function ( e ) { 556 if ( ! ( e.key in keydowns ) ) { 557 // This key was pressed before this script was loaded, or a mouseclick happened during the keypress, or... 558 return; 559 } 560 561 var keyupTime = ( new Date() ).getTime(); 562 563 if ( 'TEXTAREA' === e.target.nodeName || 'INPUT' === e.target.nodeName ) { 564 if ( -1 !== modifierKeyCodes.indexOf( e.key ) ) { 565 modifierKeys.push( keypresses.length - 1 ); 566 } else if ( -1 !== correctionKeyCodes.indexOf( e.key ) ) { 567 correctionKeys.push( keypresses.length - 1 ); 568 } else { 569 // ^ Don't record timings for keys like Shift or backspace, since they 570 // typically get held down for longer than regular typing. 571 572 var keydownTime = keydowns[ e.key ][0]; 573 574 var keypress = []; 575 576 // Keypress duration. 577 keypress.push( keyupTime - keydownTime ); 578 579 // Amount of time between this keypress and the previous keypress. 580 if ( keydowns[ e.key ].length > 1 ) { 581 keypress.push( keydowns[ e.key ][1] ); 582 } 583 584 keypresses.push( keypress ); 585 } 586 } 587
588 delete keydowns[ e.key ]; 589 590 lastKeyup = keyupTime; 591 }, supportsPassive ? { passive: true } : false ); 592 593 form.addEventListener( "focusin", function ( e ) { 594 lastKeydown = null; 595 lastKeyup = null; 596 keydowns = {}; 597 }, supportsPassive ? { passive: true } : false ); 598 599 form.addEventListener( "focusout", function ( e ) { 600 lastKeydown = null; 601 lastKeyup = null; 602 keydowns = {}; 603 }, supportsPassive ? { passive: true } : false ); 604 } 605 606 document.addEventListener( 'mousedown', function ( e ) { 607 lastMousedown = ( new Date() ).getTime(); 608 609 if ( lastMousemoveTime ) { 610 intervalsBetweenMousemovesAndClicks.push( lastMousedown - lastMousemoveTime ); 611 } 612 613 var mouseclickCoordinate = []; 614 615 var rect = e.target.getBoundingClientRect(); 616 var relativeX = e.clientX - rect.left; 617 var relativeY = e.clientY - rect.top; 618 619 // Pixel offset of the click within the target element. 620 mouseclickCoordinate.push( Math.round( relativeX ) ); 621 mouseclickCoordinate.push( Math.round( relativeY ) ); 622 623 // Percentage offset of the click within the target element. 624 mouseclickCoordinate.push( rect.width > 0 ? Math.round( relativeX / rect.width * 100 ) : 0 ); 625 mouseclickCoordinate.push( rect.height > 0 ? Math.round( relativeY / rect.height * 100 ) : 0 ); 626 627 mouseclickCoordinates.push( mouseclickCoordinate ); 628 }, supportsPassive ? { passive: true } : false ); 629 630 document.addEventListener( 'mouseup', function ( e ) { 631 if ( ! lastMousedown ) { 632 // If the mousedown happened before this script was loaded, but the mouseup happened after... 633 return; 634 } 635 636 var now = ( new Date() ).getTime(); 637 638 var mouseclick = []; 639 mouseclick.push( now - lastMousedown ); 640 641 if ( lastMouseup ) { 642 mouseclick.push( lastMousedown - lastMouseup ); 643 } 644 645 mouseclicks.push( mouseclick ); 646 647 lastMouseup = now; 648 649 // If the mouse has been clicked, don't record this time as an interval between keypresses. 650 lastKeydown = null; 651 lastKeyup = null; 652 keydowns = {}; 653 }, supportsPassive ? { passive: true } : false ); 654 655 document.addEventListener( 'mousemove', function ( e ) { 656 lastMousemoveTime = ( new Date() ).getTime(); 657 658 if ( mousemoveTimer ) { 659 clearTimeout( mousemoveTimer ); 660 mousemoveTimer = null; 661 } 662 else { 663 mousemoveStart = lastMousemoveTime; 664 lastMousemoveX = e.offsetX; 665 lastMousemoveY = e.offsetY; 666 } 667 668 mousemoveTimer = setTimeout( function ( theEvent, originalMousemoveStart ) { 669 var now = ( new Date() ).getTime() - 500; // To account for the timer delay. 670 671 var mousemove = []; 672 mousemove.push( now - originalMousemoveStart ); 673 mousemove.push( 674 Math.round( 675 Math.sqrt( 676 Math.pow( theEvent.offsetX - lastMousemoveX, 2 ) + 677 Math.pow( theEvent.offsetY - lastMousemoveY, 2 ) 678 ) 679 ) 680 ); 681 682 if ( mousemove[1] > 0 ) { 683 // If there was no measurable distance, then it wasn't really a move. 684 mousemoves.push( mousemove ); 685 } 686 687 mousemoveStart = null; 688 mousemoveTimer = null; 689 }, 500, e, mousemoveStart ); 690 }, supportsPassive ? { passive: true } : false ); 691 692 document.addEventListener( 'touchmove', function ( e ) { 693 if ( touchmoveCountTimer ) { 694 clearTimeout( touchmoveCountTimer ); 695 } 696 697 touchmoveCountTimer = setTimeout( function () { 698 touchmoveCount++; 699 }, 500 ); 700 }, supportsPassive ? { passive: true } : false ); 701 702 document.addEventListener( 'touchstart', function ( e ) { 703 lastTouchStart = ( new Date() ).getTime(); 704 }, supportsPassive ? { passive: true } : false ); 705 706 document.addEventListener( 'touchend', function ( e ) { 707 if ( ! lastTouchStart ) { 708 // If the touchstart happened before this script was loaded, but the touchend happened after... 709 return; 710 } 711 712 var now = ( new Date() ).getTime(); 713 714 var touchEvent = []; 715 touchEvent.push( now - lastTouchStart ); 716 717 if ( lastTouchEnd ) { 718 touchEvent.push( lastTouchStart - lastTouchEnd ); 719 } 720 721 touchEvents.push( touchEvent ); 722 723 lastTouchEnd = now; 724 725 // Don't record this time as an interval between keypresses. 726 lastKeydown = null; 727 lastKeyup = null; 728 keydowns = {}; 729 }, supportsPassive ? { passive: true } : false ); 730 731 document.addEventListener( 'scroll', function ( e ) {
732 if ( scrollCountTimer ) { 733 clearTimeout( scrollCountTimer ); 734 } 735 736 scrollCountTimer = setTimeout( function () { 737 scrollCount++; 738 }, 500 ); 739 }, supportsPassive ? { passive: true } : false ); 740 } 741 742 /** 743 * For the timing/coordinate data that is collected, don't send more than `limit` data points in the request. 744 * Choose a random slice and send those, with each batch separated by semicolons and the items in each batch 745 * separated by commas. 746 */ 747 function prepare_array_for_request( a, limit ) { 748 if ( ! limit ) { 749 limit = 100; 750 } 751 752 var rv = ''; 753 754 if ( a.length > 0 ) { 755 var random_starting_point = Math.max( 0, Math.floor( Math.random() * a.length - limit ) ); 756 757 for ( var i = 0; i < limit && i < a.length; i++ ) { 758 var entry = a[ random_starting_point + i ]; 759 rv += entry.join( ',' ) + ';'; 760 } 761 } 762 763 return rv; 764 } 765 766 if ( document.readyState !== 'loading' ) { 767 init(); 768 } else { 769 document.addEventListener( 'DOMContentLoaded', init ); 770 } 771})();; 772(()=>{var e={8885(e,t,a){(e=a.nmd(e))&&(e.exports=function(){var e,t="en",a=/[?&#]lang=([a-zA-Z\-_]+)/;"object"==typeof _wp_google_translate_widget&&"string"==typeof _wp_google_translate_widget.lang&&(t=_wp_google_translate_widget.lang),(e=window.location.href.match(a))&&(window.location.href=window.location.href.replace(a,"").replace(/#googtrans\([a-zA-Z\-_|]+\)/,"")+"#googtrans("+t+"|"+e[1]+")"),new google.translate.TranslateElement({pageLanguage:t,layout:_wp_google_translate_widget.layout,autoDisplay:!1},"google_translate_element")})}},t={};function a(o){var n=t[o];if(void 0!==n)return n.exports;var l=t[o]={id:o,loaded:!1,exports:{}};return e[o](l,l.exports,a),l.loaded=!0,l.exports}a.nmd=e=>(e.paths=[],e.children||(e.children=[]),e);var o=a(8885);googleTranslateElementInit=o})();;
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.