@thg-agentic/hyper-personalisation-web 3.22.0 → 3.22.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # @thg-agentic/hyper-personalisation-web
2
2
 
3
3
  The browser SDK for THG Hyper-Personalisation, a customer data platform. It implements the event
4
- specification (spec 1.15, stamped on every event as `context.spec.version`) for any storefront: it
4
+ specification (spec 1.16, stamped on every event as `context.spec.version`) for any storefront: it
5
5
  sends events in the Segment wire format, applies consent strictly whichever CMP the site uses, reads
6
6
  the GA4 `dataLayer` the site already pushes to, and has no runtime dependencies.
7
7
 
@@ -85,7 +85,10 @@ What `bootstrap` does:
85
85
  and an `ETag`, so the browser revalidates for a `304`). A key the API switches off clears the cache, so the next page is
86
86
  off too.
87
87
  - **Consent**, identity, one page view, the dataLayer bridge and a once-per-session `identify`, as
88
- configured.
88
+ configured. A page restored from the back/forward cache runs no script again, so `bootstrap`
89
+ reads consent again, then sends its `back_forward` page view on `pageshow` and reports its lists
90
+ afresh (3.22.2). A host on `createAnalytics` sends that view itself: `page({ navigation_trigger:
91
+ 'back_forward' })` on a `pageshow` whose `persisted` is true.
89
92
  - **Never waited for.** Call `hp` (`@thg-agentic/hyper-personalisation-web/hp`) from anywhere, at
90
93
  any time, and never await or flush it: calls made before the client starts wait, each with the
91
94
  messageId and time it was made at, and are sent in order once it has. The page view is stamped
@@ -204,7 +207,7 @@ Since 3.19 (spec 1.12), a search box's suggestions are their own event:
204
207
  | `storageNames` | `thg_hp_*` | Rename what the SDK stores; see [Storage](#storage). |
205
208
  | `plan` | none | A Segment tracking plan, `{ track: { [event]: { enabled } } }`; `__default` covers unlisted events. |
206
209
  | `sampleRate` | `1` | The share of visitors to send for, by a hash of the anonymous id salted `hp_sample`; a visitor with no anonymous id is sent for. A consent withdrawal is always sent. Since 3.18. |
207
- | `queryParamAllowlist` | none | Keep only these query params (plus campaign params) in `context.page`. Patterns are anchored and case-insensitive. |
210
+ | `queryParamAllowlist` | none | Keep only these query params (plus campaign params) in `context.page`, and in a clicked link's `href`, which leaves another site's link as origin and path only (3.22.2). Patterns are anchored and case-insensitive. |
208
211
  | `queryParamBlocklist` | `[]` | Strip these params. Ignored when an allowlist is given. |
209
212
  | `sensitiveParamAllowlist` | `[]` | Whatever else is configured, a param is always dropped from every reported URL when its name contains `email`, `token`, `password`, `secret`, `auth`, `session`, `phone`, `address`, `card`, `customerid` and the like (see `SENSITIVE_PARAM_FRAGMENTS` in `src/context.js`), or when its value is an email address or a card-length number — campaign params and the referrer included. This exempts names from the first rule, for a false positive such as an `author` filter; nothing exempts a value. |
210
213
  | `getAnonymousId`, `getUserId`, `getSessionId` | none | Identity accessors. Without `getSessionId` the SDK keeps its own session (see [Session ids](#session-ids)); a missing or empty device id gives way to the SDK's own (see [Device ids](#device-ids)). |
@@ -329,6 +332,11 @@ render(body);
329
332
  hp.recordExposure(body);
330
333
  ```
331
334
 
335
+ For a decisions response the exposure lists each slot's `decision_id`, which is what marks that
336
+ decision shown (a click is a `Slot Engaged` with `engagement: 'click'` and the same `decision_id`).
337
+ It is one event per response, so record it once the slots are rendered: a slot rendered below the
338
+ fold counts as shown.
339
+
332
340
  Since 3.7, recording a decisions response also puts its decisions in force. Every later event in
333
341
  the browser session carries them as `context.decisions`, latest per slot, so a basket is credited
334
342
  to the slot shown before it. Send the session id your events carry as `session_id` on
@@ -338,13 +346,7 @@ to the slot shown before it. Send the session id your events carry as `session_i
338
346
  ### Server-side assignments
339
347
 
340
348
  A page your server rendered from `POST /v1/assignments` and cached per arm has no `decision_id` in
341
- it. Since 3.10, `hp.assignmentDecisionId({ slot, arm })` derives the one HP logged, synchronously,
342
- for that page's `Slot Engaged`:
343
-
344
- ```js
345
- const decisionId = hp.assignmentDecisionId({ slot, arm });
346
- if (decisionId) hp.slotEngaged({ slot, arm, engagement: 'view', decision_id: decisionId });
347
- ```
349
+ it. Since 3.10, `hp.assignmentDecisionId({ slot, arm })` derives the one HP logged, synchronously.
348
350
 
349
351
  It reads the session cookie named in `identityCookies.sessionId`, else the visitor cookie
350
352
  (`identityCookies.anonymousId`), as your renderer forwards them to HP, so it answers once
@@ -353,20 +355,28 @@ with neither cookie. The id is `UUIDv5(ASSIGNMENT_DECISION_NAMESPACE, "<session>
353
355
  `assignmentDecisionId({ sessionId, slot, arm })` from the main entry computes it from values you
354
356
  pass, and the spec's `assignment/decision-id.json` has the vectors.
355
357
 
356
- Such a page also reports the property holdout's exposure itself, when the slot is on screen, for
357
- both groups. The answer's `hash` is `holdout` for a held-out visitor (cache that page apart from
358
- the `""` one); on any other page with a hash the visitor was treated. The exposure token is the
359
- assignment's derived id for the arm shown, control included. Since 3.13 the shares come from the
360
- property's settings when the exposure has none:
358
+ Such a page reports the property holdout's exposure itself, when the slot is on screen, for both
359
+ groups, and a `Slot Engaged` click when a link in the slot is clicked. The answer's `hash` is
360
+ `holdout` for a held-out visitor (cache that page apart from the `""` one); on any other page with
361
+ a hash the visitor was treated. The exposure token is the assignment's derived id for the arm
362
+ shown, control included, and a held-out visitor's exposure names no decision. Since 3.13 the shares
363
+ come from the property's settings when the exposure has none:
361
364
 
362
365
  ```js
363
366
  const token = hp.assignmentDecisionId({ slot, arm });
367
+ const holdout = hash === 'holdout';
368
+ // When the slot is on screen:
364
369
  hp.recordExposure({
365
370
  exposure: { token, surface: 'decisions', holdout },
366
371
  decisions: [holdout ? { slot, holdout: true } : { slot, arm, decision_id: token }],
367
372
  });
373
+ // When a link in the slot is clicked:
374
+ if (token && !holdout) hp.slotEngaged({ slot, arm, engagement: 'click', decision_id: token });
368
375
  ```
369
376
 
377
+ The exposure is what marks the decision shown; the click is its reward. Slot Engaged's `view` is
378
+ deprecated since spec 1.16: it repeated the exposure.
379
+
370
380
  A surface your server fetched from HP for the page, so the page never sees HP's answer, reports
371
381
  its exposure with `surfaceViewed` when it comes into view: a product rail your server asked HP for,
372
382
  which HP answers with its rail for a treated visitor and the site's own rail for a held-out one.
@@ -503,6 +513,10 @@ With a `consent` adapter the SDK is strict:
503
513
  - **Changes nothing announces:** after the first answer, an adapter whose `subscribe` cannot see
504
514
  every change (a cookie adapter on a browser without the Cookie Store API, or your own adapter
505
515
  without `observesChanges: true`) is re-read every 2 seconds while the page is visible.
516
+ - **Decisions made in another tab:** a CMP reports a change only in the tab where it was made
517
+ (OneTrust's `OnConsentChanged`, Didomi's `consent.changed`). Another tab already open applies
518
+ it at its next page load, as Segment's, RudderStack's and mParticle's OneTrust integrations and
519
+ Google Consent Mode do.
506
520
 
507
521
  - **Purposes the property does not ask for:** with the settings' `consent.purposes`, only the
508
522
  purposes listed as `true` are reported (analytics always is). The others read as unanswered in
@@ -527,7 +541,7 @@ All adapters are imported from `@thg-agentic/hyper-personalisation-web/consent`.
527
541
  | Adapter | Reads | Not answered while |
528
542
  |---|---|---|
529
543
  | `didomiConsent({ purposes })` | `Didomi.getCurrentUserStatus().purposes`, subscribed via `didomiEventListeners` / `consent.changed` | Didomi is not loaded, `shouldUserStatusBeCollected()` is true, or `isUserStatusPartial()` is true |
530
- | `oneTrustConsent({ groups, impliedConsent })` | `OnetrustActiveGroups`, else the `OptanonConsent` cookie's `groups=`; subscribed via `OneTrustGroupsUpdated`, `OptanonWrapper` and `OneTrust.OnConsentChanged` | The banner was never closed (`OptanonAlertBoxClosed`) and never interacted with (`interactionCount`) |
544
+ | `oneTrustConsent({ groups, impliedConsent })` | The `OptanonConsent` cookie's `groups=`, else `OnetrustActiveGroups` before OneTrust has written it; subscribed via `OneTrustGroupsUpdated`, `OptanonWrapper` and `OneTrust.OnConsentChanged` | The banner was never closed (`OptanonAlertBoxClosed`) and never interacted with (`interactionCount`) |
531
545
  | `cookieConsent({ name, categories, parse, refusedValue, source, changeEvent })` | A first-party cookie your banner writes; subscribed via a `thg_hp_consent_change` window event (`changeEvent`) and Cookie Store `change` | The cookie is absent, or its value cannot be parsed |
532
546
  | `staticConsent(state)` | The state you pass, for sites with no CMP | Never |
533
547
 
package/dist/hp.min.js CHANGED
@@ -1,3 +1,3 @@
1
- (()=>{var qt=e=>{throw TypeError(e)};var Ar=(e,t,n)=>t.has(e)||qt("Cannot "+n);var Ft=(e,t,n)=>t.has(e)?qt("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n);var O=(e,t,n)=>(Ar(e,t,"access private method"),n);var Se=[];for(let e=2;Se.length<64;e++)Se.every(t=>e%t!==0)&&Se.push(e);var Ht=e=>(e-Math.floor(e))*2**32>>>0,Er=Se.slice(0,8).map(e=>Ht(Math.sqrt(e))),vr=Se.map(e=>Ht(Math.cbrt(e))),W=(e,t)=>e>>>t|e<<32-t;function Kt(e){let t=new TextEncoder().encode(String(e)),n=new Uint32Array((t.length+8>>6)*16+16);t.forEach((s,i)=>{n[i>>2]|=s<<24-i%4*8}),n[t.length>>2]|=128<<24-t.length%4*8,n[n.length-2]=Math.floor(t.length/2**29),n[n.length-1]=t.length*8;let r=Uint32Array.from(Er),o=new Uint32Array(64);for(let s=0;s<n.length;s+=16){for(let w=0;w<64;w++){if(w<16){o[w]=n[s+w];continue}let x=o[w-15],k=o[w-2],v=W(x,7)^W(x,18)^x>>>3,h=W(k,17)^W(k,19)^k>>>10;o[w]=o[w-16]+v+o[w-7]+h}let[i,a,u,d,f,p,y,b]=r;for(let w=0;w<64;w++){let x=W(f,6)^W(f,11)^W(f,25),k=b+x+(f&p^~f&y)+vr[w]+o[w]|0,h=(W(i,2)^W(i,13)^W(i,22))+(i&a^i&u^a&u)|0;[b,y,p,f,d,u,a,i]=[y,p,f,d+k|0,u,a,i,k+h|0]}[i,a,u,d,f,p,y,b].forEach((w,x)=>{r[x]+=w})}return Array.from(r,s=>s.toString(16).padStart(8,"0")).join("")}var Qe=(e,t)=>e<<t|e>>>32-t;function Gt(e){let t=new Uint32Array((e.length+8>>6)*16+16);e.forEach((s,i)=>{t[i>>2]|=s<<24-i%4*8}),t[e.length>>2]|=128<<24-e.length%4*8,t[t.length-2]=Math.floor(e.length/2**29),t[t.length-1]=e.length*8;let n=Uint32Array.of(1732584193,4023233417,2562383102,271733878,3285377520),r=new Uint32Array(80);for(let s=0;s<t.length;s+=16){for(let p=0;p<80;p++)r[p]=p<16?t[s+p]:Qe(r[p-3]^r[p-8]^r[p-14]^r[p-16],1);let[i,a,u,d,f]=n;for(let p=0;p<80;p++){let y,b;p<20?(y=a&u|~a&d,b=1518500249):p<40?(y=a^u^d,b=1859775393):p<60?(y=a&u|a&d|u&d,b=2400959708):(y=a^u^d,b=3395469782);let w=Qe(i,5)+y+f+b+r[p]|0;[f,d,u,a,i]=[d,u,Qe(a,30),i,w]}[i,a,u,d,f].forEach((p,y)=>{n[y]+=p})}let o=new Uint8Array(20);return n.forEach((s,i)=>{o[i*4]=s>>>24,o[i*4+1]=s>>>16,o[i*4+2]=s>>>8,o[i*4+3]=s}),o}var Cr="e28e8ada-5b76-4209-bba9-79b823a0af75",Pr=e=>Array.from(e,t=>t.toString(16).padStart(2,"0")).join("");function zt(e,t){let n=Uint8Array.from(e.replace(/-/g,"").match(/../g),a=>Number.parseInt(a,16)),r=new TextEncoder().encode(t),o=new Uint8Array(16+r.length);o.set(n),o.set(r,16);let s=Gt(o).slice(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let i=Pr(s);return`${i.slice(0,8)}-${i.slice(8,12)}-${i.slice(12,16)}-${i.slice(16,20)}-${i.slice(20)}`}var re=(e,t)=>typeof e=="string"&&e!==""&&e.length<=t?e:null;function Oe(e,t){return re(e,64)??re(t,256)}function Wt({sessionId:e,slot:t,arm:n}={}){let r=re(e,256);return!r||!re(t,256)||!re(n,256)?null:zt(Cr,`${r}:${t}:${n}`)}var Or="4b1f2c7e-9a3d-4e58-b6c1-2d7f0a9e8c53";function Jt({sessionId:e,surface:t}={}){let n=re(e,256);return!n||!re(t,64)?null:zt(Or,`${n}:${t}`)}var Lr=Array.from({length:11},(e,t)=>t/10);function Tr(e,t){if(!e.isIntersecting)return!1;let{intersectionRect:n,boundingClientRect:r,rootBounds:o}=e;if(!n||!r)return!0;let s=n.width*n.height,i=r.width*r.height,a=o?Math.min(i,o.width*o.height):i;return a>0&&s/a>=t}function X(e){let{selector:t,onViewable:n,visibleRatio:r=.5,dwellMs:o=1e3,root:s=document}=e,i=new Map,a=new WeakSet,u=new Set,d=h=>{i.has(h)||i.set(h,setTimeout(()=>{i.delete(h),n(h)&&(p?.unobserve(h),u.delete(h))},o))},f=h=>{clearTimeout(i.get(h)),i.delete(h)},p=typeof IntersectionObserver>"u"?null:new IntersectionObserver(h=>{for(let E of h){let S=E.target;if(!Tr(E,r)){u.delete(S),f(S);continue}u.add(S),y()&&d(S)}},{threshold:Lr}),y=()=>typeof document>"u"||document.visibilityState!=="hidden",b=()=>{if(y())for(let h of u)d(h);else for(let h of u)f(h)};document.addEventListener("visibilitychange",b);let w=()=>{for(let h of s.querySelectorAll(t))a.has(h)||(a.add(h),p?.observe(h))},x=typeof MutationObserver>"u"?null:new MutationObserver(()=>w()),k=()=>{w(),x?.observe(s===document?document.body:s,{childList:!0,subtree:!0})},v=s===document&&!document.body;return v?document.addEventListener("DOMContentLoaded",k,{once:!0}):k(),()=>{v&&document.removeEventListener("DOMContentLoaded",k),document.removeEventListener("visibilitychange",b),p?.disconnect(),x?.disconnect();for(let h of i.values())clearTimeout(h);i.clear(),u.clear()}}function et(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-exposure]",visibleRatio:r=.5,dwellMs:o=1e3,root:s=document}=t;return X({selector:n,root:s,visibleRatio:r,dwellMs:o,onViewable(i){let a=i.dataset?.hpExposure?.trim();return a&&e.surfaceViewed({surface:a}),!0}})}var Yt=e=>{try{return new URL(e,document.baseURI).toString()}catch{return e}};function tt(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-list]",tileSelector:r="[data-hp-product]",visibleRatio:o=.5,dwellMs:s=1e3,root:i=document}=t,a=new Set,u=w=>w.closest?.(n)??null,d=w=>{let x=w.dataset.hpList?.trim();return x?{list_id:x,category:w.dataset.hpListCategory?.trim()||null}:null},f=w=>Array.from(w.querySelectorAll(r)).filter(x=>u(x)===w),p=(w,x)=>{try{let k=JSON.parse(w.dataset.hpProduct??"");return!k||typeof k!="object"||!k.product_id?null:{...k,position:k.position??x+1,...k.url?{url:Yt(k.url)}:{},...k.image_url?{image_url:Yt(k.image_url)}:{}}}catch{return null}},y=X({selector:`${n} ${r}`,root:i,visibleRatio:o,dwellMs:s,onViewable(w){let x=u(w);if(!x||x.dataset.hpListView==="manual")return!0;let k=d(x);if(!k||a.has(k.list_id))return!0;let v=new Set,h=f(x).map(p).filter(E=>!E||v.has(E.product_id)?!1:(v.add(E.product_id),!0));return h.length===0||(a.add(k.list_id),e.productListViewed({...k,products:h})),!0}}),b=w=>{let k=w.target?.closest?.("a[href]")?.closest(r);if(!k)return;let v=u(k),h=p(k,v?f(v).indexOf(k):0);h&&e.productClicked({list_id:v?d(v)?.list_id??null:null,products:[h]})};return document.addEventListener("click",b,!0),()=>{document.removeEventListener("click",b,!0),y()}}function N(e,...t){let n=e.dataset??{};for(let r of t){let o=n[r];if(typeof o=="string"&&o.trim()!=="")return o.trim()}return null}function Le(e,...t){let n=N(e,...t);if(n===null)return null;let r=Number(n);return Number.isFinite(r)?Math.trunc(r):null}function Nr(e,t){let n=N(e,"hpPromotion");return n?{promotion_id:n,name:N(e,"hpPromotionName"),creative:N(e,"hpPromotionCreative"),position:N(e,"hpPromotionSlot")??String(t+1)}:null}function nt(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-promotion]",resolve:r=Nr,visibleRatio:o=.5,dwellMs:s=1e3,root:i=document}=t,a=new Set,u=p=>{let y=Array.from(i.querySelectorAll(n)),b=y.indexOf(p);try{return r(p,b<0?y.length:b)}catch{return null}},d=X({selector:n,root:i,visibleRatio:o,dwellMs:s,onViewable(p){let y=u(p);return!y||a.has(y.promotion_id)?!1:(a.add(y.promotion_id),e.promotionViewed(y),!0)}}),f=p=>{let y=p.target;if(!y||typeof y.closest!="function")return;let b=y.closest(n),w=y.closest("a[href]");if(!b||!w||!b.contains(w)&&!w.contains(b))return;let x=u(b);x&&e.promotionClicked({...x,href:w.getAttribute("href")})};return document.addEventListener("click",f,!0),()=>{document.removeEventListener("click",f,!0),d()}}function Rr(e){let t=N(e,"hpRecoRequest"),n=N(e,"hpRecoPlacement"),r=N(e,"hpRecoStrategy");if(!t||!n||!r)return null;let o=N(e,"hpRecoHoldout");return{recommendation_request_id:t,placement:n,strategy:r,recipe:N(e,"hpRecoRecipe"),algorithm_version:N(e,"hpRecoAlgorithmVersion"),experiment:N(e,"hpRecoExperiment"),variant:N(e,"hpRecoVariant"),holdout:o===null?null:o==="true",assignment_bucket:Le(e,"hpRecoBucket"),assignment_unit_kind:N(e,"hpRecoUnitKind"),candidate_set_fingerprint:N(e,"hpRecoFingerprint"),candidate_set_size:Le(e,"hpRecoCandidates"),ranked_by:N(e,"hpRecoRankedBy"),served_at:N(e,"hpRecoServedAt")}}function Dr(e,t){let n=N(e,"hpRecoProduct");if(!n)return null;let r=N(e,"hpRecoPrice");return{product_id:n,sku:N(e,"hpRecoSku"),name:N(e,"hpRecoName"),brand:N(e,"hpRecoBrand"),price:r===null||Number.isNaN(Number(r))?null:Number(r),position:Le(e,"hpRecoPosition")??t+1}}function rt(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-reco-request]",tileSelector:r="[data-hp-reco-product]",resolveRail:o=Rr,resolveTile:s=Dr,visibleRatio:i=.5,dwellMs:a=1e3,root:u=document}=t,d=new Set,f=new Map,p=new Map,y=(h,...E)=>{try{return h(...E)}catch{return null}},b=h=>typeof h.closest=="function"?h.closest(n):null,w=h=>Array.from(h.querySelectorAll(r)),x=(h,E)=>{if(p.delete(E.recommendation_request_id),d.has(E.recommendation_request_id))return;let S=w(h).map((_,L)=>y(s,_,L)).filter(_=>_?.product_id);if(S.length===0)return;d.add(E.recommendation_request_id);let g=[...f.get(E.recommendation_request_id)?.values()??[]].sort((_,L)=>_.position-L.position);e.recommendationsViewed({...E,products:S,viewable:g})},k=X({selector:`${n} ${r}`,root:u,visibleRatio:i,dwellMs:a,onViewable(h){let E=b(h);if(!E)return!0;let S=y(o,E);if(!S)return!0;let g=S.recommendation_request_id,_=y(s,h,w(E).indexOf(h));if(_?.product_id){f.has(g)||f.set(g,new Map);let L=f.get(g);L.has(_.position)||L.set(_.position,{position:_.position,product_id:_.product_id,viewable_at:new Date().toISOString()})}return!d.has(g)&&!p.has(g)&&p.set(g,setTimeout(()=>x(E,S),0)),!0}}),v=h=>{let E=h.target;if(!E||typeof E.closest!="function")return;let S=E.closest(r);if(!S)return;let g=E.closest("[data-hp-reco-interaction]"),_=E.closest("a[href]"),L=_&&(S.contains(_)||_.contains(S));if(!(g&&S.contains(g))&&!L)return;let R=b(S);if(!R)return;let H=y(o,R);if(!H)return;let K=y(s,S,w(R).indexOf(S));if(!K?.product_id)return;let j=H.recommendation_request_id;d.has(j)||(clearTimeout(p.get(j)),x(R,H)),e.productClicked({recommendation_request_id:H.recommendation_request_id,interaction:N(g??S,"hpRecoInteraction")??"navigate",products:[K]})};return document.addEventListener("click",v,!0),()=>{document.removeEventListener("click",v,!0);for(let h of p.values())clearTimeout(h);p.clear(),k()}}var pe=new Set(["home","list","product","search","basket","checkout","order_confirmation","login","register","account","info","blog","other"]),Mr=new Set(["products"]),Xt=e=>e==null;function ot(e,t=new WeakSet){if(e instanceof Date)return e.toJSON();if(e===null||typeof e!="object"||t.has(e))return e;t.add(e);let n=Array.isArray(e)?e.map(r=>ot(r,t)):Object.fromEntries(Object.entries(e).filter(([,r])=>!Xt(r)).map(([r,o])=>[r,ot(o,t)]));return t.delete(e),n}function st(e){if(!e)return e;let t=ot(e);for(let n of Mr)n in e&&Xt(e[n])&&(t[n]=e[n]);return t}function Zt(){try{let e=performance.getEntriesByType("navigation")[0];return e?["navigate","reload","back_forward","prerender"].includes(e.type)?e.type:"navigate":null}catch{return null}}var $r=new Set(["","unknown","undefined","null","none","nil","nan","anonymous","guest","0","-1"]);function q(e){if(e==null)return null;let t=String(e).trim();return $r.has(t.toLowerCase())?null:t}function Z(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}var Qt="1.15";function M(e){if(typeof document>"u")return null;try{let t=document.cookie.split(";").map(n=>n.trim()).find(n=>n.startsWith(`${e}=`));return t&&decodeURIComponent(t.slice(e.length+1))||null}catch{return null}}var Ur={gclid:"gclid",fbclid:"fbclid",ttclid:"ttclid"},Vr=/[a-z0-9._%+-]+@[a-z0-9-]+(\.[a-z0-9-]+)*\.[a-z]{2,}/i,Br=/\d(?:[ -]?\d){12,}/,jr=new Set(["gclid","fbclid","ttclid","msclkid"]);function tn(e,t=""){if(typeof e!="string"||e==="")return!1;let n=[e];try{let o=decodeURIComponent(e.replace(/\+/g," "));o!==e&&n.push(o)}catch{}let r=!jr.has(String(t).toLowerCase());return n.some(o=>Vr.test(o)||r&&Br.test(o))}function qr(e){if(!e)return null;let t=new URLSearchParams(e),n={},r={utm_source:"source",utm_medium:"medium",utm_campaign:"name",utm_term:"term",utm_content:"content"};for(let[o,s]of[...Object.entries(r),...Object.entries(Ur)]){let i=t.get(o);i&&!tn(i,o)&&(n[s]=i)}return Object.keys(n).length?n:null}var Fr=["email","e-mail","password","pass","pwd","token","auth","code","uid","customer_id","postcode","zip","phone","applyCode"],Hr=["email","password","passwd","pwd","token","secret","auth","session","phone","postcode","zip","address","birth","card","cvv","iban","ssn","customerid","userid"],Kr=["tel","uid","dob"],Gr=["utm_source","utm_medium","utm_campaign","utm_term","utm_content","gclid","fbclid","ttclid","msclkid"],zr=new Set(Fr.map(e=>e.toLowerCase()));function Wr(e){let t=String(e).toLowerCase();if(zr.has(t))return!0;let n=t.replace(/[-_.]/g,"");return Hr.some(o=>n.includes(o))?!0:String(e).replace(/([a-z0-9])([A-Z])/g,"$1 $2").toLowerCase().split(/[^a-z0-9]+/).some(o=>Kr.includes(o))}function it(e){return(e??[]).map(t=>{try{return new RegExp(`^${t}$`,"i")}catch{return{test:n=>n.toLowerCase()===String(t).toLowerCase()}}})}function nn(e,t={}){if(!e)return null;try{let n=new URLSearchParams(e),r=t.queryParamAllowlist?it([...t.queryParamAllowlist,...Gr]):null,o=it(t.queryParamBlocklist),s=it(t.sensitiveParamAllowlist);for(let a of new Set(n.keys()))(Wr(a)&&!s.some(d=>d.test(a))||n.getAll(a).some(d=>tn(d,a))||(r?!r.some(d=>d.test(a)):o.some(d=>d.test(a))))&&n.delete(a);let i=n.toString();return i?`?${i}`:""}catch{return""}}function Jr(e,t,n={}){if(!e)return null;try{let r=new URL(e);return t&&r.origin===t?r.origin+r.pathname+(nn(r.search,n)??""):r.origin+r.pathname}catch{return null}}function at(e){if(typeof e!="string")return null;let t=e.trim().toUpperCase();return/^[A-Z]{3}$/.test(t)?t:null}function en(e){if(typeof e!="string")return null;let t=e.trim().toUpperCase();return/^[A-Z]{2}$/.test(t)?t:null}function Yr(e){if(typeof e!="string")return null;let t=e.trim().replace(/_/g,"-");if(!/^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$/.test(t))return null;try{return Intl.getCanonicalLocales(t)[0]}catch{return null}}function D(e,t){if(typeof e=="function")try{let n=e();if(n!=null)return n}catch{}return t}function Xr(e){return{property_id:String(e.propertyId),channel:e.channel??null,market:e.market??null,environment:e.environment??null}}function Zr(e){let t=typeof window<"u"?window.location:null,n=t?nn(t.search,e):null;return{url:t?t.origin+t.pathname+(n??""):e.pageUrl??null,path:t?t.pathname:e.pagePath??null,search:n??null,referrer:typeof document<"u"?Jr(document.referrer,t?.origin,e):null,title:typeof document<"u"&&document.title||null,type:e.pageType??null}}function rn(e,t={}){let n=typeof window<"u"?window.location:null,r={library:{name:e.libraryName,version:e.libraryVersion},spec:{version:Qt},source:Xr(e),session_id:D(e.getSessionId,null),identity_trust:q(D(e.getAnonymousId,null))?"device":"none",page:Zr(e),campaign:n?qr(n.search):null,device:{user_agent:typeof navigator<"u"?navigator.userAgent:null,type:null,viewport_width:typeof window<"u"?window.innerWidth:null,viewport_height:typeof window<"u"?window.innerHeight:null},currency:at(D(e.getCurrency,e.currency)),locale:Yr(D(e.getLocale,e.locale)),timezone:(()=>{try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return null}})(),country:en(e.country),ship_to_country:en(D(e.getShipToCountry,e.shipToCountry)),ip:null,bot:null,consent:e.getConsent?.()??null,experiments:D(e.getExperiments,null),audiences:D(e.getAudiences,null),decisions:D(e.getDecisions,null),recommendations:D(e.getRecommendations,null),extensions:D(e.getExtensions,null)};return on(r,t)}function on(e,t){if(!t)return e;let n={...e};for(let[r,o]of Object.entries(t))o&&typeof o=="object"&&!Array.isArray(o)&&e[r]&&typeof e[r]=="object"&&!Array.isArray(e[r])?n[r]=on(e[r],o):o!==void 0&&(n[r]=o);return n}var ie=Object.freeze({consent:"thg_hp_consent",retry:"thg_hp_retry",sessionSignals:"thg_hp_session_signals",identified:"thg_hp_identified",previousPage:"thg_hp_prev_page",decisions:"thg_hp_decisions",settings:"thg_hp_settings",held:"thg_hp_held",carried:"thg_hp_carried",recommendationContext:"thg_hp_recommendation_context",anonymousId:"thg_hp_anonymous_id",session:"thg_hp_session",preview:"thg_hp_preview",debug:"thg_hp_debug"}),Qr={retry:"cdp.retry",sessionSignals:"cdp_session_signals",identified:"cdp_identified",previousPage:"cdp_prev_page_message_id"},ct={...ie},sn=!1;function Te(e){let t={...ie};for(let[n,r]of Object.entries(e??{})){if(!(n in ie))throw new Error(`storageNames: unknown kind "${n}"`);if(typeof r!="string"||!/^[\w.-]+$/.test(r))throw new Error(`storageNames.${n} must be a non-empty cookie-safe name`);t[n]=r}ct=t}function T(e){return ct[e]}var eo="_",an=e=>e==null||e===""?eo:String(e);function F(e,t,n){let r=`${e}:${an(t)}`;return n==null||n===""?r:`${r}:${n}`}function cn(e,t){return`${e}:${an(t)}:`}function Ne(){if(!sn){sn=!0;for(let e of[()=>localStorage,()=>sessionStorage]){let t;try{if(t=e(),!t)continue;for(let n of Object.keys(t))for(let[r,o]of Object.entries(Qr)){if(n!==o&&!n.startsWith(`${o}:`))continue;let s=ct[r]+n.slice(o.length);t.getItem(s)===null&&t.setItem(s,t.getItem(n)),t.removeItem(n)}}catch{}}}}var lt=1800*1e3,Re=()=>{try{return typeof sessionStorage>"u"?null:sessionStorage}catch{return null}},ut=()=>{try{return typeof localStorage>"u"?null:localStorage}catch{return null}};function un(e,t=()=>Date.now()){return{read(){try{let n=Re()?.getItem(e),r=n?JSON.parse(n):null;return!r||t()-r.savedAt>lt?(r&&Re()?.removeItem(e),{items:[],anonymousId:null}):{items:Array.isArray(r.items)?r.items:[],anonymousId:typeof r.anonymousId=="string"?r.anonymousId:null}}catch{return{items:[],anonymousId:null}}},write(n,r=null){try{n.length===0?Re()?.removeItem(e):Re()?.setItem(e,JSON.stringify({savedAt:t(),items:n,anonymousId:r}))}catch{}}}}var to=400*24*60*60;function Q(e,t,n,r){if(typeof document>"u")return!1;try{let o=typeof location<"u"&&location.protocol==="https:"?"; Secure":"",s=r?`; Domain=${r}`:"",i=n===null?"":`; Max-Age=${n}`;return document.cookie=`${e}=${encodeURIComponent(t)}; Path=/${i}; SameSite=Lax`+s+o,!0}catch{return!1}}function no({name:e,domain:t=null,legacyKey:n,read:r,mint:o,mayStore:s,carried:i=null}){let a=null;try{a=ut()?.getItem(n)||null}catch{a=null}let u=r(e)??a??i,d=!1,f=()=>{if(!(d||u===null||!s())&&(d=Q(e,u,to,t),!(!d||a===null)))try{ut()?.removeItem(n),a=null}catch{}};return{get(){return u??(u=o()),f(),u},peek:()=>u,persist:f,forget(){Q(e,"",0,t),u=null,d=!1;try{ut()?.removeItem(n)}catch{}a=null}}}function ln(e,{carried:t=null,mayStore:n,orOwn:r=!1}){let o=e.anonymousIdSource,s=()=>no({name:T("anonymousId"),domain:e.consentCookieDomain??null,legacyKey:F(T("anonymousId"),e.propertyId),read:M,mint:Z,mayStore:n,carried:t});if(o?.source==="hp_cookie"){let u=s();return e.getAnonymousId=()=>u.get(),u}if(o?.source==="site_cookie"&&o.cookie){let u=o.cookie;e.getAnonymousId=()=>M(u)}if(!r)return null;let i=e.getAnonymousId,a=s();return e.getAnonymousId=()=>q(D(i,null))??a.get(),a}var ro=200;function dn(e,t,n=()=>Date.now()){let r=()=>F(T("carried"),e),o=!1;function s(){try{let i=JSON.parse(sessionStorage.getItem(r())??"null");return!i||!(n()-i.savedAt<=lt)?[]:Array.isArray(i.calls)?i.calls:[]}catch{return[]}}return{take(){let i=s();try{sessionStorage.removeItem(r())}catch{}return i},save(i){try{return o||!t()?!1:(sessionStorage.setItem(r(),JSON.stringify({savedAt:n(),calls:[...s(),...i].slice(-ro)})),!0)}catch{return!1}},close(){o=!0}}}var yi=ie.consent,De=Object.freeze({visitor:"visitor",host:"host"}),fn=()=>({basis:De.host}),oo="hp-consent",ae=["analytics","marketing","personalisation","ad_user_data","ad_personalization"],pn={analytics:"a",marketing:"m",personalisation:"p",ad_user_data:"aud",ad_personalization:"adp"},Y=()=>typeof window<"u",mn=()=>Y()&&typeof window.cookieStore?.addEventListener=="function",so=e=>e===!0?!0:e===!1?!1:null;function me(e){if(!e||typeof e!="object")return null;let t={};for(let n of ae)t[n]=so(e[n]);return t}function ft(e,t){return!e||!t?e===t:ae.every(n=>e[n]===t[n])}function pt(e){if(!e)return"";let t=[];for(let n of ae){let r=e[n];(r===!0||r===!1)&&t.push(`${pn[n]}=${r?1:0}`)}return t.join("&")}function hn(e){return{[oo]:pt(me(e))}}function _e(e){let t=me({});if(e==null)return t;let n=String(e).trim();if(n.length>=2&&n.startsWith('"')&&n.endsWith('"')&&(n=n.slice(1,-1)),n.includes("%"))try{n=decodeURIComponent(n.replace(/\+/g," "))}catch{return t}let r=Object.fromEntries(Object.entries(pn).map(([s,i])=>[i,s])),o=new Set;for(let s of n.split("&")){let i=s.indexOf("=");if(i<=0)continue;let a=r[s.slice(0,i).trim()],u={1:!0,0:!1}[s.slice(i+1).trim()]??null;!a||u===null||o.has(a)||(t[a]===null?t[a]=u:t[a]!==u&&(t[a]=null,o.add(a)))}return t}function mt(e,t){if(!t)return e;let n=r=>{if(!r)return r;let o={...r};for(let s of ae)s!=="analytics"&&t[s]!==!0&&(o[s]=null);return o};return{name:e.name,basis:e.basis,read:()=>n(e.read()),subscribe:r=>e.subscribe(o=>r(n(o))),get observesChanges(){return e.observesChanges}}}function ht(e,t={}){return{...e,ad_user_data:t.ad_user_data??e.marketing,ad_personalization:t.ad_personalization??e.marketing}}function Me(e,t){let n=!0;return{notify:()=>{if(n)try{let o=e();o&&t(o)}catch{}},stop:()=>n=!1}}var io={analytics:["analytics","measure_content_performance","audience_measurement"],marketing:["marketing","targeting","advertising","select_personalized_ads","create_ads_profile"],personalisation:["personalisation","personalization","select_personalized_content","create_content_profile"]};function ao(e,t){if(!t?.length)return null;let n=!1;for(let[r,o]of Object.entries(e)){let s=String(o?.id??r).toLowerCase();if(t.some(a=>{let u=String(a).toLowerCase();return s===u||s.startsWith(`${u}-`)})&&(n=!0,o?.enabled===!0))return!0}return n?!1:null}function gn(e={}){let t={...io,...e.purposes};function n(){let r=Y()?window.Didomi:void 0;if(!r?.getCurrentUserStatus||r.shouldUserStatusBeCollected?.()!==!1||r.isUserStatusPartial?.()===!0)return null;let o=r.getCurrentUserStatus()?.purposes;if(!o||typeof o!="object")return null;let s=i=>ao(o,t[i]);return ht({analytics:s("analytics"),marketing:s("marketing"),personalisation:s("personalisation")},{ad_user_data:s("ad_user_data"),ad_personalization:s("ad_personalization")})}return{name:"didomi",read:n,observesChanges:!0,subscribe(r){if(!Y())return()=>{};let o=Me(n,r),s={event:"consent.changed",listener:o.notify};return window.didomiEventListeners=window.didomiEventListeners||[],window.didomiEventListeners.push(s),window.didomiOnReady=window.didomiOnReady||[],window.didomiOnReady.push(i=>{o.notify(),(i??window.Didomi)?.on?.("consent.changed",o.notify)}),window.Didomi?.on?.("consent.changed",o.notify),o.stop}}}function dt(e){let t={};if(!e)return t;for(let n of String(e).split("&")){let r=n.indexOf("=");if(r<=0)continue;let o=n.slice(r+1).replace(/\+/g," ");try{o=decodeURIComponent(o)}catch{}t[n.slice(0,r)]=o}return t}function yn(e={}){let t={analytics:"C0002",personalisation:"C0003",marketing:"C0004",...e.groups},n=e.impliedConsent===!0;function r(){let i=Y()?window.OnetrustActiveGroups:void 0;if(typeof i=="string"&&i.length){let d=new Set(i.split(",").map(f=>f.trim()).filter(Boolean));return f=>d.has(f)}let a=dt(M("OptanonConsent"));if(!a.groups)return null;let u={};for(let d of a.groups.split(",")){let[f,p]=d.split(":");f?.trim()&&(u[f.trim()]=p==="1"?!0:p==="0"?!1:null)}return d=>u[d]??null}function o(){if(M("OptanonAlertBoxClosed"))return!0;try{if(Y()&&window.OneTrust?.IsAlertBoxClosed?.()===!0)return!0}catch{}return Number.parseInt(dt(M("OptanonConsent")).interactionCount,10)>0?!0:n&&Y()&&(!!window.OneTrust||typeof window.OnetrustActiveGroups=="string")}function s(){if(!o())return null;let i=r();if(!i)return null;let a=p=>t[p]?i(t[p]):null,u=ht({analytics:a("analytics"),marketing:a("marketing"),personalisation:a("personalisation")},{ad_user_data:a("ad_user_data"),ad_personalization:a("ad_personalization")}),d=dt(M("OptanonConsent"));return(typeof navigator<"u"&&navigator.globalPrivacyControl===!0||d.isGpcEnabled==="1")&&(u.marketing=!1,u.ad_user_data=!1,u.ad_personalization=!1),u}return{name:"onetrust",read:s,observesChanges:!0,subscribe(i){if(!Y())return()=>{};let a=Me(s,i),u=!1,d=()=>{u||!window.OneTrust?.OnConsentChanged||(u=!0,window.OneTrust.OnConsentChanged(a.notify))};window.addEventListener("OneTrustGroupsUpdated",a.notify);let f=window.OptanonWrapper;return window.OptanonWrapper=function(...y){try{typeof f=="function"&&f.apply(this,y)}finally{d(),a.notify()}},d(),()=>{a.stop(),window.removeEventListener("OneTrustGroupsUpdated",a.notify)}}}}function co(e){let t=String(e).split(",").map(n=>n.trim()).filter(Boolean);return t.length?new Set(t):null}function wn(e){let{name:t,categories:n,parse:r=co,refusedValue:o,source:s="native",changeEvent:i="thg_hp_consent_change"}=e??{};if(typeof t!="string"||t==="")throw new Error("cookieConsent: `name` (the cookie your banner writes) is required");if(!n||typeof n.analytics!="string")throw new Error("cookieConsent: `categories.analytics` (the category id that grants analytics) is required");function a(){let u=M(t);if(u==null)return null;let d;if(o!==void 0&&u===o)d=new Set;else try{d=r(u)}catch{d=null}if(!(d instanceof Set))return null;let f=p=>n[p]?d.has(n[p]):null;return ht({analytics:f("analytics"),marketing:f("marketing"),personalisation:f("personalisation")},{ad_user_data:f("ad_user_data"),ad_personalization:f("ad_personalization")})}return{name:s,read:a,get observesChanges(){return mn()},subscribe(u){if(!Y())return()=>{};let d=Me(a,u),f=p=>{[...p.changed??[],...p.deleted??[]].some(b=>b?.name===t)&&d.notify()};return window.addEventListener(i,d.notify),window.cookieStore?.addEventListener?.("change",f),()=>{d.stop(),window.removeEventListener(i,d.notify),window.cookieStore?.removeEventListener?.("change",f)}}}}function Sn(e={}){let t=e.name??T("consent"),n=()=>{let r=M(t);if(r==null)return null;let o=_e(r);return o.analytics==null?null:o};return{name:"forwarded",read:n,get observesChanges(){return mn()},subscribe(r){if(!Y())return()=>{};let o=Me(n,r),s=i=>{[...i.changed??[],...i.deleted??[]].some(u=>u?.name===t)&&o.notify()};return window.cookieStore?.addEventListener?.("change",s),()=>{o.stop(),window.cookieStore?.removeEventListener?.("change",s)}}}}function _n(e){let t=me(e);return{name:"static",basis:De.host,read:()=>t?{...t}:null,observesChanges:!0,subscribe:()=>()=>{}}}function bn(e){if(e==null)return null;let t=String(e).split("/").map(n=>n.trim()).filter(Boolean).join("/");return t===""?null:t}function uo(e){let t=e.item_category;if(t!=null&&String(t).includes("/"))return bn(t);let n=[t,e.item_category2,e.item_category3,e.item_category4,e.item_category5].map(r=>r==null?"":String(r).trim()).filter(Boolean);return bn(n.join("/"))}var lo=e=>{if(e==null||typeof e=="object")return null;let t=String(e).trim();return t===""?null:t};function fo(...e){for(let t of e){if(typeof t=="number"&&Number.isFinite(t))return String(t);if(typeof t=="string"&&t.trim()!=="")return t.trim()}return null}var $e=e=>fo(e.item_group_id,e.item_id);function po(e,t=$e){if(!e)return null;let n=a=>a==null||a===""||Number.isNaN(Number(a))?null:Number(a),r=a=>{let u=n(a);return u==null?null:Math.round(u*1e6)/1e6},o=a=>{let u=r(a);return u!=null&&u>=0?u:null},s=a=>{let u=n(a);return Number.isInteger(u)&&u>=0?u:null},i=lo;return{product_id:i(t(e)),sku:i(e.item_id),name:i(e.item_name),brand:i(e.item_brand),variant:i(e.item_variant)??i(e.variant),category:uo(e),price:r(e.price),discount:o(e.discount),quantity:s(e.quantity),coupon:i(e.coupon),position:s(e.index)!=null?s(e.index)+1:null,url:i(e.url)??i(e.item_url)??null,image_url:i(e.image_url)??i(e.image_link)??null,displayed_sku:i(e.displayed_sku)??i(e.displayed_variant_sku)}}function gt(e,t=$e){return(e??[]).map(n=>po(n,t)).filter(n=>n?.product_id)}var mo=1e3,ho={shipping:2,payment:3},go=new Set(["password","google","apple","facebook","magic_link","sso","passkey","other"]),$=e=>{if(e==null||typeof e=="object")return null;let t=String(e).trim();return t===""?null:t},yo=e=>{if(e==null||e===""||typeof e=="object")return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null},Ue=e=>e!==null&&typeof e=="object";function wo(e){return Array.isArray(e.items)?e.items.filter(Ue):null}function xn(e){let t=$(e)?.toLowerCase().replace(/[\s-]+/g,"_");return t?go.has(t)?t:t==="email"||t==="email_password"?"password":"other":null}function So({ecommerce:e,items:t}){let n=s=>({promotion_id:$(s.promotion_id),name:$(s.promotion_name),creative:$(s.creative_name),position:$(s.creative_slot)}),r=new Set,o=[];for(let s of[n(e),...t.map(n)])!s.promotion_id||r.has(s.promotion_id)||(r.add(s.promotion_id),o.push(s));return o}var In=({ecommerce:e,items:t})=>$(e.item_list_id)??$(e.item_list_name)??$(t[0]?.item_list_id)??$(t[0]?.item_list_name),ce=(e,t)=>t.products?.length?{event:e,properties:t}:null,_o=new Set(["product","products","item","items"]);function bo({ecommerce:e}){let t=$(e.item_id),n=$(e.content_type)?.toLowerCase();return!t||n&&!_o.has(n)?null:{event:"Product Shared",properties:{share_via:$(e.method),products:[{product_id:t}]}}}function xo(e){let t=o=>ce("Product List Viewed",{list_id:In(o),products:o.products}),n=o=>{let s=$(o.ecommerce.search_term);return s?{event:"Products Searched",properties:{query:s,...o.products.length?{products:o.products}:{}}}:null},r=o=>s=>s.promotions.map(i=>({event:o,properties:i}));return{view_item:o=>ce("Product Viewed",{currency:o.currency,value:o.value,products:o.products.slice(0,1)}),view_item_list:t,view_search_results:o=>n(o)??t(o),search:n,select_item:o=>ce("Product Clicked",{list_id:In(o),products:o.products.slice(0,1)}),add_to_cart:o=>ce("Product Added",{cart_id:$(o.ecommerce.cart_id),products:o.products}),remove_from_cart:o=>ce("Product Removed",{cart_id:$(o.ecommerce.cart_id),products:o.products}),view_cart:o=>({event:"Cart Viewed",properties:{cart_id:$(o.ecommerce.cart_id),value:o.value,currency:o.currency,coupon:$(o.ecommerce.coupon),...o.itemsListed?{products:o.products}:{}}}),begin_checkout:o=>ce("Checkout Started",{value:o.value,currency:o.currency,coupon:$(o.ecommerce.coupon),products:o.products}),add_shipping_info:o=>({event:"Checkout Step Completed",properties:{step:e.shipping,step_name:"shipping",shipping_method:$(o.ecommerce.shipping_tier)}}),add_payment_info:o=>({event:"Payment Info Entered",properties:{step:e.payment,step_name:"payment",payment_method:$(o.ecommerce.payment_type)}}),view_promotion:r("Promotion Viewed"),select_promotion:r("Promotion Clicked"),add_to_wishlist:o=>ce("Product Added to Wishlist",{products:o.products}),share:bo,login:o=>({event:"Signed In",properties:{method:xn(o.ecommerce.method)}}),sign_up:o=>({event:"Signed Up",properties:{method:xn(o.ecommerce.method)}})}}var Io=e=>e.event;function ko(e,t){if(!Ue(e))return null;if(typeof e.length=="number"&&e[0]==="event"&&typeof e[1]=="string"){let r=Ue(e[2])?e[2]:{};return{name:e[1],entry:r,ecommerce:r}}let n=$(t(e));return n?{name:n,entry:e,ecommerce:Ue(e.ecommerce)?e.ecommerce:e}:null}function yt(e){return Array.isArray(e)?`[${e.map(yt).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${yt(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function kn(e,t={}){if(!e||typeof e.track!="function")throw new Error("connectDataLayer: analytics must have a track(event, properties, options) method");let n=t.dataLayer??(typeof window<"u"?window.dataLayer=window.dataLayer||[]:null);if(!Array.isArray(n))return()=>{};let r=xo({...ho,...t.steps}),o=t.map??{},s=t.eventName??Io,i=t.productId??$e,a=new Set(["purchase","refund",...t.ignore??[]]),u=t.dedupeMs??mo,d=new Map,f=!0;function p(S,g,_){if(u<=0)return!1;let L=`${S}|${_??""}|${yt(g)}`,R=Date.now();for(let[H,K]of d)R-K>u&&d.delete(H);return d.has(L)?!0:(d.set(L,R),!1)}let y=null,b=new Set;function w(S,g){if(S!=="Product Viewed")return!1;let _=typeof location>"u"?"":location.pathname;_!==y&&(y=_,b.clear());let L=g.products?.[0]?.product_id;return L?b.has(L)?!0:(b.add(L),!1):!1}function x({event:S,properties:g={}},_){if(!S||p(S,g,_)||w(S,g))return;let L=_?{context:{currency:_}}:void 0;if(S==="Signed Out"&&typeof e.signedOut=="function"){e.signedOut(L);return}e.track(S,g,L)}function k(S){let g=t.transform?t.transform(S):S,_=ko(g,s);if(!_||a.has(_.name))return;let L=Object.hasOwn(o,_.name),R=L?o[_.name]:r[_.name];if(typeof R!="function")return;let H=wo(_.ecommerce),K=H??[],j={..._,items:K,itemsListed:H!==null,products:gt(K,i),currency:at(_.ecommerce.currency),value:yo(_.ecommerce.value)};j.promotions=So(j);let te=L?R(g,{...j,toProducts:z=>gt(z,i)}):R(j);for(let z of[te].flat())z&&x(z,j.currency)}function v(S){if(f)try{k(S)}catch(g){try{t.onError?.(g,S)}catch{}}}for(let S of n.slice())v(S);let h=n.push;function E(...S){let g=h.apply(this,S);for(let _ of S)v(_);return g}return n.push=E,()=>{f=!1,n.push===E&&(n.push=h)}}var Ao="hp_debug",Eo=256;function vo(){try{return new URLSearchParams(location.search).get(Ao)}catch{return null}}function An(e,t){if(typeof location>"u")return!1;try{let n=vo();if(n!==null){let o=n.trim();o===""||o.length>Eo?sessionStorage.removeItem(t):sessionStorage.setItem(t,o)}let r=sessionStorage.getItem(t);return!!(e&&r&&Kt(r)===e)}catch{return!1}}var he=class extends Error{},Co={inHoldout:()=>!0,personalisationGroup:()=>"excluded",servingHeaders:()=>({}),recommendationContext:()=>({}),flush:()=>Promise.resolve(),reset:()=>{}};function wt(e,t){let n=Co[e]??(()=>null),r=o=>(console.warn(`[hp] ${String(e)} failed; nothing was sent`,o),n());return function(...s){try{let i=t.apply(this,s);return typeof i?.then=="function"?Promise.resolve(i).catch(r):i}catch(i){if(i instanceof he)throw i;return r(i)}}}function En(e){for(let t of Reflect.ownKeys(e)){let{value:n}=Object.getOwnPropertyDescriptor(e,t)??{};typeof n=="function"&&(e[t]=wt(t,n))}return e}var be=Symbol("hp.identityOption");var Po=4320*60*60,Oo=100,Lo=1e3,To=2e3,vn=500,Ve=e=>(e?.unref?.(),e);function No(e,t){if(t?.analytics===!0&&e.analytics===!1)return"withdrawn";let n=ae.map(r=>e[r]).filter(r=>r!==null);return n.length&&n.every(Boolean)?"accept_all":n.length&&n.every(r=>!r)?"reject_all":"custom"}function Ro(e,t,n=T("consent")){if(!(typeof document>"u"))try{let r=typeof location<"u"&&location.protocol==="https:"?"; Secure":"",o=t?`; Domain=${t}`:"";document.cookie=`${n}=${pt(e)}; Path=/; Max-Age=${Po}; SameSite=Lax`+o+r}catch{}}function Do(e){let t=_e(M(e));return ae.some(n=>t[n]!==null)?t:null}function Cn(e){let{adapter:t,timeoutMs:n=5e3,cookieDomain:r=null,cookieName:o=T("consent"),release:s,announce:i}=e,a=e.discard??(()=>{}),u="pending",d=null,f=null,p=null,y=null,b=!1,w=null,x=[],k=m=>{u=m,e.onStatus?.(m)};function v(){try{return me(t.read())}catch{return null}}function h(){f&&clearInterval(f),p&&clearTimeout(p),f=null,p=null}let E=()=>typeof window<"u"&&typeof document<"u",S=()=>{try{return typeof t.subscribe=="function"&&t.observesChanges===!0}catch{return!1}};function g(){y&&clearInterval(y),y=null}function _(){b||y||d===null||S()||E()&&document.visibilityState==="hidden"||(y=Ve(setInterval(()=>j(v()),To)))}let L=()=>u==="pending"||u==="unknown",R=e.store??null,H=()=>{let m=x.splice(0);R?.write([]);for(let B of m)s(B)},K=()=>{let m=x.splice(0);R?.write([]);for(let B of m)a(B)};function j(m){let B=me(m);if(!B||B.analytics===null)return;let ve=d===null,J=ve?Do(o):d;if(!ve&&ft(J,B))return;h(),d=B,_(),Ro(B,r,o);let Ce=!ft(J,B);if(B.analytics){k("granted"),H(),Ce&&i({action:No(B,J),state:B,previous:J,withdrawal:!1});return}K(),J?.analytics===!0&&i({action:"withdrawn",state:B,previous:J,withdrawal:!0}),k("denied")}function te(){p=null,u==="pending"&&(k("unknown"),f&&clearInterval(f),f=Ve(setInterval(()=>j(v()),Lo)))}function z(m){L()&&(R||m?.type!=="visibilitychange"&&!m?.persisted&&K())}let ne=m=>{document.visibilityState==="hidden"?(g(),z(m)):_()},de=m=>{g(),z(m)},Ee=()=>_();return{get status(){return u},get state(){return d?{...d}:null},stamp(){return d?{...d,source:t.name??null,basis:t.basis??De.visitor}:null},admits(){return u==="granted"},hold(m){return!L()||x.length>=vn?(a(m),!1):(x.push(m),R?.write(x),!0)},onHidden:z,start(){b=!1;try{w=t.subscribe?.(m=>j(m))??null}catch(m){e.debug&&console.warn("[hp] consent adapter subscribe failed",m)}E()&&(window.addEventListener("pagehide",de),window.addEventListener("pageshow",Ee),document.addEventListener("visibilitychange",ne)),R&&x.length===0&&x.push(...R.read().slice(-vn)),j(v()),!d&&(f=Ve(setInterval(()=>j(v()),Oo)),p=Ve(setTimeout(te,n)))},stop(){b=!0,h(),g(),typeof w=="function"&&w(),E()&&(window.removeEventListener("pagehide",de),window.removeEventListener("pageshow",Ee),document.removeEventListener("visibilitychange",ne))}}}var Mo=["recommendation","search_rank","banner","offer","layout","copy","price","other"],Be=e=>typeof e=="string"&&e!=="";function Pn(e){return(Array.isArray(e?.decisions)?e.decisions:[]).filter(t=>Be(t?.slot)&&Be(t.decision_id)&&t.holdout!==!0).map(({decision_id:t,slot:n,arm:r,kind:o})=>({decision_id:t,slot:n,...Be(r)&&{arm:r},...Mo.includes(o)&&{kind:o}}))}function On({key:e,mayStore:t}){let n,r=()=>{if(n)return n;try{let s=JSON.parse(sessionStorage.getItem(e));n=Array.isArray(s)?s.filter(i=>Be(i?.slot)):[]}catch{n=[]}return n},o=()=>{try{n?.length&&t()&&sessionStorage.setItem(e,JSON.stringify(n))}catch{}};return{persist:o,current:()=>r().length?n.map(s=>({...s})):null,remember(s){if(!s.length)return;let i=new Set(s.map(a=>a.slot));n=[...r().filter(a=>!i.has(a.slot)),...s],o()},forget(){n=[];try{sessionStorage.removeItem(e)}catch{}}}}function $o(e){let t=2166136261,n=String(e);for(let r=0;r<n.length;r+=1)t^=n.charCodeAt(r),t=t+((t<<1)+(t<<4)+(t<<7)+(t<<8)+(t<<24))>>>0;return t^=t>>>16,t=Math.imul(t,2246822507)>>>0,t^=t>>>13,t=Math.imul(t,3266489909)>>>0,t^=t>>>16,t>>>0}function je(e,t,n=1e4){return $o(`${t}\0${e}`)%n}function St(e){let t=o=>Math.min(Math.max(Number(o)||0,0),1),n=t(e.share),r=1-n;return{holdout_share:n,personalised_share:e.ramp==null?r:Math.min(t(e.ramp),r)}}function _t(e,t){if(!e||typeof e.salt!="string")return{holdout:!1,bucket:null,group:"personalised"};let n=e.ramp!=null;if(t==null||t==="")return{holdout:!1,bucket:null,group:n?"excluded":"personalised"};let{holdout_share:r,personalised_share:o}=St(e),s=je(t,e.salt),i=u=>Math.round(u*1e4),a=r>0&&s<i(r)?"holdout":!n||s<i(r+o)?"personalised":"excluded";return{holdout:a==="holdout",bucket:s,group:a}}function Ln(e,t){return typeof e!="string"||e===""||t==null||t===""?null:je(t,`bandit-vs-default:${e}`)<1e4/2?"default":"bandit"}var Uo="hp_preview",Vo=256;function Tn(e,t=null){if(typeof location>"u")return M(e);let n=null;try{n=new URLSearchParams(location.search).get(Uo)}catch{n=null}if(n===null)return M(e);let r=n.trim();return r===""||r.length>Vo?(Q(e,"",0,t),null):(Q(e,r,null,t),r)}var Bo=40,jo=128,qo=5,Fo=60,Rn=e=>typeof e=="string"&&e!==""&&e.length<=jo&&!e.includes(","),Nn=e=>Array.isArray(e)?e.filter(Rn).slice(0,Bo):[],Ho=e=>Array.isArray(e)?e.filter(t=>typeof t=="string").map(t=>t.replaceAll(","," ").trim()).filter(t=>t!=="").slice(0,qo):[],Ko=e=>Object.entries(e&&typeof e=="object"?e:{}).filter(([t,n])=>Rn(t)&&Number.isFinite(n)&&n>=1).sort(([,t],[,n])=>n-t).slice(0,Fo).map(([t,n])=>`${t}:${Math.floor(n)}`);function bt(e){let t={},n={viewed:Nn(e?.recentProducts),basket:Nn(e?.basketProducts),q:Ho(e?.recentSearches),impressed:Ko(e?.impressions)};for(let[r,o]of Object.entries(n))o.length>0&&(t[r]=o.join(","));return t}var Go=1800*1e3;function Dn(e,t=Date.now()){try{localStorage.setItem(T("recommendationContext"),JSON.stringify({context:e,until:t+Go}))}catch{}}function Mn(){try{localStorage.removeItem(T("recommendationContext"))}catch{}}var zo="hp_sample",$n=1e4;function Un(e,t){return!(typeof t=="number"&&t<1)||e==null||e===""?!0:je(e,zo,$n)<Math.round(t*$n)}function ge(e){return e.trim().toLowerCase().replace(/\s*\/\s*/g,"/").replace(/^\/+|\/+$/g,"")}var Wo=2,Jo=12;function xe(e,t=Wo){return e.split("/").slice(0,t).join("/")}function xt(e,t){if(typeof t!="string"||!t.trim())return null;let n=xe(ge(t));return n?(e.unshift(n),e.length=Math.min(e.length,Jo),n):null}var ue=()=>T("sessionSignals"),ye=null,It=()=>ye??ue();function Vn(){try{return ye?localStorage:sessionStorage}catch{return}}function Bn(e,t){let n=t==null?null:String(t),r=e?F(ue(),n,e):null;if(r===ye)return;let o=ye===null?Yo():null;if(ye=r,!!ye)try{let s=It(),i=cn(ue(),n);for(let a of Object.keys(localStorage))a.startsWith(i)&&a!==s&&localStorage.removeItem(a);o&&!localStorage.getItem(s)&&(localStorage.setItem(s,JSON.stringify(o)),sessionStorage.removeItem(ue()))}catch{}}function Yo(){try{let e=sessionStorage.getItem(ue());if(!e)return null;let t=JSON.parse(e);return t&&(t.productViews>0||t.listViews>0||t.basketValue!=null||t.recentProducts?.length||t.recentBrowse?.length)?t:null}catch{return null}}function qe(){return{productViews:0,listViews:0,cartAdds:0,searches:0,recentProducts:[],recentCategories:[],recentBrowse:[],basketProducts:[],basketValue:null,recentSearches:[],impressions:{},browsingCategory:null,recentBrowseCategories:[],browsingListing:null,listViewsByCategory:{},startedAt:0}}function kt(){let e=Vn();if(!e)return qe();try{let t=e.getItem(It());return t?{...qe(),...JSON.parse(t)}:{...qe(),startedAt:Date.now()}}catch{return{...qe(),startedAt:Date.now()}}}function At(e){let t=Vn();if(t)try{t.setItem(It(),JSON.stringify(e))}catch{}}function jn(){return kt()}function qn(){for(let e of[()=>sessionStorage,()=>localStorage])try{let t=e();t.removeItem(ue());for(let n of Object.keys(t))n.startsWith(`${ue()}:`)&&t.removeItem(n)}catch{}}var Fn=20,Hn=200,Xo=new Set(["Product Viewed","Product Clicked","Product Added","Product Added to Wishlist"]),Zo=new Set(["Product Viewed","Product Added"]),Kn=50;function Fe(e,t){let n=xt(e.recentBrowse,t);return n?(e.recentBrowseCategories=[e.browsingListing?.category??null,...e.recentBrowseCategories].slice(0,e.recentBrowse.length),n):null}function Qo(e,t){let n=e.listViewsByCategory;n[t]=(n[t]??0)+1;let r=Object.keys(n);if(r.length>Kn){let o={};for(let s of r.sort((i,a)=>n[a]-n[i]).slice(0,Kn))o[s]=n[s];e.listViewsByCategory=o}}function Gn(e,t){let n=kt();n.startedAt||(n.startedAt=Date.now());let r=Array.isArray(t?.products)?t.products:[];switch(e){case"Product Viewed":n.productViews+=1,Fe(n,n.browsingCategory);break;case"Product List Viewed":{let i=t?.list_id,a=t?.category;if(!(typeof i=="string"&&i.includes("/")&&!i.startsWith("cdp-")))break;let d=typeof a=="string"&&xe(ge(a))||null,f=d?xe(ge(i)):"";if(!f){n.browsingCategory=null,n.browsingListing=null;break}n.browsingListing={key:f,category:d},Fe(n,f),n.browsingCategory=f,Qo(n,d),n.listViews+=1}break;case"Product List Filtered":{let i=t?.change,a=typeof t?.list_id=="string"?t.list_id:"",u=typeof i?.value=="string"?i.value:"",d=n.browsingListing;if(u&&i?.action!=="removed"&&d&&xe(ge(a))===d.key){let f=Fe(n,`${a}/${u}`);f&&(n.browsingCategory=f)}break}case"Product Added":{n.cartAdds+=1,Fe(n,n.browsingCategory);for(let i of r){let a=i.product_id;typeof a!="string"||!a||(n.basketProducts=[a,...n.basketProducts.filter(u=>u!==a)].slice(0,Fn))}break}case"Product Removed":{for(let i of r){let a=i.product_id;typeof a=="string"&&a&&(n.basketProducts=n.basketProducts.filter(u=>u!==a))}break}case"Products Searched":{n.searches+=1;let i=t?.query;if(typeof i=="string"&&i.trim()){let a=i.trim().toLowerCase().slice(0,64);n.recentSearches=[a,...n.recentSearches.filter(u=>u!==a)].slice(0,5)}break}case"Product Clicked":case"Product Added to Wishlist":break;case"Cart Updated":{let i=t?.value;return n.basketValue=typeof i=="number"&&Number.isFinite(i)&&i>=0?i:null,At(n),n}default:return n}let o=Xo.has(e);if(o)for(let i of r)typeof i.product_id=="string"&&i.product_id&&delete n.impressions[i.product_id];else{for(let a of r){let u=a.product_id;typeof u!="string"||!u||(n.impressions[u]=(n.impressions[u]??0)+1)}let i=Object.keys(n.impressions);if(i.length>Hn){let a={};for(let u of i.sort((d,f)=>n.impressions[f]-n.impressions[d]).slice(0,Hn))a[u]=n.impressions[u];n.impressions=a}}let s=new Set;for(let i of r){let a=i.product_id;if(o&&typeof a=="string"&&a&&(n.recentProducts=[a,...n.recentProducts.filter(u=>u!==a)].slice(0,Fn)),Zo.has(e)&&typeof i.category=="string"&&i.category){let u=ge(i.category);u&&!s.has(u)&&(s.add(u),xt(n.recentCategories,u))}}return At(n),n}var zn=1800*1e3;function Wn({name:e,domain:t=null,mayStore:n,now:r=()=>Date.now(),mint:o=Z}){let s=null,i=0,a=()=>{s!==null&&n()&&Q(e,s,zn/1e3,t)};return{get(){let u=r(),d=M(e);return d?s=d:(s===null||u-i>=zn)&&(s=o()),i=u,a(),s},persist:a,forget(){Q(e,"",0,t),s=null}}}var G=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),Jn=e=>Array.isArray(e)&&e.every(t=>typeof t=="string"),vt=Object.freeze({enabled:!1});function Yn(e,t){let n=e?.track;return G(n)?(Object.hasOwn(n,t)?n[t]:n.__default)?.enabled!==!1:!0}function es(e,t){return`${le(e)}/v1/projects/${encodeURIComponent(t)}/settings`}var ts="https://hp.thgingenuity.com";function le(e){return e==null||e===""?ts:Zn(e)}function Xn(e,t){return e!=null&&e!==""?le(e):t?.startsWith("https://")?t:le(void 0)}function Zn(e){if(typeof e!="string")return null;let t=e.trim().replace(/\/+$/,"");return/^https?:\/\/[^/\s]+$/i.test(t)?t:/^[a-z0-9.-]+(:\d+)?$/i.test(t)?`https://${t}`:null}function ns(e){if(!G(e))return null;let t=Object.fromEntries(Object.entries(e).filter(([,n])=>typeof n=="boolean"));return Object.keys(t).length?t:null}var Et=e=>typeof e=="number"&&e>=0&&e<=1,rs=/^[0-9a-f]{64}$/;function os(e){return G(e)?{enabled:e.enabled===!0,tokenSha256:typeof e.tokenSha256=="string"&&rs.test(e.tokenSha256)?e.tokenSha256:null}:{enabled:!1,tokenSha256:null}}function ss(e){if(!G(e))return null;let t=Object.fromEntries(Object.entries(e).filter(([,n])=>G(n)&&Et(n.share)&&(n.ramp==null||Et(n.ramp))&&typeof n.salt=="string"&&n.salt!=="").map(([n,r])=>[n,{share:r.share,ramp:r.ramp??null,salt:r.salt,...Jn(r.readoutSlots)&&r.readoutSlots.length>0&&{readoutSlots:r.readoutSlots}}]));return Object.keys(t).length?t:null}var is=/^[A-Za-z0-9!#$%&'*+.^_`|~-]{1,128}$/;function as(e){return G(e)?e.source==="hp_cookie"?{source:"hp_cookie"}:e.source!=="site_cookie"?null:e.cookie==null?{source:"site_cookie",cookie:null}:typeof e.cookie=="string"&&is.test(e.cookie)?{source:"site_cookie",cookie:e.cookie}:null:null}function cs(e){let t=G(e)?e.hp:null;return G(t)&&typeof t.enabled=="boolean"}function Ct(e){let t=G(e)?e.hp:null;return!G(t)||t.enabled!==!0?vt:{enabled:!0,propertyId:typeof t.propertyId=="string"&&t.propertyId!==""?t.propertyId:null,environment:typeof t.environment=="string"?t.environment:null,consentPurposes:ns(t.consent?.purposes),queryParamAllowlist:Jn(t.queryParamAllowlist)?t.queryParamAllowlist:null,anonymousId:as(t.anonymousId),apiHost:Zn(t.apiHost),holdouts:ss(t.holdouts),sampleRate:Et(t.sampleRate)?t.sampleRate:1,debug:os(t.debug),plan:G(e.plan)&&G(e.plan.track)?{track:e.plan.track}:null}}async function Qn(e,t,n=globalThis.fetch){try{let r=await n(es(e,t),{credentials:"omit",headers:{accept:"application/json"}});if(!r.ok)return null;let o=await r.json();return cs(o)?Ct(o):null}catch{return null}}var He=e=>F(T("settings"),e);function er(e){try{let t=localStorage.getItem(He(e));if(!t)return null;let n=JSON.parse(t);return n?.enabled===!0?n:null}catch{return null}}function tr(e,t){try{t?.enabled===!0?localStorage.setItem(He(e),JSON.stringify(t)):localStorage.removeItem(He(e))}catch{}}function Pt(e){try{localStorage.removeItem(He(e))}catch{}}var us={flushAt:20,flushIntervalMs:1e4,maxQueue:500,maxRetryAgeMs:1440*60*1e3,maxRetries:5,maxPersistedBatches:20,maxPersistedBytes:1024*1024,storageKey:ie.retry,beaconSafeBytes:56*1024,maxBatchEvents:100,maxBatchBytes:500*1024},Ke=()=>Date.now(),nr=3e4,Mt=55*1024;function ls(e,t=Ke()){if(typeof e!="string")return 0;let n=e.trim();if(/^\d+$/.test(n))return Number(n)*1e3;if(n==="")return 0;let r=Date.parse(n);return Number.isNaN(r)?0:Math.max(0,r-t)}var ee=e=>typeof TextEncoder<"u"?new TextEncoder().encode(e).length:Buffer.byteLength(e),Ot=()=>typeof window<"u"&&typeof document<"u";function ds(){try{return!Ot()||!window.localStorage?null:(window.localStorage.getItem("thg_hp_probe"),window.localStorage)}catch{return null}}var I,Lt,Tt,Ge,Nt,Rt,rr,Ie,ke,Ae,or,Dt,sr,ze,We=class{constructor(t){Ft(this,I);this.o={...us,...t},this.queue=[],this.timer=null,this.storage=ds(),this.inflight=null,this.sending=new Set,this.epoch=0,this.sinceRefusal=new Set,this.wakers=new Set,this.replayAllowed=!this.o.deferReplay,this.draining=null,Ot()&&(window.addEventListener("pagehide",()=>this.flush({beacon:!0})),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.flush()}),O(this,I,ze).call(this))}replayPersisted(){return this.replayAllowed=!0,O(this,I,ze).call(this)}clearPersisted(){if(this.replayAllowed=!1,!!this.storage)try{let t=O(this,I,Ae).call(this).filter(n=>this.sinceRefusal.has(n?.id));t.length?this.storage.setItem(this.o.storageKey,JSON.stringify(t)):this.storage.removeItem(this.o.storageKey)}catch{}}discardQueued(){this.queue=[],this.epoch+=1,this.sinceRefusal.clear(),O(this,I,Tt).call(this);for(let t of this.wakers)t()}enqueue(t){let n;try{n=JSON.parse(JSON.stringify(t))}catch(r){this.o.onError?.(`event ${t?.messageId??""} cannot be serialised; dropped`,r);return}this.queue.push(n),this.queue.length>this.o.maxQueue&&this.queue.splice(0,this.queue.length-this.o.maxQueue),this.queue.length>=this.o.flushAt?this.flush():O(this,I,Lt).call(this)}flush(t={}){if(O(this,I,Tt).call(this),this.queue.length===0)return Promise.resolve();if(t.beacon&&Ot()&&typeof navigator<"u"&&navigator.sendBeacon)return O(this,I,rr).call(this),Promise.resolve();if(this.inflight)return this.inflight;let n=O(this,I,Rt).call(this,this.queue,this.o.maxBatchEvents,this.o.maxBatchBytes).map(o=>{let s=O(this,I,Dt).call(this,o);return s&&(this.sending.add(s),this.sinceRefusal.add(s)),{batch:o,id:s}});this.queue=[];let r=this.epoch;return this.inflight=(async()=>{for(let{batch:o,id:s}of n){if(r!==this.epoch){O(this,I,ke).call(this,s);continue}await O(this,I,Ie).call(this,o,0,s,r)}})().finally(()=>{this.inflight=null,this.queue.length>=this.o.flushAt?this.flush():this.queue.length&&O(this,I,Lt).call(this)}),this.inflight}};I=new WeakSet,Lt=function(){this.timer||(this.timer=setTimeout(()=>this.flush(),this.o.flushIntervalMs),this.timer?.unref?.())},Tt=function(){this.timer&&(clearTimeout(this.timer),this.timer=null)},Ge=function(t){return JSON.stringify({batch:t,writeKey:this.o.writeKey,sentAt:new Date().toISOString()})},Nt=function(){return`${this.o.apiHost.replace(/\/$/,"")}/v1/batch`},Rt=function(t,n,r){let o=ee(O(this,I,Ge).call(this,[])),s=[],i=[],a=o;for(let u of t){let d=ee(JSON.stringify(u))+1;i.length&&(i.length>=n||a+d>r)&&(s.push(i),i=[],a=o),i.push(u),a+=d}return i.length&&s.push(i),s},rr=function(){let t=this.queue;this.queue=[];let n=O(this,I,Nt).call(this);for(let r of O(this,I,Rt).call(this,t,this.o.maxBatchEvents,this.o.beaconSafeBytes)){let o=O(this,I,Ge).call(this,r);if(ee(o)<=this.o.beaconSafeBytes){let s=!1;try{s=navigator.sendBeacon(n,new Blob([o],{type:"text/plain"}))}catch{s=!1}if(s)continue}O(this,I,Ie).call(this,r,0,O(this,I,Dt).call(this,r))}},Ie=async function(t,n,r=null,o=this.epoch){r&&this.sending.add(r);let s=O(this,I,Ge).call(this,t),i=0;try{let a=await fetch(O(this,I,Nt).call(this),{method:"POST",headers:{"Content-Type":"text/plain"},body:s,keepalive:ee(s)<=this.o.beaconSafeBytes});if(a.ok)return O(this,I,ke).call(this,r),O(this,I,ze).call(this),!0;let u=a.status===408||a.status===429||a.status>=500;if(u&&(i=ls(a.headers?.get?.("retry-after"))),!u)return O(this,I,ke).call(this,r),this.o.onError?.(`CDP ingest rejected batch (${a.status}); dropping ${t.length} events`),!0;throw new Error(`retryable ${a.status}`)}catch(a){if(n>=this.o.maxRetries){r&&this.sending.delete(r);let d=r?"kept for the next page":"dropped";return this.o.onError?.(`CDP ingest unreachable after ${n} attempts; ${d}: ${t.length} events`,a),!1}let u=Math.max(Math.min(1e3*2**n,nr)*(.5+Math.random()),Math.min(i,nr));return o===this.epoch&&await new Promise(d=>{let f=()=>{clearTimeout(p),this.wakers.delete(f),d()},p=setTimeout(f,u);this.wakers.add(f)}),o!==this.epoch?(O(this,I,ke).call(this,r),!1):O(this,I,Ie).call(this,t,n+1,r,o)}},ke=function(t){t&&(this.sending.delete(t),this.sinceRefusal.delete(t),O(this,I,sr).call(this,t))},Ae=function(){let t=JSON.parse(this.storage.getItem(this.o.storageKey)||"[]");return Array.isArray(t)?t:[]},or=function(t,n){let r=i=>ee(JSON.stringify(i))+1,o=[...t,n].slice(-this.o.maxPersistedBatches),s=o.reduce((i,a)=>i+r(a),2);for(;o.length>1&&s>this.o.maxPersistedBytes;)s-=r(o[0]),o=o.slice(1);for(;o.length;)try{return this.storage.setItem(this.o.storageKey,JSON.stringify(o)),!0}catch{o=o.slice(1)}return!1},Dt=function(t){if(!this.storage||this.o.mayPersist&&!this.o.mayPersist())return null;try{let n={at:Ke(),id:`${Ke()}-${Math.random().toString(36).slice(2)}`,batch:t};return ee(JSON.stringify(n))+3>this.o.maxPersistedBytes?null:O(this,I,or).call(this,O(this,I,Ae).call(this),n)?n.id:null}catch{return null}},sr=function(t){if(!(!t||!this.storage))try{let n=O(this,I,Ae).call(this).filter(r=>r.id!==t);n.length?this.storage.setItem(this.o.storageKey,JSON.stringify(n)):this.storage.removeItem(this.o.storageKey)}catch{}},ze=function(){if(!this.storage||!this.replayAllowed)return this.draining??Promise.resolve();if(this.draining)return this.draining;let t;try{let r=O(this,I,Ae).call(this);t=r.filter(o=>Array.isArray(o?.batch)&&Ke()-o.at<this.o.maxRetryAgeMs).map(o=>o.id?o:{...o,id:`${o.at}-${Math.random().toString(36).slice(2)}`}),(t.length!==r.length||t.some((o,s)=>o!==r[s]))&&(t.length?this.storage.setItem(this.o.storageKey,JSON.stringify(t)):this.storage.removeItem(this.o.storageKey))}catch{return Promise.resolve()}let n=t.filter(r=>!this.sending.has(r.id));return n.length?(this.draining=(async()=>{for(let r of n)if(!this.replayAllowed||!await O(this,I,Ie).call(this,r.batch,0,r.id))return})().finally(()=>{this.draining=null}),this.draining):Promise.resolve()};var ir="3.22.0",ar="@thg-agentic/hyper-personalisation-web";var fs=new Set(["audiences","decisions","recommendations"]);var ps=Symbol.for("@thg-agentic/hyper-personalisation-web.replay");function ms(e){let t={...e??{}},n=Array.isArray(t.products)?t.products:null;if(t.item_count==null&&n){let r=n.map(o=>o?.quantity);r.every(Number.isInteger)&&(t.item_count=r.reduce((o,s)=>o+s,0))}return t}var hs="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";function gs(e){if(/^[0-9a-fA-F]{64}$/.test(e))return e.toLowerCase();if(!/^[A-Za-z0-9+/_-]{43}=?$/.test(e))return null;try{let t=atob(e.replace(/-/g,"+").replace(/_/g,"/").padEnd(44,"="));return t.length!==32?null:Array.from(t,n=>n.charCodeAt(0).toString(16).padStart(2,"0")).join("")}catch{return null}}function Je(e){if(typeof e!="string")return null;let t=gs(e.trim());return t===hs?null:t}var cr=Object.freeze({email_sha256:"sha256",phone_sha256:"sha256",accepts_marketing:"boolean",gender:"string",created_at:"date-time"}),ys=/^\d{4}-\d{2}-\d{2}T([01]\d|2[0-3]):[0-5]\d:[0-5]\d(\.\d+)?(Z|[+-]([01]\d|2[0-3]):[0-5]\d)$/i;function ws(e){if(typeof e!="string"||!ys.test(e))return!1;let[t,n,r]=e.slice(0,10).split("-").map(Number),o=new Date(Date.UTC(t,n-1,r));return o.getUTCMonth()===n-1&&o.getUTCDate()===r&&!Number.isNaN(Date.parse(e))}function Ss(e,t){return t===null?null:e==="sha256"?Je(t)??void 0:e==="date-time"?t instanceof Date?Number.isNaN(t.getTime())?void 0:t.toISOString():ws(t)?t:void 0:typeof t===e?t:void 0}function _s(e,t){let n={},r=[];for(let[o,s]of Object.entries(e)){let i=Object.hasOwn(cr,o)?cr[o]:null,a=i?Ss(i,s):void 0;a===void 0?r.push(o):n[o]=a}return t&&r.length&&console.warn(`[hp] identify: not sent, not spec traits: ${r.join(", ")}`),n}var ur=!1,lr=!1;function bs(){lr||(lr=!0,console.warn("[hp] no consent adapter: events are sent under the host's lawful basis (basis 'host'). Pass `consent` to send only once the visitor allows analytics."))}function xs(e){!e||ur||(ur=!0,console.warn("[hp] mintAnonymousId is ignored since 3.6: where device ids come from is set per source in the console (the site\u2019s own cookie, or Hyper-Personalisation\u2019s)."))}function Is(e){try{return ee(JSON.stringify(e))}catch{return 0}}function dr(e){return e&&typeof e.context=="object"&&e.context!==null?e.context:e}function fr(e){let t=le(e?.apiHost);if(!t)throw new Error("createAnalytics: apiHost, when given, must be a host or an http(s) origin");if(!e?.propertyId)throw new Error("createAnalytics: propertyId is required");let n={libraryName:ar,libraryVersion:ir,writeKey:"web",queryParamBlocklist:[],debug:!1,validate:null,consentTimeoutMs:5e3,...e,apiHost:t};Te(n.storageNames),Ne();let r=!!n.consent;r||bs();let o=null;n.getConsent=()=>o?o.stamp():fn();let s=()=>!r||o?.status==="granted",i=r&&n.holdAcrossPages?un(F(T("held"),n.propertyId)):null,a=i?.read()??{items:[],anonymousId:null};n.mintAnonymousId!==void 0&&xs(n.debug);let u=ln(n,{carried:a.anonymousId,mayStore:s,orOwn:!0}),d=Wn({name:T("session"),domain:n.consentCookieDomain??null,mayStore:s}),f=n.getSessionId;n.getSessionId=()=>q(D(f,null))??d.get();let p=Tn(T("preview"),n.consentCookieDomain??null),y=(c,l)=>n.debug&&console.warn("[hp]",c,l??""),b=n.transport??new We({apiHost:n.apiHost,writeKey:n.writeKey,storageKey:F(T("retry"),n.propertyId),mayPersist:r?()=>o?.status==="granted":void 0,deferReplay:r,onError:y}),w=F(T("previousPage"),n.propertyId),x=null,k=()=>{if(x)return x;try{return sessionStorage.getItem(w)||null}catch{return null}},v=c=>{if(x=c||null,!(r&&o.status!=="granted"))try{sessionStorage.setItem(w,c)}catch{}},h=On({key:F(T("decisions"),n.propertyId),mayStore:s});n.getDecisions??(n.getDecisions=h.current);let E=q(D(n.getUserId,null)),S=null,g=null,_=null;function L(c,l,A=!1){try{return R(c,l,A)}catch(P){if(P instanceof he)throw P;return console.warn("[hp] the event was not sent",P),null}}function R(c,l,A){let P=_;_=null;let U=c.type==="track"?c.event:c.type;if(!A&&!Yn(n.plan,U))return null;let C={messageId:P?.messageId??Z(),timestamp:P?.timestamp??new Date().toISOString(),anonymousId:q(D(n.getAnonymousId,null)),userId:E??null,...c,context:rn(n,dr(l))};if(C.properties&&(C.properties=st(C.properties)),!A&&!Un(C.anonymousId,n.sampleRate))return n.debug&&console.debug("[hp] not sent: outside the sample",C),null;if(n.beforeSend){let fe;try{fe=n.beforeSend(C)}catch(kr){return console.warn("[hp] beforeSend failed; the event was not sent",kr),null}if(!fe)return null;let{type:Pe,event:jt,messageId:xr,timestamp:Ir}=C;C={...fe,type:Pe,messageId:xr,timestamp:Ir,...jt?{event:jt}:{}}}if(n.validate){let fe=n.validate(C,{producer:"web"});if(!fe.valid){let Pe=`[hp] invalid ${C.event??C.type}:
1
+ (()=>{var qt=e=>{throw TypeError(e)};var vr=(e,t,n)=>t.has(e)||qt("Cannot "+n);var Ft=(e,t,n)=>t.has(e)?qt("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n);var O=(e,t,n)=>(vr(e,t,"access private method"),n);var Se=[];for(let e=2;Se.length<64;e++)Se.every(t=>e%t!==0)&&Se.push(e);var Ht=e=>(e-Math.floor(e))*2**32>>>0,Cr=Se.slice(0,8).map(e=>Ht(Math.sqrt(e))),Pr=Se.map(e=>Ht(Math.cbrt(e))),W=(e,t)=>e>>>t|e<<32-t;function Kt(e){let t=new TextEncoder().encode(String(e)),n=new Uint32Array((t.length+8>>6)*16+16);t.forEach((s,i)=>{n[i>>2]|=s<<24-i%4*8}),n[t.length>>2]|=128<<24-t.length%4*8,n[n.length-2]=Math.floor(t.length/2**29),n[n.length-1]=t.length*8;let r=Uint32Array.from(Cr),o=new Uint32Array(64);for(let s=0;s<n.length;s+=16){for(let w=0;w<64;w++){if(w<16){o[w]=n[s+w];continue}let b=o[w-15],k=o[w-2],E=W(b,7)^W(b,18)^b>>>3,h=W(k,17)^W(k,19)^k>>>10;o[w]=o[w-16]+E+o[w-7]+h}let[i,a,u,d,f,p,g,x]=r;for(let w=0;w<64;w++){let b=W(f,6)^W(f,11)^W(f,25),k=x+b+(f&p^~f&g)+Pr[w]+o[w]|0,h=(W(i,2)^W(i,13)^W(i,22))+(i&a^i&u^a&u)|0;[x,g,p,f,d,u,a,i]=[g,p,f,d+k|0,u,a,i,k+h|0]}[i,a,u,d,f,p,g,x].forEach((w,b)=>{r[b]+=w})}return Array.from(r,s=>s.toString(16).padStart(8,"0")).join("")}var Qe=(e,t)=>e<<t|e>>>32-t;function Gt(e){let t=new Uint32Array((e.length+8>>6)*16+16);e.forEach((s,i)=>{t[i>>2]|=s<<24-i%4*8}),t[e.length>>2]|=128<<24-e.length%4*8,t[t.length-2]=Math.floor(e.length/2**29),t[t.length-1]=e.length*8;let n=Uint32Array.of(1732584193,4023233417,2562383102,271733878,3285377520),r=new Uint32Array(80);for(let s=0;s<t.length;s+=16){for(let p=0;p<80;p++)r[p]=p<16?t[s+p]:Qe(r[p-3]^r[p-8]^r[p-14]^r[p-16],1);let[i,a,u,d,f]=n;for(let p=0;p<80;p++){let g,x;p<20?(g=a&u|~a&d,x=1518500249):p<40?(g=a^u^d,x=1859775393):p<60?(g=a&u|a&d|u&d,x=2400959708):(g=a^u^d,x=3395469782);let w=Qe(i,5)+g+f+x+r[p]|0;[f,d,u,a,i]=[d,u,Qe(a,30),i,w]}[i,a,u,d,f].forEach((p,g)=>{n[g]+=p})}let o=new Uint8Array(20);return n.forEach((s,i)=>{o[i*4]=s>>>24,o[i*4+1]=s>>>16,o[i*4+2]=s>>>8,o[i*4+3]=s}),o}var Or="e28e8ada-5b76-4209-bba9-79b823a0af75",Lr=e=>Array.from(e,t=>t.toString(16).padStart(2,"0")).join("");function zt(e,t){let n=Uint8Array.from(e.replace(/-/g,"").match(/../g),a=>Number.parseInt(a,16)),r=new TextEncoder().encode(t),o=new Uint8Array(16+r.length);o.set(n),o.set(r,16);let s=Gt(o).slice(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let i=Lr(s);return`${i.slice(0,8)}-${i.slice(8,12)}-${i.slice(12,16)}-${i.slice(16,20)}-${i.slice(20)}`}var re=(e,t)=>typeof e=="string"&&e!==""&&e.length<=t?e:null;function Oe(e,t){return re(e,64)??re(t,256)}function Wt({sessionId:e,slot:t,arm:n}={}){let r=re(e,256);return!r||!re(t,256)||!re(n,256)?null:zt(Or,`${r}:${t}:${n}`)}var Tr="4b1f2c7e-9a3d-4e58-b6c1-2d7f0a9e8c53";function Jt({sessionId:e,surface:t}={}){let n=re(e,256);return!n||!re(t,64)?null:zt(Tr,`${n}:${t}`)}var Nr=Array.from({length:11},(e,t)=>t/10);function Rr(e,t){if(!e.isIntersecting)return!1;let{intersectionRect:n,boundingClientRect:r,rootBounds:o}=e;if(!n||!r)return!0;let s=n.width*n.height,i=r.width*r.height,a=o?Math.min(i,o.width*o.height):i;return a>0&&s/a>=t}function X(e){let{selector:t,onViewable:n,visibleRatio:r=.5,dwellMs:o=1e3,root:s=document}=e,i=new Map,a=new WeakSet,u=new Set,d=h=>{i.has(h)||i.set(h,setTimeout(()=>{i.delete(h),n(h)&&(p?.unobserve(h),u.delete(h))},o))},f=h=>{clearTimeout(i.get(h)),i.delete(h)},p=typeof IntersectionObserver>"u"?null:new IntersectionObserver(h=>{for(let v of h){let S=v.target;if(!Rr(v,r)){u.delete(S),f(S);continue}u.add(S),g()&&d(S)}},{threshold:Nr}),g=()=>typeof document>"u"||document.visibilityState!=="hidden",x=()=>{if(g())for(let h of u)d(h);else for(let h of u)f(h)};document.addEventListener("visibilitychange",x);let w=()=>{for(let h of s.querySelectorAll(t))a.has(h)||(a.add(h),p?.observe(h))},b=typeof MutationObserver>"u"?null:new MutationObserver(()=>w()),k=()=>{w(),b?.observe(s===document?document.body:s,{childList:!0,subtree:!0})},E=s===document&&!document.body;return E?document.addEventListener("DOMContentLoaded",k,{once:!0}):k(),()=>{E&&document.removeEventListener("DOMContentLoaded",k),document.removeEventListener("visibilitychange",x),p?.disconnect(),b?.disconnect();for(let h of i.values())clearTimeout(h);i.clear(),u.clear()}}function et(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-exposure]",visibleRatio:r=.5,dwellMs:o=1e3,root:s=document}=t;return X({selector:n,root:s,visibleRatio:r,dwellMs:o,onViewable(i){let a=i.dataset?.hpExposure?.trim();return a&&e.surfaceViewed({surface:a}),!0}})}var Yt=e=>{try{return new URL(e,document.baseURI).toString()}catch{return e}};function tt(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-list]",tileSelector:r="[data-hp-product]",visibleRatio:o=.5,dwellMs:s=1e3,root:i=document}=t,a=new Set,u=w=>w.closest?.(n)??null,d=w=>{let b=w.dataset.hpList?.trim();return b?{list_id:b,category:w.dataset.hpListCategory?.trim()||null}:null},f=w=>Array.from(w.querySelectorAll(r)).filter(b=>u(b)===w),p=(w,b)=>{try{let k=JSON.parse(w.dataset.hpProduct??"");return!k||typeof k!="object"||!k.product_id?null:{...k,position:k.position??b+1,...k.url?{url:Yt(k.url)}:{},...k.image_url?{image_url:Yt(k.image_url)}:{}}}catch{return null}},g=X({selector:`${n} ${r}`,root:i,visibleRatio:o,dwellMs:s,onViewable(w){let b=u(w);if(!b||b.dataset.hpListView==="manual")return!0;let k=d(b);if(!k||a.has(k.list_id))return!0;let E=new Set,h=f(b).map(p).filter(v=>!v||E.has(v.product_id)?!1:(E.add(v.product_id),!0));return h.length===0||(a.add(k.list_id),e.productListViewed({...k,products:h})),!0}}),x=w=>{let k=w.target?.closest?.("a[href]")?.closest(r);if(!k)return;let E=u(k),h=p(k,E?f(E).indexOf(k):0);h&&e.productClicked({list_id:E?d(E)?.list_id??null:null,products:[h]})};return document.addEventListener("click",x,!0),()=>{document.removeEventListener("click",x,!0),g()}}function N(e,...t){let n=e.dataset??{};for(let r of t){let o=n[r];if(typeof o=="string"&&o.trim()!=="")return o.trim()}return null}function Le(e,...t){let n=N(e,...t);if(n===null)return null;let r=Number(n);return Number.isFinite(r)?Math.trunc(r):null}function Dr(e,t){let n=N(e,"hpPromotion");return n?{promotion_id:n,name:N(e,"hpPromotionName"),creative:N(e,"hpPromotionCreative"),position:N(e,"hpPromotionSlot")??String(t+1)}:null}function nt(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-promotion]",resolve:r=Dr,visibleRatio:o=.5,dwellMs:s=1e3,root:i=document}=t,a=new Set,u=p=>{let g=Array.from(i.querySelectorAll(n)),x=g.indexOf(p);try{return r(p,x<0?g.length:x)}catch{return null}},d=X({selector:n,root:i,visibleRatio:o,dwellMs:s,onViewable(p){let g=u(p);return!g||a.has(g.promotion_id)?!1:(a.add(g.promotion_id),e.promotionViewed(g),!0)}}),f=p=>{let g=p.target;if(!g||typeof g.closest!="function")return;let x=g.closest(n),w=g.closest("a[href]");if(!x||!w||!x.contains(w)&&!w.contains(x))return;let b=u(x);b&&e.promotionClicked({...b,href:w.getAttribute("href")})};return document.addEventListener("click",f,!0),()=>{document.removeEventListener("click",f,!0),d()}}function Mr(e){let t=N(e,"hpRecoRequest"),n=N(e,"hpRecoPlacement"),r=N(e,"hpRecoStrategy");if(!t||!n||!r)return null;let o=N(e,"hpRecoHoldout");return{recommendation_request_id:t,placement:n,strategy:r,recipe:N(e,"hpRecoRecipe"),algorithm_version:N(e,"hpRecoAlgorithmVersion"),experiment:N(e,"hpRecoExperiment"),variant:N(e,"hpRecoVariant"),holdout:o===null?null:o==="true",assignment_bucket:Le(e,"hpRecoBucket"),assignment_unit_kind:N(e,"hpRecoUnitKind"),candidate_set_fingerprint:N(e,"hpRecoFingerprint"),candidate_set_size:Le(e,"hpRecoCandidates"),ranked_by:N(e,"hpRecoRankedBy"),served_at:N(e,"hpRecoServedAt")}}function $r(e,t){let n=N(e,"hpRecoProduct");if(!n)return null;let r=N(e,"hpRecoPrice");return{product_id:n,sku:N(e,"hpRecoSku"),name:N(e,"hpRecoName"),brand:N(e,"hpRecoBrand"),price:r===null||Number.isNaN(Number(r))?null:Number(r),position:Le(e,"hpRecoPosition")??t+1}}function rt(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-reco-request]",tileSelector:r="[data-hp-reco-product]",resolveRail:o=Mr,resolveTile:s=$r,visibleRatio:i=.5,dwellMs:a=1e3,root:u=document}=t,d=new Set,f=new Map,p=new Map,g=(h,...v)=>{try{return h(...v)}catch{return null}},x=h=>typeof h.closest=="function"?h.closest(n):null,w=h=>Array.from(h.querySelectorAll(r)),b=(h,v)=>{if(p.delete(v.recommendation_request_id),d.has(v.recommendation_request_id))return;let S=w(h).map((_,L)=>g(s,_,L)).filter(_=>_?.product_id);if(S.length===0)return;d.add(v.recommendation_request_id);let y=[...f.get(v.recommendation_request_id)?.values()??[]].sort((_,L)=>_.position-L.position);e.recommendationsViewed({...v,products:S,viewable:y})},k=X({selector:`${n} ${r}`,root:u,visibleRatio:i,dwellMs:a,onViewable(h){let v=x(h);if(!v)return!0;let S=g(o,v);if(!S)return!0;let y=S.recommendation_request_id,_=g(s,h,w(v).indexOf(h));if(_?.product_id){f.has(y)||f.set(y,new Map);let L=f.get(y);L.has(_.position)||L.set(_.position,{position:_.position,product_id:_.product_id,viewable_at:new Date().toISOString()})}return!d.has(y)&&!p.has(y)&&p.set(y,setTimeout(()=>b(v,S),0)),!0}}),E=h=>{let v=h.target;if(!v||typeof v.closest!="function")return;let S=v.closest(r);if(!S)return;let y=v.closest("[data-hp-reco-interaction]"),_=v.closest("a[href]"),L=_&&(S.contains(_)||_.contains(S));if(!(y&&S.contains(y))&&!L)return;let R=x(S);if(!R)return;let H=g(o,R);if(!H)return;let K=g(s,S,w(R).indexOf(S));if(!K?.product_id)return;let B=H.recommendation_request_id;d.has(B)||(clearTimeout(p.get(B)),b(R,H)),e.productClicked({recommendation_request_id:H.recommendation_request_id,interaction:N(y??S,"hpRecoInteraction")??"navigate",products:[K]})};return document.addEventListener("click",E,!0),()=>{document.removeEventListener("click",E,!0);for(let h of p.values())clearTimeout(h);p.clear(),k()}}var pe=new Set(["home","list","product","search","basket","checkout","order_confirmation","login","register","account","info","blog","other"]),Ur=new Set(["products"]),Xt=e=>e==null;function ot(e,t=new WeakSet){if(e instanceof Date)return e.toJSON();if(e===null||typeof e!="object"||t.has(e))return e;t.add(e);let n=Array.isArray(e)?e.map(r=>ot(r,t)):Object.fromEntries(Object.entries(e).filter(([,r])=>!Xt(r)).map(([r,o])=>[r,ot(o,t)]));return t.delete(e),n}function st(e){if(!e)return e;let t=ot(e);for(let n of Ur)n in e&&Xt(e[n])&&(t[n]=e[n]);return t}function Zt(){try{let e=performance.getEntriesByType("navigation")[0];return e?["navigate","reload","back_forward","prerender"].includes(e.type)?e.type:"navigate":null}catch{return null}}var Vr=new Set(["","unknown","undefined","null","none","nil","nan","anonymous","guest","0","-1"]);function q(e){if(e==null)return null;let t=String(e).trim();return Vr.has(t.toLowerCase())?null:t}function Z(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}var Qt="1.16";function M(e){if(typeof document>"u")return null;try{let t=document.cookie.split(";").map(n=>n.trim()).find(n=>n.startsWith(`${e}=`));return t&&decodeURIComponent(t.slice(e.length+1))||null}catch{return null}}var Br={gclid:"gclid",fbclid:"fbclid",ttclid:"ttclid"},jr=/[a-z0-9._%+-]+@[a-z0-9-]+(\.[a-z0-9-]+)*\.[a-z]{2,}/i,qr=/\d(?:[ -]?\d){12,}/,Fr=new Set(["gclid","fbclid","ttclid","msclkid"]);function tn(e,t=""){if(typeof e!="string"||e==="")return!1;let n=[e];try{let o=decodeURIComponent(e.replace(/\+/g," "));o!==e&&n.push(o)}catch{}let r=!Fr.has(String(t).toLowerCase());return n.some(o=>jr.test(o)||r&&qr.test(o))}function Hr(e){if(!e)return null;let t=new URLSearchParams(e),n={},r={utm_source:"source",utm_medium:"medium",utm_campaign:"name",utm_term:"term",utm_content:"content"};for(let[o,s]of[...Object.entries(r),...Object.entries(Br)]){let i=t.get(o);i&&!tn(i,o)&&(n[s]=i)}return Object.keys(n).length?n:null}var Kr=["email","e-mail","password","pass","pwd","token","auth","code","uid","customer_id","postcode","zip","phone","applyCode"],Gr=["email","password","passwd","pwd","token","secret","auth","session","phone","postcode","zip","address","birth","card","cvv","iban","ssn","customerid","userid"],zr=["tel","uid","dob"],Wr=["utm_source","utm_medium","utm_campaign","utm_term","utm_content","gclid","fbclid","ttclid","msclkid"],Jr=new Set(Kr.map(e=>e.toLowerCase()));function Yr(e){let t=String(e).toLowerCase();if(Jr.has(t))return!0;let n=t.replace(/[-_.]/g,"");return Gr.some(o=>n.includes(o))?!0:String(e).replace(/([a-z0-9])([A-Z])/g,"$1 $2").toLowerCase().split(/[^a-z0-9]+/).some(o=>zr.includes(o))}function it(e){return(e??[]).map(t=>{try{return new RegExp(`^${t}$`,"i")}catch{return{test:n=>n.toLowerCase()===String(t).toLowerCase()}}})}function nn(e,t={}){if(!e)return null;try{let n=new URLSearchParams(e),r=t.queryParamAllowlist?it([...t.queryParamAllowlist,...Wr]):null,o=it(t.queryParamBlocklist),s=it(t.sensitiveParamAllowlist);for(let a of new Set(n.keys()))(Yr(a)&&!s.some(d=>d.test(a))||n.getAll(a).some(d=>tn(d,a))||(r?!r.some(d=>d.test(a)):o.some(d=>d.test(a))))&&n.delete(a);let i=n.toString();return i?`?${i}`:""}catch{return""}}function rn(e,t,n={}){if(!e)return null;try{let r=new URL(e);return t&&r.origin===t?r.origin+r.pathname+(nn(r.search,n)??""):r.origin+r.pathname}catch{return null}}function on(e,t={}){if(typeof e!="string"||typeof location>"u")return null;try{let n=new URL(e,location.href);return n.protocol!=="https:"&&n.protocol!=="http:"?null:rn(n.href,location.origin,t)}catch{return null}}function at(e){if(typeof e!="string")return null;let t=e.trim().toUpperCase();return/^[A-Z]{3}$/.test(t)?t:null}function en(e){if(typeof e!="string")return null;let t=e.trim().toUpperCase();return/^[A-Z]{2}$/.test(t)?t:null}function Xr(e){if(typeof e!="string")return null;let t=e.trim().replace(/_/g,"-");if(!/^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$/.test(t))return null;try{return Intl.getCanonicalLocales(t)[0]}catch{return null}}function D(e,t){if(typeof e=="function")try{let n=e();if(n!=null)return n}catch{}return t}function Zr(e){return{property_id:String(e.propertyId),channel:e.channel??null,market:e.market??null,environment:e.environment??null}}function Qr(e){let t=typeof window<"u"?window.location:null,n=t?nn(t.search,e):null;return{url:t?t.origin+t.pathname+(n??""):e.pageUrl??null,path:t?t.pathname:e.pagePath??null,search:n??null,referrer:typeof document<"u"?rn(document.referrer,t?.origin,e):null,title:typeof document<"u"&&document.title||null,type:e.pageType??null}}function sn(e,t={}){let n=typeof window<"u"?window.location:null,r={library:{name:e.libraryName,version:e.libraryVersion},spec:{version:Qt},source:Zr(e),session_id:D(e.getSessionId,null),identity_trust:q(D(e.getAnonymousId,null))?"device":"none",page:Qr(e),campaign:n?Hr(n.search):null,device:{user_agent:typeof navigator<"u"?navigator.userAgent:null,type:null,viewport_width:typeof window<"u"?window.innerWidth:null,viewport_height:typeof window<"u"?window.innerHeight:null},currency:at(D(e.getCurrency,e.currency)),locale:Xr(D(e.getLocale,e.locale)),timezone:(()=>{try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return null}})(),country:en(e.country),ship_to_country:en(D(e.getShipToCountry,e.shipToCountry)),ip:null,bot:null,consent:e.getConsent?.()??null,experiments:D(e.getExperiments,null),audiences:D(e.getAudiences,null),decisions:D(e.getDecisions,null),recommendations:D(e.getRecommendations,null),extensions:D(e.getExtensions,null)};return an(r,t)}function an(e,t){if(!t)return e;let n={...e};for(let[r,o]of Object.entries(t))o&&typeof o=="object"&&!Array.isArray(o)&&e[r]&&typeof e[r]=="object"&&!Array.isArray(e[r])?n[r]=an(e[r],o):o!==void 0&&(n[r]=o);return n}var ie=Object.freeze({consent:"thg_hp_consent",retry:"thg_hp_retry",sessionSignals:"thg_hp_session_signals",identified:"thg_hp_identified",previousPage:"thg_hp_prev_page",decisions:"thg_hp_decisions",settings:"thg_hp_settings",held:"thg_hp_held",carried:"thg_hp_carried",recommendationContext:"thg_hp_recommendation_context",anonymousId:"thg_hp_anonymous_id",session:"thg_hp_session",preview:"thg_hp_preview",debug:"thg_hp_debug"}),eo={retry:"cdp.retry",sessionSignals:"cdp_session_signals",identified:"cdp_identified",previousPage:"cdp_prev_page_message_id"},ct={...ie},cn=!1;function Te(e){let t={...ie};for(let[n,r]of Object.entries(e??{})){if(!(n in ie))throw new Error(`storageNames: unknown kind "${n}"`);if(typeof r!="string"||!/^[\w.-]+$/.test(r))throw new Error(`storageNames.${n} must be a non-empty cookie-safe name`);t[n]=r}ct=t}function T(e){return ct[e]}var to="_",un=e=>e==null||e===""?to:String(e);function F(e,t,n){let r=`${e}:${un(t)}`;return n==null||n===""?r:`${r}:${n}`}function ln(e,t){return`${e}:${un(t)}:`}function Ne(){if(!cn){cn=!0;for(let e of[()=>localStorage,()=>sessionStorage]){let t;try{if(t=e(),!t)continue;for(let n of Object.keys(t))for(let[r,o]of Object.entries(eo)){if(n!==o&&!n.startsWith(`${o}:`))continue;let s=ct[r]+n.slice(o.length);t.getItem(s)===null&&t.setItem(s,t.getItem(n)),t.removeItem(n)}}catch{}}}}var lt=1800*1e3,Re=()=>{try{return typeof sessionStorage>"u"?null:sessionStorage}catch{return null}},ut=()=>{try{return typeof localStorage>"u"?null:localStorage}catch{return null}};function dn(e,t=()=>Date.now()){return{read(){try{let n=Re()?.getItem(e),r=n?JSON.parse(n):null;return!r||t()-r.savedAt>lt?(r&&Re()?.removeItem(e),{items:[],anonymousId:null}):{items:Array.isArray(r.items)?r.items:[],anonymousId:typeof r.anonymousId=="string"?r.anonymousId:null}}catch{return{items:[],anonymousId:null}}},write(n,r=null){try{n.length===0?Re()?.removeItem(e):Re()?.setItem(e,JSON.stringify({savedAt:t(),items:n,anonymousId:r}))}catch{}}}}var no=400*24*60*60;function Q(e,t,n,r){if(typeof document>"u")return!1;try{let o=typeof location<"u"&&location.protocol==="https:"?"; Secure":"",s=r?`; Domain=${r}`:"",i=n===null?"":`; Max-Age=${n}`;return document.cookie=`${e}=${encodeURIComponent(t)}; Path=/${i}; SameSite=Lax`+s+o,!0}catch{return!1}}function ro({name:e,domain:t=null,legacyKey:n,read:r,mint:o,mayStore:s,carried:i=null}){let a=null;try{a=ut()?.getItem(n)||null}catch{a=null}let u=r(e)??a??i,d=!1,f=()=>{if(!(d||u===null||!s())&&(d=Q(e,u,no,t),!(!d||a===null)))try{ut()?.removeItem(n),a=null}catch{}};return{get(){return u??(u=o()),f(),u},peek:()=>u,persist:f,forget(){Q(e,"",0,t),u=null,d=!1;try{ut()?.removeItem(n)}catch{}a=null}}}function fn(e,{carried:t=null,mayStore:n,orOwn:r=!1}){let o=e.anonymousIdSource,s=()=>ro({name:T("anonymousId"),domain:e.consentCookieDomain??null,legacyKey:F(T("anonymousId"),e.propertyId),read:M,mint:Z,mayStore:n,carried:t});if(o?.source==="hp_cookie"){let u=s();return e.getAnonymousId=()=>u.get(),u}if(o?.source==="site_cookie"&&o.cookie){let u=o.cookie;e.getAnonymousId=()=>M(u)}if(!r)return null;let i=e.getAnonymousId,a=s();return e.getAnonymousId=()=>q(D(i,null))??a.get(),a}var oo=200;function pn(e,t,n=()=>Date.now()){let r=()=>F(T("carried"),e),o=!1;function s(){try{let i=JSON.parse(sessionStorage.getItem(r())??"null");return!i||!(n()-i.savedAt<=lt)?[]:Array.isArray(i.calls)?i.calls:[]}catch{return[]}}return{take(){let i=s();try{sessionStorage.removeItem(r())}catch{}return i},save(i){try{return o||!t()?!1:(sessionStorage.setItem(r(),JSON.stringify({savedAt:n(),calls:[...s(),...i].slice(-oo)})),!0)}catch{return!1}},close(){o=!0}}}var wi=ie.consent,De=Object.freeze({visitor:"visitor",host:"host"}),mn=()=>({basis:De.host}),so="hp-consent",ae=["analytics","marketing","personalisation","ad_user_data","ad_personalization"],hn={analytics:"a",marketing:"m",personalisation:"p",ad_user_data:"aud",ad_personalization:"adp"},Y=()=>typeof window<"u",gn=()=>Y()&&typeof window.cookieStore?.addEventListener=="function",io=e=>e===!0?!0:e===!1?!1:null;function me(e){if(!e||typeof e!="object")return null;let t={};for(let n of ae)t[n]=io(e[n]);return t}function ft(e,t){return!e||!t?e===t:ae.every(n=>e[n]===t[n])}function pt(e){if(!e)return"";let t=[];for(let n of ae){let r=e[n];(r===!0||r===!1)&&t.push(`${hn[n]}=${r?1:0}`)}return t.join("&")}function yn(e){return{[so]:pt(me(e))}}function _e(e){let t=me({});if(e==null)return t;let n=String(e).trim();if(n.length>=2&&n.startsWith('"')&&n.endsWith('"')&&(n=n.slice(1,-1)),n.includes("%"))try{n=decodeURIComponent(n.replace(/\+/g," "))}catch{return t}let r=Object.fromEntries(Object.entries(hn).map(([s,i])=>[i,s])),o=new Set;for(let s of n.split("&")){let i=s.indexOf("=");if(i<=0)continue;let a=r[s.slice(0,i).trim()],u={1:!0,0:!1}[s.slice(i+1).trim()]??null;!a||u===null||o.has(a)||(t[a]===null?t[a]=u:t[a]!==u&&(t[a]=null,o.add(a)))}return t}function mt(e,t){if(!t)return e;let n=r=>{if(!r)return r;let o={...r};for(let s of ae)s!=="analytics"&&t[s]!==!0&&(o[s]=null);return o};return{name:e.name,basis:e.basis,read:()=>n(e.read()),subscribe:r=>e.subscribe(o=>r(n(o))),get observesChanges(){return e.observesChanges}}}function ht(e,t={}){return{...e,ad_user_data:t.ad_user_data??e.marketing,ad_personalization:t.ad_personalization??e.marketing}}function Me(e,t){let n=!0;return{notify:()=>{if(n)try{let o=e();o&&t(o)}catch{}},stop:()=>n=!1}}var ao={analytics:["analytics","measure_content_performance","audience_measurement"],marketing:["marketing","targeting","advertising","select_personalized_ads","create_ads_profile"],personalisation:["personalisation","personalization","select_personalized_content","create_content_profile"]};function co(e,t){if(!t?.length)return null;let n=!1;for(let[r,o]of Object.entries(e)){let s=String(o?.id??r).toLowerCase();if(t.some(a=>{let u=String(a).toLowerCase();return s===u||s.startsWith(`${u}-`)})&&(n=!0,o?.enabled===!0))return!0}return n?!1:null}function wn(e={}){let t={...ao,...e.purposes};function n(){let r=Y()?window.Didomi:void 0;if(!r?.getCurrentUserStatus||r.shouldUserStatusBeCollected?.()!==!1||r.isUserStatusPartial?.()===!0)return null;let o=r.getCurrentUserStatus()?.purposes;if(!o||typeof o!="object")return null;let s=i=>co(o,t[i]);return ht({analytics:s("analytics"),marketing:s("marketing"),personalisation:s("personalisation")},{ad_user_data:s("ad_user_data"),ad_personalization:s("ad_personalization")})}return{name:"didomi",read:n,observesChanges:!0,subscribe(r){if(!Y())return()=>{};let o=Me(n,r),s={event:"consent.changed",listener:o.notify};return window.didomiEventListeners=window.didomiEventListeners||[],window.didomiEventListeners.push(s),window.didomiOnReady=window.didomiOnReady||[],window.didomiOnReady.push(i=>{o.notify(),(i??window.Didomi)?.on?.("consent.changed",o.notify)}),window.Didomi?.on?.("consent.changed",o.notify),o.stop}}}function dt(e){let t={};if(!e)return t;for(let n of String(e).split("&")){let r=n.indexOf("=");if(r<=0)continue;let o=n.slice(r+1).replace(/\+/g," ");try{o=decodeURIComponent(o)}catch{}t[n.slice(0,r)]=o}return t}function Sn(e={}){let t={analytics:"C0002",personalisation:"C0003",marketing:"C0004",...e.groups},n=e.impliedConsent===!0;function r(){let i=dt(M("OptanonConsent"));if(i.groups){let d={};for(let f of i.groups.split(",")){let[p,g]=f.split(":");p?.trim()&&(d[p.trim()]=g==="1"?!0:g==="0"?!1:null)}return f=>d[f]??!1}let a=Y()?window.OnetrustActiveGroups:void 0;if(typeof a!="string"||!a.length)return null;let u=new Set(a.split(",").map(d=>d.trim()).filter(Boolean));return d=>u.has(d)}function o(){if(M("OptanonAlertBoxClosed"))return!0;try{if(Y()&&window.OneTrust?.IsAlertBoxClosed?.()===!0)return!0}catch{}return Number.parseInt(dt(M("OptanonConsent")).interactionCount,10)>0?!0:n&&Y()&&(!!window.OneTrust||typeof window.OnetrustActiveGroups=="string")}function s(){if(!o())return null;let i=r();if(!i)return null;let a=p=>t[p]?i(t[p]):null,u=ht({analytics:a("analytics"),marketing:a("marketing"),personalisation:a("personalisation")},{ad_user_data:a("ad_user_data"),ad_personalization:a("ad_personalization")}),d=dt(M("OptanonConsent"));return(typeof navigator<"u"&&navigator.globalPrivacyControl===!0||d.isGpcEnabled==="1")&&(u.marketing=!1,u.ad_user_data=!1,u.ad_personalization=!1),u}return{name:"onetrust",read:s,observesChanges:!0,subscribe(i){if(!Y())return()=>{};let a=Me(s,i),u=!1,d=()=>{u||!window.OneTrust?.OnConsentChanged||(u=!0,window.OneTrust.OnConsentChanged(a.notify))};window.addEventListener("OneTrustGroupsUpdated",a.notify);let f=window.OptanonWrapper;return window.OptanonWrapper=function(...g){try{typeof f=="function"&&f.apply(this,g)}finally{d(),a.notify()}},d(),()=>{a.stop(),window.removeEventListener("OneTrustGroupsUpdated",a.notify)}}}}function uo(e){let t=String(e).split(",").map(n=>n.trim()).filter(Boolean);return t.length?new Set(t):null}function _n(e){let{name:t,categories:n,parse:r=uo,refusedValue:o,source:s="native",changeEvent:i="thg_hp_consent_change"}=e??{};if(typeof t!="string"||t==="")throw new Error("cookieConsent: `name` (the cookie your banner writes) is required");if(!n||typeof n.analytics!="string")throw new Error("cookieConsent: `categories.analytics` (the category id that grants analytics) is required");function a(){let u=M(t);if(u==null)return null;let d;if(o!==void 0&&u===o)d=new Set;else try{d=r(u)}catch{d=null}if(!(d instanceof Set))return null;let f=p=>n[p]?d.has(n[p]):null;return ht({analytics:f("analytics"),marketing:f("marketing"),personalisation:f("personalisation")},{ad_user_data:f("ad_user_data"),ad_personalization:f("ad_personalization")})}return{name:s,read:a,get observesChanges(){return gn()},subscribe(u){if(!Y())return()=>{};let d=Me(a,u),f=p=>{[...p.changed??[],...p.deleted??[]].some(x=>x?.name===t)&&d.notify()};return window.addEventListener(i,d.notify),window.cookieStore?.addEventListener?.("change",f),()=>{d.stop(),window.removeEventListener(i,d.notify),window.cookieStore?.removeEventListener?.("change",f)}}}}function bn(e={}){let t=e.name??T("consent"),n=()=>{let r=M(t);if(r==null)return null;let o=_e(r);return o.analytics==null?null:o};return{name:"forwarded",read:n,get observesChanges(){return gn()},subscribe(r){if(!Y())return()=>{};let o=Me(n,r),s=i=>{[...i.changed??[],...i.deleted??[]].some(u=>u?.name===t)&&o.notify()};return window.cookieStore?.addEventListener?.("change",s),()=>{o.stop(),window.cookieStore?.removeEventListener?.("change",s)}}}}function xn(e){let t=me(e);return{name:"static",basis:De.host,read:()=>t?{...t}:null,observesChanges:!0,subscribe:()=>()=>{}}}function In(e){if(e==null)return null;let t=String(e).split("/").map(n=>n.trim()).filter(Boolean).join("/");return t===""?null:t}function lo(e){let t=e.item_category;if(t!=null&&String(t).includes("/"))return In(t);let n=[t,e.item_category2,e.item_category3,e.item_category4,e.item_category5].map(r=>r==null?"":String(r).trim()).filter(Boolean);return In(n.join("/"))}var fo=e=>{if(e==null||typeof e=="object")return null;let t=String(e).trim();return t===""?null:t};function po(...e){for(let t of e){if(typeof t=="number"&&Number.isFinite(t))return String(t);if(typeof t=="string"&&t.trim()!=="")return t.trim()}return null}var $e=e=>po(e.item_group_id,e.item_id);function mo(e,t=$e){if(!e)return null;let n=a=>a==null||a===""||Number.isNaN(Number(a))?null:Number(a),r=a=>{let u=n(a);return u==null?null:Math.round(u*1e6)/1e6},o=a=>{let u=r(a);return u!=null&&u>=0?u:null},s=a=>{let u=n(a);return Number.isInteger(u)&&u>=0?u:null},i=fo;return{product_id:i(t(e)),sku:i(e.item_id),name:i(e.item_name),brand:i(e.item_brand),variant:i(e.item_variant)??i(e.variant),category:lo(e),price:r(e.price),discount:o(e.discount),quantity:s(e.quantity),coupon:i(e.coupon),position:s(e.index)!=null?s(e.index)+1:null,url:i(e.url)??i(e.item_url)??null,image_url:i(e.image_url)??i(e.image_link)??null,displayed_sku:i(e.displayed_sku)??i(e.displayed_variant_sku)}}function gt(e,t=$e){return(e??[]).map(n=>mo(n,t)).filter(n=>n?.product_id)}var ho=1e3,go={shipping:2,payment:3},yo=new Set(["password","google","apple","facebook","magic_link","sso","passkey","other"]),$=e=>{if(e==null||typeof e=="object")return null;let t=String(e).trim();return t===""?null:t},wo=e=>{if(e==null||e===""||typeof e=="object")return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null},Ue=e=>e!==null&&typeof e=="object";function So(e){return Array.isArray(e.items)?e.items.filter(Ue):null}function kn(e){let t=$(e)?.toLowerCase().replace(/[\s-]+/g,"_");return t?yo.has(t)?t:t==="email"||t==="email_password"?"password":"other":null}function _o({ecommerce:e,items:t}){let n=s=>({promotion_id:$(s.promotion_id),name:$(s.promotion_name),creative:$(s.creative_name),position:$(s.creative_slot)}),r=new Set,o=[];for(let s of[n(e),...t.map(n)])!s.promotion_id||r.has(s.promotion_id)||(r.add(s.promotion_id),o.push(s));return o}var An=({ecommerce:e,items:t})=>$(e.item_list_id)??$(e.item_list_name)??$(t[0]?.item_list_id)??$(t[0]?.item_list_name),ce=(e,t)=>t.products?.length?{event:e,properties:t}:null,bo=new Set(["product","products","item","items"]);function xo({ecommerce:e}){let t=$(e.item_id),n=$(e.content_type)?.toLowerCase();return!t||n&&!bo.has(n)?null:{event:"Product Shared",properties:{share_via:$(e.method),products:[{product_id:t}]}}}function Io(e){let t=o=>ce("Product List Viewed",{list_id:An(o),products:o.products}),n=o=>{let s=$(o.ecommerce.search_term);return s?{event:"Products Searched",properties:{query:s,...o.products.length?{products:o.products}:{}}}:null},r=o=>s=>s.promotions.map(i=>({event:o,properties:i}));return{view_item:o=>ce("Product Viewed",{currency:o.currency,value:o.value,products:o.products.slice(0,1)}),view_item_list:t,view_search_results:o=>n(o)??t(o),search:n,select_item:o=>ce("Product Clicked",{list_id:An(o),products:o.products.slice(0,1)}),add_to_cart:o=>ce("Product Added",{cart_id:$(o.ecommerce.cart_id),products:o.products}),remove_from_cart:o=>ce("Product Removed",{cart_id:$(o.ecommerce.cart_id),products:o.products}),view_cart:o=>({event:"Cart Viewed",properties:{cart_id:$(o.ecommerce.cart_id),value:o.value,currency:o.currency,coupon:$(o.ecommerce.coupon),...o.itemsListed?{products:o.products}:{}}}),begin_checkout:o=>ce("Checkout Started",{value:o.value,currency:o.currency,coupon:$(o.ecommerce.coupon),products:o.products}),add_shipping_info:o=>({event:"Checkout Step Completed",properties:{step:e.shipping,step_name:"shipping",shipping_method:$(o.ecommerce.shipping_tier)}}),add_payment_info:o=>({event:"Payment Info Entered",properties:{step:e.payment,step_name:"payment",payment_method:$(o.ecommerce.payment_type)}}),view_promotion:r("Promotion Viewed"),select_promotion:r("Promotion Clicked"),add_to_wishlist:o=>ce("Product Added to Wishlist",{products:o.products}),share:xo,login:o=>({event:"Signed In",properties:{method:kn(o.ecommerce.method)}}),sign_up:o=>({event:"Signed Up",properties:{method:kn(o.ecommerce.method)}})}}var ko=e=>e.event;function Ao(e,t){if(!Ue(e))return null;if(typeof e.length=="number"&&e[0]==="event"&&typeof e[1]=="string"){let r=Ue(e[2])?e[2]:{};return{name:e[1],entry:r,ecommerce:r}}let n=$(t(e));return n?{name:n,entry:e,ecommerce:Ue(e.ecommerce)?e.ecommerce:e}:null}function yt(e){return Array.isArray(e)?`[${e.map(yt).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${yt(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function En(e,t={}){if(!e||typeof e.track!="function")throw new Error("connectDataLayer: analytics must have a track(event, properties, options) method");let n=t.dataLayer??(typeof window<"u"?window.dataLayer=window.dataLayer||[]:null);if(!Array.isArray(n))return()=>{};let r=Io({...go,...t.steps}),o=t.map??{},s=t.eventName??ko,i=t.productId??$e,a=new Set(["purchase","refund",...t.ignore??[]]),u=t.dedupeMs??ho,d=new Map,f=!0;function p(S,y,_){if(u<=0)return!1;let L=`${S}|${_??""}|${yt(y)}`,R=Date.now();for(let[H,K]of d)R-K>u&&d.delete(H);return d.has(L)?!0:(d.set(L,R),!1)}let g=null,x=new Set;function w(S,y){if(S!=="Product Viewed")return!1;let _=typeof location>"u"?"":location.pathname;_!==g&&(g=_,x.clear());let L=y.products?.[0]?.product_id;return L?x.has(L)?!0:(x.add(L),!1):!1}function b({event:S,properties:y={}},_){if(!S||p(S,y,_)||w(S,y))return;let L=_?{context:{currency:_}}:void 0;if(S==="Signed Out"&&typeof e.signedOut=="function"){e.signedOut(L);return}e.track(S,y,L)}function k(S){let y=t.transform?t.transform(S):S,_=Ao(y,s);if(!_||a.has(_.name))return;let L=Object.hasOwn(o,_.name),R=L?o[_.name]:r[_.name];if(typeof R!="function")return;let H=So(_.ecommerce),K=H??[],B={..._,items:K,itemsListed:H!==null,products:gt(K,i),currency:at(_.ecommerce.currency),value:wo(_.ecommerce.value)};B.promotions=_o(B);let te=L?R(y,{...B,toProducts:z=>gt(z,i)}):R(B);for(let z of[te].flat())z&&b(z,B.currency)}function E(S){if(f)try{k(S)}catch(y){try{t.onError?.(y,S)}catch{}}}for(let S of n.slice())E(S);let h=n.push;function v(...S){let y=h.apply(this,S);for(let _ of S)E(_);return y}return n.push=v,()=>{f=!1,n.push===v&&(n.push=h)}}var Eo="hp_debug",vo=256;function Co(){try{return new URLSearchParams(location.search).get(Eo)}catch{return null}}function vn(e,t){if(typeof location>"u")return!1;try{let n=Co();if(n!==null){let o=n.trim();o===""||o.length>vo?sessionStorage.removeItem(t):sessionStorage.setItem(t,o)}let r=sessionStorage.getItem(t);return!!(e&&r&&Kt(r)===e)}catch{return!1}}var he=class extends Error{},Po={inHoldout:()=>!0,personalisationGroup:()=>"excluded",servingHeaders:()=>({}),recommendationContext:()=>({}),flush:()=>Promise.resolve(),reset:()=>{}};function wt(e,t){let n=Po[e]??(()=>null),r=o=>(console.warn(`[hp] ${String(e)} failed; nothing was sent`,o),n());return function(...s){try{let i=t.apply(this,s);return typeof i?.then=="function"?Promise.resolve(i).catch(r):i}catch(i){if(i instanceof he)throw i;return r(i)}}}function Cn(e){for(let t of Reflect.ownKeys(e)){let{value:n}=Object.getOwnPropertyDescriptor(e,t)??{};typeof n=="function"&&(e[t]=wt(t,n))}return e}var be=Symbol("hp.identityOption");var Oo=4320*60*60,Lo=100,To=1e3,No=2e3,Pn=500,Ve=e=>(e?.unref?.(),e);function Ro(e,t){if(t?.analytics===!0&&e.analytics===!1)return"withdrawn";let n=ae.map(r=>e[r]).filter(r=>r!==null);return n.length&&n.every(Boolean)?"accept_all":n.length&&n.every(r=>!r)?"reject_all":"custom"}function Do(e,t,n=T("consent")){if(!(typeof document>"u"))try{let r=typeof location<"u"&&location.protocol==="https:"?"; Secure":"",o=t?`; Domain=${t}`:"";document.cookie=`${n}=${pt(e)}; Path=/; Max-Age=${Oo}; SameSite=Lax`+o+r}catch{}}function Mo(e){let t=_e(M(e));return ae.some(n=>t[n]!==null)?t:null}function On(e){let{adapter:t,timeoutMs:n=5e3,cookieDomain:r=null,cookieName:o=T("consent"),release:s,announce:i}=e,a=e.discard??(()=>{}),u="pending",d=null,f=null,p=null,g=null,x=!1,w=null,b=[],k=m=>{u=m,e.onStatus?.(m)};function E(){try{return me(t.read())}catch{return null}}function h(){f&&clearInterval(f),p&&clearTimeout(p),f=null,p=null}let v=()=>typeof window<"u"&&typeof document<"u",S=()=>{try{return typeof t.subscribe=="function"&&t.observesChanges===!0}catch{return!1}};function y(){g&&clearInterval(g),g=null}function _(){x||g||d===null||S()||v()&&document.visibilityState==="hidden"||(g=Ve(setInterval(()=>B(E()),No)))}let L=()=>u==="pending"||u==="unknown",R=e.store??null,H=()=>{let m=b.splice(0);R?.write([]);for(let j of m)s(j)},K=()=>{let m=b.splice(0);R?.write([]);for(let j of m)a(j)};function B(m){let j=me(m);if(!j||j.analytics===null)return;let ve=d===null,J=ve?Mo(o):d;if(!ve&&ft(J,j))return;h(),d=j,_(),Do(j,r,o);let Ce=!ft(J,j);if(j.analytics){k("granted"),H(),Ce&&i({action:Ro(j,J),state:j,previous:J,withdrawal:!1});return}K(),J?.analytics===!0&&i({action:"withdrawn",state:j,previous:J,withdrawal:!0}),k("denied")}function te(){p=null,u==="pending"&&(k("unknown"),f&&clearInterval(f),f=Ve(setInterval(()=>B(E()),To)))}function z(m){L()&&(R||m?.type!=="visibilitychange"&&!m?.persisted&&K())}let ne=m=>{document.visibilityState==="hidden"?(y(),z(m)):_()},de=m=>{y(),z(m)},Ee=m=>{m?.persisted&&d!==null&&B(E()),_()};return{get status(){return u},get state(){return d?{...d}:null},stamp(){return d?{...d,source:t.name??null,basis:t.basis??De.visitor}:null},admits(){return u==="granted"},hold(m){return!L()||b.length>=Pn?(a(m),!1):(b.push(m),R?.write(b),!0)},onHidden:z,start(){x=!1;try{w=t.subscribe?.(m=>B(m))??null}catch(m){e.debug&&console.warn("[hp] consent adapter subscribe failed",m)}v()&&(window.addEventListener("pagehide",de),window.addEventListener("pageshow",Ee),document.addEventListener("visibilitychange",ne)),R&&b.length===0&&b.push(...R.read().slice(-Pn)),B(E()),!d&&(f=Ve(setInterval(()=>B(E()),Lo)),p=Ve(setTimeout(te,n)))},stop(){x=!0,h(),y(),typeof w=="function"&&w(),v()&&(window.removeEventListener("pagehide",de),window.removeEventListener("pageshow",Ee),document.removeEventListener("visibilitychange",ne))}}}var $o=["recommendation","search_rank","banner","offer","layout","copy","price","other"],Be=e=>typeof e=="string"&&e!=="";function Ln(e){return(Array.isArray(e?.decisions)?e.decisions:[]).filter(t=>Be(t?.slot)&&Be(t.decision_id)&&t.holdout!==!0).map(({decision_id:t,slot:n,arm:r,kind:o})=>({decision_id:t,slot:n,...Be(r)&&{arm:r},...$o.includes(o)&&{kind:o}}))}function Tn({key:e,mayStore:t}){let n,r=()=>{if(n)return n;try{let s=JSON.parse(sessionStorage.getItem(e));n=Array.isArray(s)?s.filter(i=>Be(i?.slot)):[]}catch{n=[]}return n},o=()=>{try{n?.length&&t()&&sessionStorage.setItem(e,JSON.stringify(n))}catch{}};return{persist:o,current:()=>r().length?n.map(s=>({...s})):null,remember(s){if(!s.length)return;let i=new Set(s.map(a=>a.slot));n=[...r().filter(a=>!i.has(a.slot)),...s],o()},forget(){n=[];try{sessionStorage.removeItem(e)}catch{}}}}function Uo(e){let t=2166136261,n=String(e);for(let r=0;r<n.length;r+=1)t^=n.charCodeAt(r),t=t+((t<<1)+(t<<4)+(t<<7)+(t<<8)+(t<<24))>>>0;return t^=t>>>16,t=Math.imul(t,2246822507)>>>0,t^=t>>>13,t=Math.imul(t,3266489909)>>>0,t^=t>>>16,t>>>0}function je(e,t,n=1e4){return Uo(`${t}\0${e}`)%n}function St(e){let t=o=>Math.min(Math.max(Number(o)||0,0),1),n=t(e.share),r=1-n;return{holdout_share:n,personalised_share:e.ramp==null?r:Math.min(t(e.ramp),r)}}function _t(e,t){if(!e||typeof e.salt!="string")return{holdout:!1,bucket:null,group:"personalised"};let n=e.ramp!=null;if(t==null||t==="")return{holdout:!1,bucket:null,group:n?"excluded":"personalised"};let{holdout_share:r,personalised_share:o}=St(e),s=je(t,e.salt),i=u=>Math.round(u*1e4),a=r>0&&s<i(r)?"holdout":!n||s<i(r+o)?"personalised":"excluded";return{holdout:a==="holdout",bucket:s,group:a}}function Nn(e,t){return typeof e!="string"||e===""||t==null||t===""?null:je(t,`bandit-vs-default:${e}`)<1e4/2?"default":"bandit"}var Vo="hp_preview",Bo=256;function Rn(e,t=null){if(typeof location>"u")return M(e);let n=null;try{n=new URLSearchParams(location.search).get(Vo)}catch{n=null}if(n===null)return M(e);let r=n.trim();return r===""||r.length>Bo?(Q(e,"",0,t),null):(Q(e,r,null,t),r)}var jo=40,qo=128,Fo=5,Ho=60,Mn=e=>typeof e=="string"&&e!==""&&e.length<=qo&&!e.includes(","),Dn=e=>Array.isArray(e)?e.filter(Mn).slice(0,jo):[],Ko=e=>Array.isArray(e)?e.filter(t=>typeof t=="string").map(t=>t.replaceAll(","," ").trim()).filter(t=>t!=="").slice(0,Fo):[],Go=e=>Object.entries(e&&typeof e=="object"?e:{}).filter(([t,n])=>Mn(t)&&Number.isFinite(n)&&n>=1).sort(([,t],[,n])=>n-t).slice(0,Ho).map(([t,n])=>`${t}:${Math.floor(n)}`);function bt(e){let t={},n={viewed:Dn(e?.recentProducts),basket:Dn(e?.basketProducts),q:Ko(e?.recentSearches),impressed:Go(e?.impressions)};for(let[r,o]of Object.entries(n))o.length>0&&(t[r]=o.join(","));return t}var zo=1800*1e3;function $n(e,t=Date.now()){try{localStorage.setItem(T("recommendationContext"),JSON.stringify({context:e,until:t+zo}))}catch{}}function Un(){try{localStorage.removeItem(T("recommendationContext"))}catch{}}var Wo="hp_sample",Vn=1e4;function Bn(e,t){return!(typeof t=="number"&&t<1)||e==null||e===""?!0:je(e,Wo,Vn)<Math.round(t*Vn)}function ge(e){return e.trim().toLowerCase().replace(/\s*\/\s*/g,"/").replace(/^\/+|\/+$/g,"")}var Jo=2,Yo=12;function xe(e,t=Jo){return e.split("/").slice(0,t).join("/")}function xt(e,t){if(typeof t!="string"||!t.trim())return null;let n=xe(ge(t));return n?(e.unshift(n),e.length=Math.min(e.length,Yo),n):null}var ue=()=>T("sessionSignals"),ye=null,It=()=>ye??ue();function jn(){try{return ye?localStorage:sessionStorage}catch{return}}function qn(e,t){let n=t==null?null:String(t),r=e?F(ue(),n,e):null;if(r===ye)return;let o=ye===null?Xo():null;if(ye=r,!!ye)try{let s=It(),i=ln(ue(),n);for(let a of Object.keys(localStorage))a.startsWith(i)&&a!==s&&localStorage.removeItem(a);o&&!localStorage.getItem(s)&&(localStorage.setItem(s,JSON.stringify(o)),sessionStorage.removeItem(ue()))}catch{}}function Xo(){try{let e=sessionStorage.getItem(ue());if(!e)return null;let t=JSON.parse(e);return t&&(t.productViews>0||t.listViews>0||t.basketValue!=null||t.recentProducts?.length||t.recentBrowse?.length)?t:null}catch{return null}}function qe(){return{productViews:0,listViews:0,cartAdds:0,searches:0,recentProducts:[],recentCategories:[],recentBrowse:[],basketProducts:[],basketValue:null,recentSearches:[],impressions:{},browsingCategory:null,recentBrowseCategories:[],browsingListing:null,listViewsByCategory:{},startedAt:0}}function kt(){let e=jn();if(!e)return qe();try{let t=e.getItem(It());return t?{...qe(),...JSON.parse(t)}:{...qe(),startedAt:Date.now()}}catch{return{...qe(),startedAt:Date.now()}}}function At(e){let t=jn();if(t)try{t.setItem(It(),JSON.stringify(e))}catch{}}function Fn(){return kt()}function Hn(){for(let e of[()=>sessionStorage,()=>localStorage])try{let t=e();t.removeItem(ue());for(let n of Object.keys(t))n.startsWith(`${ue()}:`)&&t.removeItem(n)}catch{}}var Kn=20,Gn=200,Zo=new Set(["Product Viewed","Product Clicked","Product Added","Product Added to Wishlist"]),Qo=new Set(["Product Viewed","Product Added"]),zn=50;function Fe(e,t){let n=xt(e.recentBrowse,t);return n?(e.recentBrowseCategories=[e.browsingListing?.category??null,...e.recentBrowseCategories].slice(0,e.recentBrowse.length),n):null}function es(e,t){let n=e.listViewsByCategory;n[t]=(n[t]??0)+1;let r=Object.keys(n);if(r.length>zn){let o={};for(let s of r.sort((i,a)=>n[a]-n[i]).slice(0,zn))o[s]=n[s];e.listViewsByCategory=o}}function Wn(e,t){let n=kt();n.startedAt||(n.startedAt=Date.now());let r=Array.isArray(t?.products)?t.products:[];switch(e){case"Product Viewed":n.productViews+=1,Fe(n,n.browsingCategory);break;case"Product List Viewed":{let i=t?.list_id,a=t?.category;if(!(typeof i=="string"&&i.includes("/")&&!i.startsWith("cdp-")))break;let d=typeof a=="string"&&xe(ge(a))||null,f=d?xe(ge(i)):"";if(!f){n.browsingCategory=null,n.browsingListing=null;break}n.browsingListing={key:f,category:d},Fe(n,f),n.browsingCategory=f,es(n,d),n.listViews+=1}break;case"Product List Filtered":{let i=t?.change,a=typeof t?.list_id=="string"?t.list_id:"",u=typeof i?.value=="string"?i.value:"",d=n.browsingListing;if(u&&i?.action!=="removed"&&d&&xe(ge(a))===d.key){let f=Fe(n,`${a}/${u}`);f&&(n.browsingCategory=f)}break}case"Product Added":{n.cartAdds+=1,Fe(n,n.browsingCategory);for(let i of r){let a=i.product_id;typeof a!="string"||!a||(n.basketProducts=[a,...n.basketProducts.filter(u=>u!==a)].slice(0,Kn))}break}case"Product Removed":{for(let i of r){let a=i.product_id;typeof a=="string"&&a&&(n.basketProducts=n.basketProducts.filter(u=>u!==a))}break}case"Products Searched":{n.searches+=1;let i=t?.query;if(typeof i=="string"&&i.trim()){let a=i.trim().toLowerCase().slice(0,64);n.recentSearches=[a,...n.recentSearches.filter(u=>u!==a)].slice(0,5)}break}case"Product Clicked":case"Product Added to Wishlist":break;case"Cart Updated":{let i=t?.value;return n.basketValue=typeof i=="number"&&Number.isFinite(i)&&i>=0?i:null,At(n),n}default:return n}let o=Zo.has(e);if(o)for(let i of r)typeof i.product_id=="string"&&i.product_id&&delete n.impressions[i.product_id];else{for(let a of r){let u=a.product_id;typeof u!="string"||!u||(n.impressions[u]=(n.impressions[u]??0)+1)}let i=Object.keys(n.impressions);if(i.length>Gn){let a={};for(let u of i.sort((d,f)=>n.impressions[f]-n.impressions[d]).slice(0,Gn))a[u]=n.impressions[u];n.impressions=a}}let s=new Set;for(let i of r){let a=i.product_id;if(o&&typeof a=="string"&&a&&(n.recentProducts=[a,...n.recentProducts.filter(u=>u!==a)].slice(0,Kn)),Qo.has(e)&&typeof i.category=="string"&&i.category){let u=ge(i.category);u&&!s.has(u)&&(s.add(u),xt(n.recentCategories,u))}}return At(n),n}var Jn=1800*1e3;function Yn({name:e,domain:t=null,mayStore:n,now:r=()=>Date.now(),mint:o=Z}){let s=null,i=0,a=()=>{s!==null&&n()&&Q(e,s,Jn/1e3,t)};return{get(){let u=r(),d=M(e);return d?s=d:(s===null||u-i>=Jn)&&(s=o()),i=u,a(),s},persist:a,forget(){Q(e,"",0,t),s=null}}}var G=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),Xn=e=>Array.isArray(e)&&e.every(t=>typeof t=="string"),vt=Object.freeze({enabled:!1});function Zn(e,t){let n=e?.track;return G(n)?(Object.hasOwn(n,t)?n[t]:n.__default)?.enabled!==!1:!0}function ts(e,t){return`${le(e)}/v1/projects/${encodeURIComponent(t)}/settings`}var ns="https://hp.thgingenuity.com";function le(e){return e==null||e===""?ns:er(e)}function Qn(e,t){return e!=null&&e!==""?le(e):t?.startsWith("https://")?t:le(void 0)}function er(e){if(typeof e!="string")return null;let t=e.trim().replace(/\/+$/,"");return/^https?:\/\/[^/\s]+$/i.test(t)?t:/^[a-z0-9.-]+(:\d+)?$/i.test(t)?`https://${t}`:null}function rs(e){if(!G(e))return null;let t=Object.fromEntries(Object.entries(e).filter(([,n])=>typeof n=="boolean"));return Object.keys(t).length?t:null}var Et=e=>typeof e=="number"&&e>=0&&e<=1,os=/^[0-9a-f]{64}$/;function ss(e){return G(e)?{enabled:e.enabled===!0,tokenSha256:typeof e.tokenSha256=="string"&&os.test(e.tokenSha256)?e.tokenSha256:null}:{enabled:!1,tokenSha256:null}}function is(e){if(!G(e))return null;let t=Object.fromEntries(Object.entries(e).filter(([,n])=>G(n)&&Et(n.share)&&(n.ramp==null||Et(n.ramp))&&typeof n.salt=="string"&&n.salt!=="").map(([n,r])=>[n,{share:r.share,ramp:r.ramp??null,salt:r.salt,...Xn(r.readoutSlots)&&r.readoutSlots.length>0&&{readoutSlots:r.readoutSlots}}]));return Object.keys(t).length?t:null}var as=/^[A-Za-z0-9!#$%&'*+.^_`|~-]{1,128}$/;function cs(e){return G(e)?e.source==="hp_cookie"?{source:"hp_cookie"}:e.source!=="site_cookie"?null:e.cookie==null?{source:"site_cookie",cookie:null}:typeof e.cookie=="string"&&as.test(e.cookie)?{source:"site_cookie",cookie:e.cookie}:null:null}function us(e){let t=G(e)?e.hp:null;return G(t)&&typeof t.enabled=="boolean"}function Ct(e){let t=G(e)?e.hp:null;return!G(t)||t.enabled!==!0?vt:{enabled:!0,propertyId:typeof t.propertyId=="string"&&t.propertyId!==""?t.propertyId:null,environment:typeof t.environment=="string"?t.environment:null,consentPurposes:rs(t.consent?.purposes),queryParamAllowlist:Xn(t.queryParamAllowlist)?t.queryParamAllowlist:null,anonymousId:cs(t.anonymousId),apiHost:er(t.apiHost),holdouts:is(t.holdouts),sampleRate:Et(t.sampleRate)?t.sampleRate:1,debug:ss(t.debug),plan:G(e.plan)&&G(e.plan.track)?{track:e.plan.track}:null}}async function tr(e,t,n=globalThis.fetch){try{let r=await n(ts(e,t),{credentials:"omit",headers:{accept:"application/json"}});if(!r.ok)return null;let o=await r.json();return us(o)?Ct(o):null}catch{return null}}var He=e=>F(T("settings"),e);function nr(e){try{let t=localStorage.getItem(He(e));if(!t)return null;let n=JSON.parse(t);return n?.enabled===!0?n:null}catch{return null}}function rr(e,t){try{t?.enabled===!0?localStorage.setItem(He(e),JSON.stringify(t)):localStorage.removeItem(He(e))}catch{}}function Pt(e){try{localStorage.removeItem(He(e))}catch{}}var ls={flushAt:20,flushIntervalMs:1e4,maxQueue:500,maxRetryAgeMs:1440*60*1e3,maxRetries:5,maxPersistedBatches:20,maxPersistedBytes:1024*1024,storageKey:ie.retry,beaconSafeBytes:56*1024,maxBatchEvents:100,maxBatchBytes:500*1024},Ke=()=>Date.now(),or=3e4,Mt=55*1024;function ds(e,t=Ke()){if(typeof e!="string")return 0;let n=e.trim();if(/^\d+$/.test(n))return Number(n)*1e3;if(n==="")return 0;let r=Date.parse(n);return Number.isNaN(r)?0:Math.max(0,r-t)}var ee=e=>typeof TextEncoder<"u"?new TextEncoder().encode(e).length:Buffer.byteLength(e),Ot=()=>typeof window<"u"&&typeof document<"u";function fs(){try{return!Ot()||!window.localStorage?null:(window.localStorage.getItem("thg_hp_probe"),window.localStorage)}catch{return null}}var I,Lt,Tt,Ge,Nt,Rt,sr,Ie,ke,Ae,ir,Dt,ar,ze,We=class{constructor(t){Ft(this,I);this.o={...ls,...t},this.queue=[],this.timer=null,this.storage=fs(),this.inflight=null,this.sending=new Set,this.epoch=0,this.sinceRefusal=new Set,this.wakers=new Set,this.replayAllowed=!this.o.deferReplay,this.draining=null,Ot()&&(window.addEventListener("pagehide",()=>this.flush({beacon:!0})),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.flush()}),O(this,I,ze).call(this))}replayPersisted(){return this.replayAllowed=!0,O(this,I,ze).call(this)}clearPersisted(){if(this.replayAllowed=!1,!!this.storage)try{let t=O(this,I,Ae).call(this).filter(n=>this.sinceRefusal.has(n?.id));t.length?this.storage.setItem(this.o.storageKey,JSON.stringify(t)):this.storage.removeItem(this.o.storageKey)}catch{}}discardQueued(){this.queue=[],this.epoch+=1,this.sinceRefusal.clear(),O(this,I,Tt).call(this);for(let t of this.wakers)t()}enqueue(t){let n;try{n=JSON.parse(JSON.stringify(t))}catch(r){this.o.onError?.(`event ${t?.messageId??""} cannot be serialised; dropped`,r);return}this.queue.push(n),this.queue.length>this.o.maxQueue&&this.queue.splice(0,this.queue.length-this.o.maxQueue),this.queue.length>=this.o.flushAt?this.flush():O(this,I,Lt).call(this)}flush(t={}){if(O(this,I,Tt).call(this),this.queue.length===0)return Promise.resolve();if(t.beacon&&Ot()&&typeof navigator<"u"&&navigator.sendBeacon)return O(this,I,sr).call(this),Promise.resolve();if(this.inflight)return this.inflight;let n=O(this,I,Rt).call(this,this.queue,this.o.maxBatchEvents,this.o.maxBatchBytes).map(o=>{let s=O(this,I,Dt).call(this,o);return s&&(this.sending.add(s),this.sinceRefusal.add(s)),{batch:o,id:s}});this.queue=[];let r=this.epoch;return this.inflight=(async()=>{for(let{batch:o,id:s}of n){if(r!==this.epoch){O(this,I,ke).call(this,s);continue}await O(this,I,Ie).call(this,o,0,s,r)}})().finally(()=>{this.inflight=null,this.queue.length>=this.o.flushAt?this.flush():this.queue.length&&O(this,I,Lt).call(this)}),this.inflight}};I=new WeakSet,Lt=function(){this.timer||(this.timer=setTimeout(()=>this.flush(),this.o.flushIntervalMs),this.timer?.unref?.())},Tt=function(){this.timer&&(clearTimeout(this.timer),this.timer=null)},Ge=function(t){return JSON.stringify({batch:t,writeKey:this.o.writeKey,sentAt:new Date().toISOString()})},Nt=function(){return`${this.o.apiHost.replace(/\/$/,"")}/v1/batch`},Rt=function(t,n,r){let o=ee(O(this,I,Ge).call(this,[])),s=[],i=[],a=o;for(let u of t){let d=ee(JSON.stringify(u))+1;i.length&&(i.length>=n||a+d>r)&&(s.push(i),i=[],a=o),i.push(u),a+=d}return i.length&&s.push(i),s},sr=function(){let t=this.queue;this.queue=[];let n=O(this,I,Nt).call(this);for(let r of O(this,I,Rt).call(this,t,this.o.maxBatchEvents,this.o.beaconSafeBytes)){let o=O(this,I,Ge).call(this,r);if(ee(o)<=this.o.beaconSafeBytes){let s=!1;try{s=navigator.sendBeacon(n,new Blob([o],{type:"text/plain"}))}catch{s=!1}if(s)continue}O(this,I,Ie).call(this,r,0,O(this,I,Dt).call(this,r))}},Ie=async function(t,n,r=null,o=this.epoch){r&&this.sending.add(r);let s=O(this,I,Ge).call(this,t),i=0;try{let a=await fetch(O(this,I,Nt).call(this),{method:"POST",headers:{"Content-Type":"text/plain"},body:s,keepalive:ee(s)<=this.o.beaconSafeBytes});if(a.ok)return O(this,I,ke).call(this,r),O(this,I,ze).call(this),!0;let u=a.status===408||a.status===429||a.status>=500;if(u&&(i=ds(a.headers?.get?.("retry-after"))),!u)return O(this,I,ke).call(this,r),this.o.onError?.(`CDP ingest rejected batch (${a.status}); dropping ${t.length} events`),!0;throw new Error(`retryable ${a.status}`)}catch(a){if(n>=this.o.maxRetries){r&&this.sending.delete(r);let d=r?"kept for the next page":"dropped";return this.o.onError?.(`CDP ingest unreachable after ${n} attempts; ${d}: ${t.length} events`,a),!1}let u=Math.max(Math.min(1e3*2**n,or)*(.5+Math.random()),Math.min(i,or));return o===this.epoch&&await new Promise(d=>{let f=()=>{clearTimeout(p),this.wakers.delete(f),d()},p=setTimeout(f,u);this.wakers.add(f)}),o!==this.epoch?(O(this,I,ke).call(this,r),!1):O(this,I,Ie).call(this,t,n+1,r,o)}},ke=function(t){t&&(this.sending.delete(t),this.sinceRefusal.delete(t),O(this,I,ar).call(this,t))},Ae=function(){let t=JSON.parse(this.storage.getItem(this.o.storageKey)||"[]");return Array.isArray(t)?t:[]},ir=function(t,n){let r=i=>ee(JSON.stringify(i))+1,o=[...t,n].slice(-this.o.maxPersistedBatches),s=o.reduce((i,a)=>i+r(a),2);for(;o.length>1&&s>this.o.maxPersistedBytes;)s-=r(o[0]),o=o.slice(1);for(;o.length;)try{return this.storage.setItem(this.o.storageKey,JSON.stringify(o)),!0}catch{o=o.slice(1)}return!1},Dt=function(t){if(!this.storage||this.o.mayPersist&&!this.o.mayPersist())return null;try{let n={at:Ke(),id:`${Ke()}-${Math.random().toString(36).slice(2)}`,batch:t};return ee(JSON.stringify(n))+3>this.o.maxPersistedBytes?null:O(this,I,ir).call(this,O(this,I,Ae).call(this),n)?n.id:null}catch{return null}},ar=function(t){if(!(!t||!this.storage))try{let n=O(this,I,Ae).call(this).filter(r=>r.id!==t);n.length?this.storage.setItem(this.o.storageKey,JSON.stringify(n)):this.storage.removeItem(this.o.storageKey)}catch{}},ze=function(){if(!this.storage||!this.replayAllowed)return this.draining??Promise.resolve();if(this.draining)return this.draining;let t;try{let r=O(this,I,Ae).call(this);t=r.filter(o=>Array.isArray(o?.batch)&&Ke()-o.at<this.o.maxRetryAgeMs).map(o=>o.id?o:{...o,id:`${o.at}-${Math.random().toString(36).slice(2)}`}),(t.length!==r.length||t.some((o,s)=>o!==r[s]))&&(t.length?this.storage.setItem(this.o.storageKey,JSON.stringify(t)):this.storage.removeItem(this.o.storageKey))}catch{return Promise.resolve()}let n=t.filter(r=>!this.sending.has(r.id));return n.length?(this.draining=(async()=>{for(let r of n)if(!this.replayAllowed||!await O(this,I,Ie).call(this,r.batch,0,r.id))return})().finally(()=>{this.draining=null}),this.draining):Promise.resolve()};var cr="3.22.2",ur="@thg-agentic/hyper-personalisation-web";var ps=new Set(["audiences","decisions","recommendations"]);var ms=Symbol.for("@thg-agentic/hyper-personalisation-web.replay");function hs(e){let t={...e??{}},n=Array.isArray(t.products)?t.products:null;if(t.item_count==null&&n){let r=n.map(o=>o?.quantity);r.every(Number.isInteger)&&(t.item_count=r.reduce((o,s)=>o+s,0))}return t}var gs="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";function ys(e){if(/^[0-9a-fA-F]{64}$/.test(e))return e.toLowerCase();if(!/^[A-Za-z0-9+/_-]{43}=?$/.test(e))return null;try{let t=atob(e.replace(/-/g,"+").replace(/_/g,"/").padEnd(44,"="));return t.length!==32?null:Array.from(t,n=>n.charCodeAt(0).toString(16).padStart(2,"0")).join("")}catch{return null}}function Je(e){if(typeof e!="string")return null;let t=ys(e.trim());return t===gs?null:t}var lr=Object.freeze({email_sha256:"sha256",phone_sha256:"sha256",accepts_marketing:"boolean",gender:"string",created_at:"date-time"}),ws=/^\d{4}-\d{2}-\d{2}T([01]\d|2[0-3]):[0-5]\d:[0-5]\d(\.\d+)?(Z|[+-]([01]\d|2[0-3]):[0-5]\d)$/i;function Ss(e){if(typeof e!="string"||!ws.test(e))return!1;let[t,n,r]=e.slice(0,10).split("-").map(Number),o=new Date(Date.UTC(t,n-1,r));return o.getUTCMonth()===n-1&&o.getUTCDate()===r&&!Number.isNaN(Date.parse(e))}function _s(e,t){return t===null?null:e==="sha256"?Je(t)??void 0:e==="date-time"?t instanceof Date?Number.isNaN(t.getTime())?void 0:t.toISOString():Ss(t)?t:void 0:typeof t===e?t:void 0}function bs(e,t){let n={},r=[];for(let[o,s]of Object.entries(e)){let i=Object.hasOwn(lr,o)?lr[o]:null,a=i?_s(i,s):void 0;a===void 0?r.push(o):n[o]=a}return t&&r.length&&console.warn(`[hp] identify: not sent, not spec traits: ${r.join(", ")}`),n}var dr=!1,fr=!1;function xs(){fr||(fr=!0,console.warn("[hp] no consent adapter: events are sent under the host's lawful basis (basis 'host'). Pass `consent` to send only once the visitor allows analytics."))}function Is(e){!e||dr||(dr=!0,console.warn("[hp] mintAnonymousId is ignored since 3.6: where device ids come from is set per source in the console (the site\u2019s own cookie, or Hyper-Personalisation\u2019s)."))}function ks(e){try{return ee(JSON.stringify(e))}catch{return 0}}function pr(e){return e&&typeof e.context=="object"&&e.context!==null?e.context:e}function mr(e){let t=le(e?.apiHost);if(!t)throw new Error("createAnalytics: apiHost, when given, must be a host or an http(s) origin");if(!e?.propertyId)throw new Error("createAnalytics: propertyId is required");let n={libraryName:ur,libraryVersion:cr,writeKey:"web",queryParamBlocklist:[],debug:!1,validate:null,consentTimeoutMs:5e3,...e,apiHost:t};Te(n.storageNames),Ne();let r=!!n.consent;r||xs();let o=null;n.getConsent=()=>o?o.stamp():mn();let s=()=>!r||o?.status==="granted",i=r&&n.holdAcrossPages?dn(F(T("held"),n.propertyId)):null,a=i?.read()??{items:[],anonymousId:null};n.mintAnonymousId!==void 0&&Is(n.debug);let u=fn(n,{carried:a.anonymousId,mayStore:s,orOwn:!0}),d=Yn({name:T("session"),domain:n.consentCookieDomain??null,mayStore:s}),f=n.getSessionId;n.getSessionId=()=>q(D(f,null))??d.get();let p=Rn(T("preview"),n.consentCookieDomain??null),g=(c,l)=>n.debug&&console.warn("[hp]",c,l??""),x=n.transport??new We({apiHost:n.apiHost,writeKey:n.writeKey,storageKey:F(T("retry"),n.propertyId),mayPersist:r?()=>o?.status==="granted":void 0,deferReplay:r,onError:g}),w=F(T("previousPage"),n.propertyId),b=null,k=()=>{if(b)return b;try{return sessionStorage.getItem(w)||null}catch{return null}};typeof window<"u"&&window.addEventListener("pageshow",c=>{c.persisted&&(b=null)});let E=c=>{if(b=c||null,!(r&&o.status!=="granted"))try{sessionStorage.setItem(w,c)}catch{}},h=Tn({key:F(T("decisions"),n.propertyId),mayStore:s});n.getDecisions??(n.getDecisions=h.current);let v=q(D(n.getUserId,null)),S=null,y=null,_=null;function L(c,l,A=!1){try{return R(c,l,A)}catch(P){if(P instanceof he)throw P;return console.warn("[hp] the event was not sent",P),null}}function R(c,l,A){let P=_;_=null;let U=c.type==="track"?c.event:c.type;if(!A&&!Zn(n.plan,U))return null;let C={messageId:P?.messageId??Z(),timestamp:P?.timestamp??new Date().toISOString(),anonymousId:q(D(n.getAnonymousId,null)),userId:v??null,...c,context:sn(n,pr(l))};if(C.properties&&(C.properties=st(C.properties)),typeof C.properties?.href=="string"&&(C.properties.href=on(C.properties.href,n)),!A&&!Bn(C.anonymousId,n.sampleRate))return n.debug&&console.debug("[hp] not sent: outside the sample",C),null;if(n.beforeSend){let fe;try{fe=n.beforeSend(C)}catch(Er){return console.warn("[hp] beforeSend failed; the event was not sent",Er),null}if(!fe)return null;let{type:Pe,event:jt,messageId:kr,timestamp:Ar}=C;C={...fe,type:Pe,messageId:kr,timestamp:Ar,...jt?{event:jt}:{}}}if(n.validate){let fe=n.validate(C,{producer:"web"});if(!fe.valid){let Pe=`[hp] invalid ${C.event??C.type}:
2
2
  ${fe.errors.join(`
3
- `)}`;if(n.throwOnInvalid)throw new he(Pe);console.error(Pe)}}n.debug&&console.debug("[hp]",C.event??C.type,C);let Bt=Is(C);return Bt>Mt?(y(`${C.event??C.type} not sent: ${Bt} bytes, over the ${Mt}-byte limit for one event`),null):(Ee(C,A),C)}function H(c){if(c.type==="track"&&z(c),n.onEvent)try{n.onEvent(c)}catch(l){console.warn("[hp] onEvent observer failed",l)}}let K=()=>r&&o?.state?.personalisation===!0,j=()=>Bn(D(n.getSessionId,null),n.propertyId),te=!1;function z(c){try{K()?(j(),Dn(bt(Gn(c.event,c.properties))),te=!0):ne()}catch(l){n.debug&&console.warn("[hp] the visit was not recorded",l)}}function ne(c=!1){Mn(),(c||te)&&qn(),te=!1}function de(){d.forget(),h.forget(),B.clear(),u?.forget(),ne(!0)}function Ee(c,l){!r||l||o.admits()?(H(c),b.enqueue(c)):o.hold(c)}let m=(c,l,A)=>L({type:"track",event:c,properties:l??{}},A),B=new Set,ve=(c,l,A)=>c==="audiences"?{audiences:l?null:A.audiences??[]}:c==="decisions"?{decisions:(A.decisions??[]).map(P=>({slot:P.slot,decision_id:P.decision_id??null,arm:P.arm??null,...P.variant&&{variant:P.variant}}))}:{recommendation_request_id:A.recommendation_request_id??null};r&&(o=Cn({adapter:n.consent,timeoutMs:n.consentTimeoutMs,cookieDomain:n.consentCookieDomain,debug:n.debug,store:i&&{read:()=>a.items,write:c=>i.write(c,u?.peek()??null)},release(c){c.context&&(c.context.consent=o.stamp()),H(c),b.enqueue(c)},onStatus(c){if(c==="granted"&&(u?.persist(),d.persist(),x&&v(x),h.persist(),b.replayPersisted?.()),c==="denied"){b.clearPersisted?.(),u?.forget(),d.forget();try{sessionStorage.removeItem(w)}catch{}h.forget(),ne(!0)}try{n.onConsentStatus?.(c)}catch(l){console.warn("[hp] onConsentStatus observer failed",l)}},announce({action:c,state:l,previous:A,withdrawal:P}){l?.personalisation!==!0&&ne(A?.personalisation===!0),P&&b.discardQueued?.(),L({type:"track",event:"Consent Updated",properties:{action:c,state:l}},void 0,P),P&&b.flush()}}),o.start());let J=()=>n.holdout?St(n.holdout):null,Ce=()=>_t(n.holdout,q(D(n.getAnonymousId,null))).group;function br(c,l){if(!Array.isArray(c?.decisions))return c;let A=n.holdout?.readoutSlots??[],P=q(D(n.getAnonymousId,null));return{...c,decisions:c.decisions.map(U=>{let C=U?.variant==="bandit"||U?.variant==="default"?U.variant:!l&&U?.holdout!==!0&&A.includes(U?.slot)?Ln(U.slot,P):null;return C?C==="default"?{...U,variant:C,decision_id:null}:{...U,variant:C}:U})}}function Ut(c,l){if(p)return null;let A=c?.exposure,P=A?.holdout===!0,U=br(c,P);return h.remember(Pn(U)),!A?.token||B.has(A.token)?null:(B.add(A.token),m("Personalisation Exposed",{exposure_token:A.token,surface:A.surface,holdout:P,holdout_share:A.holdout_share??J()?.holdout_share??null,personalised_share:A.personalised_share??J()?.personalised_share??null,...ve(A.surface,P,U)},l))}function Vt(c){return E&&de(),E=null,S=null,g=null,c}return En({track:(c,l,A)=>c==="Signed Out"?Vt(m(c,l,A)):m(c,l,A),page(c,l){c??(c={});let A=n.pageType??null;c.type&&(pe.has(c.type)?(A=c.type,n.pageType=c.type):n.debug&&console.warn(`[hp] ignoring unknown page.type "${c.type}". Allowed: ${[...pe].join(", ")}`));let P=L({type:"page",properties:{name:c.name??null,navigation_trigger:c.navigation_trigger??Zt(),previous_message_id:k()}},{page:{type:A},...dr(l)??{}});return P&&v(P.messageId),P},identify(c,l,A){let{userId:P,...U}=c&&typeof c=="object"?c:{};if(P!==void 0){let C=q(P);A===be?g=C:S&&C&&C!==S?de():n.debug&&g&&C&&C!==g&&console.warn("[hp] identify names another userId than the identity option; using the new one"),E=C,C&&A!==be&&(S=C)}return L({type:"identify",traits:_s(U,n.debug)},l)},reset(){E&&de(),E=null,S=null,g=null,v("")},productViewed:(c,l)=>m("Product Viewed",c,l),productListViewed:(c,l)=>m("Product List Viewed",c,l),recommendationsViewed:(c,l)=>m("Recommendations Viewed",c,l),personalisationExposed:(c,l)=>m("Personalisation Exposed",c,l),recordExposure:Ut,surfaceViewed({surface:c}={},l){if(!fs.has(c)||!n.holdout||c!=="decisions"&&!K())return null;let A=q(D(n.getAnonymousId,null)),P=_t(n.holdout,A).group;if(P==="excluded")return null;let U=Jt({sessionId:Oe(D(n.getSessionId,null),A),surface:c});return U?Ut({exposure:{token:U,surface:c,holdout:P==="holdout"}},l):null},inHoldout:()=>Ce()!=="personalised",personalisationGroup:Ce,productClicked:(c,l)=>m("Product Clicked",c,l),productListFiltered:(c,l)=>m("Product List Filtered",c,l),productsSearched:(c,l)=>m("Products Searched",c,l),searchSuggestionsViewed:(c,l)=>m("Search Suggestions Viewed",c,l),productAdded:(c,l)=>m("Product Added",c,l),productRemoved:(c,l)=>m("Product Removed",c,l),cartUpdated:(c,l)=>m("Cart Updated",ms(c),l),identityLinked:(c,l)=>m("Identity Linked",c,l),slotEngaged:(c,l)=>p?null:m("Slot Engaged",c,l),productVariantSelected:(c,l)=>m("Product Variant Selected",c,l),cartViewed:(c,l)=>m("Cart Viewed",c,l),productAddedToWishlist:(c,l)=>m("Product Added to Wishlist",c,l),productRemovedFromWishlist:(c,l)=>m("Product Removed from Wishlist",c,l),wishlistProductAddedToCart:(c,l)=>m("Wishlist Product Added to Cart",c,l),productShared:(c,l)=>m("Product Shared",c,l),cartShared:(c,l)=>m("Cart Shared",c,l),couponEntered:(c,l)=>m("Coupon Entered",c,l),couponApplied:(c,l)=>m("Coupon Applied",c,l),couponDenied:(c,l)=>m("Coupon Denied",c,l),couponRemoved:(c,l)=>m("Coupon Removed",c,l),checkoutStarted:(c,l)=>m("Checkout Started",c,l),promotionViewed:(c,l)=>m("Promotion Viewed",c,l),promotionClicked:(c,l)=>m("Promotion Clicked",c,l),checkoutStepViewed:(c,l)=>m("Checkout Step Viewed",c,l),checkoutStepCompleted:(c,l)=>m("Checkout Step Completed",c,l),paymentInfoEntered:(c,l)=>m("Payment Info Entered",c,l),checkoutFailed:(c,l)=>m("Checkout Failed",c,l),signedIn:(c,l)=>m("Signed In",c,l),signedUp:(c,l)=>m("Signed Up",c,l),signedOut:c=>Vt(m("Signed Out",{},c)),newsletterSubscribed:(c,l)=>m("Newsletter Subscribed",c,l),newsletterUnsubscribed:(c,l)=>m("Newsletter Unsubscribed",c,l),backInStockSubscribed:(c,l)=>m("Back In Stock Subscribed",c,l),productReviewed:(c,l)=>m("Product Reviewed",c,l),consentUpdated:(c,l)=>m("Consent Updated",c,l),flush:c=>b.flush(c),recommendationContext(){if(!K())return{};try{return j(),bt(jn())}catch{return{}}},get consent(){return o?o.state:null},servingHeaders:()=>hn(o?.state??null),get lastPageMessageId(){return k()},get anonymousId(){return q(D(n.getAnonymousId,null))},[ps](c,l,A){if(typeof this[c]=="function"){_=typeof A?.messageId=="string"&&typeof A?.timestamp=="string"?{messageId:A.messageId,timestamp:A.timestamp}:null;try{this[c](...Array.isArray(l)?l:[])}finally{_=null}}}})}var $t=Symbol.for("@thg-agentic/hyper-personalisation-web.bootstrap"),ks=Symbol.for("@thg-agentic/hyper-personalisation-web.drain"),As=Symbol.for("@thg-agentic/hyper-personalisation-web.carry"),pr=Symbol.for("@thg-agentic/hyper-personalisation-web.replay"),Es=Symbol.for("@thg-agentic/hyper-personalisation-web.assignment"),vs=Symbol.for("@thg-agentic/hyper-personalisation-web.recommendation-context"),Ze=e=>e?()=>M(e):()=>null,gr={didomi:e=>gn({purposes:e.purposes}),onetrust:e=>yn({groups:e.groups,impliedConsent:e.impliedConsent}),cookie:e=>wn({name:e.name,categories:e.categories,refusedValue:e.refusedValue,source:e.source,changeEvent:e.changeEvent}),forwarded:e=>Sn({name:e.name}),static:e=>{if(!e.state||typeof e.state!="object")throw new Error('consent.state is required for provider "static"');return _n(e.state)}},mr=Object.keys(gr),we=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),Ye=e=>typeof e=="string"&&e!=="",Cs=e=>Array.isArray(e)&&e.every(t=>typeof t=="string"),yr=e=>we(e)&&typeof e.read=="function";function Ps(e,t={}){let n=[];if(!we(e))return["config must be { writeKey, apiHost? }"];Ye(e.writeKey)||n.push("writeKey is required"),le(e.apiHost)||n.push("apiHost, when given, must be a host or an http(s) origin"),t.propertyId!==void 0&&!Ye(t.propertyId)&&n.push("propertyId must be a string");let{consent:r}=t;if(!yr(r)&&!(we(r)&&mr.includes(r.provider))&&n.push(`consent must be a consent adapter or { provider: ${mr.join(" | ")} }`),t.autocapture!==void 0&&t.autocapture!==!1&&!we(t.autocapture)&&n.push("autocapture must be false or { promotions, productLists, recommendations }"),t.beforeSend!==void 0&&typeof t.beforeSend!="function"&&n.push("beforeSend must be a function"),t.identityCookies!==void 0)if(!we(t.identityCookies))n.push("identityCookies must be an object");else for(let o of["anonymousId","sessionId"]){let s=t.identityCookies[o];s!==void 0&&!Ye(s)&&n.push(`identityCookies.${o} must be a cookie name`)}for(let o of["getCurrency","getShipToCountry","getLocale"])t[o]!==void 0&&typeof t[o]!="function"&&n.push(`${o} must be a function`);return t.dataLayer!==void 0&&(we(t.dataLayer)?(t.dataLayer.name!==void 0&&!Ye(t.dataLayer.name)&&n.push("dataLayer.name must be a string"),t.dataLayer.ignore!==void 0&&!Cs(t.dataLayer.ignore)&&n.push("dataLayer.ignore must be an array of strings")):n.push("dataLayer must be an object")),n}function Os(e,t,n){if(yr(e))return mt(e,t.consentPurposes);let{provider:r,...o}=e,s=n?.consent?.[r]??gr[r];return mt(s(o),t.consentPurposes)}var wr=(e,t)=>`${e??""}|${t??""}`;function Ls(e,t){let n=q(t?.userId),r=Je(t?.emailSha256);if(!n&&!r)return null;try{let o=F(T("identified"),e);if(sessionStorage.getItem(o)===wr(n,r))return null}catch{}return{...n?{userId:n}:{},...r?{email_sha256:r}:{}}}async function Ts({writeKey:e,apiHost:t},n){if(n.settings!==void 0)return{settings:Ct(n.settings),revalidated:null};let r=Qn(t,e),o=er(e);if(o)return{settings:o,revalidated:r};let s=await r,i=s??vt;return{settings:i,revalidated:Promise.resolve(i),unreachable:s===null}}function Sr(e,t){let n=t??{},r=typeof window<"u"?window:null;if(r?.[$t])return r[$t];let o=dn(e?.writeKey,()=>{let{analytics:i}=_e(M(T("consent")));return i===!0||i===null&&n.holdAcrossPages===!0}),s=Rs(e,n,o);if(r){let i=n.extend?.getSessionId??Ze(n.identityCookies?.sessionId),a=Ze(n.identityCookies?.anonymousId);r[Es]=({slot:u,arm:d}={})=>Wt({sessionId:Oe(i(),a()),slot:u,arm:d}),r[$t]=s,r[As]=o,r[ks]?.(s)}return s}function Ns(){let e=globalThis.performance?.now?.();return new Date(Date.now()-(Number.isFinite(e)?e:0)).toISOString()}function hr(e,t){if(t===!1)return()=>{};let n={promotions:!0,productLists:!0,recommendations:!0,exposures:!0,...t},r=s=>s&&typeof s=="object"?s:{},o=[];try{n.promotions&&o.push(nt(e,r(n.promotions))),n.productLists&&o.push(tt(e,r(n.productLists))),n.recommendations&&o.push(rt(e,r(n.recommendations))),n.exposures&&o.push(et(e,r(n.exposures)))}catch(s){console.warn("[hp] autocapture not started:",s?.message??s)}return()=>{for(let s of o)s()}}function Xe(e){return e.close(),null}async function Rs(e,t,n){try{let r=Ps(e,t);if(r.length)return console.warn(`[hp] not started, the configuration is invalid: ${r.join("; ")}`),Xe(n);Te(t.storageNames),Ne();let{writeKey:o}=e,[{settings:s,revalidated:i,unreachable:a},u]=await Promise.all([Ts(e,t),Promise.resolve(t.identity).catch(()=>null)]),d=i?s:null,f=!1,p=()=>f&&d&&tr(o,d);if(i?.then(g=>{g&&(d=g,g.enabled?p():Pt(o))}),a)return null;if(!s.enabled)return t.debug&&console.info("[hp] off: the settings for this write key do not enable it"),Xe(n);let y=t.propertyId??s.propertyId;if(!y)return console.warn("[hp] not started: this write key covers several properties, so propertyId is required"),Xe(n);let{preset:b}=t,w=Ls(y,u),x=t.debug===!0||s.debug?.enabled===!0||An(s.debug?.tokenSha256??null,T("debug")),k=q(u?.userId),v=fr({apiHost:Xn(e.apiHost,s.apiHost),writeKey:o,propertyId:y,pageType:pe.has(t.pageType)?t.pageType:void 0,environment:s.environment,queryParamAllowlist:s.queryParamAllowlist??void 0,plan:s.plan,sampleRate:s.sampleRate??1,holdout:s.holdouts?.[y],getCurrency:t.getCurrency,getShipToCountry:t.getShipToCountry,getLocale:t.getLocale,consent:Os(t.consent,s,b),consentCookieDomain:t.consentCookieDomain,storageNames:t.storageNames,holdAcrossPages:t.holdAcrossPages===!0,mintAnonymousId:t.mintAnonymousId,debug:x,anonymousIdSource:s.anonymousId??void 0,getAnonymousId:Ze(t.identityCookies?.anonymousId),getSessionId:t.identityCookies?.sessionId?Ze(t.identityCookies.sessionId):void 0,getUserId:()=>k,beforeSend:t.beforeSend,...t.extend,onConsentStatus(g){if(g==="granted"&&(f=!0,p()),g==="denied"){Pt(o);try{sessionStorage.removeItem(F(T("identified"),y))}catch{}}t.extend?.onConsentStatus?.(g)},onEvent(g){if(g.type==="identify"){let _=wr(q(g.userId),Je(g.traits?.email_sha256));try{sessionStorage.setItem(F(T("identified"),y),_)}catch{}}t.extend?.onEvent?.(g)}});typeof window<"u"&&(window[vs]=()=>v.recommendationContext());for(let[g,_,L]of n.take())try{v[pr](g,_,L)}catch(R){console.warn(`[hp] carried ${g} failed`,R)}v[pr]("page",[t.pageType?{type:t.pageType}:{}],{messageId:Z(),timestamp:Ns()});let h=hr(v,t.autocapture),E=v.page;v.page=wt("page",(...g)=>{let _=E(...g);return h(),h=hr(v,t.autocapture),_});let S=typeof window<"u"?window:null;if(t.dataLayer&&S){let g=t.dataLayer.name??"dataLayer";S[g]=S[g]||[],kn(v,{...b,dataLayer:S[g],ignore:[...b?.ignore??[],...t.dataLayer.ignore??[]],onError:_=>x&&console.warn("[hp] dataLayer mapping failed",_)})}return w&&v.identify(w,void 0,be),v}catch(r){return console.warn("[hp] not started:",r?.message??r),Xe(n)}}function _r(e){e.initialized=!0,Sr(e._config,e._options).then(t=>{let n=e.splice(0);if(!t){for(let r of e.methods??[])e[r]=()=>e;return}e.client=t;for(let[r,o]of Object.entries(t))typeof o=="function"&&(e[r]=o);for(let[r,...o]of n)try{t[r]?.(...o)}catch(s){console.warn(`[hp] queued ${r} failed`,s)}})}var V=window.hp=window.hp||[];V.servingHeaders??(V.servingHeaders=()=>({}));V.inHoldout??(V.inHoldout=()=>!0);V.personalisationGroup??(V.personalisationGroup=()=>"excluded");V.recommendationContext??(V.recommendationContext=()=>({}));V.initialized||(V._config?_r(V):V.load=(e,t)=>{V._config=e,V._options=t??{},_r(V)});})();
3
+ `)}`;if(n.throwOnInvalid)throw new he(Pe);console.error(Pe)}}n.debug&&console.debug("[hp]",C.event??C.type,C);let Bt=ks(C);return Bt>Mt?(g(`${C.event??C.type} not sent: ${Bt} bytes, over the ${Mt}-byte limit for one event`),null):(Ee(C,A),C)}function H(c){if(c.type==="track"&&z(c),n.onEvent)try{n.onEvent(c)}catch(l){console.warn("[hp] onEvent observer failed",l)}}let K=()=>r&&o?.state?.personalisation===!0,B=()=>qn(D(n.getSessionId,null),n.propertyId),te=!1;function z(c){try{K()?(B(),$n(bt(Wn(c.event,c.properties))),te=!0):ne()}catch(l){n.debug&&console.warn("[hp] the visit was not recorded",l)}}function ne(c=!1){Un(),(c||te)&&Hn(),te=!1}function de(){d.forget(),h.forget(),j.clear(),u?.forget(),ne(!0)}function Ee(c,l){!r||l||o.admits()?(H(c),x.enqueue(c)):o.hold(c)}let m=(c,l,A)=>L({type:"track",event:c,properties:l??{}},A),j=new Set,ve=(c,l,A)=>c==="audiences"?{audiences:l?null:A.audiences??[]}:c==="decisions"?{decisions:(A.decisions??[]).map(P=>({slot:P.slot,decision_id:P.decision_id??null,arm:P.arm??null,...P.variant&&{variant:P.variant}}))}:{recommendation_request_id:A.recommendation_request_id??null};r&&(o=On({adapter:n.consent,timeoutMs:n.consentTimeoutMs,cookieDomain:n.consentCookieDomain,debug:n.debug,store:i&&{read:()=>a.items,write:c=>i.write(c,u?.peek()??null)},release(c){c.context&&(c.context.consent=o.stamp()),H(c),x.enqueue(c)},onStatus(c){if(c==="granted"&&(u?.persist(),d.persist(),b&&E(b),h.persist(),x.replayPersisted?.()),c==="denied"){x.clearPersisted?.(),u?.forget(),d.forget();try{sessionStorage.removeItem(w)}catch{}h.forget(),ne(!0)}try{n.onConsentStatus?.(c)}catch(l){console.warn("[hp] onConsentStatus observer failed",l)}},announce({action:c,state:l,previous:A,withdrawal:P}){l?.personalisation!==!0&&ne(A?.personalisation===!0),P&&x.discardQueued?.(),L({type:"track",event:"Consent Updated",properties:{action:c,state:l}},void 0,P),P&&x.flush()}}),o.start());let J=()=>n.holdout?St(n.holdout):null,Ce=()=>_t(n.holdout,q(D(n.getAnonymousId,null))).group;function Ir(c,l){if(!Array.isArray(c?.decisions))return c;let A=n.holdout?.readoutSlots??[],P=q(D(n.getAnonymousId,null));return{...c,decisions:c.decisions.map(U=>{let C=U?.variant==="bandit"||U?.variant==="default"?U.variant:!l&&U?.holdout!==!0&&A.includes(U?.slot)?Nn(U.slot,P):null;return C?C==="default"?{...U,variant:C,decision_id:null}:{...U,variant:C}:U})}}function Ut(c,l){if(p)return null;let A=c?.exposure,P=A?.holdout===!0,U=Ir(c,P);return h.remember(Ln(U)),!A?.token||j.has(A.token)?null:(j.add(A.token),m("Personalisation Exposed",{exposure_token:A.token,surface:A.surface,holdout:P,holdout_share:A.holdout_share??J()?.holdout_share??null,personalised_share:A.personalised_share??J()?.personalised_share??null,...ve(A.surface,P,U)},l))}function Vt(c){return v&&de(),v=null,S=null,y=null,c}return Cn({track:(c,l,A)=>c==="Signed Out"?Vt(m(c,l,A)):m(c,l,A),page(c,l){c??(c={});let A=n.pageType??null;c.type&&(pe.has(c.type)?(A=c.type,n.pageType=c.type):n.debug&&console.warn(`[hp] ignoring unknown page.type "${c.type}". Allowed: ${[...pe].join(", ")}`));let P=L({type:"page",properties:{name:c.name??null,navigation_trigger:c.navigation_trigger??Zt(),previous_message_id:k()}},{page:{type:A},...pr(l)??{}});return P&&E(P.messageId),P},identify(c,l,A){let{userId:P,...U}=c&&typeof c=="object"?c:{};if(P!==void 0){let C=q(P);A===be?y=C:S&&C&&C!==S?de():n.debug&&y&&C&&C!==y&&console.warn("[hp] identify names another userId than the identity option; using the new one"),v=C,C&&A!==be&&(S=C)}return L({type:"identify",traits:bs(U,n.debug)},l)},reset(){v&&de(),v=null,S=null,y=null,E("")},productViewed:(c,l)=>m("Product Viewed",c,l),productListViewed:(c,l)=>m("Product List Viewed",c,l),recommendationsViewed:(c,l)=>m("Recommendations Viewed",c,l),personalisationExposed:(c,l)=>m("Personalisation Exposed",c,l),recordExposure:Ut,surfaceViewed({surface:c}={},l){if(!ps.has(c)||!n.holdout||c!=="decisions"&&!K())return null;let A=q(D(n.getAnonymousId,null)),P=_t(n.holdout,A).group;if(P==="excluded")return null;let U=Jt({sessionId:Oe(D(n.getSessionId,null),A),surface:c});return U?Ut({exposure:{token:U,surface:c,holdout:P==="holdout"}},l):null},inHoldout:()=>Ce()!=="personalised",personalisationGroup:Ce,productClicked:(c,l)=>m("Product Clicked",c,l),productListFiltered:(c,l)=>m("Product List Filtered",c,l),productsSearched:(c,l)=>m("Products Searched",c,l),searchSuggestionsViewed:(c,l)=>m("Search Suggestions Viewed",c,l),productAdded:(c,l)=>m("Product Added",c,l),productRemoved:(c,l)=>m("Product Removed",c,l),cartUpdated:(c,l)=>m("Cart Updated",hs(c),l),identityLinked:(c,l)=>m("Identity Linked",c,l),slotEngaged:(c,l)=>p?null:m("Slot Engaged",c,l),productVariantSelected:(c,l)=>m("Product Variant Selected",c,l),cartViewed:(c,l)=>m("Cart Viewed",c,l),productAddedToWishlist:(c,l)=>m("Product Added to Wishlist",c,l),productRemovedFromWishlist:(c,l)=>m("Product Removed from Wishlist",c,l),wishlistProductAddedToCart:(c,l)=>m("Wishlist Product Added to Cart",c,l),productShared:(c,l)=>m("Product Shared",c,l),cartShared:(c,l)=>m("Cart Shared",c,l),couponEntered:(c,l)=>m("Coupon Entered",c,l),couponApplied:(c,l)=>m("Coupon Applied",c,l),couponDenied:(c,l)=>m("Coupon Denied",c,l),couponRemoved:(c,l)=>m("Coupon Removed",c,l),checkoutStarted:(c,l)=>m("Checkout Started",c,l),promotionViewed:(c,l)=>m("Promotion Viewed",c,l),promotionClicked:(c,l)=>m("Promotion Clicked",c,l),checkoutStepViewed:(c,l)=>m("Checkout Step Viewed",c,l),checkoutStepCompleted:(c,l)=>m("Checkout Step Completed",c,l),paymentInfoEntered:(c,l)=>m("Payment Info Entered",c,l),checkoutFailed:(c,l)=>m("Checkout Failed",c,l),signedIn:(c,l)=>m("Signed In",c,l),signedUp:(c,l)=>m("Signed Up",c,l),signedOut:c=>Vt(m("Signed Out",{},c)),newsletterSubscribed:(c,l)=>m("Newsletter Subscribed",c,l),newsletterUnsubscribed:(c,l)=>m("Newsletter Unsubscribed",c,l),backInStockSubscribed:(c,l)=>m("Back In Stock Subscribed",c,l),productReviewed:(c,l)=>m("Product Reviewed",c,l),consentUpdated:(c,l)=>m("Consent Updated",c,l),flush:c=>x.flush(c),recommendationContext(){if(!K())return{};try{return B(),bt(Fn())}catch{return{}}},get consent(){return o?o.state:null},servingHeaders:()=>yn(o?.state??null),get lastPageMessageId(){return k()},get anonymousId(){return q(D(n.getAnonymousId,null))},[ms](c,l,A){if(typeof this[c]=="function"){_=typeof A?.messageId=="string"&&typeof A?.timestamp=="string"?{messageId:A.messageId,timestamp:A.timestamp}:null;try{this[c](...Array.isArray(l)?l:[])}finally{_=null}}}})}var $t=Symbol.for("@thg-agentic/hyper-personalisation-web.bootstrap"),As=Symbol.for("@thg-agentic/hyper-personalisation-web.drain"),Es=Symbol.for("@thg-agentic/hyper-personalisation-web.carry"),hr=Symbol.for("@thg-agentic/hyper-personalisation-web.replay"),vs=Symbol.for("@thg-agentic/hyper-personalisation-web.assignment"),Cs=Symbol.for("@thg-agentic/hyper-personalisation-web.recommendation-context"),Ze=e=>e?()=>M(e):()=>null,wr={didomi:e=>wn({purposes:e.purposes}),onetrust:e=>Sn({groups:e.groups,impliedConsent:e.impliedConsent}),cookie:e=>_n({name:e.name,categories:e.categories,refusedValue:e.refusedValue,source:e.source,changeEvent:e.changeEvent}),forwarded:e=>bn({name:e.name}),static:e=>{if(!e.state||typeof e.state!="object")throw new Error('consent.state is required for provider "static"');return xn(e.state)}},gr=Object.keys(wr),we=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),Ye=e=>typeof e=="string"&&e!=="",Ps=e=>Array.isArray(e)&&e.every(t=>typeof t=="string"),Sr=e=>we(e)&&typeof e.read=="function";function Os(e,t={}){let n=[];if(!we(e))return["config must be { writeKey, apiHost? }"];Ye(e.writeKey)||n.push("writeKey is required"),le(e.apiHost)||n.push("apiHost, when given, must be a host or an http(s) origin"),t.propertyId!==void 0&&!Ye(t.propertyId)&&n.push("propertyId must be a string");let{consent:r}=t;if(!Sr(r)&&!(we(r)&&gr.includes(r.provider))&&n.push(`consent must be a consent adapter or { provider: ${gr.join(" | ")} }`),t.autocapture!==void 0&&t.autocapture!==!1&&!we(t.autocapture)&&n.push("autocapture must be false or { promotions, productLists, recommendations }"),t.beforeSend!==void 0&&typeof t.beforeSend!="function"&&n.push("beforeSend must be a function"),t.identityCookies!==void 0)if(!we(t.identityCookies))n.push("identityCookies must be an object");else for(let o of["anonymousId","sessionId"]){let s=t.identityCookies[o];s!==void 0&&!Ye(s)&&n.push(`identityCookies.${o} must be a cookie name`)}for(let o of["getCurrency","getShipToCountry","getLocale"])t[o]!==void 0&&typeof t[o]!="function"&&n.push(`${o} must be a function`);return t.dataLayer!==void 0&&(we(t.dataLayer)?(t.dataLayer.name!==void 0&&!Ye(t.dataLayer.name)&&n.push("dataLayer.name must be a string"),t.dataLayer.ignore!==void 0&&!Ps(t.dataLayer.ignore)&&n.push("dataLayer.ignore must be an array of strings")):n.push("dataLayer must be an object")),n}function Ls(e,t,n){if(Sr(e))return mt(e,t.consentPurposes);let{provider:r,...o}=e,s=n?.consent?.[r]??wr[r];return mt(s(o),t.consentPurposes)}var _r=(e,t)=>`${e??""}|${t??""}`;function Ts(e,t){let n=q(t?.userId),r=Je(t?.emailSha256);if(!n&&!r)return null;try{let o=F(T("identified"),e);if(sessionStorage.getItem(o)===_r(n,r))return null}catch{}return{...n?{userId:n}:{},...r?{email_sha256:r}:{}}}async function Ns({writeKey:e,apiHost:t},n){if(n.settings!==void 0)return{settings:Ct(n.settings),revalidated:null};let r=tr(t,e),o=nr(e);if(o)return{settings:o,revalidated:r};let s=await r,i=s??vt;return{settings:i,revalidated:Promise.resolve(i),unreachable:s===null}}function br(e,t){let n=t??{},r=typeof window<"u"?window:null;if(r?.[$t])return r[$t];let o=pn(e?.writeKey,()=>{let{analytics:i}=_e(M(T("consent")));return i===!0||i===null&&n.holdAcrossPages===!0}),s=Ds(e,n,o);if(r){let i=n.extend?.getSessionId??Ze(n.identityCookies?.sessionId),a=Ze(n.identityCookies?.anonymousId);r[vs]=({slot:u,arm:d}={})=>Wt({sessionId:Oe(i(),a()),slot:u,arm:d}),r[$t]=s,r[Es]=o,r[As]?.(s)}return s}function Rs(){let e=globalThis.performance?.now?.();return new Date(Date.now()-(Number.isFinite(e)?e:0)).toISOString()}function yr(e,t){if(t===!1)return()=>{};let n={promotions:!0,productLists:!0,recommendations:!0,exposures:!0,...t},r=s=>s&&typeof s=="object"?s:{},o=[];try{n.promotions&&o.push(nt(e,r(n.promotions))),n.productLists&&o.push(tt(e,r(n.productLists))),n.recommendations&&o.push(rt(e,r(n.recommendations))),n.exposures&&o.push(et(e,r(n.exposures)))}catch(s){console.warn("[hp] autocapture not started:",s?.message??s)}return()=>{for(let s of o)s()}}function Xe(e){return e.close(),null}async function Ds(e,t,n){try{let r=Os(e,t);if(r.length)return console.warn(`[hp] not started, the configuration is invalid: ${r.join("; ")}`),Xe(n);Te(t.storageNames),Ne();let{writeKey:o}=e,[{settings:s,revalidated:i,unreachable:a},u]=await Promise.all([Ns(e,t),Promise.resolve(t.identity).catch(()=>null)]),d=i?s:null,f=!1,p=()=>f&&d&&rr(o,d);if(i?.then(y=>{y&&(d=y,y.enabled?p():Pt(o))}),a)return null;if(!s.enabled)return t.debug&&console.info("[hp] off: the settings for this write key do not enable it"),Xe(n);let g=t.propertyId??s.propertyId;if(!g)return console.warn("[hp] not started: this write key covers several properties, so propertyId is required"),Xe(n);let{preset:x}=t,w=Ts(g,u),b=t.debug===!0||s.debug?.enabled===!0||vn(s.debug?.tokenSha256??null,T("debug")),k=q(u?.userId),E=mr({apiHost:Qn(e.apiHost,s.apiHost),writeKey:o,propertyId:g,pageType:pe.has(t.pageType)?t.pageType:void 0,environment:s.environment,queryParamAllowlist:s.queryParamAllowlist??void 0,plan:s.plan,sampleRate:s.sampleRate??1,holdout:s.holdouts?.[g],getCurrency:t.getCurrency,getShipToCountry:t.getShipToCountry,getLocale:t.getLocale,consent:Ls(t.consent,s,x),consentCookieDomain:t.consentCookieDomain,storageNames:t.storageNames,holdAcrossPages:t.holdAcrossPages===!0,mintAnonymousId:t.mintAnonymousId,debug:b,anonymousIdSource:s.anonymousId??void 0,getAnonymousId:Ze(t.identityCookies?.anonymousId),getSessionId:t.identityCookies?.sessionId?Ze(t.identityCookies.sessionId):void 0,getUserId:()=>k,beforeSend:t.beforeSend,...t.extend,onConsentStatus(y){if(y==="granted"&&(f=!0,p()),y==="denied"){Pt(o);try{sessionStorage.removeItem(F(T("identified"),g))}catch{}}t.extend?.onConsentStatus?.(y)},onEvent(y){if(y.type==="identify"){let _=_r(q(y.userId),Je(y.traits?.email_sha256));try{sessionStorage.setItem(F(T("identified"),g),_)}catch{}}t.extend?.onEvent?.(y)}});typeof window<"u"&&(window[Cs]=()=>E.recommendationContext());for(let[y,_,L]of n.take())try{E[hr](y,_,L)}catch(R){console.warn(`[hp] carried ${y} failed`,R)}E[hr]("page",[t.pageType?{type:t.pageType}:{}],{messageId:Z(),timestamp:Rs()});let h=yr(E,t.autocapture),v=E.page;E.page=wt("page",(...y)=>{let _=v(...y);return h(),h=yr(E,t.autocapture),_});let S=typeof window<"u"?window:null;if(S?.addEventListener("pageshow",y=>{y.persisted&&E.page({navigation_trigger:"back_forward"})}),t.dataLayer&&S){let y=t.dataLayer.name??"dataLayer";S[y]=S[y]||[],En(E,{...x,dataLayer:S[y],ignore:[...x?.ignore??[],...t.dataLayer.ignore??[]],onError:_=>b&&console.warn("[hp] dataLayer mapping failed",_)})}return w&&E.identify(w,void 0,be),E}catch(r){return console.warn("[hp] not started:",r?.message??r),Xe(n)}}function xr(e){e.initialized=!0,br(e._config,e._options).then(t=>{let n=e.splice(0);if(!t){for(let r of e.methods??[])e[r]=()=>e;return}e.client=t;for(let[r,o]of Object.entries(t))typeof o=="function"&&(e[r]=o);for(let[r,...o]of n)try{t[r]?.(...o)}catch(s){console.warn(`[hp] queued ${r} failed`,s)}})}var V=window.hp=window.hp||[];V.servingHeaders??(V.servingHeaders=()=>({}));V.inHoldout??(V.inHoldout=()=>!0);V.personalisationGroup??(V.personalisationGroup=()=>"excluded");V.recommendationContext??(V.recommendationContext=()=>({}));V.initialized||(V._config?xr(V):V.load=(e,t)=>{V._config=e,V._options=t??{},xr(V)});})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thg-agentic/hyper-personalisation-web",
3
- "version": "3.22.0",
3
+ "version": "3.22.2",
4
4
  "description": "Browser SDK for the THG Hyper-Personalisation event specification: event tracking from a write key and remote settings, strict CMP-agnostic consent, a GA4 dataLayer bridge and in-session audience evaluation. Dependency-free ESM on the Segment wire protocol, a CDN script (dist/hp.min.js), and an optional @segment/analytics-next plugin path.",
5
5
  "type": "module",
6
6
  "main": "./src/index.js",
@@ -74,7 +74,7 @@
74
74
  "esbuild": "^0.28.2",
75
75
  "jsdom": "^30.1.1",
76
76
  "typescript": "^7.0.2",
77
- "@thg-agentic/hyper-personalisation-spec": "1.15.0"
77
+ "@thg-agentic/hyper-personalisation-spec": "1.16.0"
78
78
  },
79
79
  "scripts": {
80
80
  "test": "node --test tests/*.test.mjs",
package/src/bootstrap.js CHANGED
@@ -484,6 +484,11 @@ async function start(config, options, carry) {
484
484
  });
485
485
 
486
486
  const host = typeof window !== 'undefined' ? window : null;
487
+ // A page restored from the back/forward cache runs no script again, so it would be shown
488
+ // with no page view and no list impressions. It is a back_forward view like any other.
489
+ host?.addEventListener('pageshow', (event) => {
490
+ if (event.persisted) client.page({ navigation_trigger: 'back_forward' });
491
+ });
487
492
  if (options.dataLayer && host) {
488
493
  const name = options.dataLayer.name ?? 'dataLayer';
489
494
  host[name] = host[name] || [];
@@ -260,7 +260,15 @@ export function createConsentGate(options) {
260
260
  onHidden(event);
261
261
  };
262
262
 
263
- const onPageShow = () => resumeRecheck();
263
+ /**
264
+ * A page restored from the back/forward cache runs no script again, and bootstrap sends a page view
265
+ * for it, so the CMP's answer is read once first: web.dev's bfcache guidance is to refresh state on
266
+ * a `pageshow` whose `persisted` is true. Other tabs are otherwise heard at their next page load.
267
+ */
268
+ const onPageShow = (event) => {
269
+ if (event?.persisted && state !== null) apply(read());
270
+ resumeRecheck();
271
+ };
264
272
 
265
273
  return {
266
274
  get status() {
package/src/consent.js CHANGED
@@ -337,26 +337,32 @@ export function oneTrustConsent(options = {}) {
337
337
  };
338
338
  const impliedConsent = options.impliedConsent === true;
339
339
 
340
+ /**
341
+ * The `OptanonConsent` cookie first: OneTrust writes it before it notifies and reads its own
342
+ * groups from it, while `OnetrustActiveGroups` is a copy a back/forward-cache restore leaves stale.
343
+ * `OnetrustActiveGroups` answers before OneTrust has written the cookie.
344
+ */
340
345
  function activeGroups() {
341
- const live = hasWindow() ? window.OnetrustActiveGroups : undefined;
342
- if (typeof live === 'string' && live.length) {
343
- const active = new Set(
344
- live
345
- .split(',')
346
- .map((g) => g.trim())
347
- .filter(Boolean),
348
- );
349
- return (id) => active.has(id);
350
- }
351
346
  const cookie = parseFormCookie(getCookie('OptanonConsent'));
352
- if (!cookie.groups) return null;
353
- const flags = {};
354
- for (const entry of cookie.groups.split(',')) {
355
- const [id, flag] = entry.split(':');
356
- if (id?.trim())
357
- flags[id.trim()] = flag === '1' ? true : flag === '0' ? false : null;
347
+ if (cookie.groups) {
348
+ const flags = {};
349
+ for (const entry of cookie.groups.split(',')) {
350
+ const [id, flag] = entry.split(':');
351
+ if (id?.trim())
352
+ flags[id.trim()] = flag === '1' ? true : flag === '0' ? false : null;
353
+ }
354
+ // A group the cookie does not list is not consented, as it is absent from the live list.
355
+ return (id) => flags[id] ?? false;
358
356
  }
359
- return (id) => flags[id] ?? null;
357
+ const live = hasWindow() ? window.OnetrustActiveGroups : undefined;
358
+ if (typeof live !== 'string' || !live.length) return null;
359
+ const active = new Set(
360
+ live
361
+ .split(',')
362
+ .map((g) => g.trim())
363
+ .filter(Boolean),
364
+ );
365
+ return (id) => active.has(id);
360
366
  }
361
367
 
362
368
  function answered() {
package/src/context.js CHANGED
@@ -251,6 +251,23 @@ export function scrubReferrer(referrer, origin, cfg = {}) {
251
251
  }
252
252
  }
253
253
 
254
+ /**
255
+ * A link's URL as it may leave the browser: resolved against the page, then scrubbed as a referrer
256
+ * is. A host can decorate its links with the landing page's query, an email's recipient ids
257
+ * included, so a clicked link is held to the page URL's rules.
258
+ */
259
+ export function scrubHref(href, cfg = {}) {
260
+ if (typeof href !== 'string' || typeof location === 'undefined') return null;
261
+ try {
262
+ const url = new URL(href, location.href);
263
+ // mailto:, tel: and javascript: carry their payload where a web URL has its path.
264
+ if (url.protocol !== 'https:' && url.protocol !== 'http:') return null;
265
+ return scrubReferrer(url.href, location.origin, cfg);
266
+ } catch {
267
+ return null;
268
+ }
269
+ }
270
+
254
271
  /** ISO-4217, uppercased; anything else is dropped rather than sent to fail validation. */
255
272
  export function currencyCode(value) {
256
273
  if (typeof value !== 'string') return null;
package/src/index.js CHANGED
@@ -45,7 +45,7 @@
45
45
  import { assignmentSession, surfaceExposureToken } from './assignment.js';
46
46
  import { hostConsent, servingHeaders } from './consent.js';
47
47
  import { createConsentGate } from './consent-gate.js';
48
- import { buildContext, getCookie, perRequest } from './context.js';
48
+ import { buildContext, getCookie, perRequest, scrubHref } from './context.js';
49
49
  import { createDecisionMemory, servedDecisions } from './decisions.js';
50
50
  import { createHeldStore, deviceIdFrom } from './device-storage.js';
51
51
  import {
@@ -394,6 +394,13 @@ export function createAnalytics(options) {
394
394
  }
395
395
  };
396
396
 
397
+ // A document restored from the back/forward cache resumes after the pages it led to: the tab's
398
+ // last page view is the one in storage, not this document's own.
399
+ if (typeof window !== 'undefined')
400
+ window.addEventListener('pageshow', (event) => {
401
+ if (event.persisted) lastPageMessageId = null;
402
+ });
403
+
397
404
  const writeLastPageMessageId = (id) => {
398
405
  lastPageMessageId = id || null;
399
406
  if (strict && gate.status !== 'granted') return;
@@ -447,6 +454,8 @@ export function createAnalytics(options) {
447
454
  };
448
455
 
449
456
  if (event.properties) event.properties = pruneProperties(event.properties);
457
+ if (typeof event.properties?.href === 'string')
458
+ event.properties.href = scrubHref(event.properties.href, cfg);
450
459
 
451
460
  // Outside the source's sample (3.18): nothing about this visitor is sent.
452
461
  if (!force && !sampledIn(event.anonymousId, cfg.sampleRate)) {
@@ -1,4 +1,4 @@
1
1
  // Generated from the spec by scripts/build-types.mjs. DO NOT EDIT: run `pnpm run build:types`.
2
2
 
3
3
  /** The event specification this SDK emits, stamped on every event as context.spec.version. */
4
- export const SPEC_VERSION = '1.15';
4
+ export const SPEC_VERSION = '1.16';
package/src/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const VERSION = '3.22.0';
1
+ export const VERSION = '3.22.2';
2
2
  export const LIB = '@thg-agentic/hyper-personalisation-web';
package/types/events.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  // Generated from spec/registry.json by scripts/generate-sdk-models.mjs.
2
2
  // DO NOT EDIT. Change the schema and regenerate — the schema is the contract,
3
3
  // and a hand-edit here is an SDK that disagrees with the ingest.
4
- // Spec version: 1.15
4
+ // Spec version: 1.16
5
5
 
6
6
  /** context.source.environment. Environment the producer runs in. */
7
7
  export type CdpSourceEnvironment = 'production' | 'staging' | 'development';
@@ -76,7 +76,7 @@ export interface DecisionMade {
76
76
  latency_ms?: number | null;
77
77
  }
78
78
 
79
- /** A visitor interacted with a personalised surface: viewed it, clicked it (for example opened a product from a rail), or dismissed it. */
79
+ /** A visitor acted on a personalised surface: clicked it (for example opened a product from a rail) or dismissed it. */
80
80
  export interface SlotEngaged {
81
81
  decision_id: string;
82
82
  slot: string;
@@ -631,7 +631,7 @@ export interface ApplicationUpdated {
631
631
  }
632
632
 
633
633
  /** The spec version these models implement. SDKs stamp it on context.spec.version. */
634
- export const SPEC_VERSION = '1.15';
634
+ export const SPEC_VERSION = '1.16';
635
635
 
636
636
  /** Every event name the registry accepts. Anything else is rejected at the ingest. */
637
637
  export type CdpEventName =