lighthouse 11.7.0-dev.20240408 → 11.7.1
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/CONTRIBUTING.md +2 -2
- package/cli/test/smokehouse/core-tests.js +2 -0
- package/core/audits/accessibility/duplicate-id-active.d.ts +10 -0
- package/core/audits/accessibility/duplicate-id-active.js +42 -0
- package/core/audits/accessibility/target-size.js +1 -0
- package/core/audits/byte-efficiency/byte-efficiency-audit.d.ts +16 -0
- package/core/audits/byte-efficiency/byte-efficiency-audit.js +38 -1
- package/core/audits/byte-efficiency/offscreen-images.d.ts +11 -0
- package/core/audits/byte-efficiency/offscreen-images.js +15 -0
- package/core/audits/dobetterweb/uses-http2.d.ts +13 -0
- package/core/audits/dobetterweb/uses-http2.js +34 -2
- package/core/audits/layout-shift-elements.d.ts +16 -0
- package/core/audits/layout-shift-elements.js +101 -0
- package/core/audits/no-unload-listeners.d.ts +16 -0
- package/core/audits/no-unload-listeners.js +86 -0
- package/core/audits/preload-fonts.d.ts +5 -1
- package/core/audits/preload-fonts.js +10 -1
- package/core/audits/script-elements-test-audit.d.ts +14 -0
- package/core/audits/script-elements-test-audit.js +29 -0
- package/core/audits/seo/is-crawlable.d.ts +1 -2
- package/core/audits/seo/plugins.d.ts +15 -0
- package/core/audits/seo/plugins.js +150 -0
- package/core/audits/seo/tap-targets.d.ts +50 -0
- package/core/audits/seo/tap-targets.js +352 -0
- package/core/audits/uses-rel-preload.d.ts +5 -1
- package/core/audits/uses-rel-preload.js +11 -1
- package/core/audits/work-during-interaction.d.ts +2 -2
- package/core/audits/work-during-interaction.js +2 -2
- package/core/computed/js-bundles.d.ts +1 -1
- package/core/computed/metrics/lantern-first-contentful-paint.d.ts +82 -13
- package/core/computed/metrics/lantern-first-contentful-paint.js +178 -15
- package/core/computed/metrics/lantern-first-meaningful-paint.d.ts +12 -13
- package/core/computed/metrics/lantern-first-meaningful-paint.js +49 -10
- package/core/computed/metrics/lantern-interactive.d.ts +21 -13
- package/core/computed/metrics/lantern-interactive.js +84 -11
- package/core/computed/metrics/lantern-largest-contentful-paint.d.ts +25 -13
- package/core/computed/metrics/lantern-largest-contentful-paint.js +80 -12
- package/core/computed/metrics/lantern-max-potential-fid.d.ts +24 -13
- package/core/computed/metrics/lantern-max-potential-fid.js +64 -11
- package/core/computed/metrics/lantern-metric.d.ts +18 -9
- package/core/computed/metrics/lantern-metric.js +31 -13
- package/core/computed/metrics/lantern-speed-index.d.ts +32 -13
- package/core/computed/metrics/lantern-speed-index.js +116 -12
- package/core/computed/metrics/lantern-total-blocking-time.d.ts +25 -13
- package/core/computed/metrics/lantern-total-blocking-time.js +94 -10
- package/core/computed/metrics/metric.js +3 -1
- package/core/computed/module-duplication.d.ts +1 -1
- package/core/computed/page-dependency-graph.js +1 -2
- package/core/config/default-config.js +74 -46
- package/core/config/experimental-config.js +0 -11
- package/core/config/metrics-to-audits.d.ts +19 -0
- package/core/config/metrics-to-audits.js +62 -0
- package/core/gather/gatherers/accessibility.js +3 -1
- package/core/gather/gatherers/global-listeners.d.ts +27 -0
- package/core/gather/gatherers/global-listeners.js +108 -0
- package/core/gather/gatherers/script-elements.d.ts +21 -0
- package/core/gather/gatherers/script-elements.js +100 -0
- package/core/gather/gatherers/seo/embedded-content.d.ts +10 -0
- package/core/gather/gatherers/seo/embedded-content.js +63 -0
- package/core/gather/gatherers/seo/tap-targets.d.ts +21 -0
- package/core/gather/gatherers/seo/tap-targets.js +389 -0
- package/core/gather/gatherers/trace-elements.d.ts +10 -0
- package/core/gather/gatherers/trace-elements.js +19 -0
- package/core/lib/lantern/page-dependency-graph.d.ts +4 -4
- package/core/lib/lantern/page-dependency-graph.js +5 -5
- package/core/lib/lighthouse-compatibility.js +10 -53
- package/dist/report/bundle.esm.js +1 -1
- package/dist/report/flow.js +14 -14
- package/dist/report/standalone.js +1 -1
- package/flow-report/src/summary/category.tsx +12 -10
- package/package.json +1 -1
- package/report/renderer/performance-category-renderer.d.ts +7 -0
- package/report/renderer/performance-category-renderer.js +11 -1
- package/report/renderer/report-utils.js +10 -13
- package/shared/localization/locales/ar-XB.json +64 -1
- package/shared/localization/locales/ar.json +64 -1
- package/shared/localization/locales/bg.json +64 -1
- package/shared/localization/locales/ca.json +64 -1
- package/shared/localization/locales/cs.json +64 -1
- package/shared/localization/locales/da.json +64 -1
- package/shared/localization/locales/de.json +64 -1
- package/shared/localization/locales/el.json +64 -1
- package/shared/localization/locales/en-GB.json +64 -1
- package/shared/localization/locales/en-US.json +65 -2
- package/shared/localization/locales/en-XA.json +64 -1
- package/shared/localization/locales/en-XL.json +65 -2
- package/shared/localization/locales/es-419.json +64 -1
- package/shared/localization/locales/es.json +64 -1
- package/shared/localization/locales/fi.json +64 -1
- package/shared/localization/locales/fil.json +64 -1
- package/shared/localization/locales/fr.json +64 -1
- package/shared/localization/locales/he.json +64 -1
- package/shared/localization/locales/hi.json +64 -1
- package/shared/localization/locales/hr.json +64 -1
- package/shared/localization/locales/hu.json +64 -1
- package/shared/localization/locales/id.json +64 -1
- package/shared/localization/locales/it.json +64 -1
- package/shared/localization/locales/ja.json +64 -1
- package/shared/localization/locales/ko.json +64 -1
- package/shared/localization/locales/lt.json +64 -1
- package/shared/localization/locales/lv.json +64 -1
- package/shared/localization/locales/nl.json +64 -1
- package/shared/localization/locales/no.json +64 -1
- package/shared/localization/locales/pl.json +64 -1
- package/shared/localization/locales/pt-PT.json +64 -1
- package/shared/localization/locales/pt.json +64 -1
- package/shared/localization/locales/ro.json +64 -1
- package/shared/localization/locales/ru.json +64 -1
- package/shared/localization/locales/sk.json +64 -1
- package/shared/localization/locales/sl.json +64 -1
- package/shared/localization/locales/sr-Latn.json +64 -1
- package/shared/localization/locales/sr.json +64 -1
- package/shared/localization/locales/sv.json +64 -1
- package/shared/localization/locales/ta.json +64 -1
- package/shared/localization/locales/te.json +64 -1
- package/shared/localization/locales/th.json +64 -1
- package/shared/localization/locales/tr.json +64 -1
- package/shared/localization/locales/uk.json +64 -1
- package/shared/localization/locales/vi.json +64 -1
- package/shared/localization/locales/zh-HK.json +64 -1
- package/shared/localization/locales/zh-TW.json +64 -1
- package/shared/localization/locales/zh.json +64 -1
- package/tsconfig.json +0 -1
- package/types/artifacts.d.ts +17 -3
- package/types/config.d.ts +1 -0
- package/types/lhr/audit-details.d.ts +4 -9
- package/types/lhr/lhr.d.ts +2 -0
- package/core/lib/lantern/metrics/first-contentful-paint.d.ts +0 -79
- package/core/lib/lantern/metrics/first-contentful-paint.js +0 -200
- package/core/lib/lantern/metrics/first-meaningful-paint.d.ts +0 -6
- package/core/lib/lantern/metrics/first-meaningful-paint.js +0 -66
- package/core/lib/lantern/metrics/interactive.d.ts +0 -26
- package/core/lib/lantern/metrics/interactive.js +0 -112
- package/core/lib/lantern/metrics/largest-contentful-paint.d.ts +0 -19
- package/core/lib/lantern/metrics/largest-contentful-paint.js +0 -108
- package/core/lib/lantern/metrics/max-potential-fid.d.ts +0 -30
- package/core/lib/lantern/metrics/max-potential-fid.js +0 -92
- package/core/lib/lantern/metrics/speed-index.d.ts +0 -38
- package/core/lib/lantern/metrics/speed-index.js +0 -145
- package/core/lib/lantern/metrics/total-blocking-time.d.ts +0 -31
- package/core/lib/lantern/metrics/total-blocking-time.js +0 -128
|
@@ -2633,7 +2633,7 @@ details[open] .lh-clump-toggletext--hide { display: block;}
|
|
|
2633
2633
|
display: none;
|
|
2634
2634
|
}
|
|
2635
2635
|
}
|
|
2636
|
-
`),e.append(t);let n=r.createElement("div","lh-topbar"),o=r.createElementNS("http://www.w3.org/2000/svg","svg","lh-topbar__logo");o.setAttribute("role","img"),o.setAttribute("title","Lighthouse logo"),o.setAttribute("fill","none"),o.setAttribute("xmlns","http://www.w3.org/2000/svg"),o.setAttribute("viewBox","0 0 48 48");let i=r.createElementNS("http://www.w3.org/2000/svg","path");i.setAttribute("d","m14 7 10-7 10 7v10h5v7h-5l5 24H9l5-24H9v-7h5V7Z"),i.setAttribute("fill","#F63");let a=r.createElementNS("http://www.w3.org/2000/svg","path");a.setAttribute("d","M31.561 24H14l-1.689 8.105L31.561 24ZM18.983 48H9l1.022-4.907L35.723 32.27l1.663 7.98L18.983 48Z"),a.setAttribute("fill","#FFA385");let l=r.createElementNS("http://www.w3.org/2000/svg","path");l.setAttribute("fill","#FF3"),l.setAttribute("d","M20.5 10h7v7h-7z"),o.append(" ",i," ",a," ",l," ");let s=r.createElement("a","lh-topbar__url");s.setAttribute("href",""),s.setAttribute("target","_blank"),s.setAttribute("rel","noopener");let c=r.createElement("div","lh-tools"),d=r.createElement("div","lh-tools-locale lh-hidden"),p=r.createElement("button","lh-button lh-tool-locale__button");p.setAttribute("id","lh-button__swap-locales"),p.setAttribute("title","Show Language Picker"),p.setAttribute("aria-label","Toggle language picker"),p.setAttribute("aria-haspopup","menu"),p.setAttribute("aria-expanded","false"),p.setAttribute("aria-controls","lh-tools-locale__selector-wrapper");let h=r.createElementNS("http://www.w3.org/2000/svg","svg");h.setAttribute("width","20px"),h.setAttribute("height","20px"),h.setAttribute("viewBox","0 0 24 24"),h.setAttribute("fill","currentColor");let g=r.createElementNS("http://www.w3.org/2000/svg","path");g.setAttribute("d","M0 0h24v24H0V0z"),g.setAttribute("fill","none");let v=r.createElementNS("http://www.w3.org/2000/svg","path");v.setAttribute("d","M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"),h.append(g,v),p.append(" ",h," ");let w=r.createElement("div","lh-tools-locale__selector-wrapper");w.setAttribute("id","lh-tools-locale__selector-wrapper"),w.setAttribute("role","menu"),w.setAttribute("aria-labelledby","lh-button__swap-locales"),w.setAttribute("aria-hidden","true"),w.append(" "," "),d.append(" ",p," ",w," ");let m=r.createElement("button","lh-tools__button");m.setAttribute("id","lh-tools-button"),m.setAttribute("title","Tools menu"),m.setAttribute("aria-label","Toggle report tools menu"),m.setAttribute("aria-haspopup","menu"),m.setAttribute("aria-expanded","false"),m.setAttribute("aria-controls","lh-tools-dropdown");let x=r.createElementNS("http://www.w3.org/2000/svg","svg");x.setAttribute("width","100%"),x.setAttribute("height","100%"),x.setAttribute("viewBox","0 0 24 24");let F=r.createElementNS("http://www.w3.org/2000/svg","path");F.setAttribute("d","M0 0h24v24H0z"),F.setAttribute("fill","none");let L=r.createElementNS("http://www.w3.org/2000/svg","path");L.setAttribute("d","M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"),x.append(" ",F," ",L," "),m.append(" ",x," ");let S=r.createElement("div","lh-tools__dropdown");S.setAttribute("id","lh-tools-dropdown"),S.setAttribute("role","menu"),S.setAttribute("aria-labelledby","lh-tools-button");let P=r.createElement("a","lh-report-icon lh-report-icon--print");P.setAttribute("role","menuitem"),P.setAttribute("tabindex","-1"),P.setAttribute("href","#"),P.setAttribute("data-i18n","dropdownPrintSummary"),P.setAttribute("data-action","print-summary");let f=r.createElement("a","lh-report-icon lh-report-icon--print");f.setAttribute("role","menuitem"),f.setAttribute("tabindex","-1"),f.setAttribute("href","#"),f.setAttribute("data-i18n","dropdownPrintExpanded"),f.setAttribute("data-action","print-expanded");let _=r.createElement("a","lh-report-icon lh-report-icon--copy");_.setAttribute("role","menuitem"),_.setAttribute("tabindex","-1"),_.setAttribute("href","#"),_.setAttribute("data-i18n","dropdownCopyJSON"),_.setAttribute("data-action","copy");let b=r.createElement("a","lh-report-icon lh-report-icon--download lh-hidden");b.setAttribute("role","menuitem"),b.setAttribute("tabindex","-1"),b.setAttribute("href","#"),b.setAttribute("data-i18n","dropdownSaveHTML"),b.setAttribute("data-action","save-html");let k=r.createElement("a","lh-report-icon lh-report-icon--download");k.setAttribute("role","menuitem"),k.setAttribute("tabindex","-1"),k.setAttribute("href","#"),k.setAttribute("data-i18n","dropdownSaveJSON"),k.setAttribute("data-action","save-json");let A=r.createElement("a","lh-report-icon lh-report-icon--open");A.setAttribute("role","menuitem"),A.setAttribute("tabindex","-1"),A.setAttribute("href","#"),A.setAttribute("data-i18n","dropdownViewer"),A.setAttribute("data-action","open-viewer");let z=r.createElement("a","lh-report-icon lh-report-icon--open");z.setAttribute("role","menuitem"),z.setAttribute("tabindex","-1"),z.setAttribute("href","#"),z.setAttribute("data-i18n","dropdownSaveGist"),z.setAttribute("data-action","save-gist");let T=r.createElement("a","lh-report-icon lh-report-icon--open lh-hidden");T.setAttribute("role","menuitem"),T.setAttribute("tabindex","-1"),T.setAttribute("href","#"),T.setAttribute("data-i18n","dropdownViewUnthrottledTrace"),T.setAttribute("data-action","view-unthrottled-trace");let I=r.createElement("a","lh-report-icon lh-report-icon--dark");return I.setAttribute("role","menuitem"),I.setAttribute("tabindex","-1"),I.setAttribute("href","#"),I.setAttribute("data-i18n","dropdownDarkTheme"),I.setAttribute("data-action","toggle-dark"),S.append(" ",P," ",f," ",_," "," ",b," ",k," ",A," ",z," "," ",T," ",I," "),c.append(" ",d," ",m," ",S," "),n.append(" "," ",o," ",s," ",c," "),e.append(n),e}function ut(r){let e=r.createFragment(),t=r.createElement("div","lh-warnings lh-warnings--toplevel"),n=r.createElement("p","lh-warnings__msg"),o=r.createElement("ul");return t.append(" ",n," ",o," "),e.append(t),e}function ye(r,e){switch(e){case"3pFilter":return je(r);case"audit":return We(r);case"categoryHeader":return qe(r);case"chevron":return Ke(r);case"clump":return Je(r);case"crc":return Ze(r);case"crcChain":return Qe(r);case"elementScreenshot":return Ye(r);case"explodeyGauge":return Xe(r);case"footer":return et(r);case"fraction":return tt(r);case"gauge":return nt(r);case"gaugePwa":return rt(r);case"heading":return ot(r);case"metric":return it(r);case"scorescale":return at(r);case"scoresWrapper":return lt(r);case"snippet":return st(r);case"snippetContent":return ct(r);case"snippetHeader":return dt(r);case"snippetLine":return pt(r);case"styles":return ht(r);case"topbar":return gt(r);case"warningsToplevel":return ut(r)}throw new Error("unexpected component: "+e)}var te=class{constructor(e,t){this._document=e,this._lighthouseChannel="unknown",this._componentCache=new Map,this.rootEl=t}createElement(e,t){let n=this._document.createElement(e);if(t)for(let o of t.split(/\s+/))o&&n.classList.add(o);return n}createElementNS(e,t,n){let o=this._document.createElementNS(e,t);if(n)for(let i of n.split(/\s+/))i&&o.classList.add(i);return o}createSVGElement(e,t){return this._document.createElementNS("http://www.w3.org/2000/svg",e,t)}createFragment(){return this._document.createDocumentFragment()}createTextNode(e){return this._document.createTextNode(e)}createChildOf(e,t,n){let o=this.createElement(t,n);return e.append(o),o}createComponent(e){let t=this._componentCache.get(e);if(t){let o=t.cloneNode(!0);return this.findAll("style",o).forEach(i=>i.remove()),o}return t=ye(this,e),this._componentCache.set(e,t),t.cloneNode(!0)}clearComponentCache(){this._componentCache.clear()}convertMarkdownLinkSnippets(e,t={}){let n=this.createElement("span");for(let o of C.splitMarkdownLink(e)){let i=o.text.includes("`")?this.convertMarkdownCodeSnippets(o.text):o.text;if(!o.isLink){n.append(i);continue}let a=new URL(o.linkHref);(["https://developers.google.com","https://web.dev","https://developer.chrome.com"].includes(a.origin)||t.alwaysAppendUtmSource)&&(a.searchParams.set("utm_source","lighthouse"),a.searchParams.set("utm_medium",this._lighthouseChannel));let s=this.createElement("a");s.rel="noopener",s.target="_blank",s.append(i),this.safelySetHref(s,a.href),n.append(s)}return n}safelySetHref(e,t){if(t=t||"",t.startsWith("#")){e.href=t;return}let n=["https:","http:"],o;try{o=new URL(t)}catch{}o&&n.includes(o.protocol)&&(e.href=o.href)}safelySetBlobHref(e,t){if(t.type!=="text/html"&&t.type!=="application/json")throw new Error("Unsupported blob type");let n=URL.createObjectURL(t);e.href=n}convertMarkdownCodeSnippets(e){let t=this.createElement("span");for(let n of C.splitMarkdownCodeSpans(e))if(n.isCode){let o=this.createElement("code");o.textContent=n.text,t.append(o)}else t.append(this._document.createTextNode(n.text));return t}setLighthouseChannel(e){this._lighthouseChannel=e}document(){return this._document}isDevTools(){return!!this._document.querySelector(".lh-devtools")}find(e,t){let n=this.maybeFind(e,t);if(n===null)throw new Error(`query ${e} not found`);return n}maybeFind(e,t){return t.querySelector(e)}findAll(e,t){return Array.from(t.querySelectorAll(e))}fireEventOn(e,t=this._document,n){let o=new CustomEvent(e,n?{detail:n}:void 0);t.dispatchEvent(o)}saveFile(e,t){let n=this.createElement("a");n.download=t,this.safelySetBlobHref(n,e),this._document.body.append(n),n.click(),this._document.body.removeChild(n),setTimeout(()=>URL.revokeObjectURL(n.href),500)}};var xe=0,u=class r{static i18n=null;static strings={};static reportJson=null;static apply(e){r.strings={...Ee,...e.providedStrings},r.i18n=e.i18n,r.reportJson=e.reportJson}static getUniqueSuffix(){return xe++}static resetUniqueSuffix(){xe=0}};var ke="data:image/jpeg;base64,";function Ae(r){r.configSettings.locale||(r.configSettings.locale="en"),r.configSettings.formFactor||(r.configSettings.formFactor=r.configSettings.emulatedFormFactor),r.finalDisplayedUrl=C.getFinalDisplayedUrl(r),r.mainDocumentUrl=C.getMainDocumentUrl(r);for(let n of Object.values(r.audits))if((n.scoreDisplayMode==="not_applicable"||n.scoreDisplayMode==="not-applicable")&&(n.scoreDisplayMode="notApplicable"),n.scoreDisplayMode==="informative"&&(n.score=1),n.details){if((n.details.type===void 0||n.details.type==="diagnostic")&&(n.details.type="debugdata"),n.details.type==="filmstrip")for(let o of n.details.items)o.data.startsWith(ke)||(o.data=ke+o.data);if(n.details.type==="table")for(let o of n.details.headings){let{itemType:i,text:a}=o;i!==void 0&&(o.valueType=i,delete o.itemType),a!==void 0&&(o.label=a,delete o.text);let l=o.subItemsHeading?.itemType;o.subItemsHeading&&l!==void 0&&(o.subItemsHeading.valueType=l,delete o.subItemsHeading.itemType)}if(n.id==="third-party-summary"&&(n.details.type==="opportunity"||n.details.type==="table")){let{headings:o,items:i}=n.details;if(o[0].valueType==="link"){o[0].valueType="text";for(let a of i)typeof a.entity=="object"&&a.entity.type==="link"&&(a.entity=a.entity.text);n.details.isEntityGrouped=!0}}}let[e]=r.lighthouseVersion.split(".").map(Number),t=r.categories.performance;if(t){if(e<9){r.categoryGroups||(r.categoryGroups={}),r.categoryGroups.hidden={title:""};for(let n of t.auditRefs)n.group?n.group==="load-opportunities"&&(n.group="diagnostics"):n.group="hidden"}else if(e<12)for(let n of t.auditRefs)n.group||(n.group="diagnostics")}if(e<12&&t){let n=new Map;for(let o of t.auditRefs){let i=o.relevantAudits;if(!(!i||!o.acronym))for(let a of i){let l=n.get(a)||[];l.push(o.acronym),n.set(a,l)}}for(let[o,i]of n){if(!i.length)continue;let a=r.audits[o];if(a&&!a.metricSavings){a.metricSavings={};for(let l of i)a.metricSavings[l]=0}}}if(r.environment||(r.environment={benchmarkIndex:0,networkUserAgent:r.userAgent,hostUserAgent:r.userAgent}),r.configSettings.screenEmulation||(r.configSettings.screenEmulation={width:-1,height:-1,deviceScaleFactor:-1,mobile:/mobile/i.test(r.environment.hostUserAgent),disabled:!1}),r.i18n||(r.i18n={}),r.audits["full-page-screenshot"]){let n=r.audits["full-page-screenshot"].details;n?r.fullPageScreenshot={screenshot:n.screenshot,nodes:n.nodes}:r.fullPageScreenshot=null,delete r.audits["full-page-screenshot"]}}var G=C.RATINGS,E=class r{static prepareReportResult(e){let t=JSON.parse(JSON.stringify(e));Ae(t);for(let o of Object.values(t.audits))o.details&&(o.details.type==="opportunity"||o.details.type==="table")&&!o.details.isEntityGrouped&&t.entities&&r.classifyEntities(t.entities,o.details);if(typeof t.categories!="object")throw new Error("No categories provided.");let n=new Map;for(let o of Object.values(t.categories))o.auditRefs.forEach(i=>{i.acronym&&n.set(i.acronym,i)}),o.auditRefs.forEach(i=>{let a=t.audits[i.id];i.result=a;let l=Object.keys(i.result.metricSavings||{});if(l.length){i.relevantMetrics=[];for(let s of l){let c=n.get(s);c&&i.relevantMetrics.push(c)}}t.stackPacks&&t.stackPacks.forEach(s=>{s.descriptions[i.id]&&(i.stackPacks=i.stackPacks||[],i.stackPacks.push({title:s.title,iconDataURL:s.iconDataURL,description:s.descriptions[i.id]}))})});return t}static getUrlLocatorFn(e){let t=e.find(o=>o.valueType==="url")?.key;if(t&&typeof t=="string")return o=>{let i=o[t];if(typeof i=="string")return i};let n=e.find(o=>o.valueType==="source-location")?.key;if(n)return o=>{let i=o[n];if(typeof i=="object"&&i.type==="source-location")return i.url}}static classifyEntities(e,t){let{items:n,headings:o}=t;if(!n.length||n.some(a=>a.entity))return;let i=r.getUrlLocatorFn(o);if(i)for(let a of n){let l=i(a);if(!l)continue;let s="";try{s=C.parseURL(l).origin}catch{}if(!s)continue;let c=e.find(d=>d.origins.includes(s));c&&(a.entity=c.name)}}static getTableItemSortComparator(e){return(t,n)=>{for(let o of e){let i=t[o],a=n[o];if((typeof i!=typeof a||!["number","string"].includes(typeof i))&&console.warn(`Warning: Attempting to sort unsupported value type: ${o}.`),typeof i=="number"&&typeof a=="number"&&i!==a)return a-i;if(typeof i=="string"&&typeof a=="string"&&i!==a)return i.localeCompare(a)}return 0}}static getEmulationDescriptions(e){let t,n,o,i=e.throttling,a=u.i18n,l=u.strings;switch(e.throttlingMethod){case"provided":o=n=t=l.throttlingProvided;break;case"devtools":{let{cpuSlowdownMultiplier:h,requestLatencyMs:g}=i;t=`${a.formatNumber(h)}x slowdown (DevTools)`,n=`${a.formatMilliseconds(g)} HTTP RTT, ${a.formatKbps(i.downloadThroughputKbps)} down, ${a.formatKbps(i.uploadThroughputKbps)} up (DevTools)`,o=g===150*3.75&&i.downloadThroughputKbps===1.6*1024*.9&&i.uploadThroughputKbps===750*.9?l.runtimeSlow4g:l.runtimeCustom;break}case"simulate":{let{cpuSlowdownMultiplier:h,rttMs:g,throughputKbps:v}=i;t=`${a.formatNumber(h)}x slowdown (Simulated)`,n=`${a.formatMilliseconds(g)} TCP RTT, ${a.formatKbps(v)} throughput (Simulated)`,o=g===150&&v===1.6*1024?l.runtimeSlow4g:l.runtimeCustom;break}default:o=t=n=l.runtimeUnknown}let s=e.channel==="devtools"?!1:e.screenEmulation.disabled,c=e.channel==="devtools"?e.formFactor==="mobile":e.screenEmulation.mobile,d=l.runtimeMobileEmulation;s?d=l.runtimeNoEmulation:c||(d=l.runtimeDesktopEmulation);let p=s?void 0:`${e.screenEmulation.width}x${e.screenEmulation.height}, DPR ${e.screenEmulation.deviceScaleFactor}`;return{deviceEmulation:d,screenEmulation:p,cpuThrottling:t,networkThrottling:n,summary:o}}static showAsPassed(e){switch(e.scoreDisplayMode){case"manual":case"notApplicable":return!0;case"error":case"informative":return!1;case"numeric":case"binary":default:return Number(e.score)>=G.PASS.minScore}}static calculateRating(e,t){if(t==="manual"||t==="notApplicable")return G.PASS.label;if(t==="error")return G.ERROR.label;if(e===null)return G.FAIL.label;let n=G.FAIL.label;return e>=G.PASS.minScore?n=G.PASS.label:e>=G.AVERAGE.minScore&&(n=G.AVERAGE.label),n}static calculateCategoryFraction(e){let t=0,n=0,o=0,i=0;for(let a of e.auditRefs){let l=r.showAsPassed(a.result);if(!(a.group==="hidden"||a.result.scoreDisplayMode==="manual"||a.result.scoreDisplayMode==="notApplicable")){if(a.result.scoreDisplayMode==="informative"){l||++o;continue}++t,i+=a.weight,l&&n++}}return{numPassed:n,numPassableAudits:t,numInformative:o,totalWeight:i}}static isPluginCategory(e){return e.startsWith("lighthouse-plugin-")}static shouldDisplayAsFraction(e){return e==="timespan"||e==="snapshot"}},Ee={varianceDisclaimer:"Values are estimated and may vary. The [performance score is calculated](https://developer.chrome.com/docs/lighthouse/performance/performance-scoring/) directly from these metrics.",calculatorLink:"See calculator.",showRelevantAudits:"Show audits relevant to:",opportunityResourceColumnLabel:"Opportunity",opportunitySavingsColumnLabel:"Estimated Savings",errorMissingAuditInfo:"Report error: no audit information",errorLabel:"Error!",warningHeader:"Warnings: ",warningAuditsGroupTitle:"Passed audits but with warnings",passedAuditsGroupTitle:"Passed audits",notApplicableAuditsGroupTitle:"Not applicable",manualAuditsGroupTitle:"Additional items to manually check",toplevelWarningsMessage:"There were issues affecting this run of Lighthouse:",crcInitialNavigation:"Initial Navigation",crcLongestDurationLabel:"Maximum critical path latency:",snippetExpandButtonLabel:"Expand snippet",snippetCollapseButtonLabel:"Collapse snippet",lsPerformanceCategoryDescription:"[Lighthouse](https://developers.google.com/web/tools/lighthouse/) analysis of the current page on an emulated mobile network. Values are estimated and may vary.",labDataTitle:"Lab Data",thirdPartyResourcesLabel:"Show 3rd-party resources",viewTreemapLabel:"View Treemap",viewTraceLabel:"View Trace",dropdownPrintSummary:"Print Summary",dropdownPrintExpanded:"Print Expanded",dropdownCopyJSON:"Copy JSON",dropdownSaveHTML:"Save as HTML",dropdownSaveJSON:"Save as JSON",dropdownViewer:"Open in Viewer",dropdownSaveGist:"Save as Gist",dropdownDarkTheme:"Toggle Dark Theme",dropdownViewUnthrottledTrace:"View Unthrottled Trace",runtimeSettingsDevice:"Device",runtimeSettingsNetworkThrottling:"Network throttling",runtimeSettingsCPUThrottling:"CPU throttling",runtimeSettingsUANetwork:"User agent (network)",runtimeSettingsBenchmark:"Unthrottled CPU/Memory Power",runtimeSettingsAxeVersion:"Axe version",runtimeSettingsScreenEmulation:"Screen emulation",footerIssue:"File an issue",runtimeNoEmulation:"No emulation",runtimeMobileEmulation:"Emulated Moto G Power",runtimeDesktopEmulation:"Emulated Desktop",runtimeUnknown:"Unknown",runtimeSingleLoad:"Single page session",runtimeAnalysisWindow:"Initial page load",runtimeAnalysisWindowTimespan:"User interactions timespan",runtimeAnalysisWindowSnapshot:"Point-in-time snapshot",runtimeSingleLoadTooltip:"This data is taken from a single page session, as opposed to field data summarizing many sessions.",throttlingProvided:"Provided by environment",show:"Show",hide:"Hide",expandView:"Expand view",collapseView:"Collapse view",runtimeSlow4g:"Slow 4G throttling",runtimeCustom:"Custom throttling",firstPartyChipLabel:"1st party",openInANewTabTooltip:"Open in a new tab",unattributable:"Unattributable",pwaRemovalMessage:"As per [Chrome\u2019s updated Installability Criteria](https://developer.chrome.com/blog/update-install-criteria), Lighthouse will be deprecating the PWA category in a future release. Please refer to the [updated PWA documentation](https://developer.chrome.com/docs/devtools/progressive-web-apps/) for future PWA testing."};var O=class{constructor(e,t){this.dom=e,this.detailsRenderer=t}get _clumpTitles(){return{warning:u.strings.warningAuditsGroupTitle,manual:u.strings.manualAuditsGroupTitle,passed:u.strings.passedAuditsGroupTitle,notApplicable:u.strings.notApplicableAuditsGroupTitle}}renderAudit(e){let t=u.strings,n=this.dom.createComponent("audit"),o=this.dom.find("div.lh-audit",n);o.id=e.result.id;let i=e.result.scoreDisplayMode;e.result.displayValue&&(this.dom.find(".lh-audit__display-text",o).textContent=e.result.displayValue);let a=this.dom.find(".lh-audit__title",o);a.append(this.dom.convertMarkdownCodeSnippets(e.result.title));let l=this.dom.find(".lh-audit__description",o);l.append(this.dom.convertMarkdownLinkSnippets(e.result.description));for(let h of e.relevantMetrics||[]){let g=this.dom.createChildOf(l,"span","lh-audit__adorn");g.title=`Relevant to ${h.result.title}`,g.textContent=h.acronym||h.id}e.stackPacks&&e.stackPacks.forEach(h=>{let g=this.dom.createElement("img","lh-audit__stackpack__img");g.src=h.iconDataURL,g.alt=h.title;let v=this.dom.convertMarkdownLinkSnippets(h.description,{alwaysAppendUtmSource:!0}),w=this.dom.createElement("div","lh-audit__stackpack");w.append(g,v),this.dom.find(".lh-audit__stackpacks",o).append(w)});let s=this.dom.find("details",o);if(e.result.details){let h=this.detailsRenderer.render(e.result.details);h&&(h.classList.add("lh-details"),s.append(h))}if(this.dom.find(".lh-chevron-container",o).append(this._createChevron()),this._setRatingClass(o,e.result.score,i),e.result.scoreDisplayMode==="error"){o.classList.add("lh-audit--error");let h=this.dom.find(".lh-audit__display-text",o);h.textContent=t.errorLabel,h.classList.add("lh-tooltip-boundary");let g=this.dom.createChildOf(h,"div","lh-tooltip lh-tooltip--error");g.textContent=e.result.errorMessage||t.errorMissingAuditInfo}else if(e.result.explanation){let h=this.dom.createChildOf(a,"div","lh-audit-explanation");h.textContent=e.result.explanation}let c=e.result.warnings;if(!c||c.length===0)return o;let d=this.dom.find("summary",s),p=this.dom.createChildOf(d,"div","lh-warnings");if(this.dom.createChildOf(p,"span").textContent=t.warningHeader,c.length===1)p.append(this.dom.createTextNode(c.join("")));else{let h=this.dom.createChildOf(p,"ul");for(let g of c){let v=this.dom.createChildOf(h,"li");v.textContent=g}}return o}injectFinalScreenshot(e,t,n){let o=t["final-screenshot"];if(!o||o.scoreDisplayMode==="error"||!o.details||o.details.type!=="screenshot")return null;let i=this.dom.createElement("img","lh-final-ss-image"),a=o.details.data;i.src=a,i.alt=o.title;let l=this.dom.find(".lh-category .lh-category-header",e),s=this.dom.createElement("div","lh-category-headercol"),c=this.dom.createElement("div","lh-category-headercol lh-category-headercol--separator"),d=this.dom.createElement("div","lh-category-headercol");s.append(...l.childNodes),s.append(n),d.append(i),l.append(s,c,d),l.classList.add("lh-category-header__finalscreenshot")}_createChevron(){let e=this.dom.createComponent("chevron");return this.dom.find("svg.lh-chevron",e)}_setRatingClass(e,t,n){let o=E.calculateRating(t,n);return e.classList.add(`lh-audit--${n.toLowerCase()}`),n!=="informative"&&e.classList.add(`lh-audit--${o}`),e}renderCategoryHeader(e,t,n){let o=this.dom.createComponent("categoryHeader"),i=this.dom.find(".lh-score__gauge",o),a=this.renderCategoryScore(e,t,n);if(i.append(a),e.description){let l=this.dom.convertMarkdownLinkSnippets(e.description);this.dom.find(".lh-category-header__description",o).append(l)}return o}renderAuditGroup(e){let t=this.dom.createElement("div","lh-audit-group"),n=this.dom.createElement("div","lh-audit-group__header");this.dom.createChildOf(n,"span","lh-audit-group__title").textContent=e.title,t.append(n);let o=null;return e.description&&(o=this.dom.convertMarkdownLinkSnippets(e.description),o.classList.add("lh-audit-group__description","lh-audit-group__footer"),t.append(o)),[t,o]}_renderGroupedAudits(e,t){let n=new Map,o="NotAGroup";n.set(o,[]);for(let a of e){let l=a.group||o;if(l==="hidden")continue;let s=n.get(l)||[];s.push(a),n.set(l,s)}let i=[];for(let[a,l]of n){if(a===o){for(let p of l)i.push(this.renderAudit(p));continue}let s=t[a],[c,d]=this.renderAuditGroup(s);for(let p of l)c.insertBefore(this.renderAudit(p),d);c.classList.add(`lh-audit-group--${a}`),i.push(c)}return i}renderUnexpandableClump(e,t){let n=this.dom.createElement("div");return this._renderGroupedAudits(e,t).forEach(i=>n.append(i)),n}renderClump(e,{auditRefsOrEls:t,description:n,openByDefault:o}){let i=this.dom.createComponent("clump"),a=this.dom.find(".lh-clump",i);o&&a.setAttribute("open","");let l=this.dom.find(".lh-audit-group__header",a),s=this._clumpTitles[e];this.dom.find(".lh-audit-group__title",l).textContent=s;let c=this.dom.find(".lh-audit-group__itemcount",a);c.textContent=`(${t.length})`;let d=t.map(h=>h instanceof HTMLElement?h:this.renderAudit(h));a.append(...d);let p=this.dom.find(".lh-audit-group",i);if(n){let h=this.dom.convertMarkdownLinkSnippets(n);h.classList.add("lh-audit-group__description","lh-audit-group__footer"),p.append(h)}return this.dom.find(".lh-clump-toggletext--show",p).textContent=u.strings.show,this.dom.find(".lh-clump-toggletext--hide",p).textContent=u.strings.hide,a.classList.add(`lh-clump--${e.toLowerCase()}`),p}renderCategoryScore(e,t,n){let o;if(n&&E.shouldDisplayAsFraction(n.gatherMode)?o=this.renderCategoryFraction(e):o=this.renderScoreGauge(e,t),n?.omitLabel&&this.dom.find(".lh-gauge__label,.lh-fraction__label",o).remove(),n?.onPageAnchorRendered){let i=this.dom.find("a",o);n.onPageAnchorRendered(i)}return o}renderScoreGauge(e,t){let n=this.dom.createComponent("gauge"),o=this.dom.find("a.lh-gauge__wrapper",n);E.isPluginCategory(e.id)&&o.classList.add("lh-gauge__wrapper--plugin");let i=Number(e.score),a=this.dom.find(".lh-gauge",n),l=this.dom.find("circle.lh-gauge-arc",a);l&&this._setGaugeArc(l,i);let s=Math.round(i*100),c=this.dom.find("div.lh-gauge__percentage",n);return c.textContent=s.toString(),e.score===null&&(c.classList.add("lh-gauge--error"),c.textContent="",c.title=u.strings.errorLabel),e.auditRefs.length===0||this.hasApplicableAudits(e)?o.classList.add(`lh-gauge__wrapper--${E.calculateRating(e.score)}`):(o.classList.add("lh-gauge__wrapper--not-applicable"),c.textContent="-",c.title=u.strings.notApplicableAuditsGroupTitle),this.dom.find(".lh-gauge__label",n).textContent=e.title,n}renderCategoryFraction(e){let t=this.dom.createComponent("fraction"),n=this.dom.find("a.lh-fraction__wrapper",t),{numPassed:o,numPassableAudits:i,totalWeight:a}=E.calculateCategoryFraction(e),l=o/i,s=this.dom.find(".lh-fraction__content",t),c=this.dom.createElement("span");c.textContent=`${o}/${i}`,s.append(c);let d=E.calculateRating(l);return a===0&&(d="null"),n.classList.add(`lh-fraction__wrapper--${d}`),this.dom.find(".lh-fraction__label",t).textContent=e.title,t}hasApplicableAudits(e){return e.auditRefs.some(t=>t.result.scoreDisplayMode!=="notApplicable")}_setGaugeArc(e,t){let n=2*Math.PI*Number(e.getAttribute("r")),o=Number(e.getAttribute("stroke-width")),i=.25*o/n;e.style.transform=`rotate(${-90+i*360}deg)`;let a=t*n-o/2;t===0&&(e.style.opacity="0"),t===1&&(a=n),e.style.strokeDasharray=`${Math.max(a,0)} ${n}`}_auditHasWarning(e){return!!e.result.warnings?.length}_getClumpIdForAuditRef(e){let t=e.result.scoreDisplayMode;return t==="manual"||t==="notApplicable"?t:E.showAsPassed(e.result)?this._auditHasWarning(e)?"warning":"passed":"failed"}render(e,t={},n){let o=this.dom.createElement("div","lh-category");o.id=e.id,o.append(this.renderCategoryHeader(e,t,n));let i=new Map;i.set("failed",[]),i.set("warning",[]),i.set("manual",[]),i.set("passed",[]),i.set("notApplicable",[]);for(let l of e.auditRefs){let s=this._getClumpIdForAuditRef(l),c=i.get(s);c.push(l),i.set(s,c)}for(let l of i.values())l.sort((s,c)=>c.weight-s.weight);let a=i.get("failed")?.length;for(let[l,s]of i){if(s.length===0)continue;if(l==="failed"){let h=this.renderUnexpandableClump(s,t);h.classList.add("lh-clump--failed"),o.append(h);continue}let c=l==="manual"?e.manualDescription:void 0,d=l==="warning"||l==="manual"&&a===0,p=this.renderClump(l,{auditRefsOrEls:s,description:c,openByDefault:d});o.append(p)}return o}};var Y=class{static initTree(e){let t=0,n=Object.keys(e);return n.length>0&&(t=e[n[0]].request.startTime),{tree:e,startTime:t,transferSize:0}}static createSegment(e,t,n,o,i,a){let l=e[t],s=Object.keys(e),c=s.indexOf(t)===s.length-1,d=!!l.children&&Object.keys(l.children).length>0,p=Array.isArray(i)?i.slice(0):[];return typeof a<"u"&&p.push(!a),{node:l,isLastChild:c,hasChildren:d,startTime:n,transferSize:o+l.request.transferSize,treeMarkers:p}}static createChainNode(e,t,n){let o=e.createComponent("crcChain");e.find(".lh-crc-node",o).setAttribute("title",t.node.request.url);let i=e.find(".lh-crc-node__tree-marker",o);t.treeMarkers.forEach(p=>{let h=p?"lh-tree-marker lh-vert":"lh-tree-marker";i.append(e.createElement("span",h),e.createElement("span","lh-tree-marker"))});let a=t.isLastChild?"lh-tree-marker lh-up-right":"lh-tree-marker lh-vert-right",l=t.hasChildren?"lh-tree-marker lh-horiz-down":"lh-tree-marker lh-right";i.append(e.createElement("span",a),e.createElement("span","lh-tree-marker lh-right"),e.createElement("span",l));let s=t.node.request.url,c=n.renderTextURL(s),d=e.find(".lh-crc-node__tree-value",o);if(d.append(c),!t.hasChildren){let{startTime:p,endTime:h,transferSize:g}=t.node.request,v=e.createElement("span","lh-crc-node__chain-duration");v.textContent=" - "+u.i18n.formatMilliseconds((h-p)*1e3)+", ";let w=e.createElement("span","lh-crc-node__chain-duration");w.textContent=u.i18n.formatBytesToKiB(g,.01),d.append(v,w)}return o}static buildTree(e,t,n,o,i,a){if(o.append(q.createChainNode(e,n,a)),n.node.children)for(let l of Object.keys(n.node.children)){let s=q.createSegment(n.node.children,l,n.startTime,n.transferSize,n.treeMarkers,n.isLastChild);q.buildTree(e,t,s,o,i,a)}}static render(e,t,n){let o=e.createComponent("crc"),i=e.find(".lh-crc",o);e.find(".lh-crc-initial-nav",o).textContent=u.strings.crcInitialNavigation,e.find(".lh-crc__longest_duration_label",o).textContent=u.strings.crcLongestDurationLabel,e.find(".lh-crc__longest_duration",o).textContent=u.i18n.formatMilliseconds(t.longestChain.duration);let a=q.initTree(t.chains);for(let l of Object.keys(a.tree)){let s=q.createSegment(a.tree,l,a.startTime,a.transferSize);q.buildTree(e,o,s,i,t,n)}return e.find(".lh-crc-container",o)}},q=Y;function mt(r,e){return e.left<=r.width&&0<=e.right&&e.top<=r.height&&0<=e.bottom}function Se(r,e,t){return r<e?e:r>t?t:r}function ft(r){return{x:r.left+r.width/2,y:r.top+r.height/2}}var V=class r{static getScreenshotPositions(e,t,n){let o=ft(e),i=Se(o.x-t.width/2,0,n.width-t.width),a=Se(o.y-t.height/2,0,n.height-t.height);return{screenshot:{left:i,top:a},clip:{left:e.left-i,top:e.top-a}}}static renderClipPathInScreenshot(e,t,n,o,i){let a=e.find("clipPath",t),l=`clip-${u.getUniqueSuffix()}`;a.id=l,t.style.clipPath=`url(#${l})`;let s=n.top/i.height,c=s+o.height/i.height,d=n.left/i.width,p=d+o.width/i.width,h=[`0,0 1,0 1,${s} 0,${s}`,`0,${c} 1,${c} 1,1 0,1`,`0,${s} ${d},${s} ${d},${c} 0,${c}`,`${p},${s} 1,${s} 1,${c} ${p},${c}`];for(let g of h){let v=e.createElementNS("http://www.w3.org/2000/svg","polygon");v.setAttribute("points",g),a.append(v)}}static installFullPageScreenshot(e,t){e.style.setProperty("--element-screenshot-url",`url('${t.data}')`)}static installOverlayFeature(e){let{dom:t,rootEl:n,overlayContainerEl:o,fullPageScreenshot:i}=e,a="lh-screenshot-overlay--enabled";n.classList.contains(a)||(n.classList.add(a),n.addEventListener("click",l=>{let s=l.target;if(!s)return;let c=s.closest(".lh-node > .lh-element-screenshot");if(!c)return;let d=t.createElement("div","lh-element-screenshot__overlay");o.append(d);let p={width:d.clientWidth*.95,height:d.clientHeight*.8},h={width:Number(c.dataset.rectWidth),height:Number(c.dataset.rectHeight),left:Number(c.dataset.rectLeft),right:Number(c.dataset.rectLeft)+Number(c.dataset.rectWidth),top:Number(c.dataset.rectTop),bottom:Number(c.dataset.rectTop)+Number(c.dataset.rectHeight)},g=r.render(t,i.screenshot,h,p);if(!g){d.remove();return}d.append(g),d.addEventListener("click",()=>d.remove())}))}static _computeZoomFactor(e,t){let o={x:t.width/e.width,y:t.height/e.height},i=.75*Math.min(o.x,o.y);return Math.min(1,i)}static render(e,t,n,o){if(!mt(t,n))return null;let i=e.createComponent("elementScreenshot"),a=e.find("div.lh-element-screenshot",i);a.dataset.rectWidth=n.width.toString(),a.dataset.rectHeight=n.height.toString(),a.dataset.rectLeft=n.left.toString(),a.dataset.rectTop=n.top.toString();let l=this._computeZoomFactor(n,o),s={width:o.width/l,height:o.height/l};s.width=Math.min(t.width,s.width),s.height=Math.min(t.height,s.height);let c={width:s.width*l,height:s.height*l},d=r.getScreenshotPositions(n,s,{width:t.width,height:t.height}),p=e.find("div.lh-element-screenshot__image",a);p.style.width=c.width+"px",p.style.height=c.height+"px",p.style.backgroundPositionY=-(d.screenshot.top*l)+"px",p.style.backgroundPositionX=-(d.screenshot.left*l)+"px",p.style.backgroundSize=`${t.width*l}px ${t.height*l}px`;let h=e.find("div.lh-element-screenshot__element-marker",a);h.style.width=n.width*l+"px",h.style.height=n.height*l+"px",h.style.left=d.clip.left*l+"px",h.style.top=d.clip.top*l+"px";let g=e.find("div.lh-element-screenshot__mask",a);return g.style.width=c.width+"px",g.style.height=c.height+"px",r.renderClipPathInScreenshot(e,g,d.clip,n,s),a}};var vt=["http://","https://","data:"],bt=["bytes","numeric","ms","timespanMs"],X=class{constructor(e,t={}){this._dom=e,this._fullPageScreenshot=t.fullPageScreenshot,this._entities=t.entities}render(e){switch(e.type){case"filmstrip":return this._renderFilmstrip(e);case"list":return this._renderList(e);case"table":case"opportunity":return this._renderTable(e);case"criticalrequestchain":return Y.render(this._dom,e,this);case"screenshot":case"debugdata":case"treemap-data":return null;default:return this._renderUnknown(e.type,e)}}_renderBytes(e){let t=u.i18n.formatBytesToKiB(e.value,e.granularity||.1),n=this._renderText(t);return n.title=u.i18n.formatBytes(e.value),n}_renderMilliseconds(e){let t;return e.displayUnit==="duration"?t=u.i18n.formatDuration(e.value):t=u.i18n.formatMilliseconds(e.value,e.granularity||10),this._renderText(t)}renderTextURL(e){let t=e,n,o,i;try{let l=C.parseURL(t);n=l.file==="/"?l.origin:l.file,o=l.file==="/"||l.hostname===""?"":`(${l.hostname})`,i=t}catch{n=t}let a=this._dom.createElement("div","lh-text__url");if(a.append(this._renderLink({text:n,url:t})),o){let l=this._renderText(o);l.classList.add("lh-text__url-host"),a.append(l)}return i&&(a.title=t,a.dataset.url=t),a}_renderLink(e){let t=this._dom.createElement("a");if(this._dom.safelySetHref(t,e.url),!t.href){let n=this._renderText(e.text);return n.classList.add("lh-link"),n}return t.rel="noopener",t.target="_blank",t.textContent=e.text,t.classList.add("lh-link"),t}_renderText(e){let t=this._dom.createElement("div","lh-text");return t.textContent=e,t}_renderNumeric(e){let t=u.i18n.formatNumber(e.value,e.granularity||.1),n=this._dom.createElement("div","lh-numeric");return n.textContent=t,n}_renderThumbnail(e){let t=this._dom.createElement("img","lh-thumbnail"),n=e;return t.src=n,t.title=n,t.alt="",t}_renderUnknown(e,t){console.error(`Unknown details type: ${e}`,t);let n=this._dom.createElement("details","lh-unknown");return this._dom.createChildOf(n,"summary").textContent=`We don't know how to render audit details of type \`${e}\`. The Lighthouse version that collected this data is likely newer than the Lighthouse version of the report renderer. Expand for the raw JSON.`,this._dom.createChildOf(n,"pre").textContent=JSON.stringify(t,null,2),n}_renderTableValue(e,t){if(e==null)return null;if(typeof e=="object")switch(e.type){case"code":return this._renderCode(e.value);case"link":return this._renderLink(e);case"node":return this.renderNode(e);case"numeric":return this._renderNumeric(e);case"source-location":return this.renderSourceLocation(e);case"url":return this.renderTextURL(e.value);default:return this._renderUnknown(e.type,e)}switch(t.valueType){case"bytes":{let n=Number(e);return this._renderBytes({value:n,granularity:t.granularity})}case"code":{let n=String(e);return this._renderCode(n)}case"ms":{let n={value:Number(e),granularity:t.granularity,displayUnit:t.displayUnit};return this._renderMilliseconds(n)}case"numeric":{let n=Number(e);return this._renderNumeric({value:n,granularity:t.granularity})}case"text":{let n=String(e);return this._renderText(n)}case"thumbnail":{let n=String(e);return this._renderThumbnail(n)}case"timespanMs":{let n=Number(e);return this._renderMilliseconds({value:n})}case"url":{let n=String(e);return vt.some(o=>n.startsWith(o))?this.renderTextURL(n):this._renderCode(n)}default:return this._renderUnknown(t.valueType,e)}}_getDerivedSubItemsHeading(e){return e.subItemsHeading?{key:e.subItemsHeading.key||"",valueType:e.subItemsHeading.valueType||e.valueType,granularity:e.subItemsHeading.granularity||e.granularity,displayUnit:e.subItemsHeading.displayUnit||e.displayUnit,label:""}:null}_renderTableRow(e,t){let n=this._dom.createElement("tr");for(let o of t){if(!o||!o.key){this._dom.createChildOf(n,"td","lh-table-column--empty");continue}let i=e[o.key],a;if(i!=null&&(a=this._renderTableValue(i,o)),a){let l=`lh-table-column--${o.valueType}`;this._dom.createChildOf(n,"td",l).append(a)}else this._dom.createChildOf(n,"td","lh-table-column--empty")}return n}_renderTableRowsFromItem(e,t){let n=this._dom.createFragment();if(n.append(this._renderTableRow(e,t)),!e.subItems)return n;let o=t.map(this._getDerivedSubItemsHeading);if(!o.some(Boolean))return n;for(let i of e.subItems.items){let a=this._renderTableRow(i,o);a.classList.add("lh-sub-item-row"),n.append(a)}return n}_adornEntityGroupRow(e){let t=e.dataset.entity;if(!t)return;let n=this._entities?.find(i=>i.name===t);if(!n)return;let o=this._dom.find("td",e);if(n.category){let i=this._dom.createElement("span");i.classList.add("lh-audit__adorn"),i.textContent=n.category,o.append(" ",i)}if(n.isFirstParty){let i=this._dom.createElement("span");i.classList.add("lh-audit__adorn","lh-audit__adorn1p"),i.textContent=u.strings.firstPartyChipLabel,o.append(" ",i)}if(n.homepage){let i=this._dom.createElement("a");i.href=n.homepage,i.target="_blank",i.title=u.strings.openInANewTabTooltip,i.classList.add("lh-report-icon--external"),o.append(" ",i)}}_renderEntityGroupRow(e,t){let n={...t[0]};n.valueType="text";let o=[n,...t.slice(1)],i=this._dom.createFragment();return i.append(this._renderTableRow(e,o)),this._dom.find("tr",i).classList.add("lh-row--group"),i}_getEntityGroupItems(e){let{items:t,headings:n,sortedBy:o}=e;if(!t.length||e.isEntityGrouped||!t.some(d=>d.entity))return[];let i=new Set(e.skipSumming||[]),a=[];for(let d of n)!d.key||i.has(d.key)||bt.includes(d.valueType)&&a.push(d.key);let l=n[0].key;if(!l)return[];let s=new Map;for(let d of t){let p=typeof d.entity=="string"?d.entity:void 0,h=s.get(p)||{[l]:p||u.strings.unattributable,entity:p};for(let g of a)h[g]=Number(h[g]||0)+Number(d[g]||0);s.set(p,h)}let c=[...s.values()];return o&&c.sort(E.getTableItemSortComparator(o)),c}_renderTable(e){if(!e.items.length)return this._dom.createElement("span");let t=this._dom.createElement("table","lh-table"),n=this._dom.createChildOf(t,"thead"),o=this._dom.createChildOf(n,"tr");for(let l of e.headings){let c=`lh-table-column--${l.valueType||"text"}`,d=this._dom.createElement("div","lh-text");d.textContent=l.label,this._dom.createChildOf(o,"th",c).append(d)}let i=this._getEntityGroupItems(e),a=this._dom.createChildOf(t,"tbody");if(i.length)for(let l of i){let s=typeof l.entity=="string"?l.entity:void 0,c=this._renderEntityGroupRow(l,e.headings);for(let p of e.items.filter(h=>h.entity===s))c.append(this._renderTableRowsFromItem(p,e.headings));let d=this._dom.findAll("tr",c);s&&d.length&&(d.forEach(p=>p.dataset.entity=s),this._adornEntityGroupRow(d[0])),a.append(c)}else{let l=!0;for(let s of e.items){let c=this._renderTableRowsFromItem(s,e.headings),d=this._dom.findAll("tr",c),p=d[0];if(typeof s.entity=="string"&&(p.dataset.entity=s.entity),e.isEntityGrouped&&s.entity)p.classList.add("lh-row--group"),this._adornEntityGroupRow(p);else for(let h of d)h.classList.add(l?"lh-row--even":"lh-row--odd");l=!l,a.append(c)}}return t}_renderList(e){let t=this._dom.createElement("div","lh-list");return e.items.forEach(n=>{let o=this.render(n);o&&t.append(o)}),t}renderNode(e){let t=this._dom.createElement("span","lh-node");if(e.nodeLabel){let a=this._dom.createElement("div");a.textContent=e.nodeLabel,t.append(a)}if(e.snippet){let a=this._dom.createElement("div");a.classList.add("lh-node__snippet"),a.textContent=e.snippet,t.append(a)}if(e.selector&&(t.title=e.selector),e.path&&t.setAttribute("data-path",e.path),e.selector&&t.setAttribute("data-selector",e.selector),e.snippet&&t.setAttribute("data-snippet",e.snippet),!this._fullPageScreenshot)return t;let n=e.lhId&&this._fullPageScreenshot.nodes[e.lhId];if(!n||n.width===0||n.height===0)return t;let o={width:147,height:100},i=V.render(this._dom,this._fullPageScreenshot.screenshot,n,o);return i&&t.prepend(i),t}renderSourceLocation(e){if(!e.url)return null;let t=`${e.url}:${e.line+1}:${e.column}`,n;e.original&&(n=`${e.original.file||"<unmapped>"}:${e.original.line+1}:${e.original.column}`);let o;if(e.urlProvider==="network"&&n)o=this._renderLink({url:e.url,text:n}),o.title=`maps to generated location ${t}`;else if(e.urlProvider==="network"&&!n)o=this.renderTextURL(e.url),this._dom.find(".lh-link",o).textContent+=`:${e.line+1}:${e.column}`;else if(e.urlProvider==="comment"&&n)o=this._renderText(`${n} (from source map)`),o.title=`${t} (from sourceURL)`;else if(e.urlProvider==="comment"&&!n)o=this._renderText(`${t} (from sourceURL)`);else return null;return o.classList.add("lh-source-location"),o.setAttribute("data-source-url",e.url),o.setAttribute("data-source-line",String(e.line)),o.setAttribute("data-source-column",String(e.column)),o}_renderFilmstrip(e){let t=this._dom.createElement("div","lh-filmstrip");for(let n of e.items){let o=this._dom.createChildOf(t,"div","lh-filmstrip__frame"),i=this._dom.createChildOf(o,"img","lh-filmstrip__thumbnail");i.src=n.data,i.alt="Screenshot"}return t}_renderCode(e){let t=this._dom.createElement("pre","lh-code");return t.textContent=e,t}};var de="\xA0";var ne=class{constructor(e){e==="en-XA"&&(e="de"),this._locale=e,this._cachedNumberFormatters=new Map}_formatNumberWithGranularity(e,t,n={}){if(t!==void 0){let a=-Math.log10(t);Number.isInteger(a)||(console.warn(`granularity of ${t} is invalid. Using 1 instead`),t=1),t<1&&(n={...n},n.minimumFractionDigits=n.maximumFractionDigits=Math.ceil(a)),e=Math.round(e/t)*t,Object.is(e,-0)&&(e=0)}else Math.abs(e)<5e-4&&(e=0);let o,i=[n.minimumFractionDigits,n.maximumFractionDigits,n.style,n.unit,n.unitDisplay,this._locale].join("");return o=this._cachedNumberFormatters.get(i),o||(o=new Intl.NumberFormat(this._locale,n),this._cachedNumberFormatters.set(i,o)),o.format(e).replace(" ",de)}formatNumber(e,t){return this._formatNumberWithGranularity(e,t)}formatInteger(e){return this._formatNumberWithGranularity(e,1)}formatPercent(e){return new Intl.NumberFormat(this._locale,{style:"percent"}).format(e)}formatBytesToKiB(e,t=void 0){return this._formatNumberWithGranularity(e/1024,t)+`${de}KiB`}formatBytesToMiB(e,t=void 0){return this._formatNumberWithGranularity(e/1048576,t)+`${de}MiB`}formatBytes(e,t=1){return this._formatNumberWithGranularity(e,t,{style:"unit",unit:"byte",unitDisplay:"long"})}formatBytesWithBestUnit(e,t=.1){return e>=1048576?this.formatBytesToMiB(e,t):e>=1024?this.formatBytesToKiB(e,t):this._formatNumberWithGranularity(e,t,{style:"unit",unit:"byte",unitDisplay:"narrow"})}formatKbps(e,t=void 0){return this._formatNumberWithGranularity(e,t,{style:"unit",unit:"kilobit-per-second",unitDisplay:"short"})}formatMilliseconds(e,t=void 0){return this._formatNumberWithGranularity(e,t,{style:"unit",unit:"millisecond",unitDisplay:"short"})}formatSeconds(e,t=void 0){return this._formatNumberWithGranularity(e/1e3,t,{style:"unit",unit:"second",unitDisplay:"narrow"})}formatDateTime(e){let t={month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"numeric",timeZoneName:"short"},n;try{n=new Intl.DateTimeFormat(this._locale,t)}catch{t.timeZone="UTC",n=new Intl.DateTimeFormat(this._locale,t)}return n.format(new Date(e))}formatDuration(e){let t=e/1e3;if(Math.round(t)===0)return"None";let n=[],o={day:60*60*24,hour:60*60,minute:60,second:1};return Object.keys(o).forEach(i=>{let a=o[i],l=Math.floor(t/a);if(l>0){t-=l*a;let s=this._formatNumberWithGranularity(l,1,{style:"unit",unit:i,unitDisplay:"narrow"});n.push(s)}}),n.join(" ")}};function Ce(r){let e=r.createComponent("explodeyGauge");return r.find(".lh-exp-gauge-component",e)}function Le(r,e,t){let n=r.find("div.lh-exp-gauge__wrapper",e);n.className="",n.classList.add("lh-exp-gauge__wrapper",`lh-exp-gauge__wrapper--${E.calculateRating(t.score)}`),wt(r,n,t)}function _t(r,e,t){t=t||r/32;let n=r/t,o=.5*t,i=n+o+t,a=2*Math.PI*n,l=Math.acos(1-.5*Math.pow(.5*t/n,2))*n,s=2*Math.PI*i,c=Math.acos(1-.5*Math.pow(.5*t/i,2))*i;return{radiusInner:n,radiusOuter:i,circumferenceInner:a,circumferenceOuter:s,getArcLength:()=>Math.max(0,Number(e*a)),getMetricArcLength:(d,p=!1)=>{let h=p?0:2*c;return Math.max(0,Number(d*s-o-h))},endDiffInner:l,endDiffOuter:c,strokeWidth:t,strokeGap:o}}function wt(r,e,t){let i=Number(t.score),{radiusInner:a,radiusOuter:l,circumferenceInner:s,circumferenceOuter:c,getArcLength:d,getMetricArcLength:p,endDiffInner:h,endDiffOuter:g,strokeWidth:v,strokeGap:w}=_t(128,i),m=r.find("svg.lh-exp-gauge",e);r.find(".lh-exp-gauge__label",m).textContent=t.title,m.setAttribute("viewBox",[-64,-64/2,128,128/2].join(" ")),m.style.setProperty("--stroke-width",`${v}px`),m.style.setProperty("--circle-meas",(2*Math.PI).toFixed(4));let x=r.find("g.lh-exp-gauge__outer",e),F=r.find("g.lh-exp-gauge__inner",e),L=r.find("circle.lh-cover",x),S=r.find("circle.lh-exp-gauge__arc",F),P=r.find("text.lh-exp-gauge__percentage",F);x.style.setProperty("--scale-initial",String(a/l)),x.style.setProperty("--radius",`${l}px`),L.style.setProperty("--radius",`${.5*(a+l)}px`),L.setAttribute("stroke-width",String(w)),m.style.setProperty("--radius",`${a}px`),S.setAttribute("stroke-dasharray",`${d()} ${(s-d()).toFixed(4)}`),S.setAttribute("stroke-dashoffset",String(.25*s-h)),P.textContent=Math.round(i*100).toString();let f=l+v,_=l-v,b=t.auditRefs.filter(y=>y.group==="metrics"&&y.weight),k=b.reduce((y,M)=>y+=M.weight,0),A=.25*c-g-.5*w,z=-.5*Math.PI;x.querySelectorAll(".metric").forEach(y=>{b.map(N=>`metric--${N.id}`).find(N=>y.classList.contains(N))||y.remove()}),b.forEach((y,M)=>{let D=y.acronym??y.id,N=!x.querySelector(`.metric--${D}`),R=r.maybeFind(`g.metric--${D}`,x)||r.createSVGElement("g"),B=r.maybeFind(`.metric--${D} circle.lh-exp-gauge--faded`,x)||r.createSVGElement("circle"),J=r.maybeFind(`.metric--${D} circle.lh-exp-gauge--miniarc`,x)||r.createSVGElement("circle"),j=r.maybeFind(`.metric--${D} circle.lh-exp-gauge-hovertarget`,x)||r.createSVGElement("circle"),H=r.maybeFind(`.metric--${D} text.metric__label`,x)||r.createSVGElement("text"),U=r.maybeFind(`.metric--${D} text.metric__value`,x)||r.createSVGElement("text");R.classList.add("metric",`metric--${D}`),B.classList.add("lh-exp-gauge__arc","lh-exp-gauge__arc--metric","lh-exp-gauge--faded"),J.classList.add("lh-exp-gauge__arc","lh-exp-gauge__arc--metric","lh-exp-gauge--miniarc"),j.classList.add("lh-exp-gauge__arc","lh-exp-gauge__arc--metric","lh-exp-gauge-hovertarget");let W=y.weight/k,ge=p(W),ue=y.result.score?y.result.score*W:0,me=p(ue),Re=W*c,fe=p(W,!0),ve=E.calculateRating(y.result.score,y.result.scoreDisplayMode);R.style.setProperty("--metric-rating",ve),R.style.setProperty("--metric-color",`var(--color-${ve})`),R.style.setProperty("--metric-offset",`${A}`),R.style.setProperty("--i",M.toString()),B.setAttribute("stroke-dasharray",`${ge} ${c-ge}`),J.style.setProperty("--metric-array",`${me} ${c-me}`),j.setAttribute("stroke-dasharray",`${fe} ${c-fe-g}`),H.classList.add("metric__label"),U.classList.add("metric__value"),H.textContent=D,U.textContent=`+${Math.round(ue*100)}`;let be=z+W*Math.PI,Z=Math.cos(be),Q=Math.sin(be);switch(!0){case Z>0:U.setAttribute("text-anchor","end");break;case Z<0:H.setAttribute("text-anchor","end");break;case Z===0:H.setAttribute("text-anchor","middle"),U.setAttribute("text-anchor","middle");break}switch(!0){case Q>0:H.setAttribute("dominant-baseline","hanging");break;case Q<0:U.setAttribute("dominant-baseline","hanging");break;case Q===0:H.setAttribute("dominant-baseline","middle"),U.setAttribute("dominant-baseline","middle");break}H.setAttribute("x",(f*Z).toFixed(2)),H.setAttribute("y",(f*Q).toFixed(2)),U.setAttribute("x",(_*Z).toFixed(2)),U.setAttribute("y",(_*Q).toFixed(2)),N&&(R.appendChild(B),R.appendChild(J),R.appendChild(j),R.appendChild(H),R.appendChild(U),x.appendChild(R)),A-=Re,z+=W*2*Math.PI});let T=x.querySelector(".lh-exp-gauge-underhovertarget")||r.createSVGElement("circle");T.classList.add("lh-exp-gauge__arc","lh-exp-gauge__arc--metric","lh-exp-gauge-hovertarget","lh-exp-gauge-underhovertarget");let I=p(1,!0);if(T.setAttribute("stroke-dasharray",`${I} ${c-I-g}`),T.isConnected||x.prepend(T),m.dataset.listenersSetup)return;m.dataset.listenersSetup=!0,ee(m),m.addEventListener("pointerover",y=>{if(y.target===m&&m.classList.contains("state--expanded")){m.classList.remove("state--expanded"),m.classList.contains("state--highlight")&&(m.classList.remove("state--highlight"),r.find(".metric--highlight",m).classList.remove("metric--highlight"));return}if(!(y.target instanceof Element))return;let M=y.target.parentNode;if(M instanceof SVGElement){if(M&&M===F){m.classList.contains("state--expanded")?m.classList.contains("state--highlight")&&(m.classList.remove("state--highlight"),r.find(".metric--highlight",m).classList.remove("metric--highlight")):m.classList.add("state--expanded");return}if(M&&M.classList&&M.classList.contains("metric")){let D=M.style.getPropertyValue("--metric-rating");if(e.style.setProperty("--color-highlight",`var(--color-${D}-secondary)`),!m.classList.contains("state--highlight"))m.classList.add("state--highlight"),M.classList.add("metric--highlight");else{let N=r.find(".metric--highlight",m);M!==N&&(N.classList.remove("metric--highlight"),M.classList.add("metric--highlight"))}}}}),m.addEventListener("mouseleave",()=>{m.classList.remove("state--highlight"),m.querySelector(".metric--highlight")?.classList.remove("metric--highlight")});async function ee(y){if(await new Promise(H=>setTimeout(H,1e3)),y.classList.contains("state--expanded"))return;let M=r.find(".lh-exp-gauge__inner",y),D=`uniq-${Math.random()}`;M.setAttribute("id",D);let N=r.createSVGElement("use");N.setAttribute("href",`#${D}`),y.appendChild(N);let R=2.5;y.style.setProperty("--peek-dur",`${R}s`),y.classList.add("state--peek","state--expanded");let B=()=>{y.classList.remove("state--peek","state--expanded"),N.remove()},J=setTimeout(()=>{y.removeEventListener("mouseenter",j),B()},R*1e3*1.5);function j(){clearTimeout(J),B()}y.addEventListener("mouseenter",j,{once:!0})}}var re=class extends O{_renderMetric(e){let t=this.dom.createComponent("metric"),n=this.dom.find(".lh-metric",t);n.id=e.result.id;let o=E.calculateRating(e.result.score,e.result.scoreDisplayMode);n.classList.add(`lh-metric--${o}`);let i=this.dom.find(".lh-metric__title",t);i.textContent=e.result.title;let a=this.dom.find(".lh-metric__value",t);a.textContent=e.result.displayValue||"";let l=this.dom.find(".lh-metric__description",t);if(l.append(this.dom.convertMarkdownLinkSnippets(e.result.description)),e.result.scoreDisplayMode==="error"){l.textContent="",a.textContent="Error!";let s=this.dom.createChildOf(l,"span");s.textContent=e.result.errorMessage||"Report error: no metric information"}else e.result.scoreDisplayMode==="notApplicable"&&(a.textContent="--");return n}_getScoringCalculatorHref(e){let t=e.filter(p=>p.group==="metrics"),n=e.find(p=>p.id==="interactive"),o=e.find(p=>p.id==="first-cpu-idle"),i=e.find(p=>p.id==="first-meaningful-paint");n&&t.push(n),o&&t.push(o),i&&t.push(i);let a=p=>Math.round(p*100)/100,s=[...t.map(p=>{let h;return typeof p.result.numericValue=="number"?(h=p.id==="cumulative-layout-shift"?a(p.result.numericValue):Math.round(p.result.numericValue),h=h.toString()):h="null",[p.acronym||p.id,h]})];u.reportJson&&(s.push(["device",u.reportJson.configSettings.formFactor]),s.push(["version",u.reportJson.lighthouseVersion]));let c=new URLSearchParams(s),d=new URL("https://googlechrome.github.io/lighthouse/scorecalc/");return d.hash=c.toString(),d.href}overallImpact(e,t){if(!e.result.metricSavings)return{overallImpact:0,overallLinearImpact:0};let n=0,o=0;for(let[i,a]of Object.entries(e.result.metricSavings)){if(a===void 0)continue;let l=t.find(g=>g.acronym===i);if(!l||l.result.score===null)continue;let s=l.result.numericValue;if(!s)continue;let c=a/s*l.weight;o+=c;let d=l.result.scoringOptions;if(!d)continue;let h=(C.computeLogNormalScore(d,s-a)-l.result.score)*l.weight;n+=h}return{overallImpact:n,overallLinearImpact:o}}render(e,t,n){let o=u.strings,i=this.dom.createElement("div","lh-category");i.id=e.id,i.append(this.renderCategoryHeader(e,t,n));let a=e.auditRefs.filter(f=>f.group==="metrics");if(a.length){let[f,_]=this.renderAuditGroup(t.metrics),b=this.dom.createElement("input","lh-metrics-toggle__input"),k=`lh-metrics-toggle${u.getUniqueSuffix()}`;b.setAttribute("aria-label","Toggle the display of metric descriptions"),b.type="checkbox",b.id=k,f.prepend(b);let A=this.dom.find(".lh-audit-group__header",f),z=this.dom.createChildOf(A,"label","lh-metrics-toggle__label");z.htmlFor=k;let T=this.dom.createChildOf(z,"span","lh-metrics-toggle__labeltext--show"),I=this.dom.createChildOf(z,"span","lh-metrics-toggle__labeltext--hide");T.textContent=u.strings.expandView,I.textContent=u.strings.collapseView;let ee=this.dom.createElement("div","lh-metrics-container");if(f.insertBefore(ee,_),a.forEach(y=>{ee.append(this._renderMetric(y))}),i.querySelector(".lh-gauge__wrapper")){let y=this.dom.find(".lh-category-header__description",i),M=this.dom.createChildOf(y,"div","lh-metrics__disclaimer"),D=this.dom.convertMarkdownLinkSnippets(o.varianceDisclaimer);M.append(D);let N=this.dom.createChildOf(M,"a","lh-calclink");N.target="_blank",N.textContent=o.calculatorLink,this.dom.safelySetHref(N,this._getScoringCalculatorHref(e.auditRefs))}f.classList.add("lh-audit-group--metrics"),i.append(f)}let l=this.dom.createChildOf(i,"div","lh-filmstrip-container"),c=e.auditRefs.find(f=>f.id==="screenshot-thumbnails")?.result;if(c?.details){l.id=c.id;let f=this.detailsRenderer.render(c.details);f&&l.append(f)}let d=e.auditRefs.filter(f=>f.group==="diagnostics").map(f=>{let{overallImpact:_,overallLinearImpact:b}=this.overallImpact(f,a),k=f.result.guidanceLevel||1,A=this.renderAudit(f);return{auditRef:f,auditEl:A,overallImpact:_,overallLinearImpact:b,guidanceLevel:k}}),p=d.filter(f=>!E.showAsPassed(f.auditRef.result)),h=d.filter(f=>E.showAsPassed(f.auditRef.result)),[g,v]=this.renderAuditGroup(t.diagnostics);g.classList.add("lh-audit-group--diagnostics");function w(f){for(let _ of d)if(f==="All")_.auditEl.hidden=!1;else{let b=_.auditRef.result.metricSavings?.[f]===void 0;_.auditEl.hidden=b}p.sort((_,b)=>{let k=_.auditRef.result.score||0,A=b.auditRef.result.score||0;if(k!==A)return k-A;if(f!=="All"){let z=_.auditRef.result.metricSavings?.[f]??-1,T=b.auditRef.result.metricSavings?.[f]??-1;if(z!==T)return T-z}return _.overallImpact!==b.overallImpact?b.overallImpact*b.guidanceLevel-_.overallImpact*_.guidanceLevel:_.overallImpact===0&&b.overallImpact===0&&_.overallLinearImpact!==b.overallLinearImpact?b.overallLinearImpact*b.guidanceLevel-_.overallLinearImpact*_.guidanceLevel:b.guidanceLevel-_.guidanceLevel});for(let _ of p)g.insertBefore(_.auditEl,v)}let m=new Set;for(let f of p){let _=f.auditRef.result.metricSavings||{};for(let[b,k]of Object.entries(_))typeof k=="number"&&m.add(b)}let x=a.filter(f=>f.acronym&&m.has(f.acronym));if(x.length&&this.renderMetricAuditFilter(x,i,w),w("All"),p.length&&i.append(g),!h.length)return i;let F={auditRefsOrEls:h.map(f=>f.auditEl),groupDefinitions:t},L=this.renderClump("passed",F);i.append(L);let S=[];if(["performance-budget","timing-budget"].forEach(f=>{let _=e.auditRefs.find(b=>b.id===f);if(_?.result.details){let b=this.detailsRenderer.render(_.result.details);b&&(b.id=f,b.classList.add("lh-details","lh-details--budget","lh-audit"),S.push(b))}}),S.length>0){let[f,_]=this.renderAuditGroup(t.budgets);S.forEach(b=>f.insertBefore(b,_)),f.classList.add("lh-audit-group--budgets"),i.append(f)}if((!n||n?.gatherMode==="navigation")&&e.score!==null){let f=Ce(this.dom);Le(this.dom,f,e),this.dom.find(".lh-score__gauge",i).replaceWith(f)}return i}renderMetricAuditFilter(e,t,n){let o=this.dom.createElement("div","lh-metricfilter"),i=this.dom.createChildOf(o,"span","lh-metricfilter__text");i.textContent=u.strings.showRelevantAudits;let a=[{acronym:"All",id:"All"},...e],l=u.getUniqueSuffix();for(let s of a){let c=`metric-${s.acronym}-${l}`,d=this.dom.createChildOf(o,"input","lh-metricfilter__radio");d.type="radio",d.name=`metricsfilter-${l}`,d.id=c;let p=this.dom.createChildOf(o,"label","lh-metricfilter__label");p.htmlFor=c,p.title="result"in s?s.result.title:"",p.textContent=s.acronym||s.id,s.acronym==="All"&&(d.checked=!0,p.classList.add("lh-metricfilter__label--active")),t.append(o),d.addEventListener("input",h=>{for(let v of t.querySelectorAll("label.lh-metricfilter__label"))v.classList.toggle("lh-metricfilter__label--active",v.htmlFor===c);t.classList.toggle("lh-category--filtered",s.acronym!=="All"),n(s.acronym||"All");let g=t.querySelectorAll("div.lh-audit-group, details.lh-audit-group");for(let v of g){v.hidden=!1;let w=Array.from(v.querySelectorAll("div.lh-audit")),m=!!w.length&&w.every(x=>x.hidden);v.hidden=m}})}}};var oe=class r extends O{render(e,t={}){let n=this.dom.createElement("div","lh-category");n.id=e.id;let o=this.dom.createComponent("warningsToplevel");this.dom.find(".lh-warnings__msg",o).append(this.dom.convertMarkdownLinkSnippets(u.strings.pwaRemovalMessage)),n.append(o),n.append(this.renderCategoryHeader(e,t));let a=e.auditRefs,l=a.filter(p=>p.result.scoreDisplayMode!=="manual"),s=this._renderAudits(l,t);n.append(s);let c=a.filter(p=>p.result.scoreDisplayMode==="manual"),d=this.renderClump("manual",{auditRefsOrEls:c,description:e.manualDescription,openByDefault:!0});return n.append(d),n}renderCategoryScore(e,t){if(e.score===null)return super.renderScoreGauge(e,t);let n=this.dom.createComponent("gaugePwa"),o=this.dom.find("a.lh-gauge--pwa__wrapper",n),i=n.querySelector("svg");if(!i)throw new Error("no SVG element found in PWA score gauge template");r._makeSvgReferencesUnique(i);let a=this._getGroupIds(e.auditRefs),l=this._getPassingGroupIds(e.auditRefs);if(l.size===a.size)o.classList.add("lh-badged--all");else for(let s of l)o.classList.add(`lh-badged--${s}`);return this.dom.find(".lh-gauge__label",n).textContent=e.title,o.title=this._getGaugeTooltip(e.auditRefs,t),n}_getGroupIds(e){let t=e.map(n=>n.group).filter(n=>!!n);return new Set(t)}_getPassingGroupIds(e){let t=this._getGroupIds(e);for(let n of e)!E.showAsPassed(n.result)&&n.group&&t.delete(n.group);return t}_getGaugeTooltip(e,t){let n=this._getGroupIds(e),o=[];for(let i of n){let a=e.filter(d=>d.group===i),l=a.length,s=a.filter(d=>E.showAsPassed(d.result)).length,c=t[i].title;o.push(`${c}: ${s}/${l}`)}return o.join(", ")}_renderAudits(e,t){let n=this.renderUnexpandableClump(e,t),o=this._getPassingGroupIds(e);for(let i of o)this.dom.find(`.lh-audit-group--${i}`,n).classList.add("lh-badged");return n}static _makeSvgReferencesUnique(e){let t=e.querySelector("defs");if(!t)return;let n=u.getUniqueSuffix(),o=t.querySelectorAll("[id]");for(let i of o){let a=i.id,l=`${a}-${n}`;i.id=l;let s=e.querySelectorAll(`use[href="#${a}"]`);for(let d of s)d.setAttribute("href",`#${l}`);let c=e.querySelectorAll(`[fill="url(#${a})"]`);for(let d of c)d.setAttribute("fill",`url(#${l})`)}}};var ie=class{constructor(e){this._dom=e,this._opts={}}renderReport(e,t,n){if(!this._dom.rootEl&&t){console.warn("Please adopt the new report API in renderer/api.js.");let i=t.closest(".lh-root");i?this._dom.rootEl=i:(t.classList.add("lh-root","lh-vars"),this._dom.rootEl=t)}else this._dom.rootEl&&t&&(this._dom.rootEl=t);n&&(this._opts=n),this._dom.setLighthouseChannel(e.configSettings.channel||"unknown");let o=E.prepareReportResult(e);return this._dom.rootEl.textContent="",this._dom.rootEl.append(this._renderReport(o)),this._opts.occupyEntireViewport&&this._dom.rootEl.classList.add("lh-max-viewport"),this._dom.rootEl}_renderReportTopbar(e){let t=this._dom.createComponent("topbar"),n=this._dom.find("a.lh-topbar__url",t);return n.textContent=e.finalDisplayedUrl,n.title=e.finalDisplayedUrl,this._dom.safelySetHref(n,e.finalDisplayedUrl),t}_renderReportHeader(){let e=this._dom.createComponent("heading"),t=this._dom.createComponent("scoresWrapper");return this._dom.find(".lh-scores-wrapper-placeholder",e).replaceWith(t),e}_renderReportFooter(e){let t=this._dom.createComponent("footer");return this._renderMetaBlock(e,t),this._dom.find(".lh-footer__version_issue",t).textContent=u.strings.footerIssue,this._dom.find(".lh-footer__version",t).textContent=e.lighthouseVersion,t}_renderMetaBlock(e,t){let n=E.getEmulationDescriptions(e.configSettings||{}),o=e.userAgent.match(/(\w*Chrome\/[\d.]+)/),i=Array.isArray(o)?o[1].replace("/"," ").replace("Chrome","Chromium"):"Chromium",a=e.configSettings.channel,l=e.environment.benchmarkIndex.toFixed(0),s=e.environment.credits?.["axe-core"],c=[`${u.strings.runtimeSettingsBenchmark}: ${l}`,`${u.strings.runtimeSettingsCPUThrottling}: ${n.cpuThrottling}`];n.screenEmulation&&c.push(`${u.strings.runtimeSettingsScreenEmulation}: ${n.screenEmulation}`),s&&c.push(`${u.strings.runtimeSettingsAxeVersion}: ${s}`);let d=u.strings.runtimeAnalysisWindow;e.gatherMode==="timespan"?d=u.strings.runtimeAnalysisWindowTimespan:e.gatherMode==="snapshot"&&(d=u.strings.runtimeAnalysisWindowSnapshot);let p=[["date",`Captured at ${u.i18n.formatDateTime(e.fetchTime)}`],["devices",`${n.deviceEmulation} with Lighthouse ${e.lighthouseVersion}`,c.join(`
|
|
2636
|
+
`),e.append(t);let n=r.createElement("div","lh-topbar"),o=r.createElementNS("http://www.w3.org/2000/svg","svg","lh-topbar__logo");o.setAttribute("role","img"),o.setAttribute("title","Lighthouse logo"),o.setAttribute("fill","none"),o.setAttribute("xmlns","http://www.w3.org/2000/svg"),o.setAttribute("viewBox","0 0 48 48");let i=r.createElementNS("http://www.w3.org/2000/svg","path");i.setAttribute("d","m14 7 10-7 10 7v10h5v7h-5l5 24H9l5-24H9v-7h5V7Z"),i.setAttribute("fill","#F63");let a=r.createElementNS("http://www.w3.org/2000/svg","path");a.setAttribute("d","M31.561 24H14l-1.689 8.105L31.561 24ZM18.983 48H9l1.022-4.907L35.723 32.27l1.663 7.98L18.983 48Z"),a.setAttribute("fill","#FFA385");let l=r.createElementNS("http://www.w3.org/2000/svg","path");l.setAttribute("fill","#FF3"),l.setAttribute("d","M20.5 10h7v7h-7z"),o.append(" ",i," ",a," ",l," ");let s=r.createElement("a","lh-topbar__url");s.setAttribute("href",""),s.setAttribute("target","_blank"),s.setAttribute("rel","noopener");let c=r.createElement("div","lh-tools"),d=r.createElement("div","lh-tools-locale lh-hidden"),p=r.createElement("button","lh-button lh-tool-locale__button");p.setAttribute("id","lh-button__swap-locales"),p.setAttribute("title","Show Language Picker"),p.setAttribute("aria-label","Toggle language picker"),p.setAttribute("aria-haspopup","menu"),p.setAttribute("aria-expanded","false"),p.setAttribute("aria-controls","lh-tools-locale__selector-wrapper");let h=r.createElementNS("http://www.w3.org/2000/svg","svg");h.setAttribute("width","20px"),h.setAttribute("height","20px"),h.setAttribute("viewBox","0 0 24 24"),h.setAttribute("fill","currentColor");let g=r.createElementNS("http://www.w3.org/2000/svg","path");g.setAttribute("d","M0 0h24v24H0V0z"),g.setAttribute("fill","none");let v=r.createElementNS("http://www.w3.org/2000/svg","path");v.setAttribute("d","M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"),h.append(g,v),p.append(" ",h," ");let w=r.createElement("div","lh-tools-locale__selector-wrapper");w.setAttribute("id","lh-tools-locale__selector-wrapper"),w.setAttribute("role","menu"),w.setAttribute("aria-labelledby","lh-button__swap-locales"),w.setAttribute("aria-hidden","true"),w.append(" "," "),d.append(" ",p," ",w," ");let m=r.createElement("button","lh-tools__button");m.setAttribute("id","lh-tools-button"),m.setAttribute("title","Tools menu"),m.setAttribute("aria-label","Toggle report tools menu"),m.setAttribute("aria-haspopup","menu"),m.setAttribute("aria-expanded","false"),m.setAttribute("aria-controls","lh-tools-dropdown");let x=r.createElementNS("http://www.w3.org/2000/svg","svg");x.setAttribute("width","100%"),x.setAttribute("height","100%"),x.setAttribute("viewBox","0 0 24 24");let F=r.createElementNS("http://www.w3.org/2000/svg","path");F.setAttribute("d","M0 0h24v24H0z"),F.setAttribute("fill","none");let L=r.createElementNS("http://www.w3.org/2000/svg","path");L.setAttribute("d","M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"),x.append(" ",F," ",L," "),m.append(" ",x," ");let S=r.createElement("div","lh-tools__dropdown");S.setAttribute("id","lh-tools-dropdown"),S.setAttribute("role","menu"),S.setAttribute("aria-labelledby","lh-tools-button");let P=r.createElement("a","lh-report-icon lh-report-icon--print");P.setAttribute("role","menuitem"),P.setAttribute("tabindex","-1"),P.setAttribute("href","#"),P.setAttribute("data-i18n","dropdownPrintSummary"),P.setAttribute("data-action","print-summary");let f=r.createElement("a","lh-report-icon lh-report-icon--print");f.setAttribute("role","menuitem"),f.setAttribute("tabindex","-1"),f.setAttribute("href","#"),f.setAttribute("data-i18n","dropdownPrintExpanded"),f.setAttribute("data-action","print-expanded");let _=r.createElement("a","lh-report-icon lh-report-icon--copy");_.setAttribute("role","menuitem"),_.setAttribute("tabindex","-1"),_.setAttribute("href","#"),_.setAttribute("data-i18n","dropdownCopyJSON"),_.setAttribute("data-action","copy");let b=r.createElement("a","lh-report-icon lh-report-icon--download lh-hidden");b.setAttribute("role","menuitem"),b.setAttribute("tabindex","-1"),b.setAttribute("href","#"),b.setAttribute("data-i18n","dropdownSaveHTML"),b.setAttribute("data-action","save-html");let k=r.createElement("a","lh-report-icon lh-report-icon--download");k.setAttribute("role","menuitem"),k.setAttribute("tabindex","-1"),k.setAttribute("href","#"),k.setAttribute("data-i18n","dropdownSaveJSON"),k.setAttribute("data-action","save-json");let A=r.createElement("a","lh-report-icon lh-report-icon--open");A.setAttribute("role","menuitem"),A.setAttribute("tabindex","-1"),A.setAttribute("href","#"),A.setAttribute("data-i18n","dropdownViewer"),A.setAttribute("data-action","open-viewer");let z=r.createElement("a","lh-report-icon lh-report-icon--open");z.setAttribute("role","menuitem"),z.setAttribute("tabindex","-1"),z.setAttribute("href","#"),z.setAttribute("data-i18n","dropdownSaveGist"),z.setAttribute("data-action","save-gist");let T=r.createElement("a","lh-report-icon lh-report-icon--open lh-hidden");T.setAttribute("role","menuitem"),T.setAttribute("tabindex","-1"),T.setAttribute("href","#"),T.setAttribute("data-i18n","dropdownViewUnthrottledTrace"),T.setAttribute("data-action","view-unthrottled-trace");let I=r.createElement("a","lh-report-icon lh-report-icon--dark");return I.setAttribute("role","menuitem"),I.setAttribute("tabindex","-1"),I.setAttribute("href","#"),I.setAttribute("data-i18n","dropdownDarkTheme"),I.setAttribute("data-action","toggle-dark"),S.append(" ",P," ",f," ",_," "," ",b," ",k," ",A," ",z," "," ",T," ",I," "),c.append(" ",d," ",m," ",S," "),n.append(" "," ",o," ",s," ",c," "),e.append(n),e}function ut(r){let e=r.createFragment(),t=r.createElement("div","lh-warnings lh-warnings--toplevel"),n=r.createElement("p","lh-warnings__msg"),o=r.createElement("ul");return t.append(" ",n," ",o," "),e.append(t),e}function ye(r,e){switch(e){case"3pFilter":return je(r);case"audit":return We(r);case"categoryHeader":return qe(r);case"chevron":return Ke(r);case"clump":return Je(r);case"crc":return Ze(r);case"crcChain":return Qe(r);case"elementScreenshot":return Ye(r);case"explodeyGauge":return Xe(r);case"footer":return et(r);case"fraction":return tt(r);case"gauge":return nt(r);case"gaugePwa":return rt(r);case"heading":return ot(r);case"metric":return it(r);case"scorescale":return at(r);case"scoresWrapper":return lt(r);case"snippet":return st(r);case"snippetContent":return ct(r);case"snippetHeader":return dt(r);case"snippetLine":return pt(r);case"styles":return ht(r);case"topbar":return gt(r);case"warningsToplevel":return ut(r)}throw new Error("unexpected component: "+e)}var te=class{constructor(e,t){this._document=e,this._lighthouseChannel="unknown",this._componentCache=new Map,this.rootEl=t}createElement(e,t){let n=this._document.createElement(e);if(t)for(let o of t.split(/\s+/))o&&n.classList.add(o);return n}createElementNS(e,t,n){let o=this._document.createElementNS(e,t);if(n)for(let i of n.split(/\s+/))i&&o.classList.add(i);return o}createSVGElement(e,t){return this._document.createElementNS("http://www.w3.org/2000/svg",e,t)}createFragment(){return this._document.createDocumentFragment()}createTextNode(e){return this._document.createTextNode(e)}createChildOf(e,t,n){let o=this.createElement(t,n);return e.append(o),o}createComponent(e){let t=this._componentCache.get(e);if(t){let o=t.cloneNode(!0);return this.findAll("style",o).forEach(i=>i.remove()),o}return t=ye(this,e),this._componentCache.set(e,t),t.cloneNode(!0)}clearComponentCache(){this._componentCache.clear()}convertMarkdownLinkSnippets(e,t={}){let n=this.createElement("span");for(let o of C.splitMarkdownLink(e)){let i=o.text.includes("`")?this.convertMarkdownCodeSnippets(o.text):o.text;if(!o.isLink){n.append(i);continue}let a=new URL(o.linkHref);(["https://developers.google.com","https://web.dev","https://developer.chrome.com"].includes(a.origin)||t.alwaysAppendUtmSource)&&(a.searchParams.set("utm_source","lighthouse"),a.searchParams.set("utm_medium",this._lighthouseChannel));let s=this.createElement("a");s.rel="noopener",s.target="_blank",s.append(i),this.safelySetHref(s,a.href),n.append(s)}return n}safelySetHref(e,t){if(t=t||"",t.startsWith("#")){e.href=t;return}let n=["https:","http:"],o;try{o=new URL(t)}catch{}o&&n.includes(o.protocol)&&(e.href=o.href)}safelySetBlobHref(e,t){if(t.type!=="text/html"&&t.type!=="application/json")throw new Error("Unsupported blob type");let n=URL.createObjectURL(t);e.href=n}convertMarkdownCodeSnippets(e){let t=this.createElement("span");for(let n of C.splitMarkdownCodeSpans(e))if(n.isCode){let o=this.createElement("code");o.textContent=n.text,t.append(o)}else t.append(this._document.createTextNode(n.text));return t}setLighthouseChannel(e){this._lighthouseChannel=e}document(){return this._document}isDevTools(){return!!this._document.querySelector(".lh-devtools")}find(e,t){let n=this.maybeFind(e,t);if(n===null)throw new Error(`query ${e} not found`);return n}maybeFind(e,t){return t.querySelector(e)}findAll(e,t){return Array.from(t.querySelectorAll(e))}fireEventOn(e,t=this._document,n){let o=new CustomEvent(e,n?{detail:n}:void 0);t.dispatchEvent(o)}saveFile(e,t){let n=this.createElement("a");n.download=t,this.safelySetBlobHref(n,e),this._document.body.append(n),n.click(),this._document.body.removeChild(n),setTimeout(()=>URL.revokeObjectURL(n.href),500)}};var xe=0,u=class r{static i18n=null;static strings={};static reportJson=null;static apply(e){r.strings={...Ee,...e.providedStrings},r.i18n=e.i18n,r.reportJson=e.reportJson}static getUniqueSuffix(){return xe++}static resetUniqueSuffix(){xe=0}};var ke="data:image/jpeg;base64,";function Ae(r){r.configSettings.locale||(r.configSettings.locale="en"),r.configSettings.formFactor||(r.configSettings.formFactor=r.configSettings.emulatedFormFactor),r.finalDisplayedUrl=C.getFinalDisplayedUrl(r),r.mainDocumentUrl=C.getMainDocumentUrl(r);for(let n of Object.values(r.audits))if((n.scoreDisplayMode==="not_applicable"||n.scoreDisplayMode==="not-applicable")&&(n.scoreDisplayMode="notApplicable"),n.scoreDisplayMode==="informative"&&(n.score=1),n.details){if((n.details.type===void 0||n.details.type==="diagnostic")&&(n.details.type="debugdata"),n.details.type==="filmstrip")for(let o of n.details.items)o.data.startsWith(ke)||(o.data=ke+o.data);if(n.details.type==="table")for(let o of n.details.headings){let{itemType:i,text:a}=o;i!==void 0&&(o.valueType=i,delete o.itemType),a!==void 0&&(o.label=a,delete o.text);let l=o.subItemsHeading?.itemType;o.subItemsHeading&&l!==void 0&&(o.subItemsHeading.valueType=l,delete o.subItemsHeading.itemType)}if(n.id==="third-party-summary"&&(n.details.type==="opportunity"||n.details.type==="table")){let{headings:o,items:i}=n.details;if(o[0].valueType==="link"){o[0].valueType="text";for(let a of i)typeof a.entity=="object"&&a.entity.type==="link"&&(a.entity=a.entity.text);n.details.isEntityGrouped=!0}}}let[e]=r.lighthouseVersion.split(".").map(Number),t=r.categories.performance;if(e<9&&t){r.categoryGroups||(r.categoryGroups={}),r.categoryGroups.hidden={title:""};for(let n of t.auditRefs)n.group?["load-opportunities","diagnostics"].includes(n.group)&&delete n.group:n.group="hidden"}if(r.environment||(r.environment={benchmarkIndex:0,networkUserAgent:r.userAgent,hostUserAgent:r.userAgent}),r.configSettings.screenEmulation||(r.configSettings.screenEmulation={width:-1,height:-1,deviceScaleFactor:-1,mobile:/mobile/i.test(r.environment.hostUserAgent),disabled:!1}),r.i18n||(r.i18n={}),r.audits["full-page-screenshot"]){let n=r.audits["full-page-screenshot"].details;n?r.fullPageScreenshot={screenshot:n.screenshot,nodes:n.nodes}:r.fullPageScreenshot=null,delete r.audits["full-page-screenshot"]}}var G=C.RATINGS,E=class r{static prepareReportResult(e){let t=JSON.parse(JSON.stringify(e));Ae(t);for(let o of Object.values(t.audits))o.details&&(o.details.type==="opportunity"||o.details.type==="table")&&!o.details.isEntityGrouped&&t.entities&&r.classifyEntities(t.entities,o.details);if(typeof t.categories!="object")throw new Error("No categories provided.");let n=new Map;for(let o of Object.values(t.categories))o.auditRefs.forEach(i=>{i.relevantAudits&&i.relevantAudits.forEach(a=>{let l=n.get(a)||[];l.push(i),n.set(a,l)})}),o.auditRefs.forEach(i=>{let a=t.audits[i.id];i.result=a,n.has(i.id)&&(i.relevantMetrics=n.get(i.id)),t.stackPacks&&t.stackPacks.forEach(l=>{l.descriptions[i.id]&&(i.stackPacks=i.stackPacks||[],i.stackPacks.push({title:l.title,iconDataURL:l.iconDataURL,description:l.descriptions[i.id]}))})});return t}static getUrlLocatorFn(e){let t=e.find(o=>o.valueType==="url")?.key;if(t&&typeof t=="string")return o=>{let i=o[t];if(typeof i=="string")return i};let n=e.find(o=>o.valueType==="source-location")?.key;if(n)return o=>{let i=o[n];if(typeof i=="object"&&i.type==="source-location")return i.url}}static classifyEntities(e,t){let{items:n,headings:o}=t;if(!n.length||n.some(a=>a.entity))return;let i=r.getUrlLocatorFn(o);if(i)for(let a of n){let l=i(a);if(!l)continue;let s="";try{s=C.parseURL(l).origin}catch{}if(!s)continue;let c=e.find(d=>d.origins.includes(s));c&&(a.entity=c.name)}}static getTableItemSortComparator(e){return(t,n)=>{for(let o of e){let i=t[o],a=n[o];if((typeof i!=typeof a||!["number","string"].includes(typeof i))&&console.warn(`Warning: Attempting to sort unsupported value type: ${o}.`),typeof i=="number"&&typeof a=="number"&&i!==a)return a-i;if(typeof i=="string"&&typeof a=="string"&&i!==a)return i.localeCompare(a)}return 0}}static getEmulationDescriptions(e){let t,n,o,i=e.throttling,a=u.i18n,l=u.strings;switch(e.throttlingMethod){case"provided":o=n=t=l.throttlingProvided;break;case"devtools":{let{cpuSlowdownMultiplier:h,requestLatencyMs:g}=i;t=`${a.formatNumber(h)}x slowdown (DevTools)`,n=`${a.formatMilliseconds(g)} HTTP RTT, ${a.formatKbps(i.downloadThroughputKbps)} down, ${a.formatKbps(i.uploadThroughputKbps)} up (DevTools)`,o=g===150*3.75&&i.downloadThroughputKbps===1.6*1024*.9&&i.uploadThroughputKbps===750*.9?l.runtimeSlow4g:l.runtimeCustom;break}case"simulate":{let{cpuSlowdownMultiplier:h,rttMs:g,throughputKbps:v}=i;t=`${a.formatNumber(h)}x slowdown (Simulated)`,n=`${a.formatMilliseconds(g)} TCP RTT, ${a.formatKbps(v)} throughput (Simulated)`,o=g===150&&v===1.6*1024?l.runtimeSlow4g:l.runtimeCustom;break}default:o=t=n=l.runtimeUnknown}let s=e.channel==="devtools"?!1:e.screenEmulation.disabled,c=e.channel==="devtools"?e.formFactor==="mobile":e.screenEmulation.mobile,d=l.runtimeMobileEmulation;s?d=l.runtimeNoEmulation:c||(d=l.runtimeDesktopEmulation);let p=s?void 0:`${e.screenEmulation.width}x${e.screenEmulation.height}, DPR ${e.screenEmulation.deviceScaleFactor}`;return{deviceEmulation:d,screenEmulation:p,cpuThrottling:t,networkThrottling:n,summary:o}}static showAsPassed(e){switch(e.scoreDisplayMode){case"manual":case"notApplicable":return!0;case"error":case"informative":return!1;case"numeric":case"binary":default:return Number(e.score)>=G.PASS.minScore}}static calculateRating(e,t){if(t==="manual"||t==="notApplicable")return G.PASS.label;if(t==="error")return G.ERROR.label;if(e===null)return G.FAIL.label;let n=G.FAIL.label;return e>=G.PASS.minScore?n=G.PASS.label:e>=G.AVERAGE.minScore&&(n=G.AVERAGE.label),n}static calculateCategoryFraction(e){let t=0,n=0,o=0,i=0;for(let a of e.auditRefs){let l=r.showAsPassed(a.result);if(!(a.group==="hidden"||a.result.scoreDisplayMode==="manual"||a.result.scoreDisplayMode==="notApplicable")){if(a.result.scoreDisplayMode==="informative"){l||++o;continue}++t,i+=a.weight,l&&n++}}return{numPassed:n,numPassableAudits:t,numInformative:o,totalWeight:i}}static isPluginCategory(e){return e.startsWith("lighthouse-plugin-")}static shouldDisplayAsFraction(e){return e==="timespan"||e==="snapshot"}},Ee={varianceDisclaimer:"Values are estimated and may vary. The [performance score is calculated](https://developer.chrome.com/docs/lighthouse/performance/performance-scoring/) directly from these metrics.",calculatorLink:"See calculator.",showRelevantAudits:"Show audits relevant to:",opportunityResourceColumnLabel:"Opportunity",opportunitySavingsColumnLabel:"Estimated Savings",errorMissingAuditInfo:"Report error: no audit information",errorLabel:"Error!",warningHeader:"Warnings: ",warningAuditsGroupTitle:"Passed audits but with warnings",passedAuditsGroupTitle:"Passed audits",notApplicableAuditsGroupTitle:"Not applicable",manualAuditsGroupTitle:"Additional items to manually check",toplevelWarningsMessage:"There were issues affecting this run of Lighthouse:",crcInitialNavigation:"Initial Navigation",crcLongestDurationLabel:"Maximum critical path latency:",snippetExpandButtonLabel:"Expand snippet",snippetCollapseButtonLabel:"Collapse snippet",lsPerformanceCategoryDescription:"[Lighthouse](https://developers.google.com/web/tools/lighthouse/) analysis of the current page on an emulated mobile network. Values are estimated and may vary.",labDataTitle:"Lab Data",thirdPartyResourcesLabel:"Show 3rd-party resources",viewTreemapLabel:"View Treemap",viewTraceLabel:"View Trace",dropdownPrintSummary:"Print Summary",dropdownPrintExpanded:"Print Expanded",dropdownCopyJSON:"Copy JSON",dropdownSaveHTML:"Save as HTML",dropdownSaveJSON:"Save as JSON",dropdownViewer:"Open in Viewer",dropdownSaveGist:"Save as Gist",dropdownDarkTheme:"Toggle Dark Theme",dropdownViewUnthrottledTrace:"View Unthrottled Trace",runtimeSettingsDevice:"Device",runtimeSettingsNetworkThrottling:"Network throttling",runtimeSettingsCPUThrottling:"CPU throttling",runtimeSettingsUANetwork:"User agent (network)",runtimeSettingsBenchmark:"Unthrottled CPU/Memory Power",runtimeSettingsAxeVersion:"Axe version",runtimeSettingsScreenEmulation:"Screen emulation",footerIssue:"File an issue",runtimeNoEmulation:"No emulation",runtimeMobileEmulation:"Emulated Moto G Power",runtimeDesktopEmulation:"Emulated Desktop",runtimeUnknown:"Unknown",runtimeSingleLoad:"Single page session",runtimeAnalysisWindow:"Initial page load",runtimeAnalysisWindowTimespan:"User interactions timespan",runtimeAnalysisWindowSnapshot:"Point-in-time snapshot",runtimeSingleLoadTooltip:"This data is taken from a single page session, as opposed to field data summarizing many sessions.",throttlingProvided:"Provided by environment",show:"Show",hide:"Hide",expandView:"Expand view",collapseView:"Collapse view",runtimeSlow4g:"Slow 4G throttling",runtimeCustom:"Custom throttling",firstPartyChipLabel:"1st party",openInANewTabTooltip:"Open in a new tab",unattributable:"Unattributable",pwaRemovalMessage:"As per [Chrome\u2019s updated Installability Criteria](https://developer.chrome.com/blog/update-install-criteria), Lighthouse will be deprecating the PWA category in a future release. Please refer to the [updated PWA documentation](https://developer.chrome.com/docs/devtools/progressive-web-apps/) for future PWA testing."};var O=class{constructor(e,t){this.dom=e,this.detailsRenderer=t}get _clumpTitles(){return{warning:u.strings.warningAuditsGroupTitle,manual:u.strings.manualAuditsGroupTitle,passed:u.strings.passedAuditsGroupTitle,notApplicable:u.strings.notApplicableAuditsGroupTitle}}renderAudit(e){let t=u.strings,n=this.dom.createComponent("audit"),o=this.dom.find("div.lh-audit",n);o.id=e.result.id;let i=e.result.scoreDisplayMode;e.result.displayValue&&(this.dom.find(".lh-audit__display-text",o).textContent=e.result.displayValue);let a=this.dom.find(".lh-audit__title",o);a.append(this.dom.convertMarkdownCodeSnippets(e.result.title));let l=this.dom.find(".lh-audit__description",o);l.append(this.dom.convertMarkdownLinkSnippets(e.result.description));for(let h of e.relevantMetrics||[]){let g=this.dom.createChildOf(l,"span","lh-audit__adorn");g.title=`Relevant to ${h.result.title}`,g.textContent=h.acronym||h.id}e.stackPacks&&e.stackPacks.forEach(h=>{let g=this.dom.createElement("img","lh-audit__stackpack__img");g.src=h.iconDataURL,g.alt=h.title;let v=this.dom.convertMarkdownLinkSnippets(h.description,{alwaysAppendUtmSource:!0}),w=this.dom.createElement("div","lh-audit__stackpack");w.append(g,v),this.dom.find(".lh-audit__stackpacks",o).append(w)});let s=this.dom.find("details",o);if(e.result.details){let h=this.detailsRenderer.render(e.result.details);h&&(h.classList.add("lh-details"),s.append(h))}if(this.dom.find(".lh-chevron-container",o).append(this._createChevron()),this._setRatingClass(o,e.result.score,i),e.result.scoreDisplayMode==="error"){o.classList.add("lh-audit--error");let h=this.dom.find(".lh-audit__display-text",o);h.textContent=t.errorLabel,h.classList.add("lh-tooltip-boundary");let g=this.dom.createChildOf(h,"div","lh-tooltip lh-tooltip--error");g.textContent=e.result.errorMessage||t.errorMissingAuditInfo}else if(e.result.explanation){let h=this.dom.createChildOf(a,"div","lh-audit-explanation");h.textContent=e.result.explanation}let c=e.result.warnings;if(!c||c.length===0)return o;let d=this.dom.find("summary",s),p=this.dom.createChildOf(d,"div","lh-warnings");if(this.dom.createChildOf(p,"span").textContent=t.warningHeader,c.length===1)p.append(this.dom.createTextNode(c.join("")));else{let h=this.dom.createChildOf(p,"ul");for(let g of c){let v=this.dom.createChildOf(h,"li");v.textContent=g}}return o}injectFinalScreenshot(e,t,n){let o=t["final-screenshot"];if(!o||o.scoreDisplayMode==="error"||!o.details||o.details.type!=="screenshot")return null;let i=this.dom.createElement("img","lh-final-ss-image"),a=o.details.data;i.src=a,i.alt=o.title;let l=this.dom.find(".lh-category .lh-category-header",e),s=this.dom.createElement("div","lh-category-headercol"),c=this.dom.createElement("div","lh-category-headercol lh-category-headercol--separator"),d=this.dom.createElement("div","lh-category-headercol");s.append(...l.childNodes),s.append(n),d.append(i),l.append(s,c,d),l.classList.add("lh-category-header__finalscreenshot")}_createChevron(){let e=this.dom.createComponent("chevron");return this.dom.find("svg.lh-chevron",e)}_setRatingClass(e,t,n){let o=E.calculateRating(t,n);return e.classList.add(`lh-audit--${n.toLowerCase()}`),n!=="informative"&&e.classList.add(`lh-audit--${o}`),e}renderCategoryHeader(e,t,n){let o=this.dom.createComponent("categoryHeader"),i=this.dom.find(".lh-score__gauge",o),a=this.renderCategoryScore(e,t,n);if(i.append(a),e.description){let l=this.dom.convertMarkdownLinkSnippets(e.description);this.dom.find(".lh-category-header__description",o).append(l)}return o}renderAuditGroup(e){let t=this.dom.createElement("div","lh-audit-group"),n=this.dom.createElement("div","lh-audit-group__header");this.dom.createChildOf(n,"span","lh-audit-group__title").textContent=e.title,t.append(n);let o=null;return e.description&&(o=this.dom.convertMarkdownLinkSnippets(e.description),o.classList.add("lh-audit-group__description","lh-audit-group__footer"),t.append(o)),[t,o]}_renderGroupedAudits(e,t){let n=new Map,o="NotAGroup";n.set(o,[]);for(let a of e){let l=a.group||o;if(l==="hidden")continue;let s=n.get(l)||[];s.push(a),n.set(l,s)}let i=[];for(let[a,l]of n){if(a===o){for(let p of l)i.push(this.renderAudit(p));continue}let s=t[a],[c,d]=this.renderAuditGroup(s);for(let p of l)c.insertBefore(this.renderAudit(p),d);c.classList.add(`lh-audit-group--${a}`),i.push(c)}return i}renderUnexpandableClump(e,t){let n=this.dom.createElement("div");return this._renderGroupedAudits(e,t).forEach(i=>n.append(i)),n}renderClump(e,{auditRefsOrEls:t,description:n,openByDefault:o}){let i=this.dom.createComponent("clump"),a=this.dom.find(".lh-clump",i);o&&a.setAttribute("open","");let l=this.dom.find(".lh-audit-group__header",a),s=this._clumpTitles[e];this.dom.find(".lh-audit-group__title",l).textContent=s;let c=this.dom.find(".lh-audit-group__itemcount",a);c.textContent=`(${t.length})`;let d=t.map(h=>h instanceof HTMLElement?h:this.renderAudit(h));a.append(...d);let p=this.dom.find(".lh-audit-group",i);if(n){let h=this.dom.convertMarkdownLinkSnippets(n);h.classList.add("lh-audit-group__description","lh-audit-group__footer"),p.append(h)}return this.dom.find(".lh-clump-toggletext--show",p).textContent=u.strings.show,this.dom.find(".lh-clump-toggletext--hide",p).textContent=u.strings.hide,a.classList.add(`lh-clump--${e.toLowerCase()}`),p}renderCategoryScore(e,t,n){let o;if(n&&E.shouldDisplayAsFraction(n.gatherMode)?o=this.renderCategoryFraction(e):o=this.renderScoreGauge(e,t),n?.omitLabel&&this.dom.find(".lh-gauge__label,.lh-fraction__label",o).remove(),n?.onPageAnchorRendered){let i=this.dom.find("a",o);n.onPageAnchorRendered(i)}return o}renderScoreGauge(e,t){let n=this.dom.createComponent("gauge"),o=this.dom.find("a.lh-gauge__wrapper",n);E.isPluginCategory(e.id)&&o.classList.add("lh-gauge__wrapper--plugin");let i=Number(e.score),a=this.dom.find(".lh-gauge",n),l=this.dom.find("circle.lh-gauge-arc",a);l&&this._setGaugeArc(l,i);let s=Math.round(i*100),c=this.dom.find("div.lh-gauge__percentage",n);return c.textContent=s.toString(),e.score===null&&(c.classList.add("lh-gauge--error"),c.textContent="",c.title=u.strings.errorLabel),e.auditRefs.length===0||this.hasApplicableAudits(e)?o.classList.add(`lh-gauge__wrapper--${E.calculateRating(e.score)}`):(o.classList.add("lh-gauge__wrapper--not-applicable"),c.textContent="-",c.title=u.strings.notApplicableAuditsGroupTitle),this.dom.find(".lh-gauge__label",n).textContent=e.title,n}renderCategoryFraction(e){let t=this.dom.createComponent("fraction"),n=this.dom.find("a.lh-fraction__wrapper",t),{numPassed:o,numPassableAudits:i,totalWeight:a}=E.calculateCategoryFraction(e),l=o/i,s=this.dom.find(".lh-fraction__content",t),c=this.dom.createElement("span");c.textContent=`${o}/${i}`,s.append(c);let d=E.calculateRating(l);return a===0&&(d="null"),n.classList.add(`lh-fraction__wrapper--${d}`),this.dom.find(".lh-fraction__label",t).textContent=e.title,t}hasApplicableAudits(e){return e.auditRefs.some(t=>t.result.scoreDisplayMode!=="notApplicable")}_setGaugeArc(e,t){let n=2*Math.PI*Number(e.getAttribute("r")),o=Number(e.getAttribute("stroke-width")),i=.25*o/n;e.style.transform=`rotate(${-90+i*360}deg)`;let a=t*n-o/2;t===0&&(e.style.opacity="0"),t===1&&(a=n),e.style.strokeDasharray=`${Math.max(a,0)} ${n}`}_auditHasWarning(e){return!!e.result.warnings?.length}_getClumpIdForAuditRef(e){let t=e.result.scoreDisplayMode;return t==="manual"||t==="notApplicable"?t:E.showAsPassed(e.result)?this._auditHasWarning(e)?"warning":"passed":"failed"}render(e,t={},n){let o=this.dom.createElement("div","lh-category");o.id=e.id,o.append(this.renderCategoryHeader(e,t,n));let i=new Map;i.set("failed",[]),i.set("warning",[]),i.set("manual",[]),i.set("passed",[]),i.set("notApplicable",[]);for(let l of e.auditRefs){let s=this._getClumpIdForAuditRef(l),c=i.get(s);c.push(l),i.set(s,c)}for(let l of i.values())l.sort((s,c)=>c.weight-s.weight);let a=i.get("failed")?.length;for(let[l,s]of i){if(s.length===0)continue;if(l==="failed"){let h=this.renderUnexpandableClump(s,t);h.classList.add("lh-clump--failed"),o.append(h);continue}let c=l==="manual"?e.manualDescription:void 0,d=l==="warning"||l==="manual"&&a===0,p=this.renderClump(l,{auditRefsOrEls:s,description:c,openByDefault:d});o.append(p)}return o}};var Y=class{static initTree(e){let t=0,n=Object.keys(e);return n.length>0&&(t=e[n[0]].request.startTime),{tree:e,startTime:t,transferSize:0}}static createSegment(e,t,n,o,i,a){let l=e[t],s=Object.keys(e),c=s.indexOf(t)===s.length-1,d=!!l.children&&Object.keys(l.children).length>0,p=Array.isArray(i)?i.slice(0):[];return typeof a<"u"&&p.push(!a),{node:l,isLastChild:c,hasChildren:d,startTime:n,transferSize:o+l.request.transferSize,treeMarkers:p}}static createChainNode(e,t,n){let o=e.createComponent("crcChain");e.find(".lh-crc-node",o).setAttribute("title",t.node.request.url);let i=e.find(".lh-crc-node__tree-marker",o);t.treeMarkers.forEach(p=>{let h=p?"lh-tree-marker lh-vert":"lh-tree-marker";i.append(e.createElement("span",h),e.createElement("span","lh-tree-marker"))});let a=t.isLastChild?"lh-tree-marker lh-up-right":"lh-tree-marker lh-vert-right",l=t.hasChildren?"lh-tree-marker lh-horiz-down":"lh-tree-marker lh-right";i.append(e.createElement("span",a),e.createElement("span","lh-tree-marker lh-right"),e.createElement("span",l));let s=t.node.request.url,c=n.renderTextURL(s),d=e.find(".lh-crc-node__tree-value",o);if(d.append(c),!t.hasChildren){let{startTime:p,endTime:h,transferSize:g}=t.node.request,v=e.createElement("span","lh-crc-node__chain-duration");v.textContent=" - "+u.i18n.formatMilliseconds((h-p)*1e3)+", ";let w=e.createElement("span","lh-crc-node__chain-duration");w.textContent=u.i18n.formatBytesToKiB(g,.01),d.append(v,w)}return o}static buildTree(e,t,n,o,i,a){if(o.append(q.createChainNode(e,n,a)),n.node.children)for(let l of Object.keys(n.node.children)){let s=q.createSegment(n.node.children,l,n.startTime,n.transferSize,n.treeMarkers,n.isLastChild);q.buildTree(e,t,s,o,i,a)}}static render(e,t,n){let o=e.createComponent("crc"),i=e.find(".lh-crc",o);e.find(".lh-crc-initial-nav",o).textContent=u.strings.crcInitialNavigation,e.find(".lh-crc__longest_duration_label",o).textContent=u.strings.crcLongestDurationLabel,e.find(".lh-crc__longest_duration",o).textContent=u.i18n.formatMilliseconds(t.longestChain.duration);let a=q.initTree(t.chains);for(let l of Object.keys(a.tree)){let s=q.createSegment(a.tree,l,a.startTime,a.transferSize);q.buildTree(e,o,s,i,t,n)}return e.find(".lh-crc-container",o)}},q=Y;function mt(r,e){return e.left<=r.width&&0<=e.right&&e.top<=r.height&&0<=e.bottom}function Se(r,e,t){return r<e?e:r>t?t:r}function ft(r){return{x:r.left+r.width/2,y:r.top+r.height/2}}var V=class r{static getScreenshotPositions(e,t,n){let o=ft(e),i=Se(o.x-t.width/2,0,n.width-t.width),a=Se(o.y-t.height/2,0,n.height-t.height);return{screenshot:{left:i,top:a},clip:{left:e.left-i,top:e.top-a}}}static renderClipPathInScreenshot(e,t,n,o,i){let a=e.find("clipPath",t),l=`clip-${u.getUniqueSuffix()}`;a.id=l,t.style.clipPath=`url(#${l})`;let s=n.top/i.height,c=s+o.height/i.height,d=n.left/i.width,p=d+o.width/i.width,h=[`0,0 1,0 1,${s} 0,${s}`,`0,${c} 1,${c} 1,1 0,1`,`0,${s} ${d},${s} ${d},${c} 0,${c}`,`${p},${s} 1,${s} 1,${c} ${p},${c}`];for(let g of h){let v=e.createElementNS("http://www.w3.org/2000/svg","polygon");v.setAttribute("points",g),a.append(v)}}static installFullPageScreenshot(e,t){e.style.setProperty("--element-screenshot-url",`url('${t.data}')`)}static installOverlayFeature(e){let{dom:t,rootEl:n,overlayContainerEl:o,fullPageScreenshot:i}=e,a="lh-screenshot-overlay--enabled";n.classList.contains(a)||(n.classList.add(a),n.addEventListener("click",l=>{let s=l.target;if(!s)return;let c=s.closest(".lh-node > .lh-element-screenshot");if(!c)return;let d=t.createElement("div","lh-element-screenshot__overlay");o.append(d);let p={width:d.clientWidth*.95,height:d.clientHeight*.8},h={width:Number(c.dataset.rectWidth),height:Number(c.dataset.rectHeight),left:Number(c.dataset.rectLeft),right:Number(c.dataset.rectLeft)+Number(c.dataset.rectWidth),top:Number(c.dataset.rectTop),bottom:Number(c.dataset.rectTop)+Number(c.dataset.rectHeight)},g=r.render(t,i.screenshot,h,p);if(!g){d.remove();return}d.append(g),d.addEventListener("click",()=>d.remove())}))}static _computeZoomFactor(e,t){let o={x:t.width/e.width,y:t.height/e.height},i=.75*Math.min(o.x,o.y);return Math.min(1,i)}static render(e,t,n,o){if(!mt(t,n))return null;let i=e.createComponent("elementScreenshot"),a=e.find("div.lh-element-screenshot",i);a.dataset.rectWidth=n.width.toString(),a.dataset.rectHeight=n.height.toString(),a.dataset.rectLeft=n.left.toString(),a.dataset.rectTop=n.top.toString();let l=this._computeZoomFactor(n,o),s={width:o.width/l,height:o.height/l};s.width=Math.min(t.width,s.width),s.height=Math.min(t.height,s.height);let c={width:s.width*l,height:s.height*l},d=r.getScreenshotPositions(n,s,{width:t.width,height:t.height}),p=e.find("div.lh-element-screenshot__image",a);p.style.width=c.width+"px",p.style.height=c.height+"px",p.style.backgroundPositionY=-(d.screenshot.top*l)+"px",p.style.backgroundPositionX=-(d.screenshot.left*l)+"px",p.style.backgroundSize=`${t.width*l}px ${t.height*l}px`;let h=e.find("div.lh-element-screenshot__element-marker",a);h.style.width=n.width*l+"px",h.style.height=n.height*l+"px",h.style.left=d.clip.left*l+"px",h.style.top=d.clip.top*l+"px";let g=e.find("div.lh-element-screenshot__mask",a);return g.style.width=c.width+"px",g.style.height=c.height+"px",r.renderClipPathInScreenshot(e,g,d.clip,n,s),a}};var vt=["http://","https://","data:"],bt=["bytes","numeric","ms","timespanMs"],X=class{constructor(e,t={}){this._dom=e,this._fullPageScreenshot=t.fullPageScreenshot,this._entities=t.entities}render(e){switch(e.type){case"filmstrip":return this._renderFilmstrip(e);case"list":return this._renderList(e);case"table":case"opportunity":return this._renderTable(e);case"criticalrequestchain":return Y.render(this._dom,e,this);case"screenshot":case"debugdata":case"treemap-data":return null;default:return this._renderUnknown(e.type,e)}}_renderBytes(e){let t=u.i18n.formatBytesToKiB(e.value,e.granularity||.1),n=this._renderText(t);return n.title=u.i18n.formatBytes(e.value),n}_renderMilliseconds(e){let t;return e.displayUnit==="duration"?t=u.i18n.formatDuration(e.value):t=u.i18n.formatMilliseconds(e.value,e.granularity||10),this._renderText(t)}renderTextURL(e){let t=e,n,o,i;try{let l=C.parseURL(t);n=l.file==="/"?l.origin:l.file,o=l.file==="/"||l.hostname===""?"":`(${l.hostname})`,i=t}catch{n=t}let a=this._dom.createElement("div","lh-text__url");if(a.append(this._renderLink({text:n,url:t})),o){let l=this._renderText(o);l.classList.add("lh-text__url-host"),a.append(l)}return i&&(a.title=t,a.dataset.url=t),a}_renderLink(e){let t=this._dom.createElement("a");if(this._dom.safelySetHref(t,e.url),!t.href){let n=this._renderText(e.text);return n.classList.add("lh-link"),n}return t.rel="noopener",t.target="_blank",t.textContent=e.text,t.classList.add("lh-link"),t}_renderText(e){let t=this._dom.createElement("div","lh-text");return t.textContent=e,t}_renderNumeric(e){let t=u.i18n.formatNumber(e.value,e.granularity||.1),n=this._dom.createElement("div","lh-numeric");return n.textContent=t,n}_renderThumbnail(e){let t=this._dom.createElement("img","lh-thumbnail"),n=e;return t.src=n,t.title=n,t.alt="",t}_renderUnknown(e,t){console.error(`Unknown details type: ${e}`,t);let n=this._dom.createElement("details","lh-unknown");return this._dom.createChildOf(n,"summary").textContent=`We don't know how to render audit details of type \`${e}\`. The Lighthouse version that collected this data is likely newer than the Lighthouse version of the report renderer. Expand for the raw JSON.`,this._dom.createChildOf(n,"pre").textContent=JSON.stringify(t,null,2),n}_renderTableValue(e,t){if(e==null)return null;if(typeof e=="object")switch(e.type){case"code":return this._renderCode(e.value);case"link":return this._renderLink(e);case"node":return this.renderNode(e);case"numeric":return this._renderNumeric(e);case"source-location":return this.renderSourceLocation(e);case"url":return this.renderTextURL(e.value);default:return this._renderUnknown(e.type,e)}switch(t.valueType){case"bytes":{let n=Number(e);return this._renderBytes({value:n,granularity:t.granularity})}case"code":{let n=String(e);return this._renderCode(n)}case"ms":{let n={value:Number(e),granularity:t.granularity,displayUnit:t.displayUnit};return this._renderMilliseconds(n)}case"numeric":{let n=Number(e);return this._renderNumeric({value:n,granularity:t.granularity})}case"text":{let n=String(e);return this._renderText(n)}case"thumbnail":{let n=String(e);return this._renderThumbnail(n)}case"timespanMs":{let n=Number(e);return this._renderMilliseconds({value:n})}case"url":{let n=String(e);return vt.some(o=>n.startsWith(o))?this.renderTextURL(n):this._renderCode(n)}default:return this._renderUnknown(t.valueType,e)}}_getDerivedSubItemsHeading(e){return e.subItemsHeading?{key:e.subItemsHeading.key||"",valueType:e.subItemsHeading.valueType||e.valueType,granularity:e.subItemsHeading.granularity||e.granularity,displayUnit:e.subItemsHeading.displayUnit||e.displayUnit,label:""}:null}_renderTableRow(e,t){let n=this._dom.createElement("tr");for(let o of t){if(!o||!o.key){this._dom.createChildOf(n,"td","lh-table-column--empty");continue}let i=e[o.key],a;if(i!=null&&(a=this._renderTableValue(i,o)),a){let l=`lh-table-column--${o.valueType}`;this._dom.createChildOf(n,"td",l).append(a)}else this._dom.createChildOf(n,"td","lh-table-column--empty")}return n}_renderTableRowsFromItem(e,t){let n=this._dom.createFragment();if(n.append(this._renderTableRow(e,t)),!e.subItems)return n;let o=t.map(this._getDerivedSubItemsHeading);if(!o.some(Boolean))return n;for(let i of e.subItems.items){let a=this._renderTableRow(i,o);a.classList.add("lh-sub-item-row"),n.append(a)}return n}_adornEntityGroupRow(e){let t=e.dataset.entity;if(!t)return;let n=this._entities?.find(i=>i.name===t);if(!n)return;let o=this._dom.find("td",e);if(n.category){let i=this._dom.createElement("span");i.classList.add("lh-audit__adorn"),i.textContent=n.category,o.append(" ",i)}if(n.isFirstParty){let i=this._dom.createElement("span");i.classList.add("lh-audit__adorn","lh-audit__adorn1p"),i.textContent=u.strings.firstPartyChipLabel,o.append(" ",i)}if(n.homepage){let i=this._dom.createElement("a");i.href=n.homepage,i.target="_blank",i.title=u.strings.openInANewTabTooltip,i.classList.add("lh-report-icon--external"),o.append(" ",i)}}_renderEntityGroupRow(e,t){let n={...t[0]};n.valueType="text";let o=[n,...t.slice(1)],i=this._dom.createFragment();return i.append(this._renderTableRow(e,o)),this._dom.find("tr",i).classList.add("lh-row--group"),i}_getEntityGroupItems(e){let{items:t,headings:n,sortedBy:o}=e;if(!t.length||e.isEntityGrouped||!t.some(d=>d.entity))return[];let i=new Set(e.skipSumming||[]),a=[];for(let d of n)!d.key||i.has(d.key)||bt.includes(d.valueType)&&a.push(d.key);let l=n[0].key;if(!l)return[];let s=new Map;for(let d of t){let p=typeof d.entity=="string"?d.entity:void 0,h=s.get(p)||{[l]:p||u.strings.unattributable,entity:p};for(let g of a)h[g]=Number(h[g]||0)+Number(d[g]||0);s.set(p,h)}let c=[...s.values()];return o&&c.sort(E.getTableItemSortComparator(o)),c}_renderTable(e){if(!e.items.length)return this._dom.createElement("span");let t=this._dom.createElement("table","lh-table"),n=this._dom.createChildOf(t,"thead"),o=this._dom.createChildOf(n,"tr");for(let l of e.headings){let c=`lh-table-column--${l.valueType||"text"}`,d=this._dom.createElement("div","lh-text");d.textContent=l.label,this._dom.createChildOf(o,"th",c).append(d)}let i=this._getEntityGroupItems(e),a=this._dom.createChildOf(t,"tbody");if(i.length)for(let l of i){let s=typeof l.entity=="string"?l.entity:void 0,c=this._renderEntityGroupRow(l,e.headings);for(let p of e.items.filter(h=>h.entity===s))c.append(this._renderTableRowsFromItem(p,e.headings));let d=this._dom.findAll("tr",c);s&&d.length&&(d.forEach(p=>p.dataset.entity=s),this._adornEntityGroupRow(d[0])),a.append(c)}else{let l=!0;for(let s of e.items){let c=this._renderTableRowsFromItem(s,e.headings),d=this._dom.findAll("tr",c),p=d[0];if(typeof s.entity=="string"&&(p.dataset.entity=s.entity),e.isEntityGrouped&&s.entity)p.classList.add("lh-row--group"),this._adornEntityGroupRow(p);else for(let h of d)h.classList.add(l?"lh-row--even":"lh-row--odd");l=!l,a.append(c)}}return t}_renderList(e){let t=this._dom.createElement("div","lh-list");return e.items.forEach(n=>{let o=this.render(n);o&&t.append(o)}),t}renderNode(e){let t=this._dom.createElement("span","lh-node");if(e.nodeLabel){let a=this._dom.createElement("div");a.textContent=e.nodeLabel,t.append(a)}if(e.snippet){let a=this._dom.createElement("div");a.classList.add("lh-node__snippet"),a.textContent=e.snippet,t.append(a)}if(e.selector&&(t.title=e.selector),e.path&&t.setAttribute("data-path",e.path),e.selector&&t.setAttribute("data-selector",e.selector),e.snippet&&t.setAttribute("data-snippet",e.snippet),!this._fullPageScreenshot)return t;let n=e.lhId&&this._fullPageScreenshot.nodes[e.lhId];if(!n||n.width===0||n.height===0)return t;let o={width:147,height:100},i=V.render(this._dom,this._fullPageScreenshot.screenshot,n,o);return i&&t.prepend(i),t}renderSourceLocation(e){if(!e.url)return null;let t=`${e.url}:${e.line+1}:${e.column}`,n;e.original&&(n=`${e.original.file||"<unmapped>"}:${e.original.line+1}:${e.original.column}`);let o;if(e.urlProvider==="network"&&n)o=this._renderLink({url:e.url,text:n}),o.title=`maps to generated location ${t}`;else if(e.urlProvider==="network"&&!n)o=this.renderTextURL(e.url),this._dom.find(".lh-link",o).textContent+=`:${e.line+1}:${e.column}`;else if(e.urlProvider==="comment"&&n)o=this._renderText(`${n} (from source map)`),o.title=`${t} (from sourceURL)`;else if(e.urlProvider==="comment"&&!n)o=this._renderText(`${t} (from sourceURL)`);else return null;return o.classList.add("lh-source-location"),o.setAttribute("data-source-url",e.url),o.setAttribute("data-source-line",String(e.line)),o.setAttribute("data-source-column",String(e.column)),o}_renderFilmstrip(e){let t=this._dom.createElement("div","lh-filmstrip");for(let n of e.items){let o=this._dom.createChildOf(t,"div","lh-filmstrip__frame"),i=this._dom.createChildOf(o,"img","lh-filmstrip__thumbnail");i.src=n.data,i.alt="Screenshot"}return t}_renderCode(e){let t=this._dom.createElement("pre","lh-code");return t.textContent=e,t}};var de="\xA0";var ne=class{constructor(e){e==="en-XA"&&(e="de"),this._locale=e,this._cachedNumberFormatters=new Map}_formatNumberWithGranularity(e,t,n={}){if(t!==void 0){let a=-Math.log10(t);Number.isInteger(a)||(console.warn(`granularity of ${t} is invalid. Using 1 instead`),t=1),t<1&&(n={...n},n.minimumFractionDigits=n.maximumFractionDigits=Math.ceil(a)),e=Math.round(e/t)*t,Object.is(e,-0)&&(e=0)}else Math.abs(e)<5e-4&&(e=0);let o,i=[n.minimumFractionDigits,n.maximumFractionDigits,n.style,n.unit,n.unitDisplay,this._locale].join("");return o=this._cachedNumberFormatters.get(i),o||(o=new Intl.NumberFormat(this._locale,n),this._cachedNumberFormatters.set(i,o)),o.format(e).replace(" ",de)}formatNumber(e,t){return this._formatNumberWithGranularity(e,t)}formatInteger(e){return this._formatNumberWithGranularity(e,1)}formatPercent(e){return new Intl.NumberFormat(this._locale,{style:"percent"}).format(e)}formatBytesToKiB(e,t=void 0){return this._formatNumberWithGranularity(e/1024,t)+`${de}KiB`}formatBytesToMiB(e,t=void 0){return this._formatNumberWithGranularity(e/1048576,t)+`${de}MiB`}formatBytes(e,t=1){return this._formatNumberWithGranularity(e,t,{style:"unit",unit:"byte",unitDisplay:"long"})}formatBytesWithBestUnit(e,t=.1){return e>=1048576?this.formatBytesToMiB(e,t):e>=1024?this.formatBytesToKiB(e,t):this._formatNumberWithGranularity(e,t,{style:"unit",unit:"byte",unitDisplay:"narrow"})}formatKbps(e,t=void 0){return this._formatNumberWithGranularity(e,t,{style:"unit",unit:"kilobit-per-second",unitDisplay:"short"})}formatMilliseconds(e,t=void 0){return this._formatNumberWithGranularity(e,t,{style:"unit",unit:"millisecond",unitDisplay:"short"})}formatSeconds(e,t=void 0){return this._formatNumberWithGranularity(e/1e3,t,{style:"unit",unit:"second",unitDisplay:"narrow"})}formatDateTime(e){let t={month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"numeric",timeZoneName:"short"},n;try{n=new Intl.DateTimeFormat(this._locale,t)}catch{t.timeZone="UTC",n=new Intl.DateTimeFormat(this._locale,t)}return n.format(new Date(e))}formatDuration(e){let t=e/1e3;if(Math.round(t)===0)return"None";let n=[],o={day:60*60*24,hour:60*60,minute:60,second:1};return Object.keys(o).forEach(i=>{let a=o[i],l=Math.floor(t/a);if(l>0){t-=l*a;let s=this._formatNumberWithGranularity(l,1,{style:"unit",unit:i,unitDisplay:"narrow"});n.push(s)}}),n.join(" ")}};function Ce(r){let e=r.createComponent("explodeyGauge");return r.find(".lh-exp-gauge-component",e)}function Le(r,e,t){let n=r.find("div.lh-exp-gauge__wrapper",e);n.className="",n.classList.add("lh-exp-gauge__wrapper",`lh-exp-gauge__wrapper--${E.calculateRating(t.score)}`),wt(r,n,t)}function _t(r,e,t){t=t||r/32;let n=r/t,o=.5*t,i=n+o+t,a=2*Math.PI*n,l=Math.acos(1-.5*Math.pow(.5*t/n,2))*n,s=2*Math.PI*i,c=Math.acos(1-.5*Math.pow(.5*t/i,2))*i;return{radiusInner:n,radiusOuter:i,circumferenceInner:a,circumferenceOuter:s,getArcLength:()=>Math.max(0,Number(e*a)),getMetricArcLength:(d,p=!1)=>{let h=p?0:2*c;return Math.max(0,Number(d*s-o-h))},endDiffInner:l,endDiffOuter:c,strokeWidth:t,strokeGap:o}}function wt(r,e,t){let i=Number(t.score),{radiusInner:a,radiusOuter:l,circumferenceInner:s,circumferenceOuter:c,getArcLength:d,getMetricArcLength:p,endDiffInner:h,endDiffOuter:g,strokeWidth:v,strokeGap:w}=_t(128,i),m=r.find("svg.lh-exp-gauge",e);r.find(".lh-exp-gauge__label",m).textContent=t.title,m.setAttribute("viewBox",[-64,-64/2,128,128/2].join(" ")),m.style.setProperty("--stroke-width",`${v}px`),m.style.setProperty("--circle-meas",(2*Math.PI).toFixed(4));let x=r.find("g.lh-exp-gauge__outer",e),F=r.find("g.lh-exp-gauge__inner",e),L=r.find("circle.lh-cover",x),S=r.find("circle.lh-exp-gauge__arc",F),P=r.find("text.lh-exp-gauge__percentage",F);x.style.setProperty("--scale-initial",String(a/l)),x.style.setProperty("--radius",`${l}px`),L.style.setProperty("--radius",`${.5*(a+l)}px`),L.setAttribute("stroke-width",String(w)),m.style.setProperty("--radius",`${a}px`),S.setAttribute("stroke-dasharray",`${d()} ${(s-d()).toFixed(4)}`),S.setAttribute("stroke-dashoffset",String(.25*s-h)),P.textContent=Math.round(i*100).toString();let f=l+v,_=l-v,b=t.auditRefs.filter(y=>y.group==="metrics"&&y.weight),k=b.reduce((y,M)=>y+=M.weight,0),A=.25*c-g-.5*w,z=-.5*Math.PI;x.querySelectorAll(".metric").forEach(y=>{b.map(N=>`metric--${N.id}`).find(N=>y.classList.contains(N))||y.remove()}),b.forEach((y,M)=>{let D=y.acronym??y.id,N=!x.querySelector(`.metric--${D}`),R=r.maybeFind(`g.metric--${D}`,x)||r.createSVGElement("g"),B=r.maybeFind(`.metric--${D} circle.lh-exp-gauge--faded`,x)||r.createSVGElement("circle"),J=r.maybeFind(`.metric--${D} circle.lh-exp-gauge--miniarc`,x)||r.createSVGElement("circle"),j=r.maybeFind(`.metric--${D} circle.lh-exp-gauge-hovertarget`,x)||r.createSVGElement("circle"),H=r.maybeFind(`.metric--${D} text.metric__label`,x)||r.createSVGElement("text"),U=r.maybeFind(`.metric--${D} text.metric__value`,x)||r.createSVGElement("text");R.classList.add("metric",`metric--${D}`),B.classList.add("lh-exp-gauge__arc","lh-exp-gauge__arc--metric","lh-exp-gauge--faded"),J.classList.add("lh-exp-gauge__arc","lh-exp-gauge__arc--metric","lh-exp-gauge--miniarc"),j.classList.add("lh-exp-gauge__arc","lh-exp-gauge__arc--metric","lh-exp-gauge-hovertarget");let W=y.weight/k,ge=p(W),ue=y.result.score?y.result.score*W:0,me=p(ue),Re=W*c,fe=p(W,!0),ve=E.calculateRating(y.result.score,y.result.scoreDisplayMode);R.style.setProperty("--metric-rating",ve),R.style.setProperty("--metric-color",`var(--color-${ve})`),R.style.setProperty("--metric-offset",`${A}`),R.style.setProperty("--i",M.toString()),B.setAttribute("stroke-dasharray",`${ge} ${c-ge}`),J.style.setProperty("--metric-array",`${me} ${c-me}`),j.setAttribute("stroke-dasharray",`${fe} ${c-fe-g}`),H.classList.add("metric__label"),U.classList.add("metric__value"),H.textContent=D,U.textContent=`+${Math.round(ue*100)}`;let be=z+W*Math.PI,Z=Math.cos(be),Q=Math.sin(be);switch(!0){case Z>0:U.setAttribute("text-anchor","end");break;case Z<0:H.setAttribute("text-anchor","end");break;case Z===0:H.setAttribute("text-anchor","middle"),U.setAttribute("text-anchor","middle");break}switch(!0){case Q>0:H.setAttribute("dominant-baseline","hanging");break;case Q<0:U.setAttribute("dominant-baseline","hanging");break;case Q===0:H.setAttribute("dominant-baseline","middle"),U.setAttribute("dominant-baseline","middle");break}H.setAttribute("x",(f*Z).toFixed(2)),H.setAttribute("y",(f*Q).toFixed(2)),U.setAttribute("x",(_*Z).toFixed(2)),U.setAttribute("y",(_*Q).toFixed(2)),N&&(R.appendChild(B),R.appendChild(J),R.appendChild(j),R.appendChild(H),R.appendChild(U),x.appendChild(R)),A-=Re,z+=W*2*Math.PI});let T=x.querySelector(".lh-exp-gauge-underhovertarget")||r.createSVGElement("circle");T.classList.add("lh-exp-gauge__arc","lh-exp-gauge__arc--metric","lh-exp-gauge-hovertarget","lh-exp-gauge-underhovertarget");let I=p(1,!0);if(T.setAttribute("stroke-dasharray",`${I} ${c-I-g}`),T.isConnected||x.prepend(T),m.dataset.listenersSetup)return;m.dataset.listenersSetup=!0,ee(m),m.addEventListener("pointerover",y=>{if(y.target===m&&m.classList.contains("state--expanded")){m.classList.remove("state--expanded"),m.classList.contains("state--highlight")&&(m.classList.remove("state--highlight"),r.find(".metric--highlight",m).classList.remove("metric--highlight"));return}if(!(y.target instanceof Element))return;let M=y.target.parentNode;if(M instanceof SVGElement){if(M&&M===F){m.classList.contains("state--expanded")?m.classList.contains("state--highlight")&&(m.classList.remove("state--highlight"),r.find(".metric--highlight",m).classList.remove("metric--highlight")):m.classList.add("state--expanded");return}if(M&&M.classList&&M.classList.contains("metric")){let D=M.style.getPropertyValue("--metric-rating");if(e.style.setProperty("--color-highlight",`var(--color-${D}-secondary)`),!m.classList.contains("state--highlight"))m.classList.add("state--highlight"),M.classList.add("metric--highlight");else{let N=r.find(".metric--highlight",m);M!==N&&(N.classList.remove("metric--highlight"),M.classList.add("metric--highlight"))}}}}),m.addEventListener("mouseleave",()=>{m.classList.remove("state--highlight"),m.querySelector(".metric--highlight")?.classList.remove("metric--highlight")});async function ee(y){if(await new Promise(H=>setTimeout(H,1e3)),y.classList.contains("state--expanded"))return;let M=r.find(".lh-exp-gauge__inner",y),D=`uniq-${Math.random()}`;M.setAttribute("id",D);let N=r.createSVGElement("use");N.setAttribute("href",`#${D}`),y.appendChild(N);let R=2.5;y.style.setProperty("--peek-dur",`${R}s`),y.classList.add("state--peek","state--expanded");let B=()=>{y.classList.remove("state--peek","state--expanded"),N.remove()},J=setTimeout(()=>{y.removeEventListener("mouseenter",j),B()},R*1e3*1.5);function j(){clearTimeout(J),B()}y.addEventListener("mouseenter",j,{once:!0})}}var re=class extends O{_renderMetric(e){let t=this.dom.createComponent("metric"),n=this.dom.find(".lh-metric",t);n.id=e.result.id;let o=E.calculateRating(e.result.score,e.result.scoreDisplayMode);n.classList.add(`lh-metric--${o}`);let i=this.dom.find(".lh-metric__title",t);i.textContent=e.result.title;let a=this.dom.find(".lh-metric__value",t);a.textContent=e.result.displayValue||"";let l=this.dom.find(".lh-metric__description",t);if(l.append(this.dom.convertMarkdownLinkSnippets(e.result.description)),e.result.scoreDisplayMode==="error"){l.textContent="",a.textContent="Error!";let s=this.dom.createChildOf(l,"span");s.textContent=e.result.errorMessage||"Report error: no metric information"}else e.result.scoreDisplayMode==="notApplicable"&&(a.textContent="--");return n}_getScoringCalculatorHref(e){let t=e.filter(p=>p.group==="metrics"),n=e.find(p=>p.id==="interactive"),o=e.find(p=>p.id==="first-cpu-idle"),i=e.find(p=>p.id==="first-meaningful-paint");n&&t.push(n),o&&t.push(o),i&&t.push(i);let a=p=>Math.round(p*100)/100,s=[...t.map(p=>{let h;return typeof p.result.numericValue=="number"?(h=p.id==="cumulative-layout-shift"?a(p.result.numericValue):Math.round(p.result.numericValue),h=h.toString()):h="null",[p.acronym||p.id,h]})];u.reportJson&&(s.push(["device",u.reportJson.configSettings.formFactor]),s.push(["version",u.reportJson.lighthouseVersion]));let c=new URLSearchParams(s),d=new URL("https://googlechrome.github.io/lighthouse/scorecalc/");return d.hash=c.toString(),d.href}_isPerformanceInsight(e){return!e.group}overallImpact(e,t){if(!e.result.metricSavings)return{overallImpact:0,overallLinearImpact:0};let n=0,o=0;for(let[i,a]of Object.entries(e.result.metricSavings)){if(a===void 0)continue;let l=t.find(g=>g.acronym===i);if(!l||l.result.score===null)continue;let s=l.result.numericValue;if(!s)continue;let c=a/s*l.weight;o+=c;let d=l.result.scoringOptions;if(!d)continue;let h=(C.computeLogNormalScore(d,s-a)-l.result.score)*l.weight;n+=h}return{overallImpact:n,overallLinearImpact:o}}render(e,t,n){let o=u.strings,i=this.dom.createElement("div","lh-category");i.id=e.id,i.append(this.renderCategoryHeader(e,t,n));let a=e.auditRefs.filter(f=>f.group==="metrics");if(a.length){let[f,_]=this.renderAuditGroup(t.metrics),b=this.dom.createElement("input","lh-metrics-toggle__input"),k=`lh-metrics-toggle${u.getUniqueSuffix()}`;b.setAttribute("aria-label","Toggle the display of metric descriptions"),b.type="checkbox",b.id=k,f.prepend(b);let A=this.dom.find(".lh-audit-group__header",f),z=this.dom.createChildOf(A,"label","lh-metrics-toggle__label");z.htmlFor=k;let T=this.dom.createChildOf(z,"span","lh-metrics-toggle__labeltext--show"),I=this.dom.createChildOf(z,"span","lh-metrics-toggle__labeltext--hide");T.textContent=u.strings.expandView,I.textContent=u.strings.collapseView;let ee=this.dom.createElement("div","lh-metrics-container");if(f.insertBefore(ee,_),a.forEach(y=>{ee.append(this._renderMetric(y))}),i.querySelector(".lh-gauge__wrapper")){let y=this.dom.find(".lh-category-header__description",i),M=this.dom.createChildOf(y,"div","lh-metrics__disclaimer"),D=this.dom.convertMarkdownLinkSnippets(o.varianceDisclaimer);M.append(D);let N=this.dom.createChildOf(M,"a","lh-calclink");N.target="_blank",N.textContent=o.calculatorLink,this.dom.safelySetHref(N,this._getScoringCalculatorHref(e.auditRefs))}f.classList.add("lh-audit-group--metrics"),i.append(f)}let l=this.dom.createChildOf(i,"div","lh-filmstrip-container"),c=e.auditRefs.find(f=>f.id==="screenshot-thumbnails")?.result;if(c?.details){l.id=c.id;let f=this.detailsRenderer.render(c.details);f&&l.append(f)}let d=e.auditRefs.filter(f=>this._isPerformanceInsight(f)).map(f=>{let{overallImpact:_,overallLinearImpact:b}=this.overallImpact(f,a),k=f.result.guidanceLevel||1,A=this.renderAudit(f);return{auditRef:f,auditEl:A,overallImpact:_,overallLinearImpact:b,guidanceLevel:k}}),p=d.filter(f=>!E.showAsPassed(f.auditRef.result)),h=d.filter(f=>E.showAsPassed(f.auditRef.result)),[g,v]=this.renderAuditGroup(t.diagnostics);g.classList.add("lh-audit-group--diagnostics");function w(f){for(let _ of d)if(f==="All")_.auditEl.hidden=!1;else{let b=_.auditRef.result.metricSavings?.[f]===void 0;_.auditEl.hidden=b}p.sort((_,b)=>{let k=_.auditRef.result.score||0,A=b.auditRef.result.score||0;if(k!==A)return k-A;if(f!=="All"){let z=_.auditRef.result.metricSavings?.[f]??-1,T=b.auditRef.result.metricSavings?.[f]??-1;if(z!==T)return T-z}return _.overallImpact!==b.overallImpact?b.overallImpact*b.guidanceLevel-_.overallImpact*_.guidanceLevel:_.overallImpact===0&&b.overallImpact===0&&_.overallLinearImpact!==b.overallLinearImpact?b.overallLinearImpact*b.guidanceLevel-_.overallLinearImpact*_.guidanceLevel:b.guidanceLevel-_.guidanceLevel});for(let _ of p)g.insertBefore(_.auditEl,v)}let m=new Set;for(let f of p){let _=f.auditRef.result.metricSavings||{};for(let[b,k]of Object.entries(_))typeof k=="number"&&m.add(b)}let x=a.filter(f=>f.acronym&&m.has(f.acronym));if(x.length&&this.renderMetricAuditFilter(x,i,w),w("All"),p.length&&i.append(g),!h.length)return i;let F={auditRefsOrEls:h.map(f=>f.auditEl),groupDefinitions:t},L=this.renderClump("passed",F);i.append(L);let S=[];if(["performance-budget","timing-budget"].forEach(f=>{let _=e.auditRefs.find(b=>b.id===f);if(_?.result.details){let b=this.detailsRenderer.render(_.result.details);b&&(b.id=f,b.classList.add("lh-details","lh-details--budget","lh-audit"),S.push(b))}}),S.length>0){let[f,_]=this.renderAuditGroup(t.budgets);S.forEach(b=>f.insertBefore(b,_)),f.classList.add("lh-audit-group--budgets"),i.append(f)}if((!n||n?.gatherMode==="navigation")&&e.score!==null){let f=Ce(this.dom);Le(this.dom,f,e),this.dom.find(".lh-score__gauge",i).replaceWith(f)}return i}renderMetricAuditFilter(e,t,n){let o=this.dom.createElement("div","lh-metricfilter"),i=this.dom.createChildOf(o,"span","lh-metricfilter__text");i.textContent=u.strings.showRelevantAudits;let a=[{acronym:"All",id:"All"},...e],l=u.getUniqueSuffix();for(let s of a){let c=`metric-${s.acronym}-${l}`,d=this.dom.createChildOf(o,"input","lh-metricfilter__radio");d.type="radio",d.name=`metricsfilter-${l}`,d.id=c;let p=this.dom.createChildOf(o,"label","lh-metricfilter__label");p.htmlFor=c,p.title="result"in s?s.result.title:"",p.textContent=s.acronym||s.id,s.acronym==="All"&&(d.checked=!0,p.classList.add("lh-metricfilter__label--active")),t.append(o),d.addEventListener("input",h=>{for(let v of t.querySelectorAll("label.lh-metricfilter__label"))v.classList.toggle("lh-metricfilter__label--active",v.htmlFor===c);t.classList.toggle("lh-category--filtered",s.acronym!=="All"),n(s.acronym||"All");let g=t.querySelectorAll("div.lh-audit-group, details.lh-audit-group");for(let v of g){v.hidden=!1;let w=Array.from(v.querySelectorAll("div.lh-audit")),m=!!w.length&&w.every(x=>x.hidden);v.hidden=m}})}}};var oe=class r extends O{render(e,t={}){let n=this.dom.createElement("div","lh-category");n.id=e.id;let o=this.dom.createComponent("warningsToplevel");this.dom.find(".lh-warnings__msg",o).append(this.dom.convertMarkdownLinkSnippets(u.strings.pwaRemovalMessage)),n.append(o),n.append(this.renderCategoryHeader(e,t));let a=e.auditRefs,l=a.filter(p=>p.result.scoreDisplayMode!=="manual"),s=this._renderAudits(l,t);n.append(s);let c=a.filter(p=>p.result.scoreDisplayMode==="manual"),d=this.renderClump("manual",{auditRefsOrEls:c,description:e.manualDescription,openByDefault:!0});return n.append(d),n}renderCategoryScore(e,t){if(e.score===null)return super.renderScoreGauge(e,t);let n=this.dom.createComponent("gaugePwa"),o=this.dom.find("a.lh-gauge--pwa__wrapper",n),i=n.querySelector("svg");if(!i)throw new Error("no SVG element found in PWA score gauge template");r._makeSvgReferencesUnique(i);let a=this._getGroupIds(e.auditRefs),l=this._getPassingGroupIds(e.auditRefs);if(l.size===a.size)o.classList.add("lh-badged--all");else for(let s of l)o.classList.add(`lh-badged--${s}`);return this.dom.find(".lh-gauge__label",n).textContent=e.title,o.title=this._getGaugeTooltip(e.auditRefs,t),n}_getGroupIds(e){let t=e.map(n=>n.group).filter(n=>!!n);return new Set(t)}_getPassingGroupIds(e){let t=this._getGroupIds(e);for(let n of e)!E.showAsPassed(n.result)&&n.group&&t.delete(n.group);return t}_getGaugeTooltip(e,t){let n=this._getGroupIds(e),o=[];for(let i of n){let a=e.filter(d=>d.group===i),l=a.length,s=a.filter(d=>E.showAsPassed(d.result)).length,c=t[i].title;o.push(`${c}: ${s}/${l}`)}return o.join(", ")}_renderAudits(e,t){let n=this.renderUnexpandableClump(e,t),o=this._getPassingGroupIds(e);for(let i of o)this.dom.find(`.lh-audit-group--${i}`,n).classList.add("lh-badged");return n}static _makeSvgReferencesUnique(e){let t=e.querySelector("defs");if(!t)return;let n=u.getUniqueSuffix(),o=t.querySelectorAll("[id]");for(let i of o){let a=i.id,l=`${a}-${n}`;i.id=l;let s=e.querySelectorAll(`use[href="#${a}"]`);for(let d of s)d.setAttribute("href",`#${l}`);let c=e.querySelectorAll(`[fill="url(#${a})"]`);for(let d of c)d.setAttribute("fill",`url(#${l})`)}}};var ie=class{constructor(e){this._dom=e,this._opts={}}renderReport(e,t,n){if(!this._dom.rootEl&&t){console.warn("Please adopt the new report API in renderer/api.js.");let i=t.closest(".lh-root");i?this._dom.rootEl=i:(t.classList.add("lh-root","lh-vars"),this._dom.rootEl=t)}else this._dom.rootEl&&t&&(this._dom.rootEl=t);n&&(this._opts=n),this._dom.setLighthouseChannel(e.configSettings.channel||"unknown");let o=E.prepareReportResult(e);return this._dom.rootEl.textContent="",this._dom.rootEl.append(this._renderReport(o)),this._opts.occupyEntireViewport&&this._dom.rootEl.classList.add("lh-max-viewport"),this._dom.rootEl}_renderReportTopbar(e){let t=this._dom.createComponent("topbar"),n=this._dom.find("a.lh-topbar__url",t);return n.textContent=e.finalDisplayedUrl,n.title=e.finalDisplayedUrl,this._dom.safelySetHref(n,e.finalDisplayedUrl),t}_renderReportHeader(){let e=this._dom.createComponent("heading"),t=this._dom.createComponent("scoresWrapper");return this._dom.find(".lh-scores-wrapper-placeholder",e).replaceWith(t),e}_renderReportFooter(e){let t=this._dom.createComponent("footer");return this._renderMetaBlock(e,t),this._dom.find(".lh-footer__version_issue",t).textContent=u.strings.footerIssue,this._dom.find(".lh-footer__version",t).textContent=e.lighthouseVersion,t}_renderMetaBlock(e,t){let n=E.getEmulationDescriptions(e.configSettings||{}),o=e.userAgent.match(/(\w*Chrome\/[\d.]+)/),i=Array.isArray(o)?o[1].replace("/"," ").replace("Chrome","Chromium"):"Chromium",a=e.configSettings.channel,l=e.environment.benchmarkIndex.toFixed(0),s=e.environment.credits?.["axe-core"],c=[`${u.strings.runtimeSettingsBenchmark}: ${l}`,`${u.strings.runtimeSettingsCPUThrottling}: ${n.cpuThrottling}`];n.screenEmulation&&c.push(`${u.strings.runtimeSettingsScreenEmulation}: ${n.screenEmulation}`),s&&c.push(`${u.strings.runtimeSettingsAxeVersion}: ${s}`);let d=u.strings.runtimeAnalysisWindow;e.gatherMode==="timespan"?d=u.strings.runtimeAnalysisWindowTimespan:e.gatherMode==="snapshot"&&(d=u.strings.runtimeAnalysisWindowSnapshot);let p=[["date",`Captured at ${u.i18n.formatDateTime(e.fetchTime)}`],["devices",`${n.deviceEmulation} with Lighthouse ${e.lighthouseVersion}`,c.join(`
|
|
2637
2637
|
`)],["samples-one",u.strings.runtimeSingleLoad,u.strings.runtimeSingleLoadTooltip],["stopwatch",d],["networkspeed",`${n.summary}`,`${u.strings.runtimeSettingsNetworkThrottling}: ${n.networkThrottling}`],["chrome",`Using ${i}`+(a?` with ${a}`:""),`${u.strings.runtimeSettingsUANetwork}: "${e.environment.networkUserAgent}"`]],h=this._dom.find(".lh-meta__items",t);for(let[g,v,w]of p){let m=this._dom.createChildOf(h,"li","lh-meta__item");if(m.textContent=v,w){m.classList.add("lh-tooltip-boundary");let x=this._dom.createChildOf(m,"div","lh-tooltip");x.textContent=w}m.classList.add("lh-report-icon",`lh-report-icon--${g}`)}}_renderReportWarnings(e){if(!e.runWarnings||e.runWarnings.length===0)return this._dom.createElement("div");let t=this._dom.createComponent("warningsToplevel"),n=this._dom.find(".lh-warnings__msg",t);n.textContent=u.strings.toplevelWarningsMessage;let o=[];for(let i of e.runWarnings){let a=this._dom.createElement("li");a.append(this._dom.convertMarkdownLinkSnippets(i)),o.push(a)}return this._dom.find("ul",t).append(...o),t}_renderScoreGauges(e,t,n){let o=[],i=[],a=[];for(let l of Object.values(e.categories)){let s=n[l.id]||t,c=s.renderCategoryScore(l,e.categoryGroups||{},{gatherMode:e.gatherMode}),d=this._dom.find("a.lh-gauge__wrapper, a.lh-fraction__wrapper",c);d&&(this._dom.safelySetHref(d,`#${l.id}`),d.addEventListener("click",p=>{if(!d.matches('[href^="#"]'))return;let h=d.getAttribute("href"),g=this._dom.rootEl;if(!h||!g)return;let v=this._dom.find(h,g);p.preventDefault(),v.scrollIntoView()}),this._opts.onPageAnchorRendered?.(d)),E.isPluginCategory(l.id)?a.push(c):s.renderCategoryScore===t.renderCategoryScore?o.push(c):i.push(c)}return[...o,...i,...a]}_renderReport(e){u.apply({providedStrings:e.i18n.rendererFormattedStrings,i18n:new ne(e.configSettings.locale),reportJson:e});let t=new X(this._dom,{fullPageScreenshot:e.fullPageScreenshot??void 0,entities:e.entities}),n=new O(this._dom,t),o={performance:new re(this._dom,t),pwa:new oe(this._dom,t)},i=this._dom.createElement("div");i.append(this._renderReportHeader());let a=this._dom.createElement("div","lh-container"),l=this._dom.createElement("div","lh-report");l.append(this._renderReportWarnings(e));let s;Object.keys(e.categories).length===1?i.classList.add("lh-header--solo-category"):s=this._dom.createElement("div","lh-scores-header");let d=this._dom.createElement("div");if(d.classList.add("lh-scorescale-wrap"),d.append(this._dom.createComponent("scorescale")),s){let v=this._dom.find(".lh-scores-container",i);s.append(...this._renderScoreGauges(e,n,o)),v.append(s,d);let w=this._dom.createElement("div","lh-sticky-header");w.append(...this._renderScoreGauges(e,n,o)),a.append(w)}let p=this._dom.createElement("div","lh-categories");l.append(p);let h={gatherMode:e.gatherMode};for(let v of Object.values(e.categories)){let w=o[v.id]||n;w.dom.createChildOf(p,"div","lh-category-wrapper").append(w.render(v,e.categoryGroups,h))}n.injectFinalScreenshot(p,e.audits,d);let g=this._dom.createFragment();return this._opts.omitGlobalStyles||g.append(this._dom.createComponent("styles")),this._opts.omitTopbar||g.append(this._renderReportTopbar(e)),g.append(a),l.append(this._renderReportFooter(e)),a.append(i,l),e.fullPageScreenshot&&V.installFullPageScreenshot(this._dom.rootEl,e.fullPageScreenshot.screenshot),g}};function K(r,e){let t=r.rootEl;typeof e>"u"?t.classList.toggle("lh-dark"):t.classList.toggle("lh-dark",e)}var yt=typeof btoa<"u"?btoa:r=>Buffer.from(r).toString("base64"),xt=typeof atob<"u"?atob:r=>Buffer.from(r,"base64").toString();async function Et(r,e){let t=new TextEncoder().encode(r);if(e.gzip)if(typeof CompressionStream<"u"){let i=new CompressionStream("gzip"),a=i.writable.getWriter();a.write(t),a.close();let l=await new Response(i.readable).arrayBuffer();t=new Uint8Array(l)}else t=window.pako.gzip(r);let n="",o=5e3;for(let i=0;i<t.length;i+=o)n+=String.fromCharCode(...t.subarray(i,i+o));return yt(n)}function kt(r,e){let t=xt(r),n=Uint8Array.from(t,o=>o.charCodeAt(0));return e.gzip?window.pako.ungzip(n,{to:"string"}):new TextDecoder().decode(n)}var ze={toBase64:Et,fromBase64:kt};function pe(){let r=window.location.host.endsWith(".vercel.app"),e=new URLSearchParams(window.location.search).has("dev");return r?`https://${window.location.host}/gh-pages`:e?"http://localhost:7333":"https://googlechrome.github.io/lighthouse"}function he(r){let e=r.generatedTime,t=r.fetchTime||e;return`${r.lighthouseVersion}-${r.finalDisplayedUrl}-${t}`}function At(r,e,t){let n=new URL(e).origin;window.addEventListener("message",function i(a){a.origin===n&&o&&a.data.opened&&(o.postMessage(r,n),window.removeEventListener("message",i))});let o=window.open(e,t)}async function Me(r,e,t){let n=new URL(e),o=!!window.CompressionStream;n.hash=await ze.toBase64(JSON.stringify(r),{gzip:o}),o&&n.searchParams.set("gzip","1"),window.open(n.toString(),t)}async function Te(r){let e="viewer-"+he(r),t=pe()+"/viewer/";await Me({lhr:r},t,e)}async function Fe(r){let e="viewer-"+he(r),t=pe()+"/viewer/";At({lhr:r},t,e)}function Pe(r){if(!r.audits["script-treemap-data"].details)throw new Error("no script treemap data found");let t={lhr:{mainDocumentUrl:r.mainDocumentUrl,finalUrl:r.finalUrl,finalDisplayedUrl:r.finalDisplayedUrl,audits:{"script-treemap-data":r.audits["script-treemap-data"]},configSettings:{locale:r.configSettings.locale}}},n=pe()+"/treemap/",o="treemap-"+he(r);Me(t,n,o)}var ae=class{constructor(e){this._dom=e,this._toggleEl,this._menuEl,this.onDocumentKeyDown=this.onDocumentKeyDown.bind(this),this.onToggleClick=this.onToggleClick.bind(this),this.onToggleKeydown=this.onToggleKeydown.bind(this),this.onMenuFocusOut=this.onMenuFocusOut.bind(this),this.onMenuKeydown=this.onMenuKeydown.bind(this),this._getNextMenuItem=this._getNextMenuItem.bind(this),this._getNextSelectableNode=this._getNextSelectableNode.bind(this),this._getPreviousMenuItem=this._getPreviousMenuItem.bind(this)}setup(e){this._toggleEl=this._dom.find(".lh-topbar button.lh-tools__button",this._dom.rootEl),this._toggleEl.addEventListener("click",this.onToggleClick),this._toggleEl.addEventListener("keydown",this.onToggleKeydown),this._menuEl=this._dom.find(".lh-topbar div.lh-tools__dropdown",this._dom.rootEl),this._menuEl.addEventListener("keydown",this.onMenuKeydown),this._menuEl.addEventListener("click",e)}close(){this._toggleEl.classList.remove("lh-active"),this._toggleEl.setAttribute("aria-expanded","false"),this._menuEl.contains(this._dom.document().activeElement)&&this._toggleEl.focus(),this._menuEl.removeEventListener("focusout",this.onMenuFocusOut),this._dom.document().removeEventListener("keydown",this.onDocumentKeyDown)}open(e){this._toggleEl.classList.contains("lh-active")?e.focus():this._menuEl.addEventListener("transitionend",()=>{e.focus()},{once:!0}),this._toggleEl.classList.add("lh-active"),this._toggleEl.setAttribute("aria-expanded","true"),this._menuEl.addEventListener("focusout",this.onMenuFocusOut),this._dom.document().addEventListener("keydown",this.onDocumentKeyDown)}onToggleClick(e){e.preventDefault(),e.stopImmediatePropagation(),this._toggleEl.classList.contains("lh-active")?this.close():this.open(this._getNextMenuItem())}onToggleKeydown(e){switch(e.code){case"ArrowUp":e.preventDefault(),this.open(this._getPreviousMenuItem());break;case"ArrowDown":case"Enter":case" ":e.preventDefault(),this.open(this._getNextMenuItem());break;default:}}onMenuKeydown(e){let t=e.target;switch(e.code){case"ArrowUp":e.preventDefault(),this._getPreviousMenuItem(t).focus();break;case"ArrowDown":e.preventDefault(),this._getNextMenuItem(t).focus();break;case"Home":e.preventDefault(),this._getNextMenuItem().focus();break;case"End":e.preventDefault(),this._getPreviousMenuItem().focus();break;default:}}onDocumentKeyDown(e){e.keyCode===27&&this.close()}onMenuFocusOut(e){let t=e.relatedTarget;this._menuEl.contains(t)||this.close()}_getNextSelectableNode(e,t){let n=e.filter(i=>!(!(i instanceof HTMLElement)||i.hasAttribute("disabled")||window.getComputedStyle(i).display==="none")),o=t?n.indexOf(t)+1:0;return o>=n.length&&(o=0),n[o]}_getNextMenuItem(e){let t=Array.from(this._menuEl.childNodes);return this._getNextSelectableNode(t,e)}_getPreviousMenuItem(e){let t=Array.from(this._menuEl.childNodes).reverse();return this._getNextSelectableNode(t,e)}};var le=class{constructor(e,t){this.lhr,this._reportUIFeatures=e,this._dom=t,this._dropDownMenu=new ae(this._dom),this._copyAttempt=!1,this.topbarEl,this.categoriesEl,this.stickyHeaderEl,this.highlightEl,this.onDropDownMenuClick=this.onDropDownMenuClick.bind(this),this.onKeyUp=this.onKeyUp.bind(this),this.onCopy=this.onCopy.bind(this),this.collapseAllDetails=this.collapseAllDetails.bind(this)}enable(e){this.lhr=e,this._dom.rootEl.addEventListener("keyup",this.onKeyUp),this._dom.document().addEventListener("copy",this.onCopy),this._dropDownMenu.setup(this.onDropDownMenuClick),this._setUpCollapseDetailsAfterPrinting(),this._dom.find(".lh-topbar__logo",this._dom.rootEl).addEventListener("click",()=>K(this._dom)),this._setupStickyHeader()}onDropDownMenuClick(e){e.preventDefault();let t=e.target;if(!(!t||!t.hasAttribute("data-action"))){switch(t.getAttribute("data-action")){case"copy":this.onCopyButtonClick();break;case"print-summary":this.collapseAllDetails(),this._print();break;case"print-expanded":this.expandAllDetails(),this._print();break;case"save-json":{let n=JSON.stringify(this.lhr,null,2);this._reportUIFeatures._saveFile(new Blob([n],{type:"application/json"}));break}case"save-html":{let n=this._reportUIFeatures.getReportHtml();try{this._reportUIFeatures._saveFile(new Blob([n],{type:"text/html"}))}catch(o){this._dom.fireEventOn("lh-log",this._dom.document(),{cmd:"error",msg:"Could not export as HTML. "+o.message})}break}case"open-viewer":{this._dom.isDevTools()?Te(this.lhr):Fe(this.lhr);break}case"save-gist":{this._reportUIFeatures.saveAsGist();break}case"toggle-dark":{K(this._dom);break}case"view-unthrottled-trace":this._reportUIFeatures._opts.onViewTrace?.()}this._dropDownMenu.close()}}onCopy(e){this._copyAttempt&&e.clipboardData&&(e.preventDefault(),e.clipboardData.setData("text/plain",JSON.stringify(this.lhr,null,2)),this._dom.fireEventOn("lh-log",this._dom.document(),{cmd:"log",msg:"Report JSON copied to clipboard"})),this._copyAttempt=!1}onCopyButtonClick(){this._dom.fireEventOn("lh-analytics",this._dom.document(),{cmd:"send",fields:{hitType:"event",eventCategory:"report",eventAction:"copy"}});try{this._dom.document().queryCommandSupported("copy")&&(this._copyAttempt=!0,this._dom.document().execCommand("copy")||(this._copyAttempt=!1,this._dom.fireEventOn("lh-log",this._dom.document(),{cmd:"warn",msg:"Your browser does not support copy to clipboard."})))}catch(e){this._copyAttempt=!1,this._dom.fireEventOn("lh-log",this._dom.document(),{cmd:"log",msg:e.message})}}onKeyUp(e){(e.ctrlKey||e.metaKey)&&e.keyCode===80&&this._dropDownMenu.close()}expandAllDetails(){this._dom.findAll(".lh-categories details",this._dom.rootEl).map(t=>t.open=!0)}collapseAllDetails(){this._dom.findAll(".lh-categories details",this._dom.rootEl).map(t=>t.open=!1)}_print(){this._reportUIFeatures._opts.onPrintOverride?this._reportUIFeatures._opts.onPrintOverride(this._dom.rootEl):self.print()}resetUIState(){this._dropDownMenu.close()}_getScrollParent(e){let{overflowY:t}=window.getComputedStyle(e);return t!=="visible"&&t!=="hidden"?e:e.parentElement?this._getScrollParent(e.parentElement):document}_setUpCollapseDetailsAfterPrinting(){"onbeforeprint"in self?self.addEventListener("afterprint",this.collapseAllDetails):self.matchMedia("print").addListener(t=>{t.matches?this.expandAllDetails():this.collapseAllDetails()})}_setupStickyHeader(){this.topbarEl=this._dom.find("div.lh-topbar",this._dom.rootEl),this.categoriesEl=this._dom.find("div.lh-categories",this._dom.rootEl),window.requestAnimationFrame(()=>window.requestAnimationFrame(()=>{try{this.stickyHeaderEl=this._dom.find("div.lh-sticky-header",this._dom.rootEl)}catch{return}this.highlightEl=this._dom.createChildOf(this.stickyHeaderEl,"div","lh-highlighter");let e=this._getScrollParent(this._dom.find(".lh-container",this._dom.rootEl));e.addEventListener("scroll",()=>this._updateStickyHeader());let t=e instanceof window.Document?document.documentElement:e;new window.ResizeObserver(()=>this._updateStickyHeader()).observe(t)}))}_updateStickyHeader(){if(!this.stickyHeaderEl)return;let e=this.topbarEl.getBoundingClientRect().bottom,t=this.categoriesEl.getBoundingClientRect().top,n=e>=t,i=Array.from(this._dom.rootEl.querySelectorAll(".lh-category")).filter(p=>p.getBoundingClientRect().top-window.innerHeight/2<0),a=i.length>0?i.length-1:0,l=this.stickyHeaderEl.querySelectorAll(".lh-gauge__wrapper, .lh-fraction__wrapper"),s=l[a],c=l[0].getBoundingClientRect().left,d=s.getBoundingClientRect().left-c;this.highlightEl.style.transform=`translate(${d}px)`,this.stickyHeaderEl.classList.toggle("lh-sticky-header--visible",n)}};function St(r,e){let t=e?new Date(e):new Date,n=t.toLocaleTimeString("en-US",{hour12:!1}),o=t.toLocaleDateString("en-US",{year:"numeric",month:"2-digit",day:"2-digit"}).split("/");o.unshift(o.pop());let i=o.join("-");return`${r}_${i}_${n}`.replace(/[/?<>\\:*|"]/g,"-")}function De(r){let e=new URL(r.finalDisplayedUrl).hostname;return St(e,r.fetchTime)}function Ct(r){return Array.from(r.tBodies[0].rows)}var se=class{constructor(e,t={}){this.json,this._dom=e,this._opts=t,this._topbar=t.omitTopbar?null:new le(this,e),this.onMediaQueryChange=this.onMediaQueryChange.bind(this)}initFeatures(e){this.json=e,this._fullPageScreenshot=C.getFullPageScreenshot(e),this._topbar&&(this._topbar.enable(e),this._topbar.resetUIState()),this._setupMediaQueryListeners(),this._setupThirdPartyFilter(),this._setupElementScreenshotOverlay(this._dom.rootEl);let t=this._dom.isDevTools()||this._opts.disableDarkMode||this._opts.disableAutoDarkModeAndFireworks;!t&&window.matchMedia("(prefers-color-scheme: dark)").matches&&K(this._dom,!0);let o=["performance","accessibility","best-practices","seo"].every(s=>{let c=e.categories[s];return c&&c.score===1}),i=this._opts.disableFireworks||this._opts.disableAutoDarkModeAndFireworks;if(o&&!i&&(this._enableFireworks(),t||K(this._dom,!0)),e.categories.performance&&e.categories.performance.auditRefs.some(s=>!!(s.group==="metrics"&&e.audits[s.id].errorMessage))){let s=this._dom.find("input.lh-metrics-toggle__input",this._dom.rootEl);s.checked=!0}this.json.audits["script-treemap-data"]&&this.json.audits["script-treemap-data"].details&&this.addButton({text:u.strings.viewTreemapLabel,icon:"treemap",onClick:()=>Pe(this.json)}),this._opts.onViewTrace&&(e.configSettings.throttlingMethod==="simulate"?this._dom.find('a[data-action="view-unthrottled-trace"]',this._dom.rootEl).classList.remove("lh-hidden"):this.addButton({text:u.strings.viewTraceLabel,onClick:()=>this._opts.onViewTrace?.()})),this._opts.getStandaloneReportHTML&&this._dom.find('a[data-action="save-html"]',this._dom.rootEl).classList.remove("lh-hidden");for(let s of this._dom.findAll("[data-i18n]",this._dom.rootEl)){let d=s.getAttribute("data-i18n");s.textContent=u.strings[d]}}addButton(e){let t=this._dom.rootEl.querySelector(".lh-audit-group--metrics");if(!t)return;let n=t.querySelector(".lh-buttons");n||(n=this._dom.createChildOf(t,"div","lh-buttons"));let o=["lh-button"];e.icon&&(o.push("lh-report-icon"),o.push(`lh-report-icon--${e.icon}`));let i=this._dom.createChildOf(n,"button",o.join(" "));return i.textContent=e.text,i.addEventListener("click",e.onClick),i}resetUIState(){this._topbar&&this._topbar.resetUIState()}getReportHtml(){if(!this._opts.getStandaloneReportHTML)throw new Error("`getStandaloneReportHTML` is not set");return this.resetUIState(),this._opts.getStandaloneReportHTML()}saveAsGist(){throw new Error("Cannot save as gist from base report")}_enableFireworks(){this._dom.find(".lh-scores-container",this._dom.rootEl).classList.add("lh-score100")}_setupMediaQueryListeners(){let e=self.matchMedia("(max-width: 500px)");e.addListener(this.onMediaQueryChange),this.onMediaQueryChange(e)}_resetUIState(){this._topbar&&this._topbar.resetUIState()}onMediaQueryChange(e){this._dom.rootEl.classList.toggle("lh-narrow",e.matches)}_setupThirdPartyFilter(){let e=["uses-rel-preconnect","third-party-facades"],t=["legacy-javascript"];Array.from(this._dom.rootEl.querySelectorAll("table.lh-table")).filter(i=>i.querySelector("td.lh-table-column--url, td.lh-table-column--source-location")).filter(i=>{let a=i.closest(".lh-audit");if(!a)throw new Error(".lh-table not within audit");return!e.includes(a.id)}).forEach(i=>{let a=Ct(i),l=a.filter(m=>!m.classList.contains("lh-sub-item-row")),s=this._getThirdPartyRows(l,C.getFinalDisplayedUrl(this.json)),c=a.some(m=>m.classList.contains("lh-row--even")),d=this._dom.createComponent("3pFilter"),p=this._dom.find("input",d);p.addEventListener("change",m=>{let x=m.target instanceof HTMLInputElement&&!m.target.checked,F=!0,L=l[0];for(;L;){let S=x&&s.includes(L);do L.classList.toggle("lh-row--hidden",S),c&&(L.classList.toggle("lh-row--even",!S&&F),L.classList.toggle("lh-row--odd",!S&&!F)),L=L.nextElementSibling;while(L&&L.classList.contains("lh-sub-item-row"));S||(F=!F)}});let h=s.filter(m=>!m.classList.contains("lh-row--group")).length;this._dom.find(".lh-3p-filter-count",d).textContent=`${h}`,this._dom.find(".lh-3p-ui-string",d).textContent=u.strings.thirdPartyResourcesLabel;let g=s.length===l.length,v=!s.length;if((g||v)&&(this._dom.find("div.lh-3p-filter",d).hidden=!0),!i.parentNode)return;i.parentNode.insertBefore(d,i);let w=i.closest(".lh-audit");if(!w)throw new Error(".lh-table not within audit");t.includes(w.id)&&!g&&p.click()})}_setupElementScreenshotOverlay(e){this._fullPageScreenshot&&V.installOverlayFeature({dom:this._dom,rootEl:e,overlayContainerEl:e,fullPageScreenshot:this._fullPageScreenshot})}_getThirdPartyRows(e,t){let n=C.getEntityFromUrl(t,this.json.entities),o=this.json.entities?.find(a=>a.isFirstParty===!0)?.name,i=[];for(let a of e){if(o){if(!a.dataset.entity||a.dataset.entity===o)continue}else{let l=a.querySelector("div.lh-text__url");if(!l)continue;let s=l.dataset.url;if(!s||!(C.getEntityFromUrl(s,this.json.entities)!==n))continue}i.push(a)}return i}_saveFile(e){let t=e.type.match("json")?".json":".html",n=De({finalDisplayedUrl:C.getFinalDisplayedUrl(this.json),fetchTime:this.json.fetchTime})+t;this._opts.onSaveFileOverride?this._opts.onSaveFileOverride(e,n):this._dom.saveFile(e,n)}};function Ne(r,e={}){let t=document.createElement("article");t.classList.add("lh-root","lh-vars");let n=new te(t.ownerDocument,t);return new ie(n).renderReport(r,t,e),new se(n,e).initFeatures(r),t}var ce=class{constructor(e){this.el=e;let t=document.createElement("style");if(t.textContent=`
|
|
2638
2638
|
#lh-log {
|
|
2639
2639
|
position: fixed;
|
|
@@ -39,6 +39,13 @@ function getScoreToBeGained(audit: ScoredAuditRef): number {
|
|
|
39
39
|
return audit.weight * (1 - audit.result.score);
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
+
function getOverallSavings(audit: LH.ReportResult.AuditRef): number {
|
|
43
|
+
return (
|
|
44
|
+
audit.result.details &&
|
|
45
|
+
audit.result.details.overallSavingsMs
|
|
46
|
+
) || 0;
|
|
47
|
+
}
|
|
48
|
+
|
|
42
49
|
const SummaryTooltipAudit: FunctionComponent<{audit: LH.ReportResult.AuditRef}> = ({audit}) => {
|
|
43
50
|
const rating = ReportUtils.calculateRating(audit.result.score, audit.result.scoreDisplayMode);
|
|
44
51
|
return (
|
|
@@ -56,10 +63,10 @@ const SummaryTooltipAudits: FunctionComponent<{category: LH.ReportResult.Categor
|
|
|
56
63
|
return audit.result.score !== null &&
|
|
57
64
|
// Metrics should not be displayed in this group.
|
|
58
65
|
audit.group !== 'metrics' &&
|
|
59
|
-
// Audits in group "hidden" should not be counted.
|
|
60
|
-
audit.group !== 'hidden' &&
|
|
61
|
-
// We don't want unweighted audits except for
|
|
62
|
-
(audit.weight > 0 || audit
|
|
66
|
+
// Audits in performance group "hidden" should not be counted.
|
|
67
|
+
(audit.group !== 'hidden' || category.id !== 'performance') &&
|
|
68
|
+
// We don't want unweighted audits except for opportunities with potential savings.
|
|
69
|
+
(audit.weight > 0 || getOverallSavings(audit) > 0) &&
|
|
63
70
|
// Passing audits should never be high impact.
|
|
64
71
|
!ReportUtils.showAsPassed(audit.result);
|
|
65
72
|
}
|
|
@@ -72,12 +79,7 @@ const SummaryTooltipAudits: FunctionComponent<{category: LH.ReportResult.Categor
|
|
|
72
79
|
const remainingScoreA = getScoreToBeGained(a);
|
|
73
80
|
const remainingScoreB = getScoreToBeGained(b);
|
|
74
81
|
if (remainingScoreA !== remainingScoreB) return remainingScoreB - remainingScoreA;
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
// TODO: Sort using overall impact from metric savings, not just LCP
|
|
78
|
-
const aLcpSavings = a.result.metricSavings?.LCP || 0;
|
|
79
|
-
const bLcpSavings = b.result.metricSavings?.LCP || 0;
|
|
80
|
-
return bLcpSavings - aLcpSavings;
|
|
82
|
+
return getOverallSavings(b) - getOverallSavings(a);
|
|
81
83
|
})
|
|
82
84
|
.splice(0, MAX_TOOLTIP_AUDITS);
|
|
83
85
|
if (!audits.length) return null;
|
package/package.json
CHANGED
|
@@ -10,6 +10,13 @@ export class PerformanceCategoryRenderer extends CategoryRenderer {
|
|
|
10
10
|
* @return {string}
|
|
11
11
|
*/
|
|
12
12
|
_getScoringCalculatorHref(auditRefs: LH.ReportResult.AuditRef[]): string;
|
|
13
|
+
/**
|
|
14
|
+
* Returns true if the audit is a general performance insight (i.e. not a metric or hidden audit).
|
|
15
|
+
*
|
|
16
|
+
* @param {LH.ReportResult.AuditRef} audit
|
|
17
|
+
* @return {boolean}
|
|
18
|
+
*/
|
|
19
|
+
_isPerformanceInsight(audit: LH.ReportResult.AuditRef): boolean;
|
|
13
20
|
/**
|
|
14
21
|
* Returns overallImpact and linearImpact for an audit.
|
|
15
22
|
* The overallImpact is determined by the audit saving's effect on the overall performance score.
|
|
@@ -92,6 +92,16 @@ export class PerformanceCategoryRenderer extends CategoryRenderer {
|
|
|
92
92
|
return url.href;
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
+
/**
|
|
96
|
+
* Returns true if the audit is a general performance insight (i.e. not a metric or hidden audit).
|
|
97
|
+
*
|
|
98
|
+
* @param {LH.ReportResult.AuditRef} audit
|
|
99
|
+
* @return {boolean}
|
|
100
|
+
*/
|
|
101
|
+
_isPerformanceInsight(audit) {
|
|
102
|
+
return !audit.group;
|
|
103
|
+
}
|
|
104
|
+
|
|
95
105
|
/**
|
|
96
106
|
* Returns overallImpact and linearImpact for an audit.
|
|
97
107
|
* The overallImpact is determined by the audit saving's effect on the overall performance score.
|
|
@@ -202,7 +212,7 @@ export class PerformanceCategoryRenderer extends CategoryRenderer {
|
|
|
202
212
|
}
|
|
203
213
|
|
|
204
214
|
const allInsights = category.auditRefs
|
|
205
|
-
.filter(audit => audit
|
|
215
|
+
.filter(audit => this._isPerformanceInsight(audit))
|
|
206
216
|
.map(auditRef => {
|
|
207
217
|
const {overallImpact, overallLinearImpact} = this.overallImpact(auditRef, metricAudits);
|
|
208
218
|
const guidanceLevel = auditRef.result.guidanceLevel || 1;
|
|
@@ -39,14 +39,18 @@ class ReportUtils {
|
|
|
39
39
|
// For convenience, smoosh all AuditResults into their auditRef (which has just weight & group)
|
|
40
40
|
if (typeof clone.categories !== 'object') throw new Error('No categories provided.');
|
|
41
41
|
|
|
42
|
-
/** @type {Map<string, LH.ReportResult.AuditRef
|
|
43
|
-
const
|
|
42
|
+
/** @type {Map<string, Array<LH.ReportResult.AuditRef>>} */
|
|
43
|
+
const relevantAuditToMetricsMap = new Map();
|
|
44
44
|
|
|
45
45
|
for (const category of Object.values(clone.categories)) {
|
|
46
46
|
// Make basic lookup table for relevantAudits
|
|
47
47
|
category.auditRefs.forEach(metricRef => {
|
|
48
|
-
if (!metricRef.
|
|
49
|
-
|
|
48
|
+
if (!metricRef.relevantAudits) return;
|
|
49
|
+
metricRef.relevantAudits.forEach(auditId => {
|
|
50
|
+
const arr = relevantAuditToMetricsMap.get(auditId) || [];
|
|
51
|
+
arr.push(metricRef);
|
|
52
|
+
relevantAuditToMetricsMap.set(auditId, arr);
|
|
53
|
+
});
|
|
50
54
|
});
|
|
51
55
|
|
|
52
56
|
category.auditRefs.forEach(auditRef => {
|
|
@@ -54,15 +58,8 @@ class ReportUtils {
|
|
|
54
58
|
auditRef.result = result;
|
|
55
59
|
|
|
56
60
|
// Attach any relevantMetric auditRefs
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
auditRef.relevantMetrics = [];
|
|
60
|
-
for (const acronym of relevantAcronyms) {
|
|
61
|
-
const metric = acronymToMetricMap.get(acronym);
|
|
62
|
-
if (!metric) continue;
|
|
63
|
-
|
|
64
|
-
auditRef.relevantMetrics.push(metric);
|
|
65
|
-
}
|
|
61
|
+
if (relevantAuditToMetricsMap.has(auditRef.id)) {
|
|
62
|
+
auditRef.relevantMetrics = relevantAuditToMetricsMap.get(auditRef.id);
|
|
66
63
|
}
|
|
67
64
|
|
|
68
65
|
// attach the stackpacks to the auditRef object
|