root@DESKTOP-2S5FLVQ ~/w/w/t/web-next (master) [127]# curl -sS http://localhost:3000/blogs/best-gaming-laptops \
| tr '>' '>\n' \
| grep -E '我在家你呢|canonical|description'
at app_render_App (/root/work/web-next-an/target/web-next/node_modules/.pnpm/next@15.5.7_@playwright+test@1.59.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/compiled/next-server/app-page.runtime.dev.js:38:26223)"></template><!--/$--><script>requestAnimationFrame(function(){$RT=performance.now()});</script><script src="/_next/static/chunks/webpack.js?v=1780025951851" id="_R_" async=""></script><div hidden id="S:1"><template id="P:2"></template><!--$?--><template id="B:3"></template><!--/$--></div><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"5:I[\"(app-pages-browser)/./node_modules/.pnpm/next@15.5.7_@playwright+test@1.59.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/next-devtools/userspace/app/segment-explorer-node.js\",[\"app-pages-internals\",\"static/chunks/app-pages-internals.js\"],\"SegmentViewNode\"]\n7:\"$Sreact.fragment\"\n1b:I[\"(app-pages-browser)/./node_modules/.pnpm/next@15.5.7_@playwright+test@1.59.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/script.js\",[\"app/layout\",\"static/chunks/app/layout.js\"],\"\"]\n22:I[\"(app-pages-browser)/./components/providers.jsx\",[\"app/layout\",\"static/chunks/app/layout.js\"],\"default\"]\n25:I[\"(app-pages-browser)/./components/vconsole-init.jsx\",[\"app/layout\",\"static/chunks/app/layout.js\"],\"default\"]\n27:I[\"(app-pages-browser)/./components/extension-sync-provider.jsx\",[\"app/layout\",\"static/chunks/app/layout.js\"],\"default\"]\n29:I[\"(app-pages-browser)/./components/chunk-reload-provider.jsx\",[\"app/layout\",\"static/chunks/app/layout.js\"],\"default\"]\n2b:\"$Sreact.suspense\"\n2d:I[\"(app-pages-browser)/./components/navigation-history-tracker.tsx\",[\"app/layout\",\"static/chunks/app/layout.js\"],\"default\"]\n2f:I[\"(app-pages-browser)/./components/scroll-restoration.jsx\",[\"app/layout\",\"static/chunks/app/layout.js\"],\"default\"]\n31:I[\"(app-pages-browser)/./components/invite/inviter-capture.jsx\",[\"app/layout\",\"static/chunks/app/layout.js\"],\"default\"]\n33:I[\"(app-pages-browser)/./components/share/share-source-capture.jsx\",[\"app/layout\",\"static/chunks/app/layout.js\"],\"default\"]\n36:I[\"(app-pages-browser)/./components/extension-login-prompt-provider.jsx\",[\"app/layout\",\"static/chunks/app/layout.js\"],\"default\"]\n38:I[\"(app-pages-browser)/./components/layout/app-shell.tsx\",[\"app/layout\",\"static/chunks/app/layout.js\"],\"default\"]\n3a:I[\"(app-pages-browser)/./node_modules/.pnpm/next@15.5.7_@playwright+test@1.59.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/layout-router.js\",[\"app-pages-internals\",\"static/chunks/app-pages-internals.js\"],\"\"]\n3b:I[\"(app-pages-browser)/./app/err"])</script><script>self.__next_f.push([1,"or.jsx\",[\"app/error\",\"static/chunks/app/error.js\"],\"default\"]\n3e:I[\"(app-pages-browser)/./node_modules/.pnpm/next@15.5.7_@playwright+test@1.59.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/render-from-template-context.js\",[\"app-pages-internals\",\"static/chunks/app-pages-internals.js\"],\"\"]\n4d:I[\"(app-pages-browser)/./components/lazy-providers.jsx\",[\"app/layout\",\"static/chunks/app/layout.js\"],\"default\"]\n4f:I[\"(app-pages-browser)/./components/layout/global-sidebar-drawer.tsx\",[\"app/layout\",\"static/chunks/app/layout.js\"],\"default\"]\n5e:I[\"(app-pages-browser)/./node_modules/.pnpm/next@15.5.7_@playwright+test@1.59.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/lib/framework/boundary-components.js\",[\"app-pages-internals\",\"static/chunks/app-pages-internals.js\"],\"OutletBoundary\"]\n65:I[\"(app-pages-browser)/./node_modules/.pnpm/next@15.5.7_@playwright+test@1.59.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/metadata/async-metadata.js\",[\"app-pages-internals\",\"static/chunks/app-pages-internals.js\"],\"AsyncMetadataOutlet\"]\n69:I[\"(app-pages-browser)/./app/loading.jsx\",[\"app/loading\",\"static/chunks/app/loading.js\"],\"default\"]\n70:I[\"(app-pages-browser)/./node_modules/.pnpm/next@15.5.7_@playwright+test@1.59.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/lib/framework/boundary-components.js\",[\"app-pages-internals\",\"static/chunks/app-pages-internals.js\"],\"ViewportBoundary\"]\n76:I[\"(app-pages-browser)/./node_modules/.pnpm/next@15.5.7_@playwright+test@1.59.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/lib/framework/boundary-components.js\",[\"app-pages-internals\",\"static/chunks/app-pages-internals.js\"],\"MetadataBoundary\"]\n7e:I[\"(app-pages-browser)/./node_modules/.pnpm/next@15.5.7_@playwright+test@1.59.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/builtin/global-error.js\",[\"app-pages-internals\",\"static/chunks/app-pages-internals.js\"],\"\"]\n:HL[\"/_next/static"])</script><script>self.__next_f.push([1,"/css/app/layout.css?v=1780025951851\",\"style\"]\n:N1780025951854.816\n3:\"$EObject.defineProperty(()=\u003e{ctx.componentMod.preloadStyle(fullHref,ctx.renderOpts.crossOrigin,ctx.nonce)},\\\"name\\\",{value:\\\"\\\"})\"\n2:{\"name\":\"Preloads\",\"key\":null,\"env\":\"Server\",\"stack\":[],\"props\":{\"preloadCallbacks\":[\"$3\"]}}\n4:[]\n6:[]\n8:[[\"Array.map\",\"\",0,0,0,0,false]]\nb:I[\"(app-pages-browser)/./node_modules/.pnpm/next@15.5.7_@playwright+test@1.59.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/components/layout-router.js\",[\"app-pages-internals\",\"static/chunks/app-pages-internals.js\"],\"\"]\nd:I[\"(app-pages-browser)/./app/error.jsx\",[\"app/error\",\"static/chunks/app/error.js\"],\"default\"]\ne:{\"type\":\"error\",\"pagePath\":\"error.jsx\",\"children\":[]}\nf:[[\"Promise.all\",\"\",0,0,0,0,true]]\nc:{\"parallelRouterKey\":\"children\",\"error\":\"$d\",\"errorStyles\":[\"$\",\"$L5\",null,\"$e\",null,\"$f\",0],\"errorScripts\":\"$Y\",\"template\":\"$Y\",\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$Y\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\",\"segmentViewBoundaries\":\"$Y\"}\n10:[[\"Promise.all\",\"\",0,0,0,0,true]]\na:{\"name\":\"RootLayout\",\"key\":null,\"env\":\"Server\",\"stack\":[],\"props\":{\"children\":[\"$\",\"$Lb\",null,\"$c\",null,\"$10\",1],\"params\":\"$Y\"}}\n11:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",53,87,52,1,false]]\n12:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",56,88,52,1,false]]\n13:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",58,96,52,1,false]]\n14:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",66,96,52,1,false]]\n15:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",74,96,52,1,false]]\n16:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",83,96,52,1,false]]\n17:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",92,96,52,1,false]]\n18:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",101,96,52,1,false]]\n19:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",110,96,52,1,false]]\n1a:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",122,96"])</script><script>self.__next_f.push([1,",52,1,false]]\n1c:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",133,154,52,1,false]]\n1d:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",150,96,52,1,false]]\n1e:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",172,88,52,1,false]]\n1f:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",175,154,52,1,false]]\n20:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",176,110,52,1,false]]\n21:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",194,96,52,1,false]]\n23:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",196,104,52,1,false]]\n24:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",200,112,52,1,false]]\n26:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",205,112,52,1,false]]\n28:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",211,112,52,1,false]]\n2a:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",216,112,52,1,false]]\n2c:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",218,126,52,1,false]]\n2e:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",228,112,52,1,false]]\n30:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",233,112,52,1,false]]\n32:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",239,112,52,1,false]]\n34:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",245,112,52,1,false]]\n35:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",248,120,52,1,false]]\n37:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",260,112,52,1,false]]\n39:[[\"Promise.all\",\"\",0,0,0,0,true]]\n3c:[[\"Promise.all\",\"\",0,0,0,0,true]]\n3d:[[\"Promise.all\",\"\",0,0,0,0,true]]\n3f:[]\n41:{\"name\":\"NotFound\",\"key\":null,\"env\":\"Server\",\"stack\":[],\"props\":{}}\n42:[[\"NotFound\",\"webpack-internal:///(rsc)/./app/not-found.jsx\",9,87,8,1,false]]\n43:[[\"NotFound\",\"webpack-internal:///(rsc)/./app/not-found.jsx\",20,88,8,1,false]]\n44:[[\"NotFound\",\"webpack-internal:///(rsc)/./app/not-found.jsx\",33,88,8,1,false]]\n45:[[\"NotFound\",\"webpack-internal:///(rsc)/./app/not-found.jsx\",46,88,8,1,false]]\n47:[[\"Prom"])</script><script>self.__next_f.push([1,"ise.all\",\"\",0,0,0,0,true]]\n48:[[\"Promise.all\",\"\",0,0,0,0,true]]\n49:[[\"Promise.all\",\"\",0,0,0,0,true]]\n4a:[[\"Promise.all\",\"\",0,0,0,0,true]]\n4b:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",267,112,52,1,false]]\n4c:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",269,126,52,1,false]]\n4e:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",285,104,52,1,false]]\n50:[[\"RootLayout\",\"webpack-internal:///(rsc)/./app/layout.jsx\",296,96,52,1,false]]\n51:[[\"Promise.all\",\"\",0,0,0,0,true]]\n52:[[\"Promise.all\",\"\",0,0,0,0,true],[\"Promise.all\",\"\",0,0,0,0,true]]\n53:[[\"Promise.all\",\"\",0,0,0,0,true],[\"Promise.all\",\"\",0,0,0,0,true]]\n54:[[\"Promise.all\",\"\",0,0,0,0,true],[\"Promise.all\",\"\",0,0,0,0,true]]\n55:[[\"Promise.all\",\"\",0,0,0,0,true],[\"Promise.all\",\"\",0,0,0,0,true],[\"Promise.all\",\"\",0,0,0,0,true]]\n56:[[\"Promise.all\",\"\",0,0,0,0,true],[\"Promise.all\",\"\",0,0,0,0,true],[\"Promise.all\",\"\",0,0,0,0,true]]\n57:[[\"Promise.all\",\"\",0,0,0,0,true],[\"Promise.all\",\"\",0,0,0,0,true],[\"Promise.all\",\"\",0,0,0,0,true]]\n58:[[\"Promise.all\",\"\",0,0,0,0,true],[\"Promise.all\",\"\",0,0,0,0,true],[\"Promise.all\",\"\",0,0,0,0,true]]\n5a:{\"name\":\"BlogDetailPage\",\"key\":null,\"env\":\"Server\",\"stack\":[[\"Promise.all\",\"\",0,0,0,0,true],[\"Promise.all\",\"\",0,0,0,0,true],[\"Promise.all\",\"\",0,0,0,0,true]],\"props\":{\"params\":\"$@5b\",\"searchParams\":\"$@5c\"}}\n5d:[[\"Promise.all\",\"\",0,0,0,0,true],[\"Promise.all\",\"\",0,0,0,0,true],[\"Promise.all\",\"\",0,0,0,0,true]]\n61:\"$EObject.defineProperty(async function getViewportReady() {\\n await viewport();\\n return undefined;\\n },\\\"name\\\",{value:\\\"getViewportReady\\\"})\"\n60:{\"name\":\"__next_outlet_boundary__\",\"key\":null,\"env\":\"Server\",\"stack\":[[\"Promise.all\",\"\",0,0,0,0,true],[\"Promise.all\",\"\",0,0,0,0,true],[\"Promise.all\",\"\",0,0,0,0,true]],\"props\":{\"ready\":\"$61\"}}\n63:{\"name\":\"StreamingMetadataOutletImpl\",\"key\":null,\"env\":\"Server\",\"stack\":[[\"Promise.all\",\"\",0,0,0,0,true],[\"Promise.all\",\"\",0,0,0,0,true],[\"Promise.all\",\"\",0,0,0,0,true]],\"props\":{}}\n64:[]\n67:[]\n68:[]\n6a:[]\n6c:{\"name\":\"NonIndex\",\"key\":null,\"env\":\"Server\","])</script><script>self.__next_f.push([1,"\"stack\":[],\"props\":{\"pagePath\":\"/blogs/[id]\",\"statusCode\":200,\"isPossibleServerAction\":false}}\n6e:{\"name\":\"ViewportTree\",\"key\":null,\"env\":\"Server\",\"stack\":[],\"props\":{}}\n6f:[]\n72:{\"name\":\"__next_viewport_boundary__\",\"key\":null,\"env\":\"Server\",\"owner\":\"$6e\",\"stack\":[],\"props\":{}}\n74:{\"name\":\"MetadataTree\",\"key\":null,\"env\":\"Server\",\"stack\":[],\"props\":{}}\n75:[]\n78:{\"name\":\"__next_metadata_boundary__\",\"key\":null,\"env\":\"Server\",\"owner\":\"$74\",\"stack\":[],\"props\":{}}\n79:[]\n7a:[]\n7c:{\"name\":\"MetadataResolver\",\"key\":null,\"env\":\"Server\",\"owner\":\"$78\",\"stack\":[],\"props\":{}}\n7f:[]\n80:[[\"NotFound\",\"webpack-internal:///(rsc)/./app/not-found.jsx\",59,88,8,1,false]]\n5b:{\"id\":\"best-gaming-laptops\"}\n5c:\n81:[]\n82:[]\n1:D\"$2\"\n1:null\n9:D\"$a\"\n40:D\"$41\"\n"])</script><script>self.__next_f.push([1,"40:[\"$\",\"div\",null,{\"style\":{\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"minHeight\":\"100vh\",\"backgroundColor\":\"#fff\",\"fontFamily\":\"system-ui, -apple-system, sans-serif\"},\"children\":[[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"3.5rem\",\"fontWeight\":\"bold\",\"color\":\"#111\",\"marginBottom\":\"1rem\"},\"children\":\"404\"},\"$41\",\"$43\",1],[\"$\",\"h2\",null,{\"style\":{\"fontSize\":\"1.5rem\",\"fontWeight\":\"600\",\"color\":\"#666\",\"marginBottom\":\"1rem\"},\"children\":\"Page Not Found\"},\"$41\",\"$44\",1],[\"$\",\"p\",null,{\"style\":{\"color\":\"#666\",\"marginBottom\":\"2rem\",\"textAlign\":\"center\",\"maxWidth\":\"28rem\"},\"children\":\"Sorry, the page you are looking for does not exist. It might have been moved or deleted.\"},\"$41\",\"$45\",1],\"$L46\"]},\"$41\",\"$42\",1]\n"])</script><script>self.__next_f.push([1,"9:[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"meta\",null,{\"name\":\"fo-verify\",\"content\":\"8f7b9c54-878d-45c0-a050-33398e7c3a81\"},\"$a\",\"$13\",1],[\"$\",\"meta\",null,{\"name\":\"partnerboostverifycode\",\"content\":\"32dc01246faccb7f5b3cad5016dd5033\"},\"$a\",\"$14\",1],[\"$\",\"link\",null,{\"rel\":\"preconnect\",\"href\":\"https://www.googletagmanager.com\",\"crossOrigin\":\"anonymous\"},\"$a\",\"$15\",1],[\"$\",\"link\",null,{\"rel\":\"preconnect\",\"href\":\"https://accounts.google.com\",\"crossOrigin\":\"anonymous\"},\"$a\",\"$16\",1],[\"$\",\"link\",null,{\"rel\":\"preconnect\",\"href\":\"https://utt.impactcdn.com\",\"crossOrigin\":\"anonymous\"},\"$a\",\"$17\",1],[\"$\",\"link\",null,{\"rel\":\"preconnect\",\"href\":\"https://s.skimresources.com\",\"crossOrigin\":\"anonymous\"},\"$a\",\"$18\",1],[\"$\",\"link\",null,{\"rel\":\"preload\",\"as\":\"image\",\"href\":\"/images/bg-head.webp\",\"type\":\"image/webp\",\"fetchPriority\":\"high\",\"media\":\"(min-width: 640px)\"},\"$a\",\"$19\",1],[\"$\",\"$L1b\",null,{\"id\":\"impact-script\",\"strategy\":\"lazyOnload\",\"dangerouslySetInnerHTML\":{\"__html\":\"(function(i,m,p,a,c,t){c.ire_o=p;c[p]=c[p]||function(){(c[p].a=c[p].a||[]).push(arguments)};t=a.createElement(m);var z=a.getElementsByTagName(m)[0];t.async=1;t.src=i;z.parentNode.insertBefore(t,z)})('https://utt.impactcdn.com/P-A5198100-1e6d-4d5b-b172-e5289d8eb7e81.js','script','impactStat',document,window);impactStat('transformLinks');impactStat('trackImpression');\"}},\"$a\",\"$1a\",1],[\"$\",\"$L1b\",null,{\"id\":\"gtm-script\",\"strategy\":\"afterInteractive\",\"dangerouslySetInnerHTML\":{\"__html\":\"\\n (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\\n new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\\n j=d.createElement(s),dl=l!='dataLayer'?'\u0026l='+l:'';j.async=true;j.src=\\n 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);\\n })(window,document,'script','dataLayer','GTM-P2CM5QJH');\\n \"}},\"$a\",\"$1c\",1],[\"$\",\"$L1b\",null,{\"id\":\"pricefox-app-runtime\",\"strategy\":\"afterInteractive\",\"dangerouslySetInnerHTML\":{\"__html\":\"\\n console.log('PRICEFOX_APP', window.__PRICEFOX_APP__);\\n window.addEventListener('PricefoxAppRuntime', function(e) {\\n console.log('PricefoxAppRuntime event', e.detail);\\n });\\n \"}},\"$a\",\"$1d\",1]]},\"$a\",\"$12\",1],[\"$\",\"body\",null,{\"className\":\"antialiased\",\"children\":[[\"$\",\"noscript\",null,{\"children\":[\"$\",\"iframe\",null,{\"src\":\"https://www.googletagmanager.com/ns.html?id=GTM-P2CM5QJH\",\"height\":\"0\",\"width\":\"0\",\"style\":{\"display\":\"none\",\"visibility\":\"hidden\"}},\"$a\",\"$20\",1]},\"$a\",\"$1f\",1],[\"$\",\"$L22\",null,{\"children\":[[\"$\",\"div\",null,{\"id\":\"shopfox-app\",\"className\":\"w-full mx-auto px-0 font-sans\",\"children\":[[\"$\",\"$L25\",null,{},\"$a\",\"$24\",1],[\"$\",\"$L27\",null,{},\"$a\",\"$26\",1],\" \",[\"$\",\"$L29\",null,{},\"$a\",\"$28\",1],[\"$\",\"$2b\",null,{\"fallback\":null,\"children\":[\"$\",\"$L2d\",null,{},\"$a\",\"$2c\",1]},\"$a\",\"$2a\",1],[\"$\",\"$L2f\",null,{},\"$a\",\"$2e\",1],[\"$\",\"$L31\",null,{},\"$a\",\"$30\",1],\" \",[\"$\",\"$L33\",null,{},\"$a\",\"$32\",1],\" \",[\"$\",\"$2b\",null,{\"fallback\":null,\"children\":[[\"$\",\"$L36\",null,{},\"$a\",\"$35\",1],\" \"]},\"$a\",\"$34\",1],[\"$\",\"$L38\",null,{\"children\":[\"$\",\"$L3a\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$3b\",\"errorStyles\":[\"$\",\"$L5\",null,{\"type\":\"error\",\"pagePath\":\"error.jsx\",\"children\":[]},null,\"$3c\",0],\"errorScripts\":[],\"template\":[\"$\",\"$L3e\",null,{},null,\"$3d\",1],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[\"$\",\"$L5\",\"c-not-found\",{\"type\":\"not-found\",\"pagePath\":\"not-found.jsx\",\"children\":[\"$40\",[]]},null,\"$3f\",0],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\",\"segmentViewBoundaries\":[[\"$\",\"$L5\",null,{\"type\":\"boundary:not-found\",\"pagePath\":\"not-found.jsx@boundary\"},null,\"$47\",1],[\"$\",\"$L5\",null,{\"type\":\"boundary:loading\",\"pagePath\":\"loading.jsx@boundary\"},null,\"$48\",1],[\"$\",\"$L5\",null,{\"type\":\"boundary:error\",\"pagePath\":\"error.jsx@boundary\"},null,\"$49\",1],[\"$\",\"$L5\",null,{\"type\":\"boundary:global-error\",\"pagePath\":\"__next_builtin__global-error.js\"},null,\"$4a\",1]]},null,\"$39\",1]},\"$a\",\"$37\",1],[\"$\",\"$2b\",null,{\"fallback\":null,\"children\":[\"$\",\"$L4d\",null,{},\"$a\",\"$4c\",1]},\"$a\",\"$4b\",1]]},\"$a\",\"$23\",1],[\"$\",\"$L4f\",null,{},\"$a\",\"$4e\",1]]},\"$a\",\"$21\",1],[\"$\",\"$L1b\",null,{\"src\":\"https://s.skimresources.com/js/294867X1782173.skimlinks.js\",\"strategy\":\"lazyOnload\"},\"$a\",\"$50\",1]]},\"$a\",\"$1e\",1]]},\"$a\",\"$11\",1]\n"])</script><script>self.__next_f.push([1,"59:D\"$5a\"\n5f:D\"$60\"\n62:D\"$63\"\n62:[\"$\",\"$L65\",null,{\"promise\":\"$@66\"},\"$63\",\"$64\",1]\n6b:D\"$6c\"\n6b:null\n6d:D\"$6e\"\n71:D\"$72\"\n6d:[[\"$\",\"$L70\",null,{\"children\":\"$L71\"},\"$6e\",\"$6f\",1],null]\n73:D\"$74\"\n77:D\"$78\"\n7b:D\"$7c\"\n77:[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$2b\",null,{\"fallback\":null,\"children\":\"$L7b\"},\"$78\",\"$7a\",1]},\"$78\",\"$79\",1]\n73:[\"$\",\"$L76\",null,{\"children\":\"$77\"},\"$74\",\"$75\",1]\n7d:[]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":\"$1\",\"b\":\"development\",\"p\":\"\",\"c\":[\"\",\"blogs\",\"best-gaming-laptops\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"blogs\",{\"children\":[[\"id\",\"best-gaming-laptops\",\"d\"],{\"children\":[\"__PAGE__\",{}]}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$L5\",\"layout\",{\"type\":\"layout\",\"pagePath\":\"layout.jsx\",\"children\":[\"$\",\"$7\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/app/layout.css?v=1780025951851\",\"precedence\":\"next_static/css/app/layout.css\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"},null,\"$8\",0]],\"$9\"]},null,\"$6\",1]},null,\"$4\",0],{\"children\":[\"blogs\",[\"$\",\"$7\",\"c\",{\"children\":[null,[\"$\",\"$L3a\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3e\",null,{},null,\"$53\",1],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\",\"segmentViewBoundaries\":[\"$undefined\",\"$undefined\",\"$undefined\",\"$undefined\"]},null,\"$52\",1]]},null,\"$51\",0],{\"children\":[[\"id\",\"best-gaming-laptops\",\"d\"],[\"$\",\"$7\",\"c\",{\"children\":[null,[\"$\",\"$L3a\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3e\",null,{},null,\"$56\",1],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\",\"segmentViewBoundaries\":[\"$undefined\",\"$undefined\",\"$undefined\",\"$undefined\"]},null,\"$55\",1]]},null,\"$54\",0],{\"children\":[\"__PAGE__\",[\"$\",\"$7\",\"c\",{\"children\":[[\"$\",\"$L5\",\"c-page\",{\"type\":\"page\",\"pagePath\":\"blogs/[id]/page.tsx\",\"children\":\"$L59\"},null,\"$58\",1],null,[\"$\",\"$L5e\",null,{\"children\":[\"$L5f\",\"$62\"]},null,\"$5d\",1]]},null,\"$57\",0],{},null,false]},null,false]},null,false]},[[\"$\",\"$L5\",\"c-loading\",{\"type\":\"loading\",\"pagePath\":\"loading.jsx\",\"children\":[\"$\",\"$L69\",\"l\",{},null,\"$68\",1]},null,\"$67\",0],[],[]],false],[\"$\",\"$7\",\"h\",{\"children\":[\"$6b\",\"$6d\",\"$73\"]},null,\"$6a\",0],false]],\"m\":\"$W7d\",\"G\":[\"$7e\",[\"$\",\"$L5\",\"ge-svn\",{\"type\":\"global-error\",\"pagePath\":\"__next_builtin__global-error.js\",\"children\":[]},null,\"$7f\",0]],\"s\":false,\"S\":false}\n"])</script><script>self.__next_f.push([1,"46:[\"$\",\"a\",null,{\"href\":\"/\",\"style\":{\"padding\":\"0.75rem 1.5rem\",\"backgroundColor\":\"#2669FE\",\"color\":\"#fff\",\"fontWeight\":\"600\",\"borderRadius\":\"0.5rem\",\"textDecoration\":\"none\",\"cursor\":\"pointer\"},\"children\":\"Go Home\"},\"$41\",\"$80\",1]\n71:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"},\"$60\",\"$81\",0],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"},\"$60\",\"$82\",0]]\n5f:null\n"])</script><script>self.__next_f.push([1,"a7:I[\"(app-pages-browser)/./components/layout/client-layout.jsx\",[\"app/blogs/[id]/page\",\"static/chunks/app/blogs/%5Bid%5D/page.js\"],\"default\"]\ndc:I[\"(app-pages-browser)/./node_modules/.pnpm/next@15.5.7_@playwright+test@1.59.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/client/app-dir/link.js\",[\"app/blogs/[id]/page\",\"static/chunks/app/blogs/%5Bid%5D/page.js\"],\"\"]\n114:I[\"(app-pages-browser)/./node_modules/.pnpm/next@15.5.7_@playwright+test@1.59.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/next/dist/lib/metadata/generate/icon-mark.js\",[\"app-pages-internals\",\"static/chunks/app-pages-internals.js\"],\"IconMark\"]\n84:[[\"fetchDirectusWithAuth\",\"webpack-internal:///(rsc)/./lib/directus-server.ts\",56,12,52,1,false],[\"directusRequest\",\"webpack-internal:///(rsc)/./lib/directus-blog.ts\",106,103,105,1,false],[\"getBlogDetailByUrlPath\",\"webpack-internal:///(rsc)/./lib/directus-blog.ts\",206,24,203,1,false],[\"eval\",\"webpack-internal:///(rsc)/./lib/directus-blog.ts\",211,37,209,68,false],[\"BlogDetailPage\",\"webpack-internal:///(rsc)/./app/blogs/[id]/page.tsx\",75,89,73,1,false]]\n83:J{\"name\":\"fetch\",\"start\":7.99073099999805,\"end\":11.325281999976141,\"env\":\"Server\",\"stack\":\"$84\",\"owner\":\"$5a\",\"value\":\"$@85\"}\n86:[[\"directusRequest\",\"webpack-internal:///(rsc)/./lib/directus-blog.ts\",106,103,105,1,false],[\"getBlogDetailByUrlPath\",\"webpack-internal:///(rsc)/./lib/directus-blog.ts\",206,24,203,1,false],[\"eval\",\"webpack-internal:///(rsc)/./lib/directus-blog.ts\",211,37,209,68,false],[\"BlogDetailPage\",\"webpack-internal:///(rsc)/./app/blogs/[id]/page.tsx\",75,89,73,1,false]]\n88:[[\"createAsyncIterator.next\",\"\",0,0,0,0,false]]\n87:J{\"name\":\"createAsyncIterator\",\"start\":361.7329819999868,\"end\":361.9492800000007,\"env\":\"Server\",\"stack\":\"$88\",\"owner\":\"$5a\",\"value\":\"$@89\"}\n8a:[[\"directusRequest\",\"webpack-internal:///(rsc)/./lib/directus-blog.ts\",114,36,105,1,false],[\"getBlogDetailByUrlPath\",\"webpack-internal:///(rsc)/./lib/directus-blog.ts\",206,18,203,1,true],[\"eval\",\"webpack-internal:///(rsc)/./lib/directus-blog.ts\",211,"])</script><script>self.__next_f.push([1,"31,209,68,true]]\n8c:[\"cache-control\",\"no-cache\"]\n8d:[\"connection\",\"keep-alive\"]\n8e:[\"content-length\",\"3131\"]\n8f:[\"content-security-policy\",\"script-src 'self' 'unsafe-eval';worker-src 'self' blob:;child-src 'self' blob:;img-src 'self' data: blob: https://raw.githubusercontent.com https://avatars.githubusercontent.com;media-src 'self';connect-src 'self' https://* wss://*;default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';object-src 'none';script-src-attr 'none';style-src 'self' https: 'unsafe-inline'\"]\n90:[\"content-type\",\"application/json; charset=utf-8\"]\n91:[\"cross-origin-opener-policy\",\"same-origin-allow-popups\"]\n92:[\"date\",\"Fri, 29 May 2026 03:39:12 GMT\"]\n93:[\"etag\",\"W/\\\"c3b-19Uj+g8NwY1PX4vJ7qiUtXI1TOg\\\"\"]\n94:[\"keep-alive\",\"timeout=5\"]\n95:[\"vary\",\"Origin, Cache-Control\"]\n96:[\"x-powered-by\",\"Directus\"]\n8b:[\"$8c\",\"$8d\",\"$8e\",\"$8f\",\"$90\",\"$91\",\"$92\",\"$93\",\"$94\",\"$95\",\"$96\"]\n"])</script><script>self.__next_f.push([1,"98:\"$EObject.defineProperty(class ReadableStream {\\n [kType] = 'ReadableStream';\\n\\n /**\\n * @param {UnderlyingSource} [source]\\n * @param {QueuingStrategy} [strategy]\\n */\\n constructor(source = kEmptyObject, strategy = kEmptyObject) {\\n markTransferMode(this, false, true);\\n validateObject(source, 'source', kValidateObjectAllowObjects);\\n validateObject(strategy, 'strategy', kValidateObjectAllowObjectsAndNull);\\n this[kState] = createReadableStreamState();\\n\\n this[kIsClosedPromise] = PromiseWithResolvers();\\n this[kControllerErrorFunction] = () =\u003e {};\\n\\n // The spec requires handling of the strategy first\\n // here. Specifically, if getting the size and\\n // highWaterMark from the strategy fail, that has\\n // to trigger a throw before getting the details\\n // from the source. So be sure to keep these in\\n // this order.\\n const size = strategy?.size;\\n const highWaterMark = strategy?.highWaterMark;\\n const type = source.type;\\n\\n if (`${type}` === 'bytes') {\\n if (size !== undefined)\\n throw new ERR_INVALID_ARG_VALUE.RangeError('strategy.size', size);\\n setupReadableByteStreamControllerFromSource(\\n this,\\n source,\\n extractHighWaterMark(highWaterMark, 0));\\n } else {\\n if (type !== undefined)\\n throw new ERR_INVALID_ARG_VALUE('source.type', type);\\n setupReadableStreamDefaultControllerFromSource(\\n this,\\n source,\\n extractHighWaterMark(highWaterMark, 1),\\n extractSizeAlgorithm(size));\\n }\\n }\\n\\n get [kIsDisturbed]() {\\n return this[kState].disturbed;\\n }\\n\\n get [kIsErrored]() {\\n return this[kState].state === 'errored';\\n }\\n\\n get [kIsReadable]() {\\n return this[kState].state === 'readable';\\n }\\n\\n /**\\n * @readonly\\n * @type {boolean}\\n */\\n get locked() {\\n if (!isReadableStream(this))\\n throw new ERR_INVALID_THIS('ReadableStream');\\n return isReadableStreamLocked(this);\\n }\\n\\n static from(iterable) {\\n return readableStreamFromIterable(iterable);\\n }\\n\\n /**\\n * @param {any} [reason]\\n * @returns { Promise\u003cvoid\u003e }\\n */\\n cancel(reason = undefined) {\\n if (!isReadableStream(this))\\n return PromiseReject(new ERR_INVALID_THIS('ReadableStream'));\\n if (isReadableStreamLocked(this)) {\\n return PromiseReject(\\n new ERR_INVALID_STATE.TypeError('ReadableStream is locked'));\\n }\\n return readableStreamCancel(this, reason);\\n }\\n\\n /**\\n * @param {{\\n * mode? : \\\"byob\\\"\\n * }} [options]\\n * @returns {ReadableStreamReader}\\n */\\n getReader(options = kEmptyObject) {\\n if (!isReadableStream(this))\\n throw new ERR_INVALID_THIS('ReadableStream');\\n validateObject(options, 'options', kValidateObjectAllowObjectsAndNull);\\n const mode = options?.mode;\\n\\n if (mode === undefined)\\n // eslint-disable-next-line no-use-before-define\\n return new ReadableStreamDefaultReader(this);\\n\\n if (`${mode}` !== 'byob')\\n throw new ERR_INVALID_ARG_VALUE('options.mode', mode);\\n // eslint-disable-next-line no-use-before-define\\n return new ReadableStreamBYOBReader(this);\\n }\\n\\n /**\\n * @param {ReadableWritablePair} transform\\n * @param {StreamPipeOptions} [options]\\n * @returns {ReadableStream}\\n */\\n pipeThrough(transform, options = kEmptyObject) {\\n if (!isReadableStream(this))\\n throw new ERR_INVALID_THIS('ReadableStream');\\n const readable = transform?.readable;\\n if (!isReadableStream(readable)) {\\n throw new ERR_INVALID_ARG_TYPE(\\n 'transform.readable',\\n 'ReadableStream',\\n readable);\\n }\\n const writable = transform?.writable;\\n if (!isWritableStream(writable)) {\\n throw new ERR_INVALID_ARG_TYPE(\\n 'transform.writable',\\n 'WritableStream',\\n writable);\\n }\\n\\n // The web platform tests require that these be handled one at a\\n // time and in a specific order. options can be null or undefined.\\n validateObject(options, 'options', kValidateObjectAllowObjectsAndNull);\\n const preventAbort = options?.preventAbort;\\n const preventCancel = options?.preventCancel;\\n const preventClose = options?.preventClose;\\n const signal = options?.signal;\\n\\n if (signal !== undefined) {\\n validateAbortSignal(signal, 'options.signal');\\n }\\n\\n if (isReadableStreamLocked(this))\\n throw new ERR_INVALID_STATE.TypeError('The ReadableStream is locked');\\n if (isWritableStreamLocked(writable))\\n throw new ERR_INVALID_STATE.TypeError('The WritableStream is locked');\\n\\n const promise = readableStreamPipeTo(\\n this,\\n writable,\\n !!preventClose,\\n !!preventAbort,\\n !!preventCancel,\\n signal);\\n setPromiseHandled(promise);\\n\\n return readable;\\n }\\n\\n /**\\n * @param {WritableStream} destination\\n * @param {StreamPipeOptions} [options]\\n * @returns {Promise\u003cvoid\u003e}\\n */\\n pipeTo(destination, options = kEmptyObject) {\\n try {\\n if (!isReadableStream(this))\\n throw new ERR_INVALID_THIS('ReadableStream');\\n if (!isWritableStream(destination)) {\\n throw new ERR_INVALID_ARG_TYPE(\\n 'transform.writable',\\n 'WritableStream',\\n destination);\\n }\\n\\n validateObject(options, 'options', kValidateObjectAllowObjectsAndNull);\\n const preventAbort = options?.preventAbort;\\n const preventCancel = options?.preventCancel;\\n const preventClose = options?.preventClose;\\n const signal = options?.signal;\\n\\n if (signal !== undefined) {\\n validateAbortSignal(signal, 'options.signal');\\n }\\n\\n if (isReadableStreamLocked(this))\\n throw new ERR_INVALID_STATE.TypeError('The ReadableStream is locked');\\n if (isWritableStreamLocked(destination))\\n throw new ERR_INVALID_STATE.TypeError('The WritableStream is locked');\\n\\n return readableStreamPipeTo(\\n this,\\n destination,\\n !!preventClose,\\n !!preventAbort,\\n !!preventCancel,\\n signal);\\n } catch (error) {\\n return PromiseReject(error);\\n }\\n }\\n\\n /**\\n * @returns {ReadableStream[]}\\n */\\n tee() {\\n if (!isReadableStream(this))\\n throw new ERR_INVALID_THIS('ReadableStream');\\n return readableStreamTee(this, false);\\n }\\n\\n /**\\n * @param {{\\n * preventCancel? : boolean,\\n * }} [options]\\n * @returns {AsyncIterable}\\n */\\n values(options = kEmptyObject) {\\n if (!isReadableStream(this))\\n throw new ERR_INVALID_THIS('ReadableStream');\\n validateObject(options, 'options', kValidateObjectAllowObjectsAndNull);\\n const preventCancel = !!(options?.preventCancel);\\n\\n // eslint-disable-next-line no-use-before-define\\n const reader = new ReadableStreamDefaultReader(this);\\n\\n // No __proto__ here to avoid the performance hit.\\n const state = {\\n done: false,\\n current: undefined,\\n };\\n let started = false;\\n\\n // The nextSteps function is not an async function in order\\n // to make it more efficient. Because nextSteps explicitly\\n // creates a Promise and returns it in the common case,\\n // making it an async function just causes two additional\\n // unnecessary Promise allocations to occur, which just add\\n // cost.\\n function nextSteps() {\\n if (state.done)\\n return PromiseResolve({ done: true, value: undefined });\\n\\n if (reader[kState].stream === undefined) {\\n return PromiseReject(\\n new ERR_INVALID_STATE.TypeError(\\n 'The reader is not bound to a ReadableStream'));\\n }\\n const promise = PromiseWithResolvers();\\n\\n // eslint-disable-next-line no-use-before-define\\n readableStreamDefaultReaderRead(reader, new ReadableStreamAsyncIteratorReadRequest(reader, state, promise));\\n return promise.promise;\\n }\\n\\n async function returnSteps(value) {\\n if (state.done)\\n return { done: true, value }; // eslint-disable-line node-core/avoid-prototype-pollution\\n state.done = true;\\n\\n if (reader[kState].stream === undefined) {\\n throw new ERR_INVALID_STATE.TypeError(\\n 'The reader is not bound to a ReadableStream');\\n }\\n assert(!reader[kState].readRequests.length);\\n if (!preventCancel) {\\n const result = readableStreamReaderGenericCancel(reader, value);\\n readableStreamReaderGenericRelease(reader);\\n await result;\\n return { done: true, value }; // eslint-disable-line node-core/avoid-prototype-pollution\\n }\\n\\n readableStreamReaderGenericRelease(reader);\\n return { done: true, value }; // eslint-disable-line node-core/avoid-prototype-pollution\\n }\\n\\n // TODO(@jasnell): Explore whether an async generator\\n // can be used here instead of a custom iterator object.\\n return ObjectSetPrototypeOf({\\n // Changing either of these functions (next or return)\\n // to async functions causes a failure in the streams\\n // Web Platform Tests that check for use of a modified\\n // Promise.prototype.then. Since the await keyword\\n // uses Promise.prototype.then, it is open to prototype\\n // pollution, which causes the test to fail. The other\\n // await uses here do not trigger that failure because\\n // the test that fails does not trigger those code paths.\\n next() {\\n // If this is the first read, delay by one microtask\\n // to ensure that the controller has had an opportunity\\n // to properly start and perform the initial pull.\\n // TODO(@jasnell): The spec doesn't call this out so\\n // need to investigate if it's a bug in our impl or\\n // the spec.\\n if (!started) {\\n state.current = PromiseResolve();\\n started = true;\\n }\\n state.current = state.current !== undefined ?\\n PromisePrototypeThen(state.current, nextSteps, nextSteps) :\\n nextSteps();\\n return state.current;\\n },\\n\\n return(error) {\\n started = true;\\n state.current = state.current !== undefined ?\\n PromisePrototypeThen(\\n state.current,\\n () =\u003e returnSteps(error),\\n () =\u003e returnSteps(error)) :\\n returnSteps(error);\\n return state.current;\\n },\\n\\n [SymbolAsyncIterator]() { return this; },\\n }, AsyncIterator);\\n }\\n\\n [kInspect](depth, options) {\\n return customInspect(depth, options, this[kType], {\\n locked: this.locked,\\n state: this[kState].state,\\n supportsBYOB:\\n // eslint-disable-next-line no-use-before-define\\n this[kState].controller instanceof ReadableByteStreamController,\\n });\\n }\\n\\n [kTransfer]() {\\n if (!isReadableStream(this))\\n throw new ERR_INVALID_THIS('ReadableStream');\\n if (this.locked) {\\n this[kState].transfer.port1?.close();\\n this[kState].transfer.port1 = undefined;\\n this[kState].transfer.port2 = undefined;\\n throw new DOMException(\\n 'Cannot transfer a locked ReadableStream',\\n 'DataCloneError');\\n }\\n\\n const {\\n writable,\\n promise,\\n } = lazyTransfer().newCrossRealmWritableSink(\\n this,\\n this[kState].transfer.port1);\\n\\n this[kState].transfer.writable = writable;\\n this[kState].transfer.promise = promise;\\n\\n return {\\n data: { port: this[kState].transfer.port2 },\\n deserializeInfo:\\n 'internal/webstreams/readablestream:TransferredReadableStream',\\n };\\n }\\n\\n [kTransferList]() {\\n const { port1, port2 } = new MessageChannel();\\n this[kState].transfer.port1 = port1;\\n this[kState].transfer.port2 = port2;\\n return [ port2 ];\\n }\\n\\n [kDeserialize]({ port }) {\\n const transfer = lazyTransfer();\\n setupReadableStreamDefaultControllerFromSource(\\n this,\\n // The MessagePort is set to be referenced when reading.\\n // After two MessagePorts are closed, there is a problem with\\n // lingering promise not being properly resolved.\\n // https://github.com/nodejs/node/issues/51486\\n new transfer.CrossRealmTransformReadableSource(port, true),\\n 0, () =\u003e 1);\\n }\\n},\\\"name\\\",{value:\\\"ReadableStream\\\"})\"\n"])</script><script>self.__next_f.push([1,"97:{\"constructor\":\"$98\",\"locked\":true,\"\":\"$P98\"}\n"])</script><script>self.__next_f.push([1,"9a:\"$EObject.defineProperty(class _Response {\\n static {\\n __name(this, \\\"Response\\\");\\n }\\n /** @type {Headers} */\\n #headers;\\n #state;\\n // Creates network error Response.\\n static error() {\\n const responseObject = fromInnerResponse(makeNetworkError(), \\\"immutable\\\");\\n return responseObject;\\n }\\n // https://fetch.spec.whatwg.org/#dom-response-json\\n static json(data, init = void 0) {\\n webidl.argumentLengthCheck(arguments, 1, \\\"Response.json\\\");\\n if (init !== null) {\\n init = webidl.converters.ResponseInit(init);\\n }\\n const bytes = textEncoder.encode(\\n serializeJavascriptValueToJSONString(data)\\n );\\n const body = extractBody(bytes);\\n const responseObject = fromInnerResponse(makeResponse({}), \\\"response\\\");\\n initializeResponse(responseObject, init, { body: body[0], type: \\\"application/json\\\" });\\n return responseObject;\\n }\\n // Creates a redirect Response that redirects to url with status status.\\n static redirect(url, status = 302) {\\n webidl.argumentLengthCheck(arguments, 1, \\\"Response.redirect\\\");\\n url = webidl.converters.USVString(url);\\n status = webidl.converters[\\\"unsigned short\\\"](status);\\n let parsedURL;\\n try {\\n parsedURL = new URL(url, relevantRealm.settingsObject.baseUrl);\\n } catch (err) {\\n throw new TypeError(`Failed to parse URL from ${url}`, { cause: err });\\n }\\n if (!redirectStatusSet.has(status)) {\\n throw new RangeError(`Invalid status code ${status}`);\\n }\\n const responseObject = fromInnerResponse(makeResponse({}), \\\"immutable\\\");\\n responseObject.#state.status = status;\\n const value = isomorphicEncode(URLSerializer(parsedURL));\\n responseObject.#state.headersList.append(\\\"location\\\", value, true);\\n return responseObject;\\n }\\n // https://fetch.spec.whatwg.org/#dom-response\\n constructor(body = null, init = void 0) {\\n webidl.util.markAsUncloneable(this);\\n if (body === kConstruct) {\\n return;\\n }\\n if (body !== null) {\\n body = webidl.converters.BodyInit(body, \\\"Response\\\", \\\"body\\\");\\n }\\n init = webidl.converters.ResponseInit(init);\\n this.#state = makeResponse({});\\n this.#headers = new Headers(kConstruct);\\n setHeadersGuard(this.#headers, \\\"response\\\");\\n setHeadersList(this.#headers, this.#state.headersList);\\n let bodyWithType = null;\\n if (body != null) {\\n const [extractedBody, type] = extractBody(body);\\n bodyWithType = { body: extractedBody, type };\\n }\\n initializeResponse(this, init, bodyWithType);\\n }\\n // Returns response?s type, e.g., \\\"cors\\\".\\n get type() {\\n webidl.brandCheck(this, _Response);\\n return this.#state.type;\\n }\\n // Returns response?s URL, if it has one; otherwise the empty string.\\n get url() {\\n webidl.brandCheck(this, _Response);\\n const urlList = this.#state.urlList;\\n const url = urlList[urlList.length - 1] ?? null;\\n if (url === null) {\\n return \\\"\\\";\\n }\\n return URLSerializer(url, true);\\n }\\n // Returns whether response was obtained through a redirect.\\n get redirected() {\\n webidl.brandCheck(this, _Response);\\n return this.#state.urlList.length \u003e 1;\\n }\\n // Returns response?s status.\\n get status() {\\n webidl.brandCheck(this, _Response);\\n return this.#state.status;\\n }\\n // Returns whether response?s status is an ok status.\\n get ok() {\\n webidl.brandCheck(this, _Response);\\n return this.#state.status \u003e= 200 \u0026\u0026 this.#state.status \u003c= 299;\\n }\\n // Returns response?s status message.\\n get statusText() {\\n webidl.brandCheck(this, _Response);\\n return this.#state.statusText;\\n }\\n // Returns response?s headers as Headers.\\n get headers() {\\n webidl.brandCheck(this, _Response);\\n return this.#headers;\\n }\\n get body() {\\n webidl.brandCheck(this, _Response);\\n return this.#state.body ? this.#state.body.stream : null;\\n }\\n get bodyUsed() {\\n webidl.brandCheck(this, _Response);\\n return !!this.#state.body \u0026\u0026 util.isDisturbed(this.#state.body.stream);\\n }\\n // Returns a clone of response.\\n clone() {\\n webidl.brandCheck(this, _Response);\\n if (bodyUnusable(this.#state)) {\\n throw webidl.errors.exception({\\n header: \\\"Response.clone\\\",\\n message: \\\"Body has already been consumed.\\\"\\n });\\n }\\n const clonedResponse = cloneResponse(this.#state);\\n if (this.#state.body?.stream) {\\n streamRegistry.register(this, new WeakRef(this.#state.body.stream));\\n }\\n return fromInnerResponse(clonedResponse, getHeadersGuard(this.#headers));\\n }\\n [nodeUtil.inspect.custom](depth, options) {\\n if (options.depth === null) {\\n options.depth = 2;\\n }\\n options.colors ??= true;\\n const properties = {\\n status: this.status,\\n statusText: this.statusText,\\n headers: this.headers,\\n body: this.body,\\n bodyUsed: this.bodyUsed,\\n ok: this.ok,\\n redirected: this.redirected,\\n type: this.type,\\n url: this.url\\n };\\n return `Response ${nodeUtil.formatWithOptions(options, properties)}`;\\n }\\n /**\\n * @param {Response} response\\n */\\n static getResponseHeaders(response) {\\n return response.#headers;\\n }\\n /**\\n * @param {Response} response\\n * @param {Headers} newHeaders\\n */\\n static setResponseHeaders(response, newHeaders) {\\n response.#headers = newHeaders;\\n }\\n /**\\n * @param {Response} response\\n */\\n static getResponseState(response) {\\n return response.#state;\\n }\\n /**\\n * @param {Response} response\\n * @param {any} newState\\n */\\n static setResponseState(response, newState) {\\n response.#state = newState;\\n }\\n },\\\"name\\\",{value:\\\"Response\\\"})\"\n"])</script><script>self.__next_f.push([1,"99:\"$9a\"\n85:{\"url\":\"http://192.1.1.30:8055/items/blog?fields=*.*\u0026filter[url][_eq]=best-gaming-laptops\u0026limit=1\",\"type\":\"default\",\"redirected\":false,\"status\":200,\"ok\":true,\"statusText\":\"OK\",\"headers\":\"$8b\",\"body\":\"$97\",\"bodyUsed\":true,\"\":\"$P99\"}\n9b:T562,"])</script><script>self.__next_f.push([1,"\u003cp dir=\"auto\"\u003e\u003cimg src=\"/directus-assets/bfabbd51-7577-4eca-af5c-c4de18f8068b.jpg?width=32\u0026amp;height=32\" alt=\"1773921127540 Input\"\u003eIn today\u0026rsquo;s fast-moving e-commerce world, shoppers often switch between multiple platforms to find the best price for the same product. To make online shopping easier and more efficient, ShopFox has launched its latest product price comparison feature.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eWith this new feature, users can simply enter a product name or visit a product page, and ShopFox will automatically match relevant items across different platforms. It displays key information such as prices, available discounts, stock status, and delivery options, helping users make smarter purchasing decisions.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eBeyond basic price comparison, ShopFox also considers coupons, promotional offers, and historical price trends. This gives shoppers a more complete view of whether now is the right time to buy. Whether you are shopping for electronics, beauty products, fashion items, or daily essentials, ShopFox helps you save both time and money.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAs the feature continues to improve, ShopFox will expand its coverage to include more platforms and product categories. Try the new ShopFox price comparison feature today and discover a smarter, faster, and more transparent way to shop online.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u0026nbsp;\u003c/p\u003e"])</script><script>self.__next_f.push([1,"89:{\"data\":[{\"author\":\"bbb\",\"content\":\"$9b\",\"date_created\":\"2026-04-24T05:52:45.000Z\",\"date_updated\":\"2026-05-29T03:31:46.000Z\",\"id\":3,\"meta_description\":\"我在家你呢\",\"sort\":null,\"status\":\"draft\",\"sub_title\":\"Compare prices across multiple platforms and find the best deal faster\",\"title\":\"ShopFox Launches New Product Price Comparison Feature\",\"url\":\"best-gaming-laptops\",\"user_created\":{\"appearance\":null,\"auth_data\":null,\"avatar\":null,\"description\":null,\"email\":\"1530117556@qq.com\",\"email_notifications\":true,\"external_identifier\":null,\"first_name\":\"tp\",\"id\":\"7b4159fc-9761-49be-b0d6-54cb0b932015\",\"language\":null,\"last_access\":\"2026-04-28T02:42:06.000Z\",\"last_name\":null,\"last_page\":\"/users/7b4159fc-9761-49be-b0d6-54cb0b932015\",\"location\":null,\"password\":\"**********\",\"provider\":\"default\",\"role\":\"02a4dff6-0d16-4518-82fb-eed3aebde8a2\",\"status\":\"active\",\"tags\":null,\"text_direction\":\"auto\",\"tfa_secret\":null,\"theme_dark\":null,\"theme_dark_overrides\":null,\"theme_light\":null,\"theme_light_overrides\":null,\"title\":null,\"token\":null,\"policies\":[\"07fea308-dd68-46ab-b086-96ec91a43625\"]},\"user_updated\":{\"appearance\":null,\"auth_data\":null,\"avatar\":null,\"description\":null,\"email\":\"1197445358@qq.com\",\"email_notifications\":true,\"external_identifier\":null,\"first_name\":\"Admin\",\"id\":\"1ca7699f-a50d-4de0-816a-e88e07290e8d\",\"language\":null,\"last_access\":\"2026-05-29T03:36:47.000Z\",\"last_name\":\"User\",\"last_page\":\"/content/blog\",\"location\":null,\"password\":\"**********\",\"provider\":\"default\",\"role\":\"e815cbb0-f940-44d6-adb2-64d48cbbb937\",\"status\":\"active\",\"tags\":null,\"text_direction\":\"auto\",\"tfa_secret\":null,\"theme_dark\":null,\"theme_dark_overrides\":null,\"theme_light\":null,\"theme_light_overrides\":null,\"title\":null,\"token\":null,\"policies\":[]}}]}\n"])</script><script>self.__next_f.push([1,"9c:[[\"directusRequest\",\"webpack-internal:///(rsc)/./lib/directus-blog.ts\",106,103,105,1,false],[\"getBlogDetailByUrlPath\",\"webpack-internal:///(rsc)/./lib/directus-blog.ts\",206,24,203,1,false],[\"eval\",\"webpack-internal:///(rsc)/./lib/directus-blog.ts\",211,37,209,68,false],[\"BlogDetailPage\",\"webpack-internal:///(rsc)/./app/blogs/[id]/page.tsx\",75,89,73,1,false]]\n9d:[[\"directusRequest\",\"webpack-internal:///(rsc)/./lib/directus-blog.ts\",114,36,105,1,false],[\"getBlogDetailByUrlPath\",\"webpack-internal:///(rsc)/./lib/directus-blog.ts\",206,18,203,1,true],[\"eval\",\"webpack-internal:///(rsc)/./lib/directus-blog.ts\",211,31,209,68,true]]\n9e:[[\"directusRequest\",\"webpack-internal:///(rsc)/./lib/directus-blog.ts\",106,103,105,1,false],[\"getBlogDetailByUrlPath\",\"webpack-internal:///(rsc)/./lib/directus-blog.ts\",206,24,203,1,false],[\"eval\",\"webpack-internal:///(rsc)/./lib/directus-blog.ts\",211,37,209,68,false],[\"BlogDetailPage\",\"webpack-internal:///(rsc)/./app/blogs/[id]/page.tsx\",75,89,73,1,false]]\n9f:[[\"directusRequest\",\"webpack-internal:///(rsc)/./lib/directus-blog.ts\",114,36,105,1,false],[\"getBlogDetailByUrlPath\",\"webpack-internal:///(rsc)/./lib/directus-blog.ts\",206,18,203,1,true],[\"eval\",\"webpack-internal:///(rsc)/./lib/directus-blog.ts\",211,31,209,68,true]]\n"])</script><script>self.__next_f.push([1,"a2:\"$EObject.defineProperty(function LovableBackgroundEffects({ variant = \\\"default\\\" }) {\\n const theme = VARIANT_STYLES[variant] || VARIANT_STYLES.default;\\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\\\"div\\\", {\\n className: \\\"absolute inset-0 pointer-events-none overflow-hidden\\\",\\n \\\"aria-hidden\\\": \\\"true\\\",\\n children: [\\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\\\"div\\\", {\\n className: \\\"absolute inset-0\\\",\\n style: {\\n background: theme.base\\n }\\n }, void 0, false, {\\n fileName: \\\"/root/work/web-next-an/target/web-next/components/layout/lovable-background-effects.jsx\\\",\\n lineNumber: 51,\\n columnNumber: 7\\n }, this),\\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\\\"div\\\", {\\n className: \\\"absolute -top-[10%] left-[10%] h-[850px] w-[850px] rounded-full\\\",\\n style: {\\n background: theme.topLeft,\\n filter: \\\"blur(20px)\\\"\\n }\\n }, void 0, false, {\\n fileName: \\\"/root/work/web-next-an/target/web-next/components/layout/lovable-background-effects.jsx\\\",\\n lineNumber: 57,\\n columnNumber: 7\\n }, this),\\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\\\"div\\\", {\\n className: \\\"absolute top-[15%] right-[-15%] h-[900px] w-[900px] rounded-full\\\",\\n style: {\\n background: theme.topRight,\\n filter: \\\"blur(30px)\\\"\\n }\\n }, void 0, false, {\\n fileName: \\\"/root/work/web-next-an/target/web-next/components/layout/lovable-background-effects.jsx\\\",\\n lineNumber: 64,\\n columnNumber: 7\\n }, this),\\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\\\"div\\\", {\\n className: \\\"absolute bottom-[-20%] left-[-10%] h-[1000px] w-[1000px] rounded-full\\\",\\n style: {\\n background: theme.bottomLeft,\\n filter: \\\"blur(40px)\\\"\\n }\\n }, void 0, false, {\\n fileName: \\\"/root/work/web-next-an/target/web-next/components/layout/lovable-background-effects.jsx\\\",\\n lineNumber: 71,\\n columnNumber: 7\\n }, this),\\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\\\"div\\\", {\\n className: \\\"absolute bottom-[5%] right-[5%] h-[600px] w-[600px] rounded-full\\\",\\n style: {\\n background: theme.bottomRight,\\n filter: \\\"blur(20px)\\\"\\n }\\n }, void 0, false, {\\n fileName: \\\"/root/work/web-next-an/target/web-next/components/layout/lovable-background-effects.jsx\\\",\\n lineNumber: 78,\\n columnNumber: 7\\n }, this),\\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\\\"div\\\", {\\n className: \\\"absolute inset-0 opacity-[0.35]\\\",\\n style: {\\n backgroundImage: theme.dots,\\n &am
