1!function(){"use strict";const e="nextbot_jwt_token",t="nextbot_jwt_expiry",o="nextbot_jwt_signature",r={init(){this.logDebug("NextbotJWTHandler inizializzato - token generati on-demand")},setupLogoutListener(){document.addEventListener("click",(e=>{const t=e.target,o=t.getAttribute("href")||(t.closest("a")?t.closest("a").getAttribute("href"):"")||"";o.includes("wp-login.php")&&o.includes("action=logout")&&(this.clearJWT(),this.dispatchEvent("nextbot:jwt:cleared-on-logout",{timestamp:(new Date).toISOString()}),this.logDebug("Token JWT rimosso al logout"))}),!0)},getJWT(){return new Promise((o=>{const r=localStorage.getItem(e),n=localStorage.getItem(t);if(!r)return this.logDebug("Nessun token presente, genero un nuovo token dal server"),void this.generateTokenFromServer(o);const a=this.parseJWTPayload(r);if(a){const e=parseInt(nextbotJWT.user_id,10);if(e>0&&a.user_id!==e)return this.clearJWT(),void this.generateTokenFromServer(o);if(0===e&&!a.anonymous&&a.user_id)return this.clearJWT(),void o(null)}if(!n)return this.logDebug("Token presente ma senza scadenza - rigenero per sicurezza"),void this.generateTokenFromServer(o);const s=parseInt(n,10)-Math.floor(Date.now()/1e3);s<=300?(this.logDebug("Token scaduto o in scadenza, genero nuovo token",{timeToExpiry:s,renewalThreshold:300}),this.generateTokenFromServer(o)):(this.logDebug("Token valido",{timeToExpiry:s}),o(r))}))},getHubSpotCookie(){const e=document.cookie.split(";");for(let t=0;t<e.length;t++){const o=e[t].trim();if(o.startsWith("hubspotutk="))return o.substring(11)}return null},generateTokenFromServer(e){const t=new FormData;if(t.append("action","get_jwt_token"),nextbotJWT.is_anonymous_enabled){const o=this.getHubSpotCookie();if(!o)return this.logDebug("Modalità anonima: cookie hubspotutk non trovato"),void e(null);t.append("hubspotutk",o),this.logDebug("Modalità anonima: aggiunto hubspotutk alla richiesta",{utkPrefix:o.substring(0,10)+"..."})}else if(0===nextbotJWT.user_id)return this.logDebug("Modalità WordPress: utente non loggato, impossibile generare token"),void e(null);fetch(nextbotJWT.ajax_url,{method:"POST",credentials:"same-origin",body:t}).then((e=>{if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);return e.json()})).then((t=>{t.success&&t.data&&t.data.token?(this.storeJWT(t.data.token),this.logDebug("Token generato con successo dal server"),this.dispatchEvent("nextbot:jwt:generated",{token:t.data.token}),e(t.data.token)):(this.logError("Errore nella generazione del token:",t),e(null))})).catch((t=>{this.logError("Errore AJAX nella generazione del token:",{error:t.message,stack:t.stack}),e(null)}))},storeJWT(r){try{const n=this.parseJWTPayload(r);localStorage.setItem(e,r),n&&n.exp&&localStorage.setItem(t,n.exp.toString()),n&&n.membershipSignature&&localStorage.setItem(o,n.membershipSignature),this.dispatchEvent("nextbot:jwt:stored",{token:r,payload:n}),this.logDebug("Token JWT salvato con successo",{expires:n?new Date(1e3*n.exp):"unknown"})}catch(e){this.logError("Errore nel salvataggio del JWT:",e)}},parseJWTPayload(e){try{const t=e.split(".");if(3!==t.length)throw new Error("Token JWT malformato");const o=t[1],r=atob(o.replace(/-/g,"+").replace(/_/g,"/"));return JSON.parse(r)}catch(e){return this.logError("Errore nella decodifica del payload JWT:",e),null}},getJWTSync(){const o=localStorage.getItem(e),r=localStorage.getItem(t);if(!o)return null;const n=this.parseJWTPayload(o);if(n){const e=parseInt(nextbotJWT.user_id,10);if(e>0&&n.user_id!==e)return this.clearJWT(),null;if(0===e&&!n.anonymous&&n.user_id)return this.clearJWT(),null}if(r){const e=parseInt(r,10);if(Math.floor(Date.now()/1e3)>=e-300)return this.clearJWT(),null}return o},clearJWT(){localStorage.removeItem(e),localStorage.removeItem(t),localStorage.removeItem(o),this.logDebug("Token JWT rimosso dal localStorage")},async validateSignature(t){const r=localStorage.getItem(e),n=!!r&&this.parseJWTPayload(r),a=!(!n||!n.membershipSignature)&&n.membershipSignature,s=t&&t.signature?t.signature:"";if(!n||!1===a){this.clearJWT(),localStorage.setItem(o,s);try{await this.getJWT()}catch(e){this.logError("Errore nella rigenerazione del token obsoleto:",e)}return}const i=localStorage.getItem(o);if(null!==i){if(a!==s||a!==i){this.clearJWT(),localStorage.setItem(o,s);try{await this.getJWT()}catch(e){this.logError("Errore nella rigenerazione del token dopo cambio signature:",e)}}}else localStorage.setItem(o,a)},logDebug(e,t){window.nextbotJWT?.debug_mode&&"undefined"!=typeof console&&console.log&&console.log("[Nextbot JWT]",e,t||"")},logError(e,t){"undefined"!=typeof console&&console.error&&console.error("[Nextbot JWT Error]",e,t||"")},dispatchEvent(e,t){const o=new CustomEvent(e,{detail:t||{},bubbles:!0,cancelable:!0});document.dispatchEvent(o)}};window.NextbotJWTHandler=r,"loading"===document.readyState?document.addEventListener("DOMContentLoaded",(function(){r.init(),r.setupLogoutListener()})):(r.init(),r.setupLogoutListener())}();
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.