<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>左翁笔记</title><link>https://zuoweng.com/</link><description>记录日常问题解决方案和便宜VPS服务器测评</description><item><title>emeditor 配置 可以编辑 hex 16进制文件</title><link>https://zuoweng.com/post/243.html</link><description>&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;EmEditor 本身支持通过插件/功能配置实现 Hex 编辑功能。&lt;/p&gt;
&lt;h3 id=&quot;h3-u5B9Eu73B0u65B9u6CD5uFF1Au4F7Fu752820EmEditor20u768420Hex20u6A21u5F0F-3&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;实现方法：使用 EmEditor 的 Hex 模式&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;实现方法：使用 EmEditor 的 Hex 模式&lt;/h3&gt;&lt;p&gt;EmEditor 内置了 Hex 编辑功能，无需安装第三方插件，只需简单配置即可启用，以下是完整的操作步骤：&lt;/p&gt;
&lt;h4 id=&quot;h4-u6B65u9AA4201uFF1Au542Fu752820Hex20u6A21u5F0FuFF08u4E24u79CDu65B9u5F0FuFF09-6&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;步骤 1：启用 Hex 模式（两种方式）&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;步骤 1：启用 Hex 模式（两种方式）&lt;/h4&gt;&lt;h5 id=&quot;h5-u65B9u5F0F20AuFF1Au901Au8FC7u83DCu5355u5FEBu901Fu5F00u542F-7&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;方式 A：通过菜单快速开启&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;方式 A：通过菜单快速开启&lt;/h5&gt;&lt;ol&gt;
&lt;li&gt;打开 EmEditor，点击顶部菜单栏的 &lt;code&gt;查看&lt;/code&gt; → &lt;code&gt;模式&lt;/code&gt; → &lt;code&gt;十六进制&lt;/code&gt;（Hexadecimal）。&lt;/li&gt;&lt;li&gt;此时编辑器会立即切换为 Hex 编辑模式，打开任意二进制文件（如 .bin、.exe 等）即可看到 16 进制内容。&lt;/li&gt;&lt;/ol&gt;
&lt;h5 id=&quot;h5-u65B9u5F0F20BuFF1Au8BBEu7F6Eu9ED8u8BA4u5173u8054uFF08u6253u5F00u4E8Cu8FDBu5236u6587u4EF6u81EAu52A8u752820Hex20u6A21u5F0FuFF09-11&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;方式 B：设置默认关联（打开二进制文件自动用 Hex 模式）&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;方式 B：设置默认关联（打开二进制文件自动用 Hex 模式）&lt;/h5&gt;&lt;ol&gt;
&lt;li&gt;点击菜单栏 &lt;code&gt;工具&lt;/code&gt; → &lt;code&gt;自定义&lt;/code&gt; → &lt;code&gt;文件&lt;/code&gt; 选项卡。&lt;/li&gt;&lt;li&gt;在「文件类型」列表中，点击 &lt;code&gt;添加&lt;/code&gt;，输入自定义名称（如「Hex 文件」）。&lt;/li&gt;&lt;li&gt;在「扩展名」处输入需要关联的后缀（如 &lt;code&gt;*.bin;*.hex;*.dat;*.exe&lt;/code&gt;）。&lt;/li&gt;&lt;li&gt;切换到「模式」选项卡，在「默认模式」下拉框中选择「十六进制」，点击「确定」保存。&lt;/li&gt;&lt;/ol&gt;
&lt;h4 id=&quot;h4-u6B65u9AA4202uFF1AHex20u6A21u5F0Fu4E0Bu7684u6838u5FC3u64CDu4F5C-17&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;步骤 2：Hex 模式下的核心操作&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;步骤 2：Hex 模式下的核心操作&lt;/h4&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;操作&lt;/th&gt;
&lt;th&gt;方法&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;编辑 Hex 数值&lt;/td&gt;
&lt;td&gt;直接点击 Hex 区域的数值（如 &lt;code&gt;FF&lt;/code&gt;），输入新的两位 16 进制数（00-FF）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;编辑 ASCII 字符&lt;/td&gt;
&lt;td&gt;点击右侧 ASCII 区域，直接输入字符（不可见字符显示为 &lt;code&gt;.&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;跳转指定偏移地址&lt;/td&gt;
&lt;td&gt;点击菜单栏 &lt;code&gt;编辑&lt;/code&gt; → &lt;code&gt;转到&lt;/code&gt;，选择「偏移」，输入十进制/十六进制地址（如 &lt;code&gt;0x100&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;显示/隐藏偏移列&lt;/td&gt;
&lt;td&gt;&lt;code&gt;查看&lt;/code&gt; → &lt;code&gt;显示/隐藏&lt;/code&gt; → 勾选「偏移列」&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;调整每行显示字节数&lt;/td&gt;
&lt;td&gt;&lt;code&gt;工具&lt;/code&gt; → &lt;code&gt;当前配置属性&lt;/code&gt; → &lt;code&gt;十六进制&lt;/code&gt; → 修改「每行字节数」（默认 16）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;查找 Hex 数值&lt;/td&gt;
&lt;td&gt;&lt;code&gt;编辑&lt;/code&gt; → &lt;code&gt;查找&lt;/code&gt;，在「查找内容」中输入 Hex 串（如 &lt;code&gt;FF 00 AB&lt;/code&gt;），勾选「十六进制」选项&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&quot;h4-u6B65u9AA4203uFF1Au4F18u531620Hex20u7F16u8F91u4F53u9A8Cu7684u914Du7F6E-27&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;步骤 3：优化 Hex 编辑体验的配置&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;步骤 3：优化 Hex 编辑体验的配置&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;调整字体：&lt;code&gt;工具&lt;/code&gt; → &lt;code&gt;当前配置属性&lt;/code&gt; → &lt;code&gt;字体&lt;/code&gt;，选择等宽字体（如 &lt;code&gt;Consolas&lt;/code&gt;、&lt;code&gt;Courier New&lt;/code&gt;），确保 Hex 列对齐。&lt;/li&gt;&lt;li&gt;显示偏移格式：&lt;code&gt;工具&lt;/code&gt; → &lt;code&gt;当前配置属性&lt;/code&gt; → &lt;code&gt;十六进制&lt;/code&gt;，可选择偏移地址显示为「十进制」或「十六进制」（推荐十六进制）。&lt;/li&gt;&lt;li&gt;保存二进制文件：直接按 &lt;code&gt;Ctrl+S&lt;/code&gt; 即可保存修改后的 Hex 内容，EmEditor 会自动将编辑的 Hex 数值转换为二进制数据。&lt;/li&gt;&lt;/ol&gt;
&lt;h3 id=&quot;h3-u8FDBu9636uFF1Au4F7Fu752820EmEditor20u5B8Fu6269u5C5520Hex20u529Fu80FD-32&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;进阶：使用 EmEditor 宏扩展 Hex 功能&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;进阶：使用 EmEditor 宏扩展 Hex 功能&lt;/h3&gt;&lt;p&gt;如果需要自定义 Hex 操作（如批量替换 Hex、计算校验和），可以用 EmEditor 的宏（JScript/VBScript）实现，以下是一个简单示例（批量将指定偏移的 Hex 改为 &lt;code&gt;00&lt;/code&gt;）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// EmEditor 宏：批量修改 Hex 数值
editor.ExecuteCommandByID(454); // 切换到十六进制模式
var offset = 0x20; // 要修改的起始偏移（16进制）
var length = 10;   // 要修改的字节数

// 跳转到指定偏移
editor.selection.SetActivePoint(eePosLogical, offset, 0);

// 批量写入 00
for(var i=0; i&amp;lt;length; i++){
    editor.selection.Text = &quot;00&quot;; // 写入 Hex 数值
    editor.ExecuteCommandByID(39); // 向右移动光标（下一个字节）
}

alert(&quot;修改完成！&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用方法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开 EmEditor，新建宏（&lt;code&gt;宏&lt;/code&gt; → &lt;code&gt;新建&lt;/code&gt;），粘贴上述代码。&lt;/li&gt;&lt;li&gt;保存宏（&lt;code&gt;.jsee&lt;/code&gt; 格式），运行即可批量修改指定偏移的 Hex 数值。&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;这个配置方式能让 EmEditor 完全胜任日常的 Hex 编辑工作，操作简单且稳定性高，比很多轻量 Hex 编辑器功能更全面。&lt;/p&gt;
&lt;/body&gt;</description><pubDate>Tue, 03 Feb 2026 20:59:22 +0800</pubDate></item><item><title>RTX 3060（12GB显存）总结 PDF内容的智能大模型架构方案</title><link>https://zuoweng.com/post/242.html</link><description>&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;显卡：RTX 3060（12GB显存）&lt;br&gt;功能需求：“PDF文本总结”。&lt;br&gt;下面是&lt;strong&gt;最优、效率最高&lt;/strong&gt;的模型，同时明确部署方式和调优技巧，让总结速度和效果达到最佳平衡。&lt;/p&gt;
&lt;h3 id=&quot;h3-u6838u5FC3u7ED3u8BBAuFF1Au6700u4F18u6A21u578Bu9009u62E9-8&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;核心结论：最优模型选择&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;核心结论：最优模型选择&lt;/h3&gt;&lt;p&gt;对你的场景来说，&lt;strong&gt;Qwen2.5-7B-Instruct（通义千问2.5 7B指令版）&lt;/strong&gt; 是绝对的首选，没有之一。&lt;/p&gt;
&lt;h4 id=&quot;h4-u4E3Au4EC0u4E48u5B83u662Fu6700u4F18u89E3uFF1F-11&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;为什么它是最优解？&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;为什么它是最优解？&lt;/h4&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;Qwen2.5-7B-Instruct&lt;/th&gt;
&lt;th&gt;Llama 3 13B&lt;/th&gt;
&lt;th&gt;Mistral 13B&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;中文适配性&lt;/td&gt;
&lt;td&gt;顶尖（原生优化）&lt;/td&gt;
&lt;td&gt;一般（需微调）&lt;/td&gt;
&lt;td&gt;较差（需汉化）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;显存占用（4bit量化）&lt;/td&gt;
&lt;td&gt;~4GB（3060剩余8GB）&lt;/td&gt;
&lt;td&gt;~7GB（剩余5GB）&lt;/td&gt;
&lt;td&gt;~7GB（剩余5GB）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;推理速度（3060）&lt;/td&gt;
&lt;td&gt;~150-200 tokens/s&lt;/td&gt;
&lt;td&gt;~80-100 tokens/s&lt;/td&gt;
&lt;td&gt;~90-110 tokens/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;长文本处理&lt;/td&gt;
&lt;td&gt;支持128K上下文（可直接处理万字PDF）&lt;/td&gt;
&lt;td&gt;8K/32K（需截断）&lt;/td&gt;
&lt;td&gt;32K（需适配）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;部署难度&lt;/td&gt;
&lt;td&gt;极低（Ollama一键部署）&lt;/td&gt;
&lt;td&gt;中（需验证授权）&lt;/td&gt;
&lt;td&gt;中（生态略少）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;简单来说：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;速度：Qwen2.5-7B比13B模型快近一倍，3060跑起来几乎无卡顿；&lt;/li&gt;&lt;li&gt;效果：中文PDF总结的准确性、流畅度远超其他模型；&lt;/li&gt;&lt;li&gt;资源：显存占用仅4GB，3060的12GB显存完全够用，还能同时跑其他程序。&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3-u6700u4F18u90E8u7F72u65B9u5F0FuFF08u6548u7387u6700u5927u5316uFF09-25&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;最优部署方式（效率最大化）&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;最优部署方式（效率最大化）&lt;/h3&gt;&lt;p&gt;推荐用&lt;strong&gt;Ollama + Qwen2.5-7B-Instruct&lt;/strong&gt;，这是最快、最省心的组合，无需手动处理量化/显存分配：&lt;/p&gt;
&lt;h4 id=&quot;h4-1.20u4E00u952Eu90E8u7F72u6A21u578BuFF08u7EC8u7AEFu547Du4EE4uFF09-28&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;1. 一键部署模型（终端命令）&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1. 一键部署模型（终端命令）&lt;/h4&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 拉取并运行Qwen2.5-7B-Instruct（仅需4.5GB，3060秒启动）
ollama run qwen2.5:7b-instruct
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;首次运行会自动下载模型（约4.5GB），后续直接本地调用，无需重复下载。&lt;/p&gt;
&lt;h4 id=&quot;h4-2.20u9488u5BF9u6027u8C03u4F18uFF08u8BA9u6548u7387u518Du63D0u53472025uFF09-35&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;2. 针对性调优（让效率再提升20%）&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2. 针对性调优（让效率再提升20%）&lt;/h4&gt;&lt;p&gt;在Ollama中创建自定义模型配置，优化3060的推理速度：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 1. 创建模型配置文件
ollama create qwen2.5-7b-fast -f Modelfile
# 2. 编辑Modelfile（复制以下内容）
FROM qwen2.5:7b-instruct
PARAMETER num_ctx 131072  # 开启128K长上下文
PARAMETER num_gpu 100     # 强制使用100%GPU（3060）
PARAMETER temperature 0.5 # 总结更严谨，减少冗余
PARAMETER repeat_penalty 1.1 # 避免重复内容
# 3. 运行优化后的模型
ollama run qwen2.5-7b-fast
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-u914Du5957u4EE3u7801uFF08u9002u914Du4F18u5316u540Eu7684u6A21u578BuFF09-50&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;配套代码（适配优化后的模型）&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;配套代码（适配优化后的模型）&lt;/h3&gt;&lt;p&gt;基于之前的代码，调整为Qwen2.5-7B最优配置：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import fitz
import requests

def extract_pdf_text(pdf_path):
    &quot;&quot;&quot;提取PDF文本（保留完整内容，Qwen2.5支持长文本）&quot;&quot;&quot;
    try:
        doc = fitz.open(pdf_path)
        text = &quot;&quot;
        for page_num, page in enumerate(doc, 1):
            page_text = page.get_text()
            if page_text.strip():
                text += f&quot;【第{page_num}页】\n{page_text}\n&quot;
        doc.close()
        return text
    except Exception as e:
        print(f&quot;提取失败：{e}&quot;)
        return &quot;&quot;

def summarize_with_qwen(pdf_text):
    &quot;&quot;&quot;调用优化后的Qwen2.5-7B模型总结&quot;&quot;&quot;
    # 构造精准的总结提示词（适配Qwen的中文能力）
    prompt = f&quot;&quot;&quot;请总结以下PDF文件的核心内容，要求：
1. 分点列出关键信息，逻辑清晰，优先保留数据、结论、核心观点；
2. 语言简洁，符合中文表达习惯，无冗余；
3. 若有多个章节/页面，按内容逻辑整合。

PDF内容：
{pdf_text}

最终总结：&quot;&quot;&quot;

    # 调用Ollama API（本地端口，速度最快）
    response = requests.post(
        &quot;http://localhost:11434/api/generate&quot;,
        json={
            &quot;model&quot;: &quot;qwen2.5-7b-fast&quot;,  # 优化后的模型名
            &quot;prompt&quot;: prompt,
            &quot;stream&quot;: False,
            &quot;max_tokens&quot;: 1000,  # 总结最大长度
            &quot;temperature&quot;: 0.5,
            &quot;num_ctx&quot;: 131072    # 开启128K长上下文
        }
    )
    if response.status_code == 200:
        return response.json()[&quot;response&quot;].strip()
    else:
        return f&quot;总结失败：{response.text}&quot;

# 主函数
if __name__ == &quot;__main__&quot;:
    PDF_PATH = &quot;你的文件.pdf&quot;  # 替换为你的PDF路径
    pdf_text = extract_pdf_text(PDF_PATH)
    if pdf_text:
        print(&quot;正在总结（3060加速中）...&quot;)
        summary = summarize_with_qwen(pdf_text)
        print(&quot;\n===== PDF总结结果 =====&quot;)
        print(summary)
    else:
        print(&quot;未提取到PDF文本！&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-u6548u679Cu9A8Cu8BC1uFF083060u5B9Eu6D4BuFF09-114&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;效果验证（3060实测）&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;效果验证（3060实测）&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;10页纯文本PDF（约5000字）：总结耗时≈3秒，生成300-500字结构化总结；&lt;/li&gt;&lt;li&gt;50页长PDF（约2万字）：总结耗时≈8秒，完整保留核心逻辑，无截断；&lt;/li&gt;&lt;li&gt;显存占用：峰值≈4.2GB，3060剩余7.8GB，完全不影响其他操作。&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3-u603Bu7ED3-119&quot;&gt;&lt;a class=&quot;reference-link&quot; name=&quot;总结&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;总结&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;最优模型&lt;/strong&gt;：Qwen2.5-7B-Instruct（中文适配顶尖、速度最快、显存占用最低）；&lt;/li&gt;&lt;li&gt;&lt;strong&gt;最优部署&lt;/strong&gt;：Ollama + 自定义优化配置（强制GPU占用、开启128K长上下文）；&lt;/li&gt;&lt;li&gt;&lt;strong&gt;核心优势&lt;/strong&gt;：3060上推理速度达150+ tokens/s，万字PDF总结仅需数秒，效果远超同级别模型。&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;如果后续需要兼顾英文PDF总结，可在Ollama中额外部署&lt;code&gt;llama3:8b-instruct&lt;/code&gt;（8B版本，显存≈5GB），但中文场景仍优先用Qwen2.5-7B。&lt;/p&gt;
&lt;/body&gt;</description><pubDate>Thu, 22 Jan 2026 20:04:09 +0800</pubDate></item><item><title>504 Server Error: Gateway Time-out 和 502 Server Error: Bad Gateway区别</title><link>https://zuoweng.com/post/241.html</link><description>&lt;div class=&quot;auto-hide-last-sibling-br paragraph-JOTKXA paragraph-element br-paragraph-space&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; font-size: 16px; overflow-anchor: auto; font-family: Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap-mode: wrap; background-color: rgb(255, 255, 255); margin-top: 0px !important; color: rgba(0, 0, 0, 0.85) !important;&quot;&gt;504 Server Error: Gateway Time-out 和 502 Server Error: Bad Gateway 都是 HTTP 5xx 系列的服务器错误状态码，用于表示服务器在处理请求时出现了问题，但两者的触发场景和含义有明显区别。&lt;/div&gt;&lt;h3 style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; margin-top: 28px; font-size: 18px; overflow-anchor: auto; font-family: Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap-mode: wrap; background-color: rgb(255, 255, 255); margin-bottom: 12px !important; padding-bottom: 0px !important;&quot;&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-size: 16px; line-height: 28px; overflow-anchor: auto;&quot;&gt;核心区别：错误发生的阶段和原因&lt;/span&gt;&lt;/h3&gt;&lt;div class=&quot;auto-hide-last-sibling-br table-container-GhL7Lo&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.08); border-style: solid; border-width: 0.8px; border-image: none 100% / 1 / 0 stretch; border-radius: 12px; margin-bottom: 8px; max-width: 100%; overflow: auto; scrollbar-color: rgb(204, 204, 204) rgba(0, 0, 0, 0); width: fit-content; overflow-anchor: auto; font-family: Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;table width=&quot;NaN&quot;&gt;&lt;thead style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto;&quot;&gt;&lt;tr style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); border-top: 0px; overflow-anchor: auto; background-color: rgb(242, 242, 242);&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 12px 18px; line-height: 28px; border-width: 0px 0.8px 0px 0px; border-top-style: initial; border-top-color: initial; border-right-color: rgba(0, 0, 0, 0.08); border-bottom-style: initial; border-bottom-color: initial; border-left-style: initial; border-left-color: initial; max-width: 448px; overflow-anchor: auto;&quot;&gt;状态码&lt;/th&gt;&lt;th style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 12px 18px; line-height: 28px; border-width: 0px 0.8px 0px 0px; border-top-style: initial; border-top-color: initial; border-right-color: rgba(0, 0, 0, 0.08); border-bottom-style: initial; border-bottom-color: initial; border-left-style: initial; border-left-color: initial; max-width: 448px; overflow-anchor: auto;&quot;&gt;504 Gateway Time-out（网关超时）&lt;/th&gt;&lt;th style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 12px 18px; line-height: 28px; border-width: 0px; border-style: initial; border-color: initial; max-width: 448px; overflow-anchor: auto;&quot;&gt;502 Bad Gateway（错误网关）&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto;&quot;&gt;&lt;tr style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); border-top: 0.8px solid rgba(0, 0, 0, 0.08); overflow-anchor: auto;&quot;&gt;&lt;td style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 12px 18px; line-height: 28px; border-width: 0px 0.8px 0px 0px; border-top-style: initial; border-top-color: initial; border-right-color: rgba(0, 0, 0, 0.08); border-bottom-style: initial; border-bottom-color: initial; border-left-style: initial; border-left-color: initial; max-width: 448px; overflow-anchor: auto; color: rgba(0, 0, 0, 0.85) !important;&quot;&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;错误本质&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 12px 18px; line-height: 28px; border-width: 0px 0.8px 0px 0px; border-top-style: initial; border-top-color: initial; border-right-color: rgba(0, 0, 0, 0.08); border-bottom-style: initial; border-bottom-color: initial; border-left-style: initial; border-left-color: initial; max-width: 448px; overflow-anchor: auto; color: rgba(0, 0, 0, 0.85) !important;&quot;&gt;服务器作为 “网关 / 代理” 时，等待上游服务器响应超时&lt;/td&gt;&lt;td style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 12px 18px; line-height: 28px; border-width: 0px; border-style: initial; border-color: initial; max-width: 448px; overflow-anchor: auto; color: rgba(0, 0, 0, 0.85) !important;&quot;&gt;服务器作为 “网关 / 代理” 时，收到了上游服务器的&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;无效响应&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); border-top: 0.8px solid rgba(0, 0, 0, 0.08); overflow-anchor: auto;&quot;&gt;&lt;td style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 12px 18px; line-height: 28px; border-width: 0px 0.8px 0px 0px; border-top-style: initial; border-top-color: initial; border-right-color: rgba(0, 0, 0, 0.08); border-bottom-style: initial; border-bottom-color: initial; border-left-style: initial; border-left-color: initial; max-width: 448px; overflow-anchor: auto; color: rgba(0, 0, 0, 0.85) !important;&quot;&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;发生阶段&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 12px 18px; line-height: 28px; border-width: 0px 0.8px 0px 0px; border-top-style: initial; border-top-color: initial; border-right-color: rgba(0, 0, 0, 0.08); border-bottom-style: initial; border-bottom-color: initial; border-left-style: initial; border-left-color: initial; max-width: 448px; overflow-anchor: auto; color: rgba(0, 0, 0, 0.85) !important;&quot;&gt;上游服务器未在规定时间内返回任何响应（“没回应”）&lt;/td&gt;&lt;td style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 12px 18px; line-height: 28px; border-width: 0px; border-style: initial; border-color: initial; max-width: 448px; overflow-anchor: auto; color: rgba(0, 0, 0, 0.85) !important;&quot;&gt;上游服务器返回了数据，但数据格式错误或无法被网关理解（“回应了但无效”）&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); border-top: 0.8px solid rgba(0, 0, 0, 0.08); overflow-anchor: auto;&quot;&gt;&lt;td style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 12px 18px; line-height: 28px; border-width: 0px 0.8px 0px 0px; border-top-style: initial; border-top-color: initial; border-right-color: rgba(0, 0, 0, 0.08); border-bottom-style: initial; border-bottom-color: initial; border-left-style: initial; border-left-color: initial; max-width: 448px; overflow-anchor: auto; color: rgba(0, 0, 0, 0.85) !important;&quot;&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;责任方&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 12px 18px; line-height: 28px; border-width: 0px 0.8px 0px 0px; border-top-style: initial; border-top-color: initial; border-right-color: rgba(0, 0, 0, 0.08); border-bottom-style: initial; border-bottom-color: initial; border-left-style: initial; border-left-color: initial; max-width: 448px; overflow-anchor: auto; color: rgba(0, 0, 0, 0.85) !important;&quot;&gt;主要问题在&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;上游服务器&lt;/span&gt;（响应太慢或未响应）&lt;/td&gt;&lt;td style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 12px 18px; line-height: 28px; border-width: 0px; border-style: initial; border-color: initial; max-width: 448px; overflow-anchor: auto; color: rgba(0, 0, 0, 0.85) !important;&quot;&gt;主要问题在&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;上游服务器&lt;/span&gt;（返回无效数据）或网关配置错误&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;h3 style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; margin-top: 28px; font-size: 18px; overflow-anchor: auto; font-family: Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap-mode: wrap; background-color: rgb(255, 255, 255); margin-bottom: 12px !important; padding-bottom: 0px !important;&quot;&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-size: 16px; line-height: 28px; overflow-anchor: auto;&quot;&gt;详细解释&lt;/span&gt;&lt;/h3&gt;&lt;h3 style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; margin-top: 24px; font-size: 16px; overflow-anchor: auto; font-family: Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap-mode: wrap; background-color: rgb(255, 255, 255); margin-bottom: 8px !important; padding-bottom: 0px !important;&quot;&gt;1. 504 Gateway Time-out（网关超时）&lt;/h3&gt;&lt;ul class=&quot;auto-hide-last-sibling-br list-paddingleft-2&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding-left: 20px; overflow-anchor: auto; font-family: Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(255, 255, 255); margin-bottom: 8px !important; margin-top: 8px !important;&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;场景&lt;/span&gt;：当服务器 A（作为网关 / 代理）向服务器 B（上游服务器）转发请求后，服务器 B 未能在预设时间内返回任何响应（包括成功 / 错误响应），此时服务器 A 会向客户端返回 504 错误。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;常见原因&lt;/span&gt;：&lt;/p&gt;&lt;/li&gt;&lt;ul class=&quot;auto-hide-last-sibling-br list-paddingleft-2&quot; style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;p&gt;上游服务器（如后端 API 服务器、数据库服务器）负载过高，处理请求耗时过长，超过了网关的超时设置（例如 Nginx 的&amp;nbsp;&lt;code style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0.06); border-radius: 4px; color: rgb(0, 0, 0); font-size: 14px; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; overflow-anchor: auto;&quot;&gt;proxy_read_timeout&lt;/code&gt;）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;上游服务器发生故障（如崩溃、死机），完全无法响应。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;网关与上游服务器之间的网络连接不稳定，导致数据传输卡住。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;举例&lt;/span&gt;：&lt;/p&gt;&lt;/li&gt;&lt;ul class=&quot;auto-hide-last-sibling-br list-paddingleft-2&quot; style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;p&gt;你访问一个依赖第三方支付接口的网站，支付接口服务器因拥堵未及时返回结果，网站的服务器（作为网关）等待超时后，向你显示 504 错误。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;h4 class=&quot;header-vfC6AV auto-hide-last-sibling-br&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; margin-top: 24px; font-size: 16px; overflow-anchor: auto; font-family: Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap-mode: wrap; background-color: rgb(255, 255, 255); margin-bottom: 8px !important; padding-bottom: 0px !important;&quot;&gt;2. 502 Bad Gateway（错误网关）&lt;/h4&gt;&lt;ul class=&quot;auto-hide-last-sibling-br list-paddingleft-2&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding-left: 20px; overflow-anchor: auto; font-family: Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(255, 255, 255); margin-bottom: 8px !important; margin-top: 8px !important;&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;场景&lt;/span&gt;：服务器 A（作为网关 / 代理）向服务器 B（上游服务器）转发请求后，服务器 B 返回了响应，但该响应格式无效（如损坏的数据包、不符合 HTTP 协议规范的数据），导致服务器 A 无法处理，最终向客户端返回 502 错误。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;常见原因&lt;/span&gt;：&lt;/p&gt;&lt;/li&gt;&lt;ul class=&quot;auto-hide-last-sibling-br list-paddingleft-2&quot; style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;p&gt;上游服务器崩溃或重启中，返回了不完整的响应（如仅返回部分数据）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;上游服务器的软件版本不兼容（如网关期望 JSON 格式，上游返回了 XML）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;网关与上游服务器之间的网络中断，导致响应数据传输不完整。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;网关配置错误（如错误的端口、协议不匹配，例如用 HTTP 连接到 HTTPS 上游服务器）。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;举例&lt;/span&gt;：&lt;/p&gt;&lt;/li&gt;&lt;ul class=&quot;auto-hide-last-sibling-br list-paddingleft-2&quot; style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;p&gt;你访问一个博客网站，网站的服务器向数据库服务器请求文章数据，但数据库服务器正在重启，返回了乱码数据，网站服务器无法解析，于是向你显示 502 错误。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;h3 class=&quot;header-vfC6AV auto-hide-last-sibling-br&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; margin-top: 28px; font-size: 18px; overflow-anchor: auto; font-family: Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap-mode: wrap; background-color: rgb(255, 255, 255); margin-bottom: 12px !important; padding-bottom: 0px !important;&quot;&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-size: 16px; line-height: 28px; overflow-anchor: auto;&quot;&gt;总结：如何区分？&lt;/span&gt;&lt;/h3&gt;&lt;ul class=&quot;auto-hide-last-sibling-br list-paddingleft-2&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding-left: 20px; overflow-anchor: auto; font-family: Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(255, 255, 255); margin-bottom: 8px !important; margin-top: 8px !important;&quot;&gt;&lt;li&gt;&lt;p&gt;504：&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;“等太久，没等到回应”&lt;/span&gt;—— 上游服务器 “不作为”（超时未响应）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;502：&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;“收到了，但没法用”&lt;/span&gt;—— 上游服务器 “乱作为”（返回无效响应）。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;</description><pubDate>Thu, 17 Jul 2025 23:50:34 +0800</pubDate></item><item><title>python 多线程任务(下载)水平扩展线程</title><link>https://zuoweng.com/post/240.html</link><description>&lt;h3 class=&quot;header-OdWb_u auto-hide-last-sibling-br&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; margin-top: 28px; font-size: 18px; overflow-anchor: auto; font-family: Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap-mode: wrap; background-color: rgb(255, 255, 255); margin-bottom: 12px !important; padding-bottom: 0px !important;&quot;&gt;方案架构说明&lt;/h3&gt;&lt;div class=&quot;auto-hide-last-sibling-br paragraph-Oc488D paragraph-element br-paragraph-space&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; font-size: 16px; overflow-anchor: auto; font-family: Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap-mode: wrap; background-color: rgb(255, 255, 255); color: rgba(0, 0, 0, 0.85) !important;&quot;&gt;这个方案由两个主要组件构成：&lt;/div&gt;&lt;p&gt;&lt;br class=&quot;container-Vdm5p7 wrapper-_7axQ_ undefined&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); content: &amp;quot;&amp;quot;; display: block; font-size: 20px; margin: 1em; overflow-anchor: auto; font-family: Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;/p&gt;&lt;ol class=&quot;auto-hide-last-sibling-br list-paddingleft-2&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding-left: 20px; overflow-anchor: auto; font-family: Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(255, 255, 255); margin-bottom: 8px !important; margin-top: 8px !important;&quot;&gt;&lt;li&gt;&lt;div class=&quot;auto-hide-last-sibling-br paragraph-Oc488D paragraph-element br-paragraph-space&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; margin-bottom: 0px; margin-top: 0px; overflow-anchor: auto;&quot;&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;任务分发器 (TaskDistributor)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;ul class=&quot;auto-hide-last-sibling-br list-paddingleft-2&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; margin-top: 4px !important; padding-left: 20px !important;&quot;&gt;&lt;li&gt;&lt;p&gt;从 MySQL 数据库中获取待下载的文件&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;将下载任务放入 Redis 队列&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;标记文件状态为 &amp;quot;处理中&amp;quot;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;div class=&quot;auto-hide-last-sibling-br paragraph-Oc488D paragraph-element br-paragraph-space&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; margin-bottom: 0px; margin-top: 0px; overflow-anchor: auto;&quot;&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;工作节点 (DownloadWorker)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;ul class=&quot;auto-hide-last-sibling-br list-paddingleft-2&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; margin-top: 4px !important; padding-left: 20px !important;&quot;&gt;&lt;li&gt;&lt;p&gt;从 Redis 队列获取下载任务&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;执行实际的文件下载&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;更新数据库中的文件状态&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;pre class=&quot;brush:python;toolbar:false&quot;&gt;import&amp;nbsp;requests
import&amp;nbsp;pymysql
import&amp;nbsp;os
import&amp;nbsp;time
import&amp;nbsp;logging
import&amp;nbsp;json
import&amp;nbsp;redis
import&amp;nbsp;argparse
from&amp;nbsp;urllib.parse&amp;nbsp;import&amp;nbsp;urlparse
from&amp;nbsp;requests.exceptions&amp;nbsp;import&amp;nbsp;RequestException
from&amp;nbsp;datetime&amp;nbsp;import&amp;nbsp;datetime

#&amp;nbsp;配置日志
logging.basicConfig(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;level=logging.INFO,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;format=&amp;#39;%(asctime)s&amp;nbsp;-&amp;nbsp;%(levelname)s&amp;nbsp;-&amp;nbsp;%(message)s&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;filename=&amp;#39;downloader.log&amp;#39;
)
logger&amp;nbsp;=&amp;nbsp;logging.getLogger(__name__)

class&amp;nbsp;DownloadWorker:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;db_config,&amp;nbsp;redis_config,&amp;nbsp;download_dir=&amp;#39;downloads&amp;#39;):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;初始化下载工作节点&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.db_config&amp;nbsp;=&amp;nbsp;db_config
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.redis_config&amp;nbsp;=&amp;nbsp;redis_config
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.download_dir&amp;nbsp;=&amp;nbsp;download_dir
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.running&amp;nbsp;=&amp;nbsp;True
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.redis_client&amp;nbsp;=&amp;nbsp;redis.Redis(**redis_config)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.queue_name&amp;nbsp;=&amp;nbsp;&amp;quot;download_queue&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.exit_flag_key&amp;nbsp;=&amp;nbsp;&amp;quot;download_exit_flag&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.session&amp;nbsp;=&amp;nbsp;requests.Session()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.session.headers.update({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;User-Agent&amp;#39;:&amp;nbsp;&amp;#39;Mozilla/5.0&amp;nbsp;(Windows&amp;nbsp;NT&amp;nbsp;10.0;&amp;nbsp;Win64;&amp;nbsp;x64)&amp;nbsp;AppleWebKit/537.36&amp;nbsp;(KHTML,&amp;nbsp;like&amp;nbsp;Gecko)&amp;nbsp;Chrome/91.0.4472.124&amp;nbsp;Safari/537.36&amp;#39;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;创建下载目录
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;os.makedirs(download_dir,&amp;nbsp;exist_ok=True)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;确保数据表存在
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._create_table()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_get_db_connection(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;获取数据库连接&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;pymysql.connect(**self.db_config)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_create_table(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;创建数据表&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with&amp;nbsp;self._get_db_connection()&amp;nbsp;as&amp;nbsp;conn:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with&amp;nbsp;conn.cursor()&amp;nbsp;as&amp;nbsp;cursor:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cursor.execute(&amp;#39;&amp;#39;&amp;#39;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CREATE&amp;nbsp;TABLE&amp;nbsp;IF&amp;nbsp;NOT&amp;nbsp;EXISTS&amp;nbsp;files&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;id&amp;nbsp;VARCHAR(255)&amp;nbsp;PRIMARY&amp;nbsp;KEY,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url&amp;nbsp;TEXT&amp;nbsp;NOT&amp;nbsp;NULL,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;status&amp;nbsp;TINYINT&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;DEFAULT&amp;nbsp;0,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file_path&amp;nbsp;TEXT,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;download_time&amp;nbsp;FLOAT,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;error_message&amp;nbsp;TEXT,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;created_at&amp;nbsp;TIMESTAMP&amp;nbsp;DEFAULT&amp;nbsp;CURRENT_TIMESTAMP,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;updated_at&amp;nbsp;TIMESTAMP&amp;nbsp;DEFAULT&amp;nbsp;CURRENT_TIMESTAMP&amp;nbsp;ON&amp;nbsp;UPDATE&amp;nbsp;CURRENT_TIMESTAMP
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&amp;nbsp;ENGINE=InnoDB&amp;nbsp;DEFAULT&amp;nbsp;CHARSET=utf8mb4;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;&amp;#39;&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;创建索引以加速查询
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cursor.execute(&amp;#39;CREATE&amp;nbsp;INDEX&amp;nbsp;IF&amp;nbsp;NOT&amp;nbsp;EXISTS&amp;nbsp;idx_status&amp;nbsp;ON&amp;nbsp;files&amp;nbsp;(status)&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn.commit()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;download_file(self,&amp;nbsp;file):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;下载单个文件&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file_id&amp;nbsp;=&amp;nbsp;file[&amp;#39;id&amp;#39;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url&amp;nbsp;=&amp;nbsp;file[&amp;#39;url&amp;#39;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start_time&amp;nbsp;=&amp;nbsp;time.time()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;生成保存路径
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;parsed_url&amp;nbsp;=&amp;nbsp;urlparse(url)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;filename&amp;nbsp;=&amp;nbsp;os.path.basename(parsed_url.path)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;filename:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;filename&amp;nbsp;=&amp;nbsp;f&amp;quot;file_{file_id}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file_path&amp;nbsp;=&amp;nbsp;os.path.join(self.download_dir,&amp;nbsp;filename)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;检查文件是否已存在
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;os.path.exists(file_path):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._update_status(file_id,&amp;nbsp;1,&amp;nbsp;file_path,&amp;nbsp;time.time()&amp;nbsp;-&amp;nbsp;start_time)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;file_id,&amp;nbsp;True,&amp;nbsp;f&amp;quot;文件已存在:&amp;nbsp;{file_path}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;下载文件
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response&amp;nbsp;=&amp;nbsp;self.session.get(url,&amp;nbsp;stream=True,&amp;nbsp;timeout=30)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.raise_for_status()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;保存文件
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with&amp;nbsp;open(file_path,&amp;nbsp;&amp;#39;wb&amp;#39;)&amp;nbsp;as&amp;nbsp;f:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;chunk&amp;nbsp;in&amp;nbsp;response.iter_content(chunk_size=8192):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;chunk:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f.write(chunk)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;download_time&amp;nbsp;=&amp;nbsp;time.time()&amp;nbsp;-&amp;nbsp;start_time
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._update_status(file_id,&amp;nbsp;1,&amp;nbsp;file_path,&amp;nbsp;download_time)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.info(f&amp;quot;下载成功&amp;nbsp;(ID:&amp;nbsp;{file_id}):&amp;nbsp;{url}&amp;nbsp;({download_time:.2f}s)&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;file_id,&amp;nbsp;True,&amp;nbsp;f&amp;quot;下载成功&amp;nbsp;({download_time:.2f}s)&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;RequestException&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;error_msg&amp;nbsp;=&amp;nbsp;f&amp;quot;下载失败:&amp;nbsp;{str(e)}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._update_status(file_id,&amp;nbsp;-1,&amp;nbsp;None,&amp;nbsp;time.time()&amp;nbsp;-&amp;nbsp;start_time,&amp;nbsp;error_msg)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.error(f&amp;quot;下载失败&amp;nbsp;(ID:&amp;nbsp;{file_id}):&amp;nbsp;{error_msg}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;file_id,&amp;nbsp;False,&amp;nbsp;error_msg
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;error_msg&amp;nbsp;=&amp;nbsp;f&amp;quot;未知错误:&amp;nbsp;{str(e)}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._update_status(file_id,&amp;nbsp;-1,&amp;nbsp;None,&amp;nbsp;time.time()&amp;nbsp;-&amp;nbsp;start_time,&amp;nbsp;error_msg)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.error(f&amp;quot;未知错误&amp;nbsp;(ID:&amp;nbsp;{file_id}):&amp;nbsp;{error_msg}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;file_id,&amp;nbsp;False,&amp;nbsp;error_msg
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_update_status(self,&amp;nbsp;file_id,&amp;nbsp;status,&amp;nbsp;file_path=None,&amp;nbsp;download_time=None,&amp;nbsp;error_message=None):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;更新文件下载状态&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with&amp;nbsp;self._get_db_connection()&amp;nbsp;as&amp;nbsp;conn:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with&amp;nbsp;conn.cursor()&amp;nbsp;as&amp;nbsp;cursor:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cursor.execute(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;&amp;#39;&amp;#39;UPDATE&amp;nbsp;files&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SET&amp;nbsp;status&amp;nbsp;=&amp;nbsp;%s,&amp;nbsp;file_path&amp;nbsp;=&amp;nbsp;%s,&amp;nbsp;download_time&amp;nbsp;=&amp;nbsp;%s,&amp;nbsp;error_message&amp;nbsp;=&amp;nbsp;%s,&amp;nbsp;updated_at&amp;nbsp;=&amp;nbsp;CURRENT_TIMESTAMP
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WHERE&amp;nbsp;id&amp;nbsp;=&amp;nbsp;%s&amp;#39;&amp;#39;&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(status,&amp;nbsp;file_path,&amp;nbsp;download_time,&amp;nbsp;error_message,&amp;nbsp;file_id)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn.commit()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;process_task(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;从队列获取并处理一个任务&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;检查退出标志
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;self.redis_client.get(self.exit_flag_key):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.info(&amp;quot;检测到退出标志，准备退出...&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.running&amp;nbsp;=&amp;nbsp;False
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;False
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;使用阻塞方式从队列获取任务，超时时间设为1秒
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_,&amp;nbsp;task_json&amp;nbsp;=&amp;nbsp;self.redis_client.blpop(self.queue_name,&amp;nbsp;timeout=1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;task_json:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;task&amp;nbsp;=&amp;nbsp;json.loads(task_json)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file_id,&amp;nbsp;success,&amp;nbsp;message&amp;nbsp;=&amp;nbsp;self.download_file(task)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;记录处理结果
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result_key&amp;nbsp;=&amp;nbsp;f&amp;quot;download_result:{file_id}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result_data&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;id&amp;#39;:&amp;nbsp;file_id,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;success&amp;#39;:&amp;nbsp;success,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;message&amp;#39;:&amp;nbsp;message,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;timestamp&amp;#39;:&amp;nbsp;datetime.now().strftime(&amp;#39;%Y-%m-%d&amp;nbsp;%H:%M:%S&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.redis_client.setex(result_key,&amp;nbsp;86400,&amp;nbsp;json.dumps(result_data))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;success
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;json.JSONDecodeError:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.error(f&amp;quot;无效的任务格式:&amp;nbsp;{task_json}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;False
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.error(f&amp;quot;处理任务时出错:&amp;nbsp;{str(e)}&amp;quot;,&amp;nbsp;exc_info=True)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;False
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;None&amp;nbsp;&amp;nbsp;#&amp;nbsp;没有获取到任务
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;run(self,&amp;nbsp;mode=&amp;#39;forever&amp;#39;):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;运行工作节点
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mode:&amp;nbsp;&amp;#39;forever&amp;#39;&amp;nbsp;-&amp;nbsp;持续运行直到退出标志
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;once&amp;#39;&amp;nbsp;-&amp;nbsp;处理一个任务后退出
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;batch&amp;#39;&amp;nbsp;-&amp;nbsp;处理一批任务后退出
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.info(f&amp;quot;下载工作节点启动，运行模式:&amp;nbsp;{mode}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;processed_count&amp;nbsp;=&amp;nbsp;0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;success_count&amp;nbsp;=&amp;nbsp;0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;mode&amp;nbsp;==&amp;nbsp;&amp;#39;forever&amp;#39;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;self.running:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;self.process_task()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;result&amp;nbsp;is&amp;nbsp;not&amp;nbsp;None:&amp;nbsp;&amp;nbsp;#&amp;nbsp;处理了一个任务
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;processed_count&amp;nbsp;+=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;result:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;success_count&amp;nbsp;+=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;每处理100个任务打印一次统计信息
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;processed_count&amp;nbsp;%&amp;nbsp;100&amp;nbsp;==&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.info(f&amp;quot;已处理任务:&amp;nbsp;{processed_count},&amp;nbsp;成功:&amp;nbsp;{success_count},&amp;nbsp;失败:&amp;nbsp;{processed_count&amp;nbsp;-&amp;nbsp;success_count}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif&amp;nbsp;mode&amp;nbsp;==&amp;nbsp;&amp;#39;once&amp;#39;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.process_task()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif&amp;nbsp;mode&amp;nbsp;==&amp;nbsp;&amp;#39;batch&amp;#39;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;self.process_task()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;result&amp;nbsp;is&amp;nbsp;None:&amp;nbsp;&amp;nbsp;#&amp;nbsp;没有更多任务
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;processed_count&amp;nbsp;+=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;result:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;success_count&amp;nbsp;+=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.info(f&amp;quot;工作节点退出，处理结果:&amp;nbsp;成功={success_count},&amp;nbsp;失败={processed_count-success_count},&amp;nbsp;总计={processed_count}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;KeyboardInterrupt:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.info(&amp;quot;用户中断，程序退出&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.running&amp;nbsp;=&amp;nbsp;False
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.critical(f&amp;quot;程序异常:&amp;nbsp;{str(e)}&amp;quot;,&amp;nbsp;exc_info=True)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.running&amp;nbsp;=&amp;nbsp;False
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;set_exit_flag(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;设置退出标志&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.redis_client.set(self.exit_flag_key,&amp;nbsp;&amp;#39;1&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.info(&amp;quot;已设置退出标志&amp;quot;)

class&amp;nbsp;TaskDistributor:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;db_config,&amp;nbsp;redis_config,&amp;nbsp;batch_size=1000):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;初始化任务分发器&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.db_config&amp;nbsp;=&amp;nbsp;db_config
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.redis_config&amp;nbsp;=&amp;nbsp;redis_config
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.batch_size&amp;nbsp;=&amp;nbsp;batch_size
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.redis_client&amp;nbsp;=&amp;nbsp;redis.Redis(**redis_config)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.queue_name&amp;nbsp;=&amp;nbsp;&amp;quot;download_queue&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.exit_flag_key&amp;nbsp;=&amp;nbsp;&amp;quot;download_exit_flag&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_get_db_connection(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;获取数据库连接&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;pymysql.connect(**self.db_config)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;distribute_tasks(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;从数据库获取待下载任务并分发到队列&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;检查退出标志
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;self.redis_client.get(self.exit_flag_key):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.info(&amp;quot;检测到退出标志，任务分发器准备退出...&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;False
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with&amp;nbsp;self._get_db_connection()&amp;nbsp;as&amp;nbsp;conn:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with&amp;nbsp;conn.cursor(pymysql.cursors.DictCursor)&amp;nbsp;as&amp;nbsp;cursor:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;获取待下载的文件
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cursor.execute(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;&amp;#39;&amp;#39;SELECT&amp;nbsp;id,&amp;nbsp;url&amp;nbsp;FROM&amp;nbsp;files&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WHERE&amp;nbsp;status&amp;nbsp;=&amp;nbsp;0&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LIMIT&amp;nbsp;%s&amp;#39;&amp;#39;&amp;#39;,&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(self.batch_size,)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pending_files&amp;nbsp;=&amp;nbsp;cursor.fetchall()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;pending_files:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;将任务添加到队列
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;file&amp;nbsp;in&amp;nbsp;pending_files:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.redis_client.rpush(self.queue_name,&amp;nbsp;json.dumps(file))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;标记这些文件为&amp;quot;处理中&amp;quot;状态
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file_ids&amp;nbsp;=&amp;nbsp;[file[&amp;#39;id&amp;#39;]&amp;nbsp;for&amp;nbsp;file&amp;nbsp;in&amp;nbsp;pending_files]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;placeholders&amp;nbsp;=&amp;nbsp;&amp;#39;,&amp;nbsp;&amp;#39;.join([&amp;#39;%s&amp;#39;]&amp;nbsp;*&amp;nbsp;len(file_ids))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cursor.execute(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f&amp;#39;&amp;#39;&amp;#39;UPDATE&amp;nbsp;files&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SET&amp;nbsp;status&amp;nbsp;=&amp;nbsp;2,&amp;nbsp;updated_at&amp;nbsp;=&amp;nbsp;CURRENT_TIMESTAMP&amp;nbsp;&amp;nbsp;--&amp;nbsp;2表示处理中
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WHERE&amp;nbsp;id&amp;nbsp;IN&amp;nbsp;({placeholders})&amp;#39;&amp;#39;&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file_ids
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn.commit()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.info(f&amp;quot;已分发&amp;nbsp;{len(pending_files)}&amp;nbsp;个任务到下载队列&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;len(pending_files)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.info(&amp;quot;没有待下载的任务&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;run(self,&amp;nbsp;interval=30):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;运行任务分发器，定期检查并分发任务&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.info(f&amp;quot;任务分发器启动，检查间隔:&amp;nbsp;{interval}秒&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;not&amp;nbsp;self.redis_client.get(self.exit_flag_key):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count&amp;nbsp;=&amp;nbsp;self.distribute_tasks()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;count&amp;nbsp;&amp;lt;&amp;nbsp;self.batch_size:&amp;nbsp;&amp;nbsp;#&amp;nbsp;如果任务不足一批，等待更长时间
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(interval)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(1)&amp;nbsp;&amp;nbsp;#&amp;nbsp;任务充足时，快速检查
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.info(&amp;quot;任务分发器已退出&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;KeyboardInterrupt:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.info(&amp;quot;用户中断，任务分发器退出&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.critical(f&amp;quot;任务分发器异常:&amp;nbsp;{str(e)}&amp;quot;,&amp;nbsp;exc_info=True)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;set_exit_flag(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;设置退出标志&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.redis_client.set(self.exit_flag_key,&amp;nbsp;&amp;#39;1&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.info(&amp;quot;已设置退出标志&amp;quot;)

#&amp;nbsp;使用示例
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;解析命令行参数
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;parser&amp;nbsp;=&amp;nbsp;argparse.ArgumentParser(description=&amp;#39;文件下载器&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;parser.add_argument(&amp;#39;--role&amp;#39;,&amp;nbsp;choices=[&amp;#39;worker&amp;#39;,&amp;nbsp;&amp;#39;distributor&amp;#39;],&amp;nbsp;default=&amp;#39;worker&amp;#39;,&amp;nbsp;help=&amp;#39;运行角色&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;parser.add_argument(&amp;#39;--mode&amp;#39;,&amp;nbsp;choices=[&amp;#39;forever&amp;#39;,&amp;nbsp;&amp;#39;once&amp;#39;,&amp;nbsp;&amp;#39;batch&amp;#39;],&amp;nbsp;default=&amp;#39;forever&amp;#39;,&amp;nbsp;help=&amp;#39;工作模式&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;parser.add_argument(&amp;#39;--config&amp;#39;,&amp;nbsp;default=&amp;#39;config.json&amp;#39;,&amp;nbsp;help=&amp;#39;配置文件路径&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;args&amp;nbsp;=&amp;nbsp;parser.parse_args()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;配置数据库连接
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;db_config&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;host&amp;#39;:&amp;nbsp;&amp;#39;localhost&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;user&amp;#39;:&amp;nbsp;&amp;#39;your_username&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;password&amp;#39;:&amp;nbsp;&amp;#39;your_password&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;database&amp;#39;:&amp;nbsp;&amp;#39;your_database&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;charset&amp;#39;:&amp;nbsp;&amp;#39;utf8mb4&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;cursorclass&amp;#39;:&amp;nbsp;pymysql.cursors.DictCursor
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;配置Redis连接
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;redis_config&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;host&amp;#39;:&amp;nbsp;&amp;#39;localhost&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;port&amp;#39;:&amp;nbsp;6379,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;db&amp;#39;:&amp;nbsp;0,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;decode_responses&amp;#39;:&amp;nbsp;False&amp;nbsp;&amp;nbsp;#&amp;nbsp;存储二进制数据
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;根据角色启动相应组件
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;args.role&amp;nbsp;==&amp;nbsp;&amp;#39;distributor&amp;#39;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;启动任务分发器
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;distributor&amp;nbsp;=&amp;nbsp;TaskDistributor(db_config,&amp;nbsp;redis_config,&amp;nbsp;batch_size=1000)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;distributor.run(interval=30)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;启动工作节点
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;worker&amp;nbsp;=&amp;nbsp;DownloadWorker(db_config,&amp;nbsp;redis_config,&amp;nbsp;download_dir=&amp;#39;downloads&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;worker.run(mode=args.mode)&lt;/pre&gt;&lt;h3 class=&quot;header-OdWb_u auto-hide-last-sibling-br&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; margin-top: 28px; font-size: 18px; overflow-anchor: auto; font-family: Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap-mode: wrap; background-color: rgb(255, 255, 255); margin-bottom: 12px !important; padding-bottom: 0px !important;&quot;&gt;方案优势&lt;/h3&gt;&lt;ol class=&quot;auto-hide-last-sibling-br list-paddingleft-2&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding-left: 20px; overflow-anchor: auto; font-family: Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(255, 255, 255); margin-bottom: 8px !important; margin-top: 8px !important;&quot;&gt;&lt;li&gt;&lt;div class=&quot;auto-hide-last-sibling-br paragraph-Oc488D paragraph-element br-paragraph-space&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; margin-bottom: 0px; margin-top: 0px; overflow-anchor: auto;&quot;&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;水平扩展&lt;/span&gt;：&lt;/div&gt;&lt;/li&gt;&lt;ul class=&quot;auto-hide-last-sibling-br list-paddingleft-2&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; margin-top: 4px !important; padding-left: 20px !important;&quot;&gt;&lt;li&gt;&lt;p&gt;可以轻松通过启动更多工作节点增加并发处理能力&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;工作节点可以分布在不同的服务器上&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;div class=&quot;auto-hide-last-sibling-br paragraph-Oc488D paragraph-element br-paragraph-space&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; margin-bottom: 0px; margin-top: 0px; overflow-anchor: auto;&quot;&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;任务隔离&lt;/span&gt;：&lt;/div&gt;&lt;/li&gt;&lt;ul class=&quot;auto-hide-last-sibling-br list-paddingleft-2&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; margin-top: 4px !important; padding-left: 20px !important;&quot;&gt;&lt;li&gt;&lt;p&gt;每个工作节点是独立的进程，一个节点崩溃不会影响其他节点&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;更好地利用多核 CPU 资源&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;div class=&quot;auto-hide-last-sibling-br paragraph-Oc488D paragraph-element br-paragraph-space&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; margin-bottom: 0px; margin-top: 0px; overflow-anchor: auto;&quot;&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;可靠性&lt;/span&gt;：&lt;/div&gt;&lt;/li&gt;&lt;ul class=&quot;auto-hide-last-sibling-br list-paddingleft-2&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; margin-top: 4px !important; padding-left: 20px !important;&quot;&gt;&lt;li&gt;&lt;p&gt;Redis 队列确保任务不会丢失&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;支持断点续传&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;任务处理状态持久化到数据库&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;div class=&quot;auto-hide-last-sibling-br paragraph-Oc488D paragraph-element br-paragraph-space&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; margin-bottom: 0px; margin-top: 0px; overflow-anchor: auto;&quot;&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;监控和统计&lt;/span&gt;：&lt;/div&gt;&lt;/li&gt;&lt;ul class=&quot;auto-hide-last-sibling-br list-paddingleft-2&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; margin-top: 4px !important; padding-left: 20px !important;&quot;&gt;&lt;li&gt;&lt;p&gt;记录每个任务的处理结果&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;可以通过 Redis 查看实时处理状态&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;h3 class=&quot;header-OdWb_u auto-hide-last-sibling-br&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; margin-top: 28px; font-size: 18px; overflow-anchor: auto; font-family: Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap-mode: wrap; background-color: rgb(255, 255, 255); margin-bottom: 12px !important; padding-bottom: 0px !important;&quot;&gt;主要改进&lt;/h3&gt;&lt;ol class=&quot;auto-hide-last-sibling-br list-paddingleft-2&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding-left: 20px; overflow-anchor: auto; font-family: Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(255, 255, 255); margin-bottom: 8px !important; margin-top: 8px !important;&quot;&gt;&lt;li&gt;&lt;div class=&quot;auto-hide-last-sibling-br paragraph-Oc488D paragraph-element br-paragraph-space&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; margin-bottom: 0px; margin-top: 0px; overflow-anchor: auto;&quot;&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;持久运行与优雅退出&lt;/span&gt;：&lt;/div&gt;&lt;/li&gt;&lt;ul class=&quot;auto-hide-last-sibling-br list-paddingleft-2&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; margin-top: 4px !important; padding-left: 20px !important;&quot;&gt;&lt;li&gt;&lt;p&gt;添加了基于 Redis 的退出标志机制&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;支持多种运行模式：&lt;code style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0.06); border-radius: 4px; color: rgb(0, 0, 0); font-size: 14px; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; overflow-anchor: auto;&quot;&gt;forever&lt;/code&gt;（持续运行）、&lt;code style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0.06); border-radius: 4px; color: rgb(0, 0, 0); font-size: 14px; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; overflow-anchor: auto;&quot;&gt;once&lt;/code&gt;（处理一个任务）、&lt;code style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0.06); border-radius: 4px; color: rgb(0, 0, 0); font-size: 14px; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; overflow-anchor: auto;&quot;&gt;batch&lt;/code&gt;（处理一批任务）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;工作节点和分发器都会定期检查退出标志&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;div class=&quot;auto-hide-last-sibling-br paragraph-Oc488D paragraph-element br-paragraph-space&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; margin-bottom: 0px; margin-top: 0px; overflow-anchor: auto;&quot;&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;命令行参数支持&lt;/span&gt;：&lt;/div&gt;&lt;/li&gt;&lt;ul class=&quot;auto-hide-last-sibling-br list-paddingleft-2&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; margin-top: 4px !important; padding-left: 20px !important;&quot;&gt;&lt;li&gt;&lt;p&gt;使用 argparse 解析命令行参数&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;可以指定运行角色（worker/distributor）和工作模式&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;div class=&quot;auto-hide-last-sibling-br paragraph-Oc488D paragraph-element br-paragraph-space&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; margin-bottom: 0px; margin-top: 0px; overflow-anchor: auto;&quot;&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;增强的错误处理&lt;/span&gt;：&lt;/div&gt;&lt;/li&gt;&lt;ul class=&quot;auto-hide-last-sibling-br list-paddingleft-2&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; margin-top: 4px !important; padding-left: 20px !important;&quot;&gt;&lt;li&gt;&lt;p&gt;捕获 KeyboardInterrupt 异常，支持 Ctrl+C 中断&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;更详细的日志记录&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 class=&quot;header-OdWb_u auto-hide-last-sibling-br&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; margin-top: 28px; font-size: 18px; overflow-anchor: auto; font-family: Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap-mode: wrap; background-color: rgb(255, 255, 255); margin-bottom: 12px !important; padding-bottom: 0px !important;&quot;&gt;使用方法&lt;/h3&gt;&lt;ol class=&quot;auto-hide-last-sibling-br list-paddingleft-2&quot; style=&quot;list-style-type: lower-alpha;&quot;&gt;&lt;li&gt;&lt;div class=&quot;auto-hide-last-sibling-br paragraph-Oc488D paragraph-element br-paragraph-space&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; margin-bottom: 0px; margin-top: 0px; overflow-anchor: auto;&quot;&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;持续运行 Worker（默认模式）&lt;/span&gt;：&lt;/div&gt;&lt;div class=&quot;relative w-fit custom-code-block-canvas-wrapper w-full&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); position: relative; width: 760.2px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;code-block-element-Kq8H8v light custom-code-block-container--bash hide-indicator disable-theme-style custom-code-block-container&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; flex-direction: column; position: relative; --code-area-radius: 6px; --code-area-radius-inner: calc(6px - 1px); --code-area-bg-color: #f9fafb; --code-header-bg-color: #f3f4f6; --code-mask-bg-color: linear-gradient(180deg,rgba(249,250,251,0),#f9fafb); --code-header-icon-color: rgba(0,0,0,.5); --code-header-text-color: rgba(0,0,0,.85); --code-header-icon-bg-color: rgba(0,0,0,.06); --code-block-code-color: #000000d9; --code-block-std-bg-color: #f3f4f6; --code-block-std-err-color: #d60000; margin-top: 8px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;code-area-z8IfZP code-area&quot; dir=&quot;ltr&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background: none 0% 0% / auto repeat scroll padding-box border-box rgb(249, 250, 251); border-radius: 6px; display: flex; flex-direction: column; height: fit-content; width: 760.2px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;header-wrapper-OsF77N&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; background-color: rgb(255, 255, 255); position: sticky; top: 0px;&quot;&gt;&lt;div class=&quot;header-A8bf6p&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(243, 244, 246); display: flex; flex-direction: row; flex-shrink: 0; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; height: 32px; justify-content: space-between; padding: 6px 9px 6px 6px; border-color: rgba(0, 0, 0, 0.08); border-style: solid; border-width: 0.8px 0.8px 0px; border-image: none 100% / 1 / 0 stretch; border-radius: 5px 5px 0px 0px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;title-QMwu7c clickable-p6chjr&quot; tabindex=&quot;0&quot; aria-describedby=&quot;lly563m&quot; data-popupid=&quot;lly563m&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; align-items: center; border-radius: 4px; color: rgba(0, 0, 0, 0.5); display: flex; flex-direction: row; gap: 3px; padding: 0px 4px 0px 10px; cursor: pointer;&quot;&gt;&lt;div class=&quot;text-fbmuIX&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; align-items: center; color: rgba(0, 0, 0, 0.85); display: flex; font-family: &amp;quot;PingFang SC&amp;quot;; font-size: 14px; gap: 3px; line-height: 22px; overflow: hidden; text-overflow: ellipsis; text-wrap-mode: nowrap;&quot;&gt;bash&lt;/div&gt;&lt;div class=&quot;icon-jzrQql&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 15px;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-12&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M21.707 17.293a1 1 0 0 1-1.414 0L12 9l-8.293 8.293a1 1 0 0 1-1.414-1.414l8.293-8.293a2 2 0 0 1 2.828 0l8.293 8.293a1 1 0 0 1 0 1.414&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;action-D_0sSD&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; align-items: center; color: rgba(0, 0, 0, 0.5); cursor: pointer; display: flex; flex-direction: row; gap: 8px; justify-content: space-between;&quot;&gt;&lt;div class=&quot;hoverable-qHOoMX&quot; data-testid=&quot;code-block-copy&quot; tabindex=&quot;0&quot; aria-describedby=&quot;q7qtv9y&quot; data-popupid=&quot;q7qtv9y&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 20px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-14&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 14px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M21 3.5V17a2 2 0 0 1-2 2h-2v-2h2V3.5H9v2h5.857c1.184 0 2.143.895 2.143 2v13c0 1.105-.96 2-2.143 2H5.143C3.959 22.5 3 21.605 3 20.5v-13c0-1.105.96-2 2.143-2H7v-2a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2m-6.143 4H5.143v13h9.714z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;hoverable-qHOoMX&quot; tabindex=&quot;0&quot; aria-describedby=&quot;r572lce&quot; data-popupid=&quot;r572lce&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 20px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-14&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 14px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M4 4a1 1 0 0 1 1 1v3a3 3 0 0 0 3 3h11.086l-5.293-5.293a1 1 0 0 1 1.414-1.414l7 7a1 1 0 0 1 0 1.414l-7 7a1 1 0 0 1-1.414-1.414L19.086 13H8a5 5 0 0 1-5-5V5a1 1 0 0 1 1-1&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;hoverable-qHOoMX&quot; tabindex=&quot;0&quot; aria-describedby=&quot;6qduduh&quot; data-popupid=&quot;6qduduh&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 20px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-14&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 14px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M4.797 16.856a8.28 8.28 0 0 0 6.27 2.87h.008A8.28 8.28 0 0 0 14.372 3.84a11.6 11.6 0 0 1-1.658 7.714 11.62 11.62 0 0 1-7.917 5.303M13.415 1.43a10.28 10.28 0 0 1-2.348 20.296 10.28 10.28 0 0 1-8.883-5.103c-.397-.74.155-1.605.912-1.609a9.617 9.617 0 0 0 9.011-12.258 1.093 1.093 0 0 1 1.308-1.326&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;hoverable-qHOoMX&quot; tabindex=&quot;0&quot; aria-describedby=&quot;3vb0xhm&quot; data-popupid=&quot;3vb0xhm&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 20px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-14&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 14px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M22 3v7a1 1 0 1 1-2 0V4h-6a1 1 0 1 1 0-2h7a1 1 0 0 1 1 1M11.005 21a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1v-7a1 1 0 0 1 2.002 0v6h6.003a1 1 0 0 1 1 1&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;content-qydEZG light-scrollbar-Lun507&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; flex-shrink: 0; height: fit-content; overflow: overlay; padding: 12px 16px 16px; overflow-anchor: auto; border-color: rgba(0, 0, 0, 0.08); border-radius: 0px 0px 5px 5px; border-style: solid; border-width: 0px 1px 1px;&quot;&gt;&lt;pre class=&quot;container-GJFPCm language-bash&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; overflow-wrap: normal; --code-text_v3: #000000d9; --code-doc_v3: #00000073; --code-Link_v3: #2f74ff; --code-number_v3: #e54595; --code-keycontrol_v3: #9952e1; --code-function_v3: #ff5d4d; --code-variable_v3: #000000d9; --code-parameter_v3: #4da621; --code-attributes_v3: #c70; --code-selection-bg-color: #ebf1ff; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); color: rgb(0, 0, 0); word-break: normal; word-spacing: normal; hyphens: none; line-height: 1.5; tab-size: 4; margin-top: 0px; margin-bottom: 0px; overflow: auto; font-size: 13.6px; border-radius: 6px; padding: 0px; overflow-anchor: auto; width: fit-content;&quot;&gt;python&amp;nbsp;downloader.py&amp;nbsp;--role&amp;nbsp;worker&amp;nbsp;--mode&amp;nbsp;forever&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;mask-wrapper-ARWxJv&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; opacity: 0; transition: opacity 0.15s;&quot;&gt;&lt;div class=&quot;mask-hxdXYU&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background: linear-gradient(rgba(249, 250, 251, 0), rgb(249, 250, 251)) 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); bottom: 0px; height: 56px; pointer-events: none; position: absolute; width: 760.2px; overflow-anchor: auto;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;canvas_wrapper-y3Fcgx exited-O8qSm4&quot; data-testid=&quot;canvas-wrapper&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); visibility: hidden; z-index: 10; border-radius: 12px; height: 82px; left: 0px; opacity: 0; pointer-events: none; position: absolute; top: 0px; width: 760px; --canvas-radius-size: 12px; overflow-anchor: auto; --offset-width: 760px; --offset-height: 82px;&quot;&gt;&lt;div data-testid=&quot;canvas_panel_container&quot; data-visible=&quot;false&quot; class=&quot;container-outer-wapATW&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; flex-direction: column; height: 82px; width: 760px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;container-V37bUX&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; border-radius: 12px; box-shadow: rgba(42, 60, 79, 0.1) 0px 6px 10px 0px; display: flex; flex-direction: column; height: 82px; position: relative; transition: border-radius 0.4s ease-in-out; flex: 1 1 0%; min-height: 0px; width: 760px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;container-inner-CLMuXa canvas_wrapper_inner-liGdwM&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex: 1 1 0%; min-height: 0px; width: 760px; border-radius: 12px; overflow: hidden; transition: border-radius 0.4s ease-in-out; overflow-anchor: auto;&quot;&gt;&lt;div style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; width: 760px; height: 82px;&quot;&gt;&lt;div class=&quot;code-canvas code-canvas-theme semi-always-light container-uANf2o&quot; data-theme=&quot;light&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); height: 82px; width: 760px; --canvas-header-height: 56px; --code-editor-header-width: 56px; --code-editor-file-tree-width: 212px; --semi-amber-0: 254,251,235; --semi-amber-1: 252,245,206; --semi-amber-2: 249,232,158; --semi-amber-3: 246,216,111; --semi-amber-4: 243,198,65; --semi-amber-5: 240,177,20; --semi-amber-6: 200,138,15; --semi-amber-7: 160,102,10; --semi-amber-8: 120,70,6; --semi-amber-9: 80,43,3; --semi-black: 0,0,0; --semi-blue-0: 234,245,255; --semi-blue-1: 203,231,254; --semi-blue-2: 152,205,253; --semi-blue-3: 101,178,252; --semi-blue-4: 50,149,251; --semi-blue-5: 0,100,250; --semi-blue-6: 0,98,214; --semi-blue-7: 0,79,179; --semi-blue-8: 0,61,143; --semi-blue-9: 0,44,107; --semi-cyan-0: 229,247,248; --semi-cyan-1: 194,239,240; --semi-cyan-2: 138,221,226; --semi-cyan-3: 88,203,211; --semi-cyan-4: 44,184,197; --semi-cyan-5: 5,164,182; --semi-cyan-6: 3,134,152; --semi-cyan-7: 1,105,121; --semi-cyan-8: 0,77,91; --semi-cyan-9: 0,50,61; --semi-green-0: 236,247,236; --semi-green-1: 208,240,209; --semi-green-2: 164,224,167; --semi-green-3: 125,209,130; --semi-green-4: 90,194,98; --semi-green-5: 59,179,70; --semi-green-6: 48,149,59; --semi-green-7: 37,119,47; --semi-green-8: 27,89,36; --semi-green-9: 17,60,24; --semi-grey-0: 249,249,249; --semi-grey-1: 230,232,234; --semi-grey-2: 198,202,205; --semi-grey-3: 167,171,176; --semi-grey-4: 136,141,146; --semi-grey-5: 107,112,117; --semi-grey-6: 85,91,97; --semi-grey-7: 65,70,76; --semi-grey-8: 46,50,56; --semi-grey-9: 28,31,35; --semi-indigo-0: 236,239,248; --semi-indigo-1: 209,216,240; --semi-indigo-2: 167,179,225; --semi-indigo-3: 128,144,211; --semi-indigo-4: 94,111,196; --semi-indigo-5: 63,81,181; --semi-indigo-6: 51,66,161; --semi-indigo-7: 40,52,140; --semi-indigo-8: 31,40,120; --semi-indigo-9: 23,29,99; --semi-light-blue-0: 233,247,253; --semi-light-blue-1: 201,236,252; --semi-light-blue-2: 149,216,248; --semi-light-blue-3: 98,195,245; --semi-light-blue-4: 48,172,241; --semi-light-blue-5: 0,149,238; --semi-light-blue-6: 0,123,202; --semi-light-blue-7: 0,99,167; --semi-light-blue-8: 0,75,131; --semi-light-blue-9: 0,53,95; --semi-light-green-0: 243,248,236; --semi-light-green-1: 227,240,208; --semi-light-green-2: 200,226,165; --semi-light-green-3: 173,211,126; --semi-light-green-4: 147,197,91; --semi-light-green-5: 123,182,60; --semi-light-green-6: 100,152,48; --semi-light-green-7: 78,121,38; --semi-light-green-8: 57,91,27; --semi-light-green-9: 37,61,18; --semi-lime-0: 242,250,230; --semi-lime-1: 227,246,197; --semi-lime-2: 203,237,142; --semi-lime-3: 183,227,91; --semi-lime-4: 167,218,44; --semi-lime-5: 155,209,0; --semi-lime-6: 126,174,0; --semi-lime-7: 99,139,0; --semi-lime-8: 72,104,0; --semi-lime-9: 47,70,0; --semi-orange-0: 255,248,234; --semi-orange-1: 254,238,204; --semi-orange-2: 254,217,152; --semi-orange-3: 253,193,101; --semi-orange-4: 253,166,51; --semi-orange-5: 252,136,0; --semi-orange-6: 210,103,0; --semi-orange-7: 168,74,0; --semi-orange-8: 126,49,0; --semi-orange-9: 84,29,0; --semi-pink-0: 253,236,239; --semi-pink-1: 251,207,216; --semi-pink-2: 246,160,181; --semi-pink-3: 242,115,150; --semi-pink-4: 237,72,123; --semi-pink-5: 233,30,99; --semi-pink-6: 197,19,86; --semi-pink-7: 162,11,72; --semi-pink-8: 126,5,58; --semi-pink-9: 90,1,43; --semi-purple-0: 247,233,247; --semi-purple-1: 239,202,240; --semi-purple-2: 221,155,224; --semi-purple-3: 201,111,209; --semi-purple-4: 180,73,194; --semi-purple-5: 158,40,179; --semi-purple-6: 135,30,158; --semi-purple-7: 113,22,138; --semi-purple-8: 92,15,117; --semi-purple-9: 73,10,97; --semi-red-0: 254,242,237; --semi-red-1: 254,221,210; --semi-red-2: 253,183,165; --semi-red-3: 251,144,120; --semi-red-4: 250,102,76; --semi-red-5: 249,57,32; --semi-red-6: 213,37,21; --semi-red-7: 178,20,12; --semi-red-8: 142,8,5; --semi-red-9: 106,1,3; --semi-teal-0: 228,247,244; --semi-teal-1: 192,240,232; --semi-teal-2: 135,224,211; --semi-teal-3: 84,209,193; --semi-teal-4: 39,194,176; --semi-teal-5: 0,179,161; --semi-teal-6: 0,149,137; --semi-teal-7: 0,119,111; --semi-teal-8: 0,89,85; --semi-teal-9: 0,60,58; --semi-violet-0: 243,237,249; --semi-violet-1: 226,209,244; --semi-violet-2: 196,167,233; --semi-violet-3: 166,127,221; --semi-violet-4: 136,91,210; --semi-violet-5: 106,58,199; --semi-violet-6: 87,47,179; --semi-violet-7: 70,37,158; --semi-violet-8: 54,28,138; --semi-violet-9: 40,20,117; --semi-white: 255,255,255; --semi-yellow-0: 255,253,234; --semi-yellow-1: 254,251,203; --semi-yellow-2: 253,243,152; --semi-yellow-3: 252,232,101; --semi-yellow-4: 251,218,50; --semi-yellow-5: 250,200,0; --semi-yellow-6: 208,170,0; --semi-yellow-7: 167,139,0; --semi-yellow-8: 125,106,0; --semi-yellow-9: 83,72,0; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;canvas-header-_ng4RX&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; background-color: rgba(0, 0, 0, 0); border-bottom: 0.8px solid rgba(0, 0, 0, 0.08); display: grid; gap: 4px; grid-template-columns: minmax(min-content, 1fr) auto minmax(min-content, 1fr); height: 56px; overflow: hidden; padding: 0px 16px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;canvas-header-left-V6XIuw&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; gap: 4px; overflow: hidden; overflow-anchor: auto;&quot;&gt;&lt;div style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;flex items-center gap-4&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; align-items: center; gap: 4px; overflow-anchor: auto;&quot;&gt;&lt;span class=&quot;inline-flex items-center mr-4 h-20&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; margin-right: 4px; display: inline-flex; height: 20px; align-items: center; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;s-font-small-strong&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-size-adjust: none; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-variant-position: normal; font-variant-emoji: normal; font-stretch: normal; font-size: 14px; line-height: 22px; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;canvas-header-middle-U6siD5&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; gap: 4px; overflow: hidden; grid-column: 2; overflow-anchor: auto;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;canvas-header-right-y8Tw7L&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; gap: 4px; overflow: hidden; justify-content: flex-end; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;header-btn-nkmwlw&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; border-radius: 8px; cursor: pointer; display: inline-flex; gap: 3px; height: 32px; justify-content: center; padding: 4px; width: 69px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-18&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 18px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M21 3.5V17a2 2 0 0 1-2 2h-2v-2h2V3.5H9v2h5.857c1.184 0 2.143.895 2.143 2v13c0 1.105-.96 2-2.143 2H5.143C3.959 22.5 3 21.605 3 20.5v-13c0-1.105.96-2 2.143-2H7v-2a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2m-6.143 4H5.143v13h9.714z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;btn-text-aRIgRD&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; text-align: center; font-family: &amp;quot;PingFang SC&amp;quot;; font-size: 14px; line-height: 22px; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;header-btn-nkmwlw&quot; aria-haspopup=&quot;true&quot; tabindex=&quot;0&quot; aria-describedby=&quot;w4a2dcb&quot; data-popupid=&quot;w4a2dcb&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; border-radius: 8px; cursor: pointer; display: inline-flex; gap: 3px; height: 32px; justify-content: center; padding: 4px; width: 69px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-18&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 18px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M20.207 12.207a1 1 0 0 0-1.414-1.414L13 16.586V2a1 1 0 1 0-2 0v14.586l-5.793-5.793a1 1 0 0 0-1.414 1.414l7.5 7.5c.195.195.45.293.706.293H5a1 1 0 1 0 0 2h14a1 1 0 1 0 0-2h-6.999a1 1 0 0 0 .706-.293z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;btn-text-aRIgRD&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; text-align: center; font-family: &amp;quot;PingFang SC&amp;quot;; font-size: 14px; line-height: 22px; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;more-btn-qQsdj1&quot; aria-haspopup=&quot;true&quot; tabindex=&quot;0&quot; aria-describedby=&quot;4uacbyy&quot; data-popupid=&quot;4uacbyy&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; aspect-ratio: 1 / 1; border-radius: 4px; cursor: pointer; display: flex; flex-shrink: 0; height: 32px; justify-content: center; padding: 7px; width: 32px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-18&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 18px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M5.5 11.75a1.75 1.75 0 1 1-3.5 0 1.75 1.75 0 0 1 3.5 0M13.725 11.75a1.75 1.75 0 1 1-3.5 0 1.75 1.75 0 0 1 3.5 0M22 11.75a1.75 1.75 0 1 1-3.5 0 1.75 1.75 0 0 1 3.5 0&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;divider-ExjbWf&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; background-color: rgba(0, 0, 0, 0.08); height: 16px; margin: 0px 4px; width: 1px; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;button tabindex=&quot;0&quot; class=&quot;semi-button semi-button-primary samantha-button-vtPGz2 quartary-w95bZm medium-DBTMZB icon-D5yFjW icon-only-g_8LKZ tooltip-button-oVRj8d tooltip-button-size-medium-v4uviy semi-button-with-icon semi-button-with-icon-only&quot; type=&quot;button&quot; aria-disabled=&quot;false&quot; aria-describedby=&quot;10wva8f&quot; data-popupid=&quot;10wva8f&quot; style=&quot;-webkit-font-smoothing: antialiased; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; border-width: 0px; border-style: solid; border-color: transparent; border-radius: 10px; box-shadow: none; cursor: pointer; display: inline-flex; font: 500 14px / 22px Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; height: 32px; justify-content: center; outline: none; padding: 4px; user-select: none; vertical-align: middle; text-wrap-mode: nowrap; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; color: rgba(0, 0, 0, 0.85); transform: none; transition: background-color ease-in, border ease-in; appearance: button; overflow-anchor: auto;&quot;&gt;&lt;span class=&quot;semi-button-content&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; overflow: hidden; text-overflow: ellipsis; align-items: center; display: flex; justify-content: center; overflow-anchor: auto; padding: 3px;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-rendering: optimizelegibility; fill: currentcolor; font-size: 18px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M20.307 20.307a.997.997 0 0 0 .003-1.412l-6.845-6.844 6.845-6.845a.997.997 0 0 0-.003-1.412.997.997 0 0 0-1.412-.002l-6.844 6.844-6.845-6.845a.997.997 0 0 0-1.412.003.997.997 0 0 0-.002 1.412l6.844 6.844-6.845 6.845a.997.997 0 0 0 .003 1.412.997.997 0 0 0 1.412.003l6.844-6.845 6.845 6.845a.997.997 0 0 0 1.412-.003&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code-canvas-body&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); height: calc(100% - 56px); overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;content-s0HetY flow-ext-disable-select-bar&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; width: 760px; height: 26px;&quot;&gt;&lt;div class=&quot;resizable-wrapper-EaKdb0 direction-column-F5pTZk&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; height: 26px; width: 760px; flex-direction: column; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;resizable-wrapper-EaKdb0 direction-row-lcyVSf&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; height: 26px; width: 760px; flex-direction: row; overflow-anchor: auto; min-height: 0px;&quot;&gt;&lt;div class=&quot;canvas-body-content-yXFryQ&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); height: 26px; position: relative; width: 760px; overflow-anchor: auto; min-width: 0px;&quot;&gt;&lt;div class=&quot;editor-fOI6Y_&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; display: flow-root; flex: 1 1 0%; height: 26px; width: 760px;&quot;&gt;&lt;div class=&quot;editorContent-FfnwE_&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; height: calc(100% - 12px); margin-top: 12px; overflow-x: auto; position: relative; width: 760px;&quot;&gt;&lt;div class=&quot;cm-theme&quot; data-language-input=&quot;bash&quot; data-language=&quot;shell&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); --code-text: #000000d9; --code-doc: #00000073; --code-link: #2f74ff; --code-number: #e54595; --code-key-control: #9952e1; --code-function: #ff5d4d; --code-variable: #000000d9; --code-parameter: #4da621; --code-attributes: #c70; overflow-anchor: auto; height: 14px; width: 744.8px;&quot;&gt;&lt;div class=&quot;cm-editor ͼ1 ͼ2 ͼ4 ͼ1hy ͼ16 ͼ2q&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-direction: column; font-size: 13px; font-feature-settings: &amp;quot;liga&amp;quot; 0, &amp;quot;calt&amp;quot; 0; color: rgb(0, 0, 0); height: 14px; overflow-anchor: auto; position: relative !important; display: flex !important;&quot;&gt;&lt;div class=&quot;cm-announced&quot; aria-live=&quot;polite&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); position: fixed; top: -10000px; overflow-anchor: auto;&quot;&gt;&lt;/div&gt;&lt;div tabindex=&quot;-1&quot; class=&quot;cm-scroller&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; line-height: 1.4; height: 14px; overflow: scroll; position: relative; z-index: 0; overflow-anchor: auto; display: flex !important; align-items: flex-start !important; --scrollbar-color: transparent; --scrollbar-width: 7px;&quot;&gt;&lt;div class=&quot;cm-gutters&quot; aria-hidden=&quot;true&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-shrink: 0; display: flex; height: 112.4px; inset-inline-start: 0px; z-index: 200; color: rgba(0, 0, 0, 0.3); border-width: initial; border-style: none; border-right-color: transparent; border-top-color: initial; border-bottom-color: initial; border-left-color: initial; border-image: initial; overflow-anchor: auto; min-height: 112.4px; position: sticky;&quot;&gt;&lt;div class=&quot;cm-gutter cm-lineNumbers&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-direction: column; flex-shrink: 0; min-height: 100%; overflow: hidden; display: flex !important; min-width: 6ch; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;cm-gutterElement&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px 3px 0px 5px; min-width: 20px; text-align: right; text-wrap-mode: nowrap; overflow-anchor: auto; height: 0px; visibility: hidden; pointer-events: none;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutterElement cm-activeLineGutter&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background: unset; padding: 0px 3px 0px 5px; min-width: 20px; text-align: right; text-wrap-mode: nowrap; overflow-anchor: auto; height: 18.2px; margin-top: 4px;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutterElement&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px 3px 0px 5px; min-width: 20px; text-align: right; text-wrap-mode: nowrap; overflow-anchor: auto; height: 18.2px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutter cm-foldGutter&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-direction: column; flex-shrink: 0; min-height: 100%; overflow: hidden; display: flex !important; padding: 0px 6px 0px 2px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;cm-gutterElement&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); color: rgb(115, 119, 128); overflow-anchor: auto; height: 0px; visibility: hidden; pointer-events: none;&quot;&gt;&lt;span class=&quot;unfold-button&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; padding: 0px 1px; cursor: pointer; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutterElement cm-activeLineGutter&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background: unset; color: rgb(115, 119, 128); overflow-anchor: auto; height: 18.2px; margin-top: 4px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div spellcheck=&quot;false&quot; autocorrect=&quot;off&quot; autocapitalize=&quot;off&quot; writingsuggestions=&quot;false&quot; translate=&quot;no&quot; contenteditable=&quot;false&quot; class=&quot;cm-content&quot; role=&quot;textbox&quot; aria-multiline=&quot;true&quot; aria-readonly=&quot;true&quot; data-language=&quot;shell&quot; aria-autocomplete=&quot;list&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; flex-grow: 2; flex-shrink: 0; white-space: pre; overflow-wrap: normal; min-height: 100%; padding: 4px 0px 72px; outline: none; overflow-anchor: auto; tab-size: 4; caret-color: transparent !important;&quot;&gt;&lt;div class=&quot;cm-activeLine cm-line&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px 4px 0px 1px; background: unset; overflow-anchor: auto; caret-color: transparent !important;&quot;&gt;&lt;span class=&quot;ͼ1o&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; color: #CC7700; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ͼ1o&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; color: #CC7700; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutters-opposite&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-shrink: 0; position: sticky; right: 0px; height: 28px; overflow-anchor: auto; width: 5px; min-height: 28px;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;cm-layer cm-layer-above cm-cursorLayer&quot; aria-hidden=&quot;true&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); position: absolute; left: 0px; top: 0px; contain: size style; pointer-events: none; overflow-anchor: auto; z-index: 150; animation-duration: 1200ms;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;cm-layer cm-selectionLayer&quot; aria-hidden=&quot;true&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); position: absolute; left: 0px; top: 0px; contain: size style; overflow-anchor: auto; z-index: -2;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ai-generate-label-wrapper-ef3noE&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); border: 0.6px solid rgba(204, 204, 204, 0.5); border-radius: 4px; display: flex; height: 15px; justify-content: center; line-height: 15px; position: absolute; right: 11px; top: 0px; width: 36px; overflow-anchor: auto;&quot;&gt;&lt;span class=&quot;ai-generate-label-qrEHJU&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; color: #CCCCCC; font-size: 8.25px; font-weight: 600; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;28&quot; height=&quot;16&quot; fill=&quot;none&quot; viewbox=&quot;0 0 28 16&quot;&gt;&lt;mask id=&quot;ai-generate-label_svg__a&quot; fill=&quot;#fff&quot;&gt;&lt;path d=&quot;M12.934 5.853c-.322.726-.734 1.345-1.238 1.84l-.57-.718c.744-.776 1.239-1.816 1.495-3.128l.883.165a11 11 0 0 1-.256 1.007h1.436V3.666h.866v1.353h2.617v.834H15.55V7.47h2.46v.834h-2.46v1.799h3.153v.858h-7.345v-.858h3.326v-1.8h-2.327V7.47h2.327V5.853zm12.43-2.328c.37.28.684.57.948.859l-.38.387h.983v.818h-2.427c.066.957.165 1.7.297 2.211.025.116.058.223.091.339.33-.578.603-1.246.817-1.99l.784.34q-.483 1.571-1.238 2.673c.075.165.157.314.24.437.23.355.412.537.536.537q.126 0 .289-1.189l.776.421c-.215 1.164-.52 1.75-.933 1.75-.363 0-.743-.248-1.147-.735a4 4 0 0 1-.33-.495 5.6 5.6 0 0 1-1.882 1.362l-.495-.726a5.4 5.4 0 0 0 1.98-1.51 8 8 0 0 1-.305-.941c-.181-.66-.297-1.494-.363-2.484H21.03v1.147h2.022q-.037 2.302-.247 2.872-.198.517-.867.528a7 7 0 0 1-.668-.041l-.264-.784c.33.024.602.04.833.04.132-.007.223-.09.264-.255.05-.19.074-.71.091-1.552H21.03c-.04 1.536-.38 2.765-1.015 3.698l-.652-.586c.512-.751.776-1.8.8-3.136V4.772h3.401c-.017-.38-.017-.785-.017-1.197h.875q0 .629.025 1.196h1.164a6 6 0 0 0-.793-.726z&quot;&gt;&lt;/path&gt;&lt;/mask&gt;&lt;path fill=&quot;#CCC&quot; d=&quot;M12.934 5.853c-.322.726-.734 1.345-1.238 1.84l-.57-.718c.744-.776 1.239-1.816 1.495-3.128l.883.165a11 11 0 0 1-.256 1.007h1.436V3.666h.866v1.353h2.617v.834H15.55V7.47h2.46v.834h-2.46v1.799h3.153v.858h-7.345v-.858h3.326v-1.8h-2.327V7.47h2.327V5.853zm12.43-2.328c.37.28.684.57.948.859l-.38.387h.983v.818h-2.427c.066.957.165 1.7.297 2.211.025.116.058.223.091.339.33-.578.603-1.246.817-1.99l.784.34q-.483 1.571-1.238 2.673c.075.165.157.314.24.437.23.355.412.537.536.537q.126 0 .289-1.189l.776.421c-.215 1.164-.52 1.75-.933 1.75-.363 0-.743-.248-1.147-.735a4 4 0 0 1-.33-.495 5.6 5.6 0 0 1-1.882 1.362l-.495-.726a5.4 5.4 0 0 0 1.98-1.51 8 8 0 0 1-.305-.941c-.181-.66-.297-1.494-.363-2.484H21.03v1.147h2.022q-.037 2.302-.247 2.872-.198.517-.867.528a7 7 0 0 1-.668-.041l-.264-.784c.33.024.602.04.833.04.132-.007.223-.09.264-.255.05-.19.074-.71.091-1.552H21.03c-.04 1.536-.38 2.765-1.015 3.698l-.652-.586c.512-.751.776-1.8.8-3.136V4.772h3.401c-.017-.38-.017-.785-.017-1.197h.875q0 .629.025 1.196h1.164a6 6 0 0 0-.793-.726z&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;#CCC&quot; d=&quot;M12.934 5.853V5.33h-.34l-.137.31zm-1.238 1.84-.41.325.362.455.415-.407zm-.57-.718-.377-.361-.315.329.283.357zm1.495-3.128.096-.513-.51-.096-.1.51zm.883.165.511.107.11-.522-.525-.098zm-.256 1.007-.498-.157-.215.68h.713zm1.436 0v.523h.522v-.523zm0-1.353v-.523h-.523v.523zm.866 0h.523v-.523h-.523zm0 1.353h-.522v.523h.522zm2.617 0h.522v-.522h-.522zm0 .834v.522h.522v-.522zm-2.617 0V5.33h-.522v.523zm0 1.617h-.522v.523h.522zm2.46 0h.522v-.522h-.522zm0 .834v.522h.522v-.522zm-2.46 0V7.78h-.522v.523zm0 1.799h-.522v.522h.522zm3.153 0h.523V9.58h-.523zm0 .858v.523h.523v-.523zm-7.345 0h-.523v.523h.523zm0-.858V9.58h-.523v.523zm3.326 0v.522h.522v-.522zm0-1.8h.522v-.522h-.522zm-2.327 0h-.523v.523h.523zm0-.833v-.522h-.523v.522zm2.327 0v.523h.522V7.47zm0-1.617h.522V5.33h-.522zm-1.75 0-.477-.212q-.452 1.015-1.127 1.68l.366.372.367.373c.557-.549 1.005-1.225 1.349-2.002zm-1.238 1.84.41-.325-.57-.718-.41.325-.409.325.57.718zm-.57-.718.378.361c.828-.864 1.36-2.003 1.63-3.389l-.513-.1-.513-.1c-.242 1.239-.7 2.18-1.359 2.867zm1.495-3.128-.096.514.883.165.096-.514.096-.513-.883-.165zm.883.165-.512-.107c-.072.345-.15.665-.243.957l.499.157.498.157c.106-.336.193-.692.27-1.057zm-.256 1.007v.523h1.436V4.497h-1.436zm1.436 0h.522V3.666h-1.045v1.353zm0-1.353v.522h.866V3.143h-.866zm.866 0h-.522v1.353h1.045V3.666zm0 1.353v.523h2.617V4.497H15.55zm2.617 0h-.523v.834h1.045v-.834zm0 .834V5.33H15.55v1.045h2.617zm-2.617 0h-.522V7.47h1.045V5.853zm0 1.617v.523h2.46V6.948h-2.46zm2.46 0h-.523v.834h1.045V7.47zm0 .834V7.78h-2.46v1.045h2.46zm-2.46 0h-.522v1.799h1.045v-1.8zm0 1.799v.522h3.153V9.58H15.55zm3.153 0h-.523v.858h1.046v-.858zm0 .858v-.522h-7.345v1.045h7.345zm-7.345 0h.522v-.858h-1.045v.858zm0-.858v.522h3.326V9.58h-3.326zm3.326 0h.522v-1.8h-1.045v1.8zm0-1.8v-.522h-2.327v1.045h2.327zm-2.327 0h.522V7.47h-1.045v.834zm0-.833v.523h2.327V6.948h-2.327zm2.327 0h.522V5.853h-1.045V7.47zm0-1.617V5.33h-1.75v1.045h1.75zm10.68-2.328.314-.417-.354-.267-.322.306zm.948.859.374.365.345-.353-.333-.365zm-.38.387-.373-.365-.869.888h1.243zm.983 0h.522V4.25h-.522zm0 .818v.522h.522v-.522zm-2.427 0v-.523h-.56l.039.558zm.297 2.211.511-.11-.002-.01-.003-.01zm.091.339-.502.143.34 1.193.616-1.077zm.817-1.99.207-.479-.544-.235-.165.57zm.784.34.5.152.137-.447-.43-.186zM25.24 9.161l-.43-.295-.167.242.12.267zm.24.437.438-.285-.004-.004zm.825-.652.25-.459-.666-.36-.102.75zm.776.421.514.095.068-.373-.333-.18zM25 10.383l-.413.321.006.007.005.006zm-.33-.495.459-.25-.35-.642-.494.54zm-1.882 1.362-.431.294.245.36.397-.176zm-.495-.726-.213-.477-.57.255.351.516zm1.98-1.51.404.332.197-.239-.115-.288zm-.305-.941.505-.136v-.003zm-.363-2.484.522-.035-.033-.488h-.489zm-2.575 0v-.523h-.522v.523zm0 1.147h-.522v.522h.522zm2.022 0 .523.008.008-.53h-.53zm-.247 2.872.488.186.002-.005zm-.867.528v.523h.01zm-.668-.041-.495.166.107.32.336.034zm-.264-.784.039-.521-.786-.06.251.747zm.833.04v.523h.033zm.264-.255-.505-.132-.002.005zm.091-1.552.522.01.01-.532h-.532zm-1.164 0v-.522h-.508l-.014.508zm-1.015 3.698-.35.388.445.4.337-.494zm-.652-.586-.432-.294-.257.377.34.305zm.8-3.136.523.01v-.01zm0-2.748v-.523h-.522v.523zm3.401 0v.522h.546l-.024-.545zm-.017-1.197v-.523h-.522v.523zm.875 0h.523v-.523h-.523zm.025 1.196-.522.023.022.5h.5zm1.164 0v.523h1.167L26 4.424zm-.793-.726-.36-.378-.441.42.483.372zm.545-.52-.315.417c.347.262.637.53.879.794l.385-.352.386-.353a7.5 7.5 0 0 0-1.02-.923zm.95.859-.374-.366-.38.388.374.365.373.366.38-.388zm-.38.387v.523h.982V4.249h-.982zm.982 0h-.523v.818h1.045V4.77zm0 .818v-.523h-2.427v1.045h2.427zm-2.427 0-.521.035c.067.968.168 1.748.313 2.307l.505-.13.506-.131q-.182-.697-.281-2.117zm.297 2.211-.51.11c.029.138.07.27.099.372l.502-.143.503-.144c-.037-.129-.063-.211-.083-.304zm.091.339.454.259c.354-.62.641-1.328.865-2.103l-.502-.145-.502-.145a8.6 8.6 0 0 1-.768 1.874zm.817-1.99-.207.48.784.339.207-.48.207-.48-.784-.338zm.784.34-.5-.154c-.309 1.009-.701 1.85-1.169 2.532l.431.295.431.295c.54-.786.973-1.728 1.307-2.816zM25.24 9.161l-.476.214c.085.19.181.364.28.513l.436-.29.434-.29a2.5 2.5 0 0 1-.197-.361zm.24.437-.438.286c.124.19.25.359.377.485.063.064.139.13.227.181.085.051.213.107.37.107V9.613c.095 0 .154.034.163.04.012.007.005.005-.021-.022a2 2 0 0 1-.24-.317zm.536.537v.522a.56.56 0 0 0 .425-.197.8.8 0 0 0 .115-.183c.044-.094.076-.206.103-.315.055-.225.11-.544.164-.945l-.518-.07-.518-.07c-.053.39-.102.666-.143.837q-.016.061-.027.097l-.011.033q0-.002.01-.018a.48.48 0 0 1 .4-.213zm.289-1.189-.25.46.777.42.249-.459.249-.459-.776-.42zm.776.421-.514-.094c-.104.565-.223.94-.34 1.16-.124.234-.166.162-.079.162v1.044c.5 0 .817-.365 1.002-.716.193-.362.334-.862.445-1.46zm-.933 1.75v-.523c-.12 0-.366-.088-.745-.545l-.402.333-.402.334c.43.517.943.923 1.55.923zM25 10.383l.412-.32a3 3 0 0 1-.283-.425l-.46.25-.458.25c.117.214.25.404.377.566zm-.33-.495-.385-.353a5.1 5.1 0 0 1-1.708 1.237l.211.478.211.478a6.1 6.1 0 0 0 2.056-1.487zm-1.882 1.362.432-.294-.495-.727-.432.295-.432.294.495.726zm-.495-.726.213.477a5.9 5.9 0 0 0 2.17-1.655l-.402-.332-.403-.333a4.86 4.86 0 0 1-1.791 1.366zm1.98-1.51.486-.195a8 8 0 0 1-.286-.882l-.505.136-.504.135q.14.528.325 1zm-.305-.941.504-.139c-.168-.612-.28-1.406-.345-2.38l-.522.035-.521.034c.067 1.007.186 1.88.38 2.588zm-.363-2.484v-.523H21.03v1.045h2.575zm-2.575 0h-.522v1.147h1.045V5.589zm0 1.147v.522h2.022V6.213H21.03zm2.022 0-.522-.009a27 27 0 0 1-.079 1.833c-.041.478-.093.75-.136.867l.49.18.49.182c.097-.263.156-.66.197-1.14q.064-.743.083-1.905zm-.247 2.872-.489-.186c-.028.075-.062.108-.098.13a.6.6 0 0 1-.29.061l.01.523.01.522c.285-.005.567-.064.812-.213.253-.153.43-.38.533-.651zm-.867.528v-.523a6 6 0 0 1-.616-.038l-.052.52-.052.52c.253.025.496.043.72.043zm-.668-.041.495-.167-.264-.784-.495.167-.496.166.264.784zm-.264-.784-.04.52c.331.025.62.043.873.043V8.83c-.21 0-.465-.015-.794-.04zm.833.04.033.522a.78.78 0 0 0 .494-.212.9.9 0 0 0 .244-.438l-.507-.127-.507-.127c-.004.019 0-.019.049-.064a.3.3 0 0 1 .162-.075zm.264-.255.506.132c.04-.153.06-.382.074-.634q.022-.404.033-1.04l-.522-.01-.522-.01q-.013.628-.033 1.002a3 3 0 0 1-.041.428zm.091-1.552v-.522H21.03v1.045h1.164zm-1.164 0-.522-.014c-.04 1.47-.362 2.592-.925 3.418l.432.294.432.294c.709-1.04 1.063-2.377 1.106-3.977zm-1.015 3.698.35-.389-.652-.586-.35.389-.349.388.652.586zm-.652-.586.432.294c.59-.867.865-2.03.891-3.42l-.522-.01-.523-.01c-.023 1.283-.277 2.217-.71 2.852zm.8-3.136h.523V4.772h-1.045V7.52zm0-2.748v.522h3.401V4.249h-3.4zm3.401 0 .522-.023a28 28 0 0 1-.016-1.174h-1.045c0 .41 0 .826.017 1.22zm-.017-1.197v.522h.875V3.052h-.875zm.875 0H23.9c0 .428.008.831.025 1.22l.522-.024.522-.022c-.016-.372-.024-.76-.024-1.174zm.025 1.196v.523h1.164V4.249h-1.164zm1.164 0 .39-.348a6.4 6.4 0 0 0-.864-.792l-.319.414-.318.414a5.3 5.3 0 0 1 .72.66zm-.793-.726.361.378.545-.52-.36-.378-.362-.378-.544.52z&quot; mask=&quot;url(#ai-generate-label_svg__a)&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;#CCC&quot; d=&quot;M6.544 10.85H5.112L4.652 9h-1.99l-.653 1.85H.577l2.268-6.422H4.95zm2.28 0h-1.52l.337-6.422h1.52zM3.047 7.91h1.335L3.83 5.692z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;container-footer-TocUUl&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br class=&quot;container-Vdm5p7 wrapper-_7axQ_ undefined&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto;&quot;/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;div class=&quot;auto-hide-last-sibling-br paragraph-Oc488D paragraph-element br-paragraph-space&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; margin-bottom: 0px; margin-top: 0px; overflow-anchor: auto;&quot;&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;单次运行 Worker（测试用）&lt;/span&gt;：&lt;/div&gt;&lt;div class=&quot;relative w-fit custom-code-block-canvas-wrapper w-full&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); position: relative; width: 760.2px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;code-block-element-Kq8H8v light custom-code-block-container--bash hide-indicator disable-theme-style custom-code-block-container&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; flex-direction: column; position: relative; --code-area-radius: 6px; --code-area-radius-inner: calc(6px - 1px); --code-area-bg-color: #f9fafb; --code-header-bg-color: #f3f4f6; --code-mask-bg-color: linear-gradient(180deg,rgba(249,250,251,0),#f9fafb); --code-header-icon-color: rgba(0,0,0,.5); --code-header-text-color: rgba(0,0,0,.85); --code-header-icon-bg-color: rgba(0,0,0,.06); --code-block-code-color: #000000d9; --code-block-std-bg-color: #f3f4f6; --code-block-std-err-color: #d60000; margin-top: 8px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;code-area-z8IfZP code-area&quot; dir=&quot;ltr&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background: none 0% 0% / auto repeat scroll padding-box border-box rgb(249, 250, 251); border-radius: 6px; display: flex; flex-direction: column; height: fit-content; width: 760.2px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;header-wrapper-OsF77N&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; background-color: rgb(255, 255, 255); position: sticky; top: 0px;&quot;&gt;&lt;div class=&quot;header-A8bf6p&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(243, 244, 246); display: flex; flex-direction: row; flex-shrink: 0; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; height: 32px; justify-content: space-between; padding: 6px 9px 6px 6px; border-color: rgba(0, 0, 0, 0.08); border-style: solid; border-width: 0.8px 0.8px 0px; border-image: none 100% / 1 / 0 stretch; border-radius: 5px 5px 0px 0px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;title-QMwu7c clickable-p6chjr&quot; tabindex=&quot;0&quot; aria-describedby=&quot;ll2zsn8&quot; data-popupid=&quot;ll2zsn8&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; align-items: center; border-radius: 4px; color: rgba(0, 0, 0, 0.5); display: flex; flex-direction: row; gap: 3px; padding: 0px 4px 0px 10px; cursor: pointer;&quot;&gt;&lt;div class=&quot;text-fbmuIX&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; align-items: center; color: rgba(0, 0, 0, 0.85); display: flex; font-family: &amp;quot;PingFang SC&amp;quot;; font-size: 14px; gap: 3px; line-height: 22px; overflow: hidden; text-overflow: ellipsis; text-wrap-mode: nowrap;&quot;&gt;bash&lt;/div&gt;&lt;div class=&quot;icon-jzrQql&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 15px;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-12&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M21.707 17.293a1 1 0 0 1-1.414 0L12 9l-8.293 8.293a1 1 0 0 1-1.414-1.414l8.293-8.293a2 2 0 0 1 2.828 0l8.293 8.293a1 1 0 0 1 0 1.414&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;action-D_0sSD&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; align-items: center; color: rgba(0, 0, 0, 0.5); cursor: pointer; display: flex; flex-direction: row; gap: 8px; justify-content: space-between;&quot;&gt;&lt;div class=&quot;hoverable-qHOoMX&quot; data-testid=&quot;code-block-copy&quot; tabindex=&quot;0&quot; aria-describedby=&quot;7lvb13b&quot; data-popupid=&quot;7lvb13b&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 20px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-14&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 14px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M21 3.5V17a2 2 0 0 1-2 2h-2v-2h2V3.5H9v2h5.857c1.184 0 2.143.895 2.143 2v13c0 1.105-.96 2-2.143 2H5.143C3.959 22.5 3 21.605 3 20.5v-13c0-1.105.96-2 2.143-2H7v-2a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2m-6.143 4H5.143v13h9.714z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;hoverable-qHOoMX&quot; tabindex=&quot;0&quot; aria-describedby=&quot;c9dggua&quot; data-popupid=&quot;c9dggua&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 20px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-14&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 14px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M4 4a1 1 0 0 1 1 1v3a3 3 0 0 0 3 3h11.086l-5.293-5.293a1 1 0 0 1 1.414-1.414l7 7a1 1 0 0 1 0 1.414l-7 7a1 1 0 0 1-1.414-1.414L19.086 13H8a5 5 0 0 1-5-5V5a1 1 0 0 1 1-1&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;hoverable-qHOoMX&quot; tabindex=&quot;0&quot; aria-describedby=&quot;1afapop&quot; data-popupid=&quot;1afapop&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 20px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-14&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 14px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M4.797 16.856a8.28 8.28 0 0 0 6.27 2.87h.008A8.28 8.28 0 0 0 14.372 3.84a11.6 11.6 0 0 1-1.658 7.714 11.62 11.62 0 0 1-7.917 5.303M13.415 1.43a10.28 10.28 0 0 1-2.348 20.296 10.28 10.28 0 0 1-8.883-5.103c-.397-.74.155-1.605.912-1.609a9.617 9.617 0 0 0 9.011-12.258 1.093 1.093 0 0 1 1.308-1.326&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;hoverable-qHOoMX&quot; tabindex=&quot;0&quot; aria-describedby=&quot;kbuq9u1&quot; data-popupid=&quot;kbuq9u1&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 20px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-14&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 14px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M22 3v7a1 1 0 1 1-2 0V4h-6a1 1 0 1 1 0-2h7a1 1 0 0 1 1 1M11.005 21a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1v-7a1 1 0 0 1 2.002 0v6h6.003a1 1 0 0 1 1 1&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;content-qydEZG light-scrollbar-Lun507&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; flex-shrink: 0; height: fit-content; overflow: overlay; padding: 12px 16px 16px; overflow-anchor: auto; border-color: rgba(0, 0, 0, 0.08); border-radius: 0px 0px 5px 5px; border-style: solid; border-width: 0px 1px 1px;&quot;&gt;&lt;pre class=&quot;container-GJFPCm language-bash&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; overflow-wrap: normal; --code-text_v3: #000000d9; --code-doc_v3: #00000073; --code-Link_v3: #2f74ff; --code-number_v3: #e54595; --code-keycontrol_v3: #9952e1; --code-function_v3: #ff5d4d; --code-variable_v3: #000000d9; --code-parameter_v3: #4da621; --code-attributes_v3: #c70; --code-selection-bg-color: #ebf1ff; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); color: rgb(0, 0, 0); word-break: normal; word-spacing: normal; hyphens: none; line-height: 1.5; tab-size: 4; margin-top: 0px; margin-bottom: 0px; overflow: auto; font-size: 13.6px; border-radius: 6px; padding: 0px; overflow-anchor: auto; width: fit-content;&quot;&gt;python&amp;nbsp;downloader.py&amp;nbsp;--role&amp;nbsp;worker&amp;nbsp;--mode&amp;nbsp;once&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;mask-wrapper-ARWxJv&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; opacity: 0; transition: opacity 0.15s;&quot;&gt;&lt;div class=&quot;mask-hxdXYU&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background: linear-gradient(rgba(249, 250, 251, 0), rgb(249, 250, 251)) 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); bottom: 0px; height: 56px; pointer-events: none; position: absolute; width: 760.2px; overflow-anchor: auto;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;canvas_wrapper-y3Fcgx exited-O8qSm4&quot; data-testid=&quot;canvas-wrapper&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); visibility: hidden; z-index: 10; border-radius: 12px; height: 82px; left: 0px; opacity: 0; pointer-events: none; position: absolute; top: 0px; width: 760px; --canvas-radius-size: 12px; overflow-anchor: auto; --offset-width: 760px; --offset-height: 82px;&quot;&gt;&lt;div data-testid=&quot;canvas_panel_container&quot; data-visible=&quot;false&quot; class=&quot;container-outer-wapATW&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; flex-direction: column; height: 82px; width: 760px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;container-V37bUX&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; border-radius: 12px; box-shadow: rgba(42, 60, 79, 0.1) 0px 6px 10px 0px; display: flex; flex-direction: column; height: 82px; position: relative; transition: border-radius 0.4s ease-in-out; flex: 1 1 0%; min-height: 0px; width: 760px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;container-inner-CLMuXa canvas_wrapper_inner-liGdwM&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex: 1 1 0%; min-height: 0px; width: 760px; border-radius: 12px; overflow: hidden; transition: border-radius 0.4s ease-in-out; overflow-anchor: auto;&quot;&gt;&lt;div style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; width: 760px; height: 82px;&quot;&gt;&lt;div class=&quot;code-canvas code-canvas-theme semi-always-light container-uANf2o&quot; data-theme=&quot;light&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); height: 82px; width: 760px; --canvas-header-height: 56px; --code-editor-header-width: 56px; --code-editor-file-tree-width: 212px; --semi-amber-0: 254,251,235; --semi-amber-1: 252,245,206; --semi-amber-2: 249,232,158; --semi-amber-3: 246,216,111; --semi-amber-4: 243,198,65; --semi-amber-5: 240,177,20; --semi-amber-6: 200,138,15; --semi-amber-7: 160,102,10; --semi-amber-8: 120,70,6; --semi-amber-9: 80,43,3; --semi-black: 0,0,0; --semi-blue-0: 234,245,255; --semi-blue-1: 203,231,254; --semi-blue-2: 152,205,253; --semi-blue-3: 101,178,252; --semi-blue-4: 50,149,251; --semi-blue-5: 0,100,250; --semi-blue-6: 0,98,214; --semi-blue-7: 0,79,179; --semi-blue-8: 0,61,143; --semi-blue-9: 0,44,107; --semi-cyan-0: 229,247,248; --semi-cyan-1: 194,239,240; --semi-cyan-2: 138,221,226; --semi-cyan-3: 88,203,211; --semi-cyan-4: 44,184,197; --semi-cyan-5: 5,164,182; --semi-cyan-6: 3,134,152; --semi-cyan-7: 1,105,121; --semi-cyan-8: 0,77,91; --semi-cyan-9: 0,50,61; --semi-green-0: 236,247,236; --semi-green-1: 208,240,209; --semi-green-2: 164,224,167; --semi-green-3: 125,209,130; --semi-green-4: 90,194,98; --semi-green-5: 59,179,70; --semi-green-6: 48,149,59; --semi-green-7: 37,119,47; --semi-green-8: 27,89,36; --semi-green-9: 17,60,24; --semi-grey-0: 249,249,249; --semi-grey-1: 230,232,234; --semi-grey-2: 198,202,205; --semi-grey-3: 167,171,176; --semi-grey-4: 136,141,146; --semi-grey-5: 107,112,117; --semi-grey-6: 85,91,97; --semi-grey-7: 65,70,76; --semi-grey-8: 46,50,56; --semi-grey-9: 28,31,35; --semi-indigo-0: 236,239,248; --semi-indigo-1: 209,216,240; --semi-indigo-2: 167,179,225; --semi-indigo-3: 128,144,211; --semi-indigo-4: 94,111,196; --semi-indigo-5: 63,81,181; --semi-indigo-6: 51,66,161; --semi-indigo-7: 40,52,140; --semi-indigo-8: 31,40,120; --semi-indigo-9: 23,29,99; --semi-light-blue-0: 233,247,253; --semi-light-blue-1: 201,236,252; --semi-light-blue-2: 149,216,248; --semi-light-blue-3: 98,195,245; --semi-light-blue-4: 48,172,241; --semi-light-blue-5: 0,149,238; --semi-light-blue-6: 0,123,202; --semi-light-blue-7: 0,99,167; --semi-light-blue-8: 0,75,131; --semi-light-blue-9: 0,53,95; --semi-light-green-0: 243,248,236; --semi-light-green-1: 227,240,208; --semi-light-green-2: 200,226,165; --semi-light-green-3: 173,211,126; --semi-light-green-4: 147,197,91; --semi-light-green-5: 123,182,60; --semi-light-green-6: 100,152,48; --semi-light-green-7: 78,121,38; --semi-light-green-8: 57,91,27; --semi-light-green-9: 37,61,18; --semi-lime-0: 242,250,230; --semi-lime-1: 227,246,197; --semi-lime-2: 203,237,142; --semi-lime-3: 183,227,91; --semi-lime-4: 167,218,44; --semi-lime-5: 155,209,0; --semi-lime-6: 126,174,0; --semi-lime-7: 99,139,0; --semi-lime-8: 72,104,0; --semi-lime-9: 47,70,0; --semi-orange-0: 255,248,234; --semi-orange-1: 254,238,204; --semi-orange-2: 254,217,152; --semi-orange-3: 253,193,101; --semi-orange-4: 253,166,51; --semi-orange-5: 252,136,0; --semi-orange-6: 210,103,0; --semi-orange-7: 168,74,0; --semi-orange-8: 126,49,0; --semi-orange-9: 84,29,0; --semi-pink-0: 253,236,239; --semi-pink-1: 251,207,216; --semi-pink-2: 246,160,181; --semi-pink-3: 242,115,150; --semi-pink-4: 237,72,123; --semi-pink-5: 233,30,99; --semi-pink-6: 197,19,86; --semi-pink-7: 162,11,72; --semi-pink-8: 126,5,58; --semi-pink-9: 90,1,43; --semi-purple-0: 247,233,247; --semi-purple-1: 239,202,240; --semi-purple-2: 221,155,224; --semi-purple-3: 201,111,209; --semi-purple-4: 180,73,194; --semi-purple-5: 158,40,179; --semi-purple-6: 135,30,158; --semi-purple-7: 113,22,138; --semi-purple-8: 92,15,117; --semi-purple-9: 73,10,97; --semi-red-0: 254,242,237; --semi-red-1: 254,221,210; --semi-red-2: 253,183,165; --semi-red-3: 251,144,120; --semi-red-4: 250,102,76; --semi-red-5: 249,57,32; --semi-red-6: 213,37,21; --semi-red-7: 178,20,12; --semi-red-8: 142,8,5; --semi-red-9: 106,1,3; --semi-teal-0: 228,247,244; --semi-teal-1: 192,240,232; --semi-teal-2: 135,224,211; --semi-teal-3: 84,209,193; --semi-teal-4: 39,194,176; --semi-teal-5: 0,179,161; --semi-teal-6: 0,149,137; --semi-teal-7: 0,119,111; --semi-teal-8: 0,89,85; --semi-teal-9: 0,60,58; --semi-violet-0: 243,237,249; --semi-violet-1: 226,209,244; --semi-violet-2: 196,167,233; --semi-violet-3: 166,127,221; --semi-violet-4: 136,91,210; --semi-violet-5: 106,58,199; --semi-violet-6: 87,47,179; --semi-violet-7: 70,37,158; --semi-violet-8: 54,28,138; --semi-violet-9: 40,20,117; --semi-white: 255,255,255; --semi-yellow-0: 255,253,234; --semi-yellow-1: 254,251,203; --semi-yellow-2: 253,243,152; --semi-yellow-3: 252,232,101; --semi-yellow-4: 251,218,50; --semi-yellow-5: 250,200,0; --semi-yellow-6: 208,170,0; --semi-yellow-7: 167,139,0; --semi-yellow-8: 125,106,0; --semi-yellow-9: 83,72,0; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;canvas-header-_ng4RX&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; background-color: rgba(0, 0, 0, 0); border-bottom: 0.8px solid rgba(0, 0, 0, 0.08); display: grid; gap: 4px; grid-template-columns: minmax(min-content, 1fr) auto minmax(min-content, 1fr); height: 56px; overflow: hidden; padding: 0px 16px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;canvas-header-left-V6XIuw&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; gap: 4px; overflow: hidden; overflow-anchor: auto;&quot;&gt;&lt;div style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;flex items-center gap-4&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; align-items: center; gap: 4px; overflow-anchor: auto;&quot;&gt;&lt;span class=&quot;inline-flex items-center mr-4 h-20&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; margin-right: 4px; display: inline-flex; height: 20px; align-items: center; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;s-font-small-strong&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-size-adjust: none; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-variant-position: normal; font-variant-emoji: normal; font-stretch: normal; font-size: 14px; line-height: 22px; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;canvas-header-middle-U6siD5&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; gap: 4px; overflow: hidden; grid-column: 2; overflow-anchor: auto;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;canvas-header-right-y8Tw7L&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; gap: 4px; overflow: hidden; justify-content: flex-end; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;header-btn-nkmwlw&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; border-radius: 8px; cursor: pointer; display: inline-flex; gap: 3px; height: 32px; justify-content: center; padding: 4px; width: 69px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-18&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 18px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M21 3.5V17a2 2 0 0 1-2 2h-2v-2h2V3.5H9v2h5.857c1.184 0 2.143.895 2.143 2v13c0 1.105-.96 2-2.143 2H5.143C3.959 22.5 3 21.605 3 20.5v-13c0-1.105.96-2 2.143-2H7v-2a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2m-6.143 4H5.143v13h9.714z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;btn-text-aRIgRD&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; text-align: center; font-family: &amp;quot;PingFang SC&amp;quot;; font-size: 14px; line-height: 22px; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;header-btn-nkmwlw&quot; aria-haspopup=&quot;true&quot; tabindex=&quot;0&quot; aria-describedby=&quot;q8rihp0&quot; data-popupid=&quot;q8rihp0&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; border-radius: 8px; cursor: pointer; display: inline-flex; gap: 3px; height: 32px; justify-content: center; padding: 4px; width: 69px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-18&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 18px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M20.207 12.207a1 1 0 0 0-1.414-1.414L13 16.586V2a1 1 0 1 0-2 0v14.586l-5.793-5.793a1 1 0 0 0-1.414 1.414l7.5 7.5c.195.195.45.293.706.293H5a1 1 0 1 0 0 2h14a1 1 0 1 0 0-2h-6.999a1 1 0 0 0 .706-.293z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;btn-text-aRIgRD&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; text-align: center; font-family: &amp;quot;PingFang SC&amp;quot;; font-size: 14px; line-height: 22px; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;more-btn-qQsdj1&quot; aria-haspopup=&quot;true&quot; tabindex=&quot;0&quot; aria-describedby=&quot;9x5g7ub&quot; data-popupid=&quot;9x5g7ub&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; aspect-ratio: 1 / 1; border-radius: 4px; cursor: pointer; display: flex; flex-shrink: 0; height: 32px; justify-content: center; padding: 7px; width: 32px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-18&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 18px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M5.5 11.75a1.75 1.75 0 1 1-3.5 0 1.75 1.75 0 0 1 3.5 0M13.725 11.75a1.75 1.75 0 1 1-3.5 0 1.75 1.75 0 0 1 3.5 0M22 11.75a1.75 1.75 0 1 1-3.5 0 1.75 1.75 0 0 1 3.5 0&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;divider-ExjbWf&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; background-color: rgba(0, 0, 0, 0.08); height: 16px; margin: 0px 4px; width: 1px; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;button tabindex=&quot;0&quot; class=&quot;semi-button semi-button-primary samantha-button-vtPGz2 quartary-w95bZm medium-DBTMZB icon-D5yFjW icon-only-g_8LKZ tooltip-button-oVRj8d tooltip-button-size-medium-v4uviy semi-button-with-icon semi-button-with-icon-only&quot; type=&quot;button&quot; aria-disabled=&quot;false&quot; aria-describedby=&quot;sh6fy4k&quot; data-popupid=&quot;sh6fy4k&quot; style=&quot;-webkit-font-smoothing: antialiased; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; border-width: 0px; border-style: solid; border-color: transparent; border-radius: 10px; box-shadow: none; cursor: pointer; display: inline-flex; font: 500 14px / 22px Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; height: 32px; justify-content: center; outline: none; padding: 4px; user-select: none; vertical-align: middle; text-wrap-mode: nowrap; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; color: rgba(0, 0, 0, 0.85); transform: none; transition: background-color ease-in, border ease-in; appearance: button; overflow-anchor: auto;&quot;&gt;&lt;span class=&quot;semi-button-content&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; overflow: hidden; text-overflow: ellipsis; align-items: center; display: flex; justify-content: center; overflow-anchor: auto; padding: 3px;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-rendering: optimizelegibility; fill: currentcolor; font-size: 18px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M20.307 20.307a.997.997 0 0 0 .003-1.412l-6.845-6.844 6.845-6.845a.997.997 0 0 0-.003-1.412.997.997 0 0 0-1.412-.002l-6.844 6.844-6.845-6.845a.997.997 0 0 0-1.412.003.997.997 0 0 0-.002 1.412l6.844 6.844-6.845 6.845a.997.997 0 0 0 .003 1.412.997.997 0 0 0 1.412.003l6.844-6.845 6.845 6.845a.997.997 0 0 0 1.412-.003&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code-canvas-body&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); height: calc(100% - 56px); overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;content-s0HetY flow-ext-disable-select-bar&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; width: 760px; height: 26px;&quot;&gt;&lt;div class=&quot;resizable-wrapper-EaKdb0 direction-column-F5pTZk&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; height: 26px; width: 760px; flex-direction: column; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;resizable-wrapper-EaKdb0 direction-row-lcyVSf&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; height: 26px; width: 760px; flex-direction: row; overflow-anchor: auto; min-height: 0px;&quot;&gt;&lt;div class=&quot;canvas-body-content-yXFryQ&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); height: 26px; position: relative; width: 760px; overflow-anchor: auto; min-width: 0px;&quot;&gt;&lt;div class=&quot;editor-fOI6Y_&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; display: flow-root; flex: 1 1 0%; height: 26px; width: 760px;&quot;&gt;&lt;div class=&quot;editorContent-FfnwE_&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; height: calc(100% - 12px); margin-top: 12px; overflow-x: auto; position: relative; width: 760px;&quot;&gt;&lt;div class=&quot;cm-theme&quot; data-language-input=&quot;bash&quot; data-language=&quot;shell&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); --code-text: #000000d9; --code-doc: #00000073; --code-link: #2f74ff; --code-number: #e54595; --code-key-control: #9952e1; --code-function: #ff5d4d; --code-variable: #000000d9; --code-parameter: #4da621; --code-attributes: #c70; overflow-anchor: auto; height: 14px; width: 744.8px;&quot;&gt;&lt;div class=&quot;cm-editor ͼ1 ͼ2 ͼ4 ͼ1hz ͼ16 ͼ2q&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-direction: column; font-size: 13px; font-feature-settings: &amp;quot;liga&amp;quot; 0, &amp;quot;calt&amp;quot; 0; color: rgb(0, 0, 0); height: 14px; overflow-anchor: auto; position: relative !important; display: flex !important;&quot;&gt;&lt;div class=&quot;cm-announced&quot; aria-live=&quot;polite&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); position: fixed; top: -10000px; overflow-anchor: auto;&quot;&gt;&lt;/div&gt;&lt;div tabindex=&quot;-1&quot; class=&quot;cm-scroller&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; line-height: 1.4; height: 14px; overflow: scroll; position: relative; z-index: 0; overflow-anchor: auto; display: flex !important; align-items: flex-start !important; --scrollbar-color: transparent; --scrollbar-width: 7px;&quot;&gt;&lt;div class=&quot;cm-gutters&quot; aria-hidden=&quot;true&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-shrink: 0; display: flex; height: 112.4px; inset-inline-start: 0px; z-index: 200; color: rgba(0, 0, 0, 0.3); border-width: initial; border-style: none; border-right-color: transparent; border-top-color: initial; border-bottom-color: initial; border-left-color: initial; border-image: initial; overflow-anchor: auto; min-height: 112.4px; position: sticky;&quot;&gt;&lt;div class=&quot;cm-gutter cm-lineNumbers&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-direction: column; flex-shrink: 0; min-height: 100%; overflow: hidden; display: flex !important; min-width: 6ch; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;cm-gutterElement&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px 3px 0px 5px; min-width: 20px; text-align: right; text-wrap-mode: nowrap; overflow-anchor: auto; height: 0px; visibility: hidden; pointer-events: none;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutterElement cm-activeLineGutter&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background: unset; padding: 0px 3px 0px 5px; min-width: 20px; text-align: right; text-wrap-mode: nowrap; overflow-anchor: auto; height: 18.2px; margin-top: 4px;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutterElement&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px 3px 0px 5px; min-width: 20px; text-align: right; text-wrap-mode: nowrap; overflow-anchor: auto; height: 18.2px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutter cm-foldGutter&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-direction: column; flex-shrink: 0; min-height: 100%; overflow: hidden; display: flex !important; padding: 0px 6px 0px 2px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;cm-gutterElement&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); color: rgb(115, 119, 128); overflow-anchor: auto; height: 0px; visibility: hidden; pointer-events: none;&quot;&gt;&lt;span class=&quot;unfold-button&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; padding: 0px 1px; cursor: pointer; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutterElement cm-activeLineGutter&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background: unset; color: rgb(115, 119, 128); overflow-anchor: auto; height: 18.2px; margin-top: 4px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div spellcheck=&quot;false&quot; autocorrect=&quot;off&quot; autocapitalize=&quot;off&quot; writingsuggestions=&quot;false&quot; translate=&quot;no&quot; contenteditable=&quot;false&quot; class=&quot;cm-content&quot; role=&quot;textbox&quot; aria-multiline=&quot;true&quot; aria-readonly=&quot;true&quot; data-language=&quot;shell&quot; aria-autocomplete=&quot;list&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; flex-grow: 2; flex-shrink: 0; white-space: pre; overflow-wrap: normal; min-height: 100%; padding: 4px 0px 72px; outline: none; overflow-anchor: auto; tab-size: 4; caret-color: transparent !important;&quot;&gt;&lt;div class=&quot;cm-activeLine cm-line&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px 4px 0px 1px; background: unset; overflow-anchor: auto; caret-color: transparent !important;&quot;&gt;&lt;span class=&quot;ͼ1o&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; color: #CC7700; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ͼ1o&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; color: #CC7700; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutters-opposite&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-shrink: 0; position: sticky; right: 0px; height: 28px; overflow-anchor: auto; width: 5px; min-height: 28px;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;cm-layer cm-layer-above cm-cursorLayer&quot; aria-hidden=&quot;true&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); position: absolute; left: 0px; top: 0px; contain: size style; pointer-events: none; overflow-anchor: auto; z-index: 150; animation-duration: 1200ms;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;cm-layer cm-selectionLayer&quot; aria-hidden=&quot;true&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); position: absolute; left: 0px; top: 0px; contain: size style; overflow-anchor: auto; z-index: -2;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ai-generate-label-wrapper-ef3noE&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); border: 0.6px solid rgba(204, 204, 204, 0.5); border-radius: 4px; display: flex; height: 15px; justify-content: center; line-height: 15px; position: absolute; right: 11px; top: 0px; width: 36px; overflow-anchor: auto;&quot;&gt;&lt;span class=&quot;ai-generate-label-qrEHJU&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; color: #CCCCCC; font-size: 8.25px; font-weight: 600; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;28&quot; height=&quot;16&quot; fill=&quot;none&quot; viewbox=&quot;0 0 28 16&quot;&gt;&lt;mask id=&quot;ai-generate-label_svg__a&quot; fill=&quot;#fff&quot;&gt;&lt;path d=&quot;M12.934 5.853c-.322.726-.734 1.345-1.238 1.84l-.57-.718c.744-.776 1.239-1.816 1.495-3.128l.883.165a11 11 0 0 1-.256 1.007h1.436V3.666h.866v1.353h2.617v.834H15.55V7.47h2.46v.834h-2.46v1.799h3.153v.858h-7.345v-.858h3.326v-1.8h-2.327V7.47h2.327V5.853zm12.43-2.328c.37.28.684.57.948.859l-.38.387h.983v.818h-2.427c.066.957.165 1.7.297 2.211.025.116.058.223.091.339.33-.578.603-1.246.817-1.99l.784.34q-.483 1.571-1.238 2.673c.075.165.157.314.24.437.23.355.412.537.536.537q.126 0 .289-1.189l.776.421c-.215 1.164-.52 1.75-.933 1.75-.363 0-.743-.248-1.147-.735a4 4 0 0 1-.33-.495 5.6 5.6 0 0 1-1.882 1.362l-.495-.726a5.4 5.4 0 0 0 1.98-1.51 8 8 0 0 1-.305-.941c-.181-.66-.297-1.494-.363-2.484H21.03v1.147h2.022q-.037 2.302-.247 2.872-.198.517-.867.528a7 7 0 0 1-.668-.041l-.264-.784c.33.024.602.04.833.04.132-.007.223-.09.264-.255.05-.19.074-.71.091-1.552H21.03c-.04 1.536-.38 2.765-1.015 3.698l-.652-.586c.512-.751.776-1.8.8-3.136V4.772h3.401c-.017-.38-.017-.785-.017-1.197h.875q0 .629.025 1.196h1.164a6 6 0 0 0-.793-.726z&quot;&gt;&lt;/path&gt;&lt;/mask&gt;&lt;path fill=&quot;#CCC&quot; d=&quot;M12.934 5.853c-.322.726-.734 1.345-1.238 1.84l-.57-.718c.744-.776 1.239-1.816 1.495-3.128l.883.165a11 11 0 0 1-.256 1.007h1.436V3.666h.866v1.353h2.617v.834H15.55V7.47h2.46v.834h-2.46v1.799h3.153v.858h-7.345v-.858h3.326v-1.8h-2.327V7.47h2.327V5.853zm12.43-2.328c.37.28.684.57.948.859l-.38.387h.983v.818h-2.427c.066.957.165 1.7.297 2.211.025.116.058.223.091.339.33-.578.603-1.246.817-1.99l.784.34q-.483 1.571-1.238 2.673c.075.165.157.314.24.437.23.355.412.537.536.537q.126 0 .289-1.189l.776.421c-.215 1.164-.52 1.75-.933 1.75-.363 0-.743-.248-1.147-.735a4 4 0 0 1-.33-.495 5.6 5.6 0 0 1-1.882 1.362l-.495-.726a5.4 5.4 0 0 0 1.98-1.51 8 8 0 0 1-.305-.941c-.181-.66-.297-1.494-.363-2.484H21.03v1.147h2.022q-.037 2.302-.247 2.872-.198.517-.867.528a7 7 0 0 1-.668-.041l-.264-.784c.33.024.602.04.833.04.132-.007.223-.09.264-.255.05-.19.074-.71.091-1.552H21.03c-.04 1.536-.38 2.765-1.015 3.698l-.652-.586c.512-.751.776-1.8.8-3.136V4.772h3.401c-.017-.38-.017-.785-.017-1.197h.875q0 .629.025 1.196h1.164a6 6 0 0 0-.793-.726z&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;#CCC&quot; d=&quot;M12.934 5.853V5.33h-.34l-.137.31zm-1.238 1.84-.41.325.362.455.415-.407zm-.57-.718-.377-.361-.315.329.283.357zm1.495-3.128.096-.513-.51-.096-.1.51zm.883.165.511.107.11-.522-.525-.098zm-.256 1.007-.498-.157-.215.68h.713zm1.436 0v.523h.522v-.523zm0-1.353v-.523h-.523v.523zm.866 0h.523v-.523h-.523zm0 1.353h-.522v.523h.522zm2.617 0h.522v-.522h-.522zm0 .834v.522h.522v-.522zm-2.617 0V5.33h-.522v.523zm0 1.617h-.522v.523h.522zm2.46 0h.522v-.522h-.522zm0 .834v.522h.522v-.522zm-2.46 0V7.78h-.522v.523zm0 1.799h-.522v.522h.522zm3.153 0h.523V9.58h-.523zm0 .858v.523h.523v-.523zm-7.345 0h-.523v.523h.523zm0-.858V9.58h-.523v.523zm3.326 0v.522h.522v-.522zm0-1.8h.522v-.522h-.522zm-2.327 0h-.523v.523h.523zm0-.833v-.522h-.523v.522zm2.327 0v.523h.522V7.47zm0-1.617h.522V5.33h-.522zm-1.75 0-.477-.212q-.452 1.015-1.127 1.68l.366.372.367.373c.557-.549 1.005-1.225 1.349-2.002zm-1.238 1.84.41-.325-.57-.718-.41.325-.409.325.57.718zm-.57-.718.378.361c.828-.864 1.36-2.003 1.63-3.389l-.513-.1-.513-.1c-.242 1.239-.7 2.18-1.359 2.867zm1.495-3.128-.096.514.883.165.096-.514.096-.513-.883-.165zm.883.165-.512-.107c-.072.345-.15.665-.243.957l.499.157.498.157c.106-.336.193-.692.27-1.057zm-.256 1.007v.523h1.436V4.497h-1.436zm1.436 0h.522V3.666h-1.045v1.353zm0-1.353v.522h.866V3.143h-.866zm.866 0h-.522v1.353h1.045V3.666zm0 1.353v.523h2.617V4.497H15.55zm2.617 0h-.523v.834h1.045v-.834zm0 .834V5.33H15.55v1.045h2.617zm-2.617 0h-.522V7.47h1.045V5.853zm0 1.617v.523h2.46V6.948h-2.46zm2.46 0h-.523v.834h1.045V7.47zm0 .834V7.78h-2.46v1.045h2.46zm-2.46 0h-.522v1.799h1.045v-1.8zm0 1.799v.522h3.153V9.58H15.55zm3.153 0h-.523v.858h1.046v-.858zm0 .858v-.522h-7.345v1.045h7.345zm-7.345 0h.522v-.858h-1.045v.858zm0-.858v.522h3.326V9.58h-3.326zm3.326 0h.522v-1.8h-1.045v1.8zm0-1.8v-.522h-2.327v1.045h2.327zm-2.327 0h.522V7.47h-1.045v.834zm0-.833v.523h2.327V6.948h-2.327zm2.327 0h.522V5.853h-1.045V7.47zm0-1.617V5.33h-1.75v1.045h1.75zm10.68-2.328.314-.417-.354-.267-.322.306zm.948.859.374.365.345-.353-.333-.365zm-.38.387-.373-.365-.869.888h1.243zm.983 0h.522V4.25h-.522zm0 .818v.522h.522v-.522zm-2.427 0v-.523h-.56l.039.558zm.297 2.211.511-.11-.002-.01-.003-.01zm.091.339-.502.143.34 1.193.616-1.077zm.817-1.99.207-.479-.544-.235-.165.57zm.784.34.5.152.137-.447-.43-.186zM25.24 9.161l-.43-.295-.167.242.12.267zm.24.437.438-.285-.004-.004zm.825-.652.25-.459-.666-.36-.102.75zm.776.421.514.095.068-.373-.333-.18zM25 10.383l-.413.321.006.007.005.006zm-.33-.495.459-.25-.35-.642-.494.54zm-1.882 1.362-.431.294.245.36.397-.176zm-.495-.726-.213-.477-.57.255.351.516zm1.98-1.51.404.332.197-.239-.115-.288zm-.305-.941.505-.136v-.003zm-.363-2.484.522-.035-.033-.488h-.489zm-2.575 0v-.523h-.522v.523zm0 1.147h-.522v.522h.522zm2.022 0 .523.008.008-.53h-.53zm-.247 2.872.488.186.002-.005zm-.867.528v.523h.01zm-.668-.041-.495.166.107.32.336.034zm-.264-.784.039-.521-.786-.06.251.747zm.833.04v.523h.033zm.264-.255-.505-.132-.002.005zm.091-1.552.522.01.01-.532h-.532zm-1.164 0v-.522h-.508l-.014.508zm-1.015 3.698-.35.388.445.4.337-.494zm-.652-.586-.432-.294-.257.377.34.305zm.8-3.136.523.01v-.01zm0-2.748v-.523h-.522v.523zm3.401 0v.522h.546l-.024-.545zm-.017-1.197v-.523h-.522v.523zm.875 0h.523v-.523h-.523zm.025 1.196-.522.023.022.5h.5zm1.164 0v.523h1.167L26 4.424zm-.793-.726-.36-.378-.441.42.483.372zm.545-.52-.315.417c.347.262.637.53.879.794l.385-.352.386-.353a7.5 7.5 0 0 0-1.02-.923zm.95.859-.374-.366-.38.388.374.365.373.366.38-.388zm-.38.387v.523h.982V4.249h-.982zm.982 0h-.523v.818h1.045V4.77zm0 .818v-.523h-2.427v1.045h2.427zm-2.427 0-.521.035c.067.968.168 1.748.313 2.307l.505-.13.506-.131q-.182-.697-.281-2.117zm.297 2.211-.51.11c.029.138.07.27.099.372l.502-.143.503-.144c-.037-.129-.063-.211-.083-.304zm.091.339.454.259c.354-.62.641-1.328.865-2.103l-.502-.145-.502-.145a8.6 8.6 0 0 1-.768 1.874zm.817-1.99-.207.48.784.339.207-.48.207-.48-.784-.338zm.784.34-.5-.154c-.309 1.009-.701 1.85-1.169 2.532l.431.295.431.295c.54-.786.973-1.728 1.307-2.816zM25.24 9.161l-.476.214c.085.19.181.364.28.513l.436-.29.434-.29a2.5 2.5 0 0 1-.197-.361zm.24.437-.438.286c.124.19.25.359.377.485.063.064.139.13.227.181.085.051.213.107.37.107V9.613c.095 0 .154.034.163.04.012.007.005.005-.021-.022a2 2 0 0 1-.24-.317zm.536.537v.522a.56.56 0 0 0 .425-.197.8.8 0 0 0 .115-.183c.044-.094.076-.206.103-.315.055-.225.11-.544.164-.945l-.518-.07-.518-.07c-.053.39-.102.666-.143.837q-.016.061-.027.097l-.011.033q0-.002.01-.018a.48.48 0 0 1 .4-.213zm.289-1.189-.25.46.777.42.249-.459.249-.459-.776-.42zm.776.421-.514-.094c-.104.565-.223.94-.34 1.16-.124.234-.166.162-.079.162v1.044c.5 0 .817-.365 1.002-.716.193-.362.334-.862.445-1.46zm-.933 1.75v-.523c-.12 0-.366-.088-.745-.545l-.402.333-.402.334c.43.517.943.923 1.55.923zM25 10.383l.412-.32a3 3 0 0 1-.283-.425l-.46.25-.458.25c.117.214.25.404.377.566zm-.33-.495-.385-.353a5.1 5.1 0 0 1-1.708 1.237l.211.478.211.478a6.1 6.1 0 0 0 2.056-1.487zm-1.882 1.362.432-.294-.495-.727-.432.295-.432.294.495.726zm-.495-.726.213.477a5.9 5.9 0 0 0 2.17-1.655l-.402-.332-.403-.333a4.86 4.86 0 0 1-1.791 1.366zm1.98-1.51.486-.195a8 8 0 0 1-.286-.882l-.505.136-.504.135q.14.528.325 1zm-.305-.941.504-.139c-.168-.612-.28-1.406-.345-2.38l-.522.035-.521.034c.067 1.007.186 1.88.38 2.588zm-.363-2.484v-.523H21.03v1.045h2.575zm-2.575 0h-.522v1.147h1.045V5.589zm0 1.147v.522h2.022V6.213H21.03zm2.022 0-.522-.009a27 27 0 0 1-.079 1.833c-.041.478-.093.75-.136.867l.49.18.49.182c.097-.263.156-.66.197-1.14q.064-.743.083-1.905zm-.247 2.872-.489-.186c-.028.075-.062.108-.098.13a.6.6 0 0 1-.29.061l.01.523.01.522c.285-.005.567-.064.812-.213.253-.153.43-.38.533-.651zm-.867.528v-.523a6 6 0 0 1-.616-.038l-.052.52-.052.52c.253.025.496.043.72.043zm-.668-.041.495-.167-.264-.784-.495.167-.496.166.264.784zm-.264-.784-.04.52c.331.025.62.043.873.043V8.83c-.21 0-.465-.015-.794-.04zm.833.04.033.522a.78.78 0 0 0 .494-.212.9.9 0 0 0 .244-.438l-.507-.127-.507-.127c-.004.019 0-.019.049-.064a.3.3 0 0 1 .162-.075zm.264-.255.506.132c.04-.153.06-.382.074-.634q.022-.404.033-1.04l-.522-.01-.522-.01q-.013.628-.033 1.002a3 3 0 0 1-.041.428zm.091-1.552v-.522H21.03v1.045h1.164zm-1.164 0-.522-.014c-.04 1.47-.362 2.592-.925 3.418l.432.294.432.294c.709-1.04 1.063-2.377 1.106-3.977zm-1.015 3.698.35-.389-.652-.586-.35.389-.349.388.652.586zm-.652-.586.432.294c.59-.867.865-2.03.891-3.42l-.522-.01-.523-.01c-.023 1.283-.277 2.217-.71 2.852zm.8-3.136h.523V4.772h-1.045V7.52zm0-2.748v.522h3.401V4.249h-3.4zm3.401 0 .522-.023a28 28 0 0 1-.016-1.174h-1.045c0 .41 0 .826.017 1.22zm-.017-1.197v.522h.875V3.052h-.875zm.875 0H23.9c0 .428.008.831.025 1.22l.522-.024.522-.022c-.016-.372-.024-.76-.024-1.174zm.025 1.196v.523h1.164V4.249h-1.164zm1.164 0 .39-.348a6.4 6.4 0 0 0-.864-.792l-.319.414-.318.414a5.3 5.3 0 0 1 .72.66zm-.793-.726.361.378.545-.52-.36-.378-.362-.378-.544.52z&quot; mask=&quot;url(#ai-generate-label_svg__a)&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;#CCC&quot; d=&quot;M6.544 10.85H5.112L4.652 9h-1.99l-.653 1.85H.577l2.268-6.422H4.95zm2.28 0h-1.52l.337-6.422h1.52zM3.047 7.91h1.335L3.83 5.692z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;container-footer-TocUUl&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br class=&quot;container-Vdm5p7 wrapper-_7axQ_ undefined&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto;&quot;/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;div class=&quot;auto-hide-last-sibling-br paragraph-Oc488D paragraph-element br-paragraph-space&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; margin-bottom: 0px; margin-top: 0px; overflow-anchor: auto;&quot;&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;批量运行 Worker（处理完队列中所有任务后退出）&lt;/span&gt;：&lt;/div&gt;&lt;div class=&quot;relative w-fit custom-code-block-canvas-wrapper w-full&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); position: relative; width: 760.2px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;code-block-element-Kq8H8v light custom-code-block-container--bash hide-indicator disable-theme-style custom-code-block-container&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; flex-direction: column; position: relative; --code-area-radius: 6px; --code-area-radius-inner: calc(6px - 1px); --code-area-bg-color: #f9fafb; --code-header-bg-color: #f3f4f6; --code-mask-bg-color: linear-gradient(180deg,rgba(249,250,251,0),#f9fafb); --code-header-icon-color: rgba(0,0,0,.5); --code-header-text-color: rgba(0,0,0,.85); --code-header-icon-bg-color: rgba(0,0,0,.06); --code-block-code-color: #000000d9; --code-block-std-bg-color: #f3f4f6; --code-block-std-err-color: #d60000; margin-top: 8px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;code-area-z8IfZP code-area&quot; dir=&quot;ltr&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background: none 0% 0% / auto repeat scroll padding-box border-box rgb(249, 250, 251); border-radius: 6px; display: flex; flex-direction: column; height: fit-content; width: 760.2px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;header-wrapper-OsF77N&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; background-color: rgb(255, 255, 255); position: sticky; top: 0px;&quot;&gt;&lt;div class=&quot;header-A8bf6p&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(243, 244, 246); display: flex; flex-direction: row; flex-shrink: 0; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; height: 32px; justify-content: space-between; padding: 6px 9px 6px 6px; border-color: rgba(0, 0, 0, 0.08); border-style: solid; border-width: 0.8px 0.8px 0px; border-image: none 100% / 1 / 0 stretch; border-radius: 5px 5px 0px 0px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;title-QMwu7c clickable-p6chjr&quot; tabindex=&quot;0&quot; aria-describedby=&quot;u6l2n68&quot; data-popupid=&quot;u6l2n68&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; align-items: center; border-radius: 4px; color: rgba(0, 0, 0, 0.5); display: flex; flex-direction: row; gap: 3px; padding: 0px 4px 0px 10px; cursor: pointer;&quot;&gt;&lt;div class=&quot;text-fbmuIX&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; align-items: center; color: rgba(0, 0, 0, 0.85); display: flex; font-family: &amp;quot;PingFang SC&amp;quot;; font-size: 14px; gap: 3px; line-height: 22px; overflow: hidden; text-overflow: ellipsis; text-wrap-mode: nowrap;&quot;&gt;bash&lt;/div&gt;&lt;div class=&quot;icon-jzrQql&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 15px;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-12&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M21.707 17.293a1 1 0 0 1-1.414 0L12 9l-8.293 8.293a1 1 0 0 1-1.414-1.414l8.293-8.293a2 2 0 0 1 2.828 0l8.293 8.293a1 1 0 0 1 0 1.414&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;action-D_0sSD&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; align-items: center; color: rgba(0, 0, 0, 0.5); cursor: pointer; display: flex; flex-direction: row; gap: 8px; justify-content: space-between;&quot;&gt;&lt;div class=&quot;hoverable-qHOoMX&quot; data-testid=&quot;code-block-copy&quot; tabindex=&quot;0&quot; aria-describedby=&quot;54xfugq&quot; data-popupid=&quot;54xfugq&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 20px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-14&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 14px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M21 3.5V17a2 2 0 0 1-2 2h-2v-2h2V3.5H9v2h5.857c1.184 0 2.143.895 2.143 2v13c0 1.105-.96 2-2.143 2H5.143C3.959 22.5 3 21.605 3 20.5v-13c0-1.105.96-2 2.143-2H7v-2a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2m-6.143 4H5.143v13h9.714z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;hoverable-qHOoMX&quot; tabindex=&quot;0&quot; aria-describedby=&quot;6179w6l&quot; data-popupid=&quot;6179w6l&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 20px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-14&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 14px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M4 4a1 1 0 0 1 1 1v3a3 3 0 0 0 3 3h11.086l-5.293-5.293a1 1 0 0 1 1.414-1.414l7 7a1 1 0 0 1 0 1.414l-7 7a1 1 0 0 1-1.414-1.414L19.086 13H8a5 5 0 0 1-5-5V5a1 1 0 0 1 1-1&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;hoverable-qHOoMX&quot; tabindex=&quot;0&quot; aria-describedby=&quot;vgv4cz3&quot; data-popupid=&quot;vgv4cz3&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 20px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-14&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 14px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M4.797 16.856a8.28 8.28 0 0 0 6.27 2.87h.008A8.28 8.28 0 0 0 14.372 3.84a11.6 11.6 0 0 1-1.658 7.714 11.62 11.62 0 0 1-7.917 5.303M13.415 1.43a10.28 10.28 0 0 1-2.348 20.296 10.28 10.28 0 0 1-8.883-5.103c-.397-.74.155-1.605.912-1.609a9.617 9.617 0 0 0 9.011-12.258 1.093 1.093 0 0 1 1.308-1.326&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;hoverable-qHOoMX&quot; tabindex=&quot;0&quot; aria-describedby=&quot;i7ffiva&quot; data-popupid=&quot;i7ffiva&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 20px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-14&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 14px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M22 3v7a1 1 0 1 1-2 0V4h-6a1 1 0 1 1 0-2h7a1 1 0 0 1 1 1M11.005 21a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1v-7a1 1 0 0 1 2.002 0v6h6.003a1 1 0 0 1 1 1&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;content-qydEZG light-scrollbar-Lun507&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; flex-shrink: 0; height: fit-content; overflow: overlay; padding: 12px 16px 16px; overflow-anchor: auto; border-color: rgba(0, 0, 0, 0.08); border-radius: 0px 0px 5px 5px; border-style: solid; border-width: 0px 1px 1px;&quot;&gt;&lt;pre class=&quot;container-GJFPCm language-bash&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; overflow-wrap: normal; --code-text_v3: #000000d9; --code-doc_v3: #00000073; --code-Link_v3: #2f74ff; --code-number_v3: #e54595; --code-keycontrol_v3: #9952e1; --code-function_v3: #ff5d4d; --code-variable_v3: #000000d9; --code-parameter_v3: #4da621; --code-attributes_v3: #c70; --code-selection-bg-color: #ebf1ff; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); color: rgb(0, 0, 0); word-break: normal; word-spacing: normal; hyphens: none; line-height: 1.5; tab-size: 4; margin-top: 0px; margin-bottom: 0px; overflow: auto; font-size: 13.6px; border-radius: 6px; padding: 0px; overflow-anchor: auto; width: fit-content;&quot;&gt;python&amp;nbsp;downloader.py&amp;nbsp;--role&amp;nbsp;worker&amp;nbsp;--mode&amp;nbsp;batch&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;mask-wrapper-ARWxJv&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; opacity: 0; transition: opacity 0.15s;&quot;&gt;&lt;div class=&quot;mask-hxdXYU&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background: linear-gradient(rgba(249, 250, 251, 0), rgb(249, 250, 251)) 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); bottom: 0px; height: 56px; pointer-events: none; position: absolute; width: 760.2px; overflow-anchor: auto;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;canvas_wrapper-y3Fcgx exited-O8qSm4&quot; data-testid=&quot;canvas-wrapper&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); visibility: hidden; z-index: 10; border-radius: 12px; height: 82px; left: 0px; opacity: 0; pointer-events: none; position: absolute; top: 0px; width: 760px; --canvas-radius-size: 12px; overflow-anchor: auto; --offset-width: 760px; --offset-height: 82px;&quot;&gt;&lt;div data-testid=&quot;canvas_panel_container&quot; data-visible=&quot;false&quot; class=&quot;container-outer-wapATW&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; flex-direction: column; height: 82px; width: 760px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;container-V37bUX&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; border-radius: 12px; box-shadow: rgba(42, 60, 79, 0.1) 0px 6px 10px 0px; display: flex; flex-direction: column; height: 82px; position: relative; transition: border-radius 0.4s ease-in-out; flex: 1 1 0%; min-height: 0px; width: 760px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;container-inner-CLMuXa canvas_wrapper_inner-liGdwM&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex: 1 1 0%; min-height: 0px; width: 760px; border-radius: 12px; overflow: hidden; transition: border-radius 0.4s ease-in-out; overflow-anchor: auto;&quot;&gt;&lt;div style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; width: 760px; height: 82px;&quot;&gt;&lt;div class=&quot;code-canvas code-canvas-theme semi-always-light container-uANf2o&quot; data-theme=&quot;light&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); height: 82px; width: 760px; --canvas-header-height: 56px; --code-editor-header-width: 56px; --code-editor-file-tree-width: 212px; --semi-amber-0: 254,251,235; --semi-amber-1: 252,245,206; --semi-amber-2: 249,232,158; --semi-amber-3: 246,216,111; --semi-amber-4: 243,198,65; --semi-amber-5: 240,177,20; --semi-amber-6: 200,138,15; --semi-amber-7: 160,102,10; --semi-amber-8: 120,70,6; --semi-amber-9: 80,43,3; --semi-black: 0,0,0; --semi-blue-0: 234,245,255; --semi-blue-1: 203,231,254; --semi-blue-2: 152,205,253; --semi-blue-3: 101,178,252; --semi-blue-4: 50,149,251; --semi-blue-5: 0,100,250; --semi-blue-6: 0,98,214; --semi-blue-7: 0,79,179; --semi-blue-8: 0,61,143; --semi-blue-9: 0,44,107; --semi-cyan-0: 229,247,248; --semi-cyan-1: 194,239,240; --semi-cyan-2: 138,221,226; --semi-cyan-3: 88,203,211; --semi-cyan-4: 44,184,197; --semi-cyan-5: 5,164,182; --semi-cyan-6: 3,134,152; --semi-cyan-7: 1,105,121; --semi-cyan-8: 0,77,91; --semi-cyan-9: 0,50,61; --semi-green-0: 236,247,236; --semi-green-1: 208,240,209; --semi-green-2: 164,224,167; --semi-green-3: 125,209,130; --semi-green-4: 90,194,98; --semi-green-5: 59,179,70; --semi-green-6: 48,149,59; --semi-green-7: 37,119,47; --semi-green-8: 27,89,36; --semi-green-9: 17,60,24; --semi-grey-0: 249,249,249; --semi-grey-1: 230,232,234; --semi-grey-2: 198,202,205; --semi-grey-3: 167,171,176; --semi-grey-4: 136,141,146; --semi-grey-5: 107,112,117; --semi-grey-6: 85,91,97; --semi-grey-7: 65,70,76; --semi-grey-8: 46,50,56; --semi-grey-9: 28,31,35; --semi-indigo-0: 236,239,248; --semi-indigo-1: 209,216,240; --semi-indigo-2: 167,179,225; --semi-indigo-3: 128,144,211; --semi-indigo-4: 94,111,196; --semi-indigo-5: 63,81,181; --semi-indigo-6: 51,66,161; --semi-indigo-7: 40,52,140; --semi-indigo-8: 31,40,120; --semi-indigo-9: 23,29,99; --semi-light-blue-0: 233,247,253; --semi-light-blue-1: 201,236,252; --semi-light-blue-2: 149,216,248; --semi-light-blue-3: 98,195,245; --semi-light-blue-4: 48,172,241; --semi-light-blue-5: 0,149,238; --semi-light-blue-6: 0,123,202; --semi-light-blue-7: 0,99,167; --semi-light-blue-8: 0,75,131; --semi-light-blue-9: 0,53,95; --semi-light-green-0: 243,248,236; --semi-light-green-1: 227,240,208; --semi-light-green-2: 200,226,165; --semi-light-green-3: 173,211,126; --semi-light-green-4: 147,197,91; --semi-light-green-5: 123,182,60; --semi-light-green-6: 100,152,48; --semi-light-green-7: 78,121,38; --semi-light-green-8: 57,91,27; --semi-light-green-9: 37,61,18; --semi-lime-0: 242,250,230; --semi-lime-1: 227,246,197; --semi-lime-2: 203,237,142; --semi-lime-3: 183,227,91; --semi-lime-4: 167,218,44; --semi-lime-5: 155,209,0; --semi-lime-6: 126,174,0; --semi-lime-7: 99,139,0; --semi-lime-8: 72,104,0; --semi-lime-9: 47,70,0; --semi-orange-0: 255,248,234; --semi-orange-1: 254,238,204; --semi-orange-2: 254,217,152; --semi-orange-3: 253,193,101; --semi-orange-4: 253,166,51; --semi-orange-5: 252,136,0; --semi-orange-6: 210,103,0; --semi-orange-7: 168,74,0; --semi-orange-8: 126,49,0; --semi-orange-9: 84,29,0; --semi-pink-0: 253,236,239; --semi-pink-1: 251,207,216; --semi-pink-2: 246,160,181; --semi-pink-3: 242,115,150; --semi-pink-4: 237,72,123; --semi-pink-5: 233,30,99; --semi-pink-6: 197,19,86; --semi-pink-7: 162,11,72; --semi-pink-8: 126,5,58; --semi-pink-9: 90,1,43; --semi-purple-0: 247,233,247; --semi-purple-1: 239,202,240; --semi-purple-2: 221,155,224; --semi-purple-3: 201,111,209; --semi-purple-4: 180,73,194; --semi-purple-5: 158,40,179; --semi-purple-6: 135,30,158; --semi-purple-7: 113,22,138; --semi-purple-8: 92,15,117; --semi-purple-9: 73,10,97; --semi-red-0: 254,242,237; --semi-red-1: 254,221,210; --semi-red-2: 253,183,165; --semi-red-3: 251,144,120; --semi-red-4: 250,102,76; --semi-red-5: 249,57,32; --semi-red-6: 213,37,21; --semi-red-7: 178,20,12; --semi-red-8: 142,8,5; --semi-red-9: 106,1,3; --semi-teal-0: 228,247,244; --semi-teal-1: 192,240,232; --semi-teal-2: 135,224,211; --semi-teal-3: 84,209,193; --semi-teal-4: 39,194,176; --semi-teal-5: 0,179,161; --semi-teal-6: 0,149,137; --semi-teal-7: 0,119,111; --semi-teal-8: 0,89,85; --semi-teal-9: 0,60,58; --semi-violet-0: 243,237,249; --semi-violet-1: 226,209,244; --semi-violet-2: 196,167,233; --semi-violet-3: 166,127,221; --semi-violet-4: 136,91,210; --semi-violet-5: 106,58,199; --semi-violet-6: 87,47,179; --semi-violet-7: 70,37,158; --semi-violet-8: 54,28,138; --semi-violet-9: 40,20,117; --semi-white: 255,255,255; --semi-yellow-0: 255,253,234; --semi-yellow-1: 254,251,203; --semi-yellow-2: 253,243,152; --semi-yellow-3: 252,232,101; --semi-yellow-4: 251,218,50; --semi-yellow-5: 250,200,0; --semi-yellow-6: 208,170,0; --semi-yellow-7: 167,139,0; --semi-yellow-8: 125,106,0; --semi-yellow-9: 83,72,0; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;canvas-header-_ng4RX&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; background-color: rgba(0, 0, 0, 0); border-bottom: 0.8px solid rgba(0, 0, 0, 0.08); display: grid; gap: 4px; grid-template-columns: minmax(min-content, 1fr) auto minmax(min-content, 1fr); height: 56px; overflow: hidden; padding: 0px 16px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;canvas-header-left-V6XIuw&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; gap: 4px; overflow: hidden; overflow-anchor: auto;&quot;&gt;&lt;div style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;flex items-center gap-4&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; align-items: center; gap: 4px; overflow-anchor: auto;&quot;&gt;&lt;span class=&quot;inline-flex items-center mr-4 h-20&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; margin-right: 4px; display: inline-flex; height: 20px; align-items: center; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;s-font-small-strong&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-size-adjust: none; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-variant-position: normal; font-variant-emoji: normal; font-stretch: normal; font-size: 14px; line-height: 22px; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;canvas-header-middle-U6siD5&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; gap: 4px; overflow: hidden; grid-column: 2; overflow-anchor: auto;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;canvas-header-right-y8Tw7L&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; gap: 4px; overflow: hidden; justify-content: flex-end; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;header-btn-nkmwlw&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; border-radius: 8px; cursor: pointer; display: inline-flex; gap: 3px; height: 32px; justify-content: center; padding: 4px; width: 69px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-18&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 18px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M21 3.5V17a2 2 0 0 1-2 2h-2v-2h2V3.5H9v2h5.857c1.184 0 2.143.895 2.143 2v13c0 1.105-.96 2-2.143 2H5.143C3.959 22.5 3 21.605 3 20.5v-13c0-1.105.96-2 2.143-2H7v-2a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2m-6.143 4H5.143v13h9.714z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;btn-text-aRIgRD&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; text-align: center; font-family: &amp;quot;PingFang SC&amp;quot;; font-size: 14px; line-height: 22px; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;header-btn-nkmwlw&quot; aria-haspopup=&quot;true&quot; tabindex=&quot;0&quot; aria-describedby=&quot;jjmg2zk&quot; data-popupid=&quot;jjmg2zk&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; border-radius: 8px; cursor: pointer; display: inline-flex; gap: 3px; height: 32px; justify-content: center; padding: 4px; width: 69px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-18&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 18px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M20.207 12.207a1 1 0 0 0-1.414-1.414L13 16.586V2a1 1 0 1 0-2 0v14.586l-5.793-5.793a1 1 0 0 0-1.414 1.414l7.5 7.5c.195.195.45.293.706.293H5a1 1 0 1 0 0 2h14a1 1 0 1 0 0-2h-6.999a1 1 0 0 0 .706-.293z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;btn-text-aRIgRD&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; text-align: center; font-family: &amp;quot;PingFang SC&amp;quot;; font-size: 14px; line-height: 22px; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;more-btn-qQsdj1&quot; aria-haspopup=&quot;true&quot; tabindex=&quot;0&quot; aria-describedby=&quot;w1d96io&quot; data-popupid=&quot;w1d96io&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; aspect-ratio: 1 / 1; border-radius: 4px; cursor: pointer; display: flex; flex-shrink: 0; height: 32px; justify-content: center; padding: 7px; width: 32px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-18&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 18px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M5.5 11.75a1.75 1.75 0 1 1-3.5 0 1.75 1.75 0 0 1 3.5 0M13.725 11.75a1.75 1.75 0 1 1-3.5 0 1.75 1.75 0 0 1 3.5 0M22 11.75a1.75 1.75 0 1 1-3.5 0 1.75 1.75 0 0 1 3.5 0&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;divider-ExjbWf&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; background-color: rgba(0, 0, 0, 0.08); height: 16px; margin: 0px 4px; width: 1px; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;button tabindex=&quot;0&quot; class=&quot;semi-button semi-button-primary samantha-button-vtPGz2 quartary-w95bZm medium-DBTMZB icon-D5yFjW icon-only-g_8LKZ tooltip-button-oVRj8d tooltip-button-size-medium-v4uviy semi-button-with-icon semi-button-with-icon-only&quot; type=&quot;button&quot; aria-disabled=&quot;false&quot; aria-describedby=&quot;v5829zf&quot; data-popupid=&quot;v5829zf&quot; style=&quot;-webkit-font-smoothing: antialiased; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; border-width: 0px; border-style: solid; border-color: transparent; border-radius: 10px; box-shadow: none; cursor: pointer; display: inline-flex; font: 500 14px / 22px Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; height: 32px; justify-content: center; outline: none; padding: 4px; user-select: none; vertical-align: middle; text-wrap-mode: nowrap; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; color: rgba(0, 0, 0, 0.85); transform: none; transition: background-color ease-in, border ease-in; appearance: button; overflow-anchor: auto;&quot;&gt;&lt;span class=&quot;semi-button-content&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; overflow: hidden; text-overflow: ellipsis; align-items: center; display: flex; justify-content: center; overflow-anchor: auto; padding: 3px;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-rendering: optimizelegibility; fill: currentcolor; font-size: 18px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M20.307 20.307a.997.997 0 0 0 .003-1.412l-6.845-6.844 6.845-6.845a.997.997 0 0 0-.003-1.412.997.997 0 0 0-1.412-.002l-6.844 6.844-6.845-6.845a.997.997 0 0 0-1.412.003.997.997 0 0 0-.002 1.412l6.844 6.844-6.845 6.845a.997.997 0 0 0 .003 1.412.997.997 0 0 0 1.412.003l6.844-6.845 6.845 6.845a.997.997 0 0 0 1.412-.003&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code-canvas-body&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); height: calc(100% - 56px); overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;content-s0HetY flow-ext-disable-select-bar&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; width: 760px; height: 26px;&quot;&gt;&lt;div class=&quot;resizable-wrapper-EaKdb0 direction-column-F5pTZk&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; height: 26px; width: 760px; flex-direction: column; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;resizable-wrapper-EaKdb0 direction-row-lcyVSf&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; height: 26px; width: 760px; flex-direction: row; overflow-anchor: auto; min-height: 0px;&quot;&gt;&lt;div class=&quot;canvas-body-content-yXFryQ&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); height: 26px; position: relative; width: 760px; overflow-anchor: auto; min-width: 0px;&quot;&gt;&lt;div class=&quot;editor-fOI6Y_&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; display: flow-root; flex: 1 1 0%; height: 26px; width: 760px;&quot;&gt;&lt;div class=&quot;editorContent-FfnwE_&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; height: calc(100% - 12px); margin-top: 12px; overflow-x: auto; position: relative; width: 760px;&quot;&gt;&lt;div class=&quot;cm-theme&quot; data-language-input=&quot;bash&quot; data-language=&quot;shell&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); --code-text: #000000d9; --code-doc: #00000073; --code-link: #2f74ff; --code-number: #e54595; --code-key-control: #9952e1; --code-function: #ff5d4d; --code-variable: #000000d9; --code-parameter: #4da621; --code-attributes: #c70; overflow-anchor: auto; height: 14px; width: 744.8px;&quot;&gt;&lt;div class=&quot;cm-editor ͼ1 ͼ2 ͼ4 ͼ1i0 ͼ16 ͼ2q&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-direction: column; font-size: 13px; font-feature-settings: &amp;quot;liga&amp;quot; 0, &amp;quot;calt&amp;quot; 0; color: rgb(0, 0, 0); height: 14px; overflow-anchor: auto; position: relative !important; display: flex !important;&quot;&gt;&lt;div class=&quot;cm-announced&quot; aria-live=&quot;polite&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); position: fixed; top: -10000px; overflow-anchor: auto;&quot;&gt;&lt;/div&gt;&lt;div tabindex=&quot;-1&quot; class=&quot;cm-scroller&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; line-height: 1.4; height: 14px; overflow: scroll; position: relative; z-index: 0; overflow-anchor: auto; display: flex !important; align-items: flex-start !important; --scrollbar-color: transparent; --scrollbar-width: 7px;&quot;&gt;&lt;div class=&quot;cm-gutters&quot; aria-hidden=&quot;true&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-shrink: 0; display: flex; height: 112.4px; inset-inline-start: 0px; z-index: 200; color: rgba(0, 0, 0, 0.3); border-width: initial; border-style: none; border-right-color: transparent; border-top-color: initial; border-bottom-color: initial; border-left-color: initial; border-image: initial; overflow-anchor: auto; min-height: 112.4px; position: sticky;&quot;&gt;&lt;div class=&quot;cm-gutter cm-lineNumbers&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-direction: column; flex-shrink: 0; min-height: 100%; overflow: hidden; display: flex !important; min-width: 6ch; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;cm-gutterElement&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px 3px 0px 5px; min-width: 20px; text-align: right; text-wrap-mode: nowrap; overflow-anchor: auto; height: 0px; visibility: hidden; pointer-events: none;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutterElement cm-activeLineGutter&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background: unset; padding: 0px 3px 0px 5px; min-width: 20px; text-align: right; text-wrap-mode: nowrap; overflow-anchor: auto; height: 18.2px; margin-top: 4px;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutterElement&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px 3px 0px 5px; min-width: 20px; text-align: right; text-wrap-mode: nowrap; overflow-anchor: auto; height: 18.2px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutter cm-foldGutter&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-direction: column; flex-shrink: 0; min-height: 100%; overflow: hidden; display: flex !important; padding: 0px 6px 0px 2px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;cm-gutterElement&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); color: rgb(115, 119, 128); overflow-anchor: auto; height: 0px; visibility: hidden; pointer-events: none;&quot;&gt;&lt;span class=&quot;unfold-button&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; padding: 0px 1px; cursor: pointer; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutterElement cm-activeLineGutter&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background: unset; color: rgb(115, 119, 128); overflow-anchor: auto; height: 18.2px; margin-top: 4px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div spellcheck=&quot;false&quot; autocorrect=&quot;off&quot; autocapitalize=&quot;off&quot; writingsuggestions=&quot;false&quot; translate=&quot;no&quot; contenteditable=&quot;false&quot; class=&quot;cm-content&quot; role=&quot;textbox&quot; aria-multiline=&quot;true&quot; aria-readonly=&quot;true&quot; data-language=&quot;shell&quot; aria-autocomplete=&quot;list&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; flex-grow: 2; flex-shrink: 0; white-space: pre; overflow-wrap: normal; min-height: 100%; padding: 4px 0px 72px; outline: none; overflow-anchor: auto; tab-size: 4; caret-color: transparent !important;&quot;&gt;&lt;div class=&quot;cm-activeLine cm-line&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px 4px 0px 1px; background: unset; overflow-anchor: auto; caret-color: transparent !important;&quot;&gt;&lt;span class=&quot;ͼ1o&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; color: #CC7700; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ͼ1o&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; color: #CC7700; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutters-opposite&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-shrink: 0; position: sticky; right: 0px; height: 28px; overflow-anchor: auto; width: 5px; min-height: 28px;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;cm-layer cm-layer-above cm-cursorLayer&quot; aria-hidden=&quot;true&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); position: absolute; left: 0px; top: 0px; contain: size style; pointer-events: none; overflow-anchor: auto; z-index: 150; animation-duration: 1200ms;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;cm-layer cm-selectionLayer&quot; aria-hidden=&quot;true&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); position: absolute; left: 0px; top: 0px; contain: size style; overflow-anchor: auto; z-index: -2;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ai-generate-label-wrapper-ef3noE&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); border: 0.6px solid rgba(204, 204, 204, 0.5); border-radius: 4px; display: flex; height: 15px; justify-content: center; line-height: 15px; position: absolute; right: 11px; top: 0px; width: 36px; overflow-anchor: auto;&quot;&gt;&lt;span class=&quot;ai-generate-label-qrEHJU&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; color: #CCCCCC; font-size: 8.25px; font-weight: 600; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;28&quot; height=&quot;16&quot; fill=&quot;none&quot; viewbox=&quot;0 0 28 16&quot;&gt;&lt;mask id=&quot;ai-generate-label_svg__a&quot; fill=&quot;#fff&quot;&gt;&lt;path d=&quot;M12.934 5.853c-.322.726-.734 1.345-1.238 1.84l-.57-.718c.744-.776 1.239-1.816 1.495-3.128l.883.165a11 11 0 0 1-.256 1.007h1.436V3.666h.866v1.353h2.617v.834H15.55V7.47h2.46v.834h-2.46v1.799h3.153v.858h-7.345v-.858h3.326v-1.8h-2.327V7.47h2.327V5.853zm12.43-2.328c.37.28.684.57.948.859l-.38.387h.983v.818h-2.427c.066.957.165 1.7.297 2.211.025.116.058.223.091.339.33-.578.603-1.246.817-1.99l.784.34q-.483 1.571-1.238 2.673c.075.165.157.314.24.437.23.355.412.537.536.537q.126 0 .289-1.189l.776.421c-.215 1.164-.52 1.75-.933 1.75-.363 0-.743-.248-1.147-.735a4 4 0 0 1-.33-.495 5.6 5.6 0 0 1-1.882 1.362l-.495-.726a5.4 5.4 0 0 0 1.98-1.51 8 8 0 0 1-.305-.941c-.181-.66-.297-1.494-.363-2.484H21.03v1.147h2.022q-.037 2.302-.247 2.872-.198.517-.867.528a7 7 0 0 1-.668-.041l-.264-.784c.33.024.602.04.833.04.132-.007.223-.09.264-.255.05-.19.074-.71.091-1.552H21.03c-.04 1.536-.38 2.765-1.015 3.698l-.652-.586c.512-.751.776-1.8.8-3.136V4.772h3.401c-.017-.38-.017-.785-.017-1.197h.875q0 .629.025 1.196h1.164a6 6 0 0 0-.793-.726z&quot;&gt;&lt;/path&gt;&lt;/mask&gt;&lt;path fill=&quot;#CCC&quot; d=&quot;M12.934 5.853c-.322.726-.734 1.345-1.238 1.84l-.57-.718c.744-.776 1.239-1.816 1.495-3.128l.883.165a11 11 0 0 1-.256 1.007h1.436V3.666h.866v1.353h2.617v.834H15.55V7.47h2.46v.834h-2.46v1.799h3.153v.858h-7.345v-.858h3.326v-1.8h-2.327V7.47h2.327V5.853zm12.43-2.328c.37.28.684.57.948.859l-.38.387h.983v.818h-2.427c.066.957.165 1.7.297 2.211.025.116.058.223.091.339.33-.578.603-1.246.817-1.99l.784.34q-.483 1.571-1.238 2.673c.075.165.157.314.24.437.23.355.412.537.536.537q.126 0 .289-1.189l.776.421c-.215 1.164-.52 1.75-.933 1.75-.363 0-.743-.248-1.147-.735a4 4 0 0 1-.33-.495 5.6 5.6 0 0 1-1.882 1.362l-.495-.726a5.4 5.4 0 0 0 1.98-1.51 8 8 0 0 1-.305-.941c-.181-.66-.297-1.494-.363-2.484H21.03v1.147h2.022q-.037 2.302-.247 2.872-.198.517-.867.528a7 7 0 0 1-.668-.041l-.264-.784c.33.024.602.04.833.04.132-.007.223-.09.264-.255.05-.19.074-.71.091-1.552H21.03c-.04 1.536-.38 2.765-1.015 3.698l-.652-.586c.512-.751.776-1.8.8-3.136V4.772h3.401c-.017-.38-.017-.785-.017-1.197h.875q0 .629.025 1.196h1.164a6 6 0 0 0-.793-.726z&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;#CCC&quot; d=&quot;M12.934 5.853V5.33h-.34l-.137.31zm-1.238 1.84-.41.325.362.455.415-.407zm-.57-.718-.377-.361-.315.329.283.357zm1.495-3.128.096-.513-.51-.096-.1.51zm.883.165.511.107.11-.522-.525-.098zm-.256 1.007-.498-.157-.215.68h.713zm1.436 0v.523h.522v-.523zm0-1.353v-.523h-.523v.523zm.866 0h.523v-.523h-.523zm0 1.353h-.522v.523h.522zm2.617 0h.522v-.522h-.522zm0 .834v.522h.522v-.522zm-2.617 0V5.33h-.522v.523zm0 1.617h-.522v.523h.522zm2.46 0h.522v-.522h-.522zm0 .834v.522h.522v-.522zm-2.46 0V7.78h-.522v.523zm0 1.799h-.522v.522h.522zm3.153 0h.523V9.58h-.523zm0 .858v.523h.523v-.523zm-7.345 0h-.523v.523h.523zm0-.858V9.58h-.523v.523zm3.326 0v.522h.522v-.522zm0-1.8h.522v-.522h-.522zm-2.327 0h-.523v.523h.523zm0-.833v-.522h-.523v.522zm2.327 0v.523h.522V7.47zm0-1.617h.522V5.33h-.522zm-1.75 0-.477-.212q-.452 1.015-1.127 1.68l.366.372.367.373c.557-.549 1.005-1.225 1.349-2.002zm-1.238 1.84.41-.325-.57-.718-.41.325-.409.325.57.718zm-.57-.718.378.361c.828-.864 1.36-2.003 1.63-3.389l-.513-.1-.513-.1c-.242 1.239-.7 2.18-1.359 2.867zm1.495-3.128-.096.514.883.165.096-.514.096-.513-.883-.165zm.883.165-.512-.107c-.072.345-.15.665-.243.957l.499.157.498.157c.106-.336.193-.692.27-1.057zm-.256 1.007v.523h1.436V4.497h-1.436zm1.436 0h.522V3.666h-1.045v1.353zm0-1.353v.522h.866V3.143h-.866zm.866 0h-.522v1.353h1.045V3.666zm0 1.353v.523h2.617V4.497H15.55zm2.617 0h-.523v.834h1.045v-.834zm0 .834V5.33H15.55v1.045h2.617zm-2.617 0h-.522V7.47h1.045V5.853zm0 1.617v.523h2.46V6.948h-2.46zm2.46 0h-.523v.834h1.045V7.47zm0 .834V7.78h-2.46v1.045h2.46zm-2.46 0h-.522v1.799h1.045v-1.8zm0 1.799v.522h3.153V9.58H15.55zm3.153 0h-.523v.858h1.046v-.858zm0 .858v-.522h-7.345v1.045h7.345zm-7.345 0h.522v-.858h-1.045v.858zm0-.858v.522h3.326V9.58h-3.326zm3.326 0h.522v-1.8h-1.045v1.8zm0-1.8v-.522h-2.327v1.045h2.327zm-2.327 0h.522V7.47h-1.045v.834zm0-.833v.523h2.327V6.948h-2.327zm2.327 0h.522V5.853h-1.045V7.47zm0-1.617V5.33h-1.75v1.045h1.75zm10.68-2.328.314-.417-.354-.267-.322.306zm.948.859.374.365.345-.353-.333-.365zm-.38.387-.373-.365-.869.888h1.243zm.983 0h.522V4.25h-.522zm0 .818v.522h.522v-.522zm-2.427 0v-.523h-.56l.039.558zm.297 2.211.511-.11-.002-.01-.003-.01zm.091.339-.502.143.34 1.193.616-1.077zm.817-1.99.207-.479-.544-.235-.165.57zm.784.34.5.152.137-.447-.43-.186zM25.24 9.161l-.43-.295-.167.242.12.267zm.24.437.438-.285-.004-.004zm.825-.652.25-.459-.666-.36-.102.75zm.776.421.514.095.068-.373-.333-.18zM25 10.383l-.413.321.006.007.005.006zm-.33-.495.459-.25-.35-.642-.494.54zm-1.882 1.362-.431.294.245.36.397-.176zm-.495-.726-.213-.477-.57.255.351.516zm1.98-1.51.404.332.197-.239-.115-.288zm-.305-.941.505-.136v-.003zm-.363-2.484.522-.035-.033-.488h-.489zm-2.575 0v-.523h-.522v.523zm0 1.147h-.522v.522h.522zm2.022 0 .523.008.008-.53h-.53zm-.247 2.872.488.186.002-.005zm-.867.528v.523h.01zm-.668-.041-.495.166.107.32.336.034zm-.264-.784.039-.521-.786-.06.251.747zm.833.04v.523h.033zm.264-.255-.505-.132-.002.005zm.091-1.552.522.01.01-.532h-.532zm-1.164 0v-.522h-.508l-.014.508zm-1.015 3.698-.35.388.445.4.337-.494zm-.652-.586-.432-.294-.257.377.34.305zm.8-3.136.523.01v-.01zm0-2.748v-.523h-.522v.523zm3.401 0v.522h.546l-.024-.545zm-.017-1.197v-.523h-.522v.523zm.875 0h.523v-.523h-.523zm.025 1.196-.522.023.022.5h.5zm1.164 0v.523h1.167L26 4.424zm-.793-.726-.36-.378-.441.42.483.372zm.545-.52-.315.417c.347.262.637.53.879.794l.385-.352.386-.353a7.5 7.5 0 0 0-1.02-.923zm.95.859-.374-.366-.38.388.374.365.373.366.38-.388zm-.38.387v.523h.982V4.249h-.982zm.982 0h-.523v.818h1.045V4.77zm0 .818v-.523h-2.427v1.045h2.427zm-2.427 0-.521.035c.067.968.168 1.748.313 2.307l.505-.13.506-.131q-.182-.697-.281-2.117zm.297 2.211-.51.11c.029.138.07.27.099.372l.502-.143.503-.144c-.037-.129-.063-.211-.083-.304zm.091.339.454.259c.354-.62.641-1.328.865-2.103l-.502-.145-.502-.145a8.6 8.6 0 0 1-.768 1.874zm.817-1.99-.207.48.784.339.207-.48.207-.48-.784-.338zm.784.34-.5-.154c-.309 1.009-.701 1.85-1.169 2.532l.431.295.431.295c.54-.786.973-1.728 1.307-2.816zM25.24 9.161l-.476.214c.085.19.181.364.28.513l.436-.29.434-.29a2.5 2.5 0 0 1-.197-.361zm.24.437-.438.286c.124.19.25.359.377.485.063.064.139.13.227.181.085.051.213.107.37.107V9.613c.095 0 .154.034.163.04.012.007.005.005-.021-.022a2 2 0 0 1-.24-.317zm.536.537v.522a.56.56 0 0 0 .425-.197.8.8 0 0 0 .115-.183c.044-.094.076-.206.103-.315.055-.225.11-.544.164-.945l-.518-.07-.518-.07c-.053.39-.102.666-.143.837q-.016.061-.027.097l-.011.033q0-.002.01-.018a.48.48 0 0 1 .4-.213zm.289-1.189-.25.46.777.42.249-.459.249-.459-.776-.42zm.776.421-.514-.094c-.104.565-.223.94-.34 1.16-.124.234-.166.162-.079.162v1.044c.5 0 .817-.365 1.002-.716.193-.362.334-.862.445-1.46zm-.933 1.75v-.523c-.12 0-.366-.088-.745-.545l-.402.333-.402.334c.43.517.943.923 1.55.923zM25 10.383l.412-.32a3 3 0 0 1-.283-.425l-.46.25-.458.25c.117.214.25.404.377.566zm-.33-.495-.385-.353a5.1 5.1 0 0 1-1.708 1.237l.211.478.211.478a6.1 6.1 0 0 0 2.056-1.487zm-1.882 1.362.432-.294-.495-.727-.432.295-.432.294.495.726zm-.495-.726.213.477a5.9 5.9 0 0 0 2.17-1.655l-.402-.332-.403-.333a4.86 4.86 0 0 1-1.791 1.366zm1.98-1.51.486-.195a8 8 0 0 1-.286-.882l-.505.136-.504.135q.14.528.325 1zm-.305-.941.504-.139c-.168-.612-.28-1.406-.345-2.38l-.522.035-.521.034c.067 1.007.186 1.88.38 2.588zm-.363-2.484v-.523H21.03v1.045h2.575zm-2.575 0h-.522v1.147h1.045V5.589zm0 1.147v.522h2.022V6.213H21.03zm2.022 0-.522-.009a27 27 0 0 1-.079 1.833c-.041.478-.093.75-.136.867l.49.18.49.182c.097-.263.156-.66.197-1.14q.064-.743.083-1.905zm-.247 2.872-.489-.186c-.028.075-.062.108-.098.13a.6.6 0 0 1-.29.061l.01.523.01.522c.285-.005.567-.064.812-.213.253-.153.43-.38.533-.651zm-.867.528v-.523a6 6 0 0 1-.616-.038l-.052.52-.052.52c.253.025.496.043.72.043zm-.668-.041.495-.167-.264-.784-.495.167-.496.166.264.784zm-.264-.784-.04.52c.331.025.62.043.873.043V8.83c-.21 0-.465-.015-.794-.04zm.833.04.033.522a.78.78 0 0 0 .494-.212.9.9 0 0 0 .244-.438l-.507-.127-.507-.127c-.004.019 0-.019.049-.064a.3.3 0 0 1 .162-.075zm.264-.255.506.132c.04-.153.06-.382.074-.634q.022-.404.033-1.04l-.522-.01-.522-.01q-.013.628-.033 1.002a3 3 0 0 1-.041.428zm.091-1.552v-.522H21.03v1.045h1.164zm-1.164 0-.522-.014c-.04 1.47-.362 2.592-.925 3.418l.432.294.432.294c.709-1.04 1.063-2.377 1.106-3.977zm-1.015 3.698.35-.389-.652-.586-.35.389-.349.388.652.586zm-.652-.586.432.294c.59-.867.865-2.03.891-3.42l-.522-.01-.523-.01c-.023 1.283-.277 2.217-.71 2.852zm.8-3.136h.523V4.772h-1.045V7.52zm0-2.748v.522h3.401V4.249h-3.4zm3.401 0 .522-.023a28 28 0 0 1-.016-1.174h-1.045c0 .41 0 .826.017 1.22zm-.017-1.197v.522h.875V3.052h-.875zm.875 0H23.9c0 .428.008.831.025 1.22l.522-.024.522-.022c-.016-.372-.024-.76-.024-1.174zm.025 1.196v.523h1.164V4.249h-1.164zm1.164 0 .39-.348a6.4 6.4 0 0 0-.864-.792l-.319.414-.318.414a5.3 5.3 0 0 1 .72.66zm-.793-.726.361.378.545-.52-.36-.378-.362-.378-.544.52z&quot; mask=&quot;url(#ai-generate-label_svg__a)&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;#CCC&quot; d=&quot;M6.544 10.85H5.112L4.652 9h-1.99l-.653 1.85H.577l2.268-6.422H4.95zm2.28 0h-1.52l.337-6.422h1.52zM3.047 7.91h1.335L3.83 5.692z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;container-footer-TocUUl&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br class=&quot;container-Vdm5p7 wrapper-_7axQ_ undefined&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto;&quot;/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;div class=&quot;auto-hide-last-sibling-br paragraph-Oc488D paragraph-element br-paragraph-space&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; margin-bottom: 0px; margin-top: 0px; overflow-anchor: auto;&quot;&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;启动任务分发器&lt;/span&gt;：&lt;/div&gt;&lt;div class=&quot;relative w-fit custom-code-block-canvas-wrapper w-full&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); position: relative; width: 760.2px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;code-block-element-Kq8H8v light custom-code-block-container--bash hide-indicator disable-theme-style custom-code-block-container&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; flex-direction: column; position: relative; --code-area-radius: 6px; --code-area-radius-inner: calc(6px - 1px); --code-area-bg-color: #f9fafb; --code-header-bg-color: #f3f4f6; --code-mask-bg-color: linear-gradient(180deg,rgba(249,250,251,0),#f9fafb); --code-header-icon-color: rgba(0,0,0,.5); --code-header-text-color: rgba(0,0,0,.85); --code-header-icon-bg-color: rgba(0,0,0,.06); --code-block-code-color: #000000d9; --code-block-std-bg-color: #f3f4f6; --code-block-std-err-color: #d60000; margin-top: 8px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;code-area-z8IfZP code-area&quot; dir=&quot;ltr&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background: none 0% 0% / auto repeat scroll padding-box border-box rgb(249, 250, 251); border-radius: 6px; display: flex; flex-direction: column; height: fit-content; width: 760.2px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;header-wrapper-OsF77N&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; background-color: rgb(255, 255, 255); position: sticky; top: 0px;&quot;&gt;&lt;div class=&quot;header-A8bf6p&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(243, 244, 246); display: flex; flex-direction: row; flex-shrink: 0; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; height: 32px; justify-content: space-between; padding: 6px 9px 6px 6px; border-color: rgba(0, 0, 0, 0.08); border-style: solid; border-width: 0.8px 0.8px 0px; border-image: none 100% / 1 / 0 stretch; border-radius: 5px 5px 0px 0px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;title-QMwu7c clickable-p6chjr&quot; tabindex=&quot;0&quot; aria-describedby=&quot;abr2d8p&quot; data-popupid=&quot;abr2d8p&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; align-items: center; border-radius: 4px; color: rgba(0, 0, 0, 0.5); display: flex; flex-direction: row; gap: 3px; padding: 0px 4px 0px 10px; cursor: pointer;&quot;&gt;&lt;div class=&quot;text-fbmuIX&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; align-items: center; color: rgba(0, 0, 0, 0.85); display: flex; font-family: &amp;quot;PingFang SC&amp;quot;; font-size: 14px; gap: 3px; line-height: 22px; overflow: hidden; text-overflow: ellipsis; text-wrap-mode: nowrap;&quot;&gt;bash&lt;/div&gt;&lt;div class=&quot;icon-jzrQql&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 15px;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-12&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M21.707 17.293a1 1 0 0 1-1.414 0L12 9l-8.293 8.293a1 1 0 0 1-1.414-1.414l8.293-8.293a2 2 0 0 1 2.828 0l8.293 8.293a1 1 0 0 1 0 1.414&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;action-D_0sSD&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; align-items: center; color: rgba(0, 0, 0, 0.5); cursor: pointer; display: flex; flex-direction: row; gap: 8px; justify-content: space-between;&quot;&gt;&lt;div class=&quot;hoverable-qHOoMX&quot; data-testid=&quot;code-block-copy&quot; tabindex=&quot;0&quot; aria-describedby=&quot;e8qlziv&quot; data-popupid=&quot;e8qlziv&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 20px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-14&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 14px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M21 3.5V17a2 2 0 0 1-2 2h-2v-2h2V3.5H9v2h5.857c1.184 0 2.143.895 2.143 2v13c0 1.105-.96 2-2.143 2H5.143C3.959 22.5 3 21.605 3 20.5v-13c0-1.105.96-2 2.143-2H7v-2a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2m-6.143 4H5.143v13h9.714z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;hoverable-qHOoMX&quot; tabindex=&quot;0&quot; aria-describedby=&quot;0q4svtt&quot; data-popupid=&quot;0q4svtt&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 20px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-14&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 14px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M4 4a1 1 0 0 1 1 1v3a3 3 0 0 0 3 3h11.086l-5.293-5.293a1 1 0 0 1 1.414-1.414l7 7a1 1 0 0 1 0 1.414l-7 7a1 1 0 0 1-1.414-1.414L19.086 13H8a5 5 0 0 1-5-5V5a1 1 0 0 1 1-1&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;hoverable-qHOoMX&quot; tabindex=&quot;0&quot; aria-describedby=&quot;b6g5ins&quot; data-popupid=&quot;b6g5ins&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 20px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-14&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 14px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M4.797 16.856a8.28 8.28 0 0 0 6.27 2.87h.008A8.28 8.28 0 0 0 14.372 3.84a11.6 11.6 0 0 1-1.658 7.714 11.62 11.62 0 0 1-7.917 5.303M13.415 1.43a10.28 10.28 0 0 1-2.348 20.296 10.28 10.28 0 0 1-8.883-5.103c-.397-.74.155-1.605.912-1.609a9.617 9.617 0 0 0 9.011-12.258 1.093 1.093 0 0 1 1.308-1.326&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;hoverable-qHOoMX&quot; tabindex=&quot;0&quot; aria-describedby=&quot;y8d1eps&quot; data-popupid=&quot;y8d1eps&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 20px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-14&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 14px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M22 3v7a1 1 0 1 1-2 0V4h-6a1 1 0 1 1 0-2h7a1 1 0 0 1 1 1M11.005 21a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1v-7a1 1 0 0 1 2.002 0v6h6.003a1 1 0 0 1 1 1&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;content-qydEZG light-scrollbar-Lun507&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; flex-shrink: 0; height: fit-content; overflow: overlay; padding: 12px 16px 16px; overflow-anchor: auto; border-color: rgba(0, 0, 0, 0.08); border-radius: 0px 0px 5px 5px; border-style: solid; border-width: 0px 1px 1px;&quot;&gt;&lt;pre class=&quot;container-GJFPCm language-bash&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; overflow-wrap: normal; --code-text_v3: #000000d9; --code-doc_v3: #00000073; --code-Link_v3: #2f74ff; --code-number_v3: #e54595; --code-keycontrol_v3: #9952e1; --code-function_v3: #ff5d4d; --code-variable_v3: #000000d9; --code-parameter_v3: #4da621; --code-attributes_v3: #c70; --code-selection-bg-color: #ebf1ff; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); color: rgb(0, 0, 0); word-break: normal; word-spacing: normal; hyphens: none; line-height: 1.5; tab-size: 4; margin-top: 0px; margin-bottom: 0px; overflow: auto; font-size: 13.6px; border-radius: 6px; padding: 0px; overflow-anchor: auto; width: fit-content;&quot;&gt;python&amp;nbsp;downloader.py&amp;nbsp;--role&amp;nbsp;distributor&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;mask-wrapper-ARWxJv&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; opacity: 0; transition: opacity 0.15s;&quot;&gt;&lt;div class=&quot;mask-hxdXYU&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background: linear-gradient(rgba(249, 250, 251, 0), rgb(249, 250, 251)) 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); bottom: 0px; height: 56px; pointer-events: none; position: absolute; width: 760.2px; overflow-anchor: auto;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;canvas_wrapper-y3Fcgx exited-O8qSm4&quot; data-testid=&quot;canvas-wrapper&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); visibility: hidden; z-index: 10; border-radius: 12px; height: 82px; left: 0px; opacity: 0; pointer-events: none; position: absolute; top: 0px; width: 760px; --canvas-radius-size: 12px; overflow-anchor: auto; --offset-width: 760px; --offset-height: 82px;&quot;&gt;&lt;div data-testid=&quot;canvas_panel_container&quot; data-visible=&quot;false&quot; class=&quot;container-outer-wapATW&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; flex-direction: column; height: 82px; width: 760px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;container-V37bUX&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; border-radius: 12px; box-shadow: rgba(42, 60, 79, 0.1) 0px 6px 10px 0px; display: flex; flex-direction: column; height: 82px; position: relative; transition: border-radius 0.4s ease-in-out; flex: 1 1 0%; min-height: 0px; width: 760px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;container-inner-CLMuXa canvas_wrapper_inner-liGdwM&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex: 1 1 0%; min-height: 0px; width: 760px; border-radius: 12px; overflow: hidden; transition: border-radius 0.4s ease-in-out; overflow-anchor: auto;&quot;&gt;&lt;div style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; width: 760px; height: 82px;&quot;&gt;&lt;div class=&quot;code-canvas code-canvas-theme semi-always-light container-uANf2o&quot; data-theme=&quot;light&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); height: 82px; width: 760px; --canvas-header-height: 56px; --code-editor-header-width: 56px; --code-editor-file-tree-width: 212px; --semi-amber-0: 254,251,235; --semi-amber-1: 252,245,206; --semi-amber-2: 249,232,158; --semi-amber-3: 246,216,111; --semi-amber-4: 243,198,65; --semi-amber-5: 240,177,20; --semi-amber-6: 200,138,15; --semi-amber-7: 160,102,10; --semi-amber-8: 120,70,6; --semi-amber-9: 80,43,3; --semi-black: 0,0,0; --semi-blue-0: 234,245,255; --semi-blue-1: 203,231,254; --semi-blue-2: 152,205,253; --semi-blue-3: 101,178,252; --semi-blue-4: 50,149,251; --semi-blue-5: 0,100,250; --semi-blue-6: 0,98,214; --semi-blue-7: 0,79,179; --semi-blue-8: 0,61,143; --semi-blue-9: 0,44,107; --semi-cyan-0: 229,247,248; --semi-cyan-1: 194,239,240; --semi-cyan-2: 138,221,226; --semi-cyan-3: 88,203,211; --semi-cyan-4: 44,184,197; --semi-cyan-5: 5,164,182; --semi-cyan-6: 3,134,152; --semi-cyan-7: 1,105,121; --semi-cyan-8: 0,77,91; --semi-cyan-9: 0,50,61; --semi-green-0: 236,247,236; --semi-green-1: 208,240,209; --semi-green-2: 164,224,167; --semi-green-3: 125,209,130; --semi-green-4: 90,194,98; --semi-green-5: 59,179,70; --semi-green-6: 48,149,59; --semi-green-7: 37,119,47; --semi-green-8: 27,89,36; --semi-green-9: 17,60,24; --semi-grey-0: 249,249,249; --semi-grey-1: 230,232,234; --semi-grey-2: 198,202,205; --semi-grey-3: 167,171,176; --semi-grey-4: 136,141,146; --semi-grey-5: 107,112,117; --semi-grey-6: 85,91,97; --semi-grey-7: 65,70,76; --semi-grey-8: 46,50,56; --semi-grey-9: 28,31,35; --semi-indigo-0: 236,239,248; --semi-indigo-1: 209,216,240; --semi-indigo-2: 167,179,225; --semi-indigo-3: 128,144,211; --semi-indigo-4: 94,111,196; --semi-indigo-5: 63,81,181; --semi-indigo-6: 51,66,161; --semi-indigo-7: 40,52,140; --semi-indigo-8: 31,40,120; --semi-indigo-9: 23,29,99; --semi-light-blue-0: 233,247,253; --semi-light-blue-1: 201,236,252; --semi-light-blue-2: 149,216,248; --semi-light-blue-3: 98,195,245; --semi-light-blue-4: 48,172,241; --semi-light-blue-5: 0,149,238; --semi-light-blue-6: 0,123,202; --semi-light-blue-7: 0,99,167; --semi-light-blue-8: 0,75,131; --semi-light-blue-9: 0,53,95; --semi-light-green-0: 243,248,236; --semi-light-green-1: 227,240,208; --semi-light-green-2: 200,226,165; --semi-light-green-3: 173,211,126; --semi-light-green-4: 147,197,91; --semi-light-green-5: 123,182,60; --semi-light-green-6: 100,152,48; --semi-light-green-7: 78,121,38; --semi-light-green-8: 57,91,27; --semi-light-green-9: 37,61,18; --semi-lime-0: 242,250,230; --semi-lime-1: 227,246,197; --semi-lime-2: 203,237,142; --semi-lime-3: 183,227,91; --semi-lime-4: 167,218,44; --semi-lime-5: 155,209,0; --semi-lime-6: 126,174,0; --semi-lime-7: 99,139,0; --semi-lime-8: 72,104,0; --semi-lime-9: 47,70,0; --semi-orange-0: 255,248,234; --semi-orange-1: 254,238,204; --semi-orange-2: 254,217,152; --semi-orange-3: 253,193,101; --semi-orange-4: 253,166,51; --semi-orange-5: 252,136,0; --semi-orange-6: 210,103,0; --semi-orange-7: 168,74,0; --semi-orange-8: 126,49,0; --semi-orange-9: 84,29,0; --semi-pink-0: 253,236,239; --semi-pink-1: 251,207,216; --semi-pink-2: 246,160,181; --semi-pink-3: 242,115,150; --semi-pink-4: 237,72,123; --semi-pink-5: 233,30,99; --semi-pink-6: 197,19,86; --semi-pink-7: 162,11,72; --semi-pink-8: 126,5,58; --semi-pink-9: 90,1,43; --semi-purple-0: 247,233,247; --semi-purple-1: 239,202,240; --semi-purple-2: 221,155,224; --semi-purple-3: 201,111,209; --semi-purple-4: 180,73,194; --semi-purple-5: 158,40,179; --semi-purple-6: 135,30,158; --semi-purple-7: 113,22,138; --semi-purple-8: 92,15,117; --semi-purple-9: 73,10,97; --semi-red-0: 254,242,237; --semi-red-1: 254,221,210; --semi-red-2: 253,183,165; --semi-red-3: 251,144,120; --semi-red-4: 250,102,76; --semi-red-5: 249,57,32; --semi-red-6: 213,37,21; --semi-red-7: 178,20,12; --semi-red-8: 142,8,5; --semi-red-9: 106,1,3; --semi-teal-0: 228,247,244; --semi-teal-1: 192,240,232; --semi-teal-2: 135,224,211; --semi-teal-3: 84,209,193; --semi-teal-4: 39,194,176; --semi-teal-5: 0,179,161; --semi-teal-6: 0,149,137; --semi-teal-7: 0,119,111; --semi-teal-8: 0,89,85; --semi-teal-9: 0,60,58; --semi-violet-0: 243,237,249; --semi-violet-1: 226,209,244; --semi-violet-2: 196,167,233; --semi-violet-3: 166,127,221; --semi-violet-4: 136,91,210; --semi-violet-5: 106,58,199; --semi-violet-6: 87,47,179; --semi-violet-7: 70,37,158; --semi-violet-8: 54,28,138; --semi-violet-9: 40,20,117; --semi-white: 255,255,255; --semi-yellow-0: 255,253,234; --semi-yellow-1: 254,251,203; --semi-yellow-2: 253,243,152; --semi-yellow-3: 252,232,101; --semi-yellow-4: 251,218,50; --semi-yellow-5: 250,200,0; --semi-yellow-6: 208,170,0; --semi-yellow-7: 167,139,0; --semi-yellow-8: 125,106,0; --semi-yellow-9: 83,72,0; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;canvas-header-_ng4RX&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; background-color: rgba(0, 0, 0, 0); border-bottom: 0.8px solid rgba(0, 0, 0, 0.08); display: grid; gap: 4px; grid-template-columns: minmax(min-content, 1fr) auto minmax(min-content, 1fr); height: 56px; overflow: hidden; padding: 0px 16px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;canvas-header-left-V6XIuw&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; gap: 4px; overflow: hidden; overflow-anchor: auto;&quot;&gt;&lt;div style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;flex items-center gap-4&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; align-items: center; gap: 4px; overflow-anchor: auto;&quot;&gt;&lt;span class=&quot;inline-flex items-center mr-4 h-20&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; margin-right: 4px; display: inline-flex; height: 20px; align-items: center; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;s-font-small-strong&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-size-adjust: none; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-variant-position: normal; font-variant-emoji: normal; font-stretch: normal; font-size: 14px; line-height: 22px; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;canvas-header-middle-U6siD5&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; gap: 4px; overflow: hidden; grid-column: 2; overflow-anchor: auto;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;canvas-header-right-y8Tw7L&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; gap: 4px; overflow: hidden; justify-content: flex-end; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;header-btn-nkmwlw&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; border-radius: 8px; cursor: pointer; display: inline-flex; gap: 3px; height: 32px; justify-content: center; padding: 4px; width: 69px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-18&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 18px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M21 3.5V17a2 2 0 0 1-2 2h-2v-2h2V3.5H9v2h5.857c1.184 0 2.143.895 2.143 2v13c0 1.105-.96 2-2.143 2H5.143C3.959 22.5 3 21.605 3 20.5v-13c0-1.105.96-2 2.143-2H7v-2a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2m-6.143 4H5.143v13h9.714z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;btn-text-aRIgRD&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; text-align: center; font-family: &amp;quot;PingFang SC&amp;quot;; font-size: 14px; line-height: 22px; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;header-btn-nkmwlw&quot; aria-haspopup=&quot;true&quot; tabindex=&quot;0&quot; aria-describedby=&quot;hxzhzlx&quot; data-popupid=&quot;hxzhzlx&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; border-radius: 8px; cursor: pointer; display: inline-flex; gap: 3px; height: 32px; justify-content: center; padding: 4px; width: 69px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-18&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 18px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M20.207 12.207a1 1 0 0 0-1.414-1.414L13 16.586V2a1 1 0 1 0-2 0v14.586l-5.793-5.793a1 1 0 0 0-1.414 1.414l7.5 7.5c.195.195.45.293.706.293H5a1 1 0 1 0 0 2h14a1 1 0 1 0 0-2h-6.999a1 1 0 0 0 .706-.293z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;btn-text-aRIgRD&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; text-align: center; font-family: &amp;quot;PingFang SC&amp;quot;; font-size: 14px; line-height: 22px; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;more-btn-qQsdj1&quot; aria-haspopup=&quot;true&quot; tabindex=&quot;0&quot; aria-describedby=&quot;52f1gsa&quot; data-popupid=&quot;52f1gsa&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; aspect-ratio: 1 / 1; border-radius: 4px; cursor: pointer; display: flex; flex-shrink: 0; height: 32px; justify-content: center; padding: 7px; width: 32px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-18&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 18px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M5.5 11.75a1.75 1.75 0 1 1-3.5 0 1.75 1.75 0 0 1 3.5 0M13.725 11.75a1.75 1.75 0 1 1-3.5 0 1.75 1.75 0 0 1 3.5 0M22 11.75a1.75 1.75 0 1 1-3.5 0 1.75 1.75 0 0 1 3.5 0&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;divider-ExjbWf&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; background-color: rgba(0, 0, 0, 0.08); height: 16px; margin: 0px 4px; width: 1px; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;button tabindex=&quot;0&quot; class=&quot;semi-button semi-button-primary samantha-button-vtPGz2 quartary-w95bZm medium-DBTMZB icon-D5yFjW icon-only-g_8LKZ tooltip-button-oVRj8d tooltip-button-size-medium-v4uviy semi-button-with-icon semi-button-with-icon-only&quot; type=&quot;button&quot; aria-disabled=&quot;false&quot; aria-describedby=&quot;hk6oy1u&quot; data-popupid=&quot;hk6oy1u&quot; style=&quot;-webkit-font-smoothing: antialiased; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; border-width: 0px; border-style: solid; border-color: transparent; border-radius: 10px; box-shadow: none; cursor: pointer; display: inline-flex; font: 500 14px / 22px Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; height: 32px; justify-content: center; outline: none; padding: 4px; user-select: none; vertical-align: middle; text-wrap-mode: nowrap; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; color: rgba(0, 0, 0, 0.85); transform: none; transition: background-color ease-in, border ease-in; appearance: button; overflow-anchor: auto;&quot;&gt;&lt;span class=&quot;semi-button-content&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; overflow: hidden; text-overflow: ellipsis; align-items: center; display: flex; justify-content: center; overflow-anchor: auto; padding: 3px;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-rendering: optimizelegibility; fill: currentcolor; font-size: 18px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M20.307 20.307a.997.997 0 0 0 .003-1.412l-6.845-6.844 6.845-6.845a.997.997 0 0 0-.003-1.412.997.997 0 0 0-1.412-.002l-6.844 6.844-6.845-6.845a.997.997 0 0 0-1.412.003.997.997 0 0 0-.002 1.412l6.844 6.844-6.845 6.845a.997.997 0 0 0 .003 1.412.997.997 0 0 0 1.412.003l6.844-6.845 6.845 6.845a.997.997 0 0 0 1.412-.003&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code-canvas-body&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); height: calc(100% - 56px); overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;content-s0HetY flow-ext-disable-select-bar&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; width: 760px; height: 26px;&quot;&gt;&lt;div class=&quot;resizable-wrapper-EaKdb0 direction-column-F5pTZk&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; height: 26px; width: 760px; flex-direction: column; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;resizable-wrapper-EaKdb0 direction-row-lcyVSf&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; height: 26px; width: 760px; flex-direction: row; overflow-anchor: auto; min-height: 0px;&quot;&gt;&lt;div class=&quot;canvas-body-content-yXFryQ&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); height: 26px; position: relative; width: 760px; overflow-anchor: auto; min-width: 0px;&quot;&gt;&lt;div class=&quot;editor-fOI6Y_&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; display: flow-root; flex: 1 1 0%; height: 26px; width: 760px;&quot;&gt;&lt;div class=&quot;editorContent-FfnwE_&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; height: calc(100% - 12px); margin-top: 12px; overflow-x: auto; position: relative; width: 760px;&quot;&gt;&lt;div class=&quot;cm-theme&quot; data-language-input=&quot;bash&quot; data-language=&quot;shell&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); --code-text: #000000d9; --code-doc: #00000073; --code-link: #2f74ff; --code-number: #e54595; --code-key-control: #9952e1; --code-function: #ff5d4d; --code-variable: #000000d9; --code-parameter: #4da621; --code-attributes: #c70; overflow-anchor: auto; height: 14px; width: 744.8px;&quot;&gt;&lt;div class=&quot;cm-editor ͼ1 ͼ2 ͼ4 ͼ1i1 ͼ16 ͼ2q&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-direction: column; font-size: 13px; font-feature-settings: &amp;quot;liga&amp;quot; 0, &amp;quot;calt&amp;quot; 0; color: rgb(0, 0, 0); height: 14px; overflow-anchor: auto; position: relative !important; display: flex !important;&quot;&gt;&lt;div class=&quot;cm-announced&quot; aria-live=&quot;polite&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); position: fixed; top: -10000px; overflow-anchor: auto;&quot;&gt;&lt;/div&gt;&lt;div tabindex=&quot;-1&quot; class=&quot;cm-scroller&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; line-height: 1.4; height: 14px; overflow: scroll; position: relative; z-index: 0; overflow-anchor: auto; display: flex !important; align-items: flex-start !important; --scrollbar-color: transparent; --scrollbar-width: 7px;&quot;&gt;&lt;div class=&quot;cm-gutters&quot; aria-hidden=&quot;true&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-shrink: 0; display: flex; height: 112.4px; inset-inline-start: 0px; z-index: 200; color: rgba(0, 0, 0, 0.3); border-width: initial; border-style: none; border-right-color: transparent; border-top-color: initial; border-bottom-color: initial; border-left-color: initial; border-image: initial; overflow-anchor: auto; min-height: 112.4px; position: sticky;&quot;&gt;&lt;div class=&quot;cm-gutter cm-lineNumbers&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-direction: column; flex-shrink: 0; min-height: 100%; overflow: hidden; display: flex !important; min-width: 6ch; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;cm-gutterElement&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px 3px 0px 5px; min-width: 20px; text-align: right; text-wrap-mode: nowrap; overflow-anchor: auto; height: 0px; visibility: hidden; pointer-events: none;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutterElement cm-activeLineGutter&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background: unset; padding: 0px 3px 0px 5px; min-width: 20px; text-align: right; text-wrap-mode: nowrap; overflow-anchor: auto; height: 18.2px; margin-top: 4px;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutterElement&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px 3px 0px 5px; min-width: 20px; text-align: right; text-wrap-mode: nowrap; overflow-anchor: auto; height: 18.2px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutter cm-foldGutter&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-direction: column; flex-shrink: 0; min-height: 100%; overflow: hidden; display: flex !important; padding: 0px 6px 0px 2px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;cm-gutterElement&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); color: rgb(115, 119, 128); overflow-anchor: auto; height: 0px; visibility: hidden; pointer-events: none;&quot;&gt;&lt;span class=&quot;unfold-button&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; padding: 0px 1px; cursor: pointer; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutterElement cm-activeLineGutter&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background: unset; color: rgb(115, 119, 128); overflow-anchor: auto; height: 18.2px; margin-top: 4px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div spellcheck=&quot;false&quot; autocorrect=&quot;off&quot; autocapitalize=&quot;off&quot; writingsuggestions=&quot;false&quot; translate=&quot;no&quot; contenteditable=&quot;false&quot; class=&quot;cm-content&quot; role=&quot;textbox&quot; aria-multiline=&quot;true&quot; aria-readonly=&quot;true&quot; data-language=&quot;shell&quot; aria-autocomplete=&quot;list&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; flex-grow: 2; flex-shrink: 0; white-space: pre; overflow-wrap: normal; min-height: 100%; padding: 4px 0px 72px; outline: none; overflow-anchor: auto; tab-size: 4; caret-color: transparent !important;&quot;&gt;&lt;div class=&quot;cm-activeLine cm-line&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px 4px 0px 1px; background: unset; overflow-anchor: auto; caret-color: transparent !important;&quot;&gt;&lt;span class=&quot;ͼ1o&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; color: #CC7700; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutters-opposite&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-shrink: 0; position: sticky; right: 0px; height: 28px; overflow-anchor: auto; width: 5px; min-height: 28px;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;cm-layer cm-layer-above cm-cursorLayer&quot; aria-hidden=&quot;true&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); position: absolute; left: 0px; top: 0px; contain: size style; pointer-events: none; overflow-anchor: auto; z-index: 150; animation-duration: 1200ms;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;cm-layer cm-selectionLayer&quot; aria-hidden=&quot;true&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); position: absolute; left: 0px; top: 0px; contain: size style; overflow-anchor: auto; z-index: -2;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ai-generate-label-wrapper-ef3noE&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); border: 0.6px solid rgba(204, 204, 204, 0.5); border-radius: 4px; display: flex; height: 15px; justify-content: center; line-height: 15px; position: absolute; right: 11px; top: 0px; width: 36px; overflow-anchor: auto;&quot;&gt;&lt;span class=&quot;ai-generate-label-qrEHJU&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; color: #CCCCCC; font-size: 8.25px; font-weight: 600; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;28&quot; height=&quot;16&quot; fill=&quot;none&quot; viewbox=&quot;0 0 28 16&quot;&gt;&lt;mask id=&quot;ai-generate-label_svg__a&quot; fill=&quot;#fff&quot;&gt;&lt;path d=&quot;M12.934 5.853c-.322.726-.734 1.345-1.238 1.84l-.57-.718c.744-.776 1.239-1.816 1.495-3.128l.883.165a11 11 0 0 1-.256 1.007h1.436V3.666h.866v1.353h2.617v.834H15.55V7.47h2.46v.834h-2.46v1.799h3.153v.858h-7.345v-.858h3.326v-1.8h-2.327V7.47h2.327V5.853zm12.43-2.328c.37.28.684.57.948.859l-.38.387h.983v.818h-2.427c.066.957.165 1.7.297 2.211.025.116.058.223.091.339.33-.578.603-1.246.817-1.99l.784.34q-.483 1.571-1.238 2.673c.075.165.157.314.24.437.23.355.412.537.536.537q.126 0 .289-1.189l.776.421c-.215 1.164-.52 1.75-.933 1.75-.363 0-.743-.248-1.147-.735a4 4 0 0 1-.33-.495 5.6 5.6 0 0 1-1.882 1.362l-.495-.726a5.4 5.4 0 0 0 1.98-1.51 8 8 0 0 1-.305-.941c-.181-.66-.297-1.494-.363-2.484H21.03v1.147h2.022q-.037 2.302-.247 2.872-.198.517-.867.528a7 7 0 0 1-.668-.041l-.264-.784c.33.024.602.04.833.04.132-.007.223-.09.264-.255.05-.19.074-.71.091-1.552H21.03c-.04 1.536-.38 2.765-1.015 3.698l-.652-.586c.512-.751.776-1.8.8-3.136V4.772h3.401c-.017-.38-.017-.785-.017-1.197h.875q0 .629.025 1.196h1.164a6 6 0 0 0-.793-.726z&quot;&gt;&lt;/path&gt;&lt;/mask&gt;&lt;path fill=&quot;#CCC&quot; d=&quot;M12.934 5.853c-.322.726-.734 1.345-1.238 1.84l-.57-.718c.744-.776 1.239-1.816 1.495-3.128l.883.165a11 11 0 0 1-.256 1.007h1.436V3.666h.866v1.353h2.617v.834H15.55V7.47h2.46v.834h-2.46v1.799h3.153v.858h-7.345v-.858h3.326v-1.8h-2.327V7.47h2.327V5.853zm12.43-2.328c.37.28.684.57.948.859l-.38.387h.983v.818h-2.427c.066.957.165 1.7.297 2.211.025.116.058.223.091.339.33-.578.603-1.246.817-1.99l.784.34q-.483 1.571-1.238 2.673c.075.165.157.314.24.437.23.355.412.537.536.537q.126 0 .289-1.189l.776.421c-.215 1.164-.52 1.75-.933 1.75-.363 0-.743-.248-1.147-.735a4 4 0 0 1-.33-.495 5.6 5.6 0 0 1-1.882 1.362l-.495-.726a5.4 5.4 0 0 0 1.98-1.51 8 8 0 0 1-.305-.941c-.181-.66-.297-1.494-.363-2.484H21.03v1.147h2.022q-.037 2.302-.247 2.872-.198.517-.867.528a7 7 0 0 1-.668-.041l-.264-.784c.33.024.602.04.833.04.132-.007.223-.09.264-.255.05-.19.074-.71.091-1.552H21.03c-.04 1.536-.38 2.765-1.015 3.698l-.652-.586c.512-.751.776-1.8.8-3.136V4.772h3.401c-.017-.38-.017-.785-.017-1.197h.875q0 .629.025 1.196h1.164a6 6 0 0 0-.793-.726z&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;#CCC&quot; d=&quot;M12.934 5.853V5.33h-.34l-.137.31zm-1.238 1.84-.41.325.362.455.415-.407zm-.57-.718-.377-.361-.315.329.283.357zm1.495-3.128.096-.513-.51-.096-.1.51zm.883.165.511.107.11-.522-.525-.098zm-.256 1.007-.498-.157-.215.68h.713zm1.436 0v.523h.522v-.523zm0-1.353v-.523h-.523v.523zm.866 0h.523v-.523h-.523zm0 1.353h-.522v.523h.522zm2.617 0h.522v-.522h-.522zm0 .834v.522h.522v-.522zm-2.617 0V5.33h-.522v.523zm0 1.617h-.522v.523h.522zm2.46 0h.522v-.522h-.522zm0 .834v.522h.522v-.522zm-2.46 0V7.78h-.522v.523zm0 1.799h-.522v.522h.522zm3.153 0h.523V9.58h-.523zm0 .858v.523h.523v-.523zm-7.345 0h-.523v.523h.523zm0-.858V9.58h-.523v.523zm3.326 0v.522h.522v-.522zm0-1.8h.522v-.522h-.522zm-2.327 0h-.523v.523h.523zm0-.833v-.522h-.523v.522zm2.327 0v.523h.522V7.47zm0-1.617h.522V5.33h-.522zm-1.75 0-.477-.212q-.452 1.015-1.127 1.68l.366.372.367.373c.557-.549 1.005-1.225 1.349-2.002zm-1.238 1.84.41-.325-.57-.718-.41.325-.409.325.57.718zm-.57-.718.378.361c.828-.864 1.36-2.003 1.63-3.389l-.513-.1-.513-.1c-.242 1.239-.7 2.18-1.359 2.867zm1.495-3.128-.096.514.883.165.096-.514.096-.513-.883-.165zm.883.165-.512-.107c-.072.345-.15.665-.243.957l.499.157.498.157c.106-.336.193-.692.27-1.057zm-.256 1.007v.523h1.436V4.497h-1.436zm1.436 0h.522V3.666h-1.045v1.353zm0-1.353v.522h.866V3.143h-.866zm.866 0h-.522v1.353h1.045V3.666zm0 1.353v.523h2.617V4.497H15.55zm2.617 0h-.523v.834h1.045v-.834zm0 .834V5.33H15.55v1.045h2.617zm-2.617 0h-.522V7.47h1.045V5.853zm0 1.617v.523h2.46V6.948h-2.46zm2.46 0h-.523v.834h1.045V7.47zm0 .834V7.78h-2.46v1.045h2.46zm-2.46 0h-.522v1.799h1.045v-1.8zm0 1.799v.522h3.153V9.58H15.55zm3.153 0h-.523v.858h1.046v-.858zm0 .858v-.522h-7.345v1.045h7.345zm-7.345 0h.522v-.858h-1.045v.858zm0-.858v.522h3.326V9.58h-3.326zm3.326 0h.522v-1.8h-1.045v1.8zm0-1.8v-.522h-2.327v1.045h2.327zm-2.327 0h.522V7.47h-1.045v.834zm0-.833v.523h2.327V6.948h-2.327zm2.327 0h.522V5.853h-1.045V7.47zm0-1.617V5.33h-1.75v1.045h1.75zm10.68-2.328.314-.417-.354-.267-.322.306zm.948.859.374.365.345-.353-.333-.365zm-.38.387-.373-.365-.869.888h1.243zm.983 0h.522V4.25h-.522zm0 .818v.522h.522v-.522zm-2.427 0v-.523h-.56l.039.558zm.297 2.211.511-.11-.002-.01-.003-.01zm.091.339-.502.143.34 1.193.616-1.077zm.817-1.99.207-.479-.544-.235-.165.57zm.784.34.5.152.137-.447-.43-.186zM25.24 9.161l-.43-.295-.167.242.12.267zm.24.437.438-.285-.004-.004zm.825-.652.25-.459-.666-.36-.102.75zm.776.421.514.095.068-.373-.333-.18zM25 10.383l-.413.321.006.007.005.006zm-.33-.495.459-.25-.35-.642-.494.54zm-1.882 1.362-.431.294.245.36.397-.176zm-.495-.726-.213-.477-.57.255.351.516zm1.98-1.51.404.332.197-.239-.115-.288zm-.305-.941.505-.136v-.003zm-.363-2.484.522-.035-.033-.488h-.489zm-2.575 0v-.523h-.522v.523zm0 1.147h-.522v.522h.522zm2.022 0 .523.008.008-.53h-.53zm-.247 2.872.488.186.002-.005zm-.867.528v.523h.01zm-.668-.041-.495.166.107.32.336.034zm-.264-.784.039-.521-.786-.06.251.747zm.833.04v.523h.033zm.264-.255-.505-.132-.002.005zm.091-1.552.522.01.01-.532h-.532zm-1.164 0v-.522h-.508l-.014.508zm-1.015 3.698-.35.388.445.4.337-.494zm-.652-.586-.432-.294-.257.377.34.305zm.8-3.136.523.01v-.01zm0-2.748v-.523h-.522v.523zm3.401 0v.522h.546l-.024-.545zm-.017-1.197v-.523h-.522v.523zm.875 0h.523v-.523h-.523zm.025 1.196-.522.023.022.5h.5zm1.164 0v.523h1.167L26 4.424zm-.793-.726-.36-.378-.441.42.483.372zm.545-.52-.315.417c.347.262.637.53.879.794l.385-.352.386-.353a7.5 7.5 0 0 0-1.02-.923zm.95.859-.374-.366-.38.388.374.365.373.366.38-.388zm-.38.387v.523h.982V4.249h-.982zm.982 0h-.523v.818h1.045V4.77zm0 .818v-.523h-2.427v1.045h2.427zm-2.427 0-.521.035c.067.968.168 1.748.313 2.307l.505-.13.506-.131q-.182-.697-.281-2.117zm.297 2.211-.51.11c.029.138.07.27.099.372l.502-.143.503-.144c-.037-.129-.063-.211-.083-.304zm.091.339.454.259c.354-.62.641-1.328.865-2.103l-.502-.145-.502-.145a8.6 8.6 0 0 1-.768 1.874zm.817-1.99-.207.48.784.339.207-.48.207-.48-.784-.338zm.784.34-.5-.154c-.309 1.009-.701 1.85-1.169 2.532l.431.295.431.295c.54-.786.973-1.728 1.307-2.816zM25.24 9.161l-.476.214c.085.19.181.364.28.513l.436-.29.434-.29a2.5 2.5 0 0 1-.197-.361zm.24.437-.438.286c.124.19.25.359.377.485.063.064.139.13.227.181.085.051.213.107.37.107V9.613c.095 0 .154.034.163.04.012.007.005.005-.021-.022a2 2 0 0 1-.24-.317zm.536.537v.522a.56.56 0 0 0 .425-.197.8.8 0 0 0 .115-.183c.044-.094.076-.206.103-.315.055-.225.11-.544.164-.945l-.518-.07-.518-.07c-.053.39-.102.666-.143.837q-.016.061-.027.097l-.011.033q0-.002.01-.018a.48.48 0 0 1 .4-.213zm.289-1.189-.25.46.777.42.249-.459.249-.459-.776-.42zm.776.421-.514-.094c-.104.565-.223.94-.34 1.16-.124.234-.166.162-.079.162v1.044c.5 0 .817-.365 1.002-.716.193-.362.334-.862.445-1.46zm-.933 1.75v-.523c-.12 0-.366-.088-.745-.545l-.402.333-.402.334c.43.517.943.923 1.55.923zM25 10.383l.412-.32a3 3 0 0 1-.283-.425l-.46.25-.458.25c.117.214.25.404.377.566zm-.33-.495-.385-.353a5.1 5.1 0 0 1-1.708 1.237l.211.478.211.478a6.1 6.1 0 0 0 2.056-1.487zm-1.882 1.362.432-.294-.495-.727-.432.295-.432.294.495.726zm-.495-.726.213.477a5.9 5.9 0 0 0 2.17-1.655l-.402-.332-.403-.333a4.86 4.86 0 0 1-1.791 1.366zm1.98-1.51.486-.195a8 8 0 0 1-.286-.882l-.505.136-.504.135q.14.528.325 1zm-.305-.941.504-.139c-.168-.612-.28-1.406-.345-2.38l-.522.035-.521.034c.067 1.007.186 1.88.38 2.588zm-.363-2.484v-.523H21.03v1.045h2.575zm-2.575 0h-.522v1.147h1.045V5.589zm0 1.147v.522h2.022V6.213H21.03zm2.022 0-.522-.009a27 27 0 0 1-.079 1.833c-.041.478-.093.75-.136.867l.49.18.49.182c.097-.263.156-.66.197-1.14q.064-.743.083-1.905zm-.247 2.872-.489-.186c-.028.075-.062.108-.098.13a.6.6 0 0 1-.29.061l.01.523.01.522c.285-.005.567-.064.812-.213.253-.153.43-.38.533-.651zm-.867.528v-.523a6 6 0 0 1-.616-.038l-.052.52-.052.52c.253.025.496.043.72.043zm-.668-.041.495-.167-.264-.784-.495.167-.496.166.264.784zm-.264-.784-.04.52c.331.025.62.043.873.043V8.83c-.21 0-.465-.015-.794-.04zm.833.04.033.522a.78.78 0 0 0 .494-.212.9.9 0 0 0 .244-.438l-.507-.127-.507-.127c-.004.019 0-.019.049-.064a.3.3 0 0 1 .162-.075zm.264-.255.506.132c.04-.153.06-.382.074-.634q.022-.404.033-1.04l-.522-.01-.522-.01q-.013.628-.033 1.002a3 3 0 0 1-.041.428zm.091-1.552v-.522H21.03v1.045h1.164zm-1.164 0-.522-.014c-.04 1.47-.362 2.592-.925 3.418l.432.294.432.294c.709-1.04 1.063-2.377 1.106-3.977zm-1.015 3.698.35-.389-.652-.586-.35.389-.349.388.652.586zm-.652-.586.432.294c.59-.867.865-2.03.891-3.42l-.522-.01-.523-.01c-.023 1.283-.277 2.217-.71 2.852zm.8-3.136h.523V4.772h-1.045V7.52zm0-2.748v.522h3.401V4.249h-3.4zm3.401 0 .522-.023a28 28 0 0 1-.016-1.174h-1.045c0 .41 0 .826.017 1.22zm-.017-1.197v.522h.875V3.052h-.875zm.875 0H23.9c0 .428.008.831.025 1.22l.522-.024.522-.022c-.016-.372-.024-.76-.024-1.174zm.025 1.196v.523h1.164V4.249h-1.164zm1.164 0 .39-.348a6.4 6.4 0 0 0-.864-.792l-.319.414-.318.414a5.3 5.3 0 0 1 .72.66zm-.793-.726.361.378.545-.52-.36-.378-.362-.378-.544.52z&quot; mask=&quot;url(#ai-generate-label_svg__a)&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;#CCC&quot; d=&quot;M6.544 10.85H5.112L4.652 9h-1.99l-.653 1.85H.577l2.268-6.422H4.95zm2.28 0h-1.52l.337-6.422h1.52zM3.047 7.91h1.335L3.83 5.692z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;container-footer-TocUUl&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br class=&quot;container-Vdm5p7 wrapper-_7axQ_ undefined&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto;&quot;/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;div class=&quot;auto-hide-last-sibling-br paragraph-Oc488D paragraph-element br-paragraph-space&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; margin-bottom: 0px; margin-top: 0px; overflow-anchor: auto;&quot;&gt;&lt;span style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-weight: 600; line-height: 28px; overflow-anchor: auto; color: #000000 !important;&quot;&gt;设置退出标志（优雅停止所有组件）&lt;/span&gt;：&lt;/div&gt;&lt;div class=&quot;relative w-fit custom-code-block-canvas-wrapper w-full&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); position: relative; width: 760.2px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;code-block-element-Kq8H8v light custom-code-block-container--python hide-indicator disable-theme-style custom-code-block-container&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; flex-direction: column; position: relative; --code-area-radius: 6px; --code-area-radius-inner: calc(6px - 1px); --code-area-bg-color: #f9fafb; --code-header-bg-color: #f3f4f6; --code-mask-bg-color: linear-gradient(180deg,rgba(249,250,251,0),#f9fafb); --code-header-icon-color: rgba(0,0,0,.5); --code-header-text-color: rgba(0,0,0,.85); --code-header-icon-bg-color: rgba(0,0,0,.06); --code-block-code-color: #000000d9; --code-block-std-bg-color: #f3f4f6; --code-block-std-err-color: #d60000; margin-top: 8px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;code-area-z8IfZP code-area&quot; dir=&quot;ltr&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background: none 0% 0% / auto repeat scroll padding-box border-box rgb(249, 250, 251); border-radius: 6px; display: flex; flex-direction: column; height: fit-content; width: 760.2px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;header-wrapper-OsF77N&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; background-color: rgb(255, 255, 255); position: sticky; top: 0px;&quot;&gt;&lt;div class=&quot;header-A8bf6p&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(243, 244, 246); display: flex; flex-direction: row; flex-shrink: 0; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; height: 32px; justify-content: space-between; padding: 6px 9px 6px 6px; border-color: rgba(0, 0, 0, 0.08); border-style: solid; border-width: 0.8px 0.8px 0px; border-image: none 100% / 1 / 0 stretch; border-radius: 5px 5px 0px 0px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;title-QMwu7c clickable-p6chjr&quot; tabindex=&quot;0&quot; aria-describedby=&quot;t582d39&quot; data-popupid=&quot;t582d39&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; align-items: center; border-radius: 4px; color: rgba(0, 0, 0, 0.5); display: flex; flex-direction: row; gap: 3px; padding: 0px 4px 0px 10px; cursor: pointer;&quot;&gt;&lt;div class=&quot;text-fbmuIX&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; align-items: center; color: rgba(0, 0, 0, 0.85); display: flex; font-family: &amp;quot;PingFang SC&amp;quot;; font-size: 14px; gap: 3px; line-height: 22px; overflow: hidden; text-overflow: ellipsis; text-wrap-mode: nowrap;&quot;&gt;python&lt;/div&gt;&lt;div class=&quot;icon-jzrQql&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 15px;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-12&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M21.707 17.293a1 1 0 0 1-1.414 0L12 9l-8.293 8.293a1 1 0 0 1-1.414-1.414l8.293-8.293a2 2 0 0 1 2.828 0l8.293 8.293a1 1 0 0 1 0 1.414&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;action-D_0sSD&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; align-items: center; color: rgba(0, 0, 0, 0.5); cursor: pointer; display: flex; flex-direction: row; gap: 8px; justify-content: space-between;&quot;&gt;&lt;div class=&quot;hoverable-qHOoMX&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: fit-content; overflow-anchor: auto; padding-inline: 3px;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-14 mr-4&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 14px; margin-right: 4px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M12 23c6.075 0 11-4.925 11-11S18.075 1 12 1 1 5.925 1 12s4.925 11 11 11m0-20a9 9 0 1 1 0 18 9 9 0 0 1 0-18m-.909 4.667a1 1 0 0 0-1.591.806v7.054a1 1 0 0 0 1.591.806l4.81-3.527a1 1 0 0 0 0-1.612z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;运行&lt;/div&gt;&lt;div class=&quot;hoverable-qHOoMX&quot; data-testid=&quot;code-block-copy&quot; tabindex=&quot;0&quot; aria-describedby=&quot;svk3e20&quot; data-popupid=&quot;svk3e20&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 20px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-14&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 14px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M21 3.5V17a2 2 0 0 1-2 2h-2v-2h2V3.5H9v2h5.857c1.184 0 2.143.895 2.143 2v13c0 1.105-.96 2-2.143 2H5.143C3.959 22.5 3 21.605 3 20.5v-13c0-1.105.96-2 2.143-2H7v-2a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2m-6.143 4H5.143v13h9.714z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;hoverable-qHOoMX&quot; tabindex=&quot;0&quot; aria-describedby=&quot;dh9ihrc&quot; data-popupid=&quot;dh9ihrc&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 20px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-14&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 14px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M4 4a1 1 0 0 1 1 1v3a3 3 0 0 0 3 3h11.086l-5.293-5.293a1 1 0 0 1 1.414-1.414l7 7a1 1 0 0 1 0 1.414l-7 7a1 1 0 0 1-1.414-1.414L19.086 13H8a5 5 0 0 1-5-5V5a1 1 0 0 1 1-1&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;hoverable-qHOoMX&quot; tabindex=&quot;0&quot; aria-describedby=&quot;v1qdwbn&quot; data-popupid=&quot;v1qdwbn&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 20px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-14&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 14px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M4.797 16.856a8.28 8.28 0 0 0 6.27 2.87h.008A8.28 8.28 0 0 0 14.372 3.84a11.6 11.6 0 0 1-1.658 7.714 11.62 11.62 0 0 1-7.917 5.303M13.415 1.43a10.28 10.28 0 0 1-2.348 20.296 10.28 10.28 0 0 1-8.883-5.103c-.397-.74.155-1.605.912-1.609a9.617 9.617 0 0 0 9.011-12.258 1.093 1.093 0 0 1 1.308-1.326&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;hoverable-qHOoMX&quot; tabindex=&quot;0&quot; aria-describedby=&quot;0bpglqu&quot; data-popupid=&quot;0bpglqu&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; height: 20px; justify-content: center; position: relative; width: 20px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-14&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 14px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M22 3v7a1 1 0 1 1-2 0V4h-6a1 1 0 1 1 0-2h7a1 1 0 0 1 1 1M11.005 21a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1v-7a1 1 0 0 1 2.002 0v6h6.003a1 1 0 0 1 1 1&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;content-qydEZG light-scrollbar-Lun507&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; flex-shrink: 0; height: fit-content; overflow: overlay; padding: 12px 16px 16px; overflow-anchor: auto; border-color: rgba(0, 0, 0, 0.08); border-radius: 0px 0px 5px 5px; border-style: solid; border-width: 0px 1px 1px;&quot;&gt;&lt;pre class=&quot;container-GJFPCm language-python&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; overflow-wrap: normal; --code-text_v3: #000000d9; --code-doc_v3: #00000073; --code-Link_v3: #2f74ff; --code-number_v3: #e54595; --code-keycontrol_v3: #9952e1; --code-function_v3: #ff5d4d; --code-variable_v3: #000000d9; --code-parameter_v3: #4da621; --code-attributes_v3: #c70; --code-selection-bg-color: #ebf1ff; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); color: rgb(0, 0, 0); word-break: normal; word-spacing: normal; hyphens: none; line-height: 1.5; tab-size: 4; margin-top: 0px; margin-bottom: 0px; overflow: auto; font-size: 13.6px; border-radius: 6px; padding: 0px; overflow-anchor: auto; width: fit-content;&quot;&gt;#&amp;nbsp;在交互式Python环境中执行import&amp;nbsp;redis
r&amp;nbsp;=&amp;nbsp;redis.Redis()r.set(&amp;#39;download_exit_flag&amp;#39;,&amp;nbsp;&amp;#39;1&amp;#39;)&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;mask-wrapper-ARWxJv&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; opacity: 0; transition: opacity 0.15s;&quot;&gt;&lt;div class=&quot;mask-hxdXYU&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background: linear-gradient(rgba(249, 250, 251, 0), rgb(249, 250, 251)) 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); bottom: 0px; height: 56px; pointer-events: none; position: absolute; width: 760.2px; overflow-anchor: auto;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;canvas_wrapper-y3Fcgx exited-O8qSm4&quot; data-testid=&quot;canvas-wrapper&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); visibility: hidden; z-index: 10; border-radius: 12px; height: 145px; left: 0px; opacity: 0; pointer-events: none; position: absolute; top: 0px; width: 760px; --canvas-radius-size: 12px; overflow-anchor: auto; --offset-width: 760px; --offset-height: 145px;&quot;&gt;&lt;div data-testid=&quot;canvas_panel_container&quot; data-visible=&quot;false&quot; class=&quot;container-outer-wapATW&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; flex-direction: column; height: 145px; width: 760px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;container-V37bUX&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background-image: none; background-position: 0% 0%; background-size: auto; background-repeat: repeat; background-attachment: scroll; background-origin: padding-box; background-clip: border-box; border-radius: 12px; box-shadow: rgba(42, 60, 79, 0.1) 0px 6px 10px 0px; display: flex; flex-direction: column; height: 145px; position: relative; transition: border-radius 0.4s ease-in-out; flex: 1 1 0%; min-height: 0px; width: 760px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;container-inner-CLMuXa canvas_wrapper_inner-liGdwM&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex: 1 1 0%; min-height: 0px; width: 760px; border-radius: 12px; overflow: hidden; transition: border-radius 0.4s ease-in-out; overflow-anchor: auto;&quot;&gt;&lt;div style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; width: 760px; height: 145px;&quot;&gt;&lt;div class=&quot;code-canvas code-canvas-theme semi-always-light container-uANf2o&quot; data-theme=&quot;light&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); height: 145px; width: 760px; --canvas-header-height: 56px; --code-editor-header-width: 56px; --code-editor-file-tree-width: 212px; --semi-amber-0: 254,251,235; --semi-amber-1: 252,245,206; --semi-amber-2: 249,232,158; --semi-amber-3: 246,216,111; --semi-amber-4: 243,198,65; --semi-amber-5: 240,177,20; --semi-amber-6: 200,138,15; --semi-amber-7: 160,102,10; --semi-amber-8: 120,70,6; --semi-amber-9: 80,43,3; --semi-black: 0,0,0; --semi-blue-0: 234,245,255; --semi-blue-1: 203,231,254; --semi-blue-2: 152,205,253; --semi-blue-3: 101,178,252; --semi-blue-4: 50,149,251; --semi-blue-5: 0,100,250; --semi-blue-6: 0,98,214; --semi-blue-7: 0,79,179; --semi-blue-8: 0,61,143; --semi-blue-9: 0,44,107; --semi-cyan-0: 229,247,248; --semi-cyan-1: 194,239,240; --semi-cyan-2: 138,221,226; --semi-cyan-3: 88,203,211; --semi-cyan-4: 44,184,197; --semi-cyan-5: 5,164,182; --semi-cyan-6: 3,134,152; --semi-cyan-7: 1,105,121; --semi-cyan-8: 0,77,91; --semi-cyan-9: 0,50,61; --semi-green-0: 236,247,236; --semi-green-1: 208,240,209; --semi-green-2: 164,224,167; --semi-green-3: 125,209,130; --semi-green-4: 90,194,98; --semi-green-5: 59,179,70; --semi-green-6: 48,149,59; --semi-green-7: 37,119,47; --semi-green-8: 27,89,36; --semi-green-9: 17,60,24; --semi-grey-0: 249,249,249; --semi-grey-1: 230,232,234; --semi-grey-2: 198,202,205; --semi-grey-3: 167,171,176; --semi-grey-4: 136,141,146; --semi-grey-5: 107,112,117; --semi-grey-6: 85,91,97; --semi-grey-7: 65,70,76; --semi-grey-8: 46,50,56; --semi-grey-9: 28,31,35; --semi-indigo-0: 236,239,248; --semi-indigo-1: 209,216,240; --semi-indigo-2: 167,179,225; --semi-indigo-3: 128,144,211; --semi-indigo-4: 94,111,196; --semi-indigo-5: 63,81,181; --semi-indigo-6: 51,66,161; --semi-indigo-7: 40,52,140; --semi-indigo-8: 31,40,120; --semi-indigo-9: 23,29,99; --semi-light-blue-0: 233,247,253; --semi-light-blue-1: 201,236,252; --semi-light-blue-2: 149,216,248; --semi-light-blue-3: 98,195,245; --semi-light-blue-4: 48,172,241; --semi-light-blue-5: 0,149,238; --semi-light-blue-6: 0,123,202; --semi-light-blue-7: 0,99,167; --semi-light-blue-8: 0,75,131; --semi-light-blue-9: 0,53,95; --semi-light-green-0: 243,248,236; --semi-light-green-1: 227,240,208; --semi-light-green-2: 200,226,165; --semi-light-green-3: 173,211,126; --semi-light-green-4: 147,197,91; --semi-light-green-5: 123,182,60; --semi-light-green-6: 100,152,48; --semi-light-green-7: 78,121,38; --semi-light-green-8: 57,91,27; --semi-light-green-9: 37,61,18; --semi-lime-0: 242,250,230; --semi-lime-1: 227,246,197; --semi-lime-2: 203,237,142; --semi-lime-3: 183,227,91; --semi-lime-4: 167,218,44; --semi-lime-5: 155,209,0; --semi-lime-6: 126,174,0; --semi-lime-7: 99,139,0; --semi-lime-8: 72,104,0; --semi-lime-9: 47,70,0; --semi-orange-0: 255,248,234; --semi-orange-1: 254,238,204; --semi-orange-2: 254,217,152; --semi-orange-3: 253,193,101; --semi-orange-4: 253,166,51; --semi-orange-5: 252,136,0; --semi-orange-6: 210,103,0; --semi-orange-7: 168,74,0; --semi-orange-8: 126,49,0; --semi-orange-9: 84,29,0; --semi-pink-0: 253,236,239; --semi-pink-1: 251,207,216; --semi-pink-2: 246,160,181; --semi-pink-3: 242,115,150; --semi-pink-4: 237,72,123; --semi-pink-5: 233,30,99; --semi-pink-6: 197,19,86; --semi-pink-7: 162,11,72; --semi-pink-8: 126,5,58; --semi-pink-9: 90,1,43; --semi-purple-0: 247,233,247; --semi-purple-1: 239,202,240; --semi-purple-2: 221,155,224; --semi-purple-3: 201,111,209; --semi-purple-4: 180,73,194; --semi-purple-5: 158,40,179; --semi-purple-6: 135,30,158; --semi-purple-7: 113,22,138; --semi-purple-8: 92,15,117; --semi-purple-9: 73,10,97; --semi-red-0: 254,242,237; --semi-red-1: 254,221,210; --semi-red-2: 253,183,165; --semi-red-3: 251,144,120; --semi-red-4: 250,102,76; --semi-red-5: 249,57,32; --semi-red-6: 213,37,21; --semi-red-7: 178,20,12; --semi-red-8: 142,8,5; --semi-red-9: 106,1,3; --semi-teal-0: 228,247,244; --semi-teal-1: 192,240,232; --semi-teal-2: 135,224,211; --semi-teal-3: 84,209,193; --semi-teal-4: 39,194,176; --semi-teal-5: 0,179,161; --semi-teal-6: 0,149,137; --semi-teal-7: 0,119,111; --semi-teal-8: 0,89,85; --semi-teal-9: 0,60,58; --semi-violet-0: 243,237,249; --semi-violet-1: 226,209,244; --semi-violet-2: 196,167,233; --semi-violet-3: 166,127,221; --semi-violet-4: 136,91,210; --semi-violet-5: 106,58,199; --semi-violet-6: 87,47,179; --semi-violet-7: 70,37,158; --semi-violet-8: 54,28,138; --semi-violet-9: 40,20,117; --semi-white: 255,255,255; --semi-yellow-0: 255,253,234; --semi-yellow-1: 254,251,203; --semi-yellow-2: 253,243,152; --semi-yellow-3: 252,232,101; --semi-yellow-4: 251,218,50; --semi-yellow-5: 250,200,0; --semi-yellow-6: 208,170,0; --semi-yellow-7: 167,139,0; --semi-yellow-8: 125,106,0; --semi-yellow-9: 83,72,0; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;canvas-header-_ng4RX&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; background-color: rgba(0, 0, 0, 0); border-bottom: 0.8px solid rgba(0, 0, 0, 0.08); display: grid; gap: 4px; grid-template-columns: minmax(min-content, 1fr) auto minmax(min-content, 1fr); height: 56px; overflow: hidden; padding: 0px 16px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;canvas-header-left-V6XIuw&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; gap: 4px; overflow: hidden; overflow-anchor: auto;&quot;&gt;&lt;div style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;flex items-center gap-4&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; align-items: center; gap: 4px; overflow-anchor: auto;&quot;&gt;&lt;span class=&quot;inline-flex items-center mr-4 h-20&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; margin-right: 4px; display: inline-flex; height: 20px; align-items: center; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;s-font-small-strong&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-size-adjust: none; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-variant-position: normal; font-variant-emoji: normal; font-stretch: normal; font-size: 14px; line-height: 22px; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;canvas-header-middle-U6siD5&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; gap: 4px; overflow: hidden; grid-column: 2; overflow-anchor: auto;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;canvas-header-right-y8Tw7L&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; display: flex; gap: 4px; overflow: hidden; justify-content: flex-end; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;btn-run-wrapper-em3AwX&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin-right: 10px; position: relative; overflow-anchor: auto;&quot;&gt;&lt;button class=&quot;semi-button semi-button-primary samantha-button-vtPGz2 tertiary-Y7s8iW medium-DBTMZB icon-D5yFjW btn-run-EG3FyY semi-button-with-icon&quot; type=&quot;button&quot; aria-disabled=&quot;false&quot; style=&quot;-webkit-font-smoothing: antialiased; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; border-width: 0.8px; border-style: solid; border-color: rgba(0, 0, 0, 0.08); border-image: none 100% / 1 / 0 stretch; border-radius: 10px; box-shadow: none; cursor: pointer; display: inline-flex; font: 500 14px / 22px Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; height: 36px; justify-content: center; outline: none; padding: 10px 12px; user-select: none; vertical-align: middle; text-wrap-mode: nowrap; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); color: rgba(0, 0, 0, 0.85); transform: none; transition: background-color ease-in, border ease-in; min-width: 73px; appearance: button; overflow-anchor: auto;&quot;&gt;&lt;span class=&quot;semi-button-content&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; overflow: hidden; text-overflow: ellipsis; align-items: center; display: flex; justify-content: center; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-rendering: optimizelegibility; fill: currentcolor; font-size: 16px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M12 23c6.075 0 11-4.925 11-11S18.075 1 12 1 1 5.925 1 12s4.925 11 11 11m-.909-15.333a1 1 0 0 0-1.591.806v7.054a1 1 0 0 0 1.591.806l4.81-3.527a1 1 0 0 0 0-1.612z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;semi-button-content-right&quot; x-semi-prop=&quot;children&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; margin-left: 4px; overflow: hidden; text-overflow: ellipsis; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;div class=&quot;header-btn-nkmwlw&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; border-radius: 8px; cursor: pointer; display: inline-flex; gap: 3px; height: 32px; justify-content: center; padding: 4px; width: 69px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-18&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 18px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M21 3.5V17a2 2 0 0 1-2 2h-2v-2h2V3.5H9v2h5.857c1.184 0 2.143.895 2.143 2v13c0 1.105-.96 2-2.143 2H5.143C3.959 22.5 3 21.605 3 20.5v-13c0-1.105.96-2 2.143-2H7v-2a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2m-6.143 4H5.143v13h9.714z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;btn-text-aRIgRD&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; text-align: center; font-family: &amp;quot;PingFang SC&amp;quot;; font-size: 14px; line-height: 22px; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;header-btn-nkmwlw&quot; aria-haspopup=&quot;true&quot; tabindex=&quot;0&quot; aria-describedby=&quot;algym19&quot; data-popupid=&quot;algym19&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; border-radius: 8px; cursor: pointer; display: inline-flex; gap: 3px; height: 32px; justify-content: center; padding: 4px; width: 69px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-18&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 18px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M20.207 12.207a1 1 0 0 0-1.414-1.414L13 16.586V2a1 1 0 1 0-2 0v14.586l-5.793-5.793a1 1 0 0 0-1.414 1.414l7.5 7.5c.195.195.45.293.706.293H5a1 1 0 1 0 0 2h14a1 1 0 1 0 0-2h-6.999a1 1 0 0 0 .706-.293z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;btn-text-aRIgRD&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; text-align: center; font-family: &amp;quot;PingFang SC&amp;quot;; font-size: 14px; line-height: 22px; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;more-btn-qQsdj1&quot; aria-haspopup=&quot;true&quot; tabindex=&quot;0&quot; aria-describedby=&quot;1vio5c4&quot; data-popupid=&quot;1vio5c4&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; aspect-ratio: 1 / 1; border-radius: 4px; cursor: pointer; display: flex; flex-shrink: 0; height: 32px; justify-content: center; padding: 7px; width: 32px; overflow-anchor: auto;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default text-18&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-align: center; text-rendering: optimizelegibility; fill: currentcolor; font-size: 18px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M5.5 11.75a1.75 1.75 0 1 1-3.5 0 1.75 1.75 0 0 1 3.5 0M13.725 11.75a1.75 1.75 0 1 1-3.5 0 1.75 1.75 0 0 1 3.5 0M22 11.75a1.75 1.75 0 1 1-3.5 0 1.75 1.75 0 0 1 3.5 0&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;divider-ExjbWf&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; background-color: rgba(0, 0, 0, 0.08); height: 16px; margin: 0px 4px; width: 1px; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;button tabindex=&quot;0&quot; class=&quot;semi-button semi-button-primary samantha-button-vtPGz2 quartary-w95bZm medium-DBTMZB icon-D5yFjW icon-only-g_8LKZ tooltip-button-oVRj8d tooltip-button-size-medium-v4uviy semi-button-with-icon semi-button-with-icon-only&quot; type=&quot;button&quot; aria-disabled=&quot;false&quot; aria-describedby=&quot;b5lb6dr&quot; data-popupid=&quot;b5lb6dr&quot; style=&quot;-webkit-font-smoothing: antialiased; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); align-items: center; border-width: 0px; border-style: solid; border-color: transparent; border-radius: 10px; box-shadow: none; cursor: pointer; display: inline-flex; font: 500 14px / 22px Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; height: 32px; justify-content: center; outline: none; padding: 4px; user-select: none; vertical-align: middle; text-wrap-mode: nowrap; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; color: rgba(0, 0, 0, 0.85); transform: none; transition: background-color ease-in, border ease-in; appearance: button; overflow-anchor: auto;&quot;&gt;&lt;span class=&quot;semi-button-content&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; overflow: hidden; text-overflow: ellipsis; align-items: center; display: flex; justify-content: center; overflow-anchor: auto; padding: 3px;&quot;&gt;&lt;span role=&quot;img&quot; class=&quot;semi-icon semi-icon-default&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; display: inline-block; line-height: 0; text-rendering: optimizelegibility; fill: currentcolor; font-size: 18px; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; fill=&quot;none&quot; viewbox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M20.307 20.307a.997.997 0 0 0 .003-1.412l-6.845-6.844 6.845-6.845a.997.997 0 0 0-.003-1.412.997.997 0 0 0-1.412-.002l-6.844 6.844-6.845-6.845a.997.997 0 0 0-1.412.003.997.997 0 0 0-.002 1.412l6.844 6.844-6.845 6.845a.997.997 0 0 0 .003 1.412.997.997 0 0 0 1.412.003l6.844-6.845 6.845 6.845a.997.997 0 0 0 1.412-.003&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code-canvas-body&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); height: calc(100% - 56px); overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;content-s0HetY flow-ext-disable-select-bar&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; width: 760px; height: 89px;&quot;&gt;&lt;div class=&quot;resizable-wrapper-EaKdb0 direction-column-F5pTZk&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; height: 89px; width: 760px; flex-direction: column; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;resizable-wrapper-EaKdb0 direction-row-lcyVSf&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); display: flex; height: 89px; width: 760px; flex-direction: row; overflow-anchor: auto; min-height: 0px;&quot;&gt;&lt;div class=&quot;canvas-body-content-yXFryQ&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); height: 89px; position: relative; width: 760px; overflow-anchor: auto; min-width: 0px;&quot;&gt;&lt;div class=&quot;editor-fOI6Y_&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; display: flow-root; flex: 1 1 0%; height: 89px; width: 760px;&quot;&gt;&lt;div class=&quot;editorContent-FfnwE_&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto; height: calc(100% - 12px); margin-top: 12px; overflow-x: auto; position: relative; width: 760px;&quot;&gt;&lt;div class=&quot;cm-theme&quot; data-language-input=&quot;python&quot; data-language=&quot;python&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); --code-text: #000000d9; --code-doc: #00000073; --code-link: #2f74ff; --code-number: #e54595; --code-key-control: #9952e1; --code-function: #ff5d4d; --code-variable: #000000d9; --code-parameter: #4da621; --code-attributes: #c70; overflow-anchor: auto; height: 77px; width: 760px;&quot;&gt;&lt;div class=&quot;cm-editor ͼ1 ͼ2 ͼ4 ͼ1i2 ͼ16 ͼ2q&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-direction: column; font-size: 13px; font-feature-settings: &amp;quot;liga&amp;quot; 0, &amp;quot;calt&amp;quot; 0; color: rgb(0, 0, 0); height: 77px; overflow-anchor: auto; position: relative !important; display: flex !important;&quot;&gt;&lt;div class=&quot;cm-announced&quot; aria-live=&quot;polite&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); position: fixed; top: -10000px; overflow-anchor: auto;&quot;&gt;&lt;/div&gt;&lt;div tabindex=&quot;-1&quot; class=&quot;cm-scroller&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; line-height: 1.4; height: 77px; overflow: scroll; position: relative; z-index: 0; overflow-anchor: auto; display: flex !important; align-items: flex-start !important; --scrollbar-color: transparent; --scrollbar-width: 7px;&quot;&gt;&lt;div class=&quot;cm-gutters&quot; aria-hidden=&quot;true&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-shrink: 0; display: flex; height: 167px; inset-inline-start: 0px; z-index: 200; color: rgba(0, 0, 0, 0.3); border-width: initial; border-style: none; border-right-color: transparent; border-top-color: initial; border-bottom-color: initial; border-left-color: initial; border-image: initial; overflow-anchor: auto; min-height: 167px; position: sticky;&quot;&gt;&lt;div class=&quot;cm-gutter cm-lineNumbers&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-direction: column; flex-shrink: 0; min-height: 100%; overflow: hidden; display: flex !important; min-width: 6ch; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;cm-gutterElement&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px 3px 0px 5px; min-width: 20px; text-align: right; text-wrap-mode: nowrap; overflow-anchor: auto; height: 0px; visibility: hidden; pointer-events: none;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutterElement cm-activeLineGutter&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background: unset; padding: 0px 3px 0px 5px; min-width: 20px; text-align: right; text-wrap-mode: nowrap; overflow-anchor: auto; height: 18.2px; margin-top: 4px;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutterElement&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px 3px 0px 5px; min-width: 20px; text-align: right; text-wrap-mode: nowrap; overflow-anchor: auto; height: 18.2px;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutterElement&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px 3px 0px 5px; min-width: 20px; text-align: right; text-wrap-mode: nowrap; overflow-anchor: auto; height: 18.2px;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutterElement&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px 3px 0px 5px; min-width: 20px; text-align: right; text-wrap-mode: nowrap; overflow-anchor: auto; height: 18.2px;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutterElement&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px 3px 0px 5px; min-width: 20px; text-align: right; text-wrap-mode: nowrap; overflow-anchor: auto; height: 18.2px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutter cm-foldGutter&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-direction: column; flex-shrink: 0; min-height: 100%; overflow: hidden; display: flex !important; padding: 0px 6px 0px 2px; overflow-anchor: auto;&quot;&gt;&lt;div class=&quot;cm-gutterElement&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); color: rgb(115, 119, 128); overflow-anchor: auto; height: 0px; visibility: hidden; pointer-events: none;&quot;&gt;&lt;span class=&quot;unfold-button&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; padding: 0px 1px; cursor: pointer; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutterElement cm-activeLineGutter&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); background: unset; color: rgb(115, 119, 128); overflow-anchor: auto; height: 18.2px; margin-top: 4px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div spellcheck=&quot;false&quot; autocorrect=&quot;off&quot; autocapitalize=&quot;off&quot; writingsuggestions=&quot;false&quot; translate=&quot;no&quot; contenteditable=&quot;false&quot; class=&quot;cm-content&quot; role=&quot;textbox&quot; aria-multiline=&quot;true&quot; aria-readonly=&quot;true&quot; data-language=&quot;python&quot; aria-autocomplete=&quot;list&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); margin: 0px; flex-grow: 2; flex-shrink: 0; white-space: pre; overflow-wrap: normal; min-height: 100%; padding: 4px 0px 72px; outline: none; overflow-anchor: auto; tab-size: 4; caret-color: transparent !important;&quot;&gt;&lt;div class=&quot;cm-activeLine cm-line&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px 4px 0px 1px; background: unset; overflow-anchor: auto; caret-color: transparent !important;&quot;&gt;&lt;span class=&quot;ͼ18&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; color: rgba(0, 0, 0, 0.45); overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;cm-line&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px 4px 0px 1px; overflow-anchor: auto; caret-color: transparent !important;&quot;&gt;&lt;span class=&quot;ͼ1c&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; color: #9952E1; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ͼ1g&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; color: rgba(0, 0, 0, 0.85); overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;cm-line&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px 4px 0px 1px; overflow-anchor: auto; caret-color: transparent !important;&quot;&gt;&lt;span class=&quot;ͼ1g&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; color: rgba(0, 0, 0, 0.85); overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ͼ1g&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; color: rgba(0, 0, 0, 0.85); overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ͼ1w&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; color: #FF5D4D; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;cm-line&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px 4px 0px 1px; overflow-anchor: auto; caret-color: transparent !important;&quot;&gt;&lt;span class=&quot;ͼ1g&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; color: rgba(0, 0, 0, 0.85); overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ͼ1w&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; color: #FF5D4D; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ͼ1l&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; color: #4DA621; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;ͼ1l&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; color: #4DA621; overflow-anchor: auto;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;cm-gutters-opposite&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); flex-shrink: 0; position: sticky; right: 0px; height: 70.6px; overflow-anchor: auto; width: 5px; min-height: 70px;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;cm-layer cm-layer-above cm-cursorLayer&quot; aria-hidden=&quot;true&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); position: absolute; left: 0px; top: 0px; contain: size style; pointer-events: none; overflow-anchor: auto; z-index: 150; animation-duration: 1200ms;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;cm-layer cm-selectionLayer&quot; aria-hidden=&quot;true&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); position: absolute; left: 0px; top: 0px; contain: size style; overflow-anchor: auto; z-index: -2;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ai-generate-label-wrapper-ef3noE&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); border: 0.6px solid rgba(204, 204, 204, 0.5); border-radius: 4px; display: flex; height: 15px; justify-content: center; line-height: 15px; position: absolute; right: 11px; top: 0px; width: 36px; overflow-anchor: auto;&quot;&gt;&lt;span class=&quot;ai-generate-label-qrEHJU&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: ; color: #CCCCCC; font-size: 8.25px; font-weight: 600; overflow-anchor: auto;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;28&quot; height=&quot;16&quot; fill=&quot;none&quot; viewbox=&quot;0 0 28 16&quot;&gt;&lt;mask id=&quot;ai-generate-label_svg__a&quot; fill=&quot;#fff&quot;&gt;&lt;path d=&quot;M12.934 5.853c-.322.726-.734 1.345-1.238 1.84l-.57-.718c.744-.776 1.239-1.816 1.495-3.128l.883.165a11 11 0 0 1-.256 1.007h1.436V3.666h.866v1.353h2.617v.834H15.55V7.47h2.46v.834h-2.46v1.799h3.153v.858h-7.345v-.858h3.326v-1.8h-2.327V7.47h2.327V5.853zm12.43-2.328c.37.28.684.57.948.859l-.38.387h.983v.818h-2.427c.066.957.165 1.7.297 2.211.025.116.058.223.091.339.33-.578.603-1.246.817-1.99l.784.34q-.483 1.571-1.238 2.673c.075.165.157.314.24.437.23.355.412.537.536.537q.126 0 .289-1.189l.776.421c-.215 1.164-.52 1.75-.933 1.75-.363 0-.743-.248-1.147-.735a4 4 0 0 1-.33-.495 5.6 5.6 0 0 1-1.882 1.362l-.495-.726a5.4 5.4 0 0 0 1.98-1.51 8 8 0 0 1-.305-.941c-.181-.66-.297-1.494-.363-2.484H21.03v1.147h2.022q-.037 2.302-.247 2.872-.198.517-.867.528a7 7 0 0 1-.668-.041l-.264-.784c.33.024.602.04.833.04.132-.007.223-.09.264-.255.05-.19.074-.71.091-1.552H21.03c-.04 1.536-.38 2.765-1.015 3.698l-.652-.586c.512-.751.776-1.8.8-3.136V4.772h3.401c-.017-.38-.017-.785-.017-1.197h.875q0 .629.025 1.196h1.164a6 6 0 0 0-.793-.726z&quot;&gt;&lt;/path&gt;&lt;/mask&gt;&lt;path fill=&quot;#CCC&quot; d=&quot;M12.934 5.853c-.322.726-.734 1.345-1.238 1.84l-.57-.718c.744-.776 1.239-1.816 1.495-3.128l.883.165a11 11 0 0 1-.256 1.007h1.436V3.666h.866v1.353h2.617v.834H15.55V7.47h2.46v.834h-2.46v1.799h3.153v.858h-7.345v-.858h3.326v-1.8h-2.327V7.47h2.327V5.853zm12.43-2.328c.37.28.684.57.948.859l-.38.387h.983v.818h-2.427c.066.957.165 1.7.297 2.211.025.116.058.223.091.339.33-.578.603-1.246.817-1.99l.784.34q-.483 1.571-1.238 2.673c.075.165.157.314.24.437.23.355.412.537.536.537q.126 0 .289-1.189l.776.421c-.215 1.164-.52 1.75-.933 1.75-.363 0-.743-.248-1.147-.735a4 4 0 0 1-.33-.495 5.6 5.6 0 0 1-1.882 1.362l-.495-.726a5.4 5.4 0 0 0 1.98-1.51 8 8 0 0 1-.305-.941c-.181-.66-.297-1.494-.363-2.484H21.03v1.147h2.022q-.037 2.302-.247 2.872-.198.517-.867.528a7 7 0 0 1-.668-.041l-.264-.784c.33.024.602.04.833.04.132-.007.223-.09.264-.255.05-.19.074-.71.091-1.552H21.03c-.04 1.536-.38 2.765-1.015 3.698l-.652-.586c.512-.751.776-1.8.8-3.136V4.772h3.401c-.017-.38-.017-.785-.017-1.197h.875q0 .629.025 1.196h1.164a6 6 0 0 0-.793-.726z&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;#CCC&quot; d=&quot;M12.934 5.853V5.33h-.34l-.137.31zm-1.238 1.84-.41.325.362.455.415-.407zm-.57-.718-.377-.361-.315.329.283.357zm1.495-3.128.096-.513-.51-.096-.1.51zm.883.165.511.107.11-.522-.525-.098zm-.256 1.007-.498-.157-.215.68h.713zm1.436 0v.523h.522v-.523zm0-1.353v-.523h-.523v.523zm.866 0h.523v-.523h-.523zm0 1.353h-.522v.523h.522zm2.617 0h.522v-.522h-.522zm0 .834v.522h.522v-.522zm-2.617 0V5.33h-.522v.523zm0 1.617h-.522v.523h.522zm2.46 0h.522v-.522h-.522zm0 .834v.522h.522v-.522zm-2.46 0V7.78h-.522v.523zm0 1.799h-.522v.522h.522zm3.153 0h.523V9.58h-.523zm0 .858v.523h.523v-.523zm-7.345 0h-.523v.523h.523zm0-.858V9.58h-.523v.523zm3.326 0v.522h.522v-.522zm0-1.8h.522v-.522h-.522zm-2.327 0h-.523v.523h.523zm0-.833v-.522h-.523v.522zm2.327 0v.523h.522V7.47zm0-1.617h.522V5.33h-.522zm-1.75 0-.477-.212q-.452 1.015-1.127 1.68l.366.372.367.373c.557-.549 1.005-1.225 1.349-2.002zm-1.238 1.84.41-.325-.57-.718-.41.325-.409.325.57.718zm-.57-.718.378.361c.828-.864 1.36-2.003 1.63-3.389l-.513-.1-.513-.1c-.242 1.239-.7 2.18-1.359 2.867zm1.495-3.128-.096.514.883.165.096-.514.096-.513-.883-.165zm.883.165-.512-.107c-.072.345-.15.665-.243.957l.499.157.498.157c.106-.336.193-.692.27-1.057zm-.256 1.007v.523h1.436V4.497h-1.436zm1.436 0h.522V3.666h-1.045v1.353zm0-1.353v.522h.866V3.143h-.866zm.866 0h-.522v1.353h1.045V3.666zm0 1.353v.523h2.617V4.497H15.55zm2.617 0h-.523v.834h1.045v-.834zm0 .834V5.33H15.55v1.045h2.617zm-2.617 0h-.522V7.47h1.045V5.853zm0 1.617v.523h2.46V6.948h-2.46zm2.46 0h-.523v.834h1.045V7.47zm0 .834V7.78h-2.46v1.045h2.46zm-2.46 0h-.522v1.799h1.045v-1.8zm0 1.799v.522h3.153V9.58H15.55zm3.153 0h-.523v.858h1.046v-.858zm0 .858v-.522h-7.345v1.045h7.345zm-7.345 0h.522v-.858h-1.045v.858zm0-.858v.522h3.326V9.58h-3.326zm3.326 0h.522v-1.8h-1.045v1.8zm0-1.8v-.522h-2.327v1.045h2.327zm-2.327 0h.522V7.47h-1.045v.834zm0-.833v.523h2.327V6.948h-2.327zm2.327 0h.522V5.853h-1.045V7.47zm0-1.617V5.33h-1.75v1.045h1.75zm10.68-2.328.314-.417-.354-.267-.322.306zm.948.859.374.365.345-.353-.333-.365zm-.38.387-.373-.365-.869.888h1.243zm.983 0h.522V4.25h-.522zm0 .818v.522h.522v-.522zm-2.427 0v-.523h-.56l.039.558zm.297 2.211.511-.11-.002-.01-.003-.01zm.091.339-.502.143.34 1.193.616-1.077zm.817-1.99.207-.479-.544-.235-.165.57zm.784.34.5.152.137-.447-.43-.186zM25.24 9.161l-.43-.295-.167.242.12.267zm.24.437.438-.285-.004-.004zm.825-.652.25-.459-.666-.36-.102.75zm.776.421.514.095.068-.373-.333-.18zM25 10.383l-.413.321.006.007.005.006zm-.33-.495.459-.25-.35-.642-.494.54zm-1.882 1.362-.431.294.245.36.397-.176zm-.495-.726-.213-.477-.57.255.351.516zm1.98-1.51.404.332.197-.239-.115-.288zm-.305-.941.505-.136v-.003zm-.363-2.484.522-.035-.033-.488h-.489zm-2.575 0v-.523h-.522v.523zm0 1.147h-.522v.522h.522zm2.022 0 .523.008.008-.53h-.53zm-.247 2.872.488.186.002-.005zm-.867.528v.523h.01zm-.668-.041-.495.166.107.32.336.034zm-.264-.784.039-.521-.786-.06.251.747zm.833.04v.523h.033zm.264-.255-.505-.132-.002.005zm.091-1.552.522.01.01-.532h-.532zm-1.164 0v-.522h-.508l-.014.508zm-1.015 3.698-.35.388.445.4.337-.494zm-.652-.586-.432-.294-.257.377.34.305zm.8-3.136.523.01v-.01zm0-2.748v-.523h-.522v.523zm3.401 0v.522h.546l-.024-.545zm-.017-1.197v-.523h-.522v.523zm.875 0h.523v-.523h-.523zm.025 1.196-.522.023.022.5h.5zm1.164 0v.523h1.167L26 4.424zm-.793-.726-.36-.378-.441.42.483.372zm.545-.52-.315.417c.347.262.637.53.879.794l.385-.352.386-.353a7.5 7.5 0 0 0-1.02-.923zm.95.859-.374-.366-.38.388.374.365.373.366.38-.388zm-.38.387v.523h.982V4.249h-.982zm.982 0h-.523v.818h1.045V4.77zm0 .818v-.523h-2.427v1.045h2.427zm-2.427 0-.521.035c.067.968.168 1.748.313 2.307l.505-.13.506-.131q-.182-.697-.281-2.117zm.297 2.211-.51.11c.029.138.07.27.099.372l.502-.143.503-.144c-.037-.129-.063-.211-.083-.304zm.091.339.454.259c.354-.62.641-1.328.865-2.103l-.502-.145-.502-.145a8.6 8.6 0 0 1-.768 1.874zm.817-1.99-.207.48.784.339.207-.48.207-.48-.784-.338zm.784.34-.5-.154c-.309 1.009-.701 1.85-1.169 2.532l.431.295.431.295c.54-.786.973-1.728 1.307-2.816zM25.24 9.161l-.476.214c.085.19.181.364.28.513l.436-.29.434-.29a2.5 2.5 0 0 1-.197-.361zm.24.437-.438.286c.124.19.25.359.377.485.063.064.139.13.227.181.085.051.213.107.37.107V9.613c.095 0 .154.034.163.04.012.007.005.005-.021-.022a2 2 0 0 1-.24-.317zm.536.537v.522a.56.56 0 0 0 .425-.197.8.8 0 0 0 .115-.183c.044-.094.076-.206.103-.315.055-.225.11-.544.164-.945l-.518-.07-.518-.07c-.053.39-.102.666-.143.837q-.016.061-.027.097l-.011.033q0-.002.01-.018a.48.48 0 0 1 .4-.213zm.289-1.189-.25.46.777.42.249-.459.249-.459-.776-.42zm.776.421-.514-.094c-.104.565-.223.94-.34 1.16-.124.234-.166.162-.079.162v1.044c.5 0 .817-.365 1.002-.716.193-.362.334-.862.445-1.46zm-.933 1.75v-.523c-.12 0-.366-.088-.745-.545l-.402.333-.402.334c.43.517.943.923 1.55.923zM25 10.383l.412-.32a3 3 0 0 1-.283-.425l-.46.25-.458.25c.117.214.25.404.377.566zm-.33-.495-.385-.353a5.1 5.1 0 0 1-1.708 1.237l.211.478.211.478a6.1 6.1 0 0 0 2.056-1.487zm-1.882 1.362.432-.294-.495-.727-.432.295-.432.294.495.726zm-.495-.726.213.477a5.9 5.9 0 0 0 2.17-1.655l-.402-.332-.403-.333a4.86 4.86 0 0 1-1.791 1.366zm1.98-1.51.486-.195a8 8 0 0 1-.286-.882l-.505.136-.504.135q.14.528.325 1zm-.305-.941.504-.139c-.168-.612-.28-1.406-.345-2.38l-.522.035-.521.034c.067 1.007.186 1.88.38 2.588zm-.363-2.484v-.523H21.03v1.045h2.575zm-2.575 0h-.522v1.147h1.045V5.589zm0 1.147v.522h2.022V6.213H21.03zm2.022 0-.522-.009a27 27 0 0 1-.079 1.833c-.041.478-.093.75-.136.867l.49.18.49.182c.097-.263.156-.66.197-1.14q.064-.743.083-1.905zm-.247 2.872-.489-.186c-.028.075-.062.108-.098.13a.6.6 0 0 1-.29.061l.01.523.01.522c.285-.005.567-.064.812-.213.253-.153.43-.38.533-.651zm-.867.528v-.523a6 6 0 0 1-.616-.038l-.052.52-.052.52c.253.025.496.043.72.043zm-.668-.041.495-.167-.264-.784-.495.167-.496.166.264.784zm-.264-.784-.04.52c.331.025.62.043.873.043V8.83c-.21 0-.465-.015-.794-.04zm.833.04.033.522a.78.78 0 0 0 .494-.212.9.9 0 0 0 .244-.438l-.507-.127-.507-.127c-.004.019 0-.019.049-.064a.3.3 0 0 1 .162-.075zm.264-.255.506.132c.04-.153.06-.382.074-.634q.022-.404.033-1.04l-.522-.01-.522-.01q-.013.628-.033 1.002a3 3 0 0 1-.041.428zm.091-1.552v-.522H21.03v1.045h1.164zm-1.164 0-.522-.014c-.04 1.47-.362 2.592-.925 3.418l.432.294.432.294c.709-1.04 1.063-2.377 1.106-3.977zm-1.015 3.698.35-.389-.652-.586-.35.389-.349.388.652.586zm-.652-.586.432.294c.59-.867.865-2.03.891-3.42l-.522-.01-.523-.01c-.023 1.283-.277 2.217-.71 2.852zm.8-3.136h.523V4.772h-1.045V7.52zm0-2.748v.522h3.401V4.249h-3.4zm3.401 0 .522-.023a28 28 0 0 1-.016-1.174h-1.045c0 .41 0 .826.017 1.22zm-.017-1.197v.522h.875V3.052h-.875zm.875 0H23.9c0 .428.008.831.025 1.22l.522-.024.522-.022c-.016-.372-.024-.76-.024-1.174zm.025 1.196v.523h1.164V4.249h-1.164zm1.164 0 .39-.348a6.4 6.4 0 0 0-.864-.792l-.319.414-.318.414a5.3 5.3 0 0 1 .72.66zm-.793-.726.361.378.545-.52-.36-.378-.362-.378-.544.52z&quot; mask=&quot;url(#ai-generate-label_svg__a)&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;#CCC&quot; d=&quot;M6.544 10.85H5.112L4.652 9h-1.99l-.653 1.85H.577l2.268-6.422H4.95zm2.28 0h-1.52l.337-6.422h1.52zM3.047 7.91h1.335L3.83 5.692z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;container-footer-TocUUl&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br class=&quot;container-Vdm5p7 wrapper-_7axQ_ undefined&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); overflow-anchor: auto;&quot;/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br class=&quot;container-Vdm5p7 wrapper-_7axQ_ undefined&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); content: &amp;quot;&amp;quot;; display: block; font-size: 20px; margin: 1em; overflow-anchor: auto; font-family: Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;/p&gt;&lt;div class=&quot;auto-hide-last-sibling-br paragraph-Oc488D paragraph-element br-paragraph-space&quot; style=&quot;-webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); line-height: 28px; font-size: 16px; overflow-anchor: auto; font-family: Inter, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;SF Pro SC&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, &amp;quot;SF Pro Icons&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap-mode: wrap; background-color: rgb(255, 255, 255); color: rgba(0, 0, 0, 0.85) !important;&quot;&gt;这个改进后的方案让 Worker 可以持续运行，同时提供了灵活的控制方式，满足你的需求。&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/ol&gt;</description><pubDate>Sun, 08 Jun 2025 22:01:56 +0800</pubDate></item><item><title>Python库实现PDF转HTML方法，可以提取目录TOC</title><link>https://zuoweng.com/post/239.html</link><description>&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;在Python中，要识别PDF中的目录（Table of Contents, TOC），通常有两种场景：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;直接提取PDF内置的书签（Bookmarks）：如果PDF本身带有目录书签（例如电子书、技术文档），可以直接提取。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;自动分析文本结构推断目录：如果PDF没有书签，需要通过文本模式、标题层级或排版特征（如页码、缩进）来识别目录。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;以下是针对这两种场景的解决方案和库推荐：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;一、提取PDF内置书签（推荐方案）&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;如果PDF本身包含目录书签（通过阅读器可展开的导航栏），可以使用以下库直接提取：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;h4&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;1. PyMuPDF (fitz)&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;PyMuPDF 能直接读取PDF的书签信息，适合快速提取目录结构：&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush:python;toolbar:false&quot;&gt;import&amp;nbsp;fitz

def&amp;nbsp;extract_toc(pdf_path):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;doc&amp;nbsp;=&amp;nbsp;fitz.open(pdf_path)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;toc&amp;nbsp;=&amp;nbsp;doc.get_toc()&amp;nbsp;&amp;nbsp;#&amp;nbsp;返回一个列表，每个元素是&amp;nbsp;[层级,&amp;nbsp;标题,&amp;nbsp;页码,&amp;nbsp;...]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;toc

#&amp;nbsp;示例输出：
#&amp;nbsp;[
#&amp;nbsp;&amp;nbsp;&amp;nbsp;[1,&amp;nbsp;&amp;quot;Chapter&amp;nbsp;1&amp;quot;,&amp;nbsp;1],
#&amp;nbsp;&amp;nbsp;&amp;nbsp;[1,&amp;nbsp;&amp;quot;Chapter&amp;nbsp;2&amp;quot;,&amp;nbsp;5],
#&amp;nbsp;&amp;nbsp;&amp;nbsp;[2,&amp;nbsp;&amp;quot;Section&amp;nbsp;2.1&amp;quot;,&amp;nbsp;6],
#&amp;nbsp;&amp;nbsp;&amp;nbsp;...
#&amp;nbsp;]&lt;/pre&gt;&lt;h4&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;2. pikepdf&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;另一个支持提取书签的库，适合需要更复杂操作的场景：&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush:python;toolbar:false&quot;&gt;from&amp;nbsp;pikepdf&amp;nbsp;import&amp;nbsp;Pdf

with&amp;nbsp;Pdf.open(&amp;#39;input.pdf&amp;#39;)&amp;nbsp;as&amp;nbsp;pdf:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;&amp;#39;/Outlines&amp;#39;&amp;nbsp;in&amp;nbsp;pdf.Root:&amp;nbsp;&amp;nbsp;#&amp;nbsp;检查是否存在书签
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;outlines&amp;nbsp;=&amp;nbsp;pdf.Root.Outlines
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;item&amp;nbsp;in&amp;nbsp;outlines:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(item.Title,&amp;nbsp;item.Dest[0].objgen)&amp;nbsp;&amp;nbsp;#&amp;nbsp;标题和页码（需进一步解析）&lt;/pre&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;二、自动分析文本结构推断目录&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;如果PDF没有内置书签，需要通过分析文本内容识别目录。这通常需要结合规则（如正则表达式匹配章节标题和页码）或机器学习模型。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;h4&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;1. pdfplumber（基于规则）&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;通过文本位置、字体大小和正则表达式匹配目录条目：&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush:python;toolbar:false&quot;&gt;import&amp;nbsp;pdfplumber
import&amp;nbsp;re

def&amp;nbsp;infer_toc(pdf_path):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;toc&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with&amp;nbsp;pdfplumber.open(pdf_path)&amp;nbsp;as&amp;nbsp;pdf:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;page&amp;nbsp;in&amp;nbsp;pdf.pages:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text&amp;nbsp;=&amp;nbsp;page.extract_text()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;匹配类似&amp;nbsp;&amp;quot;Chapter&amp;nbsp;1&amp;nbsp;......&amp;nbsp;1&amp;quot;&amp;nbsp;的目录条目
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;matches&amp;nbsp;=&amp;nbsp;re.findall(r&amp;#39;(.*?)\s+\.+\s+(\d+)&amp;#39;,&amp;nbsp;text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;title,&amp;nbsp;page_num&amp;nbsp;in&amp;nbsp;matches:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;toc.append({&amp;quot;title&amp;quot;:&amp;nbsp;title.strip(),&amp;nbsp;&amp;quot;page&amp;quot;:&amp;nbsp;int(page_num)})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;toc&lt;/pre&gt;&lt;h4&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;2. pdftotree（结构化解析）&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;使用机器学习模型解析PDF的层级结构，可能识别标题：&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush:python;toolbar:false&quot;&gt;import&amp;nbsp;pdftotree

#&amp;nbsp;转换PDF为HTML树，再通过XPath提取标题
pdftotree.convert(&amp;#39;input.pdf&amp;#39;,&amp;nbsp;&amp;#39;output.html&amp;#39;)

#&amp;nbsp;手动分析output.html中的&amp;lt;h1&amp;gt;,&amp;nbsp;&amp;lt;h2&amp;gt;标签或特定class&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;h4&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;3. LayoutParser（复杂版面分析）&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;结合深度学习模型检测标题区域：&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush:python;toolbar:false&quot;&gt;import&amp;nbsp;layoutparser&amp;nbsp;as&amp;nbsp;lp

model&amp;nbsp;=&amp;nbsp;lp.Detectron2LayoutModel(&amp;#39;lp://PrimaLayout/mask_rcnn_R_50_FPN_3x/config&amp;#39;)
pdf_image&amp;nbsp;=&amp;nbsp;np.array(...)&amp;nbsp;&amp;nbsp;#&amp;nbsp;将PDF页面转为图像
layout&amp;nbsp;=&amp;nbsp;model.detect(pdf_image)
#&amp;nbsp;筛选可能是标题的区块（需自定义规则）&lt;/pre&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;三、推荐方案&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;如果PDF有内置书签：直接用 PyMuPDF 的 get_toc()，简单高效。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;无书签需推断目录：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;简单场景：用 pdfplumber + 正则表达式。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;复杂场景：结合 LayoutParser 或 pdftotree 分析版面层级。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;四、注意事项&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;准确性：无书签的目录识别依赖PDF的排版规范性，复杂文档（如多栏、图表混杂）可能需要定制规则。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;页码偏移：PDF页码可能与实际物理页码不同（如封面不计入页码），需注意调整。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;OCR需求：扫描版PDF需先用OCR工具（如Tesseract）提取文本。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;如果需要全自动化工具，可以尝试集成 GROBID（Java库，通过API调用），它专用于学术文档的结构化解析，支持目录提取。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Mon, 31 Mar 2025 22:14:54 +0800</pubDate></item><item><title>电脑端钉钉【工作通知】中出现草稿显示，无法删除解决方案</title><link>https://zuoweng.com/post/238.html</link><description>&lt;p&gt;1、退出钉钉； &lt;br/&gt;&lt;br/&gt;2、打开计算机-地址栏输入【%appdata%\dingtalk】 ； &lt;br/&gt;&lt;br/&gt;3、重命名以下目录文件：【xxx(一串数字)_v2】目录为【xxx_v2_bak】； &lt;br/&gt;&lt;br/&gt;4、重启钉钉，登录成功后再次重启。&amp;nbsp;&lt;/p&gt;</description><pubDate>Thu, 23 Jan 2025 09:01:13 +0800</pubDate></item><item><title>免费标签编辑打印软件——汉码V1.04.00</title><link>https://zuoweng.com/post/237.html</link><description>&lt;p&gt;新年快乐！&lt;/p&gt;&lt;p&gt;假如今日山高人为峰，明日零落碾作尘。&lt;/p&gt;&lt;p&gt;假如梨花院落溶溶月，忽作昼出耘田夜绩麻。&lt;/p&gt;&lt;p&gt;假如你有了一家便利店，假如你用的云端系统，假如断了网，假如急需更换标签。&lt;/p&gt;&lt;p&gt;假如成了假如，你该何如？&lt;/p&gt;&lt;p&gt;免费标签编辑打印软件，是否能成为你东山上的一方石呢？&lt;/p&gt;&lt;p&gt;Windows PC版汉码V1.04.00，优点如下：&lt;/p&gt;&lt;p&gt;1、可免费离线使用除需要联网的云端和行业模板之外的所有功能。&lt;/p&gt;&lt;p&gt;2、只要在你的电脑上安装了打印机驱动，就可以进行标签打印，没有打印机限制。&lt;/p&gt;&lt;p&gt;3、支持任意尺寸标签编辑。&lt;/p&gt;&lt;p&gt;4、可批量导入打印，支持EXCEL、SQL Server、Access和Mysql四种导入方式。&lt;/p&gt;&lt;p&gt;5、支持PC、macos、Android，IOS等多端数据互通。如果有兴趣，也可以免费注册使用云上数据和行业模板功能。&lt;/p&gt;&lt;p&gt;Windows PC版汉码V1.04.00，缺点如下：&lt;/p&gt;&lt;p&gt;1、不能进行底色、字体颜色的设置。&lt;/p&gt;&lt;p&gt;2、不能进行二维码颜色和图片的自定义设置。&lt;/p&gt;&lt;p&gt;3、不能直接选择插入本地图片，只能先插入系统自带图片，再点击图片修改。&lt;/p&gt;&lt;p&gt;4、单次打印最大支持3448行数据。&lt;/p&gt;&lt;p&gt;总之，经测试，这是我目前能找到的体验最好的免费标签编辑打印软件，介意以上缺点的伙伴，飘过即可。批量导入打印过程文档，我和软件链接放在一起，大家可按需获取。&lt;/p&gt;&lt;p&gt;测试环境：windows 10&amp;amp;Godex科诚G500打印机，批量导入只测试了EXCEL和SQL Server。&lt;/p&gt;&lt;p&gt;注：只测试了Windows PC端，其他端未测试。windows PC版本1.0.4.00，其他平台非此版本号&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://zuoweng.com/zb_users/upload/2025/01/202501011735728758860318.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;Windows：&lt;/p&gt;&lt;p&gt;链接: https://pan.baidu.com/s/1EKEWVUBqwnTCRz0bFFtoOQ 提取码: t5gy&lt;/p&gt;&lt;p&gt;MACOS：&lt;/p&gt;&lt;p&gt;链接: https://pan.baidu.com/s/13Z_EtGB4IqvQjTCPK9TtrQ 提取码: s9ye&lt;/p&gt;&lt;p&gt;Android：&lt;/p&gt;&lt;p&gt;链接: https://pan.baidu.com/s/1W8IJ-N2acdAPxYlFf2Cv3g 提取码: fmyk&lt;/p&gt;&lt;p&gt;IOS和HarmonyOS可直接在商店搜索。&lt;/p&gt;&lt;p&gt;批量excel导入操作：&lt;/p&gt;&lt;p&gt;链接: https://pan.baidu.com/s/1SoPZuk5XdL8iiTyQfvZb3Q 提取码: jtne&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 01 Jan 2025 18:52:01 +0800</pubDate></item><item><title>Proxmark3（PM3）硬件简单拆解与介绍</title><link>https://zuoweng.com/post/236.html</link><description>&lt;h3&gt;
    &lt;span&gt;PM3简介&lt;/span&gt;
&lt;/h3&gt;
&lt;p&gt;
    &lt;span&gt;Proxmark，确切来说是prox（接近的），mark（标签），翻译过来的意思就是“不用接触，靠近就能刷的卡片”。现在有把一些IC卡也叫NFC标签的。&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
    &lt;span&gt;Proxmark3（PM3）最先是由老外开发的一个开源硬件，用于破解一些智能卡，IC、ID都能读写。然后有团队开始开发固件和软件，设计改版硬件，维护pm3项目。&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
    &lt;span&gt;现在国内常见的硬件，主要有rdv系列的3个版本，easy、rdv2，还有rdv4。其实easy也属于rdv系列，全称应该是rdv easy，最常见，最便宜。rdv2贵一点，rdv4更贵，国内应该很难买。下文说到的pm3，不做特殊说明的话，都特指pm3 easy版。&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
    &lt;span&gt;官方网站地址：http://www.proxmark.org&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
    &lt;span&gt;官方固件和代码开源地址：https://github.com/Proxmark/proxmark3&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
    &lt;span&gt;iceman（冰人）固件和代码开源地址：https://github.com/iceman1001/proxmark3&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
    &lt;span&gt;RRG固件和代码开源地址：https://github.com/RfidResearchGroup/proxmark3&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
    &lt;span&gt;现在发展开来，同一个硬件，可以分别刷入3种不同的固件，固件之间有些许差异。&lt;/span&gt;
&lt;/p&gt;
&lt;h3&gt;
    &lt;span&gt;关于抄板&lt;/span&gt;
&lt;/h3&gt;
&lt;p&gt;
    &lt;span&gt;&amp;nbsp;现在网上卖pm3的商家，都在自我标榜是正版，别人都是抄板。&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
    &lt;span&gt;先看下官方的项目文件。&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
    &lt;img src=&quot;https://zuoweng.com/zb_users/upload/2024/12/202412071733571471578338.png&quot; data-catchresult=&quot;img_catchSuccess&quot;/&gt;
&lt;/p&gt;
&lt;p&gt;
    pcb目录即为电路板目录。公开的设计图是Jonathan Westhues设计的初版。设计图部分预览，还有成品图如下：
&lt;/p&gt;
&lt;p&gt;
    &lt;img src=&quot;https://zuoweng.com/zb_users/upload/2024/12/202412071733571487571398.png&quot; data-catchresult=&quot;img_catchSuccess&quot; width=&quot;631&quot; height=&quot;336&quot; style=&quot;width: 631px; height: 336px;&quot;/&gt;
&lt;/p&gt;
&lt;p&gt;
    &lt;img src=&quot;https://zuoweng.com/zb_users/upload/2024/12/202412071733571500407876.png&quot; data-catchresult=&quot;img_catchSuccess&quot;/&gt;
&lt;/p&gt;
&lt;p&gt;
    &lt;img src=&quot;https://zuoweng.com/zb_users/upload/2024/12/202412071733571508572043.jpg&quot; data-catchresult=&quot;img_catchSuccess&quot; width=&quot;618&quot; height=&quot;330&quot; style=&quot;width: 618px; height: 330px;&quot;/&gt;
&lt;/p&gt;
&lt;p&gt;
    &lt;span&gt;是不是和常见的pm3不一样？那就是了，easy、rdv2、rdv4都是基于初版的原理做的改版。猜测应该是elechouse做了最初的改版，elechouse是深圳一家硬件厂商，有研发和生产能力，有兴趣可以自己去查信息。现在常见的pm3上面都带有elechouse字样。套用电脑显卡的说法，公开图纸的原版就是公版，easy、rdv2、rdv4就是开发团队做的私版。&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
    &lt;span&gt;所谓正版，应该是当初开发团队找代工厂生产了一批私版。（毫无疑问，全世界的私版都是深圳做的，根本原因就是便宜）&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
    &lt;span&gt;其它厂家有了公版的设计图，只要模仿私版的外观，就比较容易做出一样的产品，就是所谓的抄板。然而发展到今天，开发团队已不生产easy版，pm3几乎烂大街，我更愿意相信，私版的设计图也已经不是秘密，深圳一些厂家应该都有设计图，只是我们外行人没有。市面上各种外观的pm3应该都是厂家细微修改设计生产的。所以不用纠结是不是抄板，基于的原理都是一样的。除了外观的差别，总体都大差不差。唯一可能有影响的区别，就是不同厂家的用料可能不同，元器件的优劣，制作工艺的高低，最终影响成品的质量。&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
    &lt;span&gt;&lt;br/&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
    &lt;span&gt;转自https://www.wasyoung.com/2019/11/30/337/&lt;/span&gt;
&lt;/p&gt;</description><pubDate>Sat, 07 Dec 2024 19:37:08 +0800</pubDate></item><item><title>小米nfc模拟加密门禁卡详细图文教程</title><link>https://zuoweng.com/post/235.html</link><description>&lt;p&gt;IC ID CUID 卡区别如下：&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://zuoweng.com/zb_users/upload/2024/12/202412041733315727152629.png&quot; data-catchresult=&quot;img_catchSuccess&quot;/&gt;&lt;/p&gt;&lt;p&gt;ID卡全称身份识别卡，是一种不可写入的感应卡，含固定的编号。频率是125KHz，属于低频。一般用于门禁。&lt;/p&gt;&lt;p&gt;IC卡全称集成电路卡，又称智能卡。可读写，容量大，有加密功能，数据记录安全可靠，使用更方便，属于高频，频率是135MHz,主要用于一卡通系统、消费系统等。&lt;/p&gt;&lt;p&gt;UID、CUID、FUID都属于IC卡，IC和ID的具体类型分类如下图：&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://zuoweng.com/zb_users/upload/2024/12/202412041733315777117664.png&quot; alt=&quot;image.png&quot;/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;现在小区虽然都加装了智能门，可以通过手机NFC功能开启或者使用钥匙开启，但是有些用户并不知道原来手机是可以当钥匙使用的。今天我们来学习使用小米nfc模拟加密门禁卡，这样手机就可以变成一把钥匙了。以下是小米nfc模拟加密门禁卡步骤。&lt;/p&gt;&lt;p&gt;1、非加密卡直接使用小米钱包的门卡模拟功能即可，如果能直接模拟的就不是加密卡。&lt;/p&gt;&lt;p&gt;2、NFC手机支持的频段一般为13.56Mhz卡片，如果是其他门禁卡，手机贴上根本没反应的不可以模拟。&lt;/p&gt;&lt;p&gt;3、只能模拟卡片的ID，不支持储值消费等功能。部分门禁等系统只认证卡片ID，所以有可能通过模拟ID实现卡片的部分功能。&lt;/p&gt;&lt;p&gt;4、模拟的基本原理是读取加密卡的ID，将ID写入一张空白卡，然后使用小米钱包模拟这张空白卡。&lt;/p&gt;&lt;h3&gt;物料准备&lt;/h3&gt;&lt;p&gt;一张CUID卡，淘宝售价1-2元一张，直接搜索就可以&lt;/p&gt;&lt;p&gt;注：CUID是IC卡&lt;/p&gt;&lt;p&gt;NFC手机一台&lt;/p&gt;&lt;p&gt;加密卡(门卡)&lt;/p&gt;&lt;p&gt;MIFARE经典工具（Mifare Classic Tool，MCT）&lt;/p&gt;&lt;p&gt;1、打开 MCT，将要被模拟的卡片贴近手机NFC区域，可以看到弹出提示，记下UID。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://zuoweng.com/zb_users/upload/2024/12/202412041733315846772222.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;2、打开上图中的工具，选择BCC计算器（实际就是计算UID各个字节的XOR sum）输入刚才记下的UID，计算，得到两位BCC，记下BCC。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://zuoweng.com/zb_users/upload/2024/12/202412041733315870498353.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;3、退回1的界面，选择读标签，秘钥文件选std.keys(无关紧要的步骤），将CUID空白卡靠近NFC区域，选择“启动映射并读取标签”。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://zuoweng.com/zb_users/upload/2024/12/202412041733315887211517.png&quot; data-catchresult=&quot;img_catchSuccess&quot;/&gt;&lt;/p&gt;&lt;p&gt;注意这次读的是你的空白卡&lt;/p&gt;&lt;p&gt;4、读卡结束此时应该进入的是一个叫“转储编辑器”的界面，编辑扇区0，将前10个字符替换UID+BCC（UID有8位，BCC有2位），点击右上角的保存按钮，文件名随便输入一个名字（建议用加密卡的UID）点击保存。注意千万不要乱改后面的6个字符，否则可能导致卡片失效。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://zuoweng.com/zb_users/upload/2024/12/202412041733315911169406.png&quot; data-catchresult=&quot;img_catchSuccess&quot;/&gt;&lt;/p&gt;&lt;p&gt;5、退回MCT主界面，选择写标签功能，勾选“显示选项”，勾选“高级，使能厂商块写入”（重要），点击“选择转储”，选择刚才存储的转储文件，点击最下面的选择转储。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://zuoweng.com/zb_users/upload/2024/12/202412041733315933291932.png&quot; data-catchresult=&quot;img_catchSuccess&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;再选择你想写的扇区，保证0扇区被勾选，其他的无所谓。将CUID卡贴在NFC区域。点击“好的”。此时又会弹出选择秘钥文件的界面，选择std.keys。写入转储。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://zuoweng.com/zb_users/upload/2024/12/202412041733315954343601.png&quot; data-catchresult=&quot;img_catchSuccess&quot;/&gt;&lt;/p&gt;&lt;p&gt;6、写卡成功，可以再将卡贴在手机后面，看看提示的UID更改了没有。&lt;/p&gt;&lt;p&gt;7、打开小米钱包APP，选择门卡模拟，模拟这张CUID卡&lt;/p&gt;&lt;p&gt;以上就是小米nfc模拟加密门禁卡详细图文教程，该教程一般不适合新手操作，请认真阅读教程。该教程中的内容不保证可以复制所有加密门禁卡内的功能。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 04 Dec 2024 20:35:07 +0800</pubDate></item><item><title>grok beta 模型转发php版本，测试通过</title><link>https://zuoweng.com/post/233.html</link><description>&lt;pre class=&quot;brush:php;toolbar:false&quot;&gt;&amp;lt;?php
//&amp;nbsp;禁用输出缓冲
while&amp;nbsp;(ob_get_level())&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ob_end_clean();
}
ob_implicit_flush(true);&amp;nbsp;&amp;nbsp;//&amp;nbsp;禁止&amp;nbsp;PHP&amp;nbsp;输出缓冲

//&amp;nbsp;设置正确的响应头，告知客户端这是一个&amp;nbsp;SSE&amp;nbsp;流
header(&amp;#39;Content-Type:&amp;nbsp;text/event-stream&amp;#39;);
header(&amp;#39;Transfer-Encoding:&amp;nbsp;chunked&amp;#39;);


header(&amp;#39;Cache-Control:&amp;nbsp;no-cache&amp;#39;);
header(&amp;#39;Connection:&amp;nbsp;keep-alive&amp;#39;);

//&amp;nbsp;目标网址
$targetUrl&amp;nbsp;=&amp;nbsp;&amp;#39;https://api.x.ai&amp;#39;;&amp;nbsp;//&amp;nbsp;目标&amp;nbsp;URL&amp;nbsp;替换为实际地址
//&amp;nbsp;获取原始请求数据
$requestData&amp;nbsp;=&amp;nbsp;file_get_contents(&amp;#39;php://input&amp;#39;);
//&amp;nbsp;获取原始请求头
$requestHeaders&amp;nbsp;=&amp;nbsp;getallheaders();
//&amp;nbsp;构建目标&amp;nbsp;URL
$targetUrl&amp;nbsp;.=&amp;nbsp;$_SERVER[&amp;#39;REQUEST_URI&amp;#39;];
//&amp;nbsp;处理查询参数
$queryString&amp;nbsp;=&amp;nbsp;$_SERVER[&amp;#39;QUERY_STRING&amp;#39;];
if&amp;nbsp;(!empty($queryString))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$targetUrl&amp;nbsp;.=&amp;nbsp;&amp;#39;?&amp;#39;&amp;nbsp;.&amp;nbsp;$queryString;
}

//&amp;nbsp;创建&amp;nbsp;cURL&amp;nbsp;句柄
$ch&amp;nbsp;=&amp;nbsp;curl_init();

//&amp;nbsp;设置&amp;nbsp;cURL&amp;nbsp;选项
curl_setopt($ch,&amp;nbsp;CURLOPT_URL,&amp;nbsp;$targetUrl);&amp;nbsp;//&amp;nbsp;设置目标网址
curl_setopt($ch,&amp;nbsp;CURLOPT_RETURNTRANSFER,&amp;nbsp;true);&amp;nbsp;//&amp;nbsp;不保存结果，直接输出
curl_setopt($ch,&amp;nbsp;CURLOPT_CUSTOMREQUEST,&amp;nbsp;$_SERVER[&amp;#39;REQUEST_METHOD&amp;#39;]);&amp;nbsp;//&amp;nbsp;使用与原始请求相同的方法
curl_setopt($ch,&amp;nbsp;CURLOPT_POSTFIELDS,&amp;nbsp;$requestData);&amp;nbsp;//&amp;nbsp;设置请求数据
curl_setopt($ch,&amp;nbsp;CURLOPT_HTTPHEADER,&amp;nbsp;formatRequestHeaders($requestHeaders));&amp;nbsp;//&amp;nbsp;设置请求头

//&amp;nbsp;禁用&amp;nbsp;SSL&amp;nbsp;验证
curl_setopt($ch,&amp;nbsp;CURLOPT_SSL_VERIFYPEER,&amp;nbsp;false);&amp;nbsp;//&amp;nbsp;不验证对等证书
curl_setopt($ch,&amp;nbsp;CURLOPT_SSL_VERIFYHOST,&amp;nbsp;false);&amp;nbsp;//&amp;nbsp;不验证主机名

//&amp;nbsp;启用调试信息
curl_setopt($ch,&amp;nbsp;CURLOPT_VERBOSE,&amp;nbsp;true);

//&amp;nbsp;设置回调函数，每次接收到数据时都输出
curl_setopt($ch,&amp;nbsp;CURLOPT_WRITEFUNCTION,&amp;nbsp;function($ch,&amp;nbsp;$data)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;每次接收到的数据都直接输出
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//echo&amp;nbsp;$data;&amp;nbsp;&amp;nbsp;//&amp;nbsp;SSE&amp;nbsp;格式要求以&amp;nbsp;&amp;quot;data:&amp;nbsp;&amp;quot;&amp;nbsp;开头，每个事件后加双换行
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;逐字输出数据
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$chars&amp;nbsp;=&amp;nbsp;str_split($data);&amp;nbsp;//&amp;nbsp;将数据按字符分割
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach&amp;nbsp;($chars&amp;nbsp;as&amp;nbsp;$char)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;$char;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ob_flush();&amp;nbsp;&amp;nbsp;//&amp;nbsp;刷新&amp;nbsp;PHP&amp;nbsp;缓冲区
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;flush();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;刷新系统输出缓冲区
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//ob_flush();&amp;nbsp;&amp;nbsp;//&amp;nbsp;刷新&amp;nbsp;PHP&amp;nbsp;缓冲区
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//flush();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;刷新系统输出缓冲区
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;strlen($data);&amp;nbsp;&amp;nbsp;//&amp;nbsp;返回数据长度，告知&amp;nbsp;cURL&amp;nbsp;数据已处理
});

//&amp;nbsp;执行&amp;nbsp;cURL&amp;nbsp;请求
$response&amp;nbsp;=&amp;nbsp;curl_exec($ch);

//&amp;nbsp;检查是否有错误发生
if(curl_errno($ch))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$error&amp;nbsp;=&amp;nbsp;curl_error($ch);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http_response_code(500);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;处理错误
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;#39;cURL&amp;nbsp;Error:&amp;nbsp;&amp;#39;&amp;nbsp;.&amp;nbsp;$error;
}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;获取响应的&amp;nbsp;HTTP&amp;nbsp;状态码
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$httpStatus&amp;nbsp;=&amp;nbsp;curl_getinfo($ch,&amp;nbsp;CURLINFO_HTTP_CODE);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;设置响应的&amp;nbsp;HTTP&amp;nbsp;状态码
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http_response_code($httpStatus);
}

//&amp;nbsp;关闭&amp;nbsp;cURL&amp;nbsp;句柄
curl_close($ch);

/**
&amp;nbsp;*&amp;nbsp;格式化请求头，将关联数组转换为字符串数组
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;array&amp;nbsp;$headers&amp;nbsp;关联数组的请求头
&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;array&amp;nbsp;字符串数组的请求头
&amp;nbsp;*/
function&amp;nbsp;formatRequestHeaders($headers)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$formattedHeaders&amp;nbsp;=&amp;nbsp;[];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach&amp;nbsp;($headers&amp;nbsp;as&amp;nbsp;$key&amp;nbsp;=&amp;gt;&amp;nbsp;$value)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;可以根据需要调整需要传递的头部字段
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(in_array(strtolower($key),&amp;nbsp;[&amp;#39;authorization&amp;#39;,&amp;nbsp;&amp;#39;content-type&amp;#39;]))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$formattedHeaders[]&amp;nbsp;=&amp;nbsp;$key&amp;nbsp;.&amp;nbsp;&amp;#39;:&amp;nbsp;&amp;#39;&amp;nbsp;.&amp;nbsp;$value;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;$formattedHeaders;
}&lt;/pre&gt;&lt;p&gt;第一个版本：目前有bug就是会等待所有的内容输出完毕后才会输出。暂时可用，将就下吧。&lt;/p&gt;&lt;p&gt;目前这是第二版，已解决第一个版本的bug。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;需要配置伪静态&lt;/p&gt;&lt;p&gt;if (!-e $request_filename) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rewrite ^(.*)$ /index.php$1 last;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 26 Nov 2024 20:32:33 +0800</pubDate></item></channel></rss>