[{"data":1,"prerenderedAt":3510},["ShallowReactive",2],{"article-93-implement-thumbnails-with-cloudflare-image":3},{"id":4,"title":5,"slug":6,"contentMarkdown":7,"coverImage":8,"category":9,"tags":10,"aiSummary":13,"createdAt":14,"updatedAt":15,"_mdcAst":16,"_mdcToc":3488},93,"借助Cloudflare Image实现缩略图","implement-thumbnails-with-cloudflare-image","自从我在Cloudflare page上部署了图床之后，我尝试写了一下图片画廊，借助CSS+Swiper实现了一些像是幻灯片，3D流，手风琴，瀑布流等效果。然后我意识到了一个问题：我的图床是没有缩略图功能的，这导致了我的图片几乎都是原图传输，平白无故浪费流量。\n\n\n\n### 缩略图方案\n闲来无事研究了一下，我有两个选择：\n\n#### **一：借助Nuxt image实现**\n这是 Nuxt 官方提供的模块，它不是一个图片存储服务，而是一个**图片处理前端封装器**。\n\n- **实现原理**：它通过 `\u003CNuxtImg>` 或 `\u003CNuxtPicture>` 组件，自动根据设备尺寸生成 `srcset`，并调用后端的图片处理服务（默认是内置的 IPX，也可以对接 Cloudflare、Cloudinary 等）。\n- **优点**：\n  - **极致的开发体验 (DX)**：只需在代码里写 `\u003CNuxtImg src=\"/a.jpg\" width=\"300\" />`，它会自动处理缩放、格式转换（WebP/AVIF）。\n  - **响应式设计**：完美适配移动端和桌面端，自动生成不同分辨率的缩略图。\n  - **零配置成本（初级）**：如果图片在 `public` 目录，它利用服务器内存/硬盘实时生成缩略图（IPX）。\n- **缺点**：\n  - **性能瓶颈**：如果使用默认的 IPX 且图片量巨大，生成缩略图会消耗你**自己的服务器 CPU 和内存**，可能导致网站变慢。\n  - **缓存依赖**：需要配置好服务器缓存，否则每次请求都会重新处理。）。\n\n\n#### **二：启用Cloudflare Image的图片缩放**\n\n这是由全球顶级 CDN 服务商提供的**端到端图片解决方案**。\n\n- **实现原理**：你将原图上传到 Cloudflare，通过特定的 URL 参数（如 `/cdn-cgi/image/width=100,f=auto/`）请求图片，Cloudflare 的边缘节点会实时处理并缓存缩略图。\n- **优点**：\n  - **全球加速**：图片处理和交付都在离用户最近的边缘节点完成，速度极快。\n  - **节省空间与流量**：自动转换为 WebP/AVIF 格式，显著降低带宽成本。\n  - **功能强大**：支持裁剪、水印、模糊等高级操作，且无需担心服务器负载。\n- **缺点**：\n  - **成本**：虽有免费额度（通常 5000 次转换），但大规模使用是按存储量和转换次数计费的。\n  - **厂商锁定**：图片存在它家，迁移到其他平台会有一定的导出成本。\n- **适用场景**：对加载速度有极致要求、图片访问量大、不希望增加自建服务器负担的生产环境。\n\n上面这两种方案各有优点，但是权衡之后我还是觉得使用 Cloudflare Image的图片缩放，还是因为我的服务器的性能问题。\n\nNuxt image主要是靠IPX（Nuxt 内置引擎） 从 提供的链接 下载原图，在你的服务器内存中动态裁剪成缩略图。然后IPX 将处理好的图片返回给用户。\n\n考虑到我还有MoonTV以及代理服务占用不少的内存。我有点担心负载过大导致这些进程被强制停止。\n\n等到我换个服务器再说吧，下个服务器我得买个2核4G的了。\n\n### 实现基于Cloudflare Image的缩略图\n\nCloudflare 提供了两种主要的实现路径，取决于你的图片存储位置：\n\n#### A. Cloudflare Images (存储 + 转换)\n\n如果你将图片直接上传到 Cloudflare 的存储中，你可以使用**命名变体（Named Variants）**。\n\n- **实现原理**：在 Cloudflare 控制台预先定义一个名为 `thumbnail` 的变体，设置好宽度（如 200px）、高度、裁剪方式等。\n- **URL 格式**：`https://imagedelivery.net/\u003CACCOUNT_HASH>/\u003CIMAGE_ID>/thumbnail`\n- **优点**：URL 简洁，且可以隐藏具体的处理参数。\n\n隐藏具体的处理参数意味着你的图片几乎不会被盗链刷流量，Cloudflare本身的高速处理分发又确保了传输效率，唯一的美中不足的就是这是付费服务，白嫖的免费计划是没有这玩意的，最低貌似是5＄/M，谁让我们是白嫖党呢。\n\n**PASS**\n\n#### B. Image Resizing (仅转换)\n\n如果图片存储在你自己的服务器（如阿里云 OSS、AWS S3 或自己的 Web 服务器）上，你可以使用 **URL 参数转换**。\n\n- **实现原理**：通过特定的 URL 前缀 `/cdn-cgi/image/` 传递转换指令。\n- **URL 格式**：`https://example.com/cdn-cgi/image/width=200,height=200,fit=crop/path/to/image.jpg`\n- **优点**：灵活，无需修改现有存储架构，随调随用。\n\n### 3. 具体实施步骤\n\n#### 第一步：开启功能\n\n1. 登录 Cloudflare Dashboard。\n2. 进入你的站点 -> **Speed (速度)** -> **Optimization (优化)** -> **Image Resizing**。\n3. 点击开启。\n4. 填入你的图床域名。\n\n#### 第二步：构造 URL\n\n然后，比如你的图床图片链接是 \n```\nhttps://imgbed.test.test/file/test.jpg\n```\n\n访问 \n```\nhttps://imgbed.test.test/cdn-cgi/image/fit=scale-down,width=300,format=webp/https://imgbed.test.test/file/test.jpg\n```\n\n就可以返回宽度为 300 像素（只缩小不放大），图像编码为 webp 的转换后图片。\n\n参考文档：\n\n[Transform via URL (通过 URL 转换图片参数)](https://developers.cloudflare.com/images/transform-images/transform-via-url/)\n\n详细列出了 width, height, fit, gravity 等所有参数的用法。\n\n\n### 使用Cloudlare image的隐患\n\n首先要明确一点：免费转换图片的额度是5000，超出了5000是要收费的。\n\n#### 先澄清一个关键点（很重要）\n\n\n\n::alert{type=\"info\"}\n#title\nCloudflare的计费原则\n#default\n\n **❗ Cloudflare Image Resizing 的计费触发点**\n每一次对原图的转换请求都会计费\n\n相同参数的转换结果会被 CDN 缓存\n\n**但是：**\n\n👉 任何人只要能访问这个 URL，都能触发一次（缓存 miss 时）\n::\n\n\n\n也就是说以两种不同的参数请求Cloudflare image的图片转换实际上是计入两次额度。而一张图的某种固定的参数转化之后，无论被访问多少次/被多少人访问，都只记为一次额度。\n\n因此别人只要知道 URL，修改一下参数就能消耗你的额度。\n\n而Cloudflare Image Resizing / Transform 生成的图片链接，本身是“公开 URL”，默认谁都能用。\n\n**而且**\n\n图床本身设置白名单也没有用，因为访问图床的不是用户，而是 Cloudflare。\n\n所以：\n\n- 只要图床白名单里允许的是 Cloudflare IP + 你的源站\n\n- 那 Cloudflare 就能拉到图\n\n- 一旦缓存成功\n\n- 之后任何人访问这个链接都可以拿到缓存结果\n\n\n虽然很少有人会干这么缺德的事。不怕一万就怕万一，我可不希望一觉醒来收到Cloudflare的账单。\n\n因此就要设置保险。\n\n### 给我们的缩略图链接上保险\n\n我选择了双重保险，Worker验证以及CF安全规则。\n\n### 1.Worker 验签（代码在结尾）\n\n设置了Worker之后，我的网站会直接向Worker发起请求，Worker收到请求之后会判断密钥是否合法，然后用服务器端的私钥 SIGNING_SECRET 重新计算一次签名再返回以确保密钥不会泄露。\n\nWorker验证结束，确保请求的密钥正常，参数正常等，就会向Cloudflare Image发起图床域名的缩略图请求。由于客户端只访问 Worker，源图域名和 `/file/` 结构可被隐藏或替换。\n\n\n原链接：\n```\nhttps://imgbed.test.test/cdn-cgi/image/fit=scale-down,width=300,format=webp/https://imgbed.test.test/file/test.jpg?sig=xxx\n```\n\n\n合法的链接应该如下：\n\n\n```\nhttps://imgworker.test.test/thumb/test.jpg\n  ?w=300\n  &q=50\n  &fmt=webp\n  &fit=scale-down\n  &exp=1700000000\n  &sig=\u003Chmac>\n```\n\n### 2.Cloudflare 安全规则\n\n在Cloudflare 左侧的控制台安全性/安全规则的添加以下的规则\n\n```\n(http.request.uri.path contains \"/cdn-cgi/image\")\nand not (http.request.uri.query contains \"sig=\")\nand not (http.request.uri.query contains \"exp=\")\n```\n然后选择Block(阻断)\n\n这里仅仅只做粗过滤，任何人访问 imgbed.test.test/cdn-cgi/image/xxx 都会直接收到 403 错误。\n\n注意： 这不会影响 Worker，因为 Worker 的 cf: { image } 是内部调用，不走这个路径。\n\n\n\n经过Worker处理+WAF安全规则之后之后，再访问原链接会出现403：\n![403被阻断](https://cfimg.wasd09090030.top/file/blogS/1771167323535_230713vxv11vv1a1ipdw11.webp)\n\n### 实现效果\n\n\n\n::image-enhanced{src=\"https://cfimg.wasd09090030.top/file/blogS/1771167328553_缩略图.webp\" caption=\"大幅降低了延迟和图像体积\" zoomable shadow rounded}\n::\n\n缩略图的效果非常好。\n\n我的图像从原来的400KB-2MB，一下子瘦身到了几十KB，这极大的降低了我的带宽负担和网站加载速度。\n\n### Worker代码\n\n仅供参考\n\n```javascript\nexport default {\n  async fetch(request, env) {\n    const url = new URL(request.url);\n    if (!url.pathname.startsWith(\"/thumb/\")) {\n      return new Response(\"Not found\", { status: 404 });\n    }\n\n    const path = url.pathname.slice(\"/thumb/\".length);\n    const w = url.searchParams.get(\"w\");\n    const q = url.searchParams.get(\"q\");\n    const fmt = url.searchParams.get(\"fmt\");\n    const fit = url.searchParams.get(\"fit\");\n    const exp = url.searchParams.get(\"exp\");\n    const sig = url.searchParams.get(\"sig\");\n\n    if (!w || !q || !fmt || !fit || !exp || !sig) {\n      return new Response(\"Missing params\", { status: 403 });\n    }\n\n    const now = Math.floor(Date.now() / 1000);\n    if (Number(exp) \u003C now) return new Response(\"Expired\", { status: 403 });\n\n    const data = `${path}|${w}|${q}|${fmt}|${fit}|${exp}`;\n    const expected = await hmacHex(env.SIGNING_SECRET, data);\n    if (!timingSafeEqual(expected, sig)) {\n      return new Response(\"Bad signature\", { status: 403 });\n    }\n\n    const sourceUrl = `https://${env.SOURCE_HOST}/file/${path}`;\n    return fetch(sourceUrl, {\n      cf: {\n        image: {\n          fit,\n          width: Number(w),\n          quality: Number(q),\n          format: fmt\n        }\n      }\n    });\n  }\n};\n\nasync function hmacHex(secret, data) {\n  const enc = new TextEncoder();\n  const key = await crypto.subtle.importKey(\n    \"raw\",\n    enc.encode(secret),\n    { name: \"HMAC\", hash: \"SHA-256\" },\n    false,\n    [\"sign\"]\n  );\n  const sig = await crypto.subtle.sign(\"HMAC\", key, enc.encode(data));\n  return [...new Uint8Array(sig)].map(b => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nfunction timingSafeEqual(a, b) {\n  if (a.length !== b.length) return false;\n  let out = 0;\n  for (let i = 0; i \u003C a.length; i++) out |= a.charCodeAt(i) ^ b.charCodeAt(i);\n  return out === 0;\n}\n```\n\n注意要绑定环境变量\n\n代码我就不详细解释了，复制一下去问AI，AI的回答比我费劲口舌的解释要好多了。。。","https://cfimg.wasd09090030.top/file/gallery/1771161660646_20260102_224737.webp","study",[11,12],"教程","Cloudflare","本文探讨了在Cloudflare Page部署图床后，如何实现缩略图功能以节省流量。作者对比了Nuxt Image和Cloudflare Image两种方案，最终选择Cloudflare Image的图片缩放功能，因其能利用全球CDN边缘节点处理图片，避免服务器负载。文章详细介绍了Cloudflare Image的两种实现路径：Cloudflare Images（存储+转换）和Image Resizing（仅转换），并提供了开启功能、构造URL的具体步骤。同时，作者指出免费额度仅5000次转换，存在被恶意消耗的风险，因此建议通过Worker验签和Cloudflare安全规则双重保险来保护链接安全，防止未经授权的访问和计费。","2026-02-15T13:05:43.1193584","2026-02-23T08:41:44.5098343",{"data":17,"body":20,"toc":3488},{"title":18,"description":19},"","自从我在Cloudflare page上部署了图床之后，我尝试写了一下图片画廊，借助CSS+Swiper实现了一些像是幻灯片，3D流，手风琴，瀑布流等效果。然后我意识到了一个问题：我的图床是没有缩略图功能的，这导致了我的图片几乎都是原图传输，平白无故浪费流量。",{"type":21,"children":22},"root",[23,30,36,41,52,64,202,211,222,324,329,334,339,344,350,355,361,372,417,422,430,436,447,490,496,502,545,551,556,567,572,581,586,591,603,608,614,619,625,667,672,677,682,690,695,700,723,728,733,738,743,749,754,767,772,781,786,795,801,806,815,820,825,830,841,846,853,858,863,869,874,3472,3477,3482],{"type":24,"tag":25,"props":26,"children":27},"element","p",{},[28],{"type":29,"value":19},"text",{"type":24,"tag":31,"props":32,"children":34},"h3",{"id":33},"缩略图方案",[35],{"type":29,"value":33},{"type":24,"tag":25,"props":37,"children":38},{},[39],{"type":29,"value":40},"闲来无事研究了一下，我有两个选择：",{"type":24,"tag":42,"props":43,"children":45},"h4",{"id":44},"一借助nuxt-image实现",[46],{"type":24,"tag":47,"props":48,"children":49},"strong",{},[50],{"type":29,"value":51},"一：借助Nuxt image实现",{"type":24,"tag":25,"props":53,"children":54},{},[55,57,62],{"type":29,"value":56},"这是 Nuxt 官方提供的模块，它不是一个图片存储服务，而是一个",{"type":24,"tag":47,"props":58,"children":59},{},[60],{"type":29,"value":61},"图片处理前端封装器",{"type":29,"value":63},"。",{"type":24,"tag":65,"props":66,"children":67},"ul",{},[68,104,163],{"type":24,"tag":69,"props":70,"children":71},"li",{},[72,77,79,86,88,94,96,102],{"type":24,"tag":47,"props":73,"children":74},{},[75],{"type":29,"value":76},"实现原理",{"type":29,"value":78},"：它通过 ",{"type":24,"tag":80,"props":81,"children":83},"code",{"className":82},[],[84],{"type":29,"value":85},"\u003CNuxtImg>",{"type":29,"value":87}," 或 ",{"type":24,"tag":80,"props":89,"children":91},{"className":90},[],[92],{"type":29,"value":93},"\u003CNuxtPicture>",{"type":29,"value":95}," 组件，自动根据设备尺寸生成 ",{"type":24,"tag":80,"props":97,"children":99},{"className":98},[],[100],{"type":29,"value":101},"srcset",{"type":29,"value":103},"，并调用后端的图片处理服务（默认是内置的 IPX，也可以对接 Cloudflare、Cloudinary 等）。",{"type":24,"tag":69,"props":105,"children":106},{},[107,112,114],{"type":24,"tag":47,"props":108,"children":109},{},[110],{"type":29,"value":111},"优点",{"type":29,"value":113},"：\n",{"type":24,"tag":65,"props":115,"children":116},{},[117,135,145],{"type":24,"tag":69,"props":118,"children":119},{},[120,125,127,133],{"type":24,"tag":47,"props":121,"children":122},{},[123],{"type":29,"value":124},"极致的开发体验 (DX)",{"type":29,"value":126},"：只需在代码里写 ",{"type":24,"tag":80,"props":128,"children":130},{"className":129},[],[131],{"type":29,"value":132},"\u003CNuxtImg src=\"/a.jpg\" width=\"300\" />",{"type":29,"value":134},"，它会自动处理缩放、格式转换（WebP/AVIF）。",{"type":24,"tag":69,"props":136,"children":137},{},[138,143],{"type":24,"tag":47,"props":139,"children":140},{},[141],{"type":29,"value":142},"响应式设计",{"type":29,"value":144},"：完美适配移动端和桌面端，自动生成不同分辨率的缩略图。",{"type":24,"tag":69,"props":146,"children":147},{},[148,153,155,161],{"type":24,"tag":47,"props":149,"children":150},{},[151],{"type":29,"value":152},"零配置成本（初级）",{"type":29,"value":154},"：如果图片在 ",{"type":24,"tag":80,"props":156,"children":158},{"className":157},[],[159],{"type":29,"value":160},"public",{"type":29,"value":162}," 目录，它利用服务器内存/硬盘实时生成缩略图（IPX）。",{"type":24,"tag":69,"props":164,"children":165},{},[166,171,172],{"type":24,"tag":47,"props":167,"children":168},{},[169],{"type":29,"value":170},"缺点",{"type":29,"value":113},{"type":24,"tag":65,"props":173,"children":174},{},[175,192],{"type":24,"tag":69,"props":176,"children":177},{},[178,183,185,190],{"type":24,"tag":47,"props":179,"children":180},{},[181],{"type":29,"value":182},"性能瓶颈",{"type":29,"value":184},"：如果使用默认的 IPX 且图片量巨大，生成缩略图会消耗你",{"type":24,"tag":47,"props":186,"children":187},{},[188],{"type":29,"value":189},"自己的服务器 CPU 和内存",{"type":29,"value":191},"，可能导致网站变慢。",{"type":24,"tag":69,"props":193,"children":194},{},[195,200],{"type":24,"tag":47,"props":196,"children":197},{},[198],{"type":29,"value":199},"缓存依赖",{"type":29,"value":201},"：需要配置好服务器缓存，否则每次请求都会重新处理。）。",{"type":24,"tag":42,"props":203,"children":205},{"id":204},"二启用cloudflare-image的图片缩放",[206],{"type":24,"tag":47,"props":207,"children":208},{},[209],{"type":29,"value":210},"二：启用Cloudflare Image的图片缩放",{"type":24,"tag":25,"props":212,"children":213},{},[214,216,221],{"type":29,"value":215},"这是由全球顶级 CDN 服务商提供的",{"type":24,"tag":47,"props":217,"children":218},{},[219],{"type":29,"value":220},"端到端图片解决方案",{"type":29,"value":63},{"type":24,"tag":65,"props":223,"children":224},{},[225,242,283,314],{"type":24,"tag":69,"props":226,"children":227},{},[228,232,234,240],{"type":24,"tag":47,"props":229,"children":230},{},[231],{"type":29,"value":76},{"type":29,"value":233},"：你将原图上传到 Cloudflare，通过特定的 URL 参数（如 ",{"type":24,"tag":80,"props":235,"children":237},{"className":236},[],[238],{"type":29,"value":239},"/cdn-cgi/image/width=100,f=auto/",{"type":29,"value":241},"）请求图片，Cloudflare 的边缘节点会实时处理并缓存缩略图。",{"type":24,"tag":69,"props":243,"children":244},{},[245,249,250],{"type":24,"tag":47,"props":246,"children":247},{},[248],{"type":29,"value":111},{"type":29,"value":113},{"type":24,"tag":65,"props":251,"children":252},{},[253,263,273],{"type":24,"tag":69,"props":254,"children":255},{},[256,261],{"type":24,"tag":47,"props":257,"children":258},{},[259],{"type":29,"value":260},"全球加速",{"type":29,"value":262},"：图片处理和交付都在离用户最近的边缘节点完成，速度极快。",{"type":24,"tag":69,"props":264,"children":265},{},[266,271],{"type":24,"tag":47,"props":267,"children":268},{},[269],{"type":29,"value":270},"节省空间与流量",{"type":29,"value":272},"：自动转换为 WebP/AVIF 格式，显著降低带宽成本。",{"type":24,"tag":69,"props":274,"children":275},{},[276,281],{"type":24,"tag":47,"props":277,"children":278},{},[279],{"type":29,"value":280},"功能强大",{"type":29,"value":282},"：支持裁剪、水印、模糊等高级操作，且无需担心服务器负载。",{"type":24,"tag":69,"props":284,"children":285},{},[286,290,291],{"type":24,"tag":47,"props":287,"children":288},{},[289],{"type":29,"value":170},{"type":29,"value":113},{"type":24,"tag":65,"props":292,"children":293},{},[294,304],{"type":24,"tag":69,"props":295,"children":296},{},[297,302],{"type":24,"tag":47,"props":298,"children":299},{},[300],{"type":29,"value":301},"成本",{"type":29,"value":303},"：虽有免费额度（通常 5000 次转换），但大规模使用是按存储量和转换次数计费的。",{"type":24,"tag":69,"props":305,"children":306},{},[307,312],{"type":24,"tag":47,"props":308,"children":309},{},[310],{"type":29,"value":311},"厂商锁定",{"type":29,"value":313},"：图片存在它家，迁移到其他平台会有一定的导出成本。",{"type":24,"tag":69,"props":315,"children":316},{},[317,322],{"type":24,"tag":47,"props":318,"children":319},{},[320],{"type":29,"value":321},"适用场景",{"type":29,"value":323},"：对加载速度有极致要求、图片访问量大、不希望增加自建服务器负担的生产环境。",{"type":24,"tag":25,"props":325,"children":326},{},[327],{"type":29,"value":328},"上面这两种方案各有优点，但是权衡之后我还是觉得使用 Cloudflare Image的图片缩放，还是因为我的服务器的性能问题。",{"type":24,"tag":25,"props":330,"children":331},{},[332],{"type":29,"value":333},"Nuxt image主要是靠IPX（Nuxt 内置引擎） 从 提供的链接 下载原图，在你的服务器内存中动态裁剪成缩略图。然后IPX 将处理好的图片返回给用户。",{"type":24,"tag":25,"props":335,"children":336},{},[337],{"type":29,"value":338},"考虑到我还有MoonTV以及代理服务占用不少的内存。我有点担心负载过大导致这些进程被强制停止。",{"type":24,"tag":25,"props":340,"children":341},{},[342],{"type":29,"value":343},"等到我换个服务器再说吧，下个服务器我得买个2核4G的了。",{"type":24,"tag":31,"props":345,"children":347},{"id":346},"实现基于cloudflare-image的缩略图",[348],{"type":29,"value":349},"实现基于Cloudflare Image的缩略图",{"type":24,"tag":25,"props":351,"children":352},{},[353],{"type":29,"value":354},"Cloudflare 提供了两种主要的实现路径，取决于你的图片存储位置：",{"type":24,"tag":42,"props":356,"children":358},{"id":357},"a-cloudflare-images-存储-转换",[359],{"type":29,"value":360},"A. Cloudflare Images (存储 + 转换)",{"type":24,"tag":25,"props":362,"children":363},{},[364,366,371],{"type":29,"value":365},"如果你将图片直接上传到 Cloudflare 的存储中，你可以使用",{"type":24,"tag":47,"props":367,"children":368},{},[369],{"type":29,"value":370},"命名变体（Named Variants）",{"type":29,"value":63},{"type":24,"tag":65,"props":373,"children":374},{},[375,392,408],{"type":24,"tag":69,"props":376,"children":377},{},[378,382,384,390],{"type":24,"tag":47,"props":379,"children":380},{},[381],{"type":29,"value":76},{"type":29,"value":383},"：在 Cloudflare 控制台预先定义一个名为 ",{"type":24,"tag":80,"props":385,"children":387},{"className":386},[],[388],{"type":29,"value":389},"thumbnail",{"type":29,"value":391}," 的变体，设置好宽度（如 200px）、高度、裁剪方式等。",{"type":24,"tag":69,"props":393,"children":394},{},[395,400,402],{"type":24,"tag":47,"props":396,"children":397},{},[398],{"type":29,"value":399},"URL 格式",{"type":29,"value":401},"：",{"type":24,"tag":80,"props":403,"children":405},{"className":404},[],[406],{"type":29,"value":407},"https://imagedelivery.net/\u003CACCOUNT_HASH>/\u003CIMAGE_ID>/thumbnail",{"type":24,"tag":69,"props":409,"children":410},{},[411,415],{"type":24,"tag":47,"props":412,"children":413},{},[414],{"type":29,"value":111},{"type":29,"value":416},"：URL 简洁，且可以隐藏具体的处理参数。",{"type":24,"tag":25,"props":418,"children":419},{},[420],{"type":29,"value":421},"隐藏具体的处理参数意味着你的图片几乎不会被盗链刷流量，Cloudflare本身的高速处理分发又确保了传输效率，唯一的美中不足的就是这是付费服务，白嫖的免费计划是没有这玩意的，最低貌似是5＄/M，谁让我们是白嫖党呢。",{"type":24,"tag":25,"props":423,"children":424},{},[425],{"type":24,"tag":47,"props":426,"children":427},{},[428],{"type":29,"value":429},"PASS",{"type":24,"tag":42,"props":431,"children":433},{"id":432},"b-image-resizing-仅转换",[434],{"type":29,"value":435},"B. Image Resizing (仅转换)",{"type":24,"tag":25,"props":437,"children":438},{},[439,441,446],{"type":29,"value":440},"如果图片存储在你自己的服务器（如阿里云 OSS、AWS S3 或自己的 Web 服务器）上，你可以使用 ",{"type":24,"tag":47,"props":442,"children":443},{},[444],{"type":29,"value":445},"URL 参数转换",{"type":29,"value":63},{"type":24,"tag":65,"props":448,"children":449},{},[450,467,481],{"type":24,"tag":69,"props":451,"children":452},{},[453,457,459,465],{"type":24,"tag":47,"props":454,"children":455},{},[456],{"type":29,"value":76},{"type":29,"value":458},"：通过特定的 URL 前缀 ",{"type":24,"tag":80,"props":460,"children":462},{"className":461},[],[463],{"type":29,"value":464},"/cdn-cgi/image/",{"type":29,"value":466}," 传递转换指令。",{"type":24,"tag":69,"props":468,"children":469},{},[470,474,475],{"type":24,"tag":47,"props":471,"children":472},{},[473],{"type":29,"value":399},{"type":29,"value":401},{"type":24,"tag":80,"props":476,"children":478},{"className":477},[],[479],{"type":29,"value":480},"https://example.com/cdn-cgi/image/width=200,height=200,fit=crop/path/to/image.jpg",{"type":24,"tag":69,"props":482,"children":483},{},[484,488],{"type":24,"tag":47,"props":485,"children":486},{},[487],{"type":29,"value":111},{"type":29,"value":489},"：灵活，无需修改现有存储架构，随调随用。",{"type":24,"tag":31,"props":491,"children":493},{"id":492},"_3-具体实施步骤",[494],{"type":29,"value":495},"3. 具体实施步骤",{"type":24,"tag":42,"props":497,"children":499},{"id":498},"第一步开启功能",[500],{"type":29,"value":501},"第一步：开启功能",{"type":24,"tag":503,"props":504,"children":505},"ol",{},[506,511,535,540],{"type":24,"tag":69,"props":507,"children":508},{},[509],{"type":29,"value":510},"登录 Cloudflare Dashboard。",{"type":24,"tag":69,"props":512,"children":513},{},[514,516,521,523,528,529,534],{"type":29,"value":515},"进入你的站点 -> ",{"type":24,"tag":47,"props":517,"children":518},{},[519],{"type":29,"value":520},"Speed (速度)",{"type":29,"value":522}," -> ",{"type":24,"tag":47,"props":524,"children":525},{},[526],{"type":29,"value":527},"Optimization (优化)",{"type":29,"value":522},{"type":24,"tag":47,"props":530,"children":531},{},[532],{"type":29,"value":533},"Image Resizing",{"type":29,"value":63},{"type":24,"tag":69,"props":536,"children":537},{},[538],{"type":29,"value":539},"点击开启。",{"type":24,"tag":69,"props":541,"children":542},{},[543],{"type":29,"value":544},"填入你的图床域名。",{"type":24,"tag":42,"props":546,"children":548},{"id":547},"第二步构造-url",[549],{"type":29,"value":550},"第二步：构造 URL",{"type":24,"tag":25,"props":552,"children":553},{},[554],{"type":29,"value":555},"然后，比如你的图床图片链接是",{"type":24,"tag":557,"props":558,"children":562},"pre",{"className":559,"code":561,"language":29},[560],"language-text","https://imgbed.test.test/file/test.jpg\n",[563],{"type":24,"tag":80,"props":564,"children":565},{"__ignoreMap":18},[566],{"type":29,"value":561},{"type":24,"tag":25,"props":568,"children":569},{},[570],{"type":29,"value":571},"访问",{"type":24,"tag":557,"props":573,"children":576},{"className":574,"code":575,"language":29},[560],"https://imgbed.test.test/cdn-cgi/image/fit=scale-down,width=300,format=webp/https://imgbed.test.test/file/test.jpg\n",[577],{"type":24,"tag":80,"props":578,"children":579},{"__ignoreMap":18},[580],{"type":29,"value":575},{"type":24,"tag":25,"props":582,"children":583},{},[584],{"type":29,"value":585},"就可以返回宽度为 300 像素（只缩小不放大），图像编码为 webp 的转换后图片。",{"type":24,"tag":25,"props":587,"children":588},{},[589],{"type":29,"value":590},"参考文档：",{"type":24,"tag":25,"props":592,"children":593},{},[594],{"type":24,"tag":595,"props":596,"children":600},"a",{"href":597,"rel":598},"https://developers.cloudflare.com/images/transform-images/transform-via-url/",[599],"nofollow",[601],{"type":29,"value":602},"Transform via URL (通过 URL 转换图片参数)",{"type":24,"tag":25,"props":604,"children":605},{},[606],{"type":29,"value":607},"详细列出了 width, height, fit, gravity 等所有参数的用法。",{"type":24,"tag":31,"props":609,"children":611},{"id":610},"使用cloudlare-image的隐患",[612],{"type":29,"value":613},"使用Cloudlare image的隐患",{"type":24,"tag":25,"props":615,"children":616},{},[617],{"type":29,"value":618},"首先要明确一点：免费转换图片的额度是5000，超出了5000是要收费的。",{"type":24,"tag":42,"props":620,"children":622},{"id":621},"先澄清一个关键点很重要",[623],{"type":29,"value":624},"先澄清一个关键点（很重要）",{"type":24,"tag":626,"props":627,"children":629},"alert",{"type":628},"info",[630,639,649,654,662],{"type":24,"tag":631,"props":632,"children":633},"template",{"v-slot:title":18},[634],{"type":24,"tag":25,"props":635,"children":636},{},[637],{"type":29,"value":638},"Cloudflare的计费原则",{"type":24,"tag":25,"props":640,"children":641},{},[642,647],{"type":24,"tag":47,"props":643,"children":644},{},[645],{"type":29,"value":646},"❗ Cloudflare Image Resizing 的计费触发点",{"type":29,"value":648},"\n每一次对原图的转换请求都会计费",{"type":24,"tag":25,"props":650,"children":651},{},[652],{"type":29,"value":653},"相同参数的转换结果会被 CDN 缓存",{"type":24,"tag":25,"props":655,"children":656},{},[657],{"type":24,"tag":47,"props":658,"children":659},{},[660],{"type":29,"value":661},"但是：",{"type":24,"tag":25,"props":663,"children":664},{},[665],{"type":29,"value":666},"👉 任何人只要能访问这个 URL，都能触发一次（缓存 miss 时）",{"type":24,"tag":25,"props":668,"children":669},{},[670],{"type":29,"value":671},"也就是说以两种不同的参数请求Cloudflare image的图片转换实际上是计入两次额度。而一张图的某种固定的参数转化之后，无论被访问多少次/被多少人访问，都只记为一次额度。",{"type":24,"tag":25,"props":673,"children":674},{},[675],{"type":29,"value":676},"因此别人只要知道 URL，修改一下参数就能消耗你的额度。",{"type":24,"tag":25,"props":678,"children":679},{},[680],{"type":29,"value":681},"而Cloudflare Image Resizing / Transform 生成的图片链接，本身是“公开 URL”，默认谁都能用。",{"type":24,"tag":25,"props":683,"children":684},{},[685],{"type":24,"tag":47,"props":686,"children":687},{},[688],{"type":29,"value":689},"而且",{"type":24,"tag":25,"props":691,"children":692},{},[693],{"type":29,"value":694},"图床本身设置白名单也没有用，因为访问图床的不是用户，而是 Cloudflare。",{"type":24,"tag":25,"props":696,"children":697},{},[698],{"type":29,"value":699},"所以：",{"type":24,"tag":65,"props":701,"children":702},{},[703,708,713,718],{"type":24,"tag":69,"props":704,"children":705},{},[706],{"type":29,"value":707},"只要图床白名单里允许的是 Cloudflare IP + 你的源站",{"type":24,"tag":69,"props":709,"children":710},{},[711],{"type":29,"value":712},"那 Cloudflare 就能拉到图",{"type":24,"tag":69,"props":714,"children":715},{},[716],{"type":29,"value":717},"一旦缓存成功",{"type":24,"tag":69,"props":719,"children":720},{},[721],{"type":29,"value":722},"之后任何人访问这个链接都可以拿到缓存结果",{"type":24,"tag":25,"props":724,"children":725},{},[726],{"type":29,"value":727},"虽然很少有人会干这么缺德的事。不怕一万就怕万一，我可不希望一觉醒来收到Cloudflare的账单。",{"type":24,"tag":25,"props":729,"children":730},{},[731],{"type":29,"value":732},"因此就要设置保险。",{"type":24,"tag":31,"props":734,"children":736},{"id":735},"给我们的缩略图链接上保险",[737],{"type":29,"value":735},{"type":24,"tag":25,"props":739,"children":740},{},[741],{"type":29,"value":742},"我选择了双重保险，Worker验证以及CF安全规则。",{"type":24,"tag":31,"props":744,"children":746},{"id":745},"_1worker-验签代码在结尾",[747],{"type":29,"value":748},"1.Worker 验签（代码在结尾）",{"type":24,"tag":25,"props":750,"children":751},{},[752],{"type":29,"value":753},"设置了Worker之后，我的网站会直接向Worker发起请求，Worker收到请求之后会判断密钥是否合法，然后用服务器端的私钥 SIGNING_SECRET 重新计算一次签名再返回以确保密钥不会泄露。",{"type":24,"tag":25,"props":755,"children":756},{},[757,759,765],{"type":29,"value":758},"Worker验证结束，确保请求的密钥正常，参数正常等，就会向Cloudflare Image发起图床域名的缩略图请求。由于客户端只访问 Worker，源图域名和 ",{"type":24,"tag":80,"props":760,"children":762},{"className":761},[],[763],{"type":29,"value":764},"/file/",{"type":29,"value":766}," 结构可被隐藏或替换。",{"type":24,"tag":25,"props":768,"children":769},{},[770],{"type":29,"value":771},"原链接：",{"type":24,"tag":557,"props":773,"children":776},{"className":774,"code":775,"language":29},[560],"https://imgbed.test.test/cdn-cgi/image/fit=scale-down,width=300,format=webp/https://imgbed.test.test/file/test.jpg?sig=xxx\n",[777],{"type":24,"tag":80,"props":778,"children":779},{"__ignoreMap":18},[780],{"type":29,"value":775},{"type":24,"tag":25,"props":782,"children":783},{},[784],{"type":29,"value":785},"合法的链接应该如下：",{"type":24,"tag":557,"props":787,"children":790},{"className":788,"code":789,"language":29},[560],"https://imgworker.test.test/thumb/test.jpg\n  ?w=300\n  &q=50\n  &fmt=webp\n  &fit=scale-down\n  &exp=1700000000\n  &sig=\u003Chmac>\n",[791],{"type":24,"tag":80,"props":792,"children":793},{"__ignoreMap":18},[794],{"type":29,"value":789},{"type":24,"tag":31,"props":796,"children":798},{"id":797},"_2cloudflare-安全规则",[799],{"type":29,"value":800},"2.Cloudflare 安全规则",{"type":24,"tag":25,"props":802,"children":803},{},[804],{"type":29,"value":805},"在Cloudflare 左侧的控制台安全性/安全规则的添加以下的规则",{"type":24,"tag":557,"props":807,"children":810},{"className":808,"code":809,"language":29},[560],"(http.request.uri.path contains \"/cdn-cgi/image\")\nand not (http.request.uri.query contains \"sig=\")\nand not (http.request.uri.query contains \"exp=\")\n",[811],{"type":24,"tag":80,"props":812,"children":813},{"__ignoreMap":18},[814],{"type":29,"value":809},{"type":24,"tag":25,"props":816,"children":817},{},[818],{"type":29,"value":819},"然后选择Block(阻断)",{"type":24,"tag":25,"props":821,"children":822},{},[823],{"type":29,"value":824},"这里仅仅只做粗过滤，任何人访问 imgbed.test.test/cdn-cgi/image/xxx 都会直接收到 403 错误。",{"type":24,"tag":25,"props":826,"children":827},{},[828],{"type":29,"value":829},"注意： 这不会影响 Worker，因为 Worker 的 cf: { image } 是内部调用，不走这个路径。",{"type":24,"tag":25,"props":831,"children":832},{},[833,835],{"type":29,"value":834},"经过Worker处理+WAF安全规则之后之后，再访问原链接会出现403：\n",{"type":24,"tag":836,"props":837,"children":840},"img",{"alt":838,"src":839},"403被阻断","https://cfimg.wasd09090030.top/file/blogS/1771167323535_230713vxv11vv1a1ipdw11.webp",[],{"type":24,"tag":31,"props":842,"children":844},{"id":843},"实现效果",[845],{"type":29,"value":843},{"type":24,"tag":847,"props":848,"children":852},"image-enhanced",{":rounded":849,":shadow":849,":zoomable":849,"caption":850,"rounded":18,"shadow":18,"src":851,"zoomable":18},"true","大幅降低了延迟和图像体积","https://cfimg.wasd09090030.top/file/blogS/1771167328553_缩略图.webp",[],{"type":24,"tag":25,"props":854,"children":855},{},[856],{"type":29,"value":857},"缩略图的效果非常好。",{"type":24,"tag":25,"props":859,"children":860},{},[861],{"type":29,"value":862},"我的图像从原来的400KB-2MB，一下子瘦身到了几十KB，这极大的降低了我的带宽负担和网站加载速度。",{"type":24,"tag":31,"props":864,"children":866},{"id":865},"worker代码",[867],{"type":29,"value":868},"Worker代码",{"type":24,"tag":25,"props":870,"children":871},{},[872],{"type":29,"value":873},"仅供参考",{"type":24,"tag":557,"props":875,"children":879},{"className":876,"code":877,"language":878,"meta":18,"style":18},"language-javascript shiki shiki-themes material-theme-darker one-dark-pro","export default {\n  async fetch(request, env) {\n    const url = new URL(request.url);\n    if (!url.pathname.startsWith(\"/thumb/\")) {\n      return new Response(\"Not found\", { status: 404 });\n    }\n\n    const path = url.pathname.slice(\"/thumb/\".length);\n    const w = url.searchParams.get(\"w\");\n    const q = url.searchParams.get(\"q\");\n    const fmt = url.searchParams.get(\"fmt\");\n    const fit = url.searchParams.get(\"fit\");\n    const exp = url.searchParams.get(\"exp\");\n    const sig = url.searchParams.get(\"sig\");\n\n    if (!w || !q || !fmt || !fit || !exp || !sig) {\n      return new Response(\"Missing params\", { status: 403 });\n    }\n\n    const now = Math.floor(Date.now() / 1000);\n    if (Number(exp) \u003C now) return new Response(\"Expired\", { status: 403 });\n\n    const data = `${path}|${w}|${q}|${fmt}|${fit}|${exp}`;\n    const expected = await hmacHex(env.SIGNING_SECRET, data);\n    if (!timingSafeEqual(expected, sig)) {\n      return new Response(\"Bad signature\", { status: 403 });\n    }\n\n    const sourceUrl = `https://${env.SOURCE_HOST}/file/${path}`;\n    return fetch(sourceUrl, {\n      cf: {\n        image: {\n          fit,\n          width: Number(w),\n          quality: Number(q),\n          format: fmt\n        }\n      }\n    });\n  }\n};\n\nasync function hmacHex(secret, data) {\n  const enc = new TextEncoder();\n  const key = await crypto.subtle.importKey(\n    \"raw\",\n    enc.encode(secret),\n    { name: \"HMAC\", hash: \"SHA-256\" },\n    false,\n    [\"sign\"]\n  );\n  const sig = await crypto.subtle.sign(\"HMAC\", key, enc.encode(data));\n  return [...new Uint8Array(sig)].map(b => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nfunction timingSafeEqual(a, b) {\n  if (a.length !== b.length) return false;\n  let out = 0;\n  for (let i = 0; i \u003C a.length; i++) out |= a.charCodeAt(i) ^ b.charCodeAt(i);\n  return out === 0;\n}\n","javascript",[880],{"type":24,"tag":80,"props":881,"children":882},{"__ignoreMap":18},[883,906,952,1014,1085,1159,1168,1178,1249,1313,1375,1437,1499,1561,1623,1631,1722,1788,1796,1804,1876,1980,1988,2115,2176,2222,2287,2295,2303,2374,2404,2421,2438,2452,2486,2519,2537,2546,2555,2572,2581,2590,2598,2641,2677,2726,2748,2782,2845,2859,2886,2899,2997,3154,3163,3171,3209,3268,3295,3439,3464],{"type":24,"tag":884,"props":885,"children":888},"span",{"class":886,"line":887},"line",1,[889,895,900],{"type":24,"tag":884,"props":890,"children":892},{"style":891},"--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:inherit",[893],{"type":29,"value":894},"export",{"type":24,"tag":884,"props":896,"children":897},{"style":891},[898],{"type":29,"value":899}," default",{"type":24,"tag":884,"props":901,"children":903},{"style":902},"--shiki-default:#89DDFF;--shiki-dark:#ABB2BF",[904],{"type":29,"value":905}," {\n",{"type":24,"tag":884,"props":907,"children":909},{"class":886,"line":908},2,[910,916,922,927,933,938,943,948],{"type":24,"tag":884,"props":911,"children":913},{"style":912},"--shiki-default:#C792EA;--shiki-dark:#C678DD",[914],{"type":29,"value":915},"  async",{"type":24,"tag":884,"props":917,"children":919},{"style":918},"--shiki-default:#F07178;--shiki-dark:#61AFEF",[920],{"type":29,"value":921}," fetch",{"type":24,"tag":884,"props":923,"children":924},{"style":902},[925],{"type":29,"value":926},"(",{"type":24,"tag":884,"props":928,"children":930},{"style":929},"--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#E06C75;--shiki-dark-font-style:italic",[931],{"type":29,"value":932},"request",{"type":24,"tag":884,"props":934,"children":935},{"style":902},[936],{"type":29,"value":937},",",{"type":24,"tag":884,"props":939,"children":940},{"style":929},[941],{"type":29,"value":942}," env",{"type":24,"tag":884,"props":944,"children":945},{"style":902},[946],{"type":29,"value":947},")",{"type":24,"tag":884,"props":949,"children":950},{"style":902},[951],{"type":29,"value":905},{"type":24,"tag":884,"props":953,"children":955},{"class":886,"line":954},3,[956,961,967,973,979,985,990,994,999,1005,1009],{"type":24,"tag":884,"props":957,"children":958},{"style":912},[959],{"type":29,"value":960},"    const",{"type":24,"tag":884,"props":962,"children":964},{"style":963},"--shiki-default:#EEFFFF;--shiki-dark:#E5C07B",[965],{"type":29,"value":966}," url",{"type":24,"tag":884,"props":968,"children":970},{"style":969},"--shiki-default:#89DDFF;--shiki-dark:#56B6C2",[971],{"type":29,"value":972}," =",{"type":24,"tag":884,"props":974,"children":976},{"style":975},"--shiki-default:#89DDFF;--shiki-dark:#C678DD",[977],{"type":29,"value":978}," new",{"type":24,"tag":884,"props":980,"children":982},{"style":981},"--shiki-default:#82AAFF;--shiki-dark:#61AFEF",[983],{"type":29,"value":984}," URL",{"type":24,"tag":884,"props":986,"children":988},{"style":987},"--shiki-default:#F07178;--shiki-dark:#ABB2BF",[989],{"type":29,"value":926},{"type":24,"tag":884,"props":991,"children":992},{"style":963},[993],{"type":29,"value":932},{"type":24,"tag":884,"props":995,"children":996},{"style":902},[997],{"type":29,"value":998},".",{"type":24,"tag":884,"props":1000,"children":1002},{"style":1001},"--shiki-default:#EEFFFF;--shiki-dark:#E06C75",[1003],{"type":29,"value":1004},"url",{"type":24,"tag":884,"props":1006,"children":1007},{"style":987},[1008],{"type":29,"value":947},{"type":24,"tag":884,"props":1010,"children":1011},{"style":902},[1012],{"type":29,"value":1013},";\n",{"type":24,"tag":884,"props":1015,"children":1017},{"class":886,"line":1016},4,[1018,1023,1028,1033,1037,1041,1046,1050,1055,1059,1065,1071,1075,1080],{"type":24,"tag":884,"props":1019,"children":1020},{"style":891},[1021],{"type":29,"value":1022},"    if",{"type":24,"tag":884,"props":1024,"children":1025},{"style":987},[1026],{"type":29,"value":1027}," (",{"type":24,"tag":884,"props":1029,"children":1030},{"style":969},[1031],{"type":29,"value":1032},"!",{"type":24,"tag":884,"props":1034,"children":1035},{"style":963},[1036],{"type":29,"value":1004},{"type":24,"tag":884,"props":1038,"children":1039},{"style":902},[1040],{"type":29,"value":998},{"type":24,"tag":884,"props":1042,"children":1043},{"style":963},[1044],{"type":29,"value":1045},"pathname",{"type":24,"tag":884,"props":1047,"children":1048},{"style":902},[1049],{"type":29,"value":998},{"type":24,"tag":884,"props":1051,"children":1052},{"style":981},[1053],{"type":29,"value":1054},"startsWith",{"type":24,"tag":884,"props":1056,"children":1057},{"style":987},[1058],{"type":29,"value":926},{"type":24,"tag":884,"props":1060,"children":1062},{"style":1061},"--shiki-default:#89DDFF;--shiki-dark:#98C379",[1063],{"type":29,"value":1064},"\"",{"type":24,"tag":884,"props":1066,"children":1068},{"style":1067},"--shiki-default:#C3E88D;--shiki-dark:#98C379",[1069],{"type":29,"value":1070},"/thumb/",{"type":24,"tag":884,"props":1072,"children":1073},{"style":1061},[1074],{"type":29,"value":1064},{"type":24,"tag":884,"props":1076,"children":1077},{"style":987},[1078],{"type":29,"value":1079},")) ",{"type":24,"tag":884,"props":1081,"children":1082},{"style":902},[1083],{"type":29,"value":1084},"{\n",{"type":24,"tag":884,"props":1086,"children":1088},{"class":886,"line":1087},5,[1089,1094,1098,1103,1107,1111,1116,1120,1124,1129,1135,1140,1146,1151,1155],{"type":24,"tag":884,"props":1090,"children":1091},{"style":891},[1092],{"type":29,"value":1093},"      return",{"type":24,"tag":884,"props":1095,"children":1096},{"style":975},[1097],{"type":29,"value":978},{"type":24,"tag":884,"props":1099,"children":1100},{"style":981},[1101],{"type":29,"value":1102}," Response",{"type":24,"tag":884,"props":1104,"children":1105},{"style":987},[1106],{"type":29,"value":926},{"type":24,"tag":884,"props":1108,"children":1109},{"style":1061},[1110],{"type":29,"value":1064},{"type":24,"tag":884,"props":1112,"children":1113},{"style":1067},[1114],{"type":29,"value":1115},"Not found",{"type":24,"tag":884,"props":1117,"children":1118},{"style":1061},[1119],{"type":29,"value":1064},{"type":24,"tag":884,"props":1121,"children":1122},{"style":902},[1123],{"type":29,"value":937},{"type":24,"tag":884,"props":1125,"children":1126},{"style":902},[1127],{"type":29,"value":1128}," {",{"type":24,"tag":884,"props":1130,"children":1132},{"style":1131},"--shiki-default:#F07178;--shiki-dark:#E06C75",[1133],{"type":29,"value":1134}," status",{"type":24,"tag":884,"props":1136,"children":1137},{"style":902},[1138],{"type":29,"value":1139},":",{"type":24,"tag":884,"props":1141,"children":1143},{"style":1142},"--shiki-default:#F78C6C;--shiki-dark:#D19A66",[1144],{"type":29,"value":1145}," 404",{"type":24,"tag":884,"props":1147,"children":1148},{"style":902},[1149],{"type":29,"value":1150}," }",{"type":24,"tag":884,"props":1152,"children":1153},{"style":987},[1154],{"type":29,"value":947},{"type":24,"tag":884,"props":1156,"children":1157},{"style":902},[1158],{"type":29,"value":1013},{"type":24,"tag":884,"props":1160,"children":1162},{"class":886,"line":1161},6,[1163],{"type":24,"tag":884,"props":1164,"children":1165},{"style":902},[1166],{"type":29,"value":1167},"    }\n",{"type":24,"tag":884,"props":1169,"children":1171},{"class":886,"line":1170},7,[1172],{"type":24,"tag":884,"props":1173,"children":1175},{"emptyLinePlaceholder":1174},true,[1176],{"type":29,"value":1177},"\n",{"type":24,"tag":884,"props":1179,"children":1181},{"class":886,"line":1180},8,[1182,1186,1191,1195,1199,1203,1207,1211,1216,1220,1224,1228,1232,1236,1241,1245],{"type":24,"tag":884,"props":1183,"children":1184},{"style":912},[1185],{"type":29,"value":960},{"type":24,"tag":884,"props":1187,"children":1188},{"style":963},[1189],{"type":29,"value":1190}," path",{"type":24,"tag":884,"props":1192,"children":1193},{"style":969},[1194],{"type":29,"value":972},{"type":24,"tag":884,"props":1196,"children":1197},{"style":963},[1198],{"type":29,"value":966},{"type":24,"tag":884,"props":1200,"children":1201},{"style":902},[1202],{"type":29,"value":998},{"type":24,"tag":884,"props":1204,"children":1205},{"style":963},[1206],{"type":29,"value":1045},{"type":24,"tag":884,"props":1208,"children":1209},{"style":902},[1210],{"type":29,"value":998},{"type":24,"tag":884,"props":1212,"children":1213},{"style":981},[1214],{"type":29,"value":1215},"slice",{"type":24,"tag":884,"props":1217,"children":1218},{"style":987},[1219],{"type":29,"value":926},{"type":24,"tag":884,"props":1221,"children":1222},{"style":1061},[1223],{"type":29,"value":1064},{"type":24,"tag":884,"props":1225,"children":1226},{"style":1067},[1227],{"type":29,"value":1070},{"type":24,"tag":884,"props":1229,"children":1230},{"style":1061},[1231],{"type":29,"value":1064},{"type":24,"tag":884,"props":1233,"children":1234},{"style":902},[1235],{"type":29,"value":998},{"type":24,"tag":884,"props":1237,"children":1238},{"style":1001},[1239],{"type":29,"value":1240},"length",{"type":24,"tag":884,"props":1242,"children":1243},{"style":987},[1244],{"type":29,"value":947},{"type":24,"tag":884,"props":1246,"children":1247},{"style":902},[1248],{"type":29,"value":1013},{"type":24,"tag":884,"props":1250,"children":1252},{"class":886,"line":1251},9,[1253,1257,1262,1266,1270,1274,1279,1283,1288,1292,1296,1301,1305,1309],{"type":24,"tag":884,"props":1254,"children":1255},{"style":912},[1256],{"type":29,"value":960},{"type":24,"tag":884,"props":1258,"children":1259},{"style":963},[1260],{"type":29,"value":1261}," w",{"type":24,"tag":884,"props":1263,"children":1264},{"style":969},[1265],{"type":29,"value":972},{"type":24,"tag":884,"props":1267,"children":1268},{"style":963},[1269],{"type":29,"value":966},{"type":24,"tag":884,"props":1271,"children":1272},{"style":902},[1273],{"type":29,"value":998},{"type":24,"tag":884,"props":1275,"children":1276},{"style":963},[1277],{"type":29,"value":1278},"searchParams",{"type":24,"tag":884,"props":1280,"children":1281},{"style":902},[1282],{"type":29,"value":998},{"type":24,"tag":884,"props":1284,"children":1285},{"style":981},[1286],{"type":29,"value":1287},"get",{"type":24,"tag":884,"props":1289,"children":1290},{"style":987},[1291],{"type":29,"value":926},{"type":24,"tag":884,"props":1293,"children":1294},{"style":1061},[1295],{"type":29,"value":1064},{"type":24,"tag":884,"props":1297,"children":1298},{"style":1067},[1299],{"type":29,"value":1300},"w",{"type":24,"tag":884,"props":1302,"children":1303},{"style":1061},[1304],{"type":29,"value":1064},{"type":24,"tag":884,"props":1306,"children":1307},{"style":987},[1308],{"type":29,"value":947},{"type":24,"tag":884,"props":1310,"children":1311},{"style":902},[1312],{"type":29,"value":1013},{"type":24,"tag":884,"props":1314,"children":1316},{"class":886,"line":1315},10,[1317,1321,1326,1330,1334,1338,1342,1346,1350,1354,1358,1363,1367,1371],{"type":24,"tag":884,"props":1318,"children":1319},{"style":912},[1320],{"type":29,"value":960},{"type":24,"tag":884,"props":1322,"children":1323},{"style":963},[1324],{"type":29,"value":1325}," q",{"type":24,"tag":884,"props":1327,"children":1328},{"style":969},[1329],{"type":29,"value":972},{"type":24,"tag":884,"props":1331,"children":1332},{"style":963},[1333],{"type":29,"value":966},{"type":24,"tag":884,"props":1335,"children":1336},{"style":902},[1337],{"type":29,"value":998},{"type":24,"tag":884,"props":1339,"children":1340},{"style":963},[1341],{"type":29,"value":1278},{"type":24,"tag":884,"props":1343,"children":1344},{"style":902},[1345],{"type":29,"value":998},{"type":24,"tag":884,"props":1347,"children":1348},{"style":981},[1349],{"type":29,"value":1287},{"type":24,"tag":884,"props":1351,"children":1352},{"style":987},[1353],{"type":29,"value":926},{"type":24,"tag":884,"props":1355,"children":1356},{"style":1061},[1357],{"type":29,"value":1064},{"type":24,"tag":884,"props":1359,"children":1360},{"style":1067},[1361],{"type":29,"value":1362},"q",{"type":24,"tag":884,"props":1364,"children":1365},{"style":1061},[1366],{"type":29,"value":1064},{"type":24,"tag":884,"props":1368,"children":1369},{"style":987},[1370],{"type":29,"value":947},{"type":24,"tag":884,"props":1372,"children":1373},{"style":902},[1374],{"type":29,"value":1013},{"type":24,"tag":884,"props":1376,"children":1378},{"class":886,"line":1377},11,[1379,1383,1388,1392,1396,1400,1404,1408,1412,1416,1420,1425,1429,1433],{"type":24,"tag":884,"props":1380,"children":1381},{"style":912},[1382],{"type":29,"value":960},{"type":24,"tag":884,"props":1384,"children":1385},{"style":963},[1386],{"type":29,"value":1387}," fmt",{"type":24,"tag":884,"props":1389,"children":1390},{"style":969},[1391],{"type":29,"value":972},{"type":24,"tag":884,"props":1393,"children":1394},{"style":963},[1395],{"type":29,"value":966},{"type":24,"tag":884,"props":1397,"children":1398},{"style":902},[1399],{"type":29,"value":998},{"type":24,"tag":884,"props":1401,"children":1402},{"style":963},[1403],{"type":29,"value":1278},{"type":24,"tag":884,"props":1405,"children":1406},{"style":902},[1407],{"type":29,"value":998},{"type":24,"tag":884,"props":1409,"children":1410},{"style":981},[1411],{"type":29,"value":1287},{"type":24,"tag":884,"props":1413,"children":1414},{"style":987},[1415],{"type":29,"value":926},{"type":24,"tag":884,"props":1417,"children":1418},{"style":1061},[1419],{"type":29,"value":1064},{"type":24,"tag":884,"props":1421,"children":1422},{"style":1067},[1423],{"type":29,"value":1424},"fmt",{"type":24,"tag":884,"props":1426,"children":1427},{"style":1061},[1428],{"type":29,"value":1064},{"type":24,"tag":884,"props":1430,"children":1431},{"style":987},[1432],{"type":29,"value":947},{"type":24,"tag":884,"props":1434,"children":1435},{"style":902},[1436],{"type":29,"value":1013},{"type":24,"tag":884,"props":1438,"children":1440},{"class":886,"line":1439},12,[1441,1445,1450,1454,1458,1462,1466,1470,1474,1478,1482,1487,1491,1495],{"type":24,"tag":884,"props":1442,"children":1443},{"style":912},[1444],{"type":29,"value":960},{"type":24,"tag":884,"props":1446,"children":1447},{"style":963},[1448],{"type":29,"value":1449}," fit",{"type":24,"tag":884,"props":1451,"children":1452},{"style":969},[1453],{"type":29,"value":972},{"type":24,"tag":884,"props":1455,"children":1456},{"style":963},[1457],{"type":29,"value":966},{"type":24,"tag":884,"props":1459,"children":1460},{"style":902},[1461],{"type":29,"value":998},{"type":24,"tag":884,"props":1463,"children":1464},{"style":963},[1465],{"type":29,"value":1278},{"type":24,"tag":884,"props":1467,"children":1468},{"style":902},[1469],{"type":29,"value":998},{"type":24,"tag":884,"props":1471,"children":1472},{"style":981},[1473],{"type":29,"value":1287},{"type":24,"tag":884,"props":1475,"children":1476},{"style":987},[1477],{"type":29,"value":926},{"type":24,"tag":884,"props":1479,"children":1480},{"style":1061},[1481],{"type":29,"value":1064},{"type":24,"tag":884,"props":1483,"children":1484},{"style":1067},[1485],{"type":29,"value":1486},"fit",{"type":24,"tag":884,"props":1488,"children":1489},{"style":1061},[1490],{"type":29,"value":1064},{"type":24,"tag":884,"props":1492,"children":1493},{"style":987},[1494],{"type":29,"value":947},{"type":24,"tag":884,"props":1496,"children":1497},{"style":902},[1498],{"type":29,"value":1013},{"type":24,"tag":884,"props":1500,"children":1502},{"class":886,"line":1501},13,[1503,1507,1512,1516,1520,1524,1528,1532,1536,1540,1544,1549,1553,1557],{"type":24,"tag":884,"props":1504,"children":1505},{"style":912},[1506],{"type":29,"value":960},{"type":24,"tag":884,"props":1508,"children":1509},{"style":963},[1510],{"type":29,"value":1511}," exp",{"type":24,"tag":884,"props":1513,"children":1514},{"style":969},[1515],{"type":29,"value":972},{"type":24,"tag":884,"props":1517,"children":1518},{"style":963},[1519],{"type":29,"value":966},{"type":24,"tag":884,"props":1521,"children":1522},{"style":902},[1523],{"type":29,"value":998},{"type":24,"tag":884,"props":1525,"children":1526},{"style":963},[1527],{"type":29,"value":1278},{"type":24,"tag":884,"props":1529,"children":1530},{"style":902},[1531],{"type":29,"value":998},{"type":24,"tag":884,"props":1533,"children":1534},{"style":981},[1535],{"type":29,"value":1287},{"type":24,"tag":884,"props":1537,"children":1538},{"style":987},[1539],{"type":29,"value":926},{"type":24,"tag":884,"props":1541,"children":1542},{"style":1061},[1543],{"type":29,"value":1064},{"type":24,"tag":884,"props":1545,"children":1546},{"style":1067},[1547],{"type":29,"value":1548},"exp",{"type":24,"tag":884,"props":1550,"children":1551},{"style":1061},[1552],{"type":29,"value":1064},{"type":24,"tag":884,"props":1554,"children":1555},{"style":987},[1556],{"type":29,"value":947},{"type":24,"tag":884,"props":1558,"children":1559},{"style":902},[1560],{"type":29,"value":1013},{"type":24,"tag":884,"props":1562,"children":1564},{"class":886,"line":1563},14,[1565,1569,1574,1578,1582,1586,1590,1594,1598,1602,1606,1611,1615,1619],{"type":24,"tag":884,"props":1566,"children":1567},{"style":912},[1568],{"type":29,"value":960},{"type":24,"tag":884,"props":1570,"children":1571},{"style":963},[1572],{"type":29,"value":1573}," sig",{"type":24,"tag":884,"props":1575,"children":1576},{"style":969},[1577],{"type":29,"value":972},{"type":24,"tag":884,"props":1579,"children":1580},{"style":963},[1581],{"type":29,"value":966},{"type":24,"tag":884,"props":1583,"children":1584},{"style":902},[1585],{"type":29,"value":998},{"type":24,"tag":884,"props":1587,"children":1588},{"style":963},[1589],{"type":29,"value":1278},{"type":24,"tag":884,"props":1591,"children":1592},{"style":902},[1593],{"type":29,"value":998},{"type":24,"tag":884,"props":1595,"children":1596},{"style":981},[1597],{"type":29,"value":1287},{"type":24,"tag":884,"props":1599,"children":1600},{"style":987},[1601],{"type":29,"value":926},{"type":24,"tag":884,"props":1603,"children":1604},{"style":1061},[1605],{"type":29,"value":1064},{"type":24,"tag":884,"props":1607,"children":1608},{"style":1067},[1609],{"type":29,"value":1610},"sig",{"type":24,"tag":884,"props":1612,"children":1613},{"style":1061},[1614],{"type":29,"value":1064},{"type":24,"tag":884,"props":1616,"children":1617},{"style":987},[1618],{"type":29,"value":947},{"type":24,"tag":884,"props":1620,"children":1621},{"style":902},[1622],{"type":29,"value":1013},{"type":24,"tag":884,"props":1624,"children":1626},{"class":886,"line":1625},15,[1627],{"type":24,"tag":884,"props":1628,"children":1629},{"emptyLinePlaceholder":1174},[1630],{"type":29,"value":1177},{"type":24,"tag":884,"props":1632,"children":1634},{"class":886,"line":1633},16,[1635,1639,1643,1647,1651,1656,1661,1665,1669,1673,1677,1681,1685,1689,1693,1697,1701,1705,1709,1713,1718],{"type":24,"tag":884,"props":1636,"children":1637},{"style":891},[1638],{"type":29,"value":1022},{"type":24,"tag":884,"props":1640,"children":1641},{"style":987},[1642],{"type":29,"value":1027},{"type":24,"tag":884,"props":1644,"children":1645},{"style":969},[1646],{"type":29,"value":1032},{"type":24,"tag":884,"props":1648,"children":1649},{"style":1001},[1650],{"type":29,"value":1300},{"type":24,"tag":884,"props":1652,"children":1653},{"style":969},[1654],{"type":29,"value":1655}," ||",{"type":24,"tag":884,"props":1657,"children":1658},{"style":969},[1659],{"type":29,"value":1660}," !",{"type":24,"tag":884,"props":1662,"children":1663},{"style":1001},[1664],{"type":29,"value":1362},{"type":24,"tag":884,"props":1666,"children":1667},{"style":969},[1668],{"type":29,"value":1655},{"type":24,"tag":884,"props":1670,"children":1671},{"style":969},[1672],{"type":29,"value":1660},{"type":24,"tag":884,"props":1674,"children":1675},{"style":1001},[1676],{"type":29,"value":1424},{"type":24,"tag":884,"props":1678,"children":1679},{"style":969},[1680],{"type":29,"value":1655},{"type":24,"tag":884,"props":1682,"children":1683},{"style":969},[1684],{"type":29,"value":1660},{"type":24,"tag":884,"props":1686,"children":1687},{"style":1001},[1688],{"type":29,"value":1486},{"type":24,"tag":884,"props":1690,"children":1691},{"style":969},[1692],{"type":29,"value":1655},{"type":24,"tag":884,"props":1694,"children":1695},{"style":969},[1696],{"type":29,"value":1660},{"type":24,"tag":884,"props":1698,"children":1699},{"style":1001},[1700],{"type":29,"value":1548},{"type":24,"tag":884,"props":1702,"children":1703},{"style":969},[1704],{"type":29,"value":1655},{"type":24,"tag":884,"props":1706,"children":1707},{"style":969},[1708],{"type":29,"value":1660},{"type":24,"tag":884,"props":1710,"children":1711},{"style":1001},[1712],{"type":29,"value":1610},{"type":24,"tag":884,"props":1714,"children":1715},{"style":987},[1716],{"type":29,"value":1717},") ",{"type":24,"tag":884,"props":1719,"children":1720},{"style":902},[1721],{"type":29,"value":1084},{"type":24,"tag":884,"props":1723,"children":1725},{"class":886,"line":1724},17,[1726,1730,1734,1738,1742,1746,1751,1755,1759,1763,1767,1771,1776,1780,1784],{"type":24,"tag":884,"props":1727,"children":1728},{"style":891},[1729],{"type":29,"value":1093},{"type":24,"tag":884,"props":1731,"children":1732},{"style":975},[1733],{"type":29,"value":978},{"type":24,"tag":884,"props":1735,"children":1736},{"style":981},[1737],{"type":29,"value":1102},{"type":24,"tag":884,"props":1739,"children":1740},{"style":987},[1741],{"type":29,"value":926},{"type":24,"tag":884,"props":1743,"children":1744},{"style":1061},[1745],{"type":29,"value":1064},{"type":24,"tag":884,"props":1747,"children":1748},{"style":1067},[1749],{"type":29,"value":1750},"Missing params",{"type":24,"tag":884,"props":1752,"children":1753},{"style":1061},[1754],{"type":29,"value":1064},{"type":24,"tag":884,"props":1756,"children":1757},{"style":902},[1758],{"type":29,"value":937},{"type":24,"tag":884,"props":1760,"children":1761},{"style":902},[1762],{"type":29,"value":1128},{"type":24,"tag":884,"props":1764,"children":1765},{"style":1131},[1766],{"type":29,"value":1134},{"type":24,"tag":884,"props":1768,"children":1769},{"style":902},[1770],{"type":29,"value":1139},{"type":24,"tag":884,"props":1772,"children":1773},{"style":1142},[1774],{"type":29,"value":1775}," 403",{"type":24,"tag":884,"props":1777,"children":1778},{"style":902},[1779],{"type":29,"value":1150},{"type":24,"tag":884,"props":1781,"children":1782},{"style":987},[1783],{"type":29,"value":947},{"type":24,"tag":884,"props":1785,"children":1786},{"style":902},[1787],{"type":29,"value":1013},{"type":24,"tag":884,"props":1789,"children":1791},{"class":886,"line":1790},18,[1792],{"type":24,"tag":884,"props":1793,"children":1794},{"style":902},[1795],{"type":29,"value":1167},{"type":24,"tag":884,"props":1797,"children":1799},{"class":886,"line":1798},19,[1800],{"type":24,"tag":884,"props":1801,"children":1802},{"emptyLinePlaceholder":1174},[1803],{"type":29,"value":1177},{"type":24,"tag":884,"props":1805,"children":1807},{"class":886,"line":1806},20,[1808,1812,1817,1821,1826,1830,1835,1839,1844,1848,1853,1858,1863,1868,1872],{"type":24,"tag":884,"props":1809,"children":1810},{"style":912},[1811],{"type":29,"value":960},{"type":24,"tag":884,"props":1813,"children":1814},{"style":963},[1815],{"type":29,"value":1816}," now",{"type":24,"tag":884,"props":1818,"children":1819},{"style":969},[1820],{"type":29,"value":972},{"type":24,"tag":884,"props":1822,"children":1823},{"style":963},[1824],{"type":29,"value":1825}," Math",{"type":24,"tag":884,"props":1827,"children":1828},{"style":902},[1829],{"type":29,"value":998},{"type":24,"tag":884,"props":1831,"children":1832},{"style":981},[1833],{"type":29,"value":1834},"floor",{"type":24,"tag":884,"props":1836,"children":1837},{"style":987},[1838],{"type":29,"value":926},{"type":24,"tag":884,"props":1840,"children":1841},{"style":963},[1842],{"type":29,"value":1843},"Date",{"type":24,"tag":884,"props":1845,"children":1846},{"style":902},[1847],{"type":29,"value":998},{"type":24,"tag":884,"props":1849,"children":1850},{"style":981},[1851],{"type":29,"value":1852},"now",{"type":24,"tag":884,"props":1854,"children":1855},{"style":987},[1856],{"type":29,"value":1857},"() ",{"type":24,"tag":884,"props":1859,"children":1860},{"style":969},[1861],{"type":29,"value":1862},"/",{"type":24,"tag":884,"props":1864,"children":1865},{"style":1142},[1866],{"type":29,"value":1867}," 1000",{"type":24,"tag":884,"props":1869,"children":1870},{"style":987},[1871],{"type":29,"value":947},{"type":24,"tag":884,"props":1873,"children":1874},{"style":902},[1875],{"type":29,"value":1013},{"type":24,"tag":884,"props":1877,"children":1879},{"class":886,"line":1878},21,[1880,1884,1888,1893,1897,1901,1905,1910,1914,1918,1923,1927,1931,1935,1939,1944,1948,1952,1956,1960,1964,1968,1972,1976],{"type":24,"tag":884,"props":1881,"children":1882},{"style":891},[1883],{"type":29,"value":1022},{"type":24,"tag":884,"props":1885,"children":1886},{"style":987},[1887],{"type":29,"value":1027},{"type":24,"tag":884,"props":1889,"children":1890},{"style":981},[1891],{"type":29,"value":1892},"Number",{"type":24,"tag":884,"props":1894,"children":1895},{"style":987},[1896],{"type":29,"value":926},{"type":24,"tag":884,"props":1898,"children":1899},{"style":1001},[1900],{"type":29,"value":1548},{"type":24,"tag":884,"props":1902,"children":1903},{"style":987},[1904],{"type":29,"value":1717},{"type":24,"tag":884,"props":1906,"children":1907},{"style":969},[1908],{"type":29,"value":1909},"\u003C",{"type":24,"tag":884,"props":1911,"children":1912},{"style":1001},[1913],{"type":29,"value":1816},{"type":24,"tag":884,"props":1915,"children":1916},{"style":987},[1917],{"type":29,"value":1717},{"type":24,"tag":884,"props":1919,"children":1920},{"style":891},[1921],{"type":29,"value":1922},"return",{"type":24,"tag":884,"props":1924,"children":1925},{"style":975},[1926],{"type":29,"value":978},{"type":24,"tag":884,"props":1928,"children":1929},{"style":981},[1930],{"type":29,"value":1102},{"type":24,"tag":884,"props":1932,"children":1933},{"style":987},[1934],{"type":29,"value":926},{"type":24,"tag":884,"props":1936,"children":1937},{"style":1061},[1938],{"type":29,"value":1064},{"type":24,"tag":884,"props":1940,"children":1941},{"style":1067},[1942],{"type":29,"value":1943},"Expired",{"type":24,"tag":884,"props":1945,"children":1946},{"style":1061},[1947],{"type":29,"value":1064},{"type":24,"tag":884,"props":1949,"children":1950},{"style":902},[1951],{"type":29,"value":937},{"type":24,"tag":884,"props":1953,"children":1954},{"style":902},[1955],{"type":29,"value":1128},{"type":24,"tag":884,"props":1957,"children":1958},{"style":1131},[1959],{"type":29,"value":1134},{"type":24,"tag":884,"props":1961,"children":1962},{"style":902},[1963],{"type":29,"value":1139},{"type":24,"tag":884,"props":1965,"children":1966},{"style":1142},[1967],{"type":29,"value":1775},{"type":24,"tag":884,"props":1969,"children":1970},{"style":902},[1971],{"type":29,"value":1150},{"type":24,"tag":884,"props":1973,"children":1974},{"style":987},[1975],{"type":29,"value":947},{"type":24,"tag":884,"props":1977,"children":1978},{"style":902},[1979],{"type":29,"value":1013},{"type":24,"tag":884,"props":1981,"children":1983},{"class":886,"line":1982},22,[1984],{"type":24,"tag":884,"props":1985,"children":1986},{"emptyLinePlaceholder":1174},[1987],{"type":29,"value":1177},{"type":24,"tag":884,"props":1989,"children":1991},{"class":886,"line":1990},23,[1992,1996,2001,2005,2010,2015,2020,2025,2030,2034,2038,2042,2046,2050,2054,2058,2062,2066,2070,2074,2078,2082,2086,2090,2094,2098,2102,2106,2111],{"type":24,"tag":884,"props":1993,"children":1994},{"style":912},[1995],{"type":29,"value":960},{"type":24,"tag":884,"props":1997,"children":1998},{"style":963},[1999],{"type":29,"value":2000}," data",{"type":24,"tag":884,"props":2002,"children":2003},{"style":969},[2004],{"type":29,"value":972},{"type":24,"tag":884,"props":2006,"children":2007},{"style":1061},[2008],{"type":29,"value":2009}," `",{"type":24,"tag":884,"props":2011,"children":2012},{"style":975},[2013],{"type":29,"value":2014},"${",{"type":24,"tag":884,"props":2016,"children":2017},{"style":1001},[2018],{"type":29,"value":2019},"path",{"type":24,"tag":884,"props":2021,"children":2022},{"style":975},[2023],{"type":29,"value":2024},"}",{"type":24,"tag":884,"props":2026,"children":2027},{"style":1067},[2028],{"type":29,"value":2029},"|",{"type":24,"tag":884,"props":2031,"children":2032},{"style":975},[2033],{"type":29,"value":2014},{"type":24,"tag":884,"props":2035,"children":2036},{"style":1001},[2037],{"type":29,"value":1300},{"type":24,"tag":884,"props":2039,"children":2040},{"style":975},[2041],{"type":29,"value":2024},{"type":24,"tag":884,"props":2043,"children":2044},{"style":1067},[2045],{"type":29,"value":2029},{"type":24,"tag":884,"props":2047,"children":2048},{"style":975},[2049],{"type":29,"value":2014},{"type":24,"tag":884,"props":2051,"children":2052},{"style":1001},[2053],{"type":29,"value":1362},{"type":24,"tag":884,"props":2055,"children":2056},{"style":975},[2057],{"type":29,"value":2024},{"type":24,"tag":884,"props":2059,"children":2060},{"style":1067},[2061],{"type":29,"value":2029},{"type":24,"tag":884,"props":2063,"children":2064},{"style":975},[2065],{"type":29,"value":2014},{"type":24,"tag":884,"props":2067,"children":2068},{"style":1001},[2069],{"type":29,"value":1424},{"type":24,"tag":884,"props":2071,"children":2072},{"style":975},[2073],{"type":29,"value":2024},{"type":24,"tag":884,"props":2075,"children":2076},{"style":1067},[2077],{"type":29,"value":2029},{"type":24,"tag":884,"props":2079,"children":2080},{"style":975},[2081],{"type":29,"value":2014},{"type":24,"tag":884,"props":2083,"children":2084},{"style":1001},[2085],{"type":29,"value":1486},{"type":24,"tag":884,"props":2087,"children":2088},{"style":975},[2089],{"type":29,"value":2024},{"type":24,"tag":884,"props":2091,"children":2092},{"style":1067},[2093],{"type":29,"value":2029},{"type":24,"tag":884,"props":2095,"children":2096},{"style":975},[2097],{"type":29,"value":2014},{"type":24,"tag":884,"props":2099,"children":2100},{"style":1001},[2101],{"type":29,"value":1548},{"type":24,"tag":884,"props":2103,"children":2104},{"style":975},[2105],{"type":29,"value":2024},{"type":24,"tag":884,"props":2107,"children":2108},{"style":1061},[2109],{"type":29,"value":2110},"`",{"type":24,"tag":884,"props":2112,"children":2113},{"style":902},[2114],{"type":29,"value":1013},{"type":24,"tag":884,"props":2116,"children":2118},{"class":886,"line":2117},24,[2119,2123,2128,2132,2137,2142,2146,2151,2155,2160,2164,2168,2172],{"type":24,"tag":884,"props":2120,"children":2121},{"style":912},[2122],{"type":29,"value":960},{"type":24,"tag":884,"props":2124,"children":2125},{"style":963},[2126],{"type":29,"value":2127}," expected",{"type":24,"tag":884,"props":2129,"children":2130},{"style":969},[2131],{"type":29,"value":972},{"type":24,"tag":884,"props":2133,"children":2134},{"style":891},[2135],{"type":29,"value":2136}," await",{"type":24,"tag":884,"props":2138,"children":2139},{"style":981},[2140],{"type":29,"value":2141}," hmacHex",{"type":24,"tag":884,"props":2143,"children":2144},{"style":987},[2145],{"type":29,"value":926},{"type":24,"tag":884,"props":2147,"children":2148},{"style":963},[2149],{"type":29,"value":2150},"env",{"type":24,"tag":884,"props":2152,"children":2153},{"style":902},[2154],{"type":29,"value":998},{"type":24,"tag":884,"props":2156,"children":2157},{"style":1001},[2158],{"type":29,"value":2159},"SIGNING_SECRET",{"type":24,"tag":884,"props":2161,"children":2162},{"style":902},[2163],{"type":29,"value":937},{"type":24,"tag":884,"props":2165,"children":2166},{"style":1001},[2167],{"type":29,"value":2000},{"type":24,"tag":884,"props":2169,"children":2170},{"style":987},[2171],{"type":29,"value":947},{"type":24,"tag":884,"props":2173,"children":2174},{"style":902},[2175],{"type":29,"value":1013},{"type":24,"tag":884,"props":2177,"children":2179},{"class":886,"line":2178},25,[2180,2184,2188,2192,2197,2201,2206,2210,2214,2218],{"type":24,"tag":884,"props":2181,"children":2182},{"style":891},[2183],{"type":29,"value":1022},{"type":24,"tag":884,"props":2185,"children":2186},{"style":987},[2187],{"type":29,"value":1027},{"type":24,"tag":884,"props":2189,"children":2190},{"style":969},[2191],{"type":29,"value":1032},{"type":24,"tag":884,"props":2193,"children":2194},{"style":981},[2195],{"type":29,"value":2196},"timingSafeEqual",{"type":24,"tag":884,"props":2198,"children":2199},{"style":987},[2200],{"type":29,"value":926},{"type":24,"tag":884,"props":2202,"children":2203},{"style":1001},[2204],{"type":29,"value":2205},"expected",{"type":24,"tag":884,"props":2207,"children":2208},{"style":902},[2209],{"type":29,"value":937},{"type":24,"tag":884,"props":2211,"children":2212},{"style":1001},[2213],{"type":29,"value":1573},{"type":24,"tag":884,"props":2215,"children":2216},{"style":987},[2217],{"type":29,"value":1079},{"type":24,"tag":884,"props":2219,"children":2220},{"style":902},[2221],{"type":29,"value":1084},{"type":24,"tag":884,"props":2223,"children":2225},{"class":886,"line":2224},26,[2226,2230,2234,2238,2242,2246,2251,2255,2259,2263,2267,2271,2275,2279,2283],{"type":24,"tag":884,"props":2227,"children":2228},{"style":891},[2229],{"type":29,"value":1093},{"type":24,"tag":884,"props":2231,"children":2232},{"style":975},[2233],{"type":29,"value":978},{"type":24,"tag":884,"props":2235,"children":2236},{"style":981},[2237],{"type":29,"value":1102},{"type":24,"tag":884,"props":2239,"children":2240},{"style":987},[2241],{"type":29,"value":926},{"type":24,"tag":884,"props":2243,"children":2244},{"style":1061},[2245],{"type":29,"value":1064},{"type":24,"tag":884,"props":2247,"children":2248},{"style":1067},[2249],{"type":29,"value":2250},"Bad signature",{"type":24,"tag":884,"props":2252,"children":2253},{"style":1061},[2254],{"type":29,"value":1064},{"type":24,"tag":884,"props":2256,"children":2257},{"style":902},[2258],{"type":29,"value":937},{"type":24,"tag":884,"props":2260,"children":2261},{"style":902},[2262],{"type":29,"value":1128},{"type":24,"tag":884,"props":2264,"children":2265},{"style":1131},[2266],{"type":29,"value":1134},{"type":24,"tag":884,"props":2268,"children":2269},{"style":902},[2270],{"type":29,"value":1139},{"type":24,"tag":884,"props":2272,"children":2273},{"style":1142},[2274],{"type":29,"value":1775},{"type":24,"tag":884,"props":2276,"children":2277},{"style":902},[2278],{"type":29,"value":1150},{"type":24,"tag":884,"props":2280,"children":2281},{"style":987},[2282],{"type":29,"value":947},{"type":24,"tag":884,"props":2284,"children":2285},{"style":902},[2286],{"type":29,"value":1013},{"type":24,"tag":884,"props":2288,"children":2290},{"class":886,"line":2289},27,[2291],{"type":24,"tag":884,"props":2292,"children":2293},{"style":902},[2294],{"type":29,"value":1167},{"type":24,"tag":884,"props":2296,"children":2298},{"class":886,"line":2297},28,[2299],{"type":24,"tag":884,"props":2300,"children":2301},{"emptyLinePlaceholder":1174},[2302],{"type":29,"value":1177},{"type":24,"tag":884,"props":2304,"children":2306},{"class":886,"line":2305},29,[2307,2311,2316,2320,2324,2329,2333,2337,2341,2346,2350,2354,2358,2362,2366,2370],{"type":24,"tag":884,"props":2308,"children":2309},{"style":912},[2310],{"type":29,"value":960},{"type":24,"tag":884,"props":2312,"children":2313},{"style":963},[2314],{"type":29,"value":2315}," sourceUrl",{"type":24,"tag":884,"props":2317,"children":2318},{"style":969},[2319],{"type":29,"value":972},{"type":24,"tag":884,"props":2321,"children":2322},{"style":1061},[2323],{"type":29,"value":2009},{"type":24,"tag":884,"props":2325,"children":2326},{"style":1067},[2327],{"type":29,"value":2328},"https://",{"type":24,"tag":884,"props":2330,"children":2331},{"style":975},[2332],{"type":29,"value":2014},{"type":24,"tag":884,"props":2334,"children":2335},{"style":963},[2336],{"type":29,"value":2150},{"type":24,"tag":884,"props":2338,"children":2339},{"style":902},[2340],{"type":29,"value":998},{"type":24,"tag":884,"props":2342,"children":2343},{"style":1001},[2344],{"type":29,"value":2345},"SOURCE_HOST",{"type":24,"tag":884,"props":2347,"children":2348},{"style":975},[2349],{"type":29,"value":2024},{"type":24,"tag":884,"props":2351,"children":2352},{"style":1067},[2353],{"type":29,"value":764},{"type":24,"tag":884,"props":2355,"children":2356},{"style":975},[2357],{"type":29,"value":2014},{"type":24,"tag":884,"props":2359,"children":2360},{"style":1001},[2361],{"type":29,"value":2019},{"type":24,"tag":884,"props":2363,"children":2364},{"style":975},[2365],{"type":29,"value":2024},{"type":24,"tag":884,"props":2367,"children":2368},{"style":1061},[2369],{"type":29,"value":2110},{"type":24,"tag":884,"props":2371,"children":2372},{"style":902},[2373],{"type":29,"value":1013},{"type":24,"tag":884,"props":2375,"children":2377},{"class":886,"line":2376},30,[2378,2383,2387,2391,2396,2400],{"type":24,"tag":884,"props":2379,"children":2380},{"style":891},[2381],{"type":29,"value":2382},"    return",{"type":24,"tag":884,"props":2384,"children":2385},{"style":981},[2386],{"type":29,"value":921},{"type":24,"tag":884,"props":2388,"children":2389},{"style":987},[2390],{"type":29,"value":926},{"type":24,"tag":884,"props":2392,"children":2393},{"style":1001},[2394],{"type":29,"value":2395},"sourceUrl",{"type":24,"tag":884,"props":2397,"children":2398},{"style":902},[2399],{"type":29,"value":937},{"type":24,"tag":884,"props":2401,"children":2402},{"style":902},[2403],{"type":29,"value":905},{"type":24,"tag":884,"props":2405,"children":2407},{"class":886,"line":2406},31,[2408,2413,2417],{"type":24,"tag":884,"props":2409,"children":2410},{"style":1131},[2411],{"type":29,"value":2412},"      cf",{"type":24,"tag":884,"props":2414,"children":2415},{"style":902},[2416],{"type":29,"value":1139},{"type":24,"tag":884,"props":2418,"children":2419},{"style":902},[2420],{"type":29,"value":905},{"type":24,"tag":884,"props":2422,"children":2424},{"class":886,"line":2423},32,[2425,2430,2434],{"type":24,"tag":884,"props":2426,"children":2427},{"style":1131},[2428],{"type":29,"value":2429},"        image",{"type":24,"tag":884,"props":2431,"children":2432},{"style":902},[2433],{"type":29,"value":1139},{"type":24,"tag":884,"props":2435,"children":2436},{"style":902},[2437],{"type":29,"value":905},{"type":24,"tag":884,"props":2439,"children":2441},{"class":886,"line":2440},33,[2442,2447],{"type":24,"tag":884,"props":2443,"children":2444},{"style":1001},[2445],{"type":29,"value":2446},"          fit",{"type":24,"tag":884,"props":2448,"children":2449},{"style":902},[2450],{"type":29,"value":2451},",\n",{"type":24,"tag":884,"props":2453,"children":2455},{"class":886,"line":2454},34,[2456,2461,2465,2470,2474,2478,2482],{"type":24,"tag":884,"props":2457,"children":2458},{"style":1131},[2459],{"type":29,"value":2460},"          width",{"type":24,"tag":884,"props":2462,"children":2463},{"style":902},[2464],{"type":29,"value":1139},{"type":24,"tag":884,"props":2466,"children":2467},{"style":981},[2468],{"type":29,"value":2469}," Number",{"type":24,"tag":884,"props":2471,"children":2472},{"style":987},[2473],{"type":29,"value":926},{"type":24,"tag":884,"props":2475,"children":2476},{"style":1001},[2477],{"type":29,"value":1300},{"type":24,"tag":884,"props":2479,"children":2480},{"style":987},[2481],{"type":29,"value":947},{"type":24,"tag":884,"props":2483,"children":2484},{"style":902},[2485],{"type":29,"value":2451},{"type":24,"tag":884,"props":2487,"children":2489},{"class":886,"line":2488},35,[2490,2495,2499,2503,2507,2511,2515],{"type":24,"tag":884,"props":2491,"children":2492},{"style":1131},[2493],{"type":29,"value":2494},"          quality",{"type":24,"tag":884,"props":2496,"children":2497},{"style":902},[2498],{"type":29,"value":1139},{"type":24,"tag":884,"props":2500,"children":2501},{"style":981},[2502],{"type":29,"value":2469},{"type":24,"tag":884,"props":2504,"children":2505},{"style":987},[2506],{"type":29,"value":926},{"type":24,"tag":884,"props":2508,"children":2509},{"style":1001},[2510],{"type":29,"value":1362},{"type":24,"tag":884,"props":2512,"children":2513},{"style":987},[2514],{"type":29,"value":947},{"type":24,"tag":884,"props":2516,"children":2517},{"style":902},[2518],{"type":29,"value":2451},{"type":24,"tag":884,"props":2520,"children":2522},{"class":886,"line":2521},36,[2523,2528,2532],{"type":24,"tag":884,"props":2524,"children":2525},{"style":1131},[2526],{"type":29,"value":2527},"          format",{"type":24,"tag":884,"props":2529,"children":2530},{"style":902},[2531],{"type":29,"value":1139},{"type":24,"tag":884,"props":2533,"children":2534},{"style":1001},[2535],{"type":29,"value":2536}," fmt\n",{"type":24,"tag":884,"props":2538,"children":2540},{"class":886,"line":2539},37,[2541],{"type":24,"tag":884,"props":2542,"children":2543},{"style":902},[2544],{"type":29,"value":2545},"        }\n",{"type":24,"tag":884,"props":2547,"children":2549},{"class":886,"line":2548},38,[2550],{"type":24,"tag":884,"props":2551,"children":2552},{"style":902},[2553],{"type":29,"value":2554},"      }\n",{"type":24,"tag":884,"props":2556,"children":2558},{"class":886,"line":2557},39,[2559,2564,2568],{"type":24,"tag":884,"props":2560,"children":2561},{"style":902},[2562],{"type":29,"value":2563},"    }",{"type":24,"tag":884,"props":2565,"children":2566},{"style":987},[2567],{"type":29,"value":947},{"type":24,"tag":884,"props":2569,"children":2570},{"style":902},[2571],{"type":29,"value":1013},{"type":24,"tag":884,"props":2573,"children":2575},{"class":886,"line":2574},40,[2576],{"type":24,"tag":884,"props":2577,"children":2578},{"style":902},[2579],{"type":29,"value":2580},"  }\n",{"type":24,"tag":884,"props":2582,"children":2584},{"class":886,"line":2583},41,[2585],{"type":24,"tag":884,"props":2586,"children":2587},{"style":902},[2588],{"type":29,"value":2589},"};\n",{"type":24,"tag":884,"props":2591,"children":2593},{"class":886,"line":2592},42,[2594],{"type":24,"tag":884,"props":2595,"children":2596},{"emptyLinePlaceholder":1174},[2597],{"type":29,"value":1177},{"type":24,"tag":884,"props":2599,"children":2601},{"class":886,"line":2600},43,[2602,2607,2612,2616,2620,2625,2629,2633,2637],{"type":24,"tag":884,"props":2603,"children":2604},{"style":912},[2605],{"type":29,"value":2606},"async",{"type":24,"tag":884,"props":2608,"children":2609},{"style":912},[2610],{"type":29,"value":2611}," function",{"type":24,"tag":884,"props":2613,"children":2614},{"style":981},[2615],{"type":29,"value":2141},{"type":24,"tag":884,"props":2617,"children":2618},{"style":902},[2619],{"type":29,"value":926},{"type":24,"tag":884,"props":2621,"children":2622},{"style":929},[2623],{"type":29,"value":2624},"secret",{"type":24,"tag":884,"props":2626,"children":2627},{"style":902},[2628],{"type":29,"value":937},{"type":24,"tag":884,"props":2630,"children":2631},{"style":929},[2632],{"type":29,"value":2000},{"type":24,"tag":884,"props":2634,"children":2635},{"style":902},[2636],{"type":29,"value":947},{"type":24,"tag":884,"props":2638,"children":2639},{"style":902},[2640],{"type":29,"value":905},{"type":24,"tag":884,"props":2642,"children":2644},{"class":886,"line":2643},44,[2645,2650,2655,2659,2663,2668,2673],{"type":24,"tag":884,"props":2646,"children":2647},{"style":912},[2648],{"type":29,"value":2649},"  const",{"type":24,"tag":884,"props":2651,"children":2652},{"style":963},[2653],{"type":29,"value":2654}," enc",{"type":24,"tag":884,"props":2656,"children":2657},{"style":969},[2658],{"type":29,"value":972},{"type":24,"tag":884,"props":2660,"children":2661},{"style":975},[2662],{"type":29,"value":978},{"type":24,"tag":884,"props":2664,"children":2665},{"style":981},[2666],{"type":29,"value":2667}," TextEncoder",{"type":24,"tag":884,"props":2669,"children":2670},{"style":987},[2671],{"type":29,"value":2672},"()",{"type":24,"tag":884,"props":2674,"children":2675},{"style":902},[2676],{"type":29,"value":1013},{"type":24,"tag":884,"props":2678,"children":2680},{"class":886,"line":2679},45,[2681,2685,2690,2694,2698,2703,2707,2712,2716,2721],{"type":24,"tag":884,"props":2682,"children":2683},{"style":912},[2684],{"type":29,"value":2649},{"type":24,"tag":884,"props":2686,"children":2687},{"style":963},[2688],{"type":29,"value":2689}," key",{"type":24,"tag":884,"props":2691,"children":2692},{"style":969},[2693],{"type":29,"value":972},{"type":24,"tag":884,"props":2695,"children":2696},{"style":891},[2697],{"type":29,"value":2136},{"type":24,"tag":884,"props":2699,"children":2700},{"style":963},[2701],{"type":29,"value":2702}," crypto",{"type":24,"tag":884,"props":2704,"children":2705},{"style":902},[2706],{"type":29,"value":998},{"type":24,"tag":884,"props":2708,"children":2709},{"style":963},[2710],{"type":29,"value":2711},"subtle",{"type":24,"tag":884,"props":2713,"children":2714},{"style":902},[2715],{"type":29,"value":998},{"type":24,"tag":884,"props":2717,"children":2718},{"style":981},[2719],{"type":29,"value":2720},"importKey",{"type":24,"tag":884,"props":2722,"children":2723},{"style":987},[2724],{"type":29,"value":2725},"(\n",{"type":24,"tag":884,"props":2727,"children":2729},{"class":886,"line":2728},46,[2730,2735,2740,2744],{"type":24,"tag":884,"props":2731,"children":2732},{"style":1061},[2733],{"type":29,"value":2734},"    \"",{"type":24,"tag":884,"props":2736,"children":2737},{"style":1067},[2738],{"type":29,"value":2739},"raw",{"type":24,"tag":884,"props":2741,"children":2742},{"style":1061},[2743],{"type":29,"value":1064},{"type":24,"tag":884,"props":2745,"children":2746},{"style":902},[2747],{"type":29,"value":2451},{"type":24,"tag":884,"props":2749,"children":2751},{"class":886,"line":2750},47,[2752,2757,2761,2766,2770,2774,2778],{"type":24,"tag":884,"props":2753,"children":2754},{"style":963},[2755],{"type":29,"value":2756},"    enc",{"type":24,"tag":884,"props":2758,"children":2759},{"style":902},[2760],{"type":29,"value":998},{"type":24,"tag":884,"props":2762,"children":2763},{"style":981},[2764],{"type":29,"value":2765},"encode",{"type":24,"tag":884,"props":2767,"children":2768},{"style":987},[2769],{"type":29,"value":926},{"type":24,"tag":884,"props":2771,"children":2772},{"style":1001},[2773],{"type":29,"value":2624},{"type":24,"tag":884,"props":2775,"children":2776},{"style":987},[2777],{"type":29,"value":947},{"type":24,"tag":884,"props":2779,"children":2780},{"style":902},[2781],{"type":29,"value":2451},{"type":24,"tag":884,"props":2783,"children":2785},{"class":886,"line":2784},48,[2786,2791,2796,2800,2805,2810,2814,2818,2823,2827,2831,2836,2840],{"type":24,"tag":884,"props":2787,"children":2788},{"style":902},[2789],{"type":29,"value":2790},"    {",{"type":24,"tag":884,"props":2792,"children":2793},{"style":1131},[2794],{"type":29,"value":2795}," name",{"type":24,"tag":884,"props":2797,"children":2798},{"style":902},[2799],{"type":29,"value":1139},{"type":24,"tag":884,"props":2801,"children":2802},{"style":1061},[2803],{"type":29,"value":2804}," \"",{"type":24,"tag":884,"props":2806,"children":2807},{"style":1067},[2808],{"type":29,"value":2809},"HMAC",{"type":24,"tag":884,"props":2811,"children":2812},{"style":1061},[2813],{"type":29,"value":1064},{"type":24,"tag":884,"props":2815,"children":2816},{"style":902},[2817],{"type":29,"value":937},{"type":24,"tag":884,"props":2819,"children":2820},{"style":1131},[2821],{"type":29,"value":2822}," hash",{"type":24,"tag":884,"props":2824,"children":2825},{"style":902},[2826],{"type":29,"value":1139},{"type":24,"tag":884,"props":2828,"children":2829},{"style":1061},[2830],{"type":29,"value":2804},{"type":24,"tag":884,"props":2832,"children":2833},{"style":1067},[2834],{"type":29,"value":2835},"SHA-256",{"type":24,"tag":884,"props":2837,"children":2838},{"style":1061},[2839],{"type":29,"value":1064},{"type":24,"tag":884,"props":2841,"children":2842},{"style":902},[2843],{"type":29,"value":2844}," },\n",{"type":24,"tag":884,"props":2846,"children":2848},{"class":886,"line":2847},49,[2849,2855],{"type":24,"tag":884,"props":2850,"children":2852},{"style":2851},"--shiki-default:#FF9CAC;--shiki-dark:#D19A66",[2853],{"type":29,"value":2854},"    false",{"type":24,"tag":884,"props":2856,"children":2857},{"style":902},[2858],{"type":29,"value":2451},{"type":24,"tag":884,"props":2860,"children":2862},{"class":886,"line":2861},50,[2863,2868,2872,2877,2881],{"type":24,"tag":884,"props":2864,"children":2865},{"style":987},[2866],{"type":29,"value":2867},"    [",{"type":24,"tag":884,"props":2869,"children":2870},{"style":1061},[2871],{"type":29,"value":1064},{"type":24,"tag":884,"props":2873,"children":2874},{"style":1067},[2875],{"type":29,"value":2876},"sign",{"type":24,"tag":884,"props":2878,"children":2879},{"style":1061},[2880],{"type":29,"value":1064},{"type":24,"tag":884,"props":2882,"children":2883},{"style":987},[2884],{"type":29,"value":2885},"]\n",{"type":24,"tag":884,"props":2887,"children":2889},{"class":886,"line":2888},51,[2890,2895],{"type":24,"tag":884,"props":2891,"children":2892},{"style":987},[2893],{"type":29,"value":2894},"  )",{"type":24,"tag":884,"props":2896,"children":2897},{"style":902},[2898],{"type":29,"value":1013},{"type":24,"tag":884,"props":2900,"children":2902},{"class":886,"line":2901},52,[2903,2907,2911,2915,2919,2923,2927,2931,2935,2939,2943,2947,2951,2955,2959,2963,2967,2971,2975,2979,2983,2988,2993],{"type":24,"tag":884,"props":2904,"children":2905},{"style":912},[2906],{"type":29,"value":2649},{"type":24,"tag":884,"props":2908,"children":2909},{"style":963},[2910],{"type":29,"value":1573},{"type":24,"tag":884,"props":2912,"children":2913},{"style":969},[2914],{"type":29,"value":972},{"type":24,"tag":884,"props":2916,"children":2917},{"style":891},[2918],{"type":29,"value":2136},{"type":24,"tag":884,"props":2920,"children":2921},{"style":963},[2922],{"type":29,"value":2702},{"type":24,"tag":884,"props":2924,"children":2925},{"style":902},[2926],{"type":29,"value":998},{"type":24,"tag":884,"props":2928,"children":2929},{"style":963},[2930],{"type":29,"value":2711},{"type":24,"tag":884,"props":2932,"children":2933},{"style":902},[2934],{"type":29,"value":998},{"type":24,"tag":884,"props":2936,"children":2937},{"style":981},[2938],{"type":29,"value":2876},{"type":24,"tag":884,"props":2940,"children":2941},{"style":987},[2942],{"type":29,"value":926},{"type":24,"tag":884,"props":2944,"children":2945},{"style":1061},[2946],{"type":29,"value":1064},{"type":24,"tag":884,"props":2948,"children":2949},{"style":1067},[2950],{"type":29,"value":2809},{"type":24,"tag":884,"props":2952,"children":2953},{"style":1061},[2954],{"type":29,"value":1064},{"type":24,"tag":884,"props":2956,"children":2957},{"style":902},[2958],{"type":29,"value":937},{"type":24,"tag":884,"props":2960,"children":2961},{"style":1001},[2962],{"type":29,"value":2689},{"type":24,"tag":884,"props":2964,"children":2965},{"style":902},[2966],{"type":29,"value":937},{"type":24,"tag":884,"props":2968,"children":2969},{"style":963},[2970],{"type":29,"value":2654},{"type":24,"tag":884,"props":2972,"children":2973},{"style":902},[2974],{"type":29,"value":998},{"type":24,"tag":884,"props":2976,"children":2977},{"style":981},[2978],{"type":29,"value":2765},{"type":24,"tag":884,"props":2980,"children":2981},{"style":987},[2982],{"type":29,"value":926},{"type":24,"tag":884,"props":2984,"children":2985},{"style":1001},[2986],{"type":29,"value":2987},"data",{"type":24,"tag":884,"props":2989,"children":2990},{"style":987},[2991],{"type":29,"value":2992},"))",{"type":24,"tag":884,"props":2994,"children":2995},{"style":902},[2996],{"type":29,"value":1013},{"type":24,"tag":884,"props":2998,"children":3000},{"class":886,"line":2999},53,[3001,3006,3011,3016,3021,3026,3030,3034,3039,3043,3048,3052,3057,3062,3067,3071,3076,3080,3085,3089,3093,3098,3102,3107,3111,3115,3120,3124,3128,3132,3137,3141,3146,3150],{"type":24,"tag":884,"props":3002,"children":3003},{"style":891},[3004],{"type":29,"value":3005},"  return",{"type":24,"tag":884,"props":3007,"children":3008},{"style":987},[3009],{"type":29,"value":3010}," [",{"type":24,"tag":884,"props":3012,"children":3013},{"style":902},[3014],{"type":29,"value":3015},"...",{"type":24,"tag":884,"props":3017,"children":3018},{"style":975},[3019],{"type":29,"value":3020},"new",{"type":24,"tag":884,"props":3022,"children":3023},{"style":981},[3024],{"type":29,"value":3025}," Uint8Array",{"type":24,"tag":884,"props":3027,"children":3028},{"style":987},[3029],{"type":29,"value":926},{"type":24,"tag":884,"props":3031,"children":3032},{"style":1001},[3033],{"type":29,"value":1610},{"type":24,"tag":884,"props":3035,"children":3036},{"style":987},[3037],{"type":29,"value":3038},")]",{"type":24,"tag":884,"props":3040,"children":3041},{"style":902},[3042],{"type":29,"value":998},{"type":24,"tag":884,"props":3044,"children":3045},{"style":981},[3046],{"type":29,"value":3047},"map",{"type":24,"tag":884,"props":3049,"children":3050},{"style":987},[3051],{"type":29,"value":926},{"type":24,"tag":884,"props":3053,"children":3054},{"style":929},[3055],{"type":29,"value":3056},"b",{"type":24,"tag":884,"props":3058,"children":3059},{"style":912},[3060],{"type":29,"value":3061}," =>",{"type":24,"tag":884,"props":3063,"children":3064},{"style":963},[3065],{"type":29,"value":3066}," b",{"type":24,"tag":884,"props":3068,"children":3069},{"style":902},[3070],{"type":29,"value":998},{"type":24,"tag":884,"props":3072,"children":3073},{"style":981},[3074],{"type":29,"value":3075},"toString",{"type":24,"tag":884,"props":3077,"children":3078},{"style":987},[3079],{"type":29,"value":926},{"type":24,"tag":884,"props":3081,"children":3082},{"style":1142},[3083],{"type":29,"value":3084},"16",{"type":24,"tag":884,"props":3086,"children":3087},{"style":987},[3088],{"type":29,"value":947},{"type":24,"tag":884,"props":3090,"children":3091},{"style":902},[3092],{"type":29,"value":998},{"type":24,"tag":884,"props":3094,"children":3095},{"style":981},[3096],{"type":29,"value":3097},"padStart",{"type":24,"tag":884,"props":3099,"children":3100},{"style":987},[3101],{"type":29,"value":926},{"type":24,"tag":884,"props":3103,"children":3104},{"style":1142},[3105],{"type":29,"value":3106},"2",{"type":24,"tag":884,"props":3108,"children":3109},{"style":902},[3110],{"type":29,"value":937},{"type":24,"tag":884,"props":3112,"children":3113},{"style":1061},[3114],{"type":29,"value":2804},{"type":24,"tag":884,"props":3116,"children":3117},{"style":1067},[3118],{"type":29,"value":3119},"0",{"type":24,"tag":884,"props":3121,"children":3122},{"style":1061},[3123],{"type":29,"value":1064},{"type":24,"tag":884,"props":3125,"children":3126},{"style":987},[3127],{"type":29,"value":2992},{"type":24,"tag":884,"props":3129,"children":3130},{"style":902},[3131],{"type":29,"value":998},{"type":24,"tag":884,"props":3133,"children":3134},{"style":981},[3135],{"type":29,"value":3136},"join",{"type":24,"tag":884,"props":3138,"children":3139},{"style":987},[3140],{"type":29,"value":926},{"type":24,"tag":884,"props":3142,"children":3143},{"style":1061},[3144],{"type":29,"value":3145},"\"\"",{"type":24,"tag":884,"props":3147,"children":3148},{"style":987},[3149],{"type":29,"value":947},{"type":24,"tag":884,"props":3151,"children":3152},{"style":902},[3153],{"type":29,"value":1013},{"type":24,"tag":884,"props":3155,"children":3157},{"class":886,"line":3156},54,[3158],{"type":24,"tag":884,"props":3159,"children":3160},{"style":902},[3161],{"type":29,"value":3162},"}\n",{"type":24,"tag":884,"props":3164,"children":3166},{"class":886,"line":3165},55,[3167],{"type":24,"tag":884,"props":3168,"children":3169},{"emptyLinePlaceholder":1174},[3170],{"type":29,"value":1177},{"type":24,"tag":884,"props":3172,"children":3174},{"class":886,"line":3173},56,[3175,3180,3185,3189,3193,3197,3201,3205],{"type":24,"tag":884,"props":3176,"children":3177},{"style":912},[3178],{"type":29,"value":3179},"function",{"type":24,"tag":884,"props":3181,"children":3182},{"style":981},[3183],{"type":29,"value":3184}," timingSafeEqual",{"type":24,"tag":884,"props":3186,"children":3187},{"style":902},[3188],{"type":29,"value":926},{"type":24,"tag":884,"props":3190,"children":3191},{"style":929},[3192],{"type":29,"value":595},{"type":24,"tag":884,"props":3194,"children":3195},{"style":902},[3196],{"type":29,"value":937},{"type":24,"tag":884,"props":3198,"children":3199},{"style":929},[3200],{"type":29,"value":3066},{"type":24,"tag":884,"props":3202,"children":3203},{"style":902},[3204],{"type":29,"value":947},{"type":24,"tag":884,"props":3206,"children":3207},{"style":902},[3208],{"type":29,"value":905},{"type":24,"tag":884,"props":3210,"children":3212},{"class":886,"line":3211},57,[3213,3218,3222,3226,3230,3234,3239,3243,3247,3251,3255,3259,3264],{"type":24,"tag":884,"props":3214,"children":3215},{"style":891},[3216],{"type":29,"value":3217},"  if",{"type":24,"tag":884,"props":3219,"children":3220},{"style":987},[3221],{"type":29,"value":1027},{"type":24,"tag":884,"props":3223,"children":3224},{"style":963},[3225],{"type":29,"value":595},{"type":24,"tag":884,"props":3227,"children":3228},{"style":902},[3229],{"type":29,"value":998},{"type":24,"tag":884,"props":3231,"children":3232},{"style":1001},[3233],{"type":29,"value":1240},{"type":24,"tag":884,"props":3235,"children":3236},{"style":969},[3237],{"type":29,"value":3238}," !==",{"type":24,"tag":884,"props":3240,"children":3241},{"style":963},[3242],{"type":29,"value":3066},{"type":24,"tag":884,"props":3244,"children":3245},{"style":902},[3246],{"type":29,"value":998},{"type":24,"tag":884,"props":3248,"children":3249},{"style":1001},[3250],{"type":29,"value":1240},{"type":24,"tag":884,"props":3252,"children":3253},{"style":987},[3254],{"type":29,"value":1717},{"type":24,"tag":884,"props":3256,"children":3257},{"style":891},[3258],{"type":29,"value":1922},{"type":24,"tag":884,"props":3260,"children":3261},{"style":2851},[3262],{"type":29,"value":3263}," false",{"type":24,"tag":884,"props":3265,"children":3266},{"style":902},[3267],{"type":29,"value":1013},{"type":24,"tag":884,"props":3269,"children":3271},{"class":886,"line":3270},58,[3272,3277,3282,3286,3291],{"type":24,"tag":884,"props":3273,"children":3274},{"style":912},[3275],{"type":29,"value":3276},"  let",{"type":24,"tag":884,"props":3278,"children":3279},{"style":1001},[3280],{"type":29,"value":3281}," out",{"type":24,"tag":884,"props":3283,"children":3284},{"style":969},[3285],{"type":29,"value":972},{"type":24,"tag":884,"props":3287,"children":3288},{"style":1142},[3289],{"type":29,"value":3290}," 0",{"type":24,"tag":884,"props":3292,"children":3293},{"style":902},[3294],{"type":29,"value":1013},{"type":24,"tag":884,"props":3296,"children":3298},{"class":886,"line":3297},59,[3299,3304,3308,3313,3318,3322,3326,3331,3335,3340,3345,3349,3353,3357,3361,3366,3370,3375,3380,3384,3388,3393,3397,3402,3406,3411,3415,3419,3423,3427,3431,3435],{"type":24,"tag":884,"props":3300,"children":3301},{"style":891},[3302],{"type":29,"value":3303},"  for",{"type":24,"tag":884,"props":3305,"children":3306},{"style":987},[3307],{"type":29,"value":1027},{"type":24,"tag":884,"props":3309,"children":3310},{"style":912},[3311],{"type":29,"value":3312},"let",{"type":24,"tag":884,"props":3314,"children":3315},{"style":1001},[3316],{"type":29,"value":3317}," i",{"type":24,"tag":884,"props":3319,"children":3320},{"style":969},[3321],{"type":29,"value":972},{"type":24,"tag":884,"props":3323,"children":3324},{"style":1142},[3325],{"type":29,"value":3290},{"type":24,"tag":884,"props":3327,"children":3328},{"style":902},[3329],{"type":29,"value":3330},";",{"type":24,"tag":884,"props":3332,"children":3333},{"style":1001},[3334],{"type":29,"value":3317},{"type":24,"tag":884,"props":3336,"children":3337},{"style":969},[3338],{"type":29,"value":3339}," \u003C",{"type":24,"tag":884,"props":3341,"children":3342},{"style":963},[3343],{"type":29,"value":3344}," a",{"type":24,"tag":884,"props":3346,"children":3347},{"style":902},[3348],{"type":29,"value":998},{"type":24,"tag":884,"props":3350,"children":3351},{"style":1001},[3352],{"type":29,"value":1240},{"type":24,"tag":884,"props":3354,"children":3355},{"style":902},[3356],{"type":29,"value":3330},{"type":24,"tag":884,"props":3358,"children":3359},{"style":1001},[3360],{"type":29,"value":3317},{"type":24,"tag":884,"props":3362,"children":3363},{"style":969},[3364],{"type":29,"value":3365},"++",{"type":24,"tag":884,"props":3367,"children":3368},{"style":987},[3369],{"type":29,"value":1717},{"type":24,"tag":884,"props":3371,"children":3372},{"style":1001},[3373],{"type":29,"value":3374},"out",{"type":24,"tag":884,"props":3376,"children":3377},{"style":975},[3378],{"type":29,"value":3379}," |=",{"type":24,"tag":884,"props":3381,"children":3382},{"style":963},[3383],{"type":29,"value":3344},{"type":24,"tag":884,"props":3385,"children":3386},{"style":902},[3387],{"type":29,"value":998},{"type":24,"tag":884,"props":3389,"children":3390},{"style":981},[3391],{"type":29,"value":3392},"charCodeAt",{"type":24,"tag":884,"props":3394,"children":3395},{"style":987},[3396],{"type":29,"value":926},{"type":24,"tag":884,"props":3398,"children":3399},{"style":1001},[3400],{"type":29,"value":3401},"i",{"type":24,"tag":884,"props":3403,"children":3404},{"style":987},[3405],{"type":29,"value":1717},{"type":24,"tag":884,"props":3407,"children":3408},{"style":969},[3409],{"type":29,"value":3410},"^",{"type":24,"tag":884,"props":3412,"children":3413},{"style":963},[3414],{"type":29,"value":3066},{"type":24,"tag":884,"props":3416,"children":3417},{"style":902},[3418],{"type":29,"value":998},{"type":24,"tag":884,"props":3420,"children":3421},{"style":981},[3422],{"type":29,"value":3392},{"type":24,"tag":884,"props":3424,"children":3425},{"style":987},[3426],{"type":29,"value":926},{"type":24,"tag":884,"props":3428,"children":3429},{"style":1001},[3430],{"type":29,"value":3401},{"type":24,"tag":884,"props":3432,"children":3433},{"style":987},[3434],{"type":29,"value":947},{"type":24,"tag":884,"props":3436,"children":3437},{"style":902},[3438],{"type":29,"value":1013},{"type":24,"tag":884,"props":3440,"children":3442},{"class":886,"line":3441},60,[3443,3447,3451,3456,3460],{"type":24,"tag":884,"props":3444,"children":3445},{"style":891},[3446],{"type":29,"value":3005},{"type":24,"tag":884,"props":3448,"children":3449},{"style":1001},[3450],{"type":29,"value":3281},{"type":24,"tag":884,"props":3452,"children":3453},{"style":969},[3454],{"type":29,"value":3455}," ===",{"type":24,"tag":884,"props":3457,"children":3458},{"style":1142},[3459],{"type":29,"value":3290},{"type":24,"tag":884,"props":3461,"children":3462},{"style":902},[3463],{"type":29,"value":1013},{"type":24,"tag":884,"props":3465,"children":3467},{"class":886,"line":3466},61,[3468],{"type":24,"tag":884,"props":3469,"children":3470},{"style":902},[3471],{"type":29,"value":3162},{"type":24,"tag":25,"props":3473,"children":3474},{},[3475],{"type":29,"value":3476},"注意要绑定环境变量",{"type":24,"tag":25,"props":3478,"children":3479},{},[3480],{"type":29,"value":3481},"代码我就不详细解释了，复制一下去问AI，AI的回答比我费劲口舌的解释要好多了。。。",{"type":24,"tag":3483,"props":3484,"children":3485},"style",{},[3486],{"type":29,"value":3487},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":18,"searchDepth":1016,"depth":1016,"links":3489},[3490,3494,3498,3502,3505,3506,3507,3508,3509],{"id":33,"depth":954,"text":33,"children":3491},[3492,3493],{"id":44,"depth":1016,"text":51},{"id":204,"depth":1016,"text":210},{"id":346,"depth":954,"text":349,"children":3495},[3496,3497],{"id":357,"depth":1016,"text":360},{"id":432,"depth":1016,"text":435},{"id":492,"depth":954,"text":495,"children":3499},[3500,3501],{"id":498,"depth":1016,"text":501},{"id":547,"depth":1016,"text":550},{"id":610,"depth":954,"text":613,"children":3503},[3504],{"id":621,"depth":1016,"text":624},{"id":735,"depth":954,"text":735},{"id":745,"depth":954,"text":748},{"id":797,"depth":954,"text":800},{"id":843,"depth":954,"text":843},{"id":865,"depth":954,"text":868},1776415020895]