[
  {
    "path": ".gitattributes",
    "content": "*.js linguist-language=python\n*.css linguist-language=python\n*.html linguist-language=python\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "# 默认：仓库所有文件都需要 @NanmiCoder 审核\n*                                   @NanmiCoder\n\n\n.github/workflows/**               @NanmiCoder\n\n\nrequirements.txt                   @NanmiCoder\npyproject.toml                     @NanmiCoder\nPipfile                            @NanmiCoder\npackage.json                       @NanmiCoder\npackage-lock.json                  @NanmiCoder\npnpm-lock.yaml                     @NanmiCoder\n\n\nDockerfile                         @NanmiCoder\ndocker/**                          @NanmiCoder\nscripts/deploy/**                  @NanmiCoder\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---  \nname: MediaCrawler Bug反馈  \nabout: 创建一个问题Bug以帮助MediaCrawler开源项目改进 \ntitle: '[BUG] '  \nlabels: bug  \nassignees: ''  \n---  \n\n## 🔍 问题检查清单  \n<!-- 请在提交issue前确认以下事项 -->  \n\n- [ ] 我已经仔细阅读了项目使用过程中的[常见问题汇总](https://nanmicoder.github.io/MediaCrawler/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98.html) \n- [ ] 我已经搜索并查看了[已关闭的issues](https://github.com/NanmiCoder/MediaCrawler/issues?q=is%3Aissue+is%3Aclosed)  \n- [ ] 我确认这不是由于滑块验证码、Cookie过期、Cookie提取错误、平台风控等常见原因导致的问题  \n\n## 🐛 问题描述  \n<!-- 请详细描述你遇到的问题 -->  \n\n\n## 📝 复现步骤  \n1.   \n2.   \n3.   \n\n## 💻 运行环境  \n- 操作系统:   \n- Python版本:  \n- 是否使用IP代理:  \n- 是否使用VPN翻墙软件：\n- 目标平台(抖音/小红书/微博等):  \n\n## 📋 错误日志  \n<!-- 请提供完整的错误日志信息 -->  \n```shell  \n在此粘贴错误日志\n```\n\n## 📷 错误截图\n<!-- 请提供错误截图 -->\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/quesiton.md",
    "content": "---  \nname: MediaCrawler使用问题咨询  \nabout: 提交使用过程中遇到的问题  \ntitle: '[问题] '  \nlabels: question  \nassignees: ''  \n---  \n\n## ⚠️ 提交前确认  \n<!-- 请确认以下事项 -->  \n- [ ] 我已经仔细阅读了项目使用过程中的[常见问题汇总](https://nanmicoder.github.io/MediaCrawler/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98.html) \n- [ ] 我已经搜索并查看了[已关闭的issues](https://github.com/NanmiCoder/MediaCrawler/issues?q=is%3Aissue+is%3Aclosed)  \n- [ ] 我确认这不是由于滑块验证码、Cookie过期、Cookie提取错误、平台风控等常见原因导致的问题  \n\n## ❓ 问题描述  \n<!-- 清晰简洁地描述你遇到的问题 -->  \n\n## 🔍 使用场景  \n<!-- 描述你在使用哪个功能时遇到的问题 -->  \n- 目标平台: (如：小红书/抖音/微博等)  \n- 使用功能: (如：关键词搜索/用户主页爬取等)  \n\n## 💻 环境信息  \n- 操作系统:   \n- Python版本:  \n- 是否使用IP代理:  \n- 是否使用VPN翻墙软件：\n- 目标平台(抖音/小红书/微博等):  \n\n## 📋 错误日志  \n```shell  \n在此粘贴完整的错误日志\n```\n\n## 📷 错误截图\n<!-- 请提供错误截图 -->\n"
  },
  {
    "path": ".github/workflows/deploy.yml",
    "content": "# 构建 VitePress 站点并将其部署到 GitHub Pages 的示例工作流程\n#\nname: Deploy VitePress site to Pages\n\non:\n  # 在针对 `main` 分支的推送上运行。如果你\n  # 使用 `master` 分支作为默认分支，请将其更改为 `master`\n  push:\n    branches: [main]\n\n  # 允许你从 Actions 选项卡手动运行此工作流程\n  workflow_dispatch:\n\n# 设置 GITHUB_TOKEN 的权限，以允许部署到 GitHub Pages\npermissions:\n  contents: read\n  pages: write\n  id-token: write\n\n# 只允许同时进行一次部署，跳过正在运行和最新队列之间的运行队列\n# 但是，不要取消正在进行的运行，因为我们希望允许这些生产部署完成\nconcurrency:\n  group: pages\n  cancel-in-progress: false\n\njobs:\n  # 构建工作\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0 # 如果未启用 lastUpdated，则不需要\n      # - uses: pnpm/action-setup@v3 # 如果使用 pnpm，请取消注释\n      # - uses: oven-sh/setup-bun@v1 # 如果使用 Bun，请取消注释\n      - name: Setup Node\n        uses: actions/setup-node@v4\n        with:\n          node-version: 20\n          cache: npm # 或 pnpm / yarn\n      - name: Setup Pages\n        uses: actions/configure-pages@v4\n      - name: Install dependencies\n        run: npm ci # 或 pnpm install / yarn install / bun install\n      - name: Build with VitePress\n        run: npm run docs:build # 或 pnpm docs:build / yarn docs:build / bun run docs:build\n      - name: Upload artifact\n        uses: actions/upload-pages-artifact@v3\n        with:\n          path: docs/.vitepress/dist\n\n  # 部署工作\n  deploy:\n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n    needs: build\n    runs-on: ubuntu-latest\n    name: Deploy\n    steps:\n      - name: Deploy to GitHub Pages\n        id: deployment\n        uses: actions/deploy-pages@v4"
  },
  {
    "path": ".gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\n.pybuilder/\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n#   For a library or package, you might want to ignore these files since the code is\n#   intended to run in multiple environments; otherwise, check them in:\n# .python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# poetry\n#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.\n#   This is especially recommended for binary packages to ensure reproducibility, and is more\n#   commonly ignored for libraries.\n#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control\n#poetry.lock\n\n# pdm\n#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.\n#pdm.lock\n#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it\n#   in version control.\n#   https://pdm.fming.dev/#use-with-ide\n.pdm.toml\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n# pytype static type analyzer\n.pytype/\n\n# Cython debug symbols\ncython_debug/\n\n# PyCharm\n#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can\n#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore\n#  and can be added to the global gitignore or merged into this file.  For a more nuclear\n#  option (not recommended) you can uncomment the following to ignore the entire idea folder.\n#.idea/\n\n*.xml\n*.iml\n.idea\n/temp_image/\n/browser_data/\n/data/\n\n*/.DS_Store\n.vscode\n/node_modules\ndocs/.vitepress/cache\n\n# other gitignore\n.venv\n.refer\n\nagent_zone\ndebug_tools\n\ndatabase/*.db\n"
  },
  {
    "path": ".pre-commit-config.yaml",
    "content": "# Pre-commit hooks configuration for MediaCrawler project\n# See https://pre-commit.com for more information\n\nrepos:\n  # Local hooks\n  - repo: local\n    hooks:\n      # Python file header copyright check\n      - id: check-file-headers\n        name: Check Python file headers\n        entry: python tools/file_header_manager.py --check\n        language: system\n        types: [python]\n        pass_filenames: true\n        stages: [pre-commit]\n\n      # Auto-fix Python file headers\n      - id: add-file-headers\n        name: Add copyright headers to Python files\n        entry: python tools/file_header_manager.py\n        language: system\n        types: [python]\n        pass_filenames: true\n        stages: [pre-commit]\n\n  # Standard pre-commit hooks (optional, can be enabled later)\n  - repo: https://github.com/pre-commit/pre-commit-hooks\n    rev: v4.5.0\n    hooks:\n      - id: trailing-whitespace\n        exclude: ^(.*\\.md|.*\\.txt)$\n      - id: end-of-file-fixer\n        exclude: ^(.*\\.md|.*\\.txt)$\n      - id: check-yaml\n      - id: check-added-large-files\n        args: ['--maxkb=10240']  # 10MB limit\n      - id: check-merge-conflict\n      - id: check-case-conflict\n      - id: mixed-line-ending\n\n# Global configuration\ndefault_language_version:\n  python: python3\n\n# Run hooks on all files during manual run\n# Usage: pre-commit run --all-files\n"
  },
  {
    "path": ".python-version",
    "content": "3.11\n"
  },
  {
    "path": "LICENSE",
    "content": "NON-COMMERCIAL LEARNING LICENSE 1.1\n\nCopyright (c) [2024] [relakkes@gmail.com]\n\nWHEREAS:\n1. The copyright owner owns and controls the copyright of this software and related documentation files (hereinafter referred to as the \"Software\");\n2. The user wishes to use the Software for learning purposes;\n3. The copyright owner is willing to authorize the user to use the Software under the conditions stated in this license;\n\nNOW, THEREFORE, the parties, in compliance with relevant laws and regulations, agree to the following terms:\n\nSCOPE OF AUTHORIZATION:\n1. The copyright owner hereby grants any natural person or legal entity (hereinafter referred to as the \"User\") accepting this license a free, non-exclusive, non-transferable right to use, copy, modify, and merge the Software for non-commercial learning purposes, subject to the following conditions.\n\nCONDITIONS:\n1. The User must include the above copyright notice and this license statement in all reasonably prominent locations of the Software and its copies.\n2. The Software is limited to learning and research purposes only, and may not be used for large-scale crawling or activities that disrupt platform operations.\n3. Without the written consent of the copyright owner, the Software may not be used for any commercial purposes or to cause improper influence on third parties.\n\nDISCLAIMER:\n1. The Software is provided \"AS IS,\" without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and non-infringement.\n2. In no event shall the copyright owner be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this Software, even if advised of the possibility of such damage.\n\nAPPLICABLE LAW:\n1. The interpretation and enforcement of this license shall comply with local laws and regulations.\n2. Any disputes arising from or related to this license shall be resolved through friendly negotiation between the parties; if negotiation fails, either party may submit the dispute to the people's court where the copyright owner is located for resolution.\n\nThis license constitutes the entire agreement between the parties regarding the Software, superseding and merging all prior discussions, communications, and agreements, whether oral or written.\n\n\n非商业学习使用许可证 1.1\n\n版权所有 (c) [2024] [relakkes@gmail.com]\n\n鉴于：\n1. 版权所有者拥有和控制本软件和相关文档文件（以下简称“软件”）的版权；\n2. 使用者希望使用该软件进行学习；\n3. 版权所有者愿意在本许可证所述的条件下授权使用者使用该软件；\n\n现因此，双方遵循相关法律法规，同意如下条款：\n\n授权范围：\n1. 版权所有者特此免费授予接受本许可证的任何自然人或法人（以下简称“使用者”）非独占的、不可转让的权利，在非商业学习目的下使用、复制、修改、合并本软件，前提是遵守以下条件。\n\n条件：\n1. 使用者必须在软件及其副本的所有合理显著位置包含上述版权声明和本许可证声明。\n2. 本软件仅限用于学习和研究目的，不得用于大规模爬虫或对平台造成运营干扰的行为。\n3. 未经版权所有者书面同意，不得将本软件用于任何商业用途或对第三方造成不当影响。\n\n免责声明：\n1. 本软件按“现状”提供，不提供任何形式的明示或暗示保证，包括但不限于对适销性、特定用途的适用性和非侵权的保证。\n2. 在任何情况下，版权所有者均不对因使用本软件而产生的，或在任何方式上与本软件有关的任何直接、间接、偶然、特殊、示例性或后果性损害负责（包括但不限于采购替代品或服务；使用、数据或利润的损失；或业务中断），无论这些损害是如何引起的，以及无论是通过合同、严格责任还是侵权行为（包括疏忽或其他方式）产生的，即使已被告知此类损害的可能性。\n\n适用法律：\n1. 本许可证的解释和执行应遵循当地法律法规。\n2. 因本许可证引起的或与之相关的任何争议，双方应友好协商解决；协商不成时，任何一方可将争议提交至版权所有者所在地的人民法院诉讼解决。\n\n本许可证构成双方之间关于本软件的完整协议，取代并合并以前的讨论、交流和协议，无论是口头还是书面的。\n"
  },
  {
    "path": "README.md",
    "content": "# 🔥 MediaCrawler - 自媒体平台爬虫 🕷️\n\n<div align=\"center\">\n\n<a href=\"https://trendshift.io/repositories/8291\" target=\"_blank\">\n  <img src=\"https://trendshift.io/api/badge/repositories/8291\" alt=\"NanmiCoder%2FMediaCrawler | Trendshift\" style=\"width: 250px; height: 55px;\" width=\"250\" height=\"55\"/>\n</a>\n\n[![GitHub Stars](https://img.shields.io/github/stars/NanmiCoder/MediaCrawler?style=social)](https://github.com/NanmiCoder/MediaCrawler/stargazers)\n[![GitHub Forks](https://img.shields.io/github/forks/NanmiCoder/MediaCrawler?style=social)](https://github.com/NanmiCoder/MediaCrawler/network/members)\n[![GitHub Issues](https://img.shields.io/github/issues/NanmiCoder/MediaCrawler)](https://github.com/NanmiCoder/MediaCrawler/issues)\n[![GitHub Pull Requests](https://img.shields.io/github/issues-pr/NanmiCoder/MediaCrawler)](https://github.com/NanmiCoder/MediaCrawler/pulls)\n[![License](https://img.shields.io/github/license/NanmiCoder/MediaCrawler)](https://github.com/NanmiCoder/MediaCrawler/blob/main/LICENSE)\n[![中文](https://img.shields.io/badge/🇨🇳_中文-当前-blue)](README.md)\n[![English](https://img.shields.io/badge/🇺🇸_English-Available-green)](README_en.md)\n[![Español](https://img.shields.io/badge/🇪🇸_Español-Available-green)](README_es.md)\n</div>\n\n\n\n> **免责声明：**\n> \n> 大家请以学习为目的使用本仓库⚠️⚠️⚠️⚠️，[爬虫违法违规的案件](https://github.com/HiddenStrawberry/Crawler_Illegal_Cases_In_China)  <br>\n>\n>本仓库的所有内容仅供学习和参考之用，禁止用于商业用途。任何人或组织不得将本仓库的内容用于非法用途或侵犯他人合法权益。本仓库所涉及的爬虫技术仅用于学习和研究，不得用于对其他平台进行大规模爬虫或其他非法行为。对于因使用本仓库内容而引起的任何法律责任，本仓库不承担任何责任。使用本仓库的内容即表示您同意本免责声明的所有条款和条件。\n>\n> 点击查看更为详细的免责声明。[点击跳转](#disclaimer)\n\n\n\n\n## 📖 项目简介\n\n一个功能强大的**多平台自媒体数据采集工具**，支持小红书、抖音、快手、B站、微博、贴吧、知乎等主流平台的公开信息抓取。\n\n### 🔧 技术原理\n\n- **核心技术**：基于 [Playwright](https://playwright.dev/) 浏览器自动化框架登录保存登录态\n- **无需JS逆向**：利用保留登录态的浏览器上下文环境，通过 JS 表达式获取签名参数\n- **优势特点**：无需逆向复杂的加密算法，大幅降低技术门槛\n\n\n## ✨ 功能特性\n| 平台   | 关键词搜索 | 指定帖子ID爬取 | 二级评论 | 指定创作者主页 | 登录态缓存 | IP代理池 | 生成评论词云图 |\n| ------ | ---------- | -------------- | -------- | -------------- | ---------- | -------- | -------------- |\n| 小红书 | ✅          | ✅              | ✅        | ✅              | ✅          | ✅        | ✅              |\n| 抖音   | ✅          | ✅              | ✅        | ✅              | ✅          | ✅        | ✅              |\n| 快手   | ✅          | ✅              | ✅        | ✅              | ✅          | ✅        | ✅              |\n| B 站   | ✅          | ✅              | ✅        | ✅              | ✅          | ✅        | ✅              |\n| 微博   | ✅          | ✅              | ✅        | ✅              | ✅          | ✅        | ✅              |\n| 贴吧   | ✅          | ✅              | ✅        | ✅              | ✅          | ✅        | ✅              |\n| 知乎   | ✅          | ✅              | ✅        | ✅              | ✅          | ✅        | ✅              |\n\n\n\n<strong>MediaCrawlerPro 重磅发布！开源不易，欢迎订阅支持</strong>\n\n> 专注于学习成熟项目的架构设计，不仅仅是爬虫技术，Pro 版本的代码设计思路同样值得深入学习！\n\n[MediaCrawlerPro](https://github.com/MediaCrawlerPro) 相较于开源版本的核心优势：\n\n#### 🎯 核心功能升级\n- ✅ **自媒体内容拆解Agent**（新增功能）\n- ✅ **断点续爬功能**（重点特性）\n- ✅ **多账号 + IP代理池支持**（重点特性）\n- ✅ **去除 Playwright 依赖**，使用更简单\n- ✅ **完整 Linux 环境支持**\n\n#### 🏗️ 架构设计优化\n- ✅ **代码重构优化**，更易读易维护（解耦 JS 签名逻辑）\n- ✅ **企业级代码质量**，适合构建大型爬虫项目\n- ✅ **完美架构设计**，高扩展性，源码学习价值更大\n\n#### 🎁 额外功能\n- ✅ **自媒体视频下载器桌面端**（适合学习全栈开发）\n- ✅ **多平台首页信息流推荐**（HomeFeed）\n- ✅ **AI Agent Skill 支持**（[OpenClaw](https://openclaw.ai/) 🦞 / Claude Code / Cursor 一键安装，让 Agent 自动爬取数据）\n- [ ] **基于评论分析AI Agent正在开发中 🚀🚀**\n\n点击查看：[MediaCrawlerPro 项目主页](https://github.com/MediaCrawlerPro) 更多介绍\n\n\n\n## 🚀 快速开始\n\n> 💡 **如果这个项目对您有帮助，请给个 ⭐ Star 支持一下！**\n\n## 📋 前置依赖\n\n### 🚀 uv 安装（推荐）\n\n在进行下一步操作之前，请确保电脑上已经安装了 uv：\n\n- **安装地址**：[uv 官方安装指南](https://docs.astral.sh/uv/getting-started/installation)\n- **验证安装**：终端输入命令 `uv --version`，如果正常显示版本号，证明已经安装成功\n- **推荐理由**：uv 是目前最强的 Python 包管理工具，速度快、依赖解析准确\n\n### 🟢 Node.js 安装\n\n项目依赖 Node.js，请前往官网下载安装：\n\n- **下载地址**：https://nodejs.org/en/download/\n- **版本要求**：>= 16.0.0\n\n### 📦 Python 包安装\n\n```shell\n# 进入项目目录\ncd MediaCrawler\n\n# 使用 uv sync 命令来保证 python 版本和相关依赖包的一致性\nuv sync\n```\n\n### 🌐 浏览器驱动安装\n\n```shell\n# 安装浏览器驱动\nuv run playwright install\n```\n\n## 🚀 运行爬虫程序\n\n```shell\n# 在 config/base_config.py 查看配置项目功能，写的有中文注释\n\n# 从配置文件中读取关键词搜索相关的帖子并爬取帖子信息与评论\nuv run main.py --platform xhs --lt qrcode --type search\n\n# 从配置文件中读取指定的帖子ID列表获取指定帖子的信息与评论信息\nuv run main.py --platform xhs --lt qrcode --type detail\n\n# 打开对应APP扫二维码登录\n\n# 其他平台爬虫使用示例，执行下面的命令查看\nuv run main.py --help\n```\n\n<details>\n<summary>🖥️ <strong>WebUI 可视化操作界面</strong></summary>\n\nMediaCrawler 提供了基于 Web 的可视化操作界面，无需命令行也能轻松使用爬虫功能。\n\n#### 启动 WebUI 服务\n\n```shell\n# 启动 API 服务器（默认端口 8080）\nuv run uvicorn api.main:app --port 8080 --reload\n\n# 或者使用模块方式启动\nuv run python -m api.main\n```\n\n启动成功后，访问 `http://localhost:8080` 即可打开 WebUI 界面。\n\n#### WebUI 功能特性\n\n- 可视化配置爬虫参数（平台、登录方式、爬取类型等）\n- 实时查看爬虫运行状态和日志\n- 数据预览和导出\n\n#### 界面预览\n\n<img src=\"docs/static/images/img_8.png\" alt=\"WebUI 界面预览\">\n\n</details>\n\n<details>\n<summary>🔗 <strong>使用 Python 原生 venv 管理环境（不推荐）</strong></summary>\n\n#### 创建并激活 Python 虚拟环境\n\n> 如果是爬取抖音和知乎，需要提前安装 nodejs 环境，版本大于等于：`16` 即可\n\n```shell\n# 进入项目根目录\ncd MediaCrawler\n\n# 创建虚拟环境\n# 我的 python 版本是：3.11 requirements.txt 中的库是基于这个版本的\n# 如果是其他 python 版本，可能 requirements.txt 中的库不兼容，需自行解决\npython -m venv venv\n\n# macOS & Linux 激活虚拟环境\nsource venv/bin/activate\n\n# Windows 激活虚拟环境\nvenv\\Scripts\\activate\n```\n\n#### 安装依赖库\n\n```shell\npip install -r requirements.txt\n```\n\n#### 安装 playwright 浏览器驱动\n\n```shell\nplaywright install\n```\n\n#### 运行爬虫程序（原生环境）\n\n```shell\n# 项目默认是没有开启评论爬取模式，如需评论请在 config/base_config.py 中的 ENABLE_GET_COMMENTS 变量修改\n# 一些其他支持项，也可以在 config/base_config.py 查看功能，写的有中文注释\n\n# 从配置文件中读取关键词搜索相关的帖子并爬取帖子信息与评论\npython main.py --platform xhs --lt qrcode --type search\n\n# 从配置文件中读取指定的帖子ID列表获取指定帖子的信息与评论信息\npython main.py --platform xhs --lt qrcode --type detail\n\n# 打开对应APP扫二维码登录\n\n# 其他平台爬虫使用示例，执行下面的命令查看\npython main.py --help\n```\n\n</details>\n\n\n## 💾 数据保存\n\nMediaCrawler 支持多种数据存储方式，包括 CSV、JSON、JSONL、Excel、SQLite 和 MySQL 数据库。\n\n📖 **详细使用说明请查看：[数据存储指南](docs/data_storage_guide.md)**\n\n\n[🚀 MediaCrawlerPro 重磅发布 🚀！更多的功能，更好的架构设计！开源不易，欢迎订阅支持！](https://github.com/MediaCrawlerPro)\n\n\n## 💬 交流群组\n- **微信交流群**：[点击加入](https://nanmicoder.github.io/MediaCrawler/%E5%BE%AE%E4%BF%A1%E4%BA%A4%E6%B5%81%E7%BE%A4.html)\n- **B站账号**：[关注我](https://space.bilibili.com/434377496)，分享AI与爬虫技术知识\n\n\n## 💰 赞助商展示\n\n<a href=\"https://tikhub.io/?utm_source=github.com/NanmiCoder/MediaCrawler&utm_medium=marketing_social&utm_campaign=retargeting&utm_content=carousel_ad\">\n<img width=\"500\" src=\"docs/static/images/tikhub_banner_zh.png\">\n<br>\nTikHub.io 提供 900+ 高稳定性数据接口，覆盖 TK、DY、XHS、Y2B、Ins、X 等 14+ 海内外主流平台，支持用户、内容、商品、评论等多维度公开数据 API，并配套 4000 万+ 已清洗结构化数据集，使用邀请码 <code>cfzyejV9</code> 注册并充值，即可额外获得 $2 赠送额度。\n</a>\n\n---\n\n## 🤝 成为赞助者\n\n成为赞助者，可以将您的产品展示在这里，每天获得大量曝光！\n\n**联系方式**：\n- 微信：`relakkes`\n- 邮箱：`relakkes@gmail.com`\n---\n\n## 📚 其他\n- **常见问题**：[MediaCrawler 完整文档](https://nanmicoder.github.io/MediaCrawler/)\n- **爬虫入门教程**：[CrawlerTutorial 免费教程](https://github.com/NanmiCoder/CrawlerTutorial)\n- **新闻爬虫开源项目**：[NewsCrawlerCollection](https://github.com/NanmiCoder/NewsCrawlerCollection)\n\n\n## ⭐ Star 趋势图\n\n如果这个项目对您有帮助，请给个 ⭐ Star 支持一下，让更多的人看到 MediaCrawler！\n\n[![Star History Chart](https://api.star-history.com/svg?repos=NanmiCoder/MediaCrawler&type=Date)](https://star-history.com/#NanmiCoder/MediaCrawler&Date)\n\n\n## 📚 参考\n\n- **小红书签名仓库**：[Cloxl 的 xhs 签名仓库](https://github.com/Cloxl/xhshow)\n- **小红书客户端**：[ReaJason 的 xhs 仓库](https://github.com/ReaJason/xhs)\n- **短信转发**：[SmsForwarder 参考仓库](https://github.com/pppscn/SmsForwarder)\n- **内网穿透工具**：[ngrok 官方文档](https://ngrok.com/docs/)\n\n\n# 免责声明\n<div id=\"disclaimer\"> \n\n## 1. 项目目的与性质\n本项目（以下简称“本项目”）是作为一个技术研究与学习工具而创建的，旨在探索和学习网络数据采集技术。本项目专注于自媒体平台的数据爬取技术研究，旨在提供给学习者和研究者作为技术交流之用。\n\n## 2. 法律合规性声明\n本项目开发者（以下简称“开发者”）郑重提醒用户在下载、安装和使用本项目时，严格遵守中华人民共和国相关法律法规，包括但不限于《中华人民共和国网络安全法》、《中华人民共和国反间谍法》等所有适用的国家法律和政策。用户应自行承担一切因使用本项目而可能引起的法律责任。\n\n## 3. 使用目的限制\n本项目严禁用于任何非法目的或非学习、非研究的商业行为。本项目不得用于任何形式的非法侵入他人计算机系统，不得用于任何侵犯他人知识产权或其他合法权益的行为。用户应保证其使用本项目的目的纯属个人学习和技术研究，不得用于任何形式的非法活动。\n\n## 4. 免责声明\n开发者已尽最大努力确保本项目的正当性及安全性，但不对用户使用本项目可能引起的任何形式的直接或间接损失承担责任。包括但不限于由于使用本项目而导致的任何数据丢失、设备损坏、法律诉讼等。\n\n## 5. 知识产权声明\n本项目的知识产权归开发者所有。本项目受到著作权法和国际著作权条约以及其他知识产权法律和条约的保护。用户在遵守本声明及相关法律法规的前提下，可以下载和使用本项目。\n\n## 6. 最终解释权\n关于本项目的最终解释权归开发者所有。开发者保留随时更改或更新本免责声明的权利，恕不另行通知。\n</div>\n"
  },
  {
    "path": "README_en.md",
    "content": "# 🔥 MediaCrawler - Social Media Platform Crawler 🕷️\n\n<div align=\"center\">\n\n<a href=\"https://trendshift.io/repositories/8291\" target=\"_blank\">\n  <img src=\"https://trendshift.io/api/badge/repositories/8291\" alt=\"NanmiCoder%2FMediaCrawler | Trendshift\" style=\"width: 250px; height: 55px;\" width=\"250\" height=\"55\"/>\n</a>\n\n[![GitHub Stars](https://img.shields.io/github/stars/NanmiCoder/MediaCrawler?style=social)](https://github.com/NanmiCoder/MediaCrawler/stargazers)\n[![GitHub Forks](https://img.shields.io/github/forks/NanmiCoder/MediaCrawler?style=social)](https://github.com/NanmiCoder/MediaCrawler/network/members)\n[![GitHub Issues](https://img.shields.io/github/issues/NanmiCoder/MediaCrawler)](https://github.com/NanmiCoder/MediaCrawler/issues)\n[![GitHub Pull Requests](https://img.shields.io/github/issues-pr/NanmiCoder/MediaCrawler)](https://github.com/NanmiCoder/MediaCrawler/pulls)\n[![License](https://img.shields.io/github/license/NanmiCoder/MediaCrawler)](https://github.com/NanmiCoder/MediaCrawler/blob/main/LICENSE)\n[![中文](https://img.shields.io/badge/🇨🇳_中文-Available-blue)](README.md)\n[![English](https://img.shields.io/badge/🇺🇸_English-Current-green)](README_en.md)\n[![Español](https://img.shields.io/badge/🇪🇸_Español-Available-green)](README_es.md)\n\n</div>\n\n> **Disclaimer:**\n> \n> Please use this repository for learning purposes only ⚠️⚠️⚠️⚠️, [Web scraping illegal cases](https://github.com/HiddenStrawberry/Crawler_Illegal_Cases_In_China)  <br>\n>\n>All content in this repository is for learning and reference purposes only, and commercial use is prohibited. No person or organization may use the content of this repository for illegal purposes or infringe upon the legitimate rights and interests of others. The web scraping technology involved in this repository is only for learning and research, and may not be used for large-scale crawling of other platforms or other illegal activities. This repository assumes no legal responsibility for any legal liability arising from the use of the content of this repository. By using the content of this repository, you agree to all terms and conditions of this disclaimer.\n>\n> Click to view a more detailed disclaimer. [Click to jump](#disclaimer)\n\n## 📖 Project Introduction\n\nA powerful **multi-platform social media data collection tool** that supports crawling public information from mainstream platforms including Xiaohongshu, Douyin, Kuaishou, Bilibili, Weibo, Tieba, Zhihu, and more.\n\n### 🔧 Technical Principles\n\n- **Core Technology**: Based on [Playwright](https://playwright.dev/) browser automation framework for login and maintaining login state\n- **No JS Reverse Engineering Required**: Uses browser context environment with preserved login state to obtain signature parameters through JS expressions\n- **Advantages**: No need to reverse complex encryption algorithms, significantly lowering the technical barrier\n\n## ✨ Features\n| Platform | Keyword Search | Specific Post ID Crawling | Secondary Comments | Specific Creator Homepage | Login State Cache | IP Proxy Pool | Generate Comment Word Cloud |\n| ------ | ---------- | -------------- | -------- | -------------- | ---------- | -------- | -------------- |\n| Xiaohongshu | ✅          | ✅              | ✅        | ✅              | ✅          | ✅        | ✅              |\n| Douyin   | ✅          | ✅              | ✅        | ✅              | ✅          | ✅        | ✅              |\n| Kuaishou   | ✅          | ✅              | ✅        | ✅              | ✅          | ✅        | ✅              |\n| Bilibili   | ✅          | ✅              | ✅        | ✅              | ✅          | ✅        | ✅              |\n| Weibo   | ✅          | ✅              | ✅        | ✅              | ✅          | ✅        | ✅              |\n| Tieba   | ✅          | ✅              | ✅        | ✅              | ✅          | ✅        | ✅              |\n| Zhihu   | ✅          | ✅              | ✅        | ✅              | ✅          | ✅        | ✅              |\n\n\n<strong>MediaCrawlerPro Major Release! Open source is not easy, welcome to subscribe and support!</strong>\n\n> Focus on learning mature project architectural design, not just crawling technology. The code design philosophy of the Pro version is equally worth in-depth study!\n\n[MediaCrawlerPro](https://github.com/MediaCrawlerPro) core advantages over the open-source version:\n\n#### 🎯 Core Feature Upgrades\n- ✅ **Content Deconstruction Agent** (New feature)\n- ✅ **Resume crawling functionality** (Key feature)\n- ✅ **Multi-account + IP proxy pool support** (Key feature)\n- ✅ **Remove Playwright dependency**, easier to use\n- ✅ **Complete Linux environment support**\n\n#### 🏗️ Architectural Design Optimization\n- ✅ **Code refactoring optimization**, more readable and maintainable (decoupled JS signature logic)\n- ✅ **Enterprise-level code quality**, suitable for building large-scale crawler projects\n- ✅ **Perfect architectural design**, high scalability, greater source code learning value\n\n#### 🎁 Additional Features\n- ✅ **Social media video downloader desktop app** (suitable for learning full-stack development)\n- ✅ **Multi-platform homepage feed recommendations** (HomeFeed)\n- [ ] **AI Agent based on comment analysis is under development 🚀🚀**\n\nClick to view: [MediaCrawlerPro Project Homepage](https://github.com/MediaCrawlerPro) for more information\n\n## 🚀 Quick Start\n\n> 💡 **Open source is not easy, if this project helps you, please give a ⭐ Star to support!**\n\n## 📋 Prerequisites\n\n### 🚀 uv Installation (Recommended)\n\nBefore proceeding with the next steps, please ensure that uv is installed on your computer:\n\n- **Installation Guide**: [uv Official Installation Guide](https://docs.astral.sh/uv/getting-started/installation)\n- **Verify Installation**: Enter the command `uv --version` in the terminal. If the version number is displayed normally, the installation was successful\n- **Recommendation Reason**: uv is currently the most powerful Python package management tool, with fast speed and accurate dependency resolution\n\n### 🟢 Node.js Installation\n\nThe project depends on Node.js, please download and install from the official website:\n\n- **Download Link**: https://nodejs.org/en/download/\n- **Version Requirement**: >= 16.0.0\n\n### 📦 Python Package Installation\n\n```shell\n# Enter project directory\ncd MediaCrawler\n\n# Use uv sync command to ensure consistency of python version and related dependency packages\nuv sync\n```\n\n### 🌐 Browser Driver Installation\n\n```shell\n# Install browser driver\nuv run playwright install\n```\n\n> **💡 Tip**: MediaCrawler now supports using playwright to connect to your local Chrome browser, solving some issues caused by Webdriver.\n>\n> Currently, `xhs` and `dy` are available using CDP mode to connect to local browsers. If needed, check the configuration items in `config/base_config.py`.\n\n## 🚀 Run Crawler Program\n\n```shell\n# The project does not enable comment crawling mode by default. If you need comments, please modify the ENABLE_GET_COMMENTS variable in config/base_config.py\n# Other supported options can also be viewed in config/base_config.py with Chinese comments\n\n# Read keywords from configuration file to search related posts and crawl post information and comments\nuv run main.py --platform xhs --lt qrcode --type search\n\n# Read specified post ID list from configuration file to get information and comment information of specified posts\nuv run main.py --platform xhs --lt qrcode --type detail\n\n# Open corresponding APP to scan QR code for login\n\n# For other platform crawler usage examples, execute the following command to view\nuv run main.py --help\n```\n\n## WebUI Support\n\n<details>\n<summary>🖥️ <strong>WebUI Visual Operation Interface</strong></summary>\n\nMediaCrawler provides a web-based visual operation interface, allowing you to easily use crawler features without command line.\n\n#### Start WebUI Service\n\n```shell\n# Start API server (default port 8080)\nuv run uvicorn api.main:app --port 8080 --reload\n\n# Or start using module method\nuv run python -m api.main\n```\n\nAfter successful startup, visit `http://localhost:8080` to open the WebUI interface.\n\n#### WebUI Features\n\n- Visualize crawler parameter configuration (platform, login method, crawling type, etc.)\n- Real-time view of crawler running status and logs\n- Data preview and export\n\n#### Interface Preview\n\n<img src=\"docs/static/images/img_8.png\" alt=\"WebUI Interface Preview\">\n\n</details>\n\n<details>\n<summary>🔗 <strong>Using Python native venv environment management (Not recommended)</strong></summary>\n\n#### Create and activate Python virtual environment\n\n> If crawling Douyin and Zhihu, you need to install nodejs environment in advance, version greater than or equal to: `16`\n\n```shell\n# Enter project root directory\ncd MediaCrawler\n\n# Create virtual environment\n# My python version is: 3.9.6, the libraries in requirements.txt are based on this version\n# If using other python versions, the libraries in requirements.txt may not be compatible, please resolve on your own\npython -m venv venv\n\n# macOS & Linux activate virtual environment\nsource venv/bin/activate\n\n# Windows activate virtual environment\nvenv\\Scripts\\activate\n```\n\n#### Install dependency libraries\n\n```shell\npip install -r requirements.txt\n```\n\n#### Install playwright browser driver\n\n```shell\nplaywright install\n```\n\n#### Run crawler program (native environment)\n\n```shell\n# The project does not enable comment crawling mode by default. If you need comments, please modify the ENABLE_GET_COMMENTS variable in config/base_config.py\n# Other supported options can also be viewed in config/base_config.py with Chinese comments\n\n# Read keywords from configuration file to search related posts and crawl post information and comments\npython main.py --platform xhs --lt qrcode --type search\n\n# Read specified post ID list from configuration file to get information and comment information of specified posts\npython main.py --platform xhs --lt qrcode --type detail\n\n# Open corresponding APP to scan QR code for login\n\n# For other platform crawler usage examples, execute the following command to view\npython main.py --help\n```\n\n</details>\n\n\n## 💾 Data Storage\n\nMediaCrawler supports multiple data storage methods, including CSV, JSON, JSONL, Excel, SQLite, and MySQL databases.\n\n📖 **For detailed usage instructions, please see: [Data Storage Guide](docs/data_storage_guide.md)**\n\n---\n\n[🚀 MediaCrawlerPro Major Release 🚀! More features, better architectural design!](https://github.com/MediaCrawlerPro)\n\n### 💬 Discussion Groups\n- **WeChat Discussion Group**: [Click to join](https://nanmicoder.github.io/MediaCrawler/%E5%BE%AE%E4%BF%A1%E4%BA%A4%E6%B5%81%E7%BE%A4.html)\n- **Bilibili Account**: [Follow me](https://space.bilibili.com/434377496), sharing AI and crawler technology knowledge\n\n\n### 💰 Sponsor Display\n\n<a href=\"https://tikhub.io/?utm_source=github.com/NanmiCoder/MediaCrawler&utm_medium=marketing_social&utm_campaign=retargeting&utm_content=carousel_ad\">\n<img width=\"500\" src=\"docs/static/images/tikhub_banner_zh.png\">\n<br>\nTikHub.io provides 900+ highly stable data interfaces, covering 14+ mainstream domestic and international platforms including TK, DY, XHS, Y2B, Ins, X, etc. Supports multi-dimensional public data APIs for users, content, products, comments, etc., with 40M+ cleaned structured datasets. Use invitation code <code>cfzyejV9</code> to register and recharge, and get an additional $2 bonus.\n</a>\n\n---\n\n### 🤝 Become a Sponsor\n\nBecome a sponsor and showcase your product here, getting massive exposure daily!\n\n**Contact Information**:\n- WeChat: `relakkes`\n- Email: `relakkes@gmail.com`\n---\n\n### 📚 Other\n- **FAQ**: [MediaCrawler Complete Documentation](https://nanmicoder.github.io/MediaCrawler/)\n- **Crawler Beginner Tutorial**: [CrawlerTutorial Free Tutorial](https://github.com/NanmiCoder/CrawlerTutorial)\n- **News Crawler Open Source Project**: [NewsCrawlerCollection](https://github.com/NanmiCoder/NewsCrawlerCollection)\n\n\n## ⭐ Star Trend Chart\n\nIf this project helps you, please give a ⭐ Star to support and let more people see MediaCrawler!\n\n[![Star History Chart](https://api.star-history.com/svg?repos=NanmiCoder/MediaCrawler&type=Date)](https://star-history.com/#NanmiCoder/MediaCrawler&Date)\n\n\n## 📚 References\n\n- **Xiaohongshu Signature Repository**: [Cloxl's xhs signature repository](https://github.com/Cloxl/xhshow)\n- **Xiaohongshu Client**: [ReaJason's xhs repository](https://github.com/ReaJason/xhs)\n- **SMS Forwarding**: [SmsForwarder reference repository](https://github.com/pppscn/SmsForwarder)\n- **Intranet Penetration Tool**: [ngrok official documentation](https://ngrok.com/docs/)\n\n\n# Disclaimer\n<div id=\"disclaimer\">\n\n## 1. Project Purpose and Nature\nThis project (hereinafter referred to as \"this project\") was created as a technical research and learning tool, aimed at exploring and learning network data collection technologies. This project focuses on research of data crawling technologies for social media platforms, intended to provide learners and researchers with technical exchange purposes.\n\n## 2. Legal Compliance Statement\nThe project developer (hereinafter referred to as \"developer\") solemnly reminds users to strictly comply with relevant laws and regulations of the People's Republic of China when downloading, installing and using this project, including but not limited to the \"Cybersecurity Law of the People's Republic of China\", \"Counter-Espionage Law of the People's Republic of China\" and all applicable national laws and policies. Users shall bear all legal responsibilities that may arise from using this project.\n\n## 3. Usage Purpose Restrictions\nThis project is strictly prohibited from being used for any illegal purposes or non-learning, non-research commercial activities. This project may not be used for any form of illegal intrusion into other people's computer systems, nor may it be used for any activities that infringe upon others' intellectual property rights or other legitimate rights and interests. Users should ensure that their use of this project is purely for personal learning and technical research, and may not be used for any form of illegal activities.\n\n## 4. Disclaimer\nThe developer has made every effort to ensure the legitimacy and security of this project, but assumes no responsibility for any form of direct or indirect losses that may arise from users' use of this project. Including but not limited to any data loss, equipment damage, legal litigation, etc. caused by using this project.\n\n## 5. Intellectual Property Statement\nThe intellectual property rights of this project belong to the developer. This project is protected by copyright law and international copyright treaties as well as other intellectual property laws and treaties. Users may download and use this project under the premise of complying with this statement and relevant laws and regulations.\n\n## 6. Final Interpretation Rights\nThe developer has the final interpretation rights regarding this project. The developer reserves the right to change or update this disclaimer at any time without further notice.\n</div>\n\n\n## 🙏 Acknowledgments\n\n### JetBrains Open Source License Support\n\nThanks to JetBrains for providing free open source license support for this project!\n\n<a href=\"https://www.jetbrains.com/?from=MediaCrawler\">\n    <img src=\"https://www.jetbrains.com/company/brand/img/jetbrains_logo.png\" width=\"100\" alt=\"JetBrains\" />\n</a>\n"
  },
  {
    "path": "README_es.md",
    "content": "# 🔥 MediaCrawler - Rastreador de Plataformas de Redes Sociales 🕷️\n\n<div align=\"center\">\n\n<a href=\"https://trendshift.io/repositories/8291\" target=\"_blank\">\n  <img src=\"https://trendshift.io/api/badge/repositories/8291\" alt=\"NanmiCoder%2FMediaCrawler | Trendshift\" style=\"width: 250px; height: 55px;\" width=\"250\" height=\"55\"/>\n</a>\n\n[![GitHub Stars](https://img.shields.io/github/stars/NanmiCoder/MediaCrawler?style=social)](https://github.com/NanmiCoder/MediaCrawler/stargazers)\n[![GitHub Forks](https://img.shields.io/github/forks/NanmiCoder/MediaCrawler?style=social)](https://github.com/NanmiCoder/MediaCrawler/network/members)\n[![GitHub Issues](https://img.shields.io/github/issues/NanmiCoder/MediaCrawler)](https://github.com/NanmiCoder/MediaCrawler/issues)\n[![GitHub Pull Requests](https://img.shields.io/github/issues-pr/NanmiCoder/MediaCrawler)](https://github.com/NanmiCoder/MediaCrawler/pulls)\n[![License](https://img.shields.io/github/license/NanmiCoder/MediaCrawler)](https://github.com/NanmiCoder/MediaCrawler/blob/main/LICENSE)\n[![中文](https://img.shields.io/badge/🇨🇳_中文-Available-blue)](README.md)\n[![English](https://img.shields.io/badge/🇺🇸_English-Available-green)](README_en.md)\n[![Español](https://img.shields.io/badge/🇪🇸_Español-Current-green)](README_es.md)\n\n</div>\n\n> **Descargo de responsabilidad:**\n> \n> Por favor, utilice este repositorio únicamente con fines de aprendizaje ⚠️⚠️⚠️⚠️, [Casos ilegales de web scraping](https://github.com/HiddenStrawberry/Crawler_Illegal_Cases_In_China)  <br>\n>\n>Todo el contenido de este repositorio es únicamente para fines de aprendizaje y referencia, y está prohibido el uso comercial. Ninguna persona u organización puede usar el contenido de este repositorio para propósitos ilegales o infringir los derechos e intereses legítimos de otros. La tecnología de web scraping involucrada en este repositorio es solo para aprendizaje e investigación, y no puede ser utilizada para rastreo a gran escala de otras plataformas u otras actividades ilegales. Este repositorio no asume ninguna responsabilidad legal por cualquier responsabilidad legal que surja del uso del contenido de este repositorio. Al usar el contenido de este repositorio, usted acepta todos los términos y condiciones de este descargo de responsabilidad.\n>\n> Haga clic para ver un descargo de responsabilidad más detallado. [Haga clic para saltar](#disclaimer)\n\n## 📖 Introducción del Proyecto\n\nUna poderosa **herramienta de recolección de datos de redes sociales multiplataforma** que soporta el rastreo de información pública de plataformas principales incluyendo Xiaohongshu, Douyin, Kuaishou, Bilibili, Weibo, Tieba, Zhihu, y más.\n\n### 🔧 Principios Técnicos\n\n- **Tecnología Central**: Basado en el framework de automatización de navegador [Playwright](https://playwright.dev/) para login y mantenimiento del estado de login\n- **No Requiere Ingeniería Inversa de JS**: Utiliza el entorno de contexto del navegador con estado de login preservado para obtener parámetros de firma a través de expresiones JS\n- **Ventajas**: No necesita hacer ingeniería inversa de algoritmos de encriptación complejos, reduciendo significativamente la barrera técnica\n\n## ✨ Características\n| Plataforma | Búsqueda por Palabras Clave | Rastreo de ID de Publicación Específica | Comentarios Secundarios | Página de Inicio de Creador Específico | Caché de Estado de Login | Pool de Proxy IP | Generar Nube de Palabras de Comentarios |\n| ------ | ---------- | -------------- | -------- | -------------- | ---------- | -------- | -------------- |\n| Xiaohongshu | ✅          | ✅              | ✅        | ✅              | ✅          | ✅        | ✅              |\n| Douyin   | ✅          | ✅              | ✅        | ✅              | ✅          | ✅        | ✅              |\n| Kuaishou   | ✅          | ✅              | ✅        | ✅              | ✅          | ✅        | ✅              |\n| Bilibili   | ✅          | ✅              | ✅        | ✅              | ✅          | ✅        | ✅              |\n| Weibo   | ✅          | ✅              | ✅        | ✅              | ✅          | ✅        | ✅              |\n| Tieba   | ✅          | ✅              | ✅        | ✅              | ✅          | ✅        | ✅              |\n| Zhihu   | ✅          | ✅              | ✅        | ✅              | ✅          | ✅        | ✅              |\n\n\n<strong>¡Lanzamiento Mayor de MediaCrawlerPro! ¡El código abierto no es fácil, bienvenido a suscribirse y apoyar!</strong>\n\n> Enfócate en aprender el diseño arquitectónico de proyectos maduros, no solo tecnología de rastreo. ¡La filosofía de diseño de código de la versión Pro también vale la pena estudiar en profundidad!\n\n[MediaCrawlerPro](https://github.com/MediaCrawlerPro) ventajas principales sobre la versión de código abierto:\n\n#### 🎯 Actualizaciones de Características Principales\n- ✅ **Agente de Deconstrucción de Contenido** (Nueva función)\n- ✅ **Funcionalidad de reanudación de rastreo** (Característica clave)\n- ✅ **Soporte de múltiples cuentas + pool de proxy IP** (Característica clave)\n- ✅ **Eliminar dependencia de Playwright**, más fácil de usar\n- ✅ **Soporte completo de entorno Linux**\n\n#### 🏗️ Optimización de Diseño Arquitectónico\n- ✅ **Optimización de refactorización de código**, más legible y mantenible (lógica de firma JS desacoplada)\n- ✅ **Calidad de código de nivel empresarial**, adecuado para construir proyectos de rastreo a gran escala\n- ✅ **Diseño arquitectónico perfecto**, alta escalabilidad, mayor valor de aprendizaje del código fuente\n\n#### 🎁 Características Adicionales\n- ✅ **Aplicación de escritorio descargadora de videos de redes sociales** (adecuada para aprender desarrollo full-stack)\n- ✅ **Recomendaciones de feed de página de inicio multiplataforma** (HomeFeed)\n- [ ] **Agente AI basado en análisis de comentarios está en desarrollo 🚀🚀**\n\nHaga clic para ver: [Página de Inicio del Proyecto MediaCrawlerPro](https://github.com/MediaCrawlerPro) para más información\n\n## 🚀 Inicio Rápido\n\n> 💡 **¡El código abierto no es fácil, si este proyecto te ayuda, por favor da una ⭐ Estrella para apoyar!**\n\n## 📋 Prerrequisitos\n\n### 🚀 Instalación de uv (Recomendado)\n\nAntes de proceder con los siguientes pasos, por favor asegúrese de que uv esté instalado en su computadora:\n\n- **Guía de Instalación**: [Guía Oficial de Instalación de uv](https://docs.astral.sh/uv/getting-started/installation)\n- **Verificar Instalación**: Ingrese el comando `uv --version` en la terminal. Si el número de versión se muestra normalmente, la instalación fue exitosa\n- **Razón de Recomendación**: uv es actualmente la herramienta de gestión de paquetes Python más poderosa, con velocidad rápida y resolución de dependencias precisa\n\n### 🟢 Instalación de Node.js\n\nEl proyecto depende de Node.js, por favor descargue e instale desde el sitio web oficial:\n\n- **Enlace de Descarga**: https://nodejs.org/en/download/\n- **Requisito de Versión**: >= 16.0.0\n\n### 📦 Instalación de Paquetes Python\n\n```shell\n# Entrar al directorio del proyecto\ncd MediaCrawler\n\n# Usar el comando uv sync para asegurar la consistencia de la versión de python y paquetes de dependencias relacionados\nuv sync\n```\n\n### 🌐 Instalación de Controlador de Navegador\n\n```shell\n# Instalar controlador de navegador\nuv run playwright install\n```\n\n> **💡 Consejo**: MediaCrawler ahora soporta usar playwright para conectarse a su navegador Chrome local, resolviendo algunos problemas causados por Webdriver.\n>\n> Actualmente, `xhs` y `dy` están disponibles usando el modo CDP para conectarse a navegadores locales. Si es necesario, verifique los elementos de configuración en `config/base_config.py`.\n\n## 🚀 Ejecutar Programa Rastreador\n\n```shell\n# El proyecto no habilita el modo de rastreo de comentarios por defecto. Si necesita comentarios, por favor modifique la variable ENABLE_GET_COMMENTS en config/base_config.py\n# Otras opciones soportadas también pueden verse en config/base_config.py con comentarios en chino\n\n# Leer palabras clave del archivo de configuración para buscar publicaciones relacionadas y rastrear información de publicaciones y comentarios\nuv run main.py --platform xhs --lt qrcode --type search\n\n# Leer lista de ID de publicaciones específicas del archivo de configuración para obtener información e información de comentarios de publicaciones específicas\nuv run main.py --platform xhs --lt qrcode --type detail\n\n# Abrir la APP correspondiente para escanear código QR para login\n\n# Para ejemplos de uso de rastreador de otras plataformas, ejecute el siguiente comando para ver\nuv run main.py --help\n```\n\n## Soporte WebUI\n\n<details>\n<summary>🖥️ <strong>Interfaz de Operación Visual WebUI</strong></summary>\n\nMediaCrawler proporciona una interfaz de operación visual basada en web, permitiéndole usar fácilmente las funciones del rastreador sin línea de comandos.\n\n#### Iniciar Servicio WebUI\n\n```shell\n# Iniciar servidor API (puerto predeterminado 8080)\nuv run uvicorn api.main:app --port 8080 --reload\n\n# O iniciar usando método de módulo\nuv run python -m api.main\n```\n\nDespués de iniciar exitosamente, visite `http://localhost:8080` para abrir la interfaz WebUI.\n\n#### Características de WebUI\n\n- Configuración visual de parámetros del rastreador (plataforma, método de login, tipo de rastreo, etc.)\n- Vista en tiempo real del estado de ejecución del rastreador y logs\n- Vista previa y exportación de datos\n\n#### Vista Previa de la Interfaz\n\n<img src=\"docs/static/images/img_8.png\" alt=\"Vista Previa de Interfaz WebUI\">\n\n</details>\n\n<details>\n<summary>🔗 <strong>Usando gestión de entorno venv nativo de Python (No recomendado)</strong></summary>\n\n#### Crear y activar entorno virtual de Python\n\n> Si rastrea Douyin y Zhihu, necesita instalar el entorno nodejs con anticipación, versión mayor o igual a: `16`\n\n```shell\n# Entrar al directorio raíz del proyecto\ncd MediaCrawler\n\n# Crear entorno virtual\n# Mi versión de python es: 3.9.6, las librerías en requirements.txt están basadas en esta versión\n# Si usa otras versiones de python, las librerías en requirements.txt pueden no ser compatibles, por favor resuelva por su cuenta\npython -m venv venv\n\n# macOS & Linux activar entorno virtual\nsource venv/bin/activate\n\n# Windows activar entorno virtual\nvenv\\Scripts\\activate\n```\n\n#### Instalar librerías de dependencias\n\n```shell\npip install -r requirements.txt\n```\n\n#### Instalar controlador de navegador playwright\n\n```shell\nplaywright install\n```\n\n#### Ejecutar programa rastreador (entorno nativo)\n\n```shell\n# El proyecto no habilita el modo de rastreo de comentarios por defecto. Si necesita comentarios, por favor modifique la variable ENABLE_GET_COMMENTS en config/base_config.py\n# Otras opciones soportadas también pueden verse en config/base_config.py con comentarios en chino\n\n# Leer palabras clave del archivo de configuración para buscar publicaciones relacionadas y rastrear información de publicaciones y comentarios\npython main.py --platform xhs --lt qrcode --type search\n\n# Leer lista de ID de publicaciones específicas del archivo de configuración para obtener información e información de comentarios de publicaciones específicas\npython main.py --platform xhs --lt qrcode --type detail\n\n# Abrir la APP correspondiente para escanear código QR para login\n\n# Para ejemplos de uso de rastreador de otras plataformas, ejecute el siguiente comando para ver\npython main.py --help\n```\n\n</details>\n\n\n## 💾 Almacenamiento de Datos\n\nMediaCrawler soporta múltiples métodos de almacenamiento de datos, incluyendo CSV, JSON, JSONL, Excel, SQLite y bases de datos MySQL.\n\n📖 **Para instrucciones de uso detalladas, por favor vea: [Guía de Almacenamiento de Datos](docs/data_storage_guide.md)**\n\n\n[🚀 ¡Lanzamiento Mayor de MediaCrawlerPro 🚀! ¡Más características, mejor diseño arquitectónico!](https://github.com/MediaCrawlerPro)\n\n\n### 💬 Grupos de Discusión\n- **Grupo de Discusión WeChat**: [Haga clic para unirse](https://nanmicoder.github.io/MediaCrawler/%E5%BE%AE%E4%BF%A1%E4%BA%A4%E6%B5%81%E7%BE%A4.html)\n- **Cuenta de Bilibili**: [Sígueme](https://space.bilibili.com/434377496), compartiendo conocimientos de tecnología de IA y rastreo\n\n\n### 💰 Exhibición de Patrocinadores\n\n<a href=\"https://tikhub.io/?utm_source=github.com/NanmiCoder/MediaCrawler&utm_medium=marketing_social&utm_campaign=retargeting&utm_content=carousel_ad\">\n<img width=\"500\" src=\"docs/static/images/tikhub_banner_zh.png\">\n<br>\nTikHub.io proporciona 900+ interfaces de datos altamente estables, cubriendo 14+ plataformas principales nacionales e internacionales incluyendo TK, DY, XHS, Y2B, Ins, X, etc. Soporta APIs de datos públicos multidimensionales para usuarios, contenido, productos, comentarios, etc., con 40M+ conjuntos de datos estructurados limpios. Use el código de invitación <code>cfzyejV9</code> para registrarse y recargar, y obtenga $2 adicionales de bonificación.\n</a>\n\n---\n\n### 🤝 Conviértase en Patrocinador\n\n¡Conviértase en patrocinador y muestre su producto aquí, obteniendo exposición masiva diariamente!\n\n**Información de Contacto**:\n- WeChat: `relakkes`\n- Email: `relakkes@gmail.com`\n---\n\n### 📚 Otros\n- **Preguntas Frecuentes**: [Documentación Completa de MediaCrawler](https://nanmicoder.github.io/MediaCrawler/)\n- **Tutorial de Rastreador para Principiantes**: [Tutorial Gratuito CrawlerTutorial](https://github.com/NanmiCoder/CrawlerTutorial)\n- **Proyecto de Código Abierto de Rastreador de Noticias**: [NewsCrawlerCollection](https://github.com/NanmiCoder/NewsCrawlerCollection)\n\n\n## ⭐ Gráfico de Tendencia de Estrellas\n\n¡Si este proyecto te ayuda, por favor da una ⭐ Estrella para apoyar y que más personas vean MediaCrawler!\n\n[![Star History Chart](https://api.star-history.com/svg?repos=NanmiCoder/MediaCrawler&type=Date)](https://star-history.com/#NanmiCoder/MediaCrawler&Date)\n\n\n## 📚 Referencias\n\n- **Repositorio de Firma Xiaohongshu**: [Repositorio de firma xhs de Cloxl](https://github.com/Cloxl/xhshow)\n- **Cliente Xiaohongshu**: [Repositorio xhs de ReaJason](https://github.com/ReaJason/xhs)\n- **Reenvío de SMS**: [Repositorio de referencia SmsForwarder](https://github.com/pppscn/SmsForwarder)\n- **Herramienta de Penetración de Intranet**: [Documentación oficial de ngrok](https://ngrok.com/docs/)\n\n\n# Descargo de Responsabilidad\n<div id=\"disclaimer\">\n\n## 1. Propósito y Naturaleza del Proyecto\nEste proyecto (en adelante denominado \"este proyecto\") fue creado como una herramienta de investigación técnica y aprendizaje, con el objetivo de explorar y aprender tecnologías de recolección de datos de red. Este proyecto se enfoca en la investigación de tecnologías de rastreo de datos para plataformas de redes sociales, destinado a proporcionar a estudiantes e investigadores propósitos de intercambio técnico.\n\n## 2. Declaración de Cumplimiento Legal\nEl desarrollador del proyecto (en adelante denominado \"desarrollador\") recuerda solemnemente a los usuarios que cumplan estrictamente con las leyes y regulaciones relevantes de la República Popular China al descargar, instalar y usar este proyecto, incluyendo pero no limitado a la \"Ley de Ciberseguridad de la República Popular China\", \"Ley de Contraespionaje de la República Popular China\" y todas las leyes y políticas nacionales aplicables. Los usuarios deberán asumir todas las responsabilidades legales que puedan surgir del uso de este proyecto.\n\n## 3. Restricciones de Propósito de Uso\nEste proyecto está estrictamente prohibido de ser utilizado para cualquier propósito ilegal o actividades comerciales que no sean de aprendizaje o investigación. Este proyecto no puede ser utilizado para ninguna forma de intrusión ilegal en sistemas informáticos de otras personas, ni puede ser utilizado para cualquier actividad que infrinja los derechos de propiedad intelectual de otros u otros derechos e intereses legítimos. Los usuarios deben asegurar que su uso de este proyecto sea puramente para aprendizaje personal e investigación técnica, y no puede ser utilizado para ninguna forma de actividades ilegales.\n\n## 4. Descargo de Responsabilidad\nEl desarrollador ha hecho todos los esfuerzos para asegurar la legitimidad y seguridad de este proyecto, pero no asume responsabilidad por ninguna forma de pérdidas directas o indirectas que puedan surgir del uso de este proyecto por parte de los usuarios. Incluyendo pero no limitado a cualquier pérdida de datos, daño de equipos, litigios legales, etc. causados por el uso de este proyecto.\n\n## 5. Declaración de Propiedad Intelectual\nLos derechos de propiedad intelectual de este proyecto pertenecen al desarrollador. Este proyecto está protegido por la ley de derechos de autor y tratados internacionales de derechos de autor, así como otras leyes y tratados de propiedad intelectual. Los usuarios pueden descargar y usar este proyecto bajo la premisa de cumplir con esta declaración y las leyes y regulaciones relevantes.\n\n## 6. Derechos de Interpretación Final\nEl desarrollador tiene los derechos de interpretación final con respecto a este proyecto. El desarrollador se reserva el derecho de cambiar o actualizar este descargo de responsabilidad en cualquier momento sin previo aviso.\n</div>\n\n\n## 🙏 Agradecimientos\n\n### Soporte de Licencia de Código Abierto de JetBrains\n\n¡Gracias a JetBrains por proporcionar soporte de licencia de código abierto gratuito para este proyecto!\n\n<a href=\"https://www.jetbrains.com/?from=MediaCrawler\">\n    <img src=\"https://www.jetbrains.com/company/brand/img/jetbrains_logo.png\" width=\"100\" alt=\"JetBrains\" />\n</a>\n"
  },
  {
    "path": "api/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/api/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# WebUI API Module for MediaCrawler\n"
  },
  {
    "path": "api/main.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/api/main.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\"\"\"\nMediaCrawler WebUI API Server\nStart command: uvicorn api.main:app --port 8080 --reload\nOr: python -m api.main\n\"\"\"\nimport asyncio\nimport os\nimport subprocess\nimport uvicorn\nfrom fastapi import FastAPI\nfrom fastapi.middleware.cors import CORSMiddleware\nfrom fastapi.staticfiles import StaticFiles\nfrom fastapi.responses import FileResponse\n\nfrom .routers import crawler_router, data_router, websocket_router\n\napp = FastAPI(\n    title=\"MediaCrawler WebUI API\",\n    description=\"API for controlling MediaCrawler from WebUI\",\n    version=\"1.0.0\"\n)\n\n# Get webui static files directory\nWEBUI_DIR = os.path.join(os.path.dirname(__file__), \"webui\")\n\n# CORS configuration - allow frontend dev server access\napp.add_middleware(\n    CORSMiddleware,\n    allow_origins=[\n        \"http://localhost:5173\",  # Vite dev server\n        \"http://localhost:3000\",  # Backup port\n        \"http://127.0.0.1:5173\",\n        \"http://127.0.0.1:3000\",\n    ],\n    allow_credentials=True,\n    allow_methods=[\"*\"],\n    allow_headers=[\"*\"],\n)\n\n# Register routers\napp.include_router(crawler_router, prefix=\"/api\")\napp.include_router(data_router, prefix=\"/api\")\napp.include_router(websocket_router, prefix=\"/api\")\n\n\n@app.get(\"/\")\nasync def serve_frontend():\n    \"\"\"Return frontend page\"\"\"\n    index_path = os.path.join(WEBUI_DIR, \"index.html\")\n    if os.path.exists(index_path):\n        return FileResponse(index_path)\n    return {\n        \"message\": \"MediaCrawler WebUI API\",\n        \"version\": \"1.0.0\",\n        \"docs\": \"/docs\",\n        \"note\": \"WebUI not found, please build it first: cd webui && npm run build\"\n    }\n\n\n@app.get(\"/api/health\")\nasync def health_check():\n    return {\"status\": \"ok\"}\n\n\n@app.get(\"/api/env/check\")\nasync def check_environment():\n    \"\"\"Check if MediaCrawler environment is configured correctly\"\"\"\n    try:\n        # Run uv run main.py --help command to check environment\n        process = await asyncio.create_subprocess_exec(\n            \"uv\", \"run\", \"main.py\", \"--help\",\n            stdout=subprocess.PIPE,\n            stderr=subprocess.PIPE,\n            cwd=\".\"  # Project root directory\n        )\n        stdout, stderr = await asyncio.wait_for(\n            process.communicate(),\n            timeout=30.0  # 30 seconds timeout\n        )\n\n        if process.returncode == 0:\n            return {\n                \"success\": True,\n                \"message\": \"MediaCrawler environment configured correctly\",\n                \"output\": stdout.decode(\"utf-8\", errors=\"ignore\")[:500]  # Truncate to first 500 characters\n            }\n        else:\n            error_msg = stderr.decode(\"utf-8\", errors=\"ignore\") or stdout.decode(\"utf-8\", errors=\"ignore\")\n            return {\n                \"success\": False,\n                \"message\": \"Environment check failed\",\n                \"error\": error_msg[:500]\n            }\n    except asyncio.TimeoutError:\n        return {\n            \"success\": False,\n            \"message\": \"Environment check timeout\",\n            \"error\": \"Command execution exceeded 30 seconds\"\n        }\n    except FileNotFoundError:\n        return {\n            \"success\": False,\n            \"message\": \"uv command not found\",\n            \"error\": \"Please ensure uv is installed and configured in system PATH\"\n        }\n    except Exception as e:\n        return {\n            \"success\": False,\n            \"message\": \"Environment check error\",\n            \"error\": str(e)\n        }\n\n\n@app.get(\"/api/config/platforms\")\nasync def get_platforms():\n    \"\"\"Get list of supported platforms\"\"\"\n    return {\n        \"platforms\": [\n            {\"value\": \"xhs\", \"label\": \"Xiaohongshu\", \"icon\": \"book-open\"},\n            {\"value\": \"dy\", \"label\": \"Douyin\", \"icon\": \"music\"},\n            {\"value\": \"ks\", \"label\": \"Kuaishou\", \"icon\": \"video\"},\n            {\"value\": \"bili\", \"label\": \"Bilibili\", \"icon\": \"tv\"},\n            {\"value\": \"wb\", \"label\": \"Weibo\", \"icon\": \"message-circle\"},\n            {\"value\": \"tieba\", \"label\": \"Baidu Tieba\", \"icon\": \"messages-square\"},\n            {\"value\": \"zhihu\", \"label\": \"Zhihu\", \"icon\": \"help-circle\"},\n        ]\n    }\n\n\n@app.get(\"/api/config/options\")\nasync def get_config_options():\n    \"\"\"Get all configuration options\"\"\"\n    return {\n        \"login_types\": [\n            {\"value\": \"qrcode\", \"label\": \"QR Code Login\"},\n            {\"value\": \"cookie\", \"label\": \"Cookie Login\"},\n        ],\n        \"crawler_types\": [\n            {\"value\": \"search\", \"label\": \"Search Mode\"},\n            {\"value\": \"detail\", \"label\": \"Detail Mode\"},\n            {\"value\": \"creator\", \"label\": \"Creator Mode\"},\n        ],\n        \"save_options\": [\n            {\"value\": \"jsonl\", \"label\": \"JSONL File\"},\n            {\"value\": \"json\", \"label\": \"JSON File\"},\n            {\"value\": \"csv\", \"label\": \"CSV File\"},\n            {\"value\": \"excel\", \"label\": \"Excel File\"},\n            {\"value\": \"sqlite\", \"label\": \"SQLite Database\"},\n            {\"value\": \"db\", \"label\": \"MySQL Database\"},\n            {\"value\": \"mongodb\", \"label\": \"MongoDB Database\"},\n        ],\n    }\n\n\n# Mount static resources - must be placed after all routes\nif os.path.exists(WEBUI_DIR):\n    assets_dir = os.path.join(WEBUI_DIR, \"assets\")\n    if os.path.exists(assets_dir):\n        app.mount(\"/assets\", StaticFiles(directory=assets_dir), name=\"assets\")\n    # Mount logos directory\n    logos_dir = os.path.join(WEBUI_DIR, \"logos\")\n    if os.path.exists(logos_dir):\n        app.mount(\"/logos\", StaticFiles(directory=logos_dir), name=\"logos\")\n    # Mount other static files (e.g., vite.svg)\n    app.mount(\"/static\", StaticFiles(directory=WEBUI_DIR), name=\"webui-static\")\n\n\nif __name__ == \"__main__\":\n    uvicorn.run(app, host=\"0.0.0.0\", port=8080)\n"
  },
  {
    "path": "api/routers/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/api/routers/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\nfrom .crawler import router as crawler_router\nfrom .data import router as data_router\nfrom .websocket import router as websocket_router\n\n__all__ = [\"crawler_router\", \"data_router\", \"websocket_router\"]\n"
  },
  {
    "path": "api/routers/crawler.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/api/routers/crawler.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\nfrom fastapi import APIRouter, HTTPException\n\nfrom ..schemas import CrawlerStartRequest, CrawlerStatusResponse\nfrom ..services import crawler_manager\n\nrouter = APIRouter(prefix=\"/crawler\", tags=[\"crawler\"])\n\n\n@router.post(\"/start\")\nasync def start_crawler(request: CrawlerStartRequest):\n    \"\"\"Start crawler task\"\"\"\n    success = await crawler_manager.start(request)\n    if not success:\n        # Handle concurrent/duplicate requests: if process is already running, return 400 instead of 500\n        if crawler_manager.process and crawler_manager.process.poll() is None:\n            raise HTTPException(status_code=400, detail=\"Crawler is already running\")\n        raise HTTPException(status_code=500, detail=\"Failed to start crawler\")\n\n    return {\"status\": \"ok\", \"message\": \"Crawler started successfully\"}\n\n\n@router.post(\"/stop\")\nasync def stop_crawler():\n    \"\"\"Stop crawler task\"\"\"\n    success = await crawler_manager.stop()\n    if not success:\n        # Handle concurrent/duplicate requests: if process already exited/doesn't exist, return 400 instead of 500\n        if not crawler_manager.process or crawler_manager.process.poll() is not None:\n            raise HTTPException(status_code=400, detail=\"No crawler is running\")\n        raise HTTPException(status_code=500, detail=\"Failed to stop crawler\")\n\n    return {\"status\": \"ok\", \"message\": \"Crawler stopped successfully\"}\n\n\n@router.get(\"/status\", response_model=CrawlerStatusResponse)\nasync def get_crawler_status():\n    \"\"\"Get crawler status\"\"\"\n    return crawler_manager.get_status()\n\n\n@router.get(\"/logs\")\nasync def get_logs(limit: int = 100):\n    \"\"\"Get recent logs\"\"\"\n    logs = crawler_manager.logs[-limit:] if limit > 0 else crawler_manager.logs\n    return {\"logs\": [log.model_dump() for log in logs]}\n"
  },
  {
    "path": "api/routers/data.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/api/routers/data.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\nimport os\nimport json\nfrom pathlib import Path\nfrom typing import Optional\n\nfrom fastapi import APIRouter, HTTPException\nfrom fastapi.responses import FileResponse\n\nrouter = APIRouter(prefix=\"/data\", tags=[\"data\"])\n\n# Data directory\nDATA_DIR = Path(__file__).parent.parent.parent / \"data\"\n\n\ndef get_file_info(file_path: Path) -> dict:\n    \"\"\"Get file information\"\"\"\n    stat = file_path.stat()\n    record_count = None\n\n    # Try to get record count\n    try:\n        if file_path.suffix == \".json\":\n            with open(file_path, \"r\", encoding=\"utf-8\") as f:\n                data = json.load(f)\n                if isinstance(data, list):\n                    record_count = len(data)\n        elif file_path.suffix == \".csv\":\n            with open(file_path, \"r\", encoding=\"utf-8\") as f:\n                record_count = sum(1 for _ in f) - 1  # Subtract header row\n    except Exception:\n        pass\n\n    return {\n        \"name\": file_path.name,\n        \"path\": str(file_path.relative_to(DATA_DIR)),\n        \"size\": stat.st_size,\n        \"modified_at\": stat.st_mtime,\n        \"record_count\": record_count,\n        \"type\": file_path.suffix[1:] if file_path.suffix else \"unknown\"\n    }\n\n\n@router.get(\"/files\")\nasync def list_data_files(platform: Optional[str] = None, file_type: Optional[str] = None):\n    \"\"\"Get data file list\"\"\"\n    if not DATA_DIR.exists():\n        return {\"files\": []}\n\n    files = []\n    supported_extensions = {\".json\", \".csv\", \".xlsx\", \".xls\"}\n\n    for root, dirs, filenames in os.walk(DATA_DIR):\n        root_path = Path(root)\n        for filename in filenames:\n            file_path = root_path / filename\n            if file_path.suffix.lower() not in supported_extensions:\n                continue\n\n            # Platform filter\n            if platform:\n                rel_path = str(file_path.relative_to(DATA_DIR))\n                if platform.lower() not in rel_path.lower():\n                    continue\n\n            # Type filter\n            if file_type and file_path.suffix[1:].lower() != file_type.lower():\n                continue\n\n            try:\n                files.append(get_file_info(file_path))\n            except Exception:\n                continue\n\n    # Sort by modification time (newest first)\n    files.sort(key=lambda x: x[\"modified_at\"], reverse=True)\n\n    return {\"files\": files}\n\n\n@router.get(\"/files/{file_path:path}\")\nasync def get_file_content(file_path: str, preview: bool = True, limit: int = 100):\n    \"\"\"Get file content or preview\"\"\"\n    full_path = DATA_DIR / file_path\n\n    if not full_path.exists():\n        raise HTTPException(status_code=404, detail=\"File not found\")\n\n    if not full_path.is_file():\n        raise HTTPException(status_code=400, detail=\"Not a file\")\n\n    # Security check: ensure within DATA_DIR\n    try:\n        full_path.resolve().relative_to(DATA_DIR.resolve())\n    except ValueError:\n        raise HTTPException(status_code=403, detail=\"Access denied\")\n\n    if preview:\n        # Return preview data\n        try:\n            if full_path.suffix == \".json\":\n                with open(full_path, \"r\", encoding=\"utf-8\") as f:\n                    data = json.load(f)\n                    if isinstance(data, list):\n                        return {\"data\": data[:limit], \"total\": len(data)}\n                    return {\"data\": data, \"total\": 1}\n            elif full_path.suffix == \".csv\":\n                import csv\n                with open(full_path, \"r\", encoding=\"utf-8\") as f:\n                    reader = csv.DictReader(f)\n                    rows = []\n                    for i, row in enumerate(reader):\n                        if i >= limit:\n                            break\n                        rows.append(row)\n                    # Re-read to get total count\n                    f.seek(0)\n                    total = sum(1 for _ in f) - 1\n                    return {\"data\": rows, \"total\": total}\n            elif full_path.suffix.lower() in (\".xlsx\", \".xls\"):\n                import pandas as pd\n                # Read first limit rows\n                df = pd.read_excel(full_path, nrows=limit)\n                # Get total row count (only read first column to save memory)\n                df_count = pd.read_excel(full_path, usecols=[0])\n                total = len(df_count)\n                # Convert to list of dictionaries, handle NaN values\n                rows = df.where(pd.notnull(df), None).to_dict(orient='records')\n                return {\n                    \"data\": rows,\n                    \"total\": total,\n                    \"columns\": list(df.columns)\n                }\n            else:\n                raise HTTPException(status_code=400, detail=\"Unsupported file type for preview\")\n        except json.JSONDecodeError:\n            raise HTTPException(status_code=400, detail=\"Invalid JSON file\")\n        except Exception as e:\n            raise HTTPException(status_code=500, detail=str(e))\n    else:\n        # Return file download\n        return FileResponse(\n            path=full_path,\n            filename=full_path.name,\n            media_type=\"application/octet-stream\"\n        )\n\n\n@router.get(\"/download/{file_path:path}\")\nasync def download_file(file_path: str):\n    \"\"\"Download file\"\"\"\n    full_path = DATA_DIR / file_path\n\n    if not full_path.exists():\n        raise HTTPException(status_code=404, detail=\"File not found\")\n\n    if not full_path.is_file():\n        raise HTTPException(status_code=400, detail=\"Not a file\")\n\n    # Security check\n    try:\n        full_path.resolve().relative_to(DATA_DIR.resolve())\n    except ValueError:\n        raise HTTPException(status_code=403, detail=\"Access denied\")\n\n    return FileResponse(\n        path=full_path,\n        filename=full_path.name,\n        media_type=\"application/octet-stream\"\n    )\n\n\n@router.get(\"/stats\")\nasync def get_data_stats():\n    \"\"\"Get data statistics\"\"\"\n    if not DATA_DIR.exists():\n        return {\"total_files\": 0, \"total_size\": 0, \"by_platform\": {}, \"by_type\": {}}\n\n    stats = {\n        \"total_files\": 0,\n        \"total_size\": 0,\n        \"by_platform\": {},\n        \"by_type\": {}\n    }\n\n    supported_extensions = {\".json\", \".csv\", \".xlsx\", \".xls\"}\n\n    for root, dirs, filenames in os.walk(DATA_DIR):\n        root_path = Path(root)\n        for filename in filenames:\n            file_path = root_path / filename\n            if file_path.suffix.lower() not in supported_extensions:\n                continue\n\n            try:\n                stat = file_path.stat()\n                stats[\"total_files\"] += 1\n                stats[\"total_size\"] += stat.st_size\n\n                # Statistics by type\n                file_type = file_path.suffix[1:].lower()\n                stats[\"by_type\"][file_type] = stats[\"by_type\"].get(file_type, 0) + 1\n\n                # Statistics by platform (inferred from path)\n                rel_path = str(file_path.relative_to(DATA_DIR))\n                for platform in [\"xhs\", \"dy\", \"ks\", \"bili\", \"wb\", \"tieba\", \"zhihu\"]:\n                    if platform in rel_path.lower():\n                        stats[\"by_platform\"][platform] = stats[\"by_platform\"].get(platform, 0) + 1\n                        break\n            except Exception:\n                continue\n\n    return stats\n"
  },
  {
    "path": "api/routers/websocket.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/api/routers/websocket.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\nimport asyncio\nfrom typing import Set, Optional\n\nfrom fastapi import APIRouter, WebSocket, WebSocketDisconnect\n\nfrom ..services import crawler_manager\n\nrouter = APIRouter(tags=[\"websocket\"])\n\n\nclass ConnectionManager:\n    \"\"\"WebSocket connection manager\"\"\"\n\n    def __init__(self):\n        self.active_connections: Set[WebSocket] = set()\n\n    async def connect(self, websocket: WebSocket):\n        await websocket.accept()\n        self.active_connections.add(websocket)\n\n    def disconnect(self, websocket: WebSocket):\n        self.active_connections.discard(websocket)\n\n    async def broadcast(self, message: dict):\n        \"\"\"Broadcast message to all connections\"\"\"\n        if not self.active_connections:\n            return\n\n        disconnected = []\n        for connection in list(self.active_connections):\n            try:\n                await connection.send_json(message)\n            except Exception:\n                disconnected.append(connection)\n\n        # Clean up disconnected connections\n        for conn in disconnected:\n            self.disconnect(conn)\n\n\nmanager = ConnectionManager()\n\n\nasync def log_broadcaster():\n    \"\"\"Background task: read logs from queue and broadcast\"\"\"\n    queue = crawler_manager.get_log_queue()\n    while True:\n        try:\n            # Get log entry from queue\n            entry = await queue.get()\n            # Broadcast to all WebSocket connections\n            await manager.broadcast(entry.model_dump())\n        except asyncio.CancelledError:\n            break\n        except Exception as e:\n            print(f\"Log broadcaster error: {e}\")\n            await asyncio.sleep(0.1)\n\n\n# Global broadcast task\n_broadcaster_task: Optional[asyncio.Task] = None\n\n\ndef start_broadcaster():\n    \"\"\"Start broadcast task\"\"\"\n    global _broadcaster_task\n    if _broadcaster_task is None or _broadcaster_task.done():\n        _broadcaster_task = asyncio.create_task(log_broadcaster())\n\n\n@router.websocket(\"/ws/logs\")\nasync def websocket_logs(websocket: WebSocket):\n    \"\"\"WebSocket log stream\"\"\"\n    print(\"[WS] New connection attempt\")\n\n    try:\n        # Ensure broadcast task is running\n        start_broadcaster()\n\n        await manager.connect(websocket)\n        print(f\"[WS] Connected, active connections: {len(manager.active_connections)}\")\n\n        # Send existing logs\n        for log in crawler_manager.logs:\n            try:\n                await websocket.send_json(log.model_dump())\n            except Exception as e:\n                print(f\"[WS] Error sending existing log: {e}\")\n                break\n\n        print(f\"[WS] Sent {len(crawler_manager.logs)} existing logs, entering main loop\")\n\n        while True:\n            # Keep connection alive, receive heartbeat or any message\n            try:\n                data = await asyncio.wait_for(\n                    websocket.receive_text(),\n                    timeout=30.0\n                )\n                if data == \"ping\":\n                    await websocket.send_text(\"pong\")\n            except asyncio.TimeoutError:\n                # Send ping to keep connection alive\n                try:\n                    await websocket.send_text(\"ping\")\n                except Exception as e:\n                    print(f\"[WS] Error sending ping: {e}\")\n                    break\n\n    except WebSocketDisconnect:\n        print(\"[WS] Client disconnected\")\n    except Exception as e:\n        print(f\"[WS] Error: {type(e).__name__}: {e}\")\n    finally:\n        manager.disconnect(websocket)\n        print(f\"[WS] Cleanup done, active connections: {len(manager.active_connections)}\")\n\n\n@router.websocket(\"/ws/status\")\nasync def websocket_status(websocket: WebSocket):\n    \"\"\"WebSocket status stream\"\"\"\n    await websocket.accept()\n\n    try:\n        while True:\n            # Send status every second\n            status = crawler_manager.get_status()\n            await websocket.send_json(status)\n            await asyncio.sleep(1)\n    except WebSocketDisconnect:\n        pass\n    except Exception:\n        pass\n"
  },
  {
    "path": "api/schemas/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/api/schemas/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\nfrom .crawler import (\n    PlatformEnum,\n    LoginTypeEnum,\n    CrawlerTypeEnum,\n    SaveDataOptionEnum,\n    CrawlerStartRequest,\n    CrawlerStatusResponse,\n    LogEntry,\n)\n\n__all__ = [\n    \"PlatformEnum\",\n    \"LoginTypeEnum\",\n    \"CrawlerTypeEnum\",\n    \"SaveDataOptionEnum\",\n    \"CrawlerStartRequest\",\n    \"CrawlerStatusResponse\",\n    \"LogEntry\",\n]\n"
  },
  {
    "path": "api/schemas/crawler.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/api/schemas/crawler.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\nfrom enum import Enum\nfrom typing import Optional, Literal\nfrom pydantic import BaseModel\n\n\nclass PlatformEnum(str, Enum):\n    \"\"\"Supported media platforms\"\"\"\n    XHS = \"xhs\"\n    DOUYIN = \"dy\"\n    KUAISHOU = \"ks\"\n    BILIBILI = \"bili\"\n    WEIBO = \"wb\"\n    TIEBA = \"tieba\"\n    ZHIHU = \"zhihu\"\n\n\nclass LoginTypeEnum(str, Enum):\n    \"\"\"Login method\"\"\"\n    QRCODE = \"qrcode\"\n    PHONE = \"phone\"\n    COOKIE = \"cookie\"\n\n\nclass CrawlerTypeEnum(str, Enum):\n    \"\"\"Crawler type\"\"\"\n    SEARCH = \"search\"\n    DETAIL = \"detail\"\n    CREATOR = \"creator\"\n\n\nclass SaveDataOptionEnum(str, Enum):\n    \"\"\"Data save option\"\"\"\n    CSV = \"csv\"\n    DB = \"db\"\n    JSON = \"json\"\n    JSONL = \"jsonl\"\n    SQLITE = \"sqlite\"\n    MONGODB = \"mongodb\"\n    EXCEL = \"excel\"\n\n\nclass CrawlerStartRequest(BaseModel):\n    \"\"\"Crawler start request\"\"\"\n    platform: PlatformEnum\n    login_type: LoginTypeEnum = LoginTypeEnum.QRCODE\n    crawler_type: CrawlerTypeEnum = CrawlerTypeEnum.SEARCH\n    keywords: str = \"\"  # Keywords for search mode\n    specified_ids: str = \"\"  # Post/video ID list for detail mode, comma-separated\n    creator_ids: str = \"\"  # Creator ID list for creator mode, comma-separated\n    start_page: int = 1\n    enable_comments: bool = True\n    enable_sub_comments: bool = False\n    save_option: SaveDataOptionEnum = SaveDataOptionEnum.JSONL\n    cookies: str = \"\"\n    headless: bool = False\n\n\nclass CrawlerStatusResponse(BaseModel):\n    \"\"\"Crawler status response\"\"\"\n    status: Literal[\"idle\", \"running\", \"stopping\", \"error\"]\n    platform: Optional[str] = None\n    crawler_type: Optional[str] = None\n    started_at: Optional[str] = None\n    error_message: Optional[str] = None\n\n\nclass LogEntry(BaseModel):\n    \"\"\"Log entry\"\"\"\n    id: int\n    timestamp: str\n    level: Literal[\"info\", \"warning\", \"error\", \"success\", \"debug\"]\n    message: str\n\n\nclass DataFileInfo(BaseModel):\n    \"\"\"Data file information\"\"\"\n    name: str\n    path: str\n    size: int\n    modified_at: str\n    record_count: Optional[int] = None\n"
  },
  {
    "path": "api/services/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/api/services/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\nfrom .crawler_manager import CrawlerManager, crawler_manager\n\n__all__ = [\"CrawlerManager\", \"crawler_manager\"]\n"
  },
  {
    "path": "api/services/crawler_manager.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/api/services/crawler_manager.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\nimport asyncio\nimport subprocess\nimport signal\nimport os\nfrom typing import Optional, List\nfrom datetime import datetime\nfrom pathlib import Path\n\nfrom ..schemas import CrawlerStartRequest, LogEntry\n\n\nclass CrawlerManager:\n    \"\"\"Crawler process manager\"\"\"\n\n    def __init__(self):\n        self._lock = asyncio.Lock()\n        self.process: Optional[subprocess.Popen] = None\n        self.status = \"idle\"\n        self.started_at: Optional[datetime] = None\n        self.current_config: Optional[CrawlerStartRequest] = None\n        self._log_id = 0\n        self._logs: List[LogEntry] = []\n        self._read_task: Optional[asyncio.Task] = None\n        # Project root directory\n        self._project_root = Path(__file__).parent.parent.parent\n        # Log queue - for pushing to WebSocket\n        self._log_queue: Optional[asyncio.Queue] = None\n\n    @property\n    def logs(self) -> List[LogEntry]:\n        return self._logs\n\n    def get_log_queue(self) -> asyncio.Queue:\n        \"\"\"Get or create log queue\"\"\"\n        if self._log_queue is None:\n            self._log_queue = asyncio.Queue()\n        return self._log_queue\n\n    def _create_log_entry(self, message: str, level: str = \"info\") -> LogEntry:\n        \"\"\"Create log entry\"\"\"\n        self._log_id += 1\n        entry = LogEntry(\n            id=self._log_id,\n            timestamp=datetime.now().strftime(\"%H:%M:%S\"),\n            level=level,\n            message=message\n        )\n        self._logs.append(entry)\n        # Keep last 500 logs\n        if len(self._logs) > 500:\n            self._logs = self._logs[-500:]\n        return entry\n\n    async def _push_log(self, entry: LogEntry):\n        \"\"\"Push log to queue\"\"\"\n        if self._log_queue is not None:\n            try:\n                self._log_queue.put_nowait(entry)\n            except asyncio.QueueFull:\n                pass\n\n    def _parse_log_level(self, line: str) -> str:\n        \"\"\"Parse log level\"\"\"\n        line_upper = line.upper()\n        if \"ERROR\" in line_upper or \"FAILED\" in line_upper:\n            return \"error\"\n        elif \"WARNING\" in line_upper or \"WARN\" in line_upper:\n            return \"warning\"\n        elif \"SUCCESS\" in line_upper or \"完成\" in line or \"成功\" in line:\n            return \"success\"\n        elif \"DEBUG\" in line_upper:\n            return \"debug\"\n        return \"info\"\n\n    async def start(self, config: CrawlerStartRequest) -> bool:\n        \"\"\"Start crawler process\"\"\"\n        async with self._lock:\n            if self.process and self.process.poll() is None:\n                return False\n\n            # Clear old logs\n            self._logs = []\n            self._log_id = 0\n\n            # Clear pending queue (don't replace object to avoid WebSocket broadcast coroutine holding old queue reference)\n            if self._log_queue is None:\n                self._log_queue = asyncio.Queue()\n            else:\n                try:\n                    while True:\n                        self._log_queue.get_nowait()\n                except asyncio.QueueEmpty:\n                    pass\n\n            # Build command line arguments\n            cmd = self._build_command(config)\n\n            # Log start information\n            entry = self._create_log_entry(f\"Starting crawler: {' '.join(cmd)}\", \"info\")\n            await self._push_log(entry)\n\n            try:\n                # Start subprocess\n                self.process = subprocess.Popen(\n                    cmd,\n                    stdout=subprocess.PIPE,\n                    stderr=subprocess.STDOUT,\n                    text=True,\n                    encoding='utf-8',\n                    bufsize=1,\n                    cwd=str(self._project_root),\n                    env={**os.environ, \"PYTHONUNBUFFERED\": \"1\"}\n                )\n\n                self.status = \"running\"\n                self.started_at = datetime.now()\n                self.current_config = config\n\n                entry = self._create_log_entry(\n                    f\"Crawler started on platform: {config.platform.value}, type: {config.crawler_type.value}\",\n                    \"success\"\n                )\n                await self._push_log(entry)\n\n                # Start log reading task\n                self._read_task = asyncio.create_task(self._read_output())\n\n                return True\n            except Exception as e:\n                self.status = \"error\"\n                entry = self._create_log_entry(f\"Failed to start crawler: {str(e)}\", \"error\")\n                await self._push_log(entry)\n                return False\n\n    async def stop(self) -> bool:\n        \"\"\"Stop crawler process\"\"\"\n        async with self._lock:\n            if not self.process or self.process.poll() is not None:\n                return False\n\n            self.status = \"stopping\"\n            entry = self._create_log_entry(\"Sending SIGTERM to crawler process...\", \"warning\")\n            await self._push_log(entry)\n\n            try:\n                self.process.send_signal(signal.SIGTERM)\n\n                # Wait for graceful exit (up to 15 seconds)\n                for _ in range(30):\n                    if self.process.poll() is not None:\n                        break\n                    await asyncio.sleep(0.5)\n\n                # If still not exited, force kill\n                if self.process.poll() is None:\n                    entry = self._create_log_entry(\"Process not responding, sending SIGKILL...\", \"warning\")\n                    await self._push_log(entry)\n                    self.process.kill()\n\n                entry = self._create_log_entry(\"Crawler process terminated\", \"info\")\n                await self._push_log(entry)\n\n            except Exception as e:\n                entry = self._create_log_entry(f\"Error stopping crawler: {str(e)}\", \"error\")\n                await self._push_log(entry)\n\n            self.status = \"idle\"\n            self.current_config = None\n\n            # Cancel log reading task\n            if self._read_task:\n                self._read_task.cancel()\n                self._read_task = None\n\n            return True\n\n    def get_status(self) -> dict:\n        \"\"\"Get current status\"\"\"\n        return {\n            \"status\": self.status,\n            \"platform\": self.current_config.platform.value if self.current_config else None,\n            \"crawler_type\": self.current_config.crawler_type.value if self.current_config else None,\n            \"started_at\": self.started_at.isoformat() if self.started_at else None,\n            \"error_message\": None\n        }\n\n    def _build_command(self, config: CrawlerStartRequest) -> list:\n        \"\"\"Build main.py command line arguments\"\"\"\n        cmd = [\"uv\", \"run\", \"python\", \"main.py\"]\n\n        cmd.extend([\"--platform\", config.platform.value])\n        cmd.extend([\"--lt\", config.login_type.value])\n        cmd.extend([\"--type\", config.crawler_type.value])\n        cmd.extend([\"--save_data_option\", config.save_option.value])\n\n        # Pass different arguments based on crawler type\n        if config.crawler_type.value == \"search\" and config.keywords:\n            cmd.extend([\"--keywords\", config.keywords])\n        elif config.crawler_type.value == \"detail\" and config.specified_ids:\n            cmd.extend([\"--specified_id\", config.specified_ids])\n        elif config.crawler_type.value == \"creator\" and config.creator_ids:\n            cmd.extend([\"--creator_id\", config.creator_ids])\n\n        if config.start_page != 1:\n            cmd.extend([\"--start\", str(config.start_page)])\n\n        cmd.extend([\"--get_comment\", \"true\" if config.enable_comments else \"false\"])\n        cmd.extend([\"--get_sub_comment\", \"true\" if config.enable_sub_comments else \"false\"])\n\n        if config.cookies:\n            cmd.extend([\"--cookies\", config.cookies])\n\n        cmd.extend([\"--headless\", \"true\" if config.headless else \"false\"])\n\n        return cmd\n\n    async def _read_output(self):\n        \"\"\"Asynchronously read process output\"\"\"\n        loop = asyncio.get_event_loop()\n\n        try:\n            while self.process and self.process.poll() is None:\n                # Read a line in thread pool\n                line = await loop.run_in_executor(\n                    None, self.process.stdout.readline\n                )\n                if line:\n                    line = line.strip()\n                    if line:\n                        level = self._parse_log_level(line)\n                        entry = self._create_log_entry(line, level)\n                        await self._push_log(entry)\n\n            # Read remaining output\n            if self.process and self.process.stdout:\n                remaining = await loop.run_in_executor(\n                    None, self.process.stdout.read\n                )\n                if remaining:\n                    for line in remaining.strip().split('\\n'):\n                        if line.strip():\n                            level = self._parse_log_level(line)\n                            entry = self._create_log_entry(line.strip(), level)\n                            await self._push_log(entry)\n\n            # Process ended\n            if self.status == \"running\":\n                exit_code = self.process.returncode if self.process else -1\n                if exit_code == 0:\n                    entry = self._create_log_entry(\"Crawler completed successfully\", \"success\")\n                else:\n                    entry = self._create_log_entry(f\"Crawler exited with code: {exit_code}\", \"warning\")\n                await self._push_log(entry)\n                self.status = \"idle\"\n\n        except asyncio.CancelledError:\n            pass\n        except Exception as e:\n            entry = self._create_log_entry(f\"Error reading output: {str(e)}\", \"error\")\n            await self._push_log(entry)\n\n\n# Global singleton\ncrawler_manager = CrawlerManager()\n"
  },
  {
    "path": "api/webui/assets/index-DvClRayq.js",
    "content": "var $m=t=>{throw TypeError(t)};var ld=(t,e,r)=>e.has(t)||$m(\"Cannot \"+r);var R=(t,e,r)=>(ld(t,e,\"read from private field\"),r?r.call(t):e.get(t)),ve=(t,e,r)=>e.has(t)?$m(\"Cannot add the same private member more than once\"):e instanceof WeakSet?e.add(t):e.set(t,r),ce=(t,e,r,s)=>(ld(t,e,\"write to private field\"),s?s.call(t,r):e.set(t,r),r),Te=(t,e,r)=>(ld(t,e,\"access private method\"),r);var Sl=(t,e,r,s)=>({set _(i){ce(t,e,i,r)},get _(){return R(t,e,s)}});function t1(t,e){for(var r=0;r<e.length;r++){const s=e[r];if(typeof s!=\"string\"&&!Array.isArray(s)){for(const i in s)if(i!==\"default\"&&!(i in t)){const l=Object.getOwnPropertyDescriptor(s,i);l&&Object.defineProperty(t,i,l.get?l:{enumerable:!0,get:()=>s[i]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}))}(function(){const e=document.createElement(\"link\").relList;if(e&&e.supports&&e.supports(\"modulepreload\"))return;for(const i of document.querySelectorAll('link[rel=\"modulepreload\"]'))s(i);new MutationObserver(i=>{for(const l of i)if(l.type===\"childList\")for(const u of l.addedNodes)u.tagName===\"LINK\"&&u.rel===\"modulepreload\"&&s(u)}).observe(document,{childList:!0,subtree:!0});function r(i){const l={};return i.integrity&&(l.integrity=i.integrity),i.referrerPolicy&&(l.referrerPolicy=i.referrerPolicy),i.crossOrigin===\"use-credentials\"?l.credentials=\"include\":i.crossOrigin===\"anonymous\"?l.credentials=\"omit\":l.credentials=\"same-origin\",l}function s(i){if(i.ep)return;i.ep=!0;const l=r(i);fetch(i.href,l)}})();function bf(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,\"default\")?t.default:t}var cd={exports:{}},Di={},ud={exports:{}},je={};/**\n * @license React\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */var Um;function n1(){if(Um)return je;Um=1;var t=Symbol.for(\"react.element\"),e=Symbol.for(\"react.portal\"),r=Symbol.for(\"react.fragment\"),s=Symbol.for(\"react.strict_mode\"),i=Symbol.for(\"react.profiler\"),l=Symbol.for(\"react.provider\"),u=Symbol.for(\"react.context\"),d=Symbol.for(\"react.forward_ref\"),h=Symbol.for(\"react.suspense\"),p=Symbol.for(\"react.memo\"),y=Symbol.for(\"react.lazy\"),v=Symbol.iterator;function C(P){return P===null||typeof P!=\"object\"?null:(P=v&&P[v]||P[\"@@iterator\"],typeof P==\"function\"?P:null)}var w={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},E=Object.assign,b={};function k(P,M,ie){this.props=P,this.context=M,this.refs=b,this.updater=ie||w}k.prototype.isReactComponent={},k.prototype.setState=function(P,M){if(typeof P!=\"object\"&&typeof P!=\"function\"&&P!=null)throw Error(\"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\");this.updater.enqueueSetState(this,P,M,\"setState\")},k.prototype.forceUpdate=function(P){this.updater.enqueueForceUpdate(this,P,\"forceUpdate\")};function T(){}T.prototype=k.prototype;function j(P,M,ie){this.props=P,this.context=M,this.refs=b,this.updater=ie||w}var _=j.prototype=new T;_.constructor=j,E(_,k.prototype),_.isPureReactComponent=!0;var A=Array.isArray,F=Object.prototype.hasOwnProperty,V={current:null},B={key:!0,ref:!0,__self:!0,__source:!0};function te(P,M,ie){var ae,me={},be=null,ee=null;if(M!=null)for(ae in M.ref!==void 0&&(ee=M.ref),M.key!==void 0&&(be=\"\"+M.key),M)F.call(M,ae)&&!B.hasOwnProperty(ae)&&(me[ae]=M[ae]);var ye=arguments.length-2;if(ye===1)me.children=ie;else if(1<ye){for(var Se=Array(ye),Ne=0;Ne<ye;Ne++)Se[Ne]=arguments[Ne+2];me.children=Se}if(P&&P.defaultProps)for(ae in ye=P.defaultProps,ye)me[ae]===void 0&&(me[ae]=ye[ae]);return{$$typeof:t,type:P,key:be,ref:ee,props:me,_owner:V.current}}function G(P,M){return{$$typeof:t,type:P.type,key:M,ref:P.ref,props:P.props,_owner:P._owner}}function W(P){return typeof P==\"object\"&&P!==null&&P.$$typeof===t}function le(P){var M={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+P.replace(/[=:]/g,function(ie){return M[ie]})}var K=/\\/+/g;function Z(P,M){return typeof P==\"object\"&&P!==null&&P.key!=null?le(\"\"+P.key):M.toString(36)}function J(P,M,ie,ae,me){var be=typeof P;(be===\"undefined\"||be===\"boolean\")&&(P=null);var ee=!1;if(P===null)ee=!0;else switch(be){case\"string\":case\"number\":ee=!0;break;case\"object\":switch(P.$$typeof){case t:case e:ee=!0}}if(ee)return ee=P,me=me(ee),P=ae===\"\"?\".\"+Z(ee,0):ae,A(me)?(ie=\"\",P!=null&&(ie=P.replace(K,\"$&/\")+\"/\"),J(me,M,ie,\"\",function(Ne){return Ne})):me!=null&&(W(me)&&(me=G(me,ie+(!me.key||ee&&ee.key===me.key?\"\":(\"\"+me.key).replace(K,\"$&/\")+\"/\")+P)),M.push(me)),1;if(ee=0,ae=ae===\"\"?\".\":ae+\":\",A(P))for(var ye=0;ye<P.length;ye++){be=P[ye];var Se=ae+Z(be,ye);ee+=J(be,M,ie,Se,me)}else if(Se=C(P),typeof Se==\"function\")for(P=Se.call(P),ye=0;!(be=P.next()).done;)be=be.value,Se=ae+Z(be,ye++),ee+=J(be,M,ie,Se,me);else if(be===\"object\")throw M=String(P),Error(\"Objects are not valid as a React child (found: \"+(M===\"[object Object]\"?\"object with keys {\"+Object.keys(P).join(\", \")+\"}\":M)+\"). If you meant to render a collection of children, use an array instead.\");return ee}function de(P,M,ie){if(P==null)return P;var ae=[],me=0;return J(P,ae,\"\",\"\",function(be){return M.call(ie,be,me++)}),ae}function ne(P){if(P._status===-1){var M=P._result;M=M(),M.then(function(ie){(P._status===0||P._status===-1)&&(P._status=1,P._result=ie)},function(ie){(P._status===0||P._status===-1)&&(P._status=2,P._result=ie)}),P._status===-1&&(P._status=0,P._result=M)}if(P._status===1)return P._result.default;throw P._result}var se={current:null},$={transition:null},H={ReactCurrentDispatcher:se,ReactCurrentBatchConfig:$,ReactCurrentOwner:V};function Q(){throw Error(\"act(...) is not supported in production builds of React.\")}return je.Children={map:de,forEach:function(P,M,ie){de(P,function(){M.apply(this,arguments)},ie)},count:function(P){var M=0;return de(P,function(){M++}),M},toArray:function(P){return de(P,function(M){return M})||[]},only:function(P){if(!W(P))throw Error(\"React.Children.only expected to receive a single React element child.\");return P}},je.Component=k,je.Fragment=r,je.Profiler=i,je.PureComponent=j,je.StrictMode=s,je.Suspense=h,je.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=H,je.act=Q,je.cloneElement=function(P,M,ie){if(P==null)throw Error(\"React.cloneElement(...): The argument must be a React element, but you passed \"+P+\".\");var ae=E({},P.props),me=P.key,be=P.ref,ee=P._owner;if(M!=null){if(M.ref!==void 0&&(be=M.ref,ee=V.current),M.key!==void 0&&(me=\"\"+M.key),P.type&&P.type.defaultProps)var ye=P.type.defaultProps;for(Se in M)F.call(M,Se)&&!B.hasOwnProperty(Se)&&(ae[Se]=M[Se]===void 0&&ye!==void 0?ye[Se]:M[Se])}var Se=arguments.length-2;if(Se===1)ae.children=ie;else if(1<Se){ye=Array(Se);for(var Ne=0;Ne<Se;Ne++)ye[Ne]=arguments[Ne+2];ae.children=ye}return{$$typeof:t,type:P.type,key:me,ref:be,props:ae,_owner:ee}},je.createContext=function(P){return P={$$typeof:u,_currentValue:P,_currentValue2:P,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null},P.Provider={$$typeof:l,_context:P},P.Consumer=P},je.createElement=te,je.createFactory=function(P){var M=te.bind(null,P);return M.type=P,M},je.createRef=function(){return{current:null}},je.forwardRef=function(P){return{$$typeof:d,render:P}},je.isValidElement=W,je.lazy=function(P){return{$$typeof:y,_payload:{_status:-1,_result:P},_init:ne}},je.memo=function(P,M){return{$$typeof:p,type:P,compare:M===void 0?null:M}},je.startTransition=function(P){var M=$.transition;$.transition={};try{P()}finally{$.transition=M}},je.unstable_act=Q,je.useCallback=function(P,M){return se.current.useCallback(P,M)},je.useContext=function(P){return se.current.useContext(P)},je.useDebugValue=function(){},je.useDeferredValue=function(P){return se.current.useDeferredValue(P)},je.useEffect=function(P,M){return se.current.useEffect(P,M)},je.useId=function(){return se.current.useId()},je.useImperativeHandle=function(P,M,ie){return se.current.useImperativeHandle(P,M,ie)},je.useInsertionEffect=function(P,M){return se.current.useInsertionEffect(P,M)},je.useLayoutEffect=function(P,M){return se.current.useLayoutEffect(P,M)},je.useMemo=function(P,M){return se.current.useMemo(P,M)},je.useReducer=function(P,M,ie){return se.current.useReducer(P,M,ie)},je.useRef=function(P){return se.current.useRef(P)},je.useState=function(P){return se.current.useState(P)},je.useSyncExternalStore=function(P,M,ie){return se.current.useSyncExternalStore(P,M,ie)},je.useTransition=function(){return se.current.useTransition()},je.version=\"18.3.1\",je}var Bm;function ac(){return Bm||(Bm=1,ud.exports=n1()),ud.exports}/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */var Hm;function r1(){if(Hm)return Di;Hm=1;var t=ac(),e=Symbol.for(\"react.element\"),r=Symbol.for(\"react.fragment\"),s=Object.prototype.hasOwnProperty,i=t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,l={key:!0,ref:!0,__self:!0,__source:!0};function u(d,h,p){var y,v={},C=null,w=null;p!==void 0&&(C=\"\"+p),h.key!==void 0&&(C=\"\"+h.key),h.ref!==void 0&&(w=h.ref);for(y in h)s.call(h,y)&&!l.hasOwnProperty(y)&&(v[y]=h[y]);if(d&&d.defaultProps)for(y in h=d.defaultProps,h)v[y]===void 0&&(v[y]=h[y]);return{$$typeof:e,type:d,key:C,ref:w,props:v,_owner:i.current}}return Di.Fragment=r,Di.jsx=u,Di.jsxs=u,Di}var Vm;function o1(){return Vm||(Vm=1,cd.exports=r1()),cd.exports}var g=o1(),x=ac();const oe=bf(x),Sf=t1({__proto__:null,default:oe},[x]);var Cl={},dd={exports:{}},$t={},fd={exports:{}},hd={};/**\n * @license React\n * scheduler.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */var Wm;function s1(){return Wm||(Wm=1,(function(t){function e($,H){var Q=$.length;$.push(H);e:for(;0<Q;){var P=Q-1>>>1,M=$[P];if(0<i(M,H))$[P]=H,$[Q]=M,Q=P;else break e}}function r($){return $.length===0?null:$[0]}function s($){if($.length===0)return null;var H=$[0],Q=$.pop();if(Q!==H){$[0]=Q;e:for(var P=0,M=$.length,ie=M>>>1;P<ie;){var ae=2*(P+1)-1,me=$[ae],be=ae+1,ee=$[be];if(0>i(me,Q))be<M&&0>i(ee,me)?($[P]=ee,$[be]=Q,P=be):($[P]=me,$[ae]=Q,P=ae);else if(be<M&&0>i(ee,Q))$[P]=ee,$[be]=Q,P=be;else break e}}return H}function i($,H){var Q=$.sortIndex-H.sortIndex;return Q!==0?Q:$.id-H.id}if(typeof performance==\"object\"&&typeof performance.now==\"function\"){var l=performance;t.unstable_now=function(){return l.now()}}else{var u=Date,d=u.now();t.unstable_now=function(){return u.now()-d}}var h=[],p=[],y=1,v=null,C=3,w=!1,E=!1,b=!1,k=typeof setTimeout==\"function\"?setTimeout:null,T=typeof clearTimeout==\"function\"?clearTimeout:null,j=typeof setImmediate<\"u\"?setImmediate:null;typeof navigator<\"u\"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function _($){for(var H=r(p);H!==null;){if(H.callback===null)s(p);else if(H.startTime<=$)s(p),H.sortIndex=H.expirationTime,e(h,H);else break;H=r(p)}}function A($){if(b=!1,_($),!E)if(r(h)!==null)E=!0,ne(F);else{var H=r(p);H!==null&&se(A,H.startTime-$)}}function F($,H){E=!1,b&&(b=!1,T(te),te=-1),w=!0;var Q=C;try{for(_(H),v=r(h);v!==null&&(!(v.expirationTime>H)||$&&!le());){var P=v.callback;if(typeof P==\"function\"){v.callback=null,C=v.priorityLevel;var M=P(v.expirationTime<=H);H=t.unstable_now(),typeof M==\"function\"?v.callback=M:v===r(h)&&s(h),_(H)}else s(h);v=r(h)}if(v!==null)var ie=!0;else{var ae=r(p);ae!==null&&se(A,ae.startTime-H),ie=!1}return ie}finally{v=null,C=Q,w=!1}}var V=!1,B=null,te=-1,G=5,W=-1;function le(){return!(t.unstable_now()-W<G)}function K(){if(B!==null){var $=t.unstable_now();W=$;var H=!0;try{H=B(!0,$)}finally{H?Z():(V=!1,B=null)}}else V=!1}var Z;if(typeof j==\"function\")Z=function(){j(K)};else if(typeof MessageChannel<\"u\"){var J=new MessageChannel,de=J.port2;J.port1.onmessage=K,Z=function(){de.postMessage(null)}}else Z=function(){k(K,0)};function ne($){B=$,V||(V=!0,Z())}function se($,H){te=k(function(){$(t.unstable_now())},H)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function($){$.callback=null},t.unstable_continueExecution=function(){E||w||(E=!0,ne(F))},t.unstable_forceFrameRate=function($){0>$||125<$?console.error(\"forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported\"):G=0<$?Math.floor(1e3/$):5},t.unstable_getCurrentPriorityLevel=function(){return C},t.unstable_getFirstCallbackNode=function(){return r(h)},t.unstable_next=function($){switch(C){case 1:case 2:case 3:var H=3;break;default:H=C}var Q=C;C=H;try{return $()}finally{C=Q}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=function(){},t.unstable_runWithPriority=function($,H){switch($){case 1:case 2:case 3:case 4:case 5:break;default:$=3}var Q=C;C=$;try{return H()}finally{C=Q}},t.unstable_scheduleCallback=function($,H,Q){var P=t.unstable_now();switch(typeof Q==\"object\"&&Q!==null?(Q=Q.delay,Q=typeof Q==\"number\"&&0<Q?P+Q:P):Q=P,$){case 1:var M=-1;break;case 2:M=250;break;case 5:M=1073741823;break;case 4:M=1e4;break;default:M=5e3}return M=Q+M,$={id:y++,callback:H,priorityLevel:$,startTime:Q,expirationTime:M,sortIndex:-1},Q>P?($.sortIndex=Q,e(p,$),r(h)===null&&$===r(p)&&(b?(T(te),te=-1):b=!0,se(A,Q-P))):($.sortIndex=M,e(h,$),E||w||(E=!0,ne(F))),$},t.unstable_shouldYield=le,t.unstable_wrapCallback=function($){var H=C;return function(){var Q=C;C=H;try{return $.apply(this,arguments)}finally{C=Q}}}})(hd)),hd}var Km;function i1(){return Km||(Km=1,fd.exports=s1()),fd.exports}/**\n * @license React\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */var qm;function a1(){if(qm)return $t;qm=1;var t=ac(),e=i1();function r(n){for(var o=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+n,a=1;a<arguments.length;a++)o+=\"&args[]=\"+encodeURIComponent(arguments[a]);return\"Minified React error #\"+n+\"; visit \"+o+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}var s=new Set,i={};function l(n,o){u(n,o),u(n+\"Capture\",o)}function u(n,o){for(i[n]=o,n=0;n<o.length;n++)s.add(o[n])}var d=!(typeof window>\"u\"||typeof window.document>\"u\"||typeof window.document.createElement>\"u\"),h=Object.prototype.hasOwnProperty,p=/^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/,y={},v={};function C(n){return h.call(v,n)?!0:h.call(y,n)?!1:p.test(n)?v[n]=!0:(y[n]=!0,!1)}function w(n,o,a,c){if(a!==null&&a.type===0)return!1;switch(typeof o){case\"function\":case\"symbol\":return!0;case\"boolean\":return c?!1:a!==null?!a.acceptsBooleans:(n=n.toLowerCase().slice(0,5),n!==\"data-\"&&n!==\"aria-\");default:return!1}}function E(n,o,a,c){if(o===null||typeof o>\"u\"||w(n,o,a,c))return!0;if(c)return!1;if(a!==null)switch(a.type){case 3:return!o;case 4:return o===!1;case 5:return isNaN(o);case 6:return isNaN(o)||1>o}return!1}function b(n,o,a,c,f,m,S){this.acceptsBooleans=o===2||o===3||o===4,this.attributeName=c,this.attributeNamespace=f,this.mustUseProperty=a,this.propertyName=n,this.type=o,this.sanitizeURL=m,this.removeEmptyString=S}var k={};\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(n){k[n]=new b(n,0,!1,n,null,!1,!1)}),[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(n){var o=n[0];k[o]=new b(o,1,!1,n[1],null,!1,!1)}),[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(n){k[n]=new b(n,2,!1,n.toLowerCase(),null,!1,!1)}),[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(n){k[n]=new b(n,2,!1,n,null,!1,!1)}),\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(n){k[n]=new b(n,3,!1,n.toLowerCase(),null,!1,!1)}),[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(n){k[n]=new b(n,3,!0,n,null,!1,!1)}),[\"capture\",\"download\"].forEach(function(n){k[n]=new b(n,4,!1,n,null,!1,!1)}),[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(n){k[n]=new b(n,6,!1,n,null,!1,!1)}),[\"rowSpan\",\"start\"].forEach(function(n){k[n]=new b(n,5,!1,n.toLowerCase(),null,!1,!1)});var T=/[\\-:]([a-z])/g;function j(n){return n[1].toUpperCase()}\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(n){var o=n.replace(T,j);k[o]=new b(o,1,!1,n,null,!1,!1)}),\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(n){var o=n.replace(T,j);k[o]=new b(o,1,!1,n,\"http://www.w3.org/1999/xlink\",!1,!1)}),[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(n){var o=n.replace(T,j);k[o]=new b(o,1,!1,n,\"http://www.w3.org/XML/1998/namespace\",!1,!1)}),[\"tabIndex\",\"crossOrigin\"].forEach(function(n){k[n]=new b(n,1,!1,n.toLowerCase(),null,!1,!1)}),k.xlinkHref=new b(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0,!1),[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(n){k[n]=new b(n,1,!1,n.toLowerCase(),null,!0,!0)});function _(n,o,a,c){var f=k.hasOwnProperty(o)?k[o]:null;(f!==null?f.type!==0:c||!(2<o.length)||o[0]!==\"o\"&&o[0]!==\"O\"||o[1]!==\"n\"&&o[1]!==\"N\")&&(E(o,a,f,c)&&(a=null),c||f===null?C(o)&&(a===null?n.removeAttribute(o):n.setAttribute(o,\"\"+a)):f.mustUseProperty?n[f.propertyName]=a===null?f.type===3?!1:\"\":a:(o=f.attributeName,c=f.attributeNamespace,a===null?n.removeAttribute(o):(f=f.type,a=f===3||f===4&&a===!0?\"\":\"\"+a,c?n.setAttributeNS(c,o,a):n.setAttribute(o,a))))}var A=t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,F=Symbol.for(\"react.element\"),V=Symbol.for(\"react.portal\"),B=Symbol.for(\"react.fragment\"),te=Symbol.for(\"react.strict_mode\"),G=Symbol.for(\"react.profiler\"),W=Symbol.for(\"react.provider\"),le=Symbol.for(\"react.context\"),K=Symbol.for(\"react.forward_ref\"),Z=Symbol.for(\"react.suspense\"),J=Symbol.for(\"react.suspense_list\"),de=Symbol.for(\"react.memo\"),ne=Symbol.for(\"react.lazy\"),se=Symbol.for(\"react.offscreen\"),$=Symbol.iterator;function H(n){return n===null||typeof n!=\"object\"?null:(n=$&&n[$]||n[\"@@iterator\"],typeof n==\"function\"?n:null)}var Q=Object.assign,P;function M(n){if(P===void 0)try{throw Error()}catch(a){var o=a.stack.trim().match(/\\n( *(at )?)/);P=o&&o[1]||\"\"}return`\n`+P+n}var ie=!1;function ae(n,o){if(!n||ie)return\"\";ie=!0;var a=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(o)if(o=function(){throw Error()},Object.defineProperty(o.prototype,\"props\",{set:function(){throw Error()}}),typeof Reflect==\"object\"&&Reflect.construct){try{Reflect.construct(o,[])}catch(z){var c=z}Reflect.construct(n,[],o)}else{try{o.call()}catch(z){c=z}n.call(o.prototype)}else{try{throw Error()}catch(z){c=z}n()}}catch(z){if(z&&c&&typeof z.stack==\"string\"){for(var f=z.stack.split(`\n`),m=c.stack.split(`\n`),S=f.length-1,N=m.length-1;1<=S&&0<=N&&f[S]!==m[N];)N--;for(;1<=S&&0<=N;S--,N--)if(f[S]!==m[N]){if(S!==1||N!==1)do if(S--,N--,0>N||f[S]!==m[N]){var O=`\n`+f[S].replace(\" at new \",\" at \");return n.displayName&&O.includes(\"<anonymous>\")&&(O=O.replace(\"<anonymous>\",n.displayName)),O}while(1<=S&&0<=N);break}}}finally{ie=!1,Error.prepareStackTrace=a}return(n=n?n.displayName||n.name:\"\")?M(n):\"\"}function me(n){switch(n.tag){case 5:return M(n.type);case 16:return M(\"Lazy\");case 13:return M(\"Suspense\");case 19:return M(\"SuspenseList\");case 0:case 2:case 15:return n=ae(n.type,!1),n;case 11:return n=ae(n.type.render,!1),n;case 1:return n=ae(n.type,!0),n;default:return\"\"}}function be(n){if(n==null)return null;if(typeof n==\"function\")return n.displayName||n.name||null;if(typeof n==\"string\")return n;switch(n){case B:return\"Fragment\";case V:return\"Portal\";case G:return\"Profiler\";case te:return\"StrictMode\";case Z:return\"Suspense\";case J:return\"SuspenseList\"}if(typeof n==\"object\")switch(n.$$typeof){case le:return(n.displayName||\"Context\")+\".Consumer\";case W:return(n._context.displayName||\"Context\")+\".Provider\";case K:var o=n.render;return n=n.displayName,n||(n=o.displayName||o.name||\"\",n=n!==\"\"?\"ForwardRef(\"+n+\")\":\"ForwardRef\"),n;case de:return o=n.displayName||null,o!==null?o:be(n.type)||\"Memo\";case ne:o=n._payload,n=n._init;try{return be(n(o))}catch{}}return null}function ee(n){var o=n.type;switch(n.tag){case 24:return\"Cache\";case 9:return(o.displayName||\"Context\")+\".Consumer\";case 10:return(o._context.displayName||\"Context\")+\".Provider\";case 18:return\"DehydratedFragment\";case 11:return n=o.render,n=n.displayName||n.name||\"\",o.displayName||(n!==\"\"?\"ForwardRef(\"+n+\")\":\"ForwardRef\");case 7:return\"Fragment\";case 5:return o;case 4:return\"Portal\";case 3:return\"Root\";case 6:return\"Text\";case 16:return be(o);case 8:return o===te?\"StrictMode\":\"Mode\";case 22:return\"Offscreen\";case 12:return\"Profiler\";case 21:return\"Scope\";case 13:return\"Suspense\";case 19:return\"SuspenseList\";case 25:return\"TracingMarker\";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof o==\"function\")return o.displayName||o.name||null;if(typeof o==\"string\")return o}return null}function ye(n){switch(typeof n){case\"boolean\":case\"number\":case\"string\":case\"undefined\":return n;case\"object\":return n;default:return\"\"}}function Se(n){var o=n.type;return(n=n.nodeName)&&n.toLowerCase()===\"input\"&&(o===\"checkbox\"||o===\"radio\")}function Ne(n){var o=Se(n)?\"checked\":\"value\",a=Object.getOwnPropertyDescriptor(n.constructor.prototype,o),c=\"\"+n[o];if(!n.hasOwnProperty(o)&&typeof a<\"u\"&&typeof a.get==\"function\"&&typeof a.set==\"function\"){var f=a.get,m=a.set;return Object.defineProperty(n,o,{configurable:!0,get:function(){return f.call(this)},set:function(S){c=\"\"+S,m.call(this,S)}}),Object.defineProperty(n,o,{enumerable:a.enumerable}),{getValue:function(){return c},setValue:function(S){c=\"\"+S},stopTracking:function(){n._valueTracker=null,delete n[o]}}}}function Oe(n){n._valueTracker||(n._valueTracker=Ne(n))}function _e(n){if(!n)return!1;var o=n._valueTracker;if(!o)return!0;var a=o.getValue(),c=\"\";return n&&(c=Se(n)?n.checked?\"true\":\"false\":n.value),n=c,n!==a?(o.setValue(n),!0):!1}function et(n){if(n=n||(typeof document<\"u\"?document:void 0),typeof n>\"u\")return null;try{return n.activeElement||n.body}catch{return n.body}}function gt(n,o){var a=o.checked;return Q({},o,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:a??n._wrapperState.initialChecked})}function On(n,o){var a=o.defaultValue==null?\"\":o.defaultValue,c=o.checked!=null?o.checked:o.defaultChecked;a=ye(o.value!=null?o.value:a),n._wrapperState={initialChecked:c,initialValue:a,controlled:o.type===\"checkbox\"||o.type===\"radio\"?o.checked!=null:o.value!=null}}function dn(n,o){o=o.checked,o!=null&&_(n,\"checked\",o,!1)}function fn(n,o){dn(n,o);var a=ye(o.value),c=o.type;if(a!=null)c===\"number\"?(a===0&&n.value===\"\"||n.value!=a)&&(n.value=\"\"+a):n.value!==\"\"+a&&(n.value=\"\"+a);else if(c===\"submit\"||c===\"reset\"){n.removeAttribute(\"value\");return}o.hasOwnProperty(\"value\")?jn(n,o.type,a):o.hasOwnProperty(\"defaultValue\")&&jn(n,o.type,ye(o.defaultValue)),o.checked==null&&o.defaultChecked!=null&&(n.defaultChecked=!!o.defaultChecked)}function wr(n,o,a){if(o.hasOwnProperty(\"value\")||o.hasOwnProperty(\"defaultValue\")){var c=o.type;if(!(c!==\"submit\"&&c!==\"reset\"||o.value!==void 0&&o.value!==null))return;o=\"\"+n._wrapperState.initialValue,a||o===n.value||(n.value=o),n.defaultValue=o}a=n.name,a!==\"\"&&(n.name=\"\"),n.defaultChecked=!!n._wrapperState.initialChecked,a!==\"\"&&(n.name=a)}function jn(n,o,a){(o!==\"number\"||et(n.ownerDocument)!==n)&&(a==null?n.defaultValue=\"\"+n._wrapperState.initialValue:n.defaultValue!==\"\"+a&&(n.defaultValue=\"\"+a))}var br=Array.isArray;function en(n,o,a,c){if(n=n.options,o){o={};for(var f=0;f<a.length;f++)o[\"$\"+a[f]]=!0;for(a=0;a<n.length;a++)f=o.hasOwnProperty(\"$\"+n[a].value),n[a].selected!==f&&(n[a].selected=f),f&&c&&(n[a].defaultSelected=!0)}else{for(a=\"\"+ye(a),o=null,f=0;f<n.length;f++){if(n[f].value===a){n[f].selected=!0,c&&(n[f].defaultSelected=!0);return}o!==null||n[f].disabled||(o=n[f])}o!==null&&(o.selected=!0)}}function Ko(n,o){if(o.dangerouslySetInnerHTML!=null)throw Error(r(91));return Q({},o,{value:void 0,defaultValue:void 0,children:\"\"+n._wrapperState.initialValue})}function _n(n,o){var a=o.value;if(a==null){if(a=o.children,o=o.defaultValue,a!=null){if(o!=null)throw Error(r(92));if(br(a)){if(1<a.length)throw Error(r(93));a=a[0]}o=a}o==null&&(o=\"\"),a=o}n._wrapperState={initialValue:ye(a)}}function ca(n,o){var a=ye(o.value),c=ye(o.defaultValue);a!=null&&(a=\"\"+a,a!==n.value&&(n.value=a),o.defaultValue==null&&n.defaultValue!==a&&(n.defaultValue=a)),c!=null&&(n.defaultValue=\"\"+c)}function ua(n){var o=n.textContent;o===n._wrapperState.initialValue&&o!==\"\"&&o!==null&&(n.value=o)}function Et(n){switch(n){case\"svg\":return\"http://www.w3.org/2000/svg\";case\"math\":return\"http://www.w3.org/1998/Math/MathML\";default:return\"http://www.w3.org/1999/xhtml\"}}function An(n,o){return n==null||n===\"http://www.w3.org/1999/xhtml\"?Et(o):n===\"http://www.w3.org/2000/svg\"&&o===\"foreignObject\"?\"http://www.w3.org/1999/xhtml\":n}var qo,da=(function(n){return typeof MSApp<\"u\"&&MSApp.execUnsafeLocalFunction?function(o,a,c,f){MSApp.execUnsafeLocalFunction(function(){return n(o,a,c,f)})}:n})(function(n,o){if(n.namespaceURI!==\"http://www.w3.org/2000/svg\"||\"innerHTML\"in n)n.innerHTML=o;else{for(qo=qo||document.createElement(\"div\"),qo.innerHTML=\"<svg>\"+o.valueOf().toString()+\"</svg>\",o=qo.firstChild;n.firstChild;)n.removeChild(n.firstChild);for(;o.firstChild;)n.appendChild(o.firstChild)}});function Ln(n,o){if(o){var a=n.firstChild;if(a&&a===n.lastChild&&a.nodeType===3){a.nodeValue=o;return}}n.textContent=o}var ao={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},fa=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(ao).forEach(function(n){fa.forEach(function(o){o=o+n.charAt(0).toUpperCase()+n.substring(1),ao[o]=ao[n]})});function Qo(n,o,a){return o==null||typeof o==\"boolean\"||o===\"\"?\"\":a||typeof o!=\"number\"||o===0||ao.hasOwnProperty(n)&&ao[n]?(\"\"+o).trim():o+\"px\"}function tr(n,o){n=n.style;for(var a in o)if(o.hasOwnProperty(a)){var c=a.indexOf(\"--\")===0,f=Qo(a,o[a],c);a===\"float\"&&(a=\"cssFloat\"),c?n.setProperty(a,f):n[a]=f}}var ha=Q({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function In(n,o){if(o){if(ha[n]&&(o.children!=null||o.dangerouslySetInnerHTML!=null))throw Error(r(137,n));if(o.dangerouslySetInnerHTML!=null){if(o.children!=null)throw Error(r(60));if(typeof o.dangerouslySetInnerHTML!=\"object\"||!(\"__html\"in o.dangerouslySetInnerHTML))throw Error(r(61))}if(o.style!=null&&typeof o.style!=\"object\")throw Error(r(62))}}function ei(n,o){if(n.indexOf(\"-\")===-1)return typeof o.is==\"string\";switch(n){case\"annotation-xml\":case\"color-profile\":case\"font-face\":case\"font-face-src\":case\"font-face-uri\":case\"font-face-format\":case\"font-face-name\":case\"missing-glyph\":return!1;default:return!0}}var ti=null;function Yo(n){return n=n.target||n.srcElement||window,n.correspondingUseElement&&(n=n.correspondingUseElement),n.nodeType===3?n.parentNode:n}var Go=null,Sr=null,Dn=null;function hn(n){if(n=bi(n)){if(typeof Go!=\"function\")throw Error(r(280));var o=n.stateNode;o&&(o=Ma(o),Go(n.stateNode,n.type,o))}}function pa(n){Sr?Dn?Dn.push(n):Dn=[n]:Sr=n}function Ee(){if(Sr){var n=Sr,o=Dn;if(Dn=Sr=null,hn(n),o)for(n=0;n<o.length;n++)hn(o[n])}}function Fe(n,o){return n(o)}function He(){}var kt=!1;function At(n,o,a){if(kt)return n(o,a);kt=!0;try{return Fe(n,o,a)}finally{kt=!1,(Sr!==null||Dn!==null)&&(He(),Ee())}}function Lt(n,o){var a=n.stateNode;if(a===null)return null;var c=Ma(a);if(c===null)return null;a=c[o];e:switch(o){case\"onClick\":case\"onClickCapture\":case\"onDoubleClick\":case\"onDoubleClickCapture\":case\"onMouseDown\":case\"onMouseDownCapture\":case\"onMouseMove\":case\"onMouseMoveCapture\":case\"onMouseUp\":case\"onMouseUpCapture\":case\"onMouseEnter\":(c=!c.disabled)||(n=n.type,c=!(n===\"button\"||n===\"input\"||n===\"select\"||n===\"textarea\")),n=!c;break e;default:n=!1}if(n)return null;if(a&&typeof a!=\"function\")throw Error(r(231,o,typeof a));return a}var pn=!1;if(d)try{var ft={};Object.defineProperty(ft,\"passive\",{get:function(){pn=!0}}),window.addEventListener(\"test\",ft,ft),window.removeEventListener(\"test\",ft,ft)}catch{pn=!1}function Mn(n,o,a,c,f,m,S,N,O){var z=Array.prototype.slice.call(arguments,3);try{o.apply(a,z)}catch(Y){this.onError(Y)}}var ni=!1,ma=null,ga=!1,Rc=null,lw={onError:function(n){ni=!0,ma=n}};function cw(n,o,a,c,f,m,S,N,O){ni=!1,ma=null,Mn.apply(lw,arguments)}function uw(n,o,a,c,f,m,S,N,O){if(cw.apply(this,arguments),ni){if(ni){var z=ma;ni=!1,ma=null}else throw Error(r(198));ga||(ga=!0,Rc=z)}}function lo(n){var o=n,a=n;if(n.alternate)for(;o.return;)o=o.return;else{n=o;do o=n,(o.flags&4098)!==0&&(a=o.return),n=o.return;while(n)}return o.tag===3?a:null}function ch(n){if(n.tag===13){var o=n.memoizedState;if(o===null&&(n=n.alternate,n!==null&&(o=n.memoizedState)),o!==null)return o.dehydrated}return null}function uh(n){if(lo(n)!==n)throw Error(r(188))}function dw(n){var o=n.alternate;if(!o){if(o=lo(n),o===null)throw Error(r(188));return o!==n?null:n}for(var a=n,c=o;;){var f=a.return;if(f===null)break;var m=f.alternate;if(m===null){if(c=f.return,c!==null){a=c;continue}break}if(f.child===m.child){for(m=f.child;m;){if(m===a)return uh(f),n;if(m===c)return uh(f),o;m=m.sibling}throw Error(r(188))}if(a.return!==c.return)a=f,c=m;else{for(var S=!1,N=f.child;N;){if(N===a){S=!0,a=f,c=m;break}if(N===c){S=!0,c=f,a=m;break}N=N.sibling}if(!S){for(N=m.child;N;){if(N===a){S=!0,a=m,c=f;break}if(N===c){S=!0,c=m,a=f;break}N=N.sibling}if(!S)throw Error(r(189))}}if(a.alternate!==c)throw Error(r(190))}if(a.tag!==3)throw Error(r(188));return a.stateNode.current===a?n:o}function dh(n){return n=dw(n),n!==null?fh(n):null}function fh(n){if(n.tag===5||n.tag===6)return n;for(n=n.child;n!==null;){var o=fh(n);if(o!==null)return o;n=n.sibling}return null}var hh=e.unstable_scheduleCallback,ph=e.unstable_cancelCallback,fw=e.unstable_shouldYield,hw=e.unstable_requestPaint,tt=e.unstable_now,pw=e.unstable_getCurrentPriorityLevel,Pc=e.unstable_ImmediatePriority,mh=e.unstable_UserBlockingPriority,ya=e.unstable_NormalPriority,mw=e.unstable_LowPriority,gh=e.unstable_IdlePriority,va=null,Fn=null;function gw(n){if(Fn&&typeof Fn.onCommitFiberRoot==\"function\")try{Fn.onCommitFiberRoot(va,n,void 0,(n.current.flags&128)===128)}catch{}}var mn=Math.clz32?Math.clz32:xw,yw=Math.log,vw=Math.LN2;function xw(n){return n>>>=0,n===0?32:31-(yw(n)/vw|0)|0}var xa=64,wa=4194304;function ri(n){switch(n&-n){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return n&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return n&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return n}}function ba(n,o){var a=n.pendingLanes;if(a===0)return 0;var c=0,f=n.suspendedLanes,m=n.pingedLanes,S=a&268435455;if(S!==0){var N=S&~f;N!==0?c=ri(N):(m&=S,m!==0&&(c=ri(m)))}else S=a&~f,S!==0?c=ri(S):m!==0&&(c=ri(m));if(c===0)return 0;if(o!==0&&o!==c&&(o&f)===0&&(f=c&-c,m=o&-o,f>=m||f===16&&(m&4194240)!==0))return o;if((c&4)!==0&&(c|=a&16),o=n.entangledLanes,o!==0)for(n=n.entanglements,o&=c;0<o;)a=31-mn(o),f=1<<a,c|=n[a],o&=~f;return c}function ww(n,o){switch(n){case 1:case 2:case 4:return o+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return o+5e3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function bw(n,o){for(var a=n.suspendedLanes,c=n.pingedLanes,f=n.expirationTimes,m=n.pendingLanes;0<m;){var S=31-mn(m),N=1<<S,O=f[S];O===-1?((N&a)===0||(N&c)!==0)&&(f[S]=ww(N,o)):O<=o&&(n.expiredLanes|=N),m&=~N}}function Tc(n){return n=n.pendingLanes&-1073741825,n!==0?n:n&1073741824?1073741824:0}function yh(){var n=xa;return xa<<=1,(xa&4194240)===0&&(xa=64),n}function Oc(n){for(var o=[],a=0;31>a;a++)o.push(n);return o}function oi(n,o,a){n.pendingLanes|=o,o!==536870912&&(n.suspendedLanes=0,n.pingedLanes=0),n=n.eventTimes,o=31-mn(o),n[o]=a}function Sw(n,o){var a=n.pendingLanes&~o;n.pendingLanes=o,n.suspendedLanes=0,n.pingedLanes=0,n.expiredLanes&=o,n.mutableReadLanes&=o,n.entangledLanes&=o,o=n.entanglements;var c=n.eventTimes;for(n=n.expirationTimes;0<a;){var f=31-mn(a),m=1<<f;o[f]=0,c[f]=-1,n[f]=-1,a&=~m}}function jc(n,o){var a=n.entangledLanes|=o;for(n=n.entanglements;a;){var c=31-mn(a),f=1<<c;f&o|n[c]&o&&(n[c]|=o),a&=~f}}var Ue=0;function vh(n){return n&=-n,1<n?4<n?(n&268435455)!==0?16:536870912:4:1}var xh,_c,wh,bh,Sh,Ac=!1,Sa=[],Cr=null,Er=null,kr=null,si=new Map,ii=new Map,Nr=[],Cw=\"mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit\".split(\" \");function Ch(n,o){switch(n){case\"focusin\":case\"focusout\":Cr=null;break;case\"dragenter\":case\"dragleave\":Er=null;break;case\"mouseover\":case\"mouseout\":kr=null;break;case\"pointerover\":case\"pointerout\":si.delete(o.pointerId);break;case\"gotpointercapture\":case\"lostpointercapture\":ii.delete(o.pointerId)}}function ai(n,o,a,c,f,m){return n===null||n.nativeEvent!==m?(n={blockedOn:o,domEventName:a,eventSystemFlags:c,nativeEvent:m,targetContainers:[f]},o!==null&&(o=bi(o),o!==null&&_c(o)),n):(n.eventSystemFlags|=c,o=n.targetContainers,f!==null&&o.indexOf(f)===-1&&o.push(f),n)}function Ew(n,o,a,c,f){switch(o){case\"focusin\":return Cr=ai(Cr,n,o,a,c,f),!0;case\"dragenter\":return Er=ai(Er,n,o,a,c,f),!0;case\"mouseover\":return kr=ai(kr,n,o,a,c,f),!0;case\"pointerover\":var m=f.pointerId;return si.set(m,ai(si.get(m)||null,n,o,a,c,f)),!0;case\"gotpointercapture\":return m=f.pointerId,ii.set(m,ai(ii.get(m)||null,n,o,a,c,f)),!0}return!1}function Eh(n){var o=co(n.target);if(o!==null){var a=lo(o);if(a!==null){if(o=a.tag,o===13){if(o=ch(a),o!==null){n.blockedOn=o,Sh(n.priority,function(){wh(a)});return}}else if(o===3&&a.stateNode.current.memoizedState.isDehydrated){n.blockedOn=a.tag===3?a.stateNode.containerInfo:null;return}}}n.blockedOn=null}function Ca(n){if(n.blockedOn!==null)return!1;for(var o=n.targetContainers;0<o.length;){var a=Ic(n.domEventName,n.eventSystemFlags,o[0],n.nativeEvent);if(a===null){a=n.nativeEvent;var c=new a.constructor(a.type,a);ti=c,a.target.dispatchEvent(c),ti=null}else return o=bi(a),o!==null&&_c(o),n.blockedOn=a,!1;o.shift()}return!0}function kh(n,o,a){Ca(n)&&a.delete(o)}function kw(){Ac=!1,Cr!==null&&Ca(Cr)&&(Cr=null),Er!==null&&Ca(Er)&&(Er=null),kr!==null&&Ca(kr)&&(kr=null),si.forEach(kh),ii.forEach(kh)}function li(n,o){n.blockedOn===o&&(n.blockedOn=null,Ac||(Ac=!0,e.unstable_scheduleCallback(e.unstable_NormalPriority,kw)))}function ci(n){function o(f){return li(f,n)}if(0<Sa.length){li(Sa[0],n);for(var a=1;a<Sa.length;a++){var c=Sa[a];c.blockedOn===n&&(c.blockedOn=null)}}for(Cr!==null&&li(Cr,n),Er!==null&&li(Er,n),kr!==null&&li(kr,n),si.forEach(o),ii.forEach(o),a=0;a<Nr.length;a++)c=Nr[a],c.blockedOn===n&&(c.blockedOn=null);for(;0<Nr.length&&(a=Nr[0],a.blockedOn===null);)Eh(a),a.blockedOn===null&&Nr.shift()}var Xo=A.ReactCurrentBatchConfig,Ea=!0;function Nw(n,o,a,c){var f=Ue,m=Xo.transition;Xo.transition=null;try{Ue=1,Lc(n,o,a,c)}finally{Ue=f,Xo.transition=m}}function Rw(n,o,a,c){var f=Ue,m=Xo.transition;Xo.transition=null;try{Ue=4,Lc(n,o,a,c)}finally{Ue=f,Xo.transition=m}}function Lc(n,o,a,c){if(Ea){var f=Ic(n,o,a,c);if(f===null)Jc(n,o,c,ka,a),Ch(n,c);else if(Ew(f,n,o,a,c))c.stopPropagation();else if(Ch(n,c),o&4&&-1<Cw.indexOf(n)){for(;f!==null;){var m=bi(f);if(m!==null&&xh(m),m=Ic(n,o,a,c),m===null&&Jc(n,o,c,ka,a),m===f)break;f=m}f!==null&&c.stopPropagation()}else Jc(n,o,c,null,a)}}var ka=null;function Ic(n,o,a,c){if(ka=null,n=Yo(c),n=co(n),n!==null)if(o=lo(n),o===null)n=null;else if(a=o.tag,a===13){if(n=ch(o),n!==null)return n;n=null}else if(a===3){if(o.stateNode.current.memoizedState.isDehydrated)return o.tag===3?o.stateNode.containerInfo:null;n=null}else o!==n&&(n=null);return ka=n,null}function Nh(n){switch(n){case\"cancel\":case\"click\":case\"close\":case\"contextmenu\":case\"copy\":case\"cut\":case\"auxclick\":case\"dblclick\":case\"dragend\":case\"dragstart\":case\"drop\":case\"focusin\":case\"focusout\":case\"input\":case\"invalid\":case\"keydown\":case\"keypress\":case\"keyup\":case\"mousedown\":case\"mouseup\":case\"paste\":case\"pause\":case\"play\":case\"pointercancel\":case\"pointerdown\":case\"pointerup\":case\"ratechange\":case\"reset\":case\"resize\":case\"seeked\":case\"submit\":case\"touchcancel\":case\"touchend\":case\"touchstart\":case\"volumechange\":case\"change\":case\"selectionchange\":case\"textInput\":case\"compositionstart\":case\"compositionend\":case\"compositionupdate\":case\"beforeblur\":case\"afterblur\":case\"beforeinput\":case\"blur\":case\"fullscreenchange\":case\"focus\":case\"hashchange\":case\"popstate\":case\"select\":case\"selectstart\":return 1;case\"drag\":case\"dragenter\":case\"dragexit\":case\"dragleave\":case\"dragover\":case\"mousemove\":case\"mouseout\":case\"mouseover\":case\"pointermove\":case\"pointerout\":case\"pointerover\":case\"scroll\":case\"toggle\":case\"touchmove\":case\"wheel\":case\"mouseenter\":case\"mouseleave\":case\"pointerenter\":case\"pointerleave\":return 4;case\"message\":switch(pw()){case Pc:return 1;case mh:return 4;case ya:case mw:return 16;case gh:return 536870912;default:return 16}default:return 16}}var Rr=null,Dc=null,Na=null;function Rh(){if(Na)return Na;var n,o=Dc,a=o.length,c,f=\"value\"in Rr?Rr.value:Rr.textContent,m=f.length;for(n=0;n<a&&o[n]===f[n];n++);var S=a-n;for(c=1;c<=S&&o[a-c]===f[m-c];c++);return Na=f.slice(n,1<c?1-c:void 0)}function Ra(n){var o=n.keyCode;return\"charCode\"in n?(n=n.charCode,n===0&&o===13&&(n=13)):n=o,n===10&&(n=13),32<=n||n===13?n:0}function Pa(){return!0}function Ph(){return!1}function qt(n){function o(a,c,f,m,S){this._reactName=a,this._targetInst=f,this.type=c,this.nativeEvent=m,this.target=S,this.currentTarget=null;for(var N in n)n.hasOwnProperty(N)&&(a=n[N],this[N]=a?a(m):m[N]);return this.isDefaultPrevented=(m.defaultPrevented!=null?m.defaultPrevented:m.returnValue===!1)?Pa:Ph,this.isPropagationStopped=Ph,this}return Q(o.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():typeof a.returnValue!=\"unknown\"&&(a.returnValue=!1),this.isDefaultPrevented=Pa)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():typeof a.cancelBubble!=\"unknown\"&&(a.cancelBubble=!0),this.isPropagationStopped=Pa)},persist:function(){},isPersistent:Pa}),o}var Jo={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(n){return n.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},Mc=qt(Jo),ui=Q({},Jo,{view:0,detail:0}),Pw=qt(ui),Fc,zc,di,Ta=Q({},ui,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Uc,button:0,buttons:0,relatedTarget:function(n){return n.relatedTarget===void 0?n.fromElement===n.srcElement?n.toElement:n.fromElement:n.relatedTarget},movementX:function(n){return\"movementX\"in n?n.movementX:(n!==di&&(di&&n.type===\"mousemove\"?(Fc=n.screenX-di.screenX,zc=n.screenY-di.screenY):zc=Fc=0,di=n),Fc)},movementY:function(n){return\"movementY\"in n?n.movementY:zc}}),Th=qt(Ta),Tw=Q({},Ta,{dataTransfer:0}),Ow=qt(Tw),jw=Q({},ui,{relatedTarget:0}),$c=qt(jw),_w=Q({},Jo,{animationName:0,elapsedTime:0,pseudoElement:0}),Aw=qt(_w),Lw=Q({},Jo,{clipboardData:function(n){return\"clipboardData\"in n?n.clipboardData:window.clipboardData}}),Iw=qt(Lw),Dw=Q({},Jo,{data:0}),Oh=qt(Dw),Mw={Esc:\"Escape\",Spacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},Fw={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",116:\"F5\",117:\"F6\",118:\"F7\",119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"},zw={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};function $w(n){var o=this.nativeEvent;return o.getModifierState?o.getModifierState(n):(n=zw[n])?!!o[n]:!1}function Uc(){return $w}var Uw=Q({},ui,{key:function(n){if(n.key){var o=Mw[n.key]||n.key;if(o!==\"Unidentified\")return o}return n.type===\"keypress\"?(n=Ra(n),n===13?\"Enter\":String.fromCharCode(n)):n.type===\"keydown\"||n.type===\"keyup\"?Fw[n.keyCode]||\"Unidentified\":\"\"},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Uc,charCode:function(n){return n.type===\"keypress\"?Ra(n):0},keyCode:function(n){return n.type===\"keydown\"||n.type===\"keyup\"?n.keyCode:0},which:function(n){return n.type===\"keypress\"?Ra(n):n.type===\"keydown\"||n.type===\"keyup\"?n.keyCode:0}}),Bw=qt(Uw),Hw=Q({},Ta,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),jh=qt(Hw),Vw=Q({},ui,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Uc}),Ww=qt(Vw),Kw=Q({},Jo,{propertyName:0,elapsedTime:0,pseudoElement:0}),qw=qt(Kw),Qw=Q({},Ta,{deltaX:function(n){return\"deltaX\"in n?n.deltaX:\"wheelDeltaX\"in n?-n.wheelDeltaX:0},deltaY:function(n){return\"deltaY\"in n?n.deltaY:\"wheelDeltaY\"in n?-n.wheelDeltaY:\"wheelDelta\"in n?-n.wheelDelta:0},deltaZ:0,deltaMode:0}),Yw=qt(Qw),Gw=[9,13,27,32],Bc=d&&\"CompositionEvent\"in window,fi=null;d&&\"documentMode\"in document&&(fi=document.documentMode);var Xw=d&&\"TextEvent\"in window&&!fi,_h=d&&(!Bc||fi&&8<fi&&11>=fi),Ah=\" \",Lh=!1;function Ih(n,o){switch(n){case\"keyup\":return Gw.indexOf(o.keyCode)!==-1;case\"keydown\":return o.keyCode!==229;case\"keypress\":case\"mousedown\":case\"focusout\":return!0;default:return!1}}function Dh(n){return n=n.detail,typeof n==\"object\"&&\"data\"in n?n.data:null}var Zo=!1;function Jw(n,o){switch(n){case\"compositionend\":return Dh(o);case\"keypress\":return o.which!==32?null:(Lh=!0,Ah);case\"textInput\":return n=o.data,n===Ah&&Lh?null:n;default:return null}}function Zw(n,o){if(Zo)return n===\"compositionend\"||!Bc&&Ih(n,o)?(n=Rh(),Na=Dc=Rr=null,Zo=!1,n):null;switch(n){case\"paste\":return null;case\"keypress\":if(!(o.ctrlKey||o.altKey||o.metaKey)||o.ctrlKey&&o.altKey){if(o.char&&1<o.char.length)return o.char;if(o.which)return String.fromCharCode(o.which)}return null;case\"compositionend\":return _h&&o.locale!==\"ko\"?null:o.data;default:return null}}var eb={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Mh(n){var o=n&&n.nodeName&&n.nodeName.toLowerCase();return o===\"input\"?!!eb[n.type]:o===\"textarea\"}function Fh(n,o,a,c){pa(c),o=La(o,\"onChange\"),0<o.length&&(a=new Mc(\"onChange\",\"change\",null,a,c),n.push({event:a,listeners:o}))}var hi=null,pi=null;function tb(n){np(n,0)}function Oa(n){var o=os(n);if(_e(o))return n}function nb(n,o){if(n===\"change\")return o}var zh=!1;if(d){var Hc;if(d){var Vc=\"oninput\"in document;if(!Vc){var $h=document.createElement(\"div\");$h.setAttribute(\"oninput\",\"return;\"),Vc=typeof $h.oninput==\"function\"}Hc=Vc}else Hc=!1;zh=Hc&&(!document.documentMode||9<document.documentMode)}function Uh(){hi&&(hi.detachEvent(\"onpropertychange\",Bh),pi=hi=null)}function Bh(n){if(n.propertyName===\"value\"&&Oa(pi)){var o=[];Fh(o,pi,n,Yo(n)),At(tb,o)}}function rb(n,o,a){n===\"focusin\"?(Uh(),hi=o,pi=a,hi.attachEvent(\"onpropertychange\",Bh)):n===\"focusout\"&&Uh()}function ob(n){if(n===\"selectionchange\"||n===\"keyup\"||n===\"keydown\")return Oa(pi)}function sb(n,o){if(n===\"click\")return Oa(o)}function ib(n,o){if(n===\"input\"||n===\"change\")return Oa(o)}function ab(n,o){return n===o&&(n!==0||1/n===1/o)||n!==n&&o!==o}var gn=typeof Object.is==\"function\"?Object.is:ab;function mi(n,o){if(gn(n,o))return!0;if(typeof n!=\"object\"||n===null||typeof o!=\"object\"||o===null)return!1;var a=Object.keys(n),c=Object.keys(o);if(a.length!==c.length)return!1;for(c=0;c<a.length;c++){var f=a[c];if(!h.call(o,f)||!gn(n[f],o[f]))return!1}return!0}function Hh(n){for(;n&&n.firstChild;)n=n.firstChild;return n}function Vh(n,o){var a=Hh(n);n=0;for(var c;a;){if(a.nodeType===3){if(c=n+a.textContent.length,n<=o&&c>=o)return{node:a,offset:o-n};n=c}e:{for(;a;){if(a.nextSibling){a=a.nextSibling;break e}a=a.parentNode}a=void 0}a=Hh(a)}}function Wh(n,o){return n&&o?n===o?!0:n&&n.nodeType===3?!1:o&&o.nodeType===3?Wh(n,o.parentNode):\"contains\"in n?n.contains(o):n.compareDocumentPosition?!!(n.compareDocumentPosition(o)&16):!1:!1}function Kh(){for(var n=window,o=et();o instanceof n.HTMLIFrameElement;){try{var a=typeof o.contentWindow.location.href==\"string\"}catch{a=!1}if(a)n=o.contentWindow;else break;o=et(n.document)}return o}function Wc(n){var o=n&&n.nodeName&&n.nodeName.toLowerCase();return o&&(o===\"input\"&&(n.type===\"text\"||n.type===\"search\"||n.type===\"tel\"||n.type===\"url\"||n.type===\"password\")||o===\"textarea\"||n.contentEditable===\"true\")}function lb(n){var o=Kh(),a=n.focusedElem,c=n.selectionRange;if(o!==a&&a&&a.ownerDocument&&Wh(a.ownerDocument.documentElement,a)){if(c!==null&&Wc(a)){if(o=c.start,n=c.end,n===void 0&&(n=o),\"selectionStart\"in a)a.selectionStart=o,a.selectionEnd=Math.min(n,a.value.length);else if(n=(o=a.ownerDocument||document)&&o.defaultView||window,n.getSelection){n=n.getSelection();var f=a.textContent.length,m=Math.min(c.start,f);c=c.end===void 0?m:Math.min(c.end,f),!n.extend&&m>c&&(f=c,c=m,m=f),f=Vh(a,m);var S=Vh(a,c);f&&S&&(n.rangeCount!==1||n.anchorNode!==f.node||n.anchorOffset!==f.offset||n.focusNode!==S.node||n.focusOffset!==S.offset)&&(o=o.createRange(),o.setStart(f.node,f.offset),n.removeAllRanges(),m>c?(n.addRange(o),n.extend(S.node,S.offset)):(o.setEnd(S.node,S.offset),n.addRange(o)))}}for(o=[],n=a;n=n.parentNode;)n.nodeType===1&&o.push({element:n,left:n.scrollLeft,top:n.scrollTop});for(typeof a.focus==\"function\"&&a.focus(),a=0;a<o.length;a++)n=o[a],n.element.scrollLeft=n.left,n.element.scrollTop=n.top}}var cb=d&&\"documentMode\"in document&&11>=document.documentMode,es=null,Kc=null,gi=null,qc=!1;function qh(n,o,a){var c=a.window===a?a.document:a.nodeType===9?a:a.ownerDocument;qc||es==null||es!==et(c)||(c=es,\"selectionStart\"in c&&Wc(c)?c={start:c.selectionStart,end:c.selectionEnd}:(c=(c.ownerDocument&&c.ownerDocument.defaultView||window).getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset}),gi&&mi(gi,c)||(gi=c,c=La(Kc,\"onSelect\"),0<c.length&&(o=new Mc(\"onSelect\",\"select\",null,o,a),n.push({event:o,listeners:c}),o.target=es)))}function ja(n,o){var a={};return a[n.toLowerCase()]=o.toLowerCase(),a[\"Webkit\"+n]=\"webkit\"+o,a[\"Moz\"+n]=\"moz\"+o,a}var ts={animationend:ja(\"Animation\",\"AnimationEnd\"),animationiteration:ja(\"Animation\",\"AnimationIteration\"),animationstart:ja(\"Animation\",\"AnimationStart\"),transitionend:ja(\"Transition\",\"TransitionEnd\")},Qc={},Qh={};d&&(Qh=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete ts.animationend.animation,delete ts.animationiteration.animation,delete ts.animationstart.animation),\"TransitionEvent\"in window||delete ts.transitionend.transition);function _a(n){if(Qc[n])return Qc[n];if(!ts[n])return n;var o=ts[n],a;for(a in o)if(o.hasOwnProperty(a)&&a in Qh)return Qc[n]=o[a];return n}var Yh=_a(\"animationend\"),Gh=_a(\"animationiteration\"),Xh=_a(\"animationstart\"),Jh=_a(\"transitionend\"),Zh=new Map,ep=\"abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel\".split(\" \");function Pr(n,o){Zh.set(n,o),l(o,[n])}for(var Yc=0;Yc<ep.length;Yc++){var Gc=ep[Yc],ub=Gc.toLowerCase(),db=Gc[0].toUpperCase()+Gc.slice(1);Pr(ub,\"on\"+db)}Pr(Yh,\"onAnimationEnd\"),Pr(Gh,\"onAnimationIteration\"),Pr(Xh,\"onAnimationStart\"),Pr(\"dblclick\",\"onDoubleClick\"),Pr(\"focusin\",\"onFocus\"),Pr(\"focusout\",\"onBlur\"),Pr(Jh,\"onTransitionEnd\"),u(\"onMouseEnter\",[\"mouseout\",\"mouseover\"]),u(\"onMouseLeave\",[\"mouseout\",\"mouseover\"]),u(\"onPointerEnter\",[\"pointerout\",\"pointerover\"]),u(\"onPointerLeave\",[\"pointerout\",\"pointerover\"]),l(\"onChange\",\"change click focusin focusout input keydown keyup selectionchange\".split(\" \")),l(\"onSelect\",\"focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange\".split(\" \")),l(\"onBeforeInput\",[\"compositionend\",\"keypress\",\"textInput\",\"paste\"]),l(\"onCompositionEnd\",\"compositionend focusout keydown keypress keyup mousedown\".split(\" \")),l(\"onCompositionStart\",\"compositionstart focusout keydown keypress keyup mousedown\".split(\" \")),l(\"onCompositionUpdate\",\"compositionupdate focusout keydown keypress keyup mousedown\".split(\" \"));var yi=\"abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting\".split(\" \"),fb=new Set(\"cancel close invalid load scroll toggle\".split(\" \").concat(yi));function tp(n,o,a){var c=n.type||\"unknown-event\";n.currentTarget=a,uw(c,o,void 0,n),n.currentTarget=null}function np(n,o){o=(o&4)!==0;for(var a=0;a<n.length;a++){var c=n[a],f=c.event;c=c.listeners;e:{var m=void 0;if(o)for(var S=c.length-1;0<=S;S--){var N=c[S],O=N.instance,z=N.currentTarget;if(N=N.listener,O!==m&&f.isPropagationStopped())break e;tp(f,N,z),m=O}else for(S=0;S<c.length;S++){if(N=c[S],O=N.instance,z=N.currentTarget,N=N.listener,O!==m&&f.isPropagationStopped())break e;tp(f,N,z),m=O}}}if(ga)throw n=Rc,ga=!1,Rc=null,n}function Ke(n,o){var a=o[ou];a===void 0&&(a=o[ou]=new Set);var c=n+\"__bubble\";a.has(c)||(rp(o,n,2,!1),a.add(c))}function Xc(n,o,a){var c=0;o&&(c|=4),rp(a,n,c,o)}var Aa=\"_reactListening\"+Math.random().toString(36).slice(2);function vi(n){if(!n[Aa]){n[Aa]=!0,s.forEach(function(a){a!==\"selectionchange\"&&(fb.has(a)||Xc(a,!1,n),Xc(a,!0,n))});var o=n.nodeType===9?n:n.ownerDocument;o===null||o[Aa]||(o[Aa]=!0,Xc(\"selectionchange\",!1,o))}}function rp(n,o,a,c){switch(Nh(o)){case 1:var f=Nw;break;case 4:f=Rw;break;default:f=Lc}a=f.bind(null,o,a,n),f=void 0,!pn||o!==\"touchstart\"&&o!==\"touchmove\"&&o!==\"wheel\"||(f=!0),c?f!==void 0?n.addEventListener(o,a,{capture:!0,passive:f}):n.addEventListener(o,a,!0):f!==void 0?n.addEventListener(o,a,{passive:f}):n.addEventListener(o,a,!1)}function Jc(n,o,a,c,f){var m=c;if((o&1)===0&&(o&2)===0&&c!==null)e:for(;;){if(c===null)return;var S=c.tag;if(S===3||S===4){var N=c.stateNode.containerInfo;if(N===f||N.nodeType===8&&N.parentNode===f)break;if(S===4)for(S=c.return;S!==null;){var O=S.tag;if((O===3||O===4)&&(O=S.stateNode.containerInfo,O===f||O.nodeType===8&&O.parentNode===f))return;S=S.return}for(;N!==null;){if(S=co(N),S===null)return;if(O=S.tag,O===5||O===6){c=m=S;continue e}N=N.parentNode}}c=c.return}At(function(){var z=m,Y=Yo(a),X=[];e:{var q=Zh.get(n);if(q!==void 0){var ue=Mc,he=n;switch(n){case\"keypress\":if(Ra(a)===0)break e;case\"keydown\":case\"keyup\":ue=Bw;break;case\"focusin\":he=\"focus\",ue=$c;break;case\"focusout\":he=\"blur\",ue=$c;break;case\"beforeblur\":case\"afterblur\":ue=$c;break;case\"click\":if(a.button===2)break e;case\"auxclick\":case\"dblclick\":case\"mousedown\":case\"mousemove\":case\"mouseup\":case\"mouseout\":case\"mouseover\":case\"contextmenu\":ue=Th;break;case\"drag\":case\"dragend\":case\"dragenter\":case\"dragexit\":case\"dragleave\":case\"dragover\":case\"dragstart\":case\"drop\":ue=Ow;break;case\"touchcancel\":case\"touchend\":case\"touchmove\":case\"touchstart\":ue=Ww;break;case Yh:case Gh:case Xh:ue=Aw;break;case Jh:ue=qw;break;case\"scroll\":ue=Pw;break;case\"wheel\":ue=Yw;break;case\"copy\":case\"cut\":case\"paste\":ue=Iw;break;case\"gotpointercapture\":case\"lostpointercapture\":case\"pointercancel\":case\"pointerdown\":case\"pointermove\":case\"pointerout\":case\"pointerover\":case\"pointerup\":ue=jh}var pe=(o&4)!==0,nt=!pe&&n===\"scroll\",I=pe?q!==null?q+\"Capture\":null:q;pe=[];for(var L=z,D;L!==null;){D=L;var re=D.stateNode;if(D.tag===5&&re!==null&&(D=re,I!==null&&(re=Lt(L,I),re!=null&&pe.push(xi(L,re,D)))),nt)break;L=L.return}0<pe.length&&(q=new ue(q,he,null,a,Y),X.push({event:q,listeners:pe}))}}if((o&7)===0){e:{if(q=n===\"mouseover\"||n===\"pointerover\",ue=n===\"mouseout\"||n===\"pointerout\",q&&a!==ti&&(he=a.relatedTarget||a.fromElement)&&(co(he)||he[nr]))break e;if((ue||q)&&(q=Y.window===Y?Y:(q=Y.ownerDocument)?q.defaultView||q.parentWindow:window,ue?(he=a.relatedTarget||a.toElement,ue=z,he=he?co(he):null,he!==null&&(nt=lo(he),he!==nt||he.tag!==5&&he.tag!==6)&&(he=null)):(ue=null,he=z),ue!==he)){if(pe=Th,re=\"onMouseLeave\",I=\"onMouseEnter\",L=\"mouse\",(n===\"pointerout\"||n===\"pointerover\")&&(pe=jh,re=\"onPointerLeave\",I=\"onPointerEnter\",L=\"pointer\"),nt=ue==null?q:os(ue),D=he==null?q:os(he),q=new pe(re,L+\"leave\",ue,a,Y),q.target=nt,q.relatedTarget=D,re=null,co(Y)===z&&(pe=new pe(I,L+\"enter\",he,a,Y),pe.target=D,pe.relatedTarget=nt,re=pe),nt=re,ue&&he)t:{for(pe=ue,I=he,L=0,D=pe;D;D=ns(D))L++;for(D=0,re=I;re;re=ns(re))D++;for(;0<L-D;)pe=ns(pe),L--;for(;0<D-L;)I=ns(I),D--;for(;L--;){if(pe===I||I!==null&&pe===I.alternate)break t;pe=ns(pe),I=ns(I)}pe=null}else pe=null;ue!==null&&op(X,q,ue,pe,!1),he!==null&&nt!==null&&op(X,nt,he,pe,!0)}}e:{if(q=z?os(z):window,ue=q.nodeName&&q.nodeName.toLowerCase(),ue===\"select\"||ue===\"input\"&&q.type===\"file\")var ge=nb;else if(Mh(q))if(zh)ge=ib;else{ge=ob;var xe=rb}else(ue=q.nodeName)&&ue.toLowerCase()===\"input\"&&(q.type===\"checkbox\"||q.type===\"radio\")&&(ge=sb);if(ge&&(ge=ge(n,z))){Fh(X,ge,a,Y);break e}xe&&xe(n,q,z),n===\"focusout\"&&(xe=q._wrapperState)&&xe.controlled&&q.type===\"number\"&&jn(q,\"number\",q.value)}switch(xe=z?os(z):window,n){case\"focusin\":(Mh(xe)||xe.contentEditable===\"true\")&&(es=xe,Kc=z,gi=null);break;case\"focusout\":gi=Kc=es=null;break;case\"mousedown\":qc=!0;break;case\"contextmenu\":case\"mouseup\":case\"dragend\":qc=!1,qh(X,a,Y);break;case\"selectionchange\":if(cb)break;case\"keydown\":case\"keyup\":qh(X,a,Y)}var we;if(Bc)e:{switch(n){case\"compositionstart\":var Ce=\"onCompositionStart\";break e;case\"compositionend\":Ce=\"onCompositionEnd\";break e;case\"compositionupdate\":Ce=\"onCompositionUpdate\";break e}Ce=void 0}else Zo?Ih(n,a)&&(Ce=\"onCompositionEnd\"):n===\"keydown\"&&a.keyCode===229&&(Ce=\"onCompositionStart\");Ce&&(_h&&a.locale!==\"ko\"&&(Zo||Ce!==\"onCompositionStart\"?Ce===\"onCompositionEnd\"&&Zo&&(we=Rh()):(Rr=Y,Dc=\"value\"in Rr?Rr.value:Rr.textContent,Zo=!0)),xe=La(z,Ce),0<xe.length&&(Ce=new Oh(Ce,n,null,a,Y),X.push({event:Ce,listeners:xe}),we?Ce.data=we:(we=Dh(a),we!==null&&(Ce.data=we)))),(we=Xw?Jw(n,a):Zw(n,a))&&(z=La(z,\"onBeforeInput\"),0<z.length&&(Y=new Oh(\"onBeforeInput\",\"beforeinput\",null,a,Y),X.push({event:Y,listeners:z}),Y.data=we))}np(X,o)})}function xi(n,o,a){return{instance:n,listener:o,currentTarget:a}}function La(n,o){for(var a=o+\"Capture\",c=[];n!==null;){var f=n,m=f.stateNode;f.tag===5&&m!==null&&(f=m,m=Lt(n,a),m!=null&&c.unshift(xi(n,m,f)),m=Lt(n,o),m!=null&&c.push(xi(n,m,f))),n=n.return}return c}function ns(n){if(n===null)return null;do n=n.return;while(n&&n.tag!==5);return n||null}function op(n,o,a,c,f){for(var m=o._reactName,S=[];a!==null&&a!==c;){var N=a,O=N.alternate,z=N.stateNode;if(O!==null&&O===c)break;N.tag===5&&z!==null&&(N=z,f?(O=Lt(a,m),O!=null&&S.unshift(xi(a,O,N))):f||(O=Lt(a,m),O!=null&&S.push(xi(a,O,N)))),a=a.return}S.length!==0&&n.push({event:o,listeners:S})}var hb=/\\r\\n?/g,pb=/\\u0000|\\uFFFD/g;function sp(n){return(typeof n==\"string\"?n:\"\"+n).replace(hb,`\n`).replace(pb,\"\")}function Ia(n,o,a){if(o=sp(o),sp(n)!==o&&a)throw Error(r(425))}function Da(){}var Zc=null,eu=null;function tu(n,o){return n===\"textarea\"||n===\"noscript\"||typeof o.children==\"string\"||typeof o.children==\"number\"||typeof o.dangerouslySetInnerHTML==\"object\"&&o.dangerouslySetInnerHTML!==null&&o.dangerouslySetInnerHTML.__html!=null}var nu=typeof setTimeout==\"function\"?setTimeout:void 0,mb=typeof clearTimeout==\"function\"?clearTimeout:void 0,ip=typeof Promise==\"function\"?Promise:void 0,gb=typeof queueMicrotask==\"function\"?queueMicrotask:typeof ip<\"u\"?function(n){return ip.resolve(null).then(n).catch(yb)}:nu;function yb(n){setTimeout(function(){throw n})}function ru(n,o){var a=o,c=0;do{var f=a.nextSibling;if(n.removeChild(a),f&&f.nodeType===8)if(a=f.data,a===\"/$\"){if(c===0){n.removeChild(f),ci(o);return}c--}else a!==\"$\"&&a!==\"$?\"&&a!==\"$!\"||c++;a=f}while(a);ci(o)}function Tr(n){for(;n!=null;n=n.nextSibling){var o=n.nodeType;if(o===1||o===3)break;if(o===8){if(o=n.data,o===\"$\"||o===\"$!\"||o===\"$?\")break;if(o===\"/$\")return null}}return n}function ap(n){n=n.previousSibling;for(var o=0;n;){if(n.nodeType===8){var a=n.data;if(a===\"$\"||a===\"$!\"||a===\"$?\"){if(o===0)return n;o--}else a===\"/$\"&&o++}n=n.previousSibling}return null}var rs=Math.random().toString(36).slice(2),zn=\"__reactFiber$\"+rs,wi=\"__reactProps$\"+rs,nr=\"__reactContainer$\"+rs,ou=\"__reactEvents$\"+rs,vb=\"__reactListeners$\"+rs,xb=\"__reactHandles$\"+rs;function co(n){var o=n[zn];if(o)return o;for(var a=n.parentNode;a;){if(o=a[nr]||a[zn]){if(a=o.alternate,o.child!==null||a!==null&&a.child!==null)for(n=ap(n);n!==null;){if(a=n[zn])return a;n=ap(n)}return o}n=a,a=n.parentNode}return null}function bi(n){return n=n[zn]||n[nr],!n||n.tag!==5&&n.tag!==6&&n.tag!==13&&n.tag!==3?null:n}function os(n){if(n.tag===5||n.tag===6)return n.stateNode;throw Error(r(33))}function Ma(n){return n[wi]||null}var su=[],ss=-1;function Or(n){return{current:n}}function qe(n){0>ss||(n.current=su[ss],su[ss]=null,ss--)}function We(n,o){ss++,su[ss]=n.current,n.current=o}var jr={},yt=Or(jr),It=Or(!1),uo=jr;function is(n,o){var a=n.type.contextTypes;if(!a)return jr;var c=n.stateNode;if(c&&c.__reactInternalMemoizedUnmaskedChildContext===o)return c.__reactInternalMemoizedMaskedChildContext;var f={},m;for(m in a)f[m]=o[m];return c&&(n=n.stateNode,n.__reactInternalMemoizedUnmaskedChildContext=o,n.__reactInternalMemoizedMaskedChildContext=f),f}function Dt(n){return n=n.childContextTypes,n!=null}function Fa(){qe(It),qe(yt)}function lp(n,o,a){if(yt.current!==jr)throw Error(r(168));We(yt,o),We(It,a)}function cp(n,o,a){var c=n.stateNode;if(o=o.childContextTypes,typeof c.getChildContext!=\"function\")return a;c=c.getChildContext();for(var f in c)if(!(f in o))throw Error(r(108,ee(n)||\"Unknown\",f));return Q({},a,c)}function za(n){return n=(n=n.stateNode)&&n.__reactInternalMemoizedMergedChildContext||jr,uo=yt.current,We(yt,n),We(It,It.current),!0}function up(n,o,a){var c=n.stateNode;if(!c)throw Error(r(169));a?(n=cp(n,o,uo),c.__reactInternalMemoizedMergedChildContext=n,qe(It),qe(yt),We(yt,n)):qe(It),We(It,a)}var rr=null,$a=!1,iu=!1;function dp(n){rr===null?rr=[n]:rr.push(n)}function wb(n){$a=!0,dp(n)}function _r(){if(!iu&&rr!==null){iu=!0;var n=0,o=Ue;try{var a=rr;for(Ue=1;n<a.length;n++){var c=a[n];do c=c(!0);while(c!==null)}rr=null,$a=!1}catch(f){throw rr!==null&&(rr=rr.slice(n+1)),hh(Pc,_r),f}finally{Ue=o,iu=!1}}return null}var as=[],ls=0,Ua=null,Ba=0,tn=[],nn=0,fo=null,or=1,sr=\"\";function ho(n,o){as[ls++]=Ba,as[ls++]=Ua,Ua=n,Ba=o}function fp(n,o,a){tn[nn++]=or,tn[nn++]=sr,tn[nn++]=fo,fo=n;var c=or;n=sr;var f=32-mn(c)-1;c&=~(1<<f),a+=1;var m=32-mn(o)+f;if(30<m){var S=f-f%5;m=(c&(1<<S)-1).toString(32),c>>=S,f-=S,or=1<<32-mn(o)+f|a<<f|c,sr=m+n}else or=1<<m|a<<f|c,sr=n}function au(n){n.return!==null&&(ho(n,1),fp(n,1,0))}function lu(n){for(;n===Ua;)Ua=as[--ls],as[ls]=null,Ba=as[--ls],as[ls]=null;for(;n===fo;)fo=tn[--nn],tn[nn]=null,sr=tn[--nn],tn[nn]=null,or=tn[--nn],tn[nn]=null}var Qt=null,Yt=null,Ye=!1,yn=null;function hp(n,o){var a=an(5,null,null,0);a.elementType=\"DELETED\",a.stateNode=o,a.return=n,o=n.deletions,o===null?(n.deletions=[a],n.flags|=16):o.push(a)}function pp(n,o){switch(n.tag){case 5:var a=n.type;return o=o.nodeType!==1||a.toLowerCase()!==o.nodeName.toLowerCase()?null:o,o!==null?(n.stateNode=o,Qt=n,Yt=Tr(o.firstChild),!0):!1;case 6:return o=n.pendingProps===\"\"||o.nodeType!==3?null:o,o!==null?(n.stateNode=o,Qt=n,Yt=null,!0):!1;case 13:return o=o.nodeType!==8?null:o,o!==null?(a=fo!==null?{id:or,overflow:sr}:null,n.memoizedState={dehydrated:o,treeContext:a,retryLane:1073741824},a=an(18,null,null,0),a.stateNode=o,a.return=n,n.child=a,Qt=n,Yt=null,!0):!1;default:return!1}}function cu(n){return(n.mode&1)!==0&&(n.flags&128)===0}function uu(n){if(Ye){var o=Yt;if(o){var a=o;if(!pp(n,o)){if(cu(n))throw Error(r(418));o=Tr(a.nextSibling);var c=Qt;o&&pp(n,o)?hp(c,a):(n.flags=n.flags&-4097|2,Ye=!1,Qt=n)}}else{if(cu(n))throw Error(r(418));n.flags=n.flags&-4097|2,Ye=!1,Qt=n}}}function mp(n){for(n=n.return;n!==null&&n.tag!==5&&n.tag!==3&&n.tag!==13;)n=n.return;Qt=n}function Ha(n){if(n!==Qt)return!1;if(!Ye)return mp(n),Ye=!0,!1;var o;if((o=n.tag!==3)&&!(o=n.tag!==5)&&(o=n.type,o=o!==\"head\"&&o!==\"body\"&&!tu(n.type,n.memoizedProps)),o&&(o=Yt)){if(cu(n))throw gp(),Error(r(418));for(;o;)hp(n,o),o=Tr(o.nextSibling)}if(mp(n),n.tag===13){if(n=n.memoizedState,n=n!==null?n.dehydrated:null,!n)throw Error(r(317));e:{for(n=n.nextSibling,o=0;n;){if(n.nodeType===8){var a=n.data;if(a===\"/$\"){if(o===0){Yt=Tr(n.nextSibling);break e}o--}else a!==\"$\"&&a!==\"$!\"&&a!==\"$?\"||o++}n=n.nextSibling}Yt=null}}else Yt=Qt?Tr(n.stateNode.nextSibling):null;return!0}function gp(){for(var n=Yt;n;)n=Tr(n.nextSibling)}function cs(){Yt=Qt=null,Ye=!1}function du(n){yn===null?yn=[n]:yn.push(n)}var bb=A.ReactCurrentBatchConfig;function Si(n,o,a){if(n=a.ref,n!==null&&typeof n!=\"function\"&&typeof n!=\"object\"){if(a._owner){if(a=a._owner,a){if(a.tag!==1)throw Error(r(309));var c=a.stateNode}if(!c)throw Error(r(147,n));var f=c,m=\"\"+n;return o!==null&&o.ref!==null&&typeof o.ref==\"function\"&&o.ref._stringRef===m?o.ref:(o=function(S){var N=f.refs;S===null?delete N[m]:N[m]=S},o._stringRef=m,o)}if(typeof n!=\"string\")throw Error(r(284));if(!a._owner)throw Error(r(290,n))}return n}function Va(n,o){throw n=Object.prototype.toString.call(o),Error(r(31,n===\"[object Object]\"?\"object with keys {\"+Object.keys(o).join(\", \")+\"}\":n))}function yp(n){var o=n._init;return o(n._payload)}function vp(n){function o(I,L){if(n){var D=I.deletions;D===null?(I.deletions=[L],I.flags|=16):D.push(L)}}function a(I,L){if(!n)return null;for(;L!==null;)o(I,L),L=L.sibling;return null}function c(I,L){for(I=new Map;L!==null;)L.key!==null?I.set(L.key,L):I.set(L.index,L),L=L.sibling;return I}function f(I,L){return I=$r(I,L),I.index=0,I.sibling=null,I}function m(I,L,D){return I.index=D,n?(D=I.alternate,D!==null?(D=D.index,D<L?(I.flags|=2,L):D):(I.flags|=2,L)):(I.flags|=1048576,L)}function S(I){return n&&I.alternate===null&&(I.flags|=2),I}function N(I,L,D,re){return L===null||L.tag!==6?(L=nd(D,I.mode,re),L.return=I,L):(L=f(L,D),L.return=I,L)}function O(I,L,D,re){var ge=D.type;return ge===B?Y(I,L,D.props.children,re,D.key):L!==null&&(L.elementType===ge||typeof ge==\"object\"&&ge!==null&&ge.$$typeof===ne&&yp(ge)===L.type)?(re=f(L,D.props),re.ref=Si(I,L,D),re.return=I,re):(re=pl(D.type,D.key,D.props,null,I.mode,re),re.ref=Si(I,L,D),re.return=I,re)}function z(I,L,D,re){return L===null||L.tag!==4||L.stateNode.containerInfo!==D.containerInfo||L.stateNode.implementation!==D.implementation?(L=rd(D,I.mode,re),L.return=I,L):(L=f(L,D.children||[]),L.return=I,L)}function Y(I,L,D,re,ge){return L===null||L.tag!==7?(L=bo(D,I.mode,re,ge),L.return=I,L):(L=f(L,D),L.return=I,L)}function X(I,L,D){if(typeof L==\"string\"&&L!==\"\"||typeof L==\"number\")return L=nd(\"\"+L,I.mode,D),L.return=I,L;if(typeof L==\"object\"&&L!==null){switch(L.$$typeof){case F:return D=pl(L.type,L.key,L.props,null,I.mode,D),D.ref=Si(I,null,L),D.return=I,D;case V:return L=rd(L,I.mode,D),L.return=I,L;case ne:var re=L._init;return X(I,re(L._payload),D)}if(br(L)||H(L))return L=bo(L,I.mode,D,null),L.return=I,L;Va(I,L)}return null}function q(I,L,D,re){var ge=L!==null?L.key:null;if(typeof D==\"string\"&&D!==\"\"||typeof D==\"number\")return ge!==null?null:N(I,L,\"\"+D,re);if(typeof D==\"object\"&&D!==null){switch(D.$$typeof){case F:return D.key===ge?O(I,L,D,re):null;case V:return D.key===ge?z(I,L,D,re):null;case ne:return ge=D._init,q(I,L,ge(D._payload),re)}if(br(D)||H(D))return ge!==null?null:Y(I,L,D,re,null);Va(I,D)}return null}function ue(I,L,D,re,ge){if(typeof re==\"string\"&&re!==\"\"||typeof re==\"number\")return I=I.get(D)||null,N(L,I,\"\"+re,ge);if(typeof re==\"object\"&&re!==null){switch(re.$$typeof){case F:return I=I.get(re.key===null?D:re.key)||null,O(L,I,re,ge);case V:return I=I.get(re.key===null?D:re.key)||null,z(L,I,re,ge);case ne:var xe=re._init;return ue(I,L,D,xe(re._payload),ge)}if(br(re)||H(re))return I=I.get(D)||null,Y(L,I,re,ge,null);Va(L,re)}return null}function he(I,L,D,re){for(var ge=null,xe=null,we=L,Ce=L=0,ut=null;we!==null&&Ce<D.length;Ce++){we.index>Ce?(ut=we,we=null):ut=we.sibling;var De=q(I,we,D[Ce],re);if(De===null){we===null&&(we=ut);break}n&&we&&De.alternate===null&&o(I,we),L=m(De,L,Ce),xe===null?ge=De:xe.sibling=De,xe=De,we=ut}if(Ce===D.length)return a(I,we),Ye&&ho(I,Ce),ge;if(we===null){for(;Ce<D.length;Ce++)we=X(I,D[Ce],re),we!==null&&(L=m(we,L,Ce),xe===null?ge=we:xe.sibling=we,xe=we);return Ye&&ho(I,Ce),ge}for(we=c(I,we);Ce<D.length;Ce++)ut=ue(we,I,Ce,D[Ce],re),ut!==null&&(n&&ut.alternate!==null&&we.delete(ut.key===null?Ce:ut.key),L=m(ut,L,Ce),xe===null?ge=ut:xe.sibling=ut,xe=ut);return n&&we.forEach(function(Ur){return o(I,Ur)}),Ye&&ho(I,Ce),ge}function pe(I,L,D,re){var ge=H(D);if(typeof ge!=\"function\")throw Error(r(150));if(D=ge.call(D),D==null)throw Error(r(151));for(var xe=ge=null,we=L,Ce=L=0,ut=null,De=D.next();we!==null&&!De.done;Ce++,De=D.next()){we.index>Ce?(ut=we,we=null):ut=we.sibling;var Ur=q(I,we,De.value,re);if(Ur===null){we===null&&(we=ut);break}n&&we&&Ur.alternate===null&&o(I,we),L=m(Ur,L,Ce),xe===null?ge=Ur:xe.sibling=Ur,xe=Ur,we=ut}if(De.done)return a(I,we),Ye&&ho(I,Ce),ge;if(we===null){for(;!De.done;Ce++,De=D.next())De=X(I,De.value,re),De!==null&&(L=m(De,L,Ce),xe===null?ge=De:xe.sibling=De,xe=De);return Ye&&ho(I,Ce),ge}for(we=c(I,we);!De.done;Ce++,De=D.next())De=ue(we,I,Ce,De.value,re),De!==null&&(n&&De.alternate!==null&&we.delete(De.key===null?Ce:De.key),L=m(De,L,Ce),xe===null?ge=De:xe.sibling=De,xe=De);return n&&we.forEach(function(e1){return o(I,e1)}),Ye&&ho(I,Ce),ge}function nt(I,L,D,re){if(typeof D==\"object\"&&D!==null&&D.type===B&&D.key===null&&(D=D.props.children),typeof D==\"object\"&&D!==null){switch(D.$$typeof){case F:e:{for(var ge=D.key,xe=L;xe!==null;){if(xe.key===ge){if(ge=D.type,ge===B){if(xe.tag===7){a(I,xe.sibling),L=f(xe,D.props.children),L.return=I,I=L;break e}}else if(xe.elementType===ge||typeof ge==\"object\"&&ge!==null&&ge.$$typeof===ne&&yp(ge)===xe.type){a(I,xe.sibling),L=f(xe,D.props),L.ref=Si(I,xe,D),L.return=I,I=L;break e}a(I,xe);break}else o(I,xe);xe=xe.sibling}D.type===B?(L=bo(D.props.children,I.mode,re,D.key),L.return=I,I=L):(re=pl(D.type,D.key,D.props,null,I.mode,re),re.ref=Si(I,L,D),re.return=I,I=re)}return S(I);case V:e:{for(xe=D.key;L!==null;){if(L.key===xe)if(L.tag===4&&L.stateNode.containerInfo===D.containerInfo&&L.stateNode.implementation===D.implementation){a(I,L.sibling),L=f(L,D.children||[]),L.return=I,I=L;break e}else{a(I,L);break}else o(I,L);L=L.sibling}L=rd(D,I.mode,re),L.return=I,I=L}return S(I);case ne:return xe=D._init,nt(I,L,xe(D._payload),re)}if(br(D))return he(I,L,D,re);if(H(D))return pe(I,L,D,re);Va(I,D)}return typeof D==\"string\"&&D!==\"\"||typeof D==\"number\"?(D=\"\"+D,L!==null&&L.tag===6?(a(I,L.sibling),L=f(L,D),L.return=I,I=L):(a(I,L),L=nd(D,I.mode,re),L.return=I,I=L),S(I)):a(I,L)}return nt}var us=vp(!0),xp=vp(!1),Wa=Or(null),Ka=null,ds=null,fu=null;function hu(){fu=ds=Ka=null}function pu(n){var o=Wa.current;qe(Wa),n._currentValue=o}function mu(n,o,a){for(;n!==null;){var c=n.alternate;if((n.childLanes&o)!==o?(n.childLanes|=o,c!==null&&(c.childLanes|=o)):c!==null&&(c.childLanes&o)!==o&&(c.childLanes|=o),n===a)break;n=n.return}}function fs(n,o){Ka=n,fu=ds=null,n=n.dependencies,n!==null&&n.firstContext!==null&&((n.lanes&o)!==0&&(Mt=!0),n.firstContext=null)}function rn(n){var o=n._currentValue;if(fu!==n)if(n={context:n,memoizedValue:o,next:null},ds===null){if(Ka===null)throw Error(r(308));ds=n,Ka.dependencies={lanes:0,firstContext:n}}else ds=ds.next=n;return o}var po=null;function gu(n){po===null?po=[n]:po.push(n)}function wp(n,o,a,c){var f=o.interleaved;return f===null?(a.next=a,gu(o)):(a.next=f.next,f.next=a),o.interleaved=a,ir(n,c)}function ir(n,o){n.lanes|=o;var a=n.alternate;for(a!==null&&(a.lanes|=o),a=n,n=n.return;n!==null;)n.childLanes|=o,a=n.alternate,a!==null&&(a.childLanes|=o),a=n,n=n.return;return a.tag===3?a.stateNode:null}var Ar=!1;function yu(n){n.updateQueue={baseState:n.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function bp(n,o){n=n.updateQueue,o.updateQueue===n&&(o.updateQueue={baseState:n.baseState,firstBaseUpdate:n.firstBaseUpdate,lastBaseUpdate:n.lastBaseUpdate,shared:n.shared,effects:n.effects})}function ar(n,o){return{eventTime:n,lane:o,tag:0,payload:null,callback:null,next:null}}function Lr(n,o,a){var c=n.updateQueue;if(c===null)return null;if(c=c.shared,(Le&2)!==0){var f=c.pending;return f===null?o.next=o:(o.next=f.next,f.next=o),c.pending=o,ir(n,a)}return f=c.interleaved,f===null?(o.next=o,gu(c)):(o.next=f.next,f.next=o),c.interleaved=o,ir(n,a)}function qa(n,o,a){if(o=o.updateQueue,o!==null&&(o=o.shared,(a&4194240)!==0)){var c=o.lanes;c&=n.pendingLanes,a|=c,o.lanes=a,jc(n,a)}}function Sp(n,o){var a=n.updateQueue,c=n.alternate;if(c!==null&&(c=c.updateQueue,a===c)){var f=null,m=null;if(a=a.firstBaseUpdate,a!==null){do{var S={eventTime:a.eventTime,lane:a.lane,tag:a.tag,payload:a.payload,callback:a.callback,next:null};m===null?f=m=S:m=m.next=S,a=a.next}while(a!==null);m===null?f=m=o:m=m.next=o}else f=m=o;a={baseState:c.baseState,firstBaseUpdate:f,lastBaseUpdate:m,shared:c.shared,effects:c.effects},n.updateQueue=a;return}n=a.lastBaseUpdate,n===null?a.firstBaseUpdate=o:n.next=o,a.lastBaseUpdate=o}function Qa(n,o,a,c){var f=n.updateQueue;Ar=!1;var m=f.firstBaseUpdate,S=f.lastBaseUpdate,N=f.shared.pending;if(N!==null){f.shared.pending=null;var O=N,z=O.next;O.next=null,S===null?m=z:S.next=z,S=O;var Y=n.alternate;Y!==null&&(Y=Y.updateQueue,N=Y.lastBaseUpdate,N!==S&&(N===null?Y.firstBaseUpdate=z:N.next=z,Y.lastBaseUpdate=O))}if(m!==null){var X=f.baseState;S=0,Y=z=O=null,N=m;do{var q=N.lane,ue=N.eventTime;if((c&q)===q){Y!==null&&(Y=Y.next={eventTime:ue,lane:0,tag:N.tag,payload:N.payload,callback:N.callback,next:null});e:{var he=n,pe=N;switch(q=o,ue=a,pe.tag){case 1:if(he=pe.payload,typeof he==\"function\"){X=he.call(ue,X,q);break e}X=he;break e;case 3:he.flags=he.flags&-65537|128;case 0:if(he=pe.payload,q=typeof he==\"function\"?he.call(ue,X,q):he,q==null)break e;X=Q({},X,q);break e;case 2:Ar=!0}}N.callback!==null&&N.lane!==0&&(n.flags|=64,q=f.effects,q===null?f.effects=[N]:q.push(N))}else ue={eventTime:ue,lane:q,tag:N.tag,payload:N.payload,callback:N.callback,next:null},Y===null?(z=Y=ue,O=X):Y=Y.next=ue,S|=q;if(N=N.next,N===null){if(N=f.shared.pending,N===null)break;q=N,N=q.next,q.next=null,f.lastBaseUpdate=q,f.shared.pending=null}}while(!0);if(Y===null&&(O=X),f.baseState=O,f.firstBaseUpdate=z,f.lastBaseUpdate=Y,o=f.shared.interleaved,o!==null){f=o;do S|=f.lane,f=f.next;while(f!==o)}else m===null&&(f.shared.lanes=0);yo|=S,n.lanes=S,n.memoizedState=X}}function Cp(n,o,a){if(n=o.effects,o.effects=null,n!==null)for(o=0;o<n.length;o++){var c=n[o],f=c.callback;if(f!==null){if(c.callback=null,c=a,typeof f!=\"function\")throw Error(r(191,f));f.call(c)}}}var Ci={},$n=Or(Ci),Ei=Or(Ci),ki=Or(Ci);function mo(n){if(n===Ci)throw Error(r(174));return n}function vu(n,o){switch(We(ki,o),We(Ei,n),We($n,Ci),n=o.nodeType,n){case 9:case 11:o=(o=o.documentElement)?o.namespaceURI:An(null,\"\");break;default:n=n===8?o.parentNode:o,o=n.namespaceURI||null,n=n.tagName,o=An(o,n)}qe($n),We($n,o)}function hs(){qe($n),qe(Ei),qe(ki)}function Ep(n){mo(ki.current);var o=mo($n.current),a=An(o,n.type);o!==a&&(We(Ei,n),We($n,a))}function xu(n){Ei.current===n&&(qe($n),qe(Ei))}var Ge=Or(0);function Ya(n){for(var o=n;o!==null;){if(o.tag===13){var a=o.memoizedState;if(a!==null&&(a=a.dehydrated,a===null||a.data===\"$?\"||a.data===\"$!\"))return o}else if(o.tag===19&&o.memoizedProps.revealOrder!==void 0){if((o.flags&128)!==0)return o}else if(o.child!==null){o.child.return=o,o=o.child;continue}if(o===n)break;for(;o.sibling===null;){if(o.return===null||o.return===n)return null;o=o.return}o.sibling.return=o.return,o=o.sibling}return null}var wu=[];function bu(){for(var n=0;n<wu.length;n++)wu[n]._workInProgressVersionPrimary=null;wu.length=0}var Ga=A.ReactCurrentDispatcher,Su=A.ReactCurrentBatchConfig,go=0,Xe=null,st=null,lt=null,Xa=!1,Ni=!1,Ri=0,Sb=0;function vt(){throw Error(r(321))}function Cu(n,o){if(o===null)return!1;for(var a=0;a<o.length&&a<n.length;a++)if(!gn(n[a],o[a]))return!1;return!0}function Eu(n,o,a,c,f,m){if(go=m,Xe=o,o.memoizedState=null,o.updateQueue=null,o.lanes=0,Ga.current=n===null||n.memoizedState===null?Nb:Rb,n=a(c,f),Ni){m=0;do{if(Ni=!1,Ri=0,25<=m)throw Error(r(301));m+=1,lt=st=null,o.updateQueue=null,Ga.current=Pb,n=a(c,f)}while(Ni)}if(Ga.current=el,o=st!==null&&st.next!==null,go=0,lt=st=Xe=null,Xa=!1,o)throw Error(r(300));return n}function ku(){var n=Ri!==0;return Ri=0,n}function Un(){var n={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return lt===null?Xe.memoizedState=lt=n:lt=lt.next=n,lt}function on(){if(st===null){var n=Xe.alternate;n=n!==null?n.memoizedState:null}else n=st.next;var o=lt===null?Xe.memoizedState:lt.next;if(o!==null)lt=o,st=n;else{if(n===null)throw Error(r(310));st=n,n={memoizedState:st.memoizedState,baseState:st.baseState,baseQueue:st.baseQueue,queue:st.queue,next:null},lt===null?Xe.memoizedState=lt=n:lt=lt.next=n}return lt}function Pi(n,o){return typeof o==\"function\"?o(n):o}function Nu(n){var o=on(),a=o.queue;if(a===null)throw Error(r(311));a.lastRenderedReducer=n;var c=st,f=c.baseQueue,m=a.pending;if(m!==null){if(f!==null){var S=f.next;f.next=m.next,m.next=S}c.baseQueue=f=m,a.pending=null}if(f!==null){m=f.next,c=c.baseState;var N=S=null,O=null,z=m;do{var Y=z.lane;if((go&Y)===Y)O!==null&&(O=O.next={lane:0,action:z.action,hasEagerState:z.hasEagerState,eagerState:z.eagerState,next:null}),c=z.hasEagerState?z.eagerState:n(c,z.action);else{var X={lane:Y,action:z.action,hasEagerState:z.hasEagerState,eagerState:z.eagerState,next:null};O===null?(N=O=X,S=c):O=O.next=X,Xe.lanes|=Y,yo|=Y}z=z.next}while(z!==null&&z!==m);O===null?S=c:O.next=N,gn(c,o.memoizedState)||(Mt=!0),o.memoizedState=c,o.baseState=S,o.baseQueue=O,a.lastRenderedState=c}if(n=a.interleaved,n!==null){f=n;do m=f.lane,Xe.lanes|=m,yo|=m,f=f.next;while(f!==n)}else f===null&&(a.lanes=0);return[o.memoizedState,a.dispatch]}function Ru(n){var o=on(),a=o.queue;if(a===null)throw Error(r(311));a.lastRenderedReducer=n;var c=a.dispatch,f=a.pending,m=o.memoizedState;if(f!==null){a.pending=null;var S=f=f.next;do m=n(m,S.action),S=S.next;while(S!==f);gn(m,o.memoizedState)||(Mt=!0),o.memoizedState=m,o.baseQueue===null&&(o.baseState=m),a.lastRenderedState=m}return[m,c]}function kp(){}function Np(n,o){var a=Xe,c=on(),f=o(),m=!gn(c.memoizedState,f);if(m&&(c.memoizedState=f,Mt=!0),c=c.queue,Pu(Tp.bind(null,a,c,n),[n]),c.getSnapshot!==o||m||lt!==null&&lt.memoizedState.tag&1){if(a.flags|=2048,Ti(9,Pp.bind(null,a,c,f,o),void 0,null),ct===null)throw Error(r(349));(go&30)!==0||Rp(a,o,f)}return f}function Rp(n,o,a){n.flags|=16384,n={getSnapshot:o,value:a},o=Xe.updateQueue,o===null?(o={lastEffect:null,stores:null},Xe.updateQueue=o,o.stores=[n]):(a=o.stores,a===null?o.stores=[n]:a.push(n))}function Pp(n,o,a,c){o.value=a,o.getSnapshot=c,Op(o)&&jp(n)}function Tp(n,o,a){return a(function(){Op(o)&&jp(n)})}function Op(n){var o=n.getSnapshot;n=n.value;try{var a=o();return!gn(n,a)}catch{return!0}}function jp(n){var o=ir(n,1);o!==null&&bn(o,n,1,-1)}function _p(n){var o=Un();return typeof n==\"function\"&&(n=n()),o.memoizedState=o.baseState=n,n={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:Pi,lastRenderedState:n},o.queue=n,n=n.dispatch=kb.bind(null,Xe,n),[o.memoizedState,n]}function Ti(n,o,a,c){return n={tag:n,create:o,destroy:a,deps:c,next:null},o=Xe.updateQueue,o===null?(o={lastEffect:null,stores:null},Xe.updateQueue=o,o.lastEffect=n.next=n):(a=o.lastEffect,a===null?o.lastEffect=n.next=n:(c=a.next,a.next=n,n.next=c,o.lastEffect=n)),n}function Ap(){return on().memoizedState}function Ja(n,o,a,c){var f=Un();Xe.flags|=n,f.memoizedState=Ti(1|o,a,void 0,c===void 0?null:c)}function Za(n,o,a,c){var f=on();c=c===void 0?null:c;var m=void 0;if(st!==null){var S=st.memoizedState;if(m=S.destroy,c!==null&&Cu(c,S.deps)){f.memoizedState=Ti(o,a,m,c);return}}Xe.flags|=n,f.memoizedState=Ti(1|o,a,m,c)}function Lp(n,o){return Ja(8390656,8,n,o)}function Pu(n,o){return Za(2048,8,n,o)}function Ip(n,o){return Za(4,2,n,o)}function Dp(n,o){return Za(4,4,n,o)}function Mp(n,o){if(typeof o==\"function\")return n=n(),o(n),function(){o(null)};if(o!=null)return n=n(),o.current=n,function(){o.current=null}}function Fp(n,o,a){return a=a!=null?a.concat([n]):null,Za(4,4,Mp.bind(null,o,n),a)}function Tu(){}function zp(n,o){var a=on();o=o===void 0?null:o;var c=a.memoizedState;return c!==null&&o!==null&&Cu(o,c[1])?c[0]:(a.memoizedState=[n,o],n)}function $p(n,o){var a=on();o=o===void 0?null:o;var c=a.memoizedState;return c!==null&&o!==null&&Cu(o,c[1])?c[0]:(n=n(),a.memoizedState=[n,o],n)}function Up(n,o,a){return(go&21)===0?(n.baseState&&(n.baseState=!1,Mt=!0),n.memoizedState=a):(gn(a,o)||(a=yh(),Xe.lanes|=a,yo|=a,n.baseState=!0),o)}function Cb(n,o){var a=Ue;Ue=a!==0&&4>a?a:4,n(!0);var c=Su.transition;Su.transition={};try{n(!1),o()}finally{Ue=a,Su.transition=c}}function Bp(){return on().memoizedState}function Eb(n,o,a){var c=Fr(n);if(a={lane:c,action:a,hasEagerState:!1,eagerState:null,next:null},Hp(n))Vp(o,a);else if(a=wp(n,o,a,c),a!==null){var f=Rt();bn(a,n,c,f),Wp(a,o,c)}}function kb(n,o,a){var c=Fr(n),f={lane:c,action:a,hasEagerState:!1,eagerState:null,next:null};if(Hp(n))Vp(o,f);else{var m=n.alternate;if(n.lanes===0&&(m===null||m.lanes===0)&&(m=o.lastRenderedReducer,m!==null))try{var S=o.lastRenderedState,N=m(S,a);if(f.hasEagerState=!0,f.eagerState=N,gn(N,S)){var O=o.interleaved;O===null?(f.next=f,gu(o)):(f.next=O.next,O.next=f),o.interleaved=f;return}}catch{}finally{}a=wp(n,o,f,c),a!==null&&(f=Rt(),bn(a,n,c,f),Wp(a,o,c))}}function Hp(n){var o=n.alternate;return n===Xe||o!==null&&o===Xe}function Vp(n,o){Ni=Xa=!0;var a=n.pending;a===null?o.next=o:(o.next=a.next,a.next=o),n.pending=o}function Wp(n,o,a){if((a&4194240)!==0){var c=o.lanes;c&=n.pendingLanes,a|=c,o.lanes=a,jc(n,a)}}var el={readContext:rn,useCallback:vt,useContext:vt,useEffect:vt,useImperativeHandle:vt,useInsertionEffect:vt,useLayoutEffect:vt,useMemo:vt,useReducer:vt,useRef:vt,useState:vt,useDebugValue:vt,useDeferredValue:vt,useTransition:vt,useMutableSource:vt,useSyncExternalStore:vt,useId:vt,unstable_isNewReconciler:!1},Nb={readContext:rn,useCallback:function(n,o){return Un().memoizedState=[n,o===void 0?null:o],n},useContext:rn,useEffect:Lp,useImperativeHandle:function(n,o,a){return a=a!=null?a.concat([n]):null,Ja(4194308,4,Mp.bind(null,o,n),a)},useLayoutEffect:function(n,o){return Ja(4194308,4,n,o)},useInsertionEffect:function(n,o){return Ja(4,2,n,o)},useMemo:function(n,o){var a=Un();return o=o===void 0?null:o,n=n(),a.memoizedState=[n,o],n},useReducer:function(n,o,a){var c=Un();return o=a!==void 0?a(o):o,c.memoizedState=c.baseState=o,n={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:n,lastRenderedState:o},c.queue=n,n=n.dispatch=Eb.bind(null,Xe,n),[c.memoizedState,n]},useRef:function(n){var o=Un();return n={current:n},o.memoizedState=n},useState:_p,useDebugValue:Tu,useDeferredValue:function(n){return Un().memoizedState=n},useTransition:function(){var n=_p(!1),o=n[0];return n=Cb.bind(null,n[1]),Un().memoizedState=n,[o,n]},useMutableSource:function(){},useSyncExternalStore:function(n,o,a){var c=Xe,f=Un();if(Ye){if(a===void 0)throw Error(r(407));a=a()}else{if(a=o(),ct===null)throw Error(r(349));(go&30)!==0||Rp(c,o,a)}f.memoizedState=a;var m={value:a,getSnapshot:o};return f.queue=m,Lp(Tp.bind(null,c,m,n),[n]),c.flags|=2048,Ti(9,Pp.bind(null,c,m,a,o),void 0,null),a},useId:function(){var n=Un(),o=ct.identifierPrefix;if(Ye){var a=sr,c=or;a=(c&~(1<<32-mn(c)-1)).toString(32)+a,o=\":\"+o+\"R\"+a,a=Ri++,0<a&&(o+=\"H\"+a.toString(32)),o+=\":\"}else a=Sb++,o=\":\"+o+\"r\"+a.toString(32)+\":\";return n.memoizedState=o},unstable_isNewReconciler:!1},Rb={readContext:rn,useCallback:zp,useContext:rn,useEffect:Pu,useImperativeHandle:Fp,useInsertionEffect:Ip,useLayoutEffect:Dp,useMemo:$p,useReducer:Nu,useRef:Ap,useState:function(){return Nu(Pi)},useDebugValue:Tu,useDeferredValue:function(n){var o=on();return Up(o,st.memoizedState,n)},useTransition:function(){var n=Nu(Pi)[0],o=on().memoizedState;return[n,o]},useMutableSource:kp,useSyncExternalStore:Np,useId:Bp,unstable_isNewReconciler:!1},Pb={readContext:rn,useCallback:zp,useContext:rn,useEffect:Pu,useImperativeHandle:Fp,useInsertionEffect:Ip,useLayoutEffect:Dp,useMemo:$p,useReducer:Ru,useRef:Ap,useState:function(){return Ru(Pi)},useDebugValue:Tu,useDeferredValue:function(n){var o=on();return st===null?o.memoizedState=n:Up(o,st.memoizedState,n)},useTransition:function(){var n=Ru(Pi)[0],o=on().memoizedState;return[n,o]},useMutableSource:kp,useSyncExternalStore:Np,useId:Bp,unstable_isNewReconciler:!1};function vn(n,o){if(n&&n.defaultProps){o=Q({},o),n=n.defaultProps;for(var a in n)o[a]===void 0&&(o[a]=n[a]);return o}return o}function Ou(n,o,a,c){o=n.memoizedState,a=a(c,o),a=a==null?o:Q({},o,a),n.memoizedState=a,n.lanes===0&&(n.updateQueue.baseState=a)}var tl={isMounted:function(n){return(n=n._reactInternals)?lo(n)===n:!1},enqueueSetState:function(n,o,a){n=n._reactInternals;var c=Rt(),f=Fr(n),m=ar(c,f);m.payload=o,a!=null&&(m.callback=a),o=Lr(n,m,f),o!==null&&(bn(o,n,f,c),qa(o,n,f))},enqueueReplaceState:function(n,o,a){n=n._reactInternals;var c=Rt(),f=Fr(n),m=ar(c,f);m.tag=1,m.payload=o,a!=null&&(m.callback=a),o=Lr(n,m,f),o!==null&&(bn(o,n,f,c),qa(o,n,f))},enqueueForceUpdate:function(n,o){n=n._reactInternals;var a=Rt(),c=Fr(n),f=ar(a,c);f.tag=2,o!=null&&(f.callback=o),o=Lr(n,f,c),o!==null&&(bn(o,n,c,a),qa(o,n,c))}};function Kp(n,o,a,c,f,m,S){return n=n.stateNode,typeof n.shouldComponentUpdate==\"function\"?n.shouldComponentUpdate(c,m,S):o.prototype&&o.prototype.isPureReactComponent?!mi(a,c)||!mi(f,m):!0}function qp(n,o,a){var c=!1,f=jr,m=o.contextType;return typeof m==\"object\"&&m!==null?m=rn(m):(f=Dt(o)?uo:yt.current,c=o.contextTypes,m=(c=c!=null)?is(n,f):jr),o=new o(a,m),n.memoizedState=o.state!==null&&o.state!==void 0?o.state:null,o.updater=tl,n.stateNode=o,o._reactInternals=n,c&&(n=n.stateNode,n.__reactInternalMemoizedUnmaskedChildContext=f,n.__reactInternalMemoizedMaskedChildContext=m),o}function Qp(n,o,a,c){n=o.state,typeof o.componentWillReceiveProps==\"function\"&&o.componentWillReceiveProps(a,c),typeof o.UNSAFE_componentWillReceiveProps==\"function\"&&o.UNSAFE_componentWillReceiveProps(a,c),o.state!==n&&tl.enqueueReplaceState(o,o.state,null)}function ju(n,o,a,c){var f=n.stateNode;f.props=a,f.state=n.memoizedState,f.refs={},yu(n);var m=o.contextType;typeof m==\"object\"&&m!==null?f.context=rn(m):(m=Dt(o)?uo:yt.current,f.context=is(n,m)),f.state=n.memoizedState,m=o.getDerivedStateFromProps,typeof m==\"function\"&&(Ou(n,o,m,a),f.state=n.memoizedState),typeof o.getDerivedStateFromProps==\"function\"||typeof f.getSnapshotBeforeUpdate==\"function\"||typeof f.UNSAFE_componentWillMount!=\"function\"&&typeof f.componentWillMount!=\"function\"||(o=f.state,typeof f.componentWillMount==\"function\"&&f.componentWillMount(),typeof f.UNSAFE_componentWillMount==\"function\"&&f.UNSAFE_componentWillMount(),o!==f.state&&tl.enqueueReplaceState(f,f.state,null),Qa(n,a,f,c),f.state=n.memoizedState),typeof f.componentDidMount==\"function\"&&(n.flags|=4194308)}function ps(n,o){try{var a=\"\",c=o;do a+=me(c),c=c.return;while(c);var f=a}catch(m){f=`\nError generating stack: `+m.message+`\n`+m.stack}return{value:n,source:o,stack:f,digest:null}}function _u(n,o,a){return{value:n,source:null,stack:a??null,digest:o??null}}function Au(n,o){try{console.error(o.value)}catch(a){setTimeout(function(){throw a})}}var Tb=typeof WeakMap==\"function\"?WeakMap:Map;function Yp(n,o,a){a=ar(-1,a),a.tag=3,a.payload={element:null};var c=o.value;return a.callback=function(){ll||(ll=!0,Qu=c),Au(n,o)},a}function Gp(n,o,a){a=ar(-1,a),a.tag=3;var c=n.type.getDerivedStateFromError;if(typeof c==\"function\"){var f=o.value;a.payload=function(){return c(f)},a.callback=function(){Au(n,o)}}var m=n.stateNode;return m!==null&&typeof m.componentDidCatch==\"function\"&&(a.callback=function(){Au(n,o),typeof c!=\"function\"&&(Dr===null?Dr=new Set([this]):Dr.add(this));var S=o.stack;this.componentDidCatch(o.value,{componentStack:S!==null?S:\"\"})}),a}function Xp(n,o,a){var c=n.pingCache;if(c===null){c=n.pingCache=new Tb;var f=new Set;c.set(o,f)}else f=c.get(o),f===void 0&&(f=new Set,c.set(o,f));f.has(a)||(f.add(a),n=Hb.bind(null,n,o,a),o.then(n,n))}function Jp(n){do{var o;if((o=n.tag===13)&&(o=n.memoizedState,o=o!==null?o.dehydrated!==null:!0),o)return n;n=n.return}while(n!==null);return null}function Zp(n,o,a,c,f){return(n.mode&1)===0?(n===o?n.flags|=65536:(n.flags|=128,a.flags|=131072,a.flags&=-52805,a.tag===1&&(a.alternate===null?a.tag=17:(o=ar(-1,1),o.tag=2,Lr(a,o,1))),a.lanes|=1),n):(n.flags|=65536,n.lanes=f,n)}var Ob=A.ReactCurrentOwner,Mt=!1;function Nt(n,o,a,c){o.child=n===null?xp(o,null,a,c):us(o,n.child,a,c)}function em(n,o,a,c,f){a=a.render;var m=o.ref;return fs(o,f),c=Eu(n,o,a,c,m,f),a=ku(),n!==null&&!Mt?(o.updateQueue=n.updateQueue,o.flags&=-2053,n.lanes&=~f,lr(n,o,f)):(Ye&&a&&au(o),o.flags|=1,Nt(n,o,c,f),o.child)}function tm(n,o,a,c,f){if(n===null){var m=a.type;return typeof m==\"function\"&&!td(m)&&m.defaultProps===void 0&&a.compare===null&&a.defaultProps===void 0?(o.tag=15,o.type=m,nm(n,o,m,c,f)):(n=pl(a.type,null,c,o,o.mode,f),n.ref=o.ref,n.return=o,o.child=n)}if(m=n.child,(n.lanes&f)===0){var S=m.memoizedProps;if(a=a.compare,a=a!==null?a:mi,a(S,c)&&n.ref===o.ref)return lr(n,o,f)}return o.flags|=1,n=$r(m,c),n.ref=o.ref,n.return=o,o.child=n}function nm(n,o,a,c,f){if(n!==null){var m=n.memoizedProps;if(mi(m,c)&&n.ref===o.ref)if(Mt=!1,o.pendingProps=c=m,(n.lanes&f)!==0)(n.flags&131072)!==0&&(Mt=!0);else return o.lanes=n.lanes,lr(n,o,f)}return Lu(n,o,a,c,f)}function rm(n,o,a){var c=o.pendingProps,f=c.children,m=n!==null?n.memoizedState:null;if(c.mode===\"hidden\")if((o.mode&1)===0)o.memoizedState={baseLanes:0,cachePool:null,transitions:null},We(gs,Gt),Gt|=a;else{if((a&1073741824)===0)return n=m!==null?m.baseLanes|a:a,o.lanes=o.childLanes=1073741824,o.memoizedState={baseLanes:n,cachePool:null,transitions:null},o.updateQueue=null,We(gs,Gt),Gt|=n,null;o.memoizedState={baseLanes:0,cachePool:null,transitions:null},c=m!==null?m.baseLanes:a,We(gs,Gt),Gt|=c}else m!==null?(c=m.baseLanes|a,o.memoizedState=null):c=a,We(gs,Gt),Gt|=c;return Nt(n,o,f,a),o.child}function om(n,o){var a=o.ref;(n===null&&a!==null||n!==null&&n.ref!==a)&&(o.flags|=512,o.flags|=2097152)}function Lu(n,o,a,c,f){var m=Dt(a)?uo:yt.current;return m=is(o,m),fs(o,f),a=Eu(n,o,a,c,m,f),c=ku(),n!==null&&!Mt?(o.updateQueue=n.updateQueue,o.flags&=-2053,n.lanes&=~f,lr(n,o,f)):(Ye&&c&&au(o),o.flags|=1,Nt(n,o,a,f),o.child)}function sm(n,o,a,c,f){if(Dt(a)){var m=!0;za(o)}else m=!1;if(fs(o,f),o.stateNode===null)rl(n,o),qp(o,a,c),ju(o,a,c,f),c=!0;else if(n===null){var S=o.stateNode,N=o.memoizedProps;S.props=N;var O=S.context,z=a.contextType;typeof z==\"object\"&&z!==null?z=rn(z):(z=Dt(a)?uo:yt.current,z=is(o,z));var Y=a.getDerivedStateFromProps,X=typeof Y==\"function\"||typeof S.getSnapshotBeforeUpdate==\"function\";X||typeof S.UNSAFE_componentWillReceiveProps!=\"function\"&&typeof S.componentWillReceiveProps!=\"function\"||(N!==c||O!==z)&&Qp(o,S,c,z),Ar=!1;var q=o.memoizedState;S.state=q,Qa(o,c,S,f),O=o.memoizedState,N!==c||q!==O||It.current||Ar?(typeof Y==\"function\"&&(Ou(o,a,Y,c),O=o.memoizedState),(N=Ar||Kp(o,a,N,c,q,O,z))?(X||typeof S.UNSAFE_componentWillMount!=\"function\"&&typeof S.componentWillMount!=\"function\"||(typeof S.componentWillMount==\"function\"&&S.componentWillMount(),typeof S.UNSAFE_componentWillMount==\"function\"&&S.UNSAFE_componentWillMount()),typeof S.componentDidMount==\"function\"&&(o.flags|=4194308)):(typeof S.componentDidMount==\"function\"&&(o.flags|=4194308),o.memoizedProps=c,o.memoizedState=O),S.props=c,S.state=O,S.context=z,c=N):(typeof S.componentDidMount==\"function\"&&(o.flags|=4194308),c=!1)}else{S=o.stateNode,bp(n,o),N=o.memoizedProps,z=o.type===o.elementType?N:vn(o.type,N),S.props=z,X=o.pendingProps,q=S.context,O=a.contextType,typeof O==\"object\"&&O!==null?O=rn(O):(O=Dt(a)?uo:yt.current,O=is(o,O));var ue=a.getDerivedStateFromProps;(Y=typeof ue==\"function\"||typeof S.getSnapshotBeforeUpdate==\"function\")||typeof S.UNSAFE_componentWillReceiveProps!=\"function\"&&typeof S.componentWillReceiveProps!=\"function\"||(N!==X||q!==O)&&Qp(o,S,c,O),Ar=!1,q=o.memoizedState,S.state=q,Qa(o,c,S,f);var he=o.memoizedState;N!==X||q!==he||It.current||Ar?(typeof ue==\"function\"&&(Ou(o,a,ue,c),he=o.memoizedState),(z=Ar||Kp(o,a,z,c,q,he,O)||!1)?(Y||typeof S.UNSAFE_componentWillUpdate!=\"function\"&&typeof S.componentWillUpdate!=\"function\"||(typeof S.componentWillUpdate==\"function\"&&S.componentWillUpdate(c,he,O),typeof S.UNSAFE_componentWillUpdate==\"function\"&&S.UNSAFE_componentWillUpdate(c,he,O)),typeof S.componentDidUpdate==\"function\"&&(o.flags|=4),typeof S.getSnapshotBeforeUpdate==\"function\"&&(o.flags|=1024)):(typeof S.componentDidUpdate!=\"function\"||N===n.memoizedProps&&q===n.memoizedState||(o.flags|=4),typeof S.getSnapshotBeforeUpdate!=\"function\"||N===n.memoizedProps&&q===n.memoizedState||(o.flags|=1024),o.memoizedProps=c,o.memoizedState=he),S.props=c,S.state=he,S.context=O,c=z):(typeof S.componentDidUpdate!=\"function\"||N===n.memoizedProps&&q===n.memoizedState||(o.flags|=4),typeof S.getSnapshotBeforeUpdate!=\"function\"||N===n.memoizedProps&&q===n.memoizedState||(o.flags|=1024),c=!1)}return Iu(n,o,a,c,m,f)}function Iu(n,o,a,c,f,m){om(n,o);var S=(o.flags&128)!==0;if(!c&&!S)return f&&up(o,a,!1),lr(n,o,m);c=o.stateNode,Ob.current=o;var N=S&&typeof a.getDerivedStateFromError!=\"function\"?null:c.render();return o.flags|=1,n!==null&&S?(o.child=us(o,n.child,null,m),o.child=us(o,null,N,m)):Nt(n,o,N,m),o.memoizedState=c.state,f&&up(o,a,!0),o.child}function im(n){var o=n.stateNode;o.pendingContext?lp(n,o.pendingContext,o.pendingContext!==o.context):o.context&&lp(n,o.context,!1),vu(n,o.containerInfo)}function am(n,o,a,c,f){return cs(),du(f),o.flags|=256,Nt(n,o,a,c),o.child}var Du={dehydrated:null,treeContext:null,retryLane:0};function Mu(n){return{baseLanes:n,cachePool:null,transitions:null}}function lm(n,o,a){var c=o.pendingProps,f=Ge.current,m=!1,S=(o.flags&128)!==0,N;if((N=S)||(N=n!==null&&n.memoizedState===null?!1:(f&2)!==0),N?(m=!0,o.flags&=-129):(n===null||n.memoizedState!==null)&&(f|=1),We(Ge,f&1),n===null)return uu(o),n=o.memoizedState,n!==null&&(n=n.dehydrated,n!==null)?((o.mode&1)===0?o.lanes=1:n.data===\"$!\"?o.lanes=8:o.lanes=1073741824,null):(S=c.children,n=c.fallback,m?(c=o.mode,m=o.child,S={mode:\"hidden\",children:S},(c&1)===0&&m!==null?(m.childLanes=0,m.pendingProps=S):m=ml(S,c,0,null),n=bo(n,c,a,null),m.return=o,n.return=o,m.sibling=n,o.child=m,o.child.memoizedState=Mu(a),o.memoizedState=Du,n):Fu(o,S));if(f=n.memoizedState,f!==null&&(N=f.dehydrated,N!==null))return jb(n,o,S,c,N,f,a);if(m){m=c.fallback,S=o.mode,f=n.child,N=f.sibling;var O={mode:\"hidden\",children:c.children};return(S&1)===0&&o.child!==f?(c=o.child,c.childLanes=0,c.pendingProps=O,o.deletions=null):(c=$r(f,O),c.subtreeFlags=f.subtreeFlags&14680064),N!==null?m=$r(N,m):(m=bo(m,S,a,null),m.flags|=2),m.return=o,c.return=o,c.sibling=m,o.child=c,c=m,m=o.child,S=n.child.memoizedState,S=S===null?Mu(a):{baseLanes:S.baseLanes|a,cachePool:null,transitions:S.transitions},m.memoizedState=S,m.childLanes=n.childLanes&~a,o.memoizedState=Du,c}return m=n.child,n=m.sibling,c=$r(m,{mode:\"visible\",children:c.children}),(o.mode&1)===0&&(c.lanes=a),c.return=o,c.sibling=null,n!==null&&(a=o.deletions,a===null?(o.deletions=[n],o.flags|=16):a.push(n)),o.child=c,o.memoizedState=null,c}function Fu(n,o){return o=ml({mode:\"visible\",children:o},n.mode,0,null),o.return=n,n.child=o}function nl(n,o,a,c){return c!==null&&du(c),us(o,n.child,null,a),n=Fu(o,o.pendingProps.children),n.flags|=2,o.memoizedState=null,n}function jb(n,o,a,c,f,m,S){if(a)return o.flags&256?(o.flags&=-257,c=_u(Error(r(422))),nl(n,o,S,c)):o.memoizedState!==null?(o.child=n.child,o.flags|=128,null):(m=c.fallback,f=o.mode,c=ml({mode:\"visible\",children:c.children},f,0,null),m=bo(m,f,S,null),m.flags|=2,c.return=o,m.return=o,c.sibling=m,o.child=c,(o.mode&1)!==0&&us(o,n.child,null,S),o.child.memoizedState=Mu(S),o.memoizedState=Du,m);if((o.mode&1)===0)return nl(n,o,S,null);if(f.data===\"$!\"){if(c=f.nextSibling&&f.nextSibling.dataset,c)var N=c.dgst;return c=N,m=Error(r(419)),c=_u(m,c,void 0),nl(n,o,S,c)}if(N=(S&n.childLanes)!==0,Mt||N){if(c=ct,c!==null){switch(S&-S){case 4:f=2;break;case 16:f=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:f=32;break;case 536870912:f=268435456;break;default:f=0}f=(f&(c.suspendedLanes|S))!==0?0:f,f!==0&&f!==m.retryLane&&(m.retryLane=f,ir(n,f),bn(c,n,f,-1))}return ed(),c=_u(Error(r(421))),nl(n,o,S,c)}return f.data===\"$?\"?(o.flags|=128,o.child=n.child,o=Vb.bind(null,n),f._reactRetry=o,null):(n=m.treeContext,Yt=Tr(f.nextSibling),Qt=o,Ye=!0,yn=null,n!==null&&(tn[nn++]=or,tn[nn++]=sr,tn[nn++]=fo,or=n.id,sr=n.overflow,fo=o),o=Fu(o,c.children),o.flags|=4096,o)}function cm(n,o,a){n.lanes|=o;var c=n.alternate;c!==null&&(c.lanes|=o),mu(n.return,o,a)}function zu(n,o,a,c,f){var m=n.memoizedState;m===null?n.memoizedState={isBackwards:o,rendering:null,renderingStartTime:0,last:c,tail:a,tailMode:f}:(m.isBackwards=o,m.rendering=null,m.renderingStartTime=0,m.last=c,m.tail=a,m.tailMode=f)}function um(n,o,a){var c=o.pendingProps,f=c.revealOrder,m=c.tail;if(Nt(n,o,c.children,a),c=Ge.current,(c&2)!==0)c=c&1|2,o.flags|=128;else{if(n!==null&&(n.flags&128)!==0)e:for(n=o.child;n!==null;){if(n.tag===13)n.memoizedState!==null&&cm(n,a,o);else if(n.tag===19)cm(n,a,o);else if(n.child!==null){n.child.return=n,n=n.child;continue}if(n===o)break e;for(;n.sibling===null;){if(n.return===null||n.return===o)break e;n=n.return}n.sibling.return=n.return,n=n.sibling}c&=1}if(We(Ge,c),(o.mode&1)===0)o.memoizedState=null;else switch(f){case\"forwards\":for(a=o.child,f=null;a!==null;)n=a.alternate,n!==null&&Ya(n)===null&&(f=a),a=a.sibling;a=f,a===null?(f=o.child,o.child=null):(f=a.sibling,a.sibling=null),zu(o,!1,f,a,m);break;case\"backwards\":for(a=null,f=o.child,o.child=null;f!==null;){if(n=f.alternate,n!==null&&Ya(n)===null){o.child=f;break}n=f.sibling,f.sibling=a,a=f,f=n}zu(o,!0,a,null,m);break;case\"together\":zu(o,!1,null,null,void 0);break;default:o.memoizedState=null}return o.child}function rl(n,o){(o.mode&1)===0&&n!==null&&(n.alternate=null,o.alternate=null,o.flags|=2)}function lr(n,o,a){if(n!==null&&(o.dependencies=n.dependencies),yo|=o.lanes,(a&o.childLanes)===0)return null;if(n!==null&&o.child!==n.child)throw Error(r(153));if(o.child!==null){for(n=o.child,a=$r(n,n.pendingProps),o.child=a,a.return=o;n.sibling!==null;)n=n.sibling,a=a.sibling=$r(n,n.pendingProps),a.return=o;a.sibling=null}return o.child}function _b(n,o,a){switch(o.tag){case 3:im(o),cs();break;case 5:Ep(o);break;case 1:Dt(o.type)&&za(o);break;case 4:vu(o,o.stateNode.containerInfo);break;case 10:var c=o.type._context,f=o.memoizedProps.value;We(Wa,c._currentValue),c._currentValue=f;break;case 13:if(c=o.memoizedState,c!==null)return c.dehydrated!==null?(We(Ge,Ge.current&1),o.flags|=128,null):(a&o.child.childLanes)!==0?lm(n,o,a):(We(Ge,Ge.current&1),n=lr(n,o,a),n!==null?n.sibling:null);We(Ge,Ge.current&1);break;case 19:if(c=(a&o.childLanes)!==0,(n.flags&128)!==0){if(c)return um(n,o,a);o.flags|=128}if(f=o.memoizedState,f!==null&&(f.rendering=null,f.tail=null,f.lastEffect=null),We(Ge,Ge.current),c)break;return null;case 22:case 23:return o.lanes=0,rm(n,o,a)}return lr(n,o,a)}var dm,$u,fm,hm;dm=function(n,o){for(var a=o.child;a!==null;){if(a.tag===5||a.tag===6)n.appendChild(a.stateNode);else if(a.tag!==4&&a.child!==null){a.child.return=a,a=a.child;continue}if(a===o)break;for(;a.sibling===null;){if(a.return===null||a.return===o)return;a=a.return}a.sibling.return=a.return,a=a.sibling}},$u=function(){},fm=function(n,o,a,c){var f=n.memoizedProps;if(f!==c){n=o.stateNode,mo($n.current);var m=null;switch(a){case\"input\":f=gt(n,f),c=gt(n,c),m=[];break;case\"select\":f=Q({},f,{value:void 0}),c=Q({},c,{value:void 0}),m=[];break;case\"textarea\":f=Ko(n,f),c=Ko(n,c),m=[];break;default:typeof f.onClick!=\"function\"&&typeof c.onClick==\"function\"&&(n.onclick=Da)}In(a,c);var S;a=null;for(z in f)if(!c.hasOwnProperty(z)&&f.hasOwnProperty(z)&&f[z]!=null)if(z===\"style\"){var N=f[z];for(S in N)N.hasOwnProperty(S)&&(a||(a={}),a[S]=\"\")}else z!==\"dangerouslySetInnerHTML\"&&z!==\"children\"&&z!==\"suppressContentEditableWarning\"&&z!==\"suppressHydrationWarning\"&&z!==\"autoFocus\"&&(i.hasOwnProperty(z)?m||(m=[]):(m=m||[]).push(z,null));for(z in c){var O=c[z];if(N=f!=null?f[z]:void 0,c.hasOwnProperty(z)&&O!==N&&(O!=null||N!=null))if(z===\"style\")if(N){for(S in N)!N.hasOwnProperty(S)||O&&O.hasOwnProperty(S)||(a||(a={}),a[S]=\"\");for(S in O)O.hasOwnProperty(S)&&N[S]!==O[S]&&(a||(a={}),a[S]=O[S])}else a||(m||(m=[]),m.push(z,a)),a=O;else z===\"dangerouslySetInnerHTML\"?(O=O?O.__html:void 0,N=N?N.__html:void 0,O!=null&&N!==O&&(m=m||[]).push(z,O)):z===\"children\"?typeof O!=\"string\"&&typeof O!=\"number\"||(m=m||[]).push(z,\"\"+O):z!==\"suppressContentEditableWarning\"&&z!==\"suppressHydrationWarning\"&&(i.hasOwnProperty(z)?(O!=null&&z===\"onScroll\"&&Ke(\"scroll\",n),m||N===O||(m=[])):(m=m||[]).push(z,O))}a&&(m=m||[]).push(\"style\",a);var z=m;(o.updateQueue=z)&&(o.flags|=4)}},hm=function(n,o,a,c){a!==c&&(o.flags|=4)};function Oi(n,o){if(!Ye)switch(n.tailMode){case\"hidden\":o=n.tail;for(var a=null;o!==null;)o.alternate!==null&&(a=o),o=o.sibling;a===null?n.tail=null:a.sibling=null;break;case\"collapsed\":a=n.tail;for(var c=null;a!==null;)a.alternate!==null&&(c=a),a=a.sibling;c===null?o||n.tail===null?n.tail=null:n.tail.sibling=null:c.sibling=null}}function xt(n){var o=n.alternate!==null&&n.alternate.child===n.child,a=0,c=0;if(o)for(var f=n.child;f!==null;)a|=f.lanes|f.childLanes,c|=f.subtreeFlags&14680064,c|=f.flags&14680064,f.return=n,f=f.sibling;else for(f=n.child;f!==null;)a|=f.lanes|f.childLanes,c|=f.subtreeFlags,c|=f.flags,f.return=n,f=f.sibling;return n.subtreeFlags|=c,n.childLanes=a,o}function Ab(n,o,a){var c=o.pendingProps;switch(lu(o),o.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return xt(o),null;case 1:return Dt(o.type)&&Fa(),xt(o),null;case 3:return c=o.stateNode,hs(),qe(It),qe(yt),bu(),c.pendingContext&&(c.context=c.pendingContext,c.pendingContext=null),(n===null||n.child===null)&&(Ha(o)?o.flags|=4:n===null||n.memoizedState.isDehydrated&&(o.flags&256)===0||(o.flags|=1024,yn!==null&&(Xu(yn),yn=null))),$u(n,o),xt(o),null;case 5:xu(o);var f=mo(ki.current);if(a=o.type,n!==null&&o.stateNode!=null)fm(n,o,a,c,f),n.ref!==o.ref&&(o.flags|=512,o.flags|=2097152);else{if(!c){if(o.stateNode===null)throw Error(r(166));return xt(o),null}if(n=mo($n.current),Ha(o)){c=o.stateNode,a=o.type;var m=o.memoizedProps;switch(c[zn]=o,c[wi]=m,n=(o.mode&1)!==0,a){case\"dialog\":Ke(\"cancel\",c),Ke(\"close\",c);break;case\"iframe\":case\"object\":case\"embed\":Ke(\"load\",c);break;case\"video\":case\"audio\":for(f=0;f<yi.length;f++)Ke(yi[f],c);break;case\"source\":Ke(\"error\",c);break;case\"img\":case\"image\":case\"link\":Ke(\"error\",c),Ke(\"load\",c);break;case\"details\":Ke(\"toggle\",c);break;case\"input\":On(c,m),Ke(\"invalid\",c);break;case\"select\":c._wrapperState={wasMultiple:!!m.multiple},Ke(\"invalid\",c);break;case\"textarea\":_n(c,m),Ke(\"invalid\",c)}In(a,m),f=null;for(var S in m)if(m.hasOwnProperty(S)){var N=m[S];S===\"children\"?typeof N==\"string\"?c.textContent!==N&&(m.suppressHydrationWarning!==!0&&Ia(c.textContent,N,n),f=[\"children\",N]):typeof N==\"number\"&&c.textContent!==\"\"+N&&(m.suppressHydrationWarning!==!0&&Ia(c.textContent,N,n),f=[\"children\",\"\"+N]):i.hasOwnProperty(S)&&N!=null&&S===\"onScroll\"&&Ke(\"scroll\",c)}switch(a){case\"input\":Oe(c),wr(c,m,!0);break;case\"textarea\":Oe(c),ua(c);break;case\"select\":case\"option\":break;default:typeof m.onClick==\"function\"&&(c.onclick=Da)}c=f,o.updateQueue=c,c!==null&&(o.flags|=4)}else{S=f.nodeType===9?f:f.ownerDocument,n===\"http://www.w3.org/1999/xhtml\"&&(n=Et(a)),n===\"http://www.w3.org/1999/xhtml\"?a===\"script\"?(n=S.createElement(\"div\"),n.innerHTML=\"<script><\\/script>\",n=n.removeChild(n.firstChild)):typeof c.is==\"string\"?n=S.createElement(a,{is:c.is}):(n=S.createElement(a),a===\"select\"&&(S=n,c.multiple?S.multiple=!0:c.size&&(S.size=c.size))):n=S.createElementNS(n,a),n[zn]=o,n[wi]=c,dm(n,o,!1,!1),o.stateNode=n;e:{switch(S=ei(a,c),a){case\"dialog\":Ke(\"cancel\",n),Ke(\"close\",n),f=c;break;case\"iframe\":case\"object\":case\"embed\":Ke(\"load\",n),f=c;break;case\"video\":case\"audio\":for(f=0;f<yi.length;f++)Ke(yi[f],n);f=c;break;case\"source\":Ke(\"error\",n),f=c;break;case\"img\":case\"image\":case\"link\":Ke(\"error\",n),Ke(\"load\",n),f=c;break;case\"details\":Ke(\"toggle\",n),f=c;break;case\"input\":On(n,c),f=gt(n,c),Ke(\"invalid\",n);break;case\"option\":f=c;break;case\"select\":n._wrapperState={wasMultiple:!!c.multiple},f=Q({},c,{value:void 0}),Ke(\"invalid\",n);break;case\"textarea\":_n(n,c),f=Ko(n,c),Ke(\"invalid\",n);break;default:f=c}In(a,f),N=f;for(m in N)if(N.hasOwnProperty(m)){var O=N[m];m===\"style\"?tr(n,O):m===\"dangerouslySetInnerHTML\"?(O=O?O.__html:void 0,O!=null&&da(n,O)):m===\"children\"?typeof O==\"string\"?(a!==\"textarea\"||O!==\"\")&&Ln(n,O):typeof O==\"number\"&&Ln(n,\"\"+O):m!==\"suppressContentEditableWarning\"&&m!==\"suppressHydrationWarning\"&&m!==\"autoFocus\"&&(i.hasOwnProperty(m)?O!=null&&m===\"onScroll\"&&Ke(\"scroll\",n):O!=null&&_(n,m,O,S))}switch(a){case\"input\":Oe(n),wr(n,c,!1);break;case\"textarea\":Oe(n),ua(n);break;case\"option\":c.value!=null&&n.setAttribute(\"value\",\"\"+ye(c.value));break;case\"select\":n.multiple=!!c.multiple,m=c.value,m!=null?en(n,!!c.multiple,m,!1):c.defaultValue!=null&&en(n,!!c.multiple,c.defaultValue,!0);break;default:typeof f.onClick==\"function\"&&(n.onclick=Da)}switch(a){case\"button\":case\"input\":case\"select\":case\"textarea\":c=!!c.autoFocus;break e;case\"img\":c=!0;break e;default:c=!1}}c&&(o.flags|=4)}o.ref!==null&&(o.flags|=512,o.flags|=2097152)}return xt(o),null;case 6:if(n&&o.stateNode!=null)hm(n,o,n.memoizedProps,c);else{if(typeof c!=\"string\"&&o.stateNode===null)throw Error(r(166));if(a=mo(ki.current),mo($n.current),Ha(o)){if(c=o.stateNode,a=o.memoizedProps,c[zn]=o,(m=c.nodeValue!==a)&&(n=Qt,n!==null))switch(n.tag){case 3:Ia(c.nodeValue,a,(n.mode&1)!==0);break;case 5:n.memoizedProps.suppressHydrationWarning!==!0&&Ia(c.nodeValue,a,(n.mode&1)!==0)}m&&(o.flags|=4)}else c=(a.nodeType===9?a:a.ownerDocument).createTextNode(c),c[zn]=o,o.stateNode=c}return xt(o),null;case 13:if(qe(Ge),c=o.memoizedState,n===null||n.memoizedState!==null&&n.memoizedState.dehydrated!==null){if(Ye&&Yt!==null&&(o.mode&1)!==0&&(o.flags&128)===0)gp(),cs(),o.flags|=98560,m=!1;else if(m=Ha(o),c!==null&&c.dehydrated!==null){if(n===null){if(!m)throw Error(r(318));if(m=o.memoizedState,m=m!==null?m.dehydrated:null,!m)throw Error(r(317));m[zn]=o}else cs(),(o.flags&128)===0&&(o.memoizedState=null),o.flags|=4;xt(o),m=!1}else yn!==null&&(Xu(yn),yn=null),m=!0;if(!m)return o.flags&65536?o:null}return(o.flags&128)!==0?(o.lanes=a,o):(c=c!==null,c!==(n!==null&&n.memoizedState!==null)&&c&&(o.child.flags|=8192,(o.mode&1)!==0&&(n===null||(Ge.current&1)!==0?it===0&&(it=3):ed())),o.updateQueue!==null&&(o.flags|=4),xt(o),null);case 4:return hs(),$u(n,o),n===null&&vi(o.stateNode.containerInfo),xt(o),null;case 10:return pu(o.type._context),xt(o),null;case 17:return Dt(o.type)&&Fa(),xt(o),null;case 19:if(qe(Ge),m=o.memoizedState,m===null)return xt(o),null;if(c=(o.flags&128)!==0,S=m.rendering,S===null)if(c)Oi(m,!1);else{if(it!==0||n!==null&&(n.flags&128)!==0)for(n=o.child;n!==null;){if(S=Ya(n),S!==null){for(o.flags|=128,Oi(m,!1),c=S.updateQueue,c!==null&&(o.updateQueue=c,o.flags|=4),o.subtreeFlags=0,c=a,a=o.child;a!==null;)m=a,n=c,m.flags&=14680066,S=m.alternate,S===null?(m.childLanes=0,m.lanes=n,m.child=null,m.subtreeFlags=0,m.memoizedProps=null,m.memoizedState=null,m.updateQueue=null,m.dependencies=null,m.stateNode=null):(m.childLanes=S.childLanes,m.lanes=S.lanes,m.child=S.child,m.subtreeFlags=0,m.deletions=null,m.memoizedProps=S.memoizedProps,m.memoizedState=S.memoizedState,m.updateQueue=S.updateQueue,m.type=S.type,n=S.dependencies,m.dependencies=n===null?null:{lanes:n.lanes,firstContext:n.firstContext}),a=a.sibling;return We(Ge,Ge.current&1|2),o.child}n=n.sibling}m.tail!==null&&tt()>ys&&(o.flags|=128,c=!0,Oi(m,!1),o.lanes=4194304)}else{if(!c)if(n=Ya(S),n!==null){if(o.flags|=128,c=!0,a=n.updateQueue,a!==null&&(o.updateQueue=a,o.flags|=4),Oi(m,!0),m.tail===null&&m.tailMode===\"hidden\"&&!S.alternate&&!Ye)return xt(o),null}else 2*tt()-m.renderingStartTime>ys&&a!==1073741824&&(o.flags|=128,c=!0,Oi(m,!1),o.lanes=4194304);m.isBackwards?(S.sibling=o.child,o.child=S):(a=m.last,a!==null?a.sibling=S:o.child=S,m.last=S)}return m.tail!==null?(o=m.tail,m.rendering=o,m.tail=o.sibling,m.renderingStartTime=tt(),o.sibling=null,a=Ge.current,We(Ge,c?a&1|2:a&1),o):(xt(o),null);case 22:case 23:return Zu(),c=o.memoizedState!==null,n!==null&&n.memoizedState!==null!==c&&(o.flags|=8192),c&&(o.mode&1)!==0?(Gt&1073741824)!==0&&(xt(o),o.subtreeFlags&6&&(o.flags|=8192)):xt(o),null;case 24:return null;case 25:return null}throw Error(r(156,o.tag))}function Lb(n,o){switch(lu(o),o.tag){case 1:return Dt(o.type)&&Fa(),n=o.flags,n&65536?(o.flags=n&-65537|128,o):null;case 3:return hs(),qe(It),qe(yt),bu(),n=o.flags,(n&65536)!==0&&(n&128)===0?(o.flags=n&-65537|128,o):null;case 5:return xu(o),null;case 13:if(qe(Ge),n=o.memoizedState,n!==null&&n.dehydrated!==null){if(o.alternate===null)throw Error(r(340));cs()}return n=o.flags,n&65536?(o.flags=n&-65537|128,o):null;case 19:return qe(Ge),null;case 4:return hs(),null;case 10:return pu(o.type._context),null;case 22:case 23:return Zu(),null;case 24:return null;default:return null}}var ol=!1,wt=!1,Ib=typeof WeakSet==\"function\"?WeakSet:Set,fe=null;function ms(n,o){var a=n.ref;if(a!==null)if(typeof a==\"function\")try{a(null)}catch(c){Je(n,o,c)}else a.current=null}function Uu(n,o,a){try{a()}catch(c){Je(n,o,c)}}var pm=!1;function Db(n,o){if(Zc=Ea,n=Kh(),Wc(n)){if(\"selectionStart\"in n)var a={start:n.selectionStart,end:n.selectionEnd};else e:{a=(a=n.ownerDocument)&&a.defaultView||window;var c=a.getSelection&&a.getSelection();if(c&&c.rangeCount!==0){a=c.anchorNode;var f=c.anchorOffset,m=c.focusNode;c=c.focusOffset;try{a.nodeType,m.nodeType}catch{a=null;break e}var S=0,N=-1,O=-1,z=0,Y=0,X=n,q=null;t:for(;;){for(var ue;X!==a||f!==0&&X.nodeType!==3||(N=S+f),X!==m||c!==0&&X.nodeType!==3||(O=S+c),X.nodeType===3&&(S+=X.nodeValue.length),(ue=X.firstChild)!==null;)q=X,X=ue;for(;;){if(X===n)break t;if(q===a&&++z===f&&(N=S),q===m&&++Y===c&&(O=S),(ue=X.nextSibling)!==null)break;X=q,q=X.parentNode}X=ue}a=N===-1||O===-1?null:{start:N,end:O}}else a=null}a=a||{start:0,end:0}}else a=null;for(eu={focusedElem:n,selectionRange:a},Ea=!1,fe=o;fe!==null;)if(o=fe,n=o.child,(o.subtreeFlags&1028)!==0&&n!==null)n.return=o,fe=n;else for(;fe!==null;){o=fe;try{var he=o.alternate;if((o.flags&1024)!==0)switch(o.tag){case 0:case 11:case 15:break;case 1:if(he!==null){var pe=he.memoizedProps,nt=he.memoizedState,I=o.stateNode,L=I.getSnapshotBeforeUpdate(o.elementType===o.type?pe:vn(o.type,pe),nt);I.__reactInternalSnapshotBeforeUpdate=L}break;case 3:var D=o.stateNode.containerInfo;D.nodeType===1?D.textContent=\"\":D.nodeType===9&&D.documentElement&&D.removeChild(D.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(r(163))}}catch(re){Je(o,o.return,re)}if(n=o.sibling,n!==null){n.return=o.return,fe=n;break}fe=o.return}return he=pm,pm=!1,he}function ji(n,o,a){var c=o.updateQueue;if(c=c!==null?c.lastEffect:null,c!==null){var f=c=c.next;do{if((f.tag&n)===n){var m=f.destroy;f.destroy=void 0,m!==void 0&&Uu(o,a,m)}f=f.next}while(f!==c)}}function sl(n,o){if(o=o.updateQueue,o=o!==null?o.lastEffect:null,o!==null){var a=o=o.next;do{if((a.tag&n)===n){var c=a.create;a.destroy=c()}a=a.next}while(a!==o)}}function Bu(n){var o=n.ref;if(o!==null){var a=n.stateNode;switch(n.tag){case 5:n=a;break;default:n=a}typeof o==\"function\"?o(n):o.current=n}}function mm(n){var o=n.alternate;o!==null&&(n.alternate=null,mm(o)),n.child=null,n.deletions=null,n.sibling=null,n.tag===5&&(o=n.stateNode,o!==null&&(delete o[zn],delete o[wi],delete o[ou],delete o[vb],delete o[xb])),n.stateNode=null,n.return=null,n.dependencies=null,n.memoizedProps=null,n.memoizedState=null,n.pendingProps=null,n.stateNode=null,n.updateQueue=null}function gm(n){return n.tag===5||n.tag===3||n.tag===4}function ym(n){e:for(;;){for(;n.sibling===null;){if(n.return===null||gm(n.return))return null;n=n.return}for(n.sibling.return=n.return,n=n.sibling;n.tag!==5&&n.tag!==6&&n.tag!==18;){if(n.flags&2||n.child===null||n.tag===4)continue e;n.child.return=n,n=n.child}if(!(n.flags&2))return n.stateNode}}function Hu(n,o,a){var c=n.tag;if(c===5||c===6)n=n.stateNode,o?a.nodeType===8?a.parentNode.insertBefore(n,o):a.insertBefore(n,o):(a.nodeType===8?(o=a.parentNode,o.insertBefore(n,a)):(o=a,o.appendChild(n)),a=a._reactRootContainer,a!=null||o.onclick!==null||(o.onclick=Da));else if(c!==4&&(n=n.child,n!==null))for(Hu(n,o,a),n=n.sibling;n!==null;)Hu(n,o,a),n=n.sibling}function Vu(n,o,a){var c=n.tag;if(c===5||c===6)n=n.stateNode,o?a.insertBefore(n,o):a.appendChild(n);else if(c!==4&&(n=n.child,n!==null))for(Vu(n,o,a),n=n.sibling;n!==null;)Vu(n,o,a),n=n.sibling}var ht=null,xn=!1;function Ir(n,o,a){for(a=a.child;a!==null;)vm(n,o,a),a=a.sibling}function vm(n,o,a){if(Fn&&typeof Fn.onCommitFiberUnmount==\"function\")try{Fn.onCommitFiberUnmount(va,a)}catch{}switch(a.tag){case 5:wt||ms(a,o);case 6:var c=ht,f=xn;ht=null,Ir(n,o,a),ht=c,xn=f,ht!==null&&(xn?(n=ht,a=a.stateNode,n.nodeType===8?n.parentNode.removeChild(a):n.removeChild(a)):ht.removeChild(a.stateNode));break;case 18:ht!==null&&(xn?(n=ht,a=a.stateNode,n.nodeType===8?ru(n.parentNode,a):n.nodeType===1&&ru(n,a),ci(n)):ru(ht,a.stateNode));break;case 4:c=ht,f=xn,ht=a.stateNode.containerInfo,xn=!0,Ir(n,o,a),ht=c,xn=f;break;case 0:case 11:case 14:case 15:if(!wt&&(c=a.updateQueue,c!==null&&(c=c.lastEffect,c!==null))){f=c=c.next;do{var m=f,S=m.destroy;m=m.tag,S!==void 0&&((m&2)!==0||(m&4)!==0)&&Uu(a,o,S),f=f.next}while(f!==c)}Ir(n,o,a);break;case 1:if(!wt&&(ms(a,o),c=a.stateNode,typeof c.componentWillUnmount==\"function\"))try{c.props=a.memoizedProps,c.state=a.memoizedState,c.componentWillUnmount()}catch(N){Je(a,o,N)}Ir(n,o,a);break;case 21:Ir(n,o,a);break;case 22:a.mode&1?(wt=(c=wt)||a.memoizedState!==null,Ir(n,o,a),wt=c):Ir(n,o,a);break;default:Ir(n,o,a)}}function xm(n){var o=n.updateQueue;if(o!==null){n.updateQueue=null;var a=n.stateNode;a===null&&(a=n.stateNode=new Ib),o.forEach(function(c){var f=Wb.bind(null,n,c);a.has(c)||(a.add(c),c.then(f,f))})}}function wn(n,o){var a=o.deletions;if(a!==null)for(var c=0;c<a.length;c++){var f=a[c];try{var m=n,S=o,N=S;e:for(;N!==null;){switch(N.tag){case 5:ht=N.stateNode,xn=!1;break e;case 3:ht=N.stateNode.containerInfo,xn=!0;break e;case 4:ht=N.stateNode.containerInfo,xn=!0;break e}N=N.return}if(ht===null)throw Error(r(160));vm(m,S,f),ht=null,xn=!1;var O=f.alternate;O!==null&&(O.return=null),f.return=null}catch(z){Je(f,o,z)}}if(o.subtreeFlags&12854)for(o=o.child;o!==null;)wm(o,n),o=o.sibling}function wm(n,o){var a=n.alternate,c=n.flags;switch(n.tag){case 0:case 11:case 14:case 15:if(wn(o,n),Bn(n),c&4){try{ji(3,n,n.return),sl(3,n)}catch(pe){Je(n,n.return,pe)}try{ji(5,n,n.return)}catch(pe){Je(n,n.return,pe)}}break;case 1:wn(o,n),Bn(n),c&512&&a!==null&&ms(a,a.return);break;case 5:if(wn(o,n),Bn(n),c&512&&a!==null&&ms(a,a.return),n.flags&32){var f=n.stateNode;try{Ln(f,\"\")}catch(pe){Je(n,n.return,pe)}}if(c&4&&(f=n.stateNode,f!=null)){var m=n.memoizedProps,S=a!==null?a.memoizedProps:m,N=n.type,O=n.updateQueue;if(n.updateQueue=null,O!==null)try{N===\"input\"&&m.type===\"radio\"&&m.name!=null&&dn(f,m),ei(N,S);var z=ei(N,m);for(S=0;S<O.length;S+=2){var Y=O[S],X=O[S+1];Y===\"style\"?tr(f,X):Y===\"dangerouslySetInnerHTML\"?da(f,X):Y===\"children\"?Ln(f,X):_(f,Y,X,z)}switch(N){case\"input\":fn(f,m);break;case\"textarea\":ca(f,m);break;case\"select\":var q=f._wrapperState.wasMultiple;f._wrapperState.wasMultiple=!!m.multiple;var ue=m.value;ue!=null?en(f,!!m.multiple,ue,!1):q!==!!m.multiple&&(m.defaultValue!=null?en(f,!!m.multiple,m.defaultValue,!0):en(f,!!m.multiple,m.multiple?[]:\"\",!1))}f[wi]=m}catch(pe){Je(n,n.return,pe)}}break;case 6:if(wn(o,n),Bn(n),c&4){if(n.stateNode===null)throw Error(r(162));f=n.stateNode,m=n.memoizedProps;try{f.nodeValue=m}catch(pe){Je(n,n.return,pe)}}break;case 3:if(wn(o,n),Bn(n),c&4&&a!==null&&a.memoizedState.isDehydrated)try{ci(o.containerInfo)}catch(pe){Je(n,n.return,pe)}break;case 4:wn(o,n),Bn(n);break;case 13:wn(o,n),Bn(n),f=n.child,f.flags&8192&&(m=f.memoizedState!==null,f.stateNode.isHidden=m,!m||f.alternate!==null&&f.alternate.memoizedState!==null||(qu=tt())),c&4&&xm(n);break;case 22:if(Y=a!==null&&a.memoizedState!==null,n.mode&1?(wt=(z=wt)||Y,wn(o,n),wt=z):wn(o,n),Bn(n),c&8192){if(z=n.memoizedState!==null,(n.stateNode.isHidden=z)&&!Y&&(n.mode&1)!==0)for(fe=n,Y=n.child;Y!==null;){for(X=fe=Y;fe!==null;){switch(q=fe,ue=q.child,q.tag){case 0:case 11:case 14:case 15:ji(4,q,q.return);break;case 1:ms(q,q.return);var he=q.stateNode;if(typeof he.componentWillUnmount==\"function\"){c=q,a=q.return;try{o=c,he.props=o.memoizedProps,he.state=o.memoizedState,he.componentWillUnmount()}catch(pe){Je(c,a,pe)}}break;case 5:ms(q,q.return);break;case 22:if(q.memoizedState!==null){Cm(X);continue}}ue!==null?(ue.return=q,fe=ue):Cm(X)}Y=Y.sibling}e:for(Y=null,X=n;;){if(X.tag===5){if(Y===null){Y=X;try{f=X.stateNode,z?(m=f.style,typeof m.setProperty==\"function\"?m.setProperty(\"display\",\"none\",\"important\"):m.display=\"none\"):(N=X.stateNode,O=X.memoizedProps.style,S=O!=null&&O.hasOwnProperty(\"display\")?O.display:null,N.style.display=Qo(\"display\",S))}catch(pe){Je(n,n.return,pe)}}}else if(X.tag===6){if(Y===null)try{X.stateNode.nodeValue=z?\"\":X.memoizedProps}catch(pe){Je(n,n.return,pe)}}else if((X.tag!==22&&X.tag!==23||X.memoizedState===null||X===n)&&X.child!==null){X.child.return=X,X=X.child;continue}if(X===n)break e;for(;X.sibling===null;){if(X.return===null||X.return===n)break e;Y===X&&(Y=null),X=X.return}Y===X&&(Y=null),X.sibling.return=X.return,X=X.sibling}}break;case 19:wn(o,n),Bn(n),c&4&&xm(n);break;case 21:break;default:wn(o,n),Bn(n)}}function Bn(n){var o=n.flags;if(o&2){try{e:{for(var a=n.return;a!==null;){if(gm(a)){var c=a;break e}a=a.return}throw Error(r(160))}switch(c.tag){case 5:var f=c.stateNode;c.flags&32&&(Ln(f,\"\"),c.flags&=-33);var m=ym(n);Vu(n,m,f);break;case 3:case 4:var S=c.stateNode.containerInfo,N=ym(n);Hu(n,N,S);break;default:throw Error(r(161))}}catch(O){Je(n,n.return,O)}n.flags&=-3}o&4096&&(n.flags&=-4097)}function Mb(n,o,a){fe=n,bm(n)}function bm(n,o,a){for(var c=(n.mode&1)!==0;fe!==null;){var f=fe,m=f.child;if(f.tag===22&&c){var S=f.memoizedState!==null||ol;if(!S){var N=f.alternate,O=N!==null&&N.memoizedState!==null||wt;N=ol;var z=wt;if(ol=S,(wt=O)&&!z)for(fe=f;fe!==null;)S=fe,O=S.child,S.tag===22&&S.memoizedState!==null?Em(f):O!==null?(O.return=S,fe=O):Em(f);for(;m!==null;)fe=m,bm(m),m=m.sibling;fe=f,ol=N,wt=z}Sm(n)}else(f.subtreeFlags&8772)!==0&&m!==null?(m.return=f,fe=m):Sm(n)}}function Sm(n){for(;fe!==null;){var o=fe;if((o.flags&8772)!==0){var a=o.alternate;try{if((o.flags&8772)!==0)switch(o.tag){case 0:case 11:case 15:wt||sl(5,o);break;case 1:var c=o.stateNode;if(o.flags&4&&!wt)if(a===null)c.componentDidMount();else{var f=o.elementType===o.type?a.memoizedProps:vn(o.type,a.memoizedProps);c.componentDidUpdate(f,a.memoizedState,c.__reactInternalSnapshotBeforeUpdate)}var m=o.updateQueue;m!==null&&Cp(o,m,c);break;case 3:var S=o.updateQueue;if(S!==null){if(a=null,o.child!==null)switch(o.child.tag){case 5:a=o.child.stateNode;break;case 1:a=o.child.stateNode}Cp(o,S,a)}break;case 5:var N=o.stateNode;if(a===null&&o.flags&4){a=N;var O=o.memoizedProps;switch(o.type){case\"button\":case\"input\":case\"select\":case\"textarea\":O.autoFocus&&a.focus();break;case\"img\":O.src&&(a.src=O.src)}}break;case 6:break;case 4:break;case 12:break;case 13:if(o.memoizedState===null){var z=o.alternate;if(z!==null){var Y=z.memoizedState;if(Y!==null){var X=Y.dehydrated;X!==null&&ci(X)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;default:throw Error(r(163))}wt||o.flags&512&&Bu(o)}catch(q){Je(o,o.return,q)}}if(o===n){fe=null;break}if(a=o.sibling,a!==null){a.return=o.return,fe=a;break}fe=o.return}}function Cm(n){for(;fe!==null;){var o=fe;if(o===n){fe=null;break}var a=o.sibling;if(a!==null){a.return=o.return,fe=a;break}fe=o.return}}function Em(n){for(;fe!==null;){var o=fe;try{switch(o.tag){case 0:case 11:case 15:var a=o.return;try{sl(4,o)}catch(O){Je(o,a,O)}break;case 1:var c=o.stateNode;if(typeof c.componentDidMount==\"function\"){var f=o.return;try{c.componentDidMount()}catch(O){Je(o,f,O)}}var m=o.return;try{Bu(o)}catch(O){Je(o,m,O)}break;case 5:var S=o.return;try{Bu(o)}catch(O){Je(o,S,O)}}}catch(O){Je(o,o.return,O)}if(o===n){fe=null;break}var N=o.sibling;if(N!==null){N.return=o.return,fe=N;break}fe=o.return}}var Fb=Math.ceil,il=A.ReactCurrentDispatcher,Wu=A.ReactCurrentOwner,sn=A.ReactCurrentBatchConfig,Le=0,ct=null,ot=null,pt=0,Gt=0,gs=Or(0),it=0,_i=null,yo=0,al=0,Ku=0,Ai=null,Ft=null,qu=0,ys=1/0,cr=null,ll=!1,Qu=null,Dr=null,cl=!1,Mr=null,ul=0,Li=0,Yu=null,dl=-1,fl=0;function Rt(){return(Le&6)!==0?tt():dl!==-1?dl:dl=tt()}function Fr(n){return(n.mode&1)===0?1:(Le&2)!==0&&pt!==0?pt&-pt:bb.transition!==null?(fl===0&&(fl=yh()),fl):(n=Ue,n!==0||(n=window.event,n=n===void 0?16:Nh(n.type)),n)}function bn(n,o,a,c){if(50<Li)throw Li=0,Yu=null,Error(r(185));oi(n,a,c),((Le&2)===0||n!==ct)&&(n===ct&&((Le&2)===0&&(al|=a),it===4&&zr(n,pt)),zt(n,c),a===1&&Le===0&&(o.mode&1)===0&&(ys=tt()+500,$a&&_r()))}function zt(n,o){var a=n.callbackNode;bw(n,o);var c=ba(n,n===ct?pt:0);if(c===0)a!==null&&ph(a),n.callbackNode=null,n.callbackPriority=0;else if(o=c&-c,n.callbackPriority!==o){if(a!=null&&ph(a),o===1)n.tag===0?wb(Nm.bind(null,n)):dp(Nm.bind(null,n)),gb(function(){(Le&6)===0&&_r()}),a=null;else{switch(vh(c)){case 1:a=Pc;break;case 4:a=mh;break;case 16:a=ya;break;case 536870912:a=gh;break;default:a=ya}a=Lm(a,km.bind(null,n))}n.callbackPriority=o,n.callbackNode=a}}function km(n,o){if(dl=-1,fl=0,(Le&6)!==0)throw Error(r(327));var a=n.callbackNode;if(vs()&&n.callbackNode!==a)return null;var c=ba(n,n===ct?pt:0);if(c===0)return null;if((c&30)!==0||(c&n.expiredLanes)!==0||o)o=hl(n,c);else{o=c;var f=Le;Le|=2;var m=Pm();(ct!==n||pt!==o)&&(cr=null,ys=tt()+500,xo(n,o));do try{Ub();break}catch(N){Rm(n,N)}while(!0);hu(),il.current=m,Le=f,ot!==null?o=0:(ct=null,pt=0,o=it)}if(o!==0){if(o===2&&(f=Tc(n),f!==0&&(c=f,o=Gu(n,f))),o===1)throw a=_i,xo(n,0),zr(n,c),zt(n,tt()),a;if(o===6)zr(n,c);else{if(f=n.current.alternate,(c&30)===0&&!zb(f)&&(o=hl(n,c),o===2&&(m=Tc(n),m!==0&&(c=m,o=Gu(n,m))),o===1))throw a=_i,xo(n,0),zr(n,c),zt(n,tt()),a;switch(n.finishedWork=f,n.finishedLanes=c,o){case 0:case 1:throw Error(r(345));case 2:wo(n,Ft,cr);break;case 3:if(zr(n,c),(c&130023424)===c&&(o=qu+500-tt(),10<o)){if(ba(n,0)!==0)break;if(f=n.suspendedLanes,(f&c)!==c){Rt(),n.pingedLanes|=n.suspendedLanes&f;break}n.timeoutHandle=nu(wo.bind(null,n,Ft,cr),o);break}wo(n,Ft,cr);break;case 4:if(zr(n,c),(c&4194240)===c)break;for(o=n.eventTimes,f=-1;0<c;){var S=31-mn(c);m=1<<S,S=o[S],S>f&&(f=S),c&=~m}if(c=f,c=tt()-c,c=(120>c?120:480>c?480:1080>c?1080:1920>c?1920:3e3>c?3e3:4320>c?4320:1960*Fb(c/1960))-c,10<c){n.timeoutHandle=nu(wo.bind(null,n,Ft,cr),c);break}wo(n,Ft,cr);break;case 5:wo(n,Ft,cr);break;default:throw Error(r(329))}}}return zt(n,tt()),n.callbackNode===a?km.bind(null,n):null}function Gu(n,o){var a=Ai;return n.current.memoizedState.isDehydrated&&(xo(n,o).flags|=256),n=hl(n,o),n!==2&&(o=Ft,Ft=a,o!==null&&Xu(o)),n}function Xu(n){Ft===null?Ft=n:Ft.push.apply(Ft,n)}function zb(n){for(var o=n;;){if(o.flags&16384){var a=o.updateQueue;if(a!==null&&(a=a.stores,a!==null))for(var c=0;c<a.length;c++){var f=a[c],m=f.getSnapshot;f=f.value;try{if(!gn(m(),f))return!1}catch{return!1}}}if(a=o.child,o.subtreeFlags&16384&&a!==null)a.return=o,o=a;else{if(o===n)break;for(;o.sibling===null;){if(o.return===null||o.return===n)return!0;o=o.return}o.sibling.return=o.return,o=o.sibling}}return!0}function zr(n,o){for(o&=~Ku,o&=~al,n.suspendedLanes|=o,n.pingedLanes&=~o,n=n.expirationTimes;0<o;){var a=31-mn(o),c=1<<a;n[a]=-1,o&=~c}}function Nm(n){if((Le&6)!==0)throw Error(r(327));vs();var o=ba(n,0);if((o&1)===0)return zt(n,tt()),null;var a=hl(n,o);if(n.tag!==0&&a===2){var c=Tc(n);c!==0&&(o=c,a=Gu(n,c))}if(a===1)throw a=_i,xo(n,0),zr(n,o),zt(n,tt()),a;if(a===6)throw Error(r(345));return n.finishedWork=n.current.alternate,n.finishedLanes=o,wo(n,Ft,cr),zt(n,tt()),null}function Ju(n,o){var a=Le;Le|=1;try{return n(o)}finally{Le=a,Le===0&&(ys=tt()+500,$a&&_r())}}function vo(n){Mr!==null&&Mr.tag===0&&(Le&6)===0&&vs();var o=Le;Le|=1;var a=sn.transition,c=Ue;try{if(sn.transition=null,Ue=1,n)return n()}finally{Ue=c,sn.transition=a,Le=o,(Le&6)===0&&_r()}}function Zu(){Gt=gs.current,qe(gs)}function xo(n,o){n.finishedWork=null,n.finishedLanes=0;var a=n.timeoutHandle;if(a!==-1&&(n.timeoutHandle=-1,mb(a)),ot!==null)for(a=ot.return;a!==null;){var c=a;switch(lu(c),c.tag){case 1:c=c.type.childContextTypes,c!=null&&Fa();break;case 3:hs(),qe(It),qe(yt),bu();break;case 5:xu(c);break;case 4:hs();break;case 13:qe(Ge);break;case 19:qe(Ge);break;case 10:pu(c.type._context);break;case 22:case 23:Zu()}a=a.return}if(ct=n,ot=n=$r(n.current,null),pt=Gt=o,it=0,_i=null,Ku=al=yo=0,Ft=Ai=null,po!==null){for(o=0;o<po.length;o++)if(a=po[o],c=a.interleaved,c!==null){a.interleaved=null;var f=c.next,m=a.pending;if(m!==null){var S=m.next;m.next=f,c.next=S}a.pending=c}po=null}return n}function Rm(n,o){do{var a=ot;try{if(hu(),Ga.current=el,Xa){for(var c=Xe.memoizedState;c!==null;){var f=c.queue;f!==null&&(f.pending=null),c=c.next}Xa=!1}if(go=0,lt=st=Xe=null,Ni=!1,Ri=0,Wu.current=null,a===null||a.return===null){it=1,_i=o,ot=null;break}e:{var m=n,S=a.return,N=a,O=o;if(o=pt,N.flags|=32768,O!==null&&typeof O==\"object\"&&typeof O.then==\"function\"){var z=O,Y=N,X=Y.tag;if((Y.mode&1)===0&&(X===0||X===11||X===15)){var q=Y.alternate;q?(Y.updateQueue=q.updateQueue,Y.memoizedState=q.memoizedState,Y.lanes=q.lanes):(Y.updateQueue=null,Y.memoizedState=null)}var ue=Jp(S);if(ue!==null){ue.flags&=-257,Zp(ue,S,N,m,o),ue.mode&1&&Xp(m,z,o),o=ue,O=z;var he=o.updateQueue;if(he===null){var pe=new Set;pe.add(O),o.updateQueue=pe}else he.add(O);break e}else{if((o&1)===0){Xp(m,z,o),ed();break e}O=Error(r(426))}}else if(Ye&&N.mode&1){var nt=Jp(S);if(nt!==null){(nt.flags&65536)===0&&(nt.flags|=256),Zp(nt,S,N,m,o),du(ps(O,N));break e}}m=O=ps(O,N),it!==4&&(it=2),Ai===null?Ai=[m]:Ai.push(m),m=S;do{switch(m.tag){case 3:m.flags|=65536,o&=-o,m.lanes|=o;var I=Yp(m,O,o);Sp(m,I);break e;case 1:N=O;var L=m.type,D=m.stateNode;if((m.flags&128)===0&&(typeof L.getDerivedStateFromError==\"function\"||D!==null&&typeof D.componentDidCatch==\"function\"&&(Dr===null||!Dr.has(D)))){m.flags|=65536,o&=-o,m.lanes|=o;var re=Gp(m,N,o);Sp(m,re);break e}}m=m.return}while(m!==null)}Om(a)}catch(ge){o=ge,ot===a&&a!==null&&(ot=a=a.return);continue}break}while(!0)}function Pm(){var n=il.current;return il.current=el,n===null?el:n}function ed(){(it===0||it===3||it===2)&&(it=4),ct===null||(yo&268435455)===0&&(al&268435455)===0||zr(ct,pt)}function hl(n,o){var a=Le;Le|=2;var c=Pm();(ct!==n||pt!==o)&&(cr=null,xo(n,o));do try{$b();break}catch(f){Rm(n,f)}while(!0);if(hu(),Le=a,il.current=c,ot!==null)throw Error(r(261));return ct=null,pt=0,it}function $b(){for(;ot!==null;)Tm(ot)}function Ub(){for(;ot!==null&&!fw();)Tm(ot)}function Tm(n){var o=Am(n.alternate,n,Gt);n.memoizedProps=n.pendingProps,o===null?Om(n):ot=o,Wu.current=null}function Om(n){var o=n;do{var a=o.alternate;if(n=o.return,(o.flags&32768)===0){if(a=Ab(a,o,Gt),a!==null){ot=a;return}}else{if(a=Lb(a,o),a!==null){a.flags&=32767,ot=a;return}if(n!==null)n.flags|=32768,n.subtreeFlags=0,n.deletions=null;else{it=6,ot=null;return}}if(o=o.sibling,o!==null){ot=o;return}ot=o=n}while(o!==null);it===0&&(it=5)}function wo(n,o,a){var c=Ue,f=sn.transition;try{sn.transition=null,Ue=1,Bb(n,o,a,c)}finally{sn.transition=f,Ue=c}return null}function Bb(n,o,a,c){do vs();while(Mr!==null);if((Le&6)!==0)throw Error(r(327));a=n.finishedWork;var f=n.finishedLanes;if(a===null)return null;if(n.finishedWork=null,n.finishedLanes=0,a===n.current)throw Error(r(177));n.callbackNode=null,n.callbackPriority=0;var m=a.lanes|a.childLanes;if(Sw(n,m),n===ct&&(ot=ct=null,pt=0),(a.subtreeFlags&2064)===0&&(a.flags&2064)===0||cl||(cl=!0,Lm(ya,function(){return vs(),null})),m=(a.flags&15990)!==0,(a.subtreeFlags&15990)!==0||m){m=sn.transition,sn.transition=null;var S=Ue;Ue=1;var N=Le;Le|=4,Wu.current=null,Db(n,a),wm(a,n),lb(eu),Ea=!!Zc,eu=Zc=null,n.current=a,Mb(a),hw(),Le=N,Ue=S,sn.transition=m}else n.current=a;if(cl&&(cl=!1,Mr=n,ul=f),m=n.pendingLanes,m===0&&(Dr=null),gw(a.stateNode),zt(n,tt()),o!==null)for(c=n.onRecoverableError,a=0;a<o.length;a++)f=o[a],c(f.value,{componentStack:f.stack,digest:f.digest});if(ll)throw ll=!1,n=Qu,Qu=null,n;return(ul&1)!==0&&n.tag!==0&&vs(),m=n.pendingLanes,(m&1)!==0?n===Yu?Li++:(Li=0,Yu=n):Li=0,_r(),null}function vs(){if(Mr!==null){var n=vh(ul),o=sn.transition,a=Ue;try{if(sn.transition=null,Ue=16>n?16:n,Mr===null)var c=!1;else{if(n=Mr,Mr=null,ul=0,(Le&6)!==0)throw Error(r(331));var f=Le;for(Le|=4,fe=n.current;fe!==null;){var m=fe,S=m.child;if((fe.flags&16)!==0){var N=m.deletions;if(N!==null){for(var O=0;O<N.length;O++){var z=N[O];for(fe=z;fe!==null;){var Y=fe;switch(Y.tag){case 0:case 11:case 15:ji(8,Y,m)}var X=Y.child;if(X!==null)X.return=Y,fe=X;else for(;fe!==null;){Y=fe;var q=Y.sibling,ue=Y.return;if(mm(Y),Y===z){fe=null;break}if(q!==null){q.return=ue,fe=q;break}fe=ue}}}var he=m.alternate;if(he!==null){var pe=he.child;if(pe!==null){he.child=null;do{var nt=pe.sibling;pe.sibling=null,pe=nt}while(pe!==null)}}fe=m}}if((m.subtreeFlags&2064)!==0&&S!==null)S.return=m,fe=S;else e:for(;fe!==null;){if(m=fe,(m.flags&2048)!==0)switch(m.tag){case 0:case 11:case 15:ji(9,m,m.return)}var I=m.sibling;if(I!==null){I.return=m.return,fe=I;break e}fe=m.return}}var L=n.current;for(fe=L;fe!==null;){S=fe;var D=S.child;if((S.subtreeFlags&2064)!==0&&D!==null)D.return=S,fe=D;else e:for(S=L;fe!==null;){if(N=fe,(N.flags&2048)!==0)try{switch(N.tag){case 0:case 11:case 15:sl(9,N)}}catch(ge){Je(N,N.return,ge)}if(N===S){fe=null;break e}var re=N.sibling;if(re!==null){re.return=N.return,fe=re;break e}fe=N.return}}if(Le=f,_r(),Fn&&typeof Fn.onPostCommitFiberRoot==\"function\")try{Fn.onPostCommitFiberRoot(va,n)}catch{}c=!0}return c}finally{Ue=a,sn.transition=o}}return!1}function jm(n,o,a){o=ps(a,o),o=Yp(n,o,1),n=Lr(n,o,1),o=Rt(),n!==null&&(oi(n,1,o),zt(n,o))}function Je(n,o,a){if(n.tag===3)jm(n,n,a);else for(;o!==null;){if(o.tag===3){jm(o,n,a);break}else if(o.tag===1){var c=o.stateNode;if(typeof o.type.getDerivedStateFromError==\"function\"||typeof c.componentDidCatch==\"function\"&&(Dr===null||!Dr.has(c))){n=ps(a,n),n=Gp(o,n,1),o=Lr(o,n,1),n=Rt(),o!==null&&(oi(o,1,n),zt(o,n));break}}o=o.return}}function Hb(n,o,a){var c=n.pingCache;c!==null&&c.delete(o),o=Rt(),n.pingedLanes|=n.suspendedLanes&a,ct===n&&(pt&a)===a&&(it===4||it===3&&(pt&130023424)===pt&&500>tt()-qu?xo(n,0):Ku|=a),zt(n,o)}function _m(n,o){o===0&&((n.mode&1)===0?o=1:(o=wa,wa<<=1,(wa&130023424)===0&&(wa=4194304)));var a=Rt();n=ir(n,o),n!==null&&(oi(n,o,a),zt(n,a))}function Vb(n){var o=n.memoizedState,a=0;o!==null&&(a=o.retryLane),_m(n,a)}function Wb(n,o){var a=0;switch(n.tag){case 13:var c=n.stateNode,f=n.memoizedState;f!==null&&(a=f.retryLane);break;case 19:c=n.stateNode;break;default:throw Error(r(314))}c!==null&&c.delete(o),_m(n,a)}var Am;Am=function(n,o,a){if(n!==null)if(n.memoizedProps!==o.pendingProps||It.current)Mt=!0;else{if((n.lanes&a)===0&&(o.flags&128)===0)return Mt=!1,_b(n,o,a);Mt=(n.flags&131072)!==0}else Mt=!1,Ye&&(o.flags&1048576)!==0&&fp(o,Ba,o.index);switch(o.lanes=0,o.tag){case 2:var c=o.type;rl(n,o),n=o.pendingProps;var f=is(o,yt.current);fs(o,a),f=Eu(null,o,c,n,f,a);var m=ku();return o.flags|=1,typeof f==\"object\"&&f!==null&&typeof f.render==\"function\"&&f.$$typeof===void 0?(o.tag=1,o.memoizedState=null,o.updateQueue=null,Dt(c)?(m=!0,za(o)):m=!1,o.memoizedState=f.state!==null&&f.state!==void 0?f.state:null,yu(o),f.updater=tl,o.stateNode=f,f._reactInternals=o,ju(o,c,n,a),o=Iu(null,o,c,!0,m,a)):(o.tag=0,Ye&&m&&au(o),Nt(null,o,f,a),o=o.child),o;case 16:c=o.elementType;e:{switch(rl(n,o),n=o.pendingProps,f=c._init,c=f(c._payload),o.type=c,f=o.tag=qb(c),n=vn(c,n),f){case 0:o=Lu(null,o,c,n,a);break e;case 1:o=sm(null,o,c,n,a);break e;case 11:o=em(null,o,c,n,a);break e;case 14:o=tm(null,o,c,vn(c.type,n),a);break e}throw Error(r(306,c,\"\"))}return o;case 0:return c=o.type,f=o.pendingProps,f=o.elementType===c?f:vn(c,f),Lu(n,o,c,f,a);case 1:return c=o.type,f=o.pendingProps,f=o.elementType===c?f:vn(c,f),sm(n,o,c,f,a);case 3:e:{if(im(o),n===null)throw Error(r(387));c=o.pendingProps,m=o.memoizedState,f=m.element,bp(n,o),Qa(o,c,null,a);var S=o.memoizedState;if(c=S.element,m.isDehydrated)if(m={element:c,isDehydrated:!1,cache:S.cache,pendingSuspenseBoundaries:S.pendingSuspenseBoundaries,transitions:S.transitions},o.updateQueue.baseState=m,o.memoizedState=m,o.flags&256){f=ps(Error(r(423)),o),o=am(n,o,c,a,f);break e}else if(c!==f){f=ps(Error(r(424)),o),o=am(n,o,c,a,f);break e}else for(Yt=Tr(o.stateNode.containerInfo.firstChild),Qt=o,Ye=!0,yn=null,a=xp(o,null,c,a),o.child=a;a;)a.flags=a.flags&-3|4096,a=a.sibling;else{if(cs(),c===f){o=lr(n,o,a);break e}Nt(n,o,c,a)}o=o.child}return o;case 5:return Ep(o),n===null&&uu(o),c=o.type,f=o.pendingProps,m=n!==null?n.memoizedProps:null,S=f.children,tu(c,f)?S=null:m!==null&&tu(c,m)&&(o.flags|=32),om(n,o),Nt(n,o,S,a),o.child;case 6:return n===null&&uu(o),null;case 13:return lm(n,o,a);case 4:return vu(o,o.stateNode.containerInfo),c=o.pendingProps,n===null?o.child=us(o,null,c,a):Nt(n,o,c,a),o.child;case 11:return c=o.type,f=o.pendingProps,f=o.elementType===c?f:vn(c,f),em(n,o,c,f,a);case 7:return Nt(n,o,o.pendingProps,a),o.child;case 8:return Nt(n,o,o.pendingProps.children,a),o.child;case 12:return Nt(n,o,o.pendingProps.children,a),o.child;case 10:e:{if(c=o.type._context,f=o.pendingProps,m=o.memoizedProps,S=f.value,We(Wa,c._currentValue),c._currentValue=S,m!==null)if(gn(m.value,S)){if(m.children===f.children&&!It.current){o=lr(n,o,a);break e}}else for(m=o.child,m!==null&&(m.return=o);m!==null;){var N=m.dependencies;if(N!==null){S=m.child;for(var O=N.firstContext;O!==null;){if(O.context===c){if(m.tag===1){O=ar(-1,a&-a),O.tag=2;var z=m.updateQueue;if(z!==null){z=z.shared;var Y=z.pending;Y===null?O.next=O:(O.next=Y.next,Y.next=O),z.pending=O}}m.lanes|=a,O=m.alternate,O!==null&&(O.lanes|=a),mu(m.return,a,o),N.lanes|=a;break}O=O.next}}else if(m.tag===10)S=m.type===o.type?null:m.child;else if(m.tag===18){if(S=m.return,S===null)throw Error(r(341));S.lanes|=a,N=S.alternate,N!==null&&(N.lanes|=a),mu(S,a,o),S=m.sibling}else S=m.child;if(S!==null)S.return=m;else for(S=m;S!==null;){if(S===o){S=null;break}if(m=S.sibling,m!==null){m.return=S.return,S=m;break}S=S.return}m=S}Nt(n,o,f.children,a),o=o.child}return o;case 9:return f=o.type,c=o.pendingProps.children,fs(o,a),f=rn(f),c=c(f),o.flags|=1,Nt(n,o,c,a),o.child;case 14:return c=o.type,f=vn(c,o.pendingProps),f=vn(c.type,f),tm(n,o,c,f,a);case 15:return nm(n,o,o.type,o.pendingProps,a);case 17:return c=o.type,f=o.pendingProps,f=o.elementType===c?f:vn(c,f),rl(n,o),o.tag=1,Dt(c)?(n=!0,za(o)):n=!1,fs(o,a),qp(o,c,f),ju(o,c,f,a),Iu(null,o,c,!0,n,a);case 19:return um(n,o,a);case 22:return rm(n,o,a)}throw Error(r(156,o.tag))};function Lm(n,o){return hh(n,o)}function Kb(n,o,a,c){this.tag=n,this.key=a,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=o,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=c,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function an(n,o,a,c){return new Kb(n,o,a,c)}function td(n){return n=n.prototype,!(!n||!n.isReactComponent)}function qb(n){if(typeof n==\"function\")return td(n)?1:0;if(n!=null){if(n=n.$$typeof,n===K)return 11;if(n===de)return 14}return 2}function $r(n,o){var a=n.alternate;return a===null?(a=an(n.tag,o,n.key,n.mode),a.elementType=n.elementType,a.type=n.type,a.stateNode=n.stateNode,a.alternate=n,n.alternate=a):(a.pendingProps=o,a.type=n.type,a.flags=0,a.subtreeFlags=0,a.deletions=null),a.flags=n.flags&14680064,a.childLanes=n.childLanes,a.lanes=n.lanes,a.child=n.child,a.memoizedProps=n.memoizedProps,a.memoizedState=n.memoizedState,a.updateQueue=n.updateQueue,o=n.dependencies,a.dependencies=o===null?null:{lanes:o.lanes,firstContext:o.firstContext},a.sibling=n.sibling,a.index=n.index,a.ref=n.ref,a}function pl(n,o,a,c,f,m){var S=2;if(c=n,typeof n==\"function\")td(n)&&(S=1);else if(typeof n==\"string\")S=5;else e:switch(n){case B:return bo(a.children,f,m,o);case te:S=8,f|=8;break;case G:return n=an(12,a,o,f|2),n.elementType=G,n.lanes=m,n;case Z:return n=an(13,a,o,f),n.elementType=Z,n.lanes=m,n;case J:return n=an(19,a,o,f),n.elementType=J,n.lanes=m,n;case se:return ml(a,f,m,o);default:if(typeof n==\"object\"&&n!==null)switch(n.$$typeof){case W:S=10;break e;case le:S=9;break e;case K:S=11;break e;case de:S=14;break e;case ne:S=16,c=null;break e}throw Error(r(130,n==null?n:typeof n,\"\"))}return o=an(S,a,o,f),o.elementType=n,o.type=c,o.lanes=m,o}function bo(n,o,a,c){return n=an(7,n,c,o),n.lanes=a,n}function ml(n,o,a,c){return n=an(22,n,c,o),n.elementType=se,n.lanes=a,n.stateNode={isHidden:!1},n}function nd(n,o,a){return n=an(6,n,null,o),n.lanes=a,n}function rd(n,o,a){return o=an(4,n.children!==null?n.children:[],n.key,o),o.lanes=a,o.stateNode={containerInfo:n.containerInfo,pendingChildren:null,implementation:n.implementation},o}function Qb(n,o,a,c,f){this.tag=o,this.containerInfo=n,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Oc(0),this.expirationTimes=Oc(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Oc(0),this.identifierPrefix=c,this.onRecoverableError=f,this.mutableSourceEagerHydrationData=null}function od(n,o,a,c,f,m,S,N,O){return n=new Qb(n,o,a,N,O),o===1?(o=1,m===!0&&(o|=8)):o=0,m=an(3,null,null,o),n.current=m,m.stateNode=n,m.memoizedState={element:c,isDehydrated:a,cache:null,transitions:null,pendingSuspenseBoundaries:null},yu(m),n}function Yb(n,o,a){var c=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:V,key:c==null?null:\"\"+c,children:n,containerInfo:o,implementation:a}}function Im(n){if(!n)return jr;n=n._reactInternals;e:{if(lo(n)!==n||n.tag!==1)throw Error(r(170));var o=n;do{switch(o.tag){case 3:o=o.stateNode.context;break e;case 1:if(Dt(o.type)){o=o.stateNode.__reactInternalMemoizedMergedChildContext;break e}}o=o.return}while(o!==null);throw Error(r(171))}if(n.tag===1){var a=n.type;if(Dt(a))return cp(n,a,o)}return o}function Dm(n,o,a,c,f,m,S,N,O){return n=od(a,c,!0,n,f,m,S,N,O),n.context=Im(null),a=n.current,c=Rt(),f=Fr(a),m=ar(c,f),m.callback=o??null,Lr(a,m,f),n.current.lanes=f,oi(n,f,c),zt(n,c),n}function gl(n,o,a,c){var f=o.current,m=Rt(),S=Fr(f);return a=Im(a),o.context===null?o.context=a:o.pendingContext=a,o=ar(m,S),o.payload={element:n},c=c===void 0?null:c,c!==null&&(o.callback=c),n=Lr(f,o,S),n!==null&&(bn(n,f,S,m),qa(n,f,S)),S}function yl(n){if(n=n.current,!n.child)return null;switch(n.child.tag){case 5:return n.child.stateNode;default:return n.child.stateNode}}function Mm(n,o){if(n=n.memoizedState,n!==null&&n.dehydrated!==null){var a=n.retryLane;n.retryLane=a!==0&&a<o?a:o}}function sd(n,o){Mm(n,o),(n=n.alternate)&&Mm(n,o)}function Gb(){return null}var Fm=typeof reportError==\"function\"?reportError:function(n){console.error(n)};function id(n){this._internalRoot=n}vl.prototype.render=id.prototype.render=function(n){var o=this._internalRoot;if(o===null)throw Error(r(409));gl(n,o,null,null)},vl.prototype.unmount=id.prototype.unmount=function(){var n=this._internalRoot;if(n!==null){this._internalRoot=null;var o=n.containerInfo;vo(function(){gl(null,n,null,null)}),o[nr]=null}};function vl(n){this._internalRoot=n}vl.prototype.unstable_scheduleHydration=function(n){if(n){var o=bh();n={blockedOn:null,target:n,priority:o};for(var a=0;a<Nr.length&&o!==0&&o<Nr[a].priority;a++);Nr.splice(a,0,n),a===0&&Eh(n)}};function ad(n){return!(!n||n.nodeType!==1&&n.nodeType!==9&&n.nodeType!==11)}function xl(n){return!(!n||n.nodeType!==1&&n.nodeType!==9&&n.nodeType!==11&&(n.nodeType!==8||n.nodeValue!==\" react-mount-point-unstable \"))}function zm(){}function Xb(n,o,a,c,f){if(f){if(typeof c==\"function\"){var m=c;c=function(){var z=yl(S);m.call(z)}}var S=Dm(o,c,n,0,null,!1,!1,\"\",zm);return n._reactRootContainer=S,n[nr]=S.current,vi(n.nodeType===8?n.parentNode:n),vo(),S}for(;f=n.lastChild;)n.removeChild(f);if(typeof c==\"function\"){var N=c;c=function(){var z=yl(O);N.call(z)}}var O=od(n,0,!1,null,null,!1,!1,\"\",zm);return n._reactRootContainer=O,n[nr]=O.current,vi(n.nodeType===8?n.parentNode:n),vo(function(){gl(o,O,a,c)}),O}function wl(n,o,a,c,f){var m=a._reactRootContainer;if(m){var S=m;if(typeof f==\"function\"){var N=f;f=function(){var O=yl(S);N.call(O)}}gl(o,S,n,f)}else S=Xb(a,o,n,f,c);return yl(S)}xh=function(n){switch(n.tag){case 3:var o=n.stateNode;if(o.current.memoizedState.isDehydrated){var a=ri(o.pendingLanes);a!==0&&(jc(o,a|1),zt(o,tt()),(Le&6)===0&&(ys=tt()+500,_r()))}break;case 13:vo(function(){var c=ir(n,1);if(c!==null){var f=Rt();bn(c,n,1,f)}}),sd(n,1)}},_c=function(n){if(n.tag===13){var o=ir(n,134217728);if(o!==null){var a=Rt();bn(o,n,134217728,a)}sd(n,134217728)}},wh=function(n){if(n.tag===13){var o=Fr(n),a=ir(n,o);if(a!==null){var c=Rt();bn(a,n,o,c)}sd(n,o)}},bh=function(){return Ue},Sh=function(n,o){var a=Ue;try{return Ue=n,o()}finally{Ue=a}},Go=function(n,o,a){switch(o){case\"input\":if(fn(n,a),o=a.name,a.type===\"radio\"&&o!=null){for(a=n;a.parentNode;)a=a.parentNode;for(a=a.querySelectorAll(\"input[name=\"+JSON.stringify(\"\"+o)+'][type=\"radio\"]'),o=0;o<a.length;o++){var c=a[o];if(c!==n&&c.form===n.form){var f=Ma(c);if(!f)throw Error(r(90));_e(c),fn(c,f)}}}break;case\"textarea\":ca(n,a);break;case\"select\":o=a.value,o!=null&&en(n,!!a.multiple,o,!1)}},Fe=Ju,He=vo;var Jb={usingClientEntryPoint:!1,Events:[bi,os,Ma,pa,Ee,Ju]},Ii={findFiberByHostInstance:co,bundleType:0,version:\"18.3.1\",rendererPackageName:\"react-dom\"},Zb={bundleType:Ii.bundleType,version:Ii.version,rendererPackageName:Ii.rendererPackageName,rendererConfig:Ii.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:A.ReactCurrentDispatcher,findHostInstanceByFiber:function(n){return n=dh(n),n===null?null:n.stateNode},findFiberByHostInstance:Ii.findFiberByHostInstance||Gb,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:\"18.3.1-next-f1338f8080-20240426\"};if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<\"u\"){var bl=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!bl.isDisabled&&bl.supportsFiber)try{va=bl.inject(Zb),Fn=bl}catch{}}return $t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=Jb,$t.createPortal=function(n,o){var a=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!ad(o))throw Error(r(200));return Yb(n,o,null,a)},$t.createRoot=function(n,o){if(!ad(n))throw Error(r(299));var a=!1,c=\"\",f=Fm;return o!=null&&(o.unstable_strictMode===!0&&(a=!0),o.identifierPrefix!==void 0&&(c=o.identifierPrefix),o.onRecoverableError!==void 0&&(f=o.onRecoverableError)),o=od(n,1,!1,null,null,a,!1,c,f),n[nr]=o.current,vi(n.nodeType===8?n.parentNode:n),new id(o)},$t.findDOMNode=function(n){if(n==null)return null;if(n.nodeType===1)return n;var o=n._reactInternals;if(o===void 0)throw typeof n.render==\"function\"?Error(r(188)):(n=Object.keys(n).join(\",\"),Error(r(268,n)));return n=dh(o),n=n===null?null:n.stateNode,n},$t.flushSync=function(n){return vo(n)},$t.hydrate=function(n,o,a){if(!xl(o))throw Error(r(200));return wl(null,n,o,!0,a)},$t.hydrateRoot=function(n,o,a){if(!ad(n))throw Error(r(405));var c=a!=null&&a.hydratedSources||null,f=!1,m=\"\",S=Fm;if(a!=null&&(a.unstable_strictMode===!0&&(f=!0),a.identifierPrefix!==void 0&&(m=a.identifierPrefix),a.onRecoverableError!==void 0&&(S=a.onRecoverableError)),o=Dm(o,null,n,1,a??null,f,!1,m,S),n[nr]=o.current,vi(n),c)for(n=0;n<c.length;n++)a=c[n],f=a._getVersion,f=f(a._source),o.mutableSourceEagerHydrationData==null?o.mutableSourceEagerHydrationData=[a,f]:o.mutableSourceEagerHydrationData.push(a,f);return new vl(o)},$t.render=function(n,o,a){if(!xl(o))throw Error(r(200));return wl(null,n,o,!1,a)},$t.unmountComponentAtNode=function(n){if(!xl(n))throw Error(r(40));return n._reactRootContainer?(vo(function(){wl(null,null,n,!1,function(){n._reactRootContainer=null,n[nr]=null})}),!0):!1},$t.unstable_batchedUpdates=Ju,$t.unstable_renderSubtreeIntoContainer=function(n,o,a,c){if(!xl(a))throw Error(r(200));if(n==null||n._reactInternals===void 0)throw Error(r(38));return wl(n,o,a,!1,c)},$t.version=\"18.3.1-next-f1338f8080-20240426\",$t}var Qm;function Fy(){if(Qm)return dd.exports;Qm=1;function t(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>\"u\"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=\"function\"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),dd.exports=a1(),dd.exports}var Ym;function l1(){if(Ym)return Cl;Ym=1;var t=Fy();return Cl.createRoot=t.createRoot,Cl.hydrateRoot=t.hydrateRoot,Cl}var c1=l1();const u1=bf(c1);var Ks=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(t){return this.listeners.add(t),this.onSubscribe(),()=>{this.listeners.delete(t),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},d1={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t),setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)},Kr,wf,Ry,f1=(Ry=class{constructor(){ve(this,Kr,d1);ve(this,wf,!1)}setTimeoutProvider(t){ce(this,Kr,t)}setTimeout(t,e){return R(this,Kr).setTimeout(t,e)}clearTimeout(t){R(this,Kr).clearTimeout(t)}setInterval(t,e){return R(this,Kr).setInterval(t,e)}clearInterval(t){R(this,Kr).clearInterval(t)}},Kr=new WeakMap,wf=new WeakMap,Ry),Co=new f1;function h1(t){setTimeout(t,0)}var Fo=typeof window>\"u\"||\"Deno\"in globalThis;function Ot(){}function p1(t,e){return typeof t==\"function\"?t(e):t}function Id(t){return typeof t==\"number\"&&t>=0&&t!==1/0}function zy(t,e){return Math.max(t+(e||0)-Date.now(),0)}function to(t,e){return typeof t==\"function\"?t(e):t}function cn(t,e){return typeof t==\"function\"?t(e):t}function Gm(t,e){const{type:r=\"all\",exact:s,fetchStatus:i,predicate:l,queryKey:u,stale:d}=t;if(u){if(s){if(e.queryHash!==Cf(u,e.options))return!1}else if(!Wi(e.queryKey,u))return!1}if(r!==\"all\"){const h=e.isActive();if(r===\"active\"&&!h||r===\"inactive\"&&h)return!1}return!(typeof d==\"boolean\"&&e.isStale()!==d||i&&i!==e.state.fetchStatus||l&&!l(e))}function Xm(t,e){const{exact:r,status:s,predicate:i,mutationKey:l}=t;if(l){if(!e.options.mutationKey)return!1;if(r){if(zo(e.options.mutationKey)!==zo(l))return!1}else if(!Wi(e.options.mutationKey,l))return!1}return!(s&&e.state.status!==s||i&&!i(e))}function Cf(t,e){return((e==null?void 0:e.queryKeyHashFn)||zo)(t)}function zo(t){return JSON.stringify(t,(e,r)=>Dd(r)?Object.keys(r).sort().reduce((s,i)=>(s[i]=r[i],s),{}):r)}function Wi(t,e){return t===e?!0:typeof t!=typeof e?!1:t&&e&&typeof t==\"object\"&&typeof e==\"object\"?Object.keys(e).every(r=>Wi(t[r],e[r])):!1}var m1=Object.prototype.hasOwnProperty;function $y(t,e){if(t===e)return t;const r=Jm(t)&&Jm(e);if(!r&&!(Dd(t)&&Dd(e)))return e;const i=(r?t:Object.keys(t)).length,l=r?e:Object.keys(e),u=l.length,d=r?new Array(u):{};let h=0;for(let p=0;p<u;p++){const y=r?p:l[p],v=t[y],C=e[y];if(v===C){d[y]=v,(r?p<i:m1.call(t,y))&&h++;continue}if(v===null||C===null||typeof v!=\"object\"||typeof C!=\"object\"){d[y]=C;continue}const w=$y(v,C);d[y]=w,w===v&&h++}return i===u&&h===i?t:d}function Vl(t,e){if(!e||Object.keys(t).length!==Object.keys(e).length)return!1;for(const r in t)if(t[r]!==e[r])return!1;return!0}function Jm(t){return Array.isArray(t)&&t.length===Object.keys(t).length}function Dd(t){if(!Zm(t))return!1;const e=t.constructor;if(e===void 0)return!0;const r=e.prototype;return!(!Zm(r)||!r.hasOwnProperty(\"isPrototypeOf\")||Object.getPrototypeOf(t)!==Object.prototype)}function Zm(t){return Object.prototype.toString.call(t)===\"[object Object]\"}function g1(t){return new Promise(e=>{Co.setTimeout(e,t)})}function Md(t,e,r){return typeof r.structuralSharing==\"function\"?r.structuralSharing(t,e):r.structuralSharing!==!1?$y(t,e):e}function y1(t,e,r=0){const s=[...t,e];return r&&s.length>r?s.slice(1):s}function v1(t,e,r=0){const s=[e,...t];return r&&s.length>r?s.slice(0,-1):s}var Ef=Symbol();function Uy(t,e){return!t.queryFn&&(e!=null&&e.initialPromise)?()=>e.initialPromise:!t.queryFn||t.queryFn===Ef?()=>Promise.reject(new Error(`Missing queryFn: '${t.queryHash}'`)):t.queryFn}function By(t,e){return typeof t==\"function\"?t(...e):!!t}var Po,qr,js,Py,x1=(Py=class extends Ks{constructor(){super();ve(this,Po);ve(this,qr);ve(this,js);ce(this,js,e=>{if(!Fo&&window.addEventListener){const r=()=>e();return window.addEventListener(\"visibilitychange\",r,!1),()=>{window.removeEventListener(\"visibilitychange\",r)}}})}onSubscribe(){R(this,qr)||this.setEventListener(R(this,js))}onUnsubscribe(){var e;this.hasListeners()||((e=R(this,qr))==null||e.call(this),ce(this,qr,void 0))}setEventListener(e){var r;ce(this,js,e),(r=R(this,qr))==null||r.call(this),ce(this,qr,e(s=>{typeof s==\"boolean\"?this.setFocused(s):this.onFocus()}))}setFocused(e){R(this,Po)!==e&&(ce(this,Po,e),this.onFocus())}onFocus(){const e=this.isFocused();this.listeners.forEach(r=>{r(e)})}isFocused(){var e;return typeof R(this,Po)==\"boolean\"?R(this,Po):((e=globalThis.document)==null?void 0:e.visibilityState)!==\"hidden\"}},Po=new WeakMap,qr=new WeakMap,js=new WeakMap,Py),kf=new x1;function Fd(){let t,e;const r=new Promise((i,l)=>{t=i,e=l});r.status=\"pending\",r.catch(()=>{});function s(i){Object.assign(r,i),delete r.resolve,delete r.reject}return r.resolve=i=>{s({status:\"fulfilled\",value:i}),t(i)},r.reject=i=>{s({status:\"rejected\",reason:i}),e(i)},r}var w1=h1;function b1(){let t=[],e=0,r=d=>{d()},s=d=>{d()},i=w1;const l=d=>{e?t.push(d):i(()=>{r(d)})},u=()=>{const d=t;t=[],d.length&&i(()=>{s(()=>{d.forEach(h=>{r(h)})})})};return{batch:d=>{let h;e++;try{h=d()}finally{e--,e||u()}return h},batchCalls:d=>(...h)=>{l(()=>{d(...h)})},schedule:l,setNotifyFunction:d=>{r=d},setBatchNotifyFunction:d=>{s=d},setScheduler:d=>{i=d}}}var at=b1(),_s,Qr,As,Ty,S1=(Ty=class extends Ks{constructor(){super();ve(this,_s,!0);ve(this,Qr);ve(this,As);ce(this,As,e=>{if(!Fo&&window.addEventListener){const r=()=>e(!0),s=()=>e(!1);return window.addEventListener(\"online\",r,!1),window.addEventListener(\"offline\",s,!1),()=>{window.removeEventListener(\"online\",r),window.removeEventListener(\"offline\",s)}}})}onSubscribe(){R(this,Qr)||this.setEventListener(R(this,As))}onUnsubscribe(){var e;this.hasListeners()||((e=R(this,Qr))==null||e.call(this),ce(this,Qr,void 0))}setEventListener(e){var r;ce(this,As,e),(r=R(this,Qr))==null||r.call(this),ce(this,Qr,e(this.setOnline.bind(this)))}setOnline(e){R(this,_s)!==e&&(ce(this,_s,e),this.listeners.forEach(s=>{s(e)}))}isOnline(){return R(this,_s)}},_s=new WeakMap,Qr=new WeakMap,As=new WeakMap,Ty),Wl=new S1;function C1(t){return Math.min(1e3*2**t,3e4)}function Hy(t){return(t??\"online\")===\"online\"?Wl.isOnline():!0}var zd=class extends Error{constructor(t){super(\"CancelledError\"),this.revert=t==null?void 0:t.revert,this.silent=t==null?void 0:t.silent}};function Vy(t){let e=!1,r=0,s;const i=Fd(),l=()=>i.status!==\"pending\",u=b=>{var k;if(!l()){const T=new zd(b);C(T),(k=t.onCancel)==null||k.call(t,T)}},d=()=>{e=!0},h=()=>{e=!1},p=()=>kf.isFocused()&&(t.networkMode===\"always\"||Wl.isOnline())&&t.canRun(),y=()=>Hy(t.networkMode)&&t.canRun(),v=b=>{l()||(s==null||s(),i.resolve(b))},C=b=>{l()||(s==null||s(),i.reject(b))},w=()=>new Promise(b=>{var k;s=T=>{(l()||p())&&b(T)},(k=t.onPause)==null||k.call(t)}).then(()=>{var b;s=void 0,l()||(b=t.onContinue)==null||b.call(t)}),E=()=>{if(l())return;let b;const k=r===0?t.initialPromise:void 0;try{b=k??t.fn()}catch(T){b=Promise.reject(T)}Promise.resolve(b).then(v).catch(T=>{var V;if(l())return;const j=t.retry??(Fo?0:3),_=t.retryDelay??C1,A=typeof _==\"function\"?_(r,T):_,F=j===!0||typeof j==\"number\"&&r<j||typeof j==\"function\"&&j(r,T);if(e||!F){C(T);return}r++,(V=t.onFail)==null||V.call(t,r,T),g1(A).then(()=>p()?void 0:w()).then(()=>{e?C(T):E()})})};return{promise:i,status:()=>i.status,cancel:u,continue:()=>(s==null||s(),i),cancelRetry:d,continueRetry:h,canStart:y,start:()=>(y()?E():w().then(E),i)}}var To,Oy,Wy=(Oy=class{constructor(){ve(this,To)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),Id(this.gcTime)&&ce(this,To,Co.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(t){this.gcTime=Math.max(this.gcTime||0,t??(Fo?1/0:300*1e3))}clearGcTimeout(){R(this,To)&&(Co.clearTimeout(R(this,To)),ce(this,To,void 0))}},To=new WeakMap,Oy),Oo,Ls,ln,jo,dt,Gi,_o,En,fr,jy,E1=(jy=class extends Wy{constructor(e){super();ve(this,En);ve(this,Oo);ve(this,Ls);ve(this,ln);ve(this,jo);ve(this,dt);ve(this,Gi);ve(this,_o);ce(this,_o,!1),ce(this,Gi,e.defaultOptions),this.setOptions(e.options),this.observers=[],ce(this,jo,e.client),ce(this,ln,R(this,jo).getQueryCache()),this.queryKey=e.queryKey,this.queryHash=e.queryHash,ce(this,Oo,tg(this.options)),this.state=e.state??R(this,Oo),this.scheduleGc()}get meta(){return this.options.meta}get promise(){var e;return(e=R(this,dt))==null?void 0:e.promise}setOptions(e){if(this.options={...R(this,Gi),...e},this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const r=tg(this.options);r.data!==void 0&&(this.setState(eg(r.data,r.dataUpdatedAt)),ce(this,Oo,r))}}optionalRemove(){!this.observers.length&&this.state.fetchStatus===\"idle\"&&R(this,ln).remove(this)}setData(e,r){const s=Md(this.state.data,e,this.options);return Te(this,En,fr).call(this,{data:s,type:\"success\",dataUpdatedAt:r==null?void 0:r.updatedAt,manual:r==null?void 0:r.manual}),s}setState(e,r){Te(this,En,fr).call(this,{type:\"setState\",state:e,setStateOptions:r})}cancel(e){var s,i;const r=(s=R(this,dt))==null?void 0:s.promise;return(i=R(this,dt))==null||i.cancel(e),r?r.then(Ot).catch(Ot):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}reset(){this.destroy(),this.setState(R(this,Oo))}isActive(){return this.observers.some(e=>cn(e.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===Ef||this.state.dataUpdateCount+this.state.errorUpdateCount===0}isStatic(){return this.getObserversCount()>0?this.observers.some(e=>to(e.options.staleTime,this)===\"static\"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(e=>e.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(e=0){return this.state.data===void 0?!0:e===\"static\"?!1:this.state.isInvalidated?!0:!zy(this.state.dataUpdatedAt,e)}onFocus(){var r;const e=this.observers.find(s=>s.shouldFetchOnWindowFocus());e==null||e.refetch({cancelRefetch:!1}),(r=R(this,dt))==null||r.continue()}onOnline(){var r;const e=this.observers.find(s=>s.shouldFetchOnReconnect());e==null||e.refetch({cancelRefetch:!1}),(r=R(this,dt))==null||r.continue()}addObserver(e){this.observers.includes(e)||(this.observers.push(e),this.clearGcTimeout(),R(this,ln).notify({type:\"observerAdded\",query:this,observer:e}))}removeObserver(e){this.observers.includes(e)&&(this.observers=this.observers.filter(r=>r!==e),this.observers.length||(R(this,dt)&&(R(this,_o)?R(this,dt).cancel({revert:!0}):R(this,dt).cancelRetry()),this.scheduleGc()),R(this,ln).notify({type:\"observerRemoved\",query:this,observer:e}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||Te(this,En,fr).call(this,{type:\"invalidate\"})}async fetch(e,r){var h,p,y,v,C,w,E,b,k,T,j,_;if(this.state.fetchStatus!==\"idle\"&&((h=R(this,dt))==null?void 0:h.status())!==\"rejected\"){if(this.state.data!==void 0&&(r!=null&&r.cancelRefetch))this.cancel({silent:!0});else if(R(this,dt))return R(this,dt).continueRetry(),R(this,dt).promise}if(e&&this.setOptions(e),!this.options.queryFn){const A=this.observers.find(F=>F.options.queryFn);A&&this.setOptions(A.options)}const s=new AbortController,i=A=>{Object.defineProperty(A,\"signal\",{enumerable:!0,get:()=>(ce(this,_o,!0),s.signal)})},l=()=>{const A=Uy(this.options,r),V=(()=>{const B={client:R(this,jo),queryKey:this.queryKey,meta:this.meta};return i(B),B})();return ce(this,_o,!1),this.options.persister?this.options.persister(A,V,this):A(V)},d=(()=>{const A={fetchOptions:r,options:this.options,queryKey:this.queryKey,client:R(this,jo),state:this.state,fetchFn:l};return i(A),A})();(p=this.options.behavior)==null||p.onFetch(d,this),ce(this,Ls,this.state),(this.state.fetchStatus===\"idle\"||this.state.fetchMeta!==((y=d.fetchOptions)==null?void 0:y.meta))&&Te(this,En,fr).call(this,{type:\"fetch\",meta:(v=d.fetchOptions)==null?void 0:v.meta}),ce(this,dt,Vy({initialPromise:r==null?void 0:r.initialPromise,fn:d.fetchFn,onCancel:A=>{A instanceof zd&&A.revert&&this.setState({...R(this,Ls),fetchStatus:\"idle\"}),s.abort()},onFail:(A,F)=>{Te(this,En,fr).call(this,{type:\"failed\",failureCount:A,error:F})},onPause:()=>{Te(this,En,fr).call(this,{type:\"pause\"})},onContinue:()=>{Te(this,En,fr).call(this,{type:\"continue\"})},retry:d.options.retry,retryDelay:d.options.retryDelay,networkMode:d.options.networkMode,canRun:()=>!0}));try{const A=await R(this,dt).start();if(A===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(A),(w=(C=R(this,ln).config).onSuccess)==null||w.call(C,A,this),(b=(E=R(this,ln).config).onSettled)==null||b.call(E,A,this.state.error,this),A}catch(A){if(A instanceof zd){if(A.silent)return R(this,dt).promise;if(A.revert){if(this.state.data===void 0)throw A;return this.state.data}}throw Te(this,En,fr).call(this,{type:\"error\",error:A}),(T=(k=R(this,ln).config).onError)==null||T.call(k,A,this),(_=(j=R(this,ln).config).onSettled)==null||_.call(j,this.state.data,A,this),A}finally{this.scheduleGc()}}},Oo=new WeakMap,Ls=new WeakMap,ln=new WeakMap,jo=new WeakMap,dt=new WeakMap,Gi=new WeakMap,_o=new WeakMap,En=new WeakSet,fr=function(e){const r=s=>{switch(e.type){case\"failed\":return{...s,fetchFailureCount:e.failureCount,fetchFailureReason:e.error};case\"pause\":return{...s,fetchStatus:\"paused\"};case\"continue\":return{...s,fetchStatus:\"fetching\"};case\"fetch\":return{...s,...Ky(s.data,this.options),fetchMeta:e.meta??null};case\"success\":const i={...s,...eg(e.data,e.dataUpdatedAt),dataUpdateCount:s.dataUpdateCount+1,...!e.manual&&{fetchStatus:\"idle\",fetchFailureCount:0,fetchFailureReason:null}};return ce(this,Ls,e.manual?i:void 0),i;case\"error\":const l=e.error;return{...s,error:l,errorUpdateCount:s.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:s.fetchFailureCount+1,fetchFailureReason:l,fetchStatus:\"idle\",status:\"error\"};case\"invalidate\":return{...s,isInvalidated:!0};case\"setState\":return{...s,...e.state}}};this.state=r(this.state),at.batch(()=>{this.observers.forEach(s=>{s.onQueryUpdate()}),R(this,ln).notify({query:this,type:\"updated\",action:e})})},jy);function Ky(t,e){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:Hy(e.networkMode)?\"fetching\":\"paused\",...t===void 0&&{error:null,status:\"pending\"}}}function eg(t,e){return{data:t,dataUpdatedAt:e??Date.now(),error:null,isInvalidated:!1,status:\"success\"}}function tg(t){const e=typeof t.initialData==\"function\"?t.initialData():t.initialData,r=e!==void 0,s=r?typeof t.initialDataUpdatedAt==\"function\"?t.initialDataUpdatedAt():t.initialDataUpdatedAt:0;return{data:e,dataUpdateCount:0,dataUpdatedAt:r?s??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:r?\"success\":\"pending\",fetchStatus:\"idle\"}}var Ut,Ae,Xi,Pt,Ao,Is,hr,Yr,Ji,Ds,Ms,Lo,Io,Gr,Fs,$e,Ui,$d,Ud,Bd,Hd,Vd,Wd,Kd,qy,_y,k1=(_y=class extends Ks{constructor(e,r){super();ve(this,$e);ve(this,Ut);ve(this,Ae);ve(this,Xi);ve(this,Pt);ve(this,Ao);ve(this,Is);ve(this,hr);ve(this,Yr);ve(this,Ji);ve(this,Ds);ve(this,Ms);ve(this,Lo);ve(this,Io);ve(this,Gr);ve(this,Fs,new Set);this.options=r,ce(this,Ut,e),ce(this,Yr,null),ce(this,hr,Fd()),this.bindMethods(),this.setOptions(r)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(R(this,Ae).addObserver(this),ng(R(this,Ae),this.options)?Te(this,$e,Ui).call(this):this.updateResult(),Te(this,$e,Hd).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return qd(R(this,Ae),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return qd(R(this,Ae),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,Te(this,$e,Vd).call(this),Te(this,$e,Wd).call(this),R(this,Ae).removeObserver(this)}setOptions(e){const r=this.options,s=R(this,Ae);if(this.options=R(this,Ut).defaultQueryOptions(e),this.options.enabled!==void 0&&typeof this.options.enabled!=\"boolean\"&&typeof this.options.enabled!=\"function\"&&typeof cn(this.options.enabled,R(this,Ae))!=\"boolean\")throw new Error(\"Expected enabled to be a boolean or a callback that returns a boolean\");Te(this,$e,Kd).call(this),R(this,Ae).setOptions(this.options),r._defaulted&&!Vl(this.options,r)&&R(this,Ut).getQueryCache().notify({type:\"observerOptionsUpdated\",query:R(this,Ae),observer:this});const i=this.hasListeners();i&&rg(R(this,Ae),s,this.options,r)&&Te(this,$e,Ui).call(this),this.updateResult(),i&&(R(this,Ae)!==s||cn(this.options.enabled,R(this,Ae))!==cn(r.enabled,R(this,Ae))||to(this.options.staleTime,R(this,Ae))!==to(r.staleTime,R(this,Ae)))&&Te(this,$e,$d).call(this);const l=Te(this,$e,Ud).call(this);i&&(R(this,Ae)!==s||cn(this.options.enabled,R(this,Ae))!==cn(r.enabled,R(this,Ae))||l!==R(this,Gr))&&Te(this,$e,Bd).call(this,l)}getOptimisticResult(e){const r=R(this,Ut).getQueryCache().build(R(this,Ut),e),s=this.createResult(r,e);return R1(this,s)&&(ce(this,Pt,s),ce(this,Is,this.options),ce(this,Ao,R(this,Ae).state)),s}getCurrentResult(){return R(this,Pt)}trackResult(e,r){return new Proxy(e,{get:(s,i)=>(this.trackProp(i),r==null||r(i),i===\"promise\"&&(this.trackProp(\"data\"),!this.options.experimental_prefetchInRender&&R(this,hr).status===\"pending\"&&R(this,hr).reject(new Error(\"experimental_prefetchInRender feature flag is not enabled\"))),Reflect.get(s,i))})}trackProp(e){R(this,Fs).add(e)}getCurrentQuery(){return R(this,Ae)}refetch({...e}={}){return this.fetch({...e})}fetchOptimistic(e){const r=R(this,Ut).defaultQueryOptions(e),s=R(this,Ut).getQueryCache().build(R(this,Ut),r);return s.fetch().then(()=>this.createResult(s,r))}fetch(e){return Te(this,$e,Ui).call(this,{...e,cancelRefetch:e.cancelRefetch??!0}).then(()=>(this.updateResult(),R(this,Pt)))}createResult(e,r){var G;const s=R(this,Ae),i=this.options,l=R(this,Pt),u=R(this,Ao),d=R(this,Is),p=e!==s?e.state:R(this,Xi),{state:y}=e;let v={...y},C=!1,w;if(r._optimisticResults){const W=this.hasListeners(),le=!W&&ng(e,r),K=W&&rg(e,s,r,i);(le||K)&&(v={...v,...Ky(y.data,e.options)}),r._optimisticResults===\"isRestoring\"&&(v.fetchStatus=\"idle\")}let{error:E,errorUpdatedAt:b,status:k}=v;w=v.data;let T=!1;if(r.placeholderData!==void 0&&w===void 0&&k===\"pending\"){let W;l!=null&&l.isPlaceholderData&&r.placeholderData===(d==null?void 0:d.placeholderData)?(W=l.data,T=!0):W=typeof r.placeholderData==\"function\"?r.placeholderData((G=R(this,Ms))==null?void 0:G.state.data,R(this,Ms)):r.placeholderData,W!==void 0&&(k=\"success\",w=Md(l==null?void 0:l.data,W,r),C=!0)}if(r.select&&w!==void 0&&!T)if(l&&w===(u==null?void 0:u.data)&&r.select===R(this,Ji))w=R(this,Ds);else try{ce(this,Ji,r.select),w=r.select(w),w=Md(l==null?void 0:l.data,w,r),ce(this,Ds,w),ce(this,Yr,null)}catch(W){ce(this,Yr,W)}R(this,Yr)&&(E=R(this,Yr),w=R(this,Ds),b=Date.now(),k=\"error\");const j=v.fetchStatus===\"fetching\",_=k===\"pending\",A=k===\"error\",F=_&&j,V=w!==void 0,te={status:k,fetchStatus:v.fetchStatus,isPending:_,isSuccess:k===\"success\",isError:A,isInitialLoading:F,isLoading:F,data:w,dataUpdatedAt:v.dataUpdatedAt,error:E,errorUpdatedAt:b,failureCount:v.fetchFailureCount,failureReason:v.fetchFailureReason,errorUpdateCount:v.errorUpdateCount,isFetched:v.dataUpdateCount>0||v.errorUpdateCount>0,isFetchedAfterMount:v.dataUpdateCount>p.dataUpdateCount||v.errorUpdateCount>p.errorUpdateCount,isFetching:j,isRefetching:j&&!_,isLoadingError:A&&!V,isPaused:v.fetchStatus===\"paused\",isPlaceholderData:C,isRefetchError:A&&V,isStale:Nf(e,r),refetch:this.refetch,promise:R(this,hr),isEnabled:cn(r.enabled,e)!==!1};if(this.options.experimental_prefetchInRender){const W=Z=>{te.status===\"error\"?Z.reject(te.error):te.data!==void 0&&Z.resolve(te.data)},le=()=>{const Z=ce(this,hr,te.promise=Fd());W(Z)},K=R(this,hr);switch(K.status){case\"pending\":e.queryHash===s.queryHash&&W(K);break;case\"fulfilled\":(te.status===\"error\"||te.data!==K.value)&&le();break;case\"rejected\":(te.status!==\"error\"||te.error!==K.reason)&&le();break}}return te}updateResult(){const e=R(this,Pt),r=this.createResult(R(this,Ae),this.options);if(ce(this,Ao,R(this,Ae).state),ce(this,Is,this.options),R(this,Ao).data!==void 0&&ce(this,Ms,R(this,Ae)),Vl(r,e))return;ce(this,Pt,r);const s=()=>{if(!e)return!0;const{notifyOnChangeProps:i}=this.options,l=typeof i==\"function\"?i():i;if(l===\"all\"||!l&&!R(this,Fs).size)return!0;const u=new Set(l??R(this,Fs));return this.options.throwOnError&&u.add(\"error\"),Object.keys(R(this,Pt)).some(d=>{const h=d;return R(this,Pt)[h]!==e[h]&&u.has(h)})};Te(this,$e,qy).call(this,{listeners:s()})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&Te(this,$e,Hd).call(this)}},Ut=new WeakMap,Ae=new WeakMap,Xi=new WeakMap,Pt=new WeakMap,Ao=new WeakMap,Is=new WeakMap,hr=new WeakMap,Yr=new WeakMap,Ji=new WeakMap,Ds=new WeakMap,Ms=new WeakMap,Lo=new WeakMap,Io=new WeakMap,Gr=new WeakMap,Fs=new WeakMap,$e=new WeakSet,Ui=function(e){Te(this,$e,Kd).call(this);let r=R(this,Ae).fetch(this.options,e);return e!=null&&e.throwOnError||(r=r.catch(Ot)),r},$d=function(){Te(this,$e,Vd).call(this);const e=to(this.options.staleTime,R(this,Ae));if(Fo||R(this,Pt).isStale||!Id(e))return;const s=zy(R(this,Pt).dataUpdatedAt,e)+1;ce(this,Lo,Co.setTimeout(()=>{R(this,Pt).isStale||this.updateResult()},s))},Ud=function(){return(typeof this.options.refetchInterval==\"function\"?this.options.refetchInterval(R(this,Ae)):this.options.refetchInterval)??!1},Bd=function(e){Te(this,$e,Wd).call(this),ce(this,Gr,e),!(Fo||cn(this.options.enabled,R(this,Ae))===!1||!Id(R(this,Gr))||R(this,Gr)===0)&&ce(this,Io,Co.setInterval(()=>{(this.options.refetchIntervalInBackground||kf.isFocused())&&Te(this,$e,Ui).call(this)},R(this,Gr)))},Hd=function(){Te(this,$e,$d).call(this),Te(this,$e,Bd).call(this,Te(this,$e,Ud).call(this))},Vd=function(){R(this,Lo)&&(Co.clearTimeout(R(this,Lo)),ce(this,Lo,void 0))},Wd=function(){R(this,Io)&&(Co.clearInterval(R(this,Io)),ce(this,Io,void 0))},Kd=function(){const e=R(this,Ut).getQueryCache().build(R(this,Ut),this.options);if(e===R(this,Ae))return;const r=R(this,Ae);ce(this,Ae,e),ce(this,Xi,e.state),this.hasListeners()&&(r==null||r.removeObserver(this),e.addObserver(this))},qy=function(e){at.batch(()=>{e.listeners&&this.listeners.forEach(r=>{r(R(this,Pt))}),R(this,Ut).getQueryCache().notify({query:R(this,Ae),type:\"observerResultsUpdated\"})})},_y);function N1(t,e){return cn(e.enabled,t)!==!1&&t.state.data===void 0&&!(t.state.status===\"error\"&&e.retryOnMount===!1)}function ng(t,e){return N1(t,e)||t.state.data!==void 0&&qd(t,e,e.refetchOnMount)}function qd(t,e,r){if(cn(e.enabled,t)!==!1&&to(e.staleTime,t)!==\"static\"){const s=typeof r==\"function\"?r(t):r;return s===\"always\"||s!==!1&&Nf(t,e)}return!1}function rg(t,e,r,s){return(t!==e||cn(s.enabled,t)===!1)&&(!r.suspense||t.state.status!==\"error\")&&Nf(t,r)}function Nf(t,e){return cn(e.enabled,t)!==!1&&t.isStaleByTime(to(e.staleTime,t))}function R1(t,e){return!Vl(t.getCurrentResult(),e)}function og(t){return{onFetch:(e,r)=>{var y,v,C,w,E;const s=e.options,i=(C=(v=(y=e.fetchOptions)==null?void 0:y.meta)==null?void 0:v.fetchMore)==null?void 0:C.direction,l=((w=e.state.data)==null?void 0:w.pages)||[],u=((E=e.state.data)==null?void 0:E.pageParams)||[];let d={pages:[],pageParams:[]},h=0;const p=async()=>{let b=!1;const k=_=>{Object.defineProperty(_,\"signal\",{enumerable:!0,get:()=>(e.signal.aborted?b=!0:e.signal.addEventListener(\"abort\",()=>{b=!0}),e.signal)})},T=Uy(e.options,e.fetchOptions),j=async(_,A,F)=>{if(b)return Promise.reject();if(A==null&&_.pages.length)return Promise.resolve(_);const B=(()=>{const le={client:e.client,queryKey:e.queryKey,pageParam:A,direction:F?\"backward\":\"forward\",meta:e.options.meta};return k(le),le})(),te=await T(B),{maxPages:G}=e.options,W=F?v1:y1;return{pages:W(_.pages,te,G),pageParams:W(_.pageParams,A,G)}};if(i&&l.length){const _=i===\"backward\",A=_?P1:sg,F={pages:l,pageParams:u},V=A(s,F);d=await j(F,V,_)}else{const _=t??l.length;do{const A=h===0?u[0]??s.initialPageParam:sg(s,d);if(h>0&&A==null)break;d=await j(d,A),h++}while(h<_)}return d};e.options.persister?e.fetchFn=()=>{var b,k;return(k=(b=e.options).persister)==null?void 0:k.call(b,p,{client:e.client,queryKey:e.queryKey,meta:e.options.meta,signal:e.signal},r)}:e.fetchFn=p}}}function sg(t,{pages:e,pageParams:r}){const s=e.length-1;return e.length>0?t.getNextPageParam(e[s],e,r[s],r):void 0}function P1(t,{pages:e,pageParams:r}){var s;return e.length>0?(s=t.getPreviousPageParam)==null?void 0:s.call(t,e[0],e,r[0],r):void 0}var Zi,Vn,Tt,Do,Wn,Vr,Ay,T1=(Ay=class extends Wy{constructor(e){super();ve(this,Wn);ve(this,Zi);ve(this,Vn);ve(this,Tt);ve(this,Do);ce(this,Zi,e.client),this.mutationId=e.mutationId,ce(this,Tt,e.mutationCache),ce(this,Vn,[]),this.state=e.state||Qy(),this.setOptions(e.options),this.scheduleGc()}setOptions(e){this.options=e,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(e){R(this,Vn).includes(e)||(R(this,Vn).push(e),this.clearGcTimeout(),R(this,Tt).notify({type:\"observerAdded\",mutation:this,observer:e}))}removeObserver(e){ce(this,Vn,R(this,Vn).filter(r=>r!==e)),this.scheduleGc(),R(this,Tt).notify({type:\"observerRemoved\",mutation:this,observer:e})}optionalRemove(){R(this,Vn).length||(this.state.status===\"pending\"?this.scheduleGc():R(this,Tt).remove(this))}continue(){var e;return((e=R(this,Do))==null?void 0:e.continue())??this.execute(this.state.variables)}async execute(e){var u,d,h,p,y,v,C,w,E,b,k,T,j,_,A,F,V,B,te,G;const r=()=>{Te(this,Wn,Vr).call(this,{type:\"continue\"})},s={client:R(this,Zi),meta:this.options.meta,mutationKey:this.options.mutationKey};ce(this,Do,Vy({fn:()=>this.options.mutationFn?this.options.mutationFn(e,s):Promise.reject(new Error(\"No mutationFn found\")),onFail:(W,le)=>{Te(this,Wn,Vr).call(this,{type:\"failed\",failureCount:W,error:le})},onPause:()=>{Te(this,Wn,Vr).call(this,{type:\"pause\"})},onContinue:r,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>R(this,Tt).canRun(this)}));const i=this.state.status===\"pending\",l=!R(this,Do).canStart();try{if(i)r();else{Te(this,Wn,Vr).call(this,{type:\"pending\",variables:e,isPaused:l}),await((d=(u=R(this,Tt).config).onMutate)==null?void 0:d.call(u,e,this,s));const le=await((p=(h=this.options).onMutate)==null?void 0:p.call(h,e,s));le!==this.state.context&&Te(this,Wn,Vr).call(this,{type:\"pending\",context:le,variables:e,isPaused:l})}const W=await R(this,Do).start();return await((v=(y=R(this,Tt).config).onSuccess)==null?void 0:v.call(y,W,e,this.state.context,this,s)),await((w=(C=this.options).onSuccess)==null?void 0:w.call(C,W,e,this.state.context,s)),await((b=(E=R(this,Tt).config).onSettled)==null?void 0:b.call(E,W,null,this.state.variables,this.state.context,this,s)),await((T=(k=this.options).onSettled)==null?void 0:T.call(k,W,null,e,this.state.context,s)),Te(this,Wn,Vr).call(this,{type:\"success\",data:W}),W}catch(W){try{throw await((_=(j=R(this,Tt).config).onError)==null?void 0:_.call(j,W,e,this.state.context,this,s)),await((F=(A=this.options).onError)==null?void 0:F.call(A,W,e,this.state.context,s)),await((B=(V=R(this,Tt).config).onSettled)==null?void 0:B.call(V,void 0,W,this.state.variables,this.state.context,this,s)),await((G=(te=this.options).onSettled)==null?void 0:G.call(te,void 0,W,e,this.state.context,s)),W}finally{Te(this,Wn,Vr).call(this,{type:\"error\",error:W})}}finally{R(this,Tt).runNext(this)}}},Zi=new WeakMap,Vn=new WeakMap,Tt=new WeakMap,Do=new WeakMap,Wn=new WeakSet,Vr=function(e){const r=s=>{switch(e.type){case\"failed\":return{...s,failureCount:e.failureCount,failureReason:e.error};case\"pause\":return{...s,isPaused:!0};case\"continue\":return{...s,isPaused:!1};case\"pending\":return{...s,context:e.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:e.isPaused,status:\"pending\",variables:e.variables,submittedAt:Date.now()};case\"success\":return{...s,data:e.data,failureCount:0,failureReason:null,error:null,status:\"success\",isPaused:!1};case\"error\":return{...s,data:void 0,error:e.error,failureCount:s.failureCount+1,failureReason:e.error,isPaused:!1,status:\"error\"}}};this.state=r(this.state),at.batch(()=>{R(this,Vn).forEach(s=>{s.onMutationUpdate(e)}),R(this,Tt).notify({mutation:this,type:\"updated\",action:e})})},Ay);function Qy(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:\"idle\",variables:void 0,submittedAt:0}}var pr,kn,ea,Ly,O1=(Ly=class extends Ks{constructor(e={}){super();ve(this,pr);ve(this,kn);ve(this,ea);this.config=e,ce(this,pr,new Set),ce(this,kn,new Map),ce(this,ea,0)}build(e,r,s){const i=new T1({client:e,mutationCache:this,mutationId:++Sl(this,ea)._,options:e.defaultMutationOptions(r),state:s});return this.add(i),i}add(e){R(this,pr).add(e);const r=El(e);if(typeof r==\"string\"){const s=R(this,kn).get(r);s?s.push(e):R(this,kn).set(r,[e])}this.notify({type:\"added\",mutation:e})}remove(e){if(R(this,pr).delete(e)){const r=El(e);if(typeof r==\"string\"){const s=R(this,kn).get(r);if(s)if(s.length>1){const i=s.indexOf(e);i!==-1&&s.splice(i,1)}else s[0]===e&&R(this,kn).delete(r)}}this.notify({type:\"removed\",mutation:e})}canRun(e){const r=El(e);if(typeof r==\"string\"){const s=R(this,kn).get(r),i=s==null?void 0:s.find(l=>l.state.status===\"pending\");return!i||i===e}else return!0}runNext(e){var s;const r=El(e);if(typeof r==\"string\"){const i=(s=R(this,kn).get(r))==null?void 0:s.find(l=>l!==e&&l.state.isPaused);return(i==null?void 0:i.continue())??Promise.resolve()}else return Promise.resolve()}clear(){at.batch(()=>{R(this,pr).forEach(e=>{this.notify({type:\"removed\",mutation:e})}),R(this,pr).clear(),R(this,kn).clear()})}getAll(){return Array.from(R(this,pr))}find(e){const r={exact:!0,...e};return this.getAll().find(s=>Xm(r,s))}findAll(e={}){return this.getAll().filter(r=>Xm(e,r))}notify(e){at.batch(()=>{this.listeners.forEach(r=>{r(e)})})}resumePausedMutations(){const e=this.getAll().filter(r=>r.state.isPaused);return at.batch(()=>Promise.all(e.map(r=>r.continue().catch(Ot))))}},pr=new WeakMap,kn=new WeakMap,ea=new WeakMap,Ly);function El(t){var e;return(e=t.options.scope)==null?void 0:e.id}var mr,Xr,Bt,gr,yr,Dl,Qd,Iy,j1=(Iy=class extends Ks{constructor(r,s){super();ve(this,yr);ve(this,mr);ve(this,Xr);ve(this,Bt);ve(this,gr);ce(this,mr,r),this.setOptions(s),this.bindMethods(),Te(this,yr,Dl).call(this)}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(r){var i;const s=this.options;this.options=R(this,mr).defaultMutationOptions(r),Vl(this.options,s)||R(this,mr).getMutationCache().notify({type:\"observerOptionsUpdated\",mutation:R(this,Bt),observer:this}),s!=null&&s.mutationKey&&this.options.mutationKey&&zo(s.mutationKey)!==zo(this.options.mutationKey)?this.reset():((i=R(this,Bt))==null?void 0:i.state.status)===\"pending\"&&R(this,Bt).setOptions(this.options)}onUnsubscribe(){var r;this.hasListeners()||(r=R(this,Bt))==null||r.removeObserver(this)}onMutationUpdate(r){Te(this,yr,Dl).call(this),Te(this,yr,Qd).call(this,r)}getCurrentResult(){return R(this,Xr)}reset(){var r;(r=R(this,Bt))==null||r.removeObserver(this),ce(this,Bt,void 0),Te(this,yr,Dl).call(this),Te(this,yr,Qd).call(this)}mutate(r,s){var i;return ce(this,gr,s),(i=R(this,Bt))==null||i.removeObserver(this),ce(this,Bt,R(this,mr).getMutationCache().build(R(this,mr),this.options)),R(this,Bt).addObserver(this),R(this,Bt).execute(r)}},mr=new WeakMap,Xr=new WeakMap,Bt=new WeakMap,gr=new WeakMap,yr=new WeakSet,Dl=function(){var s;const r=((s=R(this,Bt))==null?void 0:s.state)??Qy();ce(this,Xr,{...r,isPending:r.status===\"pending\",isSuccess:r.status===\"success\",isError:r.status===\"error\",isIdle:r.status===\"idle\",mutate:this.mutate,reset:this.reset})},Qd=function(r){at.batch(()=>{var s,i,l,u,d,h,p,y;if(R(this,gr)&&this.hasListeners()){const v=R(this,Xr).variables,C=R(this,Xr).context,w={client:R(this,mr),meta:this.options.meta,mutationKey:this.options.mutationKey};(r==null?void 0:r.type)===\"success\"?((i=(s=R(this,gr)).onSuccess)==null||i.call(s,r.data,v,C,w),(u=(l=R(this,gr)).onSettled)==null||u.call(l,r.data,null,v,C,w)):(r==null?void 0:r.type)===\"error\"&&((h=(d=R(this,gr)).onError)==null||h.call(d,r.error,v,C,w),(y=(p=R(this,gr)).onSettled)==null||y.call(p,void 0,r.error,v,C,w))}this.listeners.forEach(v=>{v(R(this,Xr))})})},Iy),Kn,Dy,_1=(Dy=class extends Ks{constructor(e={}){super();ve(this,Kn);this.config=e,ce(this,Kn,new Map)}build(e,r,s){const i=r.queryKey,l=r.queryHash??Cf(i,r);let u=this.get(l);return u||(u=new E1({client:e,queryKey:i,queryHash:l,options:e.defaultQueryOptions(r),state:s,defaultOptions:e.getQueryDefaults(i)}),this.add(u)),u}add(e){R(this,Kn).has(e.queryHash)||(R(this,Kn).set(e.queryHash,e),this.notify({type:\"added\",query:e}))}remove(e){const r=R(this,Kn).get(e.queryHash);r&&(e.destroy(),r===e&&R(this,Kn).delete(e.queryHash),this.notify({type:\"removed\",query:e}))}clear(){at.batch(()=>{this.getAll().forEach(e=>{this.remove(e)})})}get(e){return R(this,Kn).get(e)}getAll(){return[...R(this,Kn).values()]}find(e){const r={exact:!0,...e};return this.getAll().find(s=>Gm(r,s))}findAll(e={}){const r=this.getAll();return Object.keys(e).length>0?r.filter(s=>Gm(e,s)):r}notify(e){at.batch(()=>{this.listeners.forEach(r=>{r(e)})})}onFocus(){at.batch(()=>{this.getAll().forEach(e=>{e.onFocus()})})}onOnline(){at.batch(()=>{this.getAll().forEach(e=>{e.onOnline()})})}},Kn=new WeakMap,Dy),Ze,Jr,Zr,zs,$s,eo,Us,Bs,My,A1=(My=class{constructor(t={}){ve(this,Ze);ve(this,Jr);ve(this,Zr);ve(this,zs);ve(this,$s);ve(this,eo);ve(this,Us);ve(this,Bs);ce(this,Ze,t.queryCache||new _1),ce(this,Jr,t.mutationCache||new O1),ce(this,Zr,t.defaultOptions||{}),ce(this,zs,new Map),ce(this,$s,new Map),ce(this,eo,0)}mount(){Sl(this,eo)._++,R(this,eo)===1&&(ce(this,Us,kf.subscribe(async t=>{t&&(await this.resumePausedMutations(),R(this,Ze).onFocus())})),ce(this,Bs,Wl.subscribe(async t=>{t&&(await this.resumePausedMutations(),R(this,Ze).onOnline())})))}unmount(){var t,e;Sl(this,eo)._--,R(this,eo)===0&&((t=R(this,Us))==null||t.call(this),ce(this,Us,void 0),(e=R(this,Bs))==null||e.call(this),ce(this,Bs,void 0))}isFetching(t){return R(this,Ze).findAll({...t,fetchStatus:\"fetching\"}).length}isMutating(t){return R(this,Jr).findAll({...t,status:\"pending\"}).length}getQueryData(t){var r;const e=this.defaultQueryOptions({queryKey:t});return(r=R(this,Ze).get(e.queryHash))==null?void 0:r.state.data}ensureQueryData(t){const e=this.defaultQueryOptions(t),r=R(this,Ze).build(this,e),s=r.state.data;return s===void 0?this.fetchQuery(t):(t.revalidateIfStale&&r.isStaleByTime(to(e.staleTime,r))&&this.prefetchQuery(e),Promise.resolve(s))}getQueriesData(t){return R(this,Ze).findAll(t).map(({queryKey:e,state:r})=>{const s=r.data;return[e,s]})}setQueryData(t,e,r){const s=this.defaultQueryOptions({queryKey:t}),i=R(this,Ze).get(s.queryHash),l=i==null?void 0:i.state.data,u=p1(e,l);if(u!==void 0)return R(this,Ze).build(this,s).setData(u,{...r,manual:!0})}setQueriesData(t,e,r){return at.batch(()=>R(this,Ze).findAll(t).map(({queryKey:s})=>[s,this.setQueryData(s,e,r)]))}getQueryState(t){var r;const e=this.defaultQueryOptions({queryKey:t});return(r=R(this,Ze).get(e.queryHash))==null?void 0:r.state}removeQueries(t){const e=R(this,Ze);at.batch(()=>{e.findAll(t).forEach(r=>{e.remove(r)})})}resetQueries(t,e){const r=R(this,Ze);return at.batch(()=>(r.findAll(t).forEach(s=>{s.reset()}),this.refetchQueries({type:\"active\",...t},e)))}cancelQueries(t,e={}){const r={revert:!0,...e},s=at.batch(()=>R(this,Ze).findAll(t).map(i=>i.cancel(r)));return Promise.all(s).then(Ot).catch(Ot)}invalidateQueries(t,e={}){return at.batch(()=>(R(this,Ze).findAll(t).forEach(r=>{r.invalidate()}),(t==null?void 0:t.refetchType)===\"none\"?Promise.resolve():this.refetchQueries({...t,type:(t==null?void 0:t.refetchType)??(t==null?void 0:t.type)??\"active\"},e)))}refetchQueries(t,e={}){const r={...e,cancelRefetch:e.cancelRefetch??!0},s=at.batch(()=>R(this,Ze).findAll(t).filter(i=>!i.isDisabled()&&!i.isStatic()).map(i=>{let l=i.fetch(void 0,r);return r.throwOnError||(l=l.catch(Ot)),i.state.fetchStatus===\"paused\"?Promise.resolve():l}));return Promise.all(s).then(Ot)}fetchQuery(t){const e=this.defaultQueryOptions(t);e.retry===void 0&&(e.retry=!1);const r=R(this,Ze).build(this,e);return r.isStaleByTime(to(e.staleTime,r))?r.fetch(e):Promise.resolve(r.state.data)}prefetchQuery(t){return this.fetchQuery(t).then(Ot).catch(Ot)}fetchInfiniteQuery(t){return t.behavior=og(t.pages),this.fetchQuery(t)}prefetchInfiniteQuery(t){return this.fetchInfiniteQuery(t).then(Ot).catch(Ot)}ensureInfiniteQueryData(t){return t.behavior=og(t.pages),this.ensureQueryData(t)}resumePausedMutations(){return Wl.isOnline()?R(this,Jr).resumePausedMutations():Promise.resolve()}getQueryCache(){return R(this,Ze)}getMutationCache(){return R(this,Jr)}getDefaultOptions(){return R(this,Zr)}setDefaultOptions(t){ce(this,Zr,t)}setQueryDefaults(t,e){R(this,zs).set(zo(t),{queryKey:t,defaultOptions:e})}getQueryDefaults(t){const e=[...R(this,zs).values()],r={};return e.forEach(s=>{Wi(t,s.queryKey)&&Object.assign(r,s.defaultOptions)}),r}setMutationDefaults(t,e){R(this,$s).set(zo(t),{mutationKey:t,defaultOptions:e})}getMutationDefaults(t){const e=[...R(this,$s).values()],r={};return e.forEach(s=>{Wi(t,s.mutationKey)&&Object.assign(r,s.defaultOptions)}),r}defaultQueryOptions(t){if(t._defaulted)return t;const e={...R(this,Zr).queries,...this.getQueryDefaults(t.queryKey),...t,_defaulted:!0};return e.queryHash||(e.queryHash=Cf(e.queryKey,e)),e.refetchOnReconnect===void 0&&(e.refetchOnReconnect=e.networkMode!==\"always\"),e.throwOnError===void 0&&(e.throwOnError=!!e.suspense),!e.networkMode&&e.persister&&(e.networkMode=\"offlineFirst\"),e.queryFn===Ef&&(e.enabled=!1),e}defaultMutationOptions(t){return t!=null&&t._defaulted?t:{...R(this,Zr).mutations,...(t==null?void 0:t.mutationKey)&&this.getMutationDefaults(t.mutationKey),...t,_defaulted:!0}}clear(){R(this,Ze).clear(),R(this,Jr).clear()}},Ze=new WeakMap,Jr=new WeakMap,Zr=new WeakMap,zs=new WeakMap,$s=new WeakMap,eo=new WeakMap,Us=new WeakMap,Bs=new WeakMap,My),Yy=x.createContext(void 0),lc=t=>{const e=x.useContext(Yy);if(!e)throw new Error(\"No QueryClient set, use QueryClientProvider to set one\");return e},L1=({client:t,children:e})=>(x.useEffect(()=>(t.mount(),()=>{t.unmount()}),[t]),g.jsx(Yy.Provider,{value:t,children:e})),Gy=x.createContext(!1),I1=()=>x.useContext(Gy);Gy.Provider;function D1(){let t=!1;return{clearReset:()=>{t=!1},reset:()=>{t=!0},isReset:()=>t}}var M1=x.createContext(D1()),F1=()=>x.useContext(M1),z1=(t,e)=>{(t.suspense||t.throwOnError||t.experimental_prefetchInRender)&&(e.isReset()||(t.retryOnMount=!1))},$1=t=>{x.useEffect(()=>{t.clearReset()},[t])},U1=({result:t,errorResetBoundary:e,throwOnError:r,query:s,suspense:i})=>t.isError&&!e.isReset()&&!t.isFetching&&s&&(i&&t.data===void 0||By(r,[t.error,s])),B1=t=>{if(t.suspense){const r=i=>i===\"static\"?i:Math.max(i??1e3,1e3),s=t.staleTime;t.staleTime=typeof s==\"function\"?(...i)=>r(s(...i)):r(s),typeof t.gcTime==\"number\"&&(t.gcTime=Math.max(t.gcTime,1e3))}},H1=(t,e)=>t.isLoading&&t.isFetching&&!e,V1=(t,e)=>(t==null?void 0:t.suspense)&&e.isPending,ig=(t,e,r)=>e.fetchOptimistic(t).catch(()=>{r.clearReset()});function W1(t,e,r){var v,C,w,E,b;const s=I1(),i=F1(),l=lc(),u=l.defaultQueryOptions(t);(C=(v=l.getDefaultOptions().queries)==null?void 0:v._experimental_beforeQuery)==null||C.call(v,u),u._optimisticResults=s?\"isRestoring\":\"optimistic\",B1(u),z1(u,i),$1(i);const d=!l.getQueryCache().get(u.queryHash),[h]=x.useState(()=>new e(l,u)),p=h.getOptimisticResult(u),y=!s&&t.subscribed!==!1;if(x.useSyncExternalStore(x.useCallback(k=>{const T=y?h.subscribe(at.batchCalls(k)):Ot;return h.updateResult(),T},[h,y]),()=>h.getCurrentResult(),()=>h.getCurrentResult()),x.useEffect(()=>{h.setOptions(u)},[u,h]),V1(u,p))throw ig(u,h,i);if(U1({result:p,errorResetBoundary:i,throwOnError:u.throwOnError,query:l.getQueryCache().get(u.queryHash),suspense:u.suspense}))throw p.error;if((E=(w=l.getDefaultOptions().queries)==null?void 0:w._experimental_afterQuery)==null||E.call(w,u,p),u.experimental_prefetchInRender&&!Fo&&H1(p,s)){const k=d?ig(u,h,i):(b=l.getQueryCache().get(u.queryHash))==null?void 0:b.promise;k==null||k.catch(Ot).finally(()=>{h.updateResult()})}return u.notifyOnChangeProps?p:h.trackResult(p)}function ta(t,e){return W1(t,k1)}function Xy(t,e){const r=lc(),[s]=x.useState(()=>new j1(r,t));x.useEffect(()=>{s.setOptions(t)},[s,t]);const i=x.useSyncExternalStore(x.useCallback(u=>s.subscribe(at.batchCalls(u)),[s]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),l=x.useCallback((u,d)=>{s.mutate(u,d).catch(Ot)},[s]);if(i.error&&By(s.options.throwOnError,[i.error]))throw i.error;return{...i,mutate:l,mutateAsync:i.mutate}}var na=Fy();const Jy=bf(na);var K1=t=>{switch(t){case\"success\":return Y1;case\"info\":return X1;case\"warning\":return G1;case\"error\":return J1;default:return null}},q1=Array(12).fill(0),Q1=({visible:t,className:e})=>oe.createElement(\"div\",{className:[\"sonner-loading-wrapper\",e].filter(Boolean).join(\" \"),\"data-visible\":t},oe.createElement(\"div\",{className:\"sonner-spinner\"},q1.map((r,s)=>oe.createElement(\"div\",{className:\"sonner-loading-bar\",key:`spinner-bar-${s}`})))),Y1=oe.createElement(\"svg\",{xmlns:\"http://www.w3.org/2000/svg\",viewBox:\"0 0 20 20\",fill:\"currentColor\",height:\"20\",width:\"20\"},oe.createElement(\"path\",{fillRule:\"evenodd\",d:\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\",clipRule:\"evenodd\"})),G1=oe.createElement(\"svg\",{xmlns:\"http://www.w3.org/2000/svg\",viewBox:\"0 0 24 24\",fill:\"currentColor\",height:\"20\",width:\"20\"},oe.createElement(\"path\",{fillRule:\"evenodd\",d:\"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z\",clipRule:\"evenodd\"})),X1=oe.createElement(\"svg\",{xmlns:\"http://www.w3.org/2000/svg\",viewBox:\"0 0 20 20\",fill:\"currentColor\",height:\"20\",width:\"20\"},oe.createElement(\"path\",{fillRule:\"evenodd\",d:\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z\",clipRule:\"evenodd\"})),J1=oe.createElement(\"svg\",{xmlns:\"http://www.w3.org/2000/svg\",viewBox:\"0 0 20 20\",fill:\"currentColor\",height:\"20\",width:\"20\"},oe.createElement(\"path\",{fillRule:\"evenodd\",d:\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z\",clipRule:\"evenodd\"})),Z1=oe.createElement(\"svg\",{xmlns:\"http://www.w3.org/2000/svg\",width:\"12\",height:\"12\",viewBox:\"0 0 24 24\",fill:\"none\",stroke:\"currentColor\",strokeWidth:\"1.5\",strokeLinecap:\"round\",strokeLinejoin:\"round\"},oe.createElement(\"line\",{x1:\"18\",y1:\"6\",x2:\"6\",y2:\"18\"}),oe.createElement(\"line\",{x1:\"6\",y1:\"6\",x2:\"18\",y2:\"18\"})),eS=()=>{let[t,e]=oe.useState(document.hidden);return oe.useEffect(()=>{let r=()=>{e(document.hidden)};return document.addEventListener(\"visibilitychange\",r),()=>window.removeEventListener(\"visibilitychange\",r)},[]),t},Yd=1,tS=class{constructor(){this.subscribe=t=>(this.subscribers.push(t),()=>{let e=this.subscribers.indexOf(t);this.subscribers.splice(e,1)}),this.publish=t=>{this.subscribers.forEach(e=>e(t))},this.addToast=t=>{this.publish(t),this.toasts=[...this.toasts,t]},this.create=t=>{var e;let{message:r,...s}=t,i=typeof(t==null?void 0:t.id)==\"number\"||((e=t.id)==null?void 0:e.length)>0?t.id:Yd++,l=this.toasts.find(d=>d.id===i),u=t.dismissible===void 0?!0:t.dismissible;return this.dismissedToasts.has(i)&&this.dismissedToasts.delete(i),l?this.toasts=this.toasts.map(d=>d.id===i?(this.publish({...d,...t,id:i,title:r}),{...d,...t,id:i,dismissible:u,title:r}):d):this.addToast({title:r,...s,dismissible:u,id:i}),i},this.dismiss=t=>(this.dismissedToasts.add(t),t||this.toasts.forEach(e=>{this.subscribers.forEach(r=>r({id:e.id,dismiss:!0}))}),this.subscribers.forEach(e=>e({id:t,dismiss:!0})),t),this.message=(t,e)=>this.create({...e,message:t}),this.error=(t,e)=>this.create({...e,message:t,type:\"error\"}),this.success=(t,e)=>this.create({...e,type:\"success\",message:t}),this.info=(t,e)=>this.create({...e,type:\"info\",message:t}),this.warning=(t,e)=>this.create({...e,type:\"warning\",message:t}),this.loading=(t,e)=>this.create({...e,type:\"loading\",message:t}),this.promise=(t,e)=>{if(!e)return;let r;e.loading!==void 0&&(r=this.create({...e,promise:t,type:\"loading\",message:e.loading,description:typeof e.description!=\"function\"?e.description:void 0}));let s=t instanceof Promise?t:t(),i=r!==void 0,l,u=s.then(async h=>{if(l=[\"resolve\",h],oe.isValidElement(h))i=!1,this.create({id:r,type:\"default\",message:h});else if(rS(h)&&!h.ok){i=!1;let p=typeof e.error==\"function\"?await e.error(`HTTP error! status: ${h.status}`):e.error,y=typeof e.description==\"function\"?await e.description(`HTTP error! status: ${h.status}`):e.description;this.create({id:r,type:\"error\",message:p,description:y})}else if(e.success!==void 0){i=!1;let p=typeof e.success==\"function\"?await e.success(h):e.success,y=typeof e.description==\"function\"?await e.description(h):e.description;this.create({id:r,type:\"success\",message:p,description:y})}}).catch(async h=>{if(l=[\"reject\",h],e.error!==void 0){i=!1;let p=typeof e.error==\"function\"?await e.error(h):e.error,y=typeof e.description==\"function\"?await e.description(h):e.description;this.create({id:r,type:\"error\",message:p,description:y})}}).finally(()=>{var h;i&&(this.dismiss(r),r=void 0),(h=e.finally)==null||h.call(e)}),d=()=>new Promise((h,p)=>u.then(()=>l[0]===\"reject\"?p(l[1]):h(l[1])).catch(p));return typeof r!=\"string\"&&typeof r!=\"number\"?{unwrap:d}:Object.assign(r,{unwrap:d})},this.custom=(t,e)=>{let r=(e==null?void 0:e.id)||Yd++;return this.create({jsx:t(r),id:r,...e}),r},this.getActiveToasts=()=>this.toasts.filter(t=>!this.dismissedToasts.has(t.id)),this.subscribers=[],this.toasts=[],this.dismissedToasts=new Set}},Ht=new tS,nS=(t,e)=>{let r=(e==null?void 0:e.id)||Yd++;return Ht.addToast({title:t,...e,id:r}),r},rS=t=>t&&typeof t==\"object\"&&\"ok\"in t&&typeof t.ok==\"boolean\"&&\"status\"in t&&typeof t.status==\"number\",oS=nS,sS=()=>Ht.toasts,iS=()=>Ht.getActiveToasts(),Kl=Object.assign(oS,{success:Ht.success,info:Ht.info,warning:Ht.warning,error:Ht.error,custom:Ht.custom,message:Ht.message,promise:Ht.promise,dismiss:Ht.dismiss,loading:Ht.loading},{getHistory:sS,getToasts:iS});function aS(t,{insertAt:e}={}){if(typeof document>\"u\")return;let r=document.head||document.getElementsByTagName(\"head\")[0],s=document.createElement(\"style\");s.type=\"text/css\",e===\"top\"&&r.firstChild?r.insertBefore(s,r.firstChild):r.appendChild(s),s.styleSheet?s.styleSheet.cssText=t:s.appendChild(document.createTextNode(t))}aS(`:where(html[dir=\"ltr\"]),:where([data-sonner-toaster][dir=\"ltr\"]){--toast-icon-margin-start: -3px;--toast-icon-margin-end: 4px;--toast-svg-margin-start: -1px;--toast-svg-margin-end: 0px;--toast-button-margin-start: auto;--toast-button-margin-end: 0;--toast-close-button-start: 0;--toast-close-button-end: unset;--toast-close-button-transform: translate(-35%, -35%)}:where(html[dir=\"rtl\"]),:where([data-sonner-toaster][dir=\"rtl\"]){--toast-icon-margin-start: 4px;--toast-icon-margin-end: -3px;--toast-svg-margin-start: 0px;--toast-svg-margin-end: -1px;--toast-button-margin-start: 0;--toast-button-margin-end: auto;--toast-close-button-start: unset;--toast-close-button-end: 0;--toast-close-button-transform: translate(35%, -35%)}:where([data-sonner-toaster]){position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1: hsl(0, 0%, 99%);--gray2: hsl(0, 0%, 97.3%);--gray3: hsl(0, 0%, 95.1%);--gray4: hsl(0, 0%, 93%);--gray5: hsl(0, 0%, 90.9%);--gray6: hsl(0, 0%, 88.7%);--gray7: hsl(0, 0%, 85.8%);--gray8: hsl(0, 0%, 78%);--gray9: hsl(0, 0%, 56.1%);--gray10: hsl(0, 0%, 52.3%);--gray11: hsl(0, 0%, 43.5%);--gray12: hsl(0, 0%, 9%);--border-radius: 8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:none;z-index:999999999;transition:transform .4s ease}:where([data-sonner-toaster][data-lifted=\"true\"]){transform:translateY(-10px)}@media (hover: none) and (pointer: coarse){:where([data-sonner-toaster][data-lifted=\"true\"]){transform:none}}:where([data-sonner-toaster][data-x-position=\"right\"]){right:var(--offset-right)}:where([data-sonner-toaster][data-x-position=\"left\"]){left:var(--offset-left)}:where([data-sonner-toaster][data-x-position=\"center\"]){left:50%;transform:translate(-50%)}:where([data-sonner-toaster][data-y-position=\"top\"]){top:var(--offset-top)}:where([data-sonner-toaster][data-y-position=\"bottom\"]){bottom:var(--offset-bottom)}:where([data-sonner-toast]){--y: translateY(100%);--lift-amount: calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);filter:blur(0);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:none;overflow-wrap:anywhere}:where([data-sonner-toast][data-styled=\"true\"]){padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px #0000001a;width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}:where([data-sonner-toast]:focus-visible){box-shadow:0 4px 12px #0000001a,0 0 0 2px #0003}:where([data-sonner-toast][data-y-position=\"top\"]){top:0;--y: translateY(-100%);--lift: 1;--lift-amount: calc(1 * var(--gap))}:where([data-sonner-toast][data-y-position=\"bottom\"]){bottom:0;--y: translateY(100%);--lift: -1;--lift-amount: calc(var(--lift) * var(--gap))}:where([data-sonner-toast]) :where([data-description]){font-weight:400;line-height:1.4;color:inherit}:where([data-sonner-toast]) :where([data-title]){font-weight:500;line-height:1.5;color:inherit}:where([data-sonner-toast]) :where([data-icon]){display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}:where([data-sonner-toast][data-promise=\"true\"]) :where([data-icon])>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}:where([data-sonner-toast]) :where([data-icon])>*{flex-shrink:0}:where([data-sonner-toast]) :where([data-icon]) svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}:where([data-sonner-toast]) :where([data-content]){display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;cursor:pointer;outline:none;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}:where([data-sonner-toast]) :where([data-button]):focus-visible{box-shadow:0 0 0 2px #0006}:where([data-sonner-toast]) :where([data-button]):first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}:where([data-sonner-toast]) :where([data-cancel]){color:var(--normal-text);background:rgba(0,0,0,.08)}:where([data-sonner-toast][data-theme=\"dark\"]) :where([data-cancel]){background:rgba(255,255,255,.3)}:where([data-sonner-toast]) :where([data-close-button]){position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast] [data-close-button]{background:var(--gray1)}:where([data-sonner-toast]) :where([data-close-button]):focus-visible{box-shadow:0 4px 12px #0000001a,0 0 0 2px #0003}:where([data-sonner-toast]) :where([data-disabled=\"true\"]){cursor:not-allowed}:where([data-sonner-toast]):hover :where([data-close-button]):hover{background:var(--gray2);border-color:var(--gray5)}:where([data-sonner-toast][data-swiping=\"true\"]):before{content:\"\";position:absolute;left:-50%;right:-50%;height:100%;z-index:-1}:where([data-sonner-toast][data-y-position=\"top\"][data-swiping=\"true\"]):before{bottom:50%;transform:scaleY(3) translateY(50%)}:where([data-sonner-toast][data-y-position=\"bottom\"][data-swiping=\"true\"]):before{top:50%;transform:scaleY(3) translateY(-50%)}:where([data-sonner-toast][data-swiping=\"false\"][data-removed=\"true\"]):before{content:\"\";position:absolute;inset:0;transform:scaleY(2)}:where([data-sonner-toast]):after{content:\"\";position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}:where([data-sonner-toast][data-mounted=\"true\"]){--y: translateY(0);opacity:1}:where([data-sonner-toast][data-expanded=\"false\"][data-front=\"false\"]){--scale: var(--toasts-before) * .05 + 1;--y: translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}:where([data-sonner-toast])>*{transition:opacity .4s}:where([data-sonner-toast][data-expanded=\"false\"][data-front=\"false\"][data-styled=\"true\"])>*{opacity:0}:where([data-sonner-toast][data-visible=\"false\"]){opacity:0;pointer-events:none}:where([data-sonner-toast][data-mounted=\"true\"][data-expanded=\"true\"]){--y: translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}:where([data-sonner-toast][data-removed=\"true\"][data-front=\"true\"][data-swipe-out=\"false\"]){--y: translateY(calc(var(--lift) * -100%));opacity:0}:where([data-sonner-toast][data-removed=\"true\"][data-front=\"false\"][data-swipe-out=\"false\"][data-expanded=\"true\"]){--y: translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}:where([data-sonner-toast][data-removed=\"true\"][data-front=\"false\"][data-swipe-out=\"false\"][data-expanded=\"false\"]){--y: translateY(40%);opacity:0;transition:transform .5s,opacity .2s}:where([data-sonner-toast][data-removed=\"true\"][data-front=\"false\"]):before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y, 0px)) translate(var(--swipe-amount-x, 0px));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{0%{transform:var(--y) translate(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translate(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{0%{transform:var(--y) translate(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translate(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{0%{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{0%{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width: 600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-theme=light]{--normal-bg: #fff;--normal-border: var(--gray4);--normal-text: var(--gray12);--success-bg: hsl(143, 85%, 96%);--success-border: hsl(145, 92%, 91%);--success-text: hsl(140, 100%, 27%);--info-bg: hsl(208, 100%, 97%);--info-border: hsl(221, 91%, 91%);--info-text: hsl(210, 92%, 45%);--warning-bg: hsl(49, 100%, 97%);--warning-border: hsl(49, 91%, 91%);--warning-text: hsl(31, 92%, 45%);--error-bg: hsl(359, 100%, 97%);--error-border: hsl(359, 100%, 94%);--error-text: hsl(360, 100%, 45%)}[data-sonner-toaster][data-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg: #000;--normal-border: hsl(0, 0%, 20%);--normal-text: var(--gray1)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg: #fff;--normal-border: var(--gray3);--normal-text: var(--gray12)}[data-sonner-toaster][data-theme=dark]{--normal-bg: #000;--normal-bg-hover: hsl(0, 0%, 12%);--normal-border: hsl(0, 0%, 20%);--normal-border-hover: hsl(0, 0%, 25%);--normal-text: var(--gray1);--success-bg: hsl(150, 100%, 6%);--success-border: hsl(147, 100%, 12%);--success-text: hsl(150, 86%, 65%);--info-bg: hsl(215, 100%, 6%);--info-border: hsl(223, 100%, 12%);--info-text: hsl(216, 87%, 65%);--warning-bg: hsl(64, 100%, 6%);--warning-border: hsl(60, 100%, 12%);--warning-text: hsl(46, 87%, 65%);--error-bg: hsl(358, 76%, 10%);--error-border: hsl(357, 89%, 16%);--error-text: hsl(358, 100%, 81%)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success],[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info],[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning],[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error],[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size: 16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:nth-child(1){animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}to{opacity:.15}}@media (prefers-reduced-motion){[data-sonner-toast],[data-sonner-toast]>*,.sonner-loading-bar{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}\n`);function kl(t){return t.label!==void 0}var lS=3,cS=\"32px\",uS=\"16px\",ag=4e3,dS=356,fS=14,hS=20,pS=200;function Sn(...t){return t.filter(Boolean).join(\" \")}function mS(t){let[e,r]=t.split(\"-\"),s=[];return e&&s.push(e),r&&s.push(r),s}var gS=t=>{var e,r,s,i,l,u,d,h,p,y,v;let{invert:C,toast:w,unstyled:E,interacting:b,setHeights:k,visibleToasts:T,heights:j,index:_,toasts:A,expanded:F,removeToast:V,defaultRichColors:B,closeButton:te,style:G,cancelButtonStyle:W,actionButtonStyle:le,className:K=\"\",descriptionClassName:Z=\"\",duration:J,position:de,gap:ne,loadingIcon:se,expandByDefault:$,classNames:H,icons:Q,closeButtonAriaLabel:P=\"Close toast\",pauseWhenPageIsHidden:M}=t,[ie,ae]=oe.useState(null),[me,be]=oe.useState(null),[ee,ye]=oe.useState(!1),[Se,Ne]=oe.useState(!1),[Oe,_e]=oe.useState(!1),[et,gt]=oe.useState(!1),[On,dn]=oe.useState(!1),[fn,wr]=oe.useState(0),[jn,br]=oe.useState(0),en=oe.useRef(w.duration||J||ag),Ko=oe.useRef(null),_n=oe.useRef(null),ca=_===0,ua=_+1<=T,Et=w.type,An=w.dismissible!==!1,qo=w.className||\"\",da=w.descriptionClassName||\"\",Ln=oe.useMemo(()=>j.findIndex(Ee=>Ee.toastId===w.id)||0,[j,w.id]),ao=oe.useMemo(()=>{var Ee;return(Ee=w.closeButton)!=null?Ee:te},[w.closeButton,te]),fa=oe.useMemo(()=>w.duration||J||ag,[w.duration,J]),Qo=oe.useRef(0),tr=oe.useRef(0),ha=oe.useRef(0),In=oe.useRef(null),[ei,ti]=de.split(\"-\"),Yo=oe.useMemo(()=>j.reduce((Ee,Fe,He)=>He>=Ln?Ee:Ee+Fe.height,0),[j,Ln]),Go=eS(),Sr=w.invert||C,Dn=Et===\"loading\";tr.current=oe.useMemo(()=>Ln*ne+Yo,[Ln,Yo]),oe.useEffect(()=>{en.current=fa},[fa]),oe.useEffect(()=>{ye(!0)},[]),oe.useEffect(()=>{let Ee=_n.current;if(Ee){let Fe=Ee.getBoundingClientRect().height;return br(Fe),k(He=>[{toastId:w.id,height:Fe,position:w.position},...He]),()=>k(He=>He.filter(kt=>kt.toastId!==w.id))}},[k,w.id]),oe.useLayoutEffect(()=>{if(!ee)return;let Ee=_n.current,Fe=Ee.style.height;Ee.style.height=\"auto\";let He=Ee.getBoundingClientRect().height;Ee.style.height=Fe,br(He),k(kt=>kt.find(At=>At.toastId===w.id)?kt.map(At=>At.toastId===w.id?{...At,height:He}:At):[{toastId:w.id,height:He,position:w.position},...kt])},[ee,w.title,w.description,k,w.id]);let hn=oe.useCallback(()=>{Ne(!0),wr(tr.current),k(Ee=>Ee.filter(Fe=>Fe.toastId!==w.id)),setTimeout(()=>{V(w)},pS)},[w,V,k,tr]);oe.useEffect(()=>{if(w.promise&&Et===\"loading\"||w.duration===1/0||w.type===\"loading\")return;let Ee;return F||b||M&&Go?(()=>{if(ha.current<Qo.current){let Fe=new Date().getTime()-Qo.current;en.current=en.current-Fe}ha.current=new Date().getTime()})():en.current!==1/0&&(Qo.current=new Date().getTime(),Ee=setTimeout(()=>{var Fe;(Fe=w.onAutoClose)==null||Fe.call(w,w),hn()},en.current)),()=>clearTimeout(Ee)},[F,b,w,Et,M,Go,hn]),oe.useEffect(()=>{w.delete&&hn()},[hn,w.delete]);function pa(){var Ee,Fe,He;return Q!=null&&Q.loading?oe.createElement(\"div\",{className:Sn(H==null?void 0:H.loader,(Ee=w==null?void 0:w.classNames)==null?void 0:Ee.loader,\"sonner-loader\"),\"data-visible\":Et===\"loading\"},Q.loading):se?oe.createElement(\"div\",{className:Sn(H==null?void 0:H.loader,(Fe=w==null?void 0:w.classNames)==null?void 0:Fe.loader,\"sonner-loader\"),\"data-visible\":Et===\"loading\"},se):oe.createElement(Q1,{className:Sn(H==null?void 0:H.loader,(He=w==null?void 0:w.classNames)==null?void 0:He.loader),visible:Et===\"loading\"})}return oe.createElement(\"li\",{tabIndex:0,ref:_n,className:Sn(K,qo,H==null?void 0:H.toast,(e=w==null?void 0:w.classNames)==null?void 0:e.toast,H==null?void 0:H.default,H==null?void 0:H[Et],(r=w==null?void 0:w.classNames)==null?void 0:r[Et]),\"data-sonner-toast\":\"\",\"data-rich-colors\":(s=w.richColors)!=null?s:B,\"data-styled\":!(w.jsx||w.unstyled||E),\"data-mounted\":ee,\"data-promise\":!!w.promise,\"data-swiped\":On,\"data-removed\":Se,\"data-visible\":ua,\"data-y-position\":ei,\"data-x-position\":ti,\"data-index\":_,\"data-front\":ca,\"data-swiping\":Oe,\"data-dismissible\":An,\"data-type\":Et,\"data-invert\":Sr,\"data-swipe-out\":et,\"data-swipe-direction\":me,\"data-expanded\":!!(F||$&&ee),style:{\"--index\":_,\"--toasts-before\":_,\"--z-index\":A.length-_,\"--offset\":`${Se?fn:tr.current}px`,\"--initial-height\":$?\"auto\":`${jn}px`,...G,...w.style},onDragEnd:()=>{_e(!1),ae(null),In.current=null},onPointerDown:Ee=>{Dn||!An||(Ko.current=new Date,wr(tr.current),Ee.target.setPointerCapture(Ee.pointerId),Ee.target.tagName!==\"BUTTON\"&&(_e(!0),In.current={x:Ee.clientX,y:Ee.clientY}))},onPointerUp:()=>{var Ee,Fe,He,kt;if(et||!An)return;In.current=null;let At=Number(((Ee=_n.current)==null?void 0:Ee.style.getPropertyValue(\"--swipe-amount-x\").replace(\"px\",\"\"))||0),Lt=Number(((Fe=_n.current)==null?void 0:Fe.style.getPropertyValue(\"--swipe-amount-y\").replace(\"px\",\"\"))||0),pn=new Date().getTime()-((He=Ko.current)==null?void 0:He.getTime()),ft=ie===\"x\"?At:Lt,Mn=Math.abs(ft)/pn;if(Math.abs(ft)>=hS||Mn>.11){wr(tr.current),(kt=w.onDismiss)==null||kt.call(w,w),be(ie===\"x\"?At>0?\"right\":\"left\":Lt>0?\"down\":\"up\"),hn(),gt(!0),dn(!1);return}_e(!1),ae(null)},onPointerMove:Ee=>{var Fe,He,kt,At;if(!In.current||!An||((Fe=window.getSelection())==null?void 0:Fe.toString().length)>0)return;let Lt=Ee.clientY-In.current.y,pn=Ee.clientX-In.current.x,ft=(He=t.swipeDirections)!=null?He:mS(de);!ie&&(Math.abs(pn)>1||Math.abs(Lt)>1)&&ae(Math.abs(pn)>Math.abs(Lt)?\"x\":\"y\");let Mn={x:0,y:0};ie===\"y\"?(ft.includes(\"top\")||ft.includes(\"bottom\"))&&(ft.includes(\"top\")&&Lt<0||ft.includes(\"bottom\")&&Lt>0)&&(Mn.y=Lt):ie===\"x\"&&(ft.includes(\"left\")||ft.includes(\"right\"))&&(ft.includes(\"left\")&&pn<0||ft.includes(\"right\")&&pn>0)&&(Mn.x=pn),(Math.abs(Mn.x)>0||Math.abs(Mn.y)>0)&&dn(!0),(kt=_n.current)==null||kt.style.setProperty(\"--swipe-amount-x\",`${Mn.x}px`),(At=_n.current)==null||At.style.setProperty(\"--swipe-amount-y\",`${Mn.y}px`)}},ao&&!w.jsx?oe.createElement(\"button\",{\"aria-label\":P,\"data-disabled\":Dn,\"data-close-button\":!0,onClick:Dn||!An?()=>{}:()=>{var Ee;hn(),(Ee=w.onDismiss)==null||Ee.call(w,w)},className:Sn(H==null?void 0:H.closeButton,(i=w==null?void 0:w.classNames)==null?void 0:i.closeButton)},(l=Q==null?void 0:Q.close)!=null?l:Z1):null,w.jsx||x.isValidElement(w.title)?w.jsx?w.jsx:typeof w.title==\"function\"?w.title():w.title:oe.createElement(oe.Fragment,null,Et||w.icon||w.promise?oe.createElement(\"div\",{\"data-icon\":\"\",className:Sn(H==null?void 0:H.icon,(u=w==null?void 0:w.classNames)==null?void 0:u.icon)},w.promise||w.type===\"loading\"&&!w.icon?w.icon||pa():null,w.type!==\"loading\"?w.icon||(Q==null?void 0:Q[Et])||K1(Et):null):null,oe.createElement(\"div\",{\"data-content\":\"\",className:Sn(H==null?void 0:H.content,(d=w==null?void 0:w.classNames)==null?void 0:d.content)},oe.createElement(\"div\",{\"data-title\":\"\",className:Sn(H==null?void 0:H.title,(h=w==null?void 0:w.classNames)==null?void 0:h.title)},typeof w.title==\"function\"?w.title():w.title),w.description?oe.createElement(\"div\",{\"data-description\":\"\",className:Sn(Z,da,H==null?void 0:H.description,(p=w==null?void 0:w.classNames)==null?void 0:p.description)},typeof w.description==\"function\"?w.description():w.description):null),x.isValidElement(w.cancel)?w.cancel:w.cancel&&kl(w.cancel)?oe.createElement(\"button\",{\"data-button\":!0,\"data-cancel\":!0,style:w.cancelButtonStyle||W,onClick:Ee=>{var Fe,He;kl(w.cancel)&&An&&((He=(Fe=w.cancel).onClick)==null||He.call(Fe,Ee),hn())},className:Sn(H==null?void 0:H.cancelButton,(y=w==null?void 0:w.classNames)==null?void 0:y.cancelButton)},w.cancel.label):null,x.isValidElement(w.action)?w.action:w.action&&kl(w.action)?oe.createElement(\"button\",{\"data-button\":!0,\"data-action\":!0,style:w.actionButtonStyle||le,onClick:Ee=>{var Fe,He;kl(w.action)&&((He=(Fe=w.action).onClick)==null||He.call(Fe,Ee),!Ee.defaultPrevented&&hn())},className:Sn(H==null?void 0:H.actionButton,(v=w==null?void 0:w.classNames)==null?void 0:v.actionButton)},w.action.label):null))};function lg(){if(typeof window>\"u\"||typeof document>\"u\")return\"ltr\";let t=document.documentElement.getAttribute(\"dir\");return t===\"auto\"||!t?window.getComputedStyle(document.documentElement).direction:t}function yS(t,e){let r={};return[t,e].forEach((s,i)=>{let l=i===1,u=l?\"--mobile-offset\":\"--offset\",d=l?uS:cS;function h(p){[\"top\",\"right\",\"bottom\",\"left\"].forEach(y=>{r[`${u}-${y}`]=typeof p==\"number\"?`${p}px`:p})}typeof s==\"number\"||typeof s==\"string\"?h(s):typeof s==\"object\"?[\"top\",\"right\",\"bottom\",\"left\"].forEach(p=>{s[p]===void 0?r[`${u}-${p}`]=d:r[`${u}-${p}`]=typeof s[p]==\"number\"?`${s[p]}px`:s[p]}):h(d)}),r}var vS=x.forwardRef(function(t,e){let{invert:r,position:s=\"bottom-right\",hotkey:i=[\"altKey\",\"KeyT\"],expand:l,closeButton:u,className:d,offset:h,mobileOffset:p,theme:y=\"light\",richColors:v,duration:C,style:w,visibleToasts:E=lS,toastOptions:b,dir:k=lg(),gap:T=fS,loadingIcon:j,icons:_,containerAriaLabel:A=\"Notifications\",pauseWhenPageIsHidden:F}=t,[V,B]=oe.useState([]),te=oe.useMemo(()=>Array.from(new Set([s].concat(V.filter(M=>M.position).map(M=>M.position)))),[V,s]),[G,W]=oe.useState([]),[le,K]=oe.useState(!1),[Z,J]=oe.useState(!1),[de,ne]=oe.useState(y!==\"system\"?y:typeof window<\"u\"&&window.matchMedia&&window.matchMedia(\"(prefers-color-scheme: dark)\").matches?\"dark\":\"light\"),se=oe.useRef(null),$=i.join(\"+\").replace(/Key/g,\"\").replace(/Digit/g,\"\"),H=oe.useRef(null),Q=oe.useRef(!1),P=oe.useCallback(M=>{B(ie=>{var ae;return(ae=ie.find(me=>me.id===M.id))!=null&&ae.delete||Ht.dismiss(M.id),ie.filter(({id:me})=>me!==M.id)})},[]);return oe.useEffect(()=>Ht.subscribe(M=>{if(M.dismiss){B(ie=>ie.map(ae=>ae.id===M.id?{...ae,delete:!0}:ae));return}setTimeout(()=>{Jy.flushSync(()=>{B(ie=>{let ae=ie.findIndex(me=>me.id===M.id);return ae!==-1?[...ie.slice(0,ae),{...ie[ae],...M},...ie.slice(ae+1)]:[M,...ie]})})})}),[]),oe.useEffect(()=>{if(y!==\"system\"){ne(y);return}if(y===\"system\"&&(window.matchMedia&&window.matchMedia(\"(prefers-color-scheme: dark)\").matches?ne(\"dark\"):ne(\"light\")),typeof window>\"u\")return;let M=window.matchMedia(\"(prefers-color-scheme: dark)\");try{M.addEventListener(\"change\",({matches:ie})=>{ne(ie?\"dark\":\"light\")})}catch{M.addListener(({matches:ae})=>{try{ne(ae?\"dark\":\"light\")}catch(me){console.error(me)}})}},[y]),oe.useEffect(()=>{V.length<=1&&K(!1)},[V]),oe.useEffect(()=>{let M=ie=>{var ae,me;i.every(be=>ie[be]||ie.code===be)&&(K(!0),(ae=se.current)==null||ae.focus()),ie.code===\"Escape\"&&(document.activeElement===se.current||(me=se.current)!=null&&me.contains(document.activeElement))&&K(!1)};return document.addEventListener(\"keydown\",M),()=>document.removeEventListener(\"keydown\",M)},[i]),oe.useEffect(()=>{if(se.current)return()=>{H.current&&(H.current.focus({preventScroll:!0}),H.current=null,Q.current=!1)}},[se.current]),oe.createElement(\"section\",{ref:e,\"aria-label\":`${A} ${$}`,tabIndex:-1,\"aria-live\":\"polite\",\"aria-relevant\":\"additions text\",\"aria-atomic\":\"false\",suppressHydrationWarning:!0},te.map((M,ie)=>{var ae;let[me,be]=M.split(\"-\");return V.length?oe.createElement(\"ol\",{key:M,dir:k===\"auto\"?lg():k,tabIndex:-1,ref:se,className:d,\"data-sonner-toaster\":!0,\"data-theme\":de,\"data-y-position\":me,\"data-lifted\":le&&V.length>1&&!l,\"data-x-position\":be,style:{\"--front-toast-height\":`${((ae=G[0])==null?void 0:ae.height)||0}px`,\"--width\":`${dS}px`,\"--gap\":`${T}px`,...w,...yS(h,p)},onBlur:ee=>{Q.current&&!ee.currentTarget.contains(ee.relatedTarget)&&(Q.current=!1,H.current&&(H.current.focus({preventScroll:!0}),H.current=null))},onFocus:ee=>{ee.target instanceof HTMLElement&&ee.target.dataset.dismissible===\"false\"||Q.current||(Q.current=!0,H.current=ee.relatedTarget)},onMouseEnter:()=>K(!0),onMouseMove:()=>K(!0),onMouseLeave:()=>{Z||K(!1)},onDragEnd:()=>K(!1),onPointerDown:ee=>{ee.target instanceof HTMLElement&&ee.target.dataset.dismissible===\"false\"||J(!0)},onPointerUp:()=>J(!1)},V.filter(ee=>!ee.position&&ie===0||ee.position===M).map((ee,ye)=>{var Se,Ne;return oe.createElement(gS,{key:ee.id,icons:_,index:ye,toast:ee,defaultRichColors:v,duration:(Se=b==null?void 0:b.duration)!=null?Se:C,className:b==null?void 0:b.className,descriptionClassName:b==null?void 0:b.descriptionClassName,invert:r,visibleToasts:E,closeButton:(Ne=b==null?void 0:b.closeButton)!=null?Ne:u,interacting:Z,position:M,style:b==null?void 0:b.style,unstyled:b==null?void 0:b.unstyled,classNames:b==null?void 0:b.classNames,cancelButtonStyle:b==null?void 0:b.cancelButtonStyle,actionButtonStyle:b==null?void 0:b.actionButtonStyle,removeToast:P,toasts:V.filter(Oe=>Oe.position==ee.position),heights:G.filter(Oe=>Oe.position==ee.position),setHeights:W,expandByDefault:l,gap:T,loadingIcon:j,expanded:le,pauseWhenPageIsHidden:F,swipeDirections:t.swipeDirections})})):null}))});/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const xS=t=>t.replace(/([a-z0-9])([A-Z])/g,\"$1-$2\").toLowerCase(),Zy=(...t)=>t.filter((e,r,s)=>!!e&&e.trim()!==\"\"&&s.indexOf(e)===r).join(\" \").trim();/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */var wS={xmlns:\"http://www.w3.org/2000/svg\",width:24,height:24,viewBox:\"0 0 24 24\",fill:\"none\",stroke:\"currentColor\",strokeWidth:2,strokeLinecap:\"round\",strokeLinejoin:\"round\"};/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const bS=x.forwardRef(({color:t=\"currentColor\",size:e=24,strokeWidth:r=2,absoluteStrokeWidth:s,className:i=\"\",children:l,iconNode:u,...d},h)=>x.createElement(\"svg\",{ref:h,...wS,width:e,height:e,stroke:t,strokeWidth:s?Number(r)*24/Number(e):r,className:Zy(\"lucide\",i),...d},[...u.map(([p,y])=>x.createElement(p,y)),...Array.isArray(l)?l:[l]]));/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const Ie=(t,e)=>{const r=x.forwardRef(({className:s,...i},l)=>x.createElement(bS,{ref:l,iconNode:e,className:Zy(`lucide-${xS(t)}`,s),...i}));return r.displayName=`${t}`,r};/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const SS=Ie(\"Bug\",[[\"path\",{d:\"m8 2 1.88 1.88\",key:\"fmnt4t\"}],[\"path\",{d:\"M14.12 3.88 16 2\",key:\"qol33r\"}],[\"path\",{d:\"M9 7.13v-1a3.003 3.003 0 1 1 6 0v1\",key:\"d7y7pr\"}],[\"path\",{d:\"M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6\",key:\"xs1cw7\"}],[\"path\",{d:\"M12 20v-9\",key:\"1qisl0\"}],[\"path\",{d:\"M6.53 9C4.6 8.8 3 7.1 3 5\",key:\"32zzws\"}],[\"path\",{d:\"M6 13H2\",key:\"82j7cp\"}],[\"path\",{d:\"M3 21c0-2.1 1.7-3.9 3.8-4\",key:\"4p0ekp\"}],[\"path\",{d:\"M20.97 5c0 2.1-1.6 3.8-3.5 4\",key:\"18gb23\"}],[\"path\",{d:\"M22 13h-4\",key:\"1jl80f\"}],[\"path\",{d:\"M17.2 17c2.1.1 3.8 1.9 3.8 4\",key:\"k3fwyw\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const Rf=Ie(\"Check\",[[\"path\",{d:\"M20 6 9 17l-5-5\",key:\"1gmf2c\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const Pf=Ie(\"ChevronDown\",[[\"path\",{d:\"m6 9 6 6 6-6\",key:\"qrunsl\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const ev=Ie(\"ChevronUp\",[[\"path\",{d:\"m18 15-6-6-6 6\",key:\"153udz\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const CS=Ie(\"CircleCheckBig\",[[\"path\",{d:\"M21.801 10A10 10 0 1 1 17 3.335\",key:\"yps3ct\"}],[\"path\",{d:\"m9 11 3 3L22 4\",key:\"1pflzl\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const ES=Ie(\"CircleX\",[[\"circle\",{cx:\"12\",cy:\"12\",r:\"10\",key:\"1mglay\"}],[\"path\",{d:\"m15 9-6 6\",key:\"1uzhvr\"}],[\"path\",{d:\"m9 9 6 6\",key:\"z0biqf\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const tv=Ie(\"Database\",[[\"ellipse\",{cx:\"12\",cy:\"5\",rx:\"9\",ry:\"3\",key:\"msslwz\"}],[\"path\",{d:\"M3 5V19A9 3 0 0 0 21 19V5\",key:\"1wlel7\"}],[\"path\",{d:\"M3 12A9 3 0 0 0 21 12\",key:\"mv7ke4\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const nv=Ie(\"Download\",[[\"path\",{d:\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\",key:\"ih7n3h\"}],[\"polyline\",{points:\"7 10 12 15 17 10\",key:\"2ggqvy\"}],[\"line\",{x1:\"12\",x2:\"12\",y1:\"15\",y2:\"3\",key:\"1vk2je\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const kS=Ie(\"ExternalLink\",[[\"path\",{d:\"M15 3h6v6\",key:\"1q9fwt\"}],[\"path\",{d:\"M10 14 21 3\",key:\"gplh6r\"}],[\"path\",{d:\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\",key:\"a6xqqp\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const NS=Ie(\"Eye\",[[\"path\",{d:\"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\",key:\"1nclc0\"}],[\"circle\",{cx:\"12\",cy:\"12\",r:\"3\",key:\"1v7zrd\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const RS=Ie(\"FileJson\",[[\"path\",{d:\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\",key:\"1rqfz7\"}],[\"path\",{d:\"M14 2v4a2 2 0 0 0 2 2h4\",key:\"tnqrlb\"}],[\"path\",{d:\"M10 12a1 1 0 0 0-1 1v1a1 1 0 0 1-1 1 1 1 0 0 1 1 1v1a1 1 0 0 0 1 1\",key:\"1oajmo\"}],[\"path\",{d:\"M14 18a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1 1 1 0 0 1-1-1v-1a1 1 0 0 0-1-1\",key:\"mpwhp6\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const pd=Ie(\"FileSpreadsheet\",[[\"path\",{d:\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\",key:\"1rqfz7\"}],[\"path\",{d:\"M14 2v4a2 2 0 0 0 2 2h4\",key:\"tnqrlb\"}],[\"path\",{d:\"M8 13h2\",key:\"yr2amv\"}],[\"path\",{d:\"M14 13h2\",key:\"un5t4a\"}],[\"path\",{d:\"M8 17h2\",key:\"2yhykz\"}],[\"path\",{d:\"M14 17h2\",key:\"10kma7\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const PS=Ie(\"FileText\",[[\"path\",{d:\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\",key:\"1rqfz7\"}],[\"path\",{d:\"M14 2v4a2 2 0 0 0 2 2h4\",key:\"tnqrlb\"}],[\"path\",{d:\"M10 9H8\",key:\"b1mrlr\"}],[\"path\",{d:\"M16 13H8\",key:\"t4e002\"}],[\"path\",{d:\"M16 17H8\",key:\"z1uh3a\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const TS=Ie(\"FolderOpen\",[[\"path\",{d:\"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2\",key:\"usdka0\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const OS=Ie(\"Github\",[[\"path\",{d:\"M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4\",key:\"tonef\"}],[\"path\",{d:\"M9 18c-4.51 2-5-2-7-2\",key:\"9comsn\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const rv=Ie(\"Globe\",[[\"circle\",{cx:\"12\",cy:\"12\",r:\"10\",key:\"1mglay\"}],[\"path\",{d:\"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\",key:\"13o1zl\"}],[\"path\",{d:\"M2 12h20\",key:\"9i4pu4\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const jS=Ie(\"Heart\",[[\"path\",{d:\"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z\",key:\"c3ymky\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const _S=Ie(\"KeyRound\",[[\"path\",{d:\"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z\",key:\"1s6t7t\"}],[\"circle\",{cx:\"16.5\",cy:\"7.5\",r:\".5\",fill:\"currentColor\",key:\"w0ekpg\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const AS=Ie(\"LoaderCircle\",[[\"path\",{d:\"M21 12a9 9 0 1 1-6.219-8.56\",key:\"13zald\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const LS=Ie(\"MessageSquare\",[[\"path\",{d:\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\",key:\"1lielz\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const IS=Ie(\"Monitor\",[[\"rect\",{width:\"20\",height:\"14\",x:\"2\",y:\"3\",rx:\"2\",key:\"48i651\"}],[\"line\",{x1:\"8\",x2:\"16\",y1:\"21\",y2:\"21\",key:\"1svkeh\"}],[\"line\",{x1:\"12\",x2:\"12\",y1:\"17\",y2:\"21\",key:\"vw1qmm\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const DS=Ie(\"Moon\",[[\"path\",{d:\"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z\",key:\"a7tn18\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const MS=Ie(\"Play\",[[\"polygon\",{points:\"6 3 20 12 6 21 6 3\",key:\"1oa8hb\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const Tf=Ie(\"RefreshCw\",[[\"path\",{d:\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\",key:\"v9h5vc\"}],[\"path\",{d:\"M21 3v5h-5\",key:\"1q7to0\"}],[\"path\",{d:\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\",key:\"3uifl3\"}],[\"path\",{d:\"M8 16H3v5\",key:\"1cv678\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const FS=Ie(\"Search\",[[\"circle\",{cx:\"11\",cy:\"11\",r:\"8\",key:\"4ej97u\"}],[\"path\",{d:\"m21 21-4.3-4.3\",key:\"1qie3q\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const zS=Ie(\"ShieldAlert\",[[\"path\",{d:\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",key:\"oel41y\"}],[\"path\",{d:\"M12 8v4\",key:\"1got3b\"}],[\"path\",{d:\"M12 16h.01\",key:\"1drbdi\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const $S=Ie(\"Sparkles\",[[\"path\",{d:\"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z\",key:\"4pj2yx\"}],[\"path\",{d:\"M20 3v4\",key:\"1olli1\"}],[\"path\",{d:\"M22 5h-4\",key:\"1gvqau\"}],[\"path\",{d:\"M4 17v2\",key:\"vumght\"}],[\"path\",{d:\"M5 18H3\",key:\"zchphs\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const US=Ie(\"Square\",[[\"rect\",{width:\"18\",height:\"18\",x:\"3\",y:\"3\",rx:\"2\",key:\"afitv7\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const BS=Ie(\"Sun\",[[\"circle\",{cx:\"12\",cy:\"12\",r:\"4\",key:\"4exip2\"}],[\"path\",{d:\"M12 2v2\",key:\"tus03m\"}],[\"path\",{d:\"M12 20v2\",key:\"1lh1kg\"}],[\"path\",{d:\"m4.93 4.93 1.41 1.41\",key:\"149t6j\"}],[\"path\",{d:\"m17.66 17.66 1.41 1.41\",key:\"ptbguv\"}],[\"path\",{d:\"M2 12h2\",key:\"1t8f8n\"}],[\"path\",{d:\"M20 12h2\",key:\"1q8mjw\"}],[\"path\",{d:\"m6.34 17.66-1.41 1.41\",key:\"1m8zz5\"}],[\"path\",{d:\"m19.07 4.93-1.41 1.41\",key:\"1shlcs\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const HS=Ie(\"Trash2\",[[\"path\",{d:\"M3 6h18\",key:\"d0wm0j\"}],[\"path\",{d:\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\",key:\"4alrt4\"}],[\"path\",{d:\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\",key:\"v07s0e\"}],[\"line\",{x1:\"10\",x2:\"10\",y1:\"11\",y2:\"17\",key:\"1uufr5\"}],[\"line\",{x1:\"14\",x2:\"14\",y1:\"11\",y2:\"17\",key:\"xtxkd\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const Of=Ie(\"TriangleAlert\",[[\"path\",{d:\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\",key:\"wmoenq\"}],[\"path\",{d:\"M12 9v4\",key:\"juzpu7\"}],[\"path\",{d:\"M12 17h.01\",key:\"p32p05\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const VS=Ie(\"Wifi\",[[\"path\",{d:\"M12 20h.01\",key:\"zekei9\"}],[\"path\",{d:\"M2 8.82a15 15 0 0 1 20 0\",key:\"dnpr2z\"}],[\"path\",{d:\"M5 12.859a10 10 0 0 1 14 0\",key:\"1x1e6c\"}],[\"path\",{d:\"M8.5 16.429a5 5 0 0 1 7 0\",key:\"1bycff\"}]]);/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const jf=Ie(\"X\",[[\"path\",{d:\"M18 6 6 18\",key:\"1bl5f8\"}],[\"path\",{d:\"m6 6 12 12\",key:\"d8bk6v\"}]]),ke=t=>typeof t==\"string\",Mi=()=>{let t,e;const r=new Promise((s,i)=>{t=s,e=i});return r.resolve=t,r.reject=e,r},cg=t=>t==null?\"\":\"\"+t,WS=(t,e,r)=>{t.forEach(s=>{e[s]&&(r[s]=e[s])})},KS=/###/g,ug=t=>t&&t.indexOf(\"###\")>-1?t.replace(KS,\".\"):t,dg=t=>!t||ke(t),Hi=(t,e,r)=>{const s=ke(e)?e.split(\".\"):e;let i=0;for(;i<s.length-1;){if(dg(t))return{};const l=ug(s[i]);!t[l]&&r&&(t[l]=new r),Object.prototype.hasOwnProperty.call(t,l)?t=t[l]:t={},++i}return dg(t)?{}:{obj:t,k:ug(s[i])}},fg=(t,e,r)=>{const{obj:s,k:i}=Hi(t,e,Object);if(s!==void 0||e.length===1){s[i]=r;return}let l=e[e.length-1],u=e.slice(0,e.length-1),d=Hi(t,u,Object);for(;d.obj===void 0&&u.length;)l=`${u[u.length-1]}.${l}`,u=u.slice(0,u.length-1),d=Hi(t,u,Object),d!=null&&d.obj&&typeof d.obj[`${d.k}.${l}`]<\"u\"&&(d.obj=void 0);d.obj[`${d.k}.${l}`]=r},qS=(t,e,r,s)=>{const{obj:i,k:l}=Hi(t,e,Object);i[l]=i[l]||[],i[l].push(r)},ql=(t,e)=>{const{obj:r,k:s}=Hi(t,e);if(r&&Object.prototype.hasOwnProperty.call(r,s))return r[s]},QS=(t,e,r)=>{const s=ql(t,r);return s!==void 0?s:ql(e,r)},ov=(t,e,r)=>{for(const s in e)s!==\"__proto__\"&&s!==\"constructor\"&&(s in t?ke(t[s])||t[s]instanceof String||ke(e[s])||e[s]instanceof String?r&&(t[s]=e[s]):ov(t[s],e[s],r):t[s]=e[s]);return t},xs=t=>t.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g,\"\\\\$&\");var YS={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\",\"/\":\"&#x2F;\"};const GS=t=>ke(t)?t.replace(/[&<>\"'\\/]/g,e=>YS[e]):t;class XS{constructor(e){this.capacity=e,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(e){const r=this.regExpMap.get(e);if(r!==void 0)return r;const s=new RegExp(e);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(e,s),this.regExpQueue.push(e),s}}const JS=[\" \",\",\",\"?\",\"!\",\";\"],ZS=new XS(20),eC=(t,e,r)=>{e=e||\"\",r=r||\"\";const s=JS.filter(u=>e.indexOf(u)<0&&r.indexOf(u)<0);if(s.length===0)return!0;const i=ZS.getRegExp(`(${s.map(u=>u===\"?\"?\"\\\\?\":u).join(\"|\")})`);let l=!i.test(t);if(!l){const u=t.indexOf(r);u>0&&!i.test(t.substring(0,u))&&(l=!0)}return l},Gd=(t,e,r=\".\")=>{if(!t)return;if(t[e])return Object.prototype.hasOwnProperty.call(t,e)?t[e]:void 0;const s=e.split(r);let i=t;for(let l=0;l<s.length;){if(!i||typeof i!=\"object\")return;let u,d=\"\";for(let h=l;h<s.length;++h)if(h!==l&&(d+=r),d+=s[h],u=i[d],u!==void 0){if([\"string\",\"number\",\"boolean\"].indexOf(typeof u)>-1&&h<s.length-1)continue;l+=h-l+1;break}i=u}return i},Ki=t=>t==null?void 0:t.replace(\"_\",\"-\"),tC={type:\"logger\",log(t){this.output(\"log\",t)},warn(t){this.output(\"warn\",t)},error(t){this.output(\"error\",t)},output(t,e){var r,s;(s=(r=console==null?void 0:console[t])==null?void 0:r.apply)==null||s.call(r,console,e)}};class Ql{constructor(e,r={}){this.init(e,r)}init(e,r={}){this.prefix=r.prefix||\"i18next:\",this.logger=e||tC,this.options=r,this.debug=r.debug}log(...e){return this.forward(e,\"log\",\"\",!0)}warn(...e){return this.forward(e,\"warn\",\"\",!0)}error(...e){return this.forward(e,\"error\",\"\")}deprecate(...e){return this.forward(e,\"warn\",\"WARNING DEPRECATED: \",!0)}forward(e,r,s,i){return i&&!this.debug?null:(ke(e[0])&&(e[0]=`${s}${this.prefix} ${e[0]}`),this.logger[r](e))}create(e){return new Ql(this.logger,{prefix:`${this.prefix}:${e}:`,...this.options})}clone(e){return e=e||this.options,e.prefix=e.prefix||this.prefix,new Ql(this.logger,e)}}var Qn=new Ql;class cc{constructor(){this.observers={}}on(e,r){return e.split(\" \").forEach(s=>{this.observers[s]||(this.observers[s]=new Map);const i=this.observers[s].get(r)||0;this.observers[s].set(r,i+1)}),this}off(e,r){if(this.observers[e]){if(!r){delete this.observers[e];return}this.observers[e].delete(r)}}emit(e,...r){this.observers[e]&&Array.from(this.observers[e].entries()).forEach(([i,l])=>{for(let u=0;u<l;u++)i(...r)}),this.observers[\"*\"]&&Array.from(this.observers[\"*\"].entries()).forEach(([i,l])=>{for(let u=0;u<l;u++)i.apply(i,[e,...r])})}}class hg extends cc{constructor(e,r={ns:[\"translation\"],defaultNS:\"translation\"}){super(),this.data=e||{},this.options=r,this.options.keySeparator===void 0&&(this.options.keySeparator=\".\"),this.options.ignoreJSONStructure===void 0&&(this.options.ignoreJSONStructure=!0)}addNamespaces(e){this.options.ns.indexOf(e)<0&&this.options.ns.push(e)}removeNamespaces(e){const r=this.options.ns.indexOf(e);r>-1&&this.options.ns.splice(r,1)}getResource(e,r,s,i={}){var p,y;const l=i.keySeparator!==void 0?i.keySeparator:this.options.keySeparator,u=i.ignoreJSONStructure!==void 0?i.ignoreJSONStructure:this.options.ignoreJSONStructure;let d;e.indexOf(\".\")>-1?d=e.split(\".\"):(d=[e,r],s&&(Array.isArray(s)?d.push(...s):ke(s)&&l?d.push(...s.split(l)):d.push(s)));const h=ql(this.data,d);return!h&&!r&&!s&&e.indexOf(\".\")>-1&&(e=d[0],r=d[1],s=d.slice(2).join(\".\")),h||!u||!ke(s)?h:Gd((y=(p=this.data)==null?void 0:p[e])==null?void 0:y[r],s,l)}addResource(e,r,s,i,l={silent:!1}){const u=l.keySeparator!==void 0?l.keySeparator:this.options.keySeparator;let d=[e,r];s&&(d=d.concat(u?s.split(u):s)),e.indexOf(\".\")>-1&&(d=e.split(\".\"),i=r,r=d[1]),this.addNamespaces(r),fg(this.data,d,i),l.silent||this.emit(\"added\",e,r,s,i)}addResources(e,r,s,i={silent:!1}){for(const l in s)(ke(s[l])||Array.isArray(s[l]))&&this.addResource(e,r,l,s[l],{silent:!0});i.silent||this.emit(\"added\",e,r,s)}addResourceBundle(e,r,s,i,l,u={silent:!1,skipCopy:!1}){let d=[e,r];e.indexOf(\".\")>-1&&(d=e.split(\".\"),i=s,s=r,r=d[1]),this.addNamespaces(r);let h=ql(this.data,d)||{};u.skipCopy||(s=JSON.parse(JSON.stringify(s))),i?ov(h,s,l):h={...h,...s},fg(this.data,d,h),u.silent||this.emit(\"added\",e,r,s)}removeResourceBundle(e,r){this.hasResourceBundle(e,r)&&delete this.data[e][r],this.removeNamespaces(r),this.emit(\"removed\",e,r)}hasResourceBundle(e,r){return this.getResource(e,r)!==void 0}getResourceBundle(e,r){return r||(r=this.options.defaultNS),this.getResource(e,r)}getDataByLanguage(e){return this.data[e]}hasLanguageSomeTranslations(e){const r=this.getDataByLanguage(e);return!!(r&&Object.keys(r)||[]).find(i=>r[i]&&Object.keys(r[i]).length>0)}toJSON(){return this.data}}var sv={processors:{},addPostProcessor(t){this.processors[t.name]=t},handle(t,e,r,s,i){return t.forEach(l=>{var u;e=((u=this.processors[l])==null?void 0:u.process(e,r,s,i))??e}),e}};const iv=Symbol(\"i18next/PATH_KEY\");function nC(){const t=[],e=Object.create(null);let r;return e.get=(s,i)=>{var l;return(l=r==null?void 0:r.revoke)==null||l.call(r),i===iv?t:(t.push(i),r=Proxy.revocable(s,e),r.proxy)},Proxy.revocable(Object.create(null),e).proxy}function Xd(t,e){const{[iv]:r}=t(nC());return r.join((e==null?void 0:e.keySeparator)??\".\")}const pg={},md=t=>!ke(t)&&typeof t!=\"boolean\"&&typeof t!=\"number\";class Yl extends cc{constructor(e,r={}){super(),WS([\"resourceStore\",\"languageUtils\",\"pluralResolver\",\"interpolator\",\"backendConnector\",\"i18nFormat\",\"utils\"],e,this),this.options=r,this.options.keySeparator===void 0&&(this.options.keySeparator=\".\"),this.logger=Qn.create(\"translator\")}changeLanguage(e){e&&(this.language=e)}exists(e,r={interpolation:{}}){const s={...r};if(e==null)return!1;const i=this.resolve(e,s);if((i==null?void 0:i.res)===void 0)return!1;const l=md(i.res);return!(s.returnObjects===!1&&l)}extractFromKey(e,r){let s=r.nsSeparator!==void 0?r.nsSeparator:this.options.nsSeparator;s===void 0&&(s=\":\");const i=r.keySeparator!==void 0?r.keySeparator:this.options.keySeparator;let l=r.ns||this.options.defaultNS||[];const u=s&&e.indexOf(s)>-1,d=!this.options.userDefinedKeySeparator&&!r.keySeparator&&!this.options.userDefinedNsSeparator&&!r.nsSeparator&&!eC(e,s,i);if(u&&!d){const h=e.match(this.interpolator.nestingRegexp);if(h&&h.length>0)return{key:e,namespaces:ke(l)?[l]:l};const p=e.split(s);(s!==i||s===i&&this.options.ns.indexOf(p[0])>-1)&&(l=p.shift()),e=p.join(i)}return{key:e,namespaces:ke(l)?[l]:l}}translate(e,r,s){let i=typeof r==\"object\"?{...r}:r;if(typeof i!=\"object\"&&this.options.overloadTranslationOptionHandler&&(i=this.options.overloadTranslationOptionHandler(arguments)),typeof i==\"object\"&&(i={...i}),i||(i={}),e==null)return\"\";typeof e==\"function\"&&(e=Xd(e,{...this.options,...i})),Array.isArray(e)||(e=[String(e)]);const l=i.returnDetails!==void 0?i.returnDetails:this.options.returnDetails,u=i.keySeparator!==void 0?i.keySeparator:this.options.keySeparator,{key:d,namespaces:h}=this.extractFromKey(e[e.length-1],i),p=h[h.length-1];let y=i.nsSeparator!==void 0?i.nsSeparator:this.options.nsSeparator;y===void 0&&(y=\":\");const v=i.lng||this.language,C=i.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if((v==null?void 0:v.toLowerCase())===\"cimode\")return C?l?{res:`${p}${y}${d}`,usedKey:d,exactUsedKey:d,usedLng:v,usedNS:p,usedParams:this.getUsedParamsDetails(i)}:`${p}${y}${d}`:l?{res:d,usedKey:d,exactUsedKey:d,usedLng:v,usedNS:p,usedParams:this.getUsedParamsDetails(i)}:d;const w=this.resolve(e,i);let E=w==null?void 0:w.res;const b=(w==null?void 0:w.usedKey)||d,k=(w==null?void 0:w.exactUsedKey)||d,T=[\"[object Number]\",\"[object Function]\",\"[object RegExp]\"],j=i.joinArrays!==void 0?i.joinArrays:this.options.joinArrays,_=!this.i18nFormat||this.i18nFormat.handleAsObject,A=i.count!==void 0&&!ke(i.count),F=Yl.hasDefaultValue(i),V=A?this.pluralResolver.getSuffix(v,i.count,i):\"\",B=i.ordinal&&A?this.pluralResolver.getSuffix(v,i.count,{ordinal:!1}):\"\",te=A&&!i.ordinal&&i.count===0,G=te&&i[`defaultValue${this.options.pluralSeparator}zero`]||i[`defaultValue${V}`]||i[`defaultValue${B}`]||i.defaultValue;let W=E;_&&!E&&F&&(W=G);const le=md(W),K=Object.prototype.toString.apply(W);if(_&&W&&le&&T.indexOf(K)<0&&!(ke(j)&&Array.isArray(W))){if(!i.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn(\"accessing an object - but returnObjects options is not enabled!\");const Z=this.options.returnedObjectHandler?this.options.returnedObjectHandler(b,W,{...i,ns:h}):`key '${d} (${this.language})' returned an object instead of string.`;return l?(w.res=Z,w.usedParams=this.getUsedParamsDetails(i),w):Z}if(u){const Z=Array.isArray(W),J=Z?[]:{},de=Z?k:b;for(const ne in W)if(Object.prototype.hasOwnProperty.call(W,ne)){const se=`${de}${u}${ne}`;F&&!E?J[ne]=this.translate(se,{...i,defaultValue:md(G)?G[ne]:void 0,joinArrays:!1,ns:h}):J[ne]=this.translate(se,{...i,joinArrays:!1,ns:h}),J[ne]===se&&(J[ne]=W[ne])}E=J}}else if(_&&ke(j)&&Array.isArray(E))E=E.join(j),E&&(E=this.extendTranslation(E,e,i,s));else{let Z=!1,J=!1;!this.isValidLookup(E)&&F&&(Z=!0,E=G),this.isValidLookup(E)||(J=!0,E=d);const ne=(i.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&J?void 0:E,se=F&&G!==E&&this.options.updateMissing;if(J||Z||se){if(this.logger.log(se?\"updateKey\":\"missingKey\",v,p,d,se?G:E),u){const P=this.resolve(d,{...i,keySeparator:!1});P&&P.res&&this.logger.warn(\"Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.\")}let $=[];const H=this.languageUtils.getFallbackCodes(this.options.fallbackLng,i.lng||this.language);if(this.options.saveMissingTo===\"fallback\"&&H&&H[0])for(let P=0;P<H.length;P++)$.push(H[P]);else this.options.saveMissingTo===\"all\"?$=this.languageUtils.toResolveHierarchy(i.lng||this.language):$.push(i.lng||this.language);const Q=(P,M,ie)=>{var me;const ae=F&&ie!==E?ie:ne;this.options.missingKeyHandler?this.options.missingKeyHandler(P,p,M,ae,se,i):(me=this.backendConnector)!=null&&me.saveMissing&&this.backendConnector.saveMissing(P,p,M,ae,se,i),this.emit(\"missingKey\",P,p,M,E)};this.options.saveMissing&&(this.options.saveMissingPlurals&&A?$.forEach(P=>{const M=this.pluralResolver.getSuffixes(P,i);te&&i[`defaultValue${this.options.pluralSeparator}zero`]&&M.indexOf(`${this.options.pluralSeparator}zero`)<0&&M.push(`${this.options.pluralSeparator}zero`),M.forEach(ie=>{Q([P],d+ie,i[`defaultValue${ie}`]||G)})}):Q($,d,G))}E=this.extendTranslation(E,e,i,w,s),J&&E===d&&this.options.appendNamespaceToMissingKey&&(E=`${p}${y}${d}`),(J||Z)&&this.options.parseMissingKeyHandler&&(E=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${p}${y}${d}`:d,Z?E:void 0,i))}return l?(w.res=E,w.usedParams=this.getUsedParamsDetails(i),w):E}extendTranslation(e,r,s,i,l){var h,p;if((h=this.i18nFormat)!=null&&h.parse)e=this.i18nFormat.parse(e,{...this.options.interpolation.defaultVariables,...s},s.lng||this.language||i.usedLng,i.usedNS,i.usedKey,{resolved:i});else if(!s.skipInterpolation){s.interpolation&&this.interpolator.init({...s,interpolation:{...this.options.interpolation,...s.interpolation}});const y=ke(e)&&(((p=s==null?void 0:s.interpolation)==null?void 0:p.skipOnVariables)!==void 0?s.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables);let v;if(y){const w=e.match(this.interpolator.nestingRegexp);v=w&&w.length}let C=s.replace&&!ke(s.replace)?s.replace:s;if(this.options.interpolation.defaultVariables&&(C={...this.options.interpolation.defaultVariables,...C}),e=this.interpolator.interpolate(e,C,s.lng||this.language||i.usedLng,s),y){const w=e.match(this.interpolator.nestingRegexp),E=w&&w.length;v<E&&(s.nest=!1)}!s.lng&&i&&i.res&&(s.lng=this.language||i.usedLng),s.nest!==!1&&(e=this.interpolator.nest(e,(...w)=>(l==null?void 0:l[0])===w[0]&&!s.context?(this.logger.warn(`It seems you are nesting recursively key: ${w[0]} in key: ${r[0]}`),null):this.translate(...w,r),s)),s.interpolation&&this.interpolator.reset()}const u=s.postProcess||this.options.postProcess,d=ke(u)?[u]:u;return e!=null&&(d!=null&&d.length)&&s.applyPostProcessor!==!1&&(e=sv.handle(d,e,r,this.options&&this.options.postProcessPassResolved?{i18nResolved:{...i,usedParams:this.getUsedParamsDetails(s)},...s}:s,this)),e}resolve(e,r={}){let s,i,l,u,d;return ke(e)&&(e=[e]),e.forEach(h=>{if(this.isValidLookup(s))return;const p=this.extractFromKey(h,r),y=p.key;i=y;let v=p.namespaces;this.options.fallbackNS&&(v=v.concat(this.options.fallbackNS));const C=r.count!==void 0&&!ke(r.count),w=C&&!r.ordinal&&r.count===0,E=r.context!==void 0&&(ke(r.context)||typeof r.context==\"number\")&&r.context!==\"\",b=r.lngs?r.lngs:this.languageUtils.toResolveHierarchy(r.lng||this.language,r.fallbackLng);v.forEach(k=>{var T,j;this.isValidLookup(s)||(d=k,!pg[`${b[0]}-${k}`]&&((T=this.utils)!=null&&T.hasLoadedNamespace)&&!((j=this.utils)!=null&&j.hasLoadedNamespace(d))&&(pg[`${b[0]}-${k}`]=!0,this.logger.warn(`key \"${i}\" for languages \"${b.join(\", \")}\" won't get resolved as namespace \"${d}\" was not yet loaded`,\"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!\")),b.forEach(_=>{var V;if(this.isValidLookup(s))return;u=_;const A=[y];if((V=this.i18nFormat)!=null&&V.addLookupKeys)this.i18nFormat.addLookupKeys(A,y,_,k,r);else{let B;C&&(B=this.pluralResolver.getSuffix(_,r.count,r));const te=`${this.options.pluralSeparator}zero`,G=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(C&&(r.ordinal&&B.indexOf(G)===0&&A.push(y+B.replace(G,this.options.pluralSeparator)),A.push(y+B),w&&A.push(y+te)),E){const W=`${y}${this.options.contextSeparator||\"_\"}${r.context}`;A.push(W),C&&(r.ordinal&&B.indexOf(G)===0&&A.push(W+B.replace(G,this.options.pluralSeparator)),A.push(W+B),w&&A.push(W+te))}}let F;for(;F=A.pop();)this.isValidLookup(s)||(l=F,s=this.getResource(_,k,F,r))}))})}),{res:s,usedKey:i,exactUsedKey:l,usedLng:u,usedNS:d}}isValidLookup(e){return e!==void 0&&!(!this.options.returnNull&&e===null)&&!(!this.options.returnEmptyString&&e===\"\")}getResource(e,r,s,i={}){var l;return(l=this.i18nFormat)!=null&&l.getResource?this.i18nFormat.getResource(e,r,s,i):this.resourceStore.getResource(e,r,s,i)}getUsedParamsDetails(e={}){const r=[\"defaultValue\",\"ordinal\",\"context\",\"replace\",\"lng\",\"lngs\",\"fallbackLng\",\"ns\",\"keySeparator\",\"nsSeparator\",\"returnObjects\",\"returnDetails\",\"joinArrays\",\"postProcess\",\"interpolation\"],s=e.replace&&!ke(e.replace);let i=s?e.replace:e;if(s&&typeof e.count<\"u\"&&(i.count=e.count),this.options.interpolation.defaultVariables&&(i={...this.options.interpolation.defaultVariables,...i}),!s){i={...i};for(const l of r)delete i[l]}return i}static hasDefaultValue(e){const r=\"defaultValue\";for(const s in e)if(Object.prototype.hasOwnProperty.call(e,s)&&r===s.substring(0,r.length)&&e[s]!==void 0)return!0;return!1}}class mg{constructor(e){this.options=e,this.supportedLngs=this.options.supportedLngs||!1,this.logger=Qn.create(\"languageUtils\")}getScriptPartFromCode(e){if(e=Ki(e),!e||e.indexOf(\"-\")<0)return null;const r=e.split(\"-\");return r.length===2||(r.pop(),r[r.length-1].toLowerCase()===\"x\")?null:this.formatLanguageCode(r.join(\"-\"))}getLanguagePartFromCode(e){if(e=Ki(e),!e||e.indexOf(\"-\")<0)return e;const r=e.split(\"-\");return this.formatLanguageCode(r[0])}formatLanguageCode(e){if(ke(e)&&e.indexOf(\"-\")>-1){let r;try{r=Intl.getCanonicalLocales(e)[0]}catch{}return r&&this.options.lowerCaseLng&&(r=r.toLowerCase()),r||(this.options.lowerCaseLng?e.toLowerCase():e)}return this.options.cleanCode||this.options.lowerCaseLng?e.toLowerCase():e}isSupportedCode(e){return(this.options.load===\"languageOnly\"||this.options.nonExplicitSupportedLngs)&&(e=this.getLanguagePartFromCode(e)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(e)>-1}getBestMatchFromCodes(e){if(!e)return null;let r;return e.forEach(s=>{if(r)return;const i=this.formatLanguageCode(s);(!this.options.supportedLngs||this.isSupportedCode(i))&&(r=i)}),!r&&this.options.supportedLngs&&e.forEach(s=>{if(r)return;const i=this.getScriptPartFromCode(s);if(this.isSupportedCode(i))return r=i;const l=this.getLanguagePartFromCode(s);if(this.isSupportedCode(l))return r=l;r=this.options.supportedLngs.find(u=>{if(u===l)return u;if(!(u.indexOf(\"-\")<0&&l.indexOf(\"-\")<0)&&(u.indexOf(\"-\")>0&&l.indexOf(\"-\")<0&&u.substring(0,u.indexOf(\"-\"))===l||u.indexOf(l)===0&&l.length>1))return u})}),r||(r=this.getFallbackCodes(this.options.fallbackLng)[0]),r}getFallbackCodes(e,r){if(!e)return[];if(typeof e==\"function\"&&(e=e(r)),ke(e)&&(e=[e]),Array.isArray(e))return e;if(!r)return e.default||[];let s=e[r];return s||(s=e[this.getScriptPartFromCode(r)]),s||(s=e[this.formatLanguageCode(r)]),s||(s=e[this.getLanguagePartFromCode(r)]),s||(s=e.default),s||[]}toResolveHierarchy(e,r){const s=this.getFallbackCodes((r===!1?[]:r)||this.options.fallbackLng||[],e),i=[],l=u=>{u&&(this.isSupportedCode(u)?i.push(u):this.logger.warn(`rejecting language code not found in supportedLngs: ${u}`))};return ke(e)&&(e.indexOf(\"-\")>-1||e.indexOf(\"_\")>-1)?(this.options.load!==\"languageOnly\"&&l(this.formatLanguageCode(e)),this.options.load!==\"languageOnly\"&&this.options.load!==\"currentOnly\"&&l(this.getScriptPartFromCode(e)),this.options.load!==\"currentOnly\"&&l(this.getLanguagePartFromCode(e))):ke(e)&&l(this.formatLanguageCode(e)),s.forEach(u=>{i.indexOf(u)<0&&l(this.formatLanguageCode(u))}),i}}const gg={zero:0,one:1,two:2,few:3,many:4,other:5},yg={select:t=>t===1?\"one\":\"other\",resolvedOptions:()=>({pluralCategories:[\"one\",\"other\"]})};class rC{constructor(e,r={}){this.languageUtils=e,this.options=r,this.logger=Qn.create(\"pluralResolver\"),this.pluralRulesCache={}}addRule(e,r){this.rules[e]=r}clearCache(){this.pluralRulesCache={}}getRule(e,r={}){const s=Ki(e===\"dev\"?\"en\":e),i=r.ordinal?\"ordinal\":\"cardinal\",l=JSON.stringify({cleanedCode:s,type:i});if(l in this.pluralRulesCache)return this.pluralRulesCache[l];let u;try{u=new Intl.PluralRules(s,{type:i})}catch{if(!Intl)return this.logger.error(\"No Intl support, please use an Intl polyfill!\"),yg;if(!e.match(/-|_/))return yg;const h=this.languageUtils.getLanguagePartFromCode(e);u=this.getRule(h,r)}return this.pluralRulesCache[l]=u,u}needsPlural(e,r={}){let s=this.getRule(e,r);return s||(s=this.getRule(\"dev\",r)),(s==null?void 0:s.resolvedOptions().pluralCategories.length)>1}getPluralFormsOfKey(e,r,s={}){return this.getSuffixes(e,s).map(i=>`${r}${i}`)}getSuffixes(e,r={}){let s=this.getRule(e,r);return s||(s=this.getRule(\"dev\",r)),s?s.resolvedOptions().pluralCategories.sort((i,l)=>gg[i]-gg[l]).map(i=>`${this.options.prepend}${r.ordinal?`ordinal${this.options.prepend}`:\"\"}${i}`):[]}getSuffix(e,r,s={}){const i=this.getRule(e,s);return i?`${this.options.prepend}${s.ordinal?`ordinal${this.options.prepend}`:\"\"}${i.select(r)}`:(this.logger.warn(`no plural rule found for: ${e}`),this.getSuffix(\"dev\",r,s))}}const vg=(t,e,r,s=\".\",i=!0)=>{let l=QS(t,e,r);return!l&&i&&ke(r)&&(l=Gd(t,r,s),l===void 0&&(l=Gd(e,r,s))),l},gd=t=>t.replace(/\\$/g,\"$$$$\");class xg{constructor(e={}){var r;this.logger=Qn.create(\"interpolator\"),this.options=e,this.format=((r=e==null?void 0:e.interpolation)==null?void 0:r.format)||(s=>s),this.init(e)}init(e={}){e.interpolation||(e.interpolation={escapeValue:!0});const{escape:r,escapeValue:s,useRawValueToEscape:i,prefix:l,prefixEscaped:u,suffix:d,suffixEscaped:h,formatSeparator:p,unescapeSuffix:y,unescapePrefix:v,nestingPrefix:C,nestingPrefixEscaped:w,nestingSuffix:E,nestingSuffixEscaped:b,nestingOptionsSeparator:k,maxReplaces:T,alwaysFormat:j}=e.interpolation;this.escape=r!==void 0?r:GS,this.escapeValue=s!==void 0?s:!0,this.useRawValueToEscape=i!==void 0?i:!1,this.prefix=l?xs(l):u||\"{{\",this.suffix=d?xs(d):h||\"}}\",this.formatSeparator=p||\",\",this.unescapePrefix=y?\"\":v||\"-\",this.unescapeSuffix=this.unescapePrefix?\"\":y||\"\",this.nestingPrefix=C?xs(C):w||xs(\"$t(\"),this.nestingSuffix=E?xs(E):b||xs(\")\"),this.nestingOptionsSeparator=k||\",\",this.maxReplaces=T||1e3,this.alwaysFormat=j!==void 0?j:!1,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){const e=(r,s)=>(r==null?void 0:r.source)===s?(r.lastIndex=0,r):new RegExp(s,\"g\");this.regexp=e(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=e(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=e(this.nestingRegexp,`${this.nestingPrefix}((?:[^()\"']+|\"[^\"]*\"|'[^']*'|\\\\((?:[^()]|\"[^\"]*\"|'[^']*')*\\\\))*?)${this.nestingSuffix}`)}interpolate(e,r,s,i){var w;let l,u,d;const h=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{},p=E=>{if(E.indexOf(this.formatSeparator)<0){const j=vg(r,h,E,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(j,void 0,s,{...i,...r,interpolationkey:E}):j}const b=E.split(this.formatSeparator),k=b.shift().trim(),T=b.join(this.formatSeparator).trim();return this.format(vg(r,h,k,this.options.keySeparator,this.options.ignoreJSONStructure),T,s,{...i,...r,interpolationkey:k})};this.resetRegExp();const y=(i==null?void 0:i.missingInterpolationHandler)||this.options.missingInterpolationHandler,v=((w=i==null?void 0:i.interpolation)==null?void 0:w.skipOnVariables)!==void 0?i.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:E=>gd(E)},{regex:this.regexp,safeValue:E=>this.escapeValue?gd(this.escape(E)):gd(E)}].forEach(E=>{for(d=0;l=E.regex.exec(e);){const b=l[1].trim();if(u=p(b),u===void 0)if(typeof y==\"function\"){const T=y(e,l,i);u=ke(T)?T:\"\"}else if(i&&Object.prototype.hasOwnProperty.call(i,b))u=\"\";else if(v){u=l[0];continue}else this.logger.warn(`missed to pass in variable ${b} for interpolating ${e}`),u=\"\";else!ke(u)&&!this.useRawValueToEscape&&(u=cg(u));const k=E.safeValue(u);if(e=e.replace(l[0],k),v?(E.regex.lastIndex+=u.length,E.regex.lastIndex-=l[0].length):E.regex.lastIndex=0,d++,d>=this.maxReplaces)break}}),e}nest(e,r,s={}){let i,l,u;const d=(h,p)=>{const y=this.nestingOptionsSeparator;if(h.indexOf(y)<0)return h;const v=h.split(new RegExp(`${y}[ ]*{`));let C=`{${v[1]}`;h=v[0],C=this.interpolate(C,u);const w=C.match(/'/g),E=C.match(/\"/g);(((w==null?void 0:w.length)??0)%2===0&&!E||E.length%2!==0)&&(C=C.replace(/'/g,'\"'));try{u=JSON.parse(C),p&&(u={...p,...u})}catch(b){return this.logger.warn(`failed parsing options string in nesting for key ${h}`,b),`${h}${y}${C}`}return u.defaultValue&&u.defaultValue.indexOf(this.prefix)>-1&&delete u.defaultValue,h};for(;i=this.nestingRegexp.exec(e);){let h=[];u={...s},u=u.replace&&!ke(u.replace)?u.replace:u,u.applyPostProcessor=!1,delete u.defaultValue;const p=/{.*}/.test(i[1])?i[1].lastIndexOf(\"}\")+1:i[1].indexOf(this.formatSeparator);if(p!==-1&&(h=i[1].slice(p).split(this.formatSeparator).map(y=>y.trim()).filter(Boolean),i[1]=i[1].slice(0,p)),l=r(d.call(this,i[1].trim(),u),u),l&&i[0]===e&&!ke(l))return l;ke(l)||(l=cg(l)),l||(this.logger.warn(`missed to resolve ${i[1]} for nesting ${e}`),l=\"\"),h.length&&(l=h.reduce((y,v)=>this.format(y,v,s.lng,{...s,interpolationkey:i[1].trim()}),l.trim())),e=e.replace(i[0],l),this.regexp.lastIndex=0}return e}}const oC=t=>{let e=t.toLowerCase().trim();const r={};if(t.indexOf(\"(\")>-1){const s=t.split(\"(\");e=s[0].toLowerCase().trim();const i=s[1].substring(0,s[1].length-1);e===\"currency\"&&i.indexOf(\":\")<0?r.currency||(r.currency=i.trim()):e===\"relativetime\"&&i.indexOf(\":\")<0?r.range||(r.range=i.trim()):i.split(\";\").forEach(u=>{if(u){const[d,...h]=u.split(\":\"),p=h.join(\":\").trim().replace(/^'+|'+$/g,\"\"),y=d.trim();r[y]||(r[y]=p),p===\"false\"&&(r[y]=!1),p===\"true\"&&(r[y]=!0),isNaN(p)||(r[y]=parseInt(p,10))}})}return{formatName:e,formatOptions:r}},wg=t=>{const e={};return(r,s,i)=>{let l=i;i&&i.interpolationkey&&i.formatParams&&i.formatParams[i.interpolationkey]&&i[i.interpolationkey]&&(l={...l,[i.interpolationkey]:void 0});const u=s+JSON.stringify(l);let d=e[u];return d||(d=t(Ki(s),i),e[u]=d),d(r)}},sC=t=>(e,r,s)=>t(Ki(r),s)(e);class iC{constructor(e={}){this.logger=Qn.create(\"formatter\"),this.options=e,this.init(e)}init(e,r={interpolation:{}}){this.formatSeparator=r.interpolation.formatSeparator||\",\";const s=r.cacheInBuiltFormats?wg:sC;this.formats={number:s((i,l)=>{const u=new Intl.NumberFormat(i,{...l});return d=>u.format(d)}),currency:s((i,l)=>{const u=new Intl.NumberFormat(i,{...l,style:\"currency\"});return d=>u.format(d)}),datetime:s((i,l)=>{const u=new Intl.DateTimeFormat(i,{...l});return d=>u.format(d)}),relativetime:s((i,l)=>{const u=new Intl.RelativeTimeFormat(i,{...l});return d=>u.format(d,l.range||\"day\")}),list:s((i,l)=>{const u=new Intl.ListFormat(i,{...l});return d=>u.format(d)})}}add(e,r){this.formats[e.toLowerCase().trim()]=r}addCached(e,r){this.formats[e.toLowerCase().trim()]=wg(r)}format(e,r,s,i={}){const l=r.split(this.formatSeparator);if(l.length>1&&l[0].indexOf(\"(\")>1&&l[0].indexOf(\")\")<0&&l.find(d=>d.indexOf(\")\")>-1)){const d=l.findIndex(h=>h.indexOf(\")\")>-1);l[0]=[l[0],...l.splice(1,d)].join(this.formatSeparator)}return l.reduce((d,h)=>{var v;const{formatName:p,formatOptions:y}=oC(h);if(this.formats[p]){let C=d;try{const w=((v=i==null?void 0:i.formatParams)==null?void 0:v[i.interpolationkey])||{},E=w.locale||w.lng||i.locale||i.lng||s;C=this.formats[p](d,E,{...y,...i,...w})}catch(w){this.logger.warn(w)}return C}else this.logger.warn(`there was no format function for ${p}`);return d},e)}}const aC=(t,e)=>{t.pending[e]!==void 0&&(delete t.pending[e],t.pendingCount--)};class lC extends cc{constructor(e,r,s,i={}){var l,u;super(),this.backend=e,this.store=r,this.services=s,this.languageUtils=s.languageUtils,this.options=i,this.logger=Qn.create(\"backendConnector\"),this.waitingReads=[],this.maxParallelReads=i.maxParallelReads||10,this.readingCalls=0,this.maxRetries=i.maxRetries>=0?i.maxRetries:5,this.retryTimeout=i.retryTimeout>=1?i.retryTimeout:350,this.state={},this.queue=[],(u=(l=this.backend)==null?void 0:l.init)==null||u.call(l,s,i.backend,i)}queueLoad(e,r,s,i){const l={},u={},d={},h={};return e.forEach(p=>{let y=!0;r.forEach(v=>{const C=`${p}|${v}`;!s.reload&&this.store.hasResourceBundle(p,v)?this.state[C]=2:this.state[C]<0||(this.state[C]===1?u[C]===void 0&&(u[C]=!0):(this.state[C]=1,y=!1,u[C]===void 0&&(u[C]=!0),l[C]===void 0&&(l[C]=!0),h[v]===void 0&&(h[v]=!0)))}),y||(d[p]=!0)}),(Object.keys(l).length||Object.keys(u).length)&&this.queue.push({pending:u,pendingCount:Object.keys(u).length,loaded:{},errors:[],callback:i}),{toLoad:Object.keys(l),pending:Object.keys(u),toLoadLanguages:Object.keys(d),toLoadNamespaces:Object.keys(h)}}loaded(e,r,s){const i=e.split(\"|\"),l=i[0],u=i[1];r&&this.emit(\"failedLoading\",l,u,r),!r&&s&&this.store.addResourceBundle(l,u,s,void 0,void 0,{skipCopy:!0}),this.state[e]=r?-1:2,r&&s&&(this.state[e]=0);const d={};this.queue.forEach(h=>{qS(h.loaded,[l],u),aC(h,e),r&&h.errors.push(r),h.pendingCount===0&&!h.done&&(Object.keys(h.loaded).forEach(p=>{d[p]||(d[p]={});const y=h.loaded[p];y.length&&y.forEach(v=>{d[p][v]===void 0&&(d[p][v]=!0)})}),h.done=!0,h.errors.length?h.callback(h.errors):h.callback())}),this.emit(\"loaded\",d),this.queue=this.queue.filter(h=>!h.done)}read(e,r,s,i=0,l=this.retryTimeout,u){if(!e.length)return u(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:e,ns:r,fcName:s,tried:i,wait:l,callback:u});return}this.readingCalls++;const d=(p,y)=>{if(this.readingCalls--,this.waitingReads.length>0){const v=this.waitingReads.shift();this.read(v.lng,v.ns,v.fcName,v.tried,v.wait,v.callback)}if(p&&y&&i<this.maxRetries){setTimeout(()=>{this.read.call(this,e,r,s,i+1,l*2,u)},l);return}u(p,y)},h=this.backend[s].bind(this.backend);if(h.length===2){try{const p=h(e,r);p&&typeof p.then==\"function\"?p.then(y=>d(null,y)).catch(d):d(null,p)}catch(p){d(p)}return}return h(e,r,d)}prepareLoading(e,r,s={},i){if(!this.backend)return this.logger.warn(\"No backend was added via i18next.use. Will not load resources.\"),i&&i();ke(e)&&(e=this.languageUtils.toResolveHierarchy(e)),ke(r)&&(r=[r]);const l=this.queueLoad(e,r,s,i);if(!l.toLoad.length)return l.pending.length||i(),null;l.toLoad.forEach(u=>{this.loadOne(u)})}load(e,r,s){this.prepareLoading(e,r,{},s)}reload(e,r,s){this.prepareLoading(e,r,{reload:!0},s)}loadOne(e,r=\"\"){const s=e.split(\"|\"),i=s[0],l=s[1];this.read(i,l,\"read\",void 0,void 0,(u,d)=>{u&&this.logger.warn(`${r}loading namespace ${l} for language ${i} failed`,u),!u&&d&&this.logger.log(`${r}loaded namespace ${l} for language ${i}`,d),this.loaded(e,u,d)})}saveMissing(e,r,s,i,l,u={},d=()=>{}){var h,p,y,v,C;if((p=(h=this.services)==null?void 0:h.utils)!=null&&p.hasLoadedNamespace&&!((v=(y=this.services)==null?void 0:y.utils)!=null&&v.hasLoadedNamespace(r))){this.logger.warn(`did not save key \"${s}\" as the namespace \"${r}\" was not yet loaded`,\"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!\");return}if(!(s==null||s===\"\")){if((C=this.backend)!=null&&C.create){const w={...u,isUpdate:l},E=this.backend.create.bind(this.backend);if(E.length<6)try{let b;E.length===5?b=E(e,r,s,i,w):b=E(e,r,s,i),b&&typeof b.then==\"function\"?b.then(k=>d(null,k)).catch(d):d(null,b)}catch(b){d(b)}else E(e,r,s,i,d,w)}!e||!e[0]||this.store.addResource(e[0],r,s,i)}}}const bg=()=>({debug:!1,initAsync:!0,ns:[\"translation\"],defaultNS:[\"translation\"],fallbackLng:[\"dev\"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:\"all\",preload:!1,simplifyPluralSuffix:!0,keySeparator:\".\",nsSeparator:\":\",pluralSeparator:\"_\",contextSeparator:\"_\",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:\"fallback\",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:t=>{let e={};if(typeof t[1]==\"object\"&&(e=t[1]),ke(t[1])&&(e.defaultValue=t[1]),ke(t[2])&&(e.tDescription=t[2]),typeof t[2]==\"object\"||typeof t[3]==\"object\"){const r=t[3]||t[2];Object.keys(r).forEach(s=>{e[s]=r[s]})}return e},interpolation:{escapeValue:!0,format:t=>t,prefix:\"{{\",suffix:\"}}\",formatSeparator:\",\",unescapePrefix:\"-\",nestingPrefix:\"$t(\",nestingSuffix:\")\",nestingOptionsSeparator:\",\",maxReplaces:1e3,skipOnVariables:!0},cacheInBuiltFormats:!0}),Sg=t=>{var e,r;return ke(t.ns)&&(t.ns=[t.ns]),ke(t.fallbackLng)&&(t.fallbackLng=[t.fallbackLng]),ke(t.fallbackNS)&&(t.fallbackNS=[t.fallbackNS]),((r=(e=t.supportedLngs)==null?void 0:e.indexOf)==null?void 0:r.call(e,\"cimode\"))<0&&(t.supportedLngs=t.supportedLngs.concat([\"cimode\"])),typeof t.initImmediate==\"boolean\"&&(t.initAsync=t.initImmediate),t},Nl=()=>{},cC=t=>{Object.getOwnPropertyNames(Object.getPrototypeOf(t)).forEach(r=>{typeof t[r]==\"function\"&&(t[r]=t[r].bind(t))})};class Vi extends cc{constructor(e={},r){if(super(),this.options=Sg(e),this.services={},this.logger=Qn,this.modules={external:[]},cC(this),r&&!this.isInitialized&&!e.isClone){if(!this.options.initAsync)return this.init(e,r),this;setTimeout(()=>{this.init(e,r)},0)}}init(e={},r){this.isInitializing=!0,typeof e==\"function\"&&(r=e,e={}),e.defaultNS==null&&e.ns&&(ke(e.ns)?e.defaultNS=e.ns:e.ns.indexOf(\"translation\")<0&&(e.defaultNS=e.ns[0]));const s=bg();this.options={...s,...this.options,...Sg(e)},this.options.interpolation={...s.interpolation,...this.options.interpolation},e.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=e.keySeparator),e.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=e.nsSeparator),typeof this.options.overloadTranslationOptionHandler!=\"function\"&&(this.options.overloadTranslationOptionHandler=s.overloadTranslationOptionHandler);const i=p=>p?typeof p==\"function\"?new p:p:null;if(!this.options.isClone){this.modules.logger?Qn.init(i(this.modules.logger),this.options):Qn.init(null,this.options);let p;this.modules.formatter?p=this.modules.formatter:p=iC;const y=new mg(this.options);this.store=new hg(this.options.resources,this.options);const v=this.services;v.logger=Qn,v.resourceStore=this.store,v.languageUtils=y,v.pluralResolver=new rC(y,{prepend:this.options.pluralSeparator,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),this.options.interpolation.format&&this.options.interpolation.format!==s.interpolation.format&&this.logger.deprecate(\"init: you are still using the legacy format function, please use the new approach: https://www.i18next.com/translation-function/formatting\"),p&&(!this.options.interpolation.format||this.options.interpolation.format===s.interpolation.format)&&(v.formatter=i(p),v.formatter.init&&v.formatter.init(v,this.options),this.options.interpolation.format=v.formatter.format.bind(v.formatter)),v.interpolator=new xg(this.options),v.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},v.backendConnector=new lC(i(this.modules.backend),v.resourceStore,v,this.options),v.backendConnector.on(\"*\",(w,...E)=>{this.emit(w,...E)}),this.modules.languageDetector&&(v.languageDetector=i(this.modules.languageDetector),v.languageDetector.init&&v.languageDetector.init(v,this.options.detection,this.options)),this.modules.i18nFormat&&(v.i18nFormat=i(this.modules.i18nFormat),v.i18nFormat.init&&v.i18nFormat.init(this)),this.translator=new Yl(this.services,this.options),this.translator.on(\"*\",(w,...E)=>{this.emit(w,...E)}),this.modules.external.forEach(w=>{w.init&&w.init(this)})}if(this.format=this.options.interpolation.format,r||(r=Nl),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){const p=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);p.length>0&&p[0]!==\"dev\"&&(this.options.lng=p[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn(\"init: no languageDetector is used and no lng is defined\"),[\"getResource\",\"hasResourceBundle\",\"getResourceBundle\",\"getDataByLanguage\"].forEach(p=>{this[p]=(...y)=>this.store[p](...y)}),[\"addResource\",\"addResources\",\"addResourceBundle\",\"removeResourceBundle\"].forEach(p=>{this[p]=(...y)=>(this.store[p](...y),this)});const d=Mi(),h=()=>{const p=(y,v)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn(\"init: i18next is already initialized. You should call init just once!\"),this.isInitialized=!0,this.options.isClone||this.logger.log(\"initialized\",this.options),this.emit(\"initialized\",this.options),d.resolve(v),r(y,v)};if(this.languages&&!this.isInitialized)return p(null,this.t.bind(this));this.changeLanguage(this.options.lng,p)};return this.options.resources||!this.options.initAsync?h():setTimeout(h,0),d}loadResources(e,r=Nl){var l,u;let s=r;const i=ke(e)?e:this.language;if(typeof e==\"function\"&&(s=e),!this.options.resources||this.options.partialBundledLanguages){if((i==null?void 0:i.toLowerCase())===\"cimode\"&&(!this.options.preload||this.options.preload.length===0))return s();const d=[],h=p=>{if(!p||p===\"cimode\")return;this.services.languageUtils.toResolveHierarchy(p).forEach(v=>{v!==\"cimode\"&&d.indexOf(v)<0&&d.push(v)})};i?h(i):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(y=>h(y)),(u=(l=this.options.preload)==null?void 0:l.forEach)==null||u.call(l,p=>h(p)),this.services.backendConnector.load(d,this.options.ns,p=>{!p&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),s(p)})}else s(null)}reloadResources(e,r,s){const i=Mi();return typeof e==\"function\"&&(s=e,e=void 0),typeof r==\"function\"&&(s=r,r=void 0),e||(e=this.languages),r||(r=this.options.ns),s||(s=Nl),this.services.backendConnector.reload(e,r,l=>{i.resolve(),s(l)}),i}use(e){if(!e)throw new Error(\"You are passing an undefined module! Please check the object you are passing to i18next.use()\");if(!e.type)throw new Error(\"You are passing a wrong module! Please check the object you are passing to i18next.use()\");return e.type===\"backend\"&&(this.modules.backend=e),(e.type===\"logger\"||e.log&&e.warn&&e.error)&&(this.modules.logger=e),e.type===\"languageDetector\"&&(this.modules.languageDetector=e),e.type===\"i18nFormat\"&&(this.modules.i18nFormat=e),e.type===\"postProcessor\"&&sv.addPostProcessor(e),e.type===\"formatter\"&&(this.modules.formatter=e),e.type===\"3rdParty\"&&this.modules.external.push(e),this}setResolvedLanguage(e){if(!(!e||!this.languages)&&!([\"cimode\",\"dev\"].indexOf(e)>-1)){for(let r=0;r<this.languages.length;r++){const s=this.languages[r];if(!([\"cimode\",\"dev\"].indexOf(s)>-1)&&this.store.hasLanguageSomeTranslations(s)){this.resolvedLanguage=s;break}}!this.resolvedLanguage&&this.languages.indexOf(e)<0&&this.store.hasLanguageSomeTranslations(e)&&(this.resolvedLanguage=e,this.languages.unshift(e))}}changeLanguage(e,r){this.isLanguageChangingTo=e;const s=Mi();this.emit(\"languageChanging\",e);const i=d=>{this.language=d,this.languages=this.services.languageUtils.toResolveHierarchy(d),this.resolvedLanguage=void 0,this.setResolvedLanguage(d)},l=(d,h)=>{h?this.isLanguageChangingTo===e&&(i(h),this.translator.changeLanguage(h),this.isLanguageChangingTo=void 0,this.emit(\"languageChanged\",h),this.logger.log(\"languageChanged\",h)):this.isLanguageChangingTo=void 0,s.resolve((...p)=>this.t(...p)),r&&r(d,(...p)=>this.t(...p))},u=d=>{var y,v;!e&&!d&&this.services.languageDetector&&(d=[]);const h=ke(d)?d:d&&d[0],p=this.store.hasLanguageSomeTranslations(h)?h:this.services.languageUtils.getBestMatchFromCodes(ke(d)?[d]:d);p&&(this.language||i(p),this.translator.language||this.translator.changeLanguage(p),(v=(y=this.services.languageDetector)==null?void 0:y.cacheUserLanguage)==null||v.call(y,p)),this.loadResources(p,C=>{l(C,p)})};return!e&&this.services.languageDetector&&!this.services.languageDetector.async?u(this.services.languageDetector.detect()):!e&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(u):this.services.languageDetector.detect(u):u(e),s}getFixedT(e,r,s){const i=(l,u,...d)=>{let h;typeof u!=\"object\"?h=this.options.overloadTranslationOptionHandler([l,u].concat(d)):h={...u},h.lng=h.lng||i.lng,h.lngs=h.lngs||i.lngs,h.ns=h.ns||i.ns,h.keyPrefix!==\"\"&&(h.keyPrefix=h.keyPrefix||s||i.keyPrefix);const p=this.options.keySeparator||\".\";let y;return h.keyPrefix&&Array.isArray(l)?y=l.map(v=>(typeof v==\"function\"&&(v=Xd(v,{...this.options,...u})),`${h.keyPrefix}${p}${v}`)):(typeof l==\"function\"&&(l=Xd(l,{...this.options,...u})),y=h.keyPrefix?`${h.keyPrefix}${p}${l}`:l),this.t(y,h)};return ke(e)?i.lng=e:i.lngs=e,i.ns=r,i.keyPrefix=s,i}t(...e){var r;return(r=this.translator)==null?void 0:r.translate(...e)}exists(...e){var r;return(r=this.translator)==null?void 0:r.exists(...e)}setDefaultNamespace(e){this.options.defaultNS=e}hasLoadedNamespace(e,r={}){if(!this.isInitialized)return this.logger.warn(\"hasLoadedNamespace: i18next was not initialized\",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn(\"hasLoadedNamespace: i18n.languages were undefined or empty\",this.languages),!1;const s=r.lng||this.resolvedLanguage||this.languages[0],i=this.options?this.options.fallbackLng:!1,l=this.languages[this.languages.length-1];if(s.toLowerCase()===\"cimode\")return!0;const u=(d,h)=>{const p=this.services.backendConnector.state[`${d}|${h}`];return p===-1||p===0||p===2};if(r.precheck){const d=r.precheck(this,u);if(d!==void 0)return d}return!!(this.hasResourceBundle(s,e)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||u(s,e)&&(!i||u(l,e)))}loadNamespaces(e,r){const s=Mi();return this.options.ns?(ke(e)&&(e=[e]),e.forEach(i=>{this.options.ns.indexOf(i)<0&&this.options.ns.push(i)}),this.loadResources(i=>{s.resolve(),r&&r(i)}),s):(r&&r(),Promise.resolve())}loadLanguages(e,r){const s=Mi();ke(e)&&(e=[e]);const i=this.options.preload||[],l=e.filter(u=>i.indexOf(u)<0&&this.services.languageUtils.isSupportedCode(u));return l.length?(this.options.preload=i.concat(l),this.loadResources(u=>{s.resolve(),r&&r(u)}),s):(r&&r(),Promise.resolve())}dir(e){var i,l;if(e||(e=this.resolvedLanguage||(((i=this.languages)==null?void 0:i.length)>0?this.languages[0]:this.language)),!e)return\"rtl\";try{const u=new Intl.Locale(e);if(u&&u.getTextInfo){const d=u.getTextInfo();if(d&&d.direction)return d.direction}}catch{}const r=[\"ar\",\"shu\",\"sqr\",\"ssh\",\"xaa\",\"yhd\",\"yud\",\"aao\",\"abh\",\"abv\",\"acm\",\"acq\",\"acw\",\"acx\",\"acy\",\"adf\",\"ads\",\"aeb\",\"aec\",\"afb\",\"ajp\",\"apc\",\"apd\",\"arb\",\"arq\",\"ars\",\"ary\",\"arz\",\"auz\",\"avl\",\"ayh\",\"ayl\",\"ayn\",\"ayp\",\"bbz\",\"pga\",\"he\",\"iw\",\"ps\",\"pbt\",\"pbu\",\"pst\",\"prp\",\"prd\",\"ug\",\"ur\",\"ydd\",\"yds\",\"yih\",\"ji\",\"yi\",\"hbo\",\"men\",\"xmn\",\"fa\",\"jpr\",\"peo\",\"pes\",\"prs\",\"dv\",\"sam\",\"ckb\"],s=((l=this.services)==null?void 0:l.languageUtils)||new mg(bg());return e.toLowerCase().indexOf(\"-latn\")>1?\"ltr\":r.indexOf(s.getLanguagePartFromCode(e))>-1||e.toLowerCase().indexOf(\"-arab\")>1?\"rtl\":\"ltr\"}static createInstance(e={},r){const s=new Vi(e,r);return s.createInstance=Vi.createInstance,s}cloneInstance(e={},r=Nl){const s=e.forkResourceStore;s&&delete e.forkResourceStore;const i={...this.options,...e,isClone:!0},l=new Vi(i);if((e.debug!==void 0||e.prefix!==void 0)&&(l.logger=l.logger.clone(e)),[\"store\",\"services\",\"language\"].forEach(d=>{l[d]=this[d]}),l.services={...this.services},l.services.utils={hasLoadedNamespace:l.hasLoadedNamespace.bind(l)},s){const d=Object.keys(this.store.data).reduce((h,p)=>(h[p]={...this.store.data[p]},h[p]=Object.keys(h[p]).reduce((y,v)=>(y[v]={...h[p][v]},y),h[p]),h),{});l.store=new hg(d,i),l.services.resourceStore=l.store}return e.interpolation&&(l.services.interpolator=new xg(i)),l.translator=new Yl(l.services,i),l.translator.on(\"*\",(d,...h)=>{l.emit(d,...h)}),l.init(i,r),l.translator.options=i,l.translator.backendConnector.services.utils={hasLoadedNamespace:l.hasLoadedNamespace.bind(l)},l}toJSON(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}const _t=Vi.createInstance();_t.createInstance;_t.dir;_t.init;_t.loadResources;_t.reloadResources;_t.use;_t.changeLanguage;_t.getFixedT;_t.t;_t.exists;_t.setDefaultNamespace;_t.hasLoadedNamespace;_t.loadNamespaces;_t.loadLanguages;const uC=(t,e,r,s)=>{var l,u,d,h;const i=[r,{code:e,...s||{}}];if((u=(l=t==null?void 0:t.services)==null?void 0:l.logger)!=null&&u.forward)return t.services.logger.forward(i,\"warn\",\"react-i18next::\",!0);$o(i[0])&&(i[0]=`react-i18next:: ${i[0]}`),(h=(d=t==null?void 0:t.services)==null?void 0:d.logger)!=null&&h.warn?t.services.logger.warn(...i):console!=null&&console.warn&&console.warn(...i)},Cg={},av=(t,e,r,s)=>{$o(r)&&Cg[r]||($o(r)&&(Cg[r]=new Date),uC(t,e,r,s))},lv=(t,e)=>()=>{if(t.isInitialized)e();else{const r=()=>{setTimeout(()=>{t.off(\"initialized\",r)},0),e()};t.on(\"initialized\",r)}},Jd=(t,e,r)=>{t.loadNamespaces(e,lv(t,r))},Eg=(t,e,r,s)=>{if($o(r)&&(r=[r]),t.options.preload&&t.options.preload.indexOf(e)>-1)return Jd(t,r,s);r.forEach(i=>{t.options.ns.indexOf(i)<0&&t.options.ns.push(i)}),t.loadLanguages(e,lv(t,s))},dC=(t,e,r={})=>!e.languages||!e.languages.length?(av(e,\"NO_LANGUAGES\",\"i18n.languages were undefined or empty\",{languages:e.languages}),!0):e.hasLoadedNamespace(t,{lng:r.lng,precheck:(s,i)=>{if(r.bindI18n&&r.bindI18n.indexOf(\"languageChanging\")>-1&&s.services.backendConnector.backend&&s.isLanguageChangingTo&&!i(s.isLanguageChangingTo,t))return!1}}),$o=t=>typeof t==\"string\",fC=t=>typeof t==\"object\"&&t!==null,hC=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,pC={\"&amp;\":\"&\",\"&#38;\":\"&\",\"&lt;\":\"<\",\"&#60;\":\"<\",\"&gt;\":\">\",\"&#62;\":\">\",\"&apos;\":\"'\",\"&#39;\":\"'\",\"&quot;\":'\"',\"&#34;\":'\"',\"&nbsp;\":\" \",\"&#160;\":\" \",\"&copy;\":\"©\",\"&#169;\":\"©\",\"&reg;\":\"®\",\"&#174;\":\"®\",\"&hellip;\":\"…\",\"&#8230;\":\"…\",\"&#x2F;\":\"/\",\"&#47;\":\"/\"},mC=t=>pC[t],gC=t=>t.replace(hC,mC);let Zd={bindI18n:\"languageChanged\",bindI18nStore:\"\",transEmptyNodeValue:\"\",transSupportBasicHtmlNodes:!0,transWrapTextNodes:\"\",transKeepBasicHtmlNodesFor:[\"br\",\"strong\",\"i\",\"p\"],useSuspense:!0,unescape:gC,transDefaultProps:void 0};const yC=(t={})=>{Zd={...Zd,...t}},vC=()=>Zd;let cv;const xC=t=>{cv=t},wC=()=>cv,bC={type:\"3rdParty\",init(t){yC(t.options.react),xC(t)}},SC=x.createContext();class CC{constructor(){this.usedNamespaces={}}addUsedNamespaces(e){e.forEach(r=>{this.usedNamespaces[r]||(this.usedNamespaces[r]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}}var yd={exports:{}},vd={};/**\n * @license React\n * use-sync-external-store-shim.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */var kg;function EC(){if(kg)return vd;kg=1;var t=ac();function e(v,C){return v===C&&(v!==0||1/v===1/C)||v!==v&&C!==C}var r=typeof Object.is==\"function\"?Object.is:e,s=t.useState,i=t.useEffect,l=t.useLayoutEffect,u=t.useDebugValue;function d(v,C){var w=C(),E=s({inst:{value:w,getSnapshot:C}}),b=E[0].inst,k=E[1];return l(function(){b.value=w,b.getSnapshot=C,h(b)&&k({inst:b})},[v,w,C]),i(function(){return h(b)&&k({inst:b}),v(function(){h(b)&&k({inst:b})})},[v]),u(w),w}function h(v){var C=v.getSnapshot;v=v.value;try{var w=C();return!r(v,w)}catch{return!0}}function p(v,C){return C()}var y=typeof window>\"u\"||typeof window.document>\"u\"||typeof window.document.createElement>\"u\"?p:d;return vd.useSyncExternalStore=t.useSyncExternalStore!==void 0?t.useSyncExternalStore:y,vd}var Ng;function kC(){return Ng||(Ng=1,yd.exports=EC()),yd.exports}var NC=kC();const RC=(t,e)=>$o(e)?e:fC(e)&&$o(e.defaultValue)?e.defaultValue:Array.isArray(t)?t[t.length-1]:t,PC={t:RC,ready:!1},TC=()=>()=>{},Zt=(t,e={})=>{var G,W,le;const{i18n:r}=e,{i18n:s,defaultNS:i}=x.useContext(SC)||{},l=r||s||wC();l&&!l.reportNamespaces&&(l.reportNamespaces=new CC),l||av(l,\"NO_I18NEXT_INSTANCE\",\"useTranslation: You will need to pass in an i18next instance by using initReactI18next\");const u=x.useMemo(()=>{var K;return{...vC(),...(K=l==null?void 0:l.options)==null?void 0:K.react,...e}},[l,e]),{useSuspense:d,keyPrefix:h}=u,p=t||i||((G=l==null?void 0:l.options)==null?void 0:G.defaultNS),y=$o(p)?[p]:p||[\"translation\"],v=x.useMemo(()=>y,y);(le=(W=l==null?void 0:l.reportNamespaces)==null?void 0:W.addUsedNamespaces)==null||le.call(W,v);const C=x.useRef(0),w=x.useCallback(K=>{if(!l)return TC;const{bindI18n:Z,bindI18nStore:J}=u,de=()=>{C.current+=1,K()};return Z&&l.on(Z,de),J&&l.store.on(J,de),()=>{Z&&Z.split(\" \").forEach(ne=>l.off(ne,de)),J&&J.split(\" \").forEach(ne=>l.store.off(ne,de))}},[l,u]),E=x.useRef(),b=x.useCallback(()=>{if(!l)return PC;const K=!!(l.isInitialized||l.initializedStoreOnce)&&v.every($=>dC($,l,u)),Z=e.lng||l.language,J=C.current,de=E.current;if(de&&de.ready===K&&de.lng===Z&&de.keyPrefix===h&&de.revision===J)return de;const se={t:l.getFixedT(Z,u.nsMode===\"fallback\"?v:v[0],h),ready:K,lng:Z,keyPrefix:h,revision:J};return E.current=se,se},[l,v,h,u,e.lng]),[k,T]=x.useState(0),{t:j,ready:_}=NC.useSyncExternalStore(w,b,b);x.useEffect(()=>{if(l&&!_&&!d){const K=()=>T(Z=>Z+1);e.lng?Eg(l,e.lng,v,K):Jd(l,v,K)}},[l,e.lng,v,_,d,k]);const A=l||{},F=x.useRef(null),V=x.useRef(),B=K=>{const Z=Object.getOwnPropertyDescriptors(K);Z.__original&&delete Z.__original;const J=Object.create(Object.getPrototypeOf(K),Z);if(!Object.prototype.hasOwnProperty.call(J,\"__original\"))try{Object.defineProperty(J,\"__original\",{value:K,writable:!1,enumerable:!1,configurable:!1})}catch{}return J},te=x.useMemo(()=>{const K=A,Z=K==null?void 0:K.language;let J=K;K&&(F.current&&F.current.__original===K?V.current!==Z?(J=B(K),F.current=J,V.current=Z):J=F.current:(J=B(K),F.current=J,V.current=Z));const de=[j,J,_];return de.t=j,de.i18n=J,de.ready=_,de},[j,A,_,A.resolvedLanguage,A.language,A.languages]);if(l&&d&&!_)throw new Promise(K=>{const Z=()=>K();e.lng?Eg(l,e.lng,v,Z):Jd(l,v,Z)});return te};function uv(t){var e,r,s=\"\";if(typeof t==\"string\"||typeof t==\"number\")s+=t;else if(typeof t==\"object\")if(Array.isArray(t)){var i=t.length;for(e=0;e<i;e++)t[e]&&(r=uv(t[e]))&&(s&&(s+=\" \"),s+=r)}else for(r in t)t[r]&&(s&&(s+=\" \"),s+=r);return s}function dv(){for(var t,e,r=0,s=\"\",i=arguments.length;r<i;r++)(t=arguments[r])&&(e=uv(t))&&(s&&(s+=\" \"),s+=e);return s}const Rg=t=>typeof t==\"boolean\"?`${t}`:t===0?\"0\":t,Pg=dv,_f=(t,e)=>r=>{var s;if((e==null?void 0:e.variants)==null)return Pg(t,r==null?void 0:r.class,r==null?void 0:r.className);const{variants:i,defaultVariants:l}=e,u=Object.keys(i).map(p=>{const y=r==null?void 0:r[p],v=l==null?void 0:l[p];if(y===null)return null;const C=Rg(y)||Rg(v);return i[p][C]}),d=r&&Object.entries(r).reduce((p,y)=>{let[v,C]=y;return C===void 0||(p[v]=C),p},{}),h=e==null||(s=e.compoundVariants)===null||s===void 0?void 0:s.reduce((p,y)=>{let{class:v,className:C,...w}=y;return Object.entries(w).every(E=>{let[b,k]=E;return Array.isArray(k)?k.includes({...l,...d}[b]):{...l,...d}[b]===k})?[...p,v,C]:p},[]);return Pg(t,u,h,r==null?void 0:r.class,r==null?void 0:r.className)},Af=\"-\",OC=t=>{const e=_C(t),{conflictingClassGroups:r,conflictingClassGroupModifiers:s}=t;return{getClassGroupId:u=>{const d=u.split(Af);return d[0]===\"\"&&d.length!==1&&d.shift(),fv(d,e)||jC(u)},getConflictingClassGroupIds:(u,d)=>{const h=r[u]||[];return d&&s[u]?[...h,...s[u]]:h}}},fv=(t,e)=>{var u;if(t.length===0)return e.classGroupId;const r=t[0],s=e.nextPart.get(r),i=s?fv(t.slice(1),s):void 0;if(i)return i;if(e.validators.length===0)return;const l=t.join(Af);return(u=e.validators.find(({validator:d})=>d(l)))==null?void 0:u.classGroupId},Tg=/^\\[(.+)\\]$/,jC=t=>{if(Tg.test(t)){const e=Tg.exec(t)[1],r=e==null?void 0:e.substring(0,e.indexOf(\":\"));if(r)return\"arbitrary..\"+r}},_C=t=>{const{theme:e,prefix:r}=t,s={nextPart:new Map,validators:[]};return LC(Object.entries(t.classGroups),r).forEach(([l,u])=>{ef(u,s,l,e)}),s},ef=(t,e,r,s)=>{t.forEach(i=>{if(typeof i==\"string\"){const l=i===\"\"?e:Og(e,i);l.classGroupId=r;return}if(typeof i==\"function\"){if(AC(i)){ef(i(s),e,r,s);return}e.validators.push({validator:i,classGroupId:r});return}Object.entries(i).forEach(([l,u])=>{ef(u,Og(e,l),r,s)})})},Og=(t,e)=>{let r=t;return e.split(Af).forEach(s=>{r.nextPart.has(s)||r.nextPart.set(s,{nextPart:new Map,validators:[]}),r=r.nextPart.get(s)}),r},AC=t=>t.isThemeGetter,LC=(t,e)=>e?t.map(([r,s])=>{const i=s.map(l=>typeof l==\"string\"?e+l:typeof l==\"object\"?Object.fromEntries(Object.entries(l).map(([u,d])=>[e+u,d])):l);return[r,i]}):t,IC=t=>{if(t<1)return{get:()=>{},set:()=>{}};let e=0,r=new Map,s=new Map;const i=(l,u)=>{r.set(l,u),e++,e>t&&(e=0,s=r,r=new Map)};return{get(l){let u=r.get(l);if(u!==void 0)return u;if((u=s.get(l))!==void 0)return i(l,u),u},set(l,u){r.has(l)?r.set(l,u):i(l,u)}}},hv=\"!\",DC=t=>{const{separator:e,experimentalParseClassName:r}=t,s=e.length===1,i=e[0],l=e.length,u=d=>{const h=[];let p=0,y=0,v;for(let k=0;k<d.length;k++){let T=d[k];if(p===0){if(T===i&&(s||d.slice(k,k+l)===e)){h.push(d.slice(y,k)),y=k+l;continue}if(T===\"/\"){v=k;continue}}T===\"[\"?p++:T===\"]\"&&p--}const C=h.length===0?d:d.substring(y),w=C.startsWith(hv),E=w?C.substring(1):C,b=v&&v>y?v-y:void 0;return{modifiers:h,hasImportantModifier:w,baseClassName:E,maybePostfixModifierPosition:b}};return r?d=>r({className:d,parseClassName:u}):u},MC=t=>{if(t.length<=1)return t;const e=[];let r=[];return t.forEach(s=>{s[0]===\"[\"?(e.push(...r.sort(),s),r=[]):r.push(s)}),e.push(...r.sort()),e},FC=t=>({cache:IC(t.cacheSize),parseClassName:DC(t),...OC(t)}),zC=/\\s+/,$C=(t,e)=>{const{parseClassName:r,getClassGroupId:s,getConflictingClassGroupIds:i}=e,l=[],u=t.trim().split(zC);let d=\"\";for(let h=u.length-1;h>=0;h-=1){const p=u[h],{modifiers:y,hasImportantModifier:v,baseClassName:C,maybePostfixModifierPosition:w}=r(p);let E=!!w,b=s(E?C.substring(0,w):C);if(!b){if(!E){d=p+(d.length>0?\" \"+d:d);continue}if(b=s(C),!b){d=p+(d.length>0?\" \"+d:d);continue}E=!1}const k=MC(y).join(\":\"),T=v?k+hv:k,j=T+b;if(l.includes(j))continue;l.push(j);const _=i(b,E);for(let A=0;A<_.length;++A){const F=_[A];l.push(T+F)}d=p+(d.length>0?\" \"+d:d)}return d};function UC(){let t=0,e,r,s=\"\";for(;t<arguments.length;)(e=arguments[t++])&&(r=pv(e))&&(s&&(s+=\" \"),s+=r);return s}const pv=t=>{if(typeof t==\"string\")return t;let e,r=\"\";for(let s=0;s<t.length;s++)t[s]&&(e=pv(t[s]))&&(r&&(r+=\" \"),r+=e);return r};function BC(t,...e){let r,s,i,l=u;function u(h){const p=e.reduce((y,v)=>v(y),t());return r=FC(p),s=r.cache.get,i=r.cache.set,l=d,d(h)}function d(h){const p=s(h);if(p)return p;const y=$C(h,r);return i(h,y),y}return function(){return l(UC.apply(null,arguments))}}const Qe=t=>{const e=r=>r[t]||[];return e.isThemeGetter=!0,e},mv=/^\\[(?:([a-z-]+):)?(.+)\\]$/i,HC=/^\\d+\\/\\d+$/,VC=new Set([\"px\",\"full\",\"screen\"]),WC=/^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/,KC=/\\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\\b(calc|min|max|clamp)\\(.+\\)|^0$/,qC=/^(rgba?|hsla?|hwb|(ok)?(lab|lch))\\(.+\\)$/,QC=/^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/,YC=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/,ur=t=>Rs(t)||VC.has(t)||HC.test(t),Br=t=>qs(t,\"length\",rE),Rs=t=>!!t&&!Number.isNaN(Number(t)),xd=t=>qs(t,\"number\",Rs),Fi=t=>!!t&&Number.isInteger(Number(t)),GC=t=>t.endsWith(\"%\")&&Rs(t.slice(0,-1)),Pe=t=>mv.test(t),Hr=t=>WC.test(t),XC=new Set([\"length\",\"size\",\"percentage\"]),JC=t=>qs(t,XC,gv),ZC=t=>qs(t,\"position\",gv),eE=new Set([\"image\",\"url\"]),tE=t=>qs(t,eE,sE),nE=t=>qs(t,\"\",oE),zi=()=>!0,qs=(t,e,r)=>{const s=mv.exec(t);return s?s[1]?typeof e==\"string\"?s[1]===e:e.has(s[1]):r(s[2]):!1},rE=t=>KC.test(t)&&!qC.test(t),gv=()=>!1,oE=t=>QC.test(t),sE=t=>YC.test(t),iE=()=>{const t=Qe(\"colors\"),e=Qe(\"spacing\"),r=Qe(\"blur\"),s=Qe(\"brightness\"),i=Qe(\"borderColor\"),l=Qe(\"borderRadius\"),u=Qe(\"borderSpacing\"),d=Qe(\"borderWidth\"),h=Qe(\"contrast\"),p=Qe(\"grayscale\"),y=Qe(\"hueRotate\"),v=Qe(\"invert\"),C=Qe(\"gap\"),w=Qe(\"gradientColorStops\"),E=Qe(\"gradientColorStopPositions\"),b=Qe(\"inset\"),k=Qe(\"margin\"),T=Qe(\"opacity\"),j=Qe(\"padding\"),_=Qe(\"saturate\"),A=Qe(\"scale\"),F=Qe(\"sepia\"),V=Qe(\"skew\"),B=Qe(\"space\"),te=Qe(\"translate\"),G=()=>[\"auto\",\"contain\",\"none\"],W=()=>[\"auto\",\"hidden\",\"clip\",\"visible\",\"scroll\"],le=()=>[\"auto\",Pe,e],K=()=>[Pe,e],Z=()=>[\"\",ur,Br],J=()=>[\"auto\",Rs,Pe],de=()=>[\"bottom\",\"center\",\"left\",\"left-bottom\",\"left-top\",\"right\",\"right-bottom\",\"right-top\",\"top\"],ne=()=>[\"solid\",\"dashed\",\"dotted\",\"double\",\"none\"],se=()=>[\"normal\",\"multiply\",\"screen\",\"overlay\",\"darken\",\"lighten\",\"color-dodge\",\"color-burn\",\"hard-light\",\"soft-light\",\"difference\",\"exclusion\",\"hue\",\"saturation\",\"color\",\"luminosity\"],$=()=>[\"start\",\"end\",\"center\",\"between\",\"around\",\"evenly\",\"stretch\"],H=()=>[\"\",\"0\",Pe],Q=()=>[\"auto\",\"avoid\",\"all\",\"avoid-page\",\"page\",\"left\",\"right\",\"column\"],P=()=>[Rs,Pe];return{cacheSize:500,separator:\":\",theme:{colors:[zi],spacing:[ur,Br],blur:[\"none\",\"\",Hr,Pe],brightness:P(),borderColor:[t],borderRadius:[\"none\",\"\",\"full\",Hr,Pe],borderSpacing:K(),borderWidth:Z(),contrast:P(),grayscale:H(),hueRotate:P(),invert:H(),gap:K(),gradientColorStops:[t],gradientColorStopPositions:[GC,Br],inset:le(),margin:le(),opacity:P(),padding:K(),saturate:P(),scale:P(),sepia:H(),skew:P(),space:K(),translate:K()},classGroups:{aspect:[{aspect:[\"auto\",\"square\",\"video\",Pe]}],container:[\"container\"],columns:[{columns:[Hr]}],\"break-after\":[{\"break-after\":Q()}],\"break-before\":[{\"break-before\":Q()}],\"break-inside\":[{\"break-inside\":[\"auto\",\"avoid\",\"avoid-page\",\"avoid-column\"]}],\"box-decoration\":[{\"box-decoration\":[\"slice\",\"clone\"]}],box:[{box:[\"border\",\"content\"]}],display:[\"block\",\"inline-block\",\"inline\",\"flex\",\"inline-flex\",\"table\",\"inline-table\",\"table-caption\",\"table-cell\",\"table-column\",\"table-column-group\",\"table-footer-group\",\"table-header-group\",\"table-row-group\",\"table-row\",\"flow-root\",\"grid\",\"inline-grid\",\"contents\",\"list-item\",\"hidden\"],float:[{float:[\"right\",\"left\",\"none\",\"start\",\"end\"]}],clear:[{clear:[\"left\",\"right\",\"both\",\"none\",\"start\",\"end\"]}],isolation:[\"isolate\",\"isolation-auto\"],\"object-fit\":[{object:[\"contain\",\"cover\",\"fill\",\"none\",\"scale-down\"]}],\"object-position\":[{object:[...de(),Pe]}],overflow:[{overflow:W()}],\"overflow-x\":[{\"overflow-x\":W()}],\"overflow-y\":[{\"overflow-y\":W()}],overscroll:[{overscroll:G()}],\"overscroll-x\":[{\"overscroll-x\":G()}],\"overscroll-y\":[{\"overscroll-y\":G()}],position:[\"static\",\"fixed\",\"absolute\",\"relative\",\"sticky\"],inset:[{inset:[b]}],\"inset-x\":[{\"inset-x\":[b]}],\"inset-y\":[{\"inset-y\":[b]}],start:[{start:[b]}],end:[{end:[b]}],top:[{top:[b]}],right:[{right:[b]}],bottom:[{bottom:[b]}],left:[{left:[b]}],visibility:[\"visible\",\"invisible\",\"collapse\"],z:[{z:[\"auto\",Fi,Pe]}],basis:[{basis:le()}],\"flex-direction\":[{flex:[\"row\",\"row-reverse\",\"col\",\"col-reverse\"]}],\"flex-wrap\":[{flex:[\"wrap\",\"wrap-reverse\",\"nowrap\"]}],flex:[{flex:[\"1\",\"auto\",\"initial\",\"none\",Pe]}],grow:[{grow:H()}],shrink:[{shrink:H()}],order:[{order:[\"first\",\"last\",\"none\",Fi,Pe]}],\"grid-cols\":[{\"grid-cols\":[zi]}],\"col-start-end\":[{col:[\"auto\",{span:[\"full\",Fi,Pe]},Pe]}],\"col-start\":[{\"col-start\":J()}],\"col-end\":[{\"col-end\":J()}],\"grid-rows\":[{\"grid-rows\":[zi]}],\"row-start-end\":[{row:[\"auto\",{span:[Fi,Pe]},Pe]}],\"row-start\":[{\"row-start\":J()}],\"row-end\":[{\"row-end\":J()}],\"grid-flow\":[{\"grid-flow\":[\"row\",\"col\",\"dense\",\"row-dense\",\"col-dense\"]}],\"auto-cols\":[{\"auto-cols\":[\"auto\",\"min\",\"max\",\"fr\",Pe]}],\"auto-rows\":[{\"auto-rows\":[\"auto\",\"min\",\"max\",\"fr\",Pe]}],gap:[{gap:[C]}],\"gap-x\":[{\"gap-x\":[C]}],\"gap-y\":[{\"gap-y\":[C]}],\"justify-content\":[{justify:[\"normal\",...$()]}],\"justify-items\":[{\"justify-items\":[\"start\",\"end\",\"center\",\"stretch\"]}],\"justify-self\":[{\"justify-self\":[\"auto\",\"start\",\"end\",\"center\",\"stretch\"]}],\"align-content\":[{content:[\"normal\",...$(),\"baseline\"]}],\"align-items\":[{items:[\"start\",\"end\",\"center\",\"baseline\",\"stretch\"]}],\"align-self\":[{self:[\"auto\",\"start\",\"end\",\"center\",\"stretch\",\"baseline\"]}],\"place-content\":[{\"place-content\":[...$(),\"baseline\"]}],\"place-items\":[{\"place-items\":[\"start\",\"end\",\"center\",\"baseline\",\"stretch\"]}],\"place-self\":[{\"place-self\":[\"auto\",\"start\",\"end\",\"center\",\"stretch\"]}],p:[{p:[j]}],px:[{px:[j]}],py:[{py:[j]}],ps:[{ps:[j]}],pe:[{pe:[j]}],pt:[{pt:[j]}],pr:[{pr:[j]}],pb:[{pb:[j]}],pl:[{pl:[j]}],m:[{m:[k]}],mx:[{mx:[k]}],my:[{my:[k]}],ms:[{ms:[k]}],me:[{me:[k]}],mt:[{mt:[k]}],mr:[{mr:[k]}],mb:[{mb:[k]}],ml:[{ml:[k]}],\"space-x\":[{\"space-x\":[B]}],\"space-x-reverse\":[\"space-x-reverse\"],\"space-y\":[{\"space-y\":[B]}],\"space-y-reverse\":[\"space-y-reverse\"],w:[{w:[\"auto\",\"min\",\"max\",\"fit\",\"svw\",\"lvw\",\"dvw\",Pe,e]}],\"min-w\":[{\"min-w\":[Pe,e,\"min\",\"max\",\"fit\"]}],\"max-w\":[{\"max-w\":[Pe,e,\"none\",\"full\",\"min\",\"max\",\"fit\",\"prose\",{screen:[Hr]},Hr]}],h:[{h:[Pe,e,\"auto\",\"min\",\"max\",\"fit\",\"svh\",\"lvh\",\"dvh\"]}],\"min-h\":[{\"min-h\":[Pe,e,\"min\",\"max\",\"fit\",\"svh\",\"lvh\",\"dvh\"]}],\"max-h\":[{\"max-h\":[Pe,e,\"min\",\"max\",\"fit\",\"svh\",\"lvh\",\"dvh\"]}],size:[{size:[Pe,e,\"auto\",\"min\",\"max\",\"fit\"]}],\"font-size\":[{text:[\"base\",Hr,Br]}],\"font-smoothing\":[\"antialiased\",\"subpixel-antialiased\"],\"font-style\":[\"italic\",\"not-italic\"],\"font-weight\":[{font:[\"thin\",\"extralight\",\"light\",\"normal\",\"medium\",\"semibold\",\"bold\",\"extrabold\",\"black\",xd]}],\"font-family\":[{font:[zi]}],\"fvn-normal\":[\"normal-nums\"],\"fvn-ordinal\":[\"ordinal\"],\"fvn-slashed-zero\":[\"slashed-zero\"],\"fvn-figure\":[\"lining-nums\",\"oldstyle-nums\"],\"fvn-spacing\":[\"proportional-nums\",\"tabular-nums\"],\"fvn-fraction\":[\"diagonal-fractions\",\"stacked-fractions\"],tracking:[{tracking:[\"tighter\",\"tight\",\"normal\",\"wide\",\"wider\",\"widest\",Pe]}],\"line-clamp\":[{\"line-clamp\":[\"none\",Rs,xd]}],leading:[{leading:[\"none\",\"tight\",\"snug\",\"normal\",\"relaxed\",\"loose\",ur,Pe]}],\"list-image\":[{\"list-image\":[\"none\",Pe]}],\"list-style-type\":[{list:[\"none\",\"disc\",\"decimal\",Pe]}],\"list-style-position\":[{list:[\"inside\",\"outside\"]}],\"placeholder-color\":[{placeholder:[t]}],\"placeholder-opacity\":[{\"placeholder-opacity\":[T]}],\"text-alignment\":[{text:[\"left\",\"center\",\"right\",\"justify\",\"start\",\"end\"]}],\"text-color\":[{text:[t]}],\"text-opacity\":[{\"text-opacity\":[T]}],\"text-decoration\":[\"underline\",\"overline\",\"line-through\",\"no-underline\"],\"text-decoration-style\":[{decoration:[...ne(),\"wavy\"]}],\"text-decoration-thickness\":[{decoration:[\"auto\",\"from-font\",ur,Br]}],\"underline-offset\":[{\"underline-offset\":[\"auto\",ur,Pe]}],\"text-decoration-color\":[{decoration:[t]}],\"text-transform\":[\"uppercase\",\"lowercase\",\"capitalize\",\"normal-case\"],\"text-overflow\":[\"truncate\",\"text-ellipsis\",\"text-clip\"],\"text-wrap\":[{text:[\"wrap\",\"nowrap\",\"balance\",\"pretty\"]}],indent:[{indent:K()}],\"vertical-align\":[{align:[\"baseline\",\"top\",\"middle\",\"bottom\",\"text-top\",\"text-bottom\",\"sub\",\"super\",Pe]}],whitespace:[{whitespace:[\"normal\",\"nowrap\",\"pre\",\"pre-line\",\"pre-wrap\",\"break-spaces\"]}],break:[{break:[\"normal\",\"words\",\"all\",\"keep\"]}],hyphens:[{hyphens:[\"none\",\"manual\",\"auto\"]}],content:[{content:[\"none\",Pe]}],\"bg-attachment\":[{bg:[\"fixed\",\"local\",\"scroll\"]}],\"bg-clip\":[{\"bg-clip\":[\"border\",\"padding\",\"content\",\"text\"]}],\"bg-opacity\":[{\"bg-opacity\":[T]}],\"bg-origin\":[{\"bg-origin\":[\"border\",\"padding\",\"content\"]}],\"bg-position\":[{bg:[...de(),ZC]}],\"bg-repeat\":[{bg:[\"no-repeat\",{repeat:[\"\",\"x\",\"y\",\"round\",\"space\"]}]}],\"bg-size\":[{bg:[\"auto\",\"cover\",\"contain\",JC]}],\"bg-image\":[{bg:[\"none\",{\"gradient-to\":[\"t\",\"tr\",\"r\",\"br\",\"b\",\"bl\",\"l\",\"tl\"]},tE]}],\"bg-color\":[{bg:[t]}],\"gradient-from-pos\":[{from:[E]}],\"gradient-via-pos\":[{via:[E]}],\"gradient-to-pos\":[{to:[E]}],\"gradient-from\":[{from:[w]}],\"gradient-via\":[{via:[w]}],\"gradient-to\":[{to:[w]}],rounded:[{rounded:[l]}],\"rounded-s\":[{\"rounded-s\":[l]}],\"rounded-e\":[{\"rounded-e\":[l]}],\"rounded-t\":[{\"rounded-t\":[l]}],\"rounded-r\":[{\"rounded-r\":[l]}],\"rounded-b\":[{\"rounded-b\":[l]}],\"rounded-l\":[{\"rounded-l\":[l]}],\"rounded-ss\":[{\"rounded-ss\":[l]}],\"rounded-se\":[{\"rounded-se\":[l]}],\"rounded-ee\":[{\"rounded-ee\":[l]}],\"rounded-es\":[{\"rounded-es\":[l]}],\"rounded-tl\":[{\"rounded-tl\":[l]}],\"rounded-tr\":[{\"rounded-tr\":[l]}],\"rounded-br\":[{\"rounded-br\":[l]}],\"rounded-bl\":[{\"rounded-bl\":[l]}],\"border-w\":[{border:[d]}],\"border-w-x\":[{\"border-x\":[d]}],\"border-w-y\":[{\"border-y\":[d]}],\"border-w-s\":[{\"border-s\":[d]}],\"border-w-e\":[{\"border-e\":[d]}],\"border-w-t\":[{\"border-t\":[d]}],\"border-w-r\":[{\"border-r\":[d]}],\"border-w-b\":[{\"border-b\":[d]}],\"border-w-l\":[{\"border-l\":[d]}],\"border-opacity\":[{\"border-opacity\":[T]}],\"border-style\":[{border:[...ne(),\"hidden\"]}],\"divide-x\":[{\"divide-x\":[d]}],\"divide-x-reverse\":[\"divide-x-reverse\"],\"divide-y\":[{\"divide-y\":[d]}],\"divide-y-reverse\":[\"divide-y-reverse\"],\"divide-opacity\":[{\"divide-opacity\":[T]}],\"divide-style\":[{divide:ne()}],\"border-color\":[{border:[i]}],\"border-color-x\":[{\"border-x\":[i]}],\"border-color-y\":[{\"border-y\":[i]}],\"border-color-s\":[{\"border-s\":[i]}],\"border-color-e\":[{\"border-e\":[i]}],\"border-color-t\":[{\"border-t\":[i]}],\"border-color-r\":[{\"border-r\":[i]}],\"border-color-b\":[{\"border-b\":[i]}],\"border-color-l\":[{\"border-l\":[i]}],\"divide-color\":[{divide:[i]}],\"outline-style\":[{outline:[\"\",...ne()]}],\"outline-offset\":[{\"outline-offset\":[ur,Pe]}],\"outline-w\":[{outline:[ur,Br]}],\"outline-color\":[{outline:[t]}],\"ring-w\":[{ring:Z()}],\"ring-w-inset\":[\"ring-inset\"],\"ring-color\":[{ring:[t]}],\"ring-opacity\":[{\"ring-opacity\":[T]}],\"ring-offset-w\":[{\"ring-offset\":[ur,Br]}],\"ring-offset-color\":[{\"ring-offset\":[t]}],shadow:[{shadow:[\"\",\"inner\",\"none\",Hr,nE]}],\"shadow-color\":[{shadow:[zi]}],opacity:[{opacity:[T]}],\"mix-blend\":[{\"mix-blend\":[...se(),\"plus-lighter\",\"plus-darker\"]}],\"bg-blend\":[{\"bg-blend\":se()}],filter:[{filter:[\"\",\"none\"]}],blur:[{blur:[r]}],brightness:[{brightness:[s]}],contrast:[{contrast:[h]}],\"drop-shadow\":[{\"drop-shadow\":[\"\",\"none\",Hr,Pe]}],grayscale:[{grayscale:[p]}],\"hue-rotate\":[{\"hue-rotate\":[y]}],invert:[{invert:[v]}],saturate:[{saturate:[_]}],sepia:[{sepia:[F]}],\"backdrop-filter\":[{\"backdrop-filter\":[\"\",\"none\"]}],\"backdrop-blur\":[{\"backdrop-blur\":[r]}],\"backdrop-brightness\":[{\"backdrop-brightness\":[s]}],\"backdrop-contrast\":[{\"backdrop-contrast\":[h]}],\"backdrop-grayscale\":[{\"backdrop-grayscale\":[p]}],\"backdrop-hue-rotate\":[{\"backdrop-hue-rotate\":[y]}],\"backdrop-invert\":[{\"backdrop-invert\":[v]}],\"backdrop-opacity\":[{\"backdrop-opacity\":[T]}],\"backdrop-saturate\":[{\"backdrop-saturate\":[_]}],\"backdrop-sepia\":[{\"backdrop-sepia\":[F]}],\"border-collapse\":[{border:[\"collapse\",\"separate\"]}],\"border-spacing\":[{\"border-spacing\":[u]}],\"border-spacing-x\":[{\"border-spacing-x\":[u]}],\"border-spacing-y\":[{\"border-spacing-y\":[u]}],\"table-layout\":[{table:[\"auto\",\"fixed\"]}],caption:[{caption:[\"top\",\"bottom\"]}],transition:[{transition:[\"none\",\"all\",\"\",\"colors\",\"opacity\",\"shadow\",\"transform\",Pe]}],duration:[{duration:P()}],ease:[{ease:[\"linear\",\"in\",\"out\",\"in-out\",Pe]}],delay:[{delay:P()}],animate:[{animate:[\"none\",\"spin\",\"ping\",\"pulse\",\"bounce\",Pe]}],transform:[{transform:[\"\",\"gpu\",\"none\"]}],scale:[{scale:[A]}],\"scale-x\":[{\"scale-x\":[A]}],\"scale-y\":[{\"scale-y\":[A]}],rotate:[{rotate:[Fi,Pe]}],\"translate-x\":[{\"translate-x\":[te]}],\"translate-y\":[{\"translate-y\":[te]}],\"skew-x\":[{\"skew-x\":[V]}],\"skew-y\":[{\"skew-y\":[V]}],\"transform-origin\":[{origin:[\"center\",\"top\",\"top-right\",\"right\",\"bottom-right\",\"bottom\",\"bottom-left\",\"left\",\"top-left\",Pe]}],accent:[{accent:[\"auto\",t]}],appearance:[{appearance:[\"none\",\"auto\"]}],cursor:[{cursor:[\"auto\",\"default\",\"pointer\",\"wait\",\"text\",\"move\",\"help\",\"not-allowed\",\"none\",\"context-menu\",\"progress\",\"cell\",\"crosshair\",\"vertical-text\",\"alias\",\"copy\",\"no-drop\",\"grab\",\"grabbing\",\"all-scroll\",\"col-resize\",\"row-resize\",\"n-resize\",\"e-resize\",\"s-resize\",\"w-resize\",\"ne-resize\",\"nw-resize\",\"se-resize\",\"sw-resize\",\"ew-resize\",\"ns-resize\",\"nesw-resize\",\"nwse-resize\",\"zoom-in\",\"zoom-out\",Pe]}],\"caret-color\":[{caret:[t]}],\"pointer-events\":[{\"pointer-events\":[\"none\",\"auto\"]}],resize:[{resize:[\"none\",\"y\",\"x\",\"\"]}],\"scroll-behavior\":[{scroll:[\"auto\",\"smooth\"]}],\"scroll-m\":[{\"scroll-m\":K()}],\"scroll-mx\":[{\"scroll-mx\":K()}],\"scroll-my\":[{\"scroll-my\":K()}],\"scroll-ms\":[{\"scroll-ms\":K()}],\"scroll-me\":[{\"scroll-me\":K()}],\"scroll-mt\":[{\"scroll-mt\":K()}],\"scroll-mr\":[{\"scroll-mr\":K()}],\"scroll-mb\":[{\"scroll-mb\":K()}],\"scroll-ml\":[{\"scroll-ml\":K()}],\"scroll-p\":[{\"scroll-p\":K()}],\"scroll-px\":[{\"scroll-px\":K()}],\"scroll-py\":[{\"scroll-py\":K()}],\"scroll-ps\":[{\"scroll-ps\":K()}],\"scroll-pe\":[{\"scroll-pe\":K()}],\"scroll-pt\":[{\"scroll-pt\":K()}],\"scroll-pr\":[{\"scroll-pr\":K()}],\"scroll-pb\":[{\"scroll-pb\":K()}],\"scroll-pl\":[{\"scroll-pl\":K()}],\"snap-align\":[{snap:[\"start\",\"end\",\"center\",\"align-none\"]}],\"snap-stop\":[{snap:[\"normal\",\"always\"]}],\"snap-type\":[{snap:[\"none\",\"x\",\"y\",\"both\"]}],\"snap-strictness\":[{snap:[\"mandatory\",\"proximity\"]}],touch:[{touch:[\"auto\",\"none\",\"manipulation\"]}],\"touch-x\":[{\"touch-pan\":[\"x\",\"left\",\"right\"]}],\"touch-y\":[{\"touch-pan\":[\"y\",\"up\",\"down\"]}],\"touch-pz\":[\"touch-pinch-zoom\"],select:[{select:[\"none\",\"text\",\"all\",\"auto\"]}],\"will-change\":[{\"will-change\":[\"auto\",\"scroll\",\"contents\",\"transform\",Pe]}],fill:[{fill:[t,\"none\"]}],\"stroke-w\":[{stroke:[ur,Br,xd]}],stroke:[{stroke:[t,\"none\"]}],sr:[\"sr-only\",\"not-sr-only\"],\"forced-color-adjust\":[{\"forced-color-adjust\":[\"auto\",\"none\"]}]},conflictingClassGroups:{overflow:[\"overflow-x\",\"overflow-y\"],overscroll:[\"overscroll-x\",\"overscroll-y\"],inset:[\"inset-x\",\"inset-y\",\"start\",\"end\",\"top\",\"right\",\"bottom\",\"left\"],\"inset-x\":[\"right\",\"left\"],\"inset-y\":[\"top\",\"bottom\"],flex:[\"basis\",\"grow\",\"shrink\"],gap:[\"gap-x\",\"gap-y\"],p:[\"px\",\"py\",\"ps\",\"pe\",\"pt\",\"pr\",\"pb\",\"pl\"],px:[\"pr\",\"pl\"],py:[\"pt\",\"pb\"],m:[\"mx\",\"my\",\"ms\",\"me\",\"mt\",\"mr\",\"mb\",\"ml\"],mx:[\"mr\",\"ml\"],my:[\"mt\",\"mb\"],size:[\"w\",\"h\"],\"font-size\":[\"leading\"],\"fvn-normal\":[\"fvn-ordinal\",\"fvn-slashed-zero\",\"fvn-figure\",\"fvn-spacing\",\"fvn-fraction\"],\"fvn-ordinal\":[\"fvn-normal\"],\"fvn-slashed-zero\":[\"fvn-normal\"],\"fvn-figure\":[\"fvn-normal\"],\"fvn-spacing\":[\"fvn-normal\"],\"fvn-fraction\":[\"fvn-normal\"],\"line-clamp\":[\"display\",\"overflow\"],rounded:[\"rounded-s\",\"rounded-e\",\"rounded-t\",\"rounded-r\",\"rounded-b\",\"rounded-l\",\"rounded-ss\",\"rounded-se\",\"rounded-ee\",\"rounded-es\",\"rounded-tl\",\"rounded-tr\",\"rounded-br\",\"rounded-bl\"],\"rounded-s\":[\"rounded-ss\",\"rounded-es\"],\"rounded-e\":[\"rounded-se\",\"rounded-ee\"],\"rounded-t\":[\"rounded-tl\",\"rounded-tr\"],\"rounded-r\":[\"rounded-tr\",\"rounded-br\"],\"rounded-b\":[\"rounded-br\",\"rounded-bl\"],\"rounded-l\":[\"rounded-tl\",\"rounded-bl\"],\"border-spacing\":[\"border-spacing-x\",\"border-spacing-y\"],\"border-w\":[\"border-w-s\",\"border-w-e\",\"border-w-t\",\"border-w-r\",\"border-w-b\",\"border-w-l\"],\"border-w-x\":[\"border-w-r\",\"border-w-l\"],\"border-w-y\":[\"border-w-t\",\"border-w-b\"],\"border-color\":[\"border-color-s\",\"border-color-e\",\"border-color-t\",\"border-color-r\",\"border-color-b\",\"border-color-l\"],\"border-color-x\":[\"border-color-r\",\"border-color-l\"],\"border-color-y\":[\"border-color-t\",\"border-color-b\"],\"scroll-m\":[\"scroll-mx\",\"scroll-my\",\"scroll-ms\",\"scroll-me\",\"scroll-mt\",\"scroll-mr\",\"scroll-mb\",\"scroll-ml\"],\"scroll-mx\":[\"scroll-mr\",\"scroll-ml\"],\"scroll-my\":[\"scroll-mt\",\"scroll-mb\"],\"scroll-p\":[\"scroll-px\",\"scroll-py\",\"scroll-ps\",\"scroll-pe\",\"scroll-pt\",\"scroll-pr\",\"scroll-pb\",\"scroll-pl\"],\"scroll-px\":[\"scroll-pr\",\"scroll-pl\"],\"scroll-py\":[\"scroll-pt\",\"scroll-pb\"],touch:[\"touch-x\",\"touch-y\",\"touch-pz\"],\"touch-x\":[\"touch\"],\"touch-y\":[\"touch\"],\"touch-pz\":[\"touch\"]},conflictingClassGroupModifiers:{\"font-size\":[\"leading\"]}}},aE=BC(iE);function Be(...t){return aE(dv(t))}function lE(t){if(t===0)return\"0 B\";const e=1024,r=[\"B\",\"KB\",\"MB\",\"GB\",\"TB\"],s=Math.floor(Math.log(t)/Math.log(e));return parseFloat((t/Math.pow(e,s)).toFixed(2))+\" \"+r[s]}function cE(t){return(typeof t==\"string\"?new Date(t):typeof t==\"number\"?new Date(t*1e3):t).toLocaleString(\"zh-CN\",{year:\"numeric\",month:\"2-digit\",day:\"2-digit\",hour:\"2-digit\",minute:\"2-digit\"})}const uE=_f(\"inline-flex items-center rounded-sm border px-2 py-0.5 text-xs font-mono transition-colors focus:outline-none\",{variants:{variant:{default:\"border-cyber-neon-cyan/30 bg-cyber-neon-cyan/10 text-cyber-neon-cyan\",secondary:\"border-cyber-border-DEFAULT bg-cyber-bg-tertiary text-cyber-text-secondary\",destructive:\"border-cyber-neon-pink/30 bg-cyber-neon-pink/10 text-cyber-neon-pink\",outline:\"border-cyber-border-DEFAULT text-cyber-text-primary\",success:\"border-cyber-neon-green/30 bg-cyber-neon-green/10 text-cyber-neon-green shadow-glow-green-sm\",warning:\"border-cyber-neon-orange/30 bg-cyber-neon-orange/10 text-cyber-neon-orange\",idle:\"border-cyber-border-DEFAULT bg-cyber-bg-tertiary text-cyber-text-muted\",running:\"border-cyber-neon-green/50 bg-cyber-neon-green/20 text-cyber-neon-green shadow-glow-green-sm animate-pulse-fast\"}},defaultVariants:{variant:\"default\"}});function qi({className:t,variant:e,...r}){return g.jsx(\"div\",{className:Be(uE({variant:e}),t),...r})}const jg=t=>{let e;const r=new Set,s=(p,y)=>{const v=typeof p==\"function\"?p(e):p;if(!Object.is(v,e)){const C=e;e=y??(typeof v!=\"object\"||v===null)?v:Object.assign({},e,v),r.forEach(w=>w(e,C))}},i=()=>e,d={setState:s,getState:i,getInitialState:()=>h,subscribe:p=>(r.add(p),()=>r.delete(p))},h=e=t(s,i,d);return d},dE=(t=>t?jg(t):jg),fE=t=>t;function hE(t,e=fE){const r=oe.useSyncExternalStore(t.subscribe,oe.useCallback(()=>e(t.getState()),[t,e]),oe.useCallback(()=>e(t.getInitialState()),[t,e]));return oe.useDebugValue(r),r}const _g=t=>{const e=dE(t),r=s=>hE(e,s);return Object.assign(r,e),r},yv=(t=>t?_g(t):_g),tf=\"mediacrawler_cleared_log_id\";function pE(){const t=localStorage.getItem(tf);if(t===null)return null;const e=parseInt(t,10);return isNaN(e)?null:e}function Rl(t){t===null?localStorage.removeItem(tf):localStorage.setItem(tf,t.toString())}const mE={platform:\"bili\",login_type:\"qrcode\",crawler_type:\"search\",keywords:\"\",specified_ids:\"\",creator_ids:\"\",start_page:1,enable_comments:!0,enable_sub_comments:!1,save_option:\"json\",cookies:\"\",headless:!1},jt=yv((t,e)=>({status:\"idle\",platform:null,crawlerType:null,startedAt:null,logs:[],clearedAfterLogId:pE(),config:mE,setStatus:r=>{t({status:r}),r===\"running\"&&e().clearedAfterLogId!==null&&(t({clearedAfterLogId:null}),Rl(null))},setRunningInfo:(r,s,i)=>{t({platform:r,crawlerType:s,startedAt:i}),i!==null&&e().clearedAfterLogId!==null&&(t({clearedAfterLogId:null}),Rl(null))},addLog:r=>{const{clearedAfterLogId:s,logs:i}=e();s!==null&&r.id<=s||i.length>0&&i[i.length-1].id===r.id||i.some(l=>l.id===r.id)||t(l=>({logs:[...l.logs.slice(-499),r]}))},setLogs:r=>{const{clearedAfterLogId:s}=e(),i=s!==null?r.filter(l=>l.id>s):r;t({logs:i})},clearLogs:()=>{const{logs:r}=e(),s=r.length>0?Math.max(...r.map(i=>i.id)):0;t({logs:[],clearedAfterLogId:s}),Rl(s)},restoreLogs:()=>{t({clearedAfterLogId:null}),Rl(null),window.location.reload()},updateConfig:r=>t(s=>({config:{...s.config,...r}})),reset:()=>t({status:\"idle\",platform:null,crawlerType:null,startedAt:null})}));function vv(t,e){return function(){return t.apply(e,arguments)}}const{toString:gE}=Object.prototype,{getPrototypeOf:Lf}=Object,{iterator:uc,toStringTag:xv}=Symbol,dc=(t=>e=>{const r=gE.call(e);return t[r]||(t[r]=r.slice(8,-1).toLowerCase())})(Object.create(null)),Pn=t=>(t=t.toLowerCase(),e=>dc(e)===t),fc=t=>e=>typeof e===t,{isArray:Qs}=Array,Hs=fc(\"undefined\");function ra(t){return t!==null&&!Hs(t)&&t.constructor!==null&&!Hs(t.constructor)&&Wt(t.constructor.isBuffer)&&t.constructor.isBuffer(t)}const wv=Pn(\"ArrayBuffer\");function yE(t){let e;return typeof ArrayBuffer<\"u\"&&ArrayBuffer.isView?e=ArrayBuffer.isView(t):e=t&&t.buffer&&wv(t.buffer),e}const vE=fc(\"string\"),Wt=fc(\"function\"),bv=fc(\"number\"),oa=t=>t!==null&&typeof t==\"object\",xE=t=>t===!0||t===!1,Ml=t=>{if(dc(t)!==\"object\")return!1;const e=Lf(t);return(e===null||e===Object.prototype||Object.getPrototypeOf(e)===null)&&!(xv in t)&&!(uc in t)},wE=t=>{if(!oa(t)||ra(t))return!1;try{return Object.keys(t).length===0&&Object.getPrototypeOf(t)===Object.prototype}catch{return!1}},bE=Pn(\"Date\"),SE=Pn(\"File\"),CE=Pn(\"Blob\"),EE=Pn(\"FileList\"),kE=t=>oa(t)&&Wt(t.pipe),NE=t=>{let e;return t&&(typeof FormData==\"function\"&&t instanceof FormData||Wt(t.append)&&((e=dc(t))===\"formdata\"||e===\"object\"&&Wt(t.toString)&&t.toString()===\"[object FormData]\"))},RE=Pn(\"URLSearchParams\"),[PE,TE,OE,jE]=[\"ReadableStream\",\"Request\",\"Response\",\"Headers\"].map(Pn),_E=t=>t.trim?t.trim():t.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\"\");function sa(t,e,{allOwnKeys:r=!1}={}){if(t===null||typeof t>\"u\")return;let s,i;if(typeof t!=\"object\"&&(t=[t]),Qs(t))for(s=0,i=t.length;s<i;s++)e.call(null,t[s],s,t);else{if(ra(t))return;const l=r?Object.getOwnPropertyNames(t):Object.keys(t),u=l.length;let d;for(s=0;s<u;s++)d=l[s],e.call(null,t[d],d,t)}}function Sv(t,e){if(ra(t))return null;e=e.toLowerCase();const r=Object.keys(t);let s=r.length,i;for(;s-- >0;)if(i=r[s],e===i.toLowerCase())return i;return null}const Eo=typeof globalThis<\"u\"?globalThis:typeof self<\"u\"?self:typeof window<\"u\"?window:global,Cv=t=>!Hs(t)&&t!==Eo;function nf(){const{caseless:t,skipUndefined:e}=Cv(this)&&this||{},r={},s=(i,l)=>{const u=t&&Sv(r,l)||l;Ml(r[u])&&Ml(i)?r[u]=nf(r[u],i):Ml(i)?r[u]=nf({},i):Qs(i)?r[u]=i.slice():(!e||!Hs(i))&&(r[u]=i)};for(let i=0,l=arguments.length;i<l;i++)arguments[i]&&sa(arguments[i],s);return r}const AE=(t,e,r,{allOwnKeys:s}={})=>(sa(e,(i,l)=>{r&&Wt(i)?t[l]=vv(i,r):t[l]=i},{allOwnKeys:s}),t),LE=t=>(t.charCodeAt(0)===65279&&(t=t.slice(1)),t),IE=(t,e,r,s)=>{t.prototype=Object.create(e.prototype,s),t.prototype.constructor=t,Object.defineProperty(t,\"super\",{value:e.prototype}),r&&Object.assign(t.prototype,r)},DE=(t,e,r,s)=>{let i,l,u;const d={};if(e=e||{},t==null)return e;do{for(i=Object.getOwnPropertyNames(t),l=i.length;l-- >0;)u=i[l],(!s||s(u,t,e))&&!d[u]&&(e[u]=t[u],d[u]=!0);t=r!==!1&&Lf(t)}while(t&&(!r||r(t,e))&&t!==Object.prototype);return e},ME=(t,e,r)=>{t=String(t),(r===void 0||r>t.length)&&(r=t.length),r-=e.length;const s=t.indexOf(e,r);return s!==-1&&s===r},FE=t=>{if(!t)return null;if(Qs(t))return t;let e=t.length;if(!bv(e))return null;const r=new Array(e);for(;e-- >0;)r[e]=t[e];return r},zE=(t=>e=>t&&e instanceof t)(typeof Uint8Array<\"u\"&&Lf(Uint8Array)),$E=(t,e)=>{const s=(t&&t[uc]).call(t);let i;for(;(i=s.next())&&!i.done;){const l=i.value;e.call(t,l[0],l[1])}},UE=(t,e)=>{let r;const s=[];for(;(r=t.exec(e))!==null;)s.push(r);return s},BE=Pn(\"HTMLFormElement\"),HE=t=>t.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,function(r,s,i){return s.toUpperCase()+i}),Ag=(({hasOwnProperty:t})=>(e,r)=>t.call(e,r))(Object.prototype),VE=Pn(\"RegExp\"),Ev=(t,e)=>{const r=Object.getOwnPropertyDescriptors(t),s={};sa(r,(i,l)=>{let u;(u=e(i,l,t))!==!1&&(s[l]=u||i)}),Object.defineProperties(t,s)},WE=t=>{Ev(t,(e,r)=>{if(Wt(t)&&[\"arguments\",\"caller\",\"callee\"].indexOf(r)!==-1)return!1;const s=t[r];if(Wt(s)){if(e.enumerable=!1,\"writable\"in e){e.writable=!1;return}e.set||(e.set=()=>{throw Error(\"Can not rewrite read-only method '\"+r+\"'\")})}})},KE=(t,e)=>{const r={},s=i=>{i.forEach(l=>{r[l]=!0})};return Qs(t)?s(t):s(String(t).split(e)),r},qE=()=>{},QE=(t,e)=>t!=null&&Number.isFinite(t=+t)?t:e;function YE(t){return!!(t&&Wt(t.append)&&t[xv]===\"FormData\"&&t[uc])}const GE=t=>{const e=new Array(10),r=(s,i)=>{if(oa(s)){if(e.indexOf(s)>=0)return;if(ra(s))return s;if(!(\"toJSON\"in s)){e[i]=s;const l=Qs(s)?[]:{};return sa(s,(u,d)=>{const h=r(u,i+1);!Hs(h)&&(l[d]=h)}),e[i]=void 0,l}}return s};return r(t,0)},XE=Pn(\"AsyncFunction\"),JE=t=>t&&(oa(t)||Wt(t))&&Wt(t.then)&&Wt(t.catch),kv=((t,e)=>t?setImmediate:e?((r,s)=>(Eo.addEventListener(\"message\",({source:i,data:l})=>{i===Eo&&l===r&&s.length&&s.shift()()},!1),i=>{s.push(i),Eo.postMessage(r,\"*\")}))(`axios@${Math.random()}`,[]):r=>setTimeout(r))(typeof setImmediate==\"function\",Wt(Eo.postMessage)),ZE=typeof queueMicrotask<\"u\"?queueMicrotask.bind(Eo):typeof process<\"u\"&&process.nextTick||kv,ek=t=>t!=null&&Wt(t[uc]),U={isArray:Qs,isArrayBuffer:wv,isBuffer:ra,isFormData:NE,isArrayBufferView:yE,isString:vE,isNumber:bv,isBoolean:xE,isObject:oa,isPlainObject:Ml,isEmptyObject:wE,isReadableStream:PE,isRequest:TE,isResponse:OE,isHeaders:jE,isUndefined:Hs,isDate:bE,isFile:SE,isBlob:CE,isRegExp:VE,isFunction:Wt,isStream:kE,isURLSearchParams:RE,isTypedArray:zE,isFileList:EE,forEach:sa,merge:nf,extend:AE,trim:_E,stripBOM:LE,inherits:IE,toFlatObject:DE,kindOf:dc,kindOfTest:Pn,endsWith:ME,toArray:FE,forEachEntry:$E,matchAll:UE,isHTMLForm:BE,hasOwnProperty:Ag,hasOwnProp:Ag,reduceDescriptors:Ev,freezeMethods:WE,toObjectSet:KE,toCamelCase:HE,noop:qE,toFiniteNumber:QE,findKey:Sv,global:Eo,isContextDefined:Cv,isSpecCompliantForm:YE,toJSONObject:GE,isAsyncFn:XE,isThenable:JE,setImmediate:kv,asap:ZE,isIterable:ek};function Re(t,e,r,s,i){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=t,this.name=\"AxiosError\",e&&(this.code=e),r&&(this.config=r),s&&(this.request=s),i&&(this.response=i,this.status=i.status?i.status:null)}U.inherits(Re,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:U.toJSONObject(this.config),code:this.code,status:this.status}}});const Nv=Re.prototype,Rv={};[\"ERR_BAD_OPTION_VALUE\",\"ERR_BAD_OPTION\",\"ECONNABORTED\",\"ETIMEDOUT\",\"ERR_NETWORK\",\"ERR_FR_TOO_MANY_REDIRECTS\",\"ERR_DEPRECATED\",\"ERR_BAD_RESPONSE\",\"ERR_BAD_REQUEST\",\"ERR_CANCELED\",\"ERR_NOT_SUPPORT\",\"ERR_INVALID_URL\"].forEach(t=>{Rv[t]={value:t}});Object.defineProperties(Re,Rv);Object.defineProperty(Nv,\"isAxiosError\",{value:!0});Re.from=(t,e,r,s,i,l)=>{const u=Object.create(Nv);U.toFlatObject(t,u,function(y){return y!==Error.prototype},p=>p!==\"isAxiosError\");const d=t&&t.message?t.message:\"Error\",h=e==null&&t?t.code:e;return Re.call(u,d,h,r,s,i),t&&u.cause==null&&Object.defineProperty(u,\"cause\",{value:t,configurable:!0}),u.name=t&&t.name||\"Error\",l&&Object.assign(u,l),u};const tk=null;function rf(t){return U.isPlainObject(t)||U.isArray(t)}function Pv(t){return U.endsWith(t,\"[]\")?t.slice(0,-2):t}function Lg(t,e,r){return t?t.concat(e).map(function(i,l){return i=Pv(i),!r&&l?\"[\"+i+\"]\":i}).join(r?\".\":\"\"):e}function nk(t){return U.isArray(t)&&!t.some(rf)}const rk=U.toFlatObject(U,{},null,function(e){return/^is[A-Z]/.test(e)});function hc(t,e,r){if(!U.isObject(t))throw new TypeError(\"target must be an object\");e=e||new FormData,r=U.toFlatObject(r,{metaTokens:!0,dots:!1,indexes:!1},!1,function(b,k){return!U.isUndefined(k[b])});const s=r.metaTokens,i=r.visitor||y,l=r.dots,u=r.indexes,h=(r.Blob||typeof Blob<\"u\"&&Blob)&&U.isSpecCompliantForm(e);if(!U.isFunction(i))throw new TypeError(\"visitor must be a function\");function p(E){if(E===null)return\"\";if(U.isDate(E))return E.toISOString();if(U.isBoolean(E))return E.toString();if(!h&&U.isBlob(E))throw new Re(\"Blob is not supported. Use a Buffer instead.\");return U.isArrayBuffer(E)||U.isTypedArray(E)?h&&typeof Blob==\"function\"?new Blob([E]):Buffer.from(E):E}function y(E,b,k){let T=E;if(E&&!k&&typeof E==\"object\"){if(U.endsWith(b,\"{}\"))b=s?b:b.slice(0,-2),E=JSON.stringify(E);else if(U.isArray(E)&&nk(E)||(U.isFileList(E)||U.endsWith(b,\"[]\"))&&(T=U.toArray(E)))return b=Pv(b),T.forEach(function(_,A){!(U.isUndefined(_)||_===null)&&e.append(u===!0?Lg([b],A,l):u===null?b:b+\"[]\",p(_))}),!1}return rf(E)?!0:(e.append(Lg(k,b,l),p(E)),!1)}const v=[],C=Object.assign(rk,{defaultVisitor:y,convertValue:p,isVisitable:rf});function w(E,b){if(!U.isUndefined(E)){if(v.indexOf(E)!==-1)throw Error(\"Circular reference detected in \"+b.join(\".\"));v.push(E),U.forEach(E,function(T,j){(!(U.isUndefined(T)||T===null)&&i.call(e,T,U.isString(j)?j.trim():j,b,C))===!0&&w(T,b?b.concat(j):[j])}),v.pop()}}if(!U.isObject(t))throw new TypeError(\"data must be an object\");return w(t),e}function Ig(t){const e={\"!\":\"%21\",\"'\":\"%27\",\"(\":\"%28\",\")\":\"%29\",\"~\":\"%7E\",\"%20\":\"+\",\"%00\":\"\\0\"};return encodeURIComponent(t).replace(/[!'()~]|%20|%00/g,function(s){return e[s]})}function If(t,e){this._pairs=[],t&&hc(t,this,e)}const Tv=If.prototype;Tv.append=function(e,r){this._pairs.push([e,r])};Tv.toString=function(e){const r=e?function(s){return e.call(this,s,Ig)}:Ig;return this._pairs.map(function(i){return r(i[0])+\"=\"+r(i[1])},\"\").join(\"&\")};function ok(t){return encodeURIComponent(t).replace(/%3A/gi,\":\").replace(/%24/g,\"$\").replace(/%2C/gi,\",\").replace(/%20/g,\"+\")}function Ov(t,e,r){if(!e)return t;const s=r&&r.encode||ok;U.isFunction(r)&&(r={serialize:r});const i=r&&r.serialize;let l;if(i?l=i(e,r):l=U.isURLSearchParams(e)?e.toString():new If(e,r).toString(s),l){const u=t.indexOf(\"#\");u!==-1&&(t=t.slice(0,u)),t+=(t.indexOf(\"?\")===-1?\"?\":\"&\")+l}return t}class Dg{constructor(){this.handlers=[]}use(e,r,s){return this.handlers.push({fulfilled:e,rejected:r,synchronous:s?s.synchronous:!1,runWhen:s?s.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){U.forEach(this.handlers,function(s){s!==null&&e(s)})}}const jv={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},sk=typeof URLSearchParams<\"u\"?URLSearchParams:If,ik=typeof FormData<\"u\"?FormData:null,ak=typeof Blob<\"u\"?Blob:null,lk={isBrowser:!0,classes:{URLSearchParams:sk,FormData:ik,Blob:ak},protocols:[\"http\",\"https\",\"file\",\"blob\",\"url\",\"data\"]},Df=typeof window<\"u\"&&typeof document<\"u\",of=typeof navigator==\"object\"&&navigator||void 0,ck=Df&&(!of||[\"ReactNative\",\"NativeScript\",\"NS\"].indexOf(of.product)<0),uk=typeof WorkerGlobalScope<\"u\"&&self instanceof WorkerGlobalScope&&typeof self.importScripts==\"function\",dk=Df&&window.location.href||\"http://localhost\",fk=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:Df,hasStandardBrowserEnv:ck,hasStandardBrowserWebWorkerEnv:uk,navigator:of,origin:dk},Symbol.toStringTag,{value:\"Module\"})),St={...fk,...lk};function hk(t,e){return hc(t,new St.classes.URLSearchParams,{visitor:function(r,s,i,l){return St.isNode&&U.isBuffer(r)?(this.append(s,r.toString(\"base64\")),!1):l.defaultVisitor.apply(this,arguments)},...e})}function pk(t){return U.matchAll(/\\w+|\\[(\\w*)]/g,t).map(e=>e[0]===\"[]\"?\"\":e[1]||e[0])}function mk(t){const e={},r=Object.keys(t);let s;const i=r.length;let l;for(s=0;s<i;s++)l=r[s],e[l]=t[l];return e}function _v(t){function e(r,s,i,l){let u=r[l++];if(u===\"__proto__\")return!0;const d=Number.isFinite(+u),h=l>=r.length;return u=!u&&U.isArray(i)?i.length:u,h?(U.hasOwnProp(i,u)?i[u]=[i[u],s]:i[u]=s,!d):((!i[u]||!U.isObject(i[u]))&&(i[u]=[]),e(r,s,i[u],l)&&U.isArray(i[u])&&(i[u]=mk(i[u])),!d)}if(U.isFormData(t)&&U.isFunction(t.entries)){const r={};return U.forEachEntry(t,(s,i)=>{e(pk(s),i,r,0)}),r}return null}function gk(t,e,r){if(U.isString(t))try{return(e||JSON.parse)(t),U.trim(t)}catch(s){if(s.name!==\"SyntaxError\")throw s}return(r||JSON.stringify)(t)}const ia={transitional:jv,adapter:[\"xhr\",\"http\",\"fetch\"],transformRequest:[function(e,r){const s=r.getContentType()||\"\",i=s.indexOf(\"application/json\")>-1,l=U.isObject(e);if(l&&U.isHTMLForm(e)&&(e=new FormData(e)),U.isFormData(e))return i?JSON.stringify(_v(e)):e;if(U.isArrayBuffer(e)||U.isBuffer(e)||U.isStream(e)||U.isFile(e)||U.isBlob(e)||U.isReadableStream(e))return e;if(U.isArrayBufferView(e))return e.buffer;if(U.isURLSearchParams(e))return r.setContentType(\"application/x-www-form-urlencoded;charset=utf-8\",!1),e.toString();let d;if(l){if(s.indexOf(\"application/x-www-form-urlencoded\")>-1)return hk(e,this.formSerializer).toString();if((d=U.isFileList(e))||s.indexOf(\"multipart/form-data\")>-1){const h=this.env&&this.env.FormData;return hc(d?{\"files[]\":e}:e,h&&new h,this.formSerializer)}}return l||i?(r.setContentType(\"application/json\",!1),gk(e)):e}],transformResponse:[function(e){const r=this.transitional||ia.transitional,s=r&&r.forcedJSONParsing,i=this.responseType===\"json\";if(U.isResponse(e)||U.isReadableStream(e))return e;if(e&&U.isString(e)&&(s&&!this.responseType||i)){const u=!(r&&r.silentJSONParsing)&&i;try{return JSON.parse(e,this.parseReviver)}catch(d){if(u)throw d.name===\"SyntaxError\"?Re.from(d,Re.ERR_BAD_RESPONSE,this,null,this.response):d}}return e}],timeout:0,xsrfCookieName:\"XSRF-TOKEN\",xsrfHeaderName:\"X-XSRF-TOKEN\",maxContentLength:-1,maxBodyLength:-1,env:{FormData:St.classes.FormData,Blob:St.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:\"application/json, text/plain, */*\",\"Content-Type\":void 0}}};U.forEach([\"delete\",\"get\",\"head\",\"post\",\"put\",\"patch\"],t=>{ia.headers[t]={}});const yk=U.toObjectSet([\"age\",\"authorization\",\"content-length\",\"content-type\",\"etag\",\"expires\",\"from\",\"host\",\"if-modified-since\",\"if-unmodified-since\",\"last-modified\",\"location\",\"max-forwards\",\"proxy-authorization\",\"referer\",\"retry-after\",\"user-agent\"]),vk=t=>{const e={};let r,s,i;return t&&t.split(`\n`).forEach(function(u){i=u.indexOf(\":\"),r=u.substring(0,i).trim().toLowerCase(),s=u.substring(i+1).trim(),!(!r||e[r]&&yk[r])&&(r===\"set-cookie\"?e[r]?e[r].push(s):e[r]=[s]:e[r]=e[r]?e[r]+\", \"+s:s)}),e},Mg=Symbol(\"internals\");function $i(t){return t&&String(t).trim().toLowerCase()}function Fl(t){return t===!1||t==null?t:U.isArray(t)?t.map(Fl):String(t)}function xk(t){const e=Object.create(null),r=/([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;let s;for(;s=r.exec(t);)e[s[1]]=s[2];return e}const wk=t=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(t.trim());function wd(t,e,r,s,i){if(U.isFunction(s))return s.call(this,e,r);if(i&&(e=r),!!U.isString(e)){if(U.isString(s))return e.indexOf(s)!==-1;if(U.isRegExp(s))return s.test(e)}}function bk(t){return t.trim().toLowerCase().replace(/([a-z\\d])(\\w*)/g,(e,r,s)=>r.toUpperCase()+s)}function Sk(t,e){const r=U.toCamelCase(\" \"+e);[\"get\",\"set\",\"has\"].forEach(s=>{Object.defineProperty(t,s+r,{value:function(i,l,u){return this[s].call(this,e,i,l,u)},configurable:!0})})}let Kt=class{constructor(e){e&&this.set(e)}set(e,r,s){const i=this;function l(d,h,p){const y=$i(h);if(!y)throw new Error(\"header name must be a non-empty string\");const v=U.findKey(i,y);(!v||i[v]===void 0||p===!0||p===void 0&&i[v]!==!1)&&(i[v||h]=Fl(d))}const u=(d,h)=>U.forEach(d,(p,y)=>l(p,y,h));if(U.isPlainObject(e)||e instanceof this.constructor)u(e,r);else if(U.isString(e)&&(e=e.trim())&&!wk(e))u(vk(e),r);else if(U.isObject(e)&&U.isIterable(e)){let d={},h,p;for(const y of e){if(!U.isArray(y))throw TypeError(\"Object iterator must return a key-value pair\");d[p=y[0]]=(h=d[p])?U.isArray(h)?[...h,y[1]]:[h,y[1]]:y[1]}u(d,r)}else e!=null&&l(r,e,s);return this}get(e,r){if(e=$i(e),e){const s=U.findKey(this,e);if(s){const i=this[s];if(!r)return i;if(r===!0)return xk(i);if(U.isFunction(r))return r.call(this,i,s);if(U.isRegExp(r))return r.exec(i);throw new TypeError(\"parser must be boolean|regexp|function\")}}}has(e,r){if(e=$i(e),e){const s=U.findKey(this,e);return!!(s&&this[s]!==void 0&&(!r||wd(this,this[s],s,r)))}return!1}delete(e,r){const s=this;let i=!1;function l(u){if(u=$i(u),u){const d=U.findKey(s,u);d&&(!r||wd(s,s[d],d,r))&&(delete s[d],i=!0)}}return U.isArray(e)?e.forEach(l):l(e),i}clear(e){const r=Object.keys(this);let s=r.length,i=!1;for(;s--;){const l=r[s];(!e||wd(this,this[l],l,e,!0))&&(delete this[l],i=!0)}return i}normalize(e){const r=this,s={};return U.forEach(this,(i,l)=>{const u=U.findKey(s,l);if(u){r[u]=Fl(i),delete r[l];return}const d=e?bk(l):String(l).trim();d!==l&&delete r[l],r[d]=Fl(i),s[d]=!0}),this}concat(...e){return this.constructor.concat(this,...e)}toJSON(e){const r=Object.create(null);return U.forEach(this,(s,i)=>{s!=null&&s!==!1&&(r[i]=e&&U.isArray(s)?s.join(\", \"):s)}),r}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([e,r])=>e+\": \"+r).join(`\n`)}getSetCookie(){return this.get(\"set-cookie\")||[]}get[Symbol.toStringTag](){return\"AxiosHeaders\"}static from(e){return e instanceof this?e:new this(e)}static concat(e,...r){const s=new this(e);return r.forEach(i=>s.set(i)),s}static accessor(e){const s=(this[Mg]=this[Mg]={accessors:{}}).accessors,i=this.prototype;function l(u){const d=$i(u);s[d]||(Sk(i,u),s[d]=!0)}return U.isArray(e)?e.forEach(l):l(e),this}};Kt.accessor([\"Content-Type\",\"Content-Length\",\"Accept\",\"Accept-Encoding\",\"User-Agent\",\"Authorization\"]);U.reduceDescriptors(Kt.prototype,({value:t},e)=>{let r=e[0].toUpperCase()+e.slice(1);return{get:()=>t,set(s){this[r]=s}}});U.freezeMethods(Kt);function bd(t,e){const r=this||ia,s=e||r,i=Kt.from(s.headers);let l=s.data;return U.forEach(t,function(d){l=d.call(r,l,i.normalize(),e?e.status:void 0)}),i.normalize(),l}function Av(t){return!!(t&&t.__CANCEL__)}function Ys(t,e,r){Re.call(this,t??\"canceled\",Re.ERR_CANCELED,e,r),this.name=\"CanceledError\"}U.inherits(Ys,Re,{__CANCEL__:!0});function Lv(t,e,r){const s=r.config.validateStatus;!r.status||!s||s(r.status)?t(r):e(new Re(\"Request failed with status code \"+r.status,[Re.ERR_BAD_REQUEST,Re.ERR_BAD_RESPONSE][Math.floor(r.status/100)-4],r.config,r.request,r))}function Ck(t){const e=/^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(t);return e&&e[1]||\"\"}function Ek(t,e){t=t||10;const r=new Array(t),s=new Array(t);let i=0,l=0,u;return e=e!==void 0?e:1e3,function(h){const p=Date.now(),y=s[l];u||(u=p),r[i]=h,s[i]=p;let v=l,C=0;for(;v!==i;)C+=r[v++],v=v%t;if(i=(i+1)%t,i===l&&(l=(l+1)%t),p-u<e)return;const w=y&&p-y;return w?Math.round(C*1e3/w):void 0}}function kk(t,e){let r=0,s=1e3/e,i,l;const u=(p,y=Date.now())=>{r=y,i=null,l&&(clearTimeout(l),l=null),t(...p)};return[(...p)=>{const y=Date.now(),v=y-r;v>=s?u(p,y):(i=p,l||(l=setTimeout(()=>{l=null,u(i)},s-v)))},()=>i&&u(i)]}const Gl=(t,e,r=3)=>{let s=0;const i=Ek(50,250);return kk(l=>{const u=l.loaded,d=l.lengthComputable?l.total:void 0,h=u-s,p=i(h),y=u<=d;s=u;const v={loaded:u,total:d,progress:d?u/d:void 0,bytes:h,rate:p||void 0,estimated:p&&d&&y?(d-u)/p:void 0,event:l,lengthComputable:d!=null,[e?\"download\":\"upload\"]:!0};t(v)},r)},Fg=(t,e)=>{const r=t!=null;return[s=>e[0]({lengthComputable:r,total:t,loaded:s}),e[1]]},zg=t=>(...e)=>U.asap(()=>t(...e)),Nk=St.hasStandardBrowserEnv?((t,e)=>r=>(r=new URL(r,St.origin),t.protocol===r.protocol&&t.host===r.host&&(e||t.port===r.port)))(new URL(St.origin),St.navigator&&/(msie|trident)/i.test(St.navigator.userAgent)):()=>!0,Rk=St.hasStandardBrowserEnv?{write(t,e,r,s,i,l,u){if(typeof document>\"u\")return;const d=[`${t}=${encodeURIComponent(e)}`];U.isNumber(r)&&d.push(`expires=${new Date(r).toUTCString()}`),U.isString(s)&&d.push(`path=${s}`),U.isString(i)&&d.push(`domain=${i}`),l===!0&&d.push(\"secure\"),U.isString(u)&&d.push(`SameSite=${u}`),document.cookie=d.join(\"; \")},read(t){if(typeof document>\"u\")return null;const e=document.cookie.match(new RegExp(\"(?:^|; )\"+t+\"=([^;]*)\"));return e?decodeURIComponent(e[1]):null},remove(t){this.write(t,\"\",Date.now()-864e5,\"/\")}}:{write(){},read(){return null},remove(){}};function Pk(t){return/^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(t)}function Tk(t,e){return e?t.replace(/\\/?\\/$/,\"\")+\"/\"+e.replace(/^\\/+/,\"\"):t}function Iv(t,e,r){let s=!Pk(e);return t&&(s||r==!1)?Tk(t,e):e}const $g=t=>t instanceof Kt?{...t}:t;function Uo(t,e){e=e||{};const r={};function s(p,y,v,C){return U.isPlainObject(p)&&U.isPlainObject(y)?U.merge.call({caseless:C},p,y):U.isPlainObject(y)?U.merge({},y):U.isArray(y)?y.slice():y}function i(p,y,v,C){if(U.isUndefined(y)){if(!U.isUndefined(p))return s(void 0,p,v,C)}else return s(p,y,v,C)}function l(p,y){if(!U.isUndefined(y))return s(void 0,y)}function u(p,y){if(U.isUndefined(y)){if(!U.isUndefined(p))return s(void 0,p)}else return s(void 0,y)}function d(p,y,v){if(v in e)return s(p,y);if(v in t)return s(void 0,p)}const h={url:l,method:l,data:l,baseURL:u,transformRequest:u,transformResponse:u,paramsSerializer:u,timeout:u,timeoutMessage:u,withCredentials:u,withXSRFToken:u,adapter:u,responseType:u,xsrfCookieName:u,xsrfHeaderName:u,onUploadProgress:u,onDownloadProgress:u,decompress:u,maxContentLength:u,maxBodyLength:u,beforeRedirect:u,transport:u,httpAgent:u,httpsAgent:u,cancelToken:u,socketPath:u,responseEncoding:u,validateStatus:d,headers:(p,y,v)=>i($g(p),$g(y),v,!0)};return U.forEach(Object.keys({...t,...e}),function(y){const v=h[y]||i,C=v(t[y],e[y],y);U.isUndefined(C)&&v!==d||(r[y]=C)}),r}const Dv=t=>{const e=Uo({},t);let{data:r,withXSRFToken:s,xsrfHeaderName:i,xsrfCookieName:l,headers:u,auth:d}=e;if(e.headers=u=Kt.from(u),e.url=Ov(Iv(e.baseURL,e.url,e.allowAbsoluteUrls),t.params,t.paramsSerializer),d&&u.set(\"Authorization\",\"Basic \"+btoa((d.username||\"\")+\":\"+(d.password?unescape(encodeURIComponent(d.password)):\"\"))),U.isFormData(r)){if(St.hasStandardBrowserEnv||St.hasStandardBrowserWebWorkerEnv)u.setContentType(void 0);else if(U.isFunction(r.getHeaders)){const h=r.getHeaders(),p=[\"content-type\",\"content-length\"];Object.entries(h).forEach(([y,v])=>{p.includes(y.toLowerCase())&&u.set(y,v)})}}if(St.hasStandardBrowserEnv&&(s&&U.isFunction(s)&&(s=s(e)),s||s!==!1&&Nk(e.url))){const h=i&&l&&Rk.read(l);h&&u.set(i,h)}return e},Ok=typeof XMLHttpRequest<\"u\",jk=Ok&&function(t){return new Promise(function(r,s){const i=Dv(t);let l=i.data;const u=Kt.from(i.headers).normalize();let{responseType:d,onUploadProgress:h,onDownloadProgress:p}=i,y,v,C,w,E;function b(){w&&w(),E&&E(),i.cancelToken&&i.cancelToken.unsubscribe(y),i.signal&&i.signal.removeEventListener(\"abort\",y)}let k=new XMLHttpRequest;k.open(i.method.toUpperCase(),i.url,!0),k.timeout=i.timeout;function T(){if(!k)return;const _=Kt.from(\"getAllResponseHeaders\"in k&&k.getAllResponseHeaders()),F={data:!d||d===\"text\"||d===\"json\"?k.responseText:k.response,status:k.status,statusText:k.statusText,headers:_,config:t,request:k};Lv(function(B){r(B),b()},function(B){s(B),b()},F),k=null}\"onloadend\"in k?k.onloadend=T:k.onreadystatechange=function(){!k||k.readyState!==4||k.status===0&&!(k.responseURL&&k.responseURL.indexOf(\"file:\")===0)||setTimeout(T)},k.onabort=function(){k&&(s(new Re(\"Request aborted\",Re.ECONNABORTED,t,k)),k=null)},k.onerror=function(A){const F=A&&A.message?A.message:\"Network Error\",V=new Re(F,Re.ERR_NETWORK,t,k);V.event=A||null,s(V),k=null},k.ontimeout=function(){let A=i.timeout?\"timeout of \"+i.timeout+\"ms exceeded\":\"timeout exceeded\";const F=i.transitional||jv;i.timeoutErrorMessage&&(A=i.timeoutErrorMessage),s(new Re(A,F.clarifyTimeoutError?Re.ETIMEDOUT:Re.ECONNABORTED,t,k)),k=null},l===void 0&&u.setContentType(null),\"setRequestHeader\"in k&&U.forEach(u.toJSON(),function(A,F){k.setRequestHeader(F,A)}),U.isUndefined(i.withCredentials)||(k.withCredentials=!!i.withCredentials),d&&d!==\"json\"&&(k.responseType=i.responseType),p&&([C,E]=Gl(p,!0),k.addEventListener(\"progress\",C)),h&&k.upload&&([v,w]=Gl(h),k.upload.addEventListener(\"progress\",v),k.upload.addEventListener(\"loadend\",w)),(i.cancelToken||i.signal)&&(y=_=>{k&&(s(!_||_.type?new Ys(null,t,k):_),k.abort(),k=null)},i.cancelToken&&i.cancelToken.subscribe(y),i.signal&&(i.signal.aborted?y():i.signal.addEventListener(\"abort\",y)));const j=Ck(i.url);if(j&&St.protocols.indexOf(j)===-1){s(new Re(\"Unsupported protocol \"+j+\":\",Re.ERR_BAD_REQUEST,t));return}k.send(l||null)})},_k=(t,e)=>{const{length:r}=t=t?t.filter(Boolean):[];if(e||r){let s=new AbortController,i;const l=function(p){if(!i){i=!0,d();const y=p instanceof Error?p:this.reason;s.abort(y instanceof Re?y:new Ys(y instanceof Error?y.message:y))}};let u=e&&setTimeout(()=>{u=null,l(new Re(`timeout ${e} of ms exceeded`,Re.ETIMEDOUT))},e);const d=()=>{t&&(u&&clearTimeout(u),u=null,t.forEach(p=>{p.unsubscribe?p.unsubscribe(l):p.removeEventListener(\"abort\",l)}),t=null)};t.forEach(p=>p.addEventListener(\"abort\",l));const{signal:h}=s;return h.unsubscribe=()=>U.asap(d),h}},Ak=function*(t,e){let r=t.byteLength;if(r<e){yield t;return}let s=0,i;for(;s<r;)i=s+e,yield t.slice(s,i),s=i},Lk=async function*(t,e){for await(const r of Ik(t))yield*Ak(r,e)},Ik=async function*(t){if(t[Symbol.asyncIterator]){yield*t;return}const e=t.getReader();try{for(;;){const{done:r,value:s}=await e.read();if(r)break;yield s}}finally{await e.cancel()}},Ug=(t,e,r,s)=>{const i=Lk(t,e);let l=0,u,d=h=>{u||(u=!0,s&&s(h))};return new ReadableStream({async pull(h){try{const{done:p,value:y}=await i.next();if(p){d(),h.close();return}let v=y.byteLength;if(r){let C=l+=v;r(C)}h.enqueue(new Uint8Array(y))}catch(p){throw d(p),p}},cancel(h){return d(h),i.return()}},{highWaterMark:2})},Bg=64*1024,{isFunction:Pl}=U,Dk=(({Request:t,Response:e})=>({Request:t,Response:e}))(U.global),{ReadableStream:Hg,TextEncoder:Vg}=U.global,Wg=(t,...e)=>{try{return!!t(...e)}catch{return!1}},Mk=t=>{t=U.merge.call({skipUndefined:!0},Dk,t);const{fetch:e,Request:r,Response:s}=t,i=e?Pl(e):typeof fetch==\"function\",l=Pl(r),u=Pl(s);if(!i)return!1;const d=i&&Pl(Hg),h=i&&(typeof Vg==\"function\"?(E=>b=>E.encode(b))(new Vg):async E=>new Uint8Array(await new r(E).arrayBuffer())),p=l&&d&&Wg(()=>{let E=!1;const b=new r(St.origin,{body:new Hg,method:\"POST\",get duplex(){return E=!0,\"half\"}}).headers.has(\"Content-Type\");return E&&!b}),y=u&&d&&Wg(()=>U.isReadableStream(new s(\"\").body)),v={stream:y&&(E=>E.body)};i&&[\"text\",\"arrayBuffer\",\"blob\",\"formData\",\"stream\"].forEach(E=>{!v[E]&&(v[E]=(b,k)=>{let T=b&&b[E];if(T)return T.call(b);throw new Re(`Response type '${E}' is not supported`,Re.ERR_NOT_SUPPORT,k)})});const C=async E=>{if(E==null)return 0;if(U.isBlob(E))return E.size;if(U.isSpecCompliantForm(E))return(await new r(St.origin,{method:\"POST\",body:E}).arrayBuffer()).byteLength;if(U.isArrayBufferView(E)||U.isArrayBuffer(E))return E.byteLength;if(U.isURLSearchParams(E)&&(E=E+\"\"),U.isString(E))return(await h(E)).byteLength},w=async(E,b)=>{const k=U.toFiniteNumber(E.getContentLength());return k??C(b)};return async E=>{let{url:b,method:k,data:T,signal:j,cancelToken:_,timeout:A,onDownloadProgress:F,onUploadProgress:V,responseType:B,headers:te,withCredentials:G=\"same-origin\",fetchOptions:W}=Dv(E),le=e||fetch;B=B?(B+\"\").toLowerCase():\"text\";let K=_k([j,_&&_.toAbortSignal()],A),Z=null;const J=K&&K.unsubscribe&&(()=>{K.unsubscribe()});let de;try{if(V&&p&&k!==\"get\"&&k!==\"head\"&&(de=await w(te,T))!==0){let P=new r(b,{method:\"POST\",body:T,duplex:\"half\"}),M;if(U.isFormData(T)&&(M=P.headers.get(\"content-type\"))&&te.setContentType(M),P.body){const[ie,ae]=Fg(de,Gl(zg(V)));T=Ug(P.body,Bg,ie,ae)}}U.isString(G)||(G=G?\"include\":\"omit\");const ne=l&&\"credentials\"in r.prototype,se={...W,signal:K,method:k.toUpperCase(),headers:te.normalize().toJSON(),body:T,duplex:\"half\",credentials:ne?G:void 0};Z=l&&new r(b,se);let $=await(l?le(Z,W):le(b,se));const H=y&&(B===\"stream\"||B===\"response\");if(y&&(F||H&&J)){const P={};[\"status\",\"statusText\",\"headers\"].forEach(me=>{P[me]=$[me]});const M=U.toFiniteNumber($.headers.get(\"content-length\")),[ie,ae]=F&&Fg(M,Gl(zg(F),!0))||[];$=new s(Ug($.body,Bg,ie,()=>{ae&&ae(),J&&J()}),P)}B=B||\"text\";let Q=await v[U.findKey(v,B)||\"text\"]($,E);return!H&&J&&J(),await new Promise((P,M)=>{Lv(P,M,{data:Q,headers:Kt.from($.headers),status:$.status,statusText:$.statusText,config:E,request:Z})})}catch(ne){throw J&&J(),ne&&ne.name===\"TypeError\"&&/Load failed|fetch/i.test(ne.message)?Object.assign(new Re(\"Network Error\",Re.ERR_NETWORK,E,Z),{cause:ne.cause||ne}):Re.from(ne,ne&&ne.code,E,Z)}}},Fk=new Map,Mv=t=>{let e=t&&t.env||{};const{fetch:r,Request:s,Response:i}=e,l=[s,i,r];let u=l.length,d=u,h,p,y=Fk;for(;d--;)h=l[d],p=y.get(h),p===void 0&&y.set(h,p=d?new Map:Mk(e)),y=p;return p};Mv();const Mf={http:tk,xhr:jk,fetch:{get:Mv}};U.forEach(Mf,(t,e)=>{if(t){try{Object.defineProperty(t,\"name\",{value:e})}catch{}Object.defineProperty(t,\"adapterName\",{value:e})}});const Kg=t=>`- ${t}`,zk=t=>U.isFunction(t)||t===null||t===!1;function $k(t,e){t=U.isArray(t)?t:[t];const{length:r}=t;let s,i;const l={};for(let u=0;u<r;u++){s=t[u];let d;if(i=s,!zk(s)&&(i=Mf[(d=String(s)).toLowerCase()],i===void 0))throw new Re(`Unknown adapter '${d}'`);if(i&&(U.isFunction(i)||(i=i.get(e))))break;l[d||\"#\"+u]=i}if(!i){const u=Object.entries(l).map(([h,p])=>`adapter ${h} `+(p===!1?\"is not supported by the environment\":\"is not available in the build\"));let d=r?u.length>1?`since :\n`+u.map(Kg).join(`\n`):\" \"+Kg(u[0]):\"as no adapter specified\";throw new Re(\"There is no suitable adapter to dispatch the request \"+d,\"ERR_NOT_SUPPORT\")}return i}const Fv={getAdapter:$k,adapters:Mf};function Sd(t){if(t.cancelToken&&t.cancelToken.throwIfRequested(),t.signal&&t.signal.aborted)throw new Ys(null,t)}function qg(t){return Sd(t),t.headers=Kt.from(t.headers),t.data=bd.call(t,t.transformRequest),[\"post\",\"put\",\"patch\"].indexOf(t.method)!==-1&&t.headers.setContentType(\"application/x-www-form-urlencoded\",!1),Fv.getAdapter(t.adapter||ia.adapter,t)(t).then(function(s){return Sd(t),s.data=bd.call(t,t.transformResponse,s),s.headers=Kt.from(s.headers),s},function(s){return Av(s)||(Sd(t),s&&s.response&&(s.response.data=bd.call(t,t.transformResponse,s.response),s.response.headers=Kt.from(s.response.headers))),Promise.reject(s)})}const zv=\"1.13.2\",pc={};[\"object\",\"boolean\",\"number\",\"function\",\"string\",\"symbol\"].forEach((t,e)=>{pc[t]=function(s){return typeof s===t||\"a\"+(e<1?\"n \":\" \")+t}});const Qg={};pc.transitional=function(e,r,s){function i(l,u){return\"[Axios v\"+zv+\"] Transitional option '\"+l+\"'\"+u+(s?\". \"+s:\"\")}return(l,u,d)=>{if(e===!1)throw new Re(i(u,\" has been removed\"+(r?\" in \"+r:\"\")),Re.ERR_DEPRECATED);return r&&!Qg[u]&&(Qg[u]=!0,console.warn(i(u,\" has been deprecated since v\"+r+\" and will be removed in the near future\"))),e?e(l,u,d):!0}};pc.spelling=function(e){return(r,s)=>(console.warn(`${s} is likely a misspelling of ${e}`),!0)};function Uk(t,e,r){if(typeof t!=\"object\")throw new Re(\"options must be an object\",Re.ERR_BAD_OPTION_VALUE);const s=Object.keys(t);let i=s.length;for(;i-- >0;){const l=s[i],u=e[l];if(u){const d=t[l],h=d===void 0||u(d,l,t);if(h!==!0)throw new Re(\"option \"+l+\" must be \"+h,Re.ERR_BAD_OPTION_VALUE);continue}if(r!==!0)throw new Re(\"Unknown option \"+l,Re.ERR_BAD_OPTION)}}const zl={assertOptions:Uk,validators:pc},Hn=zl.validators;let Mo=class{constructor(e){this.defaults=e||{},this.interceptors={request:new Dg,response:new Dg}}async request(e,r){try{return await this._request(e,r)}catch(s){if(s instanceof Error){let i={};Error.captureStackTrace?Error.captureStackTrace(i):i=new Error;const l=i.stack?i.stack.replace(/^.+\\n/,\"\"):\"\";try{s.stack?l&&!String(s.stack).endsWith(l.replace(/^.+\\n.+\\n/,\"\"))&&(s.stack+=`\n`+l):s.stack=l}catch{}}throw s}}_request(e,r){typeof e==\"string\"?(r=r||{},r.url=e):r=e||{},r=Uo(this.defaults,r);const{transitional:s,paramsSerializer:i,headers:l}=r;s!==void 0&&zl.assertOptions(s,{silentJSONParsing:Hn.transitional(Hn.boolean),forcedJSONParsing:Hn.transitional(Hn.boolean),clarifyTimeoutError:Hn.transitional(Hn.boolean)},!1),i!=null&&(U.isFunction(i)?r.paramsSerializer={serialize:i}:zl.assertOptions(i,{encode:Hn.function,serialize:Hn.function},!0)),r.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?r.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:r.allowAbsoluteUrls=!0),zl.assertOptions(r,{baseUrl:Hn.spelling(\"baseURL\"),withXsrfToken:Hn.spelling(\"withXSRFToken\")},!0),r.method=(r.method||this.defaults.method||\"get\").toLowerCase();let u=l&&U.merge(l.common,l[r.method]);l&&U.forEach([\"delete\",\"get\",\"head\",\"post\",\"put\",\"patch\",\"common\"],E=>{delete l[E]}),r.headers=Kt.concat(u,l);const d=[];let h=!0;this.interceptors.request.forEach(function(b){typeof b.runWhen==\"function\"&&b.runWhen(r)===!1||(h=h&&b.synchronous,d.unshift(b.fulfilled,b.rejected))});const p=[];this.interceptors.response.forEach(function(b){p.push(b.fulfilled,b.rejected)});let y,v=0,C;if(!h){const E=[qg.bind(this),void 0];for(E.unshift(...d),E.push(...p),C=E.length,y=Promise.resolve(r);v<C;)y=y.then(E[v++],E[v++]);return y}C=d.length;let w=r;for(;v<C;){const E=d[v++],b=d[v++];try{w=E(w)}catch(k){b.call(this,k);break}}try{y=qg.call(this,w)}catch(E){return Promise.reject(E)}for(v=0,C=p.length;v<C;)y=y.then(p[v++],p[v++]);return y}getUri(e){e=Uo(this.defaults,e);const r=Iv(e.baseURL,e.url,e.allowAbsoluteUrls);return Ov(r,e.params,e.paramsSerializer)}};U.forEach([\"delete\",\"get\",\"head\",\"options\"],function(e){Mo.prototype[e]=function(r,s){return this.request(Uo(s||{},{method:e,url:r,data:(s||{}).data}))}});U.forEach([\"post\",\"put\",\"patch\"],function(e){function r(s){return function(l,u,d){return this.request(Uo(d||{},{method:e,headers:s?{\"Content-Type\":\"multipart/form-data\"}:{},url:l,data:u}))}}Mo.prototype[e]=r(),Mo.prototype[e+\"Form\"]=r(!0)});let Bk=class $v{constructor(e){if(typeof e!=\"function\")throw new TypeError(\"executor must be a function.\");let r;this.promise=new Promise(function(l){r=l});const s=this;this.promise.then(i=>{if(!s._listeners)return;let l=s._listeners.length;for(;l-- >0;)s._listeners[l](i);s._listeners=null}),this.promise.then=i=>{let l;const u=new Promise(d=>{s.subscribe(d),l=d}).then(i);return u.cancel=function(){s.unsubscribe(l)},u},e(function(l,u,d){s.reason||(s.reason=new Ys(l,u,d),r(s.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const r=this._listeners.indexOf(e);r!==-1&&this._listeners.splice(r,1)}toAbortSignal(){const e=new AbortController,r=s=>{e.abort(s)};return this.subscribe(r),e.signal.unsubscribe=()=>this.unsubscribe(r),e.signal}static source(){let e;return{token:new $v(function(i){e=i}),cancel:e}}};function Hk(t){return function(r){return t.apply(null,r)}}function Vk(t){return U.isObject(t)&&t.isAxiosError===!0}const sf={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(sf).forEach(([t,e])=>{sf[e]=t});function Uv(t){const e=new Mo(t),r=vv(Mo.prototype.request,e);return U.extend(r,Mo.prototype,e,{allOwnKeys:!0}),U.extend(r,e,null,{allOwnKeys:!0}),r.create=function(i){return Uv(Uo(t,i))},r}const rt=Uv(ia);rt.Axios=Mo;rt.CanceledError=Ys;rt.CancelToken=Bk;rt.isCancel=Av;rt.VERSION=zv;rt.toFormData=hc;rt.AxiosError=Re;rt.Cancel=rt.CanceledError;rt.all=function(e){return Promise.all(e)};rt.spread=Hk;rt.isAxiosError=Vk;rt.mergeConfig=Uo;rt.AxiosHeaders=Kt;rt.formToJSON=t=>_v(U.isHTMLForm(t)?new FormData(t):t);rt.getAdapter=Fv.getAdapter;rt.HttpStatusCode=sf;rt.default=rt;const{Axios:t_,AxiosError:n_,CanceledError:r_,isCancel:o_,CancelToken:s_,VERSION:i_,all:a_,Cancel:l_,isAxiosError:c_,spread:u_,toFormData:d_,AxiosHeaders:f_,HttpStatusCode:h_,formToJSON:p_,getAdapter:m_,mergeConfig:g_}=rt,Yn=rt.create({baseURL:\"/api\",timeout:3e4,headers:{\"Content-Type\":\"application/json\"}}),Ff={start:t=>Yn.post(\"/crawler/start\",t),stop:()=>Yn.post(\"/crawler/stop\"),getStatus:()=>Yn.get(\"/crawler/status\"),getLogs:(t=100)=>Yn.get(\"/crawler/logs\",{params:{limit:t}})},Xl={getFiles:(t,e)=>Yn.get(\"/data/files\",{params:{platform:t,file_type:e}}),getFileContent:(t,e=100)=>Yn.get(\"/data/files/\"+t,{params:{preview:!0,limit:e}}),getStats:()=>Yn.get(\"/data/stats\"),getDownloadUrl:t=>`/api/data/download/${t}`},Bv={getPlatforms:()=>Yn.get(\"/config/platforms\"),getOptions:()=>Yn.get(\"/config/options\")},Wk={check:()=>Yn.get(\"/env/check\")};function Kk(){const t=jt(r=>r.setStatus),e=jt(r=>r.setRunningInfo);return ta({queryKey:[\"crawlerStatus\"],queryFn:async()=>{const{data:r}=await Ff.getStatus();return t(r.status),e(r.platform,r.crawler_type,r.started_at),r},refetchInterval:2e3})}function qk(){const t=lc(),e=jt(s=>s.setStatus),r=jt(s=>s.clearLogs);return Xy({mutationFn:s=>Ff.start(s),onMutate:()=>{r(),e(\"running\")},onSuccess:()=>{Kl.success(\"Crawler started successfully\"),t.invalidateQueries({queryKey:[\"crawlerStatus\"]})},onError:s=>{e(\"idle\"),Kl.error(`Failed to start crawler: ${s.message}`)}})}function Qk(){const t=lc(),e=jt(r=>r.setStatus);return Xy({mutationFn:()=>Ff.stop(),onMutate:()=>{e(\"stopping\")},onSuccess:()=>{Kl.success(\"Crawler stopped\"),e(\"idle\"),t.invalidateQueries({queryKey:[\"crawlerStatus\"]})},onError:r=>{Kl.error(`Failed to stop crawler: ${r.message}`)}})}function Yk(){return ta({queryKey:[\"platforms\"],queryFn:async()=>{const{data:t}=await Bv.getPlatforms();return t.platforms},staleTime:1/0})}function Gk(){return ta({queryKey:[\"configOptions\"],queryFn:async()=>{const{data:t}=await Bv.getOptions();return t},staleTime:1/0})}function af(t,[e,r]){return Math.min(r,Math.max(e,t))}function Me(t,e,{checkForDefaultPrevented:r=!0}={}){return function(i){if(t==null||t(i),r===!1||!i.defaultPrevented)return e==null?void 0:e(i)}}function Xk(t,e){const r=x.createContext(e),s=l=>{const{children:u,...d}=l,h=x.useMemo(()=>d,Object.values(d));return g.jsx(r.Provider,{value:h,children:u})};s.displayName=t+\"Provider\";function i(l){const u=x.useContext(r);if(u)return u;if(e!==void 0)return e;throw new Error(`\\`${l}\\` must be used within \\`${t}\\``)}return[s,i]}function aa(t,e=[]){let r=[];function s(l,u){const d=x.createContext(u),h=r.length;r=[...r,u];const p=v=>{var T;const{scope:C,children:w,...E}=v,b=((T=C==null?void 0:C[t])==null?void 0:T[h])||d,k=x.useMemo(()=>E,Object.values(E));return g.jsx(b.Provider,{value:k,children:w})};p.displayName=l+\"Provider\";function y(v,C){var b;const w=((b=C==null?void 0:C[t])==null?void 0:b[h])||d,E=x.useContext(w);if(E)return E;if(u!==void 0)return u;throw new Error(`\\`${v}\\` must be used within \\`${l}\\``)}return[p,y]}const i=()=>{const l=r.map(u=>x.createContext(u));return function(d){const h=(d==null?void 0:d[t])||l;return x.useMemo(()=>({[`__scope${t}`]:{...d,[t]:h}}),[d,h])}};return i.scopeName=t,[s,Jk(i,...e)]}function Jk(...t){const e=t[0];if(t.length===1)return e;const r=()=>{const s=t.map(i=>({useScope:i(),scopeName:i.scopeName}));return function(l){const u=s.reduce((d,{useScope:h,scopeName:p})=>{const v=h(l)[`__scope${p}`];return{...d,...v}},{});return x.useMemo(()=>({[`__scope${e.scopeName}`]:u}),[u])}};return r.scopeName=e.scopeName,r}function Yg(t,e){if(typeof t==\"function\")return t(e);t!=null&&(t.current=e)}function Gs(...t){return e=>{let r=!1;const s=t.map(i=>{const l=Yg(i,e);return!r&&typeof l==\"function\"&&(r=!0),l});if(r)return()=>{for(let i=0;i<s.length;i++){const l=s[i];typeof l==\"function\"?l():Yg(t[i],null)}}}}function Ve(...t){return x.useCallback(Gs(...t),t)}function Gg(t){const e=Zk(t),r=x.forwardRef((s,i)=>{const{children:l,...u}=s,d=x.Children.toArray(l),h=d.find(tN);if(h){const p=h.props.children,y=d.map(v=>v===h?x.Children.count(p)>1?x.Children.only(null):x.isValidElement(p)?p.props.children:null:v);return g.jsx(e,{...u,ref:i,children:x.isValidElement(p)?x.cloneElement(p,void 0,y):null})}return g.jsx(e,{...u,ref:i,children:l})});return r.displayName=`${t}.Slot`,r}function Zk(t){const e=x.forwardRef((r,s)=>{const{children:i,...l}=r;if(x.isValidElement(i)){const u=rN(i),d=nN(l,i.props);return i.type!==x.Fragment&&(d.ref=s?Gs(s,u):u),x.cloneElement(i,d)}return x.Children.count(i)>1?x.Children.only(null):null});return e.displayName=`${t}.SlotClone`,e}var eN=Symbol(\"radix.slottable\");function tN(t){return x.isValidElement(t)&&typeof t.type==\"function\"&&\"__radixId\"in t.type&&t.type.__radixId===eN}function nN(t,e){const r={...e};for(const s in e){const i=t[s],l=e[s];/^on[A-Z]/.test(s)?i&&l?r[s]=(...d)=>{const h=l(...d);return i(...d),h}:i&&(r[s]=i):s===\"style\"?r[s]={...i,...l}:s===\"className\"&&(r[s]=[i,l].filter(Boolean).join(\" \"))}return{...t,...r}}function rN(t){var s,i;let e=(s=Object.getOwnPropertyDescriptor(t.props,\"ref\"))==null?void 0:s.get,r=e&&\"isReactWarning\"in e&&e.isReactWarning;return r?t.ref:(e=(i=Object.getOwnPropertyDescriptor(t,\"ref\"))==null?void 0:i.get,r=e&&\"isReactWarning\"in e&&e.isReactWarning,r?t.props.ref:t.props.ref||t.ref)}function oN(t){const e=t+\"CollectionProvider\",[r,s]=aa(e),[i,l]=r(e,{collectionRef:{current:null},itemMap:new Map}),u=b=>{const{scope:k,children:T}=b,j=oe.useRef(null),_=oe.useRef(new Map).current;return g.jsx(i,{scope:k,itemMap:_,collectionRef:j,children:T})};u.displayName=e;const d=t+\"CollectionSlot\",h=Gg(d),p=oe.forwardRef((b,k)=>{const{scope:T,children:j}=b,_=l(d,T),A=Ve(k,_.collectionRef);return g.jsx(h,{ref:A,children:j})});p.displayName=d;const y=t+\"CollectionItemSlot\",v=\"data-radix-collection-item\",C=Gg(y),w=oe.forwardRef((b,k)=>{const{scope:T,children:j,..._}=b,A=oe.useRef(null),F=Ve(k,A),V=l(y,T);return oe.useEffect(()=>(V.itemMap.set(A,{ref:A,..._}),()=>void V.itemMap.delete(A))),g.jsx(C,{[v]:\"\",ref:F,children:j})});w.displayName=y;function E(b){const k=l(t+\"CollectionConsumer\",b);return oe.useCallback(()=>{const j=k.collectionRef.current;if(!j)return[];const _=Array.from(j.querySelectorAll(`[${v}]`));return Array.from(k.itemMap.values()).sort((V,B)=>_.indexOf(V.ref.current)-_.indexOf(B.ref.current))},[k.collectionRef,k.itemMap])}return[{Provider:u,Slot:p,ItemSlot:w},E,s]}var sN=x.createContext(void 0);function Hv(t){const e=x.useContext(sN);return t||e||\"ltr\"}function iN(t){const e=aN(t),r=x.forwardRef((s,i)=>{const{children:l,...u}=s,d=x.Children.toArray(l),h=d.find(cN);if(h){const p=h.props.children,y=d.map(v=>v===h?x.Children.count(p)>1?x.Children.only(null):x.isValidElement(p)?p.props.children:null:v);return g.jsx(e,{...u,ref:i,children:x.isValidElement(p)?x.cloneElement(p,void 0,y):null})}return g.jsx(e,{...u,ref:i,children:l})});return r.displayName=`${t}.Slot`,r}function aN(t){const e=x.forwardRef((r,s)=>{const{children:i,...l}=r;if(x.isValidElement(i)){const u=dN(i),d=uN(l,i.props);return i.type!==x.Fragment&&(d.ref=s?Gs(s,u):u),x.cloneElement(i,d)}return x.Children.count(i)>1?x.Children.only(null):null});return e.displayName=`${t}.SlotClone`,e}var lN=Symbol(\"radix.slottable\");function cN(t){return x.isValidElement(t)&&typeof t.type==\"function\"&&\"__radixId\"in t.type&&t.type.__radixId===lN}function uN(t,e){const r={...e};for(const s in e){const i=t[s],l=e[s];/^on[A-Z]/.test(s)?i&&l?r[s]=(...d)=>{const h=l(...d);return i(...d),h}:i&&(r[s]=i):s===\"style\"?r[s]={...i,...l}:s===\"className\"&&(r[s]=[i,l].filter(Boolean).join(\" \"))}return{...t,...r}}function dN(t){var s,i;let e=(s=Object.getOwnPropertyDescriptor(t.props,\"ref\"))==null?void 0:s.get,r=e&&\"isReactWarning\"in e&&e.isReactWarning;return r?t.ref:(e=(i=Object.getOwnPropertyDescriptor(t,\"ref\"))==null?void 0:i.get,r=e&&\"isReactWarning\"in e&&e.isReactWarning,r?t.props.ref:t.props.ref||t.ref)}var fN=[\"a\",\"button\",\"div\",\"form\",\"h2\",\"h3\",\"img\",\"input\",\"label\",\"li\",\"nav\",\"ol\",\"p\",\"select\",\"span\",\"svg\",\"ul\"],ze=fN.reduce((t,e)=>{const r=iN(`Primitive.${e}`),s=x.forwardRef((i,l)=>{const{asChild:u,...d}=i,h=u?r:e;return typeof window<\"u\"&&(window[Symbol.for(\"radix-ui\")]=!0),g.jsx(h,{...d,ref:l})});return s.displayName=`Primitive.${e}`,{...t,[e]:s}},{});function hN(t,e){t&&na.flushSync(()=>t.dispatchEvent(e))}function Vt(t){const e=x.useRef(t);return x.useEffect(()=>{e.current=t}),x.useMemo(()=>(...r)=>{var s;return(s=e.current)==null?void 0:s.call(e,...r)},[])}function pN(t,e=globalThis==null?void 0:globalThis.document){const r=Vt(t);x.useEffect(()=>{const s=i=>{i.key===\"Escape\"&&r(i)};return e.addEventListener(\"keydown\",s,{capture:!0}),()=>e.removeEventListener(\"keydown\",s,{capture:!0})},[r,e])}var mN=\"DismissableLayer\",lf=\"dismissableLayer.update\",gN=\"dismissableLayer.pointerDownOutside\",yN=\"dismissableLayer.focusOutside\",Xg,Vv=x.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),zf=x.forwardRef((t,e)=>{const{disableOutsidePointerEvents:r=!1,onEscapeKeyDown:s,onPointerDownOutside:i,onFocusOutside:l,onInteractOutside:u,onDismiss:d,...h}=t,p=x.useContext(Vv),[y,v]=x.useState(null),C=(y==null?void 0:y.ownerDocument)??(globalThis==null?void 0:globalThis.document),[,w]=x.useState({}),E=Ve(e,B=>v(B)),b=Array.from(p.layers),[k]=[...p.layersWithOutsidePointerEventsDisabled].slice(-1),T=b.indexOf(k),j=y?b.indexOf(y):-1,_=p.layersWithOutsidePointerEventsDisabled.size>0,A=j>=T,F=wN(B=>{const te=B.target,G=[...p.branches].some(W=>W.contains(te));!A||G||(i==null||i(B),u==null||u(B),B.defaultPrevented||d==null||d())},C),V=bN(B=>{const te=B.target;[...p.branches].some(W=>W.contains(te))||(l==null||l(B),u==null||u(B),B.defaultPrevented||d==null||d())},C);return pN(B=>{j===p.layers.size-1&&(s==null||s(B),!B.defaultPrevented&&d&&(B.preventDefault(),d()))},C),x.useEffect(()=>{if(y)return r&&(p.layersWithOutsidePointerEventsDisabled.size===0&&(Xg=C.body.style.pointerEvents,C.body.style.pointerEvents=\"none\"),p.layersWithOutsidePointerEventsDisabled.add(y)),p.layers.add(y),Jg(),()=>{r&&p.layersWithOutsidePointerEventsDisabled.size===1&&(C.body.style.pointerEvents=Xg)}},[y,C,r,p]),x.useEffect(()=>()=>{y&&(p.layers.delete(y),p.layersWithOutsidePointerEventsDisabled.delete(y),Jg())},[y,p]),x.useEffect(()=>{const B=()=>w({});return document.addEventListener(lf,B),()=>document.removeEventListener(lf,B)},[]),g.jsx(ze.div,{...h,ref:E,style:{pointerEvents:_?A?\"auto\":\"none\":void 0,...t.style},onFocusCapture:Me(t.onFocusCapture,V.onFocusCapture),onBlurCapture:Me(t.onBlurCapture,V.onBlurCapture),onPointerDownCapture:Me(t.onPointerDownCapture,F.onPointerDownCapture)})});zf.displayName=mN;var vN=\"DismissableLayerBranch\",xN=x.forwardRef((t,e)=>{const r=x.useContext(Vv),s=x.useRef(null),i=Ve(e,s);return x.useEffect(()=>{const l=s.current;if(l)return r.branches.add(l),()=>{r.branches.delete(l)}},[r.branches]),g.jsx(ze.div,{...t,ref:i})});xN.displayName=vN;function wN(t,e=globalThis==null?void 0:globalThis.document){const r=Vt(t),s=x.useRef(!1),i=x.useRef(()=>{});return x.useEffect(()=>{const l=d=>{if(d.target&&!s.current){let h=function(){Wv(gN,r,p,{discrete:!0})};const p={originalEvent:d};d.pointerType===\"touch\"?(e.removeEventListener(\"click\",i.current),i.current=h,e.addEventListener(\"click\",i.current,{once:!0})):h()}else e.removeEventListener(\"click\",i.current);s.current=!1},u=window.setTimeout(()=>{e.addEventListener(\"pointerdown\",l)},0);return()=>{window.clearTimeout(u),e.removeEventListener(\"pointerdown\",l),e.removeEventListener(\"click\",i.current)}},[e,r]),{onPointerDownCapture:()=>s.current=!0}}function bN(t,e=globalThis==null?void 0:globalThis.document){const r=Vt(t),s=x.useRef(!1);return x.useEffect(()=>{const i=l=>{l.target&&!s.current&&Wv(yN,r,{originalEvent:l},{discrete:!1})};return e.addEventListener(\"focusin\",i),()=>e.removeEventListener(\"focusin\",i)},[e,r]),{onFocusCapture:()=>s.current=!0,onBlurCapture:()=>s.current=!1}}function Jg(){const t=new CustomEvent(lf);document.dispatchEvent(t)}function Wv(t,e,r,{discrete:s}){const i=r.originalEvent.target,l=new CustomEvent(t,{bubbles:!1,cancelable:!0,detail:r});e&&i.addEventListener(t,e,{once:!0}),s?hN(i,l):i.dispatchEvent(l)}var Cd=0;function Kv(){x.useEffect(()=>{const t=document.querySelectorAll(\"[data-radix-focus-guard]\");return document.body.insertAdjacentElement(\"afterbegin\",t[0]??Zg()),document.body.insertAdjacentElement(\"beforeend\",t[1]??Zg()),Cd++,()=>{Cd===1&&document.querySelectorAll(\"[data-radix-focus-guard]\").forEach(e=>e.remove()),Cd--}},[])}function Zg(){const t=document.createElement(\"span\");return t.setAttribute(\"data-radix-focus-guard\",\"\"),t.tabIndex=0,t.style.outline=\"none\",t.style.opacity=\"0\",t.style.position=\"fixed\",t.style.pointerEvents=\"none\",t}var Ed=\"focusScope.autoFocusOnMount\",kd=\"focusScope.autoFocusOnUnmount\",ey={bubbles:!1,cancelable:!0},SN=\"FocusScope\",$f=x.forwardRef((t,e)=>{const{loop:r=!1,trapped:s=!1,onMountAutoFocus:i,onUnmountAutoFocus:l,...u}=t,[d,h]=x.useState(null),p=Vt(i),y=Vt(l),v=x.useRef(null),C=Ve(e,b=>h(b)),w=x.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;x.useEffect(()=>{if(s){let b=function(_){if(w.paused||!d)return;const A=_.target;d.contains(A)?v.current=A:Wr(v.current,{select:!0})},k=function(_){if(w.paused||!d)return;const A=_.relatedTarget;A!==null&&(d.contains(A)||Wr(v.current,{select:!0}))},T=function(_){if(document.activeElement===document.body)for(const F of _)F.removedNodes.length>0&&Wr(d)};document.addEventListener(\"focusin\",b),document.addEventListener(\"focusout\",k);const j=new MutationObserver(T);return d&&j.observe(d,{childList:!0,subtree:!0}),()=>{document.removeEventListener(\"focusin\",b),document.removeEventListener(\"focusout\",k),j.disconnect()}}},[s,d,w.paused]),x.useEffect(()=>{if(d){ny.add(w);const b=document.activeElement;if(!d.contains(b)){const T=new CustomEvent(Ed,ey);d.addEventListener(Ed,p),d.dispatchEvent(T),T.defaultPrevented||(CN(PN(qv(d)),{select:!0}),document.activeElement===b&&Wr(d))}return()=>{d.removeEventListener(Ed,p),setTimeout(()=>{const T=new CustomEvent(kd,ey);d.addEventListener(kd,y),d.dispatchEvent(T),T.defaultPrevented||Wr(b??document.body,{select:!0}),d.removeEventListener(kd,y),ny.remove(w)},0)}}},[d,p,y,w]);const E=x.useCallback(b=>{if(!r&&!s||w.paused)return;const k=b.key===\"Tab\"&&!b.altKey&&!b.ctrlKey&&!b.metaKey,T=document.activeElement;if(k&&T){const j=b.currentTarget,[_,A]=EN(j);_&&A?!b.shiftKey&&T===A?(b.preventDefault(),r&&Wr(_,{select:!0})):b.shiftKey&&T===_&&(b.preventDefault(),r&&Wr(A,{select:!0})):T===j&&b.preventDefault()}},[r,s,w.paused]);return g.jsx(ze.div,{tabIndex:-1,...u,ref:C,onKeyDown:E})});$f.displayName=SN;function CN(t,{select:e=!1}={}){const r=document.activeElement;for(const s of t)if(Wr(s,{select:e}),document.activeElement!==r)return}function EN(t){const e=qv(t),r=ty(e,t),s=ty(e.reverse(),t);return[r,s]}function qv(t){const e=[],r=document.createTreeWalker(t,NodeFilter.SHOW_ELEMENT,{acceptNode:s=>{const i=s.tagName===\"INPUT\"&&s.type===\"hidden\";return s.disabled||s.hidden||i?NodeFilter.FILTER_SKIP:s.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;r.nextNode();)e.push(r.currentNode);return e}function ty(t,e){for(const r of t)if(!kN(r,{upTo:e}))return r}function kN(t,{upTo:e}){if(getComputedStyle(t).visibility===\"hidden\")return!0;for(;t;){if(e!==void 0&&t===e)return!1;if(getComputedStyle(t).display===\"none\")return!0;t=t.parentElement}return!1}function NN(t){return t instanceof HTMLInputElement&&\"select\"in t}function Wr(t,{select:e=!1}={}){if(t&&t.focus){const r=document.activeElement;t.focus({preventScroll:!0}),t!==r&&NN(t)&&e&&t.select()}}var ny=RN();function RN(){let t=[];return{add(e){const r=t[0];e!==r&&(r==null||r.pause()),t=ry(t,e),t.unshift(e)},remove(e){var r;t=ry(t,e),(r=t[0])==null||r.resume()}}}function ry(t,e){const r=[...t],s=r.indexOf(e);return s!==-1&&r.splice(s,1),r}function PN(t){return t.filter(e=>e.tagName!==\"A\")}var mt=globalThis!=null&&globalThis.document?x.useLayoutEffect:()=>{},TN=Sf[\" useId \".trim().toString()]||(()=>{}),ON=0;function Ps(t){const[e,r]=x.useState(TN());return mt(()=>{r(s=>s??String(ON++))},[t]),e?`radix-${e}`:\"\"}const jN=[\"top\",\"right\",\"bottom\",\"left\"],no=Math.min,Xt=Math.max,Jl=Math.round,Tl=Math.floor,Xn=t=>({x:t,y:t}),_N={left:\"right\",right:\"left\",bottom:\"top\",top:\"bottom\"},AN={start:\"end\",end:\"start\"};function cf(t,e,r){return Xt(t,no(e,r))}function vr(t,e){return typeof t==\"function\"?t(e):t}function xr(t){return t.split(\"-\")[0]}function Xs(t){return t.split(\"-\")[1]}function Uf(t){return t===\"x\"?\"y\":\"x\"}function Bf(t){return t===\"y\"?\"height\":\"width\"}const LN=new Set([\"top\",\"bottom\"]);function Gn(t){return LN.has(xr(t))?\"y\":\"x\"}function Hf(t){return Uf(Gn(t))}function IN(t,e,r){r===void 0&&(r=!1);const s=Xs(t),i=Hf(t),l=Bf(i);let u=i===\"x\"?s===(r?\"end\":\"start\")?\"right\":\"left\":s===\"start\"?\"bottom\":\"top\";return e.reference[l]>e.floating[l]&&(u=Zl(u)),[u,Zl(u)]}function DN(t){const e=Zl(t);return[uf(t),e,uf(e)]}function uf(t){return t.replace(/start|end/g,e=>AN[e])}const oy=[\"left\",\"right\"],sy=[\"right\",\"left\"],MN=[\"top\",\"bottom\"],FN=[\"bottom\",\"top\"];function zN(t,e,r){switch(t){case\"top\":case\"bottom\":return r?e?sy:oy:e?oy:sy;case\"left\":case\"right\":return e?MN:FN;default:return[]}}function $N(t,e,r,s){const i=Xs(t);let l=zN(xr(t),r===\"start\",s);return i&&(l=l.map(u=>u+\"-\"+i),e&&(l=l.concat(l.map(uf)))),l}function Zl(t){return t.replace(/left|right|bottom|top/g,e=>_N[e])}function UN(t){return{top:0,right:0,bottom:0,left:0,...t}}function Qv(t){return typeof t!=\"number\"?UN(t):{top:t,right:t,bottom:t,left:t}}function ec(t){const{x:e,y:r,width:s,height:i}=t;return{width:s,height:i,top:r,left:e,right:e+s,bottom:r+i,x:e,y:r}}function iy(t,e,r){let{reference:s,floating:i}=t;const l=Gn(e),u=Hf(e),d=Bf(u),h=xr(e),p=l===\"y\",y=s.x+s.width/2-i.width/2,v=s.y+s.height/2-i.height/2,C=s[d]/2-i[d]/2;let w;switch(h){case\"top\":w={x:y,y:s.y-i.height};break;case\"bottom\":w={x:y,y:s.y+s.height};break;case\"right\":w={x:s.x+s.width,y:v};break;case\"left\":w={x:s.x-i.width,y:v};break;default:w={x:s.x,y:s.y}}switch(Xs(e)){case\"start\":w[u]-=C*(r&&p?-1:1);break;case\"end\":w[u]+=C*(r&&p?-1:1);break}return w}const BN=async(t,e,r)=>{const{placement:s=\"bottom\",strategy:i=\"absolute\",middleware:l=[],platform:u}=r,d=l.filter(Boolean),h=await(u.isRTL==null?void 0:u.isRTL(e));let p=await u.getElementRects({reference:t,floating:e,strategy:i}),{x:y,y:v}=iy(p,s,h),C=s,w={},E=0;for(let b=0;b<d.length;b++){const{name:k,fn:T}=d[b],{x:j,y:_,data:A,reset:F}=await T({x:y,y:v,initialPlacement:s,placement:C,strategy:i,middlewareData:w,rects:p,platform:u,elements:{reference:t,floating:e}});y=j??y,v=_??v,w={...w,[k]:{...w[k],...A}},F&&E<=50&&(E++,typeof F==\"object\"&&(F.placement&&(C=F.placement),F.rects&&(p=F.rects===!0?await u.getElementRects({reference:t,floating:e,strategy:i}):F.rects),{x:y,y:v}=iy(p,C,h)),b=-1)}return{x:y,y:v,placement:C,strategy:i,middlewareData:w}};async function Qi(t,e){var r;e===void 0&&(e={});const{x:s,y:i,platform:l,rects:u,elements:d,strategy:h}=t,{boundary:p=\"clippingAncestors\",rootBoundary:y=\"viewport\",elementContext:v=\"floating\",altBoundary:C=!1,padding:w=0}=vr(e,t),E=Qv(w),k=d[C?v===\"floating\"?\"reference\":\"floating\":v],T=ec(await l.getClippingRect({element:(r=await(l.isElement==null?void 0:l.isElement(k)))==null||r?k:k.contextElement||await(l.getDocumentElement==null?void 0:l.getDocumentElement(d.floating)),boundary:p,rootBoundary:y,strategy:h})),j=v===\"floating\"?{x:s,y:i,width:u.floating.width,height:u.floating.height}:u.reference,_=await(l.getOffsetParent==null?void 0:l.getOffsetParent(d.floating)),A=await(l.isElement==null?void 0:l.isElement(_))?await(l.getScale==null?void 0:l.getScale(_))||{x:1,y:1}:{x:1,y:1},F=ec(l.convertOffsetParentRelativeRectToViewportRelativeRect?await l.convertOffsetParentRelativeRectToViewportRelativeRect({elements:d,rect:j,offsetParent:_,strategy:h}):j);return{top:(T.top-F.top+E.top)/A.y,bottom:(F.bottom-T.bottom+E.bottom)/A.y,left:(T.left-F.left+E.left)/A.x,right:(F.right-T.right+E.right)/A.x}}const HN=t=>({name:\"arrow\",options:t,async fn(e){const{x:r,y:s,placement:i,rects:l,platform:u,elements:d,middlewareData:h}=e,{element:p,padding:y=0}=vr(t,e)||{};if(p==null)return{};const v=Qv(y),C={x:r,y:s},w=Hf(i),E=Bf(w),b=await u.getDimensions(p),k=w===\"y\",T=k?\"top\":\"left\",j=k?\"bottom\":\"right\",_=k?\"clientHeight\":\"clientWidth\",A=l.reference[E]+l.reference[w]-C[w]-l.floating[E],F=C[w]-l.reference[w],V=await(u.getOffsetParent==null?void 0:u.getOffsetParent(p));let B=V?V[_]:0;(!B||!await(u.isElement==null?void 0:u.isElement(V)))&&(B=d.floating[_]||l.floating[E]);const te=A/2-F/2,G=B/2-b[E]/2-1,W=no(v[T],G),le=no(v[j],G),K=W,Z=B-b[E]-le,J=B/2-b[E]/2+te,de=cf(K,J,Z),ne=!h.arrow&&Xs(i)!=null&&J!==de&&l.reference[E]/2-(J<K?W:le)-b[E]/2<0,se=ne?J<K?J-K:J-Z:0;return{[w]:C[w]+se,data:{[w]:de,centerOffset:J-de-se,...ne&&{alignmentOffset:se}},reset:ne}}}),VN=function(t){return t===void 0&&(t={}),{name:\"flip\",options:t,async fn(e){var r,s;const{placement:i,middlewareData:l,rects:u,initialPlacement:d,platform:h,elements:p}=e,{mainAxis:y=!0,crossAxis:v=!0,fallbackPlacements:C,fallbackStrategy:w=\"bestFit\",fallbackAxisSideDirection:E=\"none\",flipAlignment:b=!0,...k}=vr(t,e);if((r=l.arrow)!=null&&r.alignmentOffset)return{};const T=xr(i),j=Gn(d),_=xr(d)===d,A=await(h.isRTL==null?void 0:h.isRTL(p.floating)),F=C||(_||!b?[Zl(d)]:DN(d)),V=E!==\"none\";!C&&V&&F.push(...$N(d,b,E,A));const B=[d,...F],te=await Qi(e,k),G=[];let W=((s=l.flip)==null?void 0:s.overflows)||[];if(y&&G.push(te[T]),v){const J=IN(i,u,A);G.push(te[J[0]],te[J[1]])}if(W=[...W,{placement:i,overflows:G}],!G.every(J=>J<=0)){var le,K;const J=(((le=l.flip)==null?void 0:le.index)||0)+1,de=B[J];if(de&&(!(v===\"alignment\"?j!==Gn(de):!1)||W.every($=>Gn($.placement)===j?$.overflows[0]>0:!0)))return{data:{index:J,overflows:W},reset:{placement:de}};let ne=(K=W.filter(se=>se.overflows[0]<=0).sort((se,$)=>se.overflows[1]-$.overflows[1])[0])==null?void 0:K.placement;if(!ne)switch(w){case\"bestFit\":{var Z;const se=(Z=W.filter($=>{if(V){const H=Gn($.placement);return H===j||H===\"y\"}return!0}).map($=>[$.placement,$.overflows.filter(H=>H>0).reduce((H,Q)=>H+Q,0)]).sort(($,H)=>$[1]-H[1])[0])==null?void 0:Z[0];se&&(ne=se);break}case\"initialPlacement\":ne=d;break}if(i!==ne)return{reset:{placement:ne}}}return{}}}};function ay(t,e){return{top:t.top-e.height,right:t.right-e.width,bottom:t.bottom-e.height,left:t.left-e.width}}function ly(t){return jN.some(e=>t[e]>=0)}const WN=function(t){return t===void 0&&(t={}),{name:\"hide\",options:t,async fn(e){const{rects:r}=e,{strategy:s=\"referenceHidden\",...i}=vr(t,e);switch(s){case\"referenceHidden\":{const l=await Qi(e,{...i,elementContext:\"reference\"}),u=ay(l,r.reference);return{data:{referenceHiddenOffsets:u,referenceHidden:ly(u)}}}case\"escaped\":{const l=await Qi(e,{...i,altBoundary:!0}),u=ay(l,r.floating);return{data:{escapedOffsets:u,escaped:ly(u)}}}default:return{}}}}},Yv=new Set([\"left\",\"top\"]);async function KN(t,e){const{placement:r,platform:s,elements:i}=t,l=await(s.isRTL==null?void 0:s.isRTL(i.floating)),u=xr(r),d=Xs(r),h=Gn(r)===\"y\",p=Yv.has(u)?-1:1,y=l&&h?-1:1,v=vr(e,t);let{mainAxis:C,crossAxis:w,alignmentAxis:E}=typeof v==\"number\"?{mainAxis:v,crossAxis:0,alignmentAxis:null}:{mainAxis:v.mainAxis||0,crossAxis:v.crossAxis||0,alignmentAxis:v.alignmentAxis};return d&&typeof E==\"number\"&&(w=d===\"end\"?E*-1:E),h?{x:w*y,y:C*p}:{x:C*p,y:w*y}}const qN=function(t){return t===void 0&&(t=0),{name:\"offset\",options:t,async fn(e){var r,s;const{x:i,y:l,placement:u,middlewareData:d}=e,h=await KN(e,t);return u===((r=d.offset)==null?void 0:r.placement)&&(s=d.arrow)!=null&&s.alignmentOffset?{}:{x:i+h.x,y:l+h.y,data:{...h,placement:u}}}}},QN=function(t){return t===void 0&&(t={}),{name:\"shift\",options:t,async fn(e){const{x:r,y:s,placement:i}=e,{mainAxis:l=!0,crossAxis:u=!1,limiter:d={fn:k=>{let{x:T,y:j}=k;return{x:T,y:j}}},...h}=vr(t,e),p={x:r,y:s},y=await Qi(e,h),v=Gn(xr(i)),C=Uf(v);let w=p[C],E=p[v];if(l){const k=C===\"y\"?\"top\":\"left\",T=C===\"y\"?\"bottom\":\"right\",j=w+y[k],_=w-y[T];w=cf(j,w,_)}if(u){const k=v===\"y\"?\"top\":\"left\",T=v===\"y\"?\"bottom\":\"right\",j=E+y[k],_=E-y[T];E=cf(j,E,_)}const b=d.fn({...e,[C]:w,[v]:E});return{...b,data:{x:b.x-r,y:b.y-s,enabled:{[C]:l,[v]:u}}}}}},YN=function(t){return t===void 0&&(t={}),{options:t,fn(e){const{x:r,y:s,placement:i,rects:l,middlewareData:u}=e,{offset:d=0,mainAxis:h=!0,crossAxis:p=!0}=vr(t,e),y={x:r,y:s},v=Gn(i),C=Uf(v);let w=y[C],E=y[v];const b=vr(d,e),k=typeof b==\"number\"?{mainAxis:b,crossAxis:0}:{mainAxis:0,crossAxis:0,...b};if(h){const _=C===\"y\"?\"height\":\"width\",A=l.reference[C]-l.floating[_]+k.mainAxis,F=l.reference[C]+l.reference[_]-k.mainAxis;w<A?w=A:w>F&&(w=F)}if(p){var T,j;const _=C===\"y\"?\"width\":\"height\",A=Yv.has(xr(i)),F=l.reference[v]-l.floating[_]+(A&&((T=u.offset)==null?void 0:T[v])||0)+(A?0:k.crossAxis),V=l.reference[v]+l.reference[_]+(A?0:((j=u.offset)==null?void 0:j[v])||0)-(A?k.crossAxis:0);E<F?E=F:E>V&&(E=V)}return{[C]:w,[v]:E}}}},GN=function(t){return t===void 0&&(t={}),{name:\"size\",options:t,async fn(e){var r,s;const{placement:i,rects:l,platform:u,elements:d}=e,{apply:h=()=>{},...p}=vr(t,e),y=await Qi(e,p),v=xr(i),C=Xs(i),w=Gn(i)===\"y\",{width:E,height:b}=l.floating;let k,T;v===\"top\"||v===\"bottom\"?(k=v,T=C===(await(u.isRTL==null?void 0:u.isRTL(d.floating))?\"start\":\"end\")?\"left\":\"right\"):(T=v,k=C===\"end\"?\"top\":\"bottom\");const j=b-y.top-y.bottom,_=E-y.left-y.right,A=no(b-y[k],j),F=no(E-y[T],_),V=!e.middlewareData.shift;let B=A,te=F;if((r=e.middlewareData.shift)!=null&&r.enabled.x&&(te=_),(s=e.middlewareData.shift)!=null&&s.enabled.y&&(B=j),V&&!C){const W=Xt(y.left,0),le=Xt(y.right,0),K=Xt(y.top,0),Z=Xt(y.bottom,0);w?te=E-2*(W!==0||le!==0?W+le:Xt(y.left,y.right)):B=b-2*(K!==0||Z!==0?K+Z:Xt(y.top,y.bottom))}await h({...e,availableWidth:te,availableHeight:B});const G=await u.getDimensions(d.floating);return E!==G.width||b!==G.height?{reset:{rects:!0}}:{}}}};function mc(){return typeof window<\"u\"}function Js(t){return Gv(t)?(t.nodeName||\"\").toLowerCase():\"#document\"}function Jt(t){var e;return(t==null||(e=t.ownerDocument)==null?void 0:e.defaultView)||window}function Zn(t){var e;return(e=(Gv(t)?t.ownerDocument:t.document)||window.document)==null?void 0:e.documentElement}function Gv(t){return mc()?t instanceof Node||t instanceof Jt(t).Node:!1}function Nn(t){return mc()?t instanceof Element||t instanceof Jt(t).Element:!1}function Jn(t){return mc()?t instanceof HTMLElement||t instanceof Jt(t).HTMLElement:!1}function cy(t){return!mc()||typeof ShadowRoot>\"u\"?!1:t instanceof ShadowRoot||t instanceof Jt(t).ShadowRoot}const XN=new Set([\"inline\",\"contents\"]);function la(t){const{overflow:e,overflowX:r,overflowY:s,display:i}=Rn(t);return/auto|scroll|overlay|hidden|clip/.test(e+s+r)&&!XN.has(i)}const JN=new Set([\"table\",\"td\",\"th\"]);function ZN(t){return JN.has(Js(t))}const e2=[\":popover-open\",\":modal\"];function gc(t){return e2.some(e=>{try{return t.matches(e)}catch{return!1}})}const t2=[\"transform\",\"translate\",\"scale\",\"rotate\",\"perspective\"],n2=[\"transform\",\"translate\",\"scale\",\"rotate\",\"perspective\",\"filter\"],r2=[\"paint\",\"layout\",\"strict\",\"content\"];function Vf(t){const e=Wf(),r=Nn(t)?Rn(t):t;return t2.some(s=>r[s]?r[s]!==\"none\":!1)||(r.containerType?r.containerType!==\"normal\":!1)||!e&&(r.backdropFilter?r.backdropFilter!==\"none\":!1)||!e&&(r.filter?r.filter!==\"none\":!1)||n2.some(s=>(r.willChange||\"\").includes(s))||r2.some(s=>(r.contain||\"\").includes(s))}function o2(t){let e=ro(t);for(;Jn(e)&&!Vs(e);){if(Vf(e))return e;if(gc(e))return null;e=ro(e)}return null}function Wf(){return typeof CSS>\"u\"||!CSS.supports?!1:CSS.supports(\"-webkit-backdrop-filter\",\"none\")}const s2=new Set([\"html\",\"body\",\"#document\"]);function Vs(t){return s2.has(Js(t))}function Rn(t){return Jt(t).getComputedStyle(t)}function yc(t){return Nn(t)?{scrollLeft:t.scrollLeft,scrollTop:t.scrollTop}:{scrollLeft:t.scrollX,scrollTop:t.scrollY}}function ro(t){if(Js(t)===\"html\")return t;const e=t.assignedSlot||t.parentNode||cy(t)&&t.host||Zn(t);return cy(e)?e.host:e}function Xv(t){const e=ro(t);return Vs(e)?t.ownerDocument?t.ownerDocument.body:t.body:Jn(e)&&la(e)?e:Xv(e)}function Yi(t,e,r){var s;e===void 0&&(e=[]),r===void 0&&(r=!0);const i=Xv(t),l=i===((s=t.ownerDocument)==null?void 0:s.body),u=Jt(i);if(l){const d=df(u);return e.concat(u,u.visualViewport||[],la(i)?i:[],d&&r?Yi(d):[])}return e.concat(i,Yi(i,[],r))}function df(t){return t.parent&&Object.getPrototypeOf(t.parent)?t.frameElement:null}function Jv(t){const e=Rn(t);let r=parseFloat(e.width)||0,s=parseFloat(e.height)||0;const i=Jn(t),l=i?t.offsetWidth:r,u=i?t.offsetHeight:s,d=Jl(r)!==l||Jl(s)!==u;return d&&(r=l,s=u),{width:r,height:s,$:d}}function Kf(t){return Nn(t)?t:t.contextElement}function Ts(t){const e=Kf(t);if(!Jn(e))return Xn(1);const r=e.getBoundingClientRect(),{width:s,height:i,$:l}=Jv(e);let u=(l?Jl(r.width):r.width)/s,d=(l?Jl(r.height):r.height)/i;return(!u||!Number.isFinite(u))&&(u=1),(!d||!Number.isFinite(d))&&(d=1),{x:u,y:d}}const i2=Xn(0);function Zv(t){const e=Jt(t);return!Wf()||!e.visualViewport?i2:{x:e.visualViewport.offsetLeft,y:e.visualViewport.offsetTop}}function a2(t,e,r){return e===void 0&&(e=!1),!r||e&&r!==Jt(t)?!1:e}function Bo(t,e,r,s){e===void 0&&(e=!1),r===void 0&&(r=!1);const i=t.getBoundingClientRect(),l=Kf(t);let u=Xn(1);e&&(s?Nn(s)&&(u=Ts(s)):u=Ts(t));const d=a2(l,r,s)?Zv(l):Xn(0);let h=(i.left+d.x)/u.x,p=(i.top+d.y)/u.y,y=i.width/u.x,v=i.height/u.y;if(l){const C=Jt(l),w=s&&Nn(s)?Jt(s):s;let E=C,b=df(E);for(;b&&s&&w!==E;){const k=Ts(b),T=b.getBoundingClientRect(),j=Rn(b),_=T.left+(b.clientLeft+parseFloat(j.paddingLeft))*k.x,A=T.top+(b.clientTop+parseFloat(j.paddingTop))*k.y;h*=k.x,p*=k.y,y*=k.x,v*=k.y,h+=_,p+=A,E=Jt(b),b=df(E)}}return ec({width:y,height:v,x:h,y:p})}function vc(t,e){const r=yc(t).scrollLeft;return e?e.left+r:Bo(Zn(t)).left+r}function ex(t,e){const r=t.getBoundingClientRect(),s=r.left+e.scrollLeft-vc(t,r),i=r.top+e.scrollTop;return{x:s,y:i}}function l2(t){let{elements:e,rect:r,offsetParent:s,strategy:i}=t;const l=i===\"fixed\",u=Zn(s),d=e?gc(e.floating):!1;if(s===u||d&&l)return r;let h={scrollLeft:0,scrollTop:0},p=Xn(1);const y=Xn(0),v=Jn(s);if((v||!v&&!l)&&((Js(s)!==\"body\"||la(u))&&(h=yc(s)),Jn(s))){const w=Bo(s);p=Ts(s),y.x=w.x+s.clientLeft,y.y=w.y+s.clientTop}const C=u&&!v&&!l?ex(u,h):Xn(0);return{width:r.width*p.x,height:r.height*p.y,x:r.x*p.x-h.scrollLeft*p.x+y.x+C.x,y:r.y*p.y-h.scrollTop*p.y+y.y+C.y}}function c2(t){return Array.from(t.getClientRects())}function u2(t){const e=Zn(t),r=yc(t),s=t.ownerDocument.body,i=Xt(e.scrollWidth,e.clientWidth,s.scrollWidth,s.clientWidth),l=Xt(e.scrollHeight,e.clientHeight,s.scrollHeight,s.clientHeight);let u=-r.scrollLeft+vc(t);const d=-r.scrollTop;return Rn(s).direction===\"rtl\"&&(u+=Xt(e.clientWidth,s.clientWidth)-i),{width:i,height:l,x:u,y:d}}const uy=25;function d2(t,e){const r=Jt(t),s=Zn(t),i=r.visualViewport;let l=s.clientWidth,u=s.clientHeight,d=0,h=0;if(i){l=i.width,u=i.height;const y=Wf();(!y||y&&e===\"fixed\")&&(d=i.offsetLeft,h=i.offsetTop)}const p=vc(s);if(p<=0){const y=s.ownerDocument,v=y.body,C=getComputedStyle(v),w=y.compatMode===\"CSS1Compat\"&&parseFloat(C.marginLeft)+parseFloat(C.marginRight)||0,E=Math.abs(s.clientWidth-v.clientWidth-w);E<=uy&&(l-=E)}else p<=uy&&(l+=p);return{width:l,height:u,x:d,y:h}}const f2=new Set([\"absolute\",\"fixed\"]);function h2(t,e){const r=Bo(t,!0,e===\"fixed\"),s=r.top+t.clientTop,i=r.left+t.clientLeft,l=Jn(t)?Ts(t):Xn(1),u=t.clientWidth*l.x,d=t.clientHeight*l.y,h=i*l.x,p=s*l.y;return{width:u,height:d,x:h,y:p}}function dy(t,e,r){let s;if(e===\"viewport\")s=d2(t,r);else if(e===\"document\")s=u2(Zn(t));else if(Nn(e))s=h2(e,r);else{const i=Zv(t);s={x:e.x-i.x,y:e.y-i.y,width:e.width,height:e.height}}return ec(s)}function tx(t,e){const r=ro(t);return r===e||!Nn(r)||Vs(r)?!1:Rn(r).position===\"fixed\"||tx(r,e)}function p2(t,e){const r=e.get(t);if(r)return r;let s=Yi(t,[],!1).filter(d=>Nn(d)&&Js(d)!==\"body\"),i=null;const l=Rn(t).position===\"fixed\";let u=l?ro(t):t;for(;Nn(u)&&!Vs(u);){const d=Rn(u),h=Vf(u);!h&&d.position===\"fixed\"&&(i=null),(l?!h&&!i:!h&&d.position===\"static\"&&!!i&&f2.has(i.position)||la(u)&&!h&&tx(t,u))?s=s.filter(y=>y!==u):i=d,u=ro(u)}return e.set(t,s),s}function m2(t){let{element:e,boundary:r,rootBoundary:s,strategy:i}=t;const u=[...r===\"clippingAncestors\"?gc(e)?[]:p2(e,this._c):[].concat(r),s],d=u[0],h=u.reduce((p,y)=>{const v=dy(e,y,i);return p.top=Xt(v.top,p.top),p.right=no(v.right,p.right),p.bottom=no(v.bottom,p.bottom),p.left=Xt(v.left,p.left),p},dy(e,d,i));return{width:h.right-h.left,height:h.bottom-h.top,x:h.left,y:h.top}}function g2(t){const{width:e,height:r}=Jv(t);return{width:e,height:r}}function y2(t,e,r){const s=Jn(e),i=Zn(e),l=r===\"fixed\",u=Bo(t,!0,l,e);let d={scrollLeft:0,scrollTop:0};const h=Xn(0);function p(){h.x=vc(i)}if(s||!s&&!l)if((Js(e)!==\"body\"||la(i))&&(d=yc(e)),s){const w=Bo(e,!0,l,e);h.x=w.x+e.clientLeft,h.y=w.y+e.clientTop}else i&&p();l&&!s&&i&&p();const y=i&&!s&&!l?ex(i,d):Xn(0),v=u.left+d.scrollLeft-h.x-y.x,C=u.top+d.scrollTop-h.y-y.y;return{x:v,y:C,width:u.width,height:u.height}}function Nd(t){return Rn(t).position===\"static\"}function fy(t,e){if(!Jn(t)||Rn(t).position===\"fixed\")return null;if(e)return e(t);let r=t.offsetParent;return Zn(t)===r&&(r=r.ownerDocument.body),r}function nx(t,e){const r=Jt(t);if(gc(t))return r;if(!Jn(t)){let i=ro(t);for(;i&&!Vs(i);){if(Nn(i)&&!Nd(i))return i;i=ro(i)}return r}let s=fy(t,e);for(;s&&ZN(s)&&Nd(s);)s=fy(s,e);return s&&Vs(s)&&Nd(s)&&!Vf(s)?r:s||o2(t)||r}const v2=async function(t){const e=this.getOffsetParent||nx,r=this.getDimensions,s=await r(t.floating);return{reference:y2(t.reference,await e(t.floating),t.strategy),floating:{x:0,y:0,width:s.width,height:s.height}}};function x2(t){return Rn(t).direction===\"rtl\"}const w2={convertOffsetParentRelativeRectToViewportRelativeRect:l2,getDocumentElement:Zn,getClippingRect:m2,getOffsetParent:nx,getElementRects:v2,getClientRects:c2,getDimensions:g2,getScale:Ts,isElement:Nn,isRTL:x2};function rx(t,e){return t.x===e.x&&t.y===e.y&&t.width===e.width&&t.height===e.height}function b2(t,e){let r=null,s;const i=Zn(t);function l(){var d;clearTimeout(s),(d=r)==null||d.disconnect(),r=null}function u(d,h){d===void 0&&(d=!1),h===void 0&&(h=1),l();const p=t.getBoundingClientRect(),{left:y,top:v,width:C,height:w}=p;if(d||e(),!C||!w)return;const E=Tl(v),b=Tl(i.clientWidth-(y+C)),k=Tl(i.clientHeight-(v+w)),T=Tl(y),_={rootMargin:-E+\"px \"+-b+\"px \"+-k+\"px \"+-T+\"px\",threshold:Xt(0,no(1,h))||1};let A=!0;function F(V){const B=V[0].intersectionRatio;if(B!==h){if(!A)return u();B?u(!1,B):s=setTimeout(()=>{u(!1,1e-7)},1e3)}B===1&&!rx(p,t.getBoundingClientRect())&&u(),A=!1}try{r=new IntersectionObserver(F,{..._,root:i.ownerDocument})}catch{r=new IntersectionObserver(F,_)}r.observe(t)}return u(!0),l}function S2(t,e,r,s){s===void 0&&(s={});const{ancestorScroll:i=!0,ancestorResize:l=!0,elementResize:u=typeof ResizeObserver==\"function\",layoutShift:d=typeof IntersectionObserver==\"function\",animationFrame:h=!1}=s,p=Kf(t),y=i||l?[...p?Yi(p):[],...Yi(e)]:[];y.forEach(T=>{i&&T.addEventListener(\"scroll\",r,{passive:!0}),l&&T.addEventListener(\"resize\",r)});const v=p&&d?b2(p,r):null;let C=-1,w=null;u&&(w=new ResizeObserver(T=>{let[j]=T;j&&j.target===p&&w&&(w.unobserve(e),cancelAnimationFrame(C),C=requestAnimationFrame(()=>{var _;(_=w)==null||_.observe(e)})),r()}),p&&!h&&w.observe(p),w.observe(e));let E,b=h?Bo(t):null;h&&k();function k(){const T=Bo(t);b&&!rx(b,T)&&r(),b=T,E=requestAnimationFrame(k)}return r(),()=>{var T;y.forEach(j=>{i&&j.removeEventListener(\"scroll\",r),l&&j.removeEventListener(\"resize\",r)}),v==null||v(),(T=w)==null||T.disconnect(),w=null,h&&cancelAnimationFrame(E)}}const C2=qN,E2=QN,k2=VN,N2=GN,R2=WN,hy=HN,P2=YN,T2=(t,e,r)=>{const s=new Map,i={platform:w2,...r},l={...i.platform,_c:s};return BN(t,e,{...i,platform:l})};var O2=typeof document<\"u\",j2=function(){},$l=O2?x.useLayoutEffect:j2;function tc(t,e){if(t===e)return!0;if(typeof t!=typeof e)return!1;if(typeof t==\"function\"&&t.toString()===e.toString())return!0;let r,s,i;if(t&&e&&typeof t==\"object\"){if(Array.isArray(t)){if(r=t.length,r!==e.length)return!1;for(s=r;s--!==0;)if(!tc(t[s],e[s]))return!1;return!0}if(i=Object.keys(t),r=i.length,r!==Object.keys(e).length)return!1;for(s=r;s--!==0;)if(!{}.hasOwnProperty.call(e,i[s]))return!1;for(s=r;s--!==0;){const l=i[s];if(!(l===\"_owner\"&&t.$$typeof)&&!tc(t[l],e[l]))return!1}return!0}return t!==t&&e!==e}function ox(t){return typeof window>\"u\"?1:(t.ownerDocument.defaultView||window).devicePixelRatio||1}function py(t,e){const r=ox(t);return Math.round(e*r)/r}function Rd(t){const e=x.useRef(t);return $l(()=>{e.current=t}),e}function _2(t){t===void 0&&(t={});const{placement:e=\"bottom\",strategy:r=\"absolute\",middleware:s=[],platform:i,elements:{reference:l,floating:u}={},transform:d=!0,whileElementsMounted:h,open:p}=t,[y,v]=x.useState({x:0,y:0,strategy:r,placement:e,middlewareData:{},isPositioned:!1}),[C,w]=x.useState(s);tc(C,s)||w(s);const[E,b]=x.useState(null),[k,T]=x.useState(null),j=x.useCallback($=>{$!==V.current&&(V.current=$,b($))},[]),_=x.useCallback($=>{$!==B.current&&(B.current=$,T($))},[]),A=l||E,F=u||k,V=x.useRef(null),B=x.useRef(null),te=x.useRef(y),G=h!=null,W=Rd(h),le=Rd(i),K=Rd(p),Z=x.useCallback(()=>{if(!V.current||!B.current)return;const $={placement:e,strategy:r,middleware:C};le.current&&($.platform=le.current),T2(V.current,B.current,$).then(H=>{const Q={...H,isPositioned:K.current!==!1};J.current&&!tc(te.current,Q)&&(te.current=Q,na.flushSync(()=>{v(Q)}))})},[C,e,r,le,K]);$l(()=>{p===!1&&te.current.isPositioned&&(te.current.isPositioned=!1,v($=>({...$,isPositioned:!1})))},[p]);const J=x.useRef(!1);$l(()=>(J.current=!0,()=>{J.current=!1}),[]),$l(()=>{if(A&&(V.current=A),F&&(B.current=F),A&&F){if(W.current)return W.current(A,F,Z);Z()}},[A,F,Z,W,G]);const de=x.useMemo(()=>({reference:V,floating:B,setReference:j,setFloating:_}),[j,_]),ne=x.useMemo(()=>({reference:A,floating:F}),[A,F]),se=x.useMemo(()=>{const $={position:r,left:0,top:0};if(!ne.floating)return $;const H=py(ne.floating,y.x),Q=py(ne.floating,y.y);return d?{...$,transform:\"translate(\"+H+\"px, \"+Q+\"px)\",...ox(ne.floating)>=1.5&&{willChange:\"transform\"}}:{position:r,left:H,top:Q}},[r,d,ne.floating,y.x,y.y]);return x.useMemo(()=>({...y,update:Z,refs:de,elements:ne,floatingStyles:se}),[y,Z,de,ne,se])}const A2=t=>{function e(r){return{}.hasOwnProperty.call(r,\"current\")}return{name:\"arrow\",options:t,fn(r){const{element:s,padding:i}=typeof t==\"function\"?t(r):t;return s&&e(s)?s.current!=null?hy({element:s.current,padding:i}).fn(r):{}:s?hy({element:s,padding:i}).fn(r):{}}}},L2=(t,e)=>({...C2(t),options:[t,e]}),I2=(t,e)=>({...E2(t),options:[t,e]}),D2=(t,e)=>({...P2(t),options:[t,e]}),M2=(t,e)=>({...k2(t),options:[t,e]}),F2=(t,e)=>({...N2(t),options:[t,e]}),z2=(t,e)=>({...R2(t),options:[t,e]}),$2=(t,e)=>({...A2(t),options:[t,e]});var U2=\"Arrow\",sx=x.forwardRef((t,e)=>{const{children:r,width:s=10,height:i=5,...l}=t;return g.jsx(ze.svg,{...l,ref:e,width:s,height:i,viewBox:\"0 0 30 10\",preserveAspectRatio:\"none\",children:t.asChild?r:g.jsx(\"polygon\",{points:\"0,0 30,0 15,10\"})})});sx.displayName=U2;var B2=sx;function H2(t){const[e,r]=x.useState(void 0);return mt(()=>{if(t){r({width:t.offsetWidth,height:t.offsetHeight});const s=new ResizeObserver(i=>{if(!Array.isArray(i)||!i.length)return;const l=i[0];let u,d;if(\"borderBoxSize\"in l){const h=l.borderBoxSize,p=Array.isArray(h)?h[0]:h;u=p.inlineSize,d=p.blockSize}else u=t.offsetWidth,d=t.offsetHeight;r({width:u,height:d})});return s.observe(t,{box:\"border-box\"}),()=>s.unobserve(t)}else r(void 0)},[t]),e}var qf=\"Popper\",[ix,ax]=aa(qf),[V2,lx]=ix(qf),cx=t=>{const{__scopePopper:e,children:r}=t,[s,i]=x.useState(null);return g.jsx(V2,{scope:e,anchor:s,onAnchorChange:i,children:r})};cx.displayName=qf;var ux=\"PopperAnchor\",dx=x.forwardRef((t,e)=>{const{__scopePopper:r,virtualRef:s,...i}=t,l=lx(ux,r),u=x.useRef(null),d=Ve(e,u),h=x.useRef(null);return x.useEffect(()=>{const p=h.current;h.current=(s==null?void 0:s.current)||u.current,p!==h.current&&l.onAnchorChange(h.current)}),s?null:g.jsx(ze.div,{...i,ref:d})});dx.displayName=ux;var Qf=\"PopperContent\",[W2,K2]=ix(Qf),fx=x.forwardRef((t,e)=>{var ee,ye,Se,Ne,Oe,_e;const{__scopePopper:r,side:s=\"bottom\",sideOffset:i=0,align:l=\"center\",alignOffset:u=0,arrowPadding:d=0,avoidCollisions:h=!0,collisionBoundary:p=[],collisionPadding:y=0,sticky:v=\"partial\",hideWhenDetached:C=!1,updatePositionStrategy:w=\"optimized\",onPlaced:E,...b}=t,k=lx(Qf,r),[T,j]=x.useState(null),_=Ve(e,et=>j(et)),[A,F]=x.useState(null),V=H2(A),B=(V==null?void 0:V.width)??0,te=(V==null?void 0:V.height)??0,G=s+(l!==\"center\"?\"-\"+l:\"\"),W=typeof y==\"number\"?y:{top:0,right:0,bottom:0,left:0,...y},le=Array.isArray(p)?p:[p],K=le.length>0,Z={padding:W,boundary:le.filter(Q2),altBoundary:K},{refs:J,floatingStyles:de,placement:ne,isPositioned:se,middlewareData:$}=_2({strategy:\"fixed\",placement:G,whileElementsMounted:(...et)=>S2(...et,{animationFrame:w===\"always\"}),elements:{reference:k.anchor},middleware:[L2({mainAxis:i+te,alignmentAxis:u}),h&&I2({mainAxis:!0,crossAxis:!1,limiter:v===\"partial\"?D2():void 0,...Z}),h&&M2({...Z}),F2({...Z,apply:({elements:et,rects:gt,availableWidth:On,availableHeight:dn})=>{const{width:fn,height:wr}=gt.reference,jn=et.floating.style;jn.setProperty(\"--radix-popper-available-width\",`${On}px`),jn.setProperty(\"--radix-popper-available-height\",`${dn}px`),jn.setProperty(\"--radix-popper-anchor-width\",`${fn}px`),jn.setProperty(\"--radix-popper-anchor-height\",`${wr}px`)}}),A&&$2({element:A,padding:d}),Y2({arrowWidth:B,arrowHeight:te}),C&&z2({strategy:\"referenceHidden\",...Z})]}),[H,Q]=mx(ne),P=Vt(E);mt(()=>{se&&(P==null||P())},[se,P]);const M=(ee=$.arrow)==null?void 0:ee.x,ie=(ye=$.arrow)==null?void 0:ye.y,ae=((Se=$.arrow)==null?void 0:Se.centerOffset)!==0,[me,be]=x.useState();return mt(()=>{T&&be(window.getComputedStyle(T).zIndex)},[T]),g.jsx(\"div\",{ref:J.setFloating,\"data-radix-popper-content-wrapper\":\"\",style:{...de,transform:se?de.transform:\"translate(0, -200%)\",minWidth:\"max-content\",zIndex:me,\"--radix-popper-transform-origin\":[(Ne=$.transformOrigin)==null?void 0:Ne.x,(Oe=$.transformOrigin)==null?void 0:Oe.y].join(\" \"),...((_e=$.hide)==null?void 0:_e.referenceHidden)&&{visibility:\"hidden\",pointerEvents:\"none\"}},dir:t.dir,children:g.jsx(W2,{scope:r,placedSide:H,onArrowChange:F,arrowX:M,arrowY:ie,shouldHideArrow:ae,children:g.jsx(ze.div,{\"data-side\":H,\"data-align\":Q,...b,ref:_,style:{...b.style,animation:se?void 0:\"none\"}})})})});fx.displayName=Qf;var hx=\"PopperArrow\",q2={top:\"bottom\",right:\"left\",bottom:\"top\",left:\"right\"},px=x.forwardRef(function(e,r){const{__scopePopper:s,...i}=e,l=K2(hx,s),u=q2[l.placedSide];return g.jsx(\"span\",{ref:l.onArrowChange,style:{position:\"absolute\",left:l.arrowX,top:l.arrowY,[u]:0,transformOrigin:{top:\"\",right:\"0 0\",bottom:\"center 0\",left:\"100% 0\"}[l.placedSide],transform:{top:\"translateY(100%)\",right:\"translateY(50%) rotate(90deg) translateX(-50%)\",bottom:\"rotate(180deg)\",left:\"translateY(50%) rotate(-90deg) translateX(50%)\"}[l.placedSide],visibility:l.shouldHideArrow?\"hidden\":void 0},children:g.jsx(B2,{...i,ref:r,style:{...i.style,display:\"block\"}})})});px.displayName=hx;function Q2(t){return t!==null}var Y2=t=>({name:\"transformOrigin\",options:t,fn(e){var k,T,j;const{placement:r,rects:s,middlewareData:i}=e,u=((k=i.arrow)==null?void 0:k.centerOffset)!==0,d=u?0:t.arrowWidth,h=u?0:t.arrowHeight,[p,y]=mx(r),v={start:\"0%\",center:\"50%\",end:\"100%\"}[y],C=(((T=i.arrow)==null?void 0:T.x)??0)+d/2,w=(((j=i.arrow)==null?void 0:j.y)??0)+h/2;let E=\"\",b=\"\";return p===\"bottom\"?(E=u?v:`${C}px`,b=`${-h}px`):p===\"top\"?(E=u?v:`${C}px`,b=`${s.floating.height+h}px`):p===\"right\"?(E=`${-h}px`,b=u?v:`${w}px`):p===\"left\"&&(E=`${s.floating.width+h}px`,b=u?v:`${w}px`),{data:{x:E,y:b}}}});function mx(t){const[e,r=\"center\"]=t.split(\"-\");return[e,r]}var G2=cx,X2=dx,J2=fx,Z2=px,eR=\"Portal\",Yf=x.forwardRef((t,e)=>{var d;const{container:r,...s}=t,[i,l]=x.useState(!1);mt(()=>l(!0),[]);const u=r||i&&((d=globalThis==null?void 0:globalThis.document)==null?void 0:d.body);return u?Jy.createPortal(g.jsx(ze.div,{...s,ref:e}),u):null});Yf.displayName=eR;function tR(t){const e=nR(t),r=x.forwardRef((s,i)=>{const{children:l,...u}=s,d=x.Children.toArray(l),h=d.find(oR);if(h){const p=h.props.children,y=d.map(v=>v===h?x.Children.count(p)>1?x.Children.only(null):x.isValidElement(p)?p.props.children:null:v);return g.jsx(e,{...u,ref:i,children:x.isValidElement(p)?x.cloneElement(p,void 0,y):null})}return g.jsx(e,{...u,ref:i,children:l})});return r.displayName=`${t}.Slot`,r}function nR(t){const e=x.forwardRef((r,s)=>{const{children:i,...l}=r;if(x.isValidElement(i)){const u=iR(i),d=sR(l,i.props);return i.type!==x.Fragment&&(d.ref=s?Gs(s,u):u),x.cloneElement(i,d)}return x.Children.count(i)>1?x.Children.only(null):null});return e.displayName=`${t}.SlotClone`,e}var rR=Symbol(\"radix.slottable\");function oR(t){return x.isValidElement(t)&&typeof t.type==\"function\"&&\"__radixId\"in t.type&&t.type.__radixId===rR}function sR(t,e){const r={...e};for(const s in e){const i=t[s],l=e[s];/^on[A-Z]/.test(s)?i&&l?r[s]=(...d)=>{const h=l(...d);return i(...d),h}:i&&(r[s]=i):s===\"style\"?r[s]={...i,...l}:s===\"className\"&&(r[s]=[i,l].filter(Boolean).join(\" \"))}return{...t,...r}}function iR(t){var s,i;let e=(s=Object.getOwnPropertyDescriptor(t.props,\"ref\"))==null?void 0:s.get,r=e&&\"isReactWarning\"in e&&e.isReactWarning;return r?t.ref:(e=(i=Object.getOwnPropertyDescriptor(t,\"ref\"))==null?void 0:i.get,r=e&&\"isReactWarning\"in e&&e.isReactWarning,r?t.props.ref:t.props.ref||t.ref)}var aR=Sf[\" useInsertionEffect \".trim().toString()]||mt;function ff({prop:t,defaultProp:e,onChange:r=()=>{},caller:s}){const[i,l,u]=lR({defaultProp:e,onChange:r}),d=t!==void 0,h=d?t:i;{const y=x.useRef(t!==void 0);x.useEffect(()=>{const v=y.current;v!==d&&console.warn(`${s} is changing from ${v?\"controlled\":\"uncontrolled\"} to ${d?\"controlled\":\"uncontrolled\"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),y.current=d},[d,s])}const p=x.useCallback(y=>{var v;if(d){const C=cR(y)?y(t):y;C!==t&&((v=u.current)==null||v.call(u,C))}else l(y)},[d,t,l,u]);return[h,p]}function lR({defaultProp:t,onChange:e}){const[r,s]=x.useState(t),i=x.useRef(r),l=x.useRef(e);return aR(()=>{l.current=e},[e]),x.useEffect(()=>{var u;i.current!==r&&((u=l.current)==null||u.call(l,r),i.current=r)},[r,i]),[r,s,l]}function cR(t){return typeof t==\"function\"}function uR(t){const e=x.useRef({value:t,previous:t});return x.useMemo(()=>(e.current.value!==t&&(e.current.previous=e.current.value,e.current.value=t),e.current.previous),[t])}var gx=Object.freeze({position:\"absolute\",border:0,width:1,height:1,padding:0,margin:-1,overflow:\"hidden\",clip:\"rect(0, 0, 0, 0)\",whiteSpace:\"nowrap\",wordWrap:\"normal\"}),dR=\"VisuallyHidden\",fR=x.forwardRef((t,e)=>g.jsx(ze.span,{...t,ref:e,style:{...gx,...t.style}}));fR.displayName=dR;var hR=function(t){if(typeof document>\"u\")return null;var e=Array.isArray(t)?t[0]:t;return e.ownerDocument.body},ws=new WeakMap,Ol=new WeakMap,jl={},Pd=0,yx=function(t){return t&&(t.host||yx(t.parentNode))},pR=function(t,e){return e.map(function(r){if(t.contains(r))return r;var s=yx(r);return s&&t.contains(s)?s:(console.error(\"aria-hidden\",r,\"in not contained inside\",t,\". Doing nothing\"),null)}).filter(function(r){return!!r})},mR=function(t,e,r,s){var i=pR(e,Array.isArray(t)?t:[t]);jl[r]||(jl[r]=new WeakMap);var l=jl[r],u=[],d=new Set,h=new Set(i),p=function(v){!v||d.has(v)||(d.add(v),p(v.parentNode))};i.forEach(p);var y=function(v){!v||h.has(v)||Array.prototype.forEach.call(v.children,function(C){if(d.has(C))y(C);else try{var w=C.getAttribute(s),E=w!==null&&w!==\"false\",b=(ws.get(C)||0)+1,k=(l.get(C)||0)+1;ws.set(C,b),l.set(C,k),u.push(C),b===1&&E&&Ol.set(C,!0),k===1&&C.setAttribute(r,\"true\"),E||C.setAttribute(s,\"true\")}catch(T){console.error(\"aria-hidden: cannot operate on \",C,T)}})};return y(e),d.clear(),Pd++,function(){u.forEach(function(v){var C=ws.get(v)-1,w=l.get(v)-1;ws.set(v,C),l.set(v,w),C||(Ol.has(v)||v.removeAttribute(s),Ol.delete(v)),w||v.removeAttribute(r)}),Pd--,Pd||(ws=new WeakMap,ws=new WeakMap,Ol=new WeakMap,jl={})}},vx=function(t,e,r){r===void 0&&(r=\"data-aria-hidden\");var s=Array.from(Array.isArray(t)?t:[t]),i=hR(t);return i?(s.push.apply(s,Array.from(i.querySelectorAll(\"[aria-live], script\"))),mR(s,i,r,\"aria-hidden\")):function(){return null}},qn=function(){return qn=Object.assign||function(e){for(var r,s=1,i=arguments.length;s<i;s++){r=arguments[s];for(var l in r)Object.prototype.hasOwnProperty.call(r,l)&&(e[l]=r[l])}return e},qn.apply(this,arguments)};function xx(t,e){var r={};for(var s in t)Object.prototype.hasOwnProperty.call(t,s)&&e.indexOf(s)<0&&(r[s]=t[s]);if(t!=null&&typeof Object.getOwnPropertySymbols==\"function\")for(var i=0,s=Object.getOwnPropertySymbols(t);i<s.length;i++)e.indexOf(s[i])<0&&Object.prototype.propertyIsEnumerable.call(t,s[i])&&(r[s[i]]=t[s[i]]);return r}function gR(t,e,r){if(r||arguments.length===2)for(var s=0,i=e.length,l;s<i;s++)(l||!(s in e))&&(l||(l=Array.prototype.slice.call(e,0,s)),l[s]=e[s]);return t.concat(l||Array.prototype.slice.call(e))}var Ul=\"right-scroll-bar-position\",Bl=\"width-before-scroll-bar\",yR=\"with-scroll-bars-hidden\",vR=\"--removed-body-scroll-bar-size\";function Td(t,e){return typeof t==\"function\"?t(e):t&&(t.current=e),t}function xR(t,e){var r=x.useState(function(){return{value:t,callback:e,facade:{get current(){return r.value},set current(s){var i=r.value;i!==s&&(r.value=s,r.callback(s,i))}}}})[0];return r.callback=e,r.facade}var wR=typeof window<\"u\"?x.useLayoutEffect:x.useEffect,my=new WeakMap;function bR(t,e){var r=xR(null,function(s){return t.forEach(function(i){return Td(i,s)})});return wR(function(){var s=my.get(r);if(s){var i=new Set(s),l=new Set(t),u=r.current;i.forEach(function(d){l.has(d)||Td(d,null)}),l.forEach(function(d){i.has(d)||Td(d,u)})}my.set(r,t)},[t]),r}function SR(t){return t}function CR(t,e){e===void 0&&(e=SR);var r=[],s=!1,i={read:function(){if(s)throw new Error(\"Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`.\");return r.length?r[r.length-1]:t},useMedium:function(l){var u=e(l,s);return r.push(u),function(){r=r.filter(function(d){return d!==u})}},assignSyncMedium:function(l){for(s=!0;r.length;){var u=r;r=[],u.forEach(l)}r={push:function(d){return l(d)},filter:function(){return r}}},assignMedium:function(l){s=!0;var u=[];if(r.length){var d=r;r=[],d.forEach(l),u=r}var h=function(){var y=u;u=[],y.forEach(l)},p=function(){return Promise.resolve().then(h)};p(),r={push:function(y){u.push(y),p()},filter:function(y){return u=u.filter(y),r}}}};return i}function ER(t){t===void 0&&(t={});var e=CR(null);return e.options=qn({async:!0,ssr:!1},t),e}var wx=function(t){var e=t.sideCar,r=xx(t,[\"sideCar\"]);if(!e)throw new Error(\"Sidecar: please provide `sideCar` property to import the right car\");var s=e.read();if(!s)throw new Error(\"Sidecar medium not found\");return x.createElement(s,qn({},r))};wx.isSideCarExport=!0;function kR(t,e){return t.useMedium(e),wx}var bx=ER(),Od=function(){},xc=x.forwardRef(function(t,e){var r=x.useRef(null),s=x.useState({onScrollCapture:Od,onWheelCapture:Od,onTouchMoveCapture:Od}),i=s[0],l=s[1],u=t.forwardProps,d=t.children,h=t.className,p=t.removeScrollBar,y=t.enabled,v=t.shards,C=t.sideCar,w=t.noRelative,E=t.noIsolation,b=t.inert,k=t.allowPinchZoom,T=t.as,j=T===void 0?\"div\":T,_=t.gapMode,A=xx(t,[\"forwardProps\",\"children\",\"className\",\"removeScrollBar\",\"enabled\",\"shards\",\"sideCar\",\"noRelative\",\"noIsolation\",\"inert\",\"allowPinchZoom\",\"as\",\"gapMode\"]),F=C,V=bR([r,e]),B=qn(qn({},A),i);return x.createElement(x.Fragment,null,y&&x.createElement(F,{sideCar:bx,removeScrollBar:p,shards:v,noRelative:w,noIsolation:E,inert:b,setCallbacks:l,allowPinchZoom:!!k,lockRef:r,gapMode:_}),u?x.cloneElement(x.Children.only(d),qn(qn({},B),{ref:V})):x.createElement(j,qn({},B,{className:h,ref:V}),d))});xc.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1};xc.classNames={fullWidth:Bl,zeroRight:Ul};var NR=function(){if(typeof __webpack_nonce__<\"u\")return __webpack_nonce__};function RR(){if(!document)return null;var t=document.createElement(\"style\");t.type=\"text/css\";var e=NR();return e&&t.setAttribute(\"nonce\",e),t}function PR(t,e){t.styleSheet?t.styleSheet.cssText=e:t.appendChild(document.createTextNode(e))}function TR(t){var e=document.head||document.getElementsByTagName(\"head\")[0];e.appendChild(t)}var OR=function(){var t=0,e=null;return{add:function(r){t==0&&(e=RR())&&(PR(e,r),TR(e)),t++},remove:function(){t--,!t&&e&&(e.parentNode&&e.parentNode.removeChild(e),e=null)}}},jR=function(){var t=OR();return function(e,r){x.useEffect(function(){return t.add(e),function(){t.remove()}},[e&&r])}},Sx=function(){var t=jR(),e=function(r){var s=r.styles,i=r.dynamic;return t(s,i),null};return e},_R={left:0,top:0,right:0,gap:0},jd=function(t){return parseInt(t||\"\",10)||0},AR=function(t){var e=window.getComputedStyle(document.body),r=e[t===\"padding\"?\"paddingLeft\":\"marginLeft\"],s=e[t===\"padding\"?\"paddingTop\":\"marginTop\"],i=e[t===\"padding\"?\"paddingRight\":\"marginRight\"];return[jd(r),jd(s),jd(i)]},LR=function(t){if(t===void 0&&(t=\"margin\"),typeof window>\"u\")return _R;var e=AR(t),r=document.documentElement.clientWidth,s=window.innerWidth;return{left:e[0],top:e[1],right:e[2],gap:Math.max(0,s-r+e[2]-e[0])}},IR=Sx(),Os=\"data-scroll-locked\",DR=function(t,e,r,s){var i=t.left,l=t.top,u=t.right,d=t.gap;return r===void 0&&(r=\"margin\"),`\n  .`.concat(yR,` {\n   overflow: hidden `).concat(s,`;\n   padding-right: `).concat(d,\"px \").concat(s,`;\n  }\n  body[`).concat(Os,`] {\n    overflow: hidden `).concat(s,`;\n    overscroll-behavior: contain;\n    `).concat([e&&\"position: relative \".concat(s,\";\"),r===\"margin\"&&`\n    padding-left: `.concat(i,`px;\n    padding-top: `).concat(l,`px;\n    padding-right: `).concat(u,`px;\n    margin-left:0;\n    margin-top:0;\n    margin-right: `).concat(d,\"px \").concat(s,`;\n    `),r===\"padding\"&&\"padding-right: \".concat(d,\"px \").concat(s,\";\")].filter(Boolean).join(\"\"),`\n  }\n  \n  .`).concat(Ul,` {\n    right: `).concat(d,\"px \").concat(s,`;\n  }\n  \n  .`).concat(Bl,` {\n    margin-right: `).concat(d,\"px \").concat(s,`;\n  }\n  \n  .`).concat(Ul,\" .\").concat(Ul,` {\n    right: 0 `).concat(s,`;\n  }\n  \n  .`).concat(Bl,\" .\").concat(Bl,` {\n    margin-right: 0 `).concat(s,`;\n  }\n  \n  body[`).concat(Os,`] {\n    `).concat(vR,\": \").concat(d,`px;\n  }\n`)},gy=function(){var t=parseInt(document.body.getAttribute(Os)||\"0\",10);return isFinite(t)?t:0},MR=function(){x.useEffect(function(){return document.body.setAttribute(Os,(gy()+1).toString()),function(){var t=gy()-1;t<=0?document.body.removeAttribute(Os):document.body.setAttribute(Os,t.toString())}},[])},FR=function(t){var e=t.noRelative,r=t.noImportant,s=t.gapMode,i=s===void 0?\"margin\":s;MR();var l=x.useMemo(function(){return LR(i)},[i]);return x.createElement(IR,{styles:DR(l,!e,i,r?\"\":\"!important\")})},hf=!1;if(typeof window<\"u\")try{var _l=Object.defineProperty({},\"passive\",{get:function(){return hf=!0,!0}});window.addEventListener(\"test\",_l,_l),window.removeEventListener(\"test\",_l,_l)}catch{hf=!1}var bs=hf?{passive:!1}:!1,zR=function(t){return t.tagName===\"TEXTAREA\"},Cx=function(t,e){if(!(t instanceof Element))return!1;var r=window.getComputedStyle(t);return r[e]!==\"hidden\"&&!(r.overflowY===r.overflowX&&!zR(t)&&r[e]===\"visible\")},$R=function(t){return Cx(t,\"overflowY\")},UR=function(t){return Cx(t,\"overflowX\")},yy=function(t,e){var r=e.ownerDocument,s=e;do{typeof ShadowRoot<\"u\"&&s instanceof ShadowRoot&&(s=s.host);var i=Ex(t,s);if(i){var l=kx(t,s),u=l[1],d=l[2];if(u>d)return!0}s=s.parentNode}while(s&&s!==r.body);return!1},BR=function(t){var e=t.scrollTop,r=t.scrollHeight,s=t.clientHeight;return[e,r,s]},HR=function(t){var e=t.scrollLeft,r=t.scrollWidth,s=t.clientWidth;return[e,r,s]},Ex=function(t,e){return t===\"v\"?$R(e):UR(e)},kx=function(t,e){return t===\"v\"?BR(e):HR(e)},VR=function(t,e){return t===\"h\"&&e===\"rtl\"?-1:1},WR=function(t,e,r,s,i){var l=VR(t,window.getComputedStyle(e).direction),u=l*s,d=r.target,h=e.contains(d),p=!1,y=u>0,v=0,C=0;do{if(!d)break;var w=kx(t,d),E=w[0],b=w[1],k=w[2],T=b-k-l*E;(E||T)&&Ex(t,d)&&(v+=T,C+=E);var j=d.parentNode;d=j&&j.nodeType===Node.DOCUMENT_FRAGMENT_NODE?j.host:j}while(!h&&d!==document.body||h&&(e.contains(d)||e===d));return(y&&Math.abs(v)<1||!y&&Math.abs(C)<1)&&(p=!0),p},Al=function(t){return\"changedTouches\"in t?[t.changedTouches[0].clientX,t.changedTouches[0].clientY]:[0,0]},vy=function(t){return[t.deltaX,t.deltaY]},xy=function(t){return t&&\"current\"in t?t.current:t},KR=function(t,e){return t[0]===e[0]&&t[1]===e[1]},qR=function(t){return`\n  .block-interactivity-`.concat(t,` {pointer-events: none;}\n  .allow-interactivity-`).concat(t,` {pointer-events: all;}\n`)},QR=0,Ss=[];function YR(t){var e=x.useRef([]),r=x.useRef([0,0]),s=x.useRef(),i=x.useState(QR++)[0],l=x.useState(Sx)[0],u=x.useRef(t);x.useEffect(function(){u.current=t},[t]),x.useEffect(function(){if(t.inert){document.body.classList.add(\"block-interactivity-\".concat(i));var b=gR([t.lockRef.current],(t.shards||[]).map(xy),!0).filter(Boolean);return b.forEach(function(k){return k.classList.add(\"allow-interactivity-\".concat(i))}),function(){document.body.classList.remove(\"block-interactivity-\".concat(i)),b.forEach(function(k){return k.classList.remove(\"allow-interactivity-\".concat(i))})}}},[t.inert,t.lockRef.current,t.shards]);var d=x.useCallback(function(b,k){if(\"touches\"in b&&b.touches.length===2||b.type===\"wheel\"&&b.ctrlKey)return!u.current.allowPinchZoom;var T=Al(b),j=r.current,_=\"deltaX\"in b?b.deltaX:j[0]-T[0],A=\"deltaY\"in b?b.deltaY:j[1]-T[1],F,V=b.target,B=Math.abs(_)>Math.abs(A)?\"h\":\"v\";if(\"touches\"in b&&B===\"h\"&&V.type===\"range\")return!1;var te=window.getSelection(),G=te&&te.anchorNode,W=G?G===V||G.contains(V):!1;if(W)return!1;var le=yy(B,V);if(!le)return!0;if(le?F=B:(F=B===\"v\"?\"h\":\"v\",le=yy(B,V)),!le)return!1;if(!s.current&&\"changedTouches\"in b&&(_||A)&&(s.current=F),!F)return!0;var K=s.current||F;return WR(K,k,b,K===\"h\"?_:A)},[]),h=x.useCallback(function(b){var k=b;if(!(!Ss.length||Ss[Ss.length-1]!==l)){var T=\"deltaY\"in k?vy(k):Al(k),j=e.current.filter(function(F){return F.name===k.type&&(F.target===k.target||k.target===F.shadowParent)&&KR(F.delta,T)})[0];if(j&&j.should){k.cancelable&&k.preventDefault();return}if(!j){var _=(u.current.shards||[]).map(xy).filter(Boolean).filter(function(F){return F.contains(k.target)}),A=_.length>0?d(k,_[0]):!u.current.noIsolation;A&&k.cancelable&&k.preventDefault()}}},[]),p=x.useCallback(function(b,k,T,j){var _={name:b,delta:k,target:T,should:j,shadowParent:GR(T)};e.current.push(_),setTimeout(function(){e.current=e.current.filter(function(A){return A!==_})},1)},[]),y=x.useCallback(function(b){r.current=Al(b),s.current=void 0},[]),v=x.useCallback(function(b){p(b.type,vy(b),b.target,d(b,t.lockRef.current))},[]),C=x.useCallback(function(b){p(b.type,Al(b),b.target,d(b,t.lockRef.current))},[]);x.useEffect(function(){return Ss.push(l),t.setCallbacks({onScrollCapture:v,onWheelCapture:v,onTouchMoveCapture:C}),document.addEventListener(\"wheel\",h,bs),document.addEventListener(\"touchmove\",h,bs),document.addEventListener(\"touchstart\",y,bs),function(){Ss=Ss.filter(function(b){return b!==l}),document.removeEventListener(\"wheel\",h,bs),document.removeEventListener(\"touchmove\",h,bs),document.removeEventListener(\"touchstart\",y,bs)}},[]);var w=t.removeScrollBar,E=t.inert;return x.createElement(x.Fragment,null,E?x.createElement(l,{styles:qR(i)}):null,w?x.createElement(FR,{noRelative:t.noRelative,gapMode:t.gapMode}):null)}function GR(t){for(var e=null;t!==null;)t instanceof ShadowRoot&&(e=t.host,t=t.host),t=t.parentNode;return e}const XR=kR(bx,YR);var Gf=x.forwardRef(function(t,e){return x.createElement(xc,qn({},t,{ref:e,sideCar:XR}))});Gf.classNames=xc.classNames;var JR=[\" \",\"Enter\",\"ArrowUp\",\"ArrowDown\"],ZR=[\" \",\"Enter\"],Ho=\"Select\",[wc,bc,eP]=oN(Ho),[Zs]=aa(Ho,[eP,ax]),Sc=ax(),[tP,oo]=Zs(Ho),[nP,rP]=Zs(Ho),Nx=t=>{const{__scopeSelect:e,children:r,open:s,defaultOpen:i,onOpenChange:l,value:u,defaultValue:d,onValueChange:h,dir:p,name:y,autoComplete:v,disabled:C,required:w,form:E}=t,b=Sc(e),[k,T]=x.useState(null),[j,_]=x.useState(null),[A,F]=x.useState(!1),V=Hv(p),[B,te]=ff({prop:s,defaultProp:i??!1,onChange:l,caller:Ho}),[G,W]=ff({prop:u,defaultProp:d,onChange:h,caller:Ho}),le=x.useRef(null),K=k?E||!!k.closest(\"form\"):!0,[Z,J]=x.useState(new Set),de=Array.from(Z).map(ne=>ne.props.value).join(\";\");return g.jsx(G2,{...b,children:g.jsxs(tP,{required:w,scope:e,trigger:k,onTriggerChange:T,valueNode:j,onValueNodeChange:_,valueNodeHasChildren:A,onValueNodeHasChildrenChange:F,contentId:Ps(),value:G,onValueChange:W,open:B,onOpenChange:te,dir:V,triggerPointerDownPosRef:le,disabled:C,children:[g.jsx(wc.Provider,{scope:e,children:g.jsx(nP,{scope:t.__scopeSelect,onNativeOptionAdd:x.useCallback(ne=>{J(se=>new Set(se).add(ne))},[]),onNativeOptionRemove:x.useCallback(ne=>{J(se=>{const $=new Set(se);return $.delete(ne),$})},[]),children:r})}),K?g.jsxs(Gx,{\"aria-hidden\":!0,required:w,tabIndex:-1,name:y,autoComplete:v,value:G,onChange:ne=>W(ne.target.value),disabled:C,form:E,children:[G===void 0?g.jsx(\"option\",{value:\"\"}):null,Array.from(Z)]},de):null]})})};Nx.displayName=Ho;var Rx=\"SelectTrigger\",Px=x.forwardRef((t,e)=>{const{__scopeSelect:r,disabled:s=!1,...i}=t,l=Sc(r),u=oo(Rx,r),d=u.disabled||s,h=Ve(e,u.onTriggerChange),p=bc(r),y=x.useRef(\"touch\"),[v,C,w]=Jx(b=>{const k=p().filter(_=>!_.disabled),T=k.find(_=>_.value===u.value),j=Zx(k,b,T);j!==void 0&&u.onValueChange(j.value)}),E=b=>{d||(u.onOpenChange(!0),w()),b&&(u.triggerPointerDownPosRef.current={x:Math.round(b.pageX),y:Math.round(b.pageY)})};return g.jsx(X2,{asChild:!0,...l,children:g.jsx(ze.button,{type:\"button\",role:\"combobox\",\"aria-controls\":u.contentId,\"aria-expanded\":u.open,\"aria-required\":u.required,\"aria-autocomplete\":\"none\",dir:u.dir,\"data-state\":u.open?\"open\":\"closed\",disabled:d,\"data-disabled\":d?\"\":void 0,\"data-placeholder\":Xx(u.value)?\"\":void 0,...i,ref:h,onClick:Me(i.onClick,b=>{b.currentTarget.focus(),y.current!==\"mouse\"&&E(b)}),onPointerDown:Me(i.onPointerDown,b=>{y.current=b.pointerType;const k=b.target;k.hasPointerCapture(b.pointerId)&&k.releasePointerCapture(b.pointerId),b.button===0&&b.ctrlKey===!1&&b.pointerType===\"mouse\"&&(E(b),b.preventDefault())}),onKeyDown:Me(i.onKeyDown,b=>{const k=v.current!==\"\";!(b.ctrlKey||b.altKey||b.metaKey)&&b.key.length===1&&C(b.key),!(k&&b.key===\" \")&&JR.includes(b.key)&&(E(),b.preventDefault())})})})});Px.displayName=Rx;var Tx=\"SelectValue\",Ox=x.forwardRef((t,e)=>{const{__scopeSelect:r,className:s,style:i,children:l,placeholder:u=\"\",...d}=t,h=oo(Tx,r),{onValueNodeHasChildrenChange:p}=h,y=l!==void 0,v=Ve(e,h.onValueNodeChange);return mt(()=>{p(y)},[p,y]),g.jsx(ze.span,{...d,ref:v,style:{pointerEvents:\"none\"},children:Xx(h.value)?g.jsx(g.Fragment,{children:u}):l})});Ox.displayName=Tx;var oP=\"SelectIcon\",jx=x.forwardRef((t,e)=>{const{__scopeSelect:r,children:s,...i}=t;return g.jsx(ze.span,{\"aria-hidden\":!0,...i,ref:e,children:s||\"▼\"})});jx.displayName=oP;var sP=\"SelectPortal\",_x=t=>g.jsx(Yf,{asChild:!0,...t});_x.displayName=sP;var Vo=\"SelectContent\",Ax=x.forwardRef((t,e)=>{const r=oo(Vo,t.__scopeSelect),[s,i]=x.useState();if(mt(()=>{i(new DocumentFragment)},[]),!r.open){const l=s;return l?na.createPortal(g.jsx(Lx,{scope:t.__scopeSelect,children:g.jsx(wc.Slot,{scope:t.__scopeSelect,children:g.jsx(\"div\",{children:t.children})})}),l):null}return g.jsx(Ix,{...t,ref:e})});Ax.displayName=Vo;var Cn=10,[Lx,so]=Zs(Vo),iP=\"SelectContentImpl\",aP=tR(\"SelectContent.RemoveScroll\"),Ix=x.forwardRef((t,e)=>{const{__scopeSelect:r,position:s=\"item-aligned\",onCloseAutoFocus:i,onEscapeKeyDown:l,onPointerDownOutside:u,side:d,sideOffset:h,align:p,alignOffset:y,arrowPadding:v,collisionBoundary:C,collisionPadding:w,sticky:E,hideWhenDetached:b,avoidCollisions:k,...T}=t,j=oo(Vo,r),[_,A]=x.useState(null),[F,V]=x.useState(null),B=Ve(e,ee=>A(ee)),[te,G]=x.useState(null),[W,le]=x.useState(null),K=bc(r),[Z,J]=x.useState(!1),de=x.useRef(!1);x.useEffect(()=>{if(_)return vx(_)},[_]),Kv();const ne=x.useCallback(ee=>{const[ye,...Se]=K().map(_e=>_e.ref.current),[Ne]=Se.slice(-1),Oe=document.activeElement;for(const _e of ee)if(_e===Oe||(_e==null||_e.scrollIntoView({block:\"nearest\"}),_e===ye&&F&&(F.scrollTop=0),_e===Ne&&F&&(F.scrollTop=F.scrollHeight),_e==null||_e.focus(),document.activeElement!==Oe))return},[K,F]),se=x.useCallback(()=>ne([te,_]),[ne,te,_]);x.useEffect(()=>{Z&&se()},[Z,se]);const{onOpenChange:$,triggerPointerDownPosRef:H}=j;x.useEffect(()=>{if(_){let ee={x:0,y:0};const ye=Ne=>{var Oe,_e;ee={x:Math.abs(Math.round(Ne.pageX)-(((Oe=H.current)==null?void 0:Oe.x)??0)),y:Math.abs(Math.round(Ne.pageY)-(((_e=H.current)==null?void 0:_e.y)??0))}},Se=Ne=>{ee.x<=10&&ee.y<=10?Ne.preventDefault():_.contains(Ne.target)||$(!1),document.removeEventListener(\"pointermove\",ye),H.current=null};return H.current!==null&&(document.addEventListener(\"pointermove\",ye),document.addEventListener(\"pointerup\",Se,{capture:!0,once:!0})),()=>{document.removeEventListener(\"pointermove\",ye),document.removeEventListener(\"pointerup\",Se,{capture:!0})}}},[_,$,H]),x.useEffect(()=>{const ee=()=>$(!1);return window.addEventListener(\"blur\",ee),window.addEventListener(\"resize\",ee),()=>{window.removeEventListener(\"blur\",ee),window.removeEventListener(\"resize\",ee)}},[$]);const[Q,P]=Jx(ee=>{const ye=K().filter(Oe=>!Oe.disabled),Se=ye.find(Oe=>Oe.ref.current===document.activeElement),Ne=Zx(ye,ee,Se);Ne&&setTimeout(()=>Ne.ref.current.focus())}),M=x.useCallback((ee,ye,Se)=>{const Ne=!de.current&&!Se;(j.value!==void 0&&j.value===ye||Ne)&&(G(ee),Ne&&(de.current=!0))},[j.value]),ie=x.useCallback(()=>_==null?void 0:_.focus(),[_]),ae=x.useCallback((ee,ye,Se)=>{const Ne=!de.current&&!Se;(j.value!==void 0&&j.value===ye||Ne)&&le(ee)},[j.value]),me=s===\"popper\"?pf:Dx,be=me===pf?{side:d,sideOffset:h,align:p,alignOffset:y,arrowPadding:v,collisionBoundary:C,collisionPadding:w,sticky:E,hideWhenDetached:b,avoidCollisions:k}:{};return g.jsx(Lx,{scope:r,content:_,viewport:F,onViewportChange:V,itemRefCallback:M,selectedItem:te,onItemLeave:ie,itemTextRefCallback:ae,focusSelectedItem:se,selectedItemText:W,position:s,isPositioned:Z,searchRef:Q,children:g.jsx(Gf,{as:aP,allowPinchZoom:!0,children:g.jsx($f,{asChild:!0,trapped:j.open,onMountAutoFocus:ee=>{ee.preventDefault()},onUnmountAutoFocus:Me(i,ee=>{var ye;(ye=j.trigger)==null||ye.focus({preventScroll:!0}),ee.preventDefault()}),children:g.jsx(zf,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:l,onPointerDownOutside:u,onFocusOutside:ee=>ee.preventDefault(),onDismiss:()=>j.onOpenChange(!1),children:g.jsx(me,{role:\"listbox\",id:j.contentId,\"data-state\":j.open?\"open\":\"closed\",dir:j.dir,onContextMenu:ee=>ee.preventDefault(),...T,...be,onPlaced:()=>J(!0),ref:B,style:{display:\"flex\",flexDirection:\"column\",outline:\"none\",...T.style},onKeyDown:Me(T.onKeyDown,ee=>{const ye=ee.ctrlKey||ee.altKey||ee.metaKey;if(ee.key===\"Tab\"&&ee.preventDefault(),!ye&&ee.key.length===1&&P(ee.key),[\"ArrowUp\",\"ArrowDown\",\"Home\",\"End\"].includes(ee.key)){let Ne=K().filter(Oe=>!Oe.disabled).map(Oe=>Oe.ref.current);if([\"ArrowUp\",\"End\"].includes(ee.key)&&(Ne=Ne.slice().reverse()),[\"ArrowUp\",\"ArrowDown\"].includes(ee.key)){const Oe=ee.target,_e=Ne.indexOf(Oe);Ne=Ne.slice(_e+1)}setTimeout(()=>ne(Ne)),ee.preventDefault()}})})})})})})});Ix.displayName=iP;var lP=\"SelectItemAlignedPosition\",Dx=x.forwardRef((t,e)=>{const{__scopeSelect:r,onPlaced:s,...i}=t,l=oo(Vo,r),u=so(Vo,r),[d,h]=x.useState(null),[p,y]=x.useState(null),v=Ve(e,B=>y(B)),C=bc(r),w=x.useRef(!1),E=x.useRef(!0),{viewport:b,selectedItem:k,selectedItemText:T,focusSelectedItem:j}=u,_=x.useCallback(()=>{if(l.trigger&&l.valueNode&&d&&p&&b&&k&&T){const B=l.trigger.getBoundingClientRect(),te=p.getBoundingClientRect(),G=l.valueNode.getBoundingClientRect(),W=T.getBoundingClientRect();if(l.dir!==\"rtl\"){const Oe=W.left-te.left,_e=G.left-Oe,et=B.left-_e,gt=B.width+et,On=Math.max(gt,te.width),dn=window.innerWidth-Cn,fn=af(_e,[Cn,Math.max(Cn,dn-On)]);d.style.minWidth=gt+\"px\",d.style.left=fn+\"px\"}else{const Oe=te.right-W.right,_e=window.innerWidth-G.right-Oe,et=window.innerWidth-B.right-_e,gt=B.width+et,On=Math.max(gt,te.width),dn=window.innerWidth-Cn,fn=af(_e,[Cn,Math.max(Cn,dn-On)]);d.style.minWidth=gt+\"px\",d.style.right=fn+\"px\"}const le=C(),K=window.innerHeight-Cn*2,Z=b.scrollHeight,J=window.getComputedStyle(p),de=parseInt(J.borderTopWidth,10),ne=parseInt(J.paddingTop,10),se=parseInt(J.borderBottomWidth,10),$=parseInt(J.paddingBottom,10),H=de+ne+Z+$+se,Q=Math.min(k.offsetHeight*5,H),P=window.getComputedStyle(b),M=parseInt(P.paddingTop,10),ie=parseInt(P.paddingBottom,10),ae=B.top+B.height/2-Cn,me=K-ae,be=k.offsetHeight/2,ee=k.offsetTop+be,ye=de+ne+ee,Se=H-ye;if(ye<=ae){const Oe=le.length>0&&k===le[le.length-1].ref.current;d.style.bottom=\"0px\";const _e=p.clientHeight-b.offsetTop-b.offsetHeight,et=Math.max(me,be+(Oe?ie:0)+_e+se),gt=ye+et;d.style.height=gt+\"px\"}else{const Oe=le.length>0&&k===le[0].ref.current;d.style.top=\"0px\";const et=Math.max(ae,de+b.offsetTop+(Oe?M:0)+be)+Se;d.style.height=et+\"px\",b.scrollTop=ye-ae+b.offsetTop}d.style.margin=`${Cn}px 0`,d.style.minHeight=Q+\"px\",d.style.maxHeight=K+\"px\",s==null||s(),requestAnimationFrame(()=>w.current=!0)}},[C,l.trigger,l.valueNode,d,p,b,k,T,l.dir,s]);mt(()=>_(),[_]);const[A,F]=x.useState();mt(()=>{p&&F(window.getComputedStyle(p).zIndex)},[p]);const V=x.useCallback(B=>{B&&E.current===!0&&(_(),j==null||j(),E.current=!1)},[_,j]);return g.jsx(uP,{scope:r,contentWrapper:d,shouldExpandOnScrollRef:w,onScrollButtonChange:V,children:g.jsx(\"div\",{ref:h,style:{display:\"flex\",flexDirection:\"column\",position:\"fixed\",zIndex:A},children:g.jsx(ze.div,{...i,ref:v,style:{boxSizing:\"border-box\",maxHeight:\"100%\",...i.style}})})})});Dx.displayName=lP;var cP=\"SelectPopperPosition\",pf=x.forwardRef((t,e)=>{const{__scopeSelect:r,align:s=\"start\",collisionPadding:i=Cn,...l}=t,u=Sc(r);return g.jsx(J2,{...u,...l,ref:e,align:s,collisionPadding:i,style:{boxSizing:\"border-box\",...l.style,\"--radix-select-content-transform-origin\":\"var(--radix-popper-transform-origin)\",\"--radix-select-content-available-width\":\"var(--radix-popper-available-width)\",\"--radix-select-content-available-height\":\"var(--radix-popper-available-height)\",\"--radix-select-trigger-width\":\"var(--radix-popper-anchor-width)\",\"--radix-select-trigger-height\":\"var(--radix-popper-anchor-height)\"}})});pf.displayName=cP;var[uP,Xf]=Zs(Vo,{}),mf=\"SelectViewport\",Mx=x.forwardRef((t,e)=>{const{__scopeSelect:r,nonce:s,...i}=t,l=so(mf,r),u=Xf(mf,r),d=Ve(e,l.onViewportChange),h=x.useRef(0);return g.jsxs(g.Fragment,{children:[g.jsx(\"style\",{dangerouslySetInnerHTML:{__html:\"[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}\"},nonce:s}),g.jsx(wc.Slot,{scope:r,children:g.jsx(ze.div,{\"data-radix-select-viewport\":\"\",role:\"presentation\",...i,ref:d,style:{position:\"relative\",flex:1,overflow:\"hidden auto\",...i.style},onScroll:Me(i.onScroll,p=>{const y=p.currentTarget,{contentWrapper:v,shouldExpandOnScrollRef:C}=u;if(C!=null&&C.current&&v){const w=Math.abs(h.current-y.scrollTop);if(w>0){const E=window.innerHeight-Cn*2,b=parseFloat(v.style.minHeight),k=parseFloat(v.style.height),T=Math.max(b,k);if(T<E){const j=T+w,_=Math.min(E,j),A=j-_;v.style.height=_+\"px\",v.style.bottom===\"0px\"&&(y.scrollTop=A>0?A:0,v.style.justifyContent=\"flex-end\")}}}h.current=y.scrollTop})})})]})});Mx.displayName=mf;var Fx=\"SelectGroup\",[dP,fP]=Zs(Fx),hP=x.forwardRef((t,e)=>{const{__scopeSelect:r,...s}=t,i=Ps();return g.jsx(dP,{scope:r,id:i,children:g.jsx(ze.div,{role:\"group\",\"aria-labelledby\":i,...s,ref:e})})});hP.displayName=Fx;var zx=\"SelectLabel\",$x=x.forwardRef((t,e)=>{const{__scopeSelect:r,...s}=t,i=fP(zx,r);return g.jsx(ze.div,{id:i.id,...s,ref:e})});$x.displayName=zx;var nc=\"SelectItem\",[pP,Ux]=Zs(nc),Bx=x.forwardRef((t,e)=>{const{__scopeSelect:r,value:s,disabled:i=!1,textValue:l,...u}=t,d=oo(nc,r),h=so(nc,r),p=d.value===s,[y,v]=x.useState(l??\"\"),[C,w]=x.useState(!1),E=Ve(e,j=>{var _;return(_=h.itemRefCallback)==null?void 0:_.call(h,j,s,i)}),b=Ps(),k=x.useRef(\"touch\"),T=()=>{i||(d.onValueChange(s),d.onOpenChange(!1))};if(s===\"\")throw new Error(\"A <Select.Item /> must have a value prop that is not an empty string. This is because the Select value can be set to an empty string to clear the selection and show the placeholder.\");return g.jsx(pP,{scope:r,value:s,disabled:i,textId:b,isSelected:p,onItemTextChange:x.useCallback(j=>{v(_=>_||((j==null?void 0:j.textContent)??\"\").trim())},[]),children:g.jsx(wc.ItemSlot,{scope:r,value:s,disabled:i,textValue:y,children:g.jsx(ze.div,{role:\"option\",\"aria-labelledby\":b,\"data-highlighted\":C?\"\":void 0,\"aria-selected\":p&&C,\"data-state\":p?\"checked\":\"unchecked\",\"aria-disabled\":i||void 0,\"data-disabled\":i?\"\":void 0,tabIndex:i?void 0:-1,...u,ref:E,onFocus:Me(u.onFocus,()=>w(!0)),onBlur:Me(u.onBlur,()=>w(!1)),onClick:Me(u.onClick,()=>{k.current!==\"mouse\"&&T()}),onPointerUp:Me(u.onPointerUp,()=>{k.current===\"mouse\"&&T()}),onPointerDown:Me(u.onPointerDown,j=>{k.current=j.pointerType}),onPointerMove:Me(u.onPointerMove,j=>{var _;k.current=j.pointerType,i?(_=h.onItemLeave)==null||_.call(h):k.current===\"mouse\"&&j.currentTarget.focus({preventScroll:!0})}),onPointerLeave:Me(u.onPointerLeave,j=>{var _;j.currentTarget===document.activeElement&&((_=h.onItemLeave)==null||_.call(h))}),onKeyDown:Me(u.onKeyDown,j=>{var A;((A=h.searchRef)==null?void 0:A.current)!==\"\"&&j.key===\" \"||(ZR.includes(j.key)&&T(),j.key===\" \"&&j.preventDefault())})})})})});Bx.displayName=nc;var Bi=\"SelectItemText\",Hx=x.forwardRef((t,e)=>{const{__scopeSelect:r,className:s,style:i,...l}=t,u=oo(Bi,r),d=so(Bi,r),h=Ux(Bi,r),p=rP(Bi,r),[y,v]=x.useState(null),C=Ve(e,T=>v(T),h.onItemTextChange,T=>{var j;return(j=d.itemTextRefCallback)==null?void 0:j.call(d,T,h.value,h.disabled)}),w=y==null?void 0:y.textContent,E=x.useMemo(()=>g.jsx(\"option\",{value:h.value,disabled:h.disabled,children:w},h.value),[h.disabled,h.value,w]),{onNativeOptionAdd:b,onNativeOptionRemove:k}=p;return mt(()=>(b(E),()=>k(E)),[b,k,E]),g.jsxs(g.Fragment,{children:[g.jsx(ze.span,{id:h.textId,...l,ref:C}),h.isSelected&&u.valueNode&&!u.valueNodeHasChildren?na.createPortal(l.children,u.valueNode):null]})});Hx.displayName=Bi;var Vx=\"SelectItemIndicator\",Wx=x.forwardRef((t,e)=>{const{__scopeSelect:r,...s}=t;return Ux(Vx,r).isSelected?g.jsx(ze.span,{\"aria-hidden\":!0,...s,ref:e}):null});Wx.displayName=Vx;var gf=\"SelectScrollUpButton\",Kx=x.forwardRef((t,e)=>{const r=so(gf,t.__scopeSelect),s=Xf(gf,t.__scopeSelect),[i,l]=x.useState(!1),u=Ve(e,s.onScrollButtonChange);return mt(()=>{if(r.viewport&&r.isPositioned){let d=function(){const p=h.scrollTop>0;l(p)};const h=r.viewport;return d(),h.addEventListener(\"scroll\",d),()=>h.removeEventListener(\"scroll\",d)}},[r.viewport,r.isPositioned]),i?g.jsx(Qx,{...t,ref:u,onAutoScroll:()=>{const{viewport:d,selectedItem:h}=r;d&&h&&(d.scrollTop=d.scrollTop-h.offsetHeight)}}):null});Kx.displayName=gf;var yf=\"SelectScrollDownButton\",qx=x.forwardRef((t,e)=>{const r=so(yf,t.__scopeSelect),s=Xf(yf,t.__scopeSelect),[i,l]=x.useState(!1),u=Ve(e,s.onScrollButtonChange);return mt(()=>{if(r.viewport&&r.isPositioned){let d=function(){const p=h.scrollHeight-h.clientHeight,y=Math.ceil(h.scrollTop)<p;l(y)};const h=r.viewport;return d(),h.addEventListener(\"scroll\",d),()=>h.removeEventListener(\"scroll\",d)}},[r.viewport,r.isPositioned]),i?g.jsx(Qx,{...t,ref:u,onAutoScroll:()=>{const{viewport:d,selectedItem:h}=r;d&&h&&(d.scrollTop=d.scrollTop+h.offsetHeight)}}):null});qx.displayName=yf;var Qx=x.forwardRef((t,e)=>{const{__scopeSelect:r,onAutoScroll:s,...i}=t,l=so(\"SelectScrollButton\",r),u=x.useRef(null),d=bc(r),h=x.useCallback(()=>{u.current!==null&&(window.clearInterval(u.current),u.current=null)},[]);return x.useEffect(()=>()=>h(),[h]),mt(()=>{var y;const p=d().find(v=>v.ref.current===document.activeElement);(y=p==null?void 0:p.ref.current)==null||y.scrollIntoView({block:\"nearest\"})},[d]),g.jsx(ze.div,{\"aria-hidden\":!0,...i,ref:e,style:{flexShrink:0,...i.style},onPointerDown:Me(i.onPointerDown,()=>{u.current===null&&(u.current=window.setInterval(s,50))}),onPointerMove:Me(i.onPointerMove,()=>{var p;(p=l.onItemLeave)==null||p.call(l),u.current===null&&(u.current=window.setInterval(s,50))}),onPointerLeave:Me(i.onPointerLeave,()=>{h()})})}),mP=\"SelectSeparator\",Yx=x.forwardRef((t,e)=>{const{__scopeSelect:r,...s}=t;return g.jsx(ze.div,{\"aria-hidden\":!0,...s,ref:e})});Yx.displayName=mP;var vf=\"SelectArrow\",gP=x.forwardRef((t,e)=>{const{__scopeSelect:r,...s}=t,i=Sc(r),l=oo(vf,r),u=so(vf,r);return l.open&&u.position===\"popper\"?g.jsx(Z2,{...i,...s,ref:e}):null});gP.displayName=vf;var yP=\"SelectBubbleInput\",Gx=x.forwardRef(({__scopeSelect:t,value:e,...r},s)=>{const i=x.useRef(null),l=Ve(s,i),u=uR(e);return x.useEffect(()=>{const d=i.current;if(!d)return;const h=window.HTMLSelectElement.prototype,y=Object.getOwnPropertyDescriptor(h,\"value\").set;if(u!==e&&y){const v=new Event(\"change\",{bubbles:!0});y.call(d,e),d.dispatchEvent(v)}},[u,e]),g.jsx(ze.select,{...r,style:{...gx,...r.style},ref:l,defaultValue:e})});Gx.displayName=yP;function Xx(t){return t===\"\"||t===void 0}function Jx(t){const e=Vt(t),r=x.useRef(\"\"),s=x.useRef(0),i=x.useCallback(u=>{const d=r.current+u;e(d),(function h(p){r.current=p,window.clearTimeout(s.current),p!==\"\"&&(s.current=window.setTimeout(()=>h(\"\"),1e3))})(d)},[e]),l=x.useCallback(()=>{r.current=\"\",window.clearTimeout(s.current)},[]);return x.useEffect(()=>()=>window.clearTimeout(s.current),[]),[r,i,l]}function Zx(t,e,r){const i=e.length>1&&Array.from(e).every(p=>p===e[0])?e[0]:e,l=r?t.indexOf(r):-1;let u=vP(t,Math.max(l,0));i.length===1&&(u=u.filter(p=>p!==r));const h=u.find(p=>p.textValue.toLowerCase().startsWith(i.toLowerCase()));return h!==r?h:void 0}function vP(t,e){return t.map((r,s)=>t[(e+s)%t.length])}var xP=Nx,e0=Px,wP=Ox,bP=jx,SP=_x,t0=Ax,CP=Mx,n0=$x,r0=Bx,EP=Hx,kP=Wx,o0=Kx,s0=qx,i0=Yx;const ks=xP,Ns=wP,ko=x.forwardRef(({className:t,children:e,...r},s)=>g.jsxs(e0,{ref:s,className:Be(\"flex h-9 w-full items-center justify-between rounded-md border border-cyber-border-DEFAULT bg-cyber-bg-tertiary px-3 py-2 text-sm font-mono text-cyber-text-primary ring-offset-background placeholder:text-cyber-text-muted focus:outline-none focus:border-cyber-neon-cyan focus:shadow-[0_0_10px_rgb(var(--cyber-neon-cyan)/0.2)] disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1 transition-all\",t),...r,children:[e,g.jsx(bP,{asChild:!0,children:g.jsx(Pf,{className:\"h-4 w-4 text-cyber-text-muted\"})})]}));ko.displayName=e0.displayName;const a0=x.forwardRef(({className:t,...e},r)=>g.jsx(o0,{ref:r,className:Be(\"flex cursor-default items-center justify-center py-1 text-cyber-text-muted\",t),...e,children:g.jsx(ev,{className:\"h-4 w-4\"})}));a0.displayName=o0.displayName;const l0=x.forwardRef(({className:t,...e},r)=>g.jsx(s0,{ref:r,className:Be(\"flex cursor-default items-center justify-center py-1 text-cyber-text-muted\",t),...e,children:g.jsx(Pf,{className:\"h-4 w-4\"})}));l0.displayName=s0.displayName;const No=x.forwardRef(({className:t,children:e,position:r=\"popper\",...s},i)=>g.jsx(SP,{children:g.jsxs(t0,{ref:i,className:Be(\"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border border-cyber-border-DEFAULT bg-cyber-bg-panel text-cyber-text-primary shadow-[0_0_20px_rgba(0,0,0,0.5)] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",r===\"popper\"&&\"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",t),position:r,...s,children:[g.jsx(a0,{}),g.jsx(CP,{className:Be(\"p-1\",r===\"popper\"&&\"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"),children:e}),g.jsx(l0,{})]})}));No.displayName=t0.displayName;const NP=x.forwardRef(({className:t,...e},r)=>g.jsx(n0,{ref:r,className:Be(\"py-1.5 pl-8 pr-2 text-sm font-semibold text-cyber-neon-cyan\",t),...e}));NP.displayName=n0.displayName;const Ro=x.forwardRef(({className:t,children:e,...r},s)=>g.jsxs(r0,{ref:s,className:Be(\"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm font-mono outline-none focus:bg-cyber-neon-cyan/20 focus:text-cyber-neon-cyan data-[disabled]:pointer-events-none data-[disabled]:opacity-50 transition-colors\",t),...r,children:[g.jsx(\"span\",{className:\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\",children:g.jsx(kP,{children:g.jsx(Rf,{className:\"h-4 w-4 text-cyber-neon-cyan\"})})}),g.jsx(EP,{children:e})]}));Ro.displayName=r0.displayName;const RP=x.forwardRef(({className:t,...e},r)=>g.jsx(i0,{ref:r,className:Be(\"-mx-1 my-1 h-px bg-cyber-border-DEFAULT\",t),...e}));RP.displayName=i0.displayName;const _d=[{code:\"zh-CN\",label:\"中文\"},{code:\"en-US\",label:\"EN\"}];function PP(){const{i18n:t}=Zt(),e=_d.find(r=>r.code===t.language)||_d[0];return g.jsxs(ks,{value:t.language,onValueChange:r=>t.changeLanguage(r),children:[g.jsxs(ko,{className:\"w-20 h-7 text-xs font-mono border-cyber-border-subtle bg-cyber-bg-tertiary/50 hover:border-cyber-neon-cyan/50 transition-colors\",children:[g.jsx(rv,{className:\"w-3 h-3 mr-1 text-cyber-text-secondary\"}),g.jsx(Ns,{children:e.label})]}),g.jsx(No,{children:_d.map(r=>g.jsx(Ro,{value:r.code,className:\"text-xs font-mono\",children:r.label},r.code))})]})}const c0=\"mediacrawler_theme\";function TP(){return typeof window>\"u\"?\"light\":window.matchMedia(\"(prefers-color-scheme: dark)\").matches?\"dark\":\"light\"}function OP(){if(typeof window>\"u\")return\"light\";const t=localStorage.getItem(c0);return t&&[\"light\",\"dark\",\"system\"].includes(t)?t:\"light\"}function Jf(t){const e=document.documentElement;t===\"dark\"?e.classList.add(\"dark\"):e.classList.remove(\"dark\")}function u0(t){return t===\"system\"?TP():t}const d0=OP(),f0=u0(d0);typeof window<\"u\"&&Jf(f0);const xf=yv(t=>({theme:d0,resolvedTheme:f0,setTheme:e=>{const r=u0(e);localStorage.setItem(c0,e),Jf(r),t({theme:e,resolvedTheme:r})}}));typeof window<\"u\"&&window.matchMedia(\"(prefers-color-scheme: dark)\").addEventListener(\"change\",t=>{if(xf.getState().theme===\"system\"){const r=t.matches?\"dark\":\"light\";Jf(r),xf.setState({resolvedTheme:r})}});const Ad=[{value:\"light\",label:\"Light\",icon:BS},{value:\"dark\",label:\"Dark\",icon:DS},{value:\"system\",label:\"Auto\",icon:IS}];function jP(){const{theme:t,setTheme:e}=xf(),r=Ad.find(i=>i.value===t)||Ad[0],s=r.icon;return g.jsxs(ks,{value:t,onValueChange:i=>e(i),children:[g.jsxs(ko,{className:\"w-20 h-7 text-xs font-mono border-cyber-border-subtle bg-cyber-bg-tertiary/50 hover:border-cyber-neon-cyan/50 transition-colors\",children:[g.jsx(s,{className:\"w-3 h-3 mr-1 text-cyber-text-secondary\"}),g.jsx(Ns,{children:r.label})]}),g.jsx(No,{children:Ad.map(({value:i,label:l,icon:u})=>g.jsx(Ro,{value:i,className:\"text-xs font-mono\",children:g.jsxs(\"div\",{className:\"flex items-center gap-2\",children:[g.jsx(u,{className:\"w-3 h-3\"}),l]})},i))})]})}function _P({onShowDisclaimer:t}){const{t:e}=Zt(),{t:r}=Zt(\"license\"),s=jt(l=>l.status);Kk();const i=s===\"running\";return g.jsx(\"header\",{className:\"h-14 flex-shrink-0 glass-panel border-b border-cyber-border-subtle relative z-10\",children:g.jsxs(\"div\",{className:\"h-full px-4 flex items-center justify-between\",children:[g.jsxs(\"div\",{className:\"flex items-center gap-3\",children:[g.jsx(SS,{className:\"w-5 h-5 text-cyber-neon-cyan\"}),g.jsx(\"span\",{className:\"font-mono font-bold text-cyber-text-primary tracking-wider text-sm\",children:\"MediaCrawler\"}),g.jsxs(\"a\",{href:\"https://github.com/NanmiCoder/MediaCrawler\",target:\"_blank\",rel:\"noopener noreferrer\",className:\"flex items-center gap-1.5 px-2 py-1 rounded-md border border-cyber-border-subtle hover:border-cyber-neon-cyan hover:shadow-glow-cyan-sm transition-all bg-cyber-bg-tertiary\",children:[g.jsx(OS,{className:\"w-4 h-4 text-cyber-text-secondary\"}),g.jsx(\"span\",{className:\"text-xs font-mono text-cyber-text-secondary\",children:\"Star\"})]}),i&&g.jsx(qi,{variant:\"running\",className:\"text-[10px]\",children:e(\"status.active\")}),i&&g.jsx(\"span\",{className:\"w-2 h-2 bg-cyber-neon-green rounded-full shadow-glow-green-sm animate-pulse-fast\"})]}),g.jsxs(\"button\",{onClick:t,className:\"flex items-center gap-3 px-4 py-1.5 rounded-lg border border-cyber-neon-orange/50 bg-cyber-neon-orange/10 hover:bg-cyber-neon-orange/20 transition-all cursor-pointer\",children:[g.jsx(Of,{className:\"w-4 h-4 text-cyber-neon-orange flex-shrink-0\"}),g.jsxs(\"div\",{className:\"flex items-center gap-4 text-xs font-mono\",children:[g.jsxs(\"span\",{className:\"text-cyber-neon-orange\",children:[g.jsx(\"span\",{className:\"text-cyber-neon-pink font-bold\",children:\"1.\"}),\" \",r(\"content.line1\")]}),g.jsxs(\"span\",{className:\"text-cyber-neon-orange\",children:[g.jsx(\"span\",{className:\"text-cyber-neon-pink font-bold\",children:\"2.\"}),\" \",r(\"content.line2\")]})]})]}),g.jsxs(\"div\",{className:\"flex items-center gap-3\",children:[g.jsx(jP,{}),g.jsx(PP,{}),g.jsxs(\"div\",{className:\"hidden lg:flex items-center gap-2 text-xs font-mono\",children:[g.jsxs(\"span\",{className:\"text-cyber-text-muted\",children:[e(\"sidebar.api\"),\":\"]}),g.jsx(\"span\",{className:\"text-cyber-neon-green\",children:\"v1.0.0\"}),g.jsxs(\"div\",{className:\"flex items-center gap-1.5\",children:[g.jsx(VS,{className:\"w-3 h-3 text-cyber-text-secondary\"}),g.jsx(\"span\",{className:\"text-cyber-text-secondary\",children:e(\"sidebar.local\")}),g.jsx(\"span\",{className:\"status-dot status-dot-online\"})]})]})]})]})})}const wy={info:{text:\"text-cyber-neon-cyan\",bg:\"bg-cyber-neon-cyan/10\",glow:\"shadow-[0_0_3px_rgba(0,255,255,0.3)]\"},success:{text:\"text-cyber-neon-green\",bg:\"bg-cyber-neon-green/10\",glow:\"shadow-[0_0_3px_rgba(0,255,65,0.3)]\"},warning:{text:\"text-cyber-neon-orange\",bg:\"bg-cyber-neon-orange/10\",glow:\"shadow-[0_0_3px_rgba(255,152,0,0.3)]\"},error:{text:\"text-cyber-neon-pink\",bg:\"bg-cyber-neon-pink/10\",glow:\"shadow-[0_0_3px_rgba(255,0,128,0.3)]\"},debug:{text:\"text-[#8b949e]\",bg:\"bg-[#21262d]\",glow:\"\"}},AP={info:\"DATA\",success:\"OK\",warning:\"WARN\",error:\"ERR\",debug:\"DBG\"};function LP({log:t}){const e=wy[t.level]||wy.info;return g.jsxs(\"div\",{className:\"flex gap-2 text-xs leading-relaxed font-mono group hover:bg-[#21262d]/50 px-1 -mx-1 rounded transition-colors\",children:[g.jsxs(\"span\",{className:\"text-[#8b949e] flex-shrink-0 opacity-60 group-hover:opacity-100 transition-opacity\",children:[\"[\",t.timestamp,\"]\"]}),g.jsxs(\"span\",{className:Be(\"flex-shrink-0 w-14 px-1 rounded text-center\",e.bg,e.text,e.glow),children:[\"[\",AP[t.level],\"]\"]}),g.jsx(\"span\",{className:Be(\"break-all\",e.text),children:t.message})]})}var IP=Symbol.for(\"react.lazy\"),rc=Sf[\" use \".trim().toString()];function DP(t){return typeof t==\"object\"&&t!==null&&\"then\"in t}function h0(t){return t!=null&&typeof t==\"object\"&&\"$$typeof\"in t&&t.$$typeof===IP&&\"_payload\"in t&&DP(t._payload)}function p0(t){const e=FP(t),r=x.forwardRef((s,i)=>{let{children:l,...u}=s;h0(l)&&typeof rc==\"function\"&&(l=rc(l._payload));const d=x.Children.toArray(l),h=d.find($P);if(h){const p=h.props.children,y=d.map(v=>v===h?x.Children.count(p)>1?x.Children.only(null):x.isValidElement(p)?p.props.children:null:v);return g.jsx(e,{...u,ref:i,children:x.isValidElement(p)?x.cloneElement(p,void 0,y):null})}return g.jsx(e,{...u,ref:i,children:l})});return r.displayName=`${t}.Slot`,r}var MP=p0(\"Slot\");function FP(t){const e=x.forwardRef((r,s)=>{let{children:i,...l}=r;if(h0(i)&&typeof rc==\"function\"&&(i=rc(i._payload)),x.isValidElement(i)){const u=BP(i),d=UP(l,i.props);return i.type!==x.Fragment&&(d.ref=s?Gs(s,u):u),x.cloneElement(i,d)}return x.Children.count(i)>1?x.Children.only(null):null});return e.displayName=`${t}.SlotClone`,e}var zP=Symbol(\"radix.slottable\");function $P(t){return x.isValidElement(t)&&typeof t.type==\"function\"&&\"__radixId\"in t.type&&t.type.__radixId===zP}function UP(t,e){const r={...e};for(const s in e){const i=t[s],l=e[s];/^on[A-Z]/.test(s)?i&&l?r[s]=(...d)=>{const h=l(...d);return i(...d),h}:i&&(r[s]=i):s===\"style\"?r[s]={...i,...l}:s===\"className\"&&(r[s]=[i,l].filter(Boolean).join(\" \"))}return{...t,...r}}function BP(t){var s,i;let e=(s=Object.getOwnPropertyDescriptor(t.props,\"ref\"))==null?void 0:s.get,r=e&&\"isReactWarning\"in e&&e.isReactWarning;return r?t.ref:(e=(i=Object.getOwnPropertyDescriptor(t,\"ref\"))==null?void 0:i.get,r=e&&\"isReactWarning\"in e&&e.isReactWarning,r?t.props.ref:t.props.ref||t.ref)}const HP=_f(\"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-cyber-neon-cyan disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",{variants:{variant:{default:\"bg-cyber-neon-cyan/20 text-cyber-neon-cyan border border-cyber-neon-cyan/50 hover:bg-cyber-neon-cyan/30 hover:shadow-glow-cyan-sm active:scale-95\",destructive:\"bg-cyber-neon-pink/20 text-cyber-neon-pink border border-cyber-neon-pink/50 hover:bg-cyber-neon-pink/30 hover:shadow-glow-pink-sm active:scale-95\",outline:\"border border-cyber-border-DEFAULT bg-transparent hover:bg-cyber-bg-tertiary hover:border-cyber-neon-cyan/50 hover:text-cyber-neon-cyan\",secondary:\"bg-cyber-neon-green/20 text-cyber-neon-green border border-cyber-neon-green/50 hover:bg-cyber-neon-green/30 hover:shadow-glow-green-sm active:scale-95\",ghost:\"hover:bg-cyber-bg-tertiary hover:text-cyber-neon-cyan\",link:\"text-cyber-neon-cyan underline-offset-4 hover:underline\",glow:\"bg-cyber-neon-cyan/20 text-cyber-neon-cyan border border-cyber-neon-cyan/50 shadow-glow-cyan-sm hover:shadow-glow-cyan hover:bg-cyber-neon-cyan/30 active:scale-95\"},size:{default:\"h-10 px-4 py-2\",sm:\"h-9 rounded-md px-3\",lg:\"h-12 rounded-md px-8 text-base\",icon:\"h-10 w-10\"}},defaultVariants:{variant:\"default\",size:\"default\"}}),Ct=x.forwardRef(({className:t,variant:e,size:r,asChild:s=!1,...i},l)=>{const u=s?MP:\"button\";return g.jsx(u,{className:Be(HP({variant:e,size:r,className:t})),ref:l,...i})});Ct.displayName=\"Button\";function VP(t,e){return x.useReducer((r,s)=>e[r][s]??r,t)}var io=t=>{const{present:e,children:r}=t,s=WP(e),i=typeof r==\"function\"?r({present:s.isPresent}):x.Children.only(r),l=Ve(s.ref,KP(i));return typeof r==\"function\"||s.isPresent?x.cloneElement(i,{ref:l}):null};io.displayName=\"Presence\";function WP(t){const[e,r]=x.useState(),s=x.useRef(null),i=x.useRef(t),l=x.useRef(\"none\"),u=t?\"mounted\":\"unmounted\",[d,h]=VP(u,{mounted:{UNMOUNT:\"unmounted\",ANIMATION_OUT:\"unmountSuspended\"},unmountSuspended:{MOUNT:\"mounted\",ANIMATION_END:\"unmounted\"},unmounted:{MOUNT:\"mounted\"}});return x.useEffect(()=>{const p=Ll(s.current);l.current=d===\"mounted\"?p:\"none\"},[d]),mt(()=>{const p=s.current,y=i.current;if(y!==t){const C=l.current,w=Ll(p);t?h(\"MOUNT\"):w===\"none\"||(p==null?void 0:p.display)===\"none\"?h(\"UNMOUNT\"):h(y&&C!==w?\"ANIMATION_OUT\":\"UNMOUNT\"),i.current=t}},[t,h]),mt(()=>{if(e){let p;const y=e.ownerDocument.defaultView??window,v=w=>{const b=Ll(s.current).includes(CSS.escape(w.animationName));if(w.target===e&&b&&(h(\"ANIMATION_END\"),!i.current)){const k=e.style.animationFillMode;e.style.animationFillMode=\"forwards\",p=y.setTimeout(()=>{e.style.animationFillMode===\"forwards\"&&(e.style.animationFillMode=k)})}},C=w=>{w.target===e&&(l.current=Ll(s.current))};return e.addEventListener(\"animationstart\",C),e.addEventListener(\"animationcancel\",v),e.addEventListener(\"animationend\",v),()=>{y.clearTimeout(p),e.removeEventListener(\"animationstart\",C),e.removeEventListener(\"animationcancel\",v),e.removeEventListener(\"animationend\",v)}}else h(\"ANIMATION_END\")},[e,h]),{isPresent:[\"mounted\",\"unmountSuspended\"].includes(d),ref:x.useCallback(p=>{s.current=p?getComputedStyle(p):null,r(p)},[])}}function Ll(t){return(t==null?void 0:t.animationName)||\"none\"}function KP(t){var s,i;let e=(s=Object.getOwnPropertyDescriptor(t.props,\"ref\"))==null?void 0:s.get,r=e&&\"isReactWarning\"in e&&e.isReactWarning;return r?t.ref:(e=(i=Object.getOwnPropertyDescriptor(t,\"ref\"))==null?void 0:i.get,r=e&&\"isReactWarning\"in e&&e.isReactWarning,r?t.props.ref:t.props.ref||t.ref)}function qP(t){const e=QP(t),r=x.forwardRef((s,i)=>{const{children:l,...u}=s,d=x.Children.toArray(l),h=d.find(GP);if(h){const p=h.props.children,y=d.map(v=>v===h?x.Children.count(p)>1?x.Children.only(null):x.isValidElement(p)?p.props.children:null:v);return g.jsx(e,{...u,ref:i,children:x.isValidElement(p)?x.cloneElement(p,void 0,y):null})}return g.jsx(e,{...u,ref:i,children:l})});return r.displayName=`${t}.Slot`,r}function QP(t){const e=x.forwardRef((r,s)=>{const{children:i,...l}=r;if(x.isValidElement(i)){const u=JP(i),d=XP(l,i.props);return i.type!==x.Fragment&&(d.ref=s?Gs(s,u):u),x.cloneElement(i,d)}return x.Children.count(i)>1?x.Children.only(null):null});return e.displayName=`${t}.SlotClone`,e}var YP=Symbol(\"radix.slottable\");function GP(t){return x.isValidElement(t)&&typeof t.type==\"function\"&&\"__radixId\"in t.type&&t.type.__radixId===YP}function XP(t,e){const r={...e};for(const s in e){const i=t[s],l=e[s];/^on[A-Z]/.test(s)?i&&l?r[s]=(...d)=>{const h=l(...d);return i(...d),h}:i&&(r[s]=i):s===\"style\"?r[s]={...i,...l}:s===\"className\"&&(r[s]=[i,l].filter(Boolean).join(\" \"))}return{...t,...r}}function JP(t){var s,i;let e=(s=Object.getOwnPropertyDescriptor(t.props,\"ref\"))==null?void 0:s.get,r=e&&\"isReactWarning\"in e&&e.isReactWarning;return r?t.ref:(e=(i=Object.getOwnPropertyDescriptor(t,\"ref\"))==null?void 0:i.get,r=e&&\"isReactWarning\"in e&&e.isReactWarning,r?t.props.ref:t.props.ref||t.ref)}var Cc=\"Dialog\",[m0]=aa(Cc),[ZP,Tn]=m0(Cc),g0=t=>{const{__scopeDialog:e,children:r,open:s,defaultOpen:i,onOpenChange:l,modal:u=!0}=t,d=x.useRef(null),h=x.useRef(null),[p,y]=ff({prop:s,defaultProp:i??!1,onChange:l,caller:Cc});return g.jsx(ZP,{scope:e,triggerRef:d,contentRef:h,contentId:Ps(),titleId:Ps(),descriptionId:Ps(),open:p,onOpenChange:y,onOpenToggle:x.useCallback(()=>y(v=>!v),[y]),modal:u,children:r})};g0.displayName=Cc;var y0=\"DialogTrigger\",v0=x.forwardRef((t,e)=>{const{__scopeDialog:r,...s}=t,i=Tn(y0,r),l=Ve(e,i.triggerRef);return g.jsx(ze.button,{type:\"button\",\"aria-haspopup\":\"dialog\",\"aria-expanded\":i.open,\"aria-controls\":i.contentId,\"data-state\":th(i.open),...s,ref:l,onClick:Me(t.onClick,i.onOpenToggle)})});v0.displayName=y0;var Zf=\"DialogPortal\",[eT,x0]=m0(Zf,{forceMount:void 0}),w0=t=>{const{__scopeDialog:e,forceMount:r,children:s,container:i}=t,l=Tn(Zf,e);return g.jsx(eT,{scope:e,forceMount:r,children:x.Children.map(s,u=>g.jsx(io,{present:r||l.open,children:g.jsx(Yf,{asChild:!0,container:i,children:u})}))})};w0.displayName=Zf;var oc=\"DialogOverlay\",b0=x.forwardRef((t,e)=>{const r=x0(oc,t.__scopeDialog),{forceMount:s=r.forceMount,...i}=t,l=Tn(oc,t.__scopeDialog);return l.modal?g.jsx(io,{present:s||l.open,children:g.jsx(nT,{...i,ref:e})}):null});b0.displayName=oc;var tT=qP(\"DialogOverlay.RemoveScroll\"),nT=x.forwardRef((t,e)=>{const{__scopeDialog:r,...s}=t,i=Tn(oc,r);return g.jsx(Gf,{as:tT,allowPinchZoom:!0,shards:[i.contentRef],children:g.jsx(ze.div,{\"data-state\":th(i.open),...s,ref:e,style:{pointerEvents:\"auto\",...s.style}})})}),Wo=\"DialogContent\",S0=x.forwardRef((t,e)=>{const r=x0(Wo,t.__scopeDialog),{forceMount:s=r.forceMount,...i}=t,l=Tn(Wo,t.__scopeDialog);return g.jsx(io,{present:s||l.open,children:l.modal?g.jsx(rT,{...i,ref:e}):g.jsx(oT,{...i,ref:e})})});S0.displayName=Wo;var rT=x.forwardRef((t,e)=>{const r=Tn(Wo,t.__scopeDialog),s=x.useRef(null),i=Ve(e,r.contentRef,s);return x.useEffect(()=>{const l=s.current;if(l)return vx(l)},[]),g.jsx(C0,{...t,ref:i,trapFocus:r.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:Me(t.onCloseAutoFocus,l=>{var u;l.preventDefault(),(u=r.triggerRef.current)==null||u.focus()}),onPointerDownOutside:Me(t.onPointerDownOutside,l=>{const u=l.detail.originalEvent,d=u.button===0&&u.ctrlKey===!0;(u.button===2||d)&&l.preventDefault()}),onFocusOutside:Me(t.onFocusOutside,l=>l.preventDefault())})}),oT=x.forwardRef((t,e)=>{const r=Tn(Wo,t.__scopeDialog),s=x.useRef(!1),i=x.useRef(!1);return g.jsx(C0,{...t,ref:e,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:l=>{var u,d;(u=t.onCloseAutoFocus)==null||u.call(t,l),l.defaultPrevented||(s.current||(d=r.triggerRef.current)==null||d.focus(),l.preventDefault()),s.current=!1,i.current=!1},onInteractOutside:l=>{var h,p;(h=t.onInteractOutside)==null||h.call(t,l),l.defaultPrevented||(s.current=!0,l.detail.originalEvent.type===\"pointerdown\"&&(i.current=!0));const u=l.target;((p=r.triggerRef.current)==null?void 0:p.contains(u))&&l.preventDefault(),l.detail.originalEvent.type===\"focusin\"&&i.current&&l.preventDefault()}})}),C0=x.forwardRef((t,e)=>{const{__scopeDialog:r,trapFocus:s,onOpenAutoFocus:i,onCloseAutoFocus:l,...u}=t,d=Tn(Wo,r),h=x.useRef(null),p=Ve(e,h);return Kv(),g.jsxs(g.Fragment,{children:[g.jsx($f,{asChild:!0,loop:!0,trapped:s,onMountAutoFocus:i,onUnmountAutoFocus:l,children:g.jsx(zf,{role:\"dialog\",id:d.contentId,\"aria-describedby\":d.descriptionId,\"aria-labelledby\":d.titleId,\"data-state\":th(d.open),...u,ref:p,onDismiss:()=>d.onOpenChange(!1)})}),g.jsxs(g.Fragment,{children:[g.jsx(sT,{titleId:d.titleId}),g.jsx(aT,{contentRef:h,descriptionId:d.descriptionId})]})]})}),eh=\"DialogTitle\",E0=x.forwardRef((t,e)=>{const{__scopeDialog:r,...s}=t,i=Tn(eh,r);return g.jsx(ze.h2,{id:i.titleId,...s,ref:e})});E0.displayName=eh;var k0=\"DialogDescription\",N0=x.forwardRef((t,e)=>{const{__scopeDialog:r,...s}=t,i=Tn(k0,r);return g.jsx(ze.p,{id:i.descriptionId,...s,ref:e})});N0.displayName=k0;var R0=\"DialogClose\",P0=x.forwardRef((t,e)=>{const{__scopeDialog:r,...s}=t,i=Tn(R0,r);return g.jsx(ze.button,{type:\"button\",...s,ref:e,onClick:Me(t.onClick,()=>i.onOpenChange(!1))})});P0.displayName=R0;function th(t){return t?\"open\":\"closed\"}var T0=\"DialogTitleWarning\",[y_,O0]=Xk(T0,{contentName:Wo,titleName:eh,docsSlug:\"dialog\"}),sT=({titleId:t})=>{const e=O0(T0),r=`\\`${e.contentName}\\` requires a \\`${e.titleName}\\` for the component to be accessible for screen reader users.\n\nIf you want to hide the \\`${e.titleName}\\`, you can wrap it with our VisuallyHidden component.\n\nFor more information, see https://radix-ui.com/primitives/docs/components/${e.docsSlug}`;return x.useEffect(()=>{t&&(document.getElementById(t)||console.error(r))},[r,t]),null},iT=\"DialogDescriptionWarning\",aT=({contentRef:t,descriptionId:e})=>{const s=`Warning: Missing \\`Description\\` or \\`aria-describedby={undefined}\\` for {${O0(iT).contentName}}.`;return x.useEffect(()=>{var l;const i=(l=t.current)==null?void 0:l.getAttribute(\"aria-describedby\");e&&i&&(document.getElementById(e)||console.warn(s))},[s,t,e]),null},lT=g0,cT=v0,uT=w0,j0=b0,_0=S0,A0=E0,L0=N0,dT=P0;const I0=lT,fT=cT,hT=uT,D0=x.forwardRef(({className:t,...e},r)=>g.jsx(j0,{ref:r,className:Be(\"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",t),...e}));D0.displayName=j0.displayName;const nh=x.forwardRef(({className:t,children:e,...r},s)=>g.jsxs(hT,{children:[g.jsx(D0,{}),g.jsxs(_0,{ref:s,className:Be(\"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 glass-panel-dark float-panel rounded-lg p-6 duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]\",t),...r,children:[e,g.jsxs(dT,{className:\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 hover:text-cyber-neon-cyan focus:outline-none focus:ring-2 focus:ring-cyber-neon-cyan focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\",children:[g.jsx(jf,{className:\"h-4 w-4\"}),g.jsx(\"span\",{className:\"sr-only\",children:\"Close\"})]})]})]}));nh.displayName=_0.displayName;const rh=({className:t,...e})=>g.jsx(\"div\",{className:Be(\"flex flex-col space-y-1.5 text-center sm:text-left\",t),...e});rh.displayName=\"DialogHeader\";const oh=x.forwardRef(({className:t,...e},r)=>g.jsx(A0,{ref:r,className:Be(\"text-lg font-semibold leading-none tracking-tight text-cyber-neon-cyan font-mono\",t),...e}));oh.displayName=A0.displayName;const pT=x.forwardRef(({className:t,...e},r)=>g.jsx(L0,{ref:r,className:Be(\"text-sm text-cyber-text-secondary\",t),...e}));pT.displayName=L0.displayName;const M0=x.forwardRef(({className:t,...e},r)=>g.jsx(\"div\",{ref:r,className:Be(\"rounded-lg border border-cyber-border-DEFAULT bg-cyber-bg-tertiary text-cyber-text-primary shadow-cyber-card transition-all hover:border-cyber-neon-cyan/30\",t),...e}));M0.displayName=\"Card\";const mT=x.forwardRef(({className:t,...e},r)=>g.jsx(\"div\",{ref:r,className:Be(\"flex flex-col space-y-1.5 p-6\",t),...e}));mT.displayName=\"CardHeader\";const gT=x.forwardRef(({className:t,...e},r)=>g.jsx(\"h3\",{ref:r,className:Be(\"text-2xl font-semibold leading-none tracking-tight text-cyber-neon-cyan\",t),...e}));gT.displayName=\"CardTitle\";const yT=x.forwardRef(({className:t,...e},r)=>g.jsx(\"p\",{ref:r,className:Be(\"text-sm text-cyber-text-muted\",t),...e}));yT.displayName=\"CardDescription\";const F0=x.forwardRef(({className:t,...e},r)=>g.jsx(\"div\",{ref:r,className:Be(\"p-6 pt-0\",t),...e}));F0.displayName=\"CardContent\";const vT=x.forwardRef(({className:t,...e},r)=>g.jsx(\"div\",{ref:r,className:Be(\"flex items-center p-6 pt-0\",t),...e}));vT.displayName=\"CardFooter\";function xT(t,e){return x.useReducer((r,s)=>e[r][s]??r,t)}var sh=\"ScrollArea\",[z0]=aa(sh),[wT,un]=z0(sh),$0=x.forwardRef((t,e)=>{const{__scopeScrollArea:r,type:s=\"hover\",dir:i,scrollHideDelay:l=600,...u}=t,[d,h]=x.useState(null),[p,y]=x.useState(null),[v,C]=x.useState(null),[w,E]=x.useState(null),[b,k]=x.useState(null),[T,j]=x.useState(0),[_,A]=x.useState(0),[F,V]=x.useState(!1),[B,te]=x.useState(!1),G=Ve(e,le=>h(le)),W=Hv(i);return g.jsx(wT,{scope:r,type:s,dir:W,scrollHideDelay:l,scrollArea:d,viewport:p,onViewportChange:y,content:v,onContentChange:C,scrollbarX:w,onScrollbarXChange:E,scrollbarXEnabled:F,onScrollbarXEnabledChange:V,scrollbarY:b,onScrollbarYChange:k,scrollbarYEnabled:B,onScrollbarYEnabledChange:te,onCornerWidthChange:j,onCornerHeightChange:A,children:g.jsx(ze.div,{dir:W,...u,ref:G,style:{position:\"relative\",\"--radix-scroll-area-corner-width\":T+\"px\",\"--radix-scroll-area-corner-height\":_+\"px\",...t.style}})})});$0.displayName=sh;var U0=\"ScrollAreaViewport\",B0=x.forwardRef((t,e)=>{const{__scopeScrollArea:r,children:s,nonce:i,...l}=t,u=un(U0,r),d=x.useRef(null),h=Ve(e,d,u.onViewportChange);return g.jsxs(g.Fragment,{children:[g.jsx(\"style\",{dangerouslySetInnerHTML:{__html:\"[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}\"},nonce:i}),g.jsx(ze.div,{\"data-radix-scroll-area-viewport\":\"\",...l,ref:h,style:{overflowX:u.scrollbarXEnabled?\"scroll\":\"hidden\",overflowY:u.scrollbarYEnabled?\"scroll\":\"hidden\",...t.style},children:g.jsx(\"div\",{ref:u.onContentChange,style:{minWidth:\"100%\",display:\"table\"},children:s})})]})});B0.displayName=U0;var er=\"ScrollAreaScrollbar\",ih=x.forwardRef((t,e)=>{const{forceMount:r,...s}=t,i=un(er,t.__scopeScrollArea),{onScrollbarXEnabledChange:l,onScrollbarYEnabledChange:u}=i,d=t.orientation===\"horizontal\";return x.useEffect(()=>(d?l(!0):u(!0),()=>{d?l(!1):u(!1)}),[d,l,u]),i.type===\"hover\"?g.jsx(bT,{...s,ref:e,forceMount:r}):i.type===\"scroll\"?g.jsx(ST,{...s,ref:e,forceMount:r}):i.type===\"auto\"?g.jsx(H0,{...s,ref:e,forceMount:r}):i.type===\"always\"?g.jsx(ah,{...s,ref:e}):null});ih.displayName=er;var bT=x.forwardRef((t,e)=>{const{forceMount:r,...s}=t,i=un(er,t.__scopeScrollArea),[l,u]=x.useState(!1);return x.useEffect(()=>{const d=i.scrollArea;let h=0;if(d){const p=()=>{window.clearTimeout(h),u(!0)},y=()=>{h=window.setTimeout(()=>u(!1),i.scrollHideDelay)};return d.addEventListener(\"pointerenter\",p),d.addEventListener(\"pointerleave\",y),()=>{window.clearTimeout(h),d.removeEventListener(\"pointerenter\",p),d.removeEventListener(\"pointerleave\",y)}}},[i.scrollArea,i.scrollHideDelay]),g.jsx(io,{present:r||l,children:g.jsx(H0,{\"data-state\":l?\"visible\":\"hidden\",...s,ref:e})})}),ST=x.forwardRef((t,e)=>{const{forceMount:r,...s}=t,i=un(er,t.__scopeScrollArea),l=t.orientation===\"horizontal\",u=kc(()=>h(\"SCROLL_END\"),100),[d,h]=xT(\"hidden\",{hidden:{SCROLL:\"scrolling\"},scrolling:{SCROLL_END:\"idle\",POINTER_ENTER:\"interacting\"},interacting:{SCROLL:\"interacting\",POINTER_LEAVE:\"idle\"},idle:{HIDE:\"hidden\",SCROLL:\"scrolling\",POINTER_ENTER:\"interacting\"}});return x.useEffect(()=>{if(d===\"idle\"){const p=window.setTimeout(()=>h(\"HIDE\"),i.scrollHideDelay);return()=>window.clearTimeout(p)}},[d,i.scrollHideDelay,h]),x.useEffect(()=>{const p=i.viewport,y=l?\"scrollLeft\":\"scrollTop\";if(p){let v=p[y];const C=()=>{const w=p[y];v!==w&&(h(\"SCROLL\"),u()),v=w};return p.addEventListener(\"scroll\",C),()=>p.removeEventListener(\"scroll\",C)}},[i.viewport,l,h,u]),g.jsx(io,{present:r||d!==\"hidden\",children:g.jsx(ah,{\"data-state\":d===\"hidden\"?\"hidden\":\"visible\",...s,ref:e,onPointerEnter:Me(t.onPointerEnter,()=>h(\"POINTER_ENTER\")),onPointerLeave:Me(t.onPointerLeave,()=>h(\"POINTER_LEAVE\"))})})}),H0=x.forwardRef((t,e)=>{const r=un(er,t.__scopeScrollArea),{forceMount:s,...i}=t,[l,u]=x.useState(!1),d=t.orientation===\"horizontal\",h=kc(()=>{if(r.viewport){const p=r.viewport.offsetWidth<r.viewport.scrollWidth,y=r.viewport.offsetHeight<r.viewport.scrollHeight;u(d?p:y)}},10);return Ws(r.viewport,h),Ws(r.content,h),g.jsx(io,{present:s||l,children:g.jsx(ah,{\"data-state\":l?\"visible\":\"hidden\",...i,ref:e})})}),ah=x.forwardRef((t,e)=>{const{orientation:r=\"vertical\",...s}=t,i=un(er,t.__scopeScrollArea),l=x.useRef(null),u=x.useRef(0),[d,h]=x.useState({content:0,viewport:0,scrollbar:{size:0,paddingStart:0,paddingEnd:0}}),p=Q0(d.viewport,d.content),y={...s,sizes:d,onSizesChange:h,hasThumb:p>0&&p<1,onThumbChange:C=>l.current=C,onThumbPointerUp:()=>u.current=0,onThumbPointerDown:C=>u.current=C};function v(C,w){return PT(C,u.current,d,w)}return r===\"horizontal\"?g.jsx(CT,{...y,ref:e,onThumbPositionChange:()=>{if(i.viewport&&l.current){const C=i.viewport.scrollLeft,w=by(C,d,i.dir);l.current.style.transform=`translate3d(${w}px, 0, 0)`}},onWheelScroll:C=>{i.viewport&&(i.viewport.scrollLeft=C)},onDragScroll:C=>{i.viewport&&(i.viewport.scrollLeft=v(C,i.dir))}}):r===\"vertical\"?g.jsx(ET,{...y,ref:e,onThumbPositionChange:()=>{if(i.viewport&&l.current){const C=i.viewport.scrollTop,w=by(C,d);l.current.style.transform=`translate3d(0, ${w}px, 0)`}},onWheelScroll:C=>{i.viewport&&(i.viewport.scrollTop=C)},onDragScroll:C=>{i.viewport&&(i.viewport.scrollTop=v(C))}}):null}),CT=x.forwardRef((t,e)=>{const{sizes:r,onSizesChange:s,...i}=t,l=un(er,t.__scopeScrollArea),[u,d]=x.useState(),h=x.useRef(null),p=Ve(e,h,l.onScrollbarXChange);return x.useEffect(()=>{h.current&&d(getComputedStyle(h.current))},[h]),g.jsx(W0,{\"data-orientation\":\"horizontal\",...i,ref:p,sizes:r,style:{bottom:0,left:l.dir===\"rtl\"?\"var(--radix-scroll-area-corner-width)\":0,right:l.dir===\"ltr\"?\"var(--radix-scroll-area-corner-width)\":0,\"--radix-scroll-area-thumb-width\":Ec(r)+\"px\",...t.style},onThumbPointerDown:y=>t.onThumbPointerDown(y.x),onDragScroll:y=>t.onDragScroll(y.x),onWheelScroll:(y,v)=>{if(l.viewport){const C=l.viewport.scrollLeft+y.deltaX;t.onWheelScroll(C),G0(C,v)&&y.preventDefault()}},onResize:()=>{h.current&&l.viewport&&u&&s({content:l.viewport.scrollWidth,viewport:l.viewport.offsetWidth,scrollbar:{size:h.current.clientWidth,paddingStart:ic(u.paddingLeft),paddingEnd:ic(u.paddingRight)}})}})}),ET=x.forwardRef((t,e)=>{const{sizes:r,onSizesChange:s,...i}=t,l=un(er,t.__scopeScrollArea),[u,d]=x.useState(),h=x.useRef(null),p=Ve(e,h,l.onScrollbarYChange);return x.useEffect(()=>{h.current&&d(getComputedStyle(h.current))},[h]),g.jsx(W0,{\"data-orientation\":\"vertical\",...i,ref:p,sizes:r,style:{top:0,right:l.dir===\"ltr\"?0:void 0,left:l.dir===\"rtl\"?0:void 0,bottom:\"var(--radix-scroll-area-corner-height)\",\"--radix-scroll-area-thumb-height\":Ec(r)+\"px\",...t.style},onThumbPointerDown:y=>t.onThumbPointerDown(y.y),onDragScroll:y=>t.onDragScroll(y.y),onWheelScroll:(y,v)=>{if(l.viewport){const C=l.viewport.scrollTop+y.deltaY;t.onWheelScroll(C),G0(C,v)&&y.preventDefault()}},onResize:()=>{h.current&&l.viewport&&u&&s({content:l.viewport.scrollHeight,viewport:l.viewport.offsetHeight,scrollbar:{size:h.current.clientHeight,paddingStart:ic(u.paddingTop),paddingEnd:ic(u.paddingBottom)}})}})}),[kT,V0]=z0(er),W0=x.forwardRef((t,e)=>{const{__scopeScrollArea:r,sizes:s,hasThumb:i,onThumbChange:l,onThumbPointerUp:u,onThumbPointerDown:d,onThumbPositionChange:h,onDragScroll:p,onWheelScroll:y,onResize:v,...C}=t,w=un(er,r),[E,b]=x.useState(null),k=Ve(e,G=>b(G)),T=x.useRef(null),j=x.useRef(\"\"),_=w.viewport,A=s.content-s.viewport,F=Vt(y),V=Vt(h),B=kc(v,10);function te(G){if(T.current){const W=G.clientX-T.current.left,le=G.clientY-T.current.top;p({x:W,y:le})}}return x.useEffect(()=>{const G=W=>{const le=W.target;(E==null?void 0:E.contains(le))&&F(W,A)};return document.addEventListener(\"wheel\",G,{passive:!1}),()=>document.removeEventListener(\"wheel\",G,{passive:!1})},[_,E,A,F]),x.useEffect(V,[s,V]),Ws(E,B),Ws(w.content,B),g.jsx(kT,{scope:r,scrollbar:E,hasThumb:i,onThumbChange:Vt(l),onThumbPointerUp:Vt(u),onThumbPositionChange:V,onThumbPointerDown:Vt(d),children:g.jsx(ze.div,{...C,ref:k,style:{position:\"absolute\",...C.style},onPointerDown:Me(t.onPointerDown,G=>{G.button===0&&(G.target.setPointerCapture(G.pointerId),T.current=E.getBoundingClientRect(),j.current=document.body.style.webkitUserSelect,document.body.style.webkitUserSelect=\"none\",w.viewport&&(w.viewport.style.scrollBehavior=\"auto\"),te(G))}),onPointerMove:Me(t.onPointerMove,te),onPointerUp:Me(t.onPointerUp,G=>{const W=G.target;W.hasPointerCapture(G.pointerId)&&W.releasePointerCapture(G.pointerId),document.body.style.webkitUserSelect=j.current,w.viewport&&(w.viewport.style.scrollBehavior=\"\"),T.current=null})})})}),sc=\"ScrollAreaThumb\",K0=x.forwardRef((t,e)=>{const{forceMount:r,...s}=t,i=V0(sc,t.__scopeScrollArea);return g.jsx(io,{present:r||i.hasThumb,children:g.jsx(NT,{ref:e,...s})})}),NT=x.forwardRef((t,e)=>{const{__scopeScrollArea:r,style:s,...i}=t,l=un(sc,r),u=V0(sc,r),{onThumbPositionChange:d}=u,h=Ve(e,v=>u.onThumbChange(v)),p=x.useRef(void 0),y=kc(()=>{p.current&&(p.current(),p.current=void 0)},100);return x.useEffect(()=>{const v=l.viewport;if(v){const C=()=>{if(y(),!p.current){const w=TT(v,d);p.current=w,d()}};return d(),v.addEventListener(\"scroll\",C),()=>v.removeEventListener(\"scroll\",C)}},[l.viewport,y,d]),g.jsx(ze.div,{\"data-state\":u.hasThumb?\"visible\":\"hidden\",...i,ref:h,style:{width:\"var(--radix-scroll-area-thumb-width)\",height:\"var(--radix-scroll-area-thumb-height)\",...s},onPointerDownCapture:Me(t.onPointerDownCapture,v=>{const w=v.target.getBoundingClientRect(),E=v.clientX-w.left,b=v.clientY-w.top;u.onThumbPointerDown({x:E,y:b})}),onPointerUp:Me(t.onPointerUp,u.onThumbPointerUp)})});K0.displayName=sc;var lh=\"ScrollAreaCorner\",q0=x.forwardRef((t,e)=>{const r=un(lh,t.__scopeScrollArea),s=!!(r.scrollbarX&&r.scrollbarY);return r.type!==\"scroll\"&&s?g.jsx(RT,{...t,ref:e}):null});q0.displayName=lh;var RT=x.forwardRef((t,e)=>{const{__scopeScrollArea:r,...s}=t,i=un(lh,r),[l,u]=x.useState(0),[d,h]=x.useState(0),p=!!(l&&d);return Ws(i.scrollbarX,()=>{var v;const y=((v=i.scrollbarX)==null?void 0:v.offsetHeight)||0;i.onCornerHeightChange(y),h(y)}),Ws(i.scrollbarY,()=>{var v;const y=((v=i.scrollbarY)==null?void 0:v.offsetWidth)||0;i.onCornerWidthChange(y),u(y)}),p?g.jsx(ze.div,{...s,ref:e,style:{width:l,height:d,position:\"absolute\",right:i.dir===\"ltr\"?0:void 0,left:i.dir===\"rtl\"?0:void 0,bottom:0,...t.style}}):null});function ic(t){return t?parseInt(t,10):0}function Q0(t,e){const r=t/e;return isNaN(r)?0:r}function Ec(t){const e=Q0(t.viewport,t.content),r=t.scrollbar.paddingStart+t.scrollbar.paddingEnd,s=(t.scrollbar.size-r)*e;return Math.max(s,18)}function PT(t,e,r,s=\"ltr\"){const i=Ec(r),l=i/2,u=e||l,d=i-u,h=r.scrollbar.paddingStart+u,p=r.scrollbar.size-r.scrollbar.paddingEnd-d,y=r.content-r.viewport,v=s===\"ltr\"?[0,y]:[y*-1,0];return Y0([h,p],v)(t)}function by(t,e,r=\"ltr\"){const s=Ec(e),i=e.scrollbar.paddingStart+e.scrollbar.paddingEnd,l=e.scrollbar.size-i,u=e.content-e.viewport,d=l-s,h=r===\"ltr\"?[0,u]:[u*-1,0],p=af(t,h);return Y0([0,u],[0,d])(p)}function Y0(t,e){return r=>{if(t[0]===t[1]||e[0]===e[1])return e[0];const s=(e[1]-e[0])/(t[1]-t[0]);return e[0]+s*(r-t[0])}}function G0(t,e){return t>0&&t<e}var TT=(t,e=()=>{})=>{let r={left:t.scrollLeft,top:t.scrollTop},s=0;return(function i(){const l={left:t.scrollLeft,top:t.scrollTop},u=r.left!==l.left,d=r.top!==l.top;(u||d)&&e(),r=l,s=window.requestAnimationFrame(i)})(),()=>window.cancelAnimationFrame(s)};function kc(t,e){const r=Vt(t),s=x.useRef(0);return x.useEffect(()=>()=>window.clearTimeout(s.current),[]),x.useCallback(()=>{window.clearTimeout(s.current),s.current=window.setTimeout(r,e)},[r,e])}function Ws(t,e){const r=Vt(e);mt(()=>{let s=0;if(t){const i=new ResizeObserver(()=>{cancelAnimationFrame(s),s=window.requestAnimationFrame(r)});return i.observe(t),()=>{window.cancelAnimationFrame(s),i.unobserve(t)}}},[t,r])}var X0=$0,OT=B0,jT=q0;const J0=x.forwardRef(({className:t,children:e,...r},s)=>g.jsxs(X0,{ref:s,className:Be(\"relative overflow-hidden\",t),...r,children:[g.jsx(OT,{className:\"h-full w-full rounded-[inherit]\",children:e}),g.jsx(Z0,{}),g.jsx(jT,{})]}));J0.displayName=X0.displayName;const Z0=x.forwardRef(({className:t,orientation:e=\"vertical\",...r},s)=>g.jsx(ih,{ref:s,orientation:e,className:Be(\"flex touch-none select-none transition-colors\",e===\"vertical\"&&\"h-full w-2.5 border-l border-l-transparent p-[1px]\",e===\"horizontal\"&&\"h-2.5 flex-col border-t border-t-transparent p-[1px]\",t),...r,children:g.jsx(K0,{className:\"relative flex-1 rounded-full bg-border\"})}));Z0.displayName=ih.displayName;const Nc=x.forwardRef(({className:t,type:e,...r},s)=>g.jsx(\"input\",{type:e,className:Be(\"flex h-9 w-full rounded-md border border-cyber-border-DEFAULT bg-cyber-bg-tertiary px-3 py-2 text-sm font-mono text-cyber-text-primary ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-cyber-text-muted focus-visible:outline-none focus-visible:border-cyber-neon-cyan focus-visible:shadow-[0_0_10px_rgb(var(--cyber-neon-cyan)/0.2)] disabled:cursor-not-allowed disabled:opacity-50 transition-all\",t),ref:s,...r}));Nc.displayName=\"Input\";function _T({data:t,columns:e}){const{t:r}=Zt(\"data\"),[s,i]=x.useState(\"\"),l=x.useMemo(()=>e&&e.length>0?e:t.length===0?[]:Object.keys(t[0]),[t,e]),u=x.useMemo(()=>{if(!s)return t;const h=s.toLowerCase();return t.filter(p=>Object.values(p).some(y=>String(y??\"\").toLowerCase().includes(h)))},[t,s]),d=h=>h==null?\"-\":typeof h==\"object\"?JSON.stringify(h):String(h);return g.jsxs(\"div\",{className:\"h-full flex flex-col\",children:[g.jsx(\"div\",{className:\"flex-shrink-0 mb-3\",children:g.jsxs(\"div\",{className:\"relative\",children:[g.jsx(FS,{className:\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-cyber-text-muted\"}),g.jsx(Nc,{placeholder:r(\"preview.searchPlaceholder\"),value:s,onChange:h=>i(h.target.value),className:\"pl-9 h-9 text-xs font-mono\"})]})}),g.jsx(J0,{className:\"flex-1 border border-cyber-border-DEFAULT rounded-lg\",children:g.jsx(\"div\",{className:\"min-w-full\",children:g.jsxs(\"table\",{className:\"w-full text-xs font-mono\",children:[g.jsx(\"thead\",{className:\"sticky top-0 bg-cyber-bg-tertiary border-b border-cyber-border-DEFAULT\",children:g.jsxs(\"tr\",{children:[g.jsx(\"th\",{className:\"px-3 py-2 text-left text-cyber-text-muted w-12\",children:\"#\"}),l.map(h=>g.jsx(\"th\",{className:\"px-3 py-2 text-left text-cyber-neon-cyan whitespace-nowrap\",children:h},h))]})}),g.jsx(\"tbody\",{children:u.map((h,p)=>g.jsxs(\"tr\",{className:\"border-b border-cyber-border-subtle hover:bg-cyber-bg-elevated/50 transition-colors\",children:[g.jsx(\"td\",{className:\"px-3 py-2 text-cyber-text-muted\",children:p+1}),l.map(y=>g.jsx(\"td\",{className:\"px-3 py-2 text-cyber-text-primary max-w-xs truncate\",title:d(h[y]),children:d(h[y])},y))]},p))})]})})}),s&&g.jsx(\"div\",{className:\"flex-shrink-0 mt-2 text-xs text-cyber-text-muted font-mono\",children:r(\"preview.showing\",{filtered:u.length,total:t.length})})]})}function AT({file:t,open:e,onOpenChange:r}){const{t:s}=Zt(\"data\"),{data:i,isLoading:l,error:u}=ta({queryKey:[\"filePreview\",t.path],queryFn:async()=>{const{data:h}=await Xl.getFileContent(t.path,100);return h},enabled:e}),d=()=>{const h=Xl.getDownloadUrl(t.path);window.open(h,\"_blank\")};return g.jsx(I0,{open:e,onOpenChange:r,children:g.jsxs(nh,{className:\"max-w-6xl max-h-[85vh] flex flex-col\",children:[g.jsx(rh,{className:\"flex-shrink-0\",children:g.jsxs(\"div\",{className:\"flex items-center justify-between\",children:[g.jsxs(\"div\",{className:\"flex items-center gap-3\",children:[g.jsx(oh,{className:\"font-mono text-cyber-neon-cyan\",children:t.name}),g.jsxs(qi,{variant:\"outline\",className:\"font-mono text-[10px]\",children:[\".\",t.type.toUpperCase()]}),i&&g.jsx(qi,{variant:\"default\",className:\"font-mono text-[10px]\",children:s(\"preview.records\",{count:i.total})})]}),g.jsxs(Ct,{variant:\"outline\",size:\"sm\",onClick:d,className:\"font-mono text-xs\",children:[g.jsx(nv,{className:\"w-3 h-3 mr-1\"}),s(\"preview.download\")]})]})}),g.jsx(\"div\",{className:\"flex-1 overflow-hidden min-h-0 mt-4\",children:l?g.jsx(\"div\",{className:\"flex items-center justify-center h-full\",children:g.jsx(\"div\",{className:\"text-cyber-text-muted font-mono animate-pulse\",children:s(\"preview.loading\")})}):u?g.jsx(\"div\",{className:\"flex items-center justify-center h-full\",children:g.jsx(\"div\",{className:\"text-cyber-neon-pink font-mono\",children:s(\"preview.error\")})}):i?g.jsx(_T,{data:i.data,columns:i.columns}):null})]})})}const LT={json:RS,csv:pd,xlsx:pd,xls:pd},IT={json:{icon:\"text-cyber-neon-yellow\",border:\"hover:border-cyber-neon-yellow/50\",badge:\"border-cyber-neon-yellow/30 bg-cyber-neon-yellow/10 text-cyber-neon-yellow\"},csv:{icon:\"text-cyber-neon-green\",border:\"hover:border-cyber-neon-green/50\",badge:\"border-cyber-neon-green/30 bg-cyber-neon-green/10 text-cyber-neon-green\"},xlsx:{icon:\"text-cyber-neon-cyan\",border:\"hover:border-cyber-neon-cyan/50\",badge:\"border-cyber-neon-cyan/30 bg-cyber-neon-cyan/10 text-cyber-neon-cyan\"},xls:{icon:\"text-cyber-neon-cyan\",border:\"hover:border-cyber-neon-cyan/50\",badge:\"border-cyber-neon-cyan/30 bg-cyber-neon-cyan/10 text-cyber-neon-cyan\"}};function DT({file:t}){const{t:e}=Zt(\"data\"),[r,s]=x.useState(!1),i=LT[t.type]||PS,l=IT[t.type]||{icon:\"text-cyber-text-muted\",border:\"hover:border-cyber-neon-cyan/50\",badge:\"border-cyber-border-DEFAULT bg-cyber-bg-tertiary text-cyber-text-secondary\"},u=[\"json\",\"csv\",\"xlsx\",\"xls\"].includes(t.type.toLowerCase()),d=()=>{const h=Xl.getDownloadUrl(t.path);window.open(h,\"_blank\")};return g.jsxs(g.Fragment,{children:[g.jsxs(M0,{className:`relative overflow-hidden card-scan group transition-all ${l.border} hover:shadow-[0_0_15px_rgb(var(--cyber-neon-cyan)/0.15)]`,children:[g.jsx(\"div\",{className:\"absolute inset-0 bg-gradient-to-r from-transparent via-cyber-neon-cyan/5 to-transparent -translate-x-full group-hover:translate-x-full transition-transform duration-700 pointer-events-none\"}),g.jsxs(F0,{className:\"p-4 relative\",children:[g.jsxs(\"div\",{className:\"flex items-start gap-3\",children:[g.jsx(\"div\",{className:`p-2 rounded bg-cyber-bg-panel border border-cyber-border-DEFAULT ${l.icon}`,children:g.jsx(i,{className:\"w-6 h-6\"})}),g.jsxs(\"div\",{className:\"flex-1 min-w-0\",children:[g.jsx(\"h3\",{className:\"font-mono font-medium text-sm text-cyber-text-primary truncate\",title:t.name,children:t.name}),g.jsxs(\"p\",{className:\"text-xs text-cyber-text-muted mt-1 font-mono\",children:[lE(t.size),t.record_count!==null&&g.jsxs(\"span\",{className:\"text-cyber-neon-green\",children:[\" | \",e(\"file.entries\",{count:t.record_count})]})]}),g.jsx(\"p\",{className:\"text-xs text-cyber-text-muted mt-1 font-mono\",children:cE(t.modified_at)})]})]}),g.jsxs(\"div\",{className:\"flex items-center justify-between mt-3 pt-3 border-t border-cyber-border-subtle\",children:[g.jsxs(qi,{variant:\"outline\",className:`text-[10px] font-mono ${l.badge}`,children:[\".\",t.type.toUpperCase()]}),g.jsxs(\"div\",{className:\"flex gap-1 opacity-0 group-hover:opacity-100 transition-opacity\",children:[u&&g.jsxs(Ct,{variant:\"ghost\",size:\"sm\",className:\"h-7 px-2 font-mono text-cyber-neon-cyan hover:text-cyber-neon-cyan hover:bg-cyber-neon-cyan/10\",onClick:()=>s(!0),children:[g.jsx(NS,{className:\"w-3 h-3 mr-1\"}),e(\"file.preview\")]}),g.jsxs(Ct,{variant:\"ghost\",size:\"sm\",className:\"h-7 px-2 font-mono text-cyber-neon-cyan hover:text-cyber-neon-cyan hover:bg-cyber-neon-cyan/10\",onClick:d,children:[g.jsx(nv,{className:\"w-3 h-3 mr-1\"}),e(\"file.extract\")]})]})]})]})]}),u&&g.jsx(AT,{file:t,open:r,onOpenChange:s})]})}function MT(t){const e=t.match(/^(search_\\w+?)_/);if(e)return e[1];const r=t.split(\"_\");return r.length>=2?`${r[0]}_${r[1]}`:\"other\"}function FT(t){return{search_comments:\"Comments\",search_creators:\"Creators\",search_videos:\"Videos\",search_contents:\"Contents\",search_notes:\"Notes\",other:\"Other\"}[t]||t.replace(/_/g,\" \").replace(/\\b\\w/g,r=>r.toUpperCase())}function zT(){const{t}=Zt(\"data\"),[e,r]=x.useState(\"all\"),{data:s,isLoading:i,refetch:l,isRefetching:u}=ta({queryKey:[\"dataFiles\"],queryFn:async()=>{const{data:v}=await Xl.getFiles();return v.files}}),d=s||[],{categories:h,groupedFiles:p}=x.useMemo(()=>{const v={};return d.forEach(w=>{const E=MT(w.name);v[E]||(v[E]=[]),v[E].push(w)}),{categories:Object.keys(v).sort((w,E)=>v[E].length-v[w].length),groupedFiles:v}},[d]),y=e===\"all\"?d:p[e]||[];return g.jsxs(\"div\",{className:\"h-full flex flex-col\",children:[g.jsxs(\"div\",{className:\"flex items-center justify-between mb-4\",children:[g.jsxs(\"div\",{className:\"flex items-center gap-3\",children:[g.jsx(\"h2\",{className:\"text-lg font-mono font-bold text-cyber-neon-cyan glow-text-cyan tracking-wider\",children:t(\"explorer.title\")}),g.jsx(qi,{variant:\"default\",className:\"font-mono\",children:t(\"explorer.records\",{count:d.length})})]}),g.jsxs(Ct,{variant:\"outline\",size:\"sm\",onClick:()=>l(),disabled:u,className:\"font-mono\",children:[g.jsx(Tf,{className:`w-4 h-4 ${u?\"animate-spin\":\"\"}`}),t(\"explorer.rescan\")]})]}),d.length>0&&h.length>1&&g.jsxs(\"div\",{className:\"flex items-center gap-2 mb-4 flex-wrap\",children:[g.jsxs(\"button\",{onClick:()=>r(\"all\"),className:`px-3 py-1.5 rounded-md text-xs font-mono transition-all ${e===\"all\"?\"bg-cyber-neon-cyan text-black font-bold\":\"bg-cyber-bg-tertiary text-cyber-text-secondary hover:text-cyber-text-primary border border-cyber-border-subtle hover:border-cyber-neon-cyan/50\"}`,children:[t(\"explorer.allCategories\"),\" (\",d.length,\")\"]}),h.map(v=>g.jsxs(\"button\",{onClick:()=>r(v),className:`px-3 py-1.5 rounded-md text-xs font-mono transition-all ${e===v?\"bg-cyber-neon-cyan text-black font-bold\":\"bg-cyber-bg-tertiary text-cyber-text-secondary hover:text-cyber-text-primary border border-cyber-border-subtle hover:border-cyber-neon-cyan/50\"}`,children:[FT(v),\" (\",p[v].length,\")\"]},v))]}),i?g.jsx(\"div\",{className:\"flex-1 flex items-center justify-center\",children:g.jsx(\"div\",{className:\"text-cyber-text-muted font-mono animate-pulse\",children:t(\"explorer.loading\")})}):d.length===0?g.jsxs(\"div\",{className:\"flex-1 flex flex-col items-center justify-center text-center\",children:[g.jsxs(\"div\",{className:\"relative\",children:[g.jsx(TS,{className:\"w-16 h-16 text-cyber-neon-cyan/30 mb-4\"}),g.jsx(\"div\",{className:\"absolute inset-0 blur-xl bg-cyber-neon-cyan/10\"})]}),g.jsx(\"h3\",{className:\"text-lg font-mono font-medium text-cyber-neon-cyan mb-2\",children:t(\"explorer.noData\")}),g.jsx(\"p\",{className:\"text-sm text-cyber-text-muted max-w-md font-mono\",children:t(\"explorer.noDataHint\")})]}):g.jsx(\"div\",{className:\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\",children:y.map(v=>g.jsx(DT,{file:v},v.path))})]})}function $T(){const{t}=Zt(\"data\");return g.jsxs(I0,{children:[g.jsx(fT,{asChild:!0,children:g.jsxs(Ct,{variant:\"outline\",size:\"sm\",className:\"font-mono text-xs text-[#c9d1d9] border-[#30363d] bg-transparent hover:bg-[#21262d] hover:text-[#00ffff] hover:border-[#00ffff]/50\",children:[g.jsx(tv,{className:\"w-3.5 h-3.5\"}),t(\"dialog.button\")]})}),g.jsxs(nh,{className:\"max-w-5xl max-h-[85vh] overflow-hidden\",children:[g.jsx(rh,{children:g.jsx(oh,{children:t(\"dialog.title\")})}),g.jsx(\"div\",{className:\"overflow-auto max-h-[calc(85vh-100px)] pr-2\",children:g.jsx(zT,{})})]})]})}function UT(){const{t}=Zt(\"terminal\"),[e,r]=x.useState(!1),s=jt(p=>p.logs),i=jt(p=>p.clearLogs),l=jt(p=>p.restoreLogs),u=jt(p=>p.clearedAfterLogId),d=jt(p=>p.status),h=x.useRef(null);return x.useEffect(()=>{h.current&&!e&&(h.current.scrollTop=h.current.scrollHeight)},[s,e]),g.jsxs(\"div\",{className:`flex flex-col rounded-lg overflow-hidden transition-all duration-300 border border-cyber-border-subtle bg-[#0d1117] ${e?\"h-12\":\"h-full\"}`,children:[g.jsxs(\"div\",{className:\"flex items-center justify-between px-4 py-2.5 bg-[#161b22] border-b border-[#30363d] flex-shrink-0\",children:[g.jsxs(\"div\",{className:\"flex items-center gap-3\",children:[g.jsxs(\"div\",{className:\"flex gap-1.5\",children:[g.jsx(\"span\",{className:\"w-2.5 h-2.5 rounded-full bg-cyber-neon-pink/80\"}),g.jsx(\"span\",{className:\"w-2.5 h-2.5 rounded-full bg-cyber-neon-orange/80\"}),g.jsx(\"span\",{className:\"w-2.5 h-2.5 rounded-full bg-cyber-neon-green/80\"})]}),g.jsx(\"span\",{className:\"text-xs text-[#8b949e] font-mono tracking-wider\",children:t(\"header.title\")})]}),g.jsxs(\"div\",{className:\"flex items-center gap-3\",children:[g.jsxs(\"div\",{className:\"flex items-center gap-3 text-xs font-mono\",children:[g.jsx(\"span\",{className:\"text-[#8b949e]\",children:t(\"header.entries\",{count:s.length})}),d===\"running\"&&g.jsxs(\"div\",{className:\"flex items-center gap-1.5\",children:[g.jsx(\"span\",{className:\"w-1.5 h-1.5 bg-cyber-neon-green rounded-full shadow-glow-green-sm animate-pulse-fast\"}),g.jsx(\"span\",{className:\"text-cyber-neon-green\",children:t(\"header.active\")})]})]}),g.jsx($T,{}),u!==null&&g.jsx(Ct,{variant:\"ghost\",size:\"sm\",onClick:l,className:\"h-7 px-2 text-[#8b949e] hover:text-[#00ffff] hover:bg-[#00ffff]/10\",title:t(\"header.restore\"),children:g.jsx(Tf,{className:\"w-4 h-4\"})}),g.jsx(Ct,{variant:\"ghost\",size:\"sm\",onClick:i,disabled:s.length===0,className:\"h-7 px-2 text-[#8b949e] hover:text-[#ff0080] hover:bg-[#ff0080]/10 disabled:opacity-30\",title:t(\"header.clear\"),children:g.jsx(HS,{className:\"w-4 h-4\"})}),g.jsx(Ct,{variant:\"ghost\",size:\"sm\",onClick:()=>r(!e),className:\"h-7 px-2 text-[#8b949e] hover:text-[#00ffff] hover:bg-[#00ffff]/10\",children:e?g.jsx(Pf,{className:\"w-4 h-4\"}):g.jsx(ev,{className:\"w-4 h-4\"})})]})]}),!e&&g.jsxs(g.Fragment,{children:[g.jsxs(\"div\",{ref:h,className:\"flex-1 overflow-auto p-4 font-mono text-sm terminal-scroll bg-[#0d1117] min-h-0\",children:[s.length===0?g.jsxs(\"div\",{className:\"space-y-4\",children:[g.jsx(\"pre\",{className:\"text-cyber-neon-cyan/70 text-xs leading-tight\",children:`  ╔══════════════════════════════════════════════════════╗\n  ║   __  __          _ _       ____                     ║\n  ║  |  \\\\/  | ___  __| (_) __ _/ ___|_ __ __ ___      __ ║\n  ║  | |\\\\/| |/ _ \\\\/ _\\` | |/ _\\` | |   | '__/ _\\` \\\\ \\\\ /\\\\ / / ║\n  ║  | |  | |  __/ (_| | | (_| | |___| | | (_| |\\\\ V  V /  ║\n  ║  |_|  |_|\\\\___|\\\\__,_|_|\\\\__,_|\\\\____|_|  \\\\__,_| \\\\_/\\\\_/   ║\n  ║                                                      ║\n  ║          [ NEURAL EXTRACTION UNIT v1.0 ]             ║\n  ╚══════════════════════════════════════════════════════╝`}),g.jsxs(\"div\",{className:\"text-[#c9d1d9] text-xs space-y-1\",children:[g.jsx(\"p\",{className:\"text-cyber-neon-green/70\",children:t(\"banner.systemInit\")}),g.jsx(\"p\",{className:\"text-[#8b949e]\",children:t(\"banner.configHint\")})]})]}):g.jsx(\"div\",{className:\"space-y-0.5\",children:s.map(p=>g.jsx(LP,{log:p},p.id))}),d===\"running\"&&g.jsxs(\"div\",{className:\"flex items-center gap-1 mt-3\",children:[g.jsx(\"span\",{className:\"text-cyber-neon-green/80\",children:\"root@crawler:~$\"}),g.jsx(\"span\",{className:\"w-2 h-4 bg-cyber-neon-green/80 cursor-blink\"})]})]}),g.jsx(\"div\",{className:\"px-4 py-2 border-t border-[#30363d] bg-[#161b22] flex items-center justify-end flex-shrink-0\",children:g.jsx(\"div\",{className:\"text-xs font-mono text-[#8b949e]\",children:d.toUpperCase()})})]})]})}let bt=null,So=null,Il=0;function BT(){const t=jt(r=>r.addLog),e=x.useRef(t);return x.useEffect(()=>{e.current=t},[t]),x.useEffect(()=>{Il++;const r=()=>{if(So&&(clearTimeout(So),So=null),bt&&(bt.readyState===WebSocket.OPEN||bt.readyState===WebSocket.CONNECTING))return;const i=window.location.protocol===\"https:\"?\"wss:\":\"ws:\",l=window.location.host,u=`${i}//${l}/api/ws/logs`,d=new WebSocket(u);bt=d,d.onopen=()=>{bt===d&&console.log(\"WebSocket connected\")},d.onmessage=h=>{if(bt===d){if(h.data===\"ping\"){d.send(\"pong\");return}if(h.data!==\"pong\")try{const p=JSON.parse(h.data);p.id&&p.message&&e.current(p)}catch{console.warn(\"Failed to parse WebSocket message:\",h.data)}}},d.onclose=()=>{bt===d&&(console.log(\"WebSocket disconnected\"),bt=null,Il>0&&(So=setTimeout(r,2e3)))},d.onerror=h=>{bt===d&&console.error(\"WebSocket error:\",h)}};r();const s=setInterval(()=>{bt&&bt.readyState===WebSocket.OPEN&&bt.send(\"ping\")},3e4);return()=>{if(Il--,clearInterval(s),Il===0&&(So&&(clearTimeout(So),So=null),bt)){const i=bt;bt=null,i.close()}}},[]),{ws:bt}}function HT(){return BT(),g.jsx(\"main\",{className:\"flex-1 flex flex-col overflow-hidden min-h-0 relative z-10\",children:g.jsx(UT,{})})}function VT(){const{t}=Zt(\"license\");return g.jsx(\"footer\",{className:\"h-24 flex-shrink-0 glass-panel border-t border-cyber-border-subtle\",children:g.jsxs(\"div\",{className:\"h-full px-6 flex items-center justify-center gap-6\",children:[g.jsx(\"div\",{className:\"w-14 h-14 rounded-lg overflow-hidden border-2 border-cyber-neon-cyan/60 flex-shrink-0 shadow-glow-cyan-sm\",children:g.jsx(\"img\",{src:\"/logos/my_logo.png\",alt:\"程序员阿江-Relakkes\",className:\"w-full h-full object-cover\"})}),g.jsxs(\"div\",{className:\"flex flex-col gap-1\",children:[g.jsxs(\"div\",{className:\"flex items-center gap-2\",children:[g.jsx(\"span\",{className:\"text-lg font-bold text-cyber-text-primary\",children:t(\"author.name\")}),g.jsx($S,{className:\"w-5 h-5 text-cyber-neon-cyan animate-pulse\"})]}),g.jsx(\"span\",{className:\"text-sm text-cyber-text-muted hidden sm:inline\",children:t(\"author.description\")}),g.jsxs(\"div\",{className:\"flex items-center gap-2 text-cyber-neon-cyan\",children:[g.jsx(jS,{className:\"w-4 h-4 fill-current animate-pulse\"}),g.jsx(\"span\",{className:\"text-sm font-medium\",children:t(\"author.slogan\")})]})]}),g.jsxs(\"div\",{className:\"flex items-center gap-3\",children:[g.jsx(\"a\",{href:\"https://github.com/NanmiCoder\",target:\"_blank\",rel:\"noopener noreferrer\",className:\"w-11 h-11 rounded-lg flex items-center justify-center border border-cyber-border-subtle hover:border-cyber-neon-cyan hover:shadow-glow-cyan-sm transition-all bg-cyber-bg-tertiary hover:scale-110\",title:\"GitHub\",children:g.jsx(\"img\",{src:\"/logos/github.png\",alt:\"GitHub\",className:\"w-6 h-6 object-contain\"})}),g.jsx(\"a\",{href:\"https://space.bilibili.com/434377496\",target:\"_blank\",rel:\"noopener noreferrer\",className:\"w-11 h-11 rounded-lg flex items-center justify-center border border-cyber-border-subtle hover:border-pink-400 hover:shadow-[0_0_10px_rgba(251,113,133,0.4)] transition-all bg-cyber-bg-tertiary hover:scale-110\",title:\"哔哩哔哩\",children:g.jsx(\"img\",{src:\"/logos/bilibili_logo.png\",alt:\"Bilibili\",className:\"w-6 h-6 object-contain\"})}),g.jsx(\"a\",{href:\"https://www.xiaohongshu.com/user/profile/5f58bd990000000001003753\",target:\"_blank\",rel:\"noopener noreferrer\",className:\"w-11 h-11 rounded-lg flex items-center justify-center border border-cyber-border-subtle hover:border-red-400 hover:shadow-[0_0_10px_rgba(248,113,113,0.4)] transition-all bg-cyber-bg-tertiary hover:scale-110\",title:\"小红书\",children:g.jsx(\"img\",{src:\"/logos/xiaohongshu_logo.png\",alt:\"小红书\",className:\"w-6 h-6 object-contain\"})}),g.jsx(\"a\",{href:\"https://www.douyin.com/user/MS4wLjABAAAATJPY7LAlaa5X-c8uNdWkvz0jUGgpw4eeXIwu_8BhvqE\",target:\"_blank\",rel:\"noopener noreferrer\",className:\"w-11 h-11 rounded-lg flex items-center justify-center border border-cyber-border-subtle hover:border-cyber-text-primary hover:shadow-[0_0_10px_rgba(255,255,255,0.3)] transition-all bg-cyber-bg-tertiary hover:scale-110\",title:\"抖音\",children:g.jsx(\"img\",{src:\"/logos/douyin.png\",alt:\"抖音\",className:\"w-6 h-6 object-contain\"})})]})]})})}var WT=[\"a\",\"button\",\"div\",\"form\",\"h2\",\"h3\",\"img\",\"input\",\"label\",\"li\",\"nav\",\"ol\",\"p\",\"select\",\"span\",\"svg\",\"ul\"],KT=WT.reduce((t,e)=>{const r=p0(`Primitive.${e}`),s=x.forwardRef((i,l)=>{const{asChild:u,...d}=i,h=u?r:e;return typeof window<\"u\"&&(window[Symbol.for(\"radix-ui\")]=!0),g.jsx(h,{...d,ref:l})});return s.displayName=`Primitive.${e}`,{...t,[e]:s}},{}),qT=\"Label\",ew=x.forwardRef((t,e)=>g.jsx(KT.label,{...t,ref:e,onMouseDown:r=>{var i;r.target.closest(\"button, input, select, textarea\")||((i=t.onMouseDown)==null||i.call(t,r),!r.defaultPrevented&&r.detail>1&&r.preventDefault())}}));ew.displayName=qT;var tw=ew;const QT=_f(\"text-sm font-mono leading-none text-cyber-text-secondary peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"),nw=x.forwardRef(({className:t,...e},r)=>g.jsx(tw,{ref:r,className:Be(QT(),t),...e}));nw.displayName=tw.displayName;const Hl=x.forwardRef(({className:t,checked:e,onCheckedChange:r,...s},i)=>g.jsxs(\"label\",{className:\"inline-flex items-center cursor-pointer\",children:[g.jsx(\"input\",{type:\"checkbox\",className:\"sr-only peer\",ref:i,checked:e,onChange:l=>r==null?void 0:r(l.target.checked),...s}),g.jsx(\"div\",{className:Be(\"h-4 w-4 shrink-0 rounded-sm border border-cyber-border-DEFAULT bg-cyber-bg-tertiary ring-offset-background focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-cyber-neon-cyan disabled:cursor-not-allowed disabled:opacity-50 peer-checked:bg-cyber-neon-cyan/20 peer-checked:border-cyber-neon-cyan peer-checked:shadow-glow-cyan-sm flex items-center justify-center transition-all\",t),children:g.jsx(Rf,{className:Be(\"h-3 w-3 text-cyber-neon-cyan transition-opacity\",e?\"opacity-100\":\"opacity-0\")})})]}));Hl.displayName=\"Checkbox\";const YT={xhs:{video:[/xiaohongshu\\.com\\/explore\\/([a-zA-Z0-9]+)/,/xiaohongshu\\.com\\/discovery\\/item\\/([a-zA-Z0-9]+)/,/xhslink\\.com\\/([a-zA-Z0-9]+)/],creator:[/xiaohongshu\\.com\\/user\\/profile\\/([a-zA-Z0-9]+)/]},dy:{video:[/douyin\\.com\\/video\\/(\\d+)/,/v\\.douyin\\.com\\/([a-zA-Z0-9]+)/,/iesdouyin\\.com\\/share\\/video\\/(\\d+)/],creator:[/douyin\\.com\\/user\\/([a-zA-Z0-9_-]+)/]},bili:{video:[/bilibili\\.com\\/video\\/(BV[a-zA-Z0-9]+)/,/bilibili\\.com\\/video\\/(av\\d+)/,/b23\\.tv\\/([a-zA-Z0-9]+)/],creator:[/space\\.bilibili\\.com\\/(\\d+)/]},wb:{video:[/weibo\\.com\\/\\d+\\/([a-zA-Z0-9]+)/,/m\\.weibo\\.cn\\/status\\/(\\d+)/],creator:[/weibo\\.com\\/u\\/(\\d+)/,/weibo\\.com\\/([a-zA-Z0-9]+)$/]},ks:{video:[/kuaishou\\.com\\/short-video\\/([a-zA-Z0-9_-]+)/,/v\\.kuaishou\\.com\\/([a-zA-Z0-9]+)/],creator:[/kuaishou\\.com\\/profile\\/([a-zA-Z0-9_-]+)/]}};function GT(t,e){const r=t.trim();if(!r.includes(\"/\")&&!r.includes(\".\"))return{id:r,type:\"unknown\",original:r,isValid:r.length>0};const s=YT[e];if(!s)return{id:r,type:\"unknown\",original:r,isValid:!1};for(const l of s.video){const u=r.match(l);if(u&&u[1])return{id:u[1],type:\"video\",original:r,isValid:!0}}for(const l of s.creator){const u=r.match(l);if(u&&u[1])return{id:u[1],type:\"creator\",original:r,isValid:!0}}const i=r.match(/([a-zA-Z0-9_-]{6,})/);return i?{id:i[1],type:\"unknown\",original:r,isValid:!1}:{id:r,type:\"unknown\",original:r,isValid:!1}}function XT(t,e){return t.trim()?t.split(/[,\\n]+/).map(s=>s.trim()).filter(Boolean).map(s=>GT(s,e)):[]}function Sy({value:t,platform:e,type:r,onRemove:s,disabled:i}){const l=x.useMemo(()=>XT(t,e),[t,e]);if(l.length===0)return null;const u=d=>{if(i||!s)return;t.split(/[,\\n]+/).map(p=>p.trim()).filter(Boolean).splice(d,1),s(d)};return g.jsxs(\"div\",{className:\"space-y-1.5 mt-2\",children:[g.jsxs(\"div\",{className:\"text-[10px] text-cyber-text-muted font-mono\",children:[\"已识别 \",l.length,\" 个\",r===\"detail\"?\"帖子/视频\":\"创作者\",\":\"]}),g.jsx(\"div\",{className:\"flex flex-wrap gap-1.5\",children:l.map((d,h)=>g.jsx(JT,{item:d,expectedType:r,onRemove:i?void 0:()=>u(h)},`${d.id}-${h}`))})]})}function JT({item:t,expectedType:e,onRemove:r}){const s=t.type===\"unknown\"||e===\"detail\"&&t.type===\"video\"||e===\"creator\"&&t.type===\"creator\",i=!t.isValid||!s;return g.jsxs(\"span\",{className:`\n        inline-flex items-center gap-1 px-2 py-1 rounded-md text-[10px] font-mono\n        ${i?\"bg-cyber-neon-orange/10 border border-cyber-neon-orange/30 text-cyber-neon-orange\":\"bg-cyber-neon-cyan/10 border border-cyber-neon-cyan/30 text-cyber-neon-cyan\"}\n      `,title:t.original,children:[i?g.jsx(Of,{className:\"w-3 h-3 flex-shrink-0\"}):g.jsx(Rf,{className:\"w-3 h-3 flex-shrink-0\"}),g.jsx(\"span\",{className:\"max-w-[120px] truncate\",children:t.id.length>20?t.id.slice(0,8)+\"...\"+t.id.slice(-8):t.id}),r&&g.jsx(\"button\",{type:\"button\",onClick:r,className:\"hover:text-cyber-neon-pink transition-colors ml-0.5\",children:g.jsx(jf,{className:\"w-3 h-3\"})})]})}function Ld({title:t,description:e,icon:r,children:s,className:i=\"\"}){return g.jsxs(\"section\",{className:`rounded-lg glass-panel float-panel overflow-hidden ${i}`,children:[g.jsxs(\"header\",{className:\"px-4 py-3 border-b border-cyber-border-subtle/50 flex items-center gap-3 bg-cyber-bg-tertiary/30\",children:[g.jsx(\"div\",{className:\"h-8 w-8 rounded-md bg-cyber-bg-tertiary border border-cyber-border-subtle flex items-center justify-center flex-shrink-0\",children:g.jsx(r,{className:\"h-4 w-4 text-cyber-neon-cyan\"})}),g.jsxs(\"div\",{className:\"min-w-0\",children:[g.jsx(\"div\",{className:\"text-xs font-mono font-semibold text-cyber-text-primary tracking-wide\",children:t}),g.jsx(\"div\",{className:\"text-[10px] text-cyber-text-muted leading-snug truncate\",children:e})]})]}),g.jsx(\"div\",{className:\"p-4 space-y-4\",children:s})]})}function dr({label:t,hint:e,children:r}){return g.jsxs(\"div\",{className:\"space-y-2\",children:[g.jsxs(\"div\",{className:\"space-y-0.5\",children:[g.jsx(nw,{className:\"text-xs text-cyber-text-secondary font-mono\",children:t}),e?g.jsx(\"p\",{className:\"text-[10px] text-cyber-text-muted leading-snug\",children:e}):null]}),r]})}function ZT({value:t,onChange:e,placeholder:r,disabled:s}){const[i,l]=x.useState(\"\"),u=t?t.split(\",\").map(p=>p.trim()).filter(Boolean):[],d=p=>{if(p.key===\"Enter\"){p.preventDefault();const y=i.trim();if(y&&!u.includes(y)){const v=[...u,y];e(v.join(\",\")),l(\"\")}}},h=p=>{const y=u.filter(v=>v!==p);e(y.join(\",\"))};return g.jsxs(\"div\",{className:\"space-y-2\",children:[g.jsx(Nc,{value:i,onChange:p=>l(p.target.value),onKeyDown:d,placeholder:r,disabled:s,className:\"h-9 text-xs\"}),u.length>0&&g.jsx(\"div\",{className:\"flex flex-wrap gap-1.5\",children:u.map(p=>g.jsxs(\"span\",{className:\"inline-flex items-center gap-1 px-2 py-1 rounded-md bg-cyber-neon-cyan/10 border border-cyber-neon-cyan/30 text-cyber-neon-cyan text-xs font-mono\",children:[p,!s&&g.jsx(\"button\",{type:\"button\",onClick:()=>h(p),className:\"hover:text-cyber-neon-pink transition-colors\",children:g.jsx(jf,{className:\"w-3 h-3\"})})]},p))})]})}function eO(){const{t}=Zt(\"config\"),e=jt(b=>b.config),r=jt(b=>b.updateConfig),s=jt(b=>b.status),{data:i}=Yk(),{data:l}=Gk(),{mutate:u,isPending:d}=qk(),{mutate:h,isPending:p}=Qk(),y=s===\"running\"||s===\"stopping\",v=s===\"running\",C=d||p||s===\"stopping\",w=()=>{u(e)},E=()=>{h()};return g.jsxs(\"div\",{className:\"space-y-4 animate-slide-up\",children:[g.jsxs(\"div\",{className:\"grid grid-cols-1 md:grid-cols-3 gap-4\",children:[g.jsxs(Ld,{title:t(\"section.targetMatrix.title\"),description:t(\"section.targetMatrix.description\"),icon:rv,children:[g.jsx(dr,{label:t(\"field.platform\"),children:g.jsxs(ks,{value:e.platform,onValueChange:b=>r({platform:b}),disabled:y,children:[g.jsx(ko,{className:\"h-9 text-xs\",children:g.jsx(Ns,{placeholder:t(\"field.platformPlaceholder\")})}),g.jsx(No,{children:i==null?void 0:i.map(b=>g.jsx(Ro,{value:b.value,children:b.label},b.value))})]})}),g.jsxs(\"div\",{className:\"grid grid-cols-2 gap-3\",children:[g.jsx(dr,{label:t(\"field.crawlType\"),children:g.jsxs(ks,{value:e.crawler_type,onValueChange:b=>r({crawler_type:b}),disabled:y,children:[g.jsx(ko,{className:\"h-9 text-xs\",children:g.jsx(Ns,{placeholder:t(\"field.crawlTypePlaceholder\")})}),g.jsx(No,{children:l==null?void 0:l.crawler_types.map(b=>g.jsx(Ro,{value:b.value,children:b.label},b.value))})]})}),g.jsx(dr,{label:t(\"field.startPage\"),children:g.jsx(Nc,{type:\"number\",min:1,value:e.start_page,onChange:b=>r({start_page:parseInt(b.target.value)||1}),disabled:y,className:\"h-9 text-xs\"})})]}),e.crawler_type===\"search\"&&g.jsx(dr,{label:t(\"field.keywords\"),hint:t(\"field.keywordsHint\"),children:g.jsx(ZT,{placeholder:t(\"field.keywordsPlaceholder\"),value:e.keywords,onChange:b=>r({keywords:b}),disabled:y})}),e.crawler_type===\"detail\"&&g.jsxs(dr,{label:t(\"field.specifiedIds\"),hint:t(\"field.specifiedIdsHint\"),children:[g.jsx(\"textarea\",{value:e.specified_ids,onChange:b=>r({specified_ids:b.target.value}),disabled:y,placeholder:t(`field.specifiedIdsPlaceholder.${e.platform}`,t(\"field.specifiedIdsPlaceholder.default\")),className:\"min-h-[60px] w-full rounded-md border border-cyber-border-DEFAULT bg-cyber-bg-tertiary px-3 py-2 text-xs font-mono text-cyber-text-primary placeholder:text-cyber-text-muted focus-visible:outline-none focus-visible:border-cyber-neon-cyan/50 focus-visible:shadow-cyber-soft disabled:cursor-not-allowed disabled:opacity-50 transition-all resize-none\"}),g.jsx(Sy,{value:e.specified_ids,platform:e.platform,type:\"detail\",disabled:y}),e.platform===\"xhs\"&&g.jsx(\"div\",{className:\"mt-2 rounded-lg border border-cyber-neon-orange/30 bg-cyber-neon-orange/5 p-2 text-[10px] leading-snug text-cyber-neon-orange font-mono\",children:t(\"warning.xhsToken\")})]}),e.crawler_type===\"creator\"&&g.jsxs(dr,{label:t(\"field.creatorIds\"),hint:t(\"field.creatorIdsHint\"),children:[g.jsx(\"textarea\",{value:e.creator_ids,onChange:b=>r({creator_ids:b.target.value}),disabled:y,placeholder:t(`field.creatorIdsPlaceholder.${e.platform}`,t(\"field.creatorIdsPlaceholder.default\")),className:\"min-h-[60px] w-full rounded-md border border-cyber-border-DEFAULT bg-cyber-bg-tertiary px-3 py-2 text-xs font-mono text-cyber-text-primary placeholder:text-cyber-text-muted focus-visible:outline-none focus-visible:border-cyber-neon-cyan/50 focus-visible:shadow-cyber-soft disabled:cursor-not-allowed disabled:opacity-50 transition-all resize-none\"}),g.jsx(Sy,{value:e.creator_ids,platform:e.platform,type:\"creator\",disabled:y}),e.platform===\"xhs\"&&g.jsx(\"div\",{className:\"mt-2 rounded-lg border border-cyber-neon-orange/30 bg-cyber-neon-orange/5 p-2 text-[10px] leading-snug text-cyber-neon-orange font-mono\",children:t(\"warning.xhsToken\")})]})]}),g.jsxs(Ld,{title:t(\"section.authMatrix.title\"),description:t(\"section.authMatrix.description\"),icon:_S,children:[g.jsx(dr,{label:t(\"field.loginMethod\"),children:g.jsxs(ks,{value:e.login_type,onValueChange:b=>r({login_type:b}),disabled:y,children:[g.jsx(ko,{className:\"h-9 text-xs\",children:g.jsx(Ns,{placeholder:t(\"field.loginMethodPlaceholder\")})}),g.jsx(No,{children:l==null?void 0:l.login_types.map(b=>g.jsx(Ro,{value:b.value,children:b.label},b.value))})]})}),e.login_type===\"cookie\"?g.jsx(dr,{label:t(\"field.cookies\"),hint:t(\"field.cookiesHint\"),children:g.jsx(\"textarea\",{value:e.cookies,onChange:b=>r({cookies:b.target.value}),disabled:y,placeholder:t(\"field.cookiesPlaceholder\"),className:\"min-h-[80px] w-full rounded-md border border-cyber-border-DEFAULT bg-cyber-bg-tertiary px-3 py-2 text-xs font-mono text-cyber-text-primary placeholder:text-cyber-text-muted focus-visible:outline-none focus-visible:border-cyber-neon-cyan/50 focus-visible:shadow-cyber-soft disabled:cursor-not-allowed disabled:opacity-50 transition-all resize-none\"})}):null,e.login_type===\"cookie\"&&(e.platform===\"xhs\"||e.platform===\"dy\")?g.jsx(\"div\",{className:\"rounded-lg border border-cyber-neon-orange/30 bg-cyber-neon-orange/5 p-3 text-[11px] leading-snug text-cyber-neon-orange font-mono\",children:t(\"warning.cookieSlider\")}):null]}),g.jsxs(Ld,{title:t(\"section.outputConfig.title\"),description:t(\"section.outputConfig.description\"),icon:tv,children:[g.jsx(dr,{label:t(\"field.saveFormat\"),children:g.jsxs(ks,{value:e.save_option,onValueChange:b=>r({save_option:b}),disabled:y,children:[g.jsx(ko,{className:\"h-9 text-xs\",children:g.jsx(Ns,{placeholder:t(\"field.saveFormatPlaceholder\")})}),g.jsx(No,{children:l==null?void 0:l.save_options.map(b=>g.jsx(Ro,{value:b.value,children:b.label},b.value))})]})}),g.jsxs(\"div\",{className:\"space-y-2\",children:[g.jsxs(\"div\",{className:\"flex items-center gap-3 rounded-lg border border-cyber-border-subtle bg-cyber-bg-tertiary/30 p-2.5 hover:border-cyber-border-DEFAULT transition-colors\",children:[g.jsx(Hl,{checked:e.enable_comments,onCheckedChange:b=>{const k=b===!0;r({enable_comments:k,enable_sub_comments:k?e.enable_sub_comments:!1})},disabled:y}),g.jsxs(\"div\",{className:\"flex items-center gap-2\",children:[g.jsx(LS,{className:\"h-3.5 w-3.5 text-cyber-text-secondary\"}),g.jsx(\"p\",{className:\"text-xs font-mono text-cyber-text-primary\",children:t(\"field.commentExtraction\")})]})]}),g.jsxs(\"div\",{className:\"flex items-center gap-3 rounded-lg border border-cyber-border-subtle bg-cyber-bg-tertiary/30 p-2.5 hover:border-cyber-border-DEFAULT transition-colors\",children:[g.jsx(Hl,{checked:e.enable_sub_comments,onCheckedChange:b=>r({enable_sub_comments:b===!0}),disabled:y||!e.enable_comments}),g.jsx(\"p\",{className:\"text-xs font-mono text-cyber-text-primary\",children:t(\"field.subComments\")})]}),g.jsxs(\"div\",{className:\"flex items-center gap-3 rounded-lg border border-cyber-border-subtle bg-cyber-bg-tertiary/30 p-2.5 hover:border-cyber-border-DEFAULT transition-colors\",children:[g.jsx(Hl,{checked:e.headless,onCheckedChange:b=>r({headless:b===!0}),disabled:y}),g.jsxs(\"div\",{className:\"min-w-0 flex-1\",children:[g.jsx(\"p\",{className:\"text-xs font-mono text-cyber-text-primary\",children:t(\"field.headlessMode\")}),g.jsx(\"p\",{className:\"text-[10px] text-cyber-text-muted leading-snug\",children:t(\"field.headlessModeHint\")})]})]})]})]})]}),g.jsx(\"div\",{className:\"w-full\",children:v?g.jsxs(Ct,{onClick:E,disabled:C,className:\"w-full h-12 bg-cyber-neon-pink text-white font-mono font-bold text-sm tracking-wider hover:bg-cyber-neon-pink/90 hover:shadow-glow-pink-sm transition-all\",children:[g.jsx(US,{className:\"w-4 h-4\"}),t(p?\"button.stopping\":\"button.terminate\")]}):g.jsxs(Ct,{onClick:w,disabled:C,className:\"w-full h-12 bg-cyber-neon-cyan text-cyber-bg-primary font-mono font-bold text-sm tracking-wider hover:bg-cyber-neon-cyan/90 hover:shadow-glow-cyan-sm transition-all\",children:[g.jsx(MS,{className:\"w-4 h-4\"}),t(d?\"button.initiating\":\"button.initiateScan\")]})})]})}const rw=\"mediacrawler_env_checked\";function tO(){return localStorage.getItem(rw)===\"true\"}function nO({onCheckComplete:t}){const{t:e}=Zt(\"env\"),[r,s]=x.useState(\"checking\"),[i,l]=x.useState(null),[u,d]=x.useState(!1),h=async()=>{s(\"checking\"),l(null);try{const v=await Wk.check();l(v.data),v.data.success?(s(\"success\"),localStorage.setItem(rw,\"true\"),setTimeout(()=>t(!0),1500)):s(\"error\")}catch{l({success:!1,message:e(\"defaultError\"),error:e(\"defaultErrorHint\")}),s(\"error\")}};x.useEffect(()=>{h()},[]);const p=()=>{t(!1)},y=()=>{h()};return g.jsx(\"div\",{className:\"fixed inset-0 bg-black/80 backdrop-blur-sm flex items-center justify-center z-50\",children:g.jsxs(\"div\",{className:\"bg-cyber-bg-panel border border-cyber-border-DEFAULT rounded-lg shadow-cyber-card p-6 max-w-md w-full mx-4 relative\",children:[g.jsx(\"div\",{className:\"absolute top-0 left-0 w-4 h-4 border-t-2 border-l-2 border-cyber-neon-cyan\"}),g.jsx(\"div\",{className:\"absolute top-0 right-0 w-4 h-4 border-t-2 border-r-2 border-cyber-neon-cyan\"}),g.jsx(\"div\",{className:\"absolute bottom-0 left-0 w-4 h-4 border-b-2 border-l-2 border-cyber-neon-cyan\"}),g.jsx(\"div\",{className:\"absolute bottom-0 right-0 w-4 h-4 border-b-2 border-r-2 border-cyber-neon-cyan\"}),g.jsxs(\"div\",{className:\"flex items-center gap-3 mb-4\",children:[g.jsx(Of,{className:\"w-6 h-6 text-cyber-neon-orange\"}),g.jsx(\"h2\",{className:\"text-lg font-mono font-semibold text-cyber-neon-cyan glow-text-cyan\",children:e(\"title\")})]}),g.jsxs(\"div\",{className:\"bg-cyber-bg-tertiary border border-cyber-border-DEFAULT rounded-lg p-4 mb-4\",children:[g.jsxs(\"div\",{className:\"flex items-center gap-3\",children:[r===\"checking\"&&g.jsxs(g.Fragment,{children:[g.jsx(AS,{className:\"w-5 h-5 text-cyber-neon-cyan animate-spin\"}),g.jsx(\"span\",{className:\"text-cyber-text-primary font-mono text-sm\",children:e(\"scanning\")})]}),r===\"success\"&&g.jsxs(g.Fragment,{children:[g.jsx(CS,{className:\"w-5 h-5 text-cyber-neon-green\"}),g.jsx(\"span\",{className:\"text-cyber-neon-green font-mono text-sm\",children:e(\"success\",{message:i==null?void 0:i.message})})]}),r===\"error\"&&g.jsxs(g.Fragment,{children:[g.jsx(ES,{className:\"w-5 h-5 text-cyber-neon-pink\"}),g.jsx(\"span\",{className:\"text-cyber-neon-pink font-mono text-sm\",children:e(\"error\",{message:i==null?void 0:i.message})})]})]}),r===\"error\"&&(i==null?void 0:i.error)&&g.jsxs(\"div\",{className:\"mt-3\",children:[g.jsx(\"button\",{onClick:()=>d(!u),className:\"text-sm text-cyber-neon-cyan hover:underline font-mono\",children:e(u?\"hideDetails\":\"showDetails\")}),u&&g.jsx(\"pre\",{className:\"mt-2 p-3 bg-black text-cyber-neon-green rounded text-xs font-mono overflow-x-auto whitespace-pre-wrap border border-cyber-border-DEFAULT\",children:i.error})]})]}),r===\"error\"&&g.jsxs(\"div\",{className:\"text-sm text-cyber-text-secondary mb-4 space-y-2 font-mono\",children:[g.jsx(\"p\",{className:\"text-cyber-neon-orange\",children:e(\"requirements\")}),g.jsxs(\"ol\",{className:\"list-decimal list-inside space-y-1 pl-2 text-cyber-text-muted\",children:[g.jsx(\"li\",{children:e(\"requirementsList.1\")}),g.jsx(\"li\",{children:e(\"requirementsList.2\")}),g.jsx(\"li\",{children:e(\"requirementsList.3\")})]})]}),g.jsxs(\"div\",{className:\"flex gap-3\",children:[r===\"error\"&&g.jsxs(g.Fragment,{children:[g.jsx(Ct,{variant:\"outline\",className:\"flex-1 font-mono\",onClick:p,children:e(\"skipCheck\")}),g.jsxs(Ct,{variant:\"glow\",className:\"flex-1 font-mono\",onClick:y,children:[g.jsx(Tf,{className:\"w-4 h-4\"}),e(\"retryCheck\")]})]}),r===\"checking\"&&g.jsx(Ct,{variant:\"outline\",className:\"w-full font-mono\",onClick:p,children:e(\"skipCheck\")})]})]})})}const ow=\"mediacrawler_license_accepted\";function rO(){return localStorage.getItem(ow)===\"true\"}function oO({onAccept:t}){const{t:e}=Zt(\"license\"),r=()=>{localStorage.setItem(ow,\"true\"),t()},s=()=>{try{window.close(),setTimeout(()=>{window.location.href=\"about:blank\"},100)}catch{}setTimeout(()=>{document.body.innerHTML=`\n        <div style=\"\n          display: flex;\n          flex-direction: column;\n          align-items: center;\n          justify-content: center;\n          height: 100vh;\n          background: #0d1117;\n          color: #f85149;\n          font-family: 'JetBrains Mono', monospace;\n          text-align: center;\n          padding: 20px;\n        \">\n          <div style=\"font-size: 48px; margin-bottom: 20px;\">⛔</div>\n          <div style=\"font-size: 24px; font-weight: bold; margin-bottom: 10px;\">访问已拒绝</div>\n          <div style=\"font-size: 14px; color: #8b949e;\">您未同意使用条款，请关闭此标签页</div>\n        </div>\n      `},200)};return g.jsx(\"div\",{className:\"fixed inset-0 bg-black/95 backdrop-blur-sm flex items-center justify-center z-[100] overflow-y-auto py-8\",children:g.jsxs(\"div\",{className:\"bg-cyber-bg-panel border-2 border-cyber-neon-pink rounded-lg shadow-cyber-card p-6 max-w-2xl w-full mx-4 relative\",children:[g.jsx(\"div\",{className:\"absolute top-0 left-0 w-6 h-6 border-t-2 border-l-2 border-cyber-neon-pink\"}),g.jsx(\"div\",{className:\"absolute top-0 right-0 w-6 h-6 border-t-2 border-r-2 border-cyber-neon-pink\"}),g.jsx(\"div\",{className:\"absolute bottom-0 left-0 w-6 h-6 border-b-2 border-l-2 border-cyber-neon-pink\"}),g.jsx(\"div\",{className:\"absolute bottom-0 right-0 w-6 h-6 border-b-2 border-r-2 border-cyber-neon-pink\"}),g.jsxs(\"div\",{className:\"flex items-center justify-center gap-3 mb-4\",children:[g.jsx(zS,{className:\"w-8 h-8 text-cyber-neon-pink animate-pulse\"}),g.jsx(\"h2\",{className:\"text-xl font-mono font-bold text-cyber-neon-pink\",children:e(\"title\")})]}),g.jsx(\"div\",{className:\"text-center mb-4\",children:g.jsx(\"span\",{className:\"text-base font-mono text-cyber-neon-orange\",children:e(\"warning\")})}),g.jsx(\"div\",{className:\"bg-black/50 border border-cyber-neon-pink/30 rounded-lg p-4 mb-4\",children:g.jsxs(\"ul\",{className:\"space-y-2 text-sm font-mono\",children:[g.jsxs(\"li\",{className:\"flex items-start gap-2\",children:[g.jsx(\"span\",{className:\"text-cyber-neon-pink font-bold\",children:\"1.\"}),g.jsx(\"span\",{className:\"text-cyber-text-primary\",children:e(\"content.line1\")})]}),g.jsxs(\"li\",{className:\"flex items-start gap-2\",children:[g.jsx(\"span\",{className:\"text-cyber-neon-pink font-bold\",children:\"2.\"}),g.jsx(\"span\",{className:\"text-cyber-text-primary\",children:e(\"content.line2\")})]}),g.jsxs(\"li\",{className:\"flex items-start gap-2\",children:[g.jsx(\"span\",{className:\"text-cyber-neon-pink font-bold\",children:\"3.\"}),g.jsx(\"span\",{className:\"text-cyber-text-primary\",children:e(\"content.line3\")})]}),g.jsxs(\"li\",{className:\"flex items-start gap-2\",children:[g.jsx(\"span\",{className:\"text-cyber-neon-pink font-bold\",children:\"4.\"}),g.jsx(\"span\",{className:\"text-cyber-text-primary\",children:e(\"content.line4\")})]})]})}),g.jsx(\"div\",{className:\"flex justify-center mb-6\",children:g.jsxs(\"a\",{href:\"https://github.com/NanmiCoder/MediaCrawler/blob/main/LICENSE\",target:\"_blank\",rel:\"noopener noreferrer\",className:\"flex items-center gap-1.5 text-cyber-neon-cyan hover:underline text-sm font-mono\",children:[g.jsx(kS,{className:\"w-4 h-4\"}),e(\"license\")]})}),g.jsxs(\"div\",{className:\"flex gap-4\",children:[g.jsx(Ct,{onClick:s,variant:\"outline\",className:\"flex-1 font-mono border-cyber-neon-pink/50 text-cyber-neon-pink hover:bg-cyber-neon-pink/10\",children:e(\"decline\")}),g.jsx(Ct,{onClick:r,className:\"flex-1 font-mono bg-cyber-neon-green text-black font-bold hover:bg-cyber-neon-green/90\",children:e(\"confirm\")})]})]})})}function sO(){const[t,e]=x.useState(()=>rO()),[r,s]=x.useState(()=>tO()),[i,l]=x.useState(!1),u=()=>{s(!0)},d=()=>{e(!0),l(!1)},h=()=>{l(!0)};return g.jsxs(\"div\",{className:\"flex flex-col h-screen cyber-grid overflow-hidden relative\",children:[(!t||i)&&g.jsx(oO,{onAccept:d}),t&&!i&&!r&&g.jsx(nO,{onCheckComplete:u}),g.jsx(_P,{onShowDisclaimer:h}),g.jsxs(\"div\",{className:\"flex-1 flex flex-col gap-4 p-4 overflow-hidden min-h-0\",children:[g.jsx(\"div\",{className:\"flex-shrink-0\",children:g.jsx(eO,{})}),g.jsx(HT,{})]}),g.jsx(VT,{}),g.jsx(vS,{position:\"top-right\",toastOptions:{className:\"glass-panel font-mono text-cyber-text-primary\",style:{fontFamily:\"JetBrains Mono, monospace\"}}})]})}const{slice:iO,forEach:aO}=[];function lO(t){return aO.call(iO.call(arguments,1),e=>{if(e)for(const r in e)t[r]===void 0&&(t[r]=e[r])}),t}function cO(t){return typeof t!=\"string\"?!1:[/<\\s*script.*?>/i,/<\\s*\\/\\s*script\\s*>/i,/<\\s*img.*?on\\w+\\s*=/i,/<\\s*\\w+\\s*on\\w+\\s*=.*?>/i,/javascript\\s*:/i,/vbscript\\s*:/i,/expression\\s*\\(/i,/eval\\s*\\(/i,/alert\\s*\\(/i,/document\\.cookie/i,/document\\.write\\s*\\(/i,/window\\.location/i,/innerHTML/i].some(r=>r.test(t))}const Cy=/^[\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+$/,uO=function(t,e){const s=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{path:\"/\"},i=encodeURIComponent(e);let l=`${t}=${i}`;if(s.maxAge>0){const u=s.maxAge-0;if(Number.isNaN(u))throw new Error(\"maxAge should be a Number\");l+=`; Max-Age=${Math.floor(u)}`}if(s.domain){if(!Cy.test(s.domain))throw new TypeError(\"option domain is invalid\");l+=`; Domain=${s.domain}`}if(s.path){if(!Cy.test(s.path))throw new TypeError(\"option path is invalid\");l+=`; Path=${s.path}`}if(s.expires){if(typeof s.expires.toUTCString!=\"function\")throw new TypeError(\"option expires is invalid\");l+=`; Expires=${s.expires.toUTCString()}`}if(s.httpOnly&&(l+=\"; HttpOnly\"),s.secure&&(l+=\"; Secure\"),s.sameSite)switch(typeof s.sameSite==\"string\"?s.sameSite.toLowerCase():s.sameSite){case!0:l+=\"; SameSite=Strict\";break;case\"lax\":l+=\"; SameSite=Lax\";break;case\"strict\":l+=\"; SameSite=Strict\";break;case\"none\":l+=\"; SameSite=None\";break;default:throw new TypeError(\"option sameSite is invalid\")}return s.partitioned&&(l+=\"; Partitioned\"),l},Ey={create(t,e,r,s){let i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:{path:\"/\",sameSite:\"strict\"};r&&(i.expires=new Date,i.expires.setTime(i.expires.getTime()+r*60*1e3)),s&&(i.domain=s),document.cookie=uO(t,e,i)},read(t){const e=`${t}=`,r=document.cookie.split(\";\");for(let s=0;s<r.length;s++){let i=r[s];for(;i.charAt(0)===\" \";)i=i.substring(1,i.length);if(i.indexOf(e)===0)return i.substring(e.length,i.length)}return null},remove(t,e){this.create(t,\"\",-1,e)}};var dO={name:\"cookie\",lookup(t){let{lookupCookie:e}=t;if(e&&typeof document<\"u\")return Ey.read(e)||void 0},cacheUserLanguage(t,e){let{lookupCookie:r,cookieMinutes:s,cookieDomain:i,cookieOptions:l}=e;r&&typeof document<\"u\"&&Ey.create(r,t,s,i,l)}},fO={name:\"querystring\",lookup(t){var s;let{lookupQuerystring:e}=t,r;if(typeof window<\"u\"){let{search:i}=window.location;!window.location.search&&((s=window.location.hash)==null?void 0:s.indexOf(\"?\"))>-1&&(i=window.location.hash.substring(window.location.hash.indexOf(\"?\")));const u=i.substring(1).split(\"&\");for(let d=0;d<u.length;d++){const h=u[d].indexOf(\"=\");h>0&&u[d].substring(0,h)===e&&(r=u[d].substring(h+1))}}return r}},hO={name:\"hash\",lookup(t){var i;let{lookupHash:e,lookupFromHashIndex:r}=t,s;if(typeof window<\"u\"){const{hash:l}=window.location;if(l&&l.length>2){const u=l.substring(1);if(e){const d=u.split(\"&\");for(let h=0;h<d.length;h++){const p=d[h].indexOf(\"=\");p>0&&d[h].substring(0,p)===e&&(s=d[h].substring(p+1))}}if(s)return s;if(!s&&r>-1){const d=l.match(/\\/([a-zA-Z-]*)/g);return Array.isArray(d)?(i=d[typeof r==\"number\"?r:0])==null?void 0:i.replace(\"/\",\"\"):void 0}}}return s}};let Cs=null;const ky=()=>{if(Cs!==null)return Cs;try{if(Cs=typeof window<\"u\"&&window.localStorage!==null,!Cs)return!1;const t=\"i18next.translate.boo\";window.localStorage.setItem(t,\"foo\"),window.localStorage.removeItem(t)}catch{Cs=!1}return Cs};var pO={name:\"localStorage\",lookup(t){let{lookupLocalStorage:e}=t;if(e&&ky())return window.localStorage.getItem(e)||void 0},cacheUserLanguage(t,e){let{lookupLocalStorage:r}=e;r&&ky()&&window.localStorage.setItem(r,t)}};let Es=null;const Ny=()=>{if(Es!==null)return Es;try{if(Es=typeof window<\"u\"&&window.sessionStorage!==null,!Es)return!1;const t=\"i18next.translate.boo\";window.sessionStorage.setItem(t,\"foo\"),window.sessionStorage.removeItem(t)}catch{Es=!1}return Es};var mO={name:\"sessionStorage\",lookup(t){let{lookupSessionStorage:e}=t;if(e&&Ny())return window.sessionStorage.getItem(e)||void 0},cacheUserLanguage(t,e){let{lookupSessionStorage:r}=e;r&&Ny()&&window.sessionStorage.setItem(r,t)}},gO={name:\"navigator\",lookup(t){const e=[];if(typeof navigator<\"u\"){const{languages:r,userLanguage:s,language:i}=navigator;if(r)for(let l=0;l<r.length;l++)e.push(r[l]);s&&e.push(s),i&&e.push(i)}return e.length>0?e:void 0}},yO={name:\"htmlTag\",lookup(t){let{htmlTag:e}=t,r;const s=e||(typeof document<\"u\"?document.documentElement:null);return s&&typeof s.getAttribute==\"function\"&&(r=s.getAttribute(\"lang\")),r}},vO={name:\"path\",lookup(t){var i;let{lookupFromPathIndex:e}=t;if(typeof window>\"u\")return;const r=window.location.pathname.match(/\\/([a-zA-Z-]*)/g);return Array.isArray(r)?(i=r[typeof e==\"number\"?e:0])==null?void 0:i.replace(\"/\",\"\"):void 0}},xO={name:\"subdomain\",lookup(t){var i,l;let{lookupFromSubdomainIndex:e}=t;const r=typeof e==\"number\"?e+1:1,s=typeof window<\"u\"&&((l=(i=window.location)==null?void 0:i.hostname)==null?void 0:l.match(/^(\\w{2,5})\\.(([a-z0-9-]{1,63}\\.[a-z]{2,6})|localhost)/i));if(s)return s[r]}};let sw=!1;try{document.cookie,sw=!0}catch{}const iw=[\"querystring\",\"cookie\",\"localStorage\",\"sessionStorage\",\"navigator\",\"htmlTag\"];sw||iw.splice(1,1);const wO=()=>({order:iw,lookupQuerystring:\"lng\",lookupCookie:\"i18next\",lookupLocalStorage:\"i18nextLng\",lookupSessionStorage:\"i18nextLng\",caches:[\"localStorage\"],excludeCacheFor:[\"cimode\"],convertDetectedLanguage:t=>t});class aw{constructor(e){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.type=\"languageDetector\",this.detectors={},this.init(e,r)}init(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{languageUtils:{}},r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},s=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};this.services=e,this.options=lO(r,this.options||{},wO()),typeof this.options.convertDetectedLanguage==\"string\"&&this.options.convertDetectedLanguage.indexOf(\"15897\")>-1&&(this.options.convertDetectedLanguage=i=>i.replace(\"-\",\"_\")),this.options.lookupFromUrlIndex&&(this.options.lookupFromPathIndex=this.options.lookupFromUrlIndex),this.i18nOptions=s,this.addDetector(dO),this.addDetector(fO),this.addDetector(pO),this.addDetector(mO),this.addDetector(gO),this.addDetector(yO),this.addDetector(vO),this.addDetector(xO),this.addDetector(hO)}addDetector(e){return this.detectors[e.name]=e,this}detect(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.options.order,r=[];return e.forEach(s=>{if(this.detectors[s]){let i=this.detectors[s].lookup(this.options);i&&typeof i==\"string\"&&(i=[i]),i&&(r=r.concat(i))}}),r=r.filter(s=>s!=null&&!cO(s)).map(s=>this.options.convertDetectedLanguage(s)),this.services&&this.services.languageUtils&&this.services.languageUtils.getBestMatchFromCodes?r:r.length>0?r[0]:null}cacheUserLanguage(e){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:this.options.caches;r&&(this.options.excludeCacheFor&&this.options.excludeCacheFor.indexOf(e)>-1||r.forEach(s=>{this.detectors[s]&&this.detectors[s].cacheUserLanguage(e,this.options)}))}}aw.type=\"languageDetector\";const bO={active:\"运行中\",standby:\"待机\",idle:\"空闲\",running:\"运行中\",stopping:\"停止中\",error:\"错误\"},SO={title:\"MediaCrawler\",api:\"API\",local:\"本地\",disclaimer:\"仅供个人学习研究使用，禁止商业用途\",license:\"查看协议\"},CO={loading:\"加载中...\",skip:\"跳过检测\",retry:\"重新扫描\"},EO={entries:\"条记录\",records:\"条\"},kO={status:bO,sidebar:SO,action:CO,unit:EO},NO={targetMatrix:{title:\"目标配置\",description:\"平台、模式与搜索参数\"},authMatrix:{title:\"登录配置\",description:\"登录方式配置\"},outputConfig:{title:\"输出配置\",description:\"保存格式与评论选项\"},runtime:{title:\"运行参数\",description:\"运行时参数\"}},RO={platform:\"平台\",platformPlaceholder:\"选择平台\",crawlType:\"爬取类型\",crawlTypePlaceholder:\"选择类型\",startPage:\"起始页\",keywords:\"关键词\",keywordsHint:\"输入关键词后按回车添加\",keywordsPlaceholder:\"输入关键词，按回车添加...\",specifiedIds:\"帖子/视频 ID\",specifiedIdsHint:\"输入帖子或视频的ID/URL，每行一个或用逗号分隔\",specifiedIdsPlaceholder:{bili:`示例:\nBV1xxxx\nhttps://www.bilibili.com/video/BV1xxxx`,xhs:`示例:\nhttps://www.xiaohongshu.com/explore/xxx?xsec_token=xxx\n(必须包含xsec_token参数)`,dy:`示例:\n7525538910311632128\nhttps://www.douyin.com/video/xxx\nhttps://v.douyin.com/xxx (短链接)`,wb:`示例:\n4982041758140155\nhttps://weibo.com/xxx/xxx`,ks:`示例:\n3xf8enb8dbj6uig\nhttps://www.kuaishou.com/short-video/xxx`,default:\"输入帖子/视频 ID 或 URL...\"},creatorIds:\"创作者 ID\",creatorIdsHint:\"输入创作者的ID/URL，每行一个或用逗号分隔\",creatorIdsPlaceholder:{bili:`示例:\n434377496\nhttps://space.bilibili.com/434377496`,xhs:`示例:\nhttps://www.xiaohongshu.com/user/profile/xxx?xsec_token=xxx\n(必须包含xsec_token参数)`,dy:`示例:\nMS4wLjABAAAAxxx\nhttps://www.douyin.com/user/MS4wLjABAAAAxxx`,wb:`示例:\n5533390220\nhttps://weibo.com/u/5533390220`,ks:`示例:\n3x84qugg4ch9zhs\nhttps://www.kuaishou.com/profile/xxx`,default:\"输入创作者 ID 或 URL...\"},loginMethod:\"登录方式\",loginMethodPlaceholder:\"选择登录方式\",cookies:\"Cookies\",cookiesHint:\"粘贴 Cookie 字符串\",cookiesPlaceholder:\"在此粘贴 Cookies...\",saveFormat:\"保存格式\",saveFormatPlaceholder:\"选择格式\",commentExtraction:\"评论抓取\",subComments:\"子评论\",headlessMode:\"无头模式\",headlessModeHint:\"无 GUI 运行浏览器\"},PO={initiateScan:\"开始爬虫\",initiating:\"启动中...\",terminate:\"终止\",stopping:\"停止中...\"},TO={cookieSlider:\"[提示] 小红书和抖音平台不建议使用 Cookie 登录，因为可能会触发滑块验证\",xhsToken:\"[重要] 小红书 URL 必须包含 xsec_token 参数，请从浏览器复制完整 URL\"},OO={section:NO,field:RO,button:PO,warning:TO},jO={title:\"系统控制台\",entries:\"{{count}} 条记录\",active:\"活跃\",clear:\"清除\",restore:\"恢复所有日志\"},_O={systemInit:\"[系统] 系统初始化成功\",configHint:\"[信息] 配置参数并启动扫描序列...\"},AO={awaiting:\"等待命令...\"},LO={header:jO,banner:_O,footer:AO},IO={button:\"数据管理\",title:\"数据浏览器\"},DO={title:\"数据文件管理\",records:\"{{count}} 条\",rescan:\"重新扫描\",loading:\"[加载中] 正在扫描数据目录...\",noData:\"暂无数据\",noDataHint:\"启动爬虫开始数据采集，完成后结果将显示在此处。\",allCategories:\"全部\"},MO={entries:\"{{count}} 条\",extract:\"下载\",preview:\"预览\"},FO={title:\"数据预览\",records:\"{{count}} 条记录\",download:\"下载\",loading:\"[加载中] 正在解析数据...\",error:\"[错误] 数据解析失败\",searchPlaceholder:\"搜索数据...\",showing:\"显示 {{filtered}} / {{total}} 条记录\"},zO={dialog:IO,explorer:DO,file:MO,preview:FO},$O=\"环境检测\",UO=\"[扫描] 正在分析 MediaCrawler 环境...\",BO=\"[成功] {{message}}\",HO=\"[错误] {{message}}\",VO=\"无法连接到 API 服务器\",WO=\"请确保后端服务已启动 (uvicorn api.main:app --port 8080)\",KO=\"[+] 显示详情\",qO=\"[-] 隐藏详情\",QO=\"[环境要求]\",YO={1:\"安装 uv 包管理器\",2:\"在项目根目录执行 uv sync\",3:\"确认所有依赖已安装\"},GO=\"跳过检测\",XO=\"重新检测\",JO={title:$O,scanning:UO,success:BO,error:HO,defaultError:VO,defaultErrorHint:WO,showDetails:KO,hideDetails:qO,requirements:QO,requirementsList:YO,skipCheck:GO,retryCheck:XO},ZO=\"使用须知\",ej=\"请仔细阅读以下条款\",tj={line1:\"本项目仅供个人学习和研究爬虫技术使用\",line2:\"严禁将本项目用于任何商业用途或盈利活动\",line3:\"使用本项目即表示您同意遵守相关法律法规\",line4:\"任何因违规使用造成的后果由使用者自行承担\"},nj=\"查看完整协议\",rj=\"访问 GitHub 仓库\",oj=\"我已知晓并同意上述条款\",sj=\"不同意，退出\",ij={name:\"程序员阿江-Relakkes\",tagline:\"40K+ Star 开源项目作者\",description:\"40K开源项目MediaCrawler作者，专注爬虫技术和AI Agent知识分享\",support:\"如果觉得项目有帮助，欢迎关注作者的社交媒体账号\",slogan:\"开源不易，求个关注 ⭐\"},aj={title:ZO,warning:ej,content:tj,license:nj,github:rj,confirm:oj,decline:sj,author:ij},lj={active:\"ACTIVE\",standby:\"STANDBY\",idle:\"IDLE\",running:\"RUNNING\",stopping:\"STOPPING\",error:\"ERROR\"},cj={title:\"MediaCrawler\",api:\"API\",local:\"LOCAL\",disclaimer:\"For personal learning only, commercial use prohibited\",license:\"License\"},uj={loading:\"Loading...\",skip:\"SKIP_CHECK\",retry:\"RETRY_SCAN\"},dj={entries:\"entries\",records:\"records\"},fj={status:lj,sidebar:cj,action:uj,unit:dj},hj={targetMatrix:{title:\"TARGET_MATRIX\",description:\"Platform, mode & search parameters\"},authMatrix:{title:\"AUTH_MATRIX\",description:\"Login method configuration\"},outputConfig:{title:\"OUTPUT_CONFIG\",description:\"Save format & comment options\"},runtime:{title:\"RUNTIME\",description:\"Runtime parameters\"}},pj={platform:\"PLATFORM\",platformPlaceholder:\"Select platform\",crawlType:\"CRAWL_TYPE\",crawlTypePlaceholder:\"Select type\",startPage:\"START_PAGE\",keywords:\"KEYWORDS\",keywordsHint:\"Press Enter to add keyword\",keywordsPlaceholder:\"Type keyword, press Enter to add...\",specifiedIds:\"POST/VIDEO_ID\",specifiedIdsHint:\"Enter post or video ID/URL, one per line or comma-separated\",specifiedIdsPlaceholder:{bili:`Examples:\nBV1xxxx\nhttps://www.bilibili.com/video/BV1xxxx`,xhs:`Examples:\nhttps://www.xiaohongshu.com/explore/xxx?xsec_token=xxx\n(must include xsec_token)`,dy:`Examples:\n7525538910311632128\nhttps://www.douyin.com/video/xxx\nhttps://v.douyin.com/xxx (short link)`,wb:`Examples:\n4982041758140155\nhttps://weibo.com/xxx/xxx`,ks:`Examples:\n3xf8enb8dbj6uig\nhttps://www.kuaishou.com/short-video/xxx`,default:\"Enter post/video ID or URL...\"},creatorIds:\"CREATOR_ID\",creatorIdsHint:\"Enter creator ID/URL, one per line or comma-separated\",creatorIdsPlaceholder:{bili:`Examples:\n434377496\nhttps://space.bilibili.com/434377496`,xhs:`Examples:\nhttps://www.xiaohongshu.com/user/profile/xxx?xsec_token=xxx\n(must include xsec_token)`,dy:`Examples:\nMS4wLjABAAAAxxx\nhttps://www.douyin.com/user/MS4wLjABAAAAxxx`,wb:`Examples:\n5533390220\nhttps://weibo.com/u/5533390220`,ks:`Examples:\n3x84qugg4ch9zhs\nhttps://www.kuaishou.com/profile/xxx`,default:\"Enter creator ID or URL...\"},loginMethod:\"LOGIN_METHOD\",loginMethodPlaceholder:\"Select login method\",cookies:\"COOKIES\",cookiesHint:\"Paste cookie string\",cookiesPlaceholder:\"Paste cookies here...\",saveFormat:\"SAVE_FORMAT\",saveFormatPlaceholder:\"Select format\",commentExtraction:\"Comment Extraction\",subComments:\"Sub-comments\",headlessMode:\"HEADLESS_MODE\",headlessModeHint:\"Run browser without GUI\"},mj={initiateScan:\"INITIATE SCAN\",initiating:\"INITIATING...\",terminate:\"TERMINATE\",stopping:\"STOPPING...\"},gj={cookieSlider:\"[Note] Cookie login is not recommended for Xiaohongshu and Douyin due to slider captcha\",xhsToken:\"[Important] Xiaohongshu URLs must contain xsec_token parameter, please copy the full URL from browser\"},yj={section:hj,field:pj,button:mj,warning:gj},vj={title:\"SYSTEM_CONSOLE\",entries:\"{{count}} entries\",active:\"ACTIVE\",clear:\"CLEAR\",restore:\"RESTORE ALL LOGS\"},xj={systemInit:\"[SYS] System initialized successfully\",configHint:\"[INFO] Configure parameters and initiate scan sequence...\"},wj={awaiting:\"awaiting_command...\"},bj={header:vj,banner:xj,footer:wj},Sj={button:\"PAYLOAD_MATRIX\",title:\"DATA_EXPLORER\"},Cj={title:\"CAPTURED_PAYLOAD_MATRIX\",records:\"{{count}} RECORDS\",rescan:\"RESCAN\",loading:\"[LOADING] Scanning payload directory...\",noData:\"NO_DATA_CAPTURED\",noDataHint:\"Initialize crawler to begin data extraction sequence. Results will appear here upon completion.\",allCategories:\"ALL\"},Ej={entries:\"{{count}} entries\",extract:\"EXTRACT\",preview:\"PREVIEW\"},kj={title:\"Data Preview\",records:\"{{count}} RECORDS\",download:\"DOWNLOAD\",loading:\"[LOADING] Decoding payload...\",error:\"[ERROR] Failed to decode payload\",searchPlaceholder:\"Search in data...\",showing:\"Showing {{filtered}} of {{total}} records\"},Nj={dialog:Sj,explorer:Cj,file:Ej,preview:kj},Rj=\"ENV_DIAGNOSTICS\",Pj=\"[SCAN] Analyzing MediaCrawler environment...\",Tj=\"[OK] {{message}}\",Oj=\"[ERR] {{message}}\",jj=\"Cannot connect to API server\",_j=\"Please ensure backend service is running (uvicorn api.main:app --port 8080)\",Aj=\"[+] SHOW_DETAILS\",Lj=\"[-] HIDE_DETAILS\",Ij=\"[REQUIREMENTS]\",Dj={1:\"Install uv package manager\",2:\"Execute uv sync in project root\",3:\"Verify all dependencies installed\"},Mj=\"SKIP_CHECK\",Fj=\"RETRY_SCAN\",zj={title:Rj,scanning:Pj,success:Tj,error:Oj,defaultError:jj,defaultErrorHint:_j,showDetails:Aj,hideDetails:Lj,requirements:Ij,requirementsList:Dj,skipCheck:Mj,retryCheck:Fj},$j=\"Usage Notice\",Uj=\"Please read the following terms carefully\",Bj={line1:\"This project is for personal learning and research purposes only\",line2:\"Commercial use or profit-making activities are strictly prohibited\",line3:\"By using this project, you agree to comply with all applicable laws\",line4:\"Users bear full responsibility for any consequences of misuse\"},Hj=\"View Full License\",Vj=\"Visit GitHub Repository\",Wj=\"I understand and agree to the above terms\",Kj=\"Disagree, Exit\",qj={name:\"Relakkes (阿江)\",tagline:\"40K+ Star Open Source Author\",description:\"Author of MediaCrawler (40K stars), focused on crawler tech and AI Agent knowledge sharing\",support:\"If you find this project helpful, please follow the author on social media\",slogan:\"Open source is hard, please star ⭐\"},Qj={title:$j,warning:Uj,content:Bj,license:Hj,github:Vj,confirm:Wj,decline:Kj,author:qj},Yj={\"zh-CN\":{common:kO,config:OO,terminal:LO,data:zO,env:JO,license:aj},\"en-US\":{common:fj,config:yj,terminal:bj,data:Nj,env:zj,license:Qj}};_t.use(aw).use(bC).init({resources:Yj,fallbackLng:\"zh-CN\",defaultNS:\"common\",interpolation:{escapeValue:!1},detection:{order:[\"localStorage\",\"navigator\"],caches:[\"localStorage\"],lookupLocalStorage:\"mediacrawler_language\"}});const Gj=new A1({defaultOptions:{queries:{refetchOnWindowFocus:!1,retry:1}}});u1.createRoot(document.getElementById(\"root\")).render(g.jsx(oe.StrictMode,{children:g.jsx(L1,{client:Gj,children:g.jsx(sO,{})})}));\n"
  },
  {
    "path": "api/webui/assets/index-OiBmsgXF.css",
    "content": "*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: \"\"}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,system-ui,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: 210 20% 98%;--foreground: 220 20% 15%;--card: 0 0% 100%;--card-foreground: 220 20% 15%;--popover: 0 0% 100%;--popover-foreground: 220 20% 15%;--primary: 187 80% 42%;--primary-foreground: 0 0% 100%;--secondary: 330 75% 55%;--secondary-foreground: 0 0% 100%;--muted: 210 20% 95%;--muted-foreground: 215 15% 45%;--accent: 187 80% 42%;--accent-foreground: 0 0% 100%;--destructive: 330 75% 55%;--destructive-foreground: 0 0% 100%;--border: 214 20% 88%;--input: 214 20% 88%;--ring: 187 80% 42%;--radius: .375rem;--cyber-bg-primary: 248 250 252;--cyber-bg-secondary: 241 245 249;--cyber-bg-tertiary: 226 232 240;--cyber-bg-panel: 255 255 255;--cyber-bg-elevated: 248 250 252;--cyber-neon-cyan: 6 182 212;--cyber-neon-cyan-dim: 8 145 178;--cyber-neon-pink: 236 72 153;--cyber-neon-pink-dim: 219 39 119;--cyber-neon-green: 34 197 94;--cyber-neon-green-dim: 22 163 74;--cyber-neon-orange: 249 115 22;--cyber-neon-yellow: 234 179 8;--cyber-neon-purple: 168 85 247;--cyber-text-primary: 15 23 42;--cyber-text-secondary: 71 85 105;--cyber-text-muted: 148 163 184;--cyber-border-default: 203 213 225;--cyber-border-subtle: 226 232 240;--cyber-border-glow: 6 182 212;--glass-bg: 255 255 255 / .85;--glass-border: 203 213 225 / .5;--glass-dark-bg: 241 245 249 / .9;--glass-dark-border: 203 213 225 / .6;--shadow-glow-opacity: .2;--shadow-glow-spread: 6px}.dark{--background: 233 67% 4%;--foreground: 210 20% 93%;--card: 215 21% 11%;--card-foreground: 210 20% 93%;--popover: 213 18% 13%;--popover-foreground: 210 20% 93%;--primary: 180 100% 50%;--primary-foreground: 233 67% 4%;--secondary: 330 100% 50%;--secondary-foreground: 0 0% 100%;--muted: 215 14% 17%;--muted-foreground: 215 16% 57%;--accent: 180 100% 50%;--accent-foreground: 233 67% 4%;--destructive: 330 100% 50%;--destructive-foreground: 0 0% 100%;--border: 215 14% 25%;--input: 215 14% 25%;--ring: 180 100% 50%;--cyber-bg-primary: 10 10 15;--cyber-bg-secondary: 13 17 23;--cyber-bg-tertiary: 22 27 34;--cyber-bg-panel: 28 33 40;--cyber-bg-elevated: 33 38 45;--cyber-neon-cyan: 0 255 255;--cyber-neon-cyan-dim: 37 177 191;--cyber-neon-pink: 255 0 128;--cyber-neon-pink-dim: 222 40 59;--cyber-neon-green: 0 255 65;--cyber-neon-green-dim: 57 255 20;--cyber-neon-orange: 255 152 0;--cyber-neon-yellow: 255 234 0;--cyber-neon-purple: 191 0 255;--cyber-text-primary: 230 237 243;--cyber-text-secondary: 139 148 158;--cyber-text-muted: 72 79 88;--cyber-border-default: 48 54 61;--cyber-border-subtle: 33 38 45;--cyber-border-glow: 0 255 255;--glass-bg: 22 27 34 / .7;--glass-border: 48 54 61 / .5;--glass-dark-bg: 13 17 23 / .85;--glass-dark-border: 48 54 61 / .4;--shadow-glow-opacity: .5;--shadow-glow-spread: 10px}*{border-color:rgb(var(--cyber-border-default))}body{background-color:rgb(var(--cyber-bg-primary));color:rgb(var(--cyber-text-primary));font-family:Inter,system-ui,sans-serif;font-size:15px;line-height:1.6;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.bottom-0{bottom:0}.left-0{left:0}.left-2{left:.5rem}.left-3{left:.75rem}.left-\\[50\\%\\]{left:50%}.right-0{right:0}.right-4{right:1rem}.top-0{top:0}.top-1\\/2{top:50%}.top-4{top:1rem}.top-\\[50\\%\\]{top:50%}.z-10{z-index:10}.z-50{z-index:50}.z-\\[100\\]{z-index:100}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.mx-4{margin-left:1rem;margin-right:1rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.ml-0\\.5{margin-left:.125rem}.mr-1{margin-right:.25rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-1\\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\\.5{height:.625rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\\[var\\(--radix-select-trigger-height\\)\\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-96{max-height:24rem}.max-h-\\[85vh\\]{max-height:85vh}.max-h-\\[calc\\(85vh-100px\\)\\]{max-height:calc(85vh - 100px)}.min-h-0{min-height:0px}.min-h-\\[60px\\]{min-height:60px}.min-h-\\[80px\\]{min-height:80px}.w-1\\.5{width:.375rem}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\\.5{width:.625rem}.w-20{width:5rem}.w-3{width:.75rem}.w-3\\.5{width:.875rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\\[8rem\\]{min-width:8rem}.min-w-\\[var\\(--radix-select-trigger-width\\)\\]{min-width:var(--radix-select-trigger-width)}.min-w-full{min-width:100%}.max-w-2xl{max-width:42rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-\\[120px\\]{max-width:120px}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\\[-50\\%\\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\\[-50\\%\\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse-fast{animation:pulse 1.5s cubic-bezier(.4,0,.6,1) infinite}@keyframes slideUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.animate-slide-up{animation:slideUp .3s ease-out forwards}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.space-y-0\\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-\\[inherit\\]{border-radius:inherit}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r-2{border-right-width:2px}.border-t{border-top-width:1px}.border-t-2{border-top-width:2px}.border-\\[\\#30363d\\]{--tw-border-opacity: 1;border-color:rgb(48 54 61 / var(--tw-border-opacity, 1))}.border-cyber-border-subtle{--tw-border-opacity: 1;border-color:rgb(var(--cyber-border-subtle) / var(--tw-border-opacity, 1))}.border-cyber-border-subtle\\/50{border-color:rgb(var(--cyber-border-subtle) / .5)}.border-cyber-neon-cyan{--tw-border-opacity: 1;border-color:rgb(var(--cyber-neon-cyan) / var(--tw-border-opacity, 1))}.border-cyber-neon-cyan\\/30{border-color:rgb(var(--cyber-neon-cyan) / .3)}.border-cyber-neon-cyan\\/50{border-color:rgb(var(--cyber-neon-cyan) / .5)}.border-cyber-neon-cyan\\/60{border-color:rgb(var(--cyber-neon-cyan) / .6)}.border-cyber-neon-green\\/30{border-color:rgb(var(--cyber-neon-green) / .3)}.border-cyber-neon-green\\/50{border-color:rgb(var(--cyber-neon-green) / .5)}.border-cyber-neon-orange\\/30{border-color:rgb(var(--cyber-neon-orange) / .3)}.border-cyber-neon-orange\\/50{border-color:rgb(var(--cyber-neon-orange) / .5)}.border-cyber-neon-pink{--tw-border-opacity: 1;border-color:rgb(var(--cyber-neon-pink) / var(--tw-border-opacity, 1))}.border-cyber-neon-pink\\/30{border-color:rgb(var(--cyber-neon-pink) / .3)}.border-cyber-neon-pink\\/50{border-color:rgb(var(--cyber-neon-pink) / .5)}.border-cyber-neon-yellow\\/30{border-color:rgb(var(--cyber-neon-yellow) / .3)}.border-l-transparent{border-left-color:transparent}.border-t-transparent{border-top-color:transparent}.bg-\\[\\#0d1117\\]{--tw-bg-opacity: 1;background-color:rgb(13 17 23 / var(--tw-bg-opacity, 1))}.bg-\\[\\#161b22\\]{--tw-bg-opacity: 1;background-color:rgb(22 27 34 / var(--tw-bg-opacity, 1))}.bg-\\[\\#21262d\\]{--tw-bg-opacity: 1;background-color:rgb(33 38 45 / var(--tw-bg-opacity, 1))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-black\\/50{background-color:#00000080}.bg-black\\/60{background-color:#0009}.bg-black\\/80{background-color:#000c}.bg-black\\/95{background-color:#000000f2}.bg-border{background-color:hsl(var(--border))}.bg-cyber-bg-panel{--tw-bg-opacity: 1;background-color:rgb(var(--cyber-bg-panel) / var(--tw-bg-opacity, 1))}.bg-cyber-bg-tertiary{--tw-bg-opacity: 1;background-color:rgb(var(--cyber-bg-tertiary) / var(--tw-bg-opacity, 1))}.bg-cyber-bg-tertiary\\/30{background-color:rgb(var(--cyber-bg-tertiary) / .3)}.bg-cyber-bg-tertiary\\/50{background-color:rgb(var(--cyber-bg-tertiary) / .5)}.bg-cyber-neon-cyan{--tw-bg-opacity: 1;background-color:rgb(var(--cyber-neon-cyan) / var(--tw-bg-opacity, 1))}.bg-cyber-neon-cyan\\/10{background-color:rgb(var(--cyber-neon-cyan) / .1)}.bg-cyber-neon-cyan\\/20{background-color:rgb(var(--cyber-neon-cyan) / .2)}.bg-cyber-neon-green{--tw-bg-opacity: 1;background-color:rgb(var(--cyber-neon-green) / var(--tw-bg-opacity, 1))}.bg-cyber-neon-green\\/10{background-color:rgb(var(--cyber-neon-green) / .1)}.bg-cyber-neon-green\\/20{background-color:rgb(var(--cyber-neon-green) / .2)}.bg-cyber-neon-green\\/80{background-color:rgb(var(--cyber-neon-green) / .8)}.bg-cyber-neon-orange\\/10{background-color:rgb(var(--cyber-neon-orange) / .1)}.bg-cyber-neon-orange\\/5{background-color:rgb(var(--cyber-neon-orange) / .05)}.bg-cyber-neon-orange\\/80{background-color:rgb(var(--cyber-neon-orange) / .8)}.bg-cyber-neon-pink{--tw-bg-opacity: 1;background-color:rgb(var(--cyber-neon-pink) / var(--tw-bg-opacity, 1))}.bg-cyber-neon-pink\\/10{background-color:rgb(var(--cyber-neon-pink) / .1)}.bg-cyber-neon-pink\\/20{background-color:rgb(var(--cyber-neon-pink) / .2)}.bg-cyber-neon-pink\\/80{background-color:rgb(var(--cyber-neon-pink) / .8)}.bg-cyber-neon-yellow\\/10{background-color:rgb(var(--cyber-neon-yellow) / .1)}.bg-transparent{background-color:transparent}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-transparent{--tw-gradient-from: transparent var(--tw-gradient-from-position);--tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.via-cyber-neon-cyan\\/5{--tw-gradient-to: rgb(var(--cyber-neon-cyan) / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), rgb(var(--cyber-neon-cyan) / .05) var(--tw-gradient-via-position), var(--tw-gradient-to)}.to-transparent{--tw-gradient-to: transparent var(--tw-gradient-to-position)}.fill-current{fill:currentColor}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-2\\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-\\[1px\\]{padding:1px}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-4{padding-bottom:1rem}.pl-2{padding-left:.5rem}.pl-8{padding-left:2rem}.pl-9{padding-left:2.25rem}.pr-2{padding-right:.5rem}.pt-0{padding-top:0}.pt-3{padding-top:.75rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:JetBrains Mono,Fira Code,Consolas,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\\[10px\\]{font-size:10px}.text-\\[11px\\]{font-size:11px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-\\[\\#8b949e\\]{--tw-text-opacity: 1;color:rgb(139 148 158 / var(--tw-text-opacity, 1))}.text-\\[\\#c9d1d9\\]{--tw-text-opacity: 1;color:rgb(201 209 217 / var(--tw-text-opacity, 1))}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.text-cyber-bg-primary{--tw-text-opacity: 1;color:rgb(var(--cyber-bg-primary) / var(--tw-text-opacity, 1))}.text-cyber-neon-cyan{--tw-text-opacity: 1;color:rgb(var(--cyber-neon-cyan) / var(--tw-text-opacity, 1))}.text-cyber-neon-cyan\\/30{color:rgb(var(--cyber-neon-cyan) / .3)}.text-cyber-neon-cyan\\/70{color:rgb(var(--cyber-neon-cyan) / .7)}.text-cyber-neon-green{--tw-text-opacity: 1;color:rgb(var(--cyber-neon-green) / var(--tw-text-opacity, 1))}.text-cyber-neon-green\\/70{color:rgb(var(--cyber-neon-green) / .7)}.text-cyber-neon-green\\/80{color:rgb(var(--cyber-neon-green) / .8)}.text-cyber-neon-orange{--tw-text-opacity: 1;color:rgb(var(--cyber-neon-orange) / var(--tw-text-opacity, 1))}.text-cyber-neon-pink{--tw-text-opacity: 1;color:rgb(var(--cyber-neon-pink) / var(--tw-text-opacity, 1))}.text-cyber-neon-yellow{--tw-text-opacity: 1;color:rgb(var(--cyber-neon-yellow) / var(--tw-text-opacity, 1))}.text-cyber-text-muted{--tw-text-opacity: 1;color:rgb(var(--cyber-text-muted) / var(--tw-text-opacity, 1))}.text-cyber-text-primary{--tw-text-opacity: 1;color:rgb(var(--cyber-text-primary) / var(--tw-text-opacity, 1))}.text-cyber-text-secondary{--tw-text-opacity: 1;color:rgb(var(--cyber-text-secondary) / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow-\\[0_0_20px_rgba\\(0\\,0\\,0\\,0\\.5\\)\\]{--tw-shadow: 0 0 20px rgba(0,0,0,.5);--tw-shadow-colored: 0 0 20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\\[0_0_3px_rgba\\(0\\,255\\,255\\,0\\.3\\)\\]{--tw-shadow: 0 0 3px rgba(0,255,255,.3);--tw-shadow-colored: 0 0 3px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\\[0_0_3px_rgba\\(0\\,255\\,65\\,0\\.3\\)\\]{--tw-shadow: 0 0 3px rgba(0,255,65,.3);--tw-shadow-colored: 0 0 3px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\\[0_0_3px_rgba\\(255\\,0\\,128\\,0\\.3\\)\\]{--tw-shadow: 0 0 3px rgba(255,0,128,.3);--tw-shadow-colored: 0 0 3px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\\[0_0_3px_rgba\\(255\\,152\\,0\\,0\\.3\\)\\]{--tw-shadow: 0 0 3px rgba(255,152,0,.3);--tw-shadow-colored: 0 0 3px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-cyber-card{--tw-shadow: 0 0 1px rgb(var(--cyber-neon-cyan) / .5), 0 4px 20px rgba(0, 0, 0, .3);--tw-shadow-colored: 0 0 1px var(--tw-shadow-color), 0 4px 20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-glow-cyan-sm{--tw-shadow: 0 0 5px rgb(var(--cyber-neon-cyan) / .4), 0 0 10px rgb(var(--cyber-neon-cyan) / .2);--tw-shadow-colored: 0 0 5px var(--tw-shadow-color), 0 0 10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-glow-green-sm{--tw-shadow: 0 0 5px rgb(var(--cyber-neon-green) / .4), 0 0 10px rgb(var(--cyber-neon-green) / .2);--tw-shadow-colored: 0 0 5px var(--tw-shadow-color), 0 0 10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.blur-xl{--tw-blur: blur(24px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-700{transition-duration:.7s}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.duration-200{animation-duration:.2s}.duration-300{animation-duration:.3s}.duration-700{animation-duration:.7s}.running{animation-play-state:running}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:rgb(var(--cyber-bg-secondary));border-left:1px solid rgb(var(--cyber-neon-cyan) / .1)}::-webkit-scrollbar-thumb{background:linear-gradient(180deg,rgb(var(--cyber-neon-cyan) / .4),rgb(var(--cyber-neon-pink) / .3));border-radius:0}::-webkit-scrollbar-thumb:hover{background:linear-gradient(180deg,rgb(var(--cyber-neon-cyan) / .6),rgb(var(--cyber-neon-pink) / .5))}::-webkit-scrollbar-corner{background:rgb(var(--cyber-bg-secondary))}.terminal-scroll::-webkit-scrollbar{width:6px}.terminal-scroll::-webkit-scrollbar-track{background:#000}.terminal-scroll::-webkit-scrollbar-thumb{background:#00ff4166;border-radius:0}.terminal-scroll::-webkit-scrollbar-thumb:hover{background:#00ff4199}.cyber-grid{background-color:rgb(var(--cyber-bg-primary));background-image:linear-gradient(rgb(var(--cyber-neon-cyan) / .03) 1px,transparent 1px),linear-gradient(90deg,rgb(var(--cyber-neon-cyan) / .03) 1px,transparent 1px),radial-gradient(ellipse at 50% 0%,rgb(var(--cyber-neon-cyan) / .06) 0%,transparent 60%);background-size:50px 50px,50px 50px,100% 100%;background-position:-1px -1px,-1px -1px,center top}.dark .cyber-grid{background-image:linear-gradient(rgba(0,255,255,.02) 1px,transparent 1px),linear-gradient(90deg,rgba(0,255,255,.02) 1px,transparent 1px),radial-gradient(ellipse at 50% 0%,rgba(0,255,255,.08) 0%,transparent 60%)}.glass-panel{background:rgb(var(--glass-bg));backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgb(var(--glass-border))}.glass-panel-dark{background:rgb(var(--glass-dark-bg));backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border:1px solid rgb(var(--glass-dark-border))}.float-panel{box-shadow:0 8px 32px #0000001a,0 0 1px rgb(var(--cyber-neon-cyan) / .1)}.dark .float-panel{box-shadow:0 8px 32px #0006,0 0 1px #00ffff26}.elevated-panel{box-shadow:0 12px 40px #00000026}.dark .elevated-panel{box-shadow:0 12px 40px #00000080}.glow-text-cyan{text-shadow:0 1px 3px rgb(var(--cyber-neon-cyan) / .3)}.dark .glow-text-cyan{text-shadow:0 0 5px rgba(0,255,255,.8),0 0 10px rgba(0,255,255,.5),0 0 20px rgba(0,255,255,.3)}.glow-text-pink{text-shadow:0 1px 3px rgb(var(--cyber-neon-pink) / .3)}.dark .glow-text-pink{text-shadow:0 0 5px rgba(255,0,128,.8),0 0 10px rgba(255,0,128,.5),0 0 20px rgba(255,0,128,.3)}.glow-text-green{text-shadow:0 1px 3px rgb(var(--cyber-neon-green) / .3)}.dark .glow-text-green{text-shadow:0 0 5px rgba(0,255,65,.8),0 0 10px rgba(0,255,65,.5),0 0 20px rgba(0,255,65,.3)}.glow-cyan{box-shadow:0 4px 12px rgb(var(--cyber-neon-cyan) / var(--shadow-glow-opacity))}.dark .glow-cyan{box-shadow:0 0 5px #00ffff80,0 0 10px #00ffff4d,0 0 20px #0ff3,inset 0 0 5px #00ffff1a}.glow-pink{box-shadow:0 4px 12px rgb(var(--cyber-neon-pink) / var(--shadow-glow-opacity))}.dark .glow-pink{box-shadow:0 0 5px #ff008080,0 0 10px #ff00804d,0 0 20px #ff008033}.glow-green{box-shadow:0 4px 12px rgb(var(--cyber-neon-green) / var(--shadow-glow-opacity))}.dark .glow-green{box-shadow:0 0 5px #00ff4180,0 0 10px #00ff414d,0 0 20px #00ff4133}.cyber-corner{position:relative}.cyber-corner:before,.cyber-corner:after{content:\"\";position:absolute;width:12px;height:12px;pointer-events:none}.cyber-corner:before{top:-1px;left:-1px;border-top:2px solid rgb(var(--cyber-neon-cyan) / .5);border-left:2px solid rgb(var(--cyber-neon-cyan) / .5)}.cyber-corner:after{bottom:-1px;right:-1px;border-bottom:2px solid rgb(var(--cyber-neon-cyan) / .5);border-right:2px solid rgb(var(--cyber-neon-cyan) / .5)}.cyber-corners{position:relative}.cyber-corners:before{content:\"\";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(to right,rgb(var(--cyber-neon-cyan) / .5) 12px,transparent 12px) 0 0,linear-gradient(to right,rgb(var(--cyber-neon-cyan) / .5) 12px,transparent 12px) 0 100%,linear-gradient(to left,rgb(var(--cyber-neon-cyan) / .5) 12px,transparent 12px) 100% 0,linear-gradient(to left,rgb(var(--cyber-neon-cyan) / .5) 12px,transparent 12px) 100% 100%,linear-gradient(to bottom,rgb(var(--cyber-neon-cyan) / .5) 12px,transparent 12px) 0 0,linear-gradient(to bottom,rgb(var(--cyber-neon-cyan) / .5) 12px,transparent 12px) 100% 0,linear-gradient(to top,rgb(var(--cyber-neon-cyan) / .5) 12px,transparent 12px) 0 100%,linear-gradient(to top,rgb(var(--cyber-neon-cyan) / .5) 12px,transparent 12px) 100% 100%;background-repeat:no-repeat;background-size:2px 12px,2px 12px,2px 12px,2px 12px,12px 2px,12px 2px,12px 2px,12px 2px;pointer-events:none}.card-scan{position:relative;overflow:hidden}.card-scan:after{content:\"\";position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent,rgb(var(--cyber-neon-cyan) / .1),transparent);transition:left .6s ease-in-out;pointer-events:none}.card-scan:hover:after{left:100%}.cursor-blink{animation:cursorBlink 1s step-end infinite}@keyframes cursorBlink{0%,to{opacity:1}50%{opacity:0}}.status-dot{width:8px;height:8px;border-radius:50%}.status-dot-online{background:rgb(var(--cyber-neon-green));box-shadow:0 0 8px rgb(var(--cyber-neon-green) / .6);animation:pulseGlow 2s ease-in-out infinite}.status-dot-offline{background:rgb(var(--cyber-text-muted))}.status-dot-warning{background:rgb(var(--cyber-neon-orange));box-shadow:0 0 8px rgb(var(--cyber-neon-orange) / .6)}.status-dot-error{background:rgb(var(--cyber-neon-pink));box-shadow:0 0 8px rgb(var(--cyber-neon-pink) / .6)}@keyframes pulseGlow{0%,to{box-shadow:0 0 5px currentColor}50%{box-shadow:0 0 15px currentColor,0 0 25px currentColor}}.cyber-focus{transition:box-shadow .2s ease-in-out}.cyber-focus:focus{outline:none;box-shadow:0 0 0 1px rgb(var(--cyber-neon-cyan)),0 0 10px rgb(var(--cyber-neon-cyan) / .3);border-color:rgb(var(--cyber-neon-cyan))}::selection{background:rgb(var(--cyber-neon-cyan) / .3);color:rgb(var(--cyber-text-primary))}::-moz-selection{background:rgb(var(--cyber-neon-cyan) / .3);color:rgb(var(--cyber-text-primary))}.will-change-transform{will-change:transform}.gpu-accelerate{transform:translateZ(0);backface-visibility:hidden}.file\\:border-0::file-selector-button{border-width:0px}.file\\:bg-transparent::file-selector-button{background-color:transparent}.file\\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\\:font-medium::file-selector-button{font-weight:500}.file\\:text-foreground::file-selector-button{color:hsl(var(--foreground))}.placeholder\\:text-cyber-text-muted::-moz-placeholder{--tw-text-opacity: 1;color:rgb(var(--cyber-text-muted) / var(--tw-text-opacity, 1))}.placeholder\\:text-cyber-text-muted::placeholder{--tw-text-opacity: 1;color:rgb(var(--cyber-text-muted) / var(--tw-text-opacity, 1))}.hover\\:scale-110:hover{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\\:border-\\[\\#00ffff\\]\\/50:hover{border-color:#00ffff80}.hover\\:border-cyber-neon-cyan:hover{--tw-border-opacity: 1;border-color:rgb(var(--cyber-neon-cyan) / var(--tw-border-opacity, 1))}.hover\\:border-cyber-neon-cyan\\/30:hover{border-color:rgb(var(--cyber-neon-cyan) / .3)}.hover\\:border-cyber-neon-cyan\\/50:hover{border-color:rgb(var(--cyber-neon-cyan) / .5)}.hover\\:border-cyber-neon-green\\/50:hover{border-color:rgb(var(--cyber-neon-green) / .5)}.hover\\:border-cyber-neon-yellow\\/50:hover{border-color:rgb(var(--cyber-neon-yellow) / .5)}.hover\\:border-cyber-text-primary:hover{--tw-border-opacity: 1;border-color:rgb(var(--cyber-text-primary) / var(--tw-border-opacity, 1))}.hover\\:border-pink-400:hover{--tw-border-opacity: 1;border-color:rgb(244 114 182 / var(--tw-border-opacity, 1))}.hover\\:border-red-400:hover{--tw-border-opacity: 1;border-color:rgb(248 113 113 / var(--tw-border-opacity, 1))}.hover\\:bg-\\[\\#00ffff\\]\\/10:hover{background-color:#00ffff1a}.hover\\:bg-\\[\\#21262d\\]:hover{--tw-bg-opacity: 1;background-color:rgb(33 38 45 / var(--tw-bg-opacity, 1))}.hover\\:bg-\\[\\#21262d\\]\\/50:hover{background-color:#21262d80}.hover\\:bg-\\[\\#ff0080\\]\\/10:hover{background-color:#ff00801a}.hover\\:bg-cyber-bg-elevated\\/50:hover{background-color:rgb(var(--cyber-bg-elevated) / .5)}.hover\\:bg-cyber-bg-tertiary:hover{--tw-bg-opacity: 1;background-color:rgb(var(--cyber-bg-tertiary) / var(--tw-bg-opacity, 1))}.hover\\:bg-cyber-neon-cyan\\/10:hover{background-color:rgb(var(--cyber-neon-cyan) / .1)}.hover\\:bg-cyber-neon-cyan\\/30:hover{background-color:rgb(var(--cyber-neon-cyan) / .3)}.hover\\:bg-cyber-neon-cyan\\/90:hover{background-color:rgb(var(--cyber-neon-cyan) / .9)}.hover\\:bg-cyber-neon-green\\/30:hover{background-color:rgb(var(--cyber-neon-green) / .3)}.hover\\:bg-cyber-neon-green\\/90:hover{background-color:rgb(var(--cyber-neon-green) / .9)}.hover\\:bg-cyber-neon-orange\\/20:hover{background-color:rgb(var(--cyber-neon-orange) / .2)}.hover\\:bg-cyber-neon-pink\\/10:hover{background-color:rgb(var(--cyber-neon-pink) / .1)}.hover\\:bg-cyber-neon-pink\\/30:hover{background-color:rgb(var(--cyber-neon-pink) / .3)}.hover\\:bg-cyber-neon-pink\\/90:hover{background-color:rgb(var(--cyber-neon-pink) / .9)}.hover\\:text-\\[\\#00ffff\\]:hover{--tw-text-opacity: 1;color:rgb(0 255 255 / var(--tw-text-opacity, 1))}.hover\\:text-\\[\\#ff0080\\]:hover{--tw-text-opacity: 1;color:rgb(255 0 128 / var(--tw-text-opacity, 1))}.hover\\:text-cyber-neon-cyan:hover{--tw-text-opacity: 1;color:rgb(var(--cyber-neon-cyan) / var(--tw-text-opacity, 1))}.hover\\:text-cyber-neon-pink:hover{--tw-text-opacity: 1;color:rgb(var(--cyber-neon-pink) / var(--tw-text-opacity, 1))}.hover\\:text-cyber-text-primary:hover{--tw-text-opacity: 1;color:rgb(var(--cyber-text-primary) / var(--tw-text-opacity, 1))}.hover\\:underline:hover{text-decoration-line:underline}.hover\\:opacity-100:hover{opacity:1}.hover\\:shadow-\\[0_0_10px_rgba\\(248\\,113\\,113\\,0\\.4\\)\\]:hover{--tw-shadow: 0 0 10px rgba(248,113,113,.4);--tw-shadow-colored: 0 0 10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\\:shadow-\\[0_0_10px_rgba\\(251\\,113\\,133\\,0\\.4\\)\\]:hover{--tw-shadow: 0 0 10px rgba(251,113,133,.4);--tw-shadow-colored: 0 0 10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\\:shadow-\\[0_0_10px_rgba\\(255\\,255\\,255\\,0\\.3\\)\\]:hover{--tw-shadow: 0 0 10px rgba(255,255,255,.3);--tw-shadow-colored: 0 0 10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\\:shadow-\\[0_0_15px_rgb\\(var\\(--cyber-neon-cyan\\)\\/0\\.15\\)\\]:hover{--tw-shadow: 0 0 15px rgb(var(--cyber-neon-cyan)/.15);--tw-shadow-colored: 0 0 15px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\\:shadow-glow-cyan:hover{--tw-shadow: 0 0 var(--shadow-glow-spread, 10px) rgb(var(--cyber-neon-cyan) / var(--shadow-glow-opacity, .5)), 0 0 calc(var(--shadow-glow-spread, 10px) * 2) rgb(var(--cyber-neon-cyan) / calc(var(--shadow-glow-opacity, .5) * .6)), 0 0 calc(var(--shadow-glow-spread, 10px) * 3) rgb(var(--cyber-neon-cyan) / calc(var(--shadow-glow-opacity, .5) * .2));--tw-shadow-colored: 0 0 var(--tw-shadow-color), 0 0 var(--tw-shadow-color), 0 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\\:shadow-glow-cyan-sm:hover{--tw-shadow: 0 0 5px rgb(var(--cyber-neon-cyan) / .4), 0 0 10px rgb(var(--cyber-neon-cyan) / .2);--tw-shadow-colored: 0 0 5px var(--tw-shadow-color), 0 0 10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\\:shadow-glow-green-sm:hover{--tw-shadow: 0 0 5px rgb(var(--cyber-neon-green) / .4), 0 0 10px rgb(var(--cyber-neon-green) / .2);--tw-shadow-colored: 0 0 5px var(--tw-shadow-color), 0 0 10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\\:shadow-glow-pink-sm:hover{--tw-shadow: 0 0 5px rgb(var(--cyber-neon-pink) / .4), 0 0 10px rgb(var(--cyber-neon-pink) / .2);--tw-shadow-colored: 0 0 5px var(--tw-shadow-color), 0 0 10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\\:border-cyber-neon-cyan:focus{--tw-border-opacity: 1;border-color:rgb(var(--cyber-neon-cyan) / var(--tw-border-opacity, 1))}.focus\\:bg-cyber-neon-cyan\\/20:focus{background-color:rgb(var(--cyber-neon-cyan) / .2)}.focus\\:text-cyber-neon-cyan:focus{--tw-text-opacity: 1;color:rgb(var(--cyber-neon-cyan) / var(--tw-text-opacity, 1))}.focus\\:shadow-\\[0_0_10px_rgb\\(var\\(--cyber-neon-cyan\\)\\/0\\.2\\)\\]:focus{--tw-shadow: 0 0 10px rgb(var(--cyber-neon-cyan)/.2);--tw-shadow-colored: 0 0 10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\\:ring-cyber-neon-cyan:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(var(--cyber-neon-cyan) / var(--tw-ring-opacity, 1))}.focus\\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\\:border-cyber-neon-cyan:focus-visible{--tw-border-opacity: 1;border-color:rgb(var(--cyber-neon-cyan) / var(--tw-border-opacity, 1))}.focus-visible\\:border-cyber-neon-cyan\\/50:focus-visible{border-color:rgb(var(--cyber-neon-cyan) / .5)}.focus-visible\\:shadow-\\[0_0_10px_rgb\\(var\\(--cyber-neon-cyan\\)\\/0\\.2\\)\\]:focus-visible{--tw-shadow: 0 0 10px rgb(var(--cyber-neon-cyan)/.2);--tw-shadow-colored: 0 0 10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus-visible\\:shadow-cyber-soft:focus-visible{--tw-shadow: 0 4px 24px rgba(0, 0, 0, .2), 0 0 1px rgb(var(--cyber-neon-cyan) / .1);--tw-shadow-colored: 0 4px 24px var(--tw-shadow-color), 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus-visible\\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\\:ring-1:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\\:ring-cyber-neon-cyan:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(var(--cyber-neon-cyan) / var(--tw-ring-opacity, 1))}.active\\:scale-95:active{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.disabled\\:pointer-events-none:disabled{pointer-events:none}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:opacity-30:disabled{opacity:.3}.disabled\\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\\:translate-x-full{--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\\:opacity-100{opacity:1}.peer:checked~.peer-checked\\:border-cyber-neon-cyan{--tw-border-opacity: 1;border-color:rgb(var(--cyber-neon-cyan) / var(--tw-border-opacity, 1))}.peer:checked~.peer-checked\\:bg-cyber-neon-cyan\\/20{background-color:rgb(var(--cyber-neon-cyan) / .2)}.peer:checked~.peer-checked\\:shadow-glow-cyan-sm{--tw-shadow: 0 0 5px rgb(var(--cyber-neon-cyan) / .4), 0 0 10px rgb(var(--cyber-neon-cyan) / .2);--tw-shadow-colored: 0 0 5px var(--tw-shadow-color), 0 0 10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.peer:disabled~.peer-disabled\\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\\:opacity-70{opacity:.7}.data-\\[disabled\\]\\:pointer-events-none[data-disabled]{pointer-events:none}.data-\\[side\\=bottom\\]\\:translate-y-1[data-side=bottom]{--tw-translate-y: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\\[side\\=left\\]\\:-translate-x-1[data-side=left]{--tw-translate-x: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\\[side\\=right\\]\\:translate-x-1[data-side=right]{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\\[side\\=top\\]\\:-translate-y-1[data-side=top]{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes accordion-up{0%{height:var(--radix-accordion-content-height)}to{height:0}}.data-\\[state\\=closed\\]\\:animate-accordion-up[data-state=closed]{animation:accordion-up .2s ease-out}@keyframes accordion-down{0%{height:0}to{height:var(--radix-accordion-content-height)}}.data-\\[state\\=open\\]\\:animate-accordion-down[data-state=open]{animation:accordion-down .2s ease-out}.data-\\[state\\=active\\]\\:bg-cyber-neon-cyan\\/20[data-state=active]{background-color:rgb(var(--cyber-neon-cyan) / .2)}.data-\\[state\\=open\\]\\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\\[state\\=active\\]\\:text-cyber-neon-cyan[data-state=active]{--tw-text-opacity: 1;color:rgb(var(--cyber-neon-cyan) / var(--tw-text-opacity, 1))}.data-\\[state\\=open\\]\\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\\[disabled\\]\\:opacity-50[data-disabled]{opacity:.5}.data-\\[state\\=active\\]\\:shadow-glow-cyan-sm[data-state=active]{--tw-shadow: 0 0 5px rgb(var(--cyber-neon-cyan) / .4), 0 0 10px rgb(var(--cyber-neon-cyan) / .2);--tw-shadow-colored: 0 0 5px var(--tw-shadow-color), 0 0 10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.data-\\[state\\=open\\]\\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.data-\\[state\\=closed\\]\\:animate-out[data-state=closed]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity: initial;--tw-exit-scale: initial;--tw-exit-rotate: initial;--tw-exit-translate-x: initial;--tw-exit-translate-y: initial}.data-\\[state\\=closed\\]\\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0}.data-\\[state\\=open\\]\\:fade-in-0[data-state=open]{--tw-enter-opacity: 0}.data-\\[state\\=closed\\]\\:zoom-out-95[data-state=closed]{--tw-exit-scale: .95}.data-\\[state\\=open\\]\\:zoom-in-95[data-state=open]{--tw-enter-scale: .95}.data-\\[side\\=bottom\\]\\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y: -.5rem}.data-\\[side\\=left\\]\\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x: .5rem}.data-\\[side\\=right\\]\\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x: -.5rem}.data-\\[side\\=top\\]\\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y: .5rem}.data-\\[state\\=closed\\]\\:slide-out-to-left-1\\/2[data-state=closed]{--tw-exit-translate-x: -50%}.data-\\[state\\=closed\\]\\:slide-out-to-top-\\[48\\%\\][data-state=closed]{--tw-exit-translate-y: -48%}.data-\\[state\\=open\\]\\:slide-in-from-left-1\\/2[data-state=open]{--tw-enter-translate-x: -50%}.data-\\[state\\=open\\]\\:slide-in-from-top-\\[48\\%\\][data-state=open]{--tw-enter-translate-y: -48%}@media(min-width:640px){.sm\\:inline{display:inline}.sm\\:flex-row{flex-direction:row}.sm\\:justify-end{justify-content:flex-end}.sm\\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.sm\\:text-left{text-align:left}}@media(min-width:768px){.md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(min-width:1024px){.lg\\:flex{display:flex}.lg\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(min-width:1280px){.xl\\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.\\[\\&\\>span\\]\\:line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.\\[\\&\\[data-state\\=open\\]\\>svg\\]\\:rotate-180[data-state=open]>svg{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.\\[\\&_svg\\]\\:size-4 svg{width:1rem;height:1rem}.\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}\n"
  },
  {
    "path": "api/webui/index.html",
    "content": "<!doctype html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"/vite.svg\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>MediaCrawler - Command Center</title>\n    <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n    <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n    <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap\" rel=\"stylesheet\">\n    <script type=\"module\" crossorigin src=\"/assets/index-DvClRayq.js\"></script>\n    <link rel=\"stylesheet\" crossorigin href=\"/assets/index-OiBmsgXF.css\">\n  </head>\n  <body>\n    <div id=\"root\"></div>\n  </body>\n</html>\n"
  },
  {
    "path": "base/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/base/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n"
  },
  {
    "path": "base/base_crawler.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/base/base_crawler.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\nfrom abc import ABC, abstractmethod\nfrom typing import Dict, Optional\n\nfrom playwright.async_api import BrowserContext, BrowserType, Playwright\n\n\nclass AbstractCrawler(ABC):\n\n    @abstractmethod\n    async def start(self):\n        \"\"\"\n        start crawler\n        \"\"\"\n        pass\n\n    @abstractmethod\n    async def search(self):\n        \"\"\"\n        search\n        \"\"\"\n        pass\n\n    @abstractmethod\n    async def launch_browser(self, chromium: BrowserType, playwright_proxy: Optional[Dict], user_agent: Optional[str], headless: bool = True) -> BrowserContext:\n        \"\"\"\n        launch browser\n        :param chromium: chromium browser\n        :param playwright_proxy: playwright proxy\n        :param user_agent: user agent\n        :param headless: headless mode\n        :return: browser context\n        \"\"\"\n        pass\n\n    async def launch_browser_with_cdp(self, playwright: Playwright, playwright_proxy: Optional[Dict], user_agent: Optional[str], headless: bool = True) -> BrowserContext:\n        \"\"\"\n        Launch browser using CDP mode (optional implementation)\n        :param playwright: playwright instance\n        :param playwright_proxy: playwright proxy configuration\n        :param user_agent: user agent\n        :param headless: headless mode\n        :return: browser context\n        \"\"\"\n        # Default implementation: fallback to standard mode\n        return await self.launch_browser(playwright.chromium, playwright_proxy, user_agent, headless)\n\n\nclass AbstractLogin(ABC):\n\n    @abstractmethod\n    async def begin(self):\n        pass\n\n    @abstractmethod\n    async def login_by_qrcode(self):\n        pass\n\n    @abstractmethod\n    async def login_by_mobile(self):\n        pass\n\n    @abstractmethod\n    async def login_by_cookies(self):\n        pass\n\n\nclass AbstractStore(ABC):\n\n    @abstractmethod\n    async def store_content(self, content_item: Dict):\n        pass\n\n    @abstractmethod\n    async def store_comment(self, comment_item: Dict):\n        pass\n\n    # TODO support all platform\n    # only xhs is supported, so @abstractmethod is commented\n    @abstractmethod\n    async def store_creator(self, creator: Dict):\n        pass\n\n\nclass AbstractStoreImage(ABC):\n    # TODO: support all platform\n    # only weibo is supported\n    # @abstractmethod\n    async def store_image(self, image_content_item: Dict):\n        pass\n\n\nclass AbstractStoreVideo(ABC):\n    # TODO: support all platform\n    # only weibo is supported\n    # @abstractmethod\n    async def store_video(self, video_content_item: Dict):\n        pass\n\n\nclass AbstractApiClient(ABC):\n\n    @abstractmethod\n    async def request(self, method, url, **kwargs):\n        pass\n\n    @abstractmethod\n    async def update_cookies(self, browser_context: BrowserContext):\n        pass\n"
  },
  {
    "path": "cache/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/cache/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n"
  },
  {
    "path": "cache/abs_cache.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/cache/abs_cache.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Name    : Programmer AJiang-Relakkes\n# @Time    : 2024/6/2 11:06\n# @Desc    : Abstract class\n\nfrom abc import ABC, abstractmethod\nfrom typing import Any, List, Optional\n\n\nclass AbstractCache(ABC):\n\n    @abstractmethod\n    def get(self, key: str) -> Optional[Any]:\n        \"\"\"\n        Get the value of a key from the cache.\n        This is an abstract method. Subclasses must implement this method.\n        :param key: The key\n        :return:\n        \"\"\"\n        raise NotImplementedError\n\n    @abstractmethod\n    def set(self, key: str, value: Any, expire_time: int) -> None:\n        \"\"\"\n        Set the value of a key in the cache.\n        This is an abstract method. Subclasses must implement this method.\n        :param key: The key\n        :param value: The value\n        :param expire_time: Expiration time\n        :return:\n        \"\"\"\n        raise NotImplementedError\n\n    @abstractmethod\n    def keys(self, pattern: str) -> List[str]:\n        \"\"\"\n        Get all keys matching the pattern\n        :param pattern: Matching pattern\n        :return:\n        \"\"\"\n        raise NotImplementedError\n"
  },
  {
    "path": "cache/cache_factory.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/cache/cache_factory.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Name    : Programmer AJiang-Relakkes\n# @Time    : 2024/6/2 11:23\n# @Desc    :\n\n\nclass CacheFactory:\n    \"\"\"\n    Cache factory class\n    \"\"\"\n\n    @staticmethod\n    def create_cache(cache_type: str, *args, **kwargs):\n        \"\"\"\n        Create cache object\n        :param cache_type: Cache type\n        :param args: Arguments\n        :param kwargs: Keyword arguments\n        :return:\n        \"\"\"\n        if cache_type == 'memory':\n            from .local_cache import ExpiringLocalCache\n            return ExpiringLocalCache(*args, **kwargs)\n        elif cache_type == 'redis':\n            from .redis_cache import RedisCache\n            return RedisCache()\n        else:\n            raise ValueError(f'Unknown cache type: {cache_type}')\n"
  },
  {
    "path": "cache/local_cache.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/cache/local_cache.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Name    : Programmer AJiang-Relakkes\n# @Time    : 2024/6/2 11:05\n# @Desc    : Local cache\n\nimport asyncio\nimport time\nfrom typing import Any, Dict, List, Optional, Tuple\n\nfrom cache.abs_cache import AbstractCache\n\n\nclass ExpiringLocalCache(AbstractCache):\n\n    def __init__(self, cron_interval: int = 10):\n        \"\"\"\n        Initialize local cache\n        :param cron_interval: Time interval for scheduled cache cleanup\n        :return:\n        \"\"\"\n        self._cron_interval = cron_interval\n        self._cache_container: Dict[str, Tuple[Any, float]] = {}\n        self._cron_task: Optional[asyncio.Task] = None\n        # Start scheduled cleanup task\n        self._schedule_clear()\n\n    def __del__(self):\n        \"\"\"\n        Destructor function, cleanup scheduled task\n        :return:\n        \"\"\"\n        if self._cron_task is not None:\n            self._cron_task.cancel()\n\n    def get(self, key: str) -> Optional[Any]:\n        \"\"\"\n        Get the value of a key from the cache\n        :param key:\n        :return:\n        \"\"\"\n        value, expire_time = self._cache_container.get(key, (None, 0))\n        if value is None:\n            return None\n\n        # If the key has expired, delete it and return None\n        if expire_time < time.time():\n            del self._cache_container[key]\n            return None\n\n        return value\n\n    def set(self, key: str, value: Any, expire_time: int) -> None:\n        \"\"\"\n        Set the value of a key in the cache\n        :param key:\n        :param value:\n        :param expire_time:\n        :return:\n        \"\"\"\n        self._cache_container[key] = (value, time.time() + expire_time)\n\n    def keys(self, pattern: str) -> List[str]:\n        \"\"\"\n        Get all keys matching the pattern\n        :param pattern: Matching pattern\n        :return:\n        \"\"\"\n        if pattern == '*':\n            return list(self._cache_container.keys())\n\n        # For local cache wildcard, temporarily replace * with empty string\n        if '*' in pattern:\n            pattern = pattern.replace('*', '')\n\n        return [key for key in self._cache_container.keys() if pattern in key]\n\n    def _schedule_clear(self):\n        \"\"\"\n        Start scheduled cleanup task\n        :return:\n        \"\"\"\n\n        try:\n            loop = asyncio.get_event_loop()\n        except RuntimeError:\n            loop = asyncio.new_event_loop()\n            asyncio.set_event_loop(loop)\n\n        self._cron_task = loop.create_task(self._start_clear_cron())\n\n    def _clear(self):\n        \"\"\"\n        Clean up cache based on expiration time\n        :return:\n        \"\"\"\n        for key, (value, expire_time) in self._cache_container.items():\n            if expire_time < time.time():\n                del self._cache_container[key]\n\n    async def _start_clear_cron(self):\n        \"\"\"\n        Start scheduled cleanup task\n        :return:\n        \"\"\"\n        while True:\n            self._clear()\n            await asyncio.sleep(self._cron_interval)\n\n\nif __name__ == '__main__':\n    cache = ExpiringLocalCache(cron_interval=2)\n    cache.set('name', 'Programmer AJiang-Relakkes', 3)\n    print(cache.get('key'))\n    print(cache.keys(\"*\"))\n    time.sleep(4)\n    print(cache.get('key'))\n    del cache\n    time.sleep(1)\n    print(\"done\")\n"
  },
  {
    "path": "cache/redis_cache.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/cache/redis_cache.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Name    : Programmer AJiang-Relakkes\n# @Time    : 2024/5/29 22:57\n# @Desc    : RedisCache implementation\nimport pickle\nimport time\nfrom typing import Any, List\n\nfrom redis import Redis\nfrom redis.exceptions import ResponseError\n\nfrom cache.abs_cache import AbstractCache\nfrom config import db_config\n\n\nclass RedisCache(AbstractCache):\n\n    def __init__(self) -> None:\n        # Connect to redis, return redis client\n        self._redis_client = self._connet_redis()\n\n    @staticmethod\n    def _connet_redis() -> Redis:\n        \"\"\"\n        Connect to redis, return redis client, configure redis connection information as needed\n        :return:\n        \"\"\"\n        return Redis(\n            host=db_config.REDIS_DB_HOST,\n            port=db_config.REDIS_DB_PORT,\n            db=db_config.REDIS_DB_NUM,\n            password=db_config.REDIS_DB_PWD,\n        )\n\n    def get(self, key: str) -> Any:\n        \"\"\"\n        Get the value of a key from the cache and deserialize it\n        :param key:\n        :return:\n        \"\"\"\n        value = self._redis_client.get(key)\n        if value is None:\n            return None\n        return pickle.loads(value)\n\n    def set(self, key: str, value: Any, expire_time: int) -> None:\n        \"\"\"\n        Set the value of a key in the cache and serialize it\n        :param key:\n        :param value:\n        :param expire_time:\n        :return:\n        \"\"\"\n        self._redis_client.set(key, pickle.dumps(value), ex=expire_time)\n\n    def keys(self, pattern: str) -> List[str]:\n        \"\"\"\n        Get all keys matching the pattern\n        First try KEYS command, if not supported fallback to SCAN\n        \"\"\"\n        try:\n            # Try KEYS command first (faster for standard Redis)\n            return [key.decode() if isinstance(key, bytes) else key for key in self._redis_client.keys(pattern)]\n        except ResponseError as e:\n            # If KEYS is not supported (e.g., Redis Cluster or cloud Redis), use SCAN\n            if \"unknown command\" in str(e).lower() or \"keys\" in str(e).lower():\n                keys_list: List[str] = []\n                cursor = 0\n                while True:\n                    cursor, keys = self._redis_client.scan(cursor=cursor, match=pattern, count=100)\n                    keys_list.extend([key.decode() if isinstance(key, bytes) else key for key in keys])\n                    if cursor == 0:\n                        break\n                return keys_list\n            else:\n                # Re-raise if it's a different error\n                raise\n\n\nif __name__ == '__main__':\n    redis_cache = RedisCache()\n    # basic usage\n    redis_cache.set(\"name\", \"Programmer AJiang-Relakkes\", 1)\n    print(redis_cache.get(\"name\"))  # Relakkes\n    print(redis_cache.keys(\"*\"))  # ['name']\n    time.sleep(2)\n    print(redis_cache.get(\"name\"))  # None\n\n    # special python type usage\n    # list\n    redis_cache.set(\"list\", [1, 2, 3], 10)\n    _value = redis_cache.get(\"list\")\n    print(_value, f\"value type:{type(_value)}\")  # [1, 2, 3]\n"
  },
  {
    "path": "cmd_arg/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/cmd_arg/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nfrom .arg import *\n"
  },
  {
    "path": "cmd_arg/arg.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/cmd_arg/arg.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nfrom __future__ import annotations\n\n\nimport sys\nfrom enum import Enum\nfrom types import SimpleNamespace\nfrom typing import Iterable, Optional, Sequence, Type, TypeVar\n\nimport typer\nfrom typing_extensions import Annotated\n\nimport config\nfrom tools.utils import str2bool\n\n\nEnumT = TypeVar(\"EnumT\", bound=Enum)\n\n\nclass PlatformEnum(str, Enum):\n    \"\"\"Supported media platform enumeration\"\"\"\n\n    XHS = \"xhs\"\n    DOUYIN = \"dy\"\n    KUAISHOU = \"ks\"\n    BILIBILI = \"bili\"\n    WEIBO = \"wb\"\n    TIEBA = \"tieba\"\n    ZHIHU = \"zhihu\"\n\n\nclass LoginTypeEnum(str, Enum):\n    \"\"\"Login type enumeration\"\"\"\n\n    QRCODE = \"qrcode\"\n    PHONE = \"phone\"\n    COOKIE = \"cookie\"\n\n\nclass CrawlerTypeEnum(str, Enum):\n    \"\"\"Crawler type enumeration\"\"\"\n\n    SEARCH = \"search\"\n    DETAIL = \"detail\"\n    CREATOR = \"creator\"\n\n\nclass SaveDataOptionEnum(str, Enum):\n    \"\"\"Data save option enumeration\"\"\"\n\n    CSV = \"csv\"\n    DB = \"db\"\n    JSON = \"json\"\n    JSONL = \"jsonl\"\n    SQLITE = \"sqlite\"\n    MONGODB = \"mongodb\"\n    EXCEL = \"excel\"\n    POSTGRES = \"postgres\"\n\n\nclass InitDbOptionEnum(str, Enum):\n    \"\"\"Database initialization option\"\"\"\n\n    SQLITE = \"sqlite\"\n    MYSQL = \"mysql\"\n    POSTGRES = \"postgres\"\n\n\ndef _to_bool(value: bool | str) -> bool:\n    if isinstance(value, bool):\n        return value\n    return str2bool(value)\n\n\ndef _coerce_enum(\n    enum_cls: Type[EnumT],\n    value: EnumT | str,\n    default: EnumT,\n) -> EnumT:\n    \"\"\"Safely convert a raw config value to an enum member.\"\"\"\n\n    if isinstance(value, enum_cls):\n        return value\n\n    try:\n        return enum_cls(value)\n    except ValueError:\n        typer.secho(\n            f\"⚠️ Config value '{value}' is not within the supported range of {enum_cls.__name__}, falling back to default value '{default.value}'.\",\n            fg=typer.colors.YELLOW,\n        )\n        return default\n\n\ndef _normalize_argv(argv: Optional[Sequence[str]]) -> Iterable[str]:\n    if argv is None:\n        return list(sys.argv[1:])\n    return list(argv)\n\n\ndef _inject_init_db_default(args: Sequence[str]) -> list[str]:\n    \"\"\"Ensure bare --init_db defaults to sqlite for backward compatibility.\"\"\"\n\n    normalized: list[str] = []\n    i = 0\n    while i < len(args):\n        arg = args[i]\n        normalized.append(arg)\n\n        if arg == \"--init_db\":\n            next_arg = args[i + 1] if i + 1 < len(args) else None\n            if not next_arg or next_arg.startswith(\"-\"):\n                normalized.append(InitDbOptionEnum.SQLITE.value)\n        i += 1\n\n    return normalized\n\n\nasync def parse_cmd(argv: Optional[Sequence[str]] = None):\n    \"\"\"Parse command line arguments using Typer.\"\"\"\n\n    app = typer.Typer(add_completion=False)\n\n    @app.callback(invoke_without_command=True)\n    def main(\n        platform: Annotated[\n            PlatformEnum,\n            typer.Option(\n                \"--platform\",\n                help=\"Media platform selection (xhs=XiaoHongShu | dy=Douyin | ks=Kuaishou | bili=Bilibili | wb=Weibo | tieba=Baidu Tieba | zhihu=Zhihu)\",\n                rich_help_panel=\"Basic Configuration\",\n            ),\n        ] = _coerce_enum(PlatformEnum, config.PLATFORM, PlatformEnum.XHS),\n        lt: Annotated[\n            LoginTypeEnum,\n            typer.Option(\n                \"--lt\",\n                help=\"Login type (qrcode=QR Code | phone=Phone | cookie=Cookie)\",\n                rich_help_panel=\"Account Configuration\",\n            ),\n        ] = _coerce_enum(LoginTypeEnum, config.LOGIN_TYPE, LoginTypeEnum.QRCODE),\n        crawler_type: Annotated[\n            CrawlerTypeEnum,\n            typer.Option(\n                \"--type\",\n                help=\"Crawler type (search=Search | detail=Detail | creator=Creator)\",\n                rich_help_panel=\"Basic Configuration\",\n            ),\n        ] = _coerce_enum(CrawlerTypeEnum, config.CRAWLER_TYPE, CrawlerTypeEnum.SEARCH),\n        start: Annotated[\n            int,\n            typer.Option(\n                \"--start\",\n                help=\"Starting page number\",\n                rich_help_panel=\"Basic Configuration\",\n            ),\n        ] = config.START_PAGE,\n        keywords: Annotated[\n            str,\n            typer.Option(\n                \"--keywords\",\n                help=\"Enter keywords, multiple keywords separated by commas\",\n                rich_help_panel=\"Basic Configuration\",\n            ),\n        ] = config.KEYWORDS,\n        get_comment: Annotated[\n            str,\n            typer.Option(\n                \"--get_comment\",\n                help=\"Whether to crawl first-level comments, supports yes/true/t/y/1 or no/false/f/n/0\",\n                rich_help_panel=\"Comment Configuration\",\n                show_default=True,\n            ),\n        ] = str(config.ENABLE_GET_COMMENTS),\n        get_sub_comment: Annotated[\n            str,\n            typer.Option(\n                \"--get_sub_comment\",\n                help=\"Whether to crawl second-level comments, supports yes/true/t/y/1 or no/false/f/n/0\",\n                rich_help_panel=\"Comment Configuration\",\n                show_default=True,\n            ),\n        ] = str(config.ENABLE_GET_SUB_COMMENTS),\n        headless: Annotated[\n            str,\n            typer.Option(\n                \"--headless\",\n                help=\"Whether to enable headless mode (applies to both Playwright and CDP), supports yes/true/t/y/1 or no/false/f/n/0\",\n                rich_help_panel=\"Runtime Configuration\",\n                show_default=True,\n            ),\n        ] = str(config.HEADLESS),\n        save_data_option: Annotated[\n            SaveDataOptionEnum,\n            typer.Option(\n                \"--save_data_option\",\n                help=\"Data save option (csv=CSV file | db=MySQL database | json=JSON file | jsonl=JSONL file | sqlite=SQLite database | mongodb=MongoDB database | excel=Excel file | postgres=PostgreSQL database)\",\n                rich_help_panel=\"Storage Configuration\",\n            ),\n        ] = _coerce_enum(\n            SaveDataOptionEnum, config.SAVE_DATA_OPTION, SaveDataOptionEnum.JSONL\n        ),\n        init_db: Annotated[\n            Optional[InitDbOptionEnum],\n            typer.Option(\n                \"--init_db\",\n                help=\"Initialize database table structure (sqlite | mysql | postgres)\",\n                rich_help_panel=\"Storage Configuration\",\n            ),\n        ] = None,\n        cookies: Annotated[\n            str,\n            typer.Option(\n                \"--cookies\",\n                help=\"Cookie value used for Cookie login method\",\n                rich_help_panel=\"Account Configuration\",\n            ),\n        ] = config.COOKIES,\n        specified_id: Annotated[\n            str,\n            typer.Option(\n                \"--specified_id\",\n                help=\"Post/video ID list in detail mode, multiple IDs separated by commas (supports full URL or ID)\",\n                rich_help_panel=\"Basic Configuration\",\n            ),\n        ] = \"\",\n        creator_id: Annotated[\n            str,\n            typer.Option(\n                \"--creator_id\",\n                help=\"Creator ID list in creator mode, multiple IDs separated by commas (supports full URL or ID)\",\n                rich_help_panel=\"Basic Configuration\",\n            ),\n        ] = \"\",\n        max_comments_count_singlenotes: Annotated[\n            int,\n            typer.Option(\n                \"--max_comments_count_singlenotes\",\n                help=\"Maximum number of first-level comments to crawl per post/video\",\n                rich_help_panel=\"Comment Configuration\",\n            ),\n        ] = config.CRAWLER_MAX_COMMENTS_COUNT_SINGLENOTES,\n        max_concurrency_num: Annotated[\n            int,\n            typer.Option(\n                \"--max_concurrency_num\",\n                help=\"Maximum number of concurrent crawlers\",\n                rich_help_panel=\"Performance Configuration\",\n            ),\n        ] = config.MAX_CONCURRENCY_NUM,\n        save_data_path: Annotated[\n            str,\n            typer.Option(\n                \"--save_data_path\",\n                help=\"Data save path, default is empty and will save to data folder\",\n                rich_help_panel=\"Storage Configuration\",\n            ),\n        ] = config.SAVE_DATA_PATH,\n        enable_ip_proxy: Annotated[\n            str,\n            typer.Option(\n                \"--enable_ip_proxy\",\n                help=\"Whether to enable IP proxy, supports yes/true/t/y/1 or no/false/f/n/0\",\n                rich_help_panel=\"Proxy Configuration\",\n                show_default=True,\n            ),\n        ] = str(config.ENABLE_IP_PROXY),\n        ip_proxy_pool_count: Annotated[\n            int,\n            typer.Option(\n                \"--ip_proxy_pool_count\",\n                help=\"IP proxy pool count\",\n                rich_help_panel=\"Proxy Configuration\",\n            ),\n        ] = config.IP_PROXY_POOL_COUNT,\n        ip_proxy_provider_name: Annotated[\n            str,\n            typer.Option(\n                \"--ip_proxy_provider_name\",\n                help=\"IP proxy provider name (kuaidaili | wandouhttp)\",\n                rich_help_panel=\"Proxy Configuration\",\n            ),\n        ] = config.IP_PROXY_PROVIDER_NAME,\n    ) -> SimpleNamespace:\n        \"\"\"MediaCrawler 命令行入口\"\"\"\n\n        enable_comment = _to_bool(get_comment)\n        enable_sub_comment = _to_bool(get_sub_comment)\n        enable_headless = _to_bool(headless)\n        enable_ip_proxy_value = _to_bool(enable_ip_proxy)\n        init_db_value = init_db.value if init_db else None\n\n        # Parse specified_id and creator_id into lists\n        specified_id_list = [id.strip() for id in specified_id.split(\",\") if id.strip()] if specified_id else []\n        creator_id_list = [id.strip() for id in creator_id.split(\",\") if id.strip()] if creator_id else []\n\n        # override global config\n        config.PLATFORM = platform.value\n        config.LOGIN_TYPE = lt.value\n        config.CRAWLER_TYPE = crawler_type.value\n        config.START_PAGE = start\n        config.KEYWORDS = keywords\n        config.ENABLE_GET_COMMENTS = enable_comment\n        config.ENABLE_GET_SUB_COMMENTS = enable_sub_comment\n        config.HEADLESS = enable_headless\n        config.CDP_HEADLESS = enable_headless\n        config.SAVE_DATA_OPTION = save_data_option.value\n        config.COOKIES = cookies\n        config.CRAWLER_MAX_COMMENTS_COUNT_SINGLENOTES = max_comments_count_singlenotes\n        config.MAX_CONCURRENCY_NUM = max_concurrency_num\n        config.SAVE_DATA_PATH = save_data_path\n        config.ENABLE_IP_PROXY = enable_ip_proxy_value\n        config.IP_PROXY_POOL_COUNT = ip_proxy_pool_count\n        config.IP_PROXY_PROVIDER_NAME = ip_proxy_provider_name\n\n        # Set platform-specific ID lists for detail/creator mode\n        if specified_id_list:\n            if platform == PlatformEnum.XHS:\n                config.XHS_SPECIFIED_NOTE_URL_LIST = specified_id_list\n            elif platform == PlatformEnum.BILIBILI:\n                config.BILI_SPECIFIED_ID_LIST = specified_id_list\n            elif platform == PlatformEnum.DOUYIN:\n                config.DY_SPECIFIED_ID_LIST = specified_id_list\n            elif platform == PlatformEnum.WEIBO:\n                config.WEIBO_SPECIFIED_ID_LIST = specified_id_list\n            elif platform == PlatformEnum.KUAISHOU:\n                config.KS_SPECIFIED_ID_LIST = specified_id_list\n\n        if creator_id_list:\n            if platform == PlatformEnum.XHS:\n                config.XHS_CREATOR_ID_LIST = creator_id_list\n            elif platform == PlatformEnum.BILIBILI:\n                config.BILI_CREATOR_ID_LIST = creator_id_list\n            elif platform == PlatformEnum.DOUYIN:\n                config.DY_CREATOR_ID_LIST = creator_id_list\n            elif platform == PlatformEnum.WEIBO:\n                config.WEIBO_CREATOR_ID_LIST = creator_id_list\n            elif platform == PlatformEnum.KUAISHOU:\n                config.KS_CREATOR_ID_LIST = creator_id_list\n\n        return SimpleNamespace(\n            platform=config.PLATFORM,\n            lt=config.LOGIN_TYPE,\n            type=config.CRAWLER_TYPE,\n            start=config.START_PAGE,\n            keywords=config.KEYWORDS,\n            get_comment=config.ENABLE_GET_COMMENTS,\n            get_sub_comment=config.ENABLE_GET_SUB_COMMENTS,\n            headless=config.HEADLESS,\n            save_data_option=config.SAVE_DATA_OPTION,\n            init_db=init_db_value,\n            cookies=config.COOKIES,\n            specified_id=specified_id,\n            creator_id=creator_id,\n        )\n\n    command = typer.main.get_command(app)\n\n    cli_args = _normalize_argv(argv)\n    cli_args = _inject_init_db_default(cli_args)\n\n    try:\n        result = command.main(args=cli_args, standalone_mode=False)\n        if isinstance(result, int):  # help/options handled by Typer; propagate exit code\n            raise SystemExit(result)\n        return result\n    except typer.Exit as exc:  # pragma: no cover - CLI exit paths\n        raise SystemExit(exc.exit_code) from exc\n"
  },
  {
    "path": "config/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/config/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nfrom .base_config import *\nfrom .db_config import *\n"
  },
  {
    "path": "config/base_config.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/config/base_config.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# Basic configuration\nPLATFORM = \"xhs\"  # Platform, xhs | dy | ks | bili | wb | tieba | zhihu\nKEYWORDS = \"编程副业,编程兼职\"  # Keyword search configuration, separated by English commas\nLOGIN_TYPE = \"qrcode\"  # qrcode or phone or cookie\nCOOKIES = \"\"\nCRAWLER_TYPE = (\n    \"search\"  # Crawling type, search (keyword search) | detail (post details) | creator (creator homepage data)\n)\n# Whether to enable IP proxy\nENABLE_IP_PROXY = False\n\n# Number of proxy IP pools\nIP_PROXY_POOL_COUNT = 2\n\n# Proxy IP provider name\nIP_PROXY_PROVIDER_NAME = \"kuaidaili\"  # kuaidaili | wandouhttp\n\n# Setting to True will not open the browser (headless browser)\n# Setting False will open a browser\n# If Xiaohongshu keeps scanning the code to log in but fails, open the browser and manually pass the sliding verification code.\n# If Douyin keeps prompting failure, open the browser and see if mobile phone number verification appears after scanning the QR code to log in. If it does, manually go through it and try again.\nHEADLESS = False\n\n# Whether to save login status\nSAVE_LOGIN_STATE = True\n\n# ==================== CDP (Chrome DevTools Protocol) Configuration ====================\n# Whether to enable CDP mode - use the user's existing Chrome/Edge browser to crawl, providing better anti-detection capabilities\n# Once enabled, the user's Chrome/Edge browser will be automatically detected and started, and controlled through the CDP protocol.\n# This method uses the real browser environment, including the user's extensions, cookies and settings, greatly reducing the risk of detection.\nENABLE_CDP_MODE = True\n\n# CDP debug port, used to communicate with the browser\n# If the port is occupied, the system will automatically try the next available port\nCDP_DEBUG_PORT = 9222\n\n# Custom browser path (optional)\n# If it is empty, the system will automatically detect the installation path of Chrome/Edge\n# Windows example: \"C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe\"\n# macOS example: \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\"\nCUSTOM_BROWSER_PATH = \"\"\n\n# Whether to enable headless mode in CDP mode\n# NOTE: Even if set to True, some anti-detection features may not work well in headless mode\nCDP_HEADLESS = False\n\n# Browser startup timeout (seconds)\nBROWSER_LAUNCH_TIMEOUT = 60\n\n# Whether to automatically close the browser when the program ends\n# Set to False to keep the browser running for easy debugging\nAUTO_CLOSE_BROWSER = True\n\n# Data saving type option configuration, supports: csv, db, json, jsonl, sqlite, excel, postgres. It is best to save to DB, with deduplication function.\nSAVE_DATA_OPTION = \"jsonl\"  # csv or db or json or jsonl or sqlite or excel or postgres\n\n# Data saving path, if not specified by default, it will be saved to the data folder.\nSAVE_DATA_PATH = \"\"\n\n# Browser file configuration cached by the user's browser\nUSER_DATA_DIR = \"%s_user_data_dir\"  # %s will be replaced by platform name\n\n# The number of pages to start crawling starts from the first page by default\nSTART_PAGE = 1\n\n# Control the number of crawled videos/posts\nCRAWLER_MAX_NOTES_COUNT = 15\n\n# Controlling the number of concurrent crawlers\nMAX_CONCURRENCY_NUM = 1\n\n# Whether to enable crawling media mode (including image or video resources), crawling media is not enabled by default\nENABLE_GET_MEIDAS = False\n\n# Whether to enable comment crawling mode. Comment crawling is enabled by default.\nENABLE_GET_COMMENTS = True\n\n# Control the number of crawled first-level comments (single video/post)\nCRAWLER_MAX_COMMENTS_COUNT_SINGLENOTES = 10\n\n# Whether to enable the mode of crawling second-level comments. By default, crawling of second-level comments is not enabled.\n# If the old version of the project uses db, you need to refer to schema/tables.sql line 287 to add table fields.\nENABLE_GET_SUB_COMMENTS = False\n\n# word cloud related\n# Whether to enable generating comment word clouds\nENABLE_GET_WORDCLOUD = False\n# Custom words and their groups\n# Add rule: xx:yy where xx is a custom-added phrase, and yy is the group name to which the phrase xx is assigned.\nCUSTOM_WORDS = {\n    \"零几\": \"年份\",  # Recognize \"zero points\" as a whole\n    \"高频词\": \"专业术语\",  # Example custom words\n}\n\n# Deactivate (disabled) word file path\nSTOP_WORDS_FILE = \"./docs/hit_stopwords.txt\"\n\n# Chinese font file path\nFONT_PATH = \"./docs/STZHONGS.TTF\"\n\n# Crawl interval\nCRAWLER_MAX_SLEEP_SEC = 2\n\n# 是否禁用 SSL 证书验证。仅在使用企业代理、Burp Suite、mitmproxy 等会注入自签名证书的中间人代理时设为 True。\n# 警告：禁用 SSL 验证将使所有流量暴露于中间人攻击风险，请勿在生产环境中开启。\nDISABLE_SSL_VERIFY = False\n\nfrom .bilibili_config import *\nfrom .xhs_config import *\nfrom .dy_config import *\nfrom .ks_config import *\nfrom .weibo_config import *\nfrom .tieba_config import *\nfrom .zhihu_config import *\n"
  },
  {
    "path": "config/bilibili_config.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/config/bilibili_config.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n# bilili platform configuration\n\n# Control the number of videos/posts crawled per day\nMAX_NOTES_PER_DAY = 1\n\n# Specify Bilibili video URL list (supports complete URL or BV number)\n# Example:\n# - Full URL: \"https://www.bilibili.com/video/BV1dwuKzmE26/?spm_id_from=333.1387.homepage.video_card.click\"\n# - BV number: \"BV1d54y1g7db\"\nBILI_SPECIFIED_ID_LIST = [\n    \"https://www.bilibili.com/video/BV1dwuKzmE26/?spm_id_from=333.1387.homepage.video_card.click\",\n    \"BV1Sz4y1U77N\",\n    \"BV14Q4y1n7jz\",\n    # ........................\n]\n\n# Specify the URL list of Bilibili creators (supports full URL or UID)\n# Example:\n# - Full URL: \"https://space.bilibili.com/434377496?spm_id_from=333.1007.0.0\"\n# - UID: \"20813884\"\nBILI_CREATOR_ID_LIST = [\n    \"https://space.bilibili.com/434377496?spm_id_from=333.1007.0.0\",\n    \"20813884\",\n    # ........................\n]\n\n# Specify time range\nSTART_DAY = \"2024-01-01\"\nEND_DAY = \"2024-01-01\"\n\n# Search mode\nBILI_SEARCH_MODE = \"normal\"\n\n# Video definition (qn) configuration, common values:\n# 16=360p, 32=480p, 64=720p, 80=1080p, 112=1080p high bit rate, 116=1080p60, 120=4K\n# Note: Higher definition requires account/video support\nBILI_QN = 80\n\n# Whether to crawl user information\nCREATOR_MODE = True\n\n# Start crawling user information page number\nSTART_CONTACTS_PAGE = 1\n\n# Maximum number of crawled comments for a single video/post\nCRAWLER_MAX_CONTACTS_COUNT_SINGLENOTES = 100\n\n# Maximum number of crawled dynamics for a single video/post\nCRAWLER_MAX_DYNAMICS_COUNT_SINGLENOTES = 50\n"
  },
  {
    "path": "config/db_config.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/config/db_config.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nimport os\n\n# mysql config\nMYSQL_DB_PWD = os.getenv(\"MYSQL_DB_PWD\", \"123456\")\nMYSQL_DB_USER = os.getenv(\"MYSQL_DB_USER\", \"root\")\nMYSQL_DB_HOST = os.getenv(\"MYSQL_DB_HOST\", \"localhost\")\nMYSQL_DB_PORT = os.getenv(\"MYSQL_DB_PORT\", 3306)\nMYSQL_DB_NAME = os.getenv(\"MYSQL_DB_NAME\", \"media_crawler\")\n\nmysql_db_config = {\n    \"user\": MYSQL_DB_USER,\n    \"password\": MYSQL_DB_PWD,\n    \"host\": MYSQL_DB_HOST,\n    \"port\": MYSQL_DB_PORT,\n    \"db_name\": MYSQL_DB_NAME,\n}\n\n\n# redis config\nREDIS_DB_HOST = os.getenv(\"REDIS_DB_HOST\", \"127.0.0.1\")  # your redis host\nREDIS_DB_PWD = os.getenv(\"REDIS_DB_PWD\", \"123456\")  # your redis password\nREDIS_DB_PORT = os.getenv(\"REDIS_DB_PORT\", 6379)  # your redis port\nREDIS_DB_NUM = os.getenv(\"REDIS_DB_NUM\", 0)  # your redis db num\n\n# cache type\nCACHE_TYPE_REDIS = \"redis\"\nCACHE_TYPE_MEMORY = \"memory\"\n\n# sqlite config\nSQLITE_DB_PATH = os.path.join(os.path.dirname(os.path.dirname(__file__)), \"database\", \"sqlite_tables.db\")\n\nsqlite_db_config = {\n    \"db_path\": SQLITE_DB_PATH\n}\n\n# mongodb config\nMONGODB_HOST = os.getenv(\"MONGODB_HOST\", \"localhost\")\nMONGODB_PORT = os.getenv(\"MONGODB_PORT\", 27017)\nMONGODB_USER = os.getenv(\"MONGODB_USER\", \"\")\nMONGODB_PWD = os.getenv(\"MONGODB_PWD\", \"\")\nMONGODB_DB_NAME = os.getenv(\"MONGODB_DB_NAME\", \"media_crawler\")\n\nmongodb_config = {\n    \"host\": MONGODB_HOST,\n    \"port\": int(MONGODB_PORT),\n    \"user\": MONGODB_USER,\n    \"password\": MONGODB_PWD,\n    \"db_name\": MONGODB_DB_NAME,\n}\n\n# postgres config\nPOSTGRES_DB_PWD = os.getenv(\"POSTGRES_DB_PWD\", \"123456\")\nPOSTGRES_DB_USER = os.getenv(\"POSTGRES_DB_USER\", \"postgres\")\nPOSTGRES_DB_HOST = os.getenv(\"POSTGRES_DB_HOST\", \"localhost\")\nPOSTGRES_DB_PORT = os.getenv(\"POSTGRES_DB_PORT\", 5432)\nPOSTGRES_DB_NAME = os.getenv(\"POSTGRES_DB_NAME\", \"media_crawler\")\n\npostgres_db_config = {\n    \"user\": POSTGRES_DB_USER,\n    \"password\": POSTGRES_DB_PWD,\n    \"host\": POSTGRES_DB_HOST,\n    \"port\": POSTGRES_DB_PORT,\n    \"db_name\": POSTGRES_DB_NAME,\n}\n"
  },
  {
    "path": "config/dy_config.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/config/dy_config.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# Douyin platform configuration\nPUBLISH_TIME_TYPE = 0\n\n# Specify DY video URL list (supports multiple formats)\n# Supported formats:\n# 1. Full video URL: \"https://www.douyin.com/video/7525538910311632128\"\n# 2. URL with modal_id: \"https://www.douyin.com/user/xxx?modal_id=7525538910311632128\"\n# 3. The search page has modal_id: \"https://www.douyin.com/root/search/python?modal_id=7525538910311632128\"\n# 4. Short link: \"https://v.douyin.com/drIPtQ_WPWY/\"\n# 5. Pure video ID: \"7280854932641664319\"\nDY_SPECIFIED_ID_LIST = [\n    \"https://www.douyin.com/video/7525538910311632128\",\n    \"https://v.douyin.com/drIPtQ_WPWY/\",\n    \"https://www.douyin.com/user/MS4wLjABAAAATJPY7LAlaa5X-c8uNdWkvz0jUGgpw4eeXIwu_8BhvqE?from_tab_name=main&modal_id=7525538910311632128\",\n    \"7202432992642387233\",\n    # ........................\n]\n\n# Specify DY creator URL list (supports full URL or sec_user_id)\n# Supported formats:\n# 1. Complete creator homepage URL: \"https://www.douyin.com/user/MS4wLjABAAAATJPY7LAlaa5X-c8uNdWkvz0jUGgpw4eeXIwu_8BhvqE?from_tab_name=main\"\n# 2. sec_user_id: \"MS4wLjABAAAATJPY7LAlaa5X-c8uNdWkvz0jUGgpw4eeXIwu_8BhvqE\"\nDY_CREATOR_ID_LIST = [\n    \"https://www.douyin.com/user/MS4wLjABAAAATJPY7LAlaa5X-c8uNdWkvz0jUGgpw4eeXIwu_8BhvqE?from_tab_name=main\",\n    \"MS4wLjABAAAATJPY7LAlaa5X-c8uNdWkvz0jUGgpw4eeXIwu_8BhvqE\"\n    # ........................\n]\n"
  },
  {
    "path": "config/ks_config.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/config/ks_config.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# Kuaishou platform configuration\n\n# Specify Kuaishou video URL list (supports complete URL or pure ID)\n# Supported formats:\n# 1. Full video URL: \"https://www.kuaishou.com/short-video/3x3zxz4mjrsc8ke?authorId=3x84qugg4ch9zhs&streamSource=search\"\n# 2. Pure video ID: \"3xf8enb8dbj6uig\"\nKS_SPECIFIED_ID_LIST = [\n    \"https://www.kuaishou.com/short-video/3x3zxz4mjrsc8ke?authorId=3x84qugg4ch9zhs&streamSource=search&area=searchxxnull&searchKey=python\",\n    \"3xf8enb8dbj6uig\",\n    # ........................\n]\n\n# Specify Kuaishou creator URL list (supports full URL or pure ID)\n# Supported formats:\n# 1. Creator homepage URL: \"https://www.kuaishou.com/profile/3x84qugg4ch9zhs\"\n# 2. Pure user_id: \"3x4sm73aye7jq7i\"\nKS_CREATOR_ID_LIST = [\n    \"https://www.kuaishou.com/profile/3x84qugg4ch9zhs\",\n    \"3x4sm73aye7jq7i\",\n    # ........................\n]\n"
  },
  {
    "path": "config/tieba_config.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/config/tieba_config.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# Tieba platform configuration\n\n# Specify Tieba ID list\nTIEBA_SPECIFIED_ID_LIST = []\n\n# Specify a list of Tieba names\nTIEBA_NAME_LIST = [\n    # \"Tomb Robbery Notes\"\n]\n\n# Specify Tieba user URL list\nTIEBA_CREATOR_URL_LIST = [\n    \"https://tieba.baidu.com/home/main/?id=tb.1.7f139e2e.6CyEwxu3VJruH_-QqpCi6g&fr=frs\",\n    # ........................\n]\n"
  },
  {
    "path": "config/weibo_config.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/config/weibo_config.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# Weibo platform configuration\n\n# Search type, the specific enumeration value is in media_platform/weibo/field.py\nWEIBO_SEARCH_TYPE = \"default\"\n\n# Specify Weibo ID list\nWEIBO_SPECIFIED_ID_LIST = [\n    \"4982041758140155\",\n    # ........................\n]\n\n# Specify Weibo user ID list\nWEIBO_CREATOR_ID_LIST = [\n    \"5756404150\",\n    # ........................\n]\n\n# Whether to enable the function of crawling the full text of Weibo. It is enabled by default.\n# If turned on, it will increase the probability of being risk controlled, which is equivalent to a keyword search request that will traverse all posts and request the post details again.\nENABLE_WEIBO_FULL_TEXT = True\n"
  },
  {
    "path": "config/xhs_config.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/config/xhs_config.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# Xiaohongshu platform configuration\n\n# Sorting method, the specific enumeration value is in media_platform/xhs/field.py\nSORT_TYPE = \"popularity_descending\"\n\n# Specify the note URL list, which must carry the xsec_token parameter\nXHS_SPECIFIED_NOTE_URL_LIST = [\n    \"https://www.xiaohongshu.com/explore/64b95d01000000000c034587?xsec_token=AB0EFqJvINCkj6xOCKCQgfNNh8GdnBC_6XecG4QOddo3Q=&xsec_source=pc_cfeed\"\n    # ........................\n]\n\n# Specify the creator URL list, which needs to carry xsec_token and xsec_source parameters.\n\nXHS_CREATOR_ID_LIST = [\n    \"https://www.xiaohongshu.com/user/profile/5f58bd990000000001003753?xsec_token=ABYVg1evluJZZzpMX-VWzchxQ1qSNVW3r-jOEnKqMcgZw=&xsec_source=pc_search\"\n    # ........................\n]\n"
  },
  {
    "path": "config/zhihu_config.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/config/zhihu_config.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# Zhihu platform configuration\n\n# Specify Zhihu user URL list\nZHIHU_CREATOR_URL_LIST = [\n    \"https://www.zhihu.com/people/yd1234567\",\n    # ........................\n]\n\n# Specify Zhihu ID list\nZHIHU_SPECIFIED_ID_LIST = [\n    \"https://www.zhihu.com/question/826896610/answer/4885821440\",  # answer\n    \"https://zhuanlan.zhihu.com/p/673461588\",  # article\n    \"https://www.zhihu.com/zvideo/1539542068422144000\",  # video\n]\n"
  },
  {
    "path": "constant/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/constant/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n"
  },
  {
    "path": "constant/baidu_tieba.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/constant/baidu_tieba.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n\nTIEBA_URL = 'https://tieba.baidu.com'\n"
  },
  {
    "path": "constant/zhihu.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/constant/zhihu.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\nZHIHU_URL = \"https://www.zhihu.com\"\nZHIHU_ZHUANLAN_URL = \"https://zhuanlan.zhihu.com\"\n\nANSWER_NAME = \"answer\"\nARTICLE_NAME = \"article\"\nVIDEO_NAME = \"zvideo\"\n"
  },
  {
    "path": "database/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/database/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n"
  },
  {
    "path": "database/db.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/database/db.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# persist-1<persist1@126.com>\n# Reason: Refactored db.py into a module, removed direct execution entry point, fixed relative import issues.\n# Side effects: None\n# Rollback strategy: Restore this file.\nimport asyncio\nimport sys\nfrom pathlib import Path\n\n# Add project root to sys.path\nproject_root = Path(__file__).resolve().parents[1]\nif str(project_root) not in sys.path:\n    sys.path.append(str(project_root))\n\nfrom tools import utils\nfrom database.db_session import create_tables\n\nasync def init_table_schema(db_type: str):\n    \"\"\"\n    Initializes the database table schema.\n    This will create tables based on the ORM models.\n    Args:\n        db_type: The type of database, 'sqlite' or 'mysql'.\n    \"\"\"\n    utils.logger.info(f\"[init_table_schema] begin init {db_type} table schema ...\")\n    await create_tables(db_type)\n    utils.logger.info(f\"[init_table_schema] {db_type} table schema init successful\")\n\nasync def init_db(db_type: str = None):\n    await init_table_schema(db_type)\n\nasync def close():\n    \"\"\"\n    Placeholder for closing database connections if needed in the future.\n    \"\"\"\n    pass\n"
  },
  {
    "path": "database/db_session.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/database/db_session.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\nfrom sqlalchemy import text\nfrom sqlalchemy.ext.asyncio import create_async_engine, AsyncSession\nfrom sqlalchemy.orm import sessionmaker\nfrom contextlib import asynccontextmanager\nfrom .models import Base\nimport config\nfrom config.db_config import mysql_db_config, sqlite_db_config, postgres_db_config\n\n# Keep a cache of engines\n_engines = {}\n\n\nasync def create_database_if_not_exists(db_type: str):\n    if db_type == \"mysql\" or db_type == \"db\":\n        # Connect to the server without a database\n        server_url = f\"mysql+asyncmy://{mysql_db_config['user']}:{mysql_db_config['password']}@{mysql_db_config['host']}:{mysql_db_config['port']}\"\n        engine = create_async_engine(server_url, echo=False)\n        async with engine.connect() as conn:\n            await conn.execute(text(f\"CREATE DATABASE IF NOT EXISTS {mysql_db_config['db_name']}\"))\n        await engine.dispose()\n    elif db_type == \"postgres\":\n        # Connect to the default 'postgres' database\n        server_url = f\"postgresql+asyncpg://{postgres_db_config['user']}:{postgres_db_config['password']}@{postgres_db_config['host']}:{postgres_db_config['port']}/postgres\"\n        print(f\"[init_db] Connecting to Postgres: host={postgres_db_config['host']}, port={postgres_db_config['port']}, user={postgres_db_config['user']}, dbname=postgres\")\n        # Isolation level AUTOCOMMIT is required for CREATE DATABASE\n        engine = create_async_engine(server_url, echo=False, isolation_level=\"AUTOCOMMIT\")\n        async with engine.connect() as conn:\n            # Check if database exists\n            result = await conn.execute(text(f\"SELECT 1 FROM pg_database WHERE datname = '{postgres_db_config['db_name']}'\"))\n            if not result.scalar():\n                await conn.execute(text(f\"CREATE DATABASE {postgres_db_config['db_name']}\"))\n        await engine.dispose()\n\n\ndef get_async_engine(db_type: str = None):\n    if db_type is None:\n        db_type = config.SAVE_DATA_OPTION\n\n    if db_type in _engines:\n        return _engines[db_type]\n\n    if db_type in [\"json\", \"jsonl\", \"csv\"]:\n        return None\n\n    if db_type == \"sqlite\":\n        db_url = f\"sqlite+aiosqlite:///{sqlite_db_config['db_path']}\"\n    elif db_type == \"mysql\" or db_type == \"db\":\n        db_url = f\"mysql+asyncmy://{mysql_db_config['user']}:{mysql_db_config['password']}@{mysql_db_config['host']}:{mysql_db_config['port']}/{mysql_db_config['db_name']}\"\n    elif db_type == \"postgres\":\n        db_url = f\"postgresql+asyncpg://{postgres_db_config['user']}:{postgres_db_config['password']}@{postgres_db_config['host']}:{postgres_db_config['port']}/{postgres_db_config['db_name']}\"\n    else:\n        raise ValueError(f\"Unsupported database type: {db_type}\")\n\n    engine = create_async_engine(db_url, echo=False)\n    _engines[db_type] = engine\n    return engine\n\n\nasync def create_tables(db_type: str = None):\n    if db_type is None:\n        db_type = config.SAVE_DATA_OPTION\n    await create_database_if_not_exists(db_type)\n    engine = get_async_engine(db_type)\n    if engine:\n        async with engine.begin() as conn:\n            await conn.run_sync(Base.metadata.create_all)\n\n\n@asynccontextmanager\nasync def get_session() -> AsyncSession:\n    engine = get_async_engine(config.SAVE_DATA_OPTION)\n    if not engine:\n        yield None\n        return\n    AsyncSessionFactory = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)\n    session = AsyncSessionFactory()\n    try:\n        yield session\n        await session.commit()\n    except Exception as e:\n        await session.rollback()\n        raise e\n    finally:\n        await session.close()\n"
  },
  {
    "path": "database/models.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/database/models.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\nfrom sqlalchemy import create_engine, Column, Integer, Text, String, BigInteger\nfrom sqlalchemy.ext.declarative import declarative_base\nfrom sqlalchemy.orm import sessionmaker\n\nBase = declarative_base()\n\nclass BilibiliVideo(Base):\n    __tablename__ = 'bilibili_video'\n    id = Column(Integer, primary_key=True, comment='主键ID')\n    video_id = Column(BigInteger, nullable=False, index=True, unique=True, comment='视频ID')\n    video_url = Column(Text, nullable=False, comment='视频URL')\n    user_id = Column(BigInteger, index=True, comment='用户ID')\n    nickname = Column(Text, comment='用户昵称')\n    avatar = Column(Text, comment='用户头像')\n    liked_count = Column(Integer, comment='点赞数')\n    add_ts = Column(BigInteger, comment='添加时间戳')\n    last_modify_ts = Column(BigInteger, comment='最后修改时间戳')\n    video_type = Column(Text, comment='视频类型')\n    title = Column(Text, comment='视频标题')\n    desc = Column(Text, comment='视频描述')\n    create_time = Column(BigInteger, index=True, comment='创建时间戳')\n    disliked_count = Column(Text, comment='点踩数')\n    video_play_count = Column(Text, comment='播放数')\n    video_favorite_count = Column(Text, comment='收藏数')\n    video_share_count = Column(Text, comment='分享数')\n    video_coin_count = Column(Text, comment='硬币数')\n    video_danmaku = Column(Text, comment='弹幕数')\n    video_comment = Column(Text, comment='评论数')\n    video_cover_url = Column(Text, comment='视频封面URL')\n    source_keyword = Column(Text, default='', comment='来源关键词')\n\nclass BilibiliVideoComment(Base):\n    __tablename__ = 'bilibili_video_comment'\n    id = Column(Integer, primary_key=True, comment='主键ID')\n    user_id = Column(String(255), comment='用户ID')\n    nickname = Column(Text, comment='用户昵称')\n    sex = Column(Text, comment='性别')\n    sign = Column(Text, comment='签名')\n    avatar = Column(Text, comment='头像')\n    add_ts = Column(BigInteger, comment='添加时间戳')\n    last_modify_ts = Column(BigInteger, comment='最后修改时间戳')\n    comment_id = Column(BigInteger, index=True, comment='评论ID')\n    video_id = Column(BigInteger, index=True, comment='视频ID')\n    content = Column(Text, comment='评论内容')\n    create_time = Column(BigInteger, comment='创建时间戳')\n    sub_comment_count = Column(Text, comment='子评论数')\n    parent_comment_id = Column(String(255), comment='父评论ID')\n    like_count = Column(Text, default='0', comment='点赞数')\n\nclass BilibiliUpInfo(Base):\n    __tablename__ = 'bilibili_up_info'\n    id = Column(Integer, primary_key=True, comment='主键ID')\n    user_id = Column(BigInteger, index=True, comment='用户ID')\n    nickname = Column(Text, comment='用户昵称')\n    sex = Column(Text, comment='性别')\n    sign = Column(Text, comment='签名')\n    avatar = Column(Text, comment='头像')\n    add_ts = Column(BigInteger, comment='添加时间戳')\n    last_modify_ts = Column(BigInteger, comment='最后修改时间戳')\n    total_fans = Column(Integer, comment='总粉丝数')\n    total_liked = Column(Integer, comment='总获赞数')\n    user_rank = Column(Integer, comment='用户等级')\n    is_official = Column(Integer, comment='是否官方认证')\n\nclass BilibiliContactInfo(Base):\n    __tablename__ = 'bilibili_contact_info'\n    id = Column(Integer, primary_key=True, comment='主键ID')\n    up_id = Column(BigInteger, index=True, comment='UP主ID')\n    fan_id = Column(BigInteger, index=True, comment='粉丝ID')\n    up_name = Column(Text, comment='UP主名称')\n    fan_name = Column(Text, comment='粉丝名称')\n    up_sign = Column(Text, comment='UP主签名')\n    fan_sign = Column(Text, comment='粉丝签名')\n    up_avatar = Column(Text, comment='UP主头像')\n    fan_avatar = Column(Text, comment='粉丝头像')\n    add_ts = Column(BigInteger, comment='添加时间戳')\n    last_modify_ts = Column(BigInteger, comment='最后修改时间戳')\n\nclass BilibiliUpDynamic(Base):\n    __tablename__ = 'bilibili_up_dynamic'\n    id = Column(Integer, primary_key=True, comment='主键ID')\n    dynamic_id = Column(BigInteger, index=True, comment='动态ID')\n    user_id = Column(String(255), comment='用户ID')\n    user_name = Column(Text, comment='用户名称')\n    text = Column(Text, comment='动态内容')\n    type = Column(Text, comment='动态类型')\n    pub_ts = Column(BigInteger, comment='发布时间戳')\n    total_comments = Column(Integer, comment='总评论数')\n    total_forwards = Column(Integer, comment='总转发数')\n    total_liked = Column(Integer, comment='总点赞数')\n    add_ts = Column(BigInteger, comment='添加时间戳')\n    last_modify_ts = Column(BigInteger, comment='最后修改时间戳')\n\nclass DouyinAweme(Base):\n    __tablename__ = 'douyin_aweme'\n    id = Column(Integer, primary_key=True, comment='主键ID')\n    user_id = Column(String(255), comment='用户ID')\n    sec_uid = Column(String(255), comment='安全用户ID')\n    short_user_id = Column(String(255), comment='短用户ID')\n    user_unique_id = Column(String(255), comment='用户唯一ID')\n    nickname = Column(Text, comment='用户昵称')\n    avatar = Column(Text, comment='用户头像')\n    user_signature = Column(Text, comment='用户签名')\n    ip_location = Column(Text, comment='IP地址位置')\n    add_ts = Column(BigInteger, comment='添加时间戳')\n    last_modify_ts = Column(BigInteger, comment='最后修改时间戳')\n    aweme_id = Column(BigInteger, index=True, comment='作品ID')\n    aweme_type = Column(Text, comment='作品类型')\n    title = Column(Text, comment='作品标题')\n    desc = Column(Text, comment='作品描述')\n    create_time = Column(BigInteger, index=True, comment='创建时间戳')\n    liked_count = Column(Text, comment='点赞数')\n    comment_count = Column(Text, comment='评论数')\n    share_count = Column(Text, comment='分享数')\n    collected_count = Column(Text, comment='收藏数')\n    aweme_url = Column(Text, comment='作品URL')\n    cover_url = Column(Text, comment='封面URL')\n    video_download_url = Column(Text, comment='视频下载URL')\n    music_download_url = Column(Text, comment='音乐下载URL')\n    note_download_url = Column(Text, comment='笔记下载URL')\n    source_keyword = Column(Text, default='', comment='来源关键词')\n\nclass DouyinAwemeComment(Base):\n    __tablename__ = 'douyin_aweme_comment'\n    id = Column(Integer, primary_key=True, comment='主键ID')\n    user_id = Column(String(255), comment='用户ID')\n    sec_uid = Column(String(255), comment='安全用户ID')\n    short_user_id = Column(String(255), comment='短用户ID')\n    user_unique_id = Column(String(255), comment='用户唯一ID')\n    nickname = Column(Text, comment='用户昵称')\n    avatar = Column(Text, comment='用户头像')\n    user_signature = Column(Text, comment='用户签名')\n    ip_location = Column(Text, comment='IP地址位置')\n    add_ts = Column(BigInteger, comment='添加时间戳')\n    last_modify_ts = Column(BigInteger, comment='最后修改时间戳')\n    comment_id = Column(BigInteger, index=True, comment='评论ID')\n    aweme_id = Column(BigInteger, index=True, comment='作品ID')\n    content = Column(Text, comment='评论内容')\n    create_time = Column(BigInteger, comment='创建时间戳')\n    sub_comment_count = Column(Text, comment='子评论数')\n    parent_comment_id = Column(String(255), comment='父评论ID')\n    like_count = Column(Text, default='0', comment='点赞数')\n    pictures = Column(Text, default='', comment='图片')\n\nclass DyCreator(Base):\n    __tablename__ = 'dy_creator'\n    id = Column(Integer, primary_key=True, comment='主键ID')\n    user_id = Column(String(255), comment='用户ID')\n    nickname = Column(Text, comment='用户昵称')\n    avatar = Column(Text, comment='用户头像')\n    ip_location = Column(Text, comment='IP地址位置')\n    add_ts = Column(BigInteger, comment='添加时间戳')\n    last_modify_ts = Column(BigInteger, comment='最后修改时间戳')\n    desc = Column(Text, comment='描述')\n    gender = Column(Text, comment='性别')\n    follows = Column(Text, comment='关注数')\n    fans = Column(Text, comment='粉丝数')\n    interaction = Column(Text, comment='互动数')\n    videos_count = Column(String(255), comment='视频数量')\n\nclass KuaishouVideo(Base):\n    __tablename__ = 'kuaishou_video'\n    id = Column(Integer, primary_key=True, comment='主键ID')\n    user_id = Column(String(64), comment='用户ID')\n    nickname = Column(Text, comment='用户昵称')\n    avatar = Column(Text, comment='用户头像')\n    add_ts = Column(BigInteger, comment='添加时间戳')\n    last_modify_ts = Column(BigInteger, comment='最后修改时间戳')\n    video_id = Column(String(255), index=True, comment='视频ID')\n    video_type = Column(Text, comment='视频类型')\n    title = Column(Text, comment='视频标题')\n    desc = Column(Text, comment='视频描述')\n    create_time = Column(BigInteger, index=True, comment='创建时间戳')\n    liked_count = Column(Text, comment='点赞数')\n    viewd_count = Column(Text, comment='观看数')\n    video_url = Column(Text, comment='视频URL')\n    video_cover_url = Column(Text, comment='视频封面URL')\n    video_play_url = Column(Text, comment='视频播放URL')\n    source_keyword = Column(Text, default='', comment='来源关键词')\n\nclass KuaishouVideoComment(Base):\n    __tablename__ = 'kuaishou_video_comment'\n    id = Column(Integer, primary_key=True, comment='主键ID')\n    user_id = Column(Text, comment='用户ID')\n    nickname = Column(Text, comment='用户昵称')\n    avatar = Column(Text, comment='用户头像')\n    add_ts = Column(BigInteger, comment='添加时间戳')\n    last_modify_ts = Column(BigInteger, comment='最后修改时间戳')\n    comment_id = Column(BigInteger, index=True, comment='评论ID')\n    video_id = Column(String(255), index=True, comment='视频ID')\n    content = Column(Text, comment='评论内容')\n    create_time = Column(BigInteger, comment='创建时间戳')\n    sub_comment_count = Column(Text, comment='子评论数')\n\nclass WeiboNote(Base):\n    __tablename__ = 'weibo_note'\n    id = Column(Integer, primary_key=True, comment='主键ID')\n    user_id = Column(String(255), comment='用户ID')\n    nickname = Column(Text, comment='用户昵称')\n    avatar = Column(Text, comment='用户头像')\n    gender = Column(Text, comment='性别')\n    profile_url = Column(Text, comment='个人主页URL')\n    ip_location = Column(Text, default='', comment='IP地址位置')\n    add_ts = Column(BigInteger, comment='添加时间戳')\n    last_modify_ts = Column(BigInteger, comment='最后修改时间戳')\n    note_id = Column(BigInteger, index=True, comment='笔记ID')\n    content = Column(Text, comment='笔记内容')\n    create_time = Column(BigInteger, index=True, comment='创建时间戳')\n    create_date_time = Column(String(255), index=True, comment='创建日期时间')\n    liked_count = Column(Text, comment='点赞数')\n    comments_count = Column(Text, comment='评论数')\n    shared_count = Column(Text, comment='分享数')\n    note_url = Column(Text, comment='笔记URL')\n    source_keyword = Column(Text, default='', comment='来源关键词')\n\nclass WeiboNoteComment(Base):\n    __tablename__ = 'weibo_note_comment'\n    id = Column(Integer, primary_key=True, comment='主键ID')\n    user_id = Column(String(255), comment='用户ID')\n    nickname = Column(Text, comment='用户昵称')\n    avatar = Column(Text, comment='用户头像')\n    gender = Column(Text, comment='性别')\n    profile_url = Column(Text, comment='个人主页URL')\n    ip_location = Column(Text, default='', comment='IP地址位置')\n    add_ts = Column(BigInteger, comment='添加时间戳')\n    last_modify_ts = Column(BigInteger, comment='最后修改时间戳')\n    comment_id = Column(BigInteger, index=True, comment='评论ID')\n    note_id = Column(BigInteger, index=True, comment='笔记ID')\n    content = Column(Text, comment='评论内容')\n    create_time = Column(BigInteger, comment='创建时间戳')\n    create_date_time = Column(String(255), index=True, comment='创建日期时间')\n    comment_like_count = Column(Text, comment='评论点赞数')\n    sub_comment_count = Column(Text, comment='子评论数')\n    parent_comment_id = Column(String(255), comment='父评论ID')\n\nclass WeiboCreator(Base):\n    __tablename__ = 'weibo_creator'\n    id = Column(Integer, primary_key=True, comment='主键ID')\n    user_id = Column(String(255), comment='用户ID')\n    nickname = Column(Text, comment='用户昵称')\n    avatar = Column(Text, comment='用户头像')\n    ip_location = Column(Text, comment='IP地址位置')\n    add_ts = Column(BigInteger, comment='添加时间戳')\n    last_modify_ts = Column(BigInteger, comment='最后修改时间戳')\n    desc = Column(Text, comment='描述')\n    gender = Column(Text, comment='性别')\n    follows = Column(Text, comment='关注数')\n    fans = Column(Text, comment='粉丝数')\n    tag_list = Column(Text, comment='标签列表')\n\nclass XhsCreator(Base):\n    __tablename__ = 'xhs_creator'\n    id = Column(Integer, primary_key=True, comment='主键ID')\n    user_id = Column(String(255), comment='用户ID')\n    nickname = Column(Text, comment='用户昵称')\n    avatar = Column(Text, comment='用户头像')\n    ip_location = Column(Text, comment='IP地址位置')\n    add_ts = Column(BigInteger, comment='添加时间戳')\n    last_modify_ts = Column(BigInteger, comment='最后修改时间戳')\n    desc = Column(Text, comment='描述')\n    gender = Column(Text, comment='性别')\n    follows = Column(Text, comment='关注数')\n    fans = Column(Text, comment='粉丝数')\n    interaction = Column(Text, comment='互动数')\n    tag_list = Column(Text, comment='标签列表')\n\nclass XhsNote(Base):\n    __tablename__ = 'xhs_note'\n    id = Column(Integer, primary_key=True, comment='主键ID')\n    user_id = Column(String(255), comment='用户ID')\n    nickname = Column(Text, comment='用户昵称')\n    avatar = Column(Text, comment='用户头像')\n    ip_location = Column(Text, comment='IP地址位置')\n    add_ts = Column(BigInteger, comment='添加时间戳')\n    last_modify_ts = Column(BigInteger, comment='最后修改时间戳')\n    note_id = Column(String(255), index=True, comment='笔记ID')\n    type = Column(Text, comment='笔记类型')\n    title = Column(Text, comment='笔记标题')\n    desc = Column(Text, comment='笔记描述')\n    video_url = Column(Text, comment='视频URL')\n    time = Column(BigInteger, index=True, comment='时间戳')\n    last_update_time = Column(BigInteger, comment='最后更新时间戳')\n    liked_count = Column(Text, comment='点赞数')\n    collected_count = Column(Text, comment='收藏数')\n    comment_count = Column(Text, comment='评论数')\n    share_count = Column(Text, comment='分享数')\n    image_list = Column(Text, comment='图片列表')\n    tag_list = Column(Text, comment='标签列表')\n    note_url = Column(Text, comment='笔记URL')\n    source_keyword = Column(Text, default='', comment='来源关键词')\n    xsec_token = Column(Text, comment='Xsec Token')\n\nclass XhsNoteComment(Base):\n    __tablename__ = 'xhs_note_comment'\n    id = Column(Integer, primary_key=True, comment='主键ID')\n    user_id = Column(String(255), comment='用户ID')\n    nickname = Column(Text, comment='用户昵称')\n    avatar = Column(Text, comment='用户头像')\n    ip_location = Column(Text, comment='IP地址位置')\n    add_ts = Column(BigInteger, comment='添加时间戳')\n    last_modify_ts = Column(BigInteger, comment='最后修改时间戳')\n    comment_id = Column(String(255), index=True, comment='评论ID')\n    create_time = Column(BigInteger, index=True, comment='创建时间戳')\n    note_id = Column(String(255), comment='笔记ID')\n    content = Column(Text, comment='评论内容')\n    sub_comment_count = Column(Integer, comment='子评论数')\n    pictures = Column(Text, comment='图片')\n    parent_comment_id = Column(String(255), comment='父评论ID')\n    like_count = Column(Text, comment='点赞数')\n\nclass TiebaNote(Base):\n    __tablename__ = 'tieba_note'\n    id = Column(Integer, primary_key=True, comment='主键ID')\n    note_id = Column(String(644), index=True, comment='笔记ID')\n    title = Column(Text, comment='笔记标题')\n    desc = Column(Text, comment='笔记描述')\n    note_url = Column(Text, comment='笔记URL')\n    publish_time = Column(String(255), index=True, comment='发布时间')\n    user_link = Column(Text, default='', comment='用户链接')\n    user_nickname = Column(Text, default='', comment='用户昵称')\n    user_avatar = Column(Text, default='', comment='用户头像')\n    tieba_id = Column(String(255), default='', comment='贴吧ID')\n    tieba_name = Column(Text, comment='贴吧名称')\n    tieba_link = Column(Text, comment='贴吧链接')\n    total_replay_num = Column(Integer, default=0, comment='总回复数')\n    total_replay_page = Column(Integer, default=0, comment='总回复页数')\n    ip_location = Column(Text, default='', comment='IP地址位置')\n    add_ts = Column(BigInteger, comment='添加时间戳')\n    last_modify_ts = Column(BigInteger, comment='最后修改时间戳')\n    source_keyword = Column(Text, default='', comment='来源关键词')\n\nclass TiebaComment(Base):\n    __tablename__ = 'tieba_comment'\n    id = Column(Integer, primary_key=True, comment='主键ID')\n    comment_id = Column(String(255), index=True, comment='评论ID')\n    parent_comment_id = Column(String(255), default='', comment='父评论ID')\n    content = Column(Text, comment='评论内容')\n    user_link = Column(Text, default='', comment='用户链接')\n    user_nickname = Column(Text, default='', comment='用户昵称')\n    user_avatar = Column(Text, default='', comment='用户头像')\n    tieba_id = Column(String(255), default='', comment='贴吧ID')\n    tieba_name = Column(Text, comment='贴吧名称')\n    tieba_link = Column(Text, comment='贴吧链接')\n    publish_time = Column(String(255), index=True, comment='发布时间')\n    ip_location = Column(Text, default='', comment='IP地址位置')\n    sub_comment_count = Column(Integer, default=0, comment='子评论数')\n    note_id = Column(String(255), index=True, comment='笔记ID')\n    note_url = Column(Text, comment='笔记URL')\n    add_ts = Column(BigInteger, comment='添加时间戳')\n    last_modify_ts = Column(BigInteger, comment='最后修改时间戳')\n\nclass TiebaCreator(Base):\n    __tablename__ = 'tieba_creator'\n    id = Column(Integer, primary_key=True, comment='主键ID')\n    user_id = Column(String(64), comment='用户ID')\n    user_name = Column(Text, comment='用户名')\n    nickname = Column(Text, comment='用户昵称')\n    avatar = Column(Text, comment='用户头像')\n    ip_location = Column(Text, comment='IP地址位置')\n    add_ts = Column(BigInteger, comment='添加时间戳')\n    last_modify_ts = Column(BigInteger, comment='最后修改时间戳')\n    gender = Column(Text, comment='性别')\n    follows = Column(Text, comment='关注数')\n    fans = Column(Text, comment='粉丝数')\n    registration_duration = Column(Text, comment='注册时长')\n\nclass ZhihuContent(Base):\n    __tablename__ = 'zhihu_content'\n    id = Column(Integer, primary_key=True, comment='主键ID')\n    content_id = Column(String(64), index=True, comment='内容ID')\n    content_type = Column(Text, comment='内容类型')\n    content_text = Column(Text, comment='内容文本')\n    content_url = Column(Text, comment='内容URL')\n    question_id = Column(String(255), comment='问题ID')\n    title = Column(Text, comment='标题')\n    desc = Column(Text, comment='描述')\n    created_time = Column(String(32), index=True, comment='创建时间')\n    updated_time = Column(Text, comment='更新时间')\n    voteup_count = Column(Integer, default=0, comment='赞同数')\n    comment_count = Column(Integer, default=0, comment='评论数')\n    source_keyword = Column(Text, comment='来源关键词')\n    user_id = Column(String(255), comment='用户ID')\n    user_link = Column(Text, comment='用户链接')\n    user_nickname = Column(Text, comment='用户昵称')\n    user_avatar = Column(Text, comment='用户头像')\n    user_url_token = Column(Text, comment='用户URL Token')\n    add_ts = Column(BigInteger, comment='添加时间戳')\n    last_modify_ts = Column(BigInteger, comment='最后修改时间戳')\n\n    # persist-1<persist1@126.com>\n    # Reason: Fixed ORM model definition error, ensuring consistency with database table structure.\n    # Side effects: None\n    # Rollback strategy: Restore this line\n\nclass ZhihuComment(Base):\n    __tablename__ = 'zhihu_comment'\n    id = Column(Integer, primary_key=True, comment='主键ID')\n    comment_id = Column(String(64), index=True, comment='评论ID')\n    parent_comment_id = Column(String(64), comment='父评论ID')\n    content = Column(Text, comment='评论内容')\n    publish_time = Column(String(32), index=True, comment='发布时间')\n    ip_location = Column(Text, comment='IP地址位置')\n    sub_comment_count = Column(Integer, default=0, comment='子评论数')\n    like_count = Column(Integer, default=0, comment='点赞数')\n    dislike_count = Column(Integer, default=0, comment='点踩数')\n    content_id = Column(String(64), index=True, comment='内容ID')\n    content_type = Column(Text, comment='内容类型')\n    user_id = Column(String(64), comment='用户ID')\n    user_link = Column(Text, comment='用户链接')\n    user_nickname = Column(Text, comment='用户昵称')\n    user_avatar = Column(Text, comment='用户头像')\n    add_ts = Column(BigInteger, comment='添加时间戳')\n    last_modify_ts = Column(BigInteger, comment='最后修改时间戳')\n\nclass ZhihuCreator(Base):\n    __tablename__ = 'zhihu_creator'\n    id = Column(Integer, primary_key=True, comment='主键ID')\n    user_id = Column(String(64), unique=True, index=True, comment='用户ID')\n    user_link = Column(Text, comment='用户链接')\n    user_nickname = Column(Text, comment='用户昵称')\n    user_avatar = Column(Text, comment='用户头像')\n    url_token = Column(Text, comment='URL Token')\n    gender = Column(Text, comment='性别')\n    ip_location = Column(Text, comment='IP地址位置')\n    follows = Column(Integer, default=0, comment='关注数')\n    fans = Column(Integer, default=0, comment='粉丝数')\n    anwser_count = Column(Integer, default=0, comment='回答数')\n    video_count = Column(Integer, default=0, comment='视频数')\n    question_count = Column(Integer, default=0, comment='问题数')\n    article_count = Column(Integer, default=0, comment='文章数')\n    column_count = Column(Integer, default=0, comment='专栏数')\n    get_voteup_count = Column(Integer, default=0, comment='获赞数')\n    add_ts = Column(BigInteger, comment='添加时间戳')\n    last_modify_ts = Column(BigInteger, comment='最后修改时间戳')\n"
  },
  {
    "path": "database/mongodb_store_base.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/database/mongodb_store_base.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\"\"\"MongoDB storage base class: Provides connection management and common storage methods\"\"\"\nimport asyncio\nfrom typing import Dict, List, Optional\nfrom motor.motor_asyncio import AsyncIOMotorClient, AsyncIOMotorDatabase, AsyncIOMotorCollection\nfrom config import db_config\nfrom tools import utils\n\n\nclass MongoDBConnection:\n    \"\"\"MongoDB connection management (singleton pattern)\"\"\"\n    _instance = None\n    _client: Optional[AsyncIOMotorClient] = None\n    _db: Optional[AsyncIOMotorDatabase] = None\n    _lock = asyncio.Lock()\n\n    def __new__(cls):\n        if cls._instance is None:\n            cls._instance = super(MongoDBConnection, cls).__new__(cls)\n        return cls._instance\n\n    async def get_client(self) -> AsyncIOMotorClient:\n        \"\"\"Get client\"\"\"\n        if self._client is None:\n            async with self._lock:\n                if self._client is None:\n                    await self._connect()\n        return self._client\n\n    async def get_db(self) -> AsyncIOMotorDatabase:\n        \"\"\"Get database\"\"\"\n        if self._db is None:\n            async with self._lock:\n                if self._db is None:\n                    await self._connect()\n        return self._db\n\n    async def _connect(self):\n        \"\"\"Establish connection\"\"\"\n        try:\n            mongo_config = db_config.mongodb_config\n            host = mongo_config[\"host\"]\n            port = mongo_config[\"port\"]\n            user = mongo_config[\"user\"]\n            password = mongo_config[\"password\"]\n            db_name = mongo_config[\"db_name\"]\n\n            # Build connection URL (with/without authentication)\n            if user and password:\n                connection_url = f\"mongodb://{user}:{password}@{host}:{port}/\"\n            else:\n                connection_url = f\"mongodb://{host}:{port}/\"\n\n            self._client = AsyncIOMotorClient(connection_url, serverSelectionTimeoutMS=5000)\n            await self._client.server_info()  # Test connection\n            self._db = self._client[db_name]\n            utils.logger.info(f\"[MongoDBConnection] Connected to {host}:{port}/{db_name}\")\n        except Exception as e:\n            utils.logger.error(f\"[MongoDBConnection] Connection failed: {e}\")\n            raise\n\n    async def close(self):\n        \"\"\"Close connection\"\"\"\n        if self._client is not None:\n            self._client.close()\n            self._client = None\n            self._db = None\n            utils.logger.info(\"[MongoDBConnection] Connection closed\")\n\n\nclass MongoDBStoreBase:\n    \"\"\"MongoDB storage base class: Provides common CRUD operations\"\"\"\n\n    def __init__(self, collection_prefix: str):\n        \"\"\"Initialize storage base class\n        Args:\n            collection_prefix: Platform prefix (xhs/douyin/bilibili, etc.)\n        \"\"\"\n        self.collection_prefix = collection_prefix\n        self._connection = MongoDBConnection()\n\n    async def get_collection(self, collection_suffix: str) -> AsyncIOMotorCollection:\n        \"\"\"Get collection: {prefix}_{suffix}\"\"\"\n        db = await self._connection.get_db()\n        collection_name = f\"{self.collection_prefix}_{collection_suffix}\"\n        return db[collection_name]\n\n    async def save_or_update(self, collection_suffix: str, query: Dict, data: Dict) -> bool:\n        \"\"\"Save or update data (upsert)\"\"\"\n        try:\n            collection = await self.get_collection(collection_suffix)\n            await collection.update_one(query, {\"$set\": data}, upsert=True)\n            return True\n        except Exception as e:\n            utils.logger.error(f\"[MongoDBStoreBase] Save failed ({self.collection_prefix}_{collection_suffix}): {e}\")\n            return False\n\n    async def find_one(self, collection_suffix: str, query: Dict) -> Optional[Dict]:\n        \"\"\"Query a single record\"\"\"\n        try:\n            collection = await self.get_collection(collection_suffix)\n            return await collection.find_one(query)\n        except Exception as e:\n            utils.logger.error(f\"[MongoDBStoreBase] Find one failed ({self.collection_prefix}_{collection_suffix}): {e}\")\n            return None\n\n    async def find_many(self, collection_suffix: str, query: Dict, limit: int = 0) -> List[Dict]:\n        \"\"\"Query multiple records (limit=0 means no limit)\"\"\"\n        try:\n            collection = await self.get_collection(collection_suffix)\n            cursor = collection.find(query)\n            if limit > 0:\n                cursor = cursor.limit(limit)\n            return await cursor.to_list(length=None)\n        except Exception as e:\n            utils.logger.error(f\"[MongoDBStoreBase] Find many failed ({self.collection_prefix}_{collection_suffix}): {e}\")\n            return []\n\n    async def create_index(self, collection_suffix: str, keys: List[tuple], unique: bool = False):\n        \"\"\"Create index: keys=[(\"field\", 1)]\"\"\"\n        try:\n            collection = await self.get_collection(collection_suffix)\n            await collection.create_index(keys, unique=unique)\n            utils.logger.info(f\"[MongoDBStoreBase] Index created on {self.collection_prefix}_{collection_suffix}\")\n        except Exception as e:\n            utils.logger.error(f\"[MongoDBStoreBase] Create index failed: {e}\")\n"
  },
  {
    "path": "docs/.vitepress/config.mjs",
    "content": "import {defineConfig} from 'vitepress'\nimport {withMermaid} from 'vitepress-plugin-mermaid'\n\n// https://vitepress.dev/reference/site-config\nexport default withMermaid(defineConfig({\n    title: \"MediaCrawler自媒体爬虫\",\n    description: \"小红书爬虫，抖音爬虫， 快手爬虫， B站爬虫， 微博爬虫，百度贴吧爬虫，知乎爬虫...。  \",\n    lastUpdated: true,\n    base: '/MediaCrawler/',\n    head: [\n        [\n            'script',\n            {async: '', src: 'https://www.googletagmanager.com/gtag/js?id=G-5TK7GF3KK1'}\n        ],\n        [\n            'script',\n            {},\n            `window.dataLayer = window.dataLayer || [];\n      function gtag(){dataLayer.push(arguments);}\n      gtag('js', new Date());\n      gtag('config', 'G-5TK7GF3KK1');`\n        ]\n    ],\n    themeConfig: {\n        editLink: {\n            pattern: 'https://github.com/NanmiCoder/MediaCrawler/tree/main/docs/:path'\n        },\n        search: {\n            provider: 'local'\n        },\n        // https://vitepress.dev/reference/default-theme-config\n        nav: [\n            {text: '首页', link: '/'},\n            {text: '联系我', link: '/作者介绍'},\n            {text: '支持我', link: '/知识付费介绍'},\n        ],\n\n        sidebar: [\n            {\n                text: '作者介绍',\n                link: '/作者介绍',\n            },\n            {\n                text: 'MediaCrawler使用文档',\n                items: [\n                    {text: '基本使用', link: '/'},\n                    {text: '项目架构文档', link: '/项目架构文档'},\n                    {text: '常见问题汇总', link: '/常见问题'},\n                    {text: 'IP代理使用', link: '/代理使用'},\n                    {text: '词云图使用', link: '/词云图使用配置'},\n                    {text: '项目目录结构', link: '/项目代码结构'},\n                    {text: '手机号登录说明', link: '/手机号登录说明'},\n                ]\n            },\n            {\n                text: '知识付费',\n                items: [\n                    {text: '知识付费介绍', link: '/知识付费介绍'},\n                    {text: 'MediaCrawlerPro订阅', link: '/mediacrawlerpro订阅'},\n                    {\n                        text: 'MediaCrawler源码剖析课',\n                        link: 'https://relakkes.feishu.cn/wiki/JUgBwdhIeiSbAwkFCLkciHdAnhh'\n                    },\n                    {text: '开发者咨询服务', link: '/开发者咨询'},\n                ]\n            },\n            {\n                text: 'MediaCrawler项目交流群',\n                link: '/微信交流群',\n            },\n            {\n                text: '爬虫入门教程分享',\n                items: [\n                    {text: \"我写的爬虫入门教程\", link: 'https://github.com/NanmiCoder/CrawlerTutorial'}\n                ]\n            },\n            {\n                text: 'MediaCrawler捐赠名单',\n                items: [\n                    {text: \"捐赠名单\", link: '/捐赠名单'}\n                ]\n            },\n\n        ],\n\n        socialLinks: [\n            {icon: 'github', link: 'https://github.com/NanmiCoder/MediaCrawler'}\n        ]\n    }\n}))\n"
  },
  {
    "path": "docs/.vitepress/theme/DynamicAds.vue",
    "content": "<!-- 在vitepress右侧的目录导航中插入动态广告组件-->\n\n<script setup>\nimport { ref, onMounted, onUnmounted } from 'vue'\n\nconst ads = ref([])\nconst currentAdIndex = ref(0)\nlet intervalId = null\n\nconst fetchAds = async () => {\n  return [\n    {\n      id: 1,\n      imageUrl: 'https://github.com/NanmiCoder/MediaCrawler/raw/main/docs/static/images/MediaCrawlerPro.jpg',\n      landingUrl: 'https://github.com/MediaCrawlerPro',\n      text: '👏欢迎大家来订阅MediaCrawlerPro源代码'\n    }\n  ]\n}\n\nconst nextAd = () => {\n  currentAdIndex.value = (currentAdIndex.value + 1) % ads.value.length\n}\n\nonMounted(async () => {\n  ads.value = await fetchAds()\n  intervalId = setInterval(nextAd, 3000)\n})\n\nonUnmounted(() => {\n  if (intervalId) clearInterval(intervalId)\n})\n</script>\n\n<template>\n  <div class=\"vp-ad-carousel\">\n    <template v-if=\"ads.length > 0\">\n      <div class=\"ad-content\">\n        <a :href=\"ads[currentAdIndex].landingUrl\" target=\"_blank\" rel=\"noopener noreferrer\">\n          <img :src=\"ads[currentAdIndex].imageUrl\" :alt=\"ads[currentAdIndex].text\" class=\"ad-image\">\n          <p class=\"ad-text\">{{ ads[currentAdIndex].text }}</p>\n        </a>\n      </div>\n    </template>\n    <p v-else class=\"loading\">Loading ads...</p>\n  </div>\n</template>\n\n<style scoped>\n.vp-ad-carousel {\n  margin-top: 1rem;\n  padding: 1rem;\n  background-color: var(--vp-c-bg-soft);\n  border-radius: 8px;\n  font-size: 0.875rem;\n  line-height: 1.5;\n}\n\n.ad-content {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n\n.ad-image {\n  max-width: 100%;\n  width: 280px;\n  height: auto;\n  margin-bottom: 0.5rem;\n}\n\n.ad-text {\n  text-align: center;\n  color: var(--vp-c-text-1);\n}\n\n.loading {\n  text-align: center;\n  color: var(--vp-c-text-2);\n}\n\na {\n  text-decoration: none;\n  color: inherit;\n}\n</style>\n"
  },
  {
    "path": "docs/.vitepress/theme/MyLayout.vue",
    "content": "<!--.vitepress/theme/MyLayout.vue-->\n<script setup>\nimport DefaultTheme from 'vitepress/theme'\nimport DynamicAds from './DynamicAds.vue'\nconst { Layout } = DefaultTheme\n</script>\n\n<template>\n  <Layout>\n    <template #aside-bottom>\n      <DynamicAds />\n    </template>\n  </Layout>\n</template>"
  },
  {
    "path": "docs/.vitepress/theme/custom.css",
    "content": "/* .vitepress/theme/custom.css */\n/**\n * Component: Sidebar\n * -------------------------------------------------------------------------- */\n\n:root {\n  --vp-sidebar-width: 285px;\n  --vp-sidebar-bg-color: var(--vp-c-bg-alt);\n  --vp-aside-width: 300px;\n}\n"
  },
  {
    "path": "docs/.vitepress/theme/index.js",
    "content": "// .vitepress/theme/index.js\nimport DefaultTheme from 'vitepress/theme'\nimport MyLayout from './MyLayout.vue'\n\nexport default {\n  extends: DefaultTheme,\n  // 使用注入插槽的包装组件覆盖 Layout\n  Layout: MyLayout\n}"
  },
  {
    "path": "docs/CDP模式使用指南.md",
    "content": "# CDP模式使用指南\n\n## 概述\n\nCDP（Chrome DevTools Protocol）模式是一种高级的反检测爬虫技术，通过控制用户现有的Chrome/Edge浏览器来进行网页爬取。与传统的Playwright自动化相比，CDP模式具有以下优势：\n\n### 🎯 主要优势\n\n1. **真实浏览器环境**: 使用用户实际安装的浏览器，包含所有扩展、插件和个人设置\n2. **更好的反检测能力**: 浏览器指纹更加真实，难以被网站检测为自动化工具\n3. **保留用户状态**: 自动继承用户的登录状态、Cookie和浏览历史\n4. **扩展支持**: 可以利用用户安装的广告拦截器、代理扩展等工具\n5. **更自然的行为**: 浏览器行为模式更接近真实用户\n\n## 快速开始\n\n### 1. 启用CDP模式\n\n在 `config/base_config.py` 中设置：\n\n```python\n# 启用CDP模式\nENABLE_CDP_MODE = True\n\n# CDP调试端口（可选，默认9222）\nCDP_DEBUG_PORT = 9222\n\n# 是否在无头模式下运行（建议设为False以获得最佳反检测效果）\nCDP_HEADLESS = False\n\n# 程序结束时是否自动关闭浏览器\nAUTO_CLOSE_BROWSER = True\n```\n\n### 2. 运行测试\n\n```bash\n# 运行CDP功能测试\npython examples/cdp_example.py\n\n# 运行小红书爬虫（CDP模式）\npython main.py\n```\n\n## 配置选项详解\n\n### 基础配置\n\n| 配置项 | 类型 | 默认值 | 说明 |\n|--------|------|--------|------|\n| `ENABLE_CDP_MODE` | bool | False | 是否启用CDP模式 |\n| `CDP_DEBUG_PORT` | int | 9222 | CDP调试端口 |\n| `CDP_HEADLESS` | bool | False | CDP模式下的无头模式 |\n| `AUTO_CLOSE_BROWSER` | bool | True | 程序结束时是否关闭浏览器 |\n\n### 高级配置\n\n| 配置项 | 类型 | 默认值 | 说明 |\n|--------|------|--------|------|\n| `CUSTOM_BROWSER_PATH` | str | \"\" | 自定义浏览器路径 |\n| `BROWSER_LAUNCH_TIMEOUT` | int | 30 | 浏览器启动超时时间（秒） |\n\n### 自定义浏览器路径\n\n如果系统自动检测失败，可以手动指定浏览器路径：\n\n```python\n# Windows示例\nCUSTOM_BROWSER_PATH = r\"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe\"\n\n# macOS示例  \nCUSTOM_BROWSER_PATH = \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\"\n\n# Linux示例\nCUSTOM_BROWSER_PATH = \"/usr/bin/google-chrome\"\n```\n\n## 支持的浏览器\n\n### Windows\n- Google Chrome (稳定版、Beta、Dev、Canary)\n- Microsoft Edge (稳定版、Beta、Dev、Canary)\n\n### macOS\n- Google Chrome (稳定版、Beta、Dev、Canary)\n- Microsoft Edge (稳定版、Beta、Dev、Canary)\n\n### Linux\n- Google Chrome / Chromium\n- Microsoft Edge\n\n## 使用示例\n\n### 基本使用\n\n```python\nimport asyncio\nfrom playwright.async_api import async_playwright\nfrom tools.cdp_browser import CDPBrowserManager\n\nasync def main():\n    cdp_manager = CDPBrowserManager()\n    \n    async with async_playwright() as playwright:\n        # 启动CDP浏览器\n        browser_context = await cdp_manager.launch_and_connect(\n            playwright=playwright,\n            user_agent=\"自定义User-Agent\",\n            headless=False\n        )\n        \n        # 创建页面并访问网站\n        page = await browser_context.new_page()\n        await page.goto(\"https://example.com\")\n        \n        # 执行爬取操作...\n        \n        # 清理资源\n        await cdp_manager.cleanup()\n\nasyncio.run(main())\n```\n\n### 在爬虫中使用\n\nCDP模式已集成到所有平台爬虫中，只需启用配置即可：\n\n```python\n# 在config/base_config.py中\nENABLE_CDP_MODE = True\n\n# 然后正常运行爬虫\npython main.py\n```\n\n## 故障排除\n\n### 常见问题\n\n#### 1. 浏览器检测失败\n**错误**: `未找到可用的浏览器`\n\n**解决方案**:\n- 确保已安装Chrome或Edge浏览器\n- 检查浏览器是否在标准路径下\n- 使用`CUSTOM_BROWSER_PATH`指定浏览器路径\n\n#### 2. 端口被占用\n**错误**: `无法找到可用的端口`\n\n**解决方案**:\n- 关闭其他使用调试端口的程序\n- 修改`CDP_DEBUG_PORT`为其他端口\n- 系统会自动尝试下一个可用端口\n\n#### 3. 浏览器启动超时\n**错误**: `浏览器在30秒内未能启动`\n\n**解决方案**:\n- 增加`BROWSER_LAUNCH_TIMEOUT`值\n- 检查系统资源是否充足\n- 尝试关闭其他占用资源的程序\n\n#### 4. CDP连接失败\n**错误**: `CDP连接失败`\n\n**解决方案**:\n- 检查防火墙设置\n- 确保localhost访问正常\n- 尝试重启浏览器\n\n### 调试技巧\n\n#### 1. 启用详细日志\n```python\nimport logging\nlogging.basicConfig(level=logging.DEBUG)\n```\n\n#### 2. 手动测试CDP连接\n```bash\n# 手动启动Chrome\nchrome --remote-debugging-port=9222\n\n# 访问调试页面\ncurl http://localhost:9222/json\n```\n\n#### 3. 检查浏览器进程\n```bash\n# Windows\ntasklist | findstr chrome\n\n# macOS/Linux  \nps aux | grep chrome\n```\n\n## 最佳实践\n\n### 1. 反检测优化\n- 保持`CDP_HEADLESS = False`以获得最佳反检测效果\n- 使用真实的User-Agent字符串\n- 避免过于频繁的请求\n\n### 2. 性能优化\n- 合理设置`AUTO_CLOSE_BROWSER`\n- 复用浏览器实例而不是频繁重启\n- 监控内存使用情况\n\n### 3. 安全考虑\n- 不要在生产环境中保存敏感Cookie\n- 定期清理浏览器数据\n- 注意用户隐私保护\n\n### 4. 兼容性\n- 测试不同浏览器版本的兼容性\n- 准备回退方案（标准Playwright模式）\n- 监控目标网站的反爬策略变化\n\n## 技术原理\n\nCDP模式的工作原理：\n\n1. **浏览器检测**: 自动扫描系统中的Chrome/Edge安装路径\n2. **进程启动**: 使用`--remote-debugging-port`参数启动浏览器\n3. **CDP连接**: 通过WebSocket连接到浏览器的调试接口\n4. **Playwright集成**: 使用`connectOverCDP`方法接管浏览器控制\n5. **上下文管理**: 创建或复用浏览器上下文进行操作\n\n这种方式绕过了传统WebDriver的检测机制，提供了更加隐蔽的自动化能力。\n\n## 更新日志\n\n### v1.0.0\n- 初始版本发布\n- 支持Windows和macOS的Chrome/Edge检测\n- 集成到所有平台爬虫\n- 提供完整的配置选项和错误处理\n\n## 贡献\n\n欢迎提交Issue和Pull Request来改进CDP模式功能。\n\n## 许可证\n\n本功能遵循项目的整体许可证条款，仅供学习和研究使用。\n"
  },
  {
    "path": "docs/data_storage_guide.md",
    "content": "# 数据保存指南 / Data Storage Guide\n\n\n### 💾 数据保存\n\nMediaCrawler 支持多种数据存储方式，您可以根据需求选择最适合的方案：\n\n#### 存储方式\n\n- **CSV 文件**：支持保存到 CSV 中（`data/` 目录下）\n- **JSON 文件**：支持保存到 JSON 中（`data/` 目录下）\n- **JSONL 文件**：支持保存到 JSONL 中（`data/` 目录下）— 默认格式，每行一个 JSON 对象，追加写入性能好\n- **Excel 文件**：支持保存到格式化的 Excel 文件（`data/` 目录下）✨ 新功能\n  - 多工作表支持（内容、评论、创作者）\n  - 专业格式化（标题样式、自动列宽、边框）\n  - 易于分析和分享\n- **数据库存储**\n  - 使用参数 `--init_db` 进行数据库初始化（使用`--init_db`时不需要携带其他optional）\n  - **SQLite 数据库**：轻量级数据库，无需服务器，适合个人使用（推荐）\n    1. 初始化：`--init_db sqlite`\n    2. 数据存储：`--save_data_option sqlite`\n  - **MySQL 数据库**：支持关系型数据库 MySQL 中保存（需要提前创建数据库）\n    1. 初始化：`--init_db mysql`\n    2. 数据存储：`--save_data_option db`（db 参数为兼容历史更新保留）\n  - **PostgreSQL 数据库**：支持高级关系型数据库 PostgreSQL 中保存（推荐生产环境使用）\n    1. 初始化：`--init_db postgres`\n    2. 数据存储：`--save_data_option postgres`\n\n#### 使用示例\n\n```shell\n# 使用 Excel 存储数据（推荐用于数据分析）✨ 新功能\nuv run main.py --platform xhs --lt qrcode --type search --save_data_option excel\n\n# 初始化 SQLite 数据库\nuv run main.py --init_db sqlite\n# 使用 SQLite 存储数据\nuv run main.py --platform xhs --lt qrcode --type search --save_data_option sqlite\n```\n\n```shell\n# 初始化 MySQL 数据库\nuv run main.py --init_db mysql\n# 使用 MySQL 存储数据（为适配历史更新，db参数进行沿用）\nuv run main.py --platform xhs --lt qrcode --type search --save_data_option db\n```\n\n```shell\n# 初始化 PostgreSQL 数据库\nuv run main.py --init_db postgres\n# 使用 PostgreSQL 存储数据\nuv run main.py --platform xhs --lt qrcode --type search --save_data_option postgres\n```\n\n```shell\n# 使用 CSV 存储数据\nuv run main.py --platform xhs --lt qrcode --type search --save_data_option csv\n\n# 使用 JSON 存储数据\nuv run main.py --platform xhs --lt qrcode --type search --save_data_option json\n\n# 使用 JSONL 存储数据（默认格式，无需指定）\nuv run main.py --platform xhs --lt qrcode --type search --save_data_option jsonl\n```\n\n#### 详细文档\n\n- **Excel 导出详细指南**：查看 [Excel 导出指南](excel_export_guide.md)\n- **数据库配置**：参考 [常见问题](常见问题.md)\n\n---\n"
  },
  {
    "path": "docs/excel_export_guide.md",
    "content": "# Excel Export Guide\n\n## Overview\n\nMediaCrawler now supports exporting crawled data to formatted Excel files (.xlsx) with professional styling and multiple sheets for contents, comments, and creators.\n\n## Features\n\n- **Multi-sheet workbooks**: Separate sheets for Contents, Comments, and Creators\n- **Professional formatting**: \n  - Styled headers with blue background and white text\n  - Auto-adjusted column widths\n  - Cell borders and text wrapping\n  - Clean, readable layout\n- **Smart export**: Empty sheets are automatically removed\n- **Organized storage**: Files saved to `data/{platform}/` directory with timestamps\n\n## Installation\n\nExcel export requires the `openpyxl` library:\n\n```bash\n# Using uv (recommended)\nuv sync\n\n# Or using pip\npip install openpyxl\n```\n\n## Usage\n\n### Basic Usage\n\n1. **Configure Excel export** in `config/base_config.py`:\n\n```python\nSAVE_DATA_OPTION = \"excel\"  # Change from jsonl/json/csv/db to excel\n```\n\n2. **Run the crawler**:\n\n```bash\n# Xiaohongshu example\nuv run main.py --platform xhs --lt qrcode --type search\n\n# Douyin example\nuv run main.py --platform dy --lt qrcode --type search\n\n# Bilibili example\nuv run main.py --platform bili --lt qrcode --type search\n```\n\n3. **Find your Excel file** in `data/{platform}/` directory:\n   - Filename format: `{platform}_{crawler_type}_{timestamp}.xlsx`\n   - Example: `xhs_search_20250128_143025.xlsx`\n\n### Command Line Examples\n\n```bash\n# Search by keywords and export to Excel\nuv run main.py --platform xhs --lt qrcode --type search --save_data_option excel\n\n# Crawl specific posts and export to Excel\nuv run main.py --platform xhs --lt qrcode --type detail --save_data_option excel\n\n# Crawl creator profile and export to Excel\nuv run main.py --platform xhs --lt qrcode --type creator --save_data_option excel\n```\n\n## Excel File Structure\n\n### Contents Sheet\nContains post/video information:\n- `note_id`: Unique post identifier\n- `title`: Post title\n- `desc`: Post description\n- `user_id`: Author user ID\n- `nickname`: Author nickname\n- `liked_count`: Number of likes\n- `comment_count`: Number of comments\n- `share_count`: Number of shares\n- `ip_location`: IP location\n- `image_list`: Comma-separated image URLs\n- `tag_list`: Comma-separated tags\n- `note_url`: Direct link to post\n- And more platform-specific fields...\n\n### Comments Sheet\nContains comment information:\n- `comment_id`: Unique comment identifier\n- `note_id`: Associated post ID\n- `content`: Comment text\n- `user_id`: Commenter user ID\n- `nickname`: Commenter nickname\n- `like_count`: Comment likes\n- `create_time`: Comment timestamp\n- `ip_location`: Commenter location\n- `sub_comment_count`: Number of replies\n- And more...\n\n### Creators Sheet\nContains creator/author information:\n- `user_id`: Unique user identifier\n- `nickname`: Display name\n- `gender`: Gender\n- `avatar`: Profile picture URL\n- `desc`: Bio/description\n- `fans`: Follower count\n- `follows`: Following count\n- `interaction`: Total interactions\n- And more...\n\n## Advantages Over Other Formats\n\n### vs CSV\n- ✅ Multiple sheets in one file\n- ✅ Professional formatting\n- ✅ Better handling of special characters\n- ✅ Auto-adjusted column widths\n- ✅ No encoding issues\n\n### vs JSON\n- ✅ Human-readable tabular format\n- ✅ Easy to open in Excel/Google Sheets\n- ✅ Better for data analysis\n- ✅ Easier to share with non-technical users\n\n### vs Database\n- ✅ No database setup required\n- ✅ Portable single-file format\n- ✅ Easy to share and archive\n- ✅ Works offline\n\n## Tips & Best Practices\n\n1. **Large datasets**: For very large crawls (>10,000 rows), consider using database storage instead for better performance\n\n2. **Data analysis**: Excel files work great with:\n   - Microsoft Excel\n   - Google Sheets\n   - LibreOffice Calc\n   - Python pandas: `pd.read_excel('file.xlsx')`\n\n3. **Combining data**: You can merge multiple Excel files using:\n   ```python\n   import pandas as pd\n   df1 = pd.read_excel('file1.xlsx', sheet_name='Contents')\n   df2 = pd.read_excel('file2.xlsx', sheet_name='Contents')\n   combined = pd.concat([df1, df2])\n   combined.to_excel('combined.xlsx', index=False)\n   ```\n\n4. **File size**: Excel files are typically 2-3x larger than CSV but smaller than JSON\n\n## Troubleshooting\n\n### \"openpyxl not installed\" error\n\n```bash\n# Install openpyxl\nuv add openpyxl\n# or\npip install openpyxl\n```\n\n### Excel file not created\n\nCheck that:\n1. `SAVE_DATA_OPTION = \"excel\"` in config\n2. Crawler successfully collected data\n3. No errors in console output\n4. `data/{platform}/` directory exists\n\n### Empty Excel file\n\nThis happens when:\n- No data was crawled (check keywords/IDs)\n- Login failed (check login status)\n- Platform blocked requests (check IP/rate limits)\n\n## Example Output\n\nAfter running a successful crawl, you'll see:\n\n```\n[ExcelStoreBase] Initialized Excel export to: data/xhs/xhs_search_20250128_143025.xlsx\n[ExcelStoreBase] Stored content to Excel: 7123456789\n[ExcelStoreBase] Stored comment to Excel: comment_123\n...\n[Main] Excel file saved successfully\n```\n\nYour Excel file will have:\n- Professional blue headers\n- Clean borders\n- Wrapped text for long content\n- Auto-sized columns\n- Separate organized sheets\n\n## Advanced Usage\n\n### Programmatic Access\n\n```python\nfrom store.excel_store_base import ExcelStoreBase\n\n# Create store\nstore = ExcelStoreBase(platform=\"xhs\", crawler_type=\"search\")\n\n# Store data\nawait store.store_content({\n    \"note_id\": \"123\",\n    \"title\": \"Test Post\",\n    \"liked_count\": 100\n})\n\n# Save to file\nstore.flush()\n```\n\n### Custom Formatting\n\nYou can extend `ExcelStoreBase` to customize formatting:\n\n```python\nfrom store.excel_store_base import ExcelStoreBase\n\nclass CustomExcelStore(ExcelStoreBase):\n    def _apply_header_style(self, sheet, row_num=1):\n        # Custom header styling\n        super()._apply_header_style(sheet, row_num)\n        # Add your customizations here\n```\n\n## Support\n\nFor issues or questions:\n- Check [常见问题](常见问题.md)\n- Open an issue on GitHub\n- Join the WeChat discussion group\n\n---\n\n**Note**: Excel export is designed for learning and research purposes. Please respect platform terms of service and rate limits.\n"
  },
  {
    "path": "docs/hit_stopwords.txt",
    "content": "\\n\n———\n》），\n）÷（１－\n”，\n）、\n＝（\n:\n→\n℃ \n&\n*\n一一\n~~~~\n’\n. \n『\n.一\n./\n-- \n』\n＝″\n【\n［＊］\n｝＞\n［⑤］］\n［①Ｄ］\nｃ］\nｎｇ昉\n＊\n//\n［\n］\n［②ｅ］\n［②ｇ］\n＝｛\n}\n，也 \n‘\nＡ\n［①⑥］\n［②Ｂ］ \n［①ａ］\n［④ａ］\n［①③］\n［③ｈ］\n③］\n１． \n－－ \n［②ｂ］\n’‘ \n××× \n［①⑧］\n０：２ \n＝［\n［⑤ｂ］\n［②ｃ］ \n［④ｂ］\n［②③］\n［③ａ］\n［④ｃ］\n［①⑤］\n［①⑦］\n［①ｇ］\n∈［ \n［①⑨］\n［①④］\n［①ｃ］\n［②ｆ］\n［②⑧］\n［②①］\n［①Ｃ］\n［③ｃ］\n［③ｇ］\n［②⑤］\n［②②］\n一.\n［①ｈ］\n.数\n［］\n［①Ｂ］\n数/\n［①ｉ］\n［③ｅ］\n［①①］\n［④ｄ］\n［④ｅ］\n［③ｂ］\n［⑤ａ］\n［①Ａ］\n［②⑧］\n［②⑦］\n［①ｄ］\n［②ｊ］\n〕〔\n］［\n://\n′∈\n［②④\n［⑤ｅ］\n１２％\nｂ］\n...\n...................\n…………………………………………………③\nＺＸＦＩＴＬ\n［③Ｆ］\n」\n［①ｏ］\n］∧′＝［ \n∪φ∈\n′｜\n｛－\n②ｃ\n｝\n［③①］\nＲ．Ｌ．\n［①Ｅ］\nΨ\n－［＊］－\n↑\n.日 \n［②ｄ］\n［②\n［②⑦］\n［②②］\n［③ｅ］\n［①ｉ］\n［①Ｂ］\n［①ｈ］\n［①ｄ］\n［①ｇ］\n［①②］\n［②ａ］\nｆ］\n［⑩］\nａ］\n［①ｅ］\n［②ｈ］\n［②⑥］\n［③ｄ］\n［②⑩］\nｅ］\n〉\n】\n元／吨\n［②⑩］\n２．３％\n５：０  \n［①］\n::\n［②］\n［③］\n［④］\n［⑤］\n［⑥］\n［⑦］\n［⑧］\n［⑨］ \n……\n——\n?\n、\n。\n“\n”\n《\n》\n！\n，\n：\n；\n？\n．\n,\n．\n'\n? \n·\n———\n──\n? \n—\n<\n>\n（\n）\n〔\n〕\n[\n]\n(\n)\n-\n+\n～\n×\n／\n/\n①\n②\n③\n④\n⑤\n⑥\n⑦\n⑧\n⑨\n⑩\nⅢ\nВ\n\"\n;\n#\n@\nγ\nμ\nφ\nφ．\n× \nΔ\n■\n▲\nsub\nexp \nsup\nsub\nLex \n＃\n％\n＆\n＇\n＋\n＋ξ\n＋＋\n－\n－β\n＜\n＜±\n＜Δ\n＜λ\n＜φ\n＜＜\n=\n＝\n＝☆\n＝－\n＞\n＞λ\n＿\n～±\n～＋\n［⑤ｆ］\n［⑤ｄ］\n［②ｉ］\n≈ \n［②Ｇ］\n［①ｆ］\nＬＩ\n㈧ \n［－\n......\n〉\n［③⑩］\n第二\n一番\n一直\n一个\n一些\n许多\n种\n有的是\n也就是说\n末##末\n啊\n阿\n哎\n哎呀\n哎哟\n唉\n俺\n俺们\n按\n按照\n吧\n吧哒\n把\n罢了\n被\n本\n本着\n比\n比方\n比如\n鄙人\n彼\n彼此\n边\n别\n别的\n别说\n并\n并且\n不比\n不成\n不单\n不但\n不独\n不管\n不光\n不过\n不仅\n不拘\n不论\n不怕\n不然\n不如\n不特\n不惟\n不问\n不只\n朝\n朝着\n趁\n趁着\n乘\n冲\n除\n除此之外\n除非\n除了\n此\n此间\n此外\n从\n从而\n打\n待\n但\n但是\n当\n当着\n到\n得\n的\n的话\n等\n等等\n地\n第\n叮咚\n对\n对于\n多\n多少\n而\n而况\n而且\n而是\n而外\n而言\n而已\n尔后\n反过来\n反过来说\n反之\n非但\n非徒\n否则\n嘎\n嘎登\n该\n赶\n个\n各\n各个\n各位\n各种\n各自\n给\n根据\n跟\n故\n故此\n固然\n关于\n管\n归\n果然\n果真\n过\n哈\n哈哈\n呵\n和\n何\n何处\n何况\n何时\n嘿\n哼\n哼唷\n呼哧\n乎\n哗\n还是\n还有\n换句话说\n换言之\n或\n或是\n或者\n极了\n及\n及其\n及至\n即\n即便\n即或\n即令\n即若\n即使\n几\n几时\n己\n既\n既然\n既是\n继而\n加之\n假如\n假若\n假使\n鉴于\n将\n较\n较之\n叫\n接着\n结果\n借\n紧接着\n进而\n尽\n尽管\n经\n经过\n就\n就是\n就是说\n据\n具体地说\n具体说来\n开始\n开外\n靠\n咳\n可\n可见\n可是\n可以\n况且\n啦\n来\n来着\n离\n例如\n哩\n连\n连同\n两者\n了\n临\n另\n另外\n另一方面\n论\n嘛\n吗\n慢说\n漫说\n冒\n么\n每\n每当\n们\n莫若\n某\n某个\n某些\n拿\n哪\n哪边\n哪儿\n哪个\n哪里\n哪年\n哪怕\n哪天\n哪些\n哪样\n那\n那边\n那儿\n那个\n那会儿\n那里\n那么\n那么些\n那么样\n那时\n那些\n那样\n乃\n乃至\n呢\n能\n你\n你们\n您\n宁\n宁可\n宁肯\n宁愿\n哦\n呕\n啪达\n旁人\n呸\n凭\n凭借\n其\n其次\n其二\n其他\n其它\n其一\n其余\n其中\n起\n起见\n起见\n岂但\n恰恰相反\n前后\n前者\n且\n然而\n然后\n然则\n让\n人家\n任\n任何\n任凭\n如\n如此\n如果\n如何\n如其\n如若\n如上所述\n若\n若非\n若是\n啥\n上下\n尚且\n设若\n设使\n甚而\n甚么\n甚至\n省得\n时候\n什么\n什么样\n使得\n是\n是的\n首先\n谁\n谁知\n顺\n顺着\n似的\n虽\n虽然\n虽说\n虽则\n随\n随着\n所\n所以\n他\n他们\n他人\n它\n它们\n她\n她们\n倘\n倘或\n倘然\n倘若\n倘使\n腾\n替\n通过\n同\n同时\n哇\n万一\n往\n望\n为\n为何\n为了\n为什么\n为着\n喂\n嗡嗡\n我\n我们\n呜\n呜呼\n乌乎\n无论\n无宁\n毋宁\n嘻\n吓\n相对而言\n像\n向\n向着\n嘘\n呀\n焉\n沿\n沿着\n要\n要不\n要不然\n要不是\n要么\n要是\n也\n也罢\n也好\n一\n一般\n一旦\n一方面\n一来\n一切\n一样\n一则\n依\n依照\n矣\n以\n以便\n以及\n以免\n以至\n以至于\n以致\n抑或\n因\n因此\n因而\n因为\n哟\n用\n由\n由此可见\n由于\n有\n有的\n有关\n有些\n又\n于\n于是\n于是乎\n与\n与此同时\n与否\n与其\n越是\n云云\n哉\n再说\n再者\n在\n在下\n咱\n咱们\n则\n怎\n怎么\n怎么办\n怎么样\n怎样\n咋\n照\n照着\n者\n这\n这边\n这儿\n这个\n这会儿\n这就是说\n这里\n这么\n这么点儿\n这么些\n这么样\n这时\n这些\n这样\n正如\n吱\n之\n之类\n之所以\n之一\n只是\n只限\n只要\n只有\n至\n至于\n诸位\n着\n着呢\n自\n自从\n自个儿\n自各儿\n自己\n自家\n自身\n综上所述\n总的来看\n总的来说\n总的说来\n总而言之\n总之\n纵\n纵令\n纵然\n纵使\n遵照\n作为\n兮\n呃\n呗\n咚\n咦\n喏\n啐\n喔唷\n嗬\n嗯\n嗳\n"
  },
  {
    "path": "docs/index.md",
    "content": "# MediaCrawler使用方法\n\n## 项目文档\n\n- [项目架构文档](项目架构文档.md) - 系统架构、模块设计、数据流向（含 Mermaid 图表）\n\n## 推荐：使用 uv 管理依赖\n\n### 1. 前置依赖\n- 安装 [uv](https://docs.astral.sh/uv/getting-started/installation)，并用 `uv --version` 验证。\n- Python 版本建议使用 **3.11**（当前依赖基于该版本构建）。\n- 安装 Node.js（抖音、知乎等平台需要），版本需 `>= 16.0.0`。\n\n### 2. 同步 Python 依赖\n```shell\n# 进入项目根目录\ncd MediaCrawler\n\n# 使用 uv 保证 Python 版本和依赖一致性\nuv sync\n```\n\n### 3. 安装 Playwright 浏览器驱动\n```shell\nuv run playwright install\n```\n> 项目已支持使用 Playwright 连接本地 Chrome。如需使用 CDP 方式，可在 `config/base_config.py` 中调整 `xhs` 和 `dy` 的相关配置。\n\n### 4. 运行爬虫程序\n```shell\n# 项目默认未开启评论爬取，如需评论请在 config/base_config.py 中修改 ENABLE_GET_COMMENTS\n# 其他功能开关也可在 config/base_config.py 查看，均有中文注释\n\n# 从配置中读取关键词搜索并爬取帖子与评论\nuv run main.py --platform xhs --lt qrcode --type search\n\n# 从配置中读取指定帖子ID列表并爬取帖子与评论\nuv run main.py --platform xhs --lt qrcode --type detail\n\n# 使用 SQLite 数据库存储数据（推荐个人用户使用）\nuv run main.py --platform xhs --lt qrcode --type search --save_data_option sqlite\n\n# 使用 MySQL 数据库存储数据\nuv run main.py --platform xhs --lt qrcode --type search --save_data_option db\n\n# 其他平台示例\nuv run main.py --help\n```\n\n## 备选：Python 原生 venv（不推荐）\n> 如果爬取抖音或知乎，需要提前安装 Node.js，版本 `>= 16`。\n```shell\n# 进入项目根目录\ncd MediaCrawler\n\n# 创建虚拟环境（示例 Python 版本：3.11，requirements 基于该版本）\npython -m venv venv\n\n# macOS & Linux 激活虚拟环境\nsource venv/bin/activate\n\n# Windows 激活虚拟环境\nvenv\\Scripts\\activate\n```\n```shell\n# 安装依赖与驱动\npip install -r requirements.txt\nplaywright install\n```\n```shell\n# 运行爬虫程序（venv 环境）\npython main.py --platform xhs --lt qrcode --type search\npython main.py --platform xhs --lt qrcode --type detail\npython main.py --platform xhs --lt qrcode --type search --save_data_option sqlite\npython main.py --platform xhs --lt qrcode --type search --save_data_option db\npython main.py --help\n```\n\n## 💾 数据存储\n\n支持多种数据存储方式：\n- **CSV 文件**: 支持保存至 CSV (位于 `data/` 目录下)\n- **JSON 文件**: 支持保存至 JSON (位于 `data/` 目录下)\n- **数据库存储**\n  - 使用 `--init_db` 参数进行数据库初始化 (使用 `--init_db` 时，无需其他可选参数)\n  - **SQLite 数据库**: 轻量级数据库，无需服务器，适合个人使用 (推荐)\n    1. 初始化: `--init_db sqlite`\n    2. 数据存储: `--save_data_option sqlite`\n  - **MySQL 数据库**: 支持保存至关系型数据库 MySQL (需提前创建数据库)\n    1. 初始化: `--init_db mysql`\n    2. 数据存储: `--save_data_option db` (db 参数为兼容历史更新保留)\n\n## 免责声明\n> **免责声明：**\n> \n> 大家请以学习为目的使用本仓库，爬虫违法违规的案件：https://github.com/HiddenStrawberry/Crawler_Illegal_Cases_In_China  <br>\n>\n>本项目的所有内容仅供学习和参考之用，禁止用于商业用途。任何人或组织不得将本仓库的内容用于非法用途或侵犯他人合法权益。本仓库所涉及的爬虫技术仅用于学习和研究，不得用于对其他平台进行大规模爬虫或其他非法行为。对于因使用本仓库内容而引起的任何法律责任，本仓库不承担任何责任。使用本仓库的内容即表示您同意本免责声明的所有条款和条件。\n"
  },
  {
    "path": "docs/mediacrawlerpro订阅.md",
    "content": "# 订阅MediaCrawlerPro版本源码访问权限\n\n## 获取Pro版本的访问权限\n> MediaCrawler开源超过一年了，相信该仓库帮过不少朋友低门槛的学习和了解爬虫。维护真的耗费了大量精力和人力 <br>\n> \n> 所以Pro版本不会开源，可以订阅Pro版本让我更加有动力去更新。<br>\n> \n> 如果感兴趣可以加我微信，订阅Pro版本访问权限哦，有门槛💰。<br>\n> \n> 仅针对想学习Pro版本源码实现的用户，如果是公司或者商业化盈利性质的就不要加我了，谢谢🙏\n> \n> 代码设计拓展性强，可以自己扩展更多的爬虫平台，更多的数据存储方式，相信对你架构这种爬虫代码有所帮助。\n> \n> \n> **MediaCrawlerPro项目主页地址**\n> [MediaCrawlerPro Github主页地址](https://github.com/MediaCrawlerPro)\n\n\n\n扫描下方我的个人微信，备注：pro版本（如果图片展示不出来，可以直接添加我的微信号：relakkes）\n\n![relakkes_weichat.JPG](static/images/relakkes_weichat.jpg)\n\n\n##  Pro版本诞生的背景\n[MediaCrawler](https://github.com/NanmiCoder/MediaCrawler)这个项目开源至今获得了大量的关注，同时也暴露出来了一系列问题，比如：\n- 能否支持多账号？\n- 能否在linux部署？\n- 能否去掉playwright的依赖？\n- 有没有更简单的部署方法？\n- 有没有针对新手上门槛更低的方法？\n\n诸如上面的此类问题，想要在原有项目上去动刀，无疑是增加了复杂度，可能导致后续的维护更加困难。\n出于可持续维护、简便易用、部署简单等目的，对MediaCrawler进行彻底重构。\n\n## 项目介绍\n### [MediaCrawler](https://github.com/NanmiCoder/MediaCrawler)的Pro版本python实现\n**小红书爬虫**，**抖音爬虫**， **快手爬虫**， **B站爬虫**， **微博爬虫**，**百度贴吧**，**知乎爬虫**...。\n\n支持多种平台的爬虫，支持多种数据的爬取，支持多种数据的存储，最重要的**完美支持多账号+IP代理池，让你的爬虫更加稳定**。\n相较于MediaCrawler，Pro版本最大的变化：\n- 去掉了playwright的依赖，不再将Playwright集成到爬虫主干中，依赖过重。\n- 增加了Docker，Docker-compose的方式部署，让部署更加简单。\n- 多账号+IP代理池的支持，让爬虫更加稳定。\n- 新增签名服务，解耦签名逻辑，让爬虫更加灵活。\n"
  },
  {
    "path": "docs/代理使用.md",
    "content": "# 代理 IP 使用说明\n> 还是得跟大家再次强调下，不要对一些自媒体平台进行大规模爬虫或其他非法行为，要踩缝纫机的哦🤣\n\n## 简易的流程图\n\n![代理 IP 使用流程图](static/images/代理IP%20流程图.drawio.png)\n\n\n## 选择一个代理IP提供商\n\n### 快代理\n[快代理使用文档](快代理使用文档.md)\n\n### 豌豆HTTP文档查看\n[豌豆HTTP使用文档](豌豆HTTP使用文档.md)"
  },
  {
    "path": "docs/作者介绍.md",
    "content": "# 关于作者\n> 大家都叫我阿江，网名：程序员阿江-Relakkes，目前是一名独立开发者，专注于 AI Agent 和爬虫相关的开发工作，All in AI。\n\n- [Github万星开源自媒体爬虫仓库MediaCrawler作者](https://github.com/NanmiCoder/MediaCrawler)\n- 全栈程序员，熟悉Python、Golang、JavaScript，工作中主要用Golang。\n- 曾经主导并参与过百万级爬虫采集系统架构设计与编码\n- 爬虫是一种技术兴趣爱好，参与爬虫有一种对抗的感觉，越难越兴奋。\n- 目前专注于 AI Agent 领域，积极探索 AI 技术的应用与创新\n- 如果你有 AI Agent 相关的项目需要合作，欢迎联系我，我有很多时间可以投入\n \n## 微信联系方式\n![relakkes_weichat.JPG](static/images/relakkes_weichat.jpg)\n\n## B站主页地址\nhttps://space.bilibili.com/434377496\n\n## 抖音主页地址\nhttps://www.douyin.com/user/MS4wLjABAAAATJPY7LAlaa5X-c8uNdWkvz0jUGgpw4eeXIwu_8BhvqE?previous_page=app_code_link\n\n## 小红书主页地址\nhttps://www.xiaohongshu.com/user/profile/5f58bd990000000001003753?xhsshare=CopyLink&appuid=5f58bd990000000001003753&apptime=1724737153"
  },
  {
    "path": "docs/原生环境管理文档.md",
    "content": "# 本地原生环境管理\n\n## 推荐方案：使用 uv 管理依赖\n\n### 1. 前置依赖\n- 安装 [uv](https://docs.astral.sh/uv/getting-started/installation)，并使用 `uv --version` 验证。\n- Python 版本建议使用 **3.11**（当前依赖基于该版本构建）。\n- 安装 Node.js（抖音、知乎等平台需要），版本需 `>= 16.0.0`。\n\n### 2. 同步 Python 依赖\n```shell\n# 进入项目根目录\ncd MediaCrawler\n\n# 使用 uv 保证 Python 版本和依赖一致性\nuv sync\n```\n\n### 3. 安装 Playwright 浏览器驱动\n```shell\nuv run playwright install\n```\n> 项目已支持使用 Playwright 连接本地 Chrome。如需使用 CDP 方式，可在 `config/base_config.py` 中调整 `xhs` 和 `dy` 的相关配置。\n\n### 4. 运行爬虫程序\n```shell\n# 项目默认未开启评论爬取，如需评论请在 config/base_config.py 中修改 ENABLE_GET_COMMENTS\n# 其他功能开关也可在 config/base_config.py 查看，均有中文注释\n\n# 从配置中读取关键词搜索并爬取帖子与评论\nuv run main.py --platform xhs --lt qrcode --type search\n\n# 从配置中读取指定帖子ID列表并爬取帖子与评论\nuv run main.py --platform xhs --lt qrcode --type detail\n\n# 其他平台示例\nuv run main.py --help\n```\n\n## 备选方案：Python 原生 venv（不推荐）\n\n### 创建并激活虚拟环境\n> 如果爬取抖音或知乎，需要提前安装 Node.js，版本 `>= 16`。\n```shell\n# 进入项目根目录\ncd MediaCrawler\n\n# 创建虚拟环境（示例 Python 版本：3.11，requirements 基于该版本）\npython -m venv venv\n\n# macOS & Linux 激活虚拟环境\nsource venv/bin/activate\n\n# Windows 激活虚拟环境\nvenv\\Scripts\\activate\n```\n\n### 安装依赖与驱动\n```shell\npip install -r requirements.txt\nplaywright install\n```\n\n### 运行爬虫程序（venv 环境）\n```shell\n# 从配置中读取关键词搜索并爬取帖子与评论\npython main.py --platform xhs --lt qrcode --type search\n\n# 从配置中读取指定帖子ID列表并爬取帖子与评论\npython main.py --platform xhs --lt qrcode --type detail\n\n# 更多示例\npython main.py --help\n```\n"
  },
  {
    "path": "docs/常见问题.md",
    "content": "# 常见程序运行出错问题\n\n## 缺少node环境导致的问题\nQ: 爬取抖音和知乎报错: `execjs._exceptions.ProgramError: SyntaxError: 缺少 ';'` <br>\nA: 该错误为缺少 nodejs 环境，这个错误可以通过安装 nodejs 环境来解决，版本大于等：`v16` <br>\n\nQ: 使用Cookie爬取抖音报错: execjs._exceptions.ProgramError: TypeError: Cannot read property 'JS_MD5_NO_COMMON_JS' of null\nA: windows电脑去网站下载`https://nodejs.org/en/blog/release/v16.8.0` Windows 64-bit Installer 版本，一直下一步即可。\n\n## xhs登录出现滑块一直验证不通过问题\n\nQ: 小红书扫码登录成功后，浏览器一直在验证滑块，无法登录？<br>\nA: 这种情况一般是因为使用playwright浏览器驱动被识别出来的问题，可以尝试删除项目目录下的`brower_data`文件夹，重新走登录流程。<br>\n\n## 如何指定关键词\nQ: 可以指定关键词爬取吗？<br>\nA: 在config/base_config.py 中 KEYWORDS 参数用于控制需要爬取的关键词 <br>\n\n## 如何指定帖子\nQ: 可以指定帖子爬取吗？<br>\nA：在config/base_config.py 中 XHS_SPECIFIED_ID_LIST 参数用于控制需要指定爬取的帖子ID列表 <br>\n\n## 爬取失效\nQ: 刚开始能爬取数据，过一段时间就是失效了？<br>\nA：出现这种情况多半是由于你的账号触发了平台风控机制了，❗️❗️请勿大规模对平台进行爬虫，影响平台。<br>\n\n## 如何更换另一个账号\nQ: 如何更换登录账号？<br>\nA：删除项目根目录下的 brower_data/ 文件夹即可 <br>\n\n## playwright超时问题\nQ: 报错 `playwright._impl._api_types.TimeoutError: Timeout 30000ms exceeded.`<br>\nA: 出现这种情况检查下开梯子没有<br>\n\n## 如果配置playwright浏览器驱动过滑块验证\nQ: 小红书扫码登录成功后如何手动验证?\nA: 打开 config/base_config.py 文件, 找到 HEADLESS 配置项, 将其设置为 False, 此时重启项目, 在浏览器中手动通过验证码<br>\n\n## 词云图生成\nQ: 如何配置词云图的生成?\nA: 打开 config/base_config.py 文件, 找到`ENABLE_GET_WORDCLOUD` 以及`ENABLE_GET_COMMENTS` 两个配置项，将其都设为True即可使用该功能。<br>\n\n## 词云图添加禁用词和自定义词组\nQ: 如何给词云图添加禁用词和自定义词组？\nA: 打开 `docs/hit_stopwords.txt` 输入禁用词(注意一个词语一行)。打开 config/base_config.py 文件找到 `CUSTOM_WORDS `按格式添加自定义词组即可。<br>\n"
  },
  {
    "path": "docs/开发者咨询.md",
    "content": "# 开发者咨询\n\n## 咨询价格\n\n提供200/小时的咨询服务，最低收费为1小时，帮你快速解决项目中遇到的问题\n\n##### 支持的提问类别\n- MediaCrawler项目源码解读、安装、部署、使用问题\n- 爬虫项目开发问题\n- Python、Golang、JavaScript等编程问题\n- JS逆向问题\n- 其他问题（职业规划、工作经验等）\n\n## 加我微信\n> 备注：咨服服务\n> \n![微信二维码](static/images/relakkes_weichat.jpg)"
  },
  {
    "path": "docs/微信交流群.md",
    "content": "# MediaCrawler项目微信交流群\n\n👏👏👏 汇聚爬虫技术爱好者，共同学习，共同进步。\n\n❗️❗️❗️群内禁止广告，禁止发各类违规和MediaCrawler不相关的问题\n\n## 加群方式\n> 备注：github，会有拉群小助手自动拉你进群。\n> \n> 如果图片展示不出来或过期，可以直接添加我的微信号：relakkes，并备注github，会有拉群小助手自动拉你进群\n\n![relakkes_wechat](static/images/QIWEI.png)"
  },
  {
    "path": "docs/快代理使用文档.md",
    "content": "## 快代理使用文档（支持个人和企业用户）\n\n## 准备代理 IP 信息\n点击 <a href=\"https://www.kuaidaili.com/?ref=ldwkjqipvz6c\">快代理</a> 官网注册并实名认证（国内使用代理 IP 必须要实名，懂的都懂）\n\n## 获取 IP 代理的密钥信息\n从 <a href=\"https://www.kuaidaili.com/?ref=ldwkjqipvz6c\">快代理</a> 官网获取免费试用，如下图所示\n![img.png](static/images/img.png)\n\n注意：选择私密代理\n![img_1.png](static/images/img_1.png)\n\n选择开通试用\n![img_2.png](static/images/img_2.png)\n\n初始化一个快代理的示例，如下代码所示，需要4个参数\n\n```python\n# 文件地址： proxy/providers/kuai_daili_proxy.py\n# -*- coding: utf-8 -*-\ndef new_kuai_daili_proxy() -> KuaiDaiLiProxy:\n    \"\"\"\n    构造快代理HTTP实例\n    Returns:\n\n    \"\"\"\n    return KuaiDaiLiProxy(\n        kdl_secret_id=os.getenv(\"kdl_secret_id\", \"你的快代理secert_id\"),\n        kdl_signature=os.getenv(\"kdl_signature\", \"你的快代理签名\"),\n        kdl_user_name=os.getenv(\"kdl_user_name\", \"你的快代理用户名\"),\n        kdl_user_pwd=os.getenv(\"kdl_user_pwd\", \"你的快代理密码\"),\n    )\n\n```\n在试用的订单中可以看到这四个参数，如下图所示\n\n`kdl_user_name`、`kdl_user_pwd`\n![img_3.png](static/images/img_3.png)\n\n`kdl_secret_id`、`kdl_signature`\n![img_4.png](static/images/img_4.png)\n"
  },
  {
    "path": "docs/手机号登录说明.md",
    "content": "# 关于手机号+验证码登录的说明\n> 配置过程相当复杂，不建议采用该种方式\n\n当在浏览器模拟人为发起手机号登录请求时，使用短信转发软件将验证码发送至爬虫端回填，完成自动登录\n\n准备工作：\n\n- 安卓机1台（IOS没去研究，理论上监控短信也是可行的）\n- 安装短信转发软件 [参考仓库](https://github.com/pppscn/SmsForwarder)\n- 转发软件中配置WEBHOOK相关的信息，主要分为 消息模板（请查看本项目中的recv_sms_notification.py）、一个能push短信通知的API地址\n- push的API地址一般是需要绑定一个域名的（当然也可以是内网的IP地址），我用的是内网穿透方式，会有一个免费的域名绑定到内网的web\n  server，内网穿透工具 [ngrok](https://ngrok.com/docs/)\n- 安装redis并设置一个密码 [redis安装](https://www.cnblogs.com/hunanzp/p/12304622.html)\n- 执行 `python recv_sms_notification.py` 等待短信转发器发送HTTP通知\n- 执行手机号登录的爬虫程序 `python main.py --platform xhs --lt phone`\n\n备注：\n\n- 短信转发软件会不会监控自己手机上其他短信内容？（理论上应该不会，因为[短信转发仓库](https://github.com/pppscn/SmsForwarder)\nstar还是蛮多的）"
  },
  {
    "path": "docs/捐赠名单.md",
    "content": "## 捐赠MediaCrawler开源项目\n> 捐赠时请务必备注您的昵称，我会在捐赠名单中表达对您的感谢\n\n## 赞赏二维码\n\n<table align=\"center\">\n  <tr>\n    <td align=\"center\">\n      <h3>微信赞赏</h3>\n      <img src=\"./static/images/wechat_pay.jpeg\" alt=\"微信赞赏二维码\" width=\"200\"/>\n    </td>\n    <td align=\"center\">\n      <h3>支付宝赞赏</h3>\n      <img src=\"./static/images/zfb_pay.png\" alt=\"支付宝赞赏二维码\" width=\"200\"/>\n    </td>\n  </tr>\n</table>\n\n# MediaCrawler捐赠名单\n\n> 再次感谢下面的捐赠者们对MediaCrawler的鼎力支持，是你们的支持让MediaCrawler的更新有了动力。\n\nPS：如果打赏时请备注捐赠者，如有遗漏请联系我添加（有时候消息多可能会漏掉，十分抱歉）\n\n| 捐赠者      | 捐赠金额 | 捐赠日期   |\n| ----------- | -------- | ---------- |\n| RichardYU   | 99 元    | 2025-06-19 |\n| Z.FB        | 20 元    | 2025-04-10 |\n| 若成        | 20 元    | 2025-04-01 |\n| Puple_twirl | 20 元    | 2025-03-30 |\n| N--F        | 20 元    | 2025-03-13 |\n| 财*         | 20 元    | 2025-03-06 |\n| 布莱**      | 1 元     | 2025-01-27 |\n| xldmilktea  | 20 元    | 2025-01-25 |\n| ChenWenLon  | 20 元    | 2025-01-07 |\n| steam       | 20 元    | 2024-12-20 |\n| mike        | 20 元    | 2024-12-17 |\n| thechnolog  | 5 元     | 2024-11-05 |\n| yinzhou     | 100 元   | 2024-10-21 |\n| Tnk_se      | 50 元    | 2024-10-21 |\n| 望、7       | 66 元    | 2024-09-26 |\n| 凌凌7       | 200 元   | 2024-09-19 |\n| yutao       | 20 元    | 2024-09-19 |\n| Urtb*       | 100 元   | 2024-09-07 |\n| Tornado     | 66 元    | 2024-09-04 |\n| srhedbj     | 50 元    | 2024-08-20 |\n| *嘉         | 20 元    | 2024-08-15 |\n| *良         | 50 元    | 2024-08-13 |\n| *皓         | 50 元    | 2024-03-18 |\n| *刚         | 50 元    | 2024-03-18 |\n| *乐         | 20 元    | 2024-03-17 |\n| *木         | 20 元    | 2024-03-17 |\n| *诚         | 20 元    | 2024-03-17 |\n| Strem Gamer | 20 元    | 2024-03-16 |\n| *鑫         | 20 元    | 2024-03-14 |\n| Yuzu        | 20 元    | 2024-03-07 |\n| **宁        | 100 元   | 2024-03-03 |\n| **媛        | 20 元    | 2024-03-03 |\n| Scarlett    | 20 元    | 2024-02-16 |\n| Asun        | 20 元    | 2024-01-30 |\n| 何*         | 100 元   | 2024-01-21 |\n| allen       | 20 元    | 2024-01-10 |\n| llllll      | 20 元    | 2024-01-07 |\n| 邝*元       | 20 元    | 2023-12-29 |\n| 50chen      | 50 元    | 2023-12-22 |\n| xiongot     | 20 元    | 2023-12-17 |\n| atom.hu     | 20 元    | 2023-12-16 |\n| 一呆        | 20 元    | 2023-12-01 |\n| 坠落        | 50 元    | 2023-11-08 |\n\n\n"
  },
  {
    "path": "docs/知识付费介绍.md",
    "content": "# 知识付费介绍\n开源是一种无私奉献，从MediaCrawler开源到现在有一年多，它并没有带给我多少实质性的东西，就拿收入来说，赞助费、赞赏等等全部加起来还没有之前一个月的薪水。\n\n后面搞了MediaCrawler源码剖析课程之后，收入稍微好一点，但也是群里兄弟对我开源的支持，在此也非常感谢你们～\n\n但是我依然坚持持续开源，从开始的xhs、dy 2个平台支持，到现在已经有**7个平台**支持，每一次增加一个平台其实都会耗费很大的时间去写代码和调试代码。。。。\n\n在今天跟一个群里好朋友聊天，他说：开源开发者也要活下去。你不要不好意思做知识付费，你的劳动是有价值的。\n\n他点醒我了，因此我把我所提供的知识付费内容放在下面，有需要的朋友可以看看～\n\n## MediaCrawlerPro项目源码订阅服务\n[mediacrawlerpro订阅文档说明](mediacrawlerpro订阅.md)\n\n## MediaCrawler源码剖析视频课程\n[mediacrawler源码课程介绍](https://relakkes.feishu.cn/wiki/JUgBwdhIeiSbAwkFCLkciHdAnhh)\n\n"
  },
  {
    "path": "docs/词云图使用配置.md",
    "content": "# 关于词云图相关操作\n\n## 1.如何正确调用词云图\n> ps:保存格式为json或jsonl文件时，才会生成词云图。其他存储方式添加词云图将在近期添加。\n\n需要修改的配置项（./config/base_config.py）：\n\n```python\n# 数据保存类型选项配置,支持多种类型：csv、db、json、jsonl等\n#此处需要为json或jsonl格式保存，原因如上\nSAVE_DATA_OPTION = \"jsonl\"  # csv or db or json or jsonl\n```\n\n```python\n# 是否开启爬评论模式, 默认不开启爬评论\n#此处为True，需要爬取评论才可以生成评论的词云图。\nENABLE_GET_COMMENTS = True\n```\n\n```python\n#词云相关\n#是否开启生成评论词云图\n#打开词云图功能\nENABLE_GET_WORDCLOUD = True\n```\n\n```python\n# 添加自定义词语及其分组\n#添加规则：xx:yy 其中xx为自定义添加的词组，yy为将xx该词组分到的组名。\nCUSTOM_WORDS = {\n    '零几': '年份',  # 将“零几”识别为一个整体\n    '高频词': '专业术语'  # 示例自定义词\n}\n```\n\n```python\n#停用(禁用)词文件路径\nSTOP_WORDS_FILE = \"./docs/hit_stopwords.txt\"\n```\n\n```python\n#中文字体文件路径\nFONT_PATH= \"./docs/STZHONGS.TTF\"\n```\n\n**相关解释**\n\n- 自定义词组的添加，`xx:yy` 中`xx`为自定义词语，`yy`为`xx`分配词语的组别。`yy`可以随便给任意值。\n\n- 如果需要添加禁用词，请在./docs/hit_stopwords.txt添加禁用词(保证格式正确，一个词语一行)\n- `FONT_PATH`为生成词云图中中文字体的格式，默认为宋体。可以自行添加字体文件，修改路径。\n\n## 2.生成词云图的位置\n\n![image-20240627204928601](https://rosyrain.oss-cn-hangzhou.aliyuncs.com/img2/202406272049662.png)\n\n如图，在data文件下的`words文件夹`下，其中json为词频统计文件，png为词云图。原本的评论内容在`jsonl文件夹`（或`json文件夹`）下。"
  },
  {
    "path": "docs/豌豆HTTP使用文档.md",
    "content": "## 豌豆HTTP代理使用文档 （只支持企业用户）\n\n## 准备代理 IP 信息\n点击 <a href=\"https://h.wandouip.com?invite_code=rtnifi\">豌豆HTTP代理</a> 官网注册并实名认证（国内使用代理 IP 必须要实名，懂的都懂）\n\n## 获取 IP 代理的密钥信息 appkey\n从 <a href=\"https://h.wandouip.com?invite_code=rtnifi\">豌豆HTTP代理</a> 官网获取免费试用，如下图所示\n![img.png](static/images/wd_http_img.png)\n\n选择自己需要的套餐\n![img_4.png](static/images/wd_http_img_4.png)\n\n\n初始化一个豌豆HTTP代理的示例，如下代码所示，需要1个参数： app_key\n\n```python\n# 文件地址： proxy/providers/wandou_http_proxy.py\n# -*- coding: utf-8 -*-\n\ndef new_wandou_http_proxy() -> WanDouHttpProxy:\n    \"\"\"\n    构造豌豆HTTP实例\n    Returns:\n\n    \"\"\"\n    return WanDouHttpProxy(\n        app_key=os.getenv(\n            \"wandou_app_key\", \"你的豌豆HTTP app_key\"\n        ),  # 通过环境变量的方式获取豌豆HTTP app_key\n    )\n\n```\n\n在个人中心的`开放接口`找到 `app_key`，如下图所示\n\n![img_2.png](static/images/wd_http_img_2.png)\n\n\n"
  },
  {
    "path": "docs/项目代码结构.md",
    "content": "# 项目代码结构\n\n```\nMediaCrawler\n├── base\n│   └── base_crawler.py         # 项目的抽象基类\n├── cache\n│   ├── abs_cache.py            # 缓存抽象基类\n│   ├── cache_factory.py        # 缓存工厂\n│   ├── local_cache.py          # 本地缓存实现\n│   └── redis_cache.py          # Redis缓存实现\n├── cmd_arg\n│   └── arg.py                  # 命令行参数定义\n├── config\n│   ├── base_config.py          # 基础配置\n│   ├── db_config.py            # 数据库配置\n│   └── ...                     # 各平台配置文件\n├── constant\n│   └── ...                     # 各平台常量定义\n├── database\n│   ├── db.py                   # 数据库ORM，封装增删改查\n│   ├── db_session.py           # 数据库会话管理\n│   └── models.py               # 数据库模型定义\n├── docs\n│   └── ...                     # 项目文档\n├── libs\n│   ├── douyin.js               # 抖音Sign函数\n│   ├── stealth.min.js          # 去除浏览器自动化特征的JS\n│   └── zhihu.js                # 知乎Sign函数\n├── media_platform\n│   ├── bilibili                # B站采集实现\n│   ├── douyin                  # 抖音采集实现\n│   ├── kuaishou                # 快手采集实现\n│   ├── tieba                   # 百度贴吧采集实现\n│   ├── weibo                   # 微博采集实现\n│   ├── xhs                     # 小红书采集实现\n│   └── zhihu                   # 知乎采集实现\n├── model\n│   ├── m_baidu_tieba.py        # 百度贴吧数据模型\n│   ├── m_douyin.py             # 抖音数据模型\n│   ├── m_kuaishou.py           # 快手数据模型\n│   ├── m_weibo.py              # 微博数据模型\n│   ├── m_xiaohongshu.py        # 小红书数据模型\n│   └── m_zhihu.py              # 知乎数据模型\n├── proxy\n│   ├── base_proxy.py           # 代理基类\n│   ├── providers               # 代理提供商实现\n│   ├── proxy_ip_pool.py        # 代理IP池\n│   └── types.py                # 代理类型定义\n├── store\n│   ├── bilibili                # B站数据存储实现\n│   ├── douyin                  # 抖音数据存储实现\n│   ├── kuaishou                # 快手数据存储实现\n│   ├── tieba                   # 贴吧数据存储实现\n│   ├── weibo                   # 微博数据存储实现\n│   ├── xhs                     # 小红书数据存储实现\n│   └── zhihu                   # 知乎数据存储实现\n├── test\n│   ├── test_db_sync.py         # 数据库同步测试\n│   ├── test_proxy_ip_pool.py   # 代理IP池测试\n│   └── ...                     # 其他测试用例\n├── tools\n│   ├── browser_launcher.py     # 浏览器启动器\n│   ├── cdp_browser.py          # CDP浏览器控制\n│   ├── crawler_util.py         # 爬虫工具函数\n│   ├── utils.py                # 通用工具函数\n│   └── ...\n├── main.py                     # 程序入口, 支持 --init_db 参数来初始化数据库\n├── recv_sms.py                 # 短信转发HTTP SERVER接口\n└── var.py                      # 全局上下文变量定义\n```"
  },
  {
    "path": "docs/项目架构文档.md",
    "content": "# MediaCrawler 项目架构文档\n\n## 1. 项目概述\n\n### 1.1 项目简介\n\nMediaCrawler 是一个多平台自媒体爬虫框架，采用 Python 异步编程实现，支持爬取主流社交媒体平台的内容、评论和创作者信息。\n\n### 1.2 支持的平台\n\n| 平台 | 代号 | 主要功能 |\n|------|------|---------|\n| 小红书 | `xhs` | 笔记搜索、详情、创作者 |\n| 抖音 | `dy` | 视频搜索、详情、创作者 |\n| 快手 | `ks` | 视频搜索、详情、创作者 |\n| B站 | `bili` | 视频搜索、详情、UP主 |\n| 微博 | `wb` | 微博搜索、详情、博主 |\n| 百度贴吧 | `tieba` | 帖子搜索、详情 |\n| 知乎 | `zhihu` | 问答搜索、详情、答主 |\n\n### 1.3 核心功能特性\n\n- **多平台支持**：统一的爬虫接口，支持 7 大主流平台\n- **多种登录方式**：二维码、手机号、Cookie 三种登录方式\n- **多种存储方式**：CSV、JSON、JSONL、SQLite、MySQL、MongoDB、Excel\n- **反爬虫对策**：CDP 模式、代理 IP 池、请求签名\n- **异步高并发**：基于 asyncio 的异步架构，高效并发爬取\n- **词云生成**：自动生成评论词云图\n\n---\n\n## 2. 系统架构总览\n\n### 2.1 高层架构图\n\n```mermaid\nflowchart TB\n    subgraph Entry[\"入口层\"]\n        main[\"main.py<br/>程序入口\"]\n        cmdarg[\"cmd_arg<br/>命令行参数\"]\n        config[\"config<br/>配置管理\"]\n    end\n\n    subgraph Core[\"核心爬虫层\"]\n        factory[\"CrawlerFactory<br/>爬虫工厂\"]\n        base[\"AbstractCrawler<br/>爬虫基类\"]\n\n        subgraph Platforms[\"平台实现\"]\n            xhs[\"XiaoHongShuCrawler\"]\n            dy[\"DouYinCrawler\"]\n            ks[\"KuaishouCrawler\"]\n            bili[\"BilibiliCrawler\"]\n            wb[\"WeiboCrawler\"]\n            tieba[\"TieBaCrawler\"]\n            zhihu[\"ZhihuCrawler\"]\n        end\n    end\n\n    subgraph Client[\"API客户端层\"]\n        absClient[\"AbstractApiClient<br/>客户端基类\"]\n        xhsClient[\"XiaoHongShuClient\"]\n        dyClient[\"DouYinClient\"]\n        ksClient[\"KuaiShouClient\"]\n        biliClient[\"BilibiliClient\"]\n        wbClient[\"WeiboClient\"]\n        tiebaClient[\"BaiduTieBaClient\"]\n        zhihuClient[\"ZhiHuClient\"]\n    end\n\n    subgraph Storage[\"数据存储层\"]\n        storeFactory[\"StoreFactory<br/>存储工厂\"]\n        csv[\"CSV存储\"]\n        json[\"JSON存储\"]\n        sqlite[\"SQLite存储\"]\n        mysql[\"MySQL存储\"]\n        mongodb[\"MongoDB存储\"]\n        excel[\"Excel存储\"]\n    end\n\n    subgraph Infra[\"基础设施层\"]\n        browser[\"浏览器管理<br/>Playwright/CDP\"]\n        proxy[\"代理IP池\"]\n        cache[\"缓存系统\"]\n        login[\"登录管理\"]\n    end\n\n    main --> factory\n    cmdarg --> main\n    config --> main\n    factory --> base\n    base --> Platforms\n    Platforms --> Client\n    Client --> Storage\n    Client --> Infra\n    Storage --> storeFactory\n    storeFactory --> csv & json & sqlite & mysql & mongodb & excel\n```\n\n### 2.2 数据流向图\n\n```mermaid\nflowchart LR\n    subgraph Input[\"输入\"]\n        keywords[\"关键词/ID\"]\n        config[\"配置参数\"]\n    end\n\n    subgraph Process[\"处理流程\"]\n        browser[\"启动浏览器\"]\n        login[\"登录认证\"]\n        search[\"搜索/爬取\"]\n        parse[\"数据解析\"]\n        comment[\"获取评论\"]\n    end\n\n    subgraph Output[\"输出\"]\n        content[\"内容数据\"]\n        comments[\"评论数据\"]\n        creator[\"创作者数据\"]\n        media[\"媒体文件\"]\n    end\n\n    subgraph Storage[\"存储\"]\n        file[\"文件存储<br/>CSV/JSON/Excel\"]\n        db[\"数据库<br/>SQLite/MySQL\"]\n        nosql[\"NoSQL<br/>MongoDB\"]\n    end\n\n    keywords --> browser\n    config --> browser\n    browser --> login\n    login --> search\n    search --> parse\n    parse --> comment\n    parse --> content\n    comment --> comments\n    parse --> creator\n    parse --> media\n    content & comments & creator --> file & db & nosql\n    media --> file\n```\n\n---\n\n## 3. 目录结构\n\n```\nMediaCrawler/\n├── main.py                 # 程序入口\n├── var.py                  # 全局上下文变量\n├── pyproject.toml          # 项目配置\n│\n├── base/                   # 基础抽象类\n│   └── base_crawler.py     # 爬虫、登录、存储、客户端基类\n│\n├── config/                 # 配置管理\n│   ├── base_config.py      # 核心配置\n│   ├── db_config.py        # 数据库配置\n│   └── {platform}_config.py # 平台特定配置\n│\n├── media_platform/         # 平台爬虫实现\n│   ├── xhs/                # 小红书\n│   ├── douyin/             # 抖音\n│   ├── kuaishou/           # 快手\n│   ├── bilibili/           # B站\n│   ├── weibo/              # 微博\n│   ├── tieba/              # 百度贴吧\n│   └── zhihu/              # 知乎\n│\n├── store/                  # 数据存储\n│   ├── excel_store_base.py # Excel存储基类\n│   └── {platform}/         # 各平台存储实现\n│\n├── database/               # 数据库层\n│   ├── models.py           # ORM模型定义\n│   ├── db_session.py       # 数据库会话管理\n│   └── mongodb_store_base.py # MongoDB基类\n│\n├── proxy/                  # 代理管理\n│   ├── proxy_ip_pool.py    # IP池管理\n│   ├── proxy_mixin.py      # 代理刷新混入\n│   └── providers/          # 代理提供商\n│\n├── cache/                  # 缓存系统\n│   ├── abs_cache.py        # 缓存抽象类\n│   ├── local_cache.py      # 本地缓存\n│   └── redis_cache.py      # Redis缓存\n│\n├── tools/                  # 工具模块\n│   ├── app_runner.py       # 应用运行管理\n│   ├── browser_launcher.py # 浏览器启动\n│   ├── cdp_browser.py      # CDP浏览器管理\n│   ├── crawler_util.py     # 爬虫工具\n│   └── async_file_writer.py # 异步文件写入\n│\n├── model/                  # 数据模型\n│   └── m_{platform}.py     # Pydantic模型\n│\n├── libs/                   # JS脚本库\n│   └── stealth.min.js      # 反检测脚本\n│\n└── cmd_arg/                # 命令行参数\n    └── arg.py              # 参数定义\n```\n\n---\n\n## 4. 核心模块详解\n\n### 4.1 爬虫基类体系\n\n```mermaid\nclassDiagram\n    class AbstractCrawler {\n        <<abstract>>\n        +start()* 启动爬虫\n        +search()* 搜索功能\n        +launch_browser() 启动浏览器\n        +launch_browser_with_cdp() CDP模式启动\n    }\n\n    class AbstractLogin {\n        <<abstract>>\n        +begin()* 开始登录\n        +login_by_qrcode()* 二维码登录\n        +login_by_mobile()* 手机号登录\n        +login_by_cookies()* Cookie登录\n    }\n\n    class AbstractStore {\n        <<abstract>>\n        +store_content()* 存储内容\n        +store_comment()* 存储评论\n        +store_creator()* 存储创作者\n        +store_image()* 存储图片\n        +store_video()* 存储视频\n    }\n\n    class AbstractApiClient {\n        <<abstract>>\n        +request()* HTTP请求\n        +update_cookies()* 更新Cookies\n    }\n\n    class ProxyRefreshMixin {\n        +init_proxy_pool() 初始化代理池\n        +_refresh_proxy_if_expired() 刷新过期代理\n    }\n\n    class XiaoHongShuCrawler {\n        +xhs_client: XiaoHongShuClient\n        +start()\n        +search()\n        +get_specified_notes()\n        +get_creators_and_notes()\n    }\n\n    class XiaoHongShuClient {\n        +playwright_page: Page\n        +cookie_dict: Dict\n        +request()\n        +pong() 检查登录状态\n        +get_note_by_keyword()\n        +get_note_by_id()\n    }\n\n    AbstractCrawler <|-- XiaoHongShuCrawler\n    AbstractApiClient <|-- XiaoHongShuClient\n    ProxyRefreshMixin <|-- XiaoHongShuClient\n```\n\n### 4.2 爬虫生命周期\n\n```mermaid\nsequenceDiagram\n    participant Main as main.py\n    participant Factory as CrawlerFactory\n    participant Crawler as XiaoHongShuCrawler\n    participant Browser as Playwright/CDP\n    participant Login as XiaoHongShuLogin\n    participant Client as XiaoHongShuClient\n    participant Store as StoreFactory\n\n    Main->>Factory: create_crawler(\"xhs\")\n    Factory-->>Main: crawler实例\n\n    Main->>Crawler: start()\n\n    alt 启用IP代理\n        Crawler->>Crawler: create_ip_pool()\n    end\n\n    alt CDP模式\n        Crawler->>Browser: launch_browser_with_cdp()\n    else 标准模式\n        Crawler->>Browser: launch_browser()\n    end\n    Browser-->>Crawler: browser_context\n\n    Crawler->>Crawler: create_xhs_client()\n    Crawler->>Client: pong() 检查登录状态\n\n    alt 未登录\n        Crawler->>Login: begin()\n        Login->>Login: login_by_qrcode/mobile/cookie\n        Login-->>Crawler: 登录成功\n    end\n\n    alt search模式\n        Crawler->>Client: get_note_by_keyword()\n        Client-->>Crawler: 搜索结果\n        loop 获取详情\n            Crawler->>Client: get_note_by_id()\n            Client-->>Crawler: 笔记详情\n        end\n    else detail模式\n        Crawler->>Client: get_note_by_id()\n    else creator模式\n        Crawler->>Client: get_creator_info()\n    end\n\n    Crawler->>Store: store_content/comment/creator\n    Store-->>Crawler: 存储完成\n\n    Main->>Crawler: cleanup()\n    Crawler->>Browser: close()\n```\n\n### 4.3 平台爬虫实现结构\n\n每个平台目录包含以下核心文件：\n\n```\nmedia_platform/{platform}/\n├── __init__.py         # 模块导出\n├── core.py             # 爬虫主实现类\n├── client.py           # API客户端\n├── login.py            # 登录实现\n├── field.py            # 字段/枚举定义\n├── exception.py        # 异常定义\n├── help.py             # 辅助函数\n└── {特殊实现}.py       # 平台特定逻辑\n```\n\n### 4.4 三种爬虫模式\n\n| 模式 | 配置值 | 功能描述 | 适用场景 |\n|------|--------|---------|---------|\n| 搜索模式 | `search` | 根据关键词搜索内容 | 批量获取特定主题内容 |\n| 详情模式 | `detail` | 获取指定ID的详情 | 精确获取已知内容 |\n| 创作者模式 | `creator` | 获取创作者所有内容 | 追踪特定博主/UP主 |\n\n---\n\n## 5. 数据存储层\n\n### 5.1 存储架构图\n\n```mermaid\nclassDiagram\n    class AbstractStore {\n        <<abstract>>\n        +store_content()*\n        +store_comment()*\n        +store_creator()*\n    }\n\n    class StoreFactory {\n        +STORES: Dict\n        +create_store() AbstractStore\n    }\n\n    class CsvStoreImplement {\n        +async_file_writer: AsyncFileWriter\n        +store_content()\n        +store_comment()\n    }\n\n    class JsonStoreImplement {\n        +async_file_writer: AsyncFileWriter\n        +store_content()\n        +store_comment()\n    }\n\n    class DbStoreImplement {\n        +session: AsyncSession\n        +store_content()\n        +store_comment()\n    }\n\n    class SqliteStoreImplement {\n        +session: AsyncSession\n        +store_content()\n        +store_comment()\n    }\n\n    class MongoStoreImplement {\n        +mongo_base: MongoDBStoreBase\n        +store_content()\n        +store_comment()\n    }\n\n    class ExcelStoreImplement {\n        +excel_base: ExcelStoreBase\n        +store_content()\n        +store_comment()\n    }\n\n    AbstractStore <|-- CsvStoreImplement\n    AbstractStore <|-- JsonStoreImplement\n    AbstractStore <|-- DbStoreImplement\n    AbstractStore <|-- SqliteStoreImplement\n    AbstractStore <|-- MongoStoreImplement\n    AbstractStore <|-- ExcelStoreImplement\n    StoreFactory --> AbstractStore\n```\n\n### 5.2 存储工厂模式\n\n```python\n# 以抖音为例\nclass DouyinStoreFactory:\n    STORES = {\n        \"csv\": DouyinCsvStoreImplement,\n        \"db\": DouyinDbStoreImplement,\n        \"json\": DouyinJsonStoreImplement,\n        \"sqlite\": DouyinSqliteStoreImplement,\n        \"mongodb\": DouyinMongoStoreImplement,\n        \"excel\": DouyinExcelStoreImplement,\n    }\n\n    @staticmethod\n    def create_store() -> AbstractStore:\n        store_class = DouyinStoreFactory.STORES.get(config.SAVE_DATA_OPTION)\n        return store_class()\n```\n\n### 5.3 存储方式对比\n\n| 存储方式 | 配置值 | 优点 | 适用场景 |\n|---------|--------|-----|---------|\n| CSV | `csv` | 简单、通用 | 小规模数据、快速查看 |\n| JSON | `json` | 结构完整、易解析 | API对接、数据交换 |\n| JSONL | `jsonl` | 追加写入、性能好 | 大规模数据、增量爬取（默认） |\n| SQLite | `sqlite` | 轻量、无需服务 | 本地开发、小型项目 |\n| MySQL | `db` | 性能好、支持并发 | 生产环境、大规模数据 |\n| MongoDB | `mongodb` | 灵活、易扩展 | 非结构化数据、快速迭代 |\n| Excel | `excel` | 可视化、易分享 | 报告、数据分析 |\n\n---\n\n## 6. 基础设施层\n\n### 6.1 代理系统架构\n\n```mermaid\nflowchart TB\n    subgraph Config[\"配置\"]\n        enable[\"ENABLE_IP_PROXY\"]\n        provider[\"IP_PROXY_PROVIDER\"]\n        count[\"IP_PROXY_POOL_COUNT\"]\n    end\n\n    subgraph Pool[\"代理池管理\"]\n        pool[\"ProxyIpPool\"]\n        load[\"load_proxies()\"]\n        validate[\"_is_valid_proxy()\"]\n        get[\"get_proxy()\"]\n        refresh[\"get_or_refresh_proxy()\"]\n    end\n\n    subgraph Providers[\"代理提供商\"]\n        kuaidl[\"快代理<br/>KuaiDaiLiProxy\"]\n        wandou[\"万代理<br/>WanDouHttpProxy\"]\n        jishu[\"技术IP<br/>JiShuHttpProxy\"]\n    end\n\n    subgraph Client[\"API客户端\"]\n        mixin[\"ProxyRefreshMixin\"]\n        request[\"request()\"]\n    end\n\n    enable --> pool\n    provider --> Providers\n    count --> load\n    pool --> load\n    load --> validate\n    validate --> Providers\n    pool --> get\n    pool --> refresh\n    mixin --> refresh\n    mixin --> Client\n    request --> mixin\n```\n\n### 6.2 登录流程\n\n```mermaid\nflowchart TB\n    Start([开始登录]) --> CheckType{登录类型?}\n\n    CheckType -->|qrcode| QR[显示二维码]\n    QR --> WaitScan[等待扫描]\n    WaitScan --> CheckQR{扫描成功?}\n    CheckQR -->|是| SaveCookie[保存Cookie]\n    CheckQR -->|否| WaitScan\n\n    CheckType -->|phone| Phone[输入手机号]\n    Phone --> SendCode[发送验证码]\n    SendCode --> Slider{需要滑块?}\n    Slider -->|是| DoSlider[滑动验证]\n    DoSlider --> InputCode[输入验证码]\n    Slider -->|否| InputCode\n    InputCode --> Verify[验证登录]\n    Verify --> SaveCookie\n\n    CheckType -->|cookie| LoadCookie[加载已保存Cookie]\n    LoadCookie --> VerifyCookie{Cookie有效?}\n    VerifyCookie -->|是| SaveCookie\n    VerifyCookie -->|否| Fail[登录失败]\n\n    SaveCookie --> UpdateContext[更新浏览器上下文]\n    UpdateContext --> End([登录完成])\n```\n\n### 6.3 浏览器管理\n\n```mermaid\nflowchart LR\n    subgraph Mode[\"启动模式\"]\n        standard[\"标准模式<br/>Playwright\"]\n        cdp[\"CDP模式<br/>Chrome DevTools\"]\n    end\n\n    subgraph Standard[\"标准模式流程\"]\n        launch[\"chromium.launch()\"]\n        context[\"new_context()\"]\n        stealth[\"注入stealth.js\"]\n    end\n\n    subgraph CDP[\"CDP模式流程\"]\n        detect[\"检测浏览器路径\"]\n        start[\"启动浏览器进程\"]\n        connect[\"connect_over_cdp()\"]\n        cdpContext[\"获取已有上下文\"]\n    end\n\n    subgraph Features[\"特性\"]\n        f1[\"用户数据持久化\"]\n        f2[\"扩展和设置继承\"]\n        f3[\"反检测能力增强\"]\n    end\n\n    standard --> Standard\n    cdp --> CDP\n    CDP --> Features\n```\n\n### 6.4 缓存系统\n\n```mermaid\nclassDiagram\n    class AbstractCache {\n        <<abstract>>\n        +get(key)* 获取缓存\n        +set(key, value, expire)* 设置缓存\n        +keys(pattern)* 获取所有键\n    }\n\n    class ExpiringLocalCache {\n        -_cache: Dict\n        -_expire_times: Dict\n        +get(key)\n        +set(key, value, expire_time)\n        +keys(pattern)\n        -_is_expired(key)\n    }\n\n    class RedisCache {\n        -_client: Redis\n        +get(key)\n        +set(key, value, expire_time)\n        +keys(pattern)\n    }\n\n    class CacheFactory {\n        +create_cache(type) AbstractCache\n    }\n\n    AbstractCache <|-- ExpiringLocalCache\n    AbstractCache <|-- RedisCache\n    CacheFactory --> AbstractCache\n```\n\n---\n\n## 7. 数据模型\n\n### 7.1 ORM模型关系\n\n```mermaid\nerDiagram\n    DouyinAweme {\n        int id PK\n        string aweme_id UK\n        string aweme_type\n        string title\n        string desc\n        int create_time\n        int liked_count\n        int collected_count\n        int comment_count\n        int share_count\n        string user_id FK\n        datetime add_ts\n        datetime last_modify_ts\n    }\n\n    DouyinAwemeComment {\n        int id PK\n        string comment_id UK\n        string aweme_id FK\n        string content\n        int create_time\n        int sub_comment_count\n        string user_id\n        datetime add_ts\n        datetime last_modify_ts\n    }\n\n    DyCreator {\n        int id PK\n        string user_id UK\n        string nickname\n        string avatar\n        string desc\n        int follower_count\n        int total_favorited\n        datetime add_ts\n        datetime last_modify_ts\n    }\n\n    DouyinAweme ||--o{ DouyinAwemeComment : \"has\"\n    DyCreator ||--o{ DouyinAweme : \"creates\"\n```\n\n### 7.2 各平台数据表\n\n| 平台 | 内容表 | 评论表 | 创作者表 |\n|------|--------|--------|---------|\n| 抖音 | DouyinAweme | DouyinAwemeComment | DyCreator |\n| 小红书 | XHSNote | XHSNoteComment | XHSCreator |\n| 快手 | KuaishouVideo | KuaishouVideoComment | KsCreator |\n| B站 | BilibiliVideo | BilibiliVideoComment | BilibiliUpInfo |\n| 微博 | WeiboNote | WeiboNoteComment | WeiboCreator |\n| 贴吧 | TiebaNote | TiebaNoteComment | - |\n| 知乎 | ZhihuContent | ZhihuContentComment | ZhihuCreator |\n\n---\n\n## 8. 配置系统\n\n### 8.1 核心配置项\n\n```python\n# config/base_config.py\n\n# 平台选择\nPLATFORM = \"xhs\"  # xhs, dy, ks, bili, wb, tieba, zhihu\n\n# 登录配置\nLOGIN_TYPE = \"qrcode\"  # qrcode, phone, cookie\nSAVE_LOGIN_STATE = True\n\n# 爬虫配置\nCRAWLER_TYPE = \"search\"  # search, detail, creator\nKEYWORDS = \"编程副业,编程兼职\"\nCRAWLER_MAX_NOTES_COUNT = 15\nMAX_CONCURRENCY_NUM = 1\n\n# 评论配置\nENABLE_GET_COMMENTS = True\nENABLE_GET_SUB_COMMENTS = False\nCRAWLER_MAX_COMMENTS_COUNT_SINGLENOTES = 10\n\n# 浏览器配置\nHEADLESS = False\nENABLE_CDP_MODE = True\nCDP_DEBUG_PORT = 9222\n\n# 代理配置\nENABLE_IP_PROXY = False\nIP_PROXY_PROVIDER = \"kuaidaili\"\nIP_PROXY_POOL_COUNT = 2\n\n# 存储配置\nSAVE_DATA_OPTION = \"jsonl\"  # csv, db, json, jsonl, sqlite, mongodb, excel, postgres\n```\n\n### 8.2 数据库配置\n\n```python\n# config/db_config.py\n\n# MySQL\nMYSQL_DB_HOST = \"localhost\"\nMYSQL_DB_PORT = 3306\nMYSQL_DB_NAME = \"media_crawler\"\n\n# Redis\nREDIS_DB_HOST = \"127.0.0.1\"\nREDIS_DB_PORT = 6379\n\n# MongoDB\nMONGODB_HOST = \"localhost\"\nMONGODB_PORT = 27017\n\n# SQLite\nSQLITE_DB_PATH = \"database/sqlite_tables.db\"\n```\n\n---\n\n## 9. 工具模块\n\n### 9.1 工具函数概览\n\n| 模块 | 文件 | 主要功能 |\n|------|------|---------|\n| 应用运行器 | `app_runner.py` | 信号处理、优雅退出、清理管理 |\n| 浏览器启动 | `browser_launcher.py` | 检测浏览器路径、启动浏览器进程 |\n| CDP管理 | `cdp_browser.py` | CDP连接、浏览器上下文管理 |\n| 爬虫工具 | `crawler_util.py` | 二维码识别、验证码处理、User-Agent |\n| 文件写入 | `async_file_writer.py` | 异步CSV/JSON写入、词云生成 |\n| 滑块验证 | `slider_util.py` | 滑动验证码破解 |\n| 时间工具 | `time_util.py` | 时间戳转换、日期处理 |\n\n### 9.2 应用运行管理\n\n```mermaid\nflowchart TB\n    Start([程序启动]) --> Run[\"run(app_main, app_cleanup)\"]\n    Run --> Main[\"执行 app_main()\"]\n    Main --> Running{运行中}\n\n    Running -->|正常完成| Cleanup1[\"执行 app_cleanup()\"]\n    Running -->|SIGINT/SIGTERM| Signal[\"捕获信号\"]\n\n    Signal --> First{第一次信号?}\n    First -->|是| Cleanup2[\"启动清理流程\"]\n    First -->|否| Force[\"强制退出\"]\n\n    Cleanup1 & Cleanup2 --> Cancel[\"取消其他任务\"]\n    Cancel --> Wait[\"等待任务完成<br/>(超时15秒)\"]\n    Wait --> End([程序退出])\n    Force --> End\n```\n\n---\n\n## 10. 模块依赖关系\n\n```mermaid\nflowchart TB\n    subgraph Entry[\"入口层\"]\n        main[\"main.py\"]\n        config[\"config/\"]\n        cmdarg[\"cmd_arg/\"]\n    end\n\n    subgraph Core[\"核心层\"]\n        base[\"base/base_crawler.py\"]\n        platforms[\"media_platform/*/\"]\n    end\n\n    subgraph Client[\"客户端层\"]\n        client[\"*/client.py\"]\n        login[\"*/login.py\"]\n    end\n\n    subgraph Storage[\"存储层\"]\n        store[\"store/\"]\n        database[\"database/\"]\n    end\n\n    subgraph Infra[\"基础设施\"]\n        proxy[\"proxy/\"]\n        cache[\"cache/\"]\n        tools[\"tools/\"]\n    end\n\n    subgraph External[\"外部依赖\"]\n        playwright[\"Playwright\"]\n        httpx[\"httpx\"]\n        sqlalchemy[\"SQLAlchemy\"]\n        motor[\"Motor/MongoDB\"]\n    end\n\n    main --> config\n    main --> cmdarg\n    main --> Core\n\n    Core --> base\n    platforms --> base\n    platforms --> Client\n\n    client --> proxy\n    client --> httpx\n    login --> tools\n\n    platforms --> Storage\n    Storage --> sqlalchemy\n    Storage --> motor\n\n    client --> playwright\n    tools --> playwright\n\n    proxy --> cache\n```\n\n---\n\n## 11. 扩展指南\n\n### 11.1 添加新平台\n\n1. 在 `media_platform/` 下创建新目录\n2. 实现以下核心文件：\n   - `core.py` - 继承 `AbstractCrawler`\n   - `client.py` - 继承 `AbstractApiClient` 和 `ProxyRefreshMixin`\n   - `login.py` - 继承 `AbstractLogin`\n   - `field.py` - 定义平台枚举\n3. 在 `store/` 下创建对应存储目录\n4. 在 `main.py` 的 `CrawlerFactory.CRAWLERS` 中注册\n\n### 11.2 添加新存储方式\n\n1. 在 `store/` 下创建新的存储实现类\n2. 继承 `AbstractStore` 基类\n3. 实现 `store_content`、`store_comment`、`store_creator` 方法\n4. 在各平台的 `StoreFactory.STORES` 中注册\n\n### 11.3 添加新代理提供商\n\n1. 在 `proxy/providers/` 下创建新的代理类\n2. 继承 `BaseProxy` 基类\n3. 实现 `get_proxy()` 方法\n4. 在配置中注册\n\n---\n\n## 12. 快速参考\n\n### 12.1 常用命令\n\n```bash\n# 启动爬虫\npython main.py\n\n# 指定平台\npython main.py --platform xhs\n\n# 指定登录方式\npython main.py --lt qrcode\n\n# 指定爬虫类型\npython main.py --type search\n```\n\n### 12.2 关键文件路径\n\n| 用途 | 文件路径 |\n|------|---------|\n| 程序入口 | `main.py` |\n| 核心配置 | `config/base_config.py` |\n| 数据库配置 | `config/db_config.py` |\n| 爬虫基类 | `base/base_crawler.py` |\n| ORM模型 | `database/models.py` |\n| 代理池 | `proxy/proxy_ip_pool.py` |\n| CDP浏览器 | `tools/cdp_browser.py` |\n\n---\n\n*文档生成时间: 2025-12-18*\n"
  },
  {
    "path": "libs/douyin.js",
    "content": "// All the content in this article is only for learning and communication use, not for any other purpose, strictly prohibited for commercial use and illegal use, otherwise all the consequences are irrelevant to the author!\n// copy from https://github.com/ShilongLee/Crawler/tree/main/lib/js thanks for ShilongLee\nfunction rc4_encrypt(plaintext, key) {\n    var s = [];\n    for (var i = 0; i < 256; i++) {\n        s[i] = i;\n    }\n    var j = 0;\n    for (var i = 0; i < 256; i++) {\n        j = (j + s[i] + key.charCodeAt(i % key.length)) % 256;\n        var temp = s[i];\n        s[i] = s[j];\n        s[j] = temp;\n    }\n\n    var i = 0;\n    var j = 0;\n    var cipher = [];\n    for (var k = 0; k < plaintext.length; k++) {\n        i = (i + 1) % 256;\n        j = (j + s[i]) % 256;\n        var temp = s[i];\n        s[i] = s[j];\n        s[j] = temp;\n        var t = (s[i] + s[j]) % 256;\n        cipher.push(String.fromCharCode(s[t] ^ plaintext.charCodeAt(k)));\n    }\n    return cipher.join('');\n}\n\nfunction le(e, r) {\n    return (e << (r %= 32) | e >>> 32 - r) >>> 0\n}\n\nfunction de(e) {\n    return 0 <= e && e < 16 ? 2043430169 : 16 <= e && e < 64 ? 2055708042 : void console['error'](\"invalid j for constant Tj\")\n}\n\nfunction pe(e, r, t, n) {\n    return 0 <= e && e < 16 ? (r ^ t ^ n) >>> 0 : 16 <= e && e < 64 ? (r & t | r & n | t & n) >>> 0 : (console['error']('invalid j for bool function FF'),\n        0)\n}\n\nfunction he(e, r, t, n) {\n    return 0 <= e && e < 16 ? (r ^ t ^ n) >>> 0 : 16 <= e && e < 64 ? (r & t | ~r & n) >>> 0 : (console['error']('invalid j for bool function GG'),\n        0)\n}\n\nfunction reset() {\n    this.reg[0] = 1937774191,\n        this.reg[1] = 1226093241,\n        this.reg[2] = 388252375,\n        this.reg[3] = 3666478592,\n        this.reg[4] = 2842636476,\n        this.reg[5] = 372324522,\n        this.reg[6] = 3817729613,\n        this.reg[7] = 2969243214,\n        this[\"chunk\"] = [],\n        this[\"size\"] = 0\n}\n\nfunction write(e) {\n    var a = \"string\" == typeof e ? function (e) {\n        n = encodeURIComponent(e)['replace'](/%([0-9A-F]{2})/g, (function (e, r) {\n                return String['fromCharCode'](\"0x\" + r)\n            }\n        ))\n            , a = new Array(n['length']);\n        return Array['prototype']['forEach']['call'](n, (function (e, r) {\n                a[r] = e.charCodeAt(0)\n            }\n        )),\n            a\n    }(e) : e;\n    this.size += a.length;\n    var f = 64 - this['chunk']['length'];\n    if (a['length'] < f)\n        this['chunk'] = this['chunk'].concat(a);\n    else\n        for (this['chunk'] = this['chunk'].concat(a.slice(0, f)); this['chunk'].length >= 64;)\n            this['_compress'](this['chunk']),\n                f < a['length'] ? this['chunk'] = a['slice'](f, Math['min'](f + 64, a['length'])) : this['chunk'] = [],\n                f += 64\n}\n\nfunction sum(e, t) {\n    e && (this['reset'](),\n        this['write'](e)),\n        this['_fill']();\n    for (var f = 0; f < this.chunk['length']; f += 64)\n        this._compress(this['chunk']['slice'](f, f + 64));\n    var i = null;\n    if (t == 'hex') {\n        i = \"\";\n        for (f = 0; f < 8; f++)\n            i += se(this['reg'][f]['toString'](16), 8, \"0\")\n    } else\n        for (i = new Array(32),\n                 f = 0; f < 8; f++) {\n            var c = this.reg[f];\n            i[4 * f + 3] = (255 & c) >>> 0,\n                c >>>= 8,\n                i[4 * f + 2] = (255 & c) >>> 0,\n                c >>>= 8,\n                i[4 * f + 1] = (255 & c) >>> 0,\n                c >>>= 8,\n                i[4 * f] = (255 & c) >>> 0\n        }\n    return this['reset'](),\n        i\n}\n\nfunction _compress(t) {\n    if (t < 64)\n        console.error(\"compress error: not enough data\");\n    else {\n        for (var f = function (e) {\n            for (var r = new Array(132), t = 0; t < 16; t++)\n                r[t] = e[4 * t] << 24,\n                    r[t] |= e[4 * t + 1] << 16,\n                    r[t] |= e[4 * t + 2] << 8,\n                    r[t] |= e[4 * t + 3],\n                    r[t] >>>= 0;\n            for (var n = 16; n < 68; n++) {\n                var a = r[n - 16] ^ r[n - 9] ^ le(r[n - 3], 15);\n                a = a ^ le(a, 15) ^ le(a, 23),\n                    r[n] = (a ^ le(r[n - 13], 7) ^ r[n - 6]) >>> 0\n            }\n            for (n = 0; n < 64; n++)\n                r[n + 68] = (r[n] ^ r[n + 4]) >>> 0;\n            return r\n        }(t), i = this['reg'].slice(0), c = 0; c < 64; c++) {\n            var o = le(i[0], 12) + i[4] + le(de(c), c)\n                , s = ((o = le(o = (4294967295 & o) >>> 0, 7)) ^ le(i[0], 12)) >>> 0\n                , u = pe(c, i[0], i[1], i[2]);\n            u = (4294967295 & (u = u + i[3] + s + f[c + 68])) >>> 0;\n            var b = he(c, i[4], i[5], i[6]);\n            b = (4294967295 & (b = b + i[7] + o + f[c])) >>> 0,\n                i[3] = i[2],\n                i[2] = le(i[1], 9),\n                i[1] = i[0],\n                i[0] = u,\n                i[7] = i[6],\n                i[6] = le(i[5], 19),\n                i[5] = i[4],\n                i[4] = (b ^ le(b, 9) ^ le(b, 17)) >>> 0\n        }\n        for (var l = 0; l < 8; l++)\n            this['reg'][l] = (this['reg'][l] ^ i[l]) >>> 0\n    }\n}\n\nfunction _fill() {\n    var a = 8 * this['size']\n        , f = this['chunk']['push'](128) % 64;\n    for (64 - f < 8 && (f -= 64); f < 56; f++)\n        this.chunk['push'](0);\n    for (var i = 0; i < 4; i++) {\n        var c = Math['floor'](a / 4294967296);\n        this['chunk'].push(c >>> 8 * (3 - i) & 255)\n    }\n    for (i = 0; i < 4; i++)\n        this['chunk']['push'](a >>> 8 * (3 - i) & 255)\n\n}\n\nfunction SM3() {\n    this.reg = [];\n    this.chunk = [];\n    this.size = 0;\n    this.reset()\n}\nSM3.prototype.reset = reset;\nSM3.prototype.write = write;\nSM3.prototype.sum = sum;\nSM3.prototype._compress = _compress;\nSM3.prototype._fill = _fill;\n\nfunction result_encrypt(long_str, num = null) {\n    let s_obj = {\n        \"s0\": \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\",\n        \"s1\": \"Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=\",\n        \"s2\": \"Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=\",\n        \"s3\": \"ckdp1h4ZKsUB80/Mfvw36XIgR25+WQAlEi7NLboqYTOPuzmFjJnryx9HVGDaStCe\",\n        \"s4\": \"Dkdpgh2ZmsQB80/MfvV36XI1R45-WUAlEixNLwoqYTOPuzKFjJnry79HbGcaStCe\"\n    }\n    let constant = {\n        \"0\": 16515072,\n        \"1\": 258048,\n        \"2\": 4032,\n        \"str\": s_obj[num],\n    }\n\n    let result = \"\";\n    let lound = 0;\n    let long_int = get_long_int(lound, long_str);\n    for (let i = 0; i < long_str.length / 3 * 4; i++) {\n        if (Math.floor(i / 4) !== lound) {\n            lound += 1;\n            long_int = get_long_int(lound, long_str);\n        }\n        let key = i % 4;\n        switch (key) {\n            case 0:\n                temp_int = (long_int & constant[\"0\"]) >> 18;\n                result += constant[\"str\"].charAt(temp_int);\n                break;\n            case 1:\n                temp_int = (long_int & constant[\"1\"]) >> 12;\n                result += constant[\"str\"].charAt(temp_int);\n                break;\n            case 2:\n                temp_int = (long_int & constant[\"2\"]) >> 6;\n                result += constant[\"str\"].charAt(temp_int);\n                break;\n            case 3:\n                temp_int = long_int & 63;\n                result += constant[\"str\"].charAt(temp_int);\n                break;\n            default:\n                break;\n        }\n    }\n    return result;\n}\n\nfunction get_long_int(round, long_str) {\n    round = round * 3;\n    return (long_str.charCodeAt(round) << 16) | (long_str.charCodeAt(round + 1) << 8) | (long_str.charCodeAt(round + 2));\n}\n\nfunction gener_random(random, option) {\n    return [\n        (random & 255 & 170) | option[0] & 85, // 163\n        (random & 255 & 85) | option[0] & 170, //87\n        (random >> 8 & 255 & 170) | option[1] & 85, //37\n        (random >> 8 & 255 & 85) | option[1] & 170, //41\n    ]\n}\n\n//////////////////////////////////////////////\nfunction generate_rc4_bb_str(url_search_params, user_agent, window_env_str, suffix = \"cus\", Arguments = [0, 1, 14]) {\n    let sm3 = new SM3()\n    let start_time = Date.now()\n    /**\n     * 进行3次加密处理\n     * 1: url_search_params两次sm3之的结果\n     * 2: 对后缀两次sm3之的结果\n     * 3: 对ua处理之后的结果\n     */\n        // url_search_params两次sm3之的结果\n    let url_search_params_list = sm3.sum(sm3.sum(url_search_params + suffix))\n    // 对后缀两次sm3之的结果\n    let cus = sm3.sum(sm3.sum(suffix))\n    // 对ua处理之后的结果\n    let ua = sm3.sum(result_encrypt(rc4_encrypt(user_agent, String.fromCharCode.apply(null, [0.00390625, 1, Arguments[2]])), \"s3\"))\n    //\n    let end_time = Date.now()\n    // b\n    let b = {\n        8: 3, // 固定\n        10: end_time, //3次加密结束时间\n        15: {\n            \"aid\": 6383,\n            \"pageId\": 6241,\n            \"boe\": false,\n            \"ddrt\": 7,\n            \"paths\": {\n                \"include\": [\n                    {},\n                    {},\n                    {},\n                    {},\n                    {},\n                    {},\n                    {}\n                ],\n                \"exclude\": []\n            },\n            \"track\": {\n                \"mode\": 0,\n                \"delay\": 300,\n                \"paths\": []\n            },\n            \"dump\": true,\n            \"rpU\": \"\"\n        },\n        16: start_time, //3次加密开始时间\n        18: 44, //固定\n        19: [1, 0, 1, 5],\n    }\n\n    //3次加密开始时间\n    b[20] = (b[16] >> 24) & 255\n    b[21] = (b[16] >> 16) & 255\n    b[22] = (b[16] >> 8) & 255\n    b[23] = b[16] & 255\n    b[24] = (b[16] / 256 / 256 / 256 / 256) >> 0\n    b[25] = (b[16] / 256 / 256 / 256 / 256 / 256) >> 0\n\n    // 参数Arguments [0, 1, 14, ...]\n    // let Arguments = [0, 1, 14]\n    b[26] = (Arguments[0] >> 24) & 255\n    b[27] = (Arguments[0] >> 16) & 255\n    b[28] = (Arguments[0] >> 8) & 255\n    b[29] = Arguments[0] & 255\n\n    b[30] = (Arguments[1] / 256) & 255\n    b[31] = (Arguments[1] % 256) & 255\n    b[32] = (Arguments[1] >> 24) & 255\n    b[33] = (Arguments[1] >> 16) & 255\n\n    b[34] = (Arguments[2] >> 24) & 255\n    b[35] = (Arguments[2] >> 16) & 255\n    b[36] = (Arguments[2] >> 8) & 255\n    b[37] = Arguments[2] & 255\n\n    // (url_search_params + \"cus\") 两次sm3之的结果\n    /**let url_search_params_list = [\n     91, 186,  35,  86, 143, 253,   6,  76,\n     34,  21, 167, 148,   7,  42, 192, 219,\n     188,  20, 182,  85, 213,  74, 213, 147,\n     37, 155,  93, 139,  85, 118, 228, 213\n     ]*/\n    b[38] = url_search_params_list[21]\n    b[39] = url_search_params_list[22]\n\n    // (\"cus\") 对后缀两次sm3之的结果\n    /**\n     * let cus = [\n     136, 101, 114, 147,  58,  77, 207, 201,\n     215, 162, 154,  93, 248,  13, 142, 160,\n     105,  73, 215, 241,  83,  58,  51,  43,\n     255,  38, 168, 141, 216, 194,  35, 236\n     ]*/\n    b[40] = cus[21]\n    b[41] = cus[22]\n\n    // 对ua处理之后的结果\n    /**\n     * let ua = [\n     129, 190,  70, 186,  86, 196, 199,  53,\n     99,  38,  29, 209, 243,  17, 157,  69,\n     147, 104,  53,  23, 114, 126,  66, 228,\n     135,  30, 168, 185, 109, 156, 251,  88\n     ]*/\n    b[42] = ua[23]\n    b[43] = ua[24]\n\n    //3次加密结束时间\n    b[44] = (b[10] >> 24) & 255\n    b[45] = (b[10] >> 16) & 255\n    b[46] = (b[10] >> 8) & 255\n    b[47] = b[10] & 255\n    b[48] = b[8]\n    b[49] = (b[10] / 256 / 256 / 256 / 256) >> 0\n    b[50] = (b[10] / 256 / 256 / 256 / 256 / 256) >> 0\n\n\n    // object配置项\n    b[51] = b[15]['pageId']\n    b[52] = (b[15]['pageId'] >> 24) & 255\n    b[53] = (b[15]['pageId'] >> 16) & 255\n    b[54] = (b[15]['pageId'] >> 8) & 255\n    b[55] = b[15]['pageId'] & 255\n\n    b[56] = b[15]['aid']\n    b[57] = b[15]['aid'] & 255\n    b[58] = (b[15]['aid'] >> 8) & 255\n    b[59] = (b[15]['aid'] >> 16) & 255\n    b[60] = (b[15]['aid'] >> 24) & 255\n\n    // 中间进行了环境检测\n    // 代码索引:  2496 索引值:  17 （索引64关键条件）\n    // '1536|747|1536|834|0|30|0|0|1536|834|1536|864|1525|747|24|24|Win32'.charCodeAt()得到65位数组\n    /**\n     * let window_env_list = [49, 53, 51, 54, 124, 55, 52, 55, 124, 49, 53, 51, 54, 124, 56, 51, 52, 124, 48, 124, 51,\n     * 48, 124, 48, 124, 48, 124, 49, 53, 51, 54, 124, 56, 51, 52, 124, 49, 53, 51, 54, 124, 56,\n     * 54, 52, 124, 49, 53, 50, 53, 124, 55, 52, 55, 124, 50, 52, 124, 50, 52, 124, 87, 105, 110,\n     * 51, 50]\n     */\n    let window_env_list = [];\n    for (let index = 0; index < window_env_str.length; index++) {\n        window_env_list.push(window_env_str.charCodeAt(index))\n    }\n    b[64] = window_env_list.length\n    b[65] = b[64] & 255\n    b[66] = (b[64] >> 8) & 255\n\n    b[69] = [].length\n    b[70] = b[69] & 255\n    b[71] = (b[69] >> 8) & 255\n\n    b[72] = b[18] ^ b[20] ^ b[26] ^ b[30] ^ b[38] ^ b[40] ^ b[42] ^ b[21] ^ b[27] ^ b[31] ^ b[35] ^ b[39] ^ b[41] ^ b[43] ^ b[22] ^\n        b[28] ^ b[32] ^ b[36] ^ b[23] ^ b[29] ^ b[33] ^ b[37] ^ b[44] ^ b[45] ^ b[46] ^ b[47] ^ b[48] ^ b[49] ^ b[50] ^ b[24] ^\n        b[25] ^ b[52] ^ b[53] ^ b[54] ^ b[55] ^ b[57] ^ b[58] ^ b[59] ^ b[60] ^ b[65] ^ b[66] ^ b[70] ^ b[71]\n    let bb = [\n        b[18], b[20], b[52], b[26], b[30], b[34], b[58], b[38], b[40], b[53], b[42], b[21], b[27], b[54], b[55], b[31],\n        b[35], b[57], b[39], b[41], b[43], b[22], b[28], b[32], b[60], b[36], b[23], b[29], b[33], b[37], b[44], b[45],\n        b[59], b[46], b[47], b[48], b[49], b[50], b[24], b[25], b[65], b[66], b[70], b[71]\n    ]\n    bb = bb.concat(window_env_list).concat(b[72])\n    return rc4_encrypt(String.fromCharCode.apply(null, bb), String.fromCharCode.apply(null, [121]));\n}\n\nfunction generate_random_str() {\n    let random_str_list = []\n    random_str_list = random_str_list.concat(gener_random(Math.random() * 10000, [3, 45]))\n    random_str_list = random_str_list.concat(gener_random(Math.random() * 10000, [1, 0]))\n    random_str_list = random_str_list.concat(gener_random(Math.random() * 10000, [1, 5]))\n    return String.fromCharCode.apply(null, random_str_list)\n}\n\nfunction sign(url_search_params, user_agent, arguments) {\n    /**\n     * url_search_params：\"device_platform=webapp&aid=6383&channel=channel_pc_web&update_version_code=170400&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1536&screen_height=864&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=123.0.0.0&browser_online=true&engine_name=Blink&engine_version=123.0.0.0&os_name=Windows&os_version=10&cpu_core_num=16&device_memory=8&platform=PC&downlink=10&effective_type=4g&round_trip_time=50&webid=7362810250930783783&msToken=VkDUvz1y24CppXSl80iFPr6ez-3FiizcwD7fI1OqBt6IICq9RWG7nCvxKb8IVi55mFd-wnqoNkXGnxHrikQb4PuKob5Q-YhDp5Um215JzlBszkUyiEvR\"\n     * user_agent：\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36\"\n     */\n    let result_str = generate_random_str() + generate_rc4_bb_str(\n        url_search_params,\n        user_agent,\n        \"1536|747|1536|834|0|30|0|0|1536|834|1536|864|1525|747|24|24|Win32\",\n        \"cus\",\n        arguments\n    );\n    return result_encrypt(result_str, \"s4\") + \"=\";\n}\n\nfunction sign_datail(params, userAgent) {\n    return sign(params, userAgent, [0, 1, 14])\n}\n\nfunction sign_reply(params, userAgent) {\n    return sign(params, userAgent, [0, 1, 8])\n}"
  },
  {
    "path": "libs/zhihu.js",
    "content": "// copy from https://github.com/tiam-bloom/zhihuQuestionAnswer/blob/main/zhihuvmp.js thanks to tiam-bloom\n// 仅供学习交流使用，严禁用于商业用途，也不要滥用，否则后果自负\n// modified by relakkes\n\nconst crypto = require('crypto'); // 导入加密模块\n\n\nlet init_str = \"6fpLRqJO8M/c3jnYxFkUVC4ZIG12SiH=5v0mXDazWBTsuw7QetbKdoPyAl+hN9rgE\";\nvar h = {\n    zk: [1170614578, 1024848638, 1413669199, -343334464, -766094290, -1373058082, -143119608, -297228157, 1933479194, -971186181, -406453910, 460404854, -547427574, -1891326262, -1679095901, 2119585428, -2029270069, 2035090028, -1521520070, -5587175, -77751101, -2094365853, -1243052806, 1579901135, 1321810770, 456816404, -1391643889, -229302305, 330002838, -788960546, 363569021, -1947871109],\n    zb: [20, 223, 245, 7, 248, 2, 194, 209, 87, 6, 227, 253, 240, 128, 222, 91, 237, 9, 125, 157, 230, 93, 252, 205, 90, 79, 144, 199, 159, 197, 186, 167, 39, 37, 156, 198, 38, 42, 43, 168, 217, 153, 15, 103, 80, 189, 71, 191, 97, 84, 247, 95, 36, 69, 14, 35, 12, 171, 28, 114, 178, 148, 86, 182, 32, 83, 158, 109, 22, 255, 94, 238, 151, 85, 77, 124, 254, 18, 4, 26, 123, 176, 232, 193, 131, 172, 143, 142, 150, 30, 10, 146, 162, 62, 224, 218, 196, 229, 1, 192, 213, 27, 110, 56, 231, 180, 138, 107, 242, 187, 54, 120, 19, 44, 117, 228, 215, 203, 53, 239, 251, 127, 81, 11, 133, 96, 204, 132, 41, 115, 73, 55, 249, 147, 102, 48, 122, 145, 106, 118, 74, 190, 29, 16, 174, 5, 177, 129, 63, 113, 99, 31, 161, 76, 246, 34, 211, 13, 60, 68, 207, 160, 65, 111, 82, 165, 67, 169, 225, 57, 112, 244, 155, 51, 236, 200, 233, 58, 61, 47, 100, 137, 185, 64, 17, 70, 234, 163, 219, 108, 170, 166, 59, 149, 52, 105, 24, 212, 78, 173, 45, 0, 116, 226, 119, 136, 206, 135, 175, 195, 25, 92, 121, 208, 126, 139, 3, 75, 141, 21, 130, 98, 241, 40, 154, 66, 184, 49, 181, 46, 243, 88, 101, 183, 8, 23, 72, 188, 104, 179, 210, 134, 250, 201, 164, 89, 216, 202, 220, 50, 221, 152, 140, 33, 235, 214]\n\n};\n\nfunction i(e, t, n) {\n    t[n] = 255 & e >>> 24,\n        t[n + 1] = 255 & e >>> 16,\n        t[n + 2] = 255 & e >>> 8,\n        t[n + 3] = 255 & e\n}\n\nfunction Q(e, t) {\n    return (4294967295 & e) << t | e >>> 32 - t\n}\n\nfunction B(e, t) {\n    return (255 & e[t]) << 24 | (255 & e[t + 1]) << 16 | (255 & e[t + 2]) << 8 | 255 & e[t + 3]\n}\n\nfunction G(e) {\n    var t = new Array(4)\n        , n = new Array(4);\n    i(e, t, 0),\n        n[0] = h.zb[255 & t[0]],\n        n[1] = h.zb[255 & t[1]],\n        n[2] = h.zb[255 & t[2]],\n        n[3] = h.zb[255 & t[3]];\n\n    var r = B(n, 0);\n    return r ^ Q(r, 2) ^ Q(r, 10) ^ Q(r, 18) ^ Q(r, 24)\n}\n\nfunction array_0_16_offset(e) {\n    var t = new Array(16)\n        , n = new Array(36);\n    n[0] = B(e, 0),\n        n[1] = B(e, 4),\n        n[2] = B(e, 8),\n        n[3] = B(e, 12);\n    for (var r = 0; r < 32; r++) {\n        var o = G(n[r + 1] ^ n[r + 2] ^ n[r + 3] ^ h.zk[r]);\n        n[r + 4] = n[r] ^ o\n    }\n    return i(n[35], t, 0),\n        i(n[34], t, 4),\n        i(n[33], t, 8),\n        i(n[32], t, 12),\n        t\n\n}\n\nfunction array_16_48_offset(e, t) {\n    for (var n = [], r = e.length, i = 0; 0 < r; r -= 16) {\n        for (var o = e.slice(16 * i, 16 * (i + 1)), a = new Array(16), c = 0; c < 16; c++)\n            a[c] = o[c] ^ t[c];\n        t = array_0_16_offset(a),\n            n = n.concat(t),\n            i++\n    }\n    return n\n}\n\nfunction encode_0_16(array_0_16) {\n    let result = [];\n    let array_offset = [48, 53, 57, 48, 53, 51, 102, 55, 100, 49, 53, 101, 48, 49, 100, 55];\n    for (let i = 0; i < array_0_16.length; i++) {\n        let a = array_0_16[i] ^ array_offset[i],\n            b = a ^ 42;\n        result.push(b)\n    }\n    return array_0_16_offset(result)\n}\n\nfunction encode(ar) {\n    let b = ar[1] << 8,\n        c = ar[0] | b,\n        d = ar[2] << 16,\n        e = c | d,\n        result_array = [],\n        x6 = 6;\n    result_array.push(e & 63);\n    while (result_array.length < 4) {\n        let a = e >>> x6;\n        result_array.push(a & 63);\n        x6 += 6;\n    }\n    return result_array\n}\n\nfunction get_init_array(encode_md5) {\n    let init_array = []\n    for (let i = 0; i < encode_md5.length; i++) {\n        init_array.push(encode_md5.charCodeAt(i))\n    }\n    init_array.unshift(0)\n    init_array.unshift(Math.floor(Math.random() * 127))\n    while (init_array.length < 48) {\n        init_array.push(14)\n    }\n    let array_0_16 = encode_0_16(init_array.slice(0, 16)),\n        array_16_48 = array_16_48_offset(init_array.slice(16, 48), array_0_16),\n        array_result = array_0_16.concat(array_16_48);\n    return array_result\n}\n\nfunction get_zse_96(encode_md5) {\n    let result_array = [],\n        init_array = get_init_array(encode_md5),\n        result = \"\";\n    for (let i = 47; i >= 0; i -= 4) {\n        init_array[i] ^= 58\n    }\n    init_array.reverse()\n    for (let j = 3; j <= init_array.length; j += 3) {\n        let ar = init_array.slice(j - 3, j);\n        result_array = result_array.concat(encode(ar))\n    }\n    for (let index = 0; index < result_array.length; index++) {\n        result += init_str.charAt(result_array[index])\n    }\n    result = '2.0_' + result\n    return result\n}\n\n/***********************relakkes modify*******************************************************/\n\n/**\n * 从cookies中提取dc0的值\n * @param cookies\n * @returns {string}\n */\nconst extract_dc0_value_from_cookies = function (cookies) {\n    const t9 = RegExp(\"d_c0=([^;]+)\")\n    const tt = t9.exec(cookies);\n    const dc0 = tt && tt[1]\n    return tt && tt[1]\n}\n\n/**\n * 获取zhihu sign value 对python暴漏的接口\n * @param url 请求的路由参数\n * @param cookies 请求的cookies，需要包含dc0这个key\n * @returns {*}\n */\nfunction get_sign(url, cookies) {\n    const ta = \"101_3_3.0\"\n    const dc0 = extract_dc0_value_from_cookies(cookies)\n    const tc = \"3_2.0aR_sn77yn6O92wOB8hPZnQr0EMYxc4f18wNBUgpTQ6nxERFZfTY0-4Lm-h3_tufIwJS8gcxTgJS_AuPZNcXCTwxI78YxEM20s4PGDwN8gGcYAupMWufIoLVqr4gxrRPOI0cY7HL8qun9g93mFukyigcmebS_FwOYPRP0E4rZUrN9DDom3hnynAUMnAVPF_PhaueTFH9fQL39OCCqYTxfb0rfi9wfPhSM6vxGDJo_rBHpQGNmBBLqPJHK2_w8C9eTVMO9Z9NOrMtfhGH_DgpM-BNM1DOxScLG3gg1Hre1FCXKQcXKkrSL1r9GWDXMk8wqBLNmbRH96BtOFqVZ7UYG3gC8D9cMS7Y9UrHLVCLZPJO8_CL_6GNCOg_zhJS8PbXmGTcBpgxfkieOPhNfthtf2gC_qD3YOce8nCwG2uwBOqeMoML9NBC1xb9yk6SuJhHLK7SM6LVfCve_3vLKlqcL6TxL_UosDvHLxrHmWgxBQ8Xs\"\n    const params_join_str = [ta, url, dc0, tc].join(\"+\")\n    const params_md5_value = crypto.createHash('md5').update(params_join_str).digest('hex')\n\n    return {\n        \"x-zst-81\": tc,\n        \"x-zse-96\": get_zse_96(params_md5_value),\n    }\n}\n"
  },
  {
    "path": "main.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/main.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\nimport sys\nimport io\n\n# Force UTF-8 encoding for stdout/stderr to prevent encoding errors\n# when outputting Chinese characters in non-UTF-8 terminals\nif sys.stdout and hasattr(sys.stdout, 'buffer'):\n    if sys.stdout.encoding and sys.stdout.encoding.lower() != 'utf-8':\n        sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')\nif sys.stderr and hasattr(sys.stderr, 'buffer'):\n    if sys.stderr.encoding and sys.stderr.encoding.lower() != 'utf-8':\n        sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace')\n\nimport asyncio\nfrom typing import Optional, Type\n\nimport cmd_arg\nimport config\nfrom database import db\nfrom base.base_crawler import AbstractCrawler\nfrom media_platform.bilibili import BilibiliCrawler\nfrom media_platform.douyin import DouYinCrawler\nfrom media_platform.kuaishou import KuaishouCrawler\nfrom media_platform.tieba import TieBaCrawler\nfrom media_platform.weibo import WeiboCrawler\nfrom media_platform.xhs import XiaoHongShuCrawler\nfrom media_platform.zhihu import ZhihuCrawler\nfrom tools.async_file_writer import AsyncFileWriter\nfrom var import crawler_type_var\n\n\nclass CrawlerFactory:\n    CRAWLERS: dict[str, Type[AbstractCrawler]] = {\n        \"xhs\": XiaoHongShuCrawler,\n        \"dy\": DouYinCrawler,\n        \"ks\": KuaishouCrawler,\n        \"bili\": BilibiliCrawler,\n        \"wb\": WeiboCrawler,\n        \"tieba\": TieBaCrawler,\n        \"zhihu\": ZhihuCrawler,\n    }\n\n    @staticmethod\n    def create_crawler(platform: str) -> AbstractCrawler:\n        crawler_class = CrawlerFactory.CRAWLERS.get(platform)\n        if not crawler_class:\n            supported = \", \".join(sorted(CrawlerFactory.CRAWLERS))\n            raise ValueError(f\"Invalid media platform: {platform!r}. Supported: {supported}\")\n        return crawler_class()\n\n\ncrawler: Optional[AbstractCrawler] = None\n\n\ndef _flush_excel_if_needed() -> None:\n    if config.SAVE_DATA_OPTION != \"excel\":\n        return\n\n    try:\n        from store.excel_store_base import ExcelStoreBase\n\n        ExcelStoreBase.flush_all()\n        print(\"[Main] Excel files saved successfully\")\n    except Exception as e:\n        print(f\"[Main] Error flushing Excel data: {e}\")\n\n\nasync def _generate_wordcloud_if_needed() -> None:\n    if config.SAVE_DATA_OPTION not in (\"json\", \"jsonl\") or not config.ENABLE_GET_WORDCLOUD:\n        return\n\n    try:\n        file_writer = AsyncFileWriter(\n            platform=config.PLATFORM,\n            crawler_type=crawler_type_var.get(),\n        )\n        await file_writer.generate_wordcloud_from_comments()\n    except Exception as e:\n        print(f\"[Main] Error generating wordcloud: {e}\")\n\n\nasync def main() -> None:\n    global crawler\n\n    args = await cmd_arg.parse_cmd()\n    if args.init_db:\n        await db.init_db(args.init_db)\n        print(f\"Database {args.init_db} initialized successfully.\")\n        return\n\n    crawler = CrawlerFactory.create_crawler(platform=config.PLATFORM)\n    await crawler.start()\n\n    _flush_excel_if_needed()\n\n    # Generate wordcloud after crawling is complete\n    # Only for JSON save mode\n    await _generate_wordcloud_if_needed()\n\n\nasync def async_cleanup() -> None:\n    global crawler\n    if crawler:\n        if getattr(crawler, \"cdp_manager\", None):\n            try:\n                await crawler.cdp_manager.cleanup(force=True)\n            except Exception as e:\n                error_msg = str(e).lower()\n                if \"closed\" not in error_msg and \"disconnected\" not in error_msg:\n                    print(f\"[Main] Error cleaning up CDP browser: {e}\")\n\n        elif getattr(crawler, \"browser_context\", None):\n            try:\n                await crawler.browser_context.close()\n            except Exception as e:\n                error_msg = str(e).lower()\n                if \"closed\" not in error_msg and \"disconnected\" not in error_msg:\n                    print(f\"[Main] Error closing browser context: {e}\")\n\n    if config.SAVE_DATA_OPTION in (\"db\", \"sqlite\"):\n        await db.close()\n\nif __name__ == \"__main__\":\n    from tools.app_runner import run\n\n    def _force_stop() -> None:\n        c = crawler\n        if not c:\n            return\n        cdp_manager = getattr(c, \"cdp_manager\", None)\n        launcher = getattr(cdp_manager, \"launcher\", None)\n        if not launcher:\n            return\n        try:\n            launcher.cleanup()\n        except Exception:\n            pass\n\n    run(main, async_cleanup, cleanup_timeout_seconds=15.0, on_first_interrupt=_force_stop)\n"
  },
  {
    "path": "media_platform/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n"
  },
  {
    "path": "media_platform/bilibili/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/bilibili/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2023/12/2 18:36\n# @Desc    :\n\nfrom .core import *\n"
  },
  {
    "path": "media_platform/bilibili/client.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/bilibili/client.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2023/12/2 18:44\n# @Desc    : bilibili request client\nimport asyncio\nimport json\nimport random\nfrom typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Tuple, Union\nfrom urllib.parse import urlencode\n\nimport httpx\nfrom playwright.async_api import BrowserContext, Page\nfrom tools.httpx_util import make_async_client\n\nimport config\nfrom base.base_crawler import AbstractApiClient\nfrom proxy.proxy_mixin import ProxyRefreshMixin\nfrom tools import utils\n\nif TYPE_CHECKING:\n    from proxy.proxy_ip_pool import ProxyIpPool\n\nfrom .exception import DataFetchError\nfrom .field import CommentOrderType, SearchOrderType\nfrom .help import BilibiliSign\n\n\nclass BilibiliClient(AbstractApiClient, ProxyRefreshMixin):\n\n    def __init__(\n        self,\n        timeout=60,  # For media crawling, Bilibili long videos need a longer timeout\n        proxy=None,\n        *,\n        headers: Dict[str, str],\n        playwright_page: Page,\n        cookie_dict: Dict[str, str],\n        proxy_ip_pool: Optional[\"ProxyIpPool\"] = None,\n    ):\n        self.proxy = proxy\n        self.timeout = timeout\n        self.headers = headers\n        self._host = \"https://api.bilibili.com\"\n        self.playwright_page = playwright_page\n        self.cookie_dict = cookie_dict\n        # Initialize proxy pool (from ProxyRefreshMixin)\n        self.init_proxy_pool(proxy_ip_pool)\n\n    async def request(self, method, url, **kwargs) -> Any:\n        # Check if proxy has expired before each request\n        await self._refresh_proxy_if_expired()\n\n        async with make_async_client(proxy=self.proxy) as client:\n            response = await client.request(method, url, timeout=self.timeout, **kwargs)\n        try:\n            data: Dict = response.json()\n        except json.JSONDecodeError:\n            utils.logger.error(f\"[BilibiliClient.request] Failed to decode JSON from response. status_code: {response.status_code}, response_text: {response.text}\")\n            raise DataFetchError(f\"Failed to decode JSON, content: {response.text}\")\n        if data.get(\"code\") != 0:\n            raise DataFetchError(data.get(\"message\", \"unkonw error\"))\n        else:\n            return data.get(\"data\", {})\n\n    async def pre_request_data(self, req_data: Dict) -> Dict:\n        \"\"\"\n        Send request to sign request parameters\n        Need to get wbi_img_urls parameter from localStorage, value as follows:\n        https://i0.hdslb.com/bfs/wbi/7cd084941338484aae1ad9425b84077c.png-https://i0.hdslb.com/bfs/wbi/4932caff0ff746eab6f01bf08b70ac45.png\n        :param req_data:\n        :return:\n        \"\"\"\n        if not req_data:\n            return {}\n        img_key, sub_key = await self.get_wbi_keys()\n        return BilibiliSign(img_key, sub_key).sign(req_data)\n\n    async def get_wbi_keys(self) -> Tuple[str, str]:\n        \"\"\"\n        Get the latest img_key and sub_key\n        :return:\n        \"\"\"\n        local_storage = await self.playwright_page.evaluate(\"() => window.localStorage\")\n        wbi_img_urls = local_storage.get(\"wbi_img_urls\", \"\")\n        if not wbi_img_urls:\n            img_url_from_storage = local_storage.get(\"wbi_img_url\")\n            sub_url_from_storage = local_storage.get(\"wbi_sub_url\")\n            if img_url_from_storage and sub_url_from_storage:\n                wbi_img_urls = f\"{img_url_from_storage}-{sub_url_from_storage}\"\n        if wbi_img_urls and \"-\" in wbi_img_urls:\n            img_url, sub_url = wbi_img_urls.split(\"-\")\n        else:\n            resp = await self.request(method=\"GET\", url=self._host + \"/x/web-interface/nav\")\n            img_url: str = resp['wbi_img']['img_url']\n            sub_url: str = resp['wbi_img']['sub_url']\n        img_key = img_url.rsplit('/', 1)[1].split('.')[0]\n        sub_key = sub_url.rsplit('/', 1)[1].split('.')[0]\n        return img_key, sub_key\n\n    async def get(self, uri: str, params=None, enable_params_sign: bool = True) -> Dict:\n        final_uri = uri\n        if enable_params_sign:\n            params = await self.pre_request_data(params)\n        if isinstance(params, dict):\n            final_uri = (f\"{uri}?\"\n                         f\"{urlencode(params)}\")\n        return await self.request(method=\"GET\", url=f\"{self._host}{final_uri}\", headers=self.headers)\n\n    async def post(self, uri: str, data: dict) -> Dict:\n        data = await self.pre_request_data(data)\n        json_str = json.dumps(data, separators=(',', ':'), ensure_ascii=False)\n        return await self.request(method=\"POST\", url=f\"{self._host}{uri}\", data=json_str, headers=self.headers)\n\n    async def pong(self) -> bool:\n        \"\"\"get a note to check if login state is ok\"\"\"\n        utils.logger.info(\"[BilibiliClient.pong] Begin pong bilibili...\")\n        ping_flag = False\n        try:\n            check_login_uri = \"/x/web-interface/nav\"\n            response = await self.get(check_login_uri)\n            if response.get(\"isLogin\"):\n                utils.logger.info(\"[BilibiliClient.pong] Use cache login state get web interface successfull!\")\n                ping_flag = True\n        except Exception as e:\n            utils.logger.error(f\"[BilibiliClient.pong] Pong bilibili failed: {e}, and try to login again...\")\n            ping_flag = False\n        return ping_flag\n\n    async def update_cookies(self, browser_context: BrowserContext):\n        cookie_str, cookie_dict = utils.convert_cookies(await browser_context.cookies())\n        self.headers[\"Cookie\"] = cookie_str\n        self.cookie_dict = cookie_dict\n\n    async def search_video_by_keyword(\n        self,\n        keyword: str,\n        page: int = 1,\n        page_size: int = 20,\n        order: SearchOrderType = SearchOrderType.DEFAULT,\n        pubtime_begin_s: int = 0,\n        pubtime_end_s: int = 0,\n    ) -> Dict:\n        \"\"\"\n        KuaiShou web search api\n        :param keyword: Search keyword\n        :param page: Page number for pagination\n        :param page_size: Number of items per page\n        :param order: Sort order for search results, default is comprehensive sorting\n        :param pubtime_begin_s: Publish time start timestamp\n        :param pubtime_end_s: Publish time end timestamp\n        :return:\n        \"\"\"\n        uri = \"/x/web-interface/wbi/search/type\"\n        post_data = {\n            \"search_type\": \"video\",\n            \"keyword\": keyword,\n            \"page\": page,\n            \"page_size\": page_size,\n            \"order\": order.value,\n            \"pubtime_begin_s\": pubtime_begin_s,\n            \"pubtime_end_s\": pubtime_end_s\n        }\n        return await self.get(uri, post_data)\n\n    async def get_video_info(self, aid: Union[int, None] = None, bvid: Union[str, None] = None) -> Dict:\n        \"\"\"\n        Bilibli web video detail api, choose one parameter between aid and bvid\n        :param aid: Video aid\n        :param bvid: Video bvid\n        :return:\n        \"\"\"\n        if not aid and not bvid:\n            raise ValueError(\"Please provide at least one parameter: aid or bvid\")\n\n        uri = \"/x/web-interface/view/detail\"\n        params = dict()\n        if aid:\n            params.update({\"aid\": aid})\n        else:\n            params.update({\"bvid\": bvid})\n        return await self.get(uri, params, enable_params_sign=False)\n\n    async def get_video_play_url(self, aid: int, cid: int) -> Dict:\n        \"\"\"\n        Bilibli web video play url api\n        :param aid: Video aid\n        :param cid: cid\n        :return:\n        \"\"\"\n        if not aid or not cid or aid <= 0 or cid <= 0:\n            raise ValueError(\"aid and cid must exist\")\n        uri = \"/x/player/wbi/playurl\"\n        qn_value = getattr(config, \"BILI_QN\", 80)\n        params = {\n            \"avid\": aid,\n            \"cid\": cid,\n            \"qn\": qn_value,\n            \"fourk\": 1,\n            \"fnval\": 1,\n            \"platform\": \"pc\",\n        }\n\n        return await self.get(uri, params, enable_params_sign=True)\n\n    async def get_video_media(self, url: str) -> Union[bytes, None]:\n        # Follow CDN 302 redirects and treat any 2xx as success (some endpoints return 206)\n        async with make_async_client(proxy=self.proxy, follow_redirects=True) as client:\n            try:\n                response = await client.request(\"GET\", url, timeout=self.timeout, headers=self.headers)\n                response.raise_for_status()\n                if 200 <= response.status_code < 300:\n                    return response.content\n                utils.logger.error(\n                    f\"[BilibiliClient.get_video_media] Unexpected status {response.status_code} for {url}\"\n                )\n                return None\n            except httpx.HTTPError as exc:  # some wrong when call httpx.request method, such as connection error, client error, server error or response status code is not 2xx\n                utils.logger.error(f\"[BilibiliClient.get_video_media] {exc.__class__.__name__} for {exc.request.url} - {exc}\")  # Keep original exception type name for developer debugging\n                return None\n\n    async def get_video_comments(\n        self,\n        video_id: str,\n        order_mode: CommentOrderType = CommentOrderType.DEFAULT,\n        next: int = 0,\n    ) -> Dict:\n        \"\"\"get video comments\n        :param video_id: Video ID\n        :param order_mode: Sort order\n        :param next: Comment page selection\n        :return:\n        \"\"\"\n        uri = \"/x/v2/reply/wbi/main\"\n        post_data = {\"oid\": video_id, \"mode\": order_mode.value, \"type\": 1, \"ps\": 20, \"next\": next}\n        return await self.get(uri, post_data)\n\n    async def get_video_all_comments(\n        self,\n        video_id: str,\n        crawl_interval: float = 1.0,\n        is_fetch_sub_comments=False,\n        callback: Optional[Callable] = None,\n        max_count: int = 10,\n    ):\n        \"\"\"\n        get video all comments include sub comments\n        :param video_id:\n        :param crawl_interval:\n        :param is_fetch_sub_comments:\n        :param callback:\n        max_count: Maximum number of comments to crawl per note\n\n        :return:\n        \"\"\"\n        result = []\n        is_end = False\n        next_page = 0\n        max_retries = 3\n        while not is_end and len(result) < max_count:\n            comments_res = None\n            for attempt in range(max_retries):\n                try:\n                    comments_res = await self.get_video_comments(video_id, CommentOrderType.DEFAULT, next_page)\n                    break  # Success\n                except DataFetchError as e:\n                    if attempt < max_retries - 1:\n                        delay = 5 * (2**attempt) + random.uniform(0, 1)\n                        utils.logger.warning(f\"[BilibiliClient.get_video_all_comments] Retrying video_id {video_id} in {delay:.2f}s... (Attempt {attempt + 1}/{max_retries})\")\n                        await asyncio.sleep(delay)\n                    else:\n                        utils.logger.error(f\"[BilibiliClient.get_video_all_comments] Max retries reached for video_id: {video_id}. Skipping comments. Error: {e}\")\n                        is_end = True\n                        break\n            if not comments_res:\n                break\n\n            cursor_info: Dict = comments_res.get(\"cursor\")\n            if not cursor_info:\n                utils.logger.warning(f\"[BilibiliClient.get_video_all_comments] Could not find 'cursor' in response for video_id: {video_id}. Skipping.\")\n                break\n\n            comment_list: List[Dict] = comments_res.get(\"replies\", [])\n\n            # Check if is_end and next exist\n            if \"is_end\" not in cursor_info or \"next\" not in cursor_info:\n                utils.logger.warning(f\"[BilibiliClient.get_video_all_comments] 'is_end' or 'next' not in cursor for video_id: {video_id}. Assuming end of comments.\")\n                is_end = True\n            else:\n                is_end = cursor_info.get(\"is_end\")\n                next_page = cursor_info.get(\"next\")\n\n            if not isinstance(is_end, bool):\n                utils.logger.warning(f\"[BilibiliClient.get_video_all_comments] 'is_end' is not a boolean for video_id: {video_id}. Assuming end of comments.\")\n                is_end = True\n            if is_fetch_sub_comments:\n                for comment in comment_list:\n                    comment_id = comment['rpid']\n                    if (comment.get(\"rcount\", 0) > 0):\n                        {await self.get_video_all_level_two_comments(video_id, comment_id, CommentOrderType.DEFAULT, 10, crawl_interval, callback)}\n            if len(result) + len(comment_list) > max_count:\n                comment_list = comment_list[:max_count - len(result)]\n            if callback:  # If there is a callback function, execute it\n                await callback(video_id, comment_list)\n            await asyncio.sleep(crawl_interval)\n            if not is_fetch_sub_comments:\n                result.extend(comment_list)\n                continue\n        return result\n\n    async def get_video_all_level_two_comments(\n        self,\n        video_id: str,\n        level_one_comment_id: int,\n        order_mode: CommentOrderType,\n        ps: int = 10,\n        crawl_interval: float = 1.0,\n        callback: Optional[Callable] = None,\n    ) -> Dict:\n        \"\"\"\n        get video all level two comments for a level one comment\n        :param video_id: Video ID\n        :param level_one_comment_id: Level one comment ID\n        :param order_mode:\n        :param ps: Number of comments per page\n        :param crawl_interval:\n        :param callback:\n        :return:\n        \"\"\"\n\n        pn = 1\n        while True:\n            result = await self.get_video_level_two_comments(video_id, level_one_comment_id, pn, ps, order_mode)\n            comment_list: List[Dict] = result.get(\"replies\", [])\n            if callback:  # If there is a callback function, execute it\n                await callback(video_id, comment_list)\n            await asyncio.sleep(crawl_interval)\n            if (int(result[\"page\"][\"count\"]) <= pn * ps):\n                break\n\n            pn += 1\n\n    async def get_video_level_two_comments(\n        self,\n        video_id: str,\n        level_one_comment_id: int,\n        pn: int,\n        ps: int,\n        order_mode: CommentOrderType,\n    ) -> Dict:\n        \"\"\"get video level two comments\n        :param video_id: Video ID\n        :param level_one_comment_id: Level one comment ID\n        :param order_mode: Sort order\n\n        :return:\n        \"\"\"\n        uri = \"/x/v2/reply/reply\"\n        post_data = {\n            \"oid\": video_id,\n            \"mode\": order_mode.value,\n            \"type\": 1,\n            \"ps\": ps,\n            \"pn\": pn,\n            \"root\": level_one_comment_id,\n        }\n        result = await self.get(uri, post_data)\n        return result\n\n    async def get_creator_videos(self, creator_id: str, pn: int, ps: int = 30, order_mode: SearchOrderType = SearchOrderType.LAST_PUBLISH) -> Dict:\n        \"\"\"get all videos for a creator\n        :param creator_id: Creator ID\n        :param pn: Page number\n        :param ps: Number of videos per page\n        :param order_mode: Sort order\n\n        :return:\n        \"\"\"\n        uri = \"/x/space/wbi/arc/search\"\n        post_data = {\n            \"mid\": creator_id,\n            \"pn\": pn,\n            \"ps\": ps,\n            \"order\": order_mode,\n        }\n        return await self.get(uri, post_data)\n\n    async def get_creator_info(self, creator_id: int) -> Dict:\n        \"\"\"\n        get creator info\n        :param creator_id: Creator ID\n        \"\"\"\n        uri = \"/x/space/wbi/acc/info\"\n        post_data = {\n            \"mid\": creator_id,\n        }\n        return await self.get(uri, post_data)\n\n    async def get_creator_fans(\n        self,\n        creator_id: int,\n        pn: int,\n        ps: int = 24,\n    ) -> Dict:\n        \"\"\"\n        get creator fans\n        :param creator_id: Creator ID\n        :param pn: Start page number\n        :param ps: Number of items per page\n        :return:\n        \"\"\"\n        uri = \"/x/relation/fans\"\n        post_data = {\n            'vmid': creator_id,\n            \"pn\": pn,\n            \"ps\": ps,\n            \"gaia_source\": \"main_web\",\n        }\n        return await self.get(uri, post_data)\n\n    async def get_creator_followings(\n        self,\n        creator_id: int,\n        pn: int,\n        ps: int = 24,\n    ) -> Dict:\n        \"\"\"\n        get creator followings\n        :param creator_id: Creator ID\n        :param pn: Start page number\n        :param ps: Number of items per page\n        :return:\n        \"\"\"\n        uri = \"/x/relation/followings\"\n        post_data = {\n            \"vmid\": creator_id,\n            \"pn\": pn,\n            \"ps\": ps,\n            \"gaia_source\": \"main_web\",\n        }\n        return await self.get(uri, post_data)\n\n    async def get_creator_dynamics(self, creator_id: int, offset: str = \"\"):\n        \"\"\"\n        get creator comments\n        :param creator_id: Creator ID\n        :param offset: Parameter required for sending request\n        :return:\n        \"\"\"\n        uri = \"/x/polymer/web-dynamic/v1/feed/space\"\n        post_data = {\n            \"offset\": offset,\n            \"host_mid\": creator_id,\n            \"platform\": \"web\",\n        }\n\n        return await self.get(uri, post_data)\n\n    async def get_creator_all_fans(\n        self,\n        creator_info: Dict,\n        crawl_interval: float = 1.0,\n        callback: Optional[Callable] = None,\n        max_count: int = 100,\n    ) -> List:\n        \"\"\"\n        get creator all fans\n        :param creator_info:\n        :param crawl_interval:\n        :param callback:\n        :param max_count: Maximum number of fans to crawl for a creator\n\n        :return: List of creator fans\n        \"\"\"\n        creator_id = creator_info[\"id\"]\n        result = []\n        pn = config.START_CONTACTS_PAGE\n        while len(result) < max_count:\n            fans_res: Dict = await self.get_creator_fans(creator_id, pn=pn)\n            fans_list: List[Dict] = fans_res.get(\"list\", [])\n\n            pn += 1\n            if len(result) + len(fans_list) > max_count:\n                fans_list = fans_list[:max_count - len(result)]\n            if callback:  # If there is a callback function, execute it\n                await callback(creator_info, fans_list)\n            await asyncio.sleep(crawl_interval)\n            if not fans_list:\n                break\n            result.extend(fans_list)\n        return result\n\n    async def get_creator_all_followings(\n        self,\n        creator_info: Dict,\n        crawl_interval: float = 1.0,\n        callback: Optional[Callable] = None,\n        max_count: int = 100,\n    ) -> List:\n        \"\"\"\n        get creator all followings\n        :param creator_info:\n        :param crawl_interval:\n        :param callback:\n        :param max_count: Maximum number of followings to crawl for a creator\n\n        :return: List of creator followings\n        \"\"\"\n        creator_id = creator_info[\"id\"]\n        result = []\n        pn = config.START_CONTACTS_PAGE\n        while len(result) < max_count:\n            followings_res: Dict = await self.get_creator_followings(creator_id, pn=pn)\n            followings_list: List[Dict] = followings_res.get(\"list\", [])\n\n            pn += 1\n            if len(result) + len(followings_list) > max_count:\n                followings_list = followings_list[:max_count - len(result)]\n            if callback:  # If there is a callback function, execute it\n                await callback(creator_info, followings_list)\n            await asyncio.sleep(crawl_interval)\n            if not followings_list:\n                break\n            result.extend(followings_list)\n        return result\n\n    async def get_creator_all_dynamics(\n        self,\n        creator_info: Dict,\n        crawl_interval: float = 1.0,\n        callback: Optional[Callable] = None,\n        max_count: int = 20,\n    ) -> List:\n        \"\"\"\n        get creator all followings\n        :param creator_info:\n        :param crawl_interval:\n        :param callback:\n        :param max_count: Maximum number of dynamics to crawl for a creator\n\n        :return: List of creator dynamics\n        \"\"\"\n        creator_id = creator_info[\"id\"]\n        result = []\n        offset = \"\"\n        has_more = True\n        while has_more and len(result) < max_count:\n            dynamics_res = await self.get_creator_dynamics(creator_id, offset)\n            dynamics_list: List[Dict] = dynamics_res[\"items\"]\n            has_more = dynamics_res[\"has_more\"]\n            offset = dynamics_res[\"offset\"]\n            if len(result) + len(dynamics_list) > max_count:\n                dynamics_list = dynamics_list[:max_count - len(result)]\n            if callback:\n                await callback(creator_info, dynamics_list)\n            await asyncio.sleep(crawl_interval)\n            result.extend(dynamics_list)\n        return result\n"
  },
  {
    "path": "media_platform/bilibili/core.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/bilibili/core.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2023/12/2 18:44\n# @Desc    : Bilibili Crawler\n\nimport asyncio\nimport os\n# import random  # Removed as we now use fixed config.CRAWLER_MAX_SLEEP_SEC intervals\nfrom asyncio import Task\nfrom typing import Dict, List, Optional, Tuple, Union\nfrom datetime import datetime, timedelta\nimport pandas as pd\n\nfrom playwright.async_api import (\n    BrowserContext,\n    BrowserType,\n    Page,\n    Playwright,\n    async_playwright,\n)\nfrom playwright._impl._errors import TargetClosedError\n\nimport config\nfrom base.base_crawler import AbstractCrawler\nfrom proxy.proxy_ip_pool import IpInfoModel, create_ip_pool\nfrom store import bilibili as bilibili_store\nfrom tools import utils\nfrom tools.cdp_browser import CDPBrowserManager\nfrom var import crawler_type_var, source_keyword_var\n\nfrom .client import BilibiliClient\nfrom .exception import DataFetchError\nfrom .field import SearchOrderType\nfrom .help import parse_video_info_from_url, parse_creator_info_from_url\nfrom .login import BilibiliLogin\n\n\nclass BilibiliCrawler(AbstractCrawler):\n    context_page: Page\n    bili_client: BilibiliClient\n    browser_context: BrowserContext\n    cdp_manager: Optional[CDPBrowserManager]\n\n    def __init__(self):\n        self.index_url = \"https://www.bilibili.com\"\n        self.user_agent = utils.get_user_agent()\n        self.cdp_manager = None\n        self.ip_proxy_pool = None  # Proxy IP pool for automatic proxy refresh\n\n    async def start(self):\n        playwright_proxy_format, httpx_proxy_format = None, None\n        if config.ENABLE_IP_PROXY:\n            self.ip_proxy_pool = await create_ip_pool(config.IP_PROXY_POOL_COUNT, enable_validate_ip=True)\n            ip_proxy_info: IpInfoModel = await self.ip_proxy_pool.get_proxy()\n            playwright_proxy_format, httpx_proxy_format = utils.format_proxy_info(ip_proxy_info)\n\n        async with async_playwright() as playwright:\n            # Choose launch mode based on configuration\n            if config.ENABLE_CDP_MODE:\n                utils.logger.info(\"[BilibiliCrawler] Launching browser using CDP mode\")\n                self.browser_context = await self.launch_browser_with_cdp(\n                    playwright,\n                    playwright_proxy_format,\n                    self.user_agent,\n                    headless=config.CDP_HEADLESS,\n                )\n            else:\n                utils.logger.info(\"[BilibiliCrawler] Launching browser using standard mode\")\n                # Launch a browser context.\n                chromium = playwright.chromium\n                self.browser_context = await self.launch_browser(chromium, None, self.user_agent, headless=config.HEADLESS)\n                # stealth.min.js is a js script to prevent the website from detecting the crawler.\n                await self.browser_context.add_init_script(path=\"libs/stealth.min.js\")\n\n            self.context_page = await self.browser_context.new_page()\n            await self.context_page.goto(self.index_url)\n\n            # Create a client to interact with the xiaohongshu website.\n            self.bili_client = await self.create_bilibili_client(httpx_proxy_format)\n            if not await self.bili_client.pong():\n                login_obj = BilibiliLogin(\n                    login_type=config.LOGIN_TYPE,\n                    login_phone=\"\",  # your phone number\n                    browser_context=self.browser_context,\n                    context_page=self.context_page,\n                    cookie_str=config.COOKIES,\n                )\n                await login_obj.begin()\n                await self.bili_client.update_cookies(browser_context=self.browser_context)\n\n            crawler_type_var.set(config.CRAWLER_TYPE)\n            if config.CRAWLER_TYPE == \"search\":\n                await self.search()\n            elif config.CRAWLER_TYPE == \"detail\":\n                # Get the information and comments of the specified post\n                await self.get_specified_videos(config.BILI_SPECIFIED_ID_LIST)\n            elif config.CRAWLER_TYPE == \"creator\":\n                if config.CREATOR_MODE:\n                    for creator_url in config.BILI_CREATOR_ID_LIST:\n                        try:\n                            creator_info = parse_creator_info_from_url(creator_url)\n                            utils.logger.info(f\"[BilibiliCrawler.start] Parsed creator ID: {creator_info.creator_id} from {creator_url}\")\n                            await self.get_creator_videos(int(creator_info.creator_id))\n                        except ValueError as e:\n                            utils.logger.error(f\"[BilibiliCrawler.start] Failed to parse creator URL: {e}\")\n                            continue\n                else:\n                    await self.get_all_creator_details(config.BILI_CREATOR_ID_LIST)\n            else:\n                pass\n            utils.logger.info(\"[BilibiliCrawler.start] Bilibili Crawler finished ...\")\n\n    async def search(self):\n        \"\"\"\n        search bilibili video\n        \"\"\"\n        # Search for video and retrieve their comment information.\n        if config.BILI_SEARCH_MODE == \"normal\":\n            await self.search_by_keywords()\n        elif config.BILI_SEARCH_MODE == \"all_in_time_range\":\n            await self.search_by_keywords_in_time_range(daily_limit=False)\n        elif config.BILI_SEARCH_MODE == \"daily_limit_in_time_range\":\n            await self.search_by_keywords_in_time_range(daily_limit=True)\n        else:\n            utils.logger.warning(f\"Unknown BILI_SEARCH_MODE: {config.BILI_SEARCH_MODE}\")\n\n    @staticmethod\n    async def get_pubtime_datetime(\n        start: str = config.START_DAY,\n        end: str = config.END_DAY,\n    ) -> Tuple[str, str]:\n        \"\"\"\n        Get bilibili publish start timestamp pubtime_begin_s and publish end timestamp pubtime_end_s\n        ---\n        :param start: Publish date start time, YYYY-MM-DD\n        :param end: Publish date end time, YYYY-MM-DD\n\n        Note\n        ---\n        - Search time range is from start to end, including both start and end\n        - To search content from the same day, to include search content from that day, pubtime_end_s should be pubtime_begin_s plus one day minus one second, i.e., the last second of start day\n            - For example, searching only 2024-01-05 content, pubtime_begin_s = 1704384000, pubtime_end_s = 1704470399\n              Converted to readable datetime objects: pubtime_begin_s = datetime.datetime(2024, 1, 5, 0, 0), pubtime_end_s = datetime.datetime(2024, 1, 5, 23, 59, 59)\n        - To search content from start to end, to include search content from end day, pubtime_end_s should be pubtime_end_s plus one day minus one second, i.e., the last second of end day\n            - For example, searching 2024-01-05 - 2024-01-06 content, pubtime_begin_s = 1704384000, pubtime_end_s = 1704556799\n              Converted to readable datetime objects: pubtime_begin_s = datetime.datetime(2024, 1, 5, 0, 0), pubtime_end_s = datetime.datetime(2024, 1, 6, 23, 59, 59)\n        \"\"\"\n        # Convert start and end to datetime objects\n        start_day: datetime = datetime.strptime(start, \"%Y-%m-%d\")\n        end_day: datetime = datetime.strptime(end, \"%Y-%m-%d\")\n        if start_day > end_day:\n            raise ValueError(\"Wrong time range, please check your start and end argument, to ensure that the start cannot exceed end\")\n        elif start_day == end_day:  # Searching content from the same day\n            end_day = (start_day + timedelta(days=1) - timedelta(seconds=1))  # Set end_day to start_day + 1 day - 1 second\n        else:  # Searching from start to end\n            end_day = (end_day + timedelta(days=1) - timedelta(seconds=1))  # Set end_day to end_day + 1 day - 1 second\n        # Convert back to timestamps\n        return str(int(start_day.timestamp())), str(int(end_day.timestamp()))\n\n    async def search_by_keywords(self):\n        \"\"\"\n        search bilibili video with keywords in normal mode\n        :return:\n        \"\"\"\n        utils.logger.info(\"[BilibiliCrawler.search_by_keywords] Begin search bilibli keywords\")\n        bili_limit_count = 20  # bilibili limit page fixed value\n        if config.CRAWLER_MAX_NOTES_COUNT < bili_limit_count:\n            config.CRAWLER_MAX_NOTES_COUNT = bili_limit_count\n        start_page = config.START_PAGE  # start page number\n        for keyword in config.KEYWORDS.split(\",\"):\n            source_keyword_var.set(keyword)\n            utils.logger.info(f\"[BilibiliCrawler.search_by_keywords] Current search keyword: {keyword}\")\n            page = 1\n            while (page - start_page + 1) * bili_limit_count <= config.CRAWLER_MAX_NOTES_COUNT:\n                if page < start_page:\n                    utils.logger.info(f\"[BilibiliCrawler.search_by_keywords] Skip page: {page}\")\n                    page += 1\n                    continue\n\n                utils.logger.info(f\"[BilibiliCrawler.search_by_keywords] search bilibili keyword: {keyword}, page: {page}\")\n                video_id_list: List[str] = []\n                videos_res = await self.bili_client.search_video_by_keyword(\n                    keyword=keyword,\n                    page=page,\n                    page_size=bili_limit_count,\n                    order=SearchOrderType.DEFAULT,\n                    pubtime_begin_s=0,  # Publish date start timestamp\n                    pubtime_end_s=0,  # Publish date end timestamp\n                )\n                video_list: List[Dict] = videos_res.get(\"result\")\n\n                if not video_list:\n                    utils.logger.info(f\"[BilibiliCrawler.search_by_keywords] No more videos for '{keyword}', moving to next keyword.\")\n                    break\n\n                semaphore = asyncio.Semaphore(config.MAX_CONCURRENCY_NUM)\n                task_list = []\n                try:\n                    task_list = [self.get_video_info_task(aid=video_item.get(\"aid\"), bvid=\"\", semaphore=semaphore) for video_item in video_list]\n                except Exception as e:\n                    utils.logger.warning(f\"[BilibiliCrawler.search_by_keywords] error in the task list. The video for this page will not be included. {e}\")\n                video_items = await asyncio.gather(*task_list)\n                for video_item in video_items:\n                    if video_item:\n                        video_id_list.append(video_item.get(\"View\").get(\"aid\"))\n                        await bilibili_store.update_bilibili_video(video_item)\n                        await bilibili_store.update_up_info(video_item)\n                        await self.get_bilibili_video(video_item, semaphore)\n                page += 1\n\n                # Sleep after page navigation\n                await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n                utils.logger.info(f\"[BilibiliCrawler.search_by_keywords] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds after page {page-1}\")\n\n                await self.batch_get_video_comments(video_id_list)\n\n    async def search_by_keywords_in_time_range(self, daily_limit: bool):\n        \"\"\"\n        Search bilibili video with keywords in a given time range.\n        :param daily_limit: if True, strictly limit the number of notes per day and total.\n        \"\"\"\n        utils.logger.info(f\"[BilibiliCrawler.search_by_keywords_in_time_range] Begin search with daily_limit={daily_limit}\")\n        bili_limit_count = 20\n        start_page = config.START_PAGE\n\n        for keyword in config.KEYWORDS.split(\",\"):\n            source_keyword_var.set(keyword)\n            utils.logger.info(f\"[BilibiliCrawler.search_by_keywords_in_time_range] Current search keyword: {keyword}\")\n            total_notes_crawled_for_keyword = 0\n\n            for day in pd.date_range(start=config.START_DAY, end=config.END_DAY, freq=\"D\"):\n                if (daily_limit and total_notes_crawled_for_keyword >= config.CRAWLER_MAX_NOTES_COUNT):\n                    utils.logger.info(f\"[BilibiliCrawler.search] Reached CRAWLER_MAX_NOTES_COUNT limit for keyword '{keyword}', skipping remaining days.\")\n                    break\n\n                if (not daily_limit and total_notes_crawled_for_keyword >= config.CRAWLER_MAX_NOTES_COUNT):\n                    utils.logger.info(f\"[BilibiliCrawler.search] Reached CRAWLER_MAX_NOTES_COUNT limit for keyword '{keyword}', skipping remaining days.\")\n                    break\n\n                pubtime_begin_s, pubtime_end_s = await self.get_pubtime_datetime(start=day.strftime(\"%Y-%m-%d\"), end=day.strftime(\"%Y-%m-%d\"))\n                page = 1\n                notes_count_this_day = 0\n\n                while True:\n                    if notes_count_this_day >= config.MAX_NOTES_PER_DAY:\n                        utils.logger.info(f\"[BilibiliCrawler.search] Reached MAX_NOTES_PER_DAY limit for {day.ctime()}.\")\n                        break\n                    if (daily_limit and total_notes_crawled_for_keyword >= config.CRAWLER_MAX_NOTES_COUNT):\n                        utils.logger.info(f\"[BilibiliCrawler.search] Reached CRAWLER_MAX_NOTES_COUNT limit for keyword '{keyword}'.\")\n                        break\n                    if (not daily_limit and total_notes_crawled_for_keyword >= config.CRAWLER_MAX_NOTES_COUNT):\n                        break\n\n                    try:\n                        utils.logger.info(f\"[BilibiliCrawler.search] search bilibili keyword: {keyword}, date: {day.ctime()}, page: {page}\")\n                        video_id_list: List[str] = []\n                        videos_res = await self.bili_client.search_video_by_keyword(\n                            keyword=keyword,\n                            page=page,\n                            page_size=bili_limit_count,\n                            order=SearchOrderType.DEFAULT,\n                            pubtime_begin_s=pubtime_begin_s,\n                            pubtime_end_s=pubtime_end_s,\n                        )\n                        video_list: List[Dict] = videos_res.get(\"result\")\n\n                        if not video_list:\n                            utils.logger.info(f\"[BilibiliCrawler.search] No more videos for '{keyword}' on {day.ctime()}, moving to next day.\")\n                            break\n\n                        semaphore = asyncio.Semaphore(config.MAX_CONCURRENCY_NUM)\n                        task_list = [self.get_video_info_task(aid=video_item.get(\"aid\"), bvid=\"\", semaphore=semaphore) for video_item in video_list]\n                        video_items = await asyncio.gather(*task_list)\n\n                        for video_item in video_items:\n                            if video_item:\n                                if (daily_limit and total_notes_crawled_for_keyword >= config.CRAWLER_MAX_NOTES_COUNT):\n                                    break\n                                if (not daily_limit and total_notes_crawled_for_keyword >= config.CRAWLER_MAX_NOTES_COUNT):\n                                    break\n                                if notes_count_this_day >= config.MAX_NOTES_PER_DAY:\n                                    break\n                                notes_count_this_day += 1\n                                total_notes_crawled_for_keyword += 1\n                                video_id_list.append(video_item.get(\"View\").get(\"aid\"))\n                                await bilibili_store.update_bilibili_video(video_item)\n                                await bilibili_store.update_up_info(video_item)\n                                await self.get_bilibili_video(video_item, semaphore)\n\n                        page += 1\n\n                        # Sleep after page navigation\n                        await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n                        utils.logger.info(f\"[BilibiliCrawler.search_by_keywords_in_time_range] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds after page {page-1}\")\n\n                        await self.batch_get_video_comments(video_id_list)\n\n                    except Exception as e:\n                        utils.logger.error(f\"[BilibiliCrawler.search] Error searching on {day.ctime()}: {e}\")\n                        break\n\n    async def batch_get_video_comments(self, video_id_list: List[str]):\n        \"\"\"\n        batch get video comments\n        :param video_id_list:\n        :return:\n        \"\"\"\n        if not config.ENABLE_GET_COMMENTS:\n            utils.logger.info(f\"[BilibiliCrawler.batch_get_note_comments] Crawling comment mode is not enabled\")\n            return\n\n        utils.logger.info(f\"[BilibiliCrawler.batch_get_video_comments] video ids:{video_id_list}\")\n        semaphore = asyncio.Semaphore(config.MAX_CONCURRENCY_NUM)\n        task_list: List[Task] = []\n        for video_id in video_id_list:\n            task = asyncio.create_task(self.get_comments(video_id, semaphore), name=video_id)\n            task_list.append(task)\n        await asyncio.gather(*task_list)\n\n    async def get_comments(self, video_id: str, semaphore: asyncio.Semaphore):\n        \"\"\"\n        get comment for video id\n        :param video_id:\n        :param semaphore:\n        :return:\n        \"\"\"\n        async with semaphore:\n            try:\n                utils.logger.info(f\"[BilibiliCrawler.get_comments] begin get video_id: {video_id} comments ...\")\n                await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n                utils.logger.info(f\"[BilibiliCrawler.get_comments] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds after fetching comments for video {video_id}\")\n                await self.bili_client.get_video_all_comments(\n                    video_id=video_id,\n                    crawl_interval=config.CRAWLER_MAX_SLEEP_SEC,\n                    is_fetch_sub_comments=config.ENABLE_GET_SUB_COMMENTS,\n                    callback=bilibili_store.batch_update_bilibili_video_comments,\n                    max_count=config.CRAWLER_MAX_COMMENTS_COUNT_SINGLENOTES,\n                )\n\n            except DataFetchError as ex:\n                utils.logger.error(f\"[BilibiliCrawler.get_comments] get video_id: {video_id} comment error: {ex}\")\n            except Exception as e:\n                utils.logger.error(f\"[BilibiliCrawler.get_comments] may be been blocked, err:{e}\")\n                # Propagate the exception to be caught by the main loop\n                raise\n\n    async def get_creator_videos(self, creator_id: int):\n        \"\"\"\n        get videos for a creator\n        :return:\n        \"\"\"\n        ps = 30\n        pn = 1\n        while True:\n            result = await self.bili_client.get_creator_videos(creator_id, pn, ps)\n            video_bvids_list = [video[\"bvid\"] for video in result[\"list\"][\"vlist\"]]\n            await self.get_specified_videos(video_bvids_list)\n            if int(result[\"page\"][\"count\"]) <= pn * ps:\n                break\n            await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n            utils.logger.info(f\"[BilibiliCrawler.get_creator_videos] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds after page {pn}\")\n            pn += 1\n\n    async def get_specified_videos(self, video_url_list: List[str]):\n        \"\"\"\n        get specified videos info from URLs or BV IDs\n        :param video_url_list: List of video URLs or BV IDs\n        :return:\n        \"\"\"\n        utils.logger.info(\"[BilibiliCrawler.get_specified_videos] Parsing video URLs...\")\n        bvids_list = []\n        for video_url in video_url_list:\n            try:\n                video_info = parse_video_info_from_url(video_url)\n                bvids_list.append(video_info.video_id)\n                utils.logger.info(f\"[BilibiliCrawler.get_specified_videos] Parsed video ID: {video_info.video_id} from {video_url}\")\n            except ValueError as e:\n                utils.logger.error(f\"[BilibiliCrawler.get_specified_videos] Failed to parse video URL: {e}\")\n                continue\n\n        semaphore = asyncio.Semaphore(config.MAX_CONCURRENCY_NUM)\n        task_list = [self.get_video_info_task(aid=0, bvid=video_id, semaphore=semaphore) for video_id in bvids_list]\n        video_details = await asyncio.gather(*task_list)\n        video_aids_list = []\n        for video_detail in video_details:\n            if video_detail is not None:\n                video_item_view: Dict = video_detail.get(\"View\")\n                video_aid: str = video_item_view.get(\"aid\")\n                if video_aid:\n                    video_aids_list.append(video_aid)\n                await bilibili_store.update_bilibili_video(video_detail)\n                await bilibili_store.update_up_info(video_detail)\n                await self.get_bilibili_video(video_detail, semaphore)\n        await self.batch_get_video_comments(video_aids_list)\n\n    async def get_video_info_task(self, aid: int, bvid: str, semaphore: asyncio.Semaphore) -> Optional[Dict]:\n        \"\"\"\n        Get video detail task\n        :param aid:\n        :param bvid:\n        :param semaphore:\n        :return:\n        \"\"\"\n        async with semaphore:\n            try:\n                result = await self.bili_client.get_video_info(aid=aid, bvid=bvid)\n\n                # Sleep after fetching video details\n                await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n                utils.logger.info(f\"[BilibiliCrawler.get_video_info_task] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds after fetching video details {bvid or aid}\")\n\n                return result\n            except DataFetchError as ex:\n                utils.logger.error(f\"[BilibiliCrawler.get_video_info_task] Get video detail error: {ex}\")\n                return None\n            except KeyError as ex:\n                utils.logger.error(f\"[BilibiliCrawler.get_video_info_task] have not fund note detail video_id:{bvid}, err: {ex}\")\n                return None\n\n    async def get_video_play_url_task(self, aid: int, cid: int, semaphore: asyncio.Semaphore) -> Union[Dict, None]:\n        \"\"\"\n        Get video play url\n        :param aid:\n        :param cid:\n        :param semaphore:\n        :return:\n        \"\"\"\n        async with semaphore:\n            try:\n                result = await self.bili_client.get_video_play_url(aid=aid, cid=cid)\n                return result\n            except DataFetchError as ex:\n                utils.logger.error(f\"[BilibiliCrawler.get_video_play_url_task] Get video play url error: {ex}\")\n                return None\n            except KeyError as ex:\n                utils.logger.error(f\"[BilibiliCrawler.get_video_play_url_task] have not fund play url from :{aid}|{cid}, err: {ex}\")\n                return None\n\n    async def create_bilibili_client(self, httpx_proxy: Optional[str]) -> BilibiliClient:\n        \"\"\"\n        create bilibili client\n        :param httpx_proxy: httpx proxy\n        :return: bilibili client\n        \"\"\"\n        utils.logger.info(\"[BilibiliCrawler.create_bilibili_client] Begin create bilibili API client ...\")\n        cookie_str, cookie_dict = utils.convert_cookies(await self.browser_context.cookies())\n        bilibili_client_obj = BilibiliClient(\n            proxy=httpx_proxy,\n            headers={\n                \"User-Agent\": self.user_agent,\n                \"Cookie\": cookie_str,\n                \"Origin\": \"https://www.bilibili.com\",\n                \"Referer\": \"https://www.bilibili.com\",\n                \"Content-Type\": \"application/json;charset=UTF-8\",\n            },\n            playwright_page=self.context_page,\n            cookie_dict=cookie_dict,\n            proxy_ip_pool=self.ip_proxy_pool,  # Pass proxy pool for automatic refresh\n        )\n        return bilibili_client_obj\n\n    async def launch_browser(\n        self,\n        chromium: BrowserType,\n        playwright_proxy: Optional[Dict],\n        user_agent: Optional[str],\n        headless: bool = True,\n    ) -> BrowserContext:\n        \"\"\"\n        launch browser and create browser context\n        :param chromium: chromium browser\n        :param playwright_proxy: playwright proxy\n        :param user_agent: user agent\n        :param headless: headless mode\n        :return: browser context\n        \"\"\"\n        utils.logger.info(\"[BilibiliCrawler.launch_browser] Begin create browser context ...\")\n        if config.SAVE_LOGIN_STATE:\n            # feat issue #14\n            # we will save login state to avoid login every time\n            user_data_dir = os.path.join(os.getcwd(), \"browser_data\", config.USER_DATA_DIR % config.PLATFORM)  # type: ignore\n            browser_context = await chromium.launch_persistent_context(\n                user_data_dir=user_data_dir,\n                accept_downloads=True,\n                headless=headless,\n                proxy=playwright_proxy,  # type: ignore\n                viewport={\n                    \"width\": 1920,\n                    \"height\": 1080\n                },\n                user_agent=user_agent,\n                channel=\"chrome\",  # Use system's stable Chrome version\n            )\n            return browser_context\n        else:\n            # type: ignore\n            browser = await chromium.launch(headless=headless, proxy=playwright_proxy, channel=\"chrome\")\n            browser_context = await browser.new_context(viewport={\"width\": 1920, \"height\": 1080}, user_agent=user_agent)\n            return browser_context\n\n    async def launch_browser_with_cdp(\n        self,\n        playwright: Playwright,\n        playwright_proxy: Optional[Dict],\n        user_agent: Optional[str],\n        headless: bool = True,\n    ) -> BrowserContext:\n        \"\"\"\n        Launch browser using CDP mode\n        \"\"\"\n        try:\n            self.cdp_manager = CDPBrowserManager()\n            browser_context = await self.cdp_manager.launch_and_connect(\n                playwright=playwright,\n                playwright_proxy=playwright_proxy,\n                user_agent=user_agent,\n                headless=headless,\n            )\n\n            # Display browser information\n            browser_info = await self.cdp_manager.get_browser_info()\n            utils.logger.info(f\"[BilibiliCrawler] CDP browser info: {browser_info}\")\n\n            return browser_context\n\n        except Exception as e:\n            utils.logger.error(f\"[BilibiliCrawler] CDP mode launch failed, fallback to standard mode: {e}\")\n            # Fallback to standard mode\n            chromium = playwright.chromium\n            return await self.launch_browser(chromium, playwright_proxy, user_agent, headless)\n\n    async def close(self):\n        \"\"\"Close browser context\"\"\"\n        try:\n            # If using CDP mode, special handling is required\n            if self.cdp_manager:\n                await self.cdp_manager.cleanup()\n                self.cdp_manager = None\n            elif self.browser_context:\n                await self.browser_context.close()\n            utils.logger.info(\"[BilibiliCrawler.close] Browser context closed ...\")\n        except TargetClosedError:\n            utils.logger.warning(\"[BilibiliCrawler.close] Browser context was already closed.\")\n        except Exception as e:\n            utils.logger.error(f\"[BilibiliCrawler.close] An error occurred during close: {e}\")\n\n    async def get_bilibili_video(self, video_item: Dict, semaphore: asyncio.Semaphore):\n        \"\"\"\n        download bilibili video\n        :param video_item:\n        :param semaphore:\n        :return:\n        \"\"\"\n        if not config.ENABLE_GET_MEIDAS:\n            utils.logger.info(f\"[BilibiliCrawler.get_bilibili_video] Crawling image mode is not enabled\")\n            return\n        video_item_view: Dict = video_item.get(\"View\")\n        aid = video_item_view.get(\"aid\")\n        cid = video_item_view.get(\"cid\")\n        result = await self.get_video_play_url_task(aid, cid, semaphore)\n        if result is None:\n            utils.logger.info(\"[BilibiliCrawler.get_bilibili_video] get video play url failed\")\n            return\n        durl_list = result.get(\"durl\")\n        max_size = -1\n        video_url = \"\"\n        for durl in durl_list:\n            size = durl.get(\"size\")\n            if size > max_size:\n                max_size = size\n                video_url = durl.get(\"url\")\n        if video_url == \"\":\n            utils.logger.info(\"[BilibiliCrawler.get_bilibili_video] get video url failed\")\n            return\n\n        content = await self.bili_client.get_video_media(video_url)\n        await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n        utils.logger.info(f\"[BilibiliCrawler.get_bilibili_video] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds after fetching video {aid}\")\n        if content is None:\n            return\n        extension_file_name = f\"video.mp4\"\n        await bilibili_store.store_video(aid, content, extension_file_name)\n\n    async def get_all_creator_details(self, creator_url_list: List[str]):\n        \"\"\"\n        creator_url_list: get details for creator from creator URL list\n        \"\"\"\n        utils.logger.info(f\"[BilibiliCrawler.get_all_creator_details] Crawling the details of creators\")\n        utils.logger.info(f\"[BilibiliCrawler.get_all_creator_details] Parsing creator URLs...\")\n\n        creator_id_list = []\n        for creator_url in creator_url_list:\n            try:\n                creator_info = parse_creator_info_from_url(creator_url)\n                creator_id_list.append(int(creator_info.creator_id))\n                utils.logger.info(f\"[BilibiliCrawler.get_all_creator_details] Parsed creator ID: {creator_info.creator_id} from {creator_url}\")\n            except ValueError as e:\n                utils.logger.error(f\"[BilibiliCrawler.get_all_creator_details] Failed to parse creator URL: {e}\")\n                continue\n\n        utils.logger.info(f\"[BilibiliCrawler.get_all_creator_details] creator ids:{creator_id_list}\")\n\n        semaphore = asyncio.Semaphore(config.MAX_CONCURRENCY_NUM)\n        task_list: List[Task] = []\n        try:\n            for creator_id in creator_id_list:\n                task = asyncio.create_task(self.get_creator_details(creator_id, semaphore), name=str(creator_id))\n                task_list.append(task)\n        except Exception as e:\n            utils.logger.warning(f\"[BilibiliCrawler.get_all_creator_details] error in the task list. The creator will not be included. {e}\")\n\n        await asyncio.gather(*task_list)\n\n    async def get_creator_details(self, creator_id: int, semaphore: asyncio.Semaphore):\n        \"\"\"\n        get details for creator id\n        :param creator_id:\n        :param semaphore:\n        :return:\n        \"\"\"\n        async with semaphore:\n            creator_unhandled_info: Dict = await self.bili_client.get_creator_info(creator_id)\n            creator_info: Dict = {\n                \"id\": creator_id,\n                \"name\": creator_unhandled_info.get(\"name\"),\n                \"sign\": creator_unhandled_info.get(\"sign\"),\n                \"avatar\": creator_unhandled_info.get(\"face\"),\n            }\n        await self.get_fans(creator_info, semaphore)\n        await self.get_followings(creator_info, semaphore)\n        await self.get_dynamics(creator_info, semaphore)\n\n    async def get_fans(self, creator_info: Dict, semaphore: asyncio.Semaphore):\n        \"\"\"\n        get fans for creator id\n        :param creator_info:\n        :param semaphore:\n        :return:\n        \"\"\"\n        creator_id = creator_info[\"id\"]\n        async with semaphore:\n            try:\n                utils.logger.info(f\"[BilibiliCrawler.get_fans] begin get creator_id: {creator_id} fans ...\")\n                await self.bili_client.get_creator_all_fans(\n                    creator_info=creator_info,\n                    crawl_interval=config.CRAWLER_MAX_SLEEP_SEC,\n                    callback=bilibili_store.batch_update_bilibili_creator_fans,\n                    max_count=config.CRAWLER_MAX_CONTACTS_COUNT_SINGLENOTES,\n                )\n\n            except DataFetchError as ex:\n                utils.logger.error(f\"[BilibiliCrawler.get_fans] get creator_id: {creator_id} fans error: {ex}\")\n            except Exception as e:\n                utils.logger.error(f\"[BilibiliCrawler.get_fans] may be been blocked, err:{e}\")\n\n    async def get_followings(self, creator_info: Dict, semaphore: asyncio.Semaphore):\n        \"\"\"\n        get followings for creator id\n        :param creator_info:\n        :param semaphore:\n        :return:\n        \"\"\"\n        creator_id = creator_info[\"id\"]\n        async with semaphore:\n            try:\n                utils.logger.info(f\"[BilibiliCrawler.get_followings] begin get creator_id: {creator_id} followings ...\")\n                await self.bili_client.get_creator_all_followings(\n                    creator_info=creator_info,\n                    crawl_interval=config.CRAWLER_MAX_SLEEP_SEC,\n                    callback=bilibili_store.batch_update_bilibili_creator_followings,\n                    max_count=config.CRAWLER_MAX_CONTACTS_COUNT_SINGLENOTES,\n                )\n\n            except DataFetchError as ex:\n                utils.logger.error(f\"[BilibiliCrawler.get_followings] get creator_id: {creator_id} followings error: {ex}\")\n            except Exception as e:\n                utils.logger.error(f\"[BilibiliCrawler.get_followings] may be been blocked, err:{e}\")\n\n    async def get_dynamics(self, creator_info: Dict, semaphore: asyncio.Semaphore):\n        \"\"\"\n        get dynamics for creator id\n        :param creator_info:\n        :param semaphore:\n        :return:\n        \"\"\"\n        creator_id = creator_info[\"id\"]\n        async with semaphore:\n            try:\n                utils.logger.info(f\"[BilibiliCrawler.get_dynamics] begin get creator_id: {creator_id} dynamics ...\")\n                await self.bili_client.get_creator_all_dynamics(\n                    creator_info=creator_info,\n                    crawl_interval=config.CRAWLER_MAX_SLEEP_SEC,\n                    callback=bilibili_store.batch_update_bilibili_creator_dynamics,\n                    max_count=config.CRAWLER_MAX_DYNAMICS_COUNT_SINGLENOTES,\n                )\n\n            except DataFetchError as ex:\n                utils.logger.error(f\"[BilibiliCrawler.get_dynamics] get creator_id: {creator_id} dynamics error: {ex}\")\n            except Exception as e:\n                utils.logger.error(f\"[BilibiliCrawler.get_dynamics] may be been blocked, err:{e}\")\n"
  },
  {
    "path": "media_platform/bilibili/exception.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/bilibili/exception.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2023/12/2 18:44\n# @Desc    :\n\nfrom httpx import RequestError\n\n\nclass DataFetchError(RequestError):\n    \"\"\"something error when fetch\"\"\"\n\n\nclass IPBlockError(RequestError):\n    \"\"\"fetch so fast that the server block us ip\"\"\"\n"
  },
  {
    "path": "media_platform/bilibili/field.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/bilibili/field.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2023/12/3 16:20\n# @Desc    :\n\nfrom enum import Enum\n\n\nclass SearchOrderType(Enum):\n    # Comprehensive sorting\n    DEFAULT = \"\"\n\n    # Most clicks\n    MOST_CLICK = \"click\"\n\n    # Latest published\n    LAST_PUBLISH = \"pubdate\"\n\n    # Most danmu (comments)\n    MOST_DANMU = \"dm\"\n\n    # Most bookmarks\n    MOST_MARK = \"stow\"\n\n\nclass CommentOrderType(Enum):\n    # By popularity only\n    DEFAULT = 0\n\n    # By popularity + time\n    MIXED = 1\n\n    # By time\n    TIME = 2\n"
  },
  {
    "path": "media_platform/bilibili/help.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/bilibili/help.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2023/12/2 23:26\n# @Desc    : bilibili request parameter signing\n# Reverse engineering implementation reference: https://socialsisteryi.github.io/bilibili-API-collect/docs/misc/sign/wbi.html#wbi%E7%AD%BE%E5%90%8D%E7%AE%97%E6%B3%95\nimport re\nimport urllib.parse\nfrom hashlib import md5\nfrom typing import Dict\n\nfrom model.m_bilibili import VideoUrlInfo, CreatorUrlInfo\nfrom tools import utils\n\n\nclass BilibiliSign:\n    def __init__(self, img_key: str, sub_key: str):\n        self.img_key = img_key\n        self.sub_key = sub_key\n        self.map_table = [\n            46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49,\n            33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40,\n            61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11,\n            36, 20, 34, 44, 52\n        ]\n\n    def get_salt(self) -> str:\n        \"\"\"\n        Get the salted key\n        :return:\n        \"\"\"\n        salt = \"\"\n        mixin_key = self.img_key + self.sub_key\n        for mt in self.map_table:\n            salt += mixin_key[mt]\n        return salt[:32]\n\n    def sign(self, req_data: Dict) -> Dict:\n        \"\"\"\n        Add current timestamp to request parameters, sort keys in dictionary order,\n        then URL encode the parameters and combine with salt to generate md5 for w_rid parameter\n        :param req_data:\n        :return:\n        \"\"\"\n        current_ts = utils.get_unix_timestamp()\n        req_data.update({\"wts\": current_ts})\n        req_data = dict(sorted(req_data.items()))\n        req_data = {\n            # Filter \"!'()*\" characters from values\n            k: ''.join(filter(lambda ch: ch not in \"!'()*\", str(v)))\n            for k, v\n            in req_data.items()\n        }\n        query = urllib.parse.urlencode(req_data)\n        salt = self.get_salt()\n        wbi_sign = md5((query + salt).encode()).hexdigest()  # Calculate w_rid\n        req_data['w_rid'] = wbi_sign\n        return req_data\n\n\ndef parse_video_info_from_url(url: str) -> VideoUrlInfo:\n    \"\"\"\n    Parse video ID from Bilibili video URL\n    Args:\n        url: Bilibili video link\n            - https://www.bilibili.com/video/BV1dwuKzmE26/?spm_id_from=333.1387.homepage.video_card.click\n            - https://www.bilibili.com/video/BV1d54y1g7db\n            - BV1d54y1g7db (directly pass BV number)\n    Returns:\n        VideoUrlInfo: Object containing video ID\n    \"\"\"\n    # If the input is already a BV number, return directly\n    if url.startswith(\"BV\"):\n        return VideoUrlInfo(video_id=url)\n\n    # Use regex to extract BV number\n    # Match /video/BV... or /video/av... format\n    bv_pattern = r'/video/(BV[a-zA-Z0-9]+)'\n    match = re.search(bv_pattern, url)\n\n    if match:\n        video_id = match.group(1)\n        return VideoUrlInfo(video_id=video_id)\n\n    raise ValueError(f\"Unable to parse video ID from URL: {url}\")\n\n\ndef parse_creator_info_from_url(url: str) -> CreatorUrlInfo:\n    \"\"\"\n    Parse creator ID from Bilibili creator space URL\n    Args:\n        url: Bilibili creator space link\n            - https://space.bilibili.com/434377496?spm_id_from=333.1007.0.0\n            - https://space.bilibili.com/20813884\n            - 434377496 (directly pass UID)\n    Returns:\n        CreatorUrlInfo: Object containing creator ID\n    \"\"\"\n    # If the input is already a numeric ID, return directly\n    if url.isdigit():\n        return CreatorUrlInfo(creator_id=url)\n\n    # Use regex to extract UID\n    # Match /space.bilibili.com/number format\n    uid_pattern = r'space\\.bilibili\\.com/(\\d+)'\n    match = re.search(uid_pattern, url)\n\n    if match:\n        creator_id = match.group(1)\n        return CreatorUrlInfo(creator_id=creator_id)\n\n    raise ValueError(f\"Unable to parse creator ID from URL: {url}\")\n\n\nif __name__ == '__main__':\n    # Test video URL parsing\n    video_url1 = \"https://www.bilibili.com/video/BV1dwuKzmE26/?spm_id_from=333.1387.homepage.video_card.click\"\n    video_url2 = \"BV1d54y1g7db\"\n    print(\"Video URL parsing test:\")\n    print(f\"URL1: {video_url1} -> {parse_video_info_from_url(video_url1)}\")\n    print(f\"URL2: {video_url2} -> {parse_video_info_from_url(video_url2)}\")\n\n    # Test creator URL parsing\n    creator_url1 = \"https://space.bilibili.com/434377496?spm_id_from=333.1007.0.0\"\n    creator_url2 = \"20813884\"\n    print(\"\\nCreator URL parsing test:\")\n    print(f\"URL1: {creator_url1} -> {parse_creator_info_from_url(creator_url1)}\")\n    print(f\"URL2: {creator_url2} -> {parse_creator_info_from_url(creator_url2)}\")\n"
  },
  {
    "path": "media_platform/bilibili/login.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/bilibili/login.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2023/12/2 18:44\n# @Desc    : bilibili login implementation class\n\nimport asyncio\nimport functools\nimport sys\nfrom typing import Optional\n\nfrom playwright.async_api import BrowserContext, Page\nfrom tenacity import (RetryError, retry, retry_if_result, stop_after_attempt,\n                      wait_fixed)\n\nimport config\nfrom base.base_crawler import AbstractLogin\nfrom tools import utils\n\n\nclass BilibiliLogin(AbstractLogin):\n    def __init__(self,\n                 login_type: str,\n                 browser_context: BrowserContext,\n                 context_page: Page,\n                 login_phone: Optional[str] = \"\",\n                 cookie_str: str = \"\"\n                 ):\n        config.LOGIN_TYPE = login_type\n        self.browser_context = browser_context\n        self.context_page = context_page\n        self.login_phone = login_phone\n        self.cookie_str = cookie_str\n\n    async def begin(self):\n        \"\"\"Start login bilibili\"\"\"\n        utils.logger.info(\"[BilibiliLogin.begin] Begin login Bilibili ...\")\n        if config.LOGIN_TYPE == \"qrcode\":\n            await self.login_by_qrcode()\n        elif config.LOGIN_TYPE == \"phone\":\n            await self.login_by_mobile()\n        elif config.LOGIN_TYPE == \"cookie\":\n            await self.login_by_cookies()\n        else:\n            raise ValueError(\n                \"[BilibiliLogin.begin] Invalid Login Type Currently only supported qrcode or phone or cookie ...\")\n\n    @retry(stop=stop_after_attempt(600), wait=wait_fixed(1), retry=retry_if_result(lambda value: value is False))\n    async def check_login_state(self) -> bool:\n        \"\"\"\n            Check if the current login status is successful and return True otherwise return False\n            retry decorator will retry 20 times if the return value is False, and the retry interval is 1 second\n            if max retry times reached, raise RetryError\n        \"\"\"\n        current_cookie = await self.browser_context.cookies()\n        _, cookie_dict = utils.convert_cookies(current_cookie)\n        if cookie_dict.get(\"SESSDATA\", \"\") or cookie_dict.get(\"DedeUserID\"):\n            return True\n        return False\n\n    async def login_by_qrcode(self):\n        \"\"\"login bilibili website and keep webdriver login state\"\"\"\n        utils.logger.info(\"[BilibiliLogin.login_by_qrcode] Begin login bilibili by qrcode ...\")\n\n        # click login button\n        login_button_ele = self.context_page.locator(\n            \"xpath=//div[@class='right-entry__outside go-login-btn']//div\"\n        )\n        await login_button_ele.click()\n        await asyncio.sleep(1)\n        # find login qrcode\n        qrcode_img_selector = \"//div[@class='login-scan-box']//img\"\n        base64_qrcode_img = await utils.find_login_qrcode(\n            self.context_page,\n            selector=qrcode_img_selector\n        )\n        if not base64_qrcode_img:\n            utils.logger.info(\"[BilibiliLogin.login_by_qrcode] login failed , have not found qrcode please check ....\")\n            sys.exit()\n\n        # show login qrcode\n        partial_show_qrcode = functools.partial(utils.show_qrcode, base64_qrcode_img)\n        asyncio.get_running_loop().run_in_executor(executor=None, func=partial_show_qrcode)\n\n        utils.logger.info(f\"[BilibiliLogin.login_by_qrcode] Waiting for scan code login, remaining time is 20s\")\n        try:\n            await self.check_login_state()\n        except RetryError:\n            utils.logger.info(\"[BilibiliLogin.login_by_qrcode] Login bilibili failed by qrcode login method ...\")\n            sys.exit()\n\n        wait_redirect_seconds = 5\n        utils.logger.info(\n            f\"[BilibiliLogin.login_by_qrcode] Login successful then wait for {wait_redirect_seconds} seconds redirect ...\")\n        await asyncio.sleep(wait_redirect_seconds)\n\n    async def login_by_mobile(self):\n        pass\n\n    async def login_by_cookies(self):\n        utils.logger.info(\"[BilibiliLogin.login_by_qrcode] Begin login bilibili by cookie ...\")\n        for key, value in utils.convert_str_cookie_to_dict(self.cookie_str).items():\n            await self.browser_context.add_cookies([{\n                'name': key,\n                'value': value,\n                'domain': \".bilibili.com\",\n                'path': \"/\"\n            }])\n"
  },
  {
    "path": "media_platform/douyin/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/douyin/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nfrom .core import DouYinCrawler\n"
  },
  {
    "path": "media_platform/douyin/client.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/douyin/client.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\nimport asyncio\nimport copy\nimport json\nimport urllib.parse\nfrom typing import TYPE_CHECKING, Any, Callable, Dict, Union, Optional\n\nimport httpx\nfrom playwright.async_api import BrowserContext\n\nfrom base.base_crawler import AbstractApiClient\nfrom proxy.proxy_mixin import ProxyRefreshMixin\nfrom tools import utils\nfrom tools.httpx_util import make_async_client\nfrom var import request_keyword_var\n\nif TYPE_CHECKING:\n    from proxy.proxy_ip_pool import ProxyIpPool\n\nfrom .exception import *\nfrom .field import *\nfrom .help import *\n\n\nclass DouYinClient(AbstractApiClient, ProxyRefreshMixin):\n\n    def __init__(\n        self,\n        timeout=60,  # If the crawl media option is turned on, Douyin’s short videos will require a longer timeout.\n        proxy=None,\n        *,\n        headers: Dict,\n        playwright_page: Optional[Page],\n        cookie_dict: Dict,\n        proxy_ip_pool: Optional[\"ProxyIpPool\"] = None,\n    ):\n        self.proxy = proxy\n        self.timeout = timeout\n        self.headers = headers\n        self._host = \"https://www.douyin.com\"\n        self.playwright_page = playwright_page\n        self.cookie_dict = cookie_dict\n        # Initialize proxy pool (from ProxyRefreshMixin)\n        self.init_proxy_pool(proxy_ip_pool)\n\n    async def __process_req_params(\n        self,\n        uri: str,\n        params: Optional[Dict] = None,\n        headers: Optional[Dict] = None,\n        request_method=\"GET\",\n    ):\n\n        if not params:\n            return\n        headers = headers or self.headers\n        local_storage: Dict = await self.playwright_page.evaluate(\"() => window.localStorage\")  # type: ignore\n        common_params = {\n            \"device_platform\": \"webapp\",\n            \"aid\": \"6383\",\n            \"channel\": \"channel_pc_web\",\n            \"version_code\": \"190600\",\n            \"version_name\": \"19.6.0\",\n            \"update_version_code\": \"170400\",\n            \"pc_client_type\": \"1\",\n            \"cookie_enabled\": \"true\",\n            \"browser_language\": \"zh-CN\",\n            \"browser_platform\": \"MacIntel\",\n            \"browser_name\": \"Chrome\",\n            \"browser_version\": \"125.0.0.0\",\n            \"browser_online\": \"true\",\n            \"engine_name\": \"Blink\",\n            \"os_name\": \"Mac OS\",\n            \"os_version\": \"10.15.7\",\n            \"cpu_core_num\": \"8\",\n            \"device_memory\": \"8\",\n            \"engine_version\": \"109.0\",\n            \"platform\": \"PC\",\n            \"screen_width\": \"2560\",\n            \"screen_height\": \"1440\",\n            'effective_type': '4g',\n            \"round_trip_time\": \"50\",\n            \"webid\": get_web_id(),\n            \"msToken\": local_storage.get(\"xmst\"),\n        }\n        params.update(common_params)\n        query_string = urllib.parse.urlencode(params)\n\n        # 20240927 a-bogus update (JS version)\n        post_data = {}\n        if request_method == \"POST\":\n            post_data = params\n\n        if \"/v1/web/general/search\" not in uri:\n            a_bogus = await get_a_bogus(uri, query_string, post_data, headers[\"User-Agent\"], self.playwright_page)\n            params[\"a_bogus\"] = a_bogus\n\n    async def request(self, method, url, **kwargs):\n        # Check whether the proxy has expired before each request\n        await self._refresh_proxy_if_expired()\n\n        async with make_async_client(proxy=self.proxy) as client:\n            response = await client.request(method, url, timeout=self.timeout, **kwargs)\n        try:\n            if response.text == \"\" or response.text == \"blocked\":\n                utils.logger.error(f\"request params incrr, response.text: {response.text}\")\n                raise Exception(\"account blocked\")\n            return response.json()\n        except Exception as e:\n            raise DataFetchError(f\"{e}, {response.text}\")\n\n    async def get(self, uri: str, params: Optional[Dict] = None, headers: Optional[Dict] = None):\n        \"\"\"\n        GET请求\n        \"\"\"\n        await self.__process_req_params(uri, params, headers)\n        headers = headers or self.headers\n        return await self.request(method=\"GET\", url=f\"{self._host}{uri}\", params=params, headers=headers)\n\n    async def post(self, uri: str, data: dict, headers: Optional[Dict] = None):\n        await self.__process_req_params(uri, data, headers)\n        headers = headers or self.headers\n        return await self.request(method=\"POST\", url=f\"{self._host}{uri}\", data=data, headers=headers)\n\n    async def pong(self, browser_context: BrowserContext) -> bool:\n        local_storage = await self.playwright_page.evaluate(\"() => window.localStorage\")\n        if local_storage.get(\"HasUserLogin\", \"\") == \"1\":\n            return True\n\n        _, cookie_dict = utils.convert_cookies(await browser_context.cookies())\n        return cookie_dict.get(\"LOGIN_STATUS\") == \"1\"\n\n    async def update_cookies(self, browser_context: BrowserContext):\n        cookie_str, cookie_dict = utils.convert_cookies(await browser_context.cookies())\n        self.headers[\"Cookie\"] = cookie_str\n        self.cookie_dict = cookie_dict\n\n    async def search_info_by_keyword(\n        self,\n        keyword: str,\n        offset: int = 0,\n        search_channel: SearchChannelType = SearchChannelType.GENERAL,\n        sort_type: SearchSortType = SearchSortType.GENERAL,\n        publish_time: PublishTimeType = PublishTimeType.UNLIMITED,\n        search_id: str = \"\",\n    ):\n        \"\"\"\n        DouYin Web Search API\n        :param keyword:\n        :param offset:\n        :param search_channel:\n        :param sort_type:\n        :param publish_time: ·\n        :param search_id: ·\n        :return:\n        \"\"\"\n        query_params = {\n            'search_channel': search_channel.value,\n            'enable_history': '1',\n            'keyword': keyword,\n            'search_source': 'tab_search',\n            'query_correct_type': '1',\n            'is_filter_search': '0',\n            'from_group_id': '7378810571505847586',\n            'offset': offset,\n            'count': '15',\n            'need_filter_settings': '1',\n            'list_type': 'multi',\n            'search_id': search_id,\n        }\n        if sort_type.value != SearchSortType.GENERAL.value or publish_time.value != PublishTimeType.UNLIMITED.value:\n            query_params[\"filter_selected\"] = json.dumps({\"sort_type\": str(sort_type.value), \"publish_time\": str(publish_time.value)})\n            query_params[\"is_filter_search\"] = 1\n            query_params[\"search_source\"] = \"tab_search\"\n        referer_url = f\"https://www.douyin.com/search/{keyword}?aid=f594bbd9-a0e2-4651-9319-ebe3cb6298c1&type=general\"\n        headers = copy.copy(self.headers)\n        headers[\"Referer\"] = urllib.parse.quote(referer_url, safe=':/')\n        return await self.get(\"/aweme/v1/web/general/search/single/\", query_params, headers=headers)\n\n    async def get_video_by_id(self, aweme_id: str) -> Any:\n        \"\"\"\n        DouYin Video Detail API\n        :param aweme_id:\n        :return:\n        \"\"\"\n        params = {\"aweme_id\": aweme_id}\n        headers = copy.copy(self.headers)\n        del headers[\"Origin\"]\n        res = await self.get(\"/aweme/v1/web/aweme/detail/\", params, headers)\n        return res.get(\"aweme_detail\", {})\n\n    async def get_aweme_comments(self, aweme_id: str, cursor: int = 0):\n        \"\"\"get note comments\n\n        \"\"\"\n        uri = \"/aweme/v1/web/comment/list/\"\n        params = {\"aweme_id\": aweme_id, \"cursor\": cursor, \"count\": 20, \"item_type\": 0}\n        keywords = request_keyword_var.get()\n        referer_url = \"https://www.douyin.com/search/\" + keywords + '?aid=3a3cec5a-9e27-4040-b6aa-ef548c2c1138&publish_time=0&sort_type=0&source=search_history&type=general'\n        headers = copy.copy(self.headers)\n        headers[\"Referer\"] = urllib.parse.quote(referer_url, safe=':/')\n        return await self.get(uri, params)\n\n    async def get_sub_comments(self, aweme_id: str, comment_id: str, cursor: int = 0):\n        \"\"\"\n            获取子评论\n        \"\"\"\n        uri = \"/aweme/v1/web/comment/list/reply/\"\n        params = {\n            'comment_id': comment_id,\n            \"cursor\": cursor,\n            \"count\": 20,\n            \"item_type\": 0,\n            \"item_id\": aweme_id,\n        }\n        keywords = request_keyword_var.get()\n        referer_url = \"https://www.douyin.com/search/\" + keywords + '?aid=3a3cec5a-9e27-4040-b6aa-ef548c2c1138&publish_time=0&sort_type=0&source=search_history&type=general'\n        headers = copy.copy(self.headers)\n        headers[\"Referer\"] = urllib.parse.quote(referer_url, safe=':/')\n        return await self.get(uri, params)\n\n    async def get_aweme_all_comments(\n        self,\n        aweme_id: str,\n        crawl_interval: float = 1.0,\n        is_fetch_sub_comments=False,\n        callback: Optional[Callable] = None,\n        max_count: int = 10,\n    ):\n        \"\"\"\n        获取帖子的所有评论，包括子评论\n        :param aweme_id: 帖子ID\n        :param crawl_interval: 抓取间隔\n        :param is_fetch_sub_comments: 是否抓取子评论\n        :param callback: 回调函数，用于处理抓取到的评论\n        :param max_count: 一次帖子爬取的最大评论数量\n        :return: 评论列表\n        \"\"\"\n        result = []\n        comments_has_more = 1\n        comments_cursor = 0\n        while comments_has_more and len(result) < max_count:\n            comments_res = await self.get_aweme_comments(aweme_id, comments_cursor)\n            comments_has_more = comments_res.get(\"has_more\", 0)\n            comments_cursor = comments_res.get(\"cursor\", 0)\n            comments = comments_res.get(\"comments\", [])\n            if not comments:\n                continue\n            if len(result) + len(comments) > max_count:\n                comments = comments[:max_count - len(result)]\n            result.extend(comments)\n            if callback:  # If there is a callback function, execute the callback function\n                await callback(aweme_id, comments)\n\n            await asyncio.sleep(crawl_interval)\n            if not is_fetch_sub_comments:\n                continue\n            # Get secondary reviews\n            for comment in comments:\n                reply_comment_total = comment.get(\"reply_comment_total\")\n\n                if reply_comment_total > 0:\n                    comment_id = comment.get(\"cid\")\n                    sub_comments_has_more = 1\n                    sub_comments_cursor = 0\n\n                    while sub_comments_has_more:\n                        sub_comments_res = await self.get_sub_comments(aweme_id, comment_id, sub_comments_cursor)\n                        sub_comments_has_more = sub_comments_res.get(\"has_more\", 0)\n                        sub_comments_cursor = sub_comments_res.get(\"cursor\", 0)\n                        sub_comments = sub_comments_res.get(\"comments\", [])\n\n                        if not sub_comments:\n                            continue\n                        result.extend(sub_comments)\n                        if callback:  # If there is a callback function, execute the callback function\n                            await callback(aweme_id, sub_comments)\n                        await asyncio.sleep(crawl_interval)\n        return result\n\n    async def get_user_info(self, sec_user_id: str):\n        uri = \"/aweme/v1/web/user/profile/other/\"\n        params = {\n            \"sec_user_id\": sec_user_id,\n            \"publish_video_strategy_type\": 2,\n            \"personal_center_strategy\": 1,\n        }\n        return await self.get(uri, params)\n\n    async def get_user_aweme_posts(self, sec_user_id: str, max_cursor: str = \"\") -> Dict:\n        uri = \"/aweme/v1/web/aweme/post/\"\n        params = {\n            \"sec_user_id\": sec_user_id,\n            \"count\": 18,\n            \"max_cursor\": max_cursor,\n            \"locate_query\": \"false\",\n            \"publish_video_strategy_type\": 2,\n            'verifyFp': 'verify_ma3hrt8n_q2q2HyYA_uLyO_4N6D_BLvX_E2LgoGmkA1BU',\n            'fp': 'verify_ma3hrt8n_q2q2HyYA_uLyO_4N6D_BLvX_E2LgoGmkA1BU'\n        }\n        return await self.get(uri, params)\n\n    async def get_all_user_aweme_posts(self, sec_user_id: str, callback: Optional[Callable] = None):\n        posts_has_more = 1\n        max_cursor = \"\"\n        result = []\n        while posts_has_more == 1:\n            aweme_post_res = await self.get_user_aweme_posts(sec_user_id, max_cursor)\n            posts_has_more = aweme_post_res.get(\"has_more\", 0)\n            max_cursor = aweme_post_res.get(\"max_cursor\")\n            aweme_list = aweme_post_res.get(\"aweme_list\") if aweme_post_res.get(\"aweme_list\") else []\n            utils.logger.info(f\"[DouYinClient.get_all_user_aweme_posts] get sec_user_id:{sec_user_id} video len : {len(aweme_list)}\")\n            if callback:\n                await callback(aweme_list)\n            result.extend(aweme_list)\n        return result\n\n    async def get_aweme_media(self, url: str) -> Union[bytes, None]:\n        async with make_async_client(proxy=self.proxy) as client:\n            try:\n                response = await client.request(\"GET\", url, timeout=self.timeout, follow_redirects=True)\n                response.raise_for_status()\n                if not response.reason_phrase == \"OK\":\n                    utils.logger.error(f\"[DouYinClient.get_aweme_media] request {url} err, res:{response.text}\")\n                    return None\n                else:\n                    return response.content\n            except httpx.HTTPError as exc:  # some wrong when call httpx.request method, such as connection error, client error, server error or response status code is not 2xx\n                utils.logger.error(f\"[DouYinClient.get_aweme_media] {exc.__class__.__name__} for {exc.request.url} - {exc}\")  # Keep the original exception type name for developers to debug\n                return None\n\n    async def resolve_short_url(self, short_url: str) -> str:\n        \"\"\"\n        解析抖音短链接,获取重定向后的真实URL\n        Args:\n            short_url: 短链接,如 https://v.douyin.com/iF12345ABC/\n        Returns:\n            重定向后的完整URL\n        \"\"\"\n        async with make_async_client(proxy=self.proxy, follow_redirects=False) as client:\n            try:\n                utils.logger.info(f\"[DouYinClient.resolve_short_url] Resolving short URL: {short_url}\")\n                response = await client.get(short_url, timeout=10)\n\n                # Short links usually return a 302 redirect\n                if response.status_code in [301, 302, 303, 307, 308]:\n                    redirect_url = response.headers.get(\"Location\", \"\")\n                    utils.logger.info(f\"[DouYinClient.resolve_short_url] Resolved to: {redirect_url}\")\n                    return redirect_url\n                else:\n                    utils.logger.warning(f\"[DouYinClient.resolve_short_url] Unexpected status code: {response.status_code}\")\n                    return \"\"\n            except Exception as e:\n                utils.logger.error(f\"[DouYinClient.resolve_short_url] Failed to resolve short URL: {e}\")\n                return \"\"\n"
  },
  {
    "path": "media_platform/douyin/core.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/douyin/core.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\nimport asyncio\nimport os\nimport random\nfrom asyncio import Task\nfrom typing import Any, Dict, List, Optional, Tuple\n\nfrom playwright.async_api import (\n    BrowserContext,\n    BrowserType,\n    Page,\n    Playwright,\n    async_playwright,\n)\n\nimport config\nfrom base.base_crawler import AbstractCrawler\nfrom proxy.proxy_ip_pool import IpInfoModel, create_ip_pool\nfrom store import douyin as douyin_store\nfrom tools import utils\nfrom tools.cdp_browser import CDPBrowserManager\nfrom var import crawler_type_var, source_keyword_var\n\nfrom .client import DouYinClient\nfrom .exception import DataFetchError\nfrom .field import PublishTimeType\nfrom .help import parse_video_info_from_url, parse_creator_info_from_url\nfrom .login import DouYinLogin\n\n\nclass DouYinCrawler(AbstractCrawler):\n    context_page: Page\n    dy_client: DouYinClient\n    browser_context: BrowserContext\n    cdp_manager: Optional[CDPBrowserManager]\n\n    def __init__(self) -> None:\n        self.index_url = \"https://www.douyin.com\"\n        self.cdp_manager = None\n        self.ip_proxy_pool = None  # Proxy IP pool for automatic proxy refresh\n\n    async def start(self) -> None:\n        playwright_proxy_format, httpx_proxy_format = None, None\n        if config.ENABLE_IP_PROXY:\n            self.ip_proxy_pool = await create_ip_pool(config.IP_PROXY_POOL_COUNT, enable_validate_ip=True)\n            ip_proxy_info: IpInfoModel = await self.ip_proxy_pool.get_proxy()\n            playwright_proxy_format, httpx_proxy_format = utils.format_proxy_info(ip_proxy_info)\n\n        async with async_playwright() as playwright:\n            # Select startup mode based on configuration\n            if config.ENABLE_CDP_MODE:\n                utils.logger.info(\"[DouYinCrawler] 使用CDP模式启动浏览器\")\n                self.browser_context = await self.launch_browser_with_cdp(\n                    playwright,\n                    playwright_proxy_format,\n                    None,\n                    headless=config.CDP_HEADLESS,\n                )\n            else:\n                utils.logger.info(\"[DouYinCrawler] 使用标准模式启动浏览器\")\n                # Launch a browser context.\n                chromium = playwright.chromium\n                self.browser_context = await self.launch_browser(\n                    chromium,\n                    playwright_proxy_format,\n                    user_agent=None,\n                    headless=config.HEADLESS,\n                )\n                # stealth.min.js is a js script to prevent the website from detecting the crawler.\n                await self.browser_context.add_init_script(path=\"libs/stealth.min.js\")\n\n            self.context_page = await self.browser_context.new_page()\n            await self.context_page.goto(self.index_url)\n\n            self.dy_client = await self.create_douyin_client(httpx_proxy_format)\n            if not await self.dy_client.pong(browser_context=self.browser_context):\n                login_obj = DouYinLogin(\n                    login_type=config.LOGIN_TYPE,\n                    login_phone=\"\",  # you phone number\n                    browser_context=self.browser_context,\n                    context_page=self.context_page,\n                    cookie_str=config.COOKIES,\n                )\n                await login_obj.begin()\n                await self.dy_client.update_cookies(browser_context=self.browser_context)\n            crawler_type_var.set(config.CRAWLER_TYPE)\n            if config.CRAWLER_TYPE == \"search\":\n                # Search for notes and retrieve their comment information.\n                await self.search()\n            elif config.CRAWLER_TYPE == \"detail\":\n                # Get the information and comments of the specified post\n                await self.get_specified_awemes()\n            elif config.CRAWLER_TYPE == \"creator\":\n                # Get the information and comments of the specified creator\n                await self.get_creators_and_videos()\n\n            utils.logger.info(\"[DouYinCrawler.start] Douyin Crawler finished ...\")\n\n    async def search(self) -> None:\n        utils.logger.info(\"[DouYinCrawler.search] Begin search douyin keywords\")\n        dy_limit_count = 10  # douyin limit page fixed value\n        if config.CRAWLER_MAX_NOTES_COUNT < dy_limit_count:\n            config.CRAWLER_MAX_NOTES_COUNT = dy_limit_count\n        start_page = config.START_PAGE  # start page number\n        for keyword in config.KEYWORDS.split(\",\"):\n            source_keyword_var.set(keyword)\n            utils.logger.info(f\"[DouYinCrawler.search] Current keyword: {keyword}\")\n            aweme_list: List[str] = []\n            page = 0\n            dy_search_id = \"\"\n            while (page - start_page + 1) * dy_limit_count <= config.CRAWLER_MAX_NOTES_COUNT:\n                if page < start_page:\n                    utils.logger.info(f\"[DouYinCrawler.search] Skip {page}\")\n                    page += 1\n                    continue\n                try:\n                    utils.logger.info(f\"[DouYinCrawler.search] search douyin keyword: {keyword}, page: {page}\")\n                    posts_res = await self.dy_client.search_info_by_keyword(\n                        keyword=keyword,\n                        offset=page * dy_limit_count - dy_limit_count,\n                        publish_time=PublishTimeType(config.PUBLISH_TIME_TYPE),\n                        search_id=dy_search_id,\n                    )\n                    if posts_res.get(\"data\") is None or posts_res.get(\"data\") == []:\n                        utils.logger.info(f\"[DouYinCrawler.search] search douyin keyword: {keyword}, page: {page} is empty,{posts_res.get('data')}`\")\n                        break\n                except DataFetchError:\n                    utils.logger.error(f\"[DouYinCrawler.search] search douyin keyword: {keyword} failed\")\n                    break\n\n                page += 1\n                if \"data\" not in posts_res:\n                    utils.logger.error(f\"[DouYinCrawler.search] search douyin keyword: {keyword} failed，账号也许被风控了。\")\n                    break\n                dy_search_id = posts_res.get(\"extra\", {}).get(\"logid\", \"\")\n                page_aweme_list = []\n                for post_item in posts_res.get(\"data\"):\n                    try:\n                        aweme_info: Dict = (post_item.get(\"aweme_info\") or post_item.get(\"aweme_mix_info\", {}).get(\"mix_items\")[0])\n                    except TypeError:\n                        continue\n                    aweme_list.append(aweme_info.get(\"aweme_id\", \"\"))\n                    page_aweme_list.append(aweme_info.get(\"aweme_id\", \"\"))\n                    await douyin_store.update_douyin_aweme(aweme_item=aweme_info)\n                    await self.get_aweme_media(aweme_item=aweme_info)\n                \n                # Batch get note comments for the current page\n                await self.batch_get_note_comments(page_aweme_list)\n\n                # Sleep after each page navigation\n                await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n                utils.logger.info(f\"[DouYinCrawler.search] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds after page {page-1}\")\n            utils.logger.info(f\"[DouYinCrawler.search] keyword:{keyword}, aweme_list:{aweme_list}\")\n\n    async def get_specified_awemes(self):\n        \"\"\"Get the information and comments of the specified post from URLs or IDs\"\"\"\n        utils.logger.info(\"[DouYinCrawler.get_specified_awemes] Parsing video URLs...\")\n        aweme_id_list = []\n        for video_url in config.DY_SPECIFIED_ID_LIST:\n            try:\n                video_info = parse_video_info_from_url(video_url)\n\n                # Handling short links\n                if video_info.url_type == \"short\":\n                    utils.logger.info(f\"[DouYinCrawler.get_specified_awemes] Resolving short link: {video_url}\")\n                    resolved_url = await self.dy_client.resolve_short_url(video_url)\n                    if resolved_url:\n                        # Extract video ID from parsed URL\n                        video_info = parse_video_info_from_url(resolved_url)\n                        utils.logger.info(f\"[DouYinCrawler.get_specified_awemes] Short link resolved to aweme ID: {video_info.aweme_id}\")\n                    else:\n                        utils.logger.error(f\"[DouYinCrawler.get_specified_awemes] Failed to resolve short link: {video_url}\")\n                        continue\n\n                aweme_id_list.append(video_info.aweme_id)\n                utils.logger.info(f\"[DouYinCrawler.get_specified_awemes] Parsed aweme ID: {video_info.aweme_id} from {video_url}\")\n            except ValueError as e:\n                utils.logger.error(f\"[DouYinCrawler.get_specified_awemes] Failed to parse video URL: {e}\")\n                continue\n\n        semaphore = asyncio.Semaphore(config.MAX_CONCURRENCY_NUM)\n        task_list = [self.get_aweme_detail(aweme_id=aweme_id, semaphore=semaphore) for aweme_id in aweme_id_list]\n        aweme_details = await asyncio.gather(*task_list)\n        for aweme_detail in aweme_details:\n            if aweme_detail is not None:\n                await douyin_store.update_douyin_aweme(aweme_item=aweme_detail)\n                await self.get_aweme_media(aweme_item=aweme_detail)\n        await self.batch_get_note_comments(aweme_id_list)\n\n    async def get_aweme_detail(self, aweme_id: str, semaphore: asyncio.Semaphore) -> Any:\n        \"\"\"Get note detail\"\"\"\n        async with semaphore:\n            try:\n                result = await self.dy_client.get_video_by_id(aweme_id)\n                # Sleep after fetching aweme detail\n                await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n                utils.logger.info(f\"[DouYinCrawler.get_aweme_detail] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds after fetching aweme {aweme_id}\")\n                return result\n            except DataFetchError as ex:\n                utils.logger.error(f\"[DouYinCrawler.get_aweme_detail] Get aweme detail error: {ex}\")\n                return None\n            except KeyError as ex:\n                utils.logger.error(f\"[DouYinCrawler.get_aweme_detail] have not fund note detail aweme_id:{aweme_id}, err: {ex}\")\n                return None\n\n    async def batch_get_note_comments(self, aweme_list: List[str]) -> None:\n        \"\"\"\n        Batch get note comments\n        \"\"\"\n        if not config.ENABLE_GET_COMMENTS:\n            utils.logger.info(f\"[DouYinCrawler.batch_get_note_comments] Crawling comment mode is not enabled\")\n            return\n\n        task_list: List[Task] = []\n        semaphore = asyncio.Semaphore(config.MAX_CONCURRENCY_NUM)\n        for aweme_id in aweme_list:\n            task = asyncio.create_task(self.get_comments(aweme_id, semaphore), name=aweme_id)\n            task_list.append(task)\n        if len(task_list) > 0:\n            await asyncio.wait(task_list)\n\n    async def get_comments(self, aweme_id: str, semaphore: asyncio.Semaphore) -> None:\n        async with semaphore:\n            try:\n                # Pass the list of keywords to the get_aweme_all_comments method\n                # Use fixed crawling interval\n                crawl_interval = config.CRAWLER_MAX_SLEEP_SEC\n                await self.dy_client.get_aweme_all_comments(\n                    aweme_id=aweme_id,\n                    crawl_interval=crawl_interval,\n                    is_fetch_sub_comments=config.ENABLE_GET_SUB_COMMENTS,\n                    callback=douyin_store.batch_update_dy_aweme_comments,\n                    max_count=config.CRAWLER_MAX_COMMENTS_COUNT_SINGLENOTES,\n                )\n                # Sleep after fetching comments\n                await asyncio.sleep(crawl_interval)\n                utils.logger.info(f\"[DouYinCrawler.get_comments] Sleeping for {crawl_interval} seconds after fetching comments for aweme {aweme_id}\")\n                utils.logger.info(f\"[DouYinCrawler.get_comments] aweme_id: {aweme_id} comments have all been obtained and filtered ...\")\n            except DataFetchError as e:\n                utils.logger.error(f\"[DouYinCrawler.get_comments] aweme_id: {aweme_id} get comments failed, error: {e}\")\n\n    async def get_creators_and_videos(self) -> None:\n        \"\"\"\n        Get the information and videos of the specified creator from URLs or IDs\n        \"\"\"\n        utils.logger.info(\"[DouYinCrawler.get_creators_and_videos] Begin get douyin creators\")\n        utils.logger.info(\"[DouYinCrawler.get_creators_and_videos] Parsing creator URLs...\")\n\n        for creator_url in config.DY_CREATOR_ID_LIST:\n            try:\n                creator_info_parsed = parse_creator_info_from_url(creator_url)\n                user_id = creator_info_parsed.sec_user_id\n                utils.logger.info(f\"[DouYinCrawler.get_creators_and_videos] Parsed sec_user_id: {user_id} from {creator_url}\")\n            except ValueError as e:\n                utils.logger.error(f\"[DouYinCrawler.get_creators_and_videos] Failed to parse creator URL: {e}\")\n                continue\n\n            creator_info: Dict = await self.dy_client.get_user_info(user_id)\n            if creator_info:\n                await douyin_store.save_creator(user_id, creator=creator_info)\n\n            # Get all video information of the creator\n            all_video_list = await self.dy_client.get_all_user_aweme_posts(sec_user_id=user_id, callback=self.fetch_creator_video_detail)\n\n            video_ids = [video_item.get(\"aweme_id\") for video_item in all_video_list]\n            await self.batch_get_note_comments(video_ids)\n\n    async def fetch_creator_video_detail(self, video_list: List[Dict]):\n        \"\"\"\n        Concurrently obtain the specified post list and save the data\n        \"\"\"\n        semaphore = asyncio.Semaphore(config.MAX_CONCURRENCY_NUM)\n        task_list = [self.get_aweme_detail(post_item.get(\"aweme_id\"), semaphore) for post_item in video_list]\n\n        note_details = await asyncio.gather(*task_list)\n        for aweme_item in note_details:\n            if aweme_item is not None:\n                await douyin_store.update_douyin_aweme(aweme_item=aweme_item)\n                await self.get_aweme_media(aweme_item=aweme_item)\n\n    async def create_douyin_client(self, httpx_proxy: Optional[str]) -> DouYinClient:\n        \"\"\"Create douyin client\"\"\"\n        cookie_str, cookie_dict = utils.convert_cookies(await self.browser_context.cookies())  # type: ignore\n        douyin_client = DouYinClient(\n            proxy=httpx_proxy,\n            headers={\n                \"User-Agent\": await self.context_page.evaluate(\"() => navigator.userAgent\"),\n                \"Cookie\": cookie_str,\n                \"Host\": \"www.douyin.com\",\n                \"Origin\": \"https://www.douyin.com/\",\n                \"Referer\": \"https://www.douyin.com/\",\n                \"Content-Type\": \"application/json;charset=UTF-8\",\n            },\n            playwright_page=self.context_page,\n            cookie_dict=cookie_dict,\n            proxy_ip_pool=self.ip_proxy_pool,  # Pass proxy pool for automatic refresh\n        )\n        return douyin_client\n\n    async def launch_browser(\n        self,\n        chromium: BrowserType,\n        playwright_proxy: Optional[Dict],\n        user_agent: Optional[str],\n        headless: bool = True,\n    ) -> BrowserContext:\n        \"\"\"Launch browser and create browser context\"\"\"\n        if config.SAVE_LOGIN_STATE:\n            user_data_dir = os.path.join(os.getcwd(), \"browser_data\", config.USER_DATA_DIR % config.PLATFORM)  # type: ignore\n            browser_context = await chromium.launch_persistent_context(\n                user_data_dir=user_data_dir,\n                accept_downloads=True,\n                headless=headless,\n                proxy=playwright_proxy,  # type: ignore\n                viewport={\n                    \"width\": 1920,\n                    \"height\": 1080\n                },\n                user_agent=user_agent,\n            )  # type: ignore\n            return browser_context\n        else:\n            browser = await chromium.launch(headless=headless, proxy=playwright_proxy)  # type: ignore\n            browser_context = await browser.new_context(viewport={\"width\": 1920, \"height\": 1080}, user_agent=user_agent)\n            return browser_context\n\n    async def launch_browser_with_cdp(\n        self,\n        playwright: Playwright,\n        playwright_proxy: Optional[Dict],\n        user_agent: Optional[str],\n        headless: bool = True,\n    ) -> BrowserContext:\n        \"\"\"\n        使用CDP模式启动浏览器\n        \"\"\"\n        try:\n            self.cdp_manager = CDPBrowserManager()\n            browser_context = await self.cdp_manager.launch_and_connect(\n                playwright=playwright,\n                playwright_proxy=playwright_proxy,\n                user_agent=user_agent,\n                headless=headless,\n            )\n\n            # Add anti-detection script\n            await self.cdp_manager.add_stealth_script()\n\n            # Show browser information\n            browser_info = await self.cdp_manager.get_browser_info()\n            utils.logger.info(f\"[DouYinCrawler] CDP浏览器信息: {browser_info}\")\n\n            return browser_context\n\n        except Exception as e:\n            utils.logger.error(f\"[DouYinCrawler] CDP模式启动失败，回退到标准模式: {e}\")\n            # Fall back to standard mode\n            chromium = playwright.chromium\n            return await self.launch_browser(chromium, playwright_proxy, user_agent, headless)\n\n    async def close(self) -> None:\n        \"\"\"Close browser context\"\"\"\n        # If you use CDP mode, special processing is required\n        if self.cdp_manager:\n            await self.cdp_manager.cleanup()\n            self.cdp_manager = None\n        else:\n            await self.browser_context.close()\n        utils.logger.info(\"[DouYinCrawler.close] Browser context closed ...\")\n\n    async def get_aweme_media(self, aweme_item: Dict):\n        \"\"\"\n        获取抖音媒体，自动判断媒体类型是短视频还是帖子图片并下载\n\n        Args:\n            aweme_item (Dict): 抖音作品详情\n        \"\"\"\n        if not config.ENABLE_GET_MEIDAS:\n            utils.logger.info(f\"[DouYinCrawler.get_aweme_media] Crawling image mode is not enabled\")\n            return\n        # List of note urls. If it is a short video type, an empty list will be returned.\n        note_download_url: List[str] = douyin_store._extract_note_image_list(aweme_item)\n        # The video URL will always exist, but when it is a short video type, the file is actually an audio file.\n        video_download_url: str = douyin_store._extract_video_download_url(aweme_item)\n        # TODO: Douyin does not adopt the audio and video separation strategy, so the audio can be separated from the original video and will not be extracted for the time being.\n        if note_download_url:\n            await self.get_aweme_images(aweme_item)\n        else:\n            await self.get_aweme_video(aweme_item)\n\n    async def get_aweme_images(self, aweme_item: Dict):\n        \"\"\"\n        get aweme images. please use get_aweme_media\n\n        Args:\n            aweme_item (Dict): 抖音作品详情\n        \"\"\"\n        if not config.ENABLE_GET_MEIDAS:\n            return\n        aweme_id = aweme_item.get(\"aweme_id\")\n        # List of note urls. If it is a short video type, an empty list will be returned.\n        note_download_url: List[str] = douyin_store._extract_note_image_list(aweme_item)\n\n        if not note_download_url:\n            return\n        picNum = 0\n        for url in note_download_url:\n            if not url:\n                continue\n            content = await self.dy_client.get_aweme_media(url)\n            await asyncio.sleep(random.random())\n            if content is None:\n                continue\n            extension_file_name = f\"{picNum:>03d}.jpeg\"\n            picNum += 1\n            await douyin_store.update_dy_aweme_image(aweme_id, content, extension_file_name)\n\n    async def get_aweme_video(self, aweme_item: Dict):\n        \"\"\"\n        get aweme videos. please use get_aweme_media\n\n        Args:\n            aweme_item (Dict): 抖音作品详情\n        \"\"\"\n        if not config.ENABLE_GET_MEIDAS:\n            return\n        aweme_id = aweme_item.get(\"aweme_id\")\n\n        # The video URL will always exist, but when it is a short video type, the file is actually an audio file.\n        video_download_url: str = douyin_store._extract_video_download_url(aweme_item)\n\n        if not video_download_url:\n            return\n        content = await self.dy_client.get_aweme_media(video_download_url)\n        await asyncio.sleep(random.random())\n        if content is None:\n            return\n        extension_file_name = f\"video.mp4\"\n        await douyin_store.update_dy_aweme_video(aweme_id, content, extension_file_name)\n"
  },
  {
    "path": "media_platform/douyin/exception.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/douyin/exception.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nfrom httpx import RequestError\n\n\nclass DataFetchError(RequestError):\n    \"\"\"something error when fetch\"\"\"\n\n\nclass IPBlockError(RequestError):\n    \"\"\"fetch so fast that the server block us ip\"\"\"\n"
  },
  {
    "path": "media_platform/douyin/field.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/douyin/field.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nfrom enum import Enum\n\n\nclass SearchChannelType(Enum):\n    \"\"\"search channel type\"\"\"\n    GENERAL = \"aweme_general\"  # General\n    VIDEO = \"aweme_video_web\"  # Video\n    USER = \"aweme_user_web\"  # User\n    LIVE = \"aweme_live\"  # Live\n\n\nclass SearchSortType(Enum):\n    \"\"\"search sort type\"\"\"\n    GENERAL = 0  # Comprehensive sorting\n    MOST_LIKE = 1  # Most likes\n    LATEST = 2  # Latest published\n\nclass PublishTimeType(Enum):\n    \"\"\"publish time type\"\"\"\n    UNLIMITED = 0  # Unlimited\n    ONE_DAY = 1  # Within one day\n    ONE_WEEK = 7  # Within one week\n    SIX_MONTH = 180  # Within six months\n"
  },
  {
    "path": "media_platform/douyin/help.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/douyin/help.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Name: Programmer Ajiang-Relakkes\n# @Time    : 2024/6/10 02:24\n# @Desc    : Get a_bogus parameter, for learning and communication only, do not use for commercial purposes, contact author to delete if infringement\n\nimport random\nimport re\nfrom typing import Optional\n\nimport execjs\nfrom playwright.async_api import Page\n\nfrom model.m_douyin import VideoUrlInfo, CreatorUrlInfo\nfrom tools.crawler_util import extract_url_params_to_dict\n\ndouyin_sign_obj = execjs.compile(open('libs/douyin.js', encoding='utf-8-sig').read())\n\ndef get_web_id():\n    \"\"\"\n    Generate random webid\n    Returns:\n\n    \"\"\"\n\n    def e(t):\n        if t is not None:\n            return str(t ^ (int(16 * random.random()) >> (t // 4)))\n        else:\n            return ''.join(\n                [str(int(1e7)), '-', str(int(1e3)), '-', str(int(4e3)), '-', str(int(8e3)), '-', str(int(1e11))]\n            )\n\n    web_id = ''.join(\n        e(int(x)) if x in '018' else x for x in e(None)\n    )\n    return web_id.replace('-', '')[:19]\n\n\n\nasync def get_a_bogus(url: str, params: str, post_data: dict, user_agent: str, page: Page = None):\n    \"\"\"\n    Get a_bogus parameter, currently does not support POST request type signature\n    \"\"\"\n    return get_a_bogus_from_js(url, params, user_agent)\n\ndef get_a_bogus_from_js(url: str, params: str, user_agent: str):\n    \"\"\"\n    Get a_bogus parameter through js\n    Args:\n        url:\n        params:\n        user_agent:\n\n    Returns:\n\n    \"\"\"\n    sign_js_name = \"sign_datail\"\n    if \"/reply\" in url:\n        sign_js_name = \"sign_reply\"\n    return douyin_sign_obj.call(sign_js_name, params, user_agent)\n\n\n\nasync def get_a_bogus_from_playwright(params: str, post_data: dict, user_agent: str, page: Page):\n    \"\"\"\n    Get a_bogus parameter through playwright\n    playwright version is deprecated\n    Returns:\n\n    \"\"\"\n    if not post_data:\n        post_data = \"\"\n    a_bogus = await page.evaluate(\n        \"([params, post_data, ua]) => window.bdms.init._v[2].p[42].apply(null, [0, 1, 8, params, post_data, ua])\",\n        [params, post_data, user_agent])\n\n    return a_bogus\n\n\ndef parse_video_info_from_url(url: str) -> VideoUrlInfo:\n    \"\"\"\n    Parse video ID from Douyin video URL\n    Supports the following formats:\n    1. Normal video link: https://www.douyin.com/video/7525082444551310602\n    2. Link with modal_id parameter:\n       - https://www.douyin.com/user/MS4wLjABAAAATJPY7LAlaa5X-c8uNdWkvz0jUGgpw4eeXIwu_8BhvqE?modal_id=7525082444551310602\n       - https://www.douyin.com/root/search/python?modal_id=7471165520058862848\n    3. Short link: https://v.douyin.com/iF12345ABC/ (requires client parsing)\n    4. Pure ID: 7525082444551310602\n\n    Args:\n        url: Douyin video link or ID\n    Returns:\n        VideoUrlInfo: Object containing video ID\n    \"\"\"\n    # If it's a pure numeric ID, return directly\n    if url.isdigit():\n        return VideoUrlInfo(aweme_id=url, url_type=\"normal\")\n\n    # Check if it's a short link (v.douyin.com)\n    if \"v.douyin.com\" in url or url.startswith(\"http\") and len(url) < 50 and \"video\" not in url:\n        return VideoUrlInfo(aweme_id=\"\", url_type=\"short\")  # Requires client parsing\n\n    # Try to extract modal_id from URL parameters\n    params = extract_url_params_to_dict(url)\n    modal_id = params.get(\"modal_id\")\n    if modal_id:\n        return VideoUrlInfo(aweme_id=modal_id, url_type=\"modal\")\n\n    # Extract ID from standard video URL: /video/number\n    video_pattern = r'/video/(\\d+)'\n    match = re.search(video_pattern, url)\n    if match:\n        aweme_id = match.group(1)\n        return VideoUrlInfo(aweme_id=aweme_id, url_type=\"normal\")\n\n    raise ValueError(f\"Unable to parse video ID from URL: {url}\")\n\n\ndef parse_creator_info_from_url(url: str) -> CreatorUrlInfo:\n    \"\"\"\n    Parse creator ID (sec_user_id) from Douyin creator homepage URL\n    Supports the following formats:\n    1. Creator homepage: https://www.douyin.com/user/MS4wLjABAAAATJPY7LAlaa5X-c8uNdWkvz0jUGgpw4eeXIwu_8BhvqE?from_tab_name=main\n    2. Pure ID: MS4wLjABAAAATJPY7LAlaa5X-c8uNdWkvz0jUGgpw4eeXIwu_8BhvqE\n\n    Args:\n        url: Douyin creator homepage link or sec_user_id\n    Returns:\n        CreatorUrlInfo: Object containing creator ID\n    \"\"\"\n    # If it's a pure ID format (usually starts with MS4wLjABAAAA), return directly\n    if url.startswith(\"MS4wLjABAAAA\") or (not url.startswith(\"http\") and \"douyin.com\" not in url):\n        return CreatorUrlInfo(sec_user_id=url)\n\n    # Extract sec_user_id from creator homepage URL: /user/xxx\n    user_pattern = r'/user/([^/?]+)'\n    match = re.search(user_pattern, url)\n    if match:\n        sec_user_id = match.group(1)\n        return CreatorUrlInfo(sec_user_id=sec_user_id)\n\n    raise ValueError(f\"Unable to parse creator ID from URL: {url}\")\n\n\nif __name__ == '__main__':\n    # Test video URL parsing\n    print(\"=== Video URL Parsing Test ===\")\n    test_urls = [\n        \"https://www.douyin.com/video/7525082444551310602\",\n        \"https://www.douyin.com/user/MS4wLjABAAAATJPY7LAlaa5X-c8uNdWkvz0jUGgpw4eeXIwu_8BhvqE?from_tab_name=main&modal_id=7525082444551310602\",\n        \"https://www.douyin.com/root/search/python?aid=b733a3b0-4662-4639-9a72-c2318fba9f3f&modal_id=7471165520058862848&type=general\",\n        \"7525082444551310602\",\n    ]\n    for url in test_urls:\n        try:\n            result = parse_video_info_from_url(url)\n            print(f\"✓ URL: {url[:80]}...\")\n            print(f\"  Result: {result}\\n\")\n        except Exception as e:\n            print(f\"✗ URL: {url}\")\n            print(f\"  Error: {e}\\n\")\n\n    # Test creator URL parsing\n    print(\"=== Creator URL Parsing Test ===\")\n    test_creator_urls = [\n        \"https://www.douyin.com/user/MS4wLjABAAAATJPY7LAlaa5X-c8uNdWkvz0jUGgpw4eeXIwu_8BhvqE?from_tab_name=main\",\n        \"MS4wLjABAAAATJPY7LAlaa5X-c8uNdWkvz0jUGgpw4eeXIwu_8BhvqE\",\n    ]\n    for url in test_creator_urls:\n        try:\n            result = parse_creator_info_from_url(url)\n            print(f\"✓ URL: {url[:80]}...\")\n            print(f\"  Result: {result}\\n\")\n        except Exception as e:\n            print(f\"✗ URL: {url}\")\n            print(f\"  Error: {e}\\n\")\n"
  },
  {
    "path": "media_platform/douyin/login.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/douyin/login.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nimport asyncio\nimport functools\nimport sys\nfrom typing import Optional\n\nfrom playwright.async_api import BrowserContext, Page\nfrom playwright.async_api import TimeoutError as PlaywrightTimeoutError\nfrom tenacity import (RetryError, retry, retry_if_result, stop_after_attempt,\n                      wait_fixed)\n\nimport config\nfrom base.base_crawler import AbstractLogin\nfrom cache.cache_factory import CacheFactory\nfrom tools import utils\n\n\nclass DouYinLogin(AbstractLogin):\n\n    def __init__(self,\n                 login_type: str,\n                 browser_context: BrowserContext, # type: ignore\n                 context_page: Page, # type: ignore\n                 login_phone: Optional[str] = \"\",\n                 cookie_str: Optional[str] = \"\"\n                 ):\n        config.LOGIN_TYPE = login_type\n        self.browser_context = browser_context\n        self.context_page = context_page\n        self.login_phone = login_phone\n        self.scan_qrcode_time = 60\n        self.cookie_str = cookie_str\n\n    async def begin(self):\n        \"\"\"\n            Start login douyin website\n            The verification accuracy of the slider verification is not very good... If there are no special requirements, it is recommended not to use Douyin login, or use cookie login\n        \"\"\"\n\n        # popup login dialog\n        await self.popup_login_dialog()\n\n        # select login type\n        if config.LOGIN_TYPE == \"qrcode\":\n            await self.login_by_qrcode()\n        elif config.LOGIN_TYPE == \"phone\":\n            await self.login_by_mobile()\n        elif config.LOGIN_TYPE == \"cookie\":\n            await self.login_by_cookies()\n        else:\n            raise ValueError(\"[DouYinLogin.begin] Invalid Login Type Currently only supported qrcode or phone or cookie ...\")\n\n        # If the page redirects to the slider verification page, need to slide again\n        await asyncio.sleep(6)\n        current_page_title = await self.context_page.title()\n        if \"验证码中间页\" in current_page_title:\n            await self.check_page_display_slider(move_step=3, slider_level=\"hard\")\n\n        # check login state\n        utils.logger.info(f\"[DouYinLogin.begin] login finished then check login state ...\")\n        try:\n            await self.check_login_state()\n        except RetryError:\n            utils.logger.info(\"[DouYinLogin.begin] login failed please confirm ...\")\n            sys.exit()\n\n        # wait for redirect\n        wait_redirect_seconds = 5\n        utils.logger.info(f\"[DouYinLogin.begin] Login successful then wait for {wait_redirect_seconds} seconds redirect ...\")\n        await asyncio.sleep(wait_redirect_seconds)\n\n    @retry(stop=stop_after_attempt(600), wait=wait_fixed(1), retry=retry_if_result(lambda value: value is False))\n    async def check_login_state(self):\n        \"\"\"Check if the current login status is successful and return True otherwise return False\"\"\"\n        current_cookie = await self.browser_context.cookies()\n        _, cookie_dict = utils.convert_cookies(current_cookie)\n\n        for page in self.browser_context.pages:\n            try:\n                local_storage = await page.evaluate(\"() => window.localStorage\")\n                if local_storage.get(\"HasUserLogin\", \"\") == \"1\":\n                    return True\n            except Exception as e:\n                # utils.logger.warn(f\"[DouYinLogin] check_login_state waring: {e}\")\n                await asyncio.sleep(0.1)\n\n        if cookie_dict.get(\"LOGIN_STATUS\") == \"1\":\n            return True\n\n        return False\n\n    async def popup_login_dialog(self):\n        \"\"\"If the login dialog box does not pop up automatically, we will manually click the login button\"\"\"\n        dialog_selector = \"xpath=//div[@id='login-panel-new']\"\n        try:\n            # check dialog box is auto popup and wait for 10 seconds\n            await self.context_page.wait_for_selector(dialog_selector, timeout=1000 * 10)\n        except Exception as e:\n            utils.logger.error(f\"[DouYinLogin.popup_login_dialog] login dialog box does not pop up automatically, error: {e}\")\n            utils.logger.info(\"[DouYinLogin.popup_login_dialog] login dialog box does not pop up automatically, we will manually click the login button\")\n            login_button_ele = self.context_page.locator(\"xpath=//p[text() = '登录']\")\n            await login_button_ele.click()\n            await asyncio.sleep(0.5)\n\n    async def login_by_qrcode(self):\n        utils.logger.info(\"[DouYinLogin.login_by_qrcode] Begin login douyin by qrcode...\")\n        qrcode_img_selector = \"xpath=//div[@id='animate_qrcode_container']//img\"\n        base64_qrcode_img = await utils.find_login_qrcode(\n            self.context_page,\n            selector=qrcode_img_selector\n        )\n        if not base64_qrcode_img:\n            utils.logger.info(\"[DouYinLogin.login_by_qrcode] login qrcode not found please confirm ...\")\n            sys.exit()\n\n        partial_show_qrcode = functools.partial(utils.show_qrcode, base64_qrcode_img)\n        asyncio.get_running_loop().run_in_executor(executor=None, func=partial_show_qrcode)\n        await asyncio.sleep(2)\n\n    async def login_by_mobile(self):\n        utils.logger.info(\"[DouYinLogin.login_by_mobile] Begin login douyin by mobile ...\")\n        mobile_tap_ele = self.context_page.locator(\"xpath=//li[text() = '验证码登录']\")\n        await mobile_tap_ele.click()\n        await self.context_page.wait_for_selector(\"xpath=//article[@class='web-login-mobile-code']\")\n        mobile_input_ele = self.context_page.locator(\"xpath=//input[@placeholder='手机号']\")\n        await mobile_input_ele.fill(self.login_phone)\n        await asyncio.sleep(0.5)\n        send_sms_code_btn = self.context_page.locator(\"xpath=//span[text() = '获取验证码']\")\n        await send_sms_code_btn.click()\n\n        # Check if there is slider verification\n        await self.check_page_display_slider(move_step=10, slider_level=\"easy\")\n        cache_client = CacheFactory.create_cache(config.CACHE_TYPE_MEMORY)\n        max_get_sms_code_time = 60 * 2  # Maximum time to get verification code is 2 minutes\n        while max_get_sms_code_time > 0:\n            utils.logger.info(f\"[DouYinLogin.login_by_mobile] get douyin sms code from redis remaining time {max_get_sms_code_time}s ...\")\n            await asyncio.sleep(1)\n            sms_code_key = f\"dy_{self.login_phone}\"\n            sms_code_value = cache_client.get(sms_code_key)\n            if not sms_code_value:\n                max_get_sms_code_time -= 1\n                continue\n\n            sms_code_input_ele = self.context_page.locator(\"xpath=//input[@placeholder='请输入验证码']\")\n            await sms_code_input_ele.fill(value=sms_code_value.decode())\n            await asyncio.sleep(0.5)\n            submit_btn_ele = self.context_page.locator(\"xpath=//button[@class='web-login-button']\")\n            await submit_btn_ele.click()  # Click login\n            # todo ... should also check the correctness of the verification code, it may be incorrect\n            break\n\n    async def check_page_display_slider(self, move_step: int = 10, slider_level: str = \"easy\"):\n        \"\"\"\n        Check if slider verification appears on the page\n        :return:\n        \"\"\"\n        # Wait for slider verification to appear\n        back_selector = \"#captcha-verify-image\"\n        try:\n            await self.context_page.wait_for_selector(selector=back_selector, state=\"visible\", timeout=30 * 1000)\n        except PlaywrightTimeoutError:  # No slider verification, return directly\n            return\n\n        gap_selector = 'xpath=//*[@id=\"captcha_container\"]/div/div[2]/img[2]'\n        max_slider_try_times = 20\n        slider_verify_success = False\n        while not slider_verify_success:\n            if max_slider_try_times <= 0:\n                utils.logger.error(\"[DouYinLogin.check_page_display_slider] slider verify failed ...\")\n                sys.exit()\n            try:\n                await self.move_slider(back_selector, gap_selector, move_step, slider_level)\n                await asyncio.sleep(1)\n\n                # If the slider is too slow or verification failed, it will prompt \"The operation is too slow\", click the refresh button here\n                page_content = await self.context_page.content()\n                if \"操作过慢\" in page_content or \"提示重新操作\" in page_content:\n                    utils.logger.info(\"[DouYinLogin.check_page_display_slider] slider verify failed, retry ...\")\n                    await self.context_page.click(selector=\"//a[contains(@class, 'secsdk_captcha_refresh')]\")\n                    continue\n\n                # After successful sliding, wait for the slider to disappear\n                await self.context_page.wait_for_selector(selector=back_selector, state=\"hidden\", timeout=1000)\n                # If the slider disappears, it means the verification is successful, break the loop. If not, it means the verification failed, the above line will throw an exception and be caught to continue the loop\n                utils.logger.info(\"[DouYinLogin.check_page_display_slider] slider verify success ...\")\n                slider_verify_success = True\n            except Exception as e:\n                utils.logger.error(f\"[DouYinLogin.check_page_display_slider] slider verify failed, error: {e}\")\n                await asyncio.sleep(1)\n                max_slider_try_times -= 1\n                utils.logger.info(f\"[DouYinLogin.check_page_display_slider] remaining slider try times: {max_slider_try_times}\")\n                continue\n\n    async def move_slider(self, back_selector: str, gap_selector: str, move_step: int = 10, slider_level=\"easy\"):\n        \"\"\"\n        Move the slider to the right to complete the verification\n        :param back_selector: Selector for the slider verification background image\n        :param gap_selector:  Selector for the slider verification slider\n        :param move_step: Controls the ratio of single movement speed, default is 1, meaning the distance moves in 0.1 seconds no matter how far, larger value means slower\n        :param slider_level: Slider difficulty easy hard, corresponding to the slider for mobile verification code and the slider in the middle of verification code\n        :return:\n        \"\"\"\n\n        # get slider background image\n        slider_back_elements = await self.context_page.wait_for_selector(\n            selector=back_selector,\n            timeout=1000 * 10,  # wait 10 seconds\n        )\n        slide_back = str(await slider_back_elements.get_property(\"src\")) # type: ignore\n\n        # get slider gap image\n        gap_elements = await self.context_page.wait_for_selector(\n            selector=gap_selector,\n            timeout=1000 * 10,  # wait 10 seconds\n        )\n        gap_src = str(await gap_elements.get_property(\"src\")) # type: ignore\n\n        # Identify slider position\n        slide_app = utils.Slide(gap=gap_src, bg=slide_back)\n        distance = slide_app.discern()\n\n        # Get movement trajectory\n        tracks = utils.get_tracks(distance, slider_level)\n        new_1 = tracks[-1] - (sum(tracks) - distance)\n        tracks.pop()\n        tracks.append(new_1)\n\n        # Drag slider to specified position according to trajectory\n        element = await self.context_page.query_selector(gap_selector)\n        bounding_box = await element.bounding_box() # type: ignore\n\n        await self.context_page.mouse.move(bounding_box[\"x\"] + bounding_box[\"width\"] / 2, # type: ignore\n                                           bounding_box[\"y\"] + bounding_box[\"height\"] / 2) # type: ignore\n        # Get x coordinate center position\n        x = bounding_box[\"x\"] + bounding_box[\"width\"] / 2 # type: ignore\n        # Simulate sliding operation\n        await element.hover() # type: ignore\n        await self.context_page.mouse.down()\n\n        for track in tracks:\n            # Loop mouse movement according to trajectory\n            # steps controls the ratio of single movement speed, default is 1, meaning the distance moves in 0.1 seconds no matter how far, larger value means slower\n            await self.context_page.mouse.move(x + track, 0, steps=move_step)\n            x += track\n        await self.context_page.mouse.up()\n\n    async def login_by_cookies(self):\n        utils.logger.info(\"[DouYinLogin.login_by_cookies] Begin login douyin by cookie ...\")\n        for key, value in utils.convert_str_cookie_to_dict(self.cookie_str).items():\n            await self.browser_context.add_cookies([{\n                'name': key,\n                'value': value,\n                'domain': \".douyin.com\",\n                'path': \"/\"\n            }])\n"
  },
  {
    "path": "media_platform/kuaishou/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/kuaishou/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\nfrom .core import KuaishouCrawler\n"
  },
  {
    "path": "media_platform/kuaishou/client.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/kuaishou/client.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\nimport asyncio\nimport json\nfrom typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional\nfrom urllib.parse import urlencode\n\nimport httpx\nfrom playwright.async_api import BrowserContext, Page\n\nimport config\nfrom base.base_crawler import AbstractApiClient\nfrom proxy.proxy_mixin import ProxyRefreshMixin\nfrom tools import utils\nfrom tools.httpx_util import make_async_client\n\nif TYPE_CHECKING:\n    from proxy.proxy_ip_pool import ProxyIpPool\n\nfrom .exception import DataFetchError\nfrom .graphql import KuaiShouGraphQL\n\n\nclass KuaiShouClient(AbstractApiClient, ProxyRefreshMixin):\n    def __init__(\n        self,\n        timeout=10,\n        proxy=None,\n        *,\n        headers: Dict[str, str],\n        playwright_page: Page,\n        cookie_dict: Dict[str, str],\n        proxy_ip_pool: Optional[\"ProxyIpPool\"] = None,\n    ):\n        self.proxy = proxy\n        self.timeout = timeout\n        self.headers = headers\n        self._host = \"https://www.kuaishou.com/graphql\"\n        self._rest_host = \"https://www.kuaishou.com\"\n        self.playwright_page = playwright_page\n        self.cookie_dict = cookie_dict\n        self.graphql = KuaiShouGraphQL()\n        # Initialize proxy pool (from ProxyRefreshMixin)\n        self.init_proxy_pool(proxy_ip_pool)\n\n    async def request(self, method, url, **kwargs) -> Any:\n        # Check if proxy is expired before each request\n        await self._refresh_proxy_if_expired()\n\n        async with make_async_client(proxy=self.proxy) as client:\n            response = await client.request(method, url, timeout=self.timeout, **kwargs)\n        data: Dict = response.json()\n        if data.get(\"errors\"):\n            raise DataFetchError(data.get(\"errors\", \"unkonw error\"))\n        else:\n            return data.get(\"data\", {})\n\n    async def get(self, uri: str, params=None) -> Dict:\n        final_uri = uri\n        if isinstance(params, dict):\n            final_uri = f\"{uri}?\" f\"{urlencode(params)}\"\n        return await self.request(\n            method=\"GET\", url=f\"{self._host}{final_uri}\", headers=self.headers\n        )\n\n    async def post(self, uri: str, data: dict) -> Dict:\n        json_str = json.dumps(data, separators=(\",\", \":\"), ensure_ascii=False)\n        return await self.request(\n            method=\"POST\", url=f\"{self._host}{uri}\", data=json_str, headers=self.headers\n        )\n\n    async def request_rest_v2(self, uri: str, data: dict) -> Dict:\n        \"\"\"\n        Make REST API V2 request (for comment endpoints)\n        :param uri: API endpoint path\n        :param data: request body\n        :return: response data\n        \"\"\"\n        await self._refresh_proxy_if_expired()\n\n        json_str = json.dumps(data, separators=(\",\", \":\"), ensure_ascii=False)\n        async with make_async_client(proxy=self.proxy) as client:\n            response = await client.request(\n                method=\"POST\",\n                url=f\"{self._rest_host}{uri}\",\n                data=json_str,\n                timeout=self.timeout,\n                headers=self.headers,\n            )\n        result: Dict = response.json()\n        if result.get(\"result\") != 1:\n            raise DataFetchError(f\"REST API V2 error: {result}\")\n        return result\n\n    async def pong(self) -> bool:\n        \"\"\"get a note to check if login state is ok\"\"\"\n        utils.logger.info(\"[KuaiShouClient.pong] Begin pong kuaishou...\")\n        ping_flag = False\n        try:\n            post_data = {\n                \"operationName\": \"visionProfileUserList\",\n                \"variables\": {\n                    \"ftype\": 1,\n                },\n                \"query\": self.graphql.get(\"vision_profile_user_list\"),\n            }\n            res = await self.post(\"\", post_data)\n            if res.get(\"visionProfileUserList\", {}).get(\"result\") == 1:\n                ping_flag = True\n        except Exception as e:\n            utils.logger.error(\n                f\"[KuaiShouClient.pong] Pong kuaishou failed: {e}, and try to login again...\"\n            )\n            ping_flag = False\n        return ping_flag\n\n    async def update_cookies(self, browser_context: BrowserContext):\n        cookie_str, cookie_dict = utils.convert_cookies(await browser_context.cookies())\n        self.headers[\"Cookie\"] = cookie_str\n        self.cookie_dict = cookie_dict\n\n    async def search_info_by_keyword(\n        self, keyword: str, pcursor: str, search_session_id: str = \"\"\n    ):\n        \"\"\"\n        KuaiShou web search api\n        :param keyword: search keyword\n        :param pcursor: limite page curson\n        :param search_session_id: search session id\n        :return:\n        \"\"\"\n        post_data = {\n            \"operationName\": \"visionSearchPhoto\",\n            \"variables\": {\n                \"keyword\": keyword,\n                \"pcursor\": pcursor,\n                \"page\": \"search\",\n                \"searchSessionId\": search_session_id,\n            },\n            \"query\": self.graphql.get(\"search_query\"),\n        }\n        return await self.post(\"\", post_data)\n\n    async def get_video_info(self, photo_id: str) -> Dict:\n        \"\"\"\n        Kuaishou web video detail api\n        :param photo_id:\n        :return:\n        \"\"\"\n        post_data = {\n            \"operationName\": \"visionVideoDetail\",\n            \"variables\": {\"photoId\": photo_id, \"page\": \"search\"},\n            \"query\": self.graphql.get(\"video_detail\"),\n        }\n        return await self.post(\"\", post_data)\n\n    async def get_video_comments(self, photo_id: str, pcursor: str = \"\") -> Dict:\n        \"\"\"Get video first-level comments using REST API V2\n        :param photo_id: video id you want to fetch\n        :param pcursor: pagination cursor, defaults to \"\"\n        :return: dict with rootCommentsV2, pcursorV2, commentCountV2\n        \"\"\"\n        post_data = {\n            \"photoId\": photo_id,\n            \"pcursor\": pcursor,\n        }\n        return await self.request_rest_v2(\"/rest/v/photo/comment/list\", post_data)\n\n    async def get_video_sub_comments(\n        self, photo_id: str, root_comment_id: int, pcursor: str = \"\"\n    ) -> Dict:\n        \"\"\"Get video second-level comments using REST API V2\n        :param photo_id: video id you want to fetch\n        :param root_comment_id: parent comment id (must be int type)\n        :param pcursor: pagination cursor, defaults to \"\"\n        :return: dict with subCommentsV2, pcursorV2\n        \"\"\"\n        post_data = {\n            \"photoId\": photo_id,\n            \"pcursor\": pcursor,\n            \"rootCommentId\": root_comment_id,  # Must be int type for V2 API\n        }\n        return await self.request_rest_v2(\"/rest/v/photo/comment/sublist\", post_data)\n\n    async def get_creator_profile(self, userId: str) -> Dict:\n        post_data = {\n            \"operationName\": \"visionProfile\",\n            \"variables\": {\"userId\": userId},\n            \"query\": self.graphql.get(\"vision_profile\"),\n        }\n        return await self.post(\"\", post_data)\n\n    async def get_video_by_creater(self, userId: str, pcursor: str = \"\") -> Dict:\n        post_data = {\n            \"operationName\": \"visionProfilePhotoList\",\n            \"variables\": {\"page\": \"profile\", \"pcursor\": pcursor, \"userId\": userId},\n            \"query\": self.graphql.get(\"vision_profile_photo_list\"),\n        }\n        return await self.post(\"\", post_data)\n\n    async def get_video_all_comments(\n        self,\n        photo_id: str,\n        crawl_interval: float = 1.0,\n        callback: Optional[Callable] = None,\n        max_count: int = 10,\n    ):\n        \"\"\"\n        Get video all comments including sub comments (V2 REST API)\n        :param photo_id: video id\n        :param crawl_interval: delay between requests (seconds)\n        :param callback: callback function for processing comments\n        :param max_count: max number of comments to fetch\n        :return: list of all comments\n        \"\"\"\n\n        result = []\n        pcursor = \"\"\n\n        while pcursor != \"no_more\" and len(result) < max_count:\n            comments_res = await self.get_video_comments(photo_id, pcursor)\n            # V2 API returns data at top level, not nested in visionCommentList\n            pcursor = comments_res.get(\"pcursorV2\", \"no_more\")\n            comments = comments_res.get(\"rootCommentsV2\", [])\n            if len(result) + len(comments) > max_count:\n                comments = comments[: max_count - len(result)]\n            if callback:  # If there is a callback function, execute the callback function\n                await callback(photo_id, comments)\n            result.extend(comments)\n            await asyncio.sleep(crawl_interval)\n            sub_comments = await self.get_comments_all_sub_comments(\n                comments, photo_id, crawl_interval, callback\n            )\n            result.extend(sub_comments)\n        return result\n\n    async def get_comments_all_sub_comments(\n        self,\n        comments: List[Dict],\n        photo_id,\n        crawl_interval: float = 1.0,\n        callback: Optional[Callable] = None,\n    ) -> List[Dict]:\n        \"\"\"\n        Get all second-level comments under specified first-level comments (V2 REST API)\n        Args:\n            comments: Comment list\n            photo_id: Video ID\n            crawl_interval: Delay unit for crawling comments once (seconds)\n            callback: Callback after one comment crawl ends\n        Returns:\n            List of sub comments\n        \"\"\"\n        if not config.ENABLE_GET_SUB_COMMENTS:\n            utils.logger.info(\n                f\"[KuaiShouClient.get_comments_all_sub_comments] Crawling sub_comment mode is not enabled\"\n            )\n            return []\n\n        result = []\n        for comment in comments:\n            # V2 API uses hasSubComments (boolean) instead of subCommentsPcursor (string)\n            has_sub_comments = comment.get(\"hasSubComments\", False)\n            if not has_sub_comments:\n                continue\n\n            # V2 API uses comment_id (int) instead of commentId (string)\n            root_comment_id = comment.get(\"comment_id\")\n            if not root_comment_id:\n                continue\n\n            sub_comment_pcursor = \"\"\n\n            while sub_comment_pcursor != \"no_more\":\n                comments_res = await self.get_video_sub_comments(\n                    photo_id, root_comment_id, sub_comment_pcursor\n                )\n                # V2 API returns data at top level\n                sub_comment_pcursor = comments_res.get(\"pcursorV2\", \"no_more\")\n                sub_comments = comments_res.get(\"subCommentsV2\", [])\n\n                if callback and sub_comments:\n                    await callback(photo_id, sub_comments)\n                await asyncio.sleep(crawl_interval)\n                result.extend(sub_comments)\n        return result\n\n    async def get_creator_info(self, user_id: str) -> Dict:\n        \"\"\"\n        eg: https://www.kuaishou.com/profile/3x4jtnbfter525a\n        Kuaishou user homepage\n        \"\"\"\n\n        visionProfile = await self.get_creator_profile(user_id)\n        return visionProfile.get(\"userProfile\")\n\n    async def get_all_videos_by_creator(\n        self,\n        user_id: str,\n        crawl_interval: float = 1.0,\n        callback: Optional[Callable] = None,\n    ) -> List[Dict]:\n        \"\"\"\n        Get all posts published by the specified user, this method will continue to find all post information under a user\n        Args:\n            user_id: User ID\n            crawl_interval: Delay unit for crawling once (seconds)\n            callback: Update callback function after one page crawl ends\n        Returns:\n\n        \"\"\"\n        result = []\n        pcursor = \"\"\n\n        while pcursor != \"no_more\":\n            videos_res = await self.get_video_by_creater(user_id, pcursor)\n            if not videos_res:\n                utils.logger.error(\n                    f\"[KuaiShouClient.get_all_videos_by_creator] The current creator may have been banned by ks, so they cannot access the data.\"\n                )\n                break\n\n            vision_profile_photo_list = videos_res.get(\"visionProfilePhotoList\", {})\n            pcursor = vision_profile_photo_list.get(\"pcursor\", \"\")\n\n            videos = vision_profile_photo_list.get(\"feeds\", [])\n            utils.logger.info(\n                f\"[KuaiShouClient.get_all_videos_by_creator] got user_id:{user_id} videos len : {len(videos)}\"\n            )\n\n            if callback:\n                await callback(videos)\n            await asyncio.sleep(crawl_interval)\n            result.extend(videos)\n        return result\n"
  },
  {
    "path": "media_platform/kuaishou/core.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/kuaishou/core.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nimport asyncio\nimport os\n# import random  # Removed as we now use fixed config.CRAWLER_MAX_SLEEP_SEC intervals\nimport time\nfrom asyncio import Task\nfrom typing import Dict, List, Optional, Tuple\n\nfrom playwright.async_api import (\n    BrowserContext,\n    BrowserType,\n    Page,\n    Playwright,\n    async_playwright,\n)\n\nimport config\nfrom base.base_crawler import AbstractCrawler\nfrom model.m_kuaishou import VideoUrlInfo, CreatorUrlInfo\nfrom proxy.proxy_ip_pool import IpInfoModel, create_ip_pool\nfrom store import kuaishou as kuaishou_store\nfrom tools import utils\nfrom tools.cdp_browser import CDPBrowserManager\nfrom var import comment_tasks_var, crawler_type_var, source_keyword_var\n\nfrom .client import KuaiShouClient\nfrom .exception import DataFetchError\nfrom .help import parse_video_info_from_url, parse_creator_info_from_url\nfrom .login import KuaishouLogin\n\n\nclass KuaishouCrawler(AbstractCrawler):\n    context_page: Page\n    ks_client: KuaiShouClient\n    browser_context: BrowserContext\n    cdp_manager: Optional[CDPBrowserManager]\n\n    def __init__(self):\n        self.index_url = \"https://www.kuaishou.com\"\n        self.user_agent = utils.get_user_agent()\n        self.cdp_manager = None\n        self.ip_proxy_pool = None  # Proxy IP pool, used for automatic proxy refresh\n\n    async def start(self):\n        playwright_proxy_format, httpx_proxy_format = None, None\n        if config.ENABLE_IP_PROXY:\n            self.ip_proxy_pool = await create_ip_pool(\n                config.IP_PROXY_POOL_COUNT, enable_validate_ip=True\n            )\n            ip_proxy_info: IpInfoModel = await self.ip_proxy_pool.get_proxy()\n            playwright_proxy_format, httpx_proxy_format = utils.format_proxy_info(\n                ip_proxy_info\n            )\n\n        async with async_playwright() as playwright:\n            # Select startup mode based on configuration\n            if config.ENABLE_CDP_MODE:\n                utils.logger.info(\"[KuaishouCrawler] Launching browser using CDP mode\")\n                self.browser_context = await self.launch_browser_with_cdp(\n                    playwright,\n                    playwright_proxy_format,\n                    self.user_agent,\n                    headless=config.CDP_HEADLESS,\n                )\n            else:\n                utils.logger.info(\"[KuaishouCrawler] Launching browser using standard mode\")\n                # Launch a browser context.\n                chromium = playwright.chromium\n                self.browser_context = await self.launch_browser(\n                    chromium, None, self.user_agent, headless=config.HEADLESS\n                )\n                # stealth.min.js is a js script to prevent the website from detecting the crawler.\n                await self.browser_context.add_init_script(path=\"libs/stealth.min.js\")\n\n\n            self.context_page = await self.browser_context.new_page()\n            await self.context_page.goto(f\"{self.index_url}?isHome=1\")\n\n            # Create a client to interact with the kuaishou website.\n            self.ks_client = await self.create_ks_client(httpx_proxy_format)\n            if not await self.ks_client.pong():\n                login_obj = KuaishouLogin(\n                    login_type=config.LOGIN_TYPE,\n                    login_phone=httpx_proxy_format,\n                    browser_context=self.browser_context,\n                    context_page=self.context_page,\n                    cookie_str=config.COOKIES,\n                )\n                await login_obj.begin()\n                await self.ks_client.update_cookies(\n                    browser_context=self.browser_context\n                )\n\n            crawler_type_var.set(config.CRAWLER_TYPE)\n            if config.CRAWLER_TYPE == \"search\":\n                # Search for videos and retrieve their comment information.\n                await self.search()\n            elif config.CRAWLER_TYPE == \"detail\":\n                # Get the information and comments of the specified post\n                await self.get_specified_videos()\n            elif config.CRAWLER_TYPE == \"creator\":\n                # Get creator's information and their videos and comments\n                await self.get_creators_and_videos()\n            else:\n                pass\n\n            utils.logger.info(\"[KuaishouCrawler.start] Kuaishou Crawler finished ...\")\n\n    async def search(self):\n        utils.logger.info(\"[KuaishouCrawler.search] Begin search kuaishou keywords\")\n        ks_limit_count = 20  # kuaishou limit page fixed value\n        if config.CRAWLER_MAX_NOTES_COUNT < ks_limit_count:\n            config.CRAWLER_MAX_NOTES_COUNT = ks_limit_count\n        start_page = config.START_PAGE\n        for keyword in config.KEYWORDS.split(\",\"):\n            search_session_id = \"\"\n            source_keyword_var.set(keyword)\n            utils.logger.info(\n                f\"[KuaishouCrawler.search] Current search keyword: {keyword}\"\n            )\n            page = 1\n            while (\n                page - start_page + 1\n            ) * ks_limit_count <= config.CRAWLER_MAX_NOTES_COUNT:\n                if page < start_page:\n                    utils.logger.info(f\"[KuaishouCrawler.search] Skip page: {page}\")\n                    page += 1\n                    continue\n                utils.logger.info(\n                    f\"[KuaishouCrawler.search] search kuaishou keyword: {keyword}, page: {page}\"\n                )\n                video_id_list: List[str] = []\n                videos_res = await self.ks_client.search_info_by_keyword(\n                    keyword=keyword,\n                    pcursor=str(page),\n                    search_session_id=search_session_id,\n                )\n                if not videos_res:\n                    utils.logger.error(\n                        f\"[KuaishouCrawler.search] search info by keyword:{keyword} not found data\"\n                    )\n                    continue\n\n                vision_search_photo: Dict = videos_res.get(\"visionSearchPhoto\")\n                if vision_search_photo.get(\"result\") != 1:\n                    utils.logger.error(\n                        f\"[KuaishouCrawler.search] search info by keyword:{keyword} not found data \"\n                    )\n                    continue\n                search_session_id = vision_search_photo.get(\"searchSessionId\", \"\")\n                for video_detail in vision_search_photo.get(\"feeds\"):\n                    video_id_list.append(video_detail.get(\"photo\", {}).get(\"id\"))\n                    await kuaishou_store.update_kuaishou_video(video_item=video_detail)\n\n                # batch fetch video comments\n                page += 1\n\n                # Sleep after page navigation\n                await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n                utils.logger.info(f\"[KuaishouCrawler.search] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds after page {page-1}\")\n\n                await self.batch_get_video_comments(video_id_list)\n\n    async def get_specified_videos(self):\n        \"\"\"Get the information and comments of the specified post\"\"\"\n        utils.logger.info(\"[KuaishouCrawler.get_specified_videos] Parsing video URLs...\")\n        video_ids = []\n        for video_url in config.KS_SPECIFIED_ID_LIST:\n            try:\n                video_info = parse_video_info_from_url(video_url)\n                video_ids.append(video_info.video_id)\n                utils.logger.info(f\"Parsed video ID: {video_info.video_id} from {video_url}\")\n            except ValueError as e:\n                utils.logger.error(f\"Failed to parse video URL: {e}\")\n                continue\n\n        semaphore = asyncio.Semaphore(config.MAX_CONCURRENCY_NUM)\n        task_list = [\n            self.get_video_info_task(video_id=video_id, semaphore=semaphore)\n            for video_id in video_ids\n        ]\n        video_details = await asyncio.gather(*task_list)\n        for video_detail in video_details:\n            if video_detail is not None:\n                await kuaishou_store.update_kuaishou_video(video_detail)\n        await self.batch_get_video_comments(video_ids)\n\n    async def get_video_info_task(\n        self, video_id: str, semaphore: asyncio.Semaphore\n    ) -> Optional[Dict]:\n        \"\"\"Get video detail task\"\"\"\n        async with semaphore:\n            try:\n                result = await self.ks_client.get_video_info(video_id)\n\n                # Sleep after fetching video details\n                await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n                utils.logger.info(f\"[KuaishouCrawler.get_video_info_task] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds after fetching video details {video_id}\")\n\n                utils.logger.info(\n                    f\"[KuaishouCrawler.get_video_info_task] Get video_id:{video_id} info result: {result} ...\"\n                )\n                return result.get(\"visionVideoDetail\")\n            except DataFetchError as ex:\n                utils.logger.error(\n                    f\"[KuaishouCrawler.get_video_info_task] Get video detail error: {ex}\"\n                )\n                return None\n            except KeyError as ex:\n                utils.logger.error(\n                    f\"[KuaishouCrawler.get_video_info_task] have not fund video detail video_id:{video_id}, err: {ex}\"\n                )\n                return None\n\n    async def batch_get_video_comments(self, video_id_list: List[str]):\n        \"\"\"\n        batch get video comments\n        :param video_id_list:\n        :return:\n        \"\"\"\n        if not config.ENABLE_GET_COMMENTS:\n            utils.logger.info(\n                f\"[KuaishouCrawler.batch_get_video_comments] Crawling comment mode is not enabled\"\n            )\n            return\n\n        utils.logger.info(\n            f\"[KuaishouCrawler.batch_get_video_comments] video ids:{video_id_list}\"\n        )\n        semaphore = asyncio.Semaphore(config.MAX_CONCURRENCY_NUM)\n        task_list: List[Task] = []\n        for video_id in video_id_list:\n            task = asyncio.create_task(\n                self.get_comments(video_id, semaphore), name=video_id\n            )\n            task_list.append(task)\n\n        comment_tasks_var.set(task_list)\n        await asyncio.gather(*task_list)\n\n    async def get_comments(self, video_id: str, semaphore: asyncio.Semaphore):\n        \"\"\"\n        get comment for video id\n        :param video_id:\n        :param semaphore:\n        :return:\n        \"\"\"\n        async with semaphore:\n            try:\n                utils.logger.info(\n                    f\"[KuaishouCrawler.get_comments] begin get video_id: {video_id} comments ...\"\n                )\n\n                # Sleep before fetching comments\n                await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n                utils.logger.info(f\"[KuaishouCrawler.get_comments] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds before fetching comments for video {video_id}\")\n\n                await self.ks_client.get_video_all_comments(\n                    photo_id=video_id,\n                    crawl_interval=config.CRAWLER_MAX_SLEEP_SEC,\n                    callback=kuaishou_store.batch_update_ks_video_comments,\n                    max_count=config.CRAWLER_MAX_COMMENTS_COUNT_SINGLENOTES,\n                )\n            except DataFetchError as ex:\n                utils.logger.error(\n                    f\"[KuaishouCrawler.get_comments] get video_id: {video_id} comment error: {ex}\"\n                )\n            except Exception as e:\n                utils.logger.error(\n                    f\"[KuaishouCrawler.get_comments] may be been blocked, err:{e}\"\n                )\n                # use time.sleeep block main coroutine instead of asyncio.sleep and cacel running comment task\n                # maybe kuaishou block our request, we will take a nap and update the cookie again\n                current_running_tasks = comment_tasks_var.get()\n                for task in current_running_tasks:\n                    task.cancel()\n                time.sleep(20)\n                await self.context_page.goto(f\"{self.index_url}?isHome=1\")\n                await self.ks_client.update_cookies(\n                    browser_context=self.browser_context\n                )\n\n    async def create_ks_client(self, httpx_proxy: Optional[str]) -> KuaiShouClient:\n        \"\"\"Create ks client\"\"\"\n        utils.logger.info(\n            \"[KuaishouCrawler.create_ks_client] Begin create kuaishou API client ...\"\n        )\n        cookie_str, cookie_dict = utils.convert_cookies(\n            await self.browser_context.cookies()\n        )\n        ks_client_obj = KuaiShouClient(\n            proxy=httpx_proxy,\n            headers={\n                \"User-Agent\": self.user_agent,\n                \"Cookie\": cookie_str,\n                \"Origin\": self.index_url,\n                \"Referer\": self.index_url,\n                \"Content-Type\": \"application/json;charset=UTF-8\",\n            },\n            playwright_page=self.context_page,\n            cookie_dict=cookie_dict,\n            proxy_ip_pool=self.ip_proxy_pool,  # Pass proxy pool for automatic refresh\n        )\n        return ks_client_obj\n\n    async def launch_browser(\n        self,\n        chromium: BrowserType,\n        playwright_proxy: Optional[Dict],\n        user_agent: Optional[str],\n        headless: bool = True,\n    ) -> BrowserContext:\n        \"\"\"Launch browser and create browser context\"\"\"\n        utils.logger.info(\n            \"[KuaishouCrawler.launch_browser] Begin create browser context ...\"\n        )\n        if config.SAVE_LOGIN_STATE:\n            user_data_dir = os.path.join(\n                os.getcwd(), \"browser_data\", config.USER_DATA_DIR % config.PLATFORM\n            )  # type: ignore\n            browser_context = await chromium.launch_persistent_context(\n                user_data_dir=user_data_dir,\n                accept_downloads=True,\n                headless=headless,\n                proxy=playwright_proxy,  # type: ignore\n                viewport={\"width\": 1920, \"height\": 1080},\n                user_agent=user_agent,\n                channel=\"chrome\",  # Use system's stable Chrome version\n            )\n            return browser_context\n        else:\n            browser = await chromium.launch(headless=headless, proxy=playwright_proxy, channel=\"chrome\")  # type: ignore\n            browser_context = await browser.new_context(\n                viewport={\"width\": 1920, \"height\": 1080}, user_agent=user_agent\n            )\n            return browser_context\n\n    async def launch_browser_with_cdp(\n        self,\n        playwright: Playwright,\n        playwright_proxy: Optional[Dict],\n        user_agent: Optional[str],\n        headless: bool = True,\n    ) -> BrowserContext:\n        \"\"\"\n        Launch browser using CDP mode\n        \"\"\"\n        try:\n            self.cdp_manager = CDPBrowserManager()\n            browser_context = await self.cdp_manager.launch_and_connect(\n                playwright=playwright,\n                playwright_proxy=playwright_proxy,\n                user_agent=user_agent,\n                headless=headless,\n            )\n\n            # Display browser information\n            browser_info = await self.cdp_manager.get_browser_info()\n            utils.logger.info(f\"[KuaishouCrawler] CDP browser info: {browser_info}\")\n\n            return browser_context\n\n        except Exception as e:\n            utils.logger.error(\n                f\"[KuaishouCrawler] CDP mode launch failed, fallback to standard mode: {e}\"\n            )\n            # Fallback to standard mode\n            chromium = playwright.chromium\n            return await self.launch_browser(\n                chromium, playwright_proxy, user_agent, headless\n            )\n\n    async def get_creators_and_videos(self) -> None:\n        \"\"\"Get creator's videos and retrieve their comment information.\"\"\"\n        utils.logger.info(\n            \"[KuaiShouCrawler.get_creators_and_videos] Begin get kuaishou creators\"\n        )\n        for creator_url in config.KS_CREATOR_ID_LIST:\n            try:\n                # Parse creator URL to get user_id\n                creator_info: CreatorUrlInfo = parse_creator_info_from_url(creator_url)\n                utils.logger.info(f\"[KuaiShouCrawler.get_creators_and_videos] Parse creator URL info: {creator_info}\")\n                user_id = creator_info.user_id\n\n                # get creator detail info from web html content\n                createor_info: Dict = await self.ks_client.get_creator_info(user_id=user_id)\n                if createor_info:\n                    await kuaishou_store.save_creator(user_id, creator=createor_info)\n            except ValueError as e:\n                utils.logger.error(f\"[KuaiShouCrawler.get_creators_and_videos] Failed to parse creator URL: {e}\")\n                continue\n\n            # Get all video information of the creator\n            all_video_list = await self.ks_client.get_all_videos_by_creator(\n                user_id=user_id,\n                crawl_interval=config.CRAWLER_MAX_SLEEP_SEC,\n                callback=self.fetch_creator_video_detail,\n            )\n\n            video_ids = [\n                video_item.get(\"photo\", {}).get(\"id\") for video_item in all_video_list\n            ]\n            await self.batch_get_video_comments(video_ids)\n\n    async def fetch_creator_video_detail(self, video_list: List[Dict]):\n        \"\"\"\n        Concurrently obtain the specified post list and save the data\n        \"\"\"\n        semaphore = asyncio.Semaphore(config.MAX_CONCURRENCY_NUM)\n        task_list = [\n            self.get_video_info_task(post_item.get(\"photo\", {}).get(\"id\"), semaphore)\n            for post_item in video_list\n        ]\n\n        video_details = await asyncio.gather(*task_list)\n        for video_detail in video_details:\n            if video_detail is not None:\n                await kuaishou_store.update_kuaishou_video(video_detail)\n\n    async def close(self):\n        \"\"\"Close browser context\"\"\"\n        # If using CDP mode, need special handling\n        if self.cdp_manager:\n            await self.cdp_manager.cleanup()\n            self.cdp_manager = None\n        else:\n            await self.browser_context.close()\n        utils.logger.info(\"[KuaishouCrawler.close] Browser context closed ...\")\n"
  },
  {
    "path": "media_platform/kuaishou/exception.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/kuaishou/exception.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nfrom httpx import RequestError\n\n\nclass DataFetchError(RequestError):\n    \"\"\"something error when fetch\"\"\"\n\n\nclass IPBlockError(RequestError):\n    \"\"\"fetch so fast that the server block us ip\"\"\"\n"
  },
  {
    "path": "media_platform/kuaishou/field.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/kuaishou/field.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n"
  },
  {
    "path": "media_platform/kuaishou/graphql/comment_list.graphql",
    "content": "query commentListQuery($photoId: String, $pcursor: String) {\n  visionCommentList(photoId: $photoId, pcursor: $pcursor) {\n    commentCount\n    pcursor\n    rootComments {\n      commentId\n      authorId\n      authorName\n      content\n      headurl\n      timestamp\n      likedCount\n      realLikedCount\n      liked\n      status\n      authorLiked\n      subCommentCount\n      subCommentsPcursor\n      subComments {\n        commentId\n        authorId\n        authorName\n        content\n        headurl\n        timestamp\n        likedCount\n        realLikedCount\n        liked\n        status\n        authorLiked\n        replyToUserName\n        replyTo\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n}\n"
  },
  {
    "path": "media_platform/kuaishou/graphql/search_query.graphql",
    "content": "fragment photoContent on PhotoEntity {\n  __typename\n  id\n  duration\n  caption\n  originCaption\n  likeCount\n  viewCount\n  commentCount\n  realLikeCount\n  coverUrl\n  photoUrl\n  photoH265Url\n  manifest\n  manifestH265\n  videoResource\n  coverUrls {\n    url\n    __typename\n  }\n  timestamp\n  expTag\n  animatedCoverUrl\n  distance\n  videoRatio\n  liked\n  stereoType\n  profileUserTopPhoto\n  musicBlocked\n}\n\nfragment recoPhotoFragment on recoPhotoEntity {\n  __typename\n  id\n  duration\n  caption\n  originCaption\n  likeCount\n  viewCount\n  commentCount\n  realLikeCount\n  coverUrl\n  photoUrl\n  photoH265Url\n  manifest\n  manifestH265\n  videoResource\n  coverUrls {\n    url\n    __typename\n  }\n  timestamp\n  expTag\n  animatedCoverUrl\n  distance\n  videoRatio\n  liked\n  stereoType\n  profileUserTopPhoto\n  musicBlocked\n}\n\nfragment feedContent on Feed {\n  type\n  author {\n    id\n    name\n    headerUrl\n    following\n    headerUrls {\n      url\n      __typename\n    }\n    __typename\n  }\n  photo {\n    ...photoContent\n    ...recoPhotoFragment\n    __typename\n  }\n  canAddComment\n  llsid\n  status\n  currentPcursor\n  tags {\n    type\n    name\n    __typename\n  }\n  __typename\n}\n\nquery visionSearchPhoto($keyword: String, $pcursor: String, $searchSessionId: String, $page: String, $webPageArea: String) {\n  visionSearchPhoto(keyword: $keyword, pcursor: $pcursor, searchSessionId: $searchSessionId, page: $page, webPageArea: $webPageArea) {\n    result\n    llsid\n    webPageArea\n    feeds {\n      ...feedContent\n      __typename\n    }\n    searchSessionId\n    pcursor\n    aladdinBanner {\n      imgUrl\n      link\n      __typename\n    }\n    __typename\n  }\n}\n"
  },
  {
    "path": "media_platform/kuaishou/graphql/video_detail.graphql",
    "content": "query visionVideoDetail($photoId: String, $type: String, $page: String, $webPageArea: String) {\n  visionVideoDetail(photoId: $photoId, type: $type, page: $page, webPageArea: $webPageArea) {\n    status\n    type\n    author {\n      id\n      name\n      following\n      headerUrl\n      __typename\n    }\n    photo {\n      id\n      duration\n      caption\n      likeCount\n      realLikeCount\n      coverUrl\n      photoUrl\n      liked\n      timestamp\n      expTag\n      llsid\n      viewCount\n      videoRatio\n      stereoType\n      musicBlocked\n      manifest {\n        mediaType\n        businessType\n        version\n        adaptationSet {\n          id\n          duration\n          representation {\n            id\n            defaultSelect\n            backupUrl\n            codecs\n            url\n            height\n            width\n            avgBitrate\n            maxBitrate\n            m3u8Slice\n            qualityType\n            qualityLabel\n            frameRate\n            featureP2sp\n            hidden\n            disableAdaptive\n            __typename\n          }\n          __typename\n        }\n        __typename\n      }\n      manifestH265\n      photoH265Url\n      coronaCropManifest\n      coronaCropManifestH265\n      croppedPhotoH265Url\n      croppedPhotoUrl\n      videoResource\n      __typename\n    }\n    tags {\n      type\n      name\n      __typename\n    }\n    commentLimit {\n      canAddComment\n      __typename\n    }\n    llsid\n    danmakuSwitch\n    __typename\n  }\n}\n"
  },
  {
    "path": "media_platform/kuaishou/graphql/vision_profile.graphql",
    "content": "query visionProfile($userId: String) {\n  visionProfile(userId: $userId) {\n    result\n    hostName\n    userProfile {\n      ownerCount {\n        fan\n        photo\n        follow\n        photo_public\n        __typename\n      }\n      profile {\n        gender\n        user_name\n        user_id\n        headurl\n        user_text\n        user_profile_bg_url\n        __typename\n      }\n      isFollowing\n      __typename\n    }\n    __typename\n  }\n}\n"
  },
  {
    "path": "media_platform/kuaishou/graphql/vision_profile_photo_list.graphql",
    "content": "fragment photoContent on PhotoEntity {\n  __typename\n  id\n  duration\n  caption\n  originCaption\n  likeCount\n  viewCount\n  commentCount\n  realLikeCount\n  coverUrl\n  photoUrl\n  photoH265Url\n  manifest\n  manifestH265\n  videoResource\n  coverUrls {\n    url\n    __typename\n  }\n  timestamp\n  expTag\n  animatedCoverUrl\n  distance\n  videoRatio\n  liked\n  stereoType\n  profileUserTopPhoto\n  musicBlocked\n  riskTagContent\n  riskTagUrl\n}\n\nfragment recoPhotoFragment on recoPhotoEntity {\n  __typename\n  id\n  duration\n  caption\n  originCaption\n  likeCount\n  viewCount\n  commentCount\n  realLikeCount\n  coverUrl\n  photoUrl\n  photoH265Url\n  manifest\n  manifestH265\n  videoResource\n  coverUrls {\n    url\n    __typename\n  }\n  timestamp\n  expTag\n  animatedCoverUrl\n  distance\n  videoRatio\n  liked\n  stereoType\n  profileUserTopPhoto\n  musicBlocked\n  riskTagContent\n  riskTagUrl\n}\n\nfragment feedContent on Feed {\n  type\n  author {\n    id\n    name\n    headerUrl\n    following\n    headerUrls {\n      url\n      __typename\n    }\n    __typename\n  }\n  photo {\n    ...photoContent\n    ...recoPhotoFragment\n    __typename\n  }\n  canAddComment\n  llsid\n  status\n  currentPcursor\n  tags {\n    type\n    name\n    __typename\n  }\n  __typename\n}\n\nquery visionProfilePhotoList($pcursor: String, $userId: String, $page: String, $webPageArea: String) {\n  visionProfilePhotoList(pcursor: $pcursor, userId: $userId, page: $page, webPageArea: $webPageArea) {\n    result\n    llsid\n    webPageArea\n    feeds {\n      ...feedContent\n      __typename\n    }\n    hostName\n    pcursor\n    __typename\n  }\n}\n"
  },
  {
    "path": "media_platform/kuaishou/graphql/vision_profile_user_list.graphql",
    "content": "query visionProfileUserList($pcursor: String, $ftype: Int) {\n  visionProfileUserList(pcursor: $pcursor, ftype: $ftype) {\n    result\n    fols {\n      user_name\n      headurl\n      user_text\n      isFollowing\n      user_id\n      __typename\n    }\n    hostName\n    pcursor\n    __typename\n  }\n}\n"
  },
  {
    "path": "media_platform/kuaishou/graphql/vision_sub_comment_list.graphql",
    "content": "mutation visionSubCommentList($photoId: String, $rootCommentId: String, $pcursor: String) {\n  visionSubCommentList(photoId: $photoId, rootCommentId: $rootCommentId, pcursor: $pcursor) {\n    pcursor\n    subComments {\n      commentId\n      authorId\n      authorName\n      content\n      headurl\n      timestamp\n      likedCount\n      realLikedCount\n      liked\n      status\n      authorLiked\n      replyToUserName\n      replyTo\n      __typename\n    }\n    __typename\n  }\n}\n"
  },
  {
    "path": "media_platform/kuaishou/graphql.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/kuaishou/graphql.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# Kuaishou's data transmission is based on GraphQL\n# This class is responsible for obtaining some GraphQL schemas\nfrom typing import Dict\n\n\nclass KuaiShouGraphQL:\n    graphql_queries: Dict[str, str]= {}\n\n    def __init__(self):\n        self.graphql_dir = \"media_platform/kuaishou/graphql/\"\n        self.load_graphql_queries()\n\n    def load_graphql_queries(self):\n        graphql_files = [\"search_query.graphql\", \"video_detail.graphql\", \"comment_list.graphql\", \"vision_profile.graphql\",\"vision_profile_photo_list.graphql\",\"vision_profile_user_list.graphql\",\"vision_sub_comment_list.graphql\"]\n\n        for file in graphql_files:\n            with open(self.graphql_dir + file, mode=\"r\") as f:\n                query_name = file.split(\".\")[0]\n                self.graphql_queries[query_name] = f.read()\n\n    def get(self, query_name: str) -> str:\n        return self.graphql_queries.get(query_name, \"Query not found\")\n"
  },
  {
    "path": "media_platform/kuaishou/help.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/kuaishou/help.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n\nimport re\nfrom model.m_kuaishou import VideoUrlInfo, CreatorUrlInfo\n\n\ndef parse_video_info_from_url(url: str) -> VideoUrlInfo:\n    \"\"\"\n    Parse video ID from Kuaishou video URL\n    Supports the following formats:\n    1. Full video URL: \"https://www.kuaishou.com/short-video/3x3zxz4mjrsc8ke?authorId=3x84qugg4ch9zhs&streamSource=search\"\n    2. Pure video ID: \"3x3zxz4mjrsc8ke\"\n\n    Args:\n        url: Kuaishou video link or video ID\n    Returns:\n        VideoUrlInfo: Object containing video ID\n    \"\"\"\n    # If it doesn't contain http and doesn't contain kuaishou.com, consider it as pure ID\n    if not url.startswith(\"http\") and \"kuaishou.com\" not in url:\n        return VideoUrlInfo(video_id=url, url_type=\"normal\")\n\n    # Extract ID from standard video URL: /short-video/video_ID\n    video_pattern = r'/short-video/([a-zA-Z0-9_-]+)'\n    match = re.search(video_pattern, url)\n    if match:\n        video_id = match.group(1)\n        return VideoUrlInfo(video_id=video_id, url_type=\"normal\")\n\n    raise ValueError(f\"Unable to parse video ID from URL: {url}\")\n\n\ndef parse_creator_info_from_url(url: str) -> CreatorUrlInfo:\n    \"\"\"\n    Parse creator ID from Kuaishou creator homepage URL\n    Supports the following formats:\n    1. Creator homepage: \"https://www.kuaishou.com/profile/3x84qugg4ch9zhs\"\n    2. Pure ID: \"3x4sm73aye7jq7i\"\n\n    Args:\n        url: Kuaishou creator homepage link or user_id\n    Returns:\n        CreatorUrlInfo: Object containing creator ID\n    \"\"\"\n    # If it doesn't contain http and doesn't contain kuaishou.com, consider it as pure ID\n    if not url.startswith(\"http\") and \"kuaishou.com\" not in url:\n        return CreatorUrlInfo(user_id=url)\n\n    # Extract user_id from creator homepage URL: /profile/xxx\n    user_pattern = r'/profile/([a-zA-Z0-9_-]+)'\n    match = re.search(user_pattern, url)\n    if match:\n        user_id = match.group(1)\n        return CreatorUrlInfo(user_id=user_id)\n\n    raise ValueError(f\"Unable to parse creator ID from URL: {url}\")\n\n\nif __name__ == '__main__':\n    # Test video URL parsing\n    print(\"=== Video URL Parsing Test ===\")\n    test_video_urls = [\n        \"https://www.kuaishou.com/short-video/3x3zxz4mjrsc8ke?authorId=3x84qugg4ch9zhs&streamSource=search&area=searchxxnull&searchKey=python\",\n        \"3xf8enb8dbj6uig\",\n    ]\n    for url in test_video_urls:\n        try:\n            result = parse_video_info_from_url(url)\n            print(f\"✓ URL: {url[:80]}...\")\n            print(f\"  Result: {result}\\n\")\n        except Exception as e:\n            print(f\"✗ URL: {url}\")\n            print(f\"  Error: {e}\\n\")\n\n    # Test creator URL parsing\n    print(\"=== Creator URL Parsing Test ===\")\n    test_creator_urls = [\n        \"https://www.kuaishou.com/profile/3x84qugg4ch9zhs\",\n        \"3x4sm73aye7jq7i\",\n    ]\n    for url in test_creator_urls:\n        try:\n            result = parse_creator_info_from_url(url)\n            print(f\"✓ URL: {url[:80]}...\")\n            print(f\"  Result: {result}\\n\")\n        except Exception as e:\n            print(f\"✗ URL: {url}\")\n            print(f\"  Error: {e}\\n\")\n"
  },
  {
    "path": "media_platform/kuaishou/login.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/kuaishou/login.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nimport asyncio\nimport functools\nimport sys\nfrom typing import Optional\n\nfrom playwright.async_api import BrowserContext, Page\nfrom tenacity import (RetryError, retry, retry_if_result, stop_after_attempt,\n                      wait_fixed)\n\nimport config\nfrom base.base_crawler import AbstractLogin\nfrom tools import utils\n\n\nclass KuaishouLogin(AbstractLogin):\n    def __init__(self,\n                 login_type: str,\n                 browser_context: BrowserContext,\n                 context_page: Page,\n                 login_phone: Optional[str] = \"\",\n                 cookie_str: str = \"\"\n                 ):\n        config.LOGIN_TYPE = login_type\n        self.browser_context = browser_context\n        self.context_page = context_page\n        self.login_phone = login_phone\n        self.cookie_str = cookie_str\n\n    async def begin(self):\n        \"\"\"Start login xiaohongshu\"\"\"\n        utils.logger.info(\"[KuaishouLogin.begin] Begin login kuaishou ...\")\n        if config.LOGIN_TYPE == \"qrcode\":\n            await self.login_by_qrcode()\n        elif config.LOGIN_TYPE == \"phone\":\n            await self.login_by_mobile()\n        elif config.LOGIN_TYPE == \"cookie\":\n            await self.login_by_cookies()\n        else:\n            raise ValueError(\"[KuaishouLogin.begin] Invalid Login Type Currently only supported qrcode or phone or cookie ...\")\n\n    @retry(stop=stop_after_attempt(600), wait=wait_fixed(1), retry=retry_if_result(lambda value: value is False))\n    async def check_login_state(self) -> bool:\n        \"\"\"\n            Check if the current login status is successful and return True otherwise return False\n            retry decorator will retry 20 times if the return value is False, and the retry interval is 1 second\n            if max retry times reached, raise RetryError\n        \"\"\"\n        current_cookie = await self.browser_context.cookies()\n        _, cookie_dict = utils.convert_cookies(current_cookie)\n        kuaishou_pass_token = cookie_dict.get(\"passToken\")\n        if kuaishou_pass_token:\n            return True\n        return False\n\n    async def login_by_qrcode(self):\n        \"\"\"login kuaishou website and keep webdriver login state\"\"\"\n        utils.logger.info(\"[KuaishouLogin.login_by_qrcode] Begin login kuaishou by qrcode ...\")\n\n        # click login button\n        login_button_ele = self.context_page.locator(\n            \"xpath=//p[text()='登录']\"\n        )\n        await login_button_ele.click()\n\n        # find login qrcode\n        qrcode_img_selector = \"//div[@class='qrcode-img']//img\"\n        base64_qrcode_img = await utils.find_login_qrcode(\n            self.context_page,\n            selector=qrcode_img_selector\n        )\n        if not base64_qrcode_img:\n            utils.logger.info(\"[KuaishouLogin.login_by_qrcode] login failed , have not found qrcode please check ....\")\n            sys.exit()\n\n\n        # show login qrcode\n        partial_show_qrcode = functools.partial(utils.show_qrcode, base64_qrcode_img)\n        asyncio.get_running_loop().run_in_executor(executor=None, func=partial_show_qrcode)\n\n        utils.logger.info(f\"[KuaishouLogin.login_by_qrcode] waiting for scan code login, remaining time is 20s\")\n        try:\n            await self.check_login_state()\n        except RetryError:\n            utils.logger.info(\"[KuaishouLogin.login_by_qrcode] Login kuaishou failed by qrcode login method ...\")\n            sys.exit()\n\n        wait_redirect_seconds = 5\n        utils.logger.info(f\"[KuaishouLogin.login_by_qrcode] Login successful then wait for {wait_redirect_seconds} seconds redirect ...\")\n        await asyncio.sleep(wait_redirect_seconds)\n\n    async def login_by_mobile(self):\n        pass\n\n    async def login_by_cookies(self):\n        utils.logger.info(\"[KuaishouLogin.login_by_cookies] Begin login kuaishou by cookie ...\")\n        for key, value in utils.convert_str_cookie_to_dict(self.cookie_str).items():\n            await self.browser_context.add_cookies([{\n                'name': key,\n                'value': value,\n                'domain': \".kuaishou.com\",\n                'path': \"/\"\n            }])\n"
  },
  {
    "path": "media_platform/tieba/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/tieba/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\nfrom .core import TieBaCrawler\n"
  },
  {
    "path": "media_platform/tieba/client.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/tieba/client.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\nimport asyncio\nimport json\nfrom typing import Any, Callable, Dict, List, Optional, Union\nfrom urllib.parse import urlencode, quote\n\nimport requests\nfrom playwright.async_api import BrowserContext, Page\nfrom tenacity import RetryError, retry, stop_after_attempt, wait_fixed\n\nimport config\nfrom base.base_crawler import AbstractApiClient\nfrom model.m_baidu_tieba import TiebaComment, TiebaCreator, TiebaNote\nfrom proxy.proxy_ip_pool import ProxyIpPool\nfrom tools import utils\n\nfrom .field import SearchNoteType, SearchSortType\nfrom .help import TieBaExtractor\n\n\nclass BaiduTieBaClient(AbstractApiClient):\n\n    def __init__(\n        self,\n        timeout=10,\n        ip_pool=None,\n        default_ip_proxy=None,\n        headers: Dict[str, str] = None,\n        playwright_page: Optional[Page] = None,\n    ):\n        self.ip_pool: Optional[ProxyIpPool] = ip_pool\n        self.timeout = timeout\n        # Use provided headers (including real browser UA) or default headers\n        self.headers = headers or {\n            \"User-Agent\": utils.get_user_agent(),\n            \"Cookie\": \"\",\n        }\n        self._host = \"https://tieba.baidu.com\"\n        self._page_extractor = TieBaExtractor()\n        self.default_ip_proxy = default_ip_proxy\n        self.playwright_page = playwright_page  # Playwright page object\n\n    def _sync_request(self, method, url, proxy=None, **kwargs):\n        \"\"\"\n        Synchronous requests method\n        Args:\n            method: Request method\n            url: Request URL\n            proxy: Proxy IP\n            **kwargs: Other request parameters\n\n        Returns:\n            Response object\n        \"\"\"\n        # Construct proxy dictionary\n        proxies = None\n        if proxy:\n            proxies = {\n                \"http\": proxy,\n                \"https\": proxy,\n            }\n\n        # Send request\n        response = requests.request(\n            method=method,\n            url=url,\n            headers=self.headers,\n            proxies=proxies,\n            timeout=self.timeout,\n            **kwargs\n        )\n        return response\n\n    async def _refresh_proxy_if_expired(self) -> None:\n        \"\"\"\n        Check if proxy is expired and automatically refresh if necessary\n        \"\"\"\n        if self.ip_pool is None:\n            return\n\n        if self.ip_pool.is_current_proxy_expired():\n            utils.logger.info(\n                \"[BaiduTieBaClient._refresh_proxy_if_expired] Proxy expired, refreshing...\"\n            )\n            new_proxy = await self.ip_pool.get_or_refresh_proxy()\n            # Update proxy URL\n            _, self.default_ip_proxy = utils.format_proxy_info(new_proxy)\n            utils.logger.info(\n                f\"[BaiduTieBaClient._refresh_proxy_if_expired] New proxy: {new_proxy.ip}:{new_proxy.port}\"\n            )\n\n    @retry(stop=stop_after_attempt(3), wait=wait_fixed(1))\n    async def request(self, method, url, return_ori_content=False, proxy=None, **kwargs) -> Union[str, Any]:\n        \"\"\"\n        Common request method wrapper for requests, handles request responses\n        Args:\n            method: Request method\n            url: Request URL\n            return_ori_content: Whether to return original content\n            proxy: Proxy IP\n            **kwargs: Other request parameters, such as headers, request body, etc.\n\n        Returns:\n\n        \"\"\"\n        # Check if proxy is expired before each request\n        await self._refresh_proxy_if_expired()\n\n        actual_proxy = proxy if proxy else self.default_ip_proxy\n\n        # Execute synchronous requests in thread pool\n        response = await asyncio.to_thread(\n            self._sync_request,\n            method,\n            url,\n            actual_proxy,\n            **kwargs\n        )\n\n        if response.status_code != 200:\n            utils.logger.error(f\"Request failed, method: {method}, url: {url}, status code: {response.status_code}\")\n            utils.logger.error(f\"Request failed, response: {response.text}\")\n            raise Exception(f\"Request failed, method: {method}, url: {url}, status code: {response.status_code}\")\n\n        if response.text == \"\" or response.text == \"blocked\":\n            utils.logger.error(f\"request params incorrect, response.text: {response.text}\")\n            raise Exception(\"account blocked\")\n\n        if return_ori_content:\n            return response.text\n\n        return response.json()\n\n    async def get(self, uri: str, params=None, return_ori_content=False, **kwargs) -> Any:\n        \"\"\"\n        GET request with header signing\n        Args:\n            uri: Request route\n            params: Request parameters\n            return_ori_content: Whether to return original content\n\n        Returns:\n\n        \"\"\"\n        final_uri = uri\n        if isinstance(params, dict):\n            final_uri = (f\"{uri}?\"\n                         f\"{urlencode(params)}\")\n        try:\n            res = await self.request(method=\"GET\", url=f\"{self._host}{final_uri}\", return_ori_content=return_ori_content, **kwargs)\n            return res\n        except RetryError as e:\n            if self.ip_pool:\n                proxie_model = await self.ip_pool.get_proxy()\n                _, proxy = utils.format_proxy_info(proxie_model)\n                res = await self.request(method=\"GET\", url=f\"{self._host}{final_uri}\", return_ori_content=return_ori_content, proxy=proxy, **kwargs)\n                self.default_ip_proxy = proxy\n                return res\n\n            utils.logger.error(f\"[BaiduTieBaClient.get] Reached maximum retry attempts, IP is blocked, please try a new IP proxy: {e}\")\n            raise Exception(f\"[BaiduTieBaClient.get] Reached maximum retry attempts, IP is blocked, please try a new IP proxy: {e}\")\n\n    async def post(self, uri: str, data: dict, **kwargs) -> Dict:\n        \"\"\"\n        POST request with header signing\n        Args:\n            uri: Request route\n            data: Request body parameters\n\n        Returns:\n\n        \"\"\"\n        json_str = json.dumps(data, separators=(',', ':'), ensure_ascii=False)\n        return await self.request(method=\"POST\", url=f\"{self._host}{uri}\", data=json_str, **kwargs)\n\n    async def pong(self, browser_context: BrowserContext = None) -> bool:\n        \"\"\"\n        Check if login state is still valid\n        Uses Cookie detection instead of API calls to avoid detection\n        Args:\n            browser_context: Browser context object\n\n        Returns:\n            bool: True if logged in, False if not logged in\n        \"\"\"\n        utils.logger.info(\"[BaiduTieBaClient.pong] Begin to check tieba login state by cookies...\")\n\n        if not browser_context:\n            utils.logger.warning(\"[BaiduTieBaClient.pong] browser_context is None, assume not logged in\")\n            return False\n\n        try:\n            # Get cookies from browser and check key login cookies\n            _, cookie_dict = utils.convert_cookies(await browser_context.cookies())\n\n            # Baidu Tieba login identifiers: STOKEN or PTOKEN\n            stoken = cookie_dict.get(\"STOKEN\")\n            ptoken = cookie_dict.get(\"PTOKEN\")\n            bduss = cookie_dict.get(\"BDUSS\")  # Baidu universal login cookie\n\n            if stoken or ptoken or bduss:\n                utils.logger.info(f\"[BaiduTieBaClient.pong] Login state verified by cookies (STOKEN: {bool(stoken)}, PTOKEN: {bool(ptoken)}, BDUSS: {bool(bduss)})\")\n                return True\n            else:\n                utils.logger.info(\"[BaiduTieBaClient.pong] No valid login cookies found, need to login\")\n                return False\n\n        except Exception as e:\n            utils.logger.error(f\"[BaiduTieBaClient.pong] Check login state failed: {e}, assume not logged in\")\n            return False\n\n    async def update_cookies(self, browser_context: BrowserContext):\n        \"\"\"\n        Update cookies method provided by API client, usually called after successful login\n        Args:\n            browser_context: Browser context object\n\n        Returns:\n\n        \"\"\"\n        cookie_str, cookie_dict = utils.convert_cookies(await browser_context.cookies())\n        self.headers[\"Cookie\"] = cookie_str\n        utils.logger.info(\"[BaiduTieBaClient.update_cookies] Cookie has been updated\")\n\n    async def get_notes_by_keyword(\n        self,\n        keyword: str,\n        page: int = 1,\n        page_size: int = 10,\n        sort: SearchSortType = SearchSortType.TIME_DESC,\n        note_type: SearchNoteType = SearchNoteType.FIXED_THREAD,\n    ) -> List[TiebaNote]:\n        \"\"\"\n        Search Tieba posts by keyword (uses Playwright to access page, avoiding API detection)\n        Args:\n            keyword: Keyword\n            page: Page number\n            page_size: Page size\n            sort: Result sort method\n            note_type: Post type (main thread | main thread + reply mixed mode)\n        Returns:\n\n        \"\"\"\n        if not self.playwright_page:\n            utils.logger.error(\"[BaiduTieBaClient.get_notes_by_keyword] playwright_page is None, cannot use browser mode\")\n            raise Exception(\"playwright_page is required for browser-based search\")\n\n        # Construct search URL\n        # Example: https://tieba.baidu.com/f/search/res?ie=utf-8&qw=keyword\n        search_url = f\"{self._host}/f/search/res\"\n        params = {\n            \"ie\": \"utf-8\",\n            \"qw\": keyword,\n            \"rn\": page_size,\n            \"pn\": page,\n            \"sm\": sort.value,\n            \"only_thread\": note_type.value,\n        }\n\n        # Concatenate full URL\n        full_url = f\"{search_url}?{urlencode(params)}\"\n        utils.logger.info(f\"[BaiduTieBaClient.get_notes_by_keyword] Accessing search page: {full_url}\")\n\n        try:\n            # Use Playwright to access search page\n            await self.playwright_page.goto(full_url, wait_until=\"domcontentloaded\")\n\n            # Wait for page loading, using delay setting from config file\n            await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n\n            # Get page HTML content\n            page_content = await self.playwright_page.content()\n            utils.logger.info(f\"[BaiduTieBaClient.get_notes_by_keyword] Successfully retrieved search page HTML, length: {len(page_content)}\")\n\n            # Extract search results\n            notes = self._page_extractor.extract_search_note_list(page_content)\n            utils.logger.info(f\"[BaiduTieBaClient.get_notes_by_keyword] Extracted {len(notes)} posts\")\n            return notes\n\n        except Exception as e:\n            utils.logger.error(f\"[BaiduTieBaClient.get_notes_by_keyword] Search failed: {e}\")\n            raise\n\n    async def get_note_by_id(self, note_id: str) -> TiebaNote:\n        \"\"\"\n        Get post details by post ID (uses Playwright to access page, avoiding API detection)\n        Args:\n            note_id: Post ID\n\n        Returns:\n            TiebaNote: Post detail object\n        \"\"\"\n        if not self.playwright_page:\n            utils.logger.error(\"[BaiduTieBaClient.get_note_by_id] playwright_page is None, cannot use browser mode\")\n            raise Exception(\"playwright_page is required for browser-based note detail fetching\")\n\n        # Construct post detail URL\n        note_url = f\"{self._host}/p/{note_id}\"\n        utils.logger.info(f\"[BaiduTieBaClient.get_note_by_id] Accessing post detail page: {note_url}\")\n\n        try:\n            # Use Playwright to access post detail page\n            await self.playwright_page.goto(note_url, wait_until=\"domcontentloaded\")\n\n            # Wait for page loading, using delay setting from config file\n            await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n\n            # Get page HTML content\n            page_content = await self.playwright_page.content()\n            utils.logger.info(f\"[BaiduTieBaClient.get_note_by_id] Successfully retrieved post detail HTML, length: {len(page_content)}\")\n\n            # Extract post details\n            note_detail = self._page_extractor.extract_note_detail(page_content)\n            return note_detail\n\n        except Exception as e:\n            utils.logger.error(f\"[BaiduTieBaClient.get_note_by_id] Failed to get post details: {e}\")\n            raise\n\n    async def get_note_all_comments(\n        self,\n        note_detail: TiebaNote,\n        crawl_interval: float = 1.0,\n        callback: Optional[Callable] = None,\n        max_count: int = 10,\n    ) -> List[TiebaComment]:\n        \"\"\"\n        Get all first-level comments for specified post (uses Playwright to access page, avoiding API detection)\n        Args:\n            note_detail: Post detail object\n            crawl_interval: Crawl delay interval in seconds\n            callback: Callback function after one post crawl completes\n            max_count: Maximum number of comments to crawl per post\n        Returns:\n            List[TiebaComment]: Comment list\n        \"\"\"\n        if not self.playwright_page:\n            utils.logger.error(\"[BaiduTieBaClient.get_note_all_comments] playwright_page is None, cannot use browser mode\")\n            raise Exception(\"playwright_page is required for browser-based comment fetching\")\n\n        result: List[TiebaComment] = []\n        current_page = 1\n\n        while note_detail.total_replay_page >= current_page and len(result) < max_count:\n            # Construct comment page URL\n            comment_url = f\"{self._host}/p/{note_detail.note_id}?pn={current_page}\"\n            utils.logger.info(f\"[BaiduTieBaClient.get_note_all_comments] Accessing comment page: {comment_url}\")\n\n            try:\n                # Use Playwright to access comment page\n                await self.playwright_page.goto(comment_url, wait_until=\"domcontentloaded\")\n\n                # Wait for page loading, using delay setting from config file\n                await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n\n                # Get page HTML content\n                page_content = await self.playwright_page.content()\n\n                # Extract comments\n                comments = self._page_extractor.extract_tieba_note_parment_comments(\n                    page_content, note_id=note_detail.note_id\n                )\n\n                if not comments:\n                    utils.logger.info(f\"[BaiduTieBaClient.get_note_all_comments] Page {current_page} has no comments, stopping crawl\")\n                    break\n\n                # Limit comment count\n                if len(result) + len(comments) > max_count:\n                    comments = comments[:max_count - len(result)]\n\n                if callback:\n                    await callback(note_detail.note_id, comments)\n\n                result.extend(comments)\n\n                # Get all sub-comments\n                await self.get_comments_all_sub_comments(\n                    comments, crawl_interval=crawl_interval, callback=callback\n                )\n\n                await asyncio.sleep(crawl_interval)\n                current_page += 1\n\n            except Exception as e:\n                utils.logger.error(f\"[BaiduTieBaClient.get_note_all_comments] Failed to get page {current_page} comments: {e}\")\n                break\n\n        utils.logger.info(f\"[BaiduTieBaClient.get_note_all_comments] Total retrieved {len(result)} first-level comments\")\n        return result\n\n    async def get_comments_all_sub_comments(\n        self,\n        comments: List[TiebaComment],\n        crawl_interval: float = 1.0,\n        callback: Optional[Callable] = None,\n    ) -> List[TiebaComment]:\n        \"\"\"\n        Get all sub-comments for specified comments (uses Playwright to access page, avoiding API detection)\n        Args:\n            comments: Comment list\n            crawl_interval: Crawl delay interval in seconds\n            callback: Callback function after one post crawl completes\n\n        Returns:\n            List[TiebaComment]: Sub-comment list\n        \"\"\"\n        if not config.ENABLE_GET_SUB_COMMENTS:\n            return []\n\n        if not self.playwright_page:\n            utils.logger.error(\"[BaiduTieBaClient.get_comments_all_sub_comments] playwright_page is None, cannot use browser mode\")\n            raise Exception(\"playwright_page is required for browser-based sub-comment fetching\")\n\n        all_sub_comments: List[TiebaComment] = []\n\n        for parment_comment in comments:\n            if parment_comment.sub_comment_count == 0:\n                continue\n\n            current_page = 1\n            max_sub_page_num = parment_comment.sub_comment_count // 10 + 1\n\n            while max_sub_page_num >= current_page:\n                # Construct sub-comment URL\n                sub_comment_url = (\n                    f\"{self._host}/p/comment?\"\n                    f\"tid={parment_comment.note_id}&\"\n                    f\"pid={parment_comment.comment_id}&\"\n                    f\"fid={parment_comment.tieba_id}&\"\n                    f\"pn={current_page}\"\n                )\n                utils.logger.info(f\"[BaiduTieBaClient.get_comments_all_sub_comments] Accessing sub-comment page: {sub_comment_url}\")\n\n                try:\n                    # Use Playwright to access sub-comment page\n                    await self.playwright_page.goto(sub_comment_url, wait_until=\"domcontentloaded\")\n\n                    # Wait for page loading, using delay setting from config file\n                    await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n\n                    # Get page HTML content\n                    page_content = await self.playwright_page.content()\n\n                    # Extract sub-comments\n                    sub_comments = self._page_extractor.extract_tieba_note_sub_comments(\n                        page_content, parent_comment=parment_comment\n                    )\n\n                    if not sub_comments:\n                        utils.logger.info(\n                            f\"[BaiduTieBaClient.get_comments_all_sub_comments] \"\n                            f\"Comment {parment_comment.comment_id} page {current_page} has no sub-comments, stopping crawl\"\n                        )\n                        break\n\n                    if callback:\n                        await callback(parment_comment.note_id, sub_comments)\n\n                    all_sub_comments.extend(sub_comments)\n                    await asyncio.sleep(crawl_interval)\n                    current_page += 1\n\n                except Exception as e:\n                    utils.logger.error(\n                        f\"[BaiduTieBaClient.get_comments_all_sub_comments] \"\n                        f\"Failed to get comment {parment_comment.comment_id} page {current_page} sub-comments: {e}\"\n                    )\n                    break\n\n        utils.logger.info(f\"[BaiduTieBaClient.get_comments_all_sub_comments] Total retrieved {len(all_sub_comments)} sub-comments\")\n        return all_sub_comments\n\n    async def get_notes_by_tieba_name(self, tieba_name: str, page_num: int) -> List[TiebaNote]:\n        \"\"\"\n        Get post list by Tieba name (uses Playwright to access page, avoiding API detection)\n        Args:\n            tieba_name: Tieba name\n            page_num: Page number\n\n        Returns:\n            List[TiebaNote]: Post list\n        \"\"\"\n        if not self.playwright_page:\n            utils.logger.error(\"[BaiduTieBaClient.get_notes_by_tieba_name] playwright_page is None, cannot use browser mode\")\n            raise Exception(\"playwright_page is required for browser-based tieba note fetching\")\n\n        # Construct Tieba post list URL\n        tieba_url = f\"{self._host}/f?kw={quote(tieba_name)}&pn={page_num}\"\n        utils.logger.info(f\"[BaiduTieBaClient.get_notes_by_tieba_name] Accessing Tieba page: {tieba_url}\")\n\n        try:\n            # Use Playwright to access Tieba page\n            await self.playwright_page.goto(tieba_url, wait_until=\"domcontentloaded\")\n\n            # Wait for page loading, using delay setting from config file\n            await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n\n            # Get page HTML content\n            page_content = await self.playwright_page.content()\n            utils.logger.info(f\"[BaiduTieBaClient.get_notes_by_tieba_name] Successfully retrieved Tieba page HTML, length: {len(page_content)}\")\n\n            # Extract post list\n            notes = self._page_extractor.extract_tieba_note_list(page_content)\n            utils.logger.info(f\"[BaiduTieBaClient.get_notes_by_tieba_name] Extracted {len(notes)} posts\")\n            return notes\n\n        except Exception as e:\n            utils.logger.error(f\"[BaiduTieBaClient.get_notes_by_tieba_name] Failed to get Tieba post list: {e}\")\n            raise\n\n    async def get_creator_info_by_url(self, creator_url: str) -> str:\n        \"\"\"\n        Get creator information by creator URL (uses Playwright to access page, avoiding API detection)\n        Args:\n            creator_url: Creator homepage URL\n\n        Returns:\n            str: Page HTML content\n        \"\"\"\n        if not self.playwright_page:\n            utils.logger.error(\"[BaiduTieBaClient.get_creator_info_by_url] playwright_page is None, cannot use browser mode\")\n            raise Exception(\"playwright_page is required for browser-based creator info fetching\")\n\n        utils.logger.info(f\"[BaiduTieBaClient.get_creator_info_by_url] Accessing creator homepage: {creator_url}\")\n\n        try:\n            # Use Playwright to access creator homepage\n            await self.playwright_page.goto(creator_url, wait_until=\"domcontentloaded\")\n\n            # Wait for page loading, using delay setting from config file\n            await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n\n            # Get page HTML content\n            page_content = await self.playwright_page.content()\n            utils.logger.info(f\"[BaiduTieBaClient.get_creator_info_by_url] Successfully retrieved creator homepage HTML, length: {len(page_content)}\")\n\n            return page_content\n\n        except Exception as e:\n            utils.logger.error(f\"[BaiduTieBaClient.get_creator_info_by_url] Failed to get creator homepage: {e}\")\n            raise\n\n    async def get_notes_by_creator(self, user_name: str, page_number: int) -> Dict:\n        \"\"\"\n        Get creator's posts by creator (uses Playwright to access page, avoiding API detection)\n        Args:\n            user_name: Creator username\n            page_number: Page number\n\n        Returns:\n            Dict: Dictionary containing post data\n        \"\"\"\n        if not self.playwright_page:\n            utils.logger.error(\"[BaiduTieBaClient.get_notes_by_creator] playwright_page is None, cannot use browser mode\")\n            raise Exception(\"playwright_page is required for browser-based creator notes fetching\")\n\n        # Construct creator post list URL\n        creator_url = f\"{self._host}/home/get/getthread?un={quote(user_name)}&pn={page_number}&id=utf-8&_={utils.get_current_timestamp()}\"\n        utils.logger.info(f\"[BaiduTieBaClient.get_notes_by_creator] Accessing creator post list: {creator_url}\")\n\n        try:\n            # Use Playwright to access creator post list page\n            await self.playwright_page.goto(creator_url, wait_until=\"domcontentloaded\")\n\n            # Wait for page loading, using delay setting from config file\n            await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n\n            # Get page content (this API returns JSON)\n            page_content = await self.playwright_page.content()\n\n            # Extract JSON data (page will contain <pre> tag or is directly JSON)\n            try:\n                # Try to extract JSON from page\n                json_text = await self.playwright_page.evaluate(\"() => document.body.innerText\")\n                result = json.loads(json_text)\n                utils.logger.info(f\"[BaiduTieBaClient.get_notes_by_creator] Successfully retrieved creator post data\")\n                return result\n            except json.JSONDecodeError as e:\n                utils.logger.error(f\"[BaiduTieBaClient.get_notes_by_creator] JSON parsing failed: {e}\")\n                utils.logger.error(f\"[BaiduTieBaClient.get_notes_by_creator] Page content: {page_content[:500]}\")\n                raise Exception(f\"Failed to parse JSON from creator notes page: {e}\")\n\n        except Exception as e:\n            utils.logger.error(f\"[BaiduTieBaClient.get_notes_by_creator] Failed to get creator post list: {e}\")\n            raise\n\n    async def get_all_notes_by_creator_user_name(\n        self,\n        user_name: str,\n        crawl_interval: float = 1.0,\n        callback: Optional[Callable] = None,\n        max_note_count: int = 0,\n        creator_page_html_content: str = None,\n    ) -> List[TiebaNote]:\n        \"\"\"\n        Get all creator posts by creator username\n        Args:\n            user_name: Creator username\n            crawl_interval: Crawl delay interval in seconds\n            callback: Callback function after one post crawl completes, an awaitable function\n            max_note_count: Maximum number of posts to retrieve, if 0 then get all\n            creator_page_html_content: Creator homepage HTML content\n\n        Returns:\n\n        \"\"\"\n        # Baidu Tieba is special, the first 10 posts are directly displayed on the homepage and need special handling, cannot be obtained through API\n        result: List[TiebaNote] = []\n        if creator_page_html_content:\n            thread_id_list = (self._page_extractor.extract_tieba_thread_id_list_from_creator_page(creator_page_html_content))\n            utils.logger.info(f\"[BaiduTieBaClient.get_all_notes_by_creator] got user_name:{user_name} thread_id_list len : {len(thread_id_list)}\")\n            note_detail_task = [self.get_note_by_id(thread_id) for thread_id in thread_id_list]\n            notes = await asyncio.gather(*note_detail_task)\n            if callback:\n                await callback(notes)\n            result.extend(notes)\n\n        notes_has_more = 1\n        page_number = 1\n        page_per_count = 20\n        total_get_count = 0\n        while notes_has_more == 1 and (max_note_count == 0 or total_get_count < max_note_count):\n            notes_res = await self.get_notes_by_creator(user_name, page_number)\n            if not notes_res or notes_res.get(\"no\") != 0:\n                utils.logger.error(f\"[WeiboClient.get_notes_by_creator] got user_name:{user_name} notes failed, notes_res: {notes_res}\")\n                break\n            notes_data = notes_res.get(\"data\")\n            notes_has_more = notes_data.get(\"has_more\")\n            notes = notes_data[\"thread_list\"]\n            utils.logger.info(f\"[WeiboClient.get_all_notes_by_creator] got user_name:{user_name} notes len : {len(notes)}\")\n\n            note_detail_task = [self.get_note_by_id(note['thread_id']) for note in notes]\n            notes = await asyncio.gather(*note_detail_task)\n            if callback:\n                await callback(notes)\n            await asyncio.sleep(crawl_interval)\n            result.extend(notes)\n            page_number += 1\n            total_get_count += page_per_count\n        return result\n"
  },
  {
    "path": "media_platform/tieba/core.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/tieba/core.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nimport asyncio\nimport os\nfrom asyncio import Task\nfrom typing import Dict, List, Optional, Tuple\n\nfrom playwright.async_api import (\n    BrowserContext,\n    BrowserType,\n    Page,\n    Playwright,\n    async_playwright,\n)\n\nimport config\nfrom base.base_crawler import AbstractCrawler\nfrom model.m_baidu_tieba import TiebaCreator, TiebaNote\nfrom proxy.proxy_ip_pool import IpInfoModel, ProxyIpPool, create_ip_pool\nfrom store import tieba as tieba_store\nfrom tools import utils\nfrom tools.cdp_browser import CDPBrowserManager\nfrom var import crawler_type_var, source_keyword_var\n\nfrom .client import BaiduTieBaClient\nfrom .field import SearchNoteType, SearchSortType\nfrom .help import TieBaExtractor\nfrom .login import BaiduTieBaLogin\n\n\nclass TieBaCrawler(AbstractCrawler):\n    context_page: Page\n    tieba_client: BaiduTieBaClient\n    browser_context: BrowserContext\n    cdp_manager: Optional[CDPBrowserManager]\n\n    def __init__(self) -> None:\n        self.index_url = \"https://tieba.baidu.com\"\n        self.user_agent = utils.get_user_agent()\n        self._page_extractor = TieBaExtractor()\n        self.cdp_manager = None\n\n    async def start(self) -> None:\n        \"\"\"\n        Start the crawler\n        Returns:\n\n        \"\"\"\n        playwright_proxy_format, httpx_proxy_format = None, None\n        if config.ENABLE_IP_PROXY:\n            utils.logger.info(\n                \"[BaiduTieBaCrawler.start] Begin create ip proxy pool ...\"\n            )\n            ip_proxy_pool = await create_ip_pool(\n                config.IP_PROXY_POOL_COUNT, enable_validate_ip=True\n            )\n            ip_proxy_info: IpInfoModel = await ip_proxy_pool.get_proxy()\n            playwright_proxy_format, httpx_proxy_format = utils.format_proxy_info(ip_proxy_info)\n            utils.logger.info(\n                f\"[BaiduTieBaCrawler.start] Init default ip proxy, value: {httpx_proxy_format}\"\n            )\n\n        async with async_playwright() as playwright:\n            # Choose startup mode based on configuration\n            if config.ENABLE_CDP_MODE:\n                utils.logger.info(\"[BaiduTieBaCrawler] Launching browser in CDP mode\")\n                self.browser_context = await self.launch_browser_with_cdp(\n                    playwright,\n                    playwright_proxy_format,\n                    self.user_agent,\n                    headless=config.CDP_HEADLESS,\n                )\n            else:\n                utils.logger.info(\"[BaiduTieBaCrawler] Launching browser in standard mode\")\n                # Launch a browser context.\n                chromium = playwright.chromium\n                self.browser_context = await self.launch_browser(\n                    chromium,\n                    playwright_proxy_format,\n                    self.user_agent,\n                    headless=config.HEADLESS,\n                )\n\n            # Inject anti-detection scripts - for Baidu's special detection\n            await self._inject_anti_detection_scripts()\n\n            self.context_page = await self.browser_context.new_page()\n\n            # First visit Baidu homepage, then click Tieba link to avoid triggering security verification\n            await self._navigate_to_tieba_via_baidu()\n\n            # Create a client to interact with the baidutieba website.\n            self.tieba_client = await self.create_tieba_client(\n                httpx_proxy_format,\n                ip_proxy_pool if config.ENABLE_IP_PROXY else None\n            )\n\n            # Check login status and perform login if necessary\n            if not await self.tieba_client.pong(browser_context=self.browser_context):\n                login_obj = BaiduTieBaLogin(\n                    login_type=config.LOGIN_TYPE,\n                    login_phone=\"\",  # your phone number\n                    browser_context=self.browser_context,\n                    context_page=self.context_page,\n                    cookie_str=config.COOKIES,\n                )\n                await login_obj.begin()\n                await self.tieba_client.update_cookies(browser_context=self.browser_context)\n\n            crawler_type_var.set(config.CRAWLER_TYPE)\n            if config.CRAWLER_TYPE == \"search\":\n                # Search for notes and retrieve their comment information.\n                await self.search()\n                await self.get_specified_tieba_notes()\n            elif config.CRAWLER_TYPE == \"detail\":\n                # Get the information and comments of the specified post\n                await self.get_specified_notes()\n            elif config.CRAWLER_TYPE == \"creator\":\n                # Get creator's information and their notes and comments\n                await self.get_creators_and_notes()\n            else:\n                pass\n\n            utils.logger.info(\"[BaiduTieBaCrawler.start] Tieba Crawler finished ...\")\n\n    async def search(self) -> None:\n        \"\"\"\n        Search for notes and retrieve their comment information.\n        Returns:\n\n        \"\"\"\n        utils.logger.info(\n            \"[BaiduTieBaCrawler.search] Begin search baidu tieba keywords\"\n        )\n        tieba_limit_count = 10  # tieba limit page fixed value\n        if config.CRAWLER_MAX_NOTES_COUNT < tieba_limit_count:\n            config.CRAWLER_MAX_NOTES_COUNT = tieba_limit_count\n        start_page = config.START_PAGE\n        for keyword in config.KEYWORDS.split(\",\"):\n            source_keyword_var.set(keyword)\n            utils.logger.info(\n                f\"[BaiduTieBaCrawler.search] Current search keyword: {keyword}\"\n            )\n            page = 1\n            while (\n                page - start_page + 1\n            ) * tieba_limit_count <= config.CRAWLER_MAX_NOTES_COUNT:\n                if page < start_page:\n                    utils.logger.info(f\"[BaiduTieBaCrawler.search] Skip page {page}\")\n                    page += 1\n                    continue\n                try:\n                    utils.logger.info(\n                        f\"[BaiduTieBaCrawler.search] search tieba keyword: {keyword}, page: {page}\"\n                    )\n                    notes_list: List[TiebaNote] = (\n                        await self.tieba_client.get_notes_by_keyword(\n                            keyword=keyword,\n                            page=page,\n                            page_size=tieba_limit_count,\n                            sort=SearchSortType.TIME_DESC,\n                            note_type=SearchNoteType.FIXED_THREAD,\n                        )\n                    )\n                    if not notes_list:\n                        utils.logger.info(\n                            f\"[BaiduTieBaCrawler.search] Search note list is empty\"\n                        )\n                        break\n                    utils.logger.info(\n                        f\"[BaiduTieBaCrawler.search] Note list len: {len(notes_list)}\"\n                    )\n                    await self.get_specified_notes(\n                        note_id_list=[note_detail.note_id for note_detail in notes_list]\n                    )\n\n                    # Sleep after page navigation\n                    await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n                    utils.logger.info(f\"[TieBaCrawler.search] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds after page {page}\")\n\n                    page += 1\n                except Exception as ex:\n                    utils.logger.error(\n                        f\"[BaiduTieBaCrawler.search] Search keywords error, current page: {page}, current keyword: {keyword}, err: {ex}\"\n                    )\n                    break\n\n    async def get_specified_tieba_notes(self):\n        \"\"\"\n        Get the information and comments of the specified post by tieba name\n        Returns:\n\n        \"\"\"\n        tieba_limit_count = 50\n        if config.CRAWLER_MAX_NOTES_COUNT < tieba_limit_count:\n            config.CRAWLER_MAX_NOTES_COUNT = tieba_limit_count\n        for tieba_name in config.TIEBA_NAME_LIST:\n            utils.logger.info(\n                f\"[BaiduTieBaCrawler.get_specified_tieba_notes] Begin get tieba name: {tieba_name}\"\n            )\n            page_number = 0\n            while page_number <= config.CRAWLER_MAX_NOTES_COUNT:\n                note_list: List[TiebaNote] = (\n                    await self.tieba_client.get_notes_by_tieba_name(\n                        tieba_name=tieba_name, page_num=page_number\n                    )\n                )\n                if not note_list:\n                    utils.logger.info(\n                        f\"[BaiduTieBaCrawler.get_specified_tieba_notes] Get note list is empty\"\n                    )\n                    break\n\n                utils.logger.info(\n                    f\"[BaiduTieBaCrawler.get_specified_tieba_notes] tieba name: {tieba_name} note list len: {len(note_list)}\"\n                )\n                await self.get_specified_notes([note.note_id for note in note_list])\n\n                # Sleep after processing notes\n                await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n                utils.logger.info(f\"[TieBaCrawler.get_specified_tieba_notes] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds after processing notes from page {page_number}\")\n\n                page_number += tieba_limit_count\n\n    async def get_specified_notes(\n        self, note_id_list: List[str] = config.TIEBA_SPECIFIED_ID_LIST\n    ):\n        \"\"\"\n        Get the information and comments of the specified post\n        Args:\n            note_id_list:\n\n        Returns:\n\n        \"\"\"\n        semaphore = asyncio.Semaphore(config.MAX_CONCURRENCY_NUM)\n        task_list = [\n            self.get_note_detail_async_task(note_id=note_id, semaphore=semaphore)\n            for note_id in note_id_list\n        ]\n        note_details = await asyncio.gather(*task_list)\n        note_details_model: List[TiebaNote] = []\n        for note_detail in note_details:\n            if note_detail is not None:\n                note_details_model.append(note_detail)\n                await tieba_store.update_tieba_note(note_detail)\n        await self.batch_get_note_comments(note_details_model)\n\n    async def get_note_detail_async_task(\n        self, note_id: str, semaphore: asyncio.Semaphore\n    ) -> Optional[TiebaNote]:\n        \"\"\"\n        Get note detail\n        Args:\n            note_id: baidu tieba note id\n            semaphore: asyncio semaphore\n\n        Returns:\n\n        \"\"\"\n        async with semaphore:\n            try:\n                utils.logger.info(\n                    f\"[BaiduTieBaCrawler.get_note_detail] Begin get note detail, note_id: {note_id}\"\n                )\n                note_detail: TiebaNote = await self.tieba_client.get_note_by_id(note_id)\n\n                # Sleep after fetching note details\n                await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n                utils.logger.info(f\"[TieBaCrawler.get_note_detail_async_task] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds after fetching note details {note_id}\")\n\n                if not note_detail:\n                    utils.logger.error(\n                        f\"[BaiduTieBaCrawler.get_note_detail] Get note detail error, note_id: {note_id}\"\n                    )\n                    return None\n                return note_detail\n            except Exception as ex:\n                utils.logger.error(\n                    f\"[BaiduTieBaCrawler.get_note_detail] Get note detail error: {ex}\"\n                )\n                return None\n            except KeyError as ex:\n                utils.logger.error(\n                    f\"[BaiduTieBaCrawler.get_note_detail] have not fund note detail note_id:{note_id}, err: {ex}\"\n                )\n                return None\n\n    async def batch_get_note_comments(self, note_detail_list: List[TiebaNote]):\n        \"\"\"\n        Batch get note comments\n        Args:\n            note_detail_list:\n\n        Returns:\n\n        \"\"\"\n        if not config.ENABLE_GET_COMMENTS:\n            return\n\n        semaphore = asyncio.Semaphore(config.MAX_CONCURRENCY_NUM)\n        task_list: List[Task] = []\n        for note_detail in note_detail_list:\n            task = asyncio.create_task(\n                self.get_comments_async_task(note_detail, semaphore),\n                name=note_detail.note_id,\n            )\n            task_list.append(task)\n        await asyncio.gather(*task_list)\n\n    async def get_comments_async_task(\n        self, note_detail: TiebaNote, semaphore: asyncio.Semaphore\n    ):\n        \"\"\"\n        Get comments async task\n        Args:\n            note_detail:\n            semaphore:\n\n        Returns:\n\n        \"\"\"\n        async with semaphore:\n            utils.logger.info(\n                f\"[BaiduTieBaCrawler.get_comments] Begin get note id comments {note_detail.note_id}\"\n            )\n\n            # Sleep before fetching comments\n            await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n            utils.logger.info(f\"[TieBaCrawler.get_comments_async_task] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds before fetching comments for note {note_detail.note_id}\")\n\n            await self.tieba_client.get_note_all_comments(\n                note_detail=note_detail,\n                crawl_interval=config.CRAWLER_MAX_SLEEP_SEC,\n                callback=tieba_store.batch_update_tieba_note_comments,\n                max_count=config.CRAWLER_MAX_COMMENTS_COUNT_SINGLENOTES,\n            )\n\n    async def get_creators_and_notes(self) -> None:\n        \"\"\"\n        Get creator's information and their notes and comments\n        Returns:\n\n        \"\"\"\n        utils.logger.info(\n            \"[WeiboCrawler.get_creators_and_notes] Begin get weibo creators\"\n        )\n        for creator_url in config.TIEBA_CREATOR_URL_LIST:\n            creator_page_html_content = await self.tieba_client.get_creator_info_by_url(\n                creator_url=creator_url\n            )\n            creator_info: TiebaCreator = self._page_extractor.extract_creator_info(\n                creator_page_html_content\n            )\n            if creator_info:\n                utils.logger.info(\n                    f\"[WeiboCrawler.get_creators_and_notes] creator info: {creator_info}\"\n                )\n                if not creator_info:\n                    raise Exception(\"Get creator info error\")\n\n                await tieba_store.save_creator(user_info=creator_info)\n\n                # Get all note information of the creator\n                all_notes_list = (\n                    await self.tieba_client.get_all_notes_by_creator_user_name(\n                        user_name=creator_info.user_name,\n                        crawl_interval=0,\n                        callback=tieba_store.batch_update_tieba_notes,\n                        max_note_count=config.CRAWLER_MAX_NOTES_COUNT,\n                        creator_page_html_content=creator_page_html_content,\n                    )\n                )\n\n                await self.batch_get_note_comments(all_notes_list)\n\n            else:\n                utils.logger.error(\n                    f\"[WeiboCrawler.get_creators_and_notes] get creator info error, creator_url:{creator_url}\"\n                )\n\n    async def _navigate_to_tieba_via_baidu(self):\n        \"\"\"\n        Simulate real user access path:\n        1. First visit Baidu homepage (https://www.baidu.com/)\n        2. Wait for page to load\n        3. Click \"Tieba\" link in top navigation bar\n        4. Jump to Tieba homepage\n\n        This avoids triggering Baidu's security verification\n        \"\"\"\n        utils.logger.info(\"[TieBaCrawler] Simulating real user access path...\")\n\n        try:\n            # Step 1: Visit Baidu homepage\n            utils.logger.info(\"[TieBaCrawler] Step 1: Visiting Baidu homepage https://www.baidu.com/\")\n            await self.context_page.goto(\"https://www.baidu.com/\", wait_until=\"domcontentloaded\")\n\n            # Step 2: Wait for page loading, using delay setting from config file\n            utils.logger.info(f\"[TieBaCrawler] Step 2: Waiting {config.CRAWLER_MAX_SLEEP_SEC} seconds to simulate user browsing...\")\n            await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n\n            # Step 3: Find and click \"Tieba\" link\n            utils.logger.info(\"[TieBaCrawler] Step 3: Finding and clicking 'Tieba' link...\")\n\n            # Try multiple selectors to ensure finding the Tieba link\n            tieba_selectors = [\n                'a[href=\"http://tieba.baidu.com/\"]',\n                'a[href=\"https://tieba.baidu.com/\"]',\n                'a.mnav:has-text(\"贴吧\")',\n                'text=贴吧',\n            ]\n\n            tieba_link = None\n            for selector in tieba_selectors:\n                try:\n                    tieba_link = await self.context_page.wait_for_selector(selector, timeout=5000)\n                    if tieba_link:\n                        utils.logger.info(f\"[TieBaCrawler] Found Tieba link (selector: {selector})\")\n                        break\n                except Exception:\n                    continue\n\n            if not tieba_link:\n                utils.logger.warning(\"[TieBaCrawler] Tieba link not found, directly accessing Tieba homepage\")\n                await self.context_page.goto(self.index_url, wait_until=\"domcontentloaded\")\n                return\n\n            # Step 4: Click Tieba link (check if it will open in a new tab)\n            utils.logger.info(\"[TieBaCrawler] Step 4: Clicking Tieba link...\")\n\n            # Check link's target attribute\n            target_attr = await tieba_link.get_attribute(\"target\")\n            utils.logger.info(f\"[TieBaCrawler] Link target attribute: {target_attr}\")\n\n            if target_attr == \"_blank\":\n                # If it's a new tab, need to wait for new page and switch\n                utils.logger.info(\"[TieBaCrawler] Link will open in new tab, waiting for new page...\")\n\n                async with self.browser_context.expect_page() as new_page_info:\n                    await tieba_link.click()\n\n                # Get newly opened page\n                new_page = await new_page_info.value\n                await new_page.wait_for_load_state(\"domcontentloaded\")\n\n                # Close old Baidu homepage\n                await self.context_page.close()\n\n                # Switch to new Tieba page\n                self.context_page = new_page\n                utils.logger.info(\"[TieBaCrawler] Successfully switched to new tab (Tieba page)\")\n            else:\n                # If it's same tab navigation, wait for navigation normally\n                utils.logger.info(\"[TieBaCrawler] Link navigates in current tab...\")\n                async with self.context_page.expect_navigation(wait_until=\"domcontentloaded\"):\n                    await tieba_link.click()\n\n            # Step 5: Wait for page to stabilize, using delay setting from config file\n            utils.logger.info(f\"[TieBaCrawler] Step 5: Page loaded, waiting {config.CRAWLER_MAX_SLEEP_SEC} seconds...\")\n            await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n\n            current_url = self.context_page.url\n            utils.logger.info(f\"[TieBaCrawler] Successfully entered Tieba via Baidu homepage! Current URL: {current_url}\")\n\n        except Exception as e:\n            utils.logger.error(f\"[TieBaCrawler] Failed to access Tieba via Baidu homepage: {e}\")\n            utils.logger.info(\"[TieBaCrawler] Fallback: directly accessing Tieba homepage\")\n            await self.context_page.goto(self.index_url, wait_until=\"domcontentloaded\")\n\n    async def _inject_anti_detection_scripts(self):\n        \"\"\"\n        Inject anti-detection JavaScript scripts\n        For Baidu Tieba's special detection mechanism\n        \"\"\"\n        utils.logger.info(\"[TieBaCrawler] Injecting anti-detection scripts...\")\n\n        # Lightweight anti-detection script, only covering key detection points\n        anti_detection_js = \"\"\"\n        // Override navigator.webdriver\n        Object.defineProperty(navigator, 'webdriver', {\n            get: () => undefined,\n            configurable: true\n        });\n\n        // Override window.navigator.chrome\n        if (!window.navigator.chrome) {\n            window.navigator.chrome = {\n                runtime: {},\n                loadTimes: function() {},\n                csi: function() {},\n                app: {}\n            };\n        }\n\n        // Override Permissions API\n        const originalQuery = window.navigator.permissions.query;\n        window.navigator.permissions.query = (parameters) => (\n            parameters.name === 'notifications' ?\n                Promise.resolve({ state: Notification.permission }) :\n                originalQuery(parameters)\n        );\n\n        // Override plugins length (make it look like there are plugins)\n        Object.defineProperty(navigator, 'plugins', {\n            get: () => [1, 2, 3, 4, 5],\n            configurable: true\n        });\n\n        // Override languages\n        Object.defineProperty(navigator, 'languages', {\n            get: () => ['zh-CN', 'zh', 'en'],\n            configurable: true\n        });\n\n        // Remove window.cdc_ and other ChromeDriver remnants\n        delete window.cdc_adoQpoasnfa76pfcZLmcfl_Array;\n        delete window.cdc_adoQpoasnfa76pfcZLmcfl_Promise;\n        delete window.cdc_adoQpoasnfa76pfcZLmcfl_Symbol;\n\n        console.log('[Anti-Detection] Scripts injected successfully');\n        \"\"\"\n\n        await self.browser_context.add_init_script(anti_detection_js)\n        utils.logger.info(\"[TieBaCrawler] Anti-detection scripts injected\")\n\n    async def create_tieba_client(\n        self, httpx_proxy: Optional[str], ip_pool: Optional[ProxyIpPool] = None\n    ) -> BaiduTieBaClient:\n        \"\"\"\n        Create tieba client with real browser User-Agent and complete headers\n        Args:\n            httpx_proxy: HTTP proxy\n            ip_pool: IP proxy pool\n\n        Returns:\n            BaiduTieBaClient instance\n        \"\"\"\n        utils.logger.info(\"[TieBaCrawler.create_tieba_client] Begin create tieba API client...\")\n\n        # Extract User-Agent from real browser to avoid detection\n        user_agent = await self.context_page.evaluate(\"() => navigator.userAgent\")\n        utils.logger.info(f\"[TieBaCrawler.create_tieba_client] Extracted User-Agent from browser: {user_agent}\")\n\n        cookie_str, cookie_dict = utils.convert_cookies(await self.browser_context.cookies())\n\n        # Build complete browser request headers, simulating real browser behavior\n        tieba_client = BaiduTieBaClient(\n            timeout=10,\n            ip_pool=ip_pool,\n            default_ip_proxy=httpx_proxy,\n            headers={\n                \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\",\n                \"Accept-Language\": \"zh-CN,zh;q=0.9\",\n                \"Accept-Encoding\": \"gzip, deflate, br\",\n                \"Connection\": \"keep-alive\",\n                \"User-Agent\": user_agent,  # Use real browser UA\n                \"Cookie\": cookie_str,\n                \"Host\": \"tieba.baidu.com\",\n                \"Referer\": \"https://tieba.baidu.com/\",\n                \"Sec-Fetch-Dest\": \"document\",\n                \"Sec-Fetch-Mode\": \"navigate\",\n                \"Sec-Fetch-Site\": \"same-origin\",\n                \"Sec-Fetch-User\": \"?1\",\n                \"Upgrade-Insecure-Requests\": \"1\",\n                \"sec-ch-ua\": '\"Google Chrome\";v=\"141\", \"Not?A_Brand\";v=\"8\", \"Chromium\";v=\"141\"',\n                \"sec-ch-ua-mobile\": \"?0\",\n                \"sec-ch-ua-platform\": '\"macOS\"',\n            },\n            playwright_page=self.context_page,  # Pass in playwright page object\n        )\n        return tieba_client\n\n    async def launch_browser(\n        self,\n        chromium: BrowserType,\n        playwright_proxy: Optional[Dict],\n        user_agent: Optional[str],\n        headless: bool = True,\n    ) -> BrowserContext:\n        \"\"\"\n        Launch browser and create browser\n        Args:\n            chromium:\n            playwright_proxy:\n            user_agent:\n            headless:\n\n        Returns:\n\n        \"\"\"\n        utils.logger.info(\n            \"[BaiduTieBaCrawler.launch_browser] Begin create browser context ...\"\n        )\n        if config.SAVE_LOGIN_STATE:\n            # feat issue #14\n            # we will save login state to avoid login every time\n            user_data_dir = os.path.join(\n                os.getcwd(), \"browser_data\", config.USER_DATA_DIR % config.PLATFORM\n            )  # type: ignore\n            browser_context = await chromium.launch_persistent_context(\n                user_data_dir=user_data_dir,\n                accept_downloads=True,\n                headless=headless,\n                proxy=playwright_proxy,  # type: ignore\n                viewport={\"width\": 1920, \"height\": 1080},\n                user_agent=user_agent,\n                channel=\"chrome\",  # Use system's stable Chrome version\n            )\n            return browser_context\n        else:\n            browser = await chromium.launch(headless=headless, proxy=playwright_proxy, channel=\"chrome\")  # type: ignore\n            browser_context = await browser.new_context(\n                viewport={\"width\": 1920, \"height\": 1080}, user_agent=user_agent\n            )\n            return browser_context\n\n    async def launch_browser_with_cdp(\n        self,\n        playwright: Playwright,\n        playwright_proxy: Optional[Dict],\n        user_agent: Optional[str],\n        headless: bool = True,\n    ) -> BrowserContext:\n        \"\"\"\n        Launch browser using CDP mode\n        \"\"\"\n        try:\n            self.cdp_manager = CDPBrowserManager()\n            browser_context = await self.cdp_manager.launch_and_connect(\n                playwright=playwright,\n                playwright_proxy=playwright_proxy,\n                user_agent=user_agent,\n                headless=headless,\n            )\n\n            # Display browser information\n            browser_info = await self.cdp_manager.get_browser_info()\n            utils.logger.info(f\"[TieBaCrawler] CDP browser info: {browser_info}\")\n\n            return browser_context\n\n        except Exception as e:\n            utils.logger.error(f\"[TieBaCrawler] CDP mode launch failed, falling back to standard mode: {e}\")\n            # Fall back to standard mode\n            chromium = playwright.chromium\n            return await self.launch_browser(\n                chromium, playwright_proxy, user_agent, headless\n            )\n\n    async def close(self):\n        \"\"\"\n        Close browser context\n        Returns:\n\n        \"\"\"\n        # If using CDP mode, need special handling\n        if self.cdp_manager:\n            await self.cdp_manager.cleanup()\n            self.cdp_manager = None\n        else:\n            await self.browser_context.close()\n        utils.logger.info(\"[BaiduTieBaCrawler.close] Browser context closed ...\")\n"
  },
  {
    "path": "media_platform/tieba/field.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/tieba/field.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nfrom enum import Enum\n\n\nclass SearchSortType(Enum):\n    \"\"\"search sort type\"\"\"\n    # Sort by time in descending order\n    TIME_DESC = \"1\"\n    # Sort by time in ascending order\n    TIME_ASC = \"0\"\n    # Sort by relevance\n    RELEVANCE_ORDER = \"2\"\n\n\nclass SearchNoteType(Enum):\n    # Only view main posts\n    MAIN_THREAD = \"1\"\n    # Mixed mode (posts + replies)\n    FIXED_THREAD = \"0\"\n"
  },
  {
    "path": "media_platform/tieba/help.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/tieba/help.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\nimport html\nimport json\nimport re\nfrom typing import Dict, List, Tuple\nfrom urllib.parse import parse_qs, unquote\n\nfrom parsel import Selector\n\nfrom constant import baidu_tieba as const\nfrom model.m_baidu_tieba import TiebaComment, TiebaCreator, TiebaNote\nfrom tools import utils\n\nGENDER_MALE = \"sex_male\"\nGENDER_FEMALE = \"sex_female\"\n\n\nclass TieBaExtractor:\n    def __init__(self):\n        pass\n\n    @staticmethod\n    def extract_search_note_list(page_content: str) -> List[TiebaNote]:\n        \"\"\"\n        Extract Tieba post list from keyword search result pages, still missing reply count and reply page data\n        Args:\n            page_content: HTML string of page content\n\n        Returns:\n            List of Tieba post objects\n        \"\"\"\n        xpath_selector = \"//div[@class='s_post']\"\n        post_list = Selector(text=page_content).xpath(xpath_selector)\n        result: List[TiebaNote] = []\n        for post in post_list:\n            tieba_note = TiebaNote(note_id=post.xpath(\".//span[@class='p_title']/a/@data-tid\").get(default='').strip(),\n                                   title=post.xpath(\".//span[@class='p_title']/a/text()\").get(default='').strip(),\n                                   desc=post.xpath(\".//div[@class='p_content']/text()\").get(default='').strip(),\n                                   note_url=const.TIEBA_URL + post.xpath(\".//span[@class='p_title']/a/@href\").get(\n                                       default=''),\n                                   user_nickname=post.xpath(\".//a[starts-with(@href, '/home/main')]/font/text()\").get(\n                                       default='').strip(), user_link=const.TIEBA_URL + post.xpath(\n                    \".//a[starts-with(@href, '/home/main')]/@href\").get(default=''),\n                                   tieba_name=post.xpath(\".//a[@class='p_forum']/font/text()\").get(default='').strip(),\n                                   tieba_link=const.TIEBA_URL + post.xpath(\".//a[@class='p_forum']/@href\").get(\n                                       default=''),\n                                   publish_time=post.xpath(\".//font[@class='p_green p_date']/text()\").get(\n                                       default='').strip(), )\n            result.append(tieba_note)\n        return result\n\n    def extract_tieba_note_list(self, page_content: str) -> List[TiebaNote]:\n        \"\"\"\n        Extract Tieba post list from Tieba page\n        Args:\n            page_content: HTML string of page content\n\n        Returns:\n            List of Tieba post objects\n        \"\"\"\n        page_content = page_content.replace('<!--', \"\")\n        content_selector = Selector(text=page_content)\n        xpath_selector = \"//ul[@id='thread_list']/li\"\n        post_list = content_selector.xpath(xpath_selector)\n        result: List[TiebaNote] = []\n        for post_selector in post_list:\n            post_field_value: Dict = self.extract_data_field_value(post_selector)\n            if not post_field_value:\n                continue\n            note_id = str(post_field_value.get(\"id\"))\n            tieba_note = TiebaNote(note_id=note_id,\n                                   title=post_selector.xpath(\".//a[@class='j_th_tit ']/text()\").get(default='').strip(),\n                                   desc=post_selector.xpath(\n                                       \".//div[@class='threadlist_abs threadlist_abs_onlyline ']/text()\").get(\n                                       default='').strip(), note_url=const.TIEBA_URL + f\"/p/{note_id}\",\n                                   user_link=const.TIEBA_URL + post_selector.xpath(\n                                       \".//a[@class='frs-author-name j_user_card ']/@href\").get(default='').strip(),\n                                   user_nickname=post_field_value.get(\"authoer_nickname\") or post_field_value.get(\n                                       \"author_name\"),\n                                   tieba_name=content_selector.xpath(\"//a[@class='card_title_fname']/text()\").get(\n                                       default='').strip(), tieba_link=const.TIEBA_URL + content_selector.xpath(\n                    \"//a[@class='card_title_fname']/@href\").get(default=''),\n                                   total_replay_num=post_field_value.get(\"reply_num\", 0))\n            result.append(tieba_note)\n        return result\n\n    def extract_note_detail(self, page_content: str) -> TiebaNote:\n        \"\"\"\n        Extract Tieba post details from post detail page\n        Args:\n            page_content: HTML string of page content\n\n        Returns:\n            Tieba post detail object\n        \"\"\"\n        content_selector = Selector(text=page_content)\n        first_floor_selector = content_selector.xpath(\"//div[@class='p_postlist'][1]\")\n        only_view_author_link = content_selector.xpath(\"//*[@id='lzonly_cntn']/@href\").get(default='').strip()\n        note_id = only_view_author_link.split(\"?\")[0].split(\"/\")[-1]\n        # Post reply count and reply page count\n        thread_num_infos = content_selector.xpath(\n            \"//div[@id='thread_theme_5']//li[@class='l_reply_num']//span[@class='red']\")\n        # IP location and publish time\n        other_info_content = content_selector.xpath(\".//div[@class='post-tail-wrap']\").get(default=\"\").strip()\n        ip_location, publish_time = self.extract_ip_and_pub_time(other_info_content)\n        note = TiebaNote(note_id=note_id, title=content_selector.xpath(\"//title/text()\").get(default='').strip(),\n                         desc=content_selector.xpath(\"//meta[@name='description']/@content\").get(default='').strip(),\n                         note_url=const.TIEBA_URL + f\"/p/{note_id}\",\n                         user_link=const.TIEBA_URL + first_floor_selector.xpath(\n                             \".//a[@class='p_author_face ']/@href\").get(default='').strip(),\n                         user_nickname=first_floor_selector.xpath(\n                             \".//a[@class='p_author_name j_user_card']/text()\").get(default='').strip(),\n                         user_avatar=first_floor_selector.xpath(\".//a[@class='p_author_face ']/img/@src\").get(\n                             default='').strip(),\n                         tieba_name=content_selector.xpath(\"//a[@class='card_title_fname']/text()\").get(\n                             default='').strip(), tieba_link=const.TIEBA_URL + content_selector.xpath(\n                \"//a[@class='card_title_fname']/@href\").get(default=''), ip_location=ip_location,\n                         publish_time=publish_time,\n                         total_replay_num=thread_num_infos[0].xpath(\"./text()\").get(default='').strip(),\n                         total_replay_page=thread_num_infos[1].xpath(\"./text()\").get(default='').strip(), )\n        note.title = note.title.replace(f\"【{note.tieba_name}】_Baidu Tieba\", \"\")\n        return note\n\n    def extract_tieba_note_parment_comments(self, page_content: str, note_id: str) -> List[TiebaComment]:\n        \"\"\"\n        Extract Tieba post first-level comments from comment page\n        Args:\n            page_content: HTML string of page content\n            note_id: Post ID\n\n        Returns:\n            List of first-level comment objects\n        \"\"\"\n        xpath_selector = \"//div[@class='l_post l_post_bright j_l_post clearfix  ']\"\n        comment_list = Selector(text=page_content).xpath(xpath_selector)\n        result: List[TiebaComment] = []\n        for comment_selector in comment_list:\n            comment_field_value: Dict = self.extract_data_field_value(comment_selector)\n            if not comment_field_value:\n                continue\n            tieba_name = comment_selector.xpath(\"//a[@class='card_title_fname']/text()\").get(default='').strip()\n            other_info_content = comment_selector.xpath(\".//div[@class='post-tail-wrap']\").get(default=\"\").strip()\n            ip_location, publish_time = self.extract_ip_and_pub_time(other_info_content)\n            tieba_comment = TiebaComment(comment_id=str(comment_field_value.get(\"content\").get(\"post_id\")),\n                                         sub_comment_count=comment_field_value.get(\"content\").get(\"comment_num\"),\n                                         content=utils.extract_text_from_html(\n                                             comment_field_value.get(\"content\").get(\"content\")),\n                                         note_url=const.TIEBA_URL + f\"/p/{note_id}\",\n                                         user_link=const.TIEBA_URL + comment_selector.xpath(\n                                             \".//a[@class='p_author_face ']/@href\").get(default='').strip(),\n                                         user_nickname=comment_selector.xpath(\n                                             \".//a[@class='p_author_name j_user_card']/text()\").get(default='').strip(),\n                                         user_avatar=comment_selector.xpath(\n                                             \".//a[@class='p_author_face ']/img/@src\").get(default='').strip(),\n                                         tieba_id=str(comment_field_value.get(\"content\").get(\"forum_id\", \"\")),\n                                         tieba_name=tieba_name, tieba_link=f\"https://tieba.baidu.com/f?kw={tieba_name}\",\n                                         ip_location=ip_location, publish_time=publish_time, note_id=note_id, )\n            result.append(tieba_comment)\n        return result\n\n    def extract_tieba_note_sub_comments(self, page_content: str, parent_comment: TiebaComment) -> List[TiebaComment]:\n        \"\"\"\n        Extract Tieba post second-level comments from sub-comment page\n        Args:\n            page_content: HTML string of page content\n            parent_comment: Parent comment object\n\n        Returns:\n            List of second-level comment objects\n        \"\"\"\n        selector = Selector(page_content)\n        comments = []\n        comment_ele_list = selector.xpath(\"//li[@class='lzl_single_post j_lzl_s_p first_no_border']\")\n        comment_ele_list.extend(selector.xpath(\"//li[@class='lzl_single_post j_lzl_s_p ']\"))\n        for comment_ele in comment_ele_list:\n            comment_value = self.extract_data_field_value(comment_ele)\n            if not comment_value:\n                continue\n            comment_user_a_selector = comment_ele.xpath(\"./a[@class='j_user_card lzl_p_p']\")[0]\n            content = utils.extract_text_from_html(\n                comment_ele.xpath(\".//span[@class='lzl_content_main']\").get(default=\"\"))\n            comment = TiebaComment(\n                comment_id=str(comment_value.get(\"spid\")), content=content,\n                user_link=comment_user_a_selector.xpath(\"./@href\").get(default=\"\"),\n                user_nickname=comment_value.get(\"showname\"),\n                user_avatar=comment_user_a_selector.xpath(\"./img/@src\").get(default=\"\"),\n                publish_time=comment_ele.xpath(\".//span[@class='lzl_time']/text()\").get(default=\"\").strip(),\n                parent_comment_id=parent_comment.comment_id,\n                note_id=parent_comment.note_id, note_url=parent_comment.note_url,\n                tieba_id=parent_comment.tieba_id, tieba_name=parent_comment.tieba_name,\n                tieba_link=parent_comment.tieba_link)\n            comments.append(comment)\n\n        return comments\n\n    def extract_creator_info(self, html_content: str) -> TiebaCreator:\n        \"\"\"\n        Extract Tieba creator information from creator homepage\n        Args:\n            html_content: HTML string of creator homepage\n\n        Returns:\n            Tieba creator object\n        \"\"\"\n        selector = Selector(text=html_content)\n        user_link_selector = selector.xpath(\"//p[@class='space']/a\")\n        user_link: str = user_link_selector.xpath(\"./@href\").get(default='')\n        user_link_params: Dict = parse_qs(unquote(user_link.split(\"?\")[-1]))\n        user_name = user_link_params.get(\"un\")[0] if user_link_params.get(\"un\") else \"\"\n        user_id = user_link_params.get(\"id\")[0] if user_link_params.get(\"id\") else \"\"\n        userinfo_userdata_selector = selector.xpath(\"//div[@class='userinfo_userdata']\")\n        follow_fans_selector = selector.xpath(\"//span[@class='concern_num']\")\n        follows, fans = 0, 0\n        if len(follow_fans_selector) == 2:\n            follows, fans = self.extract_follow_and_fans(follow_fans_selector)\n        user_content = userinfo_userdata_selector.get(default='')\n        return TiebaCreator(user_id=user_id, user_name=user_name,\n                            nickname=selector.xpath(\".//span[@class='userinfo_username ']/text()\").get(\n                                default='').strip(),\n                            avatar=selector.xpath(\".//div[@class='userinfo_left_head']//img/@src\").get(\n                                default='').strip(),\n                            gender=self.extract_gender(user_content),\n                            ip_location=self.extract_ip(user_content),\n                            follows=follows,\n                            fans=fans,\n                            registration_duration=self.extract_registration_duration(user_content)\n                            )\n\n    @staticmethod\n    def extract_tieba_thread_id_list_from_creator_page(\n        html_content: str\n    ) -> List[str]:\n        \"\"\"\n        Extract post ID list from Tieba creator's homepage\n        Args:\n            html_content: HTML string of creator homepage\n\n        Returns:\n            List of post IDs\n        \"\"\"\n        selector = Selector(text=html_content)\n        thread_id_list = []\n        xpath_selector = (\n            \"//ul[@class='new_list clearfix']//div[@class='thread_name']/a[1]/@href\"\n        )\n        thread_url_list = selector.xpath(xpath_selector).getall()\n        for thread_url in thread_url_list:\n            thread_id = thread_url.split(\"?\")[0].split(\"/\")[-1]\n            thread_id_list.append(thread_id)\n        return thread_id_list\n\n    def extract_ip_and_pub_time(self, html_content: str) -> Tuple[str, str]:\n        \"\"\"\n        Extract IP location and publish time from HTML content\n        Args:\n            html_content: HTML string\n\n        Returns:\n            Tuple of (IP location, publish time)\n        \"\"\"\n        pattern_pub_time = re.compile(r'<span class=\"tail-info\">(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2})</span>')\n        time_match = pattern_pub_time.search(html_content)\n        pub_time = time_match.group(1) if time_match else \"\"\n        return self.extract_ip(html_content), pub_time\n\n    @staticmethod\n    def extract_ip(html_content: str) -> str:\n        \"\"\"\n        Extract IP location from HTML content\n        Args:\n            html_content: HTML string\n\n        Returns:\n            IP location string\n        \"\"\"\n        pattern_ip = re.compile(r'IP属地:(\\S+)</span>')\n        ip_match = pattern_ip.search(html_content)\n        ip = ip_match.group(1) if ip_match else \"\"\n        return ip\n\n    @staticmethod\n    def extract_gender(html_content: str) -> str:\n        \"\"\"\n        Extract gender from HTML content\n        Args:\n            html_content: HTML string\n\n        Returns:\n            Gender string ('Male', 'Female', or 'Unknown')\n        \"\"\"\n        if GENDER_MALE in html_content:\n            return 'Male'\n        elif GENDER_FEMALE in html_content:\n            return 'Female'\n        return 'Unknown'\n\n    @staticmethod\n    def extract_follow_and_fans(selectors: List[Selector]) -> Tuple[str, str]:\n        \"\"\"\n        Extract follow count and fan count from selectors\n        Args:\n            selectors: List of selector objects\n\n        Returns:\n            Tuple of (follow count, fan count)\n        \"\"\"\n        pattern = re.compile(r'<span class=\"concern_num\">\\(<a[^>]*>(\\d+)</a>\\)</span>')\n        follow_match = pattern.findall(selectors[0].get())\n        fans_match = pattern.findall(selectors[1].get())\n        follows = follow_match[0] if follow_match else 0\n        fans = fans_match[0] if fans_match else 0\n        return follows, fans\n\n    @staticmethod\n    def extract_registration_duration(html_content: str) -> str:\n        \"\"\"\n        Extract Tieba age from HTML content\n        Example: \"<span>吧龄:1.9年</span>\"\n        Returns: \"1.9年\"\n\n        Args:\n            html_content: HTML string\n\n        Returns:\n            Tieba age string\n        \"\"\"\n        pattern = re.compile(r'<span>吧龄:(\\S+)</span>')\n        match = pattern.search(html_content)\n        return match.group(1) if match else \"\"\n\n    @staticmethod\n    def extract_data_field_value(selector: Selector) -> Dict:\n        \"\"\"\n        Extract data-field value from selector\n        Args:\n            selector: Selector object\n\n        Returns:\n            Dictionary containing data-field value\n        \"\"\"\n        data_field_value = selector.xpath(\"./@data-field\").get(default='').strip()\n        if not data_field_value or data_field_value == \"{}\":\n            return {}\n        try:\n            # First use html.unescape to handle escape characters, then json.loads to convert JSON string to Python dictionary\n            unescaped_json_str = html.unescape(data_field_value)\n            data_field_dict_value = json.loads(unescaped_json_str)\n        except Exception as ex:\n            print(f\"extract_data_field_value, error: {ex}, trying alternative parsing method\")\n            data_field_dict_value = {}\n        return data_field_dict_value\n\n\ndef test_extract_search_note_list():\n    with open(\"test_data/search_keyword_notes.html\", \"r\", encoding=\"utf-8\") as f:\n        content = f.read()\n        extractor = TieBaExtractor()\n        result = extractor.extract_search_note_list(content)\n        print(result)\n\n\ndef test_extract_note_detail():\n    with open(\"test_data/note_detail.html\", \"r\", encoding=\"utf-8\") as f:\n        content = f.read()\n        extractor = TieBaExtractor()\n        result = extractor.extract_note_detail(content)\n        print(result.model_dump())\n\n\ndef test_extract_tieba_note_parment_comments():\n    with open(\"test_data/note_comments.html\", \"r\", encoding=\"utf-8\") as f:\n        content = f.read()\n        extractor = TieBaExtractor()\n        result = extractor.extract_tieba_note_parment_comments(content, \"123456\")\n        print(result)\n\n\ndef test_extract_tieba_note_sub_comments():\n    with open(\"test_data/note_sub_comments.html\", \"r\", encoding=\"utf-8\") as f:\n        content = f.read()\n        extractor = TieBaExtractor()\n        fake_parment_comment = TiebaComment(comment_id=\"123456\", content=\"content\", user_link=\"user_link\",\n                                            user_nickname=\"user_nickname\", user_avatar=\"user_avatar\",\n                                            publish_time=\"publish_time\", parent_comment_id=\"parent_comment_id\",\n                                            note_id=\"note_id\", note_url=\"note_url\", tieba_id=\"tieba_id\",\n                                            tieba_name=\"tieba_name\", )\n        result = extractor.extract_tieba_note_sub_comments(content, fake_parment_comment)\n        print(result)\n\n\ndef test_extract_tieba_note_list():\n    with open(\"test_data/tieba_note_list.html\", \"r\", encoding=\"utf-8\") as f:\n        content = f.read()\n        extractor = TieBaExtractor()\n        result = extractor.extract_tieba_note_list(content)\n        print(result)\n    pass\n\n\ndef test_extract_creator_info():\n    with open(\"test_data/creator_info.html\", \"r\", encoding=\"utf-8\") as f:\n        content = f.read()\n        extractor = TieBaExtractor()\n        result = extractor.extract_creator_info(content)\n        print(result.model_dump_json())\n\n\nif __name__ == '__main__':\n    # test_extract_search_note_list()\n    # test_extract_note_detail()\n    # test_extract_tieba_note_parment_comments()\n    # test_extract_tieba_note_list()\n    test_extract_creator_info()\n"
  },
  {
    "path": "media_platform/tieba/login.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/tieba/login.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nimport asyncio\nimport functools\nimport sys\nfrom typing import Optional\n\nfrom playwright.async_api import BrowserContext, Page\nfrom tenacity import (RetryError, retry, retry_if_result, stop_after_attempt,\n                      wait_fixed)\n\nimport config\nfrom base.base_crawler import AbstractLogin\nfrom tools import utils\n\n\nclass BaiduTieBaLogin(AbstractLogin):\n\n    def __init__(self,\n                 login_type: str,\n                 browser_context: BrowserContext,\n                 context_page: Page,\n                 login_phone: Optional[str] = \"\",\n                 cookie_str: str = \"\"\n                 ):\n        config.LOGIN_TYPE = login_type\n        self.browser_context = browser_context\n        self.context_page = context_page\n        self.login_phone = login_phone\n        self.cookie_str = cookie_str\n\n    @retry(stop=stop_after_attempt(600), wait=wait_fixed(1), retry=retry_if_result(lambda value: value is False))\n    async def check_login_state(self) -> bool:\n        \"\"\"\n        Poll to check if login status is successful, return True if successful, otherwise return False\n\n        Returns:\n\n        \"\"\"\n        current_cookie = await self.browser_context.cookies()\n        _, cookie_dict = utils.convert_cookies(current_cookie)\n        stoken = cookie_dict.get(\"STOKEN\")\n        ptoken = cookie_dict.get(\"PTOKEN\")\n        if stoken or ptoken:\n            return True\n        return False\n\n    async def begin(self):\n        \"\"\"Start login baidutieba\"\"\"\n        utils.logger.info(\"[BaiduTieBaLogin.begin] Begin login baidutieba ...\")\n        if config.LOGIN_TYPE == \"qrcode\":\n            await self.login_by_qrcode()\n        elif config.LOGIN_TYPE == \"phone\":\n            await self.login_by_mobile()\n        elif config.LOGIN_TYPE == \"cookie\":\n            await self.login_by_cookies()\n        else:\n            raise ValueError(\"[BaiduTieBaLogin.begin]Invalid Login Type Currently only supported qrcode or phone or cookies ...\")\n\n    async def login_by_mobile(self):\n        \"\"\"Login baidutieba by mobile\"\"\"\n        pass\n\n    async def login_by_qrcode(self):\n        \"\"\"login baidutieba website and keep webdriver login state\"\"\"\n        utils.logger.info(\"[BaiduTieBaLogin.login_by_qrcode] Begin login baidutieba by qrcode ...\")\n        qrcode_img_selector = \"xpath=//img[@class='tang-pass-qrcode-img']\"\n        # find login qrcode\n        base64_qrcode_img = await utils.find_login_qrcode(\n            self.context_page,\n            selector=qrcode_img_selector\n        )\n        if not base64_qrcode_img:\n            utils.logger.info(\"[BaiduTieBaLogin.login_by_qrcode] login failed , have not found qrcode please check ....\")\n            # if this website does not automatically popup login dialog box, we will manual click login button\n            await asyncio.sleep(0.5)\n            login_button_ele = self.context_page.locator(\"xpath=//li[@class='u_login']\")\n            await login_button_ele.click()\n            base64_qrcode_img = await utils.find_login_qrcode(\n                self.context_page,\n                selector=qrcode_img_selector\n            )\n            if not base64_qrcode_img:\n                utils.logger.info(\"[BaiduTieBaLogin.login_by_qrcode] login failed , have not found qrcode please check ....\")\n                sys.exit()\n\n        # show login qrcode\n        # fix issue #12\n        # we need to use partial function to call show_qrcode function and run in executor\n        # then current asyncio event loop will not be blocked\n        partial_show_qrcode = functools.partial(utils.show_qrcode, base64_qrcode_img)\n        asyncio.get_running_loop().run_in_executor(executor=None, func=partial_show_qrcode)\n\n        utils.logger.info(f\"[BaiduTieBaLogin.login_by_qrcode] waiting for scan code login, remaining time is 120s\")\n        try:\n            await self.check_login_state()\n        except RetryError:\n            utils.logger.info(\"[BaiduTieBaLogin.login_by_qrcode] Login baidutieba failed by qrcode login method ...\")\n            sys.exit()\n\n        wait_redirect_seconds = 5\n        utils.logger.info(f\"[BaiduTieBaLogin.login_by_qrcode] Login successful then wait for {wait_redirect_seconds} seconds redirect ...\")\n        await asyncio.sleep(wait_redirect_seconds)\n\n    async def login_by_cookies(self):\n        \"\"\"login baidutieba website by cookies\"\"\"\n        utils.logger.info(\"[BaiduTieBaLogin.login_by_cookies] Begin login baidutieba by cookie ...\")\n        for key, value in utils.convert_str_cookie_to_dict(self.cookie_str).items():\n            await self.browser_context.add_cookies([{\n                'name': key,\n                'value': value,\n                'domain': \".baidu.com\",\n                'path': \"/\"\n            }])\n"
  },
  {
    "path": "media_platform/tieba/test_data/note_comments.html",
    "content": "<html><head><script type=\"text/javascript\" async=\"\" src=\"https://pos.baidu.com/auto_dup?di=0&amp;uuid=3d1a88cacb4a77f3&amp;dri=0&amp;dis=0&amp;dai=0&amp;ps=0x0&amp;enu=encoding&amp;exps=110011&amp;ant=0&amp;psi=86cdde84520ce968&amp;dcb=___baidu_union_callback&amp;dtm=AUTO_JSONP&amp;dvi=0.0&amp;dci=-1&amp;dpt=none&amp;tpr=1722965480067&amp;ti=%E3%80%90%E5%BC%BA%E7%83%88%E6%81%AD%E5%96%9C%E3%80%91%E5%85%A8%E7%BA%A2%E5%A9%B5%E9%99%88%E5%AE%87%E6%B1%90%E5%8C%85%E6%8F%BD%E8%B7%B3%E6%B0%B4%E5%A5%B3%E5%AD%9010%E7%B1%B3%E5%8F%B0%E5%B7%B4%E9%BB%8E%E5%A5%A5%E8%BF%90%E9%87%91%E9%93%B6%E7%89%8C%EF%BC%81%E3%80%90%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91%E5%90%A7%E3%80%91_%E7%99%BE%E5%BA%A6%E8%B4%B4%E5%90%A7&amp;ari=2&amp;ver=0722&amp;kws=%E7%99%BE%E5%BA%A6%E8%B4%B4%E5%90%A7%2C%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91%2C10%2C%E7%83%88%E6%81%AD%2C%E5%85%A8%E7%BA%A2&amp;dps=%E3%80%90%E5%BC%BA%E7%83%88%E6%81%AD%E5%96%9C%E3%80%91%E5%85%A8%E7%BA%A2%E5%A9%B5%E9%99%88..%E4%B8%AD%E5%9B%BD%E9%98%9F%E7%AC%AC22%E9%87%91%EF%BC%81%E6%97%A0%E6%82%AC%E5%BF%B5%EF%BC%81%E5%85%A8%E5%90%8E%E5%8D%AB%E5%86%95%E6%88%90%E5%8A%9F%EF%BC%8C%E8%BF%98%E6%98%AF%E5%8A%A8%E4%BD%9C%E8%B4%A8%E9%87%8F%E9%AB%98%EF%BC%8C%E5%B0%8F%E7%82%B8%E4%B9%9F%E8%B5%A2%E4%BA%86&amp;dbv=2&amp;drs=3&amp;pcs=2545x1230&amp;pss=2545x13277&amp;cfv=0&amp;cpl=5&amp;chi=1&amp;cce=true&amp;cec=UTF-8&amp;tlm=1722965480&amp;prot=2&amp;rw=1230&amp;ltu=https%3A%2F%2Ftieba.baidu.com%2Fp%2F9119688421&amp;ltr=https%3A%2F%2Ftieba.baidu.com%2Fhottopic%2Fbrowse%2Fhottopic%3Ftopic_id%3D27785074%26topic_name%3D%25E5%2585%25A8%25E7%25BA%25A2%25E5%25A9%25B5%25E9%2599%2588%25E8%258A%258B%25E6%25B1%2590%25E5%258C%2585%25E6%258F%25BD10%25E7%25B1%25B3%25E5%258F%25B0%25E9%2587%2591%25E9%2593%25B6&amp;ecd=1&amp;dft=0&amp;uc=2560x1351&amp;pis=-1x-1&amp;sr=2560x1440&amp;tcn=1722965480&amp;dc=4&amp;aa=1\"></script><script src=\"https://dlswbr.baidu.com/heicha/mw/abclite-2027-s.js\"></script><meta name=\"keywords\" content=\"百度贴吧,网球风云,10,烈恭,全红\"><meta name=\"description\" content=\"【强烈恭喜】全红婵陈..中国队第22金！无悬念！全后卫冕成功，还是动作质量高，小炸也赢了\"><meta charset=\"UTF-8\"><meta furl=\"tieba.baidu.com/f?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8\" fname=\"网球风云\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=10,chrome=1\"><meta name=\"baidu-site-verification\" content=\"jpBCrwX689\"><meta name=\"baidu-site-verification\" content=\"code-ku2CCMz5nv\"><link rel=\"search\" type=\"application/opensearchdescription+xml\" href=\"/tb/cms/content-search.xml\" title=\"百度贴吧\"><title>【强烈恭喜】全红婵陈宇汐包揽跳水女子10米台巴黎奥运金银牌！【网球风云吧】_百度贴吧</title><!--[if lt IE 9]><script>(function(){    var tags = ['header','footer','figure','figcaption','details','summary','hgroup','nav','aside','article','section','mark','abbr','meter','output','progress','time','video','audio','canvas','dialog'];    for(var i=tags.length - 1;i>-1;i--){ document.createElement(tags[i]);}})();</script><![endif]--><link rel=\"shortcut icon\" href=\"//tb3.bdstatic.com/public/icon/favicon-v2.ico\">    <script src=\"https://hm.baidu.com/hm.js?292b2e1608b0823c1cb6beef7243ef34\"></script><script type=\"text/javascript\" id=\"weirwood-init-script\">            !function(){\"use strict\";function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function a(t,e){var n=Object.keys(t);return Object.getOwnPropertySymbols&&n.push.apply(n,Object.getOwnPropertySymbols(t)),e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n}var e=new(function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,e),this.frame=0,this.fpsStandard=30,this.durationCount=2,this.trackData={},this.stateChangeHandler=this.stateChange.bind(this)}return function(e,t,n){t&&i(e.prototype,t),n&&i(e,n)}(e,[{key:\"start\",value:function(e,t,n){+e.fpsStandard&&(this.fpsStandard=+e.fpsStandard),+e.durationCount&&(this.durationCount=+e.durationCount),this.trackData=t||{},this.callback=n,this.init(),document.addEventListener(\"visibilitychange\",this.stateChangeHandler)}},{key:\"stop\",value:function(){this.disconnect(),document.removeEventListener(\"visibilitychange\",this.stateChangeHandler)}},{key:\"init\",value:function(){var o=this;this.frame=0,this.frameLoop(),this.lastTime=Date.now(),this.fpsList=[],this.fpsInterval=setInterval(function(){var e=Date.now(),t=e-o.lastTime,n=1e3*o.frame/t;if(o.lastTime=e,o.frame=0,o.fpsList.push(n),o.fpsList.length>o.durationCount&&o.fpsList.shift(),Math.round(t/1e3)>o.durationCount||o.fpsList.every(function(e){return e<o.fpsStandard})){var i=function(r){for(var e=1;e<arguments.length;e++){var o=null!=arguments[e]?arguments[e]:{};e%2?a(o,!0).forEach(function(e){var t,n,i;t=r,i=o[n=e],n in t?Object.defineProperty(t,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[n]=i}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(o)):a(o).forEach(function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(o,e))})}return r}({fps:o.fpsList},o.trackData),r=new Error(JSON.stringify(i));r.name=\"fpsError\";try{__tieba__weirwood__.reportException(r)}catch(e){throw r}o.callback&&o.callback()}},1e3)}},{key:\"frameLoop\",value:function(){this.frame++,this.frsRequestFrame=window.requestAnimationFrame(this.frameLoop.bind(this))}},{key:\"stateChange\",value:function(){\"hidden\"===document.visibilityState?this.disconnect():this.init()}},{key:\"disconnect\",value:function(){this.fpsInterval&&clearInterval(Number(this.fpsInterval)),this.frsRequestFrame&&cancelAnimationFrame(Number(this.frsRequestFrame))}}]),e}());!function(){try{window.__tieba__weirwood__={jsExceptions:[],resourceExceptions:[],apiExceptions:[],customExceptions:[],weirwoodResourceListener:null,jsListener:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];__tieba__weirwood__.jsExceptions.push(t)},resourceListener:function(e){-1!==[\"SCRIPT\",\"LINK\",\"IMG\",\"OBJECT\",\"IFRAME\",\"FRAME\"].indexOf(e.target.tagName)&&__tieba__weirwood__.resourceExceptions.push(e)},apiListener:function(e){__tieba__weirwood__.apiExceptions.push(e)},windowAddEventListener:window.addEventListener,reportException:function(e){__tieba__weirwood__.customExceptions.push(e)},fpsObserver:e};var a=/\\\"SCRIPT\\\",\\\"LINK\\\",\\\"IMG\\\"/;__tieba__weirwood__.windowAddEventListener&&(window.addEventListener=function(e,t){var n;\"error\"===e&&a.test(t.toString())&&(__tieba__weirwood__.weirwoodResourceListener=t);for(var i=arguments.length,r=new Array(2<i?i-2:0),o=2;o<i;o++)r[o-2]=arguments[o];return(n=__tieba__weirwood__.windowAddEventListener).call.apply(n,[window,e,t].concat(r))},window.onerror=__tieba__weirwood__.jsListener,window.addEventListener(\"error\",__tieba__weirwood__.resourceListener,!0),window.addEventListener(\"unhandledrejection\",__tieba__weirwood__.apiListener))}catch(e){}}()}();        </script>    <link rel=\"canonical\" href=\"//tieba.baidu.com/p/9119688421\"><script type=\"text/javascript\" defer=\"\" src=\"https://hectorstatic.baidu.com/1371300bc53d20f8.js\"></script>\n<link rel=\"stylesheet\" href=\"//tb1.bdstatic.com/??tb/static-common/style/tb_ui_fb24b59.css,tb/static-common/style/tb_common_89ff863.css\">\n<link rel=\"stylesheet\" href=\"//tb1.bdstatic.com/??/tb/_/card_a71b18a.css,/tb/_/js_pager_5be1e39.css,/tb/_/login_dialog_576d425.css,/tb/_/user_head_35f26e0.css,/tb/_/icons_2fd4588.css,/tb/_/wallet_dialog_1dc8782.css,/tb/_/flash_lcs_d41d8cd.css,/tb/_/new_message_system_53904e7.css,/tb/_/base_user_data_21c823c.css,/tb/_/cashier_dialog_ef027d2.css,/tb/_/creative_bar_560213f.css,/tb/_/qianbao_cashier_dialog_4c73f91.css,/tb/_/base_dialog_user_bar_d089a50.css,/tb/_/qianbao_purchase_member_452e113.css,/tb/_/pay_member_d41d8cd.css,/tb/_/http_transform_d41d8cd.css,/tb/_/official_bar_b4be455.css,/tb/_/userbar_bf3b266.css,/tb/_/poptip_f0fdc70.css,/tb/_/conf_skin_e7f8d17.css,/tb/_/platform_skin_a109270.css,/tb/_/pageskin_32b2c20.css,/tb/_/suggestion_41d3e9a.css,/tb/_/search_bright_e9471f1.css,/tb/_/snowflow_45a89bb.css,/tb/_/bright_6be6ada.css,/tb/_/attention_category_game_1e9cfe3.css,/tb/_/slide_show_aad29db.css,/tb/_/stock_banner_cceddb9.css,/tb/_/vip_dialog_44319b9.css\">\n<link rel=\"stylesheet\" href=\"//tb1.bdstatic.com/??/tb/_/dialog_6ed86bb.css,/tb/_/cont_sign_card_24bfda0.css,/tb/_/sign_tip_7f44335.css,/tb/_/sign_mod_bright_89ea30c.css,/tb/_/medal_a1f52a8.css,/tb/_/forum_card_beea95b.css,/tb/_/my_often_forum_237a2ee.css,/tb/_/tbnav_bright_fd2abd1.css,/tb/_/pager_9877ab4.css,/tb/_/share_74ded87.css,/tb/_/verify_manager_phone_f76b21c.css,/tb/_/block_user_84f09d6.css,/tb/_/forbid_speech_9a7a37c.css,/tb/_/paypost_agree_dialog_fd57709.css,/tb/_/admin_b3de171.css,/tb/_/to_frs_4ae81b8.css,/tb/_/no_refresh_pager_517ba2f.css,/tb/_/verify_dialog_74d8af1.css,/tb/_/favthread_c74c255.css,/tb/_/like_tip_a256b20.css,/tb/_/paykey_dialog_8f2a8db.css,/tb/_/paykey_mobile_9ab2a52.css,/tb/_/tbean_safe_3c779a3.css,/tb/_/payment_dialog_title_493782f.css,/tb/_/qianbao_purchase_tdou_4b31f54.css,/tb/_/tdou_get_de33d2b.css,/tb/_/tcharge_dialog_a6fd677.css,/tb/_/tb_region_e558306.css,/tb/_/umoney_query_0a188d5.css,/tb/_/nameplate_ecf7604.css\">\n<link rel=\"stylesheet\" href=\"//tb1.bdstatic.com/??/tb/_/my_current_forum_274c0a1.css,/tb/_/tb_spam_814ec43.css,/tb/_/my_tieba_4a1aa01.css,/tb/_/rich_ueditor_3283067.css,/tb/_/pic_act_poster_38b0720.css,/tb/_/follower_bc7c9ff.css,/tb/_/forum_title_a7a033e.css,/tb/_/novel_icons_8d150ae.css,/tb/_/save_face_fa1020d.css,/tb/_/pb_marry_ecbd581.css,/tb/_/fengchao_pb_feed_c7fdae2.css,/tb/_/promoter_master_house_9b0d01e.css,/tb/_/promoter_fans_supprise_bba005a.css,/tb/_/residual_87ce152.css,/tb/_/single_icons_3112de2.css,/tb/_/pb_author_d843ad0.css,/tb/_/novel_award_dialog_7b95981.css,/tb/_/novel_award_thread_d41d8cd.css,/tb/_/diamond_bind_mob_603bf34.css,/tb/_/grab_treasure_report_1152cd7.css,/tb/_/treasure_payment_dialog_de1650b.css,/tb/_/treasure_rule_dialog_021b23c.css,/tb/_/grab_treasure_ctrl_47136a4.css,/tb/_/pb_grab_treasure_2be04cb.css,/tb/_/scroll_panel_eb74727.css,/tb/_/promoter_post_opts_df5e95d.css,/tb/_/promoter_post_body_5da1d7c.css,/tb/_/post_tpoint_skin_dc0a7bb.css,/tb/_/idisk_5c0175c.css,/tb/_/paypost_guide_2bcd461.css\">\n<link rel=\"stylesheet\" href=\"//tb1.bdstatic.com/??/tb/_/paypost_6652964.css,/tb/_/content_recommend_04b27f3.css,/tb/_/gift_page_ctrl_4f3b88d.css,/tb/_/gift_loading_css_e2c23e9.css,/tb/_/send_gift_dialog_5d44fcd.css,/tb/_/pb_post_foot_send_gift_567544c.css,/tb/_/props_api_48f4f3d.css,/tb/_/tail_9e503e0.css,/tb/_/complient_thread_6dbe6e6.css,/tb/_/sub_list_970ecfb.css,/tb/_/forbid_speech_banner_f77182c.css,/tb/_/post_body_9d9f5e0.css,/tb/_/icon_tip_db299f2.css,/tb/_/tbshare_dc77707.css,/tb/_/card_0f960cd.css,/tb/_/post_list_97d41a1.css,/tb/_/forum_member_dialog_54bcbdc.css,/tb/_/exp_package_dialog_0658eb6.css,/tb/_/celebrity_widget_a846795.css,/tb/_/celebrity_forum_dialog_c86b274.css,/tb/_/guide_40dd704.css,/tb/_/interaction_d4668aa.css,/tb/_/month_icon_c245f06.css,/tb/_/user_visit_card_3010a85.css,/tb/_/head_preview_2d66852.css,/tb/_/buy_controller_da2afc7.css,/tb/_/celebrity_expball_7db46a5.css,/tb/_/celebrity_de017d6.css,/tb/_/aside_ad_d0e7d6c.css,/tb/_/app_download_7afdfb3.css\">\n<link rel=\"stylesheet\" href=\"//tb1.bdstatic.com/??/tb/_/video_player_ebb96a6.css,/tb/_/avideo_b97cdbe.css,/tb/_/search_back_e528995.css,/tb/_/topic_rank_085edda.css,/tb/_/spider_thread_recommend_0db4928.css,/tb/_/notice_7be1fa6.css,/tb/_/news_recommend_a1b3be3.css,/tb/_/showlist_45d286d.css,/tb/_/cps_ad_dcff595.css,/tb/_/duoku_servers_dialog_60e3165.css,/tb/_/duoku_servers_list_5d2afff.css,/tb/_/game_swap_words_ae08f57.css,/tb/_/thread_footer_43a88b5.css,/tb/_/scroll_panel_eb74727.css,/tb/_/custom_emotion_2d0490a.css,/tb/_/ueditor_emotion_8ff59b7.css,/tb/_/independent_emotion_bacfb1e.css,/tb/_/simple_poster_3c87768.css,/tb/_/word_limit_3c5481d.css,/tb/_/post_guessing_new_6962194.css,/tb/_/complaint_bar_owner_444c0fd.css,/tb/_/quick_reply_edit_f958ea8.css,/tb/_/post_marry_3ea54fd.css,/tb/_/rich_poster_812c34a.css,/tb/_/music_player_768d3e7.css,/tb/_/no_auto_video_258d904.css,/tb/_/voice_1254e97.css,/tb/_/meizhi_vote_3317f30.css,/tb/_/achieve_card_667ea68.css,/tb/_/fancard_9a01890.css\">\n<link rel=\"stylesheet\" href=\"//tb1.bdstatic.com/??/tb/_/xiu8_follow_warn_05c0a67.css,/tb/_/locality_pop_window_f10628a.css,/tb/_/platform_spread_layer_6bc2cd1.css,/tb/_/pk_fixed_bubble_2ffe171.css,/tb/_/platform_spread_video_f735452.css,/tb/_/image_flash_editor_74399a4.css,/tb/_/editor_pic_meizhi_de1b9cf.css,/tb/_/meizhi_postor_8cc4278.css,/tb/_/frs_stamp_notice_4756b7e.css,/tb/_/interest_smiley_19518d2.css,/tb/_/comtrial_907cfaf.css,/tb/_/skin_click_6ad5c16.css,/tb/_/game_pop_window_5c57ec5.css,/tb/_/share_thread_afd8b78.css,/tb/_/url_check_3923d6f.css,/tb/_/residual_87ce152.css,/tb/_/magic_props_eedd477.css,/tb/_/feedback_b53cf14.css,/tb/_/nameplate_recast_982421e.css,/tb/_/tshow_out_date_warn_9bdad5d.css,/tb/_/umoney_promotion_dialog_c159e0e.css,/tb/_/advertise_right_e986075.css,/tb/_/grab_treasure_dialog_success_a7da6c4.css,/tb/_/fixed_bar_fbd9428.css,/tb/_/bazhu_fixed_daoliu_bar_c763972.css,/tb/_/fixed_daoliu_bc7dfde.css,/tb/_/bright_b5494ba.css,/tb/_/tope_e1fb72f.css,/tb/_/thread_recommend_d41d8cd.css,/tb/_/info_collection_0719958.css\">\n<link rel=\"stylesheet\" href=\"//tb1.bdstatic.com/??/tb/_/grade_73b75ae.css,/tb/_/aside_float_bar_6a6b889.css,/tb/_/magic_props_2e28130.css\">\n        <script>    var PageData = {        \"tbs\": \"5ebed794473702491722965478\",        \"charset\": \"UTF-8\",        \"product\": \"pb\",        \"page\": \"pb_bright\"    };    var yyConfig = {\"yy_is_convert\":1,\"yy_pay_open\":1,\"yy_scores\":0};    var userIdentity = {\"is_tiebaplus_agent\":0,\"is_business_agent\":0};    PageData.user = {        \"id\": \"1527556343\",        \"user_id\": \"1527556343\",        \"name\": \"抗压吧吧务666\",        \"user_name\": \"抗压吧吧务666\",        \"user_nickname\" : \"\",        \"show_nickname\" : \"抗压吧吧务666\",        \"name_url\": \"&ie=utf-8\",        \"no_un\": 0,        \"is_login\": 1,        \"portrait\": \"tb.1.e6057aec.PmFeyCvKVx0KZKdGZ2v9oA?t=1420595544\",        \"balv\": {}, /* Ban 这个模块真够讨厌的 */\"Parr_props\": {\"all_level\":{\"2\":{\"end_time\":\"1421113470\",\"level\":2,\"score_limit\":8000}},\"level\":{\"end_time\":\"1421113470\",\"expired_notify\":1,\"expiring_notify\":1,\"left_num\":0,\"max_free_score\":8000,\"open_status\":null,\"pic_url\":null,\"props_category\":105,\"props_id\":2,\"props_type\":0,\"update_time\":null,\"used_status\":1}},\"Parr_scores\": null,\"mParr_props\": {\"all_level\":{\"2\":{\"end_time\":\"1421113470\",\"level\":2,\"pic_url\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/6afa80cb39dbb6fdf9de234d0b24ab18962b37f0.jpg\",\"score_limit\":8000}},\"level\":{\"end_time\":\"1421113470\",\"pic_url\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/6afa80cb39dbb6fdf9de234d0b24ab18962b37f0.jpg\",\"props_id\":2}},        \"vipInfo\": {\"a_score\":-50,\"e_time\":\"1421113470\",\"ext_score\":\"0\",\"icon_url\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/icon_crown_super_non1.png\",\"n_score\":2600,\"s_time\":\"1542729600\",\"v_level\":1,\"v_status\":\"0\",\"y_score\":1000},        \"new_iconinfo\": {\"1\":{\"slot_no\":\"1\",\"slot_type\":\"0\",\"icon\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429669987762.png\",\"value\":\"1\",\"end_time\":\"1735660800\",\"name\":\"starmaster\",\"level\":\"6\",\"weight\":1,\"position\":{\"frs\":1,\"pb\":1,\"home\":1,\"card\":1},\"terminal\":{\"pc\":1,\"wap\":1,\"client\":1},\"sprite\":{\"1\":\"1722691615,76\",\"2\":\"1722691615,77\",\"3\":\"1722691615,78\",\"4\":\"1722691615,79\",\"5\":\"1722691615,80\",\"6\":\"1722691615,81\"},\"category_id\":104,\"type\":2,\"price\":0,\"is_force\":0,\"is_advanced\":0,\"title\":\"\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\",\"level_1\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429669987762.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429669999852.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670005742.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670015949.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670023838.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670037795.png\",\"level_info\":{\"title\":\"\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}},\"level_2\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670195809.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670205542.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670220878.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670227517.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670235465.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670242217.png\",\"level_info\":{\"title\":\"\\u624b\\u6e381\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e381\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}},\"level_3\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670307639.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670315211.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670322063.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670328302.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670335960.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670342374.png\",\"level_info\":{\"title\":\"\\u624b\\u6e382\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e382\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}},\"level_4\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670565360.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670572100.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670579403.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670588885.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670595104.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670602958.png\",\"level_info\":{\"title\":\"\\u624b\\u6e383\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e383\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}},\"level_5\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670665956.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670671915.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670677756.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670683824.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670689692.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670695382.png\",\"level_info\":{\"title\":\"\\u624b\\u6e384\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e384\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}},\"level_6\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670737569.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670746212.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670751930.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670757612.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670763174.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670769025.png\",\"level_info\":{\"title\":\"\\u624b\\u6e385\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e385\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}}}},        \"power\": {},        \"pb_login_switch\": false,        \"is_videocreator\": 0,        \"interaction_switch\": false,        \"no_login_user_browse_switch\": null,        \"login_popup_phone_switch\": null,        \"login_day\": 5,        \"open_switch\": +yyConfig.yy_pay_open,        \"open_convert\": +yyConfig.yy_is_convert,        \"yy_scores\": yyConfig.yy_scores && +yyConfig.yy_scores || 0,        \"is_business_agent\": 0 || userIdentity.is_business_agent,        \"is_tiebaplus_agent\": 0 ||  userIdentity.is_tiebaplus_agent,        \"is_business_account\": 0,    };    PageData.search_what = \"\";    var Env = {        server_time: 1722965479000};    var Tbs = {\"forward\":\"295ffc8709a19932\",\"follow\":\"8b75b056990cbc81\",\"upload_img\":\"ff5f7ad089d4deaa017229654780125500_1\",\"common\":\"5ebed794473702491722965478\",\"rp\":\"4b0197e35b46235cb4cee4c2\"};    if (yyConfig.yy_pay_open === 1 && yyConfig.yy_is_convert === 1) {        var user = PageData.user;        if (!user.Parr_scores) {            user.Parr_scores = {};        }        user.Parr_scores.scores_money = user.yy_scores;        user.Parr_scores.scores_other = 0;        user.Parr_scores.scores_total = user.yy_scores;    }</script><script type=\"text/javascript\">function resizePic_temp(e,t,i,s,n){function r(e,t,i,s){var n=0,r=e,a=t;switch(e>i&&(n+=1),t>s&&(n+=2),n){case 1:r=i,a=t*i/e;case 2:a=s,r=e*s/t;case 3:a=t/s>e/i?s:t*i/e,r=t/s>e/i?e*s/t:i}return 0!=n&&(l=!0),[r,a]}var a=t||120,c=i||120,l=!1,p=new Image;p.src=e.src;var h=r(p.width,p.height,a,c);return e.style.width=h[0]+\"px\",e.style.height=h[1]+\"px\",\"function\"==typeof n&&n.apply(this,arguments),e.style.visibility=\"visible\",1==s&&(e.style.marginTop=(i-parseInt(h[1]))/2+\"px\"),p=null,l}</script>        <script type=\"text/javascript\">                ;(function() {                    var track = function(locate,task,page,type, extra){                        if (page && typeof page == 'object') { extra = page; page = ''; }                        if (type && typeof type == 'object') { extra = type; type = ''; }                        if (document.images) {                            var img = new Image();                            window[\"bd_pv_\" + (new Date().getTime())] = img;                            var trackUrl;                            if (document.location.protocol === 'https:') {                                trackUrl = \"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/img/track.gif?\";                            }                            else {                                trackUrl = \"http://static.\"+\"tieba.baidu.com/tb/img/track.gif?\";                            }                            var paramArr = [                                \"client_type=pc_web\",                                \"task=\" + (task && encodeURIComponent(task) || \"\"),                                \"locate=\" + (locate && encodeURIComponent(locate) || \"\"),                                \"type=\" + (type && encodeURIComponent(type) || \"click\"),                                \"url=\" + encodeURIComponent(document.location.href),                                \"refer=\" + encodeURIComponent(document.referrer)                            ];                            if(PageData){                                paramArr.push(\"page=\" + (page || PageData.product || \"\"));                                if(PageData.forum){                                    paramArr.push(\"fid=\" + (PageData.forum.forum_id || \"\"));                                    paramArr.push(\"fname=\" + encodeURIComponent(PageData.forum.forum_name || \"\"));                                }                                if(PageData.user){                                    paramArr.push(\"uid=\" + (PageData.user.user_id || PageData.user.user_id || \"\"));                                    paramArr.push(\"uname=\" + encodeURIComponent(PageData.user.user_name || \"\"));                                    paramArr.push(\"is_new_user=\" + (PageData.user.is_new_user || \"\"));                                }                                if(PageData.thread){                                    paramArr.push(\"tid=\" + ((PageData.thread && PageData.thread.thread_id) || \"\"));                                }                            }                            for (var i in extra) {                                if (extra.hasOwnProperty(i)) {                                    paramArr.push(i + \"=\" + encodeURIComponent(extra[i]));                                }                            }                            trackUrl += paramArr.join(\"&\");                                                 img.src = trackUrl + \"&t=\" + new Date().getTime();                            img = null;                        }                    };                    track('pb_pv', 'pb_normal', 'pb', 'show');                    })();</script>        <script type=\"text/javascript\" id=\"radar-init-script\">!function(){\"use strict\";function n(n,t){return n(t={exports:{}},t.exports),t.exports}function i(n){return\"object\"==typeof n?null!==n:\"function\"==typeof n}function o(n){if(!i(n))throw TypeError(n+\" is not an object!\");return n}function t(n){try{return!!n()}catch(t){return!0}}function c(n,t){return h.call(n,t)}function f(n){return\"Symbol(\".concat(n===undefined?\"\":n,\")_\",(++d+g).toString(36))}function u(n){if(\"function\"!=typeof n)throw TypeError(n+\" is not a function!\");return n}function y(e,o,n){if(u(e),o===undefined)return e;switch(n){case 1:return function(n){return e.call(o,n)};case 2:return function(n,t){return e.call(o,n,t)};case 3:return function(n,t,r){return e.call(o,n,t,r)}}return function(){return e.apply(o,arguments)}}var v=n(function(n){var t=n.exports=\"undefined\"!=typeof window&&window.Math==Math?window:\"undefined\"!=typeof self&&self.Math==Math?self:Function(\"return this\")();\"number\"==typeof __g&&(__g=t)}),m=n(function(n){var t=n.exports={version:\"2.6.9\"};\"number\"==typeof __e&&(__e=t)}),p=(m.version,!t(function(){return 7!=Object.defineProperty({},\"a\",{get:function(){return 7}}).a})),r=v.document,e=i(r)&&i(r.createElement),a=!p&&!t(function(){return 7!=Object.defineProperty(function(n){return e?r.createElement(n):{}}(\"div\"),\"a\",{get:function(){return 7}}).a}),s=Object.defineProperty,l={f:p?Object.defineProperty:function(n,t,r){if(o(n),t=function(n,t){if(!i(n))return n;var r,e;if(t&&\"function\"==typeof(r=n.toString)&&!i(e=r.call(n)))return e;if(\"function\"==typeof(r=n.valueOf)&&!i(e=r.call(n)))return e;if(!t&&\"function\"==typeof(r=n.toString)&&!i(e=r.call(n)))return e;throw TypeError(\"Can't convert object to primitive value\")}(t,!0),o(r),a)try{return s(n,t,r)}catch(e){}if(\"get\"in r||\"set\"in r)throw TypeError(\"Accessors not supported!\");return\"value\"in r&&(n[t]=r.value),n}},w=p?function(n,t,r){return l.f(n,t,function(n,t){return{enumerable:!(1&n),configurable:!(2&n),writable:!(4&n),value:t}}(1,r))}:function(n,t,r){return n[t]=r,n},h={}.hasOwnProperty,d=0,g=Math.random(),b=n(function(n){var t=\"__core-js_shared__\",r=v[t]||(v[t]={});(n.exports=function(n,t){return r[n]||(r[n]=t!==undefined?t:{})})(\"versions\",[]).push({version:m.version,mode:\"global\",copyright:\"© 2019 Denis Pushkarev (zloirock.ru)\"})}),E=b(\"native-function-to-string\",Function.toString),O=n(function(n){var i=f(\"src\"),t=\"toString\",u=(\"\"+E).split(t);m.inspectSource=function(n){return E.call(n)},(n.exports=function(n,t,r,e){var o=\"function\"==typeof r;o&&(c(r,\"name\")||w(r,\"name\",t)),n[t]!==r&&(o&&(c(r,i)||w(r,i,n[t]?\"\"+n[t]:u.join(String(t)))),n===v?n[t]=r:e?n[t]?n[t]=r:w(n,t,r):(delete n[t],w(n,t,r)))})(Function.prototype,t,function(){return\"function\"==typeof this&&this[i]||E.call(this)})}),j=\"prototype\",S=function(n,t,r){var e,o,i,u,c=n&S.F,f=n&S.G,a=n&S.S,s=n&S.P,l=n&S.B,p=f?v:a?v[t]||(v[t]={}):(v[t]||{})[j],h=f?m:m[t]||(m[t]={}),d=h[j]||(h[j]={});for(e in f&&(r=t),r)i=((o=!c&&p&&p[e]!==undefined)?p:r)[e],u=l&&o?y(i,v):s&&\"function\"==typeof i?y(Function.call,i):i,p&&O(p,e,i,n&S.U),h[e]!=i&&w(h,e,u),s&&d[e]!=i&&(d[e]=i)};v.core=m,S.F=1,S.G=2,S.S=4,S.P=8,S.B=16,S.W=32,S.U=64,S.R=128;function _(n){return C.call(n).slice(8,-1)}function R(n){if(n==undefined)throw TypeError(\"Can't call method on  \"+n);return n}function A(n){return D(R(n))}function F(n){return isNaN(n=+n)?0:(0<n?I:L)(n)}function P(n){return 0<n?B(F(n),9007199254740991):0}function k(n){return Object(R(n))}var M,T,x=S,C={}.toString,D=Object(\"z\").propertyIsEnumerable(0)?Object:function(n){return\"String\"==_(n)?n.split(\"\"):Object(n)},L=Math.ceil,I=Math.floor,B=Math.min,N=Math.max,z=Math.min,G=b(\"keys\"),U=(M=!1,function(n,t,r){var e,o=A(n),i=P(o.length),u=function(n,t){return(n=F(n))<0?N(n+t,0):z(n,t)}(r,i);if(M&&t!=t){for(;u<i;)if((e=o[u++])!=e)return!0}else for(;u<i;u++)if((M||u in o)&&o[u]===t)return M||u||0;return!M&&-1}),q=G[T=\"IE_PROTO\"]||(G[T]=f(T)),W=\"constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf\".split(\",\"),Y=Object.keys||function(n){return function(n,t){var r,e=A(n),o=0,i=[];for(r in e)r!=q&&c(e,r)&&i.push(r);for(;t.length>o;)c(e,r=t[o++])&&(~U(i,r)||i.push(r));return i}(n,W)},$={f:Object.getOwnPropertySymbols},H={f:{}.propertyIsEnumerable},J=Object.assign,K=!J||t(function(){var n={},t={},r=Symbol(),e=\"abcdefghijklmnopqrst\";return n[r]=7,e.split(\"\").forEach(function(n){t[n]=n}),7!=J({},n)[r]||Object.keys(J({},t)).join(\"\")!=e})?function(n,t){for(var r=k(n),e=arguments.length,o=1,i=$.f,u=H.f;o<e;)for(var c,f=D(arguments[o++]),a=i?Y(f).concat(i(f)):Y(f),s=a.length,l=0;l<s;)c=a[l++],p&&!u.call(f,c)||(r[c]=f[c]);return r}:J;x(x.S+x.F,\"Object\",{assign:K});var Q=l.f,V=Function.prototype,X=/^\\s*function ([^ (]*)/;\"name\"in V||p&&Q(V,\"name\",{configurable:!0,get:function(){try{return(\"\"+this).match(X)[1]}catch(n){return\"\"}}});var Z,nn,tn,rn,en,on,un,cn,fn,an,sn,ln=Array.isArray||function(n){return\"Array\"==_(n)},pn=n(function(n){var t=b(\"wks\"),r=v.Symbol,e=\"function\"==typeof r;(n.exports=function(n){return t[n]||(t[n]=e&&r[n]||(e?r:f)(\"Symbol.\"+n))}).store=t})(\"species\"),hn=(tn=1==(Z=0),rn=2==Z,en=3==Z,on=4==Z,un=6==Z,cn=5==Z||un,fn=nn||function(n,t){return new(function(n){var t;return ln(n)&&(\"function\"!=typeof(t=n.constructor)||t!==Array&&!ln(t.prototype)||(t=undefined),i(t)&&null===(t=t[pn])&&(t=undefined)),t===undefined?Array:t}(n))(t)},function(n,t,r){for(var e,o,i=k(n),u=D(i),c=y(t,r,3),f=P(u.length),a=0,s=tn?fn(n,f):rn?fn(n,0):undefined;a<f;a++)if((cn||a in u)&&(o=c(e=u[a],a,i),Z))if(tn)s[a]=o;else if(o)switch(Z){case 3:return!0;case 5:return e;case 6:return a;case 2:s.push(e)}else if(on)return!1;return un?-1:en||on?on:s}),dn=(sn=!0,!!(an=[].forEach)&&t(function(){sn?an.call(null,function(){},1):an.call(null)}));x(x.P+x.F*!dn,\"Array\",{forEach:function(n){return hn(this,n,arguments[1])}});var yn={\"load.ready\":\"READAR_LOAD_READY\",\"perfamance.beforeReport\":\"PERFAMANCE_BEFORE_REPORT\"},vn=new(function(){function n(){this.events={}}var t=n.prototype;return t.on=function(n,t){(n=yn[n])&&(this.events[n]?this.events[n].push(t):this.events[n]=[t])},t.emit=function(n){for(var t=this,r=arguments.length,e=new Array(1<r?r-1:0),o=1;o<r;o++)e[o-1]=arguments[o];(n=yn[n])&&this.events&&this.events[n]&&this.events[n].forEach(function(n){return n.apply(t,e)})},t.off=function(r,e){var o=this;(r=yn[r])&&this.events[r]!==undefined&&0<this.events[r].length&&(e!==undefined?this.events[r].forEach(function(n,t){n===e&&o.events[r].splice(t,1)}):delete this.events[r])},t.clear=function(){this.events={}},n}()),mn=[].slice,wn={},gn=Function.bind||function(t){var r=u(this),e=mn.call(arguments,1),o=function(){var n=e.concat(mn.call(arguments));return this instanceof o?function(n,t,r){if(!(t in wn)){for(var e=[],o=0;o<t;o++)e[o]=\"a[\"+o+\"]\";wn[t]=Function(\"F,a\",\"return new F(\"+e.join(\",\")+\")\")}return wn[t](n,r)}(r,n.length,n):function(n,t,r){var e=r===undefined;switch(t.length){case 0:return e?n():n.call(r);case 1:return e?n(t[0]):n.call(r,t[0]);case 2:return e?n(t[0],t[1]):n.call(r,t[0],t[1]);case 3:return e?n(t[0],t[1],t[2]):n.call(r,t[0],t[1],t[2]);case 4:return e?n(t[0],t[1],t[2],t[3]):n.call(r,t[0],t[1],t[2],t[3])}return n.apply(r,t)}(r,n,t)};return i(r.prototype)&&(o.prototype=r.prototype),o};x(x.P,\"Function\",{bind:gn});try{var bn=function bn(n,t){5<En.errs.length||(n.errType=t,En.errs.push(n))};window.radar={config:{performanceAutoReport:!0,sample:.01},errs:[],marks:{},cusMarks:{},$event:vn};var En=window.radar;window.addEventListener&&(window.addEventListener(\"error\",function(n){return bn(n,\"jsErr\")},!0),window.addEventListener(\"unhandledrejection\",function(n){return bn(n,\"promiseErr\")})),En.setConfig=function(n){for(var t in n)En.config[t]=n[t]};var On=function On(){if(En.config.performanceAutoReport&&\"csr\"===En.config.renderType){setTimeout(function(){window.radar.performanceReport&&\"function\"==typeof window.radar.performanceReport&&window.radar.performanceReport()},1e3)}};En.mark=function(n){En.marks[n]=+new Date,\"fs\"===n&&On()},En.markCustom=function(n){if(!(n&&n instanceof Object))throw\"[ERROR]markCustom方法参数错误\";En.cusMarks=Object.assign({},En.cusMarks,{},n),n.fs&&On()}}catch(jn){!function Aa(t){if(window.console){for(var r,e=arguments.length,o=new Array(1<e?e-1:0),i=1;i<e;i++)o[i-1]=arguments[i];setTimeout((r=console[t]).bind.apply(r,[console].concat(o)))}}(\"error\",jn)}}();window.radar && window.radar.setConfig({page: 'hYx_K1fJL',                sample: 0.05,                clientType: 'pc_web',                renderType: 'ssr'})</script><script>var _hmt = _hmt || [];(function() {  var hm = document.createElement(\"script\");  hm.src = \"https://hm.baidu.com/hm.js?292b2e1608b0823c1cb6beef7243ef34\";  var s = document.getElementsByTagName(\"script\")[0];   s.parentNode.insertBefore(hm, s);})();</script><script src=\"https://efe-h2.cdn.bcebos.com/cliresource/@baidu/ubc-report-sdk/3.3.3/ubc-report-sdk.iife.polyfill.min.js\"></script><script type=\"text/javascript\" src=\"https://ecma.bdimg.com/lego-tpl/acde942d-7ec3-483c-aae9-eeffbc714af4.js\"></script><style type=\"text/css\">.art-undercover{position:fixed;display:none;opacity:.9;z-index:10}.art-undercover,.error-wrap{background:#000;top:0;left:0;height:100%;width:100%}.error-wrap{position:absolute;z-index:33;color:#fff;text-align:center;line-height:200px}.error-wrap a{text-decoration:underline}@-webkit-keyframes biggerAni{0%{transform:scale(1);opacity:.8}50%{transform:scale(1.2);opacity:1}to{transform:scale(1);opacity:1}}@keyframes biggerAni{0%{transform:scale(1);opacity:.8}50%{transform:scale(1.2);opacity:1}to{transform:scale(1);opacity:1}}.biggerAnimation{-webkit-animation:biggerAni .5s;animation:biggerAni .5s}.currentTime,.durationTime{color:#fff;font-weight:600}.durationTime{opacity:.6}.art-video-player{display:flex;position:relative;margin:0 auto;z-index:20;max-width:100%;width:100%;height:0;padding-top:56.25%;outline:0;zoom:1;font-family:Roboto,Arial,Helvetica,sans-serif;color:#eee;background:#000 none 50%/cover no-repeat;text-align:left;direction:ltr;font-size:14px;line-height:1.3;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:rgba(0,0,0,0);touch-action:manipulation;-ms-high-contrast-adjust:none}.art-video-player *{margin:0;padding:0;box-sizing:border-box}.art-video-player ::-webkit-scrollbar{width:5px}.art-video-player ::-webkit-scrollbar-thumb{background-color:#666}.art-video-player ::-webkit-scrollbar-thumb:hover{background-color:#ccc}.art-video-player .art-icon{display:inline-flex;justify-content:center;align-items:center;line-height:1.5}.art-video-player .art-icon svg{fill:#fff}.art-video-player img{max-width:100%;vertical-align:top}@supports ((-webkit-backdrop-filter:initial) or (backdrop-filter:initial)){.art-video-player .art-backdrop-filter{-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px)}}.art-setting-switch-wrap .art-switch-title{display:inline-block;color:#fff;font-size:14px}.art-setting-switch-wrap .art-switch-btn{float:right;position:relative;width:32px;height:18px;border:1px solid hsla(0,0%,100%,.8);border-radius:11px;outline:none;box-sizing:border-box;cursor:pointer;transition:border-color .3s,background-color .3s;vertical-align:middle}.art-setting-switch-wrap .art-switch-btn .art-switch-handle{position:absolute;top:1px;left:1px;transition:transform .3s;width:14px;height:14px;border-radius:50%;background-color:#fff}.art-setting-switch-wrap .art-switch-btn.active{border-color:#ff4141}.art-setting-switch-wrap .art-switch-btn.active span{transform:translateX(14px);background-color:#ff4141}.mini-replay{position:absolute;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.54);display:none;z-index:100}.mini-replay .mini-replay-svg{border-radius:100%;cursor:pointer;position:absolute;left:50%;top:50%;margin-left:-24px;margin-top:-24px}.art-controls-right .art-control{opacity:.8}.art-controls-right .art-control:hover{opacity:1}.art-controls-right .art-control-playrate,.art-controls-right .art-control-quality{opacity:.9}.art-controls-right .art-control-playrate:hover,.art-controls-right .art-control-quality:hover{opacity:1}.art-control-next{margin-right:10px}.art-control-next svg{position:absolute;top:6px;left:8px}.art-mini-icon{position:absolute;left:50%;top:50%;display:none}.art-animation-volume{height:100%;padding:5px}.art-close-automini{color:#fff;height:35px;line-height:35px;cursor:pointer}.art-close-automini .empty-circle{width:11px;height:11px;background:transparent;border-radius:50%;border:1px solid #fff;float:left;margin-top:11px;opacity:.8}.art-close-automini .close-text{float:left;margin-left:5px;margin-right:10px;opacity:.8}.art-close-automini .close-tip-text{display:none;background:rgba(17,17,17,.7);border-radius:8px;color:#fff;height:30px;line-height:30px;font-size:14px;position:absolute;bottom:-38px;right:10px;padding:0 8px}.art-close-automini:hover .close-text,.art-close-automini:hover .empty-circle{opacity:1}.art-close-automini:hover .close-tip-text{display:block}.art-control svg{max-width:34px}.art-control.art-control-playAndPause{margin-left:5px}.art-control.art-control-playAndPause svg{max-width:44px}.hkplayer-is-cssfullscreen{position:fixed!important;left:0!important;top:0!important;width:100%!important;height:100%!important;z-index:99999!important;padding-top:0!important}.art-video-player .art-video{z-index:10;background-color:#000;cursor:pointer}.art-video-player .art-poster,.art-video-player .art-video{position:absolute;left:0;top:0;right:0;bottom:0;width:100%;height:100%}.art-video-player .art-poster{z-index:11;background-position:50%;background-repeat:no-repeat;background-size:cover;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}.art-video-player .art-subtitle{display:none;position:absolute;z-index:20;bottom:10px;width:100%;padding:0 20px;text-align:center;color:#fff;font-size:20px;pointer-events:none;text-shadow:1px 0 1px #000,0 1px 1px #000,-1px 0 1px #000,0 -1px 1px #000,1px 1px 1px #000,-1px -1px 1px #000,1px -1px 1px #000,-1px 1px 1px #000}.art-video-player .art-subtitle p{word-break:break-all;height:-webkit-fit-content;height:-moz-fit-content;height:fit-content;margin:5px 0 0;line-height:1.2}.art-video-player .art-bilingual p:nth-child(n+2){transform:scale(.6);transform-origin:center top}.art-video-player.art-subtitle-show .art-subtitle{display:block}.art-video-player.art-control-show .art-subtitle{bottom:50px}.art-video-player .art-danmuku{z-index:30}.art-video-player .art-danmuku,.art-video-player .art-layers{position:absolute;left:0;top:0;right:0;bottom:0;width:100%;height:100%;overflow:hidden;pointer-events:none}.art-video-player .art-layers{display:none;z-index:40}.art-video-player .art-layers .art-layer{position:absolute;top:20px;right:20px;width:5%}.art-video-player.art-layer-show .art-layers{display:block}.art-video-player .art-mask{display:none;align-items:center;justify-content:center;position:absolute;z-index:50;left:0;top:0;right:0;bottom:0;width:100%;height:100%;overflow:hidden;pointer-events:none}.art-video-player .art-mask .art-state{width:88px;height:88px;overflow:hidden;text-align:center;vertical-align:middle;position:absolute;left:50%;top:50%;z-index:115;margin-top:-44px;margin-left:-44px;cursor:pointer}.art-video-player.art-mask-show .art-mask{display:flex}.art-video-player .art-loading{display:none;position:absolute;z-index:70;left:0;top:0;right:0;bottom:0;width:100%;height:100%;align-items:center;justify-content:center;pointer-events:none}.art-video-player.art-loading-show .art-loading{display:flex;width:60px;height:60px;left:50%;top:50%;margin-left:-30px;margin-top:-30px}.art-video-player .art-bottom{position:absolute;z-index:60;left:0;right:0;bottom:0;height:76px;opacity:0;visibility:hidden;transition:all .2s ease-in-out;pointer-events:none;background:linear-gradient(180deg,transparent,rgba(0,0,0,.5))}.art-video-player .art-bottom .art-progress{position:relative;pointer-events:auto;z-index:2}.art-video-player .art-bottom .art-progress .art-control-progress{position:relative;display:flex;flex-direction:row;align-items:center;height:24px;padding-top:8px;padding-bottom:8px;cursor:pointer}.art-video-player .art-bottom .art-progress .art-control-progress .art-control-progress-inner{position:relative;height:50%;width:100%;background:hsla(0,0%,100%,.2)}.art-video-player .art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-loaded{position:absolute;z-index:10;left:0;top:0;right:0;bottom:0;height:100%;width:0;background:hsla(0,0%,100%,.4);border-top-right-radius:20px;border-bottom-right-radius:20px}.art-video-player .art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-played{border-top-right-radius:20px;border-bottom-right-radius:20px;position:absolute;z-index:20;left:0;top:0;right:0;bottom:0;height:100%;width:0}.art-video-player .art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight{position:absolute;z-index:30;left:0;top:0;right:0;bottom:0;height:100%;pointer-events:none}.art-video-player .art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight span{display:inline-block;position:absolute;left:0;top:0;width:2px;height:100%;background:#fff;pointer-events:auto}.art-video-player .art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{display:none;position:absolute;z-index:40;top:-5px;left:-6.5px;width:18px;height:18px;border-radius:50%;background:#fff!important}.art-video-player .art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator.art-show-indicator{display:block}.art-video-player .art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-tip{display:none;position:absolute;z-index:50;top:-25px;left:0;height:20px;padding:0 5px;line-height:20px;color:#fff;font-size:12px;text-align:center;background:rgba(0,0,0,.7);border-radius:3px;font-weight:700;white-space:nowrap;pointer-events:none}.art-video-player .art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-pointer{display:none;position:absolute;z-index:20;top:0;left:0;height:100%;width:2px;background:#fff;pointer-events:none}.art-video-player .art-bottom .art-progress .art-control-progress:hover .art-control-progress-inner{height:100%}.art-video-player .art-bottom .art-progress .art-control-progress:hover .art-control-progress-inner .art-progress-indicator,.art-video-player .art-bottom .art-progress .art-control-progress:hover .art-control-progress-inner .art-progress-pointer,.art-video-player .art-bottom .art-progress .art-control-progress:hover .art-control-progress-inner .art-progress-tip{display:block}.art-video-player .art-bottom .art-progress .art-control-thumbnails{display:none;position:absolute;bottom:50px;left:0;pointer-events:none;background-color:rgba(0,0,0,.7);border:1.5px solid #fff;border-radius:3px;transform-origin:center bottom;transform:scale(1)}.art-video-player .art-bottom .art-progress .art-control-loop{display:none;position:absolute;width:100%;height:100%;left:0;top:0;right:0;bottom:0;pointer-events:none}.art-video-player .art-bottom .art-progress .art-control-loop .art-loop-point{position:absolute;left:0;top:-2px;width:2px;height:8px;background:hsla(0,0%,100%,.75)}.art-video-player .art-bottom .art-controls{position:absolute;left:0;right:0;bottom:6px;pointer-events:auto;display:flex;align-items:center;justify-content:space-between;height:40px;padding:0\\0;margin-top:6px}.art-video-player .art-bottom .art-controls .art-controls-left{display:flex;float:left\\0}.art-video-player .art-bottom .art-controls .art-controls-left .art-control{float:left\\0}.art-video-player .art-bottom .art-controls .art-controls-right{display:flex;float:right\\0;margin-right:2px}.art-video-player .art-bottom .art-controls .art-controls-right .art-control{margin-right:10px;float:left\\0}.art-video-player .art-bottom .art-controls .art-controls-right .art-control .art-icon-fullscreen.ie9hack{margin-top:5px;margin-left:0}.art-video-player .art-bottom .art-controls .art-controls-right .art-control-playrate,.art-video-player .art-bottom .art-controls .art-controls-right .art-control-quality{margin-right:5px}.art-video-player .art-bottom .art-controls .art-control{font-size:12px;height:40px;min-width:44px;line-height:40px;text-align:center;cursor:pointer;white-space:nowrap}.art-video-player .art-bottom .art-controls .art-control .art-icon{display:flex;align-items:center;justify-content:center;float:left;height:40px;width:44px}.art-video-player .art-bottom .art-controls .art-control .art-icon-volumeClose{padding:8px\\0}.art-video-player .art-bottom .art-controls .art-control-setting{position:relative}.art-video-player .art-bottom .art-controls .art-control-time{font-size:14px}.art-video-player .art-bottom .art-controls .playnext-icon{margin-top:6px}.art-video-player .art-bottom .art-controls .art-control-control10,.art-video-player .art-bottom .art-controls .art-control-control11{display:flex;align-items:center;justify-content:center;float:left;height:40px;width:44px}.art-video-player .art-bottom .art-controls .art-control-playrate,.art-video-player .art-bottom .art-controls .art-control-quality,.art-video-player .art-bottom .art-controls .art-control-screenshot{margin-right:5px}.art-video-player .art-bottom .art-controls .art-control-onlyText{padding:0 10px}.art-video-player .art-bottom .art-controls .art-control-volume{z-index:99}.art-video-player .art-bottom .art-controls .art-control-volume .art-volume-hover-area{position:absolute;bottom:30px;width:44px;height:154px;z-index:21;display:none}.art-video-player .art-bottom .art-controls .art-control-volume .art-volume-panel-wrap{position:absolute;width:44px;height:134px;clear:both;background:rgba(17,17,17,.7);border-radius:8px}.art-video-player .art-bottom .art-controls .art-control-volume .art-volume-panel-wrap span{float:left;width:100%;height:30px;line-height:30px;display:block}.art-video-player .art-bottom .art-controls .art-control-volume .art-volume-panel-wrap:after{content:\"\";display:block;position:absolute;bottom:-16px;left:50%;transform:translateX(-50%);width:0;height:0;border:8px solid transparent;border-top-color:rgba(17,17,17,.7)}.art-video-player .art-bottom .art-controls .art-control-volume .art-volume-panel-wrap .art-volume-panel{position:relative;float:left;width:44px;height:91px;transition:margin .2s cubic-bezier(.4,0,1,1),width .2s cubic-bezier(.4,0,1,1);overflow:hidden;margin:0 auto}.art-video-player .art-bottom .art-controls .art-control-volume .art-volume-panel-wrap .art-volume-panel .art-volume-slider-handle{position:absolute;left:50%;width:13px;height:13px;border-radius:50%;margin-top:0;background:#fff;margin-left:-6.5px;z-index:2}.art-video-player .art-bottom .art-controls .art-control-volume .art-volume-panel-wrap .art-volume-panel .art-volume-top-bottom{width:3px;height:90px;left:50%;position:absolute;margin-left:-1.5px;z-index:1;border-radius:8px;background:#fff}.art-video-player .art-bottom .art-controls .art-control-volume .art-volume-panel-wrap .art-volume-panel .art-volume-bottom,.art-video-player .art-bottom .art-controls .art-control-volume .art-volume-panel-wrap .art-volume-panel .art-volume-top{position:absolute;display:block;height:90px;width:3px;left:50%;margin-left:-1.5px}.art-video-player .art-bottom .art-controls .art-control-volume .art-volume-panel-wrap .art-volume-panel .art-volume-top{bottom:-64px;background:rgba(0,0,0,.6)}.art-video-player .art-bottom .art-controls .art-control-volume:hover .art-volume-hover-area{display:block}.art-video-player .art-bottom .art-controls .art-control-quality{position:relative;z-index:30}.art-video-player .art-bottom .art-controls .art-control-quality .art-qualitys{display:none;position:absolute;bottom:35px;width:100px;padding:5px 0;text-align:center;color:#fff;background:rgba(0,0,0,.8);border-radius:3px}.art-video-player .art-bottom .art-controls .art-control-quality .art-qualitys .art-quality-item{height:30px;line-height:30px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-shadow:0 0 2px rgba(0,0,0,.5)}.art-video-player .art-bottom .art-controls .art-control-quality .art-qualitys .art-quality-item:hover{background-color:hsla(0,0%,100%,.1)}.art-video-player .art-bottom .art-controls .art-control-quality:hover .art-qualitys{display:block}.art-video-player.art-control-show .art-bottom,.art-video-player.art-hover .art-bottom{opacity:1;visibility:visible}.art-video-player.art-destroy .art-progress-indicator,.art-video-player.art-destroy .art-progress-pointer,.art-video-player.art-destroy .art-progress-tip,.art-video-player.art-error .art-progress-indicator,.art-video-player.art-error .art-progress-pointer,.art-video-player.art-error .art-progress-tip{display:none!important}.art-video-player .art-notice{display:none;font-size:14px;position:absolute;z-index:80;left:0;top:0;padding:10px;width:100%;pointer-events:none}.art-video-player .art-notice .art-notice-inner{display:none;padding:5px 10px;color:#fff;background:rgba(0,0,0,.6);border-radius:3px}.art-video-player.art-notice-show .art-notice{display:flex}.art-video-player .art-contextmenus{display:none;flex-direction:column;position:absolute;z-index:120;left:0;top:0;min-width:160px;background-color:rgba(26,26,26,.96);border-radius:5px}.art-video-player .art-contextmenus .art-contextmenu{cursor:pointer;font-size:14px;display:block;color:#fff;padding:15px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;opacity:.8}.art-video-player .art-contextmenus .art-contextmenu:hover{opacity:1}.art-video-player.art-contextmenu-show .art-contextmenus{display:flex}.art-video-player .art-settings{display:flex;align-items:center;justify-content:center;position:absolute;z-index:90;left:0;top:0;height:100%;width:100%;pointer-events:none}.art-video-player .art-settings .art-setting-inner{position:absolute;bottom:30px;padding-bottom:20px;width:155px;font-size:12px;z-index:200;overflow:hidden;opacity:0;visibility:hidden}.art-video-player .art-settings .art-setting-inner:after{content:\"\";display:block;position:absolute;bottom:6.5px;left:50%;transform:translateX(-50%);width:0;height:0;border:7px solid transparent;border-top-color:rgba(17,17,17,.7)}.art-video-player .art-settings .art-setting-inner .art-setting-body{overflow-y:auto;padding:8.5px 16px;background-color:rgba(17,17,17,.7);border-radius:8px;line-height:1.3}.art-video-player .art-settings .art-setting-inner .art-setting-body .art-setting{padding:11.5px 0;text-align:left}.art-video-player .art-settings .art-setting-inner .art-setting-body .art-setting .art-setting-header{margin-bottom:5px}.art-video-player .art-settings .art-setting-radio{display:flex}.art-video-player .art-settings .art-setting-radio .art-radio-item{flex:1;padding:0 2px}.art-video-player .art-settings .art-setting-radio .art-radio-item button{height:22px;width:100%;border:none;outline:none;color:#fff;background:hsla(0,0%,100%,.2);border-radius:2px}.art-video-player .art-settings .art-setting-radio .art-radio-item.current button,.art-video-player .art-settings .art-setting-radio .art-radio-item button:active{background-color:#00a1d6}.art-video-player .art-settings .art-setting-range input{width:100%;height:3px;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:hsla(0,0%,100%,.5)}.art-video-player .art-settings .art-setting-checkbox{display:flex;align-items:center}.art-video-player .art-settings .art-setting-checkbox input{height:14px;width:14px;margin-right:5px}.art-video-player .art-settings .art-setting-upload{display:flex}.art-video-player .art-settings .art-setting-upload .art-upload-btn{width:80px;height:22px;line-height:22px;border:none;outline:none;color:#fff;background:hsla(0,0%,100%,.2);border-radius:2px;text-align:center}.art-video-player .art-settings .art-setting-upload .art-upload-value{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;height:22px;line-height:22px;padding-left:10px}.art-video-player.art-setting-show .art-setting-inner{opacity:1;visibility:visible;pointer-events:auto}.art-video-player .art-info{display:none;flex-direction:column;position:absolute;left:10px;top:10px;z-index:100;width:360px;padding:20px 20px 25px;border-radius:5px;color:#fff;font-size:12px;font-family:Noto Sans CJK SC DemiLight,Roboto,Segoe UI,Tahoma,Arial,Helvetica,sans-serif;-webkit-font-smoothing:antialiased;background-color:rgba(26,26,26,.96)}.art-video-player .art-info .art-info-title{margin-left:10px;margin-bottom:12px;font-size:16px;color:#fff}.art-video-player .art-info .hkvideo-ctxmenuhelp-list{font-size:14px}.art-video-player .art-info .hkvideo-ctxmenuhelp-list .hkvideo-ctxmenuhelp-item{padding:0 15px;height:32px;width:50%;line-height:32px;display:inline-block;border-radius:14px;margin-bottom:2px;color:#999;cursor:pointer;float:left}.art-video-player .art-info .hkvideo-ctxmenuhelp-list .hkvideo-ctxmenuhelp-item .menuhelp-label{color:#fff}.art-video-player .art-info .art-info-item{display:flex;margin-bottom:5px}.art-video-player .art-info .art-info-item .art-info-title{width:100px;text-align:right}.art-video-player .art-info .art-info-item .art-info-content{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-left:5px}.art-video-player .art-info .art-info-item:last-child{margin-bottom:0}.art-video-player .art-info .art-info-close{position:absolute;top:8px;right:8px;cursor:pointer}.art-video-player .art-info .art-info-close .hkplayer-close{fill:#fff;cursor:pointer}.art-video-player.art-info-show .art-info{display:flex}.art-video-player.art-hide-cursor *{cursor:none!important}.art-video-player[data-aspect-ratio] video{box-sizing:content-box;-o-object-fit:fill;object-fit:fill}.art-fullscreen-web,.art-video-player.art-fullscreen-web{position:fixed;z-index:9999;width:100%!important;height:100%!important;left:0;top:0;right:0;bottom:0;padding-top:0!important}.art-fullscreen-web .art-video-player{height:100%;padding:0}.art-fullscreen-web .art-container{height:100%}.art-fullscreen-rotate{position:fixed;z-index:9999;width:100%;height:100%;left:0;top:0;right:0;bottom:0;background:#000}.art-fullscreen .art-container{height:100%}.art-fullscreen .art-video-player{height:100%;padding:0}.art-video-player .art-mini-header{display:none;position:absolute;z-index:110;left:0;top:0;right:0;height:35px;line-height:35px;color:#fff;background:linear-gradient(180deg,rgba(0,0,0,.6),transparent);align-items:center;justify-content:space-between;opacity:0;visibility:hidden;transition:all .2s ease-in-out}.art-video-player .art-mini-header .art-mini-title{flex:1;padding:0 10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:move}.art-video-player .art-mini-header .art-mini-close{width:35px;height:35px;text-align:center;font-size:22px;cursor:pointer;padding:3px}.art-video-player .art-mini-header .art-mini-close svg{opacity:.8}.art-video-player .art-mini-header .art-mini-close svg:hover{opacity:1}.art-video-player.art-is-dragging{opacity:.7}.art-video-player.art-mini{position:fixed;z-index:9999;width:400px;height:225px;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 3px 6px 0 rgba(0,0,0,.2);padding-top:0!important}.art-video-player.art-mini .art-icon-state{display:block}.art-video-player.art-mini .hkplayer-close{fill:#fff}.art-video-player.art-mini .art-mini-header{display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.art-video-player.art-mini.art-hover .art-mini-header{opacity:1;visibility:visible}.art-video-player.art-mini .art-mask .art-state{display:inline-block;position:static;position:absolute;left:50%;top:50%;width:50px;height:50px;margin:-25px auto auto -25px}.art-video-player.art-mini .art-mask .art-state .art-icon-state{transform:scale(.4);width:88px;height:88px;overflow:hidden;margin-left:-19px;margin-top:-19px}.art-video-player.art-mini .art-contextmenu,.art-video-player.art-mini .art-danmu,.art-video-player.art-mini .art-info,.art-video-player.art-mini .art-notice,.art-video-player.art-mini .art-subtitle{display:none}.art-video-player.art-mini .art-bottom .art-progress{display:block;position:absolute;bottom:-2px;width:100%}.art-video-player.art-mini .art-bottom .art-progress .art-control-progress{height:8px;padding-top:0;padding-bottom:0}.art-video-player.art-mini .art-bottom .art-progress .art-control-progress:hover .art-control-progress-inner{height:50%}.art-video-player.art-mini .art-bottom .art-progress .art-control-progress .art-progress-indicator{top:-8px}.art-video-player.art-mini .art-control-time{position:absolute;bottom:2px;left:6px;padding:0;line-height:24px;height:24px}.art-video-player.art-mini .art-controls .art-control-next,.art-video-player.art-mini .art-controls .art-control-playAndPause,.art-video-player.art-mini .art-controls .art-control-volume,.art-video-player.art-mini .art-controls .art-controls-right{display:none}.art-video-player.art-mini .art-bottom{height:auto;background:none}.art-video-player .art-icon-state{display:none}.art-video-player .art-mini-mask{display:none;height:100%;width:100%;background-color:rgba(0,0,0,.2);z-index:100}.art-video-player.art-mini.art-hover .art-mini-mask{display:flex}.art-video-player[data-flip=horizontal] .art-video{transform:scaleX(-1)}.art-video-player[data-flip=vertical] .art-video{transform:scaleY(-1)}.art-video-player .art-layers .art-layer-log{display:none;position:absolute;left:10px;bottom:10px;width:120px;color:#fff;text-shadow:0 0 2px rgba(0,0,0,.5);background-color:rgba(0,0,0,.5);border-radius:3px;padding:5px;font-size:13px;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.art-video-player .art-layers .art-layer-log p{margin-bottom:0;word-break:break-all}.art-video-player .art-control-selector{position:relative}.art-video-player .art-control-selector .art-selector-list-wrap{display:none;padding-bottom:20px;position:absolute;z-index:200;left:50%;bottom:30px;transform:translateX(-50%)}.art-video-player .art-control-selector .art-selector-value{text-align:center;font-family:PingFangSC-Medium;font-size:16px;color:hsla(0,0%,100%,.8);letter-spacing:0;line-height:40px;font-weight:500;cursor:pointer;width:60px;height:40px;border-radius:3px;display:inline-block;vertical-align:middle}.art-video-player .art-control-selector .art-selector-value:hover{color:#fff}.art-video-player .art-control-selector .art-selector-list{padding:10px 15px;text-align:center;color:#fff;background:rgba(17,17,17,.7);border-radius:8px}.art-video-player .art-control-selector .art-selector-list:after{content:\"\";display:block;position:absolute;bottom:6px;left:50%;transform:translateX(-50%);width:0;height:0;border:7px solid transparent;border-top-color:rgba(17,17,17,.7)}.art-video-player .art-control-selector .art-selector-list .art-selector-item{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-left:29px;padding-right:26px;min-width:99px;position:relative;height:34px;line-height:34px;margin-top:7px;border-radius:17px;font-weight:400;font-size:14px;opacity:.8}.art-video-player .art-control-selector .art-selector-list .art-selector-item:hover{background-color:hsla(0,0%,100%,.1)}.art-video-player .art-control-selector .art-selector-list .art-selector-item svg{display:none;position:absolute;left:10px;top:10px}.art-video-player .art-control-selector .art-selector-list .art-selector-item .art-selector-item-name{pointer-events:none}.art-video-player .art-control-selector .art-selector-list .art-selector-item-active{color:#fff;background:hsla(0,0%,100%,.15);font-size:16px;font-weight:600;opacity:1}.art-video-player .art-control-selector .art-selector-list .art-selector-item-active svg,.art-video-player .art-control-selector:hover .art-selector-list-wrap{display:block}.art-video-player .art-control-quality .art-selector-dash{width:160px}:root{--balloon-color:rgba(0,0,0,0.8);--balloon-font-size:12px;--balloon-move:4px}button[aria-label][data-balloon-pos]{overflow:visible}[aria-label][data-balloon-pos]{position:relative;cursor:pointer}[aria-label][data-balloon-pos]:after{text-indent:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;font-weight:400;font-style:normal;text-shadow:none;font-size:12px;background:rgba(17,17,17,.7);border-radius:8px;color:#fff;content:attr(aria-label);padding:.5em 1em;white-space:nowrap;line-height:1.2}[aria-label][data-balloon-pos]:after,[aria-label][data-balloon-pos]:before{opacity:0;pointer-events:none;transition:all .18s ease-out .18s;position:absolute;z-index:10}[aria-label][data-balloon-pos]:before{width:0;height:0;content:\"\"}[aria-label][data-balloon-pos]:hover:after,[aria-label][data-balloon-pos]:hover:before{opacity:1;pointer-events:none}[aria-label][data-balloon-pos][data-balloon-pos=up]:after{margin-bottom:10px}[aria-label][data-balloon-pos][data-balloon-pos=up]:after,[aria-label][data-balloon-pos][data-balloon-pos=up]:before{bottom:100%;left:50%;transform:translate(-50%,4px);transform-origin:top}[aria-label][data-balloon-pos][data-balloon-pos=up]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=up]:hover:before{transform:translate(-50%)}.small-control .art-bottom{height:39px}.small-control .art-bottom .art-progress .art-control-progress{height:6px;padding-top:1px;padding-bottom:1px}.small-control .art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{width:14px;height:14px}.small-control .art-bottom .art-controls{margin-top:0;height:auto}.small-control .art-bottom .art-controls .art-control{height:33px;line-height:33px;min-width:37px}.small-control .art-bottom .art-controls .art-controls-left .art-control-time{font-size:14px;margin-left:5px}.small-control .art-bottom .art-controls .art-controls-left .art-control-playAndPause:after{left:22px;margin-bottom:2px}.small-control .art-bottom .art-controls .art-controls-right .art-control,.small-control .art-bottom .art-controls .art-controls-right .art-control-playrate{margin-right:0}.small-control .art-bottom .art-controls .art-controls-right .art-control-selector .art-selector-value{font-size:14px;height:33px;line-height:33px;width:40px}.small-control .art-bottom .art-controls .art-controls-right .art-control-selector .art-selector-value:hover{color:#fff}.small-control .art-bottom .art-controls .art-controls-right .art-control-selector .art-selector-list-wrap{padding-bottom:10px;width:120px}.small-control .art-bottom .art-controls .art-controls-right .art-control-selector .art-selector-list-wrap .art-selector-list{padding:8px}.small-control .art-bottom .art-controls .art-controls-right .art-control-selector .art-selector-list-wrap .art-selector-list .art-selector-item{height:26px;line-height:26px;min-width:89px;margin-top:4px}.small-control .art-bottom .art-controls .art-controls-right .art-control-selector .art-selector-list-wrap .art-selector-list .art-selector-item svg{left:12px;top:7px}.small-control .art-bottom .art-controls .art-controls-right .art-control-selector .art-selector-list-wrap .art-selector-list .art-selector-item:first-child{margin-top:0}.small-control .art-bottom .art-controls .art-controls-right .art-control-selector .art-selector-list-wrap .art-selector-list:after{bottom:-4px}.small-control .art-bottom .art-controls .art-controls-right .art-control-fullscreen .art-icon{width:20px;height:16px;margin-left:6px;margin-top:8px}.small-control .art-bottom .art-controls .art-controls-right .art-control-fullscreen:after{margin-bottom:2px;left:10px}.small-control .art-bottom .art-controls .art-controls-right .art-control-pip:after{margin-bottom:2px}.small-control .art-bottom .art-controls .art-controls-right .art-control-volume{position:relative}.small-control .art-bottom .art-controls .art-controls-right .art-control-volume .art-animation-volume{padding:4px 4.5px 5px}.small-control .art-bottom .art-controls .art-controls-right .art-control-volume .art-volume-hover-area{width:40px;bottom:23px;left:-1px;height:121px}.small-control .art-bottom .art-controls .art-controls-right .art-control-volume .art-volume-hover-area .art-volume-panel-wrap{width:40px;height:109px}.small-control .art-bottom .art-controls .art-controls-right .art-control-volume .art-volume-hover-area .art-volume-panel-wrap .art-volume-panel{width:40px;height:71px}.small-control .art-bottom .art-controls .art-controls-right .art-control-volume .art-volume-hover-area .art-volume-panel-wrap .art-volume-panel .art-volume-top-bottom,.small-control .art-bottom .art-controls .art-controls-right .art-control-volume .art-volume-hover-area .art-volume-panel-wrap .art-volume-panel .art-volume-top-bottom .art-volume-top{height:70px}.small-control .art-bottom .art-controls .art-controls-right .art-control-volume .art-volume-hover-area .art-volume-panel-wrap:after{border:7px solid transparent;border-top-color:rgba(17,17,17,.7);bottom:-14px}.small-control .art-bottom .art-controls .art-controls-right .art-icon-volumeClose{width:37px;height:33px;padding:8px 8.5px 9px}.small-control .art-bottom .art-controls .art-controls-right .art-control-pip i{width:20px;height:16px;margin-left:6px;margin-top:8px}</style><link id=\"css_skin\" href=\"//tb1.bdstatic.com/tb/cms/common/tbskin/skins/skin_normal.css?v=\" rel=\"stylesheet\"><script type=\"text/javascript\" src=\"https://cpro.baidustatic.com/js/m.js\"></script><script type=\"text/javascript\" src=\"//tb1.bdstatic.com/tb/static-common/component/commonLogic/common/common_default_merger.js?v=18.8\"></script><script type=\"text/javascript\" src=\"//tb1.bdstatic.com/tb/static-common/component/commonLogic/common/crosspage_msg_system/MsgSystem.js?v=18.8\"></script><link rel=\"stylesheet\" href=\"//tb5.bdstatic.com/tb/pc/common-bawu-report/1.0.10/css/report-start-dialog.css\"><script src=\"//tb5.bdstatic.com/tb/pc/common-bawu-report/1.0.10/report-start-dialog.umd.js\"></script><script src=\"//tb5.bdstatic.com/tb/pc/common-bawu-report/1.0.10/report-dialog.umd.js\"></script><script src=\"//tb5.bdstatic.com/tb/pc/common-bawu-report/1.0.10/interflow-dialog.umd.js\"></script><link rel=\"stylesheet\" href=\"//tb5.bdstatic.com/tb/pc/common-bawu-report/1.0.10/css/report-dialog.css\"><link rel=\"stylesheet\" href=\"//tb5.bdstatic.com/tb/pc/common-bawu-report/1.0.10/css/interflow-dialog.css\"><script type=\"text/javascript\" src=\"//tb1.bdstatic.com/tb/static-common/component/commonLogic/common/user_message/UserMessage.js?v=18.8\"></script><script src=\"https://gsp0.baidu.com/9bMYfHSm2Q5IlBGlnYG/tieba?word=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;sec_dir=%E7%BB%BC%E5%90%88%E4%BD%93%E8%82%B2&amp;srcid=1452&amp;callback=bd__cbs__f10fa6af\" type=\"text/javascript\" async=\"\"></script><style>/* html, body {\n    position: relative;\n    width: 100%;\n    height: 100%;\n}\n\nbody {\n    color: #333;\n    margin: 0;\n    padding: 8px;\n    box-sizing: border-box;\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n} */\n\n.mediago-ad-wrapper a {\n    color: rgb(0, 100, 200);\n    text-decoration: none;\n}\n\n.mediago-ad-wrapper a:hover {\n    text-decoration: underline;\n}\n\n.mediago-ad-wrapper a:visited {\n    color: rgb(0, 80, 160);\n}\n\n.mediago-ad-wrapper label {\n    display: block;\n}\n\n.mediago-ad-wrapper input,\n.mediago-ad-wrapper button,\n.mediago-ad-wrapper select,\n.mediago-ad-wrapper textarea {\n    font-family: inherit;\n    font-size: inherit;\n    -webkit-padding: 0.4em 0;\n    padding: 0.4em;\n    margin: 0 0 0.5em 0;\n    box-sizing: border-box;\n    border: 1px solid #ccc;\n    border-radius: 2px;\n}\n\n.mediago-ad-wrapper input:disabled {\n    color: #ccc;\n}\n\n.mediago-ad-wrapper button {\n    color: #333;\n    background-color: #f4f4f4;\n    outline: none;\n}\n\n.mediago-ad-wrapper button:disabled {\n    color: #999;\n}\n\n.mediago-ad-wrapper button:not(:disabled):active {\n    background-color: #ddd;\n}\n\n.mediago-ad-wrapper button:focus {\n    border-color: #666;\n}\n</style><style>.mediago-ad-pb-751-wrapper.svelte-1js710s.svelte-1js710s{text-align:center;width:738px;background:#ffffff;border-bottom:1px solid #e5e5e5;border-left:1px solid #e5e5e5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;font-size:0px}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-userInfo.svelte-1js710s{display:inline-block;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:130px;background:#fafbfc;vertical-align:top}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-userInfo .mediago-header.svelte-1js710s{width:88px;height:88px;margin:auto;margin-top:20px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #cccccc}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-userInfo .mediago-header img.svelte-1js710s{width:80px;height:80px;margin:auto;margin-top:3px}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-userInfo .mediago-nickName.svelte-1js710s{margin:auto;margin-top:24px;width:90%;text-align:center;font-size:12px;color:#2d64b3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;line-height:12px}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-content.svelte-1js710s{display:inline-block;width:608px;height:100%;padding-left:20px;position:relative;vertical-align:top;-webkit-box-sizing:border-box;box-sizing:border-box}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-content .mediago-title.svelte-1js710s{width:568px;font-size:14px;color:#3066b4;letter-spacing:0;text-align:justify;line-height:18px;margin-top:30px}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-content .mediago-desc.svelte-1js710s{width:568px;font-size:12px;color:#3066b4;letter-spacing:0;text-align:justify;line-height:18px;margin-top:6px}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-content .mediago-checkBtn.svelte-1js710s{margin-top:12px;width:64px;height:28px;line-height:28px;border:1px solid #3066b4;border-radius:2px;font-size:12px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;font-weight:400;text-align:center}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-content .mediago-img.svelte-1js710s{display:block;margin-top:12px;margin-bottom:40px;width:290px;height:auto;background-position:center;background-repeat:no-repeat}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-close.svelte-1js710s{cursor:pointer;position:absolute;bottom:16px;right:6px;width:10px;height:10px;background:url(https://mediago-static.cdn.bcebos.com/assets/images/icon-close10.png) no-repeat center;background-size:contain}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-dislikeReason.svelte-1js710s{cursor:pointer;width:60px;background:rgba(0, 0, 0, 0.5);border-radius:2px;position:absolute;bottom:34px;right:6px;font-size:12px;color:white;padding:5px 0;line-height:12px}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-dislikeReason div.svelte-1js710s{padding:5px 0px}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-dislikeReason .svelte-1js710s:hover{text-decoration:underline}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-footer.svelte-1js710s{position:absolute;bottom:16px;right:20px;height:12px}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-footer .mediago-date.svelte-1js710s{width:102px;height:12px;font-size:12px;color:#999999;line-height:12px}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-footer .mediago-ad.svelte-1js710s{width:24px;height:12px;font-size:12px;color:#999999;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;line-height:12px;margin-left:6px}</style><style>.mediago-ad-pb-751-4-wrapper.svelte-mbrgci.svelte-mbrgci{text-align:center;width:738px;background:#ffffff;border-bottom:1px solid #e5e5e5;border-left:1px solid #e5e5e5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;font-size:0px}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-userInfo.svelte-mbrgci{display:inline-block;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:130px;background:#fafbfc;vertical-align:top}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-userInfo .mediago-header.svelte-mbrgci{width:88px;height:88px;margin:auto;margin-top:20px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #cccccc}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-userInfo .mediago-header img.svelte-mbrgci{width:80px;height:80px;margin:auto;margin-top:3px}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-userInfo .mediago-nickName.svelte-mbrgci{margin:auto;margin-top:24px;width:90%;text-align:center;font-size:12px;color:#2d64b3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;line-height:12px}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-content.svelte-mbrgci{display:inline-block;width:608px;height:100%;padding-left:20px;position:relative;vertical-align:top;-webkit-box-sizing:border-box;box-sizing:border-box}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-content .mediago-title.svelte-mbrgci{width:568px;font-size:14px;color:#3066b4;letter-spacing:0;text-align:justify;line-height:18px;margin-top:30px}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-content .mediago-desc.svelte-mbrgci{width:568px;font-size:12px;color:#3066b4;letter-spacing:0;text-align:justify;line-height:18px;margin-top:6px}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-content .mediago-checkBtn.svelte-mbrgci{margin-top:12px;width:64px;height:28px;line-height:28px;border:1px solid #3066b4;border-radius:2px;font-size:12px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;font-weight:400;text-align:center}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-content .mediago-img-line.svelte-mbrgci{display:block;margin-top:12px;margin-bottom:40px;height:auto;text-align:left}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-content .mediago-img.svelte-mbrgci{display:inline-block;margin-right:8px;width:100px;height:100px;background-position:center;background-repeat:no-repeat}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-close.svelte-mbrgci{cursor:pointer;position:absolute;bottom:16px;right:6px;width:10px;height:10px;background:url(https://mediago-static.cdn.bcebos.com/assets/images/icon-close10.png) no-repeat center;background-size:contain}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-dislikeReason.svelte-mbrgci{cursor:pointer;width:60px;background:rgba(0, 0, 0, 0.5);border-radius:2px;position:absolute;bottom:34px;right:6px;font-size:12px;color:white;padding:5px 0;line-height:12px}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-dislikeReason div.svelte-mbrgci{padding:5px 0px}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-dislikeReason .svelte-mbrgci:hover{text-decoration:underline}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-footer.svelte-mbrgci{position:absolute;bottom:16px;right:20px;height:12px}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-footer .mediago-date.svelte-mbrgci{width:102px;height:12px;font-size:12px;color:#999999;line-height:12px}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-footer .mediago-ad.svelte-mbrgci{width:24px;height:12px;font-size:12px;color:#999999;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;line-height:12px;margin-left:6px}</style><style>.mediago-ad-pb-751-4-wrapper.svelte-3aadk2.svelte-3aadk2{text-align:center;width:738px;background:#ffffff;border-bottom:1px solid #e5e5e5;border-left:1px solid #e5e5e5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;font-size:0px}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-userInfo.svelte-3aadk2{display:inline-block;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:130px;background:#fafbfc;vertical-align:top}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-userInfo .mediago-header.svelte-3aadk2{width:88px;height:88px;margin:auto;margin-top:20px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #cccccc}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-userInfo .mediago-header img.svelte-3aadk2{width:80px;height:80px;margin:auto;margin-top:3px}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-userInfo .mediago-nickName.svelte-3aadk2{margin:auto;margin-top:24px;width:90%;text-align:center;font-size:12px;color:#2d64b3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;line-height:12px}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-content.svelte-3aadk2{display:inline-block;width:608px;height:100%;padding-left:20px;position:relative;vertical-align:top;-webkit-box-sizing:border-box;box-sizing:border-box}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-content .mediago-title.svelte-3aadk2{width:568px;font-size:14px;color:#3066b4;letter-spacing:0;text-align:justify;line-height:18px;margin-top:30px}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-content .mediago-desc.svelte-3aadk2{width:568px;font-size:12px;color:#3066b4;letter-spacing:0;text-align:justify;line-height:18px;margin-top:6px}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-content .mediago-checkBtn.svelte-3aadk2{margin-top:12px;width:64px;height:28px;line-height:28px;border:1px solid #3066b4;border-radius:2px;font-size:12px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;font-weight:400;text-align:center}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-content .mediago-img-line.svelte-3aadk2{display:block;margin-top:12px;margin-bottom:40px;height:auto;text-align:left}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-content .mediago-img.svelte-3aadk2{display:inline-block;margin-right:8px;width:186px;height:186px;background-position:center;background-repeat:no-repeat}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-close.svelte-3aadk2{cursor:pointer;position:absolute;bottom:16px;right:6px;width:10px;height:10px;background:url(https://mediago-static.cdn.bcebos.com/assets/images/icon-close10.png) no-repeat center;background-size:contain}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-dislikeReason.svelte-3aadk2{cursor:pointer;width:60px;background:rgba(0, 0, 0, 0.5);border-radius:2px;position:absolute;bottom:34px;right:6px;font-size:12px;color:white;padding:5px 0;line-height:12px}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-dislikeReason div.svelte-3aadk2{padding:5px 0px}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-dislikeReason .svelte-3aadk2:hover{text-decoration:underline}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-footer.svelte-3aadk2{position:absolute;bottom:16px;right:20px;height:12px}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-footer .mediago-date.svelte-3aadk2{width:102px;height:12px;font-size:12px;color:#999999;line-height:12px}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-footer .mediago-ad.svelte-3aadk2{width:24px;height:12px;font-size:12px;color:#999999;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;line-height:12px;margin-left:6px}</style><style>.mediago-ad-pb-751-video-wrapper.svelte-s6he8h.svelte-s6he8h{text-align:center;width:738px;background:#ffffff;border-bottom:1px solid #e5e5e5;border-left:1px solid #e5e5e5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;font-size:0px}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-userInfo.svelte-s6he8h{display:inline-block;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:130px;background:#fafbfc;vertical-align:top}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-userInfo .mediago-header.svelte-s6he8h{width:88px;height:88px;margin:auto;margin-top:20px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #cccccc}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-userInfo .mediago-header img.svelte-s6he8h{width:80px;height:80px;margin:auto;margin-top:3px}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-userInfo .mediago-nickName.svelte-s6he8h{margin:auto;margin-top:24px;width:90%;text-align:center;font-size:12px;color:#2d64b3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;line-height:12px}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-content.svelte-s6he8h{display:inline-block;width:608px;height:100%;padding-left:20px;position:relative;vertical-align:top;-webkit-box-sizing:border-box;box-sizing:border-box}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-content .mediago-title.svelte-s6he8h{width:568px;font-size:14px;color:#3066b4;letter-spacing:0;text-align:justify;line-height:18px;margin-top:30px}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-content .mediago-desc.svelte-s6he8h{width:568px;font-size:12px;color:#3066b4;letter-spacing:0;text-align:justify;line-height:18px;margin-top:6px}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-content .mediago-checkBtn.svelte-s6he8h{margin-top:12px;width:64px;height:28px;line-height:28px;border:1px solid #3066b4;border-radius:2px;font-size:12px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;font-weight:400;text-align:center}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-content .mediago-video.svelte-s6he8h{position:relative;display:block;width:290px;height:auto;max-height:290px;overflow:hidden;margin-top:12px;margin-bottom:40px}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-content .mediago-video video.svelte-s6he8h{position:relative;display:block;width:100%;height:100%;margin:auto}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-content .mediago-video .bgImg.svelte-s6he8h{position:absolute;top:0;left:0;display:block;width:100%;height:100%;margin:auto}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-content .mediago-video .mediago-volume.svelte-s6he8h{position:absolute;bottom:8px;right:8px;width:18px;height:18px}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-content .mediago-play-btn.svelte-s6he8h{position:absolute;left:50%;top:50%;width:55px;height:55px;background:url(https://tb2.bdstatic.com/tb/img/video_play_btn_hover_7a1975f.png) no-repeat center;background-size:contain;position:absolute;-webkit-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);transform:translate(-50%, -50%)}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-close.svelte-s6he8h{cursor:pointer;position:absolute;bottom:16px;right:6px;width:10px;height:10px;background:url(https://mediago-static.cdn.bcebos.com/assets/images/icon-close10.png) no-repeat center;background-size:contain}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-dislikeReason.svelte-s6he8h{cursor:pointer;width:60px;background:rgba(0, 0, 0, 0.5);border-radius:2px;position:absolute;bottom:34px;right:6px;font-size:12px;color:white;padding:5px 0;line-height:12px}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-dislikeReason div.svelte-s6he8h{padding:5px 0px}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-dislikeReason .svelte-s6he8h:hover{text-decoration:underline}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-footer.svelte-s6he8h{position:absolute;bottom:16px;right:20px;height:12px}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-footer .mediago-date.svelte-s6he8h{width:102px;height:12px;font-size:12px;color:#999999;line-height:12px}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-footer .mediago-ad.svelte-s6he8h{width:24px;height:12px;font-size:12px;color:#999999;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;line-height:12px;margin-left:6px}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h img.svelte-s6he8h{width:100%;height:100%}</style><style>.mediago-ad-pb-751-left-wrapper.svelte-jhowbw.svelte-jhowbw{text-align:center;width:738px;min-height:180px;background:#ffffff;border-bottom:1px solid #e5e5e5;border-left:1px solid #e5e5e5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;font-size:0px}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-userInfo.svelte-jhowbw{display:inline-block;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:130px;background:#fafbfc;vertical-align:top}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-userInfo .mediago-header.svelte-jhowbw{width:88px;height:88px;margin:auto;margin-top:20px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #cccccc}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-userInfo .mediago-header img.svelte-jhowbw{width:80px;height:80px;margin:auto;margin-top:3px}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-userInfo .mediago-nickName.svelte-jhowbw{margin:auto;margin-top:24px;width:90%;text-align:center;font-size:12px;color:#2d64b3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;line-height:12px}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-content.svelte-jhowbw{display:inline-block;width:608px;height:100%;padding-left:20px;position:relative;vertical-align:top;-webkit-box-sizing:border-box;box-sizing:border-box}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-content .mediago-left.svelte-jhowbw{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:30px;margin-bottom:40px}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-content .mediago-img.svelte-jhowbw{display:inline-block;width:140px;height:78px}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-content .mediago-right.svelte-jhowbw{display:inline-block;margin-left:12px}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-content .mediago-title.svelte-jhowbw{display:inline-block;width:420px;font-size:14px;color:#3066b4;letter-spacing:0;text-align:left;line-height:18px}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-content .mediago-desc.svelte-jhowbw{width:420px;font-size:12px;color:#3066b4;letter-spacing:0;text-align:left;line-height:16px;margin-top:8px}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-content .mediago-checkBtn.svelte-jhowbw{margin-top:12px;width:64px;height:28px;line-height:28px;border:1px solid #3066b4;border-radius:2px;font-size:12px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;font-weight:400;text-align:center}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-close.svelte-jhowbw{cursor:pointer;position:absolute;bottom:16px;right:6px;width:10px;height:10px;background:url(https://mediago-static.cdn.bcebos.com/assets/images/icon-close10.png) no-repeat center;background-size:contain}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-dislikeReason.svelte-jhowbw{cursor:pointer;width:60px;background:rgba(0, 0, 0, 0.5);border-radius:2px;position:absolute;bottom:34px;right:6px;font-size:12px;color:white;padding:5px 0;line-height:12px}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-dislikeReason div.svelte-jhowbw{padding:5px 0px}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-dislikeReason .svelte-jhowbw:hover{text-decoration:underline}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-footer.svelte-jhowbw{position:absolute;bottom:16px;right:20px;height:12px}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-footer .mediago-date.svelte-jhowbw{width:102px;height:12px;font-size:12px;color:#999999;line-height:12px}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-footer .mediago-ad.svelte-jhowbw{width:24px;height:12px;font-size:12px;color:#999999;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;line-height:12px;margin-left:6px}</style><style>.mediago-ad-frs-751-wrapper.svelte-l6akol.svelte-l6akol{position:relative;text-align:center;width:737px;background:#ffffff;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #e5e5e5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-bottom:15px;font-size:0px}.mediago-ad-frs-751-wrapper.svelte-l6akol.svelte-l6akol:hover{background-color:#f7f9fc}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-reply.svelte-l6akol,.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-content.svelte-l6akol,.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-mid.svelte-l6akol,.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-right.svelte-l6akol{display:inline-block;height:auto;vertical-align:top}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-reply.svelte-l6akol{width:90px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-top:10px}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-reply .mediago-reply-num.svelte-l6akol{width:50px;height:30px;line-height:26px;margin:auto;display:block;color:#333;font-size:12px;text-align:center;background:url(http://tb2.bdstatic.com/tb/static-hottopic/img/f_reply_bg_89030dc.png) no-repeat}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-content.svelte-l6akol{width:647px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;padding-top:12px}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-content .mediago-title.svelte-l6akol{width:450px;font-size:14px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:14px}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-content .mediago-desc.svelte-l6akol{width:420px;font-size:12px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:12px;margin-top:14px}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-content .mediago-checkBtn.svelte-l6akol{margin-top:12px;width:64px;height:28px;line-height:28px;border:1px solid #3066b4;border-radius:2px;font-size:12px;color:#3066b4;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;font-weight:400}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-content .mediago-img.svelte-l6akol{display:block;margin-top:12px;width:290px;height:auto;background-position:center;background-repeat:no-repeat}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-content .mediago-mid.svelte-l6akol{width:465px}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-content .mediago-right.svelte-l6akol{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:182px}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-userInfo.svelte-l6akol,.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-header.svelte-l6akol,.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-adName.svelte-l6akol,.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-ad.svelte-l6akol{display:inline-block;vertical-align:top}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-userInfo.svelte-l6akol{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-userInfo .mediago-header.svelte-l6akol{font-size:12px;height:20px;line-height:1;background:transparent url(http://tb2.bdstatic.com/tb/img/icon_author_112d0bd.png?__sprite=) no-repeat 4px 0px;padding:0px 0 0 25px;overflow:hidden;display:inline-block}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-userInfo .mediago-adName.svelte-l6akol{width:66px;font-size:12px;color:#a3a3a3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:20px;margin-right:45px}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-ad.svelte-l6akol{width:24px;height:20px;line-height:21px;font-size:12px;color:#a3a3a3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;margin-right:20px}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-close.svelte-l6akol{cursor:pointer;position:absolute;top:17px;right:6px;width:10px;height:10px;background:url(https://mediago-static.cdn.bcebos.com/assets/images/icon-close10.png) no-repeat center;background-size:contain}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-dislikeReason.svelte-l6akol{cursor:pointer;width:60px;background:rgba(0, 0, 0, 0.5);border-radius:2px;position:absolute;top:41px;right:7px;font-size:12px;color:white;padding:5px 0;line-height:12px}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-dislikeReason div.svelte-l6akol{padding:5px 0px}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-dislikeReason .svelte-l6akol:hover{text-decoration:underline}</style><style>.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl.svelte-1pzpydl{position:relative;text-align:center;width:737px;min-height:120px;background:#ffffff;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #e5e5e5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-bottom:15px;font-size:0px}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl.svelte-1pzpydl:hover{background-color:#f7f9fc}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-reply.svelte-1pzpydl,.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-content.svelte-1pzpydl,.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-mid.svelte-1pzpydl,.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-right.svelte-1pzpydl{display:inline-block;height:auto;vertical-align:top}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-reply.svelte-1pzpydl{width:90px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-top:10px}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-reply .mediago-reply-num.svelte-1pzpydl{width:50px;height:30px;line-height:26px;margin:auto;display:block;color:#333;font-size:12px;text-align:center;background:url(http://tb2.bdstatic.com/tb/static-hottopic/img/f_reply_bg_89030dc.png) no-repeat}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-content.svelte-1pzpydl{width:647px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;padding-top:12px}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-content .mediago-mid.svelte-1pzpydl{width:465px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-content .mediago-mid .mediago-img.svelte-1pzpydl{display:inline-block;width:140px;height:78px}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-content .mediago-mid .mediago-text.svelte-1pzpydl{display:inline-block;margin-left:12px}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-content .mediago-mid .mediago-text .mediago-title.svelte-1pzpydl{width:310px;font-size:14px;color:#3066b4;letter-spacing:0;line-height:18px;text-align:left}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-content .mediago-mid .mediago-text .mediago-desc.svelte-1pzpydl{width:310px;font-size:12px;color:#3066b4;letter-spacing:0;line-height:16px;margin-top:8px;text-align:left}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-content .mediago-mid .mediago-text .mediago-checkBtn.svelte-1pzpydl{margin-top:12px;width:64px;height:28px;line-height:28px;border:1px solid #3066b4;border-radius:2px;font-size:12px;color:#3066b4;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;font-weight:400}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-content .mediago-right.svelte-1pzpydl{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:182px}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-userInfo.svelte-1pzpydl,.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-header.svelte-1pzpydl,.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-adName.svelte-1pzpydl,.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-ad.svelte-1pzpydl{display:inline-block;vertical-align:top}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-userInfo.svelte-1pzpydl{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-userInfo .mediago-header.svelte-1pzpydl{font-size:12px;height:20px;line-height:1;background:transparent url(http://tb2.bdstatic.com/tb/img/icon_author_112d0bd.png?__sprite=) no-repeat 4px 0px;padding:0px 0 0 25px;overflow:hidden;display:inline-block}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-userInfo .mediago-adName.svelte-1pzpydl{width:66px;font-size:12px;color:#a3a3a3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:20px;margin-right:45px}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-ad.svelte-1pzpydl{width:24px;height:20px;line-height:21px;font-size:12px;color:#a3a3a3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;margin-right:20px}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-close.svelte-1pzpydl{cursor:pointer;position:absolute;top:17px;right:6px;width:10px;height:10px;background:url(https://mediago-static.cdn.bcebos.com/assets/images/icon-close10.png) no-repeat center;background-size:contain}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-dislikeReason.svelte-1pzpydl{cursor:pointer;width:60px;background:rgba(0, 0, 0, 0.5);border-radius:2px;position:absolute;top:41px;right:7px;font-size:12px;color:white;padding:5px 0;line-height:12px}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-dislikeReason div.svelte-1pzpydl{padding:5px 0px}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-dislikeReason .svelte-1pzpydl:hover{text-decoration:underline}</style><style>.mediago-ad-frs-751-4-wrapper.svelte-e5pf92.svelte-e5pf92{position:relative;text-align:center;width:737px;background:#ffffff;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #e5e5e5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-bottom:15px;font-size:0px}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92.svelte-e5pf92:hover{background-color:#f7f9fc}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-reply.svelte-e5pf92,.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-content.svelte-e5pf92,.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-mid.svelte-e5pf92,.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-right.svelte-e5pf92{display:inline-block;height:auto;vertical-align:top}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-reply.svelte-e5pf92{width:90px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-top:10px}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-reply .mediago-reply-num.svelte-e5pf92{width:50px;height:30px;line-height:26px;margin:auto;display:block;color:#333;font-size:12px;text-align:center;background:url(http://tb2.bdstatic.com/tb/static-hottopic/img/f_reply_bg_89030dc.png) no-repeat}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-content.svelte-e5pf92{width:647px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;padding-top:12px}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-content .mediago-title.svelte-e5pf92{width:450px;font-size:14px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:14px}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-content .mediago-desc.svelte-e5pf92{width:420px;font-size:12px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:12px;margin-top:14px}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-content .mediago-checkBtn.svelte-e5pf92{margin-top:12px;width:64px;height:28px;line-height:28px;border:1px solid #3066b4;border-radius:2px;font-size:12px;color:#3066b4;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;font-weight:400}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-content .mediago-img-line.svelte-e5pf92{display:block;margin-top:12px;height:auto;text-align:left}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-content .mediago-img.svelte-e5pf92{display:inline-block;margin-right:8px;width:100px;height:100px;background-position:center;background-repeat:no-repeat}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-content .mediago-mid.svelte-e5pf92{width:465px}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-content .mediago-right.svelte-e5pf92{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:182px}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-userInfo.svelte-e5pf92,.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-header.svelte-e5pf92,.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-adName.svelte-e5pf92,.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-ad.svelte-e5pf92{display:inline-block;vertical-align:top}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-userInfo.svelte-e5pf92{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-userInfo .mediago-header.svelte-e5pf92{font-size:12px;height:20px;line-height:1;background:transparent url(http://tb2.bdstatic.com/tb/img/icon_author_112d0bd.png?__sprite=) no-repeat 4px 0px;padding:0px 0 0 25px;overflow:hidden;display:inline-block}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-userInfo .mediago-adName.svelte-e5pf92{width:66px;font-size:12px;color:#a3a3a3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:20px;margin-right:45px}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-ad.svelte-e5pf92{width:24px;height:20px;line-height:21px;font-size:12px;color:#a3a3a3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;margin-right:20px}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-close.svelte-e5pf92{cursor:pointer;position:absolute;top:17px;right:6px;width:10px;height:10px;background:url(https://mediago-static.cdn.bcebos.com/assets/images/icon-close10.png) no-repeat center;background-size:contain}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-dislikeReason.svelte-e5pf92{cursor:pointer;width:60px;background:rgba(0, 0, 0, 0.5);border-radius:2px;position:absolute;top:41px;right:7px;font-size:12px;color:white;padding:5px 0;line-height:12px}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-dislikeReason div.svelte-e5pf92{padding:5px 0px}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-dislikeReason .svelte-e5pf92:hover{text-decoration:underline}</style><style>.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8.svelte-1wtw7m8{position:relative;text-align:center;width:737px;background:#ffffff;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #e5e5e5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-bottom:15px;font-size:0px}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8.svelte-1wtw7m8:hover{background-color:#f7f9fc}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-reply.svelte-1wtw7m8,.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-content.svelte-1wtw7m8,.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-mid.svelte-1wtw7m8,.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-right.svelte-1wtw7m8{display:inline-block;height:auto;vertical-align:top}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-reply.svelte-1wtw7m8{width:90px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-top:10px}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-reply .mediago-reply-num.svelte-1wtw7m8{width:50px;height:30px;line-height:26px;margin:auto;display:block;color:#333;font-size:12px;text-align:center;background:url(http://tb2.bdstatic.com/tb/static-hottopic/img/f_reply_bg_89030dc.png) no-repeat}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-content.svelte-1wtw7m8{width:647px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;padding-top:12px}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-content .mediago-title.svelte-1wtw7m8{width:450px;font-size:14px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:14px}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-content .mediago-desc.svelte-1wtw7m8{width:420px;font-size:12px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:12px;margin-top:14px}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-content .mediago-checkBtn.svelte-1wtw7m8{margin-top:12px;width:64px;height:28px;line-height:28px;border:1px solid #3066b4;border-radius:2px;font-size:12px;color:#3066b4;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;font-weight:400}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-content .mediago-img-line.svelte-1wtw7m8{display:block;margin-top:12px;width:600px;height:auto;text-align:left}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-content .mediago-img.svelte-1wtw7m8{display:inline-block;margin-right:10px;width:186px;height:186px;background-position:center;background-repeat:no-repeat}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-content .mediago-mid.svelte-1wtw7m8{width:465px}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-content .mediago-right.svelte-1wtw7m8{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:182px}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-userInfo.svelte-1wtw7m8,.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-header.svelte-1wtw7m8,.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-adName.svelte-1wtw7m8,.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-ad.svelte-1wtw7m8{display:inline-block;vertical-align:top}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-userInfo.svelte-1wtw7m8{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-userInfo .mediago-header.svelte-1wtw7m8{font-size:12px;height:20px;line-height:1;background:transparent url(http://tb2.bdstatic.com/tb/img/icon_author_112d0bd.png?__sprite=) no-repeat 4px 0px;padding:0px 0 0 25px;overflow:hidden;display:inline-block}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-userInfo .mediago-adName.svelte-1wtw7m8{width:66px;font-size:12px;color:#a3a3a3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:20px;margin-right:45px}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-ad.svelte-1wtw7m8{width:24px;height:20px;line-height:21px;font-size:12px;color:#a3a3a3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;margin-right:20px}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-close.svelte-1wtw7m8{cursor:pointer;position:absolute;top:17px;right:6px;width:10px;height:10px;background:url(https://mediago-static.cdn.bcebos.com/assets/images/icon-close10.png) no-repeat center;background-size:contain}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-dislikeReason.svelte-1wtw7m8{cursor:pointer;width:60px;background:rgba(0, 0, 0, 0.5);border-radius:2px;position:absolute;top:41px;right:7px;font-size:12px;color:white;padding:5px 0;line-height:12px}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-dislikeReason div.svelte-1wtw7m8{padding:5px 0px}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-dislikeReason .svelte-1wtw7m8:hover{text-decoration:underline}</style><style>.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31.svelte-1nyxj31{position:relative;text-align:center;width:737px;background:#ffffff;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #e5e5e5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-bottom:15px;font-size:0px}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31.svelte-1nyxj31:hover{background-color:#f7f9fc}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-reply.svelte-1nyxj31,.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-content.svelte-1nyxj31,.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-mid.svelte-1nyxj31,.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-right.svelte-1nyxj31{display:inline-block;height:auto;vertical-align:top}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-reply.svelte-1nyxj31{width:90px;margin-top:10px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-reply .mediago-reply-num.svelte-1nyxj31{width:50px;height:30px;line-height:26px;margin:auto;display:block;color:#333;font-size:12px;text-align:center;background:url(http://tb2.bdstatic.com/tb/static-hottopic/img/f_reply_bg_89030dc.png) no-repeat}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-content.svelte-1nyxj31{width:647px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-top:12px}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-content .mediago-title.svelte-1nyxj31{width:450px;font-size:14px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:14px}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-content .mediago-desc.svelte-1nyxj31{width:420px;font-size:12px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:12px;margin-top:14px}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-content .mediago-checkBtn.svelte-1nyxj31{margin-top:12px;width:64px;height:28px;line-height:28px;border:1px solid #3066b4;border-radius:2px;font-size:12px;color:#3066b4;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;font-weight:400}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-content .mediago-video.svelte-1nyxj31{position:relative;display:block;width:290px;height:auto;max-height:290px;overflow:hidden;margin-top:12px;margin-bottom:40px}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-content .mediago-video video.svelte-1nyxj31{position:relative;display:block;width:100%;height:100%;margin:auto}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-content .mediago-video .bgImg.svelte-1nyxj31{position:absolute;top:0;left:0;display:block;width:100%;height:100%;margin:auto}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-content .mediago-video .mediago-volume.svelte-1nyxj31{position:absolute;bottom:8px;right:8px;width:18px;height:18px}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-content .mediago-video .mediago-play-btn.svelte-1nyxj31{width:55px;height:55px;background:url(https://tb2.bdstatic.com/tb/img/video_play_btn_hover_7a1975f.png) no-repeat center;background-size:contain;position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);transform:translate(-50%, -50%)}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-content .mediago-mid.svelte-1nyxj31{width:465px}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-content .mediago-right.svelte-1nyxj31{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:182px}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-userInfo.svelte-1nyxj31,.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-header.svelte-1nyxj31,.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-adName.svelte-1nyxj31,.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-ad.svelte-1nyxj31{display:inline-block;vertical-align:top}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-userInfo.svelte-1nyxj31{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-userInfo .mediago-header.svelte-1nyxj31{font-size:12px;height:20px;line-height:1;background:transparent url(http://tb2.bdstatic.com/tb/img/icon_author_112d0bd.png?__sprite=) no-repeat 4px 0px;padding:0px 0 0 25px;overflow:hidden;display:inline-block}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-userInfo .mediago-adName.svelte-1nyxj31{width:66px;font-size:12px;color:#a3a3a3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:20px;margin-right:45px}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-ad.svelte-1nyxj31{width:24px;height:20px;line-height:21px;font-size:12px;color:#a3a3a3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;margin-right:20px}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-close.svelte-1nyxj31{cursor:pointer;position:absolute;top:17px;right:6px;width:10px;height:10px;background:url(https://mediago-static.cdn.bcebos.com/assets/images/icon-close10.png) no-repeat center;background-size:contain}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-dislikeReason.svelte-1nyxj31{cursor:pointer;width:60px;background:rgba(0, 0, 0, 0.5);border-radius:2px;position:absolute;top:41px;right:7px;font-size:12px;color:white;padding:5px 0;line-height:12px}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-dislikeReason div.svelte-1nyxj31{padding:5px 0px}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-dislikeReason .svelte-1nyxj31:hover{text-decoration:underline}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 img.svelte-1nyxj31{width:100%;height:100%}</style><style>@charset \"UTF-8\";.mediago-ad-360-237-wrapper.svelte-155n2vl.svelte-155n2vl{position:relative;text-align:center;width:238px;border-bottom:1px solid #e5e5e5;-webkit-box-sizing:border-box;box-sizing:border-box}.mediago-ad-360-237-wrapper.svelte-155n2vl .mediago-a-tag.svelte-155n2vl{display:block}.mediago-ad-360-237-wrapper.svelte-155n2vl .mediago-desc.svelte-155n2vl{width:238px;height:33px;background:#ffffff;font-size:12px;color:#272829;font-weight:400;padding:8px;margin:0px;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:left;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.mediago-ad-360-237-wrapper.svelte-155n2vl .mediago-img.svelte-155n2vl{position:relative;width:238px;height:238px}.mediago-ad-360-237-wrapper.svelte-155n2vl .mediago-close-btn.svelte-155n2vl{position:absolute;top:8px;right:6px;width:16px;height:16px;background:url(http://mediago-static.cdn.bcebos.com/static/images/close.a57e14.png) no-repeat center;background-size:contain}.mediago-ad-360-237-wrapper.svelte-155n2vl .mediago-dislikeReason.svelte-155n2vl{cursor:pointer;width:60px;background-color:rgba(0, 0, 0, 0.5);border-radius:2px;position:absolute;top:28px;right:6px;font-size:12px;color:white;padding:5px 0;line-height:12px}.mediago-ad-360-237-wrapper.svelte-155n2vl .mediago-dislikeReason div.svelte-155n2vl{padding:5px 0px}.mediago-ad-360-237-wrapper.svelte-155n2vl .mediago-dislikeReason .svelte-155n2vl:hover{text-decoration:underline}.mediago-ad-360-237-wrapper.svelte-155n2vl .mediago-ad-logo.svelte-155n2vl{position:absolute;bottom:8px;left:10px;width:32px;height:19px;background:rgba(0, 0, 0, 0.33);border-radius:2px}.mediago-ad-360-237-wrapper.svelte-155n2vl .mediago-ad-logo .mediago-text.svelte-155n2vl{display:inline-block;font-size:12px;-webkit-transform:scale(0.8333333333);-ms-transform:scale(0.8333333333);transform:scale(0.8333333333);color:#ffffff;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;line-height:19px}</style><style>@charset \"UTF-8\";.mediago-ad-video-360-wrapper.svelte-zxnafr.svelte-zxnafr{position:relative;text-align:center;width:238px;border-bottom:1px solid #e5e5e5;-webkit-box-sizing:border-box;box-sizing:border-box}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-a-tag.svelte-zxnafr{display:block}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-desc.svelte-zxnafr{width:238px;height:33px;background:#ffffff;font-size:12px;color:#272829;font-weight:400;padding:8px;margin:0px;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:left;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-video.svelte-zxnafr{position:relative;width:238px;max-height:238px;overflow:hidden}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-video video.svelte-zxnafr{position:relative;display:block;width:100%;height:100%;margin:auto}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-video .bgImg.svelte-zxnafr{position:absolute;top:0;left:0;display:block;width:100%;height:100%;margin:auto}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-close-btn.svelte-zxnafr{position:absolute;top:8px;right:6px;width:16px;height:16px;background:url(http://mediago-static.cdn.bcebos.com/static/images/close.a57e14.png) no-repeat center;background-size:contain}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-volume.svelte-zxnafr{position:absolute;bottom:8px;right:8px;width:18px;height:18px}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-play.svelte-zxnafr{position:absolute;width:100%;height:100%;left:0;top:0}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-play .mediago-play-btn.svelte-zxnafr{width:55px;height:55px;background:url(https://tb2.bdstatic.com/tb/img/video_play_btn_hover_7a1975f.png) no-repeat center;background-size:contain;position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);transform:translate(-50%, -50%)}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-dislikeReason.svelte-zxnafr{cursor:pointer;width:60px;background-color:rgba(0, 0, 0, 0.5);border-radius:2px;position:absolute;top:28px;right:6px;font-size:12px;color:white;padding:5px 0;line-height:12px}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-dislikeReason div.svelte-zxnafr{padding:5px 0px}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-dislikeReason .svelte-zxnafr:hover{text-decoration:underline}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-ad-logo.svelte-zxnafr{position:absolute;bottom:8px;left:10px;width:32px;height:19px;background:rgba(0, 0, 0, 0.33);border-radius:2px}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-ad-logo .mediago-text.svelte-zxnafr{display:inline-block;font-size:12px;-webkit-transform:scale(0.8333333333);-ms-transform:scale(0.8333333333);transform:scale(0.8333333333);color:#ffffff;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;line-height:19px}.mediago-ad-video-360-wrapper.svelte-zxnafr img.svelte-zxnafr{width:100%;height:100%}</style><style>.mediago-adsense_container.svelte-1fak9tc{position:relative;width:237px}</style><style>main.svelte-zmnt4x{text-align:center;padding:1em;max-width:240px;margin:0 auto}@media(min-width: 640px){main.svelte-zmnt4x{max-width:none}}</style><script type=\"text/javascript\" charset=\"utf8\" async=\"\" src=\"https://dlswbr.baidu.com/heicha/mm/2027/acs-2027.js\"></script><script type=\"text/javascript\" src=\"/messagepool/get_data?user=tb.1.e6057aec.PmFeyCvKVx0KZKdGZ2v9oA\"></script><style id=\"monica-reading-highlight-style\">\n        .monica-reading-highlight {\n          animation: fadeInOut 1.5s ease-in-out;\n        }\n\n        @keyframes fadeInOut {\n          0%, 100% { background-color: transparent; }\n          30%, 70% { background-color: rgba(2, 118, 255, 0.20); }\n        }\n      </style><script type=\"text/javascript\" src=\"http://tb1.bdstatic.com/tb/_/qrcode_fdc9a64.js\"></script></head><body class=\"skin_normal\" monica-locale=\"zh_CN\" monica-version=\"5.9.6\" monica-id=\"ofpnmcalabcbjgholdjcjblkibolbppb\"><div id=\"com_userbar\" class=\"userbar \" style=\"z-index: 10005;\"><ul><li class=\"u_split\"></li><li class=\"u_bdhome\"><div class=\"u_menu_item u_menu_bdhome j_u_menu_bd_home_link\"><a rel=\"noopener\" href=\"//www.baidu.com?tn=SE_hldp03480_530ir7bs\" target=\"_blank\" onclick=\"$.stats.track('top_baiduhomepage_link', 'ps_callback_statics')\">百度首页</a></div></li><li class=\"u_extraurl\"></li><li class=\"u_username\" id=\"j_u_username\"><div class=\"u_menu_item u_menu_username\"><a rel=\"noopener\" href=\"//tieba.baidu.com/home/main?id=tb.1.e6057aec.PmFeyCvKVx0KZKdGZ2v9oA&amp;fr=userbar\" title=\"点击到个人中心\" class=\"u_username_wrap\"><span class=\"u_username_title\">抗压吧吧务666</span><i class=\"i-arrow-down\"></i></a></div><div class=\"u_ddl\"><div class=\"u_ddl_con\"><span class=\"u_ddl_arrow\"> <em></em> </span><div class=\"u_ddl_con_top\"><ul><li class=\"u_itieba\"><a rel=\"noopener\" href=\"/home/main?id=tb.1.e6057aec.PmFeyCvKVx0KZKdGZ2v9oA&amp;fr=userbar\">我的贴吧</a></li><li class=\"u_mytbmall\"><a rel=\"noopener\" href=\"/tbmall/mymall\" target=\"_blank\">我的商城</a></li><li class=\"u_favor\" location=\"user_favor_ch\"><a rel=\"noopener\" href=\"/i/sys/jump?un=抗压吧吧务666&amp;ie=utf-8&amp;ie=utf-8&amp;type=storethread&amp;st_mod=userbar&amp;fr=tb0_pb\" target=\"_blank\">我的收藏</a></li><li class=\"u_pan\"><a rel=\"noopener\" href=\"https://pan.baidu.com/\" target=\"_blank\">我的网盘</a></li><li class=\"u_game\"><a rel=\"noopener\" href=\"https://wan.baidu.com/user?idfrom=2024\" target=\"_blank\">我的游戏</a></li></ul></div><div class=\"d_ddl_con_bottom\"></div></div></div></li><li class=\"u_news\"><div class=\"u_ddl\"><div class=\"u_ddl_con\"><span class=\"u_ddl_arrow\"> <em></em> </span><div class=\"u_ddl_con_top\"><div class=\"u_notity_bd\">    <ul class=\"sys_notify j_sys_notify j_category_list\">    <li class=\"category_item category_item_empty\">        <a class=\"j_cleardata\" href=\"/im/pcmsg\" target=\"sixin\" data-type=\"\">查看私信            </a>        </li>    <li class=\"category_item category_item_empty\">        <a class=\"j_cleardata\" href=\"/i/sys/jump?u=tb.1.e6057aec.PmFeyCvKVx0KZKdGZ2v9oA?t=1420595544&amp;type=replyme\" target=\"_blank\" data-type=\"reply\">查看回复            </a>        </li>    <li class=\"category_item category_item_empty\">        <a class=\"j_cleardata\" href=\"/i/sys/jump?u=tb.1.e6057aec.PmFeyCvKVx0KZKdGZ2v9oA?t=1420595544&amp;type=atme\" target=\"_blank\" data-type=\"atme\">查看@提到我            </a>        </li>    <li class=\"category_item category_item_empty\">        <a class=\"j_cleardata\" href=\"/i/sys/jump?u=tb.1.e6057aec.PmFeyCvKVx0KZKdGZ2v9oA?t=1420595544&amp;type=friendapply\" target=\"_blank\" data-type=\"friendapply\">查看好友申请            </a>        </li>    <li class=\"category_item category_item_empty\">        <a class=\"j_cleardata\" href=\"/i/sys/jump?u=tb.1.e6057aec.PmFeyCvKVx0KZKdGZ2v9oA?t=1420595544&amp;type=fans\" target=\"_blank\" data-type=\"fans\">查看新粉丝            </a>        </li>    <li class=\"category_item category_item_empty\">        <a class=\"j_cleardata\" href=\"/i/sys/jump?u=tb.1.e6057aec.PmFeyCvKVx0KZKdGZ2v9oA?t=1420595544&amp;type=storethread\" target=\"_blank\" data-type=\"favts\">我的收藏            </a>        </li></ul>    <ul class=\"sys_notify_last\">        <li class=\"category_item  category_item_last j_category_item_last\">            <a target=\"_blank\" href=\"/sysmsg/index?type=notity\">                我的通知<span class=\"unread_num\">8</span>            </a>            <ul class=\"new_message j_new_message j_category_list\">            </ul>        </li>    </ul></div></div><div class=\"d_ddl_con_bottom\"></div></div></div><div class=\"u_menu_item u_menu_news\"><a href=\"#\" class=\"u_news_wrap j_news\" onclick=\"return false;\">消息<span>(8)</span><i class=\"i-arrow-down\"></i></a></div></li><li class=\"u_creative\"></li><li class=\"u_official\"><div class=\"u_menu_item\"><span class=\"post_head_official\">官方号服务中心</span></div></li><li class=\"u_agent\"></li><li class=\"u_member\"><div class=\"u_menu_item u_menu_member\"><a rel=\"noopener\" class=\"u_member_wrap\" href=\"#\" onclick=\"return false;\"><i class=\"i-member\"></i>会员<i class=\"i-arrow-down\"></i></a></div><div class=\"u_ddl\"><div class=\"u_ddl_con\"><span class=\"u_ddl_arrow\"> <em></em> </span><div class=\"u_ddl_con_top\"><ul><li><a rel=\"noopener\" class=\"dropdown-dou j_wallet\" href=\"#\" onclick=\"return false\"><i class=\"i-dropdown-dou\"></i>Y币钱包</a></li><li><a rel=\"noopener\" class=\"dropdown-tbmall\" href=\"//tieba.baidu.com/tbmall/home\" target=\"_blank\"><i class=\"i-dropdown-tbmall\"></i>Y币商城</a></li><li><a rel=\"noopener\" class=\"u_joinvip_wrap vip_red j_btn_getmember\" href=\"javascript:;\" target=\"_blank\"><i class=\"i-dropdown-member\"></i>开通会员</a></li></ul></div><div class=\"d_ddl_con_bottom\"></div></div></div></li><li class=\"u_setting\"><div class=\"u_menu_item u_menu_setting\"><a rel=\"noopener\" class=\"u_setting_wrap\" href=\"#\" onclick=\"return false;\">更多<i class=\"i-arrow-down\"></i></a></div><div class=\"u_ddl\" style=\"display: none; left: -11px;\"><div class=\"u_ddl_con\"><span class=\"u_ddl_arrow\"> <em></em> </span><div class=\"u_ddl_con_top\"><ul><li><a rel=\"noopener\" href=\"https://tiebac.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">手机APP</a></li><li><a rel=\"noopener\" href=\"/f?kw=%D3%A6%D3%C3%D6%D0%D0%C4&amp;fr=userbar\" target=\"_blank\">应用中心</a></li><li><a rel=\"noopener\" href=\"//passport.baidu.com/?center&amp;tpl=tb&amp;aid=6&amp;default_tab=3#3,0\">账号设置</a></li><li class=\"u_tb_profile\"><a rel=\"noopener\" href=\"/home/profile?un=抗压吧吧务666&amp;ie=utf-8\">贴吧设置</a></li><li class=\"pm_center\"><a rel=\"noopener\" href=\"//tieba.baidu.com/pmc\" class=\"j_pmc-center\" target=\"_blank\">服务中心</a></li><li class=\"fuwu_center\"><a rel=\"noopener\" href=\"//tieba.baidu.com/hermes/feedback\" class=\"j_help-center\" target=\"_blank\">问题反馈</a></li><li class=\"u_logout\"><a rel=\"noopener\" href=\"#\">退出</a></li></ul></div><div class=\"d_ddl_con_bottom\"></div></div></div></li></ul><div class=\"ui_bubble_wrap j_wrap ui_bubble_wrap_fixed\" id=\"com_userbar_message\" style=\"display: none; width: 170px; right: 20px; top: -5px;\"><div class=\"j_content ui_bubble_content ui_bubble_up\" style=\"width: 170px;\"><div class=\"ui_bubble_body j_body\"><div class=\"allMsg\" style=\"clear:both;\"><ul><li id=\"message_all_msg\" style=\"display:none;\"></li><li id=\"message_fans\" style=\"display:none;\"></li><li id=\"message_____prop_out_of_date\" style=\"display:none;\"></li><li id=\"message_scores\" style=\"display:none;\"></li><li id=\"message_reply\" style=\"display:none;\"></li><li id=\"message_feature\" style=\"display:none;\"></li><li id=\"message_guess\" style=\"display:none;\"></li><li id=\"message_undefined\" style=\"display:none;\"></li><li id=\"message_postPasser\" style=\"display:none;\"></li><li id=\"message_atme\" style=\"display:none;\"></li><li id=\"message_recycle\" style=\"display:none;\"></li><li id=\"message_invite\" style=\"display:none;\"></li><li id=\"message_prop_out_of_date\" style=\"display:none;\"></li><li id=\"message_undefined\" style=\"display:none;\"></li><li id=\"message_undefined\" style=\"display:none;\"></li><li id=\"message_meizhiLevelUp\" style=\"display:none;\"></li><li id=\"message_paperprops\" style=\"display:none;\"></li><li id=\"message_gameOpen\" style=\"display:none;\"></li><li id=\"message_lotteryDraw\" style=\"display:none;\"></li><li id=\"message_lotteryAward\" style=\"display:none;\"></li><li id=\"message_favts\" style=\"display:none;\"></li><li id=\"message_undefined\" style=\"display:none;\"></li><li id=\"message_friendapply\" style=\"display:none;\"></li></ul><div class=\"tb_msg_tip_rightpanel\"><a href=\"/i/sys/jump?u=tb.1.e6057aec.PmFeyCvKVx0KZKdGZ2v9oA&amp;type=profile#notify\" style=\"height:100%;\" target=\"_self\" class=\"setting\">设置</a><a title=\"关闭\" href=\"#\" onclick=\"return false;\" class=\"close_msg_tip\"></a><b style=\"clear:both; text-align:left;\"></b></div></div></div><div class=\"ui_bubble_closed j_close\"></div></div><div class=\"j_ui_triangle ui_triangle ui_triangle_up\" style=\"left: 147px; display: none;\"><div class=\"ui_triangle_outter ui_arrow_o_up\"><em>◆</em></div><div class=\"ui_triangle_inner ui_arrow_i_up\"><em>◆</em></div></div></div></div><a id=\"ariaTipText\" role=\"pagedescription\" aria-label=\"æ¬¢è¿Žè¿›å…¥ 【强烈恭喜】全红婵陈宇汐包揽跳水女子10米台巴黎奥运金银牌！【网球风云吧】_百度贴吧,ç›²äººç”¨æˆ·ä½¿ç”¨æ“ä½œæ™ºèƒ½å¼•å¯¼ï¼Œè¯·æŒ‰å¿«æ·é”®Ctrl+Alt+Rï¼›é˜…è¯»è¯¦ç»†æ“ä½œè¯´æ˜Žè¯·æŒ‰å¿«æ·é”®Ctrl+Alt+é—®å·é”®ã€‚\" aria-atomic=\"true\" href=\"javascript:void(0)\" class=\"skipAutoFix\" style=\"width: 1px; height: 1px;\"><img src=\"\" style=\"width:1px !important;height:1px !important;position:absolute;top:0;\"></a><script type=\"text/javascript\">window.radar && window.radar.mark('ht');</script><script type=\"text/template\" id=\"u_notify\"><div class=\"u_notity_bd\">    <ul class=\"sys_notify j_sys_notify j_category_list\">    </ul>    <ul class=\"sys_notify_last\">        <li class=\"category_item  category_item_last j_category_item_last\">            <a target=\"_blank\" href=\"/sysmsg/index?type=notity\">                我的通知<span class=\"unread_num\">0</span>            </a>            <ul class=\"new_message j_new_message j_category_list\">            </ul>        </li>    </ul></div></script><script type=\"text/template\" id=\"u_notify_item\"><%for (var i = 0; i < list.length; i++) {%>    <li class=\"category_item <% if(list[i].unread_count == 0) {%>category_item_empty<%}%>\">    <%if ( list[i].category_href ) {%>    <a class=\"j_cleardata\" href=\"<%=list[i].category_href%>\" target=\"_blank\" data-type=\"<%=list[i].type%>\"><%=list[i].category_name%>        <% if(list[i].unread_count != 0) {%>            <span class=\"unread_num\"><%=list[i].unread_count%></span>        <% } %>    </a>    <%} else {%>    <a href=\"/sysmsg/index?type=notity&category_id=<%=list[i].category_id%>\" target=\"_blank\" data-type=\"<%=list[i].type%>\"><%=list[i].category_name%>        <% if(list[i].unread_count != 0) {%>            <span class=\"unread_num\"><%=list[i].unread_count%></span>        <% } %>    </a>    <% } %>    </li><%}%></script><div id=\"local_flash_cnt\"></div><div class=\"wrap1\"><div class=\"wrap2\"><script type=\"text/javascript\">    var commonPageData = PageData || {};    var PageData = {        page: 'pb', product: 'pb',        tbs: '5ebed794473702491722965478',        can_post:1, can_anonym_post:0, forum_type: 1, follow_sign: \"8b75b056990cbc81\", forward_sign: \"295ffc8709a19932\", power: {\"can_add_celebrity\":false,\"can_add_manager_team\":false,\"can_bws_FDS\":false,\"can_bws_bawu_center\":false,\"can_bws_bawu_info\":false,\"can_bws_bawu_log\":false,\"can_bws_filter_ip_tbs\":false,\"can_bws_limit_bawu_log\":false,\"can_cancel_filter_id\":false,\"can_cancel_mask_delete\":false,\"can_cancel_mask_good\":false,\"can_cancel_mask_top\":false,\"can_chatroom_change_announce\":false,\"can_chatroom_change_avatar\":false,\"can_chatroom_change_name\":false,\"can_chatroom_create\":false,\"can_chatroom_delete\":false,\"can_chatroom_exempt_mute_all\":false,\"can_chatroom_manage_admin\":false,\"can_chatroom_mute_all\":false,\"can_chatroom_mute_normal\":false,\"can_chatroom_recall_admin\":false,\"can_chatroom_recall_normal\":false,\"can_chatroom_set_send_level\":false,\"can_chatroom_set_talk_type\":false,\"can_chatroom_set_view_level\":false,\"can_del_manager_team\":false,\"can_edit_bakan\":false,\"can_edit_daquan\":false,\"can_edit_gconforum\":false,\"can_filter_id\":false,\"can_filter_ip\":false,\"can_mask_delete\":false,\"can_mask_good\":false,\"can_mask_top\":false,\"can_member_top\":false,\"can_op_FDS\":false,\"can_op_as_4thmgr\":false,\"can_op_as_broadcast_admin\":false,\"can_op_as_category_editor\":false,\"can_op_as_editor\":false,\"can_op_as_entertainment_manager\":false,\"can_op_as_operator\":false,\"can_op_as_profession_manager\":false,\"can_op_as_vertical_operator\":false,\"can_op_common_bawu\":false,\"can_op_disk\":false,\"can_op_frsbg\":false,\"can_op_good_class\":false,\"can_op_pic\":false,\"can_op_topic\":false,\"can_op_video\":false,\"can_op_wise_group\":false,\"can_paper_ignore_vcode\":false,\"can_pass_media_limit\":false,\"can_post\":true,\"can_post_frs\":true,\"can_post_pb\":true,\"can_send_memo\":false,\"can_super\":false,\"can_tobe_assist\":false,\"can_tobe_editor\":false,\"can_tobe_manager\":false,\"can_tobe_pri_content_assist\":false,\"can_tobe_pri_manage_assist\":false,\"can_toms_operator_alt_basic\":false,\"can_toms_operator_basic\":false,\"can_type1_audit_post\":false,\"can_type2_audit_post\":false,\"can_type3_audit_post\":false,\"can_type4_audit_post\":false,\"can_type5_audit_post\":false,\"can_unknown\":false,\"can_view_freq\":false,\"can_vip_jubao\":false,\"can_vote\":false,\"forever_ban\":0,\"lz_del\":false,\"picasso\":false,\"share_forum_perm\":[],\"can_set_topic\":false,\"reply_private_flag\":1},        is_thread_admin:0,        is_posts_admin:0,        staticDomain: \"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/\"    };    for (var item in commonPageData) {        PageData[item] = commonPageData[item];    }    PageData.forum = {        id: \"4513750\",        forum_id: \"4513750\",        name: '网球风云', forum_name: '网球风云', name_url: \"%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&ie=utf-8\",        name_encode: \"%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&ie=utf-8\",        member_name_url: \"Ace&ie=utf-8\",        first_class: \"体育\",        second_class: \"综合体育\",        album_good_smallflow: \"\",        avatar: \"http:\\/\\/tiebapic.baidu.com\\/forum\\/w%3D120%3Bh%3D120\\/sign=4193c9ec7f01213fcf334ade64dc5eec\\/dcc451da81cb39db7a7e9a6396160924ab18304d.jpg?tbpicau=2024-08-18-05_9e144ae7eb619394f7774773074f33c1\",        forbid_flag: \"1\",        has_picture_frs: \"1\",        member_count: \"48523\",        member_name: \"Ace\",        post_num: \"5418043\",        shield_post: \"1\",        sign_in_info: {\"user_info\":{\"user_id\":1527556343,\"is_sign_in\":0,\"user_sign_rank\":0,\"sign_time\":0,\"cont_sign_num\":0,\"cout_total_sing_num\":0,\"total_resign_num\":0,\"hun_sign_num\":0,\"is_org_disabled\":0,\"c_sign_num\":0,\"cm_sign_num\":0},\"forum_info\":{\"is_on\":true,\"is_filter\":false,\"forum_info\":{\"forum_id\":4513750,\"level_1_dir_name\":\"\\u7efc\\u5408\\u4f53\\u80b2\"},\"current_rank_info\":{\"sign_count\":444,\"member_count\":48481,\"sign_rank\":8,\"dir_rate\":\"0.1\"},\"level_1_dir_name\":\"\\u4f53\\u80b2\",\"level_2_dir_name\":\"\\u7efc\\u5408\\u4f53\\u80b2\",\"yesterday_rank_info\":{\"sign_count\":3452,\"member_count\":47919,\"sign_rank\":11,\"dir_rate\":\"0.1\"},\"weekly_rank_info\":{\"sign_count\":3405,\"member_count\":42491,\"sign_rank\":10},\"monthly_rank_info\":{\"sign_count\":2359,\"member_count\":41063,\"sign_rank\":16}}}};    var commonPageDataUser = {        bg_id: \"\",        cur_score: \"0\",        email: \"\",        feedNumNew: \"\",        free_flag: \"\",        is_black: 0,        is_block: 0,        is_half_user: 0,        is_like: 0,        is_tenyear: 0,        itieba_id: \"\",        level_id: \"1\",        level_name: \"网球萌新\",        meizhi_level: 0,        mobile: \"\",        mobilephone: \"131******21\",        name_link: \"&ie=utf-8\",        name_show: \"\",        name_weak: \"\",        open_uid: \"\",        score_card: \"\",        score_left: \"5\",        sid: \"\",        source_id: \"\",        start_time: \"\",        superboy: \"\",        use_sig: 0,        user_sex: 2,        user_status: 1,        user_type: 0,        userhide: 0,        picasso: \"\",        global: {\"tbmall_newprops\":0},        rank: null,        tbguess_card: null,        tips: [],        urank: []};    for (var key in commonPageDataUser) {        PageData['user'][key] = commonPageDataUser[key];    }    PageData.user.forbidden = PageData.user.is_login ? [] : {};    PageData.thread = {        author: \"heinzfrentzen\",        thread_id:9119688421,        title: \"【强烈恭喜】全红婵陈宇汐包揽跳水女子10米台巴黎奥运金银牌！\", reply_num:252, thread_type: \"0\",        topic: {            is_topic: false,            topic_type: false,            is_live_post: false,            is_lpost: false,            lpost_type: 0        }, /*null,*/        is_ad:0, video_url: \"\" };    PageData.post_perm = {\"img_num\":10,\"video_num\":10,\"smiley_num\":100,\"white_list\":[\"http:\\/\\/www.tudou.com\\/\",\"http:\\/\\/v.blog.sohu.com\\/\",\"http:\\/\\/tv.sohu.com\\/\",\"http:\\/\\/share.vrs.sohu.com\\/\",\"http:\\/\\/my.tv.sohu.com\\/\",\"http:\\/\\/player.56.com\\/\",\"http:\\/\\/www.56.com\\/\",\"http:\\/\\/kankanews.com\\/\",\"http:\\/\\/video6.smgbb.cn\\/\",\"http:\\/\\/www.youku.com\\/\",\"http:\\/\\/player.youku.com\\/\",\"http:\\/\\/static.youku.com\\/\",\"http:\\/\\/www.ku6.com\\/\",\"http:\\/\\/player.ku6.com\\/\",\"http:\\/\\/video.sina.com.cn\\/\",\"http:\\/\\/vhead.blog.sina.com.cn\\/\",\"http:\\/\\/you.video.sina.com.cn\\/\",\"http:\\/\\/video.qq.com\\/\",\"http:\\/\\/www.baidu.com\\/\",\"http:\\/\\/box.baidu.com\\/\",\"http:\\/\\/hi.baidu.com\\/\",\"http:\\/\\/mv.baidu.com\\/\",\"http:\\/\\/mvimg.baidu.com\\/\",\"http:\\/\\/mvideo.baidu.com\\/\",\"http:\\/\\/player.cntv.cn\\/\",\"http:\\/\\/player.xiyou.cntv.cn\\/\",\"http:\\/\\/www.yinyuetai.com\\/\",\"http:\\/\\/player.yinyuetai.com\\/\",\"http:\\/\\/www.aipai.com\\/\",\"http:\\/\\/www.cutv.com\\/\",\"http:\\/\\/player.cutv.com\\/\",\"http:\\/\\/www.pptv.com\\/\",\"http:\\/\\/v.pptv.com\\/\",\"http:\\/\\/www.letv.com\\/\",\"http:\\/\\/www.iqiyi.com\\/\",\"http:\\/\\/yule.iqiyi.com\\/\",\"http:\\/\\/player.video.qiyi.com\\/\",\"http:\\/\\/www.ifeng.com\\/\",\"http:\\/\\/s.v.ifeng.com\\/\",\"http:\\/\\/v.ifeng.com\\/\",\"http:\\/\\/www.m1905.com\\/\",\"http:\\/\\/www.joy.cn\\/\",\"http:\\/\\/client.joy.cn\\/\",\"http:\\/\\/www.molihe.com\\/\",\"http:\\/\\/mv.molihe.com\\/\",\"http:\\/\\/swf.molihe.com\\/\",\"http:\\/\\/www.baomihua.com\\/\",\"http:\\/\\/video.baomihua.com\\/\",\"http:\\/\\/www.ouou.com\\/\",\"http:\\/\\/flash.ouou.com\\/\",\"http:\\/\\/dv.ouou.com\\/\",\"http:\\/\\/misc.home.news.cn\\/\",\"http:\\/\\/www.news.cn\\/\",\"http:\\/\\/www.wasu.cn\\/\",\"http:\\/\\/play1.wasu.cn\\/\",\"http:\\/\\/play.wasu.cn\\/\",\"http:\\/\\/v.iask.com\\/\",\"http:\\/\\/i7.imgs.letv.com\\/\",\"http:\\/\\/static.video.qq.com\\/\",\"http:\\/\\/player.pptv.com\\/\",\"http:\\/\\/www.mgtv.com\\/\",\"http:\\/\\/www.meipai.com\\/\",\"http:\\/\\/baishi.baidu.com\\/\",\"http:\\/\\/www.bilibili.com\\/\",\"http:\\/\\/share.acg.tv\\/\",\"http:\\/\\/static.hdslb.com\\/\",\"http:\\/\\/bangumi.bilibili.com\"]};    PageData.special = {\"has_sub_post\":1,\"has_grade\":1,\"has_lucky_lottery\":0,\"has_basket_lottery\":0,\"has_ssq_lottery\":0,\"has_foot_lottery\":1,\"is_match_news\":0,\"lz_only\":0,\"has_lz_only\":1,\"is_from_spider\":false};    PageData.isPicBa = \"1\";    PageData.pager = {\"cur_page\":1,\"total_page\":4,\"page_size\":30};        var g_pg = {        imageLimite: 10,        flashWhiteList:[\"http:\\/\\/www.tudou.com\\/\",\"http:\\/\\/v.blog.sohu.com\\/\",\"http:\\/\\/tv.sohu.com\\/\",\"http:\\/\\/share.vrs.sohu.com\\/\",\"http:\\/\\/my.tv.sohu.com\\/\",\"http:\\/\\/player.56.com\\/\",\"http:\\/\\/www.56.com\\/\",\"http:\\/\\/kankanews.com\\/\",\"http:\\/\\/video6.smgbb.cn\\/\",\"http:\\/\\/www.youku.com\\/\",\"http:\\/\\/player.youku.com\\/\",\"http:\\/\\/static.youku.com\\/\",\"http:\\/\\/www.ku6.com\\/\",\"http:\\/\\/player.ku6.com\\/\",\"http:\\/\\/video.sina.com.cn\\/\",\"http:\\/\\/vhead.blog.sina.com.cn\\/\",\"http:\\/\\/you.video.sina.com.cn\\/\",\"http:\\/\\/video.qq.com\\/\",\"http:\\/\\/www.baidu.com\\/\",\"http:\\/\\/box.baidu.com\\/\",\"http:\\/\\/hi.baidu.com\\/\",\"http:\\/\\/mv.baidu.com\\/\",\"http:\\/\\/mvimg.baidu.com\\/\",\"http:\\/\\/mvideo.baidu.com\\/\",\"http:\\/\\/player.cntv.cn\\/\",\"http:\\/\\/player.xiyou.cntv.cn\\/\",\"http:\\/\\/www.yinyuetai.com\\/\",\"http:\\/\\/player.yinyuetai.com\\/\",\"http:\\/\\/www.aipai.com\\/\",\"http:\\/\\/www.cutv.com\\/\",\"http:\\/\\/player.cutv.com\\/\",\"http:\\/\\/www.pptv.com\\/\",\"http:\\/\\/v.pptv.com\\/\",\"http:\\/\\/www.letv.com\\/\",\"http:\\/\\/www.iqiyi.com\\/\",\"http:\\/\\/yule.iqiyi.com\\/\",\"http:\\/\\/player.video.qiyi.com\\/\",\"http:\\/\\/www.ifeng.com\\/\",\"http:\\/\\/s.v.ifeng.com\\/\",\"http:\\/\\/v.ifeng.com\\/\",\"http:\\/\\/www.m1905.com\\/\",\"http:\\/\\/www.joy.cn\\/\",\"http:\\/\\/client.joy.cn\\/\",\"http:\\/\\/www.molihe.com\\/\",\"http:\\/\\/mv.molihe.com\\/\",\"http:\\/\\/swf.molihe.com\\/\",\"http:\\/\\/www.baomihua.com\\/\",\"http:\\/\\/video.baomihua.com\\/\",\"http:\\/\\/www.ouou.com\\/\",\"http:\\/\\/flash.ouou.com\\/\",\"http:\\/\\/dv.ouou.com\\/\",\"http:\\/\\/misc.home.news.cn\\/\",\"http:\\/\\/www.news.cn\\/\",\"http:\\/\\/www.wasu.cn\\/\",\"http:\\/\\/play1.wasu.cn\\/\",\"http:\\/\\/play.wasu.cn\\/\",\"http:\\/\\/v.iask.com\\/\",\"http:\\/\\/i7.imgs.letv.com\\/\",\"http:\\/\\/static.video.qq.com\\/\",\"http:\\/\\/player.pptv.com\\/\",\"http:\\/\\/www.mgtv.com\\/\",\"http:\\/\\/www.meipai.com\\/\",\"http:\\/\\/baishi.baidu.com\\/\",\"http:\\/\\/www.bilibili.com\\/\",\"http:\\/\\/share.acg.tv\\/\",\"http:\\/\\/static.hdslb.com\\/\",\"http:\\/\\/bangumi.bilibili.com\"],        flashLimite: 10,        smileyLimite:100};</script><script type=\"text/javascript\">/*缩放图片的方法需要放在前面，因为有onload*//*common里也有这个方法，但是common里有setTimeout的判断，在IE下会导致内存占用很大*/function resizePic_temp(o, Mw, Mh, need_margin) {    var _Mw = Mw || 120;    var _Mh = Mh || 120;    var need_resize = false;    var _image = new Image();    _image.src = o.src;    function getRightWH(Rw, Rh, Mw, Mh) {        var index = 0,        _Rw = Rw,        _Rh = Rh;        if (Rw > Mw) index += 1;        if (Rh > Mh) index += 2;        switch (index) {        case 1:            _Rw = Mw;            _Rw = Rh * Mw / Rw;        case 2:            _Rh = Mh;            _Rw = Rw * Mh / Rh;        case 3:            _Rh = (Rh / Mh > Rw / Mw) ? Mh: Rh * Mw / Rw;            _Rw = (Rh / Mh > Rw / Mw) ? Rw * Mh / Rh: Mw        }        if (index != 0) {            need_resize = true        }        return [_Rw, _Rh]    }    var wh = getRightWH(_image.width, _image.height, _Mw, _Mh);    o.style.width = wh[0] + 'px';    o.style.height = wh[1] + 'px';    o.setAttribute(\"width\",wh[0]);    o.setAttribute(\"height\",wh[1]);    o.style.visibility = 'visible';    if (need_margin == true) {        o.style.marginTop = (Mh - parseInt(wh[1])) / 2 + 'px'    }    _image = null;    return need_resize}/*签名档加载失败处理*/function sign_change_img(img){img.src='//tb1.bdstatic.com/tb/static-itieba/img/sign_err.png';img.width=100;img.height=25;}</script><div id=\"head\" class=\" search_bright clearfix\" style=\"\"><div class=\"head_inner\"><div class=\"search_top clearfix\"><div class=\"search_nav j_search_nav\" style=\"margin-right: 547px;\"><a rel=\"noopener\" param=\"wd\" href=\"https://www.baidu.com/s?cl=3&amp;\">网页</a><a rel=\"noopener\" param=\"word\" href=\"https://www.baidu.com/s?rtt=1&amp;bsst=1&amp;cl=2&amp;tn=news&amp;fr=tieba&amp;\" mark=\"news\">资讯</a><a rel=\"noopener\" param=\"word\" href=\"https://www.baidu.com/sf/vsearch?pd=video&amp;tn=vsearch&amp;ct=301989888&amp;rn=20&amp;pn=0&amp;db=0&amp;s=21&amp;rsv_spt=11&amp;\">视频</a><a rel=\"noopener\" param=\"word\" href=\"https://image.baidu.com/i?tn=baiduimage&amp;ct=201326592&amp;lm=-1&amp;cl=2&amp;\">图片</a><a rel=\"noopener\" param=\"word\" href=\"https://zhidao.baidu.com/q?ct=17&amp;pn=0&amp;tn=ikaslist&amp;rn=10&amp;\">知道</a><a rel=\"noopener\" href=\"https://wenku.baidu.com/search?fr=tieba&amp;lm=0&amp;od=0&amp;\" param=\"word\">文库</a><b>贴吧</b><a rel=\"noopener\" param=\"word\" href=\"https://map.baidu.com/m?fr=map006&amp;\">地图</a><a rel=\"noopener\" param=\"q\" href=\"https://b2b.baidu.com/s?fr=tieba&amp;\">采购</a></div></div><div class=\"search_main_wrap\"><div class=\"search_main clearfix\"><div class=\"search_form\"><a rel=\"noopener\" title=\"到贴吧首页\" href=\"/\" class=\"search_logo\" style=\"\"></a>                <form name=\"f1\" class=\"clearfix j_search_form\" action=\"/f\" id=\"tb_header_search_form\"><input class=\"search_ipt search_inp_border j_search_input tb_header_search_input\" name=\"kw1\" value=\"网球风云\" type=\"text\" autocomplete=\"off\" size=\"42\" tabindex=\"1\" id=\"wd1\" maxlength=\"100\" x-webkit-grammar=\"builtin:search\" x-webkit-speech=\"true\"><input autocomplete=\"off\" type=\"hidden\" name=\"kw\" value=\"网球风云\" id=\"wd2\"><span class=\"search_btn_wrap search_btn_enter_ba_wrap\"><a rel=\"noopener\" class=\"search_btn search_btn_enter_ba j_enter_ba\" href=\"#\" onclick=\"return false;\" onmousedown=\"this.className+=' search_btn_down'\" onmouseout=\"this.className=this.className.replace('search_btn_down','')\">进入贴吧</a></span><span class=\"search_btn_wrap\"><a rel=\"noopener\" class=\"search_btn j_search_post\" href=\"#\" onclick=\"return false;\">全吧搜索</a></span><span id=\"search_baidu_promote\"><a id=\"search_baidu_promote_download\" style=\"color:red;padding-left:8px;text-decoration:underline;\" pv_code=\"0\" href=\"#\" target=\"_self\"></a></span></form><p style=\"display:none;\" class=\"switch_radios\"><input type=\"radio\" class=\"nowtb\" name=\"tb\" id=\"nowtb\"><label for=\"nowtb\">吧内搜索</label><input type=\"radio\" class=\"searchtb\" name=\"tb\" id=\"searchtb\"><label for=\"searchtb\">搜贴</label><input type=\"radio\" class=\"authortb\" name=\"tb\" id=\"authortb\"><label for=\"authortb\">搜人</label><input type=\"radio\" class=\"jointb\" checked=\"checked\" name=\"tb\" id=\"jointb\"><label for=\"jointb\">进吧</label><input type=\"radio\" class=\"searchtag\" name=\"tb\" id=\"searchtag\" style=\"display:none;\"><label for=\"searchtag\" style=\"display:none;\">搜标签</label></p></div><div class=\"suggestion\" style=\"left: 466px; width: 534px; top: 104px; display: none;\"><ul class=\"suggestion_list\"></ul></div></div></div></div>  </div><div id=\"container\" class=\"l_container  \"><div class=\"content clearfix\"><div class=\"card_top_wrap clearfix card_top_theme2 \"><div class=\"card_top_right\">    <div class=\"sign_mod_bright\" id=\"sign_mod\"><div class=\"sign_tip_container\"><div class=\"j_succ_info sign_succ1\" style=\"display:none\"><div class=\"sign_tip_bdwrap clearfix\"><div class=\"sign_tip_bd_arr\"></div><div class=\"sign_tip_main\"><div class=\"sign_succ_calendar\"><div class=\"sign_succ_calendar_title\"><div class=\"calendar_title_month clearfix\"><div class=\"calendar_month_next j_calendar_month_next\">&nbsp;</div><div class=\"calendar_month_prev j_calendar_month_prev\">&nbsp;</div><div class=\"calendar_month_span j_calendar_month\">&nbsp;</div></div></div><table class=\"sign_succ_table \"><thead align=\"center\"><tr class=\"sign_succ_canlerdar_head\"><td>日</td><td>一</td><td>二</td><td>三</td><td>四</td><td>五</td><td>六</td></tr></thead><tbody align=\"center\" class=\"sign_succ_canlerdar_days j_canlerdar_days\"><tr><td class=\"j_1_0\">&nbsp;</td><td class=\"j_1_1\">&nbsp;</td><td class=\"j_1_2\">&nbsp;</td><td class=\"j_1_3\">&nbsp;</td><td class=\"j_1_4\">&nbsp;</td><td class=\"j_1_5\">&nbsp;</td><td class=\"j_1_6\">&nbsp;</td></tr><tr><td class=\"j_2_0\">&nbsp;</td><td class=\"j_2_1\">&nbsp;</td><td class=\"j_2_2\">&nbsp;</td><td class=\"j_2_3\">&nbsp;</td><td class=\"j_2_4\">&nbsp;</td><td class=\"j_2_5\">&nbsp;</td><td class=\"j_2_6\">&nbsp;</td></tr><tr><td class=\"j_3_0\">&nbsp;</td><td class=\"j_3_1\">&nbsp;</td><td class=\"j_3_2\">&nbsp;</td><td class=\"j_3_3\">&nbsp;</td><td class=\"j_3_4\">&nbsp;</td><td class=\"j_3_5\">&nbsp;</td><td class=\"j_3_6\">&nbsp;</td></tr><tr><td class=\"j_4_0\">&nbsp;</td><td class=\"j_4_1\">&nbsp;</td><td class=\"j_4_2\">&nbsp;</td><td class=\"j_4_3\">&nbsp;</td><td class=\"j_4_4\">&nbsp;</td><td class=\"j_4_5\">&nbsp;</td><td class=\"j_4_6\">&nbsp;</td></tr><tr class=\"j_5\" style=\"display:none\"><td class=\"j_5_0\">&nbsp;</td><td class=\"j_5_1\">&nbsp;</td><td class=\"j_5_2\">&nbsp;</td><td class=\"j_5_3\">&nbsp;</td><td class=\"j_5_4\">&nbsp;</td><td class=\"j_5_5\">&nbsp;</td><td class=\"j_5_6\">&nbsp;</td></tr><tr class=\"j_6\" style=\"display:none\"><td class=\"j_6_0\">&nbsp;</td><td class=\"j_6_1\">&nbsp;</td><td class=\"j_6_2\">&nbsp;</td><td class=\"j_6_3\">&nbsp;</td><td class=\"j_6_4\">&nbsp;</td><td class=\"j_6_5\">&nbsp;</td><td class=\"j_6_6\">&nbsp;</td></tr></tbody></table></div><div class=\"sign_tip_boards\"><div class=\"sign_tip_board sign_tip_board_urank j_sign_ad_mobi\"><div class=\"sign_tip_board_ico\"></div><p>签到排名：今日本吧第<span class=\"sign_index_num j_signin_index\">0</span>个签到，</p><p><span class=\"j_succ_text\">本吧因你更精彩，明天继续来努力！</span></p></div><div class=\"sign_tip_board sign_tip_board_barrank\"><div class=\"sign_tip_board_ico\"></div>                        <p>本吧排名：<a rel=\"noreferrer\" target=\"_blank\" href=\"/sign/index?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8\">8</a></p>                        <p>本吧签到人数：444</p></div></div></div><div class=\"sign_tip_aside\">                <div class=\"sign_tip_sbox sign_tip_sbox_first sign_tip_sbox_1key\"><div class=\"sign_tip_sbox_hd\">一键签到</div><div class=\"sign_tip_sbox_bd\"><div class=\"sign_tip_sbox_cnt\"><a rel=\"noreferrer\" class=\"sign_tip_sbox_card j_sign_tip_1key_icon sign_tip_sbox_card_pencil\" href=\"/tbmall/tshow?tab=detail\" target=\"_blank\"></a><div class=\"sign_tip_sbox_txt\">可签<span class=\"orange_text\">7</span>级以上的吧<span class=\"orange_text\">50</span>个</div><div class=\"sign_tip_sbox_btn\"><a rel=\"noreferrer\" href=\"/home/main?id=tb.1.e6057aec.PmFeyCvKVx0KZKdGZ2v9oA?t=1420595544#stipsign\" target=\"_blank\" class=\"ui_btn ui_btn_sub_s\"><span><em><b class=\"sign_crown sign_crown_pencil\" title=\"无瑕的T秀勋章\"></b>一键签到</em></span></a></div></div></div></div>                <div class=\"sign_tip_sbox sign_tip_sbox_fixsign\"><div class=\"sign_tip_sbox_hd sign_tip_sbox_hd_inf j_need_rpln_wrap\">本月漏签<span class=\"j_lack_sign_monthly_count sign_num\">0</span>次！</div><div class=\"sign_tip_sbox_bd\"><div class=\"sign_tip_sbox_cnt\"><a rel=\"noreferrer\" href=\"/tbmall/propslist?category=108\" class=\"sign_tip_sbox_card\" target=\"_blank\"><span class=\"sign_num\"><span class=\"j_rpln_card_count\">0</span></span></a><div class=\"sign_tip_sbox_txt\">成为超级会员，赠送8张补签卡</div><div class=\"sign_tip_sbox_btn\"><a rel=\"noreferrer\" href=\"#\" class=\"ui_btn ui_btn_sub_s j_lack_sign_monthly_help\" target=\"_blank\"><span><em>如何使用？</em></span></a><div class=\"lack_sign_monthly_tip_wrap\"><div class=\"ui_card_wrap lack_sign_monthly_tip_card j_lack_sign_monthly_tip_card\" style=\"display:none;\"><div class=\"ui_card_content \"><div class=\"time_gift_tip\">点击日历上漏签日期，即可进行<span class=\"strongerText\">补签</span>。</div></div><span class=\"arrow ui_white_down\" style=\"left:48%;\"></span></div></div></div></div></div></div><div class=\"sign_tip_sbox sign_tip_sbox_chainsign\"><div class=\"sign_tip_sbox_hd sign_tip_sbox_hd_inf\">连续签到：<span class=\"sign_num j_sign_succ_keep\"></span>天&nbsp;&nbsp;累计签到：<span class=\"sign_num j_sign_succ_count\"></span>天</div><div class=\"sign_tip_sbox_bd\"><div class=\"sign_tip_sbox_cnt\"><a rel=\"noreferrer\" href=\"/tbmall/propslist?category=108\" class=\"sign_tip_sbox_card\" target=\"_blank\"><span class=\"sign_num\"><span class=\"j_sign_chainsign_num\">0</span></span></a><div class=\"sign_tip_sbox_txt\">超级会员单次开通12个月以上，赠送连续签到卡3张</div><div class=\"sign_tip_sbox_btn\"><a rel=\"noreferrer\" href=\"#\" class=\"ui_btn ui_btn_sub_s j_cont_sign_card\" target=\"_blank\"><span><em>使用连续签到卡</em></span></a></div></div></div></div><div class=\"sign_tip_sbox sign_tip_sbox_last sign_tip_sbox_rights\"><div class=\"sign_tip_sbox_bd j_sign_rights\"><div class=\"sign_rights_display clearfix\"><div class=\"sign_rights_icon j_sign_rights_icon rights_1\"></div><div class=\"sign_rights_icon j_sign_rights_icon rights_2\"></div><div class=\"sign_rights_icon j_sign_rights_icon rights_3\"></div><div class=\"sign_rights_icon j_sign_rights_icon rights_4\"></div><div class=\"sign_rights_icon j_sign_rights_icon rights_5\"></div><span class=\"split_line\"></span><a rel=\"noreferrer\" href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_who\" class=\"balv_help\" title=\"签到规则\" target=\"_blank\"></a></div></div></div></div>            </div></div></div><div id=\"signstar_wrapper\" class=\"j_sign_box sign_box_bright\"><a rel=\"noreferrer\" href=\"#\" onclick=\"return false\" data-dw=\"3\" tabindex=\"3\" title=\"签到\" class=\"j_signbtn sign_btn_bright j_cansign\"><span class=\"sign_today_date\">08月07日</span><span class=\"sign_month_lack_days\">漏签<span class=\"j_sign_month_lack_days\">0</span>天</span></a></div>        </div></div><div class=\"card_top  clearfix\">        <div class=\"card_head \"><a href=\"/f?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8\">                        <img class=\"card_head_img\" src=\"https://tiebapic.baidu.com/forum/w%3D150%3Bh%3D150%3Bq%3D80%3B/sign=7e925b16f67eca8012053de2a118ffe0/dcc451da81cb39db7a7e9a6396160924ab18304d.jpg?tbpicau=2024-08-18-05_9ba9ed31dffd04ea4c25f289238d4574\">            </a></div><div class=\"card_title \">        <a class=\"card_title_fname\" title=\"\" href=\"/f?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8\">            网球风云吧 </a>                                                <a href=\"#\" onclick=\"return false\" class=\"focus_btn islike_focus\" id=\"j_head_focus_btn\" style=\"margin-top:2px;\"></a>                <span class=\"card_num \"><span class=\"card_numLabel\">关注：</span><span class=\"card_menNum\">48,523</span><span class=\"card_numLabel\">贴子：</span><span class=\"card_infoNum\">5,418,043</span></span>        </div></div></div><div class=\"nav_wrap nav_wrap_add_border\" id=\"tb_nav\"><ul class=\"nav_list j_nav_list\"><li class=\" j_tbnav_tab\">\n    <a href=\"/f?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;tp=0\" class=\" j_tbnav_tab_a\" id=\"tab_forumname\" stats-data=\"fr=tb0_forum&amp;st_mod=frs&amp;st_value=tabmain\">看贴</a>\n</li><li class=\" j_tbnav_tab\">\n    <a href=\"\" class=\" j_tbnav_tab_a\"></a>\n</li><li class=\" j_tbnav_tab\">\n    <a href=\"/f?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;tab=album\" class=\" j_tbnav_tab_a\" stats-data=\"fr=tb0_forum&amp;st_mod=frs&amp;st_value=tabfrsphotogood\" frs-page=\"\" id=\"tab_picture\">图片</a>\n</li><li class=\" j_tbnav_tab\">\n    <a href=\"/f?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;tab=good&amp;cid=\" class=\" j_tbnav_tab_a\" stats-data=\"fr=tb0_forum&amp;st_mod=frs&amp;st_value=tabgood\">吧主推荐</a>\n</li><li class=\" j_tbnav_tab\">\n    <a href=\"/f?ie=utf-8&amp;kw=%E4%B9%90%E6%AD%A4%E4%B8%8D%E7%96%B2&amp;ie=utf-8\" class=\" j_tbnav_tab_a\" id=\"j_navtab_wanle\" target=\"_self\" stats-data=\"fr=tb0_forum&amp;st_mod=frs&amp;st_value=wanle\">玩乐</a>\n</li></ul></div><div class=\"p_thread thread_theme_5 thread_theme_bright_absolute\" id=\"thread_theme_5\"><div class=\"l_thread_info\"><ul class=\"l_posts_num\">\n\t<li class=\"l_pager pager_theme_4 pb_list_pager\"><span class=\"tP\">1</span>\n<a href=\"/p/9119688421?pn=2\">2</a>\n<a href=\"/p/9119688421?pn=3\">3</a>\n<a href=\"/p/9119688421?pn=4\">4</a>\n<a href=\"/p/9119688421?pn=2\">下一页</a>\n<a href=\"/p/9119688421?pn=4\">尾页</a>\n</li>\n\t<li class=\"l_reply_num\" style=\"margin-left:8px\"><span class=\"red\" style=\"margin-right:3px\">251</span>回复贴，共<span class=\"red\">4</span>页</li>\n\t<li class=\"l_reply_num\">，跳到 <input theme=\"4\" id=\"jumpPage4\" max-page=\"4\" type=\"text\" class=\"jump_input_bright\"> 页&nbsp;<button id=\"pager_go4\" type=\"button\" value=\"确定\" class=\"btn-sub btn-small jump_btn_bright\">确定</button>&nbsp;</li>\n</ul>\n<div id=\"tofrs_up\" class=\"tofrs_up\"><a href=\"/f?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8\" title=\"网球风云\">&lt;返回网球风云吧</a></div></div><div class=\"l_thread_manage\">\n\n\n    <div id=\"d_post_manage\">\n\t\t<a rel=\"noopener\" href=\"#\" class=\"d_post_manage_link\">贴子管理</a>\n\t    <ul id=\"j_quick_thread\" class=\"quick_thread_theme2\">\n\n\t    </ul>\n    </div>\n    <div id=\"notify_bubble\"></div>\n</div>\n<div class=\"loading-tip\" style=\"display:none;\"><span class=\"text\">&gt;0&lt; 加载中...</span></div></div><div class=\"pb_content clearfix\" id=\"pb_content\"><div class=\"left_section\"><div class=\"core_title_wrap_bright clearfix tbui_follow_fixed core_title_absolute_bright\" id=\"j_core_title_wrap\" style=\"top: 0px;\"><div class=\"core_title_bg j_core_title_bg\"></div>        <h3 class=\"core_title_txt pull-left text-overflow  \" title=\"【强烈恭喜】全红婵陈宇汐包揽跳水女子10米台巴黎奥运金银牌！\" style=\"width: 416px;\">        【强烈恭喜】全红婵陈宇汐包揽跳水女子10米台巴黎奥运金银牌！</h3><span class=\"core_title_btns pull-right\">        <a rel=\"noopener\" id=\"lzonly_cntn\" href=\"/p/9119688421?see_lz=1\" alog-alias=\"lzonly\" class=\"btn-sub btn-small\"><span id=\"lzonly\" class=\"d_lzonly_bdaside\">只看楼主</span></a><a rel=\"noopener\" class=\"btn-sub btn-small j_favor\" data-field=\"{&quot;status&quot;:0,&quot;is_anonym&quot;:false}\">收藏</a><a rel=\"noopener\" href=\"#\" id=\"quick_reply\" class=\"btn-small btn-sub j_quick_reply\"><i class=\"icon-reply\"></i>回复</a>    </span><div id=\"j_favthread\" class=\"p_favthread\"><p class=\"p_favthr_tip\"></p></div>    </div><div class=\"tittle_fill_dom filled\"></div> <div class=\"p_postlist\" id=\"j_p_postlist\"><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:1635505954,&quot;user_name&quot;:&quot;heinzfrentzen&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA?t=1532192361&quot;,&quot;user_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_Q6eeVK7&quot;},&quot;content&quot;:{&quot;post_id&quot;:150726491368,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u4e2d\\u56fd\\u961f\\u7b2c22\\u91d1\\uff01\\u65e0\\u60ac\\u5ff5\\uff01<br><img class=\\&quot;BDE_Image\\&quot; src=\\&quot;http:\\/\\/tiebapic.baidu.com\\/forum\\/w%3D580\\/sign=fa4e9202f67eca80120539efa1239712\\/07d6f7de9c82d15884e06d90c60a19d8bd3e4294.jpg?tbpicau=2024-08-18-05_d05a4e18efd81f49f38ed55275a28c4e\\&quot; size=\\&quot;616758\\&quot; changedsize=\\&quot;true\\&quot; width=\\&quot;560\\&quot; height=\\&quot;303\\&quot; size=\\&quot;616758\\&quot;><br><img class=\\&quot;BDE_Image\\&quot; src=\\&quot;http:\\/\\/tiebapic.baidu.com\\/forum\\/w%3D580\\/sign=81df64294ad79123e0e0947c9d345917\\/078788bf6c81800a5287bd2ff73533fa838b4794.jpg?tbpicau=2024-08-18-05_bad4bc8570a2a6ca4da65d61a4001daa\\&quot; size=\\&quot;550140\\&quot; changedsize=\\&quot;true\\&quot; width=\\&quot;560\\&quot; height=\\&quot;310\\&quot; size=\\&quot;550140\\&quot;>&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:1,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:0,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:0,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726491368\">                    <div class=\"d_author\">                    <div class=\"louzhubiaoshi_wrap\">\n                    <div class=\"louzhubiaoshi  j_louzhubiaoshi\" author=\"heinzfrentzen\">\n                        <a href=\"/p/9119688421?pid=150726491368&amp;see_lz=1#150726491368\"></a>\n                        </div>\n                </div>            <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;heinzfrentzen&quot;,&quot;id&quot;:&quot;tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA?t=1532192361&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA?t=1532192361&amp;fr=pb\"><img username=\"heinzfrentzen\" class=\"\" src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA?t=1532192361\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:1635505954}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;heinzfrentzen&quot;,&quot;id&quot;:&quot;tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA?t=1532192361&quot;}\" alog-group=\"p_author\" title=\"该用户已经连续签到301天了，连续30天一举“橙”名\" class=\"p_author_name sign_highlight j_user_card\" href=\"/home/main?id=tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA?t=1532192361&amp;fr=pb\" target=\"_blank\">heinzfrentzen</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon3_2\" title=\"本吧头衔15级，经验值35840，点击进入等级头衔说明页\"><div class=\"d_badge_title \">金满贯</div><div class=\"d_badge_lv\">15</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main  d_post_content_firstfloor\" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                            <div style=\"word-wrap:break-word;width:100%;\">\n                <div id=\"voteFlashPanel\"></div>\n            </div>\n            <div id=\"my_friends_vote_detail\" style=\"display:none;\"></div><cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726491368\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    中国队第22金！无悬念！<br><img class=\"BDE_Image\" src=\"http://tiebapic.baidu.com/forum/w%3D580/sign=fa4e9202f67eca80120539efa1239712/07d6f7de9c82d15884e06d90c60a19d8bd3e4294.jpg?tbpicau=2024-08-18-05_d05a4e18efd81f49f38ed55275a28c4e\" size=\"616758\" changedsize=\"true\" width=\"560\" height=\"303\"><br><img class=\"BDE_Image\" src=\"http://tiebapic.baidu.com/forum/w%3D580/sign=81df64294ad79123e0e0947c9d345917/078788bf6c81800a5287bd2ff73533fa838b4794.jpg?tbpicau=2024-08-18-05_bad4bc8570a2a6ca4da65d61a4001daa\" size=\"550140\" changedsize=\"true\" width=\"560\" height=\"310\"></div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"share_btn_wrapper\">                        <a href=\"javascript:;\" class=\"post-foot-send-gift-btn j-post-send-gift\" data-gift=\"{&quot;userId&quot;:&quot;1635505954&quot;,&quot;threadId&quot;:&quot;9119688421&quot;,&quot;postId&quot;:&quot;150726491368&quot;,&quot;userName&quot;:&quot;heinzfrentzen&quot;}\">送TA礼物</a>                    <div class=\"share_thread share_thread_wrapper\">\n                        <div id=\"pb_tbshare_container\"><div class=\"tbshare_popup_wrapper\"><div class=\"tbshare_popup_enter\"></div><div class=\"tbshare_popup_main clearfix\"><div class=\"tbshare_wrapper_theme_coco\"><ul class=\"\"><li><div class=\"tbshare_tieba tbshare_icon\" title=\"百度贴吧\" data-share=\"tieba\"><div class=\"tbshare_title_box\">百度贴吧</div></div></li><li><div class=\"tbshare_weixin tbshare_icon\" title=\"微信\" data-share=\"weixin\"><div class=\"tbshare_title_box\">微信</div></div></li><li><div class=\"tbshare_tsina tbshare_icon\" title=\"新浪微博\" data-share=\"tsina\"><div class=\"tbshare_title_box\">新浪微博</div></div></li><li><div class=\"tbshare_qqzone tbshare_icon\" title=\"QQ空间\" data-share=\"qqzone\"><div class=\"tbshare_title_box\">QQ空间</div></div></li><li><div class=\"tbshare_copy tbshare_icon\" onclick=\"return false;\" title=\"复制链接\" data-share=\"copy\"><div class=\"tbshare_title_box\">复制链接</div></div></li></ul></div></div></div></div>\n                    </div></div><div class=\"post-foot-send-gift-container\">    </div><div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:福建</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">1楼</span><span class=\"tail-info\">2024-08-06 22:09</span><a rel=\"noopener\" href=\"#\" class=\"p_reply p_reply_first\">回复</a></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper\" style=\"min-height: 0px; display: none;\" data-field=\"{&quot;pid&quot;:150726491368,&quot;floor_num&quot;:1,&quot;total_num&quot;:0}\"><div class=\"core_reply_border_top\"></div><div class=\"j_lzl_c_b_a core_reply_content\"><ul class=\"j_lzl_m_w\" style=\"display:none\"><li class=\"lzl_li_pager j_lzl_l_p lzl_li_pager_s\" data-field=\"{total_num:0,total_page:0}\"><a rel=\"noopener\" class=\"j_lzl_p btn-sub btn-small pull-right\" href=\"##\"><i class=\"icon-reply\"></i>我也说一句</a><p>&nbsp;</p></li></ul><div class=\"lzl_editor_container j_lzl_e_c lzl_editor_container_s\" style=\"display:none;\"></div><input type=\"text\" class=\"j_lzl_e_f_h\" style=\"display:none;\"></div><div class=\"core_reply_border_bottom\"></div></div></div></div></div><script>window.radar && window.radar.mark('fs');</script><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:1635505954,&quot;user_name&quot;:&quot;heinzfrentzen&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA?t=1532192361&quot;,&quot;user_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_Q6eeVK7&quot;},&quot;content&quot;:{&quot;post_id&quot;:150726496253,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u5168\\u540e\\u536b\\u5195\\u6210\\u529f\\uff0c\\u8fd8\\u662f\\u52a8\\u4f5c\\u8d28\\u91cf\\u9ad8\\uff0c\\u5c0f\\u70b8\\u4e5f\\u8d62\\u4e86&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:2,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:4,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:1,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726496253\">                    <div class=\"d_author\">                    <div class=\"louzhubiaoshi_wrap\">\n                    <div class=\"louzhubiaoshi  j_louzhubiaoshi\" author=\"heinzfrentzen\">\n                        <a href=\"/p/9119688421?pid=150726496253&amp;see_lz=1#150726496253\"></a>\n                        </div>\n                </div>            <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;heinzfrentzen&quot;,&quot;id&quot;:&quot;tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA?t=1532192361&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA?t=1532192361&amp;fr=pb\"><img username=\"heinzfrentzen\" class=\"\" src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA?t=1532192361\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:1635505954}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;heinzfrentzen&quot;,&quot;id&quot;:&quot;tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA?t=1532192361&quot;}\" alog-group=\"p_author\" title=\"该用户已经连续签到301天了，连续30天一举“橙”名\" class=\"p_author_name sign_highlight j_user_card\" href=\"/home/main?id=tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA?t=1532192361&amp;fr=pb\" target=\"_blank\">heinzfrentzen</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon3_2\" title=\"本吧头衔15级，经验值35840，点击进入等级头衔说明页\"><div class=\"d_badge_title \">金满贯</div><div class=\"d_badge_lv\">15</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726496253\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    全后卫冕成功，还是动作质量高，小炸也赢了</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:福建</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">2楼</span><span class=\"tail-info\">2024-08-06 22:10</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726496253,&quot;total_num&quot;:4}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(4)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper\" style=\"min-height: 0px;\" data-field=\"{&quot;pid&quot;:150726496253,&quot;floor_num&quot;:2,&quot;total_num&quot;:4}\"><div class=\"core_reply_border_top\"></div><div class=\"j_lzl_c_b_a core_reply_content\"><ul class=\"j_lzl_m_w\" style=\"display:\"><li class=\"lzl_single_post j_lzl_s_p first_no_border\" data-field=\"{'pid':'150726496253','spid':'150726735994','user_name':'hxw19890526','portrait':'tb.1.857677c.SDXilxBDExFDgOGpn5AxBg','showname':'hxw19890526','user_nickname':'hxw19890526'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'hxw19890526', 'id':'tb.1.857677c.SDXilxBDExFDgOGpn5AxBg'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.857677c.SDXilxBDExFDgOGpn5AxBg&amp;ie=utf-8&amp;fr=pb\" username=\"hxw19890526\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.857677c.SDXilxBDExFDgOGpn5AxBg\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'hxw19890526', 'id':'tb.1.857677c.SDXilxBDExFDgOGpn5AxBg'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.857677c.SDXilxBDExFDgOGpn5AxBg&amp;ie=utf-8&amp;fr=pb\" username=\"hxw19890526\">hxw19890526</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">厉害啊</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display: none;\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;22:55</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150726496253','spid':'150726899644','user_name':'资源338资源','portrait':'tb.1.d8467679.FnXiyLwzl9DjD4O4sQhuaQ','showname':'🍓湿🌹啦🍓','user_nickname':'贴吧用户_JR7XEPD'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'资源338资源', 'id':'tb.1.d8467679.FnXiyLwzl9DjD4O4sQhuaQ'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.d8467679.FnXiyLwzl9DjD4O4sQhuaQ&amp;ie=utf-8&amp;fr=pb\" username=\"资源338资源\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.d8467679.FnXiyLwzl9DjD4O4sQhuaQ\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'资源338资源', 'id':'tb.1.d8467679.FnXiyLwzl9DjD4O4sQhuaQ'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.d8467679.FnXiyLwzl9DjD4O4sQhuaQ&amp;ie=utf-8&amp;fr=pb\" username=\"资源338资源\">🍓湿<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/3-3.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\">啦🍓</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">浙大美女云集，其中顶级校花，令人难忘滴滴五十七分钟，还是这句话！你们就去我刚刚刚发的↰↰↰↰那里看，<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon20.png\"><img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon10.png\">遭不住！~~~！！！！</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display: none;\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;23:25</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150726496253','spid':'150727078910','user_name':'','portrait':'tb.1.7dbe2a1d.UI_y9dyhLAXgKUz_yyAysw','showname':'💙💚婧儿💙💚','user_nickname':'贴吧用户_JR9658e'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'', 'id':'tb.1.7dbe2a1d.UI_y9dyhLAXgKUz_yyAysw'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.7dbe2a1d.UI_y9dyhLAXgKUz_yyAysw&amp;ie=utf-8&amp;fr=pb\" username=\"\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.7dbe2a1d.UI_y9dyhLAXgKUz_yyAysw\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'', 'id':'tb.1.7dbe2a1d.UI_y9dyhLAXgKUz_yyAysw'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.7dbe2a1d.UI_y9dyhLAXgKUz_yyAysw&amp;ie=utf-8&amp;fr=pb\" username=\"\">💙💚婧儿💙💚</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">不能</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display: none;\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-7&nbsp;00:01</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div><div class=\"user-hide-post-down\" style=\"top: 36px; right: 161.734px; display: none;\"></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150726496253','spid':'150727085343','user_name':'','portrait':'tb.1.7dbe2a1d.UI_y9dyhLAXgKUz_yyAysw','showname':'💙💚婧儿💙💚','user_nickname':'贴吧用户_JR9658e'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'', 'id':'tb.1.7dbe2a1d.UI_y9dyhLAXgKUz_yyAysw'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.7dbe2a1d.UI_y9dyhLAXgKUz_yyAysw&amp;ie=utf-8&amp;fr=pb\" username=\"\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.7dbe2a1d.UI_y9dyhLAXgKUz_yyAysw\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'', 'id':'tb.1.7dbe2a1d.UI_y9dyhLAXgKUz_yyAysw'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.7dbe2a1d.UI_y9dyhLAXgKUz_yyAysw&amp;ie=utf-8&amp;fr=pb\" username=\"\">💙💚婧儿💙💚</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">她！←！一张再标准不过的古典瓜子脸，就象从最标准的美女漫画上走下来的人一样！！太美！！我转载到我贴了！！！吧友观！！</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display: none;\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-7&nbsp;00:02</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_li_pager j_lzl_l_p lzl_li_pager_s\" data-field=\"{total_num:4,total_page:1}\"><a rel=\"noopener\" class=\"j_lzl_p btn-sub btn-small pull-right\" href=\"##\"><i class=\"icon-reply\"></i>我也说一句</a><p>&nbsp;</p></li></ul><div class=\"lzl_editor_container j_lzl_e_c lzl_editor_container_s\" style=\"display:none;\"></div><input type=\"text\" class=\"j_lzl_e_f_h\" style=\"display:none;\"></div><div class=\"core_reply_border_bottom\"></div></div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix\" data-field=\"{}\" data-index=\"3\">        <style>        ._1eqtk61{border-bottom:0 solid #f5f5f5}._8x9ty64{border-bottom:1px solid #eee;margin:0;padding:0;position:relative}._8x9ty64 h3{font-weight:400;padding:0}._8x9ty64 a{text-decoration:none}._8x9ty64 em{color:#3066b4;font-style:normal}._8x9ty64:last-child{border-bottom:0}._1n8n23c{margin:0}.b47yy3h{padding-top:0}._8x9ty64{background-color:#fafbfc;border-left:1px solid #e5e5e5;font-family:PingFangSC-Medium,Helvetica Neue,Helvetica,Arial,sans-serif}._8x9ty64,._8x9ty64:last-child{border-bottom:1px solid #e5e5e5}.ghmaff1{margin-bottom:15px}._2cj3g78{margin-bottom:10px}.edshq5u{margin-top:15px}._4skftda,.pe5wcz2{margin-top:10px}.ugaqg4d{align-items:center;display:flex;height:100%}.km5nyww{margin-bottom:15px}._9s8xgss{margin-top:15px}.ghmaff1+.pe5wcz2{margin-top:-5px}.bh9veya{float:right;width:74px}.tumcbnr{float:left;margin-top:19px;width:130px}.fjyf1br{background-color:#fff;margin-left:130px;padding:25px 0 8px 20px}.fjyf1br:hover{background-color:transparent}body a.hdyqnku,body div.hdyqnku{color:#000;display:block;font-family:Arial,Helvetica,sans-serif;font-size:20px;font-weight:400;line-height:30px;margin:0;padding-top:0;text-decoration:none;transform:translateY(.25em)}body a.hdyqnku:before,body div.hdyqnku:before{content:\"\";display:block;height:0;margin-top:-10px}a.hdyqnku div{word-break:break-all}.v3zrcrj{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.q1dpns8{-webkit-line-clamp:2}.ndfxdqz,.q1dpns8{word-wrap:break-word;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden;word-break:break-all}.ndfxdqz{-webkit-line-clamp:3}._7qtpw9j{-webkit-line-clamp:4}._2dt35k2,._7qtpw9j{word-wrap:break-word;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden;word-break:break-all}._2dt35k2{-webkit-line-clamp:5}._1r3uysh{-webkit-line-clamp:10}._1r3uysh,.yux2cc6{word-wrap:break-word;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden;word-break:break-all}.yux2cc6{-webkit-line-clamp:12}._4bxpxs9{-webkit-line-clamp:18;word-wrap:break-word;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden;word-break:break-all}body ._9cy84ta{color:#999;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:22px;padding-top:0;position:relative;transform:translateY(.4666666667em)}body ._9cy84ta:before{content:\"\";display:block;height:0;margin-top:-10px}body ._9cy84ta a{color:#999;display:block}body ._9cy84ta a .j4rc4ke{color:#999}body ._9cy84ta button{background:#fff;border:1px solid;border-radius:3px;bottom:0;color:#38f;float:right;font-size:12px;line-height:12px;padding:7px 13px;position:absolute;right:0}body ._9cy84ta ._3cyr2tj{margin-left:5px}body ._9cy84ta .wwhy5qm{border:1px solid #eee;border-radius:50%;display:inline-block;height:22px;line-height:0;margin-right:7px;margin-top:-2px;vertical-align:middle;width:22px}body ._9cy84ta .q76dsk8{margin-right:8px}.tbmu64u{position:absolute;right:0}._5kn8sv5{-webkit-box-orient:horizontal;-webkit-box-align:stretch;-webkit-align-content:flex-start;-webkit-align-items:stretch;display:-webkit-flex;-webkit-flex-wrap:nowrap;-webkit-justify-content:space-between;width:auto}.z8bq2t7{flex:1}body ._9cy84ta a.mk8dv2x,body ._9cy84ta div.mk8dv2x{display:flex;justify-content:space-between}body ._9cy84ta{font-family:PingFangSC-Medium,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:1;margin-right:13px;text-align:right;transform:none}.qqvbase,body ._9cy84ta .shjuuby{display:inline-block}.qqvbase{margin-left:12px;margin-right:2px;vertical-align:middle;width:64px}._6kd2k9z{display:inline-block}._9fe13qw{background:#f5f5f5;border-radius:4px;color:#3066b4;font-size:14px;height:28px;line-height:28px;overflow:hidden;padding:0 8px;text-overflow:ellipsis;white-space:nowrap}._2jze4xh{display:inline-block;width:100%}._9zhq8sa{display:block}._9fe13qw i,._9fe13qw img{margin-right:5px}._9fe13qw img{display:block;float:left;height:16px;margin-top:6px;width:16px}.e5xahd5 i{margin-right:5px}.c91q684{color:#33cc75}.e8eykyd{color:#00c8c8}._9fe13qw{background-color:#fff;border:1px solid #3066b4;border-radius:2px;font-family:PingFangSC-Regular,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:12px;height:26px;line-height:26px;padding:0;text-align:center}._94sn3jw{margin-left:4px}._47q9e4t{margin-left:0}body ._7dx78mp{font-size:14px;line-height:24px;padding-top:0;transform:translateY(.3571428571em)}body ._7dx78mp:before{content:\"\";display:block;height:0;margin-top:-10px}body ._7dx78mp a,body ._7dx78mp div{color:#3066b4}body ._7dx78mp ._1d7gc64{color:#999;font-size:15px;line-height:25px}body ._7dx78mp .erq8uj7{margin-right:5px}body ._7dx78mp{padding-right:20px}body ._7dx78mp .uq8p2c4{max-height:75px}._7kjxh8t{padding-bottom:100%}.xtq5v37{padding-bottom:133.33333333%}.uwucu2h{padding-bottom:33.3333333333%}._3zt36qa{padding-bottom:56.25%}.y7m392e{padding-bottom:50%}.ajthcgk{padding-bottom:75%}.pvkf2b2{padding-bottom:66.66666667%}.d94ksm9{padding-bottom:40%}._5dc27n3{background-position:50%;background-repeat:no-repeat;background-size:cover}._3zt36qa,._7kjxh8t,.ajthcgk,.d94ksm9,.pvkf2b2,.uwucu2h,.xtq5v37,.y7m392e{height:0;overflow:hidden}._3zt36qa img,._7kjxh8t img,.ajthcgk img,.d94ksm9 img,.pvkf2b2 img,.uwucu2h img,.xtq5v37 img,.y7m392e img{width:100%}.s6zxc2c{border-radius:9px}.r1n7ehc{border-top-left-radius:0}.ruyfyqy{border-top-right-radius:0}.x17vnj2{border-bottom-right-radius:0}._5k9skk2{border-bottom-left-radius:0}.dz8whjw{color:#333;font-size:14px;line-height:24px;margin-top:2px}._32jnwrs{color:#f60;font-size:14px;line-height:22px;margin:5px 0;vertical-align:middle}.na9zhar{position:relative}.nb41sx9{background:radial-gradient(transparent 50%,rgba(0,0,0,.05) 100%);height:100%;left:0;position:absolute;top:0;transform:translateZ(0);width:100%}.s6zxc2c .nb41sx9{border-radius:9px}.r1n7ehc .nb41sx9{border-top-left-radius:0}.ruyfyqy .nb41sx9{border-top-right-radius:0}.x17vnj2 .nb41sx9{border-bottom-right-radius:0}._5k9skk2 .nb41sx9{border-bottom-left-radius:0}.na9zhar img{border:none}body .zz8sa9f{display:flex;font-size:0;overflow:hidden}body .bhz4zux{margin-right:8px;max-width:35px;min-width:35px;vertical-align:top}body ._2md9tzv{background:url(//nv00.cdn.bcebos.com/nv01/static/ecom/img/pc/head-img-535c333798.png) no-repeat 50%;background-size:100% 100%;height:100%;width:100%}body .tnf86n6{height:35px;min-width:0}body .ruezuqm{color:#000;font-size:16px;font-weight:inherit;margin-bottom:8px;text-overflow:ellipsis;white-space:nowrap}body ._2gtkx1q{color:#999;font-size:12px;line-height:1}body .zz8sa9f .br54c5r img{width:100%}body .zz8sa9f{display:block}body .bhz4zux{border:1px solid #ccc;height:80px;margin:0 17px;max-width:80px;min-width:80px;padding:3px;width:80px}body .tnf86n6{display:block;height:auto}body .ruezuqm{color:#2d64b3;font-size:12px;height:12px;line-height:1;margin-top:24px;overflow:hidden;text-align:center;word-break:break-all}</style><div>        <div><div class=\"_1eqtk61\"><div><div class=\"_8x9ty64 fc-000000006ff4131f-2327 _8x9ty64\" data-cegduid=\"\" data-lp=\"https%3A%2F%2Fb2b.baidu.com%2Faitf%2Fs%3Fq%3D%25E8%258B%258F%25E5%25B7%259E%25E6%25B1%25BD%25E8%25BD%25A6%25E7%25A7%259F%25E8%25B5%2581%26from%3Dsearch%26fid%3D604714779%26styl%3Db%26sid%3D1510132%26a_keywordid%3D%7Bkeywordid%7D%26a_unitid%3D%7Bunitid%7D%26a_planid%3D%7Bplanid%7D\" data-change-wise-baozhang-text=\"true\" data-rank=\"0\" data-nvk=\"Tv-b5HD3P16zPWmvPHR0mvYqnHmzP6Kzmy4o5HD0ThNkIjYkP1czrHmdPjT3rjT10A-s5HnvnjfLPjR1rHb0Iv-8uhtqPW0dPHfLnjT3rH6z\" data-extra=\"\" data-ecimtimesign=\"108\" data-srcid=\"2327\" data-placeid=\"2327\" data-cmatchid=\"1626\" data-general-xst=\"m1YKmWYsnDRdnH61nbNjPbwKfHKDnHK7nRnsPWb4f1N7PWmLn0715HD3P16zPWmvPHNxnHmzP-ts0gTqzqgyLTUe_egg3_ZX0gDq1xWZtoxMdnmKIHY1nHb4nHm3ns7Y5HDLnWc4PWRYP16KUgDqnfcs0VxB_eRKmv6quhPxTAnKTMfqn0D1PH0LP1bLnjmL\" data-appinfo=\"0_2000000000_1_1\" data-tradeid=\"\" data-show-card-top=\"0\" data-bidword=\"\" data-ecr-async-infos=\"\" observer=\"1\"><div><div><div class=\"tumcbnr tumcbnr\"><div><a class=\"zz8sa9f\" href=\"http://www.baidu.com/baidu.php?url=af0000KpxzUee8WytKujPIpl05C_G70Z_GA_P5FkAyo16E_gY6Jauyw5jZN1ztXRWPi6x2IQc-HkgXS2vvsudUYnINDFSSQEIHNE5ggCcOe05ha7mY-EPnff2cJgl6_u5loRTTtCQ7ORVcyViAk_axuoe442ZyAgGXOoZKDc6RUm6sxCrOa4w90ziKZ_5sPlPHfeyIFJ0AGZEekDvb3quHygBmup.7R_NR2Ar5Od66EzgSNerQ0BK-qjgKZLqWAZ1vmIMo9vxgj4e_5o33IOM9tSMjld3xg4mx5u9qx-9qEH9tOZjexZjES8Z1vmxgI9vNqIT1VQDpyuCp88EDkYvIMWgvX5WElkYP77BOoZBmoLNvNtTMNM-eRlrKYdvFWG_LU81k_tIhOubl_t8aFqjDk_3tILZkzXPMZJ1z3lQnyFWWuE_ooLeVOySe-SWDk7SOYOohzsOwSUqEHISUtVjVOPSLjqAJEklcELecqNxKYxhoOdkOhzqPL4EvqxuPSOOolltHDgeOHS8UQjqZ4EvqPL4EzYrLtLeT5YpJO-d9JmerVqLQxYwYA5Pe5O6ObI8eO_xenI---MO6kOSjGSgz_9BOBRU57-OHk_______OxdTgHgyyyyyyyyyyyyf4UcSjqOOgv1um8Z6OdkxwsxQkOtDgzdq_gzOdq8881lFELtSgtLSEOgqZ4EvOYcOusO-ItEd5kexSkOw_Ot7-----IO3Otj6SN--MO6qEdYXx_OU_____dvpVIbgjePyWqxlZSzM-HJdTXgSwOs51OxveqMSzevOBhpletx1OSjqXxSW3OBeO6XEU4e2OSQeqZoZqS1C3mElrWqiQOuoOejEzqZQSpolrZter1-4p81uYvyyX5qA1lry6GyAp7WW_3e826.U1Yk0ZDq1xWZtoxMdnm0IjLQdIUIkE81VIxBsI30pyYqnHmzP6KdpHY0TA-b5Hf0mv-b5Hb10AFG5HnsnfKhIjYs0ZKC5H00ULnqn0KBI1Ys0A4Y5H00TLCq0ZFMIA7M5H00UMus5H08nj0snj0snj00ugFM5H00IZF9uARqn0KBuA-b5H0swHRkrjnzwRnvwD7KnDfknDRkf10vrH-jPRRvPWTs0AwWmvfq0A71gv-bm1dsTzd8p6KM5gI1UMn0UL0k5H00TZ0Y5H00TMfqPWTY0Z7spyfqn0Kkmv-b5H00mycqn7ts0ZKs5H00Ugws5H00uAwETjYk0ZFJ5H00IZN15HD4PHmsrHbzP1bYrH61PHnLrj00mynqnfKsUWYs0ZK9I7qhUA7M5H00TyILujYs0AN1IjYs0ANYpyfqQHD0mgPsmvnqn0KdTA-8mvnqn0KhmLNY5H00mywhUA7M5HD0IvuzUvYq0AFY5H00XZPYIHY1nHb4nHm3nsKzug7Y5HDLnWc4PWRYP163P1n0Tv-b5H0snj0snj0sPhuhPjD1nym0ULfqn0KETMKY5H0WnaPDw-fWnansc10Wna3sc10WwDuRc10WwDuRc108nj0snj0sc1D8nj0snj0sc10WnansQW0snj0snansc10Wnansc100TMw9pyfq0AVG5H00UgfqnWfkn7tznjRk0AdW5HKxnW0dnfKVmdqhThqV5HKxn0Kbmy4dmhNxTAk9Uh-bT1Ysg100mywkXHLg3ord0A7bTgfqn0KGTvP_5H00TydY5H00mywxTvqdThP-5H0WpAqYgLIEThfW0APzm1YYnH0Yr0&amp;us=newvui&amp;xst=m1YKmWYsnDRdnH61nbNjPbwKfHKDnHK7nRnsPWb4f1N7PWmLn0715HD3P16zPWmvPHNxnHmzP-ts0gTqzqgyLTUe_egg3_ZX0gDq1xWZtoxMdnmKIHY1nHb4nHm3ns7Y5HDLnWc4PWRYP16KUgDqnfcs0VxB_eRKmv6quhPxTAnKTMfqn0D1PH0LP1bLnjmL&amp;ai=0_2000000000_1_1&amp;word=&amp;ck=0.0.0.0.0.0.0.0&amp;shh=tieba.baidu.com\" target=\"_blank\"><div class=\"bhz4zux\"> <div class=\"_2md9tzv\"></div></div><div class=\"tnf86n6\"><div class=\"ruezuqm\">百度爱采购</div></div></a></div></div><div class=\"fjyf1br fjyf1br\"><div style=\"margin-bottom: 12px;\"><div class=\"_7dx78mp\"><a href=\"http://www.baidu.com/baidu.php?url=af0000KpxzUee8WytKujPIpl05C_G70Z_GA_P5FkAyo16E_gY6Jauyw5jZN1ztXRWPi6x2IQc-HkgXS2vvsudUYnINDFSSQEIHNE5ggCcOe05ha7mY-EPnff2cJgl6_u5loRTTtCQ7ORVcyViAk_axuoe442ZyAgGXOoZKDc6RUm6sxCrOa4w90ziKZ_5sPlPHfeyIFJ0AGZEekDvb3quHygBmup.7R_NR2Ar5Od66EzgSNerQ0BK-qjgKZLqWAZ1vmIMo9vxgj4e_5o33IOM9tSMjld3xg4mx5u9qx-9qEH9tOZjexZjES8Z1vmxgI9vNqIT1VQDpyuCp88EDkYvIMWgvX5WElkYP77BOoZBmoLNvNtTMNM-eRlrKYdvFWG_LU81k_tIhOubl_t8aFqjDk_3tILZkzXPMZJ1z3lQnyFWWuE_ooLeVOySe-SWDk7SOYOohzsOwSUqEHISUtVjVOPSLjqAJEklcELecqNxKYxhoOdkOhzqPL4EvqxuPSOOolltHDgeOHS8UQjqZ4EvqPL4EzYrLtLeT5YpJO-d9JmerVqLQxYwYA5Pe5O6ObI8eO_xenI---MO6kOSjGSgz_9BOBRU57-OHk_______OxdTgHgyyyyyyyyyyyyf4UcSjqOOgv1um8Z6OdkxwsxQkOtDgzdq_gzOdq8881lFELtSgtLSEOgqZ4EvOYcOusO-ItEd5kexSkOw_Ot7-----IO3Otj6SN--MO6qEdYXx_OU_____dvpVIbgjePyWqxlZSzM-HJdTXgSwOs51OxveqMSzevOBhpletx1OSjqXxSW3OBeO6XEU4e2OSQeqZoZqS1C3mElrWqiQOuoOejEzqZQSpolrZter1-4p81uYvyyX5qA1lry6GyAp7WW_3e826.U1Yk0ZDq1xWZtoxMdnm0IjLQdIUIkE81VIxBsI30pyYqnHmzP6KdpHY0TA-b5Hf0mv-b5Hb10AFG5HnsnfKhIjYs0ZKC5H00ULnqn0KBI1Ys0A4Y5H00TLCq0ZFMIA7M5H00UMus5H08nj0snj0snj00ugFM5H00IZF9uARqn0KBuA-b5H0swHRkrjnzwRnvwD7KnDfknDRkf10vrH-jPRRvPWTs0AwWmvfq0A71gv-bm1dsTzd8p6KM5gI1UMn0UL0k5H00TZ0Y5H00TMfqPWTY0Z7spyfqn0Kkmv-b5H00mycqn7ts0ZKs5H00Ugws5H00uAwETjYk0ZFJ5H00IZN15HD4PHmsrHbzP1bYrH61PHnLrj00mynqnfKsUWYs0ZK9I7qhUA7M5H00TyILujYs0AN1IjYs0ANYpyfqQHD0mgPsmvnqn0KdTA-8mvnqn0KhmLNY5H00mywhUA7M5HD0IvuzUvYq0AFY5H00XZPYIHY1nHb4nHm3nsKzug7Y5HDLnWc4PWRYP163P1n0Tv-b5H0snj0snj0sPhuhPjD1nym0ULfqn0KETMKY5H0WnaPDw-fWnansc10Wna3sc10WwDuRc10WwDuRc108nj0snj0sc1D8nj0snj0sc10WnansQW0snj0snansc10Wnansc100TMw9pyfq0AVG5H00UgfqnWfkn7tznjRk0AdW5HKxnW0dnfKVmdqhThqV5HKxn0Kbmy4dmhNxTAk9Uh-bT1Ysg100mywkXHLg3ord0A7bTgfqn0KGTvP_5H00TydY5H00mywxTvqdThP-5H0WpAqYgLIEThfW0APzm1YYnH0Yr0&amp;us=newvui&amp;xst=m1YKmWYsnDRdnH61nbNjPbwKfHKDnHK7nRnsPWb4f1N7PWmLn0715HD3P16zPWmvPHNxnHmzP-ts0gTqzqgyLTUe_egg3_ZX0gDq1xWZtoxMdnmKIHY1nHb4nHm3ns7Y5HDLnWc4PWRYP16KUgDqnfcs0VxB_eRKmv6quhPxTAnKTMfqn0D1PH0LP1bLnjmL&amp;ai=0_2000000000_1_1&amp;word=&amp;ck=0.0.0.0.0.0.0.0&amp;shh=tieba.baidu.com\" target=\"_blank\"><div class=\"ndfxdqz ec_desc uq8p2c4\"><span>百度爱采购为你优选海量汽车租赁热销货源，支持在线选购，实时询价。批发选购汽车租赁，上百度爱采购汽车租赁专题页。</span></div></a></div></div><div style=\"margin-bottom: 24px; width: 310px;\"><a href=\"http://www.baidu.com/baidu.php?url=af0000KpxzUee8WytKujPIpl05C_G70Z_GA_P5FkAyo16E_gY6Jauyw5jZN1ztXRWPi6x2IQc-HkgXS2vvsudUYnINDFSSQEIHNE5ggCcOe05ha7mY-EPnff2cJgl6_u5loRTTtCQ7ORVcyViAk_axuoe442ZyAgGXOoZKDc6RUm6sxCrOa4w90ziKZ_5sPlPHfeyIFJ0AGZEekDvb3quHygBmup.7R_NR2Ar5Od66EzgSNerQ0BK-qjgKZLqWAZ1vmIMo9vxgj4e_5o33IOM9tSMjld3xg4mx5u9qx-9qEH9tOZjexZjES8Z1vmxgI9vNqIT1VQDpyuCp88EDkYvIMWgvX5WElkYP77BOoZBmoLNvNtTMNM-eRlrKYdvFWG_LU81k_tIhOubl_t8aFqjDk_3tILZkzXPMZJ1z3lQnyFWWuE_ooLeVOySe-SWDk7SOYOohzsOwSUqEHISUtVjVOPSLjqAJEklcELecqNxKYxhoOdkOhzqPL4EvqxuPSOOolltHDgeOHS8UQjqZ4EvqPL4EzYrLtLeT5YpJO-d9JmerVqLQxYwYA5Pe5O6ObI8eO_xenI---MO6kOSjGSgz_9BOBRU57-OHk_______OxdTgHgyyyyyyyyyyyyf4UcSjqOOgv1um8Z6OdkxwsxQkOtDgzdq_gzOdq8881lFELtSgtLSEOgqZ4EvOYcOusO-ItEd5kexSkOw_Ot7-----IO3Otj6SN--MO6qEdYXx_OU_____dvpVIbgjePyWqxlZSzM-HJdTXgSwOs51OxveqMSzevOBhpletx1OSjqXxSW3OBeO6XEU4e2OSQeqZoZqS1C3mElrWqiQOuoOejEzqZQSpolrZter1-4p81uYvyyX5qA1lry6GyAp7WW_3e826.U1Yk0ZDq1xWZtoxMdnm0IjLQdIUIkE81VIxBsI30pyYqnHmzP6KdpHY0TA-b5Hf0mv-b5Hb10AFG5HnsnfKhIjYs0ZKC5H00ULnqn0KBI1Ys0A4Y5H00TLCq0ZFMIA7M5H00UMus5H08nj0snj0snj00ugFM5H00IZF9uARqn0KBuA-b5H0swHRkrjnzwRnvwD7KnDfknDRkf10vrH-jPRRvPWTs0AwWmvfq0A71gv-bm1dsTzd8p6KM5gI1UMn0UL0k5H00TZ0Y5H00TMfqPWTY0Z7spyfqn0Kkmv-b5H00mycqn7ts0ZKs5H00Ugws5H00uAwETjYk0ZFJ5H00IZN15HD4PHmsrHbzP1bYrH61PHnLrj00mynqnfKsUWYs0ZK9I7qhUA7M5H00TyILujYs0AN1IjYs0ANYpyfqQHD0mgPsmvnqn0KdTA-8mvnqn0KhmLNY5H00mywhUA7M5HD0IvuzUvYq0AFY5H00XZPYIHY1nHb4nHm3nsKzug7Y5HDLnWc4PWRYP163P1n0Tv-b5H0snj0snj0sPhuhPjD1nym0ULfqn0KETMKY5H0WnaPDw-fWnansc10Wna3sc10WwDuRc10WwDuRc108nj0snj0sc1D8nj0snj0sc10WnansQW0snj0snansc10Wnansc100TMw9pyfq0AVG5H00UgfqnWfkn7tznjRk0AdW5HKxnW0dnfKVmdqhThqV5HKxn0Kbmy4dmhNxTAk9Uh-bT1Ysg100mywkXHLg3ord0A7bTgfqn0KGTvP_5H00TydY5H00mywxTvqdThP-5H0WpAqYgLIEThfW0APzm1YYnH0Yr0&amp;us=newvui&amp;xst=m1YKmWYsnDRdnH61nbNjPbwKfHKDnHK7nRnsPWb4f1N7PWmLn0715HD3P16zPWmvPHNxnHmzP-ts0gTqzqgyLTUe_egg3_ZX0gDq1xWZtoxMdnmKIHY1nHb4nHm3ns7Y5HDLnWc4PWRYP16KUgDqnfcs0VxB_eRKmv6quhPxTAnKTMfqn0D1PH0LP1bLnjmL&amp;ai=0_2000000000_1_1&amp;word=&amp;ck=0.0.0.0.0.0.0.0&amp;shh=tieba.baidu.com\" target=\"_blank\"><div class=\"_5dc27n3 r1n7ehc ruyfyqy x17vnj2 _5k9skk2 _3zt36qa na9zhar ec-img\"><img src=\"https://ns-strategy.cdn.bcebos.com/ns-strategy/upload/fc_big_pic/part-00564-1575.jpg\"><div class=\"nb41sx9\"></div></div></a></div><div><div class=\"_9cy84ta\"><div class=\"v3zrcrj\"><span>2024-08-07 01:31</span><span class=\"j4rc4ke\"><span class=\"ec-tuiguang ecfc-tuiguang _94sn3jw\">广告</span></span><span class=\"qqvbase\"><div><div><div><a href=\"http://www.baidu.com/baidu.php?url=af0000KpxzUee8WytKujPIpl05C_G70Z_GA_P5FkAyo16E_gY6Jauyw5jZN1ztXRWPi6x2IQc-HkgXS2vvsudUYnINDFSSQEIHNE5ggCcOe05ha7mY-EPnff2cJgl6_u5loRTTtCQ7ORVcyViAk_axuoe442ZyAgGXOoZKDc6RUm6sxCrOa4w90ziKZ_5sPlPHfeyIFJ0AGZEekDvb3quHygBmup.7R_NR2Ar5Od66EzgSNerQ0BK-qjgKZLqWAZ1vmIMo9vxgj4e_5o33IOM9tSMjld3xg4mx5u9qx-9qEH9tOZjexZjES8Z1vmxgI9vNqIT1VQDpyuCp88EDkYvIMWgvX5WElkYP77BOoZBmoLNvNtTMNM-eRlrKYdvFWG_LU81k_tIhOubl_t8aFqjDk_3tILZkzXPMZJ1z3lQnyFWWuE_ooLeVOySe-SWDk7SOYOohzsOwSUqEHISUtVjVOPSLjqAJEklcELecqNxKYxhoOdkOhzqPL4EvqxuPSOOolltHDgeOHS8UQjqZ4EvqPL4EzYrLtLeT5YpJO-d9JmerVqLQxYwYA5Pe5O6ObI8eO_xenI---MO6kOSjGSgz_9BOBRU57-OHk_______OxdTgHgyyyyyyyyyyyyf4UcSjqOOgv1um8Z6OdkxwsxQkOtDgzdq_gzOdq8881lFELtSgtLSEOgqZ4EvOYcOusO-ItEd5kexSkOw_Ot7-----IO3Otj6SN--MO6qEdYXx_OU_____dvpVIbgjePyWqxlZSzM-HJdTXgSwOs51OxveqMSzevOBhpletx1OSjqXxSW3OBeO6XEU4e2OSQeqZoZqS1C3mElrWqiQOuoOejEzqZQSpolrZter1-4p81uYvyyX5qA1lry6GyAp7WW_3e826.U1Yk0ZDq1xWZtoxMdnm0IjLQdIUIkE81VIxBsI30pyYqnHmzP6KdpHY0TA-b5Hf0mv-b5Hb10AFG5HnsnfKhIjYs0ZKC5H00ULnqn0KBI1Ys0A4Y5H00TLCq0ZFMIA7M5H00UMus5H08nj0snj0snj00ugFM5H00IZF9uARqn0KBuA-b5H0swHRkrjnzwRnvwD7KnDfknDRkf10vrH-jPRRvPWTs0AwWmvfq0A71gv-bm1dsTzd8p6KM5gI1UMn0UL0k5H00TZ0Y5H00TMfqPWTY0Z7spyfqn0Kkmv-b5H00mycqn7ts0ZKs5H00Ugws5H00uAwETjYk0ZFJ5H00IZN15HD4PHmsrHbzP1bYrH61PHnLrj00mynqnfKsUWYs0ZK9I7qhUA7M5H00TyILujYs0AN1IjYs0ANYpyfqQHD0mgPsmvnqn0KdTA-8mvnqn0KhmLNY5H00mywhUA7M5HD0IvuzUvYq0AFY5H00XZPYIHY1nHb4nHm3nsKzug7Y5HDLnWc4PWRYP163P1n0Tv-b5H0snj0snj0sPhuhPjD1nym0ULfqn0KETMKY5H0WnaPDw-fWnansc10Wna3sc10WwDuRc10WwDuRc108nj0snj0sc1D8nj0snj0sc10WnansQW0snj0snansc10Wnansc100TMw9pyfq0AVG5H00UgfqnWfkn7tznjRk0AdW5HKxnW0dnfKVmdqhThqV5HKxn0Kbmy4dmhNxTAk9Uh-bT1Ysg100mywkXHLg3ord0A7bTgfqn0KGTvP_5H00TydY5H00mywxTvqdThP-5H0WpAqYgLIEThfW0APzm1YYnH0Yr0&amp;us=newvui&amp;xst=m1YKmWYsnDRdnH61nbNjPbwKfHKDnHK7nRnsPWb4f1N7PWmLn0715HD3P16zPWmvPHNxnHmzP-ts0gTqzqgyLTUe_egg3_ZX0gDq1xWZtoxMdnmKIHY1nHb4nHm3ns7Y5HDLnWc4PWRYP16KUgDqnfcs0VxB_eRKmv6quhPxTAnKTMfqn0D1PH0LP1bLnjmL&amp;ai=0_2000000000_1_1&amp;word=&amp;ck=0.0.0.0.0.0.0.0&amp;shh=tieba.baidu.com\" target=\"_blank\"><div class=\"_9fe13qw _2jze4xh\"><span>立即查看</span><div></div></div></a></div></div></div></span></div></div></div></div></div></div></div></div></div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:6385689430,&quot;user_name&quot;:&quot;\\u82cf\\u5982\\u5955&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.d39db32e.btdr7jSwx72ABqb5qQohNQ?t=1706838322&quot;,&quot;user_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_Gy4NE8M&quot;},&quot;content&quot;:{&quot;post_id&quot;:150726497321,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u5168\\u540e\\u536b\\u5195\\uff0c\\u592a\\u597d\\u4e86<img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon24.png\\&quot; >&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:3,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:2,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:2,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726497321\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u82cf\\u5982\\u5955&quot;,&quot;id&quot;:&quot;tb.1.d39db32e.btdr7jSwx72ABqb5qQohNQ?t=1706838322&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.d39db32e.btdr7jSwx72ABqb5qQohNQ?t=1706838322&amp;fr=pb\"><img username=\"苏如奕\" class=\"\" src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.d39db32e.btdr7jSwx72ABqb5qQohNQ?t=1706838322\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:6385689430}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u82cf\\u5982\\u5955&quot;,&quot;id&quot;:&quot;tb.1.d39db32e.btdr7jSwx72ABqb5qQohNQ?t=1706838322&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.d39db32e.btdr7jSwx72ABqb5qQohNQ?t=1706838322&amp;fr=pb\" target=\"_blank\">塔别啦</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon2_1\" title=\"本吧头衔7级，经验值270，点击进入等级头衔说明页\"><div class=\"d_badge_title \">小有名气</div><div class=\"d_badge_lv\">7</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726497321\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    全后卫冕，太好了<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon24.png\"></div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:江苏</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">3楼</span><span class=\"tail-info\">2024-08-06 22:10</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726497321,&quot;total_num&quot;:2}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(2)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper\" style=\"min-height: 0px;\" data-field=\"{&quot;pid&quot;:150726497321,&quot;floor_num&quot;:3,&quot;total_num&quot;:2}\"><div class=\"core_reply_border_top\"></div><div class=\"j_lzl_c_b_a core_reply_content\"><ul class=\"j_lzl_m_w\" style=\"display:\"><li class=\"lzl_single_post j_lzl_s_p first_no_border\" data-field=\"{'pid':'150726497321','spid':'150726498606','user_name':'heinzfrentzen','portrait':'tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA','showname':'heinzfrentzen','user_nickname':'贴吧用户_Q6eeVK7'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'heinzfrentzen', 'id':'tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA&amp;ie=utf-8&amp;fr=pb\" username=\"heinzfrentzen\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'heinzfrentzen', 'id':'tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA&amp;ie=utf-8&amp;fr=pb\" username=\"heinzfrentzen\">heinzfrentzen</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\"><img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon24.png\"><img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon24.png\"></span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;22:10</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150726497321','spid':'150727089274','user_name':'玲珑塔XiaoLinG','portrait':'tb.1.14b3bb72.kxpSeC1mhsN7ROg7m2Nc1g','showname':'团子熊😘','user_nickname':'团子熊😘'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'玲珑塔XiaoLinG', 'id':'tb.1.14b3bb72.kxpSeC1mhsN7ROg7m2Nc1g'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.14b3bb72.kxpSeC1mhsN7ROg7m2Nc1g&amp;ie=utf-8&amp;fr=pb\" username=\"玲珑塔XiaoLinG\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.14b3bb72.kxpSeC1mhsN7ROg7m2Nc1g\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'玲珑塔XiaoLinG', 'id':'tb.1.14b3bb72.kxpSeC1mhsN7ROg7m2Nc1g'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.14b3bb72.kxpSeC1mhsN7ROg7m2Nc1g&amp;ie=utf-8&amp;fr=pb\" username=\"玲珑塔XiaoLinG\">团子熊<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/1-21.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">我全大赛日常slay<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon68.png\"></span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display: none;\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-7&nbsp;00:02</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_li_pager j_lzl_l_p lzl_li_pager_s\" data-field=\"{total_num:2,total_page:1}\"><a rel=\"noopener\" class=\"j_lzl_p btn-sub btn-small pull-right\" href=\"##\"><i class=\"icon-reply\"></i>我也说一句</a><p>&nbsp;</p></li></ul><div class=\"lzl_editor_container j_lzl_e_c lzl_editor_container_s\" style=\"display:none;\"></div><input type=\"text\" class=\"j_lzl_e_f_h\" style=\"display:none;\"></div><div class=\"core_reply_border_bottom\"></div></div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:2643526612,&quot;user_name&quot;:&quot;\\u94c1\\u8def\\u73a9\\u6e38\\u620f&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.af11236b.l5C-Jv2xAJ-HsMybXSC7_A?t=1617935543&quot;,&quot;user_nickname&quot;:&quot;\\u5929\\u96f7\\u79d1\\u8003\\u961f\\ud83c\\udf0b&quot;},&quot;content&quot;:{&quot;post_id&quot;:150726498720,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u6beb\\u65e0\\u60ac\\u5ff5&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:4,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:1,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:3,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726498720\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u94c1\\u8def\\u73a9\\u6e38\\u620f&quot;,&quot;id&quot;:&quot;tb.1.af11236b.l5C-Jv2xAJ-HsMybXSC7_A?t=1617935543&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.af11236b.l5C-Jv2xAJ-HsMybXSC7_A?t=1617935543&amp;fr=pb\"><img username=\"铁路玩游戏\" class=\"\" src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.af11236b.l5C-Jv2xAJ-HsMybXSC7_A?t=1617935543\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:2643526612}\">\n                    <span class=\"pre_icon_wrap pre_icon_wrap_theme1 d_name_icon\"><a class=\"icon_tbworld icon-crown-super-v1\" href=\"/tbmall/tshow\" data-field=\"{&quot;user_id&quot;:2643526612}\" target=\"_blank\" title=\"贴吧超级会员\"></a></span>\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u94c1\\u8def\\u73a9\\u6e38\\u620f&quot;,&quot;id&quot;:&quot;tb.1.af11236b.l5C-Jv2xAJ-HsMybXSC7_A?t=1617935543&quot;}\" alog-group=\"p_author\" title=\"该用户已经连续签到65天了，连续30天一举“橙”名\" class=\"p_author_name sign_highlight j_user_card vip_red \" href=\"/home/main?id=tb.1.af11236b.l5C-Jv2xAJ-HsMybXSC7_A?t=1617935543&amp;fr=pb\" target=\"_blank\">月夜暗留香</a>\n\n                </li>\n                            <li class=\"d_icons\">\n                <span class=\"icon_wrap  icon_wrap_theme1 d_pb_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1722691615) no-repeat -4050px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"starmaster\" data-field=\"{&quot;name&quot;:&quot;starmaster&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u624b\\u6e380\\u661f\\u8fbe\\u4eba&quot;,&quot;intro&quot;:&quot;\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~&quot;,&quot;intro_url&quot;:&quot;https:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;amp;ie=utf-8&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;6&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,76&quot;,&quot;2&quot;:&quot;1722691615,77&quot;,&quot;3&quot;:&quot;1722691615,78&quot;,&quot;4&quot;:&quot;1722691615,79&quot;,&quot;5&quot;:&quot;1722691615,80&quot;,&quot;6&quot;:&quot;1722691615,81&quot;}}\" target=\"_blank\" href=\"https://tieba.baidu.com/f?kw=玩家认证&amp;ie=utf-8\" class=\"j_icon_slot\" title=\"手游0星达人\" locate=\"starmaster_6#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span>\n\n            </li>\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon3\" title=\"本吧头衔11级，经验值5748，点击进入等级头衔说明页\"><div class=\"d_badge_title \">皇冠大师</div><div class=\"d_badge_lv\">11</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg save_face_bg_2\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726498720\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    毫无悬念</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:上海</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">4楼</span><span class=\"tail-info\">2024-08-06 22:10</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726498720,&quot;total_num&quot;:1}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(1)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper\" style=\"min-height: 0px;\" data-field=\"{&quot;pid&quot;:150726498720,&quot;floor_num&quot;:4,&quot;total_num&quot;:1}\"><div class=\"core_reply_border_top\"></div><div class=\"j_lzl_c_b_a core_reply_content\"><ul class=\"j_lzl_m_w\" style=\"display:\"><li class=\"lzl_single_post j_lzl_s_p first_no_border\" data-field=\"{'pid':'150726498720','spid':'150726500664','user_name':'heinzfrentzen','portrait':'tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA','showname':'heinzfrentzen','user_nickname':'贴吧用户_Q6eeVK7'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'heinzfrentzen', 'id':'tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA&amp;ie=utf-8&amp;fr=pb\" username=\"heinzfrentzen\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'heinzfrentzen', 'id':'tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA&amp;ie=utf-8&amp;fr=pb\" username=\"heinzfrentzen\">heinzfrentzen</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">是呃</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;22:10</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_li_pager j_lzl_l_p lzl_li_pager_s\" data-field=\"{total_num:1,total_page:1}\"><a rel=\"noopener\" class=\"j_lzl_p btn-sub btn-small pull-right\" href=\"##\"><i class=\"icon-reply\"></i>我也说一句</a><p>&nbsp;</p></li></ul><div class=\"lzl_editor_container j_lzl_e_c lzl_editor_container_s\" style=\"display:none;\"></div><input type=\"text\" class=\"j_lzl_e_f_h\" style=\"display:none;\"></div><div class=\"core_reply_border_bottom\"></div></div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:2495858206,&quot;user_name&quot;:&quot;&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.8dc972ac.znRKFyg-PHj8SHelpqgZGg?t=1672639534&quot;,&quot;user_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_7tUR26y&quot;},&quot;content&quot;:{&quot;post_id&quot;:150726498817,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u7687\\u540e\\u56de\\u5bab<img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon66.png\\&quot; ><img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon20.png\\&quot; >&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:5,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:1,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:4,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726498817\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;&quot;,&quot;id&quot;:&quot;tb.1.8dc972ac.znRKFyg-PHj8SHelpqgZGg?t=1672639534&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.8dc972ac.znRKFyg-PHj8SHelpqgZGg?t=1672639534&amp;fr=pb\"><img username=\"\" class=\"\" src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.8dc972ac.znRKFyg-PHj8SHelpqgZGg?t=1672639534\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:2495858206}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;&quot;,&quot;id&quot;:&quot;tb.1.8dc972ac.znRKFyg-PHj8SHelpqgZGg?t=1672639534&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.8dc972ac.znRKFyg-PHj8SHelpqgZGg?t=1672639534&amp;fr=pb\" target=\"_blank\">那就这样吧@</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon3_1\" title=\"本吧头衔12级，经验值8747，点击进入等级头衔说明页\"><div class=\"d_badge_title \">GS冠军</div><div class=\"d_badge_lv\">12</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726498817\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    皇后回宫<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon66.png\"><img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon20.png\"></div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:广西</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">5楼</span><span class=\"tail-info\">2024-08-06 22:10</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726498817,&quot;total_num&quot;:1}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(1)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper\" style=\"min-height: 0px;\" data-field=\"{&quot;pid&quot;:150726498817,&quot;floor_num&quot;:5,&quot;total_num&quot;:1}\"><div class=\"core_reply_border_top\"></div><div class=\"j_lzl_c_b_a core_reply_content\"><ul class=\"j_lzl_m_w\" style=\"display:\"><li class=\"lzl_single_post j_lzl_s_p first_no_border\" data-field=\"{'pid':'150726498817','spid':'150726656384','user_name':'hyyy89','portrait':'tb.1.dd8e7117.ynt6LOPdSRRqWWClM_Czbg','showname':'鱼儿嘴','user_nickname':'鱼儿嘴♬'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'hyyy89', 'id':'tb.1.dd8e7117.ynt6LOPdSRRqWWClM_Czbg'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.dd8e7117.ynt6LOPdSRRqWWClM_Czbg&amp;ie=utf-8&amp;fr=pb\" username=\"hyyy89\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.dd8e7117.ynt6LOPdSRRqWWClM_Czbg\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'hyyy89', 'id':'tb.1.dd8e7117.ynt6LOPdSRRqWWClM_Czbg'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.dd8e7117.ynt6LOPdSRRqWWClM_Czbg&amp;ie=utf-8&amp;fr=pb\" username=\"hyyy89\">鱼儿嘴</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">全红婵的后位很稳的啦，一直在宫里，汐贵妃威胁不了她一点</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;22:40</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_li_pager j_lzl_l_p lzl_li_pager_s\" data-field=\"{total_num:1,total_page:1}\"><a rel=\"noopener\" class=\"j_lzl_p btn-sub btn-small pull-right\" href=\"##\"><i class=\"icon-reply\"></i>我也说一句</a><p>&nbsp;</p></li></ul><div class=\"lzl_editor_container j_lzl_e_c lzl_editor_container_s\" style=\"display:none;\"></div><input type=\"text\" class=\"j_lzl_e_f_h\" style=\"display:none;\"></div><div class=\"core_reply_border_bottom\"></div></div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:4264676115,&quot;user_name&quot;:&quot;\\u6bd4\\u4e18\\u767d\\u4f5b&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.f0a3ca0d.sgo5nkQOvmsyNWegCvBNeg?t=1714193889&quot;,&quot;user_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_5C55WEb&quot;},&quot;content&quot;:{&quot;post_id&quot;:150726500277,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u53ef\\u60dc\\u4e86\\uff0c\\u65e2\\u751f\\u5a75\\u4f55\\u751f\\u6c50&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:6,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:7,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:5,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726500277\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u6bd4\\u4e18\\u767d\\u4f5b&quot;,&quot;id&quot;:&quot;tb.1.f0a3ca0d.sgo5nkQOvmsyNWegCvBNeg?t=1714193889&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.f0a3ca0d.sgo5nkQOvmsyNWegCvBNeg?t=1714193889&amp;fr=pb\"><img username=\"比丘白佛\" class=\"\" src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.f0a3ca0d.sgo5nkQOvmsyNWegCvBNeg?t=1714193889\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:4264676115}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u6bd4\\u4e18\\u767d\\u4f5b&quot;,&quot;id&quot;:&quot;tb.1.f0a3ca0d.sgo5nkQOvmsyNWegCvBNeg?t=1714193889&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.f0a3ca0d.sgo5nkQOvmsyNWegCvBNeg?t=1714193889&amp;fr=pb\" target=\"_blank\">FO-af962G</a>\n\n                </li>\n                            <li class=\"d_icons\">\n                <span class=\"icon_wrap  icon_wrap_theme1 d_pb_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1722691615) no-repeat -4050px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"starmaster\" data-field=\"{&quot;name&quot;:&quot;starmaster&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u624b\\u6e380\\u661f\\u8fbe\\u4eba&quot;,&quot;intro&quot;:&quot;\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~&quot;,&quot;intro_url&quot;:&quot;https:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;amp;ie=utf-8&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;6&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,76&quot;,&quot;2&quot;:&quot;1722691615,77&quot;,&quot;3&quot;:&quot;1722691615,78&quot;,&quot;4&quot;:&quot;1722691615,79&quot;,&quot;5&quot;:&quot;1722691615,80&quot;,&quot;6&quot;:&quot;1722691615,81&quot;}}\" target=\"_blank\" href=\"https://tieba.baidu.com/f?kw=玩家认证&amp;ie=utf-8\" class=\"j_icon_slot\" title=\"手游0星达人\" locate=\"starmaster_6#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span>\n\n            </li>\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">网球萌新</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726500277\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    可惜了，既生婵何生汐</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:湖北</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">6楼</span><span class=\"tail-info\">2024-08-06 22:10</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726500277,&quot;total_num&quot;:7}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(7)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper\" style=\"min-height: 0px;\" data-field=\"{&quot;pid&quot;:150726500277,&quot;floor_num&quot;:6,&quot;total_num&quot;:7}\"><div class=\"core_reply_border_top\"></div><div class=\"j_lzl_c_b_a core_reply_content\"><ul class=\"j_lzl_m_w\" style=\"display:\"><li class=\"lzl_single_post j_lzl_s_p first_no_border\" data-field=\"{'pid':'150726500277','spid':'150726503415','user_name':'光辉哼哼','portrait':'tb.1.9ac12d29.dAA0F6NqboA_3ro4JCFw0w','showname':'天行健地势坤。','user_nickname':'光辉哼哼'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'光辉哼哼', 'id':'tb.1.9ac12d29.dAA0F6NqboA_3ro4JCFw0w'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.9ac12d29.dAA0F6NqboA_3ro4JCFw0w&amp;ie=utf-8&amp;fr=pb\" username=\"光辉哼哼\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.9ac12d29.dAA0F6NqboA_3ro4JCFw0w\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'光辉哼哼', 'id':'tb.1.9ac12d29.dAA0F6NqboA_3ro4JCFw0w'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.9ac12d29.dAA0F6NqboA_3ro4JCFw0w&amp;ie=utf-8&amp;fr=pb\" username=\"光辉哼哼\">天行健地势坤。</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">说反了<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon2.png\"></span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;22:11</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150726500277','spid':'150726503896','user_name':'heinzfrentzen','portrait':'tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA','showname':'heinzfrentzen','user_nickname':'贴吧用户_Q6eeVK7'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'heinzfrentzen', 'id':'tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA&amp;ie=utf-8&amp;fr=pb\" username=\"heinzfrentzen\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'heinzfrentzen', 'id':'tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA&amp;ie=utf-8&amp;fr=pb\" username=\"heinzfrentzen\">heinzfrentzen</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">真的是啊</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;22:11</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150726500277','spid':'150726514832','user_name':'比丘白佛','portrait':'tb.1.f0a3ca0d.sgo5nkQOvmsyNWegCvBNeg','showname':'FO-af962G','user_nickname':'贴吧用户_5C55WEb'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'比丘白佛', 'id':'tb.1.f0a3ca0d.sgo5nkQOvmsyNWegCvBNeg'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.f0a3ca0d.sgo5nkQOvmsyNWegCvBNeg&amp;ie=utf-8&amp;fr=pb\" username=\"比丘白佛\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.f0a3ca0d.sgo5nkQOvmsyNWegCvBNeg\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'比丘白佛', 'id':'tb.1.f0a3ca0d.sgo5nkQOvmsyNWegCvBNeg'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.f0a3ca0d.sgo5nkQOvmsyNWegCvBNeg&amp;ie=utf-8&amp;fr=pb\" username=\"比丘白佛\">FO-af962G</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">还真是，脑子瓦特了<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon69.png\"></span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;22:13</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150726500277','spid':'150726516979','user_name':'hellen海6','portrait':'tb.1.b7f6d7e1.l5iovcgb56lEIqoPjCd0VA','showname':'耿海6','user_nickname':'hellen海6'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'hellen海6', 'id':'tb.1.b7f6d7e1.l5iovcgb56lEIqoPjCd0VA'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.b7f6d7e1.l5iovcgb56lEIqoPjCd0VA&amp;ie=utf-8&amp;fr=pb\" username=\"hellen海6\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.b7f6d7e1.l5iovcgb56lEIqoPjCd0VA\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'hellen海6', 'id':'tb.1.b7f6d7e1.l5iovcgb56lEIqoPjCd0VA'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.b7f6d7e1.l5iovcgb56lEIqoPjCd0VA&amp;ie=utf-8&amp;fr=pb\" username=\"hellen海6\">耿海6</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">恭喜🎉，两位断层，蟹大妈是哪来的村口大妈，一个项目真正的双保险非得乱嚼舌根子破坏人家关系，巴不得跟体操一样是吧</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;22:13</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150726500277','spid':'150726548460','user_name':'清临丷','portrait':'tb.1.9eb504ee.sNx6AZ0BwhLrKzKwYOhMDA','showname':'清临丷','user_nickname':'清临丷'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'清临丷', 'id':'tb.1.9eb504ee.sNx6AZ0BwhLrKzKwYOhMDA'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.9eb504ee.sNx6AZ0BwhLrKzKwYOhMDA&amp;ie=utf-8&amp;fr=pb\" username=\"清临丷\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.9eb504ee.sNx6AZ0BwhLrKzKwYOhMDA\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'清临丷', 'id':'tb.1.9eb504ee.sNx6AZ0BwhLrKzKwYOhMDA'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.9eb504ee.sNx6AZ0BwhLrKzKwYOhMDA&amp;ie=utf-8&amp;fr=pb\" username=\"清临丷\">清临丷</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">没有全红婵，也许你感叹的就是既生齐何生汐了</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;22:19</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><ul class=\"lzl_post_hidden\" id=\"lzl_hidden_5\"><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150726500277','spid':'150726617062','user_name':'感性的陈213','portrait':'tb.1.899424ae.hOLimcdcXWtr1iIBoqbwVA','showname':'永远都在路上','user_nickname':'贴吧用户_atDaa21'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'感性的陈213', 'id':'tb.1.899424ae.hOLimcdcXWtr1iIBoqbwVA'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.899424ae.hOLimcdcXWtr1iIBoqbwVA&amp;ie=utf-8&amp;fr=pb\" username=\"感性的陈213\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.899424ae.hOLimcdcXWtr1iIBoqbwVA\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'感性的陈213', 'id':'tb.1.899424ae.hOLimcdcXWtr1iIBoqbwVA'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.899424ae.hOLimcdcXWtr1iIBoqbwVA&amp;ie=utf-8&amp;fr=pb\" username=\"感性的陈213\">永远都在路上</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">不是，这层难道都没发现它说反了吗<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon22.png\"></span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;22:32</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150726500277','spid':'150726626894','user_name':'heinzfrentzen','portrait':'tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA','showname':'heinzfrentzen','user_nickname':'贴吧用户_Q6eeVK7'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'heinzfrentzen', 'id':'tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA&amp;ie=utf-8&amp;fr=pb\" username=\"heinzfrentzen\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'heinzfrentzen', 'id':'tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA&amp;ie=utf-8&amp;fr=pb\" username=\"heinzfrentzen\">heinzfrentzen</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">回复 <a href=\"\" onclick=\"Stats.sendRequest('fr=tb0_forum&amp;st_mod=pb&amp;st_value=atlink');\" onmouseover=\"showattip(this)\" onmouseout=\"hideattip(this)\" username=\" \" portrait=\"tb.1.899424ae.hOLimcdcXWtr1iIBoqbwVA\" target=\"_blank\" class=\"at\">永远都在路上</a> :才发现<img class=\"BDE_Smiley\" pic_type=\"1\" width=\"30\" height=\"30\" src=\"https://tb2.bdstatic.com/tb/editor/images/face/i_f22.png?t=20140803\"></span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;22:34</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li></ul><li class=\"lzl_li_pager j_lzl_l_p lzl_li_pager_s\" data-field=\"{total_num:7,total_page:1}\"><a rel=\"noopener\" class=\"j_lzl_p btn-sub btn-small pull-right\" href=\"##\"><i class=\"icon-reply\"></i>我也说一句</a><p class=\"lzl_more\"><span>还有2条回复，</span><a rel=\"noopener\" href=\"#\" class=\"j_lzl_m\" lzlid=\"lzl_hidden_5\">点击查看</a></p><p class=\"j_pager l_pager pager_theme_2 lzl_pager\" style=\"display:none\">&nbsp;</p></li></ul><div class=\"lzl_editor_container j_lzl_e_c lzl_editor_container_s\" style=\"display:none;\"></div><input type=\"text\" class=\"j_lzl_e_f_h\" style=\"display:none;\"></div><div class=\"core_reply_border_bottom\"></div></div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:814843318,&quot;user_name&quot;:&quot;\\u5a1c\\u6837\\u5168\\u6ee1\\u8d2f&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.84497425.b5GLK5lGm90mTB2BhjrgpA?t=1531711055&quot;,&quot;user_nickname&quot;:&quot;\\u7f8e\\u5473\\u87f9\\u9ec4\\u5821\\ud83d\\udc9e&quot;},&quot;content&quot;:{&quot;post_id&quot;:150726500312,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u5168\\u6700\\u540e\\u6c34\\u82b1\\u90a3\\u4e48\\u5927<img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon17.png\\&quot; > <img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon17.png\\&quot; > \\u5c45\\u7136\\u4e0d\\u662f8\\u5206&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:7,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:16,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:6,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726500312\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u5a1c\\u6837\\u5168\\u6ee1\\u8d2f&quot;,&quot;id&quot;:&quot;tb.1.84497425.b5GLK5lGm90mTB2BhjrgpA?t=1531711055&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.84497425.b5GLK5lGm90mTB2BhjrgpA?t=1531711055&amp;fr=pb\"><img username=\"娜样全满贯\" class=\"\" src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.84497425.b5GLK5lGm90mTB2BhjrgpA?t=1531711055\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:814843318}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u5a1c\\u6837\\u5168\\u6ee1\\u8d2f&quot;,&quot;id&quot;:&quot;tb.1.84497425.b5GLK5lGm90mTB2BhjrgpA?t=1531711055&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.84497425.b5GLK5lGm90mTB2BhjrgpA?t=1531711055&amp;fr=pb\" target=\"_blank\">美味蟹黄堡<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/4-6.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon3_1\" title=\"本吧头衔13级，经验值16439，点击进入等级头衔说明页\"><div class=\"d_badge_title \">世界第一</div><div class=\"d_badge_lv\">13</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726500312\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    全最后水花那么大<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon17.png\"> <img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon17.png\"> 居然不是8分</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <a rel=\"noopener\" class=\"l_post_anchor\" name=\"150726500312l\"></a><div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:中国澳门</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">7楼</span><span class=\"tail-info\">2024-08-06 22:10</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726500312,&quot;total_num&quot;:16}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(16)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper\" style=\"min-height: 0px;\" data-field=\"{&quot;pid&quot;:150726500312,&quot;floor_num&quot;:7,&quot;total_num&quot;:16}\"><div class=\"core_reply_border_top\"></div><div class=\"j_lzl_c_b_a core_reply_content\"><ul class=\"j_lzl_m_w\" style=\"display:\"><li class=\"lzl_single_post j_lzl_s_p first_no_border\" data-field=\"{'pid':'150726500312','spid':'150726504693','user_name':'heinzfrentzen','portrait':'tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA','showname':'heinzfrentzen','user_nickname':'贴吧用户_Q6eeVK7'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'heinzfrentzen', 'id':'tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA&amp;ie=utf-8&amp;fr=pb\" username=\"heinzfrentzen\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'heinzfrentzen', 'id':'tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA&amp;ie=utf-8&amp;fr=pb\" username=\"heinzfrentzen\">heinzfrentzen</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\"><img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon25.png\"><img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon25.png\"></span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;22:11</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150726500312','spid':'150726506822','user_name':'可爱的搬运工94','portrait':'tb.1.f1b47a84.Rixjf6fMP-PfH8fnS1CgRA','showname':'可爱的搬运工94','user_nickname':'可爱的搬运工94'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'可爱的搬运工94', 'id':'tb.1.f1b47a84.Rixjf6fMP-PfH8fnS1CgRA'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.f1b47a84.Rixjf6fMP-PfH8fnS1CgRA&amp;ie=utf-8&amp;fr=pb\" username=\"可爱的搬运工94\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.f1b47a84.Rixjf6fMP-PfH8fnS1CgRA\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'可爱的搬运工94', 'id':'tb.1.f1b47a84.Rixjf6fMP-PfH8fnS1CgRA'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.f1b47a84.Rixjf6fMP-PfH8fnS1CgRA&amp;ie=utf-8&amp;fr=pb\" username=\"可爱的搬运工94\">可爱的搬运工94</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">陈芋汐水花也不小</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;22:12</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150726500312','spid':'150726508024','user_name':'蚂蚁雅虎哈哈','portrait':'tb.1.c5c485ab.Cf5aDgd1NxLxZlej8r4LWg','showname':'国际体坛巨星青椒肉丝','user_nickname':'蚂蚁雅虎哈哈'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'蚂蚁雅虎哈哈', 'id':'tb.1.c5c485ab.Cf5aDgd1NxLxZlej8r4LWg'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.c5c485ab.Cf5aDgd1NxLxZlej8r4LWg&amp;ie=utf-8&amp;fr=pb\" username=\"蚂蚁雅虎哈哈\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.c5c485ab.Cf5aDgd1NxLxZlej8r4LWg\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'蚂蚁雅虎哈哈', 'id':'tb.1.c5c485ab.Cf5aDgd1NxLxZlej8r4LWg'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.c5c485ab.Cf5aDgd1NxLxZlej8r4LWg&amp;ie=utf-8&amp;fr=pb\" username=\"蚂蚁雅虎哈哈\">国际体坛巨星青椒肉丝</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">你怀孕了吗 老是呕吐</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;22:12</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150726500312','spid':'150726509762','user_name':'茗花少帅','portrait':'tb.1.a0b6ca3c.54TCKizU2c9oSYWqNF7NqA','showname':'茗花少帅','user_nickname':'茗花少帅'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'茗花少帅', 'id':'tb.1.a0b6ca3c.54TCKizU2c9oSYWqNF7NqA'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.a0b6ca3c.54TCKizU2c9oSYWqNF7NqA&amp;ie=utf-8&amp;fr=pb\" username=\"茗花少帅\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.a0b6ca3c.54TCKizU2c9oSYWqNF7NqA\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'茗花少帅', 'id':'tb.1.a0b6ca3c.54TCKizU2c9oSYWqNF7NqA'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.a0b6ca3c.54TCKizU2c9oSYWqNF7NqA&amp;ie=utf-8&amp;fr=pb\" username=\"茗花少帅\">茗花少帅</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">你就只看水花，不看空中姿态吗</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;22:12</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150726500312','spid':'150726510645','user_name':'西安交大前一百','portrait':'tb.1.774316af.RqsfwTN2w3AJQFmXAO_MHw','showname':'东华武兰','user_nickname':'东华武兰º'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'西安交大前一百', 'id':'tb.1.774316af.RqsfwTN2w3AJQFmXAO_MHw'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.774316af.RqsfwTN2w3AJQFmXAO_MHw&amp;ie=utf-8&amp;fr=pb\" username=\"西安交大前一百\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.774316af.RqsfwTN2w3AJQFmXAO_MHw\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'西安交大前一百', 'id':'tb.1.774316af.RqsfwTN2w3AJQFmXAO_MHw'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.774316af.RqsfwTN2w3AJQFmXAO_MHw&amp;ie=utf-8&amp;fr=pb\" username=\"西安交大前一百\">东华武兰</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">经典只看水花</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;22:12</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><ul class=\"lzl_post_hidden\" id=\"lzl_hidden_6\"><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150726500312','spid':'150726514057','user_name':'上下班要注意','portrait':'tb.1.bcab9641.aHxSViAprkm6E0KQWrw3pg','showname':'上下班要注意','user_nickname':'上下班要注意'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'上下班要注意', 'id':'tb.1.bcab9641.aHxSViAprkm6E0KQWrw3pg'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.bcab9641.aHxSViAprkm6E0KQWrw3pg&amp;ie=utf-8&amp;fr=pb\" username=\"上下班要注意\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.bcab9641.aHxSViAprkm6E0KQWrw3pg\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'上下班要注意', 'id':'tb.1.bcab9641.aHxSViAprkm6E0KQWrw3pg'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.bcab9641.aHxSViAprkm6E0KQWrw3pg&amp;ie=utf-8&amp;fr=pb\" username=\"上下班要注意\">上下班要注意</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">额，分数正常吧</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;22:13</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150726500312','spid':'150726520372','user_name':'静看蚂蚁上树','portrait':'tb.1.7ea539b2.dHz6uxKdbItmtGkwZeV6oQ','showname':'静看蚂蚁上树','user_nickname':'静看蚂蚁上树'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'静看蚂蚁上树', 'id':'tb.1.7ea539b2.dHz6uxKdbItmtGkwZeV6oQ'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.7ea539b2.dHz6uxKdbItmtGkwZeV6oQ&amp;ie=utf-8&amp;fr=pb\" username=\"静看蚂蚁上树\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.7ea539b2.dHz6uxKdbItmtGkwZeV6oQ\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'静看蚂蚁上树', 'id':'tb.1.7ea539b2.dHz6uxKdbItmtGkwZeV6oQ'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.7ea539b2.dHz6uxKdbItmtGkwZeV6oQ&amp;ie=utf-8&amp;fr=pb\" username=\"静看蚂蚁上树\">静看蚂蚁上树</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">回复 <a href=\"\" onclick=\"Stats.sendRequest('fr=tb0_forum&amp;st_mod=pb&amp;st_value=atlink');\" onmouseover=\"showattip(this)\" onmouseout=\"hideattip(this)\" username=\" \" portrait=\"tb.1.c5c485ab.Cf5aDgd1NxLxZlej8r4LWg\" target=\"_blank\" class=\"at\">国际体坛巨星青椒肉丝</a> :吃酸黄瓜吃多了<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon22.png\"><img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon22.png\"><img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon22.png\"></span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;22:14</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150726500312','spid':'150726524963','user_name':'黄小港orz','portrait':'tb.1.e74fa44d.lLp46IIhj8NhhHk12z_qRA','showname':'不懂取啥名字😜','user_nickname':'不懂取啥名字😜'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'黄小港orz', 'id':'tb.1.e74fa44d.lLp46IIhj8NhhHk12z_qRA'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.e74fa44d.lLp46IIhj8NhhHk12z_qRA&amp;ie=utf-8&amp;fr=pb\" username=\"黄小港orz\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.e74fa44d.lLp46IIhj8NhhHk12z_qRA\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'黄小港orz', 'id':'tb.1.e74fa44d.lLp46IIhj8NhhHk12z_qRA'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.e74fa44d.lLp46IIhj8NhhHk12z_qRA&amp;ie=utf-8&amp;fr=pb\" username=\"黄小港orz\">不懂取啥名字<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/1-23.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">请你去跟国际泳联投诉<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon22.png\"></span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;22:15</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150726500312','spid':'150726535666','user_name':'快看卡卡卡卡','portrait':'tb.1.5f510507.B4GLS91flqmWc5QXoaRCoQ','showname':'💫泽赫拉💯','user_nickname':'💫泽赫拉💯'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'快看卡卡卡卡', 'id':'tb.1.5f510507.B4GLS91flqmWc5QXoaRCoQ'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.5f510507.B4GLS91flqmWc5QXoaRCoQ&amp;ie=utf-8&amp;fr=pb\" username=\"快看卡卡卡卡\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.5f510507.B4GLS91flqmWc5QXoaRCoQ\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'快看卡卡卡卡', 'id':'tb.1.5f510507.B4GLS91flqmWc5QXoaRCoQ'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.5f510507.B4GLS91flqmWc5QXoaRCoQ&amp;ie=utf-8&amp;fr=pb\" username=\"快看卡卡卡卡\"><img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/3-30.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\">泽赫拉<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/4-21.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">第五跳陈空中分腿了，空中姿态明显全红婵更好</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;22:17</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150726500312','spid':'150726536076','user_name':'嗯嗯哦哦啊啊哼','portrait':'tb.1.ba071e03._M1o8S5FX4p57pZBJa91CQ','showname':'嗯嗯哦哦啊啊🐶','user_nickname':'嗯嗯哦哦啊啊🐶'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'嗯嗯哦哦啊啊哼', 'id':'tb.1.ba071e03._M1o8S5FX4p57pZBJa91CQ'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.ba071e03._M1o8S5FX4p57pZBJa91CQ&amp;ie=utf-8&amp;fr=pb\" username=\"嗯嗯哦哦啊啊哼\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.ba071e03._M1o8S5FX4p57pZBJa91CQ\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'嗯嗯哦哦啊啊哼', 'id':'tb.1.ba071e03._M1o8S5FX4p57pZBJa91CQ'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.ba071e03._M1o8S5FX4p57pZBJa91CQ&amp;ie=utf-8&amp;fr=pb\" username=\"嗯嗯哦哦啊啊哼\">嗯嗯哦哦啊啊<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/2-2.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">回复 <a href=\"\" onclick=\"Stats.sendRequest('fr=tb0_forum&amp;st_mod=pb&amp;st_value=atlink');\" onmouseover=\"showattip(this)\" onmouseout=\"hideattip(this)\" username=\" \" portrait=\"tb.1.84497425.b5GLK5lGm90mTB2BhjrgpA\" target=\"_blank\" class=\"at\">美味蟹黄堡<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/4-6.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a> :你不会看起跳高度和空中姿态？</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;22:17</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li></ul><li class=\"lzl_li_pager j_lzl_l_p lzl_li_pager_s\" data-field=\"{total_num:16,total_page:2}\"><a rel=\"noopener\" class=\"j_lzl_p btn-sub btn-small pull-right\" href=\"##\"><i class=\"icon-reply\"></i>我也说一句</a><p class=\"lzl_more\"><span>还有11条回复，</span><a rel=\"noopener\" href=\"#\" class=\"j_lzl_m\" lzlid=\"lzl_hidden_6\">点击查看</a></p><p class=\"j_pager l_pager pager_theme_2 lzl_pager\" style=\"display:none\"><span class=\"tP\">1</span><a href=\"#\" index=\"2\">2</a><a href=\"#\" index=\"2\">下一页</a><a href=\"#\" index=\"2\">尾页</a></p></li></ul><div class=\"lzl_editor_container j_lzl_e_c lzl_editor_container_s\" style=\"display:none;\"></div><input type=\"text\" class=\"j_lzl_e_f_h\" style=\"display:none;\"></div><div class=\"core_reply_border_bottom\"></div></div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:166317696,&quot;user_name&quot;:&quot;yangzi0823&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.703cbb02.2UdPazbJAeASDvPcBlpe-Q?t=1393996393&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150726500343,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u9664\\u4e86\\u7b2c\\u4e09\\u8df3\\u5c0f\\u70b8\\u4e00\\u4e0b\\uff0c\\u5176\\u4f59\\u7684\\u90fd\\u5f88\\u68d2\\u4e86\\u2026&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:8,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:1,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:7,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726500343\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;yangzi0823&quot;,&quot;id&quot;:&quot;tb.1.703cbb02.2UdPazbJAeASDvPcBlpe-Q?t=1393996393&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.703cbb02.2UdPazbJAeASDvPcBlpe-Q?t=1393996393&amp;fr=pb\"><img username=\"yangzi0823\" class=\"\" src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.703cbb02.2UdPazbJAeASDvPcBlpe-Q?t=1393996393\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:166317696}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;yangzi0823&quot;,&quot;id&quot;:&quot;tb.1.703cbb02.2UdPazbJAeASDvPcBlpe-Q?t=1393996393&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.703cbb02.2UdPazbJAeASDvPcBlpe-Q?t=1393996393&amp;fr=pb\" target=\"_blank\">yangzi0823</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon2_2\" title=\"本吧头衔9级，经验值1035，点击进入等级头衔说明页\"><div class=\"d_badge_title \">种子选手</div><div class=\"d_badge_lv\">9</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726500343\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    除了第三跳小炸一下，其余的都很棒了…</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:四川</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"贴吧群时代开启，快到群里来！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?tab=qunliao\" target=\"_blank\">iPhone客户端</a></span><span class=\"tail-info\">8楼</span><span class=\"tail-info\">2024-08-06 22:10</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726500343,&quot;total_num&quot;:1}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(1)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper\" style=\"min-height: 0px;\" data-field=\"{&quot;pid&quot;:150726500343,&quot;floor_num&quot;:8,&quot;total_num&quot;:1}\"><div class=\"core_reply_border_top\"></div><div class=\"j_lzl_c_b_a core_reply_content\"><ul class=\"j_lzl_m_w\" style=\"display:\"><li class=\"lzl_single_post j_lzl_s_p first_no_border\" data-field=\"{'pid':'150726500343','spid':'150726507194','user_name':'heinzfrentzen','portrait':'tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA','showname':'heinzfrentzen','user_nickname':'贴吧用户_Q6eeVK7'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'heinzfrentzen', 'id':'tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA&amp;ie=utf-8&amp;fr=pb\" username=\"heinzfrentzen\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'heinzfrentzen', 'id':'tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA&amp;ie=utf-8&amp;fr=pb\" username=\"heinzfrentzen\">heinzfrentzen</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">是的，2组的动作也跳好了</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;22:12</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_li_pager j_lzl_l_p lzl_li_pager_s\" data-field=\"{total_num:1,total_page:1}\"><a rel=\"noopener\" class=\"j_lzl_p btn-sub btn-small pull-right\" href=\"##\"><i class=\"icon-reply\"></i>我也说一句</a><p>&nbsp;</p></li></ul><div class=\"lzl_editor_container j_lzl_e_c lzl_editor_container_s\" style=\"display:none;\"></div><input type=\"text\" class=\"j_lzl_e_f_h\" style=\"display:none;\"></div><div class=\"core_reply_border_bottom\"></div></div></div></div></div><div id=\"mediago-tb-pb-list-8\" data-po=\"8\"><div class=\"mediago-ad-pb-751-video-wrapper mediago-ad-wrapper svelte-s6he8h\"><div class=\"mediago-userInfo svelte-s6he8h\"><div class=\"mediago-header svelte-s6he8h\"><img src=\"https://mediago-static.cdn.bcebos.com/assets/images/header/2.png\" alt=\"\" class=\"svelte-s6he8h\"></div> <p class=\"mediago-nickName svelte-s6he8h\">热血打金传奇</p></div> <a class=\"mediago-content svelte-s6he8h\" href=\"javascript:;\"><div class=\"mediago-title svelte-s6he8h\">地图无等级限制！无充值无暗坑！装备靠打！爆率全开！</div> <div class=\"mediago-desc svelte-s6he8h\">地图无等级限制！无充值无暗坑！装备靠打！爆率全开！</div> <div class=\"mediago-checkBtn svelte-s6he8h\">立即查看</div> <div class=\"mediago-video svelte-s6he8h\"><img class=\"bgImg svelte-s6he8h\" src=\"https://s3m.mediav.com/galileo/fd1ffe54d3571462904021756b704864_1920x1080_cover.jpg\" alt=\"\"> <video src=\"https://live-s3m.mediav.com/nativevideo/fd1ffe54d3571462904021756b704864-bit_zdgq768.mp4?bit=512\" class=\"svelte-s6he8h\">您的浏览器不支持 video 标签。\n                <track kind=\"captions\" srclang=\"en\" label=\"English\" default=\"\" class=\"svelte-s6he8h\"></video> <div class=\"mediago-play-btn svelte-s6he8h\"></div> <div class=\"mediago-volume svelte-s6he8h\"><img src=\"https://mediago-static.cdn.bcebos.com/assets/images/mute.png\" alt=\"\" class=\"svelte-s6he8h\"></div></div></a> <div class=\"mediago-footer svelte-s6he8h\"><span class=\"mediago-date svelte-s6he8h\">2024-08-07 01:31:20</span> <span class=\"mediago-ad svelte-s6he8h\">广告</span></div> <div class=\"mediago-close svelte-s6he8h\"></div> </div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:5069729484,&quot;user_name&quot;:&quot;qingtiaoruo569&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.784115a7.zKQdGyc93eSnp4Cl3NzQnA?t=1667136203&quot;,&quot;user_nickname&quot;:&quot;\\u25ab\\u9752\\u6761\\u82e5\\u603b\\u7fe0&quot;},&quot;content&quot;:{&quot;post_id&quot;:150726500389,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u9648\\u5b8c\\u7f8e\\u53d1\\u6325\\u4e86\\u8fd8\\u662f\\u6253\\u4e0d\\u8fc7\\uff0c\\u6ca1\\u529e\\u6cd5&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:9,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:1,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:8,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726500389\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;qingtiaoruo569&quot;,&quot;id&quot;:&quot;tb.1.784115a7.zKQdGyc93eSnp4Cl3NzQnA?t=1667136203&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.784115a7.zKQdGyc93eSnp4Cl3NzQnA?t=1667136203&amp;fr=pb\"><img username=\"qingtiaoruo569\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.784115a7.zKQdGyc93eSnp4Cl3NzQnA?t=1667136203\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:5069729484}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;qingtiaoruo569&quot;,&quot;id&quot;:&quot;tb.1.784115a7.zKQdGyc93eSnp4Cl3NzQnA?t=1667136203&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.784115a7.zKQdGyc93eSnp4Cl3NzQnA?t=1667136203&amp;fr=pb\" target=\"_blank\">奥美丽扬奇科</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon3_1\" title=\"本吧头衔12级，经验值8929，点击进入等级头衔说明页\"><div class=\"d_badge_title \">GS冠军</div><div class=\"d_badge_lv\">12</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726500389\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    陈完美发挥了还是打不过，没办法</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:福建</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"贴吧群时代开启，快到群里来！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?tab=qunliao\" target=\"_blank\">iPhone客户端</a></span><span class=\"tail-info\">9楼</span><span class=\"tail-info\">2024-08-06 22:10</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726500389,&quot;total_num&quot;:1}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(1)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:110px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:453395226,&quot;user_name&quot;:&quot;\\u54e5\\u6b20\\u72ec\\u5bb6\\u8bb0\\u5fc6&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.3a640cc7.egco4dfBAhteAn3Z_tsOTg?t=1678550768&quot;,&quot;user_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_0P6U6E8&quot;},&quot;content&quot;:{&quot;post_id&quot;:150726502752,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;<img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon16.png\\&quot; >&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:10,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:0,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:9,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726502752\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u54e5\\u6b20\\u72ec\\u5bb6\\u8bb0\\u5fc6&quot;,&quot;id&quot;:&quot;tb.1.3a640cc7.egco4dfBAhteAn3Z_tsOTg?t=1678550768&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.3a640cc7.egco4dfBAhteAn3Z_tsOTg?t=1678550768&amp;fr=pb\"><img username=\"哥欠独家记忆\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.3a640cc7.egco4dfBAhteAn3Z_tsOTg?t=1678550768\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:453395226}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u54e5\\u6b20\\u72ec\\u5bb6\\u8bb0\\u5fc6&quot;,&quot;id&quot;:&quot;tb.1.3a640cc7.egco4dfBAhteAn3Z_tsOTg?t=1678550768&quot;}\" alog-group=\"p_author\" title=\"该用户已经连续签到70天了，连续30天一举“橙”名\" class=\"p_author_name sign_highlight j_user_card\" href=\"/home/main?id=tb.1.3a640cc7.egco4dfBAhteAn3Z_tsOTg?t=1678550768&amp;fr=pb\" target=\"_blank\">哥欠独家记忆</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon3_1\" title=\"本吧头衔13级，经验值13372，点击进入等级头衔说明页\"><div class=\"d_badge_title \">世界第一</div><div class=\"d_badge_lv\">13</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726502752\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    <img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon16.png\"></div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:广东</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">10楼</span><span class=\"tail-info\">2024-08-06 22:11</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726502752,&quot;total_num&quot;:null}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:;\">回复</a><span class=\"lzl_link_fold\" style=\"display:none\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:50px\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:1312706099,&quot;user_name&quot;:&quot;\\u5fae\\u5fc6\\u7edb\\u7eff&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.b1949fb8.wNpF2N5t10CnR04KIiDY6w?t=1668431347&quot;,&quot;user_nickname&quot;:&quot;\\u6c34\\u84dd\\u9cb8\\u9c7c\\ud83c\\udf8f&quot;},&quot;content&quot;:{&quot;post_id&quot;:150726502850,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u606d\\u559c\\u5168\\uff0c\\u9648\\u4e5f\\u86ee\\u60e8\\u7684\\uff0c\\u597d\\u5728\\u662f\\u6709\\u5973\\u53cc\\u91d1&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:11,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:1,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:10,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726502850\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u5fae\\u5fc6\\u7edb\\u7eff&quot;,&quot;id&quot;:&quot;tb.1.b1949fb8.wNpF2N5t10CnR04KIiDY6w?t=1668431347&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.b1949fb8.wNpF2N5t10CnR04KIiDY6w?t=1668431347&amp;fr=pb\"><img username=\"微忆绛绿\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.b1949fb8.wNpF2N5t10CnR04KIiDY6w?t=1668431347\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:1312706099}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u5fae\\u5fc6\\u7edb\\u7eff&quot;,&quot;id&quot;:&quot;tb.1.b1949fb8.wNpF2N5t10CnR04KIiDY6w?t=1668431347&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.b1949fb8.wNpF2N5t10CnR04KIiDY6w?t=1668431347&amp;fr=pb\" target=\"_blank\">水蓝鲸鱼<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/4-13.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a>\n\n                </li>\n                            <li class=\"d_icons\">\n                <span class=\"icon_wrap  icon_wrap_theme1 d_pb_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1722691615) no-repeat -3900px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"starmaster\" data-field=\"{&quot;name&quot;:&quot;starmaster&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u624b\\u6e380\\u661f\\u8fbe\\u4eba&quot;,&quot;intro&quot;:&quot;\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~&quot;,&quot;intro_url&quot;:&quot;https:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;amp;ie=utf-8&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;3&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,76&quot;,&quot;2&quot;:&quot;1722691615,77&quot;,&quot;3&quot;:&quot;1722691615,78&quot;,&quot;4&quot;:&quot;1722691615,79&quot;,&quot;5&quot;:&quot;1722691615,80&quot;,&quot;6&quot;:&quot;1722691615,81&quot;}}\" target=\"_blank\" href=\"https://tieba.baidu.com/f?kw=玩家认证&amp;ie=utf-8\" class=\"j_icon_slot\" title=\"手游0星达人\" locate=\"starmaster_3#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span>\n\n            </li>\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon3\" title=\"本吧头衔11级，经验值3365，点击进入等级头衔说明页\"><div class=\"d_badge_title \">皇冠大师</div><div class=\"d_badge_lv\">11</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726502850\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    恭喜全，陈也蛮惨的，好在是有女双金</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:江苏</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"贴吧群时代开启，快到群里来！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?tab=qunliao\" target=\"_blank\">iPhone客户端</a></span><span class=\"tail-info\">11楼</span><span class=\"tail-info\">2024-08-06 22:11</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726502850,&quot;total_num&quot;:1}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(1)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:110px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:1119989629,&quot;user_name&quot;:&quot;flybiubiu123&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.b7be86e7.Uk7i9LOS5PYs5FBThRigYg&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150726503185,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u9648\\u828b\\u6c50\\u7b80\\u76f4\\u5c31\\u662f\\u8df3\\u6c34\\u961f\\u7248\\u5b59\\u9896\\u838e&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:12,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:6,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:11,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726503185\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;flybiubiu123&quot;,&quot;id&quot;:&quot;tb.1.b7be86e7.Uk7i9LOS5PYs5FBThRigYg&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.b7be86e7.Uk7i9LOS5PYs5FBThRigYg&amp;fr=pb\"><img username=\"flybiubiu123\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.b7be86e7.Uk7i9LOS5PYs5FBThRigYg\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:1119989629}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;flybiubiu123&quot;,&quot;id&quot;:&quot;tb.1.b7be86e7.Uk7i9LOS5PYs5FBThRigYg&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.b7be86e7.Uk7i9LOS5PYs5FBThRigYg&amp;fr=pb\" target=\"_blank\">flybiubiu123</a>\n\n                </li>\n                            <li class=\"d_icons\">\n                <span class=\"icon_wrap  icon_wrap_theme1 d_pb_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/107_14.png?stamp=1722691615) no-repeat -5400px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"shoucifaite\" data-field=\"{&quot;name&quot;:&quot;shoucifaite&quot;,&quot;end_time&quot;:&quot;1725445928&quot;,&quot;category_id&quot;:107,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u9996\\u6b21\\u53d1\\u8d34&quot;,&quot;intro&quot;:&quot;\\u9996\\u6b21\\u53d1\\u8d34&quot;,&quot;intro_url&quot;:&quot;https:\\/\\/tieba.baidu.com\\/wxf\\/324179?kw=%E5%8D%B0%E8%AE%B0&amp;amp;fr=frsshare&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,108&quot;}}\" target=\"_blank\" href=\"https://tieba.baidu.com/wxf/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare\" class=\"j_icon_slot\" title=\"首次发贴\" locate=\"shoucifaite_1#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span>\n\n            </li>\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon2\" title=\"本吧头衔5级，经验值91，点击进入等级头衔说明页\"><div class=\"d_badge_title \">职业球员</div><div class=\"d_badge_lv\">5</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726503185\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    陈芋汐简直就是跳水队版孙颖莎</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:陕西</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">12楼</span><span class=\"tail-info\">2024-08-06 22:11</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726503185,&quot;total_num&quot;:6}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(6)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:350px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:1117583716,&quot;user_name&quot;:&quot;\\u8d31\\u8d31\\u7684shit&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.157870d.Zh7duSQwdgDdXl95Wc-3MA?t=1627558481&quot;,&quot;user_nickname&quot;:&quot;\\u52a0\\u6cb9\\ud83d\\ude01\\u4f60\\u597d&quot;},&quot;content&quot;:{&quot;post_id&quot;:150726503602,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u606d\\u559c\\u5168\\u540e\\u536b\\u5195 \\u4e5f\\u606d\\u559c\\u6c50\\u8d35\\u5983\\u94f6\\u724c\\uff0c\\u6c50\\u8d35\\u5983\\u633a\\u9057\\u61be\\u7684\\uff0c\\u4e0d\\u7ba1\\u600e\\u4e48\\u6837\\u8fd8\\u662f\\u606d\\u559c\\u4e24\\u4f4d<img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon20.png\\&quot; >&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:13,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:1,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:12,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726503602\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u8d31\\u8d31\\u7684shit&quot;,&quot;id&quot;:&quot;tb.1.157870d.Zh7duSQwdgDdXl95Wc-3MA?t=1627558481&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.157870d.Zh7duSQwdgDdXl95Wc-3MA?t=1627558481&amp;fr=pb\"><img username=\"贱贱的shit\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.157870d.Zh7duSQwdgDdXl95Wc-3MA?t=1627558481\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:1117583716}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u8d31\\u8d31\\u7684shit&quot;,&quot;id&quot;:&quot;tb.1.157870d.Zh7duSQwdgDdXl95Wc-3MA?t=1627558481&quot;}\" alog-group=\"p_author\" title=\"该用户已经连续签到147天了，连续30天一举“橙”名\" class=\"p_author_name sign_highlight j_user_card\" href=\"/home/main?id=tb.1.157870d.Zh7duSQwdgDdXl95Wc-3MA?t=1627558481&amp;fr=pb\" target=\"_blank\">好馨就有好蕴🤗</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon3\" title=\"本吧头衔11级，经验值4333，点击进入等级头衔说明页\"><div class=\"d_badge_title \">皇冠大师</div><div class=\"d_badge_lv\">11</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726503602\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    恭喜全后卫冕 也恭喜汐贵妃银牌，汐贵妃挺遗憾的，不管怎么样还是恭喜两位<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon20.png\"></div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:广东</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"贴吧群时代开启，快到群里来！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?tab=qunliao\" target=\"_blank\">iPhone客户端</a></span><span class=\"tail-info\">13楼</span><span class=\"tail-info\">2024-08-06 22:11</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726503602,&quot;total_num&quot;:1}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(1)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:110px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:624945689,&quot;user_name&quot;:&quot;\\u82b7\\u5408&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.5e6be51e.a7ukgomgTlsVsMZY_JNijw?t=1402144152&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150726504204,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u5f3a\\u70c8\\u606d\\u559c&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:14,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:0,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:13,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726504204\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u82b7\\u5408&quot;,&quot;id&quot;:&quot;tb.1.5e6be51e.a7ukgomgTlsVsMZY_JNijw?t=1402144152&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.5e6be51e.a7ukgomgTlsVsMZY_JNijw?t=1402144152&amp;fr=pb\"><img username=\"芷合\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.5e6be51e.a7ukgomgTlsVsMZY_JNijw?t=1402144152\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:624945689}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u82b7\\u5408&quot;,&quot;id&quot;:&quot;tb.1.5e6be51e.a7ukgomgTlsVsMZY_JNijw?t=1402144152&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.5e6be51e.a7ukgomgTlsVsMZY_JNijw?t=1402144152&amp;fr=pb\" target=\"_blank\">芷合</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon2_2\" title=\"本吧头衔9级，经验值1499，点击进入等级头衔说明页\"><div class=\"d_badge_title \">种子选手</div><div class=\"d_badge_lv\">9</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726504204\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    强烈恭喜</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:广西</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">14楼</span><span class=\"tail-info\">2024-08-06 22:11</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726504204,&quot;total_num&quot;:null}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:;\">回复</a><span class=\"lzl_link_fold\" style=\"display:none\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:50px\">        </div></div></div></div><div id=\"mediago-tb-pb-list-14\" data-po=\"14\"><div class=\"mediago-ad-pb-751-wrapper mediago-ad-wrapper svelte-1js710s\"><div class=\"mediago-userInfo svelte-1js710s\"><div class=\"mediago-header svelte-1js710s\"><img src=\"https://mediago-static.cdn.bcebos.com/assets/images/header/1.png\" alt=\"\" class=\"svelte-1js710s\"></div> <p class=\"mediago-nickName svelte-1js710s\">聚搜小说 · 效卓</p></div> <a class=\"mediago-content svelte-1js710s\" href=\"javascript:;\"><div class=\"mediago-title svelte-1js710s\">  妻子为上位选择背叛他，离婚后才发现他早已高就，妻子跪地求和</div> <div class=\"mediago-desc svelte-1js710s\">  妻子为上位选择背叛他，离婚后才发现他早已高就，妻子跪地求和!</div> <div class=\"mediago-checkBtn svelte-1js710s\">立即查看</div> <img class=\"mediago-img svelte-1js710s\" src=\"https://s3m.mediav.com/galileo/1f6eb1fcc2a4b2a882991d59305731d8.jpg\" alt=\"\"></a> <div class=\"mediago-footer svelte-1js710s\"><span class=\"mediago-date svelte-1js710s\">2024-08-07 01:31:20</span> <span class=\"mediago-ad svelte-1js710s\">广告</span></div> <div class=\"mediago-close svelte-1js710s\"></div> </div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:2174511148,&quot;user_name&quot;:&quot;\\u661f\\u661f\\u5e05M&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.9febf326.b-RGgAMF4sMwGSigG7Pibg?t=1721900001&quot;,&quot;user_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_7SKE8QU&quot;},&quot;content&quot;:{&quot;post_id&quot;:150726505281,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u606d\\u559c\\u5168\\u540e\\u536b\\u5195\\u6210\\u529f&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:15,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:0,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:14,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726505281\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u661f\\u661f\\u5e05M&quot;,&quot;id&quot;:&quot;tb.1.9febf326.b-RGgAMF4sMwGSigG7Pibg?t=1721900001&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.9febf326.b-RGgAMF4sMwGSigG7Pibg?t=1721900001&amp;fr=pb\"><img username=\"星星帅M\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.9febf326.b-RGgAMF4sMwGSigG7Pibg?t=1721900001\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:2174511148}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u661f\\u661f\\u5e05M&quot;,&quot;id&quot;:&quot;tb.1.9febf326.b-RGgAMF4sMwGSigG7Pibg?t=1721900001&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.9febf326.b-RGgAMF4sMwGSigG7Pibg?t=1721900001&amp;fr=pb\" target=\"_blank\">Gary星</a>\n\n                </li>\n                            <li class=\"d_icons\">\n                <span class=\"icon_wrap  icon_wrap_theme1 d_pb_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/102_14.png?stamp=1722691615) no-repeat -0px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"shuiping\" data-field=\"{&quot;name&quot;:&quot;shuiping&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:102,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u6c34\\u74f6\\u5ea7\\u5370\\u8bb0&quot;,&quot;intro&quot;:&quot;\\u83b7\\u53d6\\u89c4\\u5219\\uff1a\\u5728\\u661f\\u5ea7\\u52cb\\u7ae0\\u9986\\u4e2d\\u83b7\\u5f97\\u3002&quot;,&quot;intro_url&quot;:&quot;https:\\/\\/tieba.baidu.com\\/f?ie=utf-8&amp;amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;amp;fr=search&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,0&quot;}}\" target=\"_blank\" href=\"https://tieba.baidu.com/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search\" class=\"j_icon_slot\" title=\"水瓶座印记\" locate=\"shuiping_1#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span>\n\n            </li>\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon3\" title=\"本吧头衔11级，经验值3976，点击进入等级头衔说明页\"><div class=\"d_badge_title \">皇冠大师</div><div class=\"d_badge_lv\">11</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726505281\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    恭喜全后卫冕成功</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:江苏</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"贴吧群时代开启，快到群里来！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?tab=qunliao\" target=\"_blank\">iPhone客户端</a></span><span class=\"tail-info\">15楼</span><span class=\"tail-info\">2024-08-06 22:11</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726505281,&quot;total_num&quot;:null}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:;\">回复</a><span class=\"lzl_link_fold\" style=\"display:none\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:50px\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:6409433854,&quot;user_name&quot;:&quot;s\\u4f0a\\u4ec0\\u5854\\u5c14&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.b60be792.B7VsXMHuWnR9LrwJu2k0SA?t=1706777739&quot;,&quot;user_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_GCS6Uey&quot;},&quot;content&quot;:{&quot;post_id&quot;:150726505659,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u606d\\u559c\\u5168\\u540e\\u536b\\u5195<img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon20.png\\&quot; ><img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon20.png\\&quot; ><img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon20.png\\&quot; >&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:16,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:1,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:15,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726505659\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;s\\u4f0a\\u4ec0\\u5854\\u5c14&quot;,&quot;id&quot;:&quot;tb.1.b60be792.B7VsXMHuWnR9LrwJu2k0SA?t=1706777739&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.b60be792.B7VsXMHuWnR9LrwJu2k0SA?t=1706777739&amp;fr=pb\"><img username=\"s伊什塔尔\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.b60be792.B7VsXMHuWnR9LrwJu2k0SA?t=1706777739\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:6409433854}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;s\\u4f0a\\u4ec0\\u5854\\u5c14&quot;,&quot;id&quot;:&quot;tb.1.b60be792.B7VsXMHuWnR9LrwJu2k0SA?t=1706777739&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.b60be792.B7VsXMHuWnR9LrwJu2k0SA?t=1706777739&amp;fr=pb\" target=\"_blank\">s伊什塔尔</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon2_1\" title=\"本吧头衔6级，经验值168，点击进入等级头衔说明页\"><div class=\"d_badge_title \">ITF冠军</div><div class=\"d_badge_lv\">6</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726505659\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    恭喜全后卫冕<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon20.png\"><img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon20.png\"><img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon20.png\"></div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:上海</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">16楼</span><span class=\"tail-info\">2024-08-06 22:11</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726505659,&quot;total_num&quot;:1}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(1)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:110px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:334508234,&quot;user_name&quot;:&quot;3353669cjl&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.39794f45.rFW_57NVtKElrztddk5bKA?t=1721722864&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150726506258,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u5168\\u540e\\u771f\\u7684\\u662f\\u540e\\u3002\\u3002\\u3002\\u786e\\u5b9e\\u4eca\\u5929\\u6709\\u70b9\\u7d27\\uff0c\\u6b63\\u5e38\\u5e94\\u8be5\\u5728440-450\\u5de6\\u53f3\\u3002\\u3002\\u3002&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:17,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:3,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:16,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726506258\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;3353669cjl&quot;,&quot;id&quot;:&quot;tb.1.39794f45.rFW_57NVtKElrztddk5bKA?t=1721722864&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.39794f45.rFW_57NVtKElrztddk5bKA?t=1721722864&amp;fr=pb\"><img username=\"3353669cjl\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.39794f45.rFW_57NVtKElrztddk5bKA?t=1721722864\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:334508234}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;3353669cjl&quot;,&quot;id&quot;:&quot;tb.1.39794f45.rFW_57NVtKElrztddk5bKA?t=1721722864&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.39794f45.rFW_57NVtKElrztddk5bKA?t=1721722864&amp;fr=pb\" target=\"_blank\">AI未来</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon2_2\" title=\"本吧头衔9级，经验值1741，点击进入等级头衔说明页\"><div class=\"d_badge_title \">种子选手</div><div class=\"d_badge_lv\">9</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726506258\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    全后真的是后。。。确实今天有点紧，正常应该在440-450左右。。。</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:上海</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">17楼</span><span class=\"tail-info\">2024-08-06 22:11</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726506258,&quot;total_num&quot;:3}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(3)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:230px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:687404475,&quot;user_name&quot;:&quot;gholic&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.d10c00ad.qPILQAqQYFx5xcM-3Awmeg&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150726506373,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u8fd9\\u4fe9\\u770b\\u8c01\\u80fd\\u5148\\u71ac\\u8fc7\\u5bf9\\u65b9\\u5427\\uff0c\\u606d\\u559c&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:18,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:2,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:17,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726506373\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;gholic&quot;,&quot;id&quot;:&quot;tb.1.d10c00ad.qPILQAqQYFx5xcM-3Awmeg&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.d10c00ad.qPILQAqQYFx5xcM-3Awmeg&amp;fr=pb\"><img username=\"gholic\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.d10c00ad.qPILQAqQYFx5xcM-3Awmeg\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:687404475}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;gholic&quot;,&quot;id&quot;:&quot;tb.1.d10c00ad.qPILQAqQYFx5xcM-3Awmeg&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.d10c00ad.qPILQAqQYFx5xcM-3Awmeg&amp;fr=pb\" target=\"_blank\">gholic</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon3\" title=\"本吧头衔10级，经验值2527，点击进入等级头衔说明页\"><div class=\"d_badge_title \">世界前十</div><div class=\"d_badge_lv\">10</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726506373\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    这俩看谁能先熬过对方吧，恭喜</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:上海</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">18楼</span><span class=\"tail-info\">2024-08-06 22:11</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726506373,&quot;total_num&quot;:2}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(2)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:170px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:624945689,&quot;user_name&quot;:&quot;\\u82b7\\u5408&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.5e6be51e.a7ukgomgTlsVsMZY_JNijw?t=1402144152&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150726507259,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u5168\\u8eab\\u4f53\\u59ff\\u6001\\u786e\\u5b9e\\u66f4\\u597d\\u770b&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:19,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:1,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:18,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726507259\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u82b7\\u5408&quot;,&quot;id&quot;:&quot;tb.1.5e6be51e.a7ukgomgTlsVsMZY_JNijw?t=1402144152&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.5e6be51e.a7ukgomgTlsVsMZY_JNijw?t=1402144152&amp;fr=pb\"><img username=\"芷合\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.5e6be51e.a7ukgomgTlsVsMZY_JNijw?t=1402144152\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:624945689}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u82b7\\u5408&quot;,&quot;id&quot;:&quot;tb.1.5e6be51e.a7ukgomgTlsVsMZY_JNijw?t=1402144152&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.5e6be51e.a7ukgomgTlsVsMZY_JNijw?t=1402144152&amp;fr=pb\" target=\"_blank\">芷合</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon2_2\" title=\"本吧头衔9级，经验值1499，点击进入等级头衔说明页\"><div class=\"d_badge_title \">种子选手</div><div class=\"d_badge_lv\">9</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726507259\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    全身体姿态确实更好看</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:广西</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">19楼</span><span class=\"tail-info\">2024-08-06 22:12</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726507259,&quot;total_num&quot;:1}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(1)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:110px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:1114635360,&quot;user_name&quot;:&quot;\\u5de6\\u8fb9\\u98ce\\u4f9d\\u65e7\\u8086\\u8650&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.f72bd2cd.wQjCdvhDYMdld8whJotnGg?t=1495163027&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150726508128,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u8d28\\u91cf\\u597d\\uff0c\\u5206\\u6570\\u6ca1\\u5565\\u95ee\\u9898\\uff0c\\u4e3b\\u8981\\u662f207\\u4e0d\\u70b8\\u57fa\\u672c\\u6ca1\\u60ac\\u5ff5&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:20,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:1,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:19,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726508128\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u5de6\\u8fb9\\u98ce\\u4f9d\\u65e7\\u8086\\u8650&quot;,&quot;id&quot;:&quot;tb.1.f72bd2cd.wQjCdvhDYMdld8whJotnGg?t=1495163027&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.f72bd2cd.wQjCdvhDYMdld8whJotnGg?t=1495163027&amp;fr=pb\"><img username=\"左边风依旧肆虐\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.f72bd2cd.wQjCdvhDYMdld8whJotnGg?t=1495163027\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:1114635360}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u5de6\\u8fb9\\u98ce\\u4f9d\\u65e7\\u8086\\u8650&quot;,&quot;id&quot;:&quot;tb.1.f72bd2cd.wQjCdvhDYMdld8whJotnGg?t=1495163027&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.f72bd2cd.wQjCdvhDYMdld8whJotnGg?t=1495163027&amp;fr=pb\" target=\"_blank\">左边风依旧肆虐</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon3_1\" title=\"本吧头衔12级，经验值9072，点击进入等级头衔说明页\"><div class=\"d_badge_title \">GS冠军</div><div class=\"d_badge_lv\">12</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726508128\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    质量好，分数没啥问题，主要是207不炸基本没悬念</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:上海</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">20楼</span><span class=\"tail-info\">2024-08-06 22:12</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726508128,&quot;total_num&quot;:1}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(1)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:110px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div id=\"mediago-tb-pb-list-20\" data-po=\"20\"></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:891639076,&quot;user_name&quot;:&quot;\\u65b9\\u9053\\u6b63\\u4e5f&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.4c492ba.QJNZtF5xpyD42IDRBNoAOA&quot;,&quot;user_nickname&quot;:&quot;\\u65b9\\u9053\\u6b63\\u4e5f&quot;},&quot;content&quot;:{&quot;post_id&quot;:150726508373,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u606d\\u559c&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:21,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:1,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:20,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726508373\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u65b9\\u9053\\u6b63\\u4e5f&quot;,&quot;id&quot;:&quot;tb.1.4c492ba.QJNZtF5xpyD42IDRBNoAOA&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.4c492ba.QJNZtF5xpyD42IDRBNoAOA&amp;fr=pb\"><img username=\"方道正也\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.4c492ba.QJNZtF5xpyD42IDRBNoAOA\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:891639076}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u65b9\\u9053\\u6b63\\u4e5f&quot;,&quot;id&quot;:&quot;tb.1.4c492ba.QJNZtF5xpyD42IDRBNoAOA&quot;}\" alog-group=\"p_author\" title=\"该用户已经连续签到1004天了，连续30天一举“橙”名\" class=\"p_author_name sign_highlight j_user_card\" href=\"/home/main?id=tb.1.4c492ba.QJNZtF5xpyD42IDRBNoAOA&amp;fr=pb\" target=\"_blank\">方道正也</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon3_1\" title=\"本吧头衔13级，经验值15094，点击进入等级头衔说明页\"><div class=\"d_badge_title \">世界第一</div><div class=\"d_badge_lv\">13</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726508373\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    恭喜</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:山东</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">21楼</span><span class=\"tail-info\">2024-08-06 22:12</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726508373,&quot;total_num&quot;:1}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(1)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:110px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:832484529,&quot;user_name&quot;:&quot;cbz216&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.d9206907.9_D61KtatqZ-DiqOO-MgBw&quot;,&quot;user_nickname&quot;:&quot;\\u4e94\\u4ec1\\u6708\\u997c--&quot;},&quot;content&quot;:{&quot;post_id&quot;:150726508793,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u9648\\u8fd9\\u4e2a\\u5468\\u671f\\u662f\\u4e0d\\u662f\\u538b\\u7740\\u5168\\uff0c\\u540a\\u6253\\u4e86\\uff0c\\u7ed3\\u679c\\u5df4\\u9ece\\u8fd8\\u662f\\u8f93\\u4e86<img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon8.png\\&quot; >\\u597d\\u96be\\u8fc7\\u54e6&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:22,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:12,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:21,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726508793\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;cbz216&quot;,&quot;id&quot;:&quot;tb.1.d9206907.9_D61KtatqZ-DiqOO-MgBw&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.d9206907.9_D61KtatqZ-DiqOO-MgBw&amp;fr=pb\"><img username=\"cbz216\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.d9206907.9_D61KtatqZ-DiqOO-MgBw\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:832484529}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;cbz216&quot;,&quot;id&quot;:&quot;tb.1.d9206907.9_D61KtatqZ-DiqOO-MgBw&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.d9206907.9_D61KtatqZ-DiqOO-MgBw&amp;fr=pb\" target=\"_blank\">京酱肉丝--</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon2_1\" title=\"本吧头衔6级，经验值109，点击进入等级头衔说明页\"><div class=\"d_badge_title \">ITF冠军</div><div class=\"d_badge_lv\">6</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726508793\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    陈这个周期是不是压着全，吊打了，结果巴黎还是输了<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon8.png\">好难过哦</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <a rel=\"noopener\" class=\"l_post_anchor\" name=\"150726508793l\"></a><div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:上海</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">22楼</span><span class=\"tail-info\">2024-08-06 22:12</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726508793,&quot;total_num&quot;:12}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(12)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:350px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:2724859208,&quot;user_name&quot;:&quot;free\\u62bd\\u7684\\u5c31\\u662f\\u4f60&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.e7783dfc.GI9_G7xGR8zdYl_Gqtnc2A?t=1709199813&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150726509538,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;207\\u6ca1\\u70b8\\u70b8\\u4e866\\u7ec4\\u52a8\\u4f5c\\u4e5f\\u6ca1\\u60f3\\u5230&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:23,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:2,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:22,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726509538\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;free\\u62bd\\u7684\\u5c31\\u662f\\u4f60&quot;,&quot;id&quot;:&quot;tb.1.e7783dfc.GI9_G7xGR8zdYl_Gqtnc2A?t=1709199813&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.e7783dfc.GI9_G7xGR8zdYl_Gqtnc2A?t=1709199813&amp;fr=pb\"><img username=\"free抽的就是你\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.e7783dfc.GI9_G7xGR8zdYl_Gqtnc2A?t=1709199813\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:2724859208}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;free\\u62bd\\u7684\\u5c31\\u662f\\u4f60&quot;,&quot;id&quot;:&quot;tb.1.e7783dfc.GI9_G7xGR8zdYl_Gqtnc2A?t=1709199813&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.e7783dfc.GI9_G7xGR8zdYl_Gqtnc2A?t=1709199813&amp;fr=pb\" target=\"_blank\">free抽的就是你</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon2_2\" title=\"本吧头衔9级，经验值1674，点击进入等级头衔说明页\"><div class=\"d_badge_title \">种子选手</div><div class=\"d_badge_lv\">9</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726509538\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    207没炸炸了6组动作也没想到</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:山东</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"贴吧群时代开启，快到群里来！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?tab=qunliao\" target=\"_blank\">iPhone客户端</a></span><span class=\"tail-info\">23楼</span><span class=\"tail-info\">2024-08-06 22:12</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726509538,&quot;total_num&quot;:2}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(2)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:170px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:1053622054,&quot;user_name&quot;:&quot;\\u7537\\u513f\\u5f53\\u81ea\\u5f3a3872&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.12c60a72.1scTOAgD08JOU6K0VGFYeg?t=1403752715&quot;,&quot;user_nickname&quot;:&quot;\\u68a6\\u91cc\\u56de\\u6c5f\\u266c&quot;},&quot;content&quot;:{&quot;post_id&quot;:150726509862,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u606d\\u559c\\u4e24\\u4f4d\\uff0c\\u90fd\\u5f88\\u68d2&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:24,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:1,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:23,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726509862\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u7537\\u513f\\u5f53\\u81ea\\u5f3a3872&quot;,&quot;id&quot;:&quot;tb.1.12c60a72.1scTOAgD08JOU6K0VGFYeg?t=1403752715&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.12c60a72.1scTOAgD08JOU6K0VGFYeg?t=1403752715&amp;fr=pb\"><img username=\"男儿当自强3872\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.12c60a72.1scTOAgD08JOU6K0VGFYeg?t=1403752715\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:1053622054}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u7537\\u513f\\u5f53\\u81ea\\u5f3a3872&quot;,&quot;id&quot;:&quot;tb.1.12c60a72.1scTOAgD08JOU6K0VGFYeg?t=1403752715&quot;}\" alog-group=\"p_author\" title=\"该用户已经连续签到43天了，连续30天一举“橙”名\" class=\"p_author_name sign_highlight j_user_card\" href=\"/home/main?id=tb.1.12c60a72.1scTOAgD08JOU6K0VGFYeg?t=1403752715&amp;fr=pb\" target=\"_blank\">梦里回江<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/1-10.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a>\n\n                </li>\n                            <li class=\"d_icons\">\n                <span class=\"icon_wrap  icon_wrap_theme1 d_pb_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/102_14.png?stamp=1722691615) no-repeat -0px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"shuiping\" data-field=\"{&quot;name&quot;:&quot;shuiping&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:102,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u6c34\\u74f6\\u5ea7\\u5370\\u8bb0&quot;,&quot;intro&quot;:&quot;\\u83b7\\u53d6\\u89c4\\u5219\\uff1a\\u5728\\u661f\\u5ea7\\u52cb\\u7ae0\\u9986\\u4e2d\\u83b7\\u5f97\\u3002&quot;,&quot;intro_url&quot;:&quot;https:\\/\\/tieba.baidu.com\\/f?ie=utf-8&amp;amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;amp;fr=search&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,0&quot;}}\" target=\"_blank\" href=\"https://tieba.baidu.com/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search\" class=\"j_icon_slot\" title=\"水瓶座印记\" locate=\"shuiping_1#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span>\n\n            </li>\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon3_1\" title=\"本吧头衔12级，经验值9877，点击进入等级头衔说明页\"><div class=\"d_badge_title \">GS冠军</div><div class=\"d_badge_lv\">12</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726509862\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    恭喜两位，都很棒</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:广东</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"贴吧群时代开启，快到群里来！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?tab=qunliao\" target=\"_blank\">iPhone客户端</a></span><span class=\"tail-info\">24楼</span><span class=\"tail-info\">2024-08-06 22:12</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726509862,&quot;total_num&quot;:1}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(1)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:110px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:334508234,&quot;user_name&quot;:&quot;3353669cjl&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.39794f45.rFW_57NVtKElrztddk5bKA?t=1721722864&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150726510061,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u6c50\\u8d35\\u5983\\u6709\\u70b9\\u60e8\\u3002\\u3002\\u76f8\\u6bd4\\u9884\\u8d5b\\u534a\\u51b3\\u8d5b\\u5df2\\u7ecf\\u7279\\u522b\\u597d\\u4e86\\uff0c\\u4eca\\u5929\\u673a\\u4f1a\\u5f88\\u5927\\u7684\\u3002\\u3002\\u3002&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:25,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:1,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:24,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726510061\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;3353669cjl&quot;,&quot;id&quot;:&quot;tb.1.39794f45.rFW_57NVtKElrztddk5bKA?t=1721722864&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.39794f45.rFW_57NVtKElrztddk5bKA?t=1721722864&amp;fr=pb\"><img username=\"3353669cjl\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.39794f45.rFW_57NVtKElrztddk5bKA?t=1721722864\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:334508234}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;3353669cjl&quot;,&quot;id&quot;:&quot;tb.1.39794f45.rFW_57NVtKElrztddk5bKA?t=1721722864&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.39794f45.rFW_57NVtKElrztddk5bKA?t=1721722864&amp;fr=pb\" target=\"_blank\">AI未来</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon2_2\" title=\"本吧头衔9级，经验值1741，点击进入等级头衔说明页\"><div class=\"d_badge_title \">种子选手</div><div class=\"d_badge_lv\">9</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726510061\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    汐贵妃有点惨。。相比预赛半决赛已经特别好了，今天机会很大的。。。</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:上海</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">25楼</span><span class=\"tail-info\">2024-08-06 22:12</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726510061,&quot;total_num&quot;:1}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(1)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:110px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:719549171,&quot;user_name&quot;:&quot;\\u6d1b\\u795e\\u4e94\\u4e94&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.d98ccf82.whDt54jxFvrK0N4lqR1l-g&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150726510608,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u7a33\\u7a33\\u7684\\u5e78\\u798f<img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon20.png\\&quot; ><img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon20.png\\&quot; ><img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon20.png\\&quot; >&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:26,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:0,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:25,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726510608\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u6d1b\\u795e\\u4e94\\u4e94&quot;,&quot;id&quot;:&quot;tb.1.d98ccf82.whDt54jxFvrK0N4lqR1l-g&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.d98ccf82.whDt54jxFvrK0N4lqR1l-g&amp;fr=pb\"><img username=\"洛神五五\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.d98ccf82.whDt54jxFvrK0N4lqR1l-g\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:719549171}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u6d1b\\u795e\\u4e94\\u4e94&quot;,&quot;id&quot;:&quot;tb.1.d98ccf82.whDt54jxFvrK0N4lqR1l-g&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.d98ccf82.whDt54jxFvrK0N4lqR1l-g&amp;fr=pb\" target=\"_blank\">洛神五五</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon3\" title=\"本吧头衔10级，经验值2343，点击进入等级头衔说明页\"><div class=\"d_badge_title \">世界前十</div><div class=\"d_badge_lv\">10</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726510608\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    稳稳的幸福<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon20.png\"><img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon20.png\"><img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon20.png\"></div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:安徽</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"贴吧群时代开启，快到群里来！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?tab=qunliao\" target=\"_blank\">iPhone客户端</a></span><span class=\"tail-info\">26楼</span><span class=\"tail-info\">2024-08-06 22:12</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726510608,&quot;total_num&quot;:null}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:;\">回复</a><span class=\"lzl_link_fold\" style=\"display:none\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:50px\">        </div></div></div></div><div id=\"mediago-tb-pb-list-26\" data-po=\"26\"></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:2915917473,&quot;user_name&quot;:&quot;\\u8003\\u62c9Zq58xj6&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.cd7c04e0.G1oKVZZ87bfPFrkLNx2COg?t=1706339762&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150726510641,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u5fc3\\u75bc\\u9648\\u5b87\\u6c50\\u4e00\\u79d2<img class=\\&quot;BDE_Smiley\\&quot; pic_type=\\&quot;1\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; src=\\&quot;https:\\/\\/tb2.bdstatic.com\\/tb\\/editor\\/images\\/face\\/i_f22.png?t=20140803\\&quot; >&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:27,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:1,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:26,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726510641\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u8003\\u62c9Zq58xj6&quot;,&quot;id&quot;:&quot;tb.1.cd7c04e0.G1oKVZZ87bfPFrkLNx2COg?t=1706339762&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.cd7c04e0.G1oKVZZ87bfPFrkLNx2COg?t=1706339762&amp;fr=pb\"><img username=\"考拉Zq58xj6\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.cd7c04e0.G1oKVZZ87bfPFrkLNx2COg?t=1706339762\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:2915917473}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u8003\\u62c9Zq58xj6&quot;,&quot;id&quot;:&quot;tb.1.cd7c04e0.G1oKVZZ87bfPFrkLNx2COg?t=1706339762&quot;}\" alog-group=\"p_author\" title=\"该用户已经连续签到60天了，连续30天一举“橙”名\" class=\"p_author_name sign_highlight j_user_card\" href=\"/home/main?id=tb.1.cd7c04e0.G1oKVZZ87bfPFrkLNx2COg?t=1706339762&amp;fr=pb\" target=\"_blank\">红黑军团810</a>\n\n                </li>\n                            <li class=\"d_icons\">\n                <span class=\"icon_wrap  icon_wrap_theme1 d_pb_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/107_14.png?stamp=1722691615) no-repeat -10300px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"juxie_icon\" data-field=\"{&quot;name&quot;:&quot;juxie_icon&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:107,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u5de8\\u87f9\\u5ea7\\u5370\\u8bb0&quot;,&quot;intro&quot;:&quot;7\\u6708\\u5468\\u672b\\u7d2f\\u8ba1\\u6d3b\\u8dc33\\u5929&quot;,&quot;intro_url&quot;:&quot;https:\\/\\/tieba.baidu.com\\/mo\\/q\\/hybrid-main-user\\/taskCenter?customfullscreen=1&amp;amp;nonavigationbar=1&amp;amp;from=2&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,206&quot;}}\" target=\"_blank\" href=\"https://tieba.baidu.com/mo/q/hybrid-main-user/taskCenter?customfullscreen=1&amp;nonavigationbar=1&amp;from=2\" class=\"j_icon_slot\" title=\"巨蟹座印记\" locate=\"juxie_icon_1#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span>\n\n            </li>\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon3\" title=\"本吧头衔10级，经验值2397，点击进入等级头衔说明页\"><div class=\"d_badge_title \">世界前十</div><div class=\"d_badge_lv\">10</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726510641\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    心疼陈宇汐一秒<img class=\"BDE_Smiley\" pic_type=\"1\" width=\"30\" height=\"30\" src=\"https://tb2.bdstatic.com/tb/editor/images/face/i_f22.png?t=20140803\"></div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:安徽</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">27楼</span><span class=\"tail-info\">2024-08-06 22:12</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726510641,&quot;total_num&quot;:1}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(1)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:110px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:151581147,&quot;user_name&quot;:&quot;\\u4e0b\\u6b21\\u518d\\u89c1123&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.8e1fa9b1.phnxX1SRbt9WtEd_cZF60g?t=1402985730&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150726510671,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u5168\\u540e\\u5c45\\u7136\\u56e0\\u4e3a\\u8d62\\u800c\\u54ed\\uff0c\\u771f\\u7684\\u957f\\u5927\\u4e0d\\u5c11\\uff0c\\u6c50\\u8d35\\u5983\\u597d\\u65e0\\u5948&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:28,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:4,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:27,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726510671\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u4e0b\\u6b21\\u518d\\u89c1123&quot;,&quot;id&quot;:&quot;tb.1.8e1fa9b1.phnxX1SRbt9WtEd_cZF60g?t=1402985730&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.8e1fa9b1.phnxX1SRbt9WtEd_cZF60g?t=1402985730&amp;fr=pb\"><img username=\"下次再见123\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.8e1fa9b1.phnxX1SRbt9WtEd_cZF60g?t=1402985730\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:151581147}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u4e0b\\u6b21\\u518d\\u89c1123&quot;,&quot;id&quot;:&quot;tb.1.8e1fa9b1.phnxX1SRbt9WtEd_cZF60g?t=1402985730&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.8e1fa9b1.phnxX1SRbt9WtEd_cZF60g?t=1402985730&amp;fr=pb\" target=\"_blank\">下次再见123</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon3\" title=\"本吧头衔10级，经验值2478，点击进入等级头衔说明页\"><div class=\"d_badge_title \">世界前十</div><div class=\"d_badge_lv\">10</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726510671\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    全后居然因为赢而哭，真的长大不少，汐贵妃好无奈</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:广东</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"贴吧群时代开启，快到群里来！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?tab=qunliao\" target=\"_blank\">iPhone客户端</a></span><span class=\"tail-info\">28楼</span><span class=\"tail-info\">2024-08-06 22:12</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726510671,&quot;total_num&quot;:4}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(4)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:290px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:1353352456,&quot;user_name&quot;:&quot;\\u6258\\u7ba1\\u6559\\u4f60\\u505a\\u4eba&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.45f16169.Ffe8I8ozGncjnkQIButPyA?t=1456627873&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150726510677,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u9648\\u771f\\u7684\\u592a\\u9057\\u61be\\u4e86&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:29,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:0,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:28,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726510677\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u6258\\u7ba1\\u6559\\u4f60\\u505a\\u4eba&quot;,&quot;id&quot;:&quot;tb.1.45f16169.Ffe8I8ozGncjnkQIButPyA?t=1456627873&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.45f16169.Ffe8I8ozGncjnkQIButPyA?t=1456627873&amp;fr=pb\"><img username=\"托管教你做人\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.45f16169.Ffe8I8ozGncjnkQIButPyA?t=1456627873\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:1353352456}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u6258\\u7ba1\\u6559\\u4f60\\u505a\\u4eba&quot;,&quot;id&quot;:&quot;tb.1.45f16169.Ffe8I8ozGncjnkQIButPyA?t=1456627873&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.45f16169.Ffe8I8ozGncjnkQIButPyA?t=1456627873&amp;fr=pb\" target=\"_blank\">托管教你做人</a>\n\n                </li>\n                            <li class=\"d_icons\">\n                <span class=\"icon_wrap  icon_wrap_theme1 d_pb_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/102_14.png?stamp=1722691615) no-repeat -1050px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"jinniu\" data-field=\"{&quot;name&quot;:&quot;jinniu&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:102,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u91d1\\u725b\\u5ea7\\u5370\\u8bb0&quot;,&quot;intro&quot;:&quot;\\u83b7\\u53d6\\u89c4\\u5219\\uff1a\\u5728\\u661f\\u5ea7\\u52cb\\u7ae0\\u9986\\u4e2d\\u83b7\\u5f97\\u3002&quot;,&quot;intro_url&quot;:&quot;https:\\/\\/tieba.baidu.com\\/f?ie=utf-8&amp;amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;amp;fr=search&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,21&quot;}}\" target=\"_blank\" href=\"https://tieba.baidu.com/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search\" class=\"j_icon_slot\" title=\"金牛座印记\" locate=\"jinniu_1#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span>\n\n            </li>\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">网球萌新</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726510677\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    陈真的太遗憾了</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:安徽</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">29楼</span><span class=\"tail-info\">2024-08-06 22:12</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726510677,&quot;total_num&quot;:null}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:;\">回复</a><span class=\"lzl_link_fold\" style=\"display:none\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:50px\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:895294758,&quot;user_name&quot;:&quot;bubble_Wren&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.62271684.VW9sYe31J27uTNIP7Hvd2w?t=1475292881&quot;,&quot;user_nickname&quot;:&quot;\\u00ba\\u5883\\u8fc1&quot;},&quot;content&quot;:{&quot;post_id&quot;:150726510843,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:4513750,&quot;thread_id&quot;:9119688421,&quot;content&quot;:&quot;\\u6c50\\u8d35\\u5983\\u6700\\u540e\\u795e\\u60c5\\u6709\\u70b9\\u843d\\u5bde<img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon9.png\\&quot; >&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:1635505954,&quot;post_no&quot;:30,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:3,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:29,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150726510843\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;bubble_Wren&quot;,&quot;id&quot;:&quot;tb.1.62271684.VW9sYe31J27uTNIP7Hvd2w?t=1475292881&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.62271684.VW9sYe31J27uTNIP7Hvd2w?t=1475292881&amp;fr=pb\"><img username=\"bubble_Wren\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.62271684.VW9sYe31J27uTNIP7Hvd2w?t=1475292881\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:895294758}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;bubble_Wren&quot;,&quot;id&quot;:&quot;tb.1.62271684.VW9sYe31J27uTNIP7Hvd2w?t=1475292881&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.62271684.VW9sYe31J27uTNIP7Hvd2w?t=1475292881&amp;fr=pb\" target=\"_blank\">巴黎奥运冠军郑钦文</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon3\" title=\"本吧头衔11级，经验值3907，点击进入等级头衔说明页\"><div class=\"d_badge_title \">皇冠大师</div><div class=\"d_badge_lv\">11</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150726510843\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    汐贵妃最后神情有点落寞<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon9.png\"></div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:湖南</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"贴吧群时代开启，快到群里来！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?tab=qunliao\" target=\"_blank\">iPhone客户端</a></span><span class=\"tail-info\">30楼</span><span class=\"tail-info\">2024-08-06 22:12</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150726510843,&quot;total_num&quot;:3}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(3)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:230px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div></div></div><div class=\"right_section right_bright\"><div id=\"celebrity\" class=\"region_bright celebrity\" data-region=\"\" data-mod_type=\"\"><h4 class=\"region_header clearfix\">        <span class=\"pull_right j_op\"> </span></h4><div class=\"region_cnt clearfix\"><div class=\"intro\"><div class=\"col2-left\"><a class=\"gift-wrapper j-gift-buy\" href=\"javascript:;\"><span class=\"gift\"><img src=\"http://tb2.bdstatic.com/tb/static-user/widget/celebrity/img/single_member_100_8a10f9f.png\"></span>皇冠身份</a></div><div class=\"col2-right\"><ul class=\"privilege-list\"><li><i class=\"icon icon-red-thread-title\"></i>发贴红色标题</li><li><i class=\"icon icon-red-name\"></i>显示红名</li><li><i class=\"icon icon-sign-exp\"></i>签到六倍经验</li></ul></div></div><div class=\"more-privilege-container\"><div class=\"first-show-container\"><button class=\"purchase-member-btn j-gift-buy\">兑换本吧会员</button></div></div><p class=\"gray-text\">赠送补签卡1张，获得<a href=\"#\" class=\"celebrity-purchase-exp\" onclick=\"return false\" target=\"_blank\">[经验书购买权]</a></p></div><div class=\"region_footer\"></div></div>    <div id=\"my_tieba_mod\" class=\"region_bright my_tieba_mod \" data-region=\"\" data-mod_type=\"\"><h4 class=\"region_header clearfix\">        我在贴吧<span class=\"pull_right j_op\"> </span></h4><div class=\"region_cnt clearfix\">                <div class=\"media_horizontal clearfix \" id=\"user_info\"><a class=\"media_left\" style=\"\" href=\"/home/main?id=tb.1.e6057aec.PmFeyCvKVx0KZKdGZ2v9oA?t=1420595544&amp;fr=pb\" target=\"_blank\"><img class=\"head_img\" src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.e6057aec.PmFeyCvKVx0KZKdGZ2v9oA?t=1420595544\"></a><div class=\"media_right\">            <div class=\"user_name text_overflow\">                <span class=\"pre_icon_wrap pre_icon_wrap_theme2 \"><a class=\"icon_tbworld icon-crown-super-non1\" href=\"/tbmall/tshow\" target=\"_blank\" title=\"贴吧超级会员\"></a></span><a class=\"\" id=\"nameValue\" title=\"\" href=\"/home/main?id=tb.1.e6057aec.PmFeyCvKVx0KZKdGZ2v9oA?t=1420595544&amp;fr=pb\" target=\"_blank\" data-field=\"{&quot;user_id&quot;:null}\">抗压吧吧务666</a></div>            <div class=\"user_score\"><i class=\"                    icon_tbean yy-icon                    \"></i><a class=\"orange_text score_num j_score_num\" href=\"#\" onclick=\"return false\">                    0</a><a id=\"j_tcharge_dialog\" href=\"javascript:;\">[获取]</a></div>                                    <div class=\"user_tbmall clearfix\">                    <span class=\"icon_wrap  icon_wrap_theme1 balv_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1722691615) no-repeat -3800px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"starmaster\" data-field=\"{&quot;name&quot;:&quot;starmaster&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u624b\\u6e380\\u661f\\u8fbe\\u4eba&quot;,&quot;intro&quot;:&quot;\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;amp;ie=utf-8&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,76&quot;,&quot;2&quot;:&quot;1722691615,77&quot;,&quot;3&quot;:&quot;1722691615,78&quot;,&quot;4&quot;:&quot;1722691615,79&quot;,&quot;5&quot;:&quot;1722691615,80&quot;,&quot;6&quot;:&quot;1722691615,81&quot;}}\" target=\"_blank\" href=\"http://tieba.baidu.com/f?kw=玩家认证&amp;ie=utf-8\" class=\"j_icon_slot\" title=\"手游0星达人\" locate=\"starmaster_1#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span></div>            </div></div>    <div class=\"media-bottom\">                <div id=\"j_profile_pop\" class=\"profile_pop\"></div></div>        </div><div class=\"region_footer\"></div></div>    <div class=\"region_bright app_download_box\"><h4 class=\"region_header\"><span class=\"title\">扫二维码下载贴吧客户端</span></h4><div class=\"clearfix app_download_wrap region_cnt\"><div class=\"app_download_icon\"></div><div class=\"app_download_info\">下载贴吧APP<br>看高清直播、视频！</div></div></div><div style=\"height: 394px;\"><div class=\"topic_list_box topic-fixed\" style=\"width: 240px; top: 0px;\">        <div class=\"item_hd\"><span class=\"title\">贴吧热议榜</span></div><ul class=\"topic_list_hot topic_list j_topic_toplist\">                <li class=\"topic_item\"><span class=\"topic_flag_hot\">1</span><a target=\"_blank\" href=\"http://tieba.baidu.com/hottopic/browse/hottopic?topic_id=27785074&amp;topic_name=%E5%85%A8%E7%BA%A2%E5%A9%B5%E9%99%88%E8%8A%8B%E6%B1%90%E5%8C%85%E6%8F%BD10%E7%B1%B3%E5%8F%B0%E9%87%91%E9%93%B6\" class=\"topic_name\">全红婵陈芋汐包揽10米台金银</a><span class=\"topic_num\">2413020</span></li>                <li class=\"topic_item\"><span class=\"topic_flag_hot\">2</span><a target=\"_blank\" href=\"http://tieba.baidu.com/hottopic/browse/hottopic?topic_id=27784245&amp;topic_name=%E4%B8%AD%E5%9B%BD%E5%A5%B3%E6%8E%92%E4%B8%8D%E6%95%8C%E5%9C%9F%E8%80%B3%E5%85%B6%E6%97%A0%E7%BC%984%E5%BC%BA\" class=\"topic_name\">中国女排不敌土耳其无缘4强</a><span class=\"topic_num\">2049662</span></li>                <li class=\"topic_item\"><span class=\"topic_flag_hot\">3</span><a target=\"_blank\" href=\"http://tieba.baidu.com/hottopic/browse/hottopic?topic_id=27800068&amp;topic_name=%E6%9B%B9%E5%88%A9%E5%9B%BD%E5%86%B2%E5%87%BB%E5%8F%A4%E5%85%B8%E5%BC%8F%E6%91%94%E8%B7%A4%E9%87%91%E7%89%8C\" class=\"topic_name\">曹利国冲击古典式摔跤金牌</a><span class=\"topic_num\">1886192</span></li>                <li class=\"topic_item\"><span class=\"topic_flag\">4</span><a target=\"_blank\" href=\"http://tieba.baidu.com/hottopic/browse/hottopic?topic_id=27784844&amp;topic_name=%E5%9B%BD%E4%B9%92%E7%94%B7%E5%9B%A23%E6%AF%940%E5%8D%B0%E5%BA%A6%E6%99%8B%E7%BA%A7%E5%85%AB%E5%BC%BA\" class=\"topic_name\">国乒男团3比0印度晋级八强</a><span class=\"topic_num\">1369629</span></li>                <li class=\"topic_item\"><span class=\"topic_flag\">5</span><a target=\"_blank\" href=\"http://tieba.baidu.com/hottopic/browse/hottopic?topic_id=27800436&amp;topic_name=%E5%A5%B3%E5%AD%90%E5%9B%A0%E4%B9%92%E4%B9%93%E5%A5%B3%E5%8D%95%E5%86%B3%E8%B5%9B%E9%80%A0%E8%B0%A3%E8%A2%AB%E5%88%91%E6%8B%98\" class=\"topic_name\">女子因乒乓女单决赛造谣被刑拘</a><span class=\"topic_num\">1138826</span></li>                <li class=\"topic_item\"><span class=\"topic_flag\">6</span><a target=\"_blank\" href=\"http://tieba.baidu.com/hottopic/browse/hottopic?topic_id=27787738&amp;topic_name=%E5%90%A7%E5%8F%8B%E6%9D%A5%E9%A2%84%E6%B5%8B%E5%B7%B4%E9%BB%8E%E9%97%AD%E5%B9%95%E5%BC%8F%E6%97%97%E6%89%8B\" class=\"topic_name\">吧友来预测巴黎闭幕式旗手</a><span class=\"topic_num\">816375</span></li>                <li class=\"topic_item\"><span class=\"topic_flag\">7</span><a target=\"_blank\" href=\"http://tieba.baidu.com/hottopic/browse/hottopic?topic_id=27785879&amp;topic_name=%E4%BD%93%E8%82%B2%E6%80%BB%E5%B1%80%E5%AF%B9%E8%A2%81%E6%98%8A%E7%84%B6%E8%BF%9B%E8%A1%8C%E8%B0%83%E6%9F%A5\" class=\"topic_name\">体育总局对袁昊然进行调查</a><span class=\"topic_num\">801192</span></li>                <li class=\"topic_item\"><span class=\"topic_flag\">8</span><a target=\"_blank\" href=\"http://tieba.baidu.com/hottopic/browse/hottopic?topic_id=27770547&amp;topic_name=%E9%BB%91%E7%A5%9E%E8%AF%9D%E6%82%9F%E7%A9%BA%E6%AD%A3%E5%BC%8F%E7%89%88%E5%BC%80%E5%8F%91%E5%AE%8C%E6%88%90\" class=\"topic_name\">黑神话悟空正式版开发完成</a><span class=\"topic_num\">770063</span></li>                <li class=\"topic_item\"><span class=\"topic_flag\">9</span><a target=\"_blank\" href=\"http://tieba.baidu.com/hottopic/browse/hottopic?topic_id=27784965&amp;topic_name=%E4%B8%AD%E5%9B%BD%E5%8F%8D%E5%85%B4%E5%A5%8B%E5%89%82%E4%B8%AD%E5%BF%83%E6%96%A5%E7%BE%8E%E5%9B%BD%E5%8F%8C%E6%A0%87\" class=\"topic_name\">中国反兴奋剂中心斥美国双标</a><span class=\"topic_num\">691504</span></li>                <li class=\"topic_item\"><span class=\"topic_flag\">10</span><a target=\"_blank\" href=\"http://tieba.baidu.com/hottopic/browse/hottopic?topic_id=27798979&amp;topic_name=%E3%80%8A%E5%93%AA%E5%90%92%E4%B8%8E%E5%8F%98%E5%BD%A2%E9%87%91%E5%88%9A%E3%80%8B%E5%8F%91%E5%B8%83%E6%96%B0%E9%A2%84%E5%91%8A\" class=\"topic_name\">《哪吒与变形金刚》发布新预告</a><span class=\"topic_num\">576744</span></li>                </ul>        </div></div><div class=\"region_bright\" id=\"tieba-notice\"><ul class=\"unordered-list\"><li class=\"text-overflow\"><i class=\"notice-icon notice-icon-feedback\"></i><a pv_code=\"0\" href=\"http://tieba.baidu.com/f?ie=utf-8&amp;kw=%E8%B4%B4%E5%90%A7%E6%84%8F%E8%A7%81%E5%8F%8D%E9%A6%88\" target=\"_blank\">贴吧页面意见反馈</a></li><li class=\"text-overflow\"><i class=\"notice-icon notice-icon-screen\"></i><a pv_code=\"0\" href=\"http://tieba.baidu.com/f?ie=utf8&amp;kw=%E8%B4%B4%E5%90%A7%E6%9B%9D%E5%85%89%E5%8F%B0&amp;fr=wwwt\" target=\"_blank\">违规贴吧举报反馈通道</a></li><li class=\"text-overflow\"><i class=\"notice-icon notice-icon-trash\"></i><a pv_code=\"0\" href=\"http://tieba.baidu.com/tb/zt/notice.html\" target=\"_blank\">贴吧违规信息处理公示</a></li></ul></div><div id=\"branding_ads\"></div></div></div><div class=\"pb_footer\"><div class=\"p_thread thread_theme_7\" id=\"thread_theme_7\"><div class=\"l_thread_info\"><ul class=\"l_posts_num\">\n\t<li class=\"l_pager pager_theme_5 pb_list_pager\"><span class=\"tP\">1</span>\n<a href=\"/p/9119688421?pn=2\">2</a>\n<a href=\"/p/9119688421?pn=3\">3</a>\n<a href=\"/p/9119688421?pn=4\">4</a>\n<a href=\"/p/9119688421?pn=2\">下一页</a>\n<a href=\"/p/9119688421?pn=4\">尾页</a>\n</li>\n\t<li class=\"l_reply_num\" style=\"margin-left:8px\"><span class=\"red\" style=\"margin-right:3px\">251</span>回复贴，共<span class=\"red\">4</span>页</li>\n\t<li class=\"l_reply_num\">，跳到 <input theme=\"6\" id=\"jumpPage6\" max-page=\"4\" type=\"text\" class=\"jump_input_bright\"> 页&nbsp;<button id=\"pager_go6\" type=\"button\" value=\"确定\" class=\"btn-sub btn-small jump_btn_bright\">确定</button>&nbsp;</li>\n</ul>\n</div><div id=\"tofrs_up\" class=\"tofrs_up\"><a href=\"/f?kw=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8\" title=\"网球风云\">&lt;返回网球风云吧</a></div></div><div id=\"pb-footer-header\"></div><a name=\"sub\"></a><div id=\"tb_rich_poster_container\" class=\"tb_rich_poster_container\"><div id=\"rich_ueditor_tpl\"><div id=\"tb_rich_poster\" class=\"tb_rich_poster  \"><div class=\"j_bubble_container\"></div><div class=\"poster_head clearfix\"><div class=\"poster_head_text\">                    <a class=\"add_thread_btn post_head_btn cur\" title=\"发表回复\" href=\"javascript:;\"><span class=\"post_head_btn_icon post_head_btn_icon_post\"></span>发表回复</a>                    </div>                <div class=\"poster_head_surveillance j_surveillance\">发贴请遵守<a href=\"/tb/eula.html\" target=\"_blank\" onclick=\"$.stats.track('post_agreement', 'poster')\">贴吧协议及“七条底线”</a><a href=\"javascript:;\" id=\"frs_footer_tieba_report\" class=\"btn_tousu fr post_head_tousu\" data-checkun=\"un\">贴吧投诉</a>                    <button type=\"button\" class=\"poster_disable_float j_disable_float\" title=\"停止浮动\">停止浮动</button></div>                </div><div class=\"poster_body editor_wrapper\">                <div class=\"poster_component editor_content_wrapper ueditor_container\"><div class=\"poster_reply\">内&nbsp;&nbsp;容:</div><div class=\"old_style_wrapper\"><div id=\"ueditor_replace\" style=\"width: 700px; height: 220px;\"></div></div><div class=\"poster_error j_error\"></div></div>                <div class=\"j_poster_signature poster_signature\"><label><input type=\"checkbox\" class=\"j_use_signature\">使用签名档</label>&nbsp;<span class=\"j_signature_wrapper signature_wrapper\"><select name=\"sign_id\" class=\"j_sign_id\"></select>&nbsp;<a style=\"color:#0449BE\" target=\"_blank\" href=\"/i/sys/jump?type=signsetting\">查看全部</a></span></div>                <div class=\"poster_component editor_bottom_panel clearfix\"><div class=\"j_floating\"><a href=\"#\" class=\"ui_btn ui_btn_m j_submit poster_submit\" title=\"Ctrl+Enter快捷发表\"><span><em>发 表</em></span></a>                        <span class=\"poster_posting_status j_posting_status\"></span><div class=\"poster-right-area\">                            <div class=\"save-to-quick-reply-btn\">保存至<span>快速回贴</span></div>                            <br>                            <div class=\"poster_draft_status j_draft\" style=\"display: none;\"><span class=\"j_content\"></span><span title=\"清空草稿\" class=\"poster_draft_delete j_clear\"></span></div>                            </div><button class=\"btn_sub btn_middle j_clear_fullscreen poster_clear_fullscreen\" title=\"\">退 出</button></div></div></div>                        </div></div></div><div id=\"footer\" class=\"footer\">                                                                                                      <span>©2024 Baidu</span><a pv_code=\"0\" href=\"/tb/eula.html\" target=\"_blank\">贴吧协议</a><span>|</span><a pv_code=\"0\" href=\"https://tieba.baidu.com/tb/cms/tieba-fe/tieba_promise.html\" target=\"_blank\">隐私政策</a><span>|</span><a pv_code=\"0\" href=\"http://tieba.baidu.com/tb/system.html\" target=\"_blank\">吧主制度</a><span>|</span><a class=\"ueg_feedback-link\" data-site=\"feedbackLink\" pv_code=\"0\" href=\"http://tieba.baidu.com/hermes/feedback\" target=\"_blank\">意见反馈</a><span>|</span><a pv_code=\"0\" href=\"/tb/zt/declare/\" target=\"_blank\">网络谣言警示</a></div>    </div></div></div><div id=\"fixed_bar\" class=\"\"><img src=\"//tb1.bdstatic.com/tb/cms/PC%E7%AB%AF%E5%BA%95%E9%83%A8%E9%80%9A%E6%A0%8F%E5%BC%B9%E5%B1%821000x120.png\" alt=\"\"><img src=\"//tb2.bdstatic.com/tb/static-spage/widget/fixed_bar/images/icon_close_1683259.png\" alt=\"\" class=\"close\"></div><a id=\"fixed_daoliu\" href=\"\" target=\"_blank\" data-switch=\"0\"><img src=\"\"><span class=\"close\"></span></a>\n </div></div><script>PageUnitData={\"search_input_tip\":\"\\u8f93\\u5165\\u4f60\\u611f\\u5174\\u8da3\\u7684\\u4e1c\\u4e1c\",\"snowflow_imgs\":\"\",\"snowflow_url\":\"\",\"sign_mod_card_title\":\"\\u4e00\\u952e\\u7b7e\\u5230\\uff0c\\u6700\\u9ad8<span>6\\u500d\\u7ecf\\u9a8c\\uff01<\\/span>\",\"sign_mod_card_detail\":\"\",\"sign_mod_card_positive_btn\":\"<i class=\\\"icon\\\"><\\/i>\\u5ba2\\u6237\\u7aef\\u514d\\u8d39\\u4f53\\u9a8c\",\"sign_mod_card_no_txt\":\"<i class=\\\"icon\\\"><\\/i>\\u4f1a\\u5458\\u4e00\\u952e\\u7b7e\\u5230\",\"sign_mod_tiptitle1\":\"\\u7b7e\\u5230\\u7ecf\\u9a8c\\u5956\\u52b1\",\"sign_mod_tiptitle2\":\"\\u8fde\\u7eed\\u7b7e\\u5230\\u53cc\\u500d\\u7ecf\\u9a8c\",\"sign_mod_tiptitle3\":\"\\u52a0\\u7c97\\u5b57\\u4f53\\u4f7f\\u7528\\u7279\\u6743\",\"sign_mod_tiptitle4\":\"\\u7ea2\\u8272\\u5b57\\u4f53\\u4f7f\\u7528\\u7279\\u6743\",\"sign_mod_tiptitle5\":\"\\u4e00\\u4e3e\\u6a59\\u540d\",\"sign_mod_tiptext1\":\"\\u7b7e\\u5230\\u5373\\u5956\\u52b12\\u4e2a\\u7ecf\\u9a8c\\u503c\\u3002<br \\/>\\u624b\\u673a\\u7b7e\\u5230\\u989d\\u5916\\u5956\\u52b12\\u4e2a\\u7ecf\\u9a8c\\u503c\\u3002\",\"sign_mod_tiptext2\":\"\\u8fde\\u7eed\\u7b7e\\u5230\\u5956\\u52b1\\u7ecf\\u9a8c\\u503c\\u53cc\\u500d\\u3002\",\"sign_mod_tiptext3\":\"\\u5728\\u672c\\u5427\\u53d1\\u8d34\\u65f6\\u53ef\\u4ee5\\u4f7f\\u7528\\u52a0\\u7c97\\u5b57\\u4f53\\u3002\",\"sign_mod_tiptext4\":\"\\u5728\\u672c\\u5427\\u53d1\\u8d34\\u65f6\\u53ef\\u4ee5\\u4f7f\\u7528\\u7ea2\\u8272\\u5b57\\u4f53\\u3002\",\"sign_mod_tiptext5\":\"\\u5728\\u672c\\u5427\\u7528\\u6237ID\\u6a59\\u540d\\u9ad8\\u4eae\\u663e\\u793a\\u3002\",\"sign_mod_tipcondition1\":\"\\u6761\\u4ef6\\uff1a\\u6bcf\\u5929\\u70b9\\u51fb\\u7b7e\\u5230\\u540e\\u5373\\u53ef\\u83b7\\u5f97\\u3002\",\"sign_mod_tipcondition2\":\"\\u6761\\u4ef6\\uff1a\\u4fdd\\u6301\\u8fde\\u7eed\\u7b7e\\u52302\\u5929\\u53ca\\u4ee5\\u4e0a\\u3002\",\"sign_mod_tipcondition3\":\"\\u6761\\u4ef6\\uff1a\\u8fde\\u7eed\\u7b7e\\u523010\\u5929\\u53ca\\u4ee5\\u4e0a\\uff0c\\u4e0d\\u80fd\\u4e2d\\u65ad\\u54e6\",\"sign_mod_tipcondition4\":\"\\u6761\\u4ef6\\uff1a\\u8fde\\u7eed\\u7b7e\\u523020\\u5929\\u53ca\\u4ee5\\u4e0a\\uff0c\\u4e0d\\u80fd\\u4e2d\\u65ad\\u54e6\",\"sign_mod_tipcondition5\":\"\\u6761\\u4ef6\\uff1a\\u8fde\\u7eed\\u7b7e\\u523030\\u5929\\u53ca\\u4ee5\\u4e0a\\uff0c\\u4e0d\\u80fd\\u4e2d\\u65ad\\u54e6\",\"tbnav_bright_wanle_type\":\"0\",\"icons_category\":{\"101\":[\"\\u5df4\\u897f\\u4e16\\u754c\\u676f\"],\"102\":[\"\\u661f\\u5ea7\\u5370\\u8bb0\"],\"104\":[\"\\u8d34\\u5427\\u5370\\u8bb0\"]},\"dasense_messenger_whitelist\":[[\"http:\\/\\/fedev.baidu.com\"],[\"http:\\/\\/jiaoyu.baidu.com\"],[\"http:\\/\\/caifu.baidu.com\"],[\"http:\\/\\/jiankang.baidu.com\"],[\"http:\\/\\/tieba.dre8.com\"],[\"http:\\/\\/tdsp.nuomi.com\"],[\"http:\\/\\/baiju.baidu.com\"],[\"http:\\/\\/temai.baidu.com\"],[\"http:\\/\\/tieba.baidu.com\"],[\"http:\\/\\/zt.chuanke.com\"],[\"http:\\/\\/window.sturgeon.mopaas.com\"],[\"http:\\/\\/api.union.vip.com\"],[\"http:\\/\\/api.dongqiudi.com\"],[\"http:\\/\\/www.chuanke.com\"],[\"http:\\/\\/dcp.kuaizitech.com\\/\"]],\"like_tip_svip_black_list\":\"\",\"rich_poster_show_music_recommend\":\"\",\"rich_poster_feedback\":\"<p>\\u6e29\\u99a8\\u63d0\\u793a\\uff1a\\u53cd\\u9988bug\\u3001\\u5e10\\u53f7\\u5f02\\u5e38\\u6216\\u5220\\u8d34\\u95ee\\u9898\\u65f6\\uff0c\\u8bf7\\u63d0\\u4f9b\\u6587\\u5b57\\u5f62\\u5f0f\\u7684\\u95ee\\u9898\\u5e10\\u53f7\\uff08\\u975e\\u622a\\u56fe\\uff09\\u3001\\u95ee\\u9898\\u53d1\\u751f\\u7684\\u65f6\\u95f4\\uff0c\\u5e76\\u5c3d\\u53ef\\u80fd\\u4e0a\\u4f20\\u622a\\u56fe\\uff0c\\u4ee5\\u4e0a\\u4fe1\\u606f\\u6709\\u52a9\\u4e8e\\u8d34\\u5427\\u66f4\\u597d\\u7684\\u89e3\\u51b3\\u60a8\\u7684\\u95ee\\u9898\\u3002<\\/p>\",\"tope_pbbanner_swf\":\"\"};</script>\n<script src=\"//tb1.bdstatic.com/??tb/static-common/lib/tb_lib_ab6c0e0.js,tb/static-common/ui/common_logic_v2_59deee8.js,tb/static-common/js/tb_ui_c1c5c89.js,/tb/_/ban_8422f6c.js\"></script>\n<script>    (function(F){var _JSSTAMP = {\"pb\\/widget\\/video_player\\/video_player.js\":\"\\/tb\\/_\\/video_player_5678bdc.js\",\"pb\\/widget\\/video_player_html5\\/video_player_html5.js\":\"\\/tb\\/_\\/video_player_html5_b1304d8.js\",\"common\\/widget\\/block_user\\/block_user.js\":\"\\/tb\\/_\\/block_user_4fe7e3b.js\",\"encourage\\/widget\\/forbid_speech\\/forbid_speech.js\":\"\\/tb\\/_\\/forbid_speech_7b2f433.js\",\"common\\/widget\\/live_complaint\\/live_complaint.js\":\"\\/tb\\/_\\/live_complaint_4caab2c.js\",\"encourage\\/widget\\/paypost_agree_dialog\\/paypost_agree_dialog.js\":\"\\/tb\\/_\\/paypost_agree_dialog_086c5e0.js\",\"pb\\/widget\\/message\\/message.js\":\"\\/tb\\/_\\/message_e4c51fc.js\",\"common\\/widget\\/verify_dialog\\/verify_dialog.js\":\"\\/tb\\/_\\/verify_dialog_69e5571.js\",\"common\\/widget\\/login_verify_check\\/login_verify_check.js\":\"\\/tb\\/_\\/login_verify_check_8202383.js\",\"pb\\/widget\\/posts\\/posts.js\":\"\\/tb\\/_\\/posts_3224911.js\",\"pb\\/widget\\/pic_act_vote\\/pic_act_vote.js\":\"\\/tb\\/_\\/pic_act_vote_6c70142.js\",\"pb\\/widget\\/pic_act_repost\\/pic_act_repost.js\":\"\\/tb\\/_\\/pic_act_repost_ecdd7f4.js\",\"pb\\/widget\\/sub_list\\/sub_list_total.js\":\"\\/tb\\/_\\/sub_list_total_e32b978.js\",\"common\\/component\\/card\\/card.js\":\"\\/tb\\/_\\/card_aceb7b2.js\",\"pb\\/widget\\/favthread\\/favthread.js\":\"\\/tb\\/_\\/favthread_3d6669c.js\",\"pb\\/widget\\/pic_act_poster\\/pic_act_poster.js\":\"\\/tb\\/_\\/pic_act_poster_0ce65e4.js\",\"common\\/component\\/follower\\/follower.js\":\"\\/tb\\/_\\/follower_7ce74f3.js\",\"common\\/component\\/slide_show\\/slide_show.js\":\"\\/tb\\/_\\/slide_show_27c9ac6.js\",\"frs\\/widget\\/pic_sliding_window\\/pic_sliding_window.js\":\"\\/tb\\/_\\/pic_sliding_window_c9c5daf.js\",\"tbmall\\/widget\\/tbean_safe_ajax\\/tbean_safe_ajax.js\":\"\\/tb\\/_\\/tbean_safe_ajax_94e7ca2.js\",\"common\\/widget\\/tdou\\/tdou_view_pay.js\":\"\\/tb\\/_\\/tdou_view_pay_bfa4cf6.js\",\"common\\/component\\/force_login\\/force_login.js\":\"\\/tb\\/_\\/force_login_51097b2.js\",\"common\\/widget\\/post_service\\/post_service.js\":\"\\/tb\\/_\\/post_service_18ba763.js\",\"common\\/widget\\/image_uploader_manager\\/image_uploader_manager.js\":\"\\/tb\\/_\\/image_uploader_manager_d5f9d1a.js\",\"user\\/widget\\/my_tieba\\/my_tieba.js\":\"\\/tb\\/_\\/my_tieba_c65780e.js\",\"pb\\/widget\\/admin\\/admin.js\":\"\\/tb\\/_\\/admin_4b3a47c.js\",\"encourage\\/widget\\/novel_icons\\/novel_icons.js\":\"\\/tb\\/_\\/novel_icons_81de300.js\",\"common\\/widget\\/tbshare\\/tbshare.js\":\"\\/tb\\/_\\/tbshare_9c90235.js\",\"pb\\/widget\\/complient_thread\\/complient_thread.js\":\"\\/tb\\/_\\/complient_thread_91cf82c.js\",\"pb\\/widget\\/bind_hover\\/bind_hover.js\":\"\\/tb\\/_\\/bind_hover_f0f5c0f.js\",\"pcommon\\/component\\/login_dialog\\/login_dialog.js\":\"\\/tb\\/_\\/login_dialog_13c6b09.js\",\"common\\/component\\/js_pager\\/js_pager.js\":\"\\/tb\\/_\\/js_pager_ebc4a27.js\",\"props\\/component\\/props_api\\/props_api.js\":\"\\/tb\\/_\\/props_api_0ea4885.js\",\"user\\/widget\\/icons\\/icons.js\":\"\\/tb\\/_\\/icons_05b0275.js\",\"user\\/widget\\/pb_user_base\\/pb_user_base.js\":\"\\/tb\\/_\\/pb_user_base_ef1b60f.js\",\"common\\/widget\\/music_player\\/music_player.js\":\"\\/tb\\/_\\/music_player_9fe7a02.js\",\"pb\\/widget\\/baidusearch\\/baidusearch.js\":\"\\/tb\\/_\\/baidusearch_2832d79.js\",\"common\\/widget\\/login_dialog\\/login_dialog.js\":\"\\/tb\\/_\\/login_dialog_2b72cab.js\",\"pcommon\\/widget\\/pb_track\\/pb_track.js\":\"\\/tb\\/_\\/pb_track_234a8c1.js\",\"common\\/widget\\/lcs\\/lcs.js\":\"\\/tb\\/_\\/lcs_43bf602.js\",\"common\\/widget\\/card\\/card.js\":\"\\/tb\\/_\\/card_99bd0cd.js\",\"common\\/widget\\/wallet_dialog\\/wallet_dialog.js\":\"\\/tb\\/_\\/wallet_dialog_8b40af5.js\",\"common\\/widget\\/new_message_system\\/new_message_system.js\":\"\\/tb\\/_\\/new_message_system_5e2e122.js\",\"common\\/widget\\/cashier_dialog\\/cashier_dialog.js\":\"\\/tb\\/_\\/cashier_dialog_0c1473f.js\",\"common\\/widget\\/messenger\\/messenger.js\":\"\\/tb\\/_\\/messenger_040cae5.js\",\"common\\/widget\\/creative_bar\\/creative_bar.js\":\"\\/tb\\/_\\/creative_bar_2dbbad3.js\",\"common\\/widget\\/base_user_data\\/base_user_data.js\":\"\\/tb\\/_\\/base_user_data_72c8498.js\",\"common\\/widget\\/pay_member\\/pay_member.js\":\"\\/tb\\/_\\/pay_member_440a15e.js\",\"common\\/widget\\/http_transform\\/http_transform.js\":\"\\/tb\\/_\\/http_transform_e33a140.js\",\"common\\/widget\\/official_bar\\/official_bar.js\":\"\\/tb\\/_\\/official_bar_6be7442.js\",\"common\\/widget\\/business_agent\\/business_agent.js\":\"\\/tb\\/_\\/business_agent_832a519.js\",\"common\\/widget\\/global_switch\\/global_switch.js\":\"\\/tb\\/_\\/global_switch_d67de47.js\",\"common\\/widget\\/search_handler\\/search_handler.js\":\"\\/tb\\/_\\/search_handler_0e0c91c.js\",\"common\\/widget\\/suggestion\\/suggestion.js\":\"\\/tb\\/_\\/suggestion_96e27f5.js\",\"common\\/widget\\/animate_base\\/animate_base.js\":\"\\/tb\\/_\\/animate_base_51879f8.js\",\"common\\/component\\/captcha\\/captcha.js\":\"\\/tb\\/_\\/captcha_28c5dc5.js\",\"common\\/component\\/captcha_meizhi\\/captcha_meizhi.js\":\"\\/tb\\/_\\/captcha_meizhi_5f61aad.js\",\"common\\/component\\/image_uploader\\/image_uploader.js\":\"\\/tb\\/_\\/image_uploader_0093b47.js\",\"common\\/component\\/image_exif\\/image_exif.js\":\"\\/tb\\/_\\/image_exif_1b57cf0.js\",\"common\\/component\\/captcha_dialog\\/captcha_dialog.js\":\"\\/tb\\/_\\/captcha_dialog_b73e617.js\",\"common\\/component\\/postor_service\\/postor_service.js\":\"\\/tb\\/_\\/postor_service_53ed8e8.js\",\"common\\/component\\/scroll_panel\\/scroll_panel.js\":\"\\/tb\\/_\\/scroll_panel_9e28dd8.js\",\"common\\/component\\/suggestion\\/suggestion.js\":\"\\/tb\\/_\\/suggestion_9b05426.js\",\"common\\/component\\/toolbar\\/toolbar.js\":\"\\/tb\\/_\\/toolbar_5516683.js\",\"common\\/component\\/sketchpad_dialog\\/sketchpad_dialog.js\":\"\\/tb\\/_\\/sketchpad_dialog_abf416a.js\",\"common\\/component\\/tabs\\/tabs.js\":\"\\/tb\\/_\\/tabs_fca6d95.js\",\"common\\/widget\\/word_limit\\/word_limit.js\":\"\\/tb\\/_\\/word_limit_c99778f.js\",\"common\\/widget\\/aside_float_bar\\/aside_float_bar.js\":\"\\/tb\\/_\\/aside_float_bar_742aedf.js\",\"common\\/component\\/editor_pic\\/editor_pic.js\":\"\\/tb\\/_\\/editor_pic_e438e58.js\",\"common\\/component\\/editor_video\\/editor_video.js\":\"\\/tb\\/_\\/editor_video_61d8470.js\",\"common\\/component\\/editor_smiley\\/editor_smiley.js\":\"\\/tb\\/_\\/editor_smiley_2c8ea1a.js\",\"common\\/component\\/editor_music\\/editor_music.js\":\"\\/tb\\/_\\/editor_music_0128554.js\",\"common\\/component\\/editor_sketchpad\\/editor_sketchpad.js\":\"\\/tb\\/_\\/editor_sketchpad_159cc32.js\",\"common\\/component\\/area_select\\/area_select.js\":\"\\/tb\\/_\\/area_select_f396383.js\",\"common\\/component\\/sketchpad\\/sketchpad.js\":\"\\/tb\\/_\\/sketchpad_2e28d93.js\",\"common\\/component\\/interest_smiley\\/interest_smiley.js\":\"\\/tb\\/_\\/interest_smiley_863907f.js\",\"common\\/component\\/animate_keyframes_bouncein\\/animate_keyframes_bouncein.js\":\"\\/tb\\/_\\/animate_keyframes_bouncein_8d70c27.js\",\"common\\/component\\/animate_keyframes_bounceout\\/animate_keyframes_bounceout.js\":\"\\/tb\\/_\\/animate_keyframes_bounceout_8f15463.js\",\"common\\/component\\/animate_keyframes_fadein\\/animate_keyframes_fadein.js\":\"\\/tb\\/_\\/animate_keyframes_fadein_178e937.js\",\"common\\/component\\/animate_keyframes_fadeout\\/animate_keyframes_fadeout.js\":\"\\/tb\\/_\\/animate_keyframes_fadeout_44f964c.js\",\"common\\/component\\/animate_keyframes_flip\\/animate_keyframes_flip.js\":\"\\/tb\\/_\\/animate_keyframes_flip_44dec23.js\",\"common\\/component\\/animate_keyframes_focus\\/animate_keyframes_focus.js\":\"\\/tb\\/_\\/animate_keyframes_focus_de0bedc.js\",\"common\\/component\\/animate_keyframes_lightspeed\\/animate_keyframes_lightspeed.js\":\"\\/tb\\/_\\/animate_keyframes_lightspeed_6109fe5.js\",\"common\\/component\\/animate_keyframes_rotatein\\/animate_keyframes_rotatein.js\":\"\\/tb\\/_\\/animate_keyframes_rotatein_0b7ba89.js\",\"common\\/component\\/animate_keyframes_rotateout\\/animate_keyframes_rotateout.js\":\"\\/tb\\/_\\/animate_keyframes_rotateout_884da6a.js\",\"common\\/component\\/animate_keyframes_slidein\\/animate_keyframes_slidein.js\":\"\\/tb\\/_\\/animate_keyframes_slidein_38b544d.js\",\"common\\/component\\/animate_keyframes_slideout\\/animate_keyframes_slideout.js\":\"\\/tb\\/_\\/animate_keyframes_slideout_a86a043.js\",\"common\\/component\\/animate_keyframes_special\\/animate_keyframes_special.js\":\"\\/tb\\/_\\/animate_keyframes_special_fa9a9be.js\",\"common\\/component\\/animate_keyframes_zoomin\\/animate_keyframes_zoomin.js\":\"\\/tb\\/_\\/animate_keyframes_zoomin_9b12f77.js\",\"common\\/component\\/animate_keyframes_zoomout\\/animate_keyframes_zoomout.js\":\"\\/tb\\/_\\/animate_keyframes_zoomout_73cbdb0.js\",\"user\\/widget\\/user_api\\/user_api.js\":\"\\/tb\\/_\\/user_api_c1c17f1.js\",\"common\\/widget\\/qianbao_purchase_member\\/qianbao_purchase_member.js\":\"\\/tb\\/_\\/qianbao_purchase_member_ca949f3.js\",\"common\\/widget\\/tdou\\/tdou_open_type.js\":\"\\/tb\\/_\\/tdou_open_type_6e74792.js\",\"common\\/widget\\/qianbao_cashier_dialog\\/qianbao_cashier_dialog.js\":\"\\/tb\\/_\\/qianbao_cashier_dialog_3d909ce.js\",\"common\\/widget\\/base_dialog_user_bar\\/base_dialog_user_bar.js\":\"\\/tb\\/_\\/base_dialog_user_bar_9d205a7.js\",\"common\\/widget\\/show_dialog\\/show_dialog.js\":\"\\/tb\\/_\\/show_dialog_1644928.js\",\"common\\/widget\\/placeholder\\/placeholder.js\":\"\\/tb\\/_\\/placeholder_e682b0c.js\",\"common\\/widget\\/tbcopy\\/tbcopy.js\":\"\\/tb\\/_\\/tbcopy_8dc608c.js\",\"common\\/widget\\/tdou_get\\/tdou_get.js\":\"\\/tb\\/_\\/tdou_get_aaf9354.js\",\"common\\/widget\\/umoney_query\\/umoney_query.js\":\"\\/tb\\/_\\/umoney_query_c9b7960.js\",\"common\\/widget\\/qianbao_purchase_tdou\\/qianbao_purchase_tdou.js\":\"\\/tb\\/_\\/qianbao_purchase_tdou_f7bef41.js\",\"common\\/widget\\/umoney\\/umoney.js\":\"\\/tb\\/_\\/umoney_ed41085.js\",\"common\\/widget\\/payment_dialog_title\\/payment_dialog_title.js\":\"\\/tb\\/_\\/payment_dialog_title_a606194.js\",\"common\\/widget\\/tdou\\/tdou_data.js\":\"\\/tb\\/_\\/tdou_data_621617e.js\",\"common\\/widget\\/audio_player\\/audio_player.js\":\"\\/tb\\/_\\/audio_player_3ce73ee.js\",\"common\\/widget\\/voice_player\\/voice_player.js\":\"\\/tb\\/_\\/voice_player_9a9b6dc.js\",\"common\\/widget\\/user_head\\/user_head.js\":\"\\/tb\\/_\\/user_head_e9d6026.js\",\"common\\/component\\/image_previewer\\/image_previewer.js\":\"\\/tb\\/_\\/image_previewer_73d5f03.js\",\"common\\/component\\/image_editor\\/image_editor.js\":\"\\/tb\\/_\\/image_editor_7d1aff6.js\",\"common\\/component\\/image_previewer_list\\/image_previewer_list.js\":\"\\/tb\\/_\\/image_previewer_list_67f0ada.js\",\"common\\/component\\/image_previewer_rotate\\/image_previewer_rotate.js\":\"\\/tb\\/_\\/image_previewer_rotate_c7cabf0.js\",\"common\\/component\\/image_uploader_queue\\/image_uploader_queue.js\":\"\\/tb\\/_\\/image_uploader_queue_233b0a9.js\",\"common\\/component\\/image_progress_bar\\/image_progress_bar.js\":\"\\/tb\\/_\\/image_progress_bar_12c6eb4.js\",\"common\\/widget\\/pic_poster\\/pic_poster.js\":\"\\/tb\\/_\\/pic_poster_c887e05.js\",\"common\\/component\\/image_water\\/image_water.js\":\"\\/tb\\/_\\/image_water_7d6a194.js\",\"common\\/widget\\/scroll_panel\\/scroll_panel.js\":\"\\/tb\\/_\\/scroll_panel_51b7780.js\",\"common\\/component\\/image_flash_editor\\/image_flash_editor.js\":\"\\/tb\\/_\\/image_flash_editor_629e8f5.js\",\"common\\/widget\\/params_xss_handler\\/params_xss_handler.js\":\"\\/tb\\/_\\/params_xss_handler_bbb0828.js\",\"common\\/widget\\/bsk_service\\/bsk_service.js\":\"\\/tb\\/_\\/bsk_service_72c6560.js\",\"common\\/component\\/select\\/select.js\":\"\\/tb\\/_\\/select_8d82f79.js\",\"common\\/widget\\/acs_sdk\\/acs_sdk.js\":\"\\/tb\\/_\\/acs_sdk_40080a1.js\",\"ucenter\\/widget\\/like_tip\\/like_tip.js\":\"\\/tb\\/_\\/like_tip_9e62fca.js\",\"tbmall\\/widget\\/tbean_safe\\/tbean_safe.js\":\"\\/tb\\/_\\/tbean_safe_14418e9.js\",\"pcommon\\/widget\\/params_xss_handler\\/params_xss_handler.js\":\"\\/tb\\/_\\/params_xss_handler_6be09db.js\",\"common\\/widget\\/jiyan_service\\/jiyan_service.js\":\"\\/tb\\/_\\/jiyan_service_44ae7c8.js\",\"common\\/widget\\/vip_dialog\\/vip_dialog.js\":\"\\/tb\\/_\\/vip_dialog_590e8b6.js\",\"common\\/widget\\/hao_tian_mirror\\/hao_tian_mirror.js\":\"\\/tb\\/_\\/hao_tian_mirror_854bd07.js\",\"common\\/widget\\/post_prefix\\/post_prefix.js\":\"\\/tb\\/_\\/post_prefix_daad9e7.js\",\"common\\/widget\\/post_signature\\/post_signature.js\":\"\\/tb\\/_\\/post_signature_4c43552.js\",\"common\\/widget\\/mouse_pwd\\/mouse_pwd.js\":\"\\/tb\\/_\\/mouse_pwd_f31d0b4.js\",\"encourage\\/widget\\/post_guessing_new\\/post_guessing_new.js\":\"\\/tb\\/_\\/post_guessing_new_f924d5d.js\",\"common\\/component\\/bubble_factory\\/bubble_factory.js\":\"\\/tb\\/_\\/bubble_factory_f970c47.js\",\"bawu\\/widget\\/complaint_bar_owner\\/complaint_bar_owner.js\":\"\\/tb\\/_\\/complaint_bar_owner_8fddc2c.js\",\"common\\/component\\/quick_reply_edit\\/quick_reply_edit.js\":\"\\/tb\\/_\\/quick_reply_edit_9678e8c.js\",\"encourage\\/widget\\/post_marry\\/post_marry.js\":\"\\/tb\\/_\\/post_marry_6ee69ee.js\",\"common\\/widget\\/paypost_data\\/paypost_data.js\":\"\\/tb\\/_\\/paypost_data_62a7ae4.js\",\"props\\/widget\\/props_data\\/props_data.js\":\"\\/tb\\/_\\/props_data_a25400f.js\",\"common\\/component\\/slide_select\\/slide_select.js\":\"\\/tb\\/_\\/slide_select_01ec4cf.js\",\"common\\/component\\/post_props\\/post_props.js\":\"\\/tb\\/_\\/post_props_73bc086.js\",\"common\\/component\\/attachment_uploader\\/attachment_uploader.js\":\"\\/tb\\/_\\/attachment_uploader_a9da3e8.js\",\"common\\/component\\/picture_album_selector\\/picture_album_selector.js\":\"\\/tb\\/_\\/picture_album_selector_6b0a6cf.js\",\"common\\/component\\/picture_selector\\/picture_selector.js\":\"\\/tb\\/_\\/picture_selector_e6c54bf.js\",\"common\\/component\\/picture_uploader\\/picture_uploader.js\":\"\\/tb\\/_\\/picture_uploader_ac18c84.js\",\"common\\/component\\/picture_web_selector\\/picture_web_selector.js\":\"\\/tb\\/_\\/picture_web_selector_38937a8.js\",\"common\\/component\\/scrawl\\/scrawl.js\":\"\\/tb\\/_\\/scrawl_e0ae790.js\",\"common\\/component\\/ueditor_emotion\\/ueditor_emotion.js\":\"\\/tb\\/_\\/ueditor_emotion_a903913.js\",\"common\\/component\\/ueditor_music\\/ueditor_music.js\":\"\\/tb\\/_\\/ueditor_music_0276fa3.js\",\"common\\/component\\/ueditor_video\\/ueditor_video.js\":\"\\/tb\\/_\\/ueditor_video_fd96c67.js\",\"common\\/component\\/slide_select_image\\/slide_select_image.js\":\"\\/tb\\/_\\/slide_select_image_e6dbcd3.js\",\"common\\/component\\/colorful\\/colorful.js\":\"\\/tb\\/_\\/colorful_4f85c36.js\",\"common\\/component\\/custom_emotion\\/custom_emotion.js\":\"\\/tb\\/_\\/custom_emotion_c7f15af.js\",\"common\\/component\\/post_bubble\\/post_bubble.js\":\"\\/tb\\/_\\/post_bubble_9f3833e.js\",\"common\\/component\\/tb_gram\\/tb_gram.js\":\"\\/tb\\/_\\/tb_gram_5afa029.js\",\"common\\/component\\/formula\\/formula.js\":\"\\/tb\\/_\\/formula_58b7814.js\",\"common\\/component\\/post_setting\\/post_setting.js\":\"\\/tb\\/_\\/post_setting_ac01c94.js\",\"common\\/component\\/paypost\\/paypost.js\":\"\\/tb\\/_\\/paypost_62e57ae.js\",\"common\\/widget\\/join_vip_dialog\\/join_vip_dialog.js\":\"\\/tb\\/_\\/join_vip_dialog_e8b24ea.js\",\"common\\/component\\/quick_reply_data_handler\\/quick_reply_data_handler.js\":\"\\/tb\\/_\\/quick_reply_data_handler_256a70d.js\",\"common\\/widget\\/scroll_horizontal\\/scroll_horizontal.js\":\"\\/tb\\/_\\/scroll_horizontal_beb7cc0.js\",\"common\\/widget\\/detect_manager_block\\/detect_manager_block.js\":\"\\/tb\\/_\\/detect_manager_block_713b838.js\",\"common\\/widget\\/verify_manager_phone\\/verify_manager_phone.js\":\"\\/tb\\/_\\/verify_manager_phone_6f07b28.js\",\"common\\/widget\\/tb_lcs\\/tb_lcs.js\":\"\\/tb\\/_\\/tb_lcs_544b5c9.js\",\"common\\/widget\\/event_center\\/event_center.js\":\"\\/tb\\/_\\/event_center_08fbacd.js\"};         F.tbConfig(_JSSTAMP);    })(F);</script><script src=\"//tb1.bdstatic.com/??/tb/_/app_f6b8e80.js,/tb/_/card_99bd0cd.js,/tb/_/js_pager_ebc4a27.js,/tb/_/login_dialog_2b72cab.js,/tb/_/user_head_e9d6026.js,/tb/_/user_api_c1c17f1.js,/tb/_/global_switch_d67de47.js,/tb/_/icons_05b0275.js,/tb/_/wallet_dialog_8b40af5.js,/tb/_/event_center_08fbacd.js,/tb/_/lcs_43bf602.js,/tb/_/tb_lcs_544b5c9.js,/tb/_/flash_lcs_ccd5d3e.js,/tb/_/new_message_system_5e2e122.js,/tb/_/messenger_040cae5.js,/tb/_/base_user_data_72c8498.js,/tb/_/cashier_dialog_0c1473f.js,/tb/_/creative_bar_2dbbad3.js,/tb/_/qianbao_cashier_dialog_3d909ce.js,/tb/_/base_dialog_user_bar_9d205a7.js,/tb/_/qianbao_purchase_member_ca949f3.js,/tb/_/pay_member_440a15e.js,/tb/_/http_transform_e33a140.js,/tb/_/official_bar_6be7442.js,/tb/_/business_agent_832a519.js,/tb/_/userbar_8b82a68.js,/tb/_/footer_af59471.js,/tb/_/poptip_74068e9.js,/tb/_/ad_stats_008fc58.js,/tb/_/util_8d5f753.js\"></script>\n<script src=\"//tb1.bdstatic.com/??/tb/_/preview_01cc209.js,/tb/_/pb_track_234a8c1.js,/tb/_/conf_skin_0e0d6d7.js,/tb/_/platform_skin_d41d8cd.js,/tb/_/tbskin_c103c2e.js,/tb/_/search_handler_0e0c91c.js,/tb/_/suggestion_96e27f5.js,/tb/_/search_bright_8b6cf6f.js,/tb/_/snowflow_87a4cb6.js,/tb/_/attention_category_game_8156abe.js,/tb/_/slide_show_27c9ac6.js,/tb/_/stock_banner_b12b140.js,/tb/_/vip_dialog_590e8b6.js,/tb/_/util_02ce566.js,/tb/_/dialog_dc42202.js,/tb/_/join_vip_dialog_e8b24ea.js,/tb/_/cont_sign_card_15e0274.js,/tb/_/sign_mod_bright_62b82d6.js,/tb/_/medal_9a95e9d.js,/tb/_/forum_card_b1a17f4.js,/tb/_/my_often_forum_572ef85.js,/tb/_/frs_version_0876485.js,/tb/_/stock_nav_ab6d85a.js,/tb/_/tbnav_bright_036ff50.js,/tb/_/pager_f29e87d.js,/tb/_/share_bf89626.js,/tb/_/verify_manager_phone_6f07b28.js,/tb/_/detect_manager_block_713b838.js,/tb/_/block_user_4fe7e3b.js,/tb/_/forbid_speech_7b2f433.js\"></script>\n<script src=\"//tb1.bdstatic.com/??/tb/_/live_complaint_4caab2c.js,/tb/_/paypost_data_62a7ae4.js,/tb/_/paypost_agree_dialog_086c5e0.js,/tb/_/message_e4c51fc.js,/tb/_/admin_4b3a47c.js,/tb/_/no_refresh_pager_acf67ae.js,/tb/_/content_head_4019475.js,/tb/_/verify_dialog_69e5571.js,/tb/_/login_verify_check_8202383.js,/tb/_/favthread_3d6669c.js,/tb/_/force_login_51097b2.js,/tb/_/bsk_service_72c6560.js,/tb/_/acs_sdk_40080a1.js,/tb/_/tool_async_9035e8b.js,/tb/_/loader_async_acecc9f.js,/tb/_/like_tip_9e62fca.js,/tb/_/captcha_payment_df7462b.js,/tb/_/paykey_rsa_95bd914.js,/tb/_/paykey_dialog_13360a3.js,/tb/_/paykey_mobile_905c4dc.js,/tb/_/tbean_safe_14418e9.js,/tb/_/params_xss_handler_6be09db.js,/tb/_/jiyan_service_44ae7c8.js,/tb/_/post_service_18ba763.js,/tb/_/image_exif_1b57cf0.js,/tb/_/image_uploader_0093b47.js,/tb/_/image_uploader_manager_d5f9d1a.js,/tb/_/payment_dialog_title_a606194.js,/tb/_/show_dialog_1644928.js,/tb/_/qianbao_purchase_tdou_f7bef41.js\"></script>\n<script src=\"//tb1.bdstatic.com/??/tb/_/tdou_get_aaf9354.js,/tb/_/tcharge_dialog_5aff197.js,/tb/_/member_api_722ea18.js,/tb/_/umoney_query_c9b7960.js,/tb/_/nameplate_d41d8cd.js,/tb/_/my_current_forum_97a6354.js,/tb/_/tb_spam_846204f.js,/tb/_/my_tieba_c65780e.js,/tb/_/pic_act_poster_0ce65e4.js,/tb/_/follower_7ce74f3.js,/tb/_/pb_user_base_ef1b60f.js,/tb/_/forum_title_305bddf.js,/tb/_/novel_icons_81de300.js,/tb/_/save_face_3badee6.js,/tb/_/login_dialog_13c6b09.js,/tb/_/posts_3224911.js,/tb/_/tbean_safe_ajax_94e7ca2.js,/tb/_/pb_marry_142250d.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/data_handler_async_02038fe.js,/tb/_/fengchao_ad_tpl_c227d78.js,/tb/_/fengchao_pb_feed_85cbfeb.js,/tb/_/loader_95a0692.js,/tb/_/residual_250f75d.js,/tb/_/single_icons_58a2377.js,/tb/_/animate_base_51879f8.js,/tb/_/animate_keyframes_bouncein_8d70c27.js,/tb/_/animate_keyframes_bounceout_8f15463.js,/tb/_/animate_keyframes_fadein_178e937.js,/tb/_/animate_keyframes_fadeout_44f964c.js\"></script>\n<script src=\"//tb1.bdstatic.com/??/tb/_/animate_keyframes_flip_44dec23.js,/tb/_/animate_keyframes_focus_de0bedc.js,/tb/_/animate_keyframes_lightspeed_6109fe5.js,/tb/_/animate_keyframes_rotatein_0b7ba89.js,/tb/_/animate_keyframes_rotateout_884da6a.js,/tb/_/animate_keyframes_slidein_38b544d.js,/tb/_/animate_keyframes_slideout_a86a043.js,/tb/_/animate_keyframes_special_fa9a9be.js,/tb/_/animate_keyframes_zoomin_9b12f77.js,/tb/_/animate_keyframes_zoomout_73cbdb0.js,/tb/_/animate_0dcace2.js,/tb/_/novel_award_dialog_a496a9e.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/novel_award_thread_d1402f1.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/diamond_bind_mob_8dcdf1a.js,/tb/_/grab_treasure_report_73d05a2.js,/tb/_/treasure_payment_dialog_1ec3a33.js,/tb/_/treasure_rule_dialog_0a12b65.js,/tb/_/grab_treasure_ctrl_a4287bd.js,/tb/_/pb_grab_treasure_4aa555b.js,/tb/_/scroll_panel_51b7780.js,/tb/_/promoter_post_opts_7100968.js,/tb/_/promoter_post_body_3c1f785.js,/tb/_/idisk_2233809.js,/tb/_/paypost_guide_54a2ff9.js,/tb/_/paypost_42358a1.js,/tb/_/content_recommend_eb95cc3.js,/tb/_/gift_page_ctrl_75f0eea.js,/tb/_/gift_loading_css_ef8eeff.js\"></script>\n<script src=\"//tb1.bdstatic.com/??/tb/_/send_gift_dialog_3aa2de7.js,/tb/_/pb_post_foot_send_gift_c06bd02.js,/tb/_/props_api_0ea4885.js,/tb/_/complient_thread_91cf82c.js,/tb/_/sub_list_590ad31.js,/tb/_/forbid_speech_banner_570a9fc.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/icon_tip_b81012f.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/tbcopy_8dc608c.js,/tb/_/tbshare_9c90235.js,/tb/_/bind_hover_f0f5c0f.js,/tb/_/card_aceb7b2.js,/tb/_/post_list_7310a6c.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/scroll_event_e92b229.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/forum_member_dialog_f9a7e85.js,/tb/_/exp_package_dialog_d48cdd3.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/celebrity_widget_7938756.js,/tb/_/celebrity_forum_dialog_2c2a2fd.js,/tb/_/util_f73facc.js,/tb/_/net_proxy_fe50f68.js,/tb/_/guide_4fa0de1.js,/tb/_/use_controller_8cf114c.js,/tb/_/interaction_9de54e4.js,/tb/_/month_icon_27518ed.js,/tb/_/user_visit_card_4125815.js\"></script>\n<script src=\"//tb1.bdstatic.com/??/tb/_/head_preview_8a7862f.js,/tb/_/buy_controller_bfff055.js,/tb/_/celebrity_expball_87cd404.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/celebrity_6d8fa24.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/npc_vote_action_b3f8ded.js,/tb/_/aside_ad_b3d4853.js,/tb/_/video_player_html5_b1304d8.js,/tb/_/video_player_5678bdc.js,/tb/_/avideo_b554617.js,/tb/_/search_back_8e0f1ba.js,/tb/_/topic_rank_b4f4b25.js,/tb/_/news_recommend_78ab97c.js,/tb/_/showlist_781bbee.js,/tb/_/cps_ad_6a3c1e2.js,/tb/_/page_aside_c59e8c4.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/npc_vote_action_b3f8ded.js,/tb/_/duoku_servers_dialog_2eaf095.js,/tb/_/duoku_servers_list_ab581bb.js,/tb/_/inform_manager_verify_phone_2befbc3.js,/tb/_/game_swap_words_edd1502.js,/tb/_/hao_tian_mirror_854bd07.js,/tb/_/params_xss_handler_bbb0828.js,/tb/_/mouse_pwd_f31d0b4.js,/tb/_/postor_common_d743e96.js,/tb/_/scroll_panel_9e28dd8.js,/tb/_/custom_emotion_c7f15af.js,/tb/_/ueditor_emotion_a903913.js\"></script>\n<script src=\"//tb1.bdstatic.com/??/tb/_/independent_emotion_aac4632.js,/tb/_/simple_poster_4121714.js,/tb/_/word_limit_c99778f.js,/tb/_/post_prefix_daad9e7.js,/tb/_/post_signature_4c43552.js,/tb/_/post_guessing_new_f924d5d.js,/tb/_/props_data_a25400f.js,/tb/_/bubble_factory_f970c47.js,/tb/_/complaint_bar_owner_8fddc2c.js,/tb/_/quick_reply_data_handler_256a70d.js,/tb/_/quick_reply_edit_9678e8c.js,/tb/_/post_marry_6ee69ee.js,/tb/_/poster_context_c5c4772.js,/tb/_/rich_poster_4873152.js,/tb/_/baidusearch_2832d79.js,/tb/_/stat_300888d.js,/tb/_/music_player_9fe7a02.js,/tb/_/no_auto_video_de13e7b.js,/tb/_/audio_player_3ce73ee.js,/tb/_/voice_player_9a9b6dc.js,/tb/_/voice_0a018d7.js,/tb/_/meizhi_vote_b66b525.js,/tb/_/welfare_icon_1437499.js,/tb/_/achieve_card_4fb9554.js,/tb/_/fancard_944a898.js,/tb/_/xiu8_follow_warn_bf7a2e8.js,/tb/_/focus_btn_d48447a.js,/tb/_/locality_pop_window_0777bb3.js,/tb/_/platform_spread_layer_927b358.js,/tb/_/pk_fixed_bubble_696f045.js\"></script>\n<script src=\"//tb1.bdstatic.com/??/tb/_/platform_spread_video_5835970.js,/tb/_/popWindow_62e5db8.js,/tb/_/image_flash_editor_629e8f5.js,/tb/_/editor_pic_meizhi_2636c0d.js,/tb/_/meizhi_postor_af0d8da.js,/tb/_/frs_stamp_notice_7e52ec6.js,/tb/_/postor_service_53ed8e8.js,/tb/_/image_water_7d6a194.js,/tb/_/interest_smiley_863907f.js,/tb/_/comtrial_ec0f124.js,/tb/_/skin_click_5308cee.js,/tb/_/game_pop_window_55af3b8.js,/tb/_/bd_share_567729f.js,/tb/_/url_check_a9f025b.js,/tb/_/residual_a0c9367.js,/tb/_/magic_props_4930cc2.js,/tb/_/feedback_22ddff1.js,/tb/_/nameplate_recast_f965ef3.js,/tb/_/tshow_out_date_warn_1e57655.js,/tb/_/pb_track_a6c2233.js,/tb/_/umoney_promotion_dialog_3e69cde.js,/tb/_/advertise_right_74d24fc.js,/tb/_/grab_treasure_dialog_success_ad7b720.js,/tb/_/focus_btn_d48447a.js,/tb/_/fixed_bar_163a2a0.js,/tb/_/fixed_daoliu_f57f4ca.js,/tb/_/bright_5275f61.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/npc_vote_action_b3f8ded.js,/tb/_/focus_btn_d48447a.js\"></script>\n<script src=\"//tb1.bdstatic.com/??/tb/_/thread_recommend_74cb56d.js,/tb/_/info_collection_24e3fec.js,/tb/_/tpl_ext_1373d5a.js,/tb/_/aside_float_bar_742aedf.js,/tb/_/magic_props_139f233.js,/tb/_/tpl_9_81643ae.js\"></script>\n<script>window.modDiscardTemplate={};</script>\n<script>    _.Module.use('creativeplatform/widget/aopApp', [[]]);</script><script>    _.Module.use('pcommon/widget/preview', [], function(){});  </script><script>    _.Module.use('common/widget/httpTransform', [], function(){});  </script><script>_.Module.use('common/widget/suggestion', [], function(){});</script><script>_.Module.use('common/widget/searchBright',[$('#head'),{    style:'bright',    theme:'bright_pb',    forumName:'网球风云',    searchFixed:'',    sugOn:'1'}]);</script><script>PageData.user.is_like = 0;PageData.user.is_block = 0;PageData.is_sign_in = 0; PageData.is_star = 0;PageData.sign_forum_info = {\"is_on\":true,\"is_filter\":false,\"forum_info\":{\"forum_id\":4513750,\"level_1_dir_name\":\"\\u7efc\\u5408\\u4f53\\u80b2\"},\"current_rank_info\":{\"sign_count\":444,\"member_count\":48481,\"sign_rank\":8,\"dir_rate\":\"0.1\"},\"level_1_dir_name\":\"\\u4f53\\u80b2\",\"level_2_dir_name\":\"\\u7efc\\u5408\\u4f53\\u80b2\",\"yesterday_rank_info\":{\"sign_count\":3452,\"member_count\":47919,\"sign_rank\":11,\"dir_rate\":\"0.1\"},\"weekly_rank_info\":{\"sign_count\":3405,\"member_count\":42491,\"sign_rank\":10},\"monthly_rank_info\":{\"sign_count\":2359,\"member_count\":41063,\"sign_rank\":16}},PageData.memberTitle = \"Ace\";PageData.memberNumber = \"\";PageData.is_activity_sign = '';    PageData.annualMemberMode = false;_.Module.use('ucenter/widget/sign_mod',[$('#sign_mod'),{'hasClass': 1, 'page': ''}]);</script><script>    _.Module.use('frs/widget/forum_card');    _.Module.use('frs/widget/forum_card/focus_btn',[{        \"islike\":\"0\",        \"isCategoryOfGame\": true,        \"forum_name\":\"网球风云\" ,        \"fr\":\"\",        \"userForumList\": []}]);</script><script>_.Module.use('common/widget/tbnav_bright', [$('#tb_nav'),{jq_search:$('#tb_nav').find('.j_search_internal_forum'),forumName:'网球风云'},{promotion_setting: [[]]}]);</script><script type=\"text/javascript\" src=\"//passport.baidu.com/passApi/js/uni_forceverify_wrapper.js\"></script><script></script><script>(function(){function b(p,o,n){if(p.length===+p.length){for(var m=0,j=p.length;m<j;m++){if(o.call(n,m,p[m],p)===false){return}}}else{for(var k in p){if(p.hasOwnProperty(k)){if(o.call(n,k,p[k],p)===false){return}}}}}var g=[];var i={push:function(k){g.push(k);if(window.localStorage&&window.JSON){try{localStorage.setItem(\"WPO_NR\",JSON.stringify(g))}catch(j){}}},get:function(j){var k=[];if(window.localStorage&&window.JSON){try{k=JSON.parse(localStorage.getItem(\"WPO_NR\"))||[];j&&localStorage.removeItem(\"WPO_NR\")}catch(l){}}else{k=g}if(j){g=[]}return k}};var c,f={},h={},a={PDC:{init:function(k){var j=navigator.connection||navigator.mozConnection||navigator.webkitConnection||{type:0};f={p:k.product_id,is_sample:Math.random()<=(k.sample||0.01),max:k.max||5,mnt:k.mnt||j.type};h={p:k.product_id,mnt:f.mnt,b:50};if(window.localStorage&&window.JSON&&window.addEventListener){c=i.get(true);window.addEventListener(\"load\",function(){e.send(c)},false)}},createInstance:function(j){return new d(j)}}};if((!window.localStorage||!window.JSON)&&document.attachEvent){window.attachEvent(\"onbeforeunload\",function(){e.send()})}var e={send:function(k){var m=[],l=[],o=k||i.get(true),n;if(o.length>0){b(o,function(p,r){var q=[];b(r.timing,function(s,t){q.push('\"'+s+'\":'+t)});m.push('{\"t\":{'+q.join(\",\")+'},\"a\":'+r.appId+\"}\");if(!n&&k&&r.start){n=r.start}});b(h,function(p,q){l.push(p+\"=\"+q)});l.push(\"d=[\"+m.join(\",\")+\"]\");if(n){l.push(\"_st=\"+n)}else{l.push(\"_t=\"+(+new Date))}var j=new Image();j.src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/pms/img/st.gif?\"+l.join(\"&\");window[\"___pms_img_\"+new Date()*1]=j}}};var d=function(j){this.appId=j;this.timing={};this.start=+new Date};d.prototype={mark:function(j,k){this.timing[j]=k||(new Date-this.start)},start_event:function(){this.start=+new Date},start_send:function(){this.mark(\"sts\")},transfer_time:function(){this.mark(\"tt\")},view_time:function(){this.mark(\"vt\")},ready:function(){if(f.is_sample){i.push(this);if(i.get().length>=f.max){e.send()}}},error:function(j){}};window.AJAX_MONITOR=a})();</script><script>    _.Module.use(\"pb/widget/ForumTitle\",[{        'is_pic_act_underway': false}],  function(forumTitle){        window.forumTitle = forumTitle;    });</script><script>    _.Module.use('pb/widget/saveFace', [{        'isLogin': \"1\",        'props': {\"all_level\":{\"2\":{\"end_time\":\"1421113470\",\"level\":2,\"score_limit\":8000}},\"level\":{\"end_time\":\"1421113470\",\"expired_notify\":1,\"expiring_notify\":1,\"left_num\":0,\"max_free_score\":8000,\"open_status\":null,\"pic_url\":null,\"props_category\":105,\"props_id\":2,\"props_type\":0,\"update_time\":null,\"used_status\":1}},        'forumId': \"4513750\",        'threadId': \"9119688421\"    }], function(){});</script><script>    _.Module.use(\"encourage/widget/pb_marry\", {});</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    _.Module.use('tbmall/widget/pb_post_foot_send_gift', {        container: '.post-foot-send-gift-container',        box: '.post-foot-send-gift',        authorId: 1635505954,        postId: 150726491368,        presentNum: 0});</script><script>    var idx = 0;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 1;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('adsense/widget/fengchao_ad_tpl', [{        'commonJsData': \"!function(t){&quot;use strict&quot;;function e(t,e){if(t){var n=new Date().getTime(),r=new Image;t+=&quot;&amp;rand=&quot;+(n+Math.random()),window.ecomLogImage||(window.ecomLogImage={}),window.ecomLogImage[&quot;--IMAGE&quot;+n]=r,e=e||{};var o=!1;r.onload=r.onerror=r.onabort=function(i){if(!e.charge){if(i&amp;&amp;&quot;load&quot;!==i.type){if(o)&quot;error&quot;in e&amp;&amp;e.error();else{r.src=t,o=!0;return}}else&quot;load&quot;in e&amp;&amp;e.load()}r.onload=r.onerror=r.onabort=null,window.ecomLogImage[&quot;--IMAGE&quot;+n]=null,r=null},r.src=t}}var n,r=function(){var t,e,n,r=0,o=0,i=0,a=0,s=0,c=0,u=0,f=0,h=\\/link\\\\?url\\\\=([^\\\\&amp;]+)\\/,l=\\/\\\\?url\\\\=([^\\\\.]+)\\\\.\\/,p=&quot;data-cklink&quot;,d=\\/[?&amp;]tn=([^&amp;]*)\\/;function v(t){if(!t)return!1;var e=h.exec(t)||l.exec(t);return!!e&amp;&amp;(h.exec(t)?e[1].length&lt;20?e[1]:e[1].substr(0,20):e[1])}function g(n){var a,s,h,l,d,g=(l=f.href,d=f.getAttribute(p),v(l)||v(d));!1!==g&amp;&amp;(a=&quot;&amp;ck=&quot;+[function(t,e){for(var n=0,r=0;r&lt;i*e%99+9;r++)n+=t.charCodeAt(u*r%t.length);return n}(g,n),i,u,Math.round(r),Math.round(o),Math.round(t),Math.round(e),c].join(&quot;.&quot;),s=f.href,h=f.getAttribute(p),s&amp;&amp;v(s)&amp;&amp;(f.href=y(s,a)+m(s)),h&amp;&amp;v(h)&amp;&amp;f.setAttribute(p,y(h,a)+m(h)))}function m(t){var e=&quot;&quot;;if(-1===t.indexOf(&quot;&amp;shh=&quot;)&amp;&amp;-1===t.indexOf(&quot;?shh=&quot;)&amp;&amp;(e=&quot;&amp;shh=&quot;+location.hostname),-1===t.indexOf(&quot;&amp;sht=&quot;)&amp;&amp;-1===t.indexOf(&quot;?sht=&quot;)){var n=location.href.match(d);n&amp;&amp;(e+=&quot;&amp;sht=&quot;+n[1])}return e}function y(t,e){return v(t)&amp;&amp;(-1===t.indexOf(&quot;&amp;ck=&quot;)?t+=e:t=t.replace(\\/&amp;ck=[\\\\d.]*\\/,e)),t}function b(n,h,l){void 0===n.length&amp;&amp;(n=[n]);for(var d=n.length,b=0,w=[function(n){var s;f=(s=(s=n)||window.event).target||s.srcElement,i++,void 0===t&amp;&amp;(t=s.clientX),void 0===e&amp;&amp;(e=s.clientY),r=0,o=0,u=0,c=0,a=new Date().getTime(),g(h)},function(t){!function(t,e){for(f=(t=t||window.event).target||t.srcElement;f&amp;&amp;&quot;A&quot;!==f.tagName;)f=f.parentNode;s=new Date().getTime(),u=9999,r=t.clientX,o=t.clientY,c=0===a?0:s-a,g(e)}(t,h)},function(t){u=new Date().getTime()-s,g(h)}];b&lt;d;b++)l||function(t){var e=t.href;if(v(e)){var n=&quot;&amp;ck=&quot;+[0,i,u,Math.round(r),Math.round(o),0,0,c].join(&quot;.&quot;),a=t.getAttribute(p);e&amp;&amp;(t.href=y(e,n)+m(e)),a&amp;&amp;t.setAttribute(p,y(a,n)+m(a))}}(n[b]),function(t,e,n){for(var r,o,i=e.length,a=0;a&lt;i;a++)r=e[a],o=n[a],window.attachEvent?t.attachEvent(&quot;on&quot;+r,o):t.addEventListener(r,o,!1)}(n[b],[&quot;mouseover&quot;,&quot;mousedown&quot;,&quot;mouseup&quot;],w)}return{getInstance:function(t){return n||(n={addAdsCk:b}),n}}},o={init:function(t,e,o){var i=r().getInstance(t);n=i;for(var a=document.querySelectorAll(t),s=0;s&lt;a.length;s++){var c=a[s],u=c.getAttribute(&quot;data-ecimtimesign&quot;)||c.getAttribute(&quot;data-pz-sign&quot;)||e,f=c.getElementsByTagName(&quot;A&quot;);i.addAdsCk(f,u,o)}return i},getInstance:function(){return n}},i=&quot;undefined&quot;!=typeof globalThis?globalThis:&quot;undefined&quot;!=typeof window?window:&quot;undefined&quot;!=typeof global?global:&quot;undefined&quot;!=typeof self?self:{},a={exports:{}};!function(t){var e=Object.prototype.hasOwnProperty,n=&quot;~&quot;;function r(){}function o(t,e,n){this.fn=t,this.context=e,this.once=n||!1}function i(t,e,r,i,a){if(&quot;function&quot;!=typeof r)throw TypeError(&quot;The listener must be a function&quot;);var s=new o(r,i||t,a),c=n?n+e:e;return t._events[c]?t._events[c].fn?t._events[c]=[t._events[c],s]:t._events[c].push(s):(t._events[c]=s,t._eventsCount++),t}function a(t,e){0==--t._eventsCount?t._events=new r:delete t._events[e]}function s(){this._events=new r,this._eventsCount=0}Object.create&amp;&amp;(r.prototype=Object.create(null),new r().__proto__||(n=!1)),s.prototype.eventNames=function(){var t,r,o=[];if(0===this._eventsCount)return o;for(r in t=this._events)e.call(t,r)&amp;&amp;o.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?o.concat(Object.getOwnPropertySymbols(t)):o},s.prototype.listeners=function(t){var e=n?n+t:t,r=this._events[e];if(!r)return[];if(r.fn)return[r.fn];for(var o=0,i=r.length,a=Array(i);o&lt;i;o++)a[o]=r[o].fn;return a},s.prototype.listenerCount=function(t){var e=n?n+t:t,r=this._events[e];return r?r.fn?1:r.length:0},s.prototype.emit=function(t,e,r,o,i,a){var s=n?n+t:t;if(!this._events[s])return!1;var c,u,f=this._events[s],h=arguments.length;if(f.fn){switch(f.once&amp;&amp;this.removeListener(t,f.fn,void 0,!0),h){case 1:return f.fn.call(f.context),!0;case 2:return f.fn.call(f.context,e),!0;case 3:return f.fn.call(f.context,e,r),!0;case 4:return f.fn.call(f.context,e,r,o),!0;case 5:return f.fn.call(f.context,e,r,o,i),!0;case 6:return f.fn.call(f.context,e,r,o,i,a),!0}for(u=1,c=Array(h-1);u&lt;h;u++)c[u-1]=arguments[u];f.fn.apply(f.context,c)}else{var l,p=f.length;for(u=0;u&lt;p;u++)switch(f[u].once&amp;&amp;this.removeListener(t,f[u].fn,void 0,!0),h){case 1:f[u].fn.call(f[u].context);break;case 2:f[u].fn.call(f[u].context,e);break;case 3:f[u].fn.call(f[u].context,e,r);break;case 4:f[u].fn.call(f[u].context,e,r,o);break;default:if(!c)for(l=1,c=Array(h-1);l&lt;h;l++)c[l-1]=arguments[l];f[u].fn.apply(f[u].context,c)}}return!0},s.prototype.on=function(t,e,n){return i(this,t,e,n,!1)},s.prototype.once=function(t,e,n){return i(this,t,e,n,!0)},s.prototype.removeListener=function(t,e,r,o){var i=n?n+t:t;if(!this._events[i])return this;if(!e)return a(this,i),this;var s=this._events[i];if(s.fn)s.fn!==e||o&amp;&amp;!s.once||r&amp;&amp;s.context!==r||a(this,i);else{for(var c=0,u=[],f=s.length;c&lt;f;c++)(s[c].fn!==e||o&amp;&amp;!s[c].once||r&amp;&amp;s[c].context!==r)&amp;&amp;u.push(s[c]);u.length?this._events[i]=1===u.length?u[0]:u:a(this,i)}return this},s.prototype.removeAllListeners=function(t){var e;return t?(e=n?n+t:t,this._events[e]&amp;&amp;a(this,e)):(this._events=new r,this._eventsCount=0),this},s.prototype.off=s.prototype.removeListener,s.prototype.addListener=s.prototype.on,s.prefixed=n,s.EventEmitter=s,t.exports=s}(a);var s=(b=a.exports)&amp;&amp;b.__esModule&amp;&amp;Object.prototype.hasOwnProperty.call(b,&quot;default&quot;)?b.default:b;function c(t){return(c=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}function u(t,e){return(u=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}var f={},h={},l=function(t){!function(t,e){if(&quot;function&quot;!=typeof e&amp;&amp;null!==e)throw TypeError(&quot;Super expression must either be null or a function&quot;);t.prototype=Object.create(e&amp;&amp;e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&amp;&amp;u(t,e)}(o,t);var e,n,r=(e=function(){if(&quot;undefined&quot;==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if(&quot;function&quot;==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(t){return!1}}(),function(){var t,n,r=c(o);if(e){var i=c(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return(t=n)&amp;&amp;(&quot;object&quot;==(t&amp;&amp;&quot;undefined&quot;!=typeof Symbol&amp;&amp;t.constructor===Symbol?&quot;symbol&quot;:typeof t)||&quot;function&quot;==typeof t)?t:function(t){if(void 0===t)throw ReferenceError(&quot;this hasn&#039;t been initialised - super() hasn&#039;t been called&quot;);return t}(this)});function o(t){!function(t,e){if(!(t instanceof e))throw TypeError(&quot;Cannot call a class as a function&quot;)}(this,o);var e=r.call(this);return f=t,h=t,e}return n=[{key:&quot;set&quot;,value:function(t,e){for(var n=this.get(t),r=t.split(&quot;.&quot;),o=f,i=0,a=r.length;i&lt;a;i++)void 0===o[r[i]]&amp;&amp;(o[r[i]]={}),i===a-1&amp;&amp;(o[r[i]]=e,this.emit(&quot;env:change[&quot;.concat(t,&quot;]&quot;),[n,e])),o=o[r[i]]}},{key:&quot;get&quot;,value:function(t){for(var e=t.split(&quot;.&quot;),n=f,r=0,o=e.length;r&lt;o;r++){if(void 0===n[e[r]])return n[e[r]];n=n[e[r]]}return n}},{key:&quot;getValue&quot;,value:function(){return Object.assign({},f)}},{key:&quot;getInitValue&quot;,value:function(){return Object.assign({},h)}}],function(t,e){for(var n=0;n&lt;e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,&quot;value&quot;in r&amp;&amp;(r.writable=!0),Object.defineProperty(t,r.key,r)}}(o.prototype,n),o}(s),p=null,d={getInstance:function(t){return p||(p=new l(t)),p}},v=&quot;https:\\/\\/fclick.baidu.com\\/w.gif&quot;,g=&quot;https:\\/\\/fclickv4.baidu.com\\/w.gif&quot;;function m(t){var e,n=d.getInstance().getValue();!t.searchId&amp;&amp;n&amp;&amp;n.searchid&amp;&amp;(t.searchId=n.searchid),(null==n?void 0:null===(e=n.flags)||void 0===e?void 0:e.expFlagFixAsynSlideLog)||&quot;ecom_wise_listen_n&quot;!==t.tag||!n||(!t.asp_time&amp;&amp;n.aspTime&amp;&amp;(t.asp_time=n.aspTime),!t.query&amp;&amp;n.queryWordEnc&amp;&amp;(t.query=n.queryWordEnc),t.queryUtf8||!n.query||(t.queryUtf8=n.query));var r=[];for(var o in t)t.hasOwnProperty(o)&amp;&amp;r.push(encodeURIComponent(o)+&quot;=&quot;+encodeURIComponent(t[o]));return r.join(&quot;&amp;&quot;)}function y(t){var n=arguments.length&gt;1&amp;&amp;void 0!==arguments[1]&amp;&amp;arguments[1],r=d.getInstance().getValue();if(r&amp;&amp;r.flags&amp;&amp;r.flags.changeFclickToBeacon){!function(t){var n,r=arguments.length&gt;1&amp;&amp;void 0!==arguments[1]&amp;&amp;arguments[1],o=new Date().getTime();t&amp;&amp;(t.rand=o+Math.random()),function(t){var e=!1;try{t&amp;&amp;navigator.sendBeacon&amp;&amp;(e=navigator.sendBeacon(t))}catch(t){}return e}(n=[r?g:v,m(t)].join(&quot;?&quot;))||e(n)}(t,n);return}e([n?g:v,m(t)].join(&quot;?&quot;))}var b,w,_=function(t){this.env=t||{}};_.prototype={report:function(t){y(this.extend(this.env,{tag:&quot;ps-js-error&quot;,datetime:new Date().getTime(),message:t.message,stack:t.stack}))},support:function(t,e){if(&quot;function&quot;==typeof t){e=t;try{e()}catch(t){this.report(t)}}else{var n=t[e];t[e]=function(){for(var e=arguments.length,r=Array(e),o=0;o&lt;e;o++)r[o]=arguments[o];try{n.apply(t,r)}catch(t){this.report(t)}}}},extend:function(){for(var t={},e=0,n=arguments.length;e&lt;n;e++)if(&quot;[object Object]&quot;===Object.prototype.toString.call(arguments[e]))for(var r in arguments[e])t[r]=arguments[e][r];return t}};var I,E={getInstance:function(t){return w||(w=new _(t)),w}},O=function(){var t,e,n,r=0,o=0,i=0,a=0,s=0,c=0,u=0,f=0,h=\\/link\\\\?url\\\\=([^\\\\&amp;]+)\\/,l=\\/\\\\?url\\\\=([^\\\\.]+)\\\\.\\/,p=&quot;data-cklink&quot;,d=\\/[?&amp;]tn=([^&amp;]*)\\/;function v(t){if(!t)return!1;var e=h.exec(t)||l.exec(t);return!!e&amp;&amp;(h.exec(t)?e[1].length&lt;20?e[1]:e[1].substr(0,20):e[1])}function g(n){var a,s,h,l,d,g=(l=f.href,d=f.getAttribute(p),v(l)||v(d));!1!==g&amp;&amp;(a=&quot;&amp;ck=&quot;+[function(t,e){for(var n=0,r=0;r&lt;i*e%99+9;r++)n+=t.charCodeAt(u*r%t.length);return n}(g,n),i,u,Math.round(r),Math.round(o),Math.round(t),Math.round(e),c].join(&quot;.&quot;),s=f.href,h=f.getAttribute(p),s&amp;&amp;v(s)&amp;&amp;(f.href=y(s,a)+m(s)),h&amp;&amp;v(h)&amp;&amp;f.setAttribute(p,y(h,a)+m(h)))}function m(t){var e=&quot;&quot;;if(-1===t.indexOf(&quot;&amp;shh=&quot;)&amp;&amp;-1===t.indexOf(&quot;?shh=&quot;)&amp;&amp;(e=&quot;&amp;shh=&quot;+location.hostname),-1===t.indexOf(&quot;&amp;sht=&quot;)&amp;&amp;-1===t.indexOf(&quot;?sht=&quot;)){var n=location.href.match(d);n&amp;&amp;(e+=&quot;&amp;sht=&quot;+n[1])}return e}function y(t,e){return v(t)&amp;&amp;(-1===t.indexOf(&quot;&amp;ck=&quot;)?t+=e:t=t.replace(\\/&amp;ck=[\\\\d.]*\\/,e)),t}function b(n,h,l){void 0===n.length&amp;&amp;(n=[n]);for(var d=n.length,b=0,w=[function(n){!function(n,s){for(f=(n=n||window.event).target||n.srcElement;f&amp;&amp;&quot;A&quot;!==f.tagName;)f=f.parentNode;i++,void 0===t&amp;&amp;(t=n.clientX),void 0===e&amp;&amp;(e=n.clientY),r=0,o=0,u=0,c=0,a=new Date().getTime(),g(s)}(n,h)},function(t){!function(t,e){for(f=(t=t||window.event).target||t.srcElement;f&amp;&amp;&quot;A&quot;!==f.tagName;)f=f.parentNode;s=new Date().getTime(),u=9999,r=t.clientX,o=t.clientY,c=0===a?0:s-a,g(e)}(t,h)},function(t){u=new Date().getTime()-s,g(h)}];b&lt;d;b++)l||function(t){var e=t.href;if(v(e)){var n=&quot;&amp;ck=&quot;+[0,i,u,Math.round(r),Math.round(o),0,0,c].join(&quot;.&quot;),a=t.getAttribute(p);e&amp;&amp;(t.href=y(e,n)+m(e)),a&amp;&amp;t.setAttribute(p,y(a,n)+m(a))}}(n[b]),function(t,e,n){for(var r,o,i=e.length,a=0;a&lt;i;a++)r=e[a],o=n[a],window.attachEvent?t.attachEvent(&quot;on&quot;+r,o):t.addEventListener(r,o,!1)}(n[b],[&quot;mouseover&quot;,&quot;mousedown&quot;,&quot;mouseup&quot;],w)}return{getInstance:function(t){return n||(n={addAdsCk:b}),n}}},A={init:function(t,e,n){var r=O().getInstance(t);I=r;for(var o=document.querySelectorAll(t),i=0;i&lt;o.length;i++){var a=o[i],s=a.getAttribute(&quot;data-ecimtimesign&quot;)||a.getAttribute(&quot;data-pz-sign&quot;)||e,c=a.getElementsByTagName(&quot;A&quot;);r.addAdsCk(c,s,n)}return r},getInstance:function(){return I}};function R(t,e){return null!=e&amp;&amp;&quot;undefined&quot;!=typeof Symbol&amp;&amp;e[Symbol.hasInstance]?!!e[Symbol.hasInstance](t):t instanceof e}function S(t){for(var e=t.target||t.srcElement;e&amp;&amp;&quot;A&quot;!==e.tagName;)e=e.parentNode;var n=e.href;if(x(n)){var r,o=new URLSearchParams(n).get(&quot;ck&quot;);o&amp;&amp;k(e,[0,&quot;00000000&quot;===(r=o.split(&quot;.&quot;)).join(&quot;&quot;)?1:&quot;0&quot;===r[2]&amp;&amp;&quot;0&quot;===r[3]&amp;&amp;&quot;0&quot;===r[4]&amp;&amp;&quot;0&quot;===r[7]?2:3,0,0])}}function x(t){return&quot;string&quot;==typeof t&amp;&amp;-1!==t.indexOf(&quot;baidu.php&quot;)}function T(t,e){var n=window.navigator.mimeTypes;for(var r in n)if(n[r][t]===e)return!0;return!1}function k(t,e){var n=t.href;if(x(n)){var r=new URLSearchParams(n),o=r.get(&quot;us&quot;),i=[];if(o){var a=&quot;newvui&quot;===o?[]:o.split(&quot;.&quot;);i=e.map(function(t,n){return e[n]?e[n]:a[n]||0})}else i=e.map(function(t){return t||0});r.set(&quot;us&quot;,i.join(&quot;.&quot;)),t.href=decodeURIComponent(r.toString())}}function M(t,e){var n=!0,r=!1,o=void 0;try{for(var i,a=t[Symbol.iterator]();!(n=(i=a.next()).done);n=!0){var s=i.value;&quot;attributes&quot;===s.type&amp;&amp;&quot;se_prerender_url&quot;===s.attributeName&amp;&amp;&quot;complete&quot;===s.target.getAttribute(&quot;se_prerender_url&quot;)&amp;&amp;(k(s.target,[0,0,0,1]),y({tag:&quot;ecom_msa_tmp_4&quot;,action:&quot;prerender&quot;,href:s.target.getAttribute(&quot;href&quot;)}))}}catch(t){r=!0,o=t}finally{try{n||null==a.return||a.return()}finally{if(r)throw o}}}!function(t){var e,n,r=function(){try{if(t.URLSearchParams&amp;&amp;&quot;bar&quot;===new t.URLSearchParams(&quot;foo=bar&quot;).get(&quot;foo&quot;))return t.URLSearchParams}catch(t){}return null}(),o=r&amp;&amp;&quot;a=1&quot;===new r({a:1}).toString(),i=r&amp;&amp;&quot;+&quot;===new r(&quot;s=%2B&quot;).get(&quot;s&quot;),a=&quot;__URLSearchParams__&quot;,s=!r||((e=new r).append(&quot;s&quot;,&quot; &amp;&quot;),&quot;s=+%26&quot;===e.toString()),c=h.prototype,u=!!(t.Symbol&amp;&amp;t.Symbol.iterator);if(!r||!o||!i||!s){c.append=function(t,e){g(this[a],t,e)},c.delete=function(t){delete this[a][t]},c.get=function(t){var e=this[a];return this.has(t)?e[t][0]:null},c.getAll=function(t){var e=this[a];return this.has(t)?e[t].slice(0):[]},c.has=function(t){return y(this[a],t)},c.set=function(t,e){this[a][t]=[&quot;&quot;+e]},c.toString=function(){var t,e,n,r,o=this[a],i=[];for(e in o)for(t=0,n=l(e),r=o[e];t&lt;r.length;t++)i.push(n+&quot;=&quot;+l(r[t]));return i.join(&quot;&amp;&quot;)},i&amp;&amp;r&amp;&amp;!o&amp;&amp;t.Proxy?(n=new Proxy(r,{construct:function(t,e){return new t(new h(e[0]).toString())}})).toString=Function.prototype.toString.bind(h):n=h,Object.defineProperty(t,&quot;URLSearchParams&quot;,{value:n});var f=t.URLSearchParams.prototype;f.polyfill=!0,f.forEach=f.forEach||function(t,e){var n=v(this.toString());Object.getOwnPropertyNames(n).forEach(function(r){n[r].forEach(function(n){t.call(e,n,r,this)},this)},this)},f.sort=f.sort||function(){var t,e,n,r=v(this.toString()),o=[];for(t in r)o.push(t);for(o.sort(),e=0;e&lt;o.length;e++)this.delete(o[e]);for(e=0;e&lt;o.length;e++){var i=o[e],a=r[i];for(n=0;n&lt;a.length;n++)this.append(i,a[n])}},f.keys=f.keys||function(){var t=[];return this.forEach(function(e,n){t.push(n)}),d(t)},f.values=f.values||function(){var t=[];return this.forEach(function(e){t.push(e)}),d(t)},f.entries=f.entries||function(){var t=[];return this.forEach(function(e,n){t.push([n,e])}),d(t)},u&amp;&amp;(f[t.Symbol.iterator]=f[t.Symbol.iterator]||f.entries)}function h(t){(R(t=t||&quot;&quot;,URLSearchParams)||R(t,h))&amp;&amp;(t=t.toString()),this[a]=v(t)}function l(t){var e={&quot;!&quot;:&quot;%21&quot;,&quot;&#039;&quot;:&quot;%27&quot;,&quot;(&quot;:&quot;%28&quot;,&quot;)&quot;:&quot;%29&quot;,&quot;~&quot;:&quot;%7E&quot;,&quot;%20&quot;:&quot;+&quot;,&quot;%00&quot;:&quot;\\\\x00&quot;};return encodeURIComponent(t).replace(\\/[!&#039;\\\\(\\\\)~]|%20|%00\\/g,function(t){return e[t]})}function p(t){return t.replace(\\/[ +]\\/g,&quot;%20&quot;).replace(\\/(%[a-f0-9]{2})+\\/ig,function(t){return decodeURIComponent(t)})}function d(e){var n={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return u&amp;&amp;(n[t.Symbol.iterator]=function(){return n}),n}function v(t){var e={};if(&quot;object&quot;==typeof t){if(m(t))for(var n=0;n&lt;t.length;n++){var r=t[n];if(m(r)&amp;&amp;2===r.length)g(e,r[0],r[1]);else throw TypeError(&quot;Failed to construct &#039;URLSearchParams&#039;: Sequence initializer must only contain pair elements&quot;)}else for(var o in t)t.hasOwnProperty(o)&amp;&amp;g(e,o,t[o])}else{0===t.indexOf(&quot;?&quot;)&amp;&amp;(t=t.slice(1));for(var i=t.split(&quot;&amp;&quot;),a=0;a&lt;i.length;a++){var s=i[a],c=s.indexOf(&quot;=&quot;);-1&lt;c?g(e,p(s.slice(0,c)),p(s.slice(c+1))):s&amp;&amp;g(e,p(s),&quot;&quot;)}}return e}function g(t,e,n){var r=&quot;string&quot;==typeof n?n:null!=n&amp;&amp;&quot;function&quot;==typeof n.toString?n.toString():JSON.stringify(n);y(t,e)?t[e].push(r):t[e]=[r]}function m(t){return!!t&amp;&amp;&quot;[object Array]&quot;===Object.prototype.toString.call(t)}function y(t,e){return Object.prototype.hasOwnProperty.call(t,e)}}(void 0!==i?i:&quot;undefined&quot;!=typeof window?window:i);var P={attributes:!0,childList:!1,subtree:!1},j={init:function(t,e){var n=&quot;&quot;;MutationObserver&amp;&amp;(n=new MutationObserver(M));for(var r=document.querySelectorAll(t),o=0;o&lt;r.length;o++)for(var i,a,s=r[o].getElementsByTagName(&quot;A&quot;),c=0;c&lt;s.length;c++)n&amp;&amp;n.observe(s[c],P),i=s[c],a=&quot;click&quot;,window.attachEvent?i.attachEvent(&quot;on&quot;+a,S):i.addEventListener(a,S,!1),k(s[c],[function(){var t=!1,e=window.navigator,n=e.userAgent;if(window.chrome){var r=n.replace(\\/^.*Chrome\\\\\\/([\\\\d]+).*$\\/,&quot;$1&quot;);window.chrome.adblock2345||window.chrome.common2345||(T(&quot;type&quot;,&quot;application\\/360softmgrplugin&quot;)||T(&quot;type&quot;,&quot;application\\/mozilla-npqihooquicklogin&quot;)?t=!0:r&gt;36&amp;&amp;window.showModalDialog?t=!0:!(r&gt;45)||(t=T(&quot;type&quot;,&quot;application\\/vnd.chromium.remoting-viewer&quot;))||!(r&gt;=69)||(t=T(&quot;type&quot;,&quot;application\\/hwepass2001.installepass2001&quot;)||T(&quot;type&quot;,&quot;application\\/asx&quot;)))}return t?T(&quot;type&quot;,&quot;application\\/gameplugin&quot;)?2:e&amp;&amp;void 0!==e.connection&amp;&amp;void 0===e.connection.saveData?2:1:0}(),0,0,0])}};!function(){if(&quot;object&quot;==typeof window){if(&quot;IntersectionObserver&quot;in window&amp;&amp;&quot;IntersectionObserverEntry&quot;in window&amp;&amp;&quot;intersectionRatio&quot;in window.IntersectionObserverEntry.prototype){&quot;isIntersecting&quot;in window.IntersectionObserverEntry.prototype||Object.defineProperty(window.IntersectionObserverEntry.prototype,&quot;isIntersecting&quot;,{get:function(){return this.intersectionRatio&gt;0}});return}var t=window.document,e=[];r.prototype.THROTTLE_TIMEOUT=100,r.prototype.POLL_INTERVAL=null,r.prototype.USE_MUTATION_OBSERVER=!0,r.prototype.observe=function(t){if(!this._observationTargets.some(function(e){return e.element==t})){if(!(t&amp;&amp;1==t.nodeType))throw Error(&quot;target must be an Element&quot;);this._registerInstance(),this._observationTargets.push({element:t,entry:null}),this._monitorIntersections(),this._checkForIntersections()}},r.prototype.unobserve=function(t){this._observationTargets=this._observationTargets.filter(function(e){return e.element!=t}),this._observationTargets.length||(this._unmonitorIntersections(),this._unregisterInstance())},r.prototype.disconnect=function(){this._observationTargets=[],this._unmonitorIntersections(),this._unregisterInstance()},r.prototype.takeRecords=function(){var t=this._queuedEntries.slice();return this._queuedEntries=[],t},r.prototype._initThresholds=function(t){var e=t||[0];return Array.isArray(e)||(e=[e]),e.sort().filter(function(t,e,n){if(&quot;number&quot;!=typeof t||isNaN(t)||t&lt;0||t&gt;1)throw Error(&quot;threshold must be a number between 0 and 1 inclusively&quot;);return t!==n[e-1]})},r.prototype._parseRootMargin=function(t){var e=(t||&quot;0px&quot;).split(\\/\\\\s+\\/).map(function(t){var e=\\/^(-?\\\\d*\\\\.?\\\\d+)(px|%)$\\/.exec(t);if(!e)throw Error(&quot;rootMargin must be specified in pixels or percent&quot;);return{value:parseFloat(e[1]),unit:e[2]}});return e[1]=e[1]||e[0],e[2]=e[2]||e[0],e[3]=e[3]||e[1],e},r.prototype._monitorIntersections=function(){!this._monitoringIntersections&amp;&amp;(this._monitoringIntersections=!0,this.POLL_INTERVAL?this._monitoringInterval=setInterval(this._checkForIntersections,this.POLL_INTERVAL):(o(window,&quot;resize&quot;,this._checkForIntersections,!0),o(t,&quot;scroll&quot;,this._checkForIntersections,!0),this.USE_MUTATION_OBSERVER&amp;&amp;&quot;MutationObserver&quot;in window&amp;&amp;(this._domObserver=new MutationObserver(this._checkForIntersections),this._domObserver.observe(t,{attributes:!0,childList:!0,characterData:!0,subtree:!0}))))},r.prototype._unmonitorIntersections=function(){this._monitoringIntersections&amp;&amp;(this._monitoringIntersections=!1,clearInterval(this._monitoringInterval),this._monitoringInterval=null,i(window,&quot;resize&quot;,this._checkForIntersections,!0),i(t,&quot;scroll&quot;,this._checkForIntersections,!0),this._domObserver&amp;&amp;(this._domObserver.disconnect(),this._domObserver=null))},r.prototype._checkForIntersections=function(){var t=this._rootIsInDom(),e=t?this._getRootRect():s();this._observationTargets.forEach(function(r){var o=r.element,i=a(o),s=this._rootContainsTarget(o),c=r.entry,u=t&amp;&amp;s&amp;&amp;this._computeTargetAndRootIntersection(o,e),f=r.entry=new n({time:window.performance&amp;&amp;performance.now&amp;&amp;performance.now(),target:o,boundingClientRect:i,rootBounds:e,intersectionRect:u});c?t&amp;&amp;s?this._hasCrossedThreshold(c,f)&amp;&amp;this._queuedEntries.push(f):c&amp;&amp;c.isIntersecting&amp;&amp;this._queuedEntries.push(f):this._queuedEntries.push(f)},this),this._queuedEntries.length&amp;&amp;this._callback(this.takeRecords(),this)},r.prototype._computeTargetAndRootIntersection=function(e,n){if(&quot;none&quot;!=window.getComputedStyle(e).display){for(var r=a(e),o=u(e),i=!1;!i;){var s=null,c=1==o.nodeType?window.getComputedStyle(o):{};if(&quot;none&quot;==c.display)return;if(o==this.root||o==t?(i=!0,s=n):o!=t.body&amp;&amp;o!=t.documentElement&amp;&amp;&quot;visible&quot;!=c.overflow&amp;&amp;(s=a(o)),s&amp;&amp;!(r=function(t,e){var n=Math.max(t.top,e.top),r=Math.min(t.bottom,e.bottom),o=Math.max(t.left,e.left),i=Math.min(t.right,e.right),a=i-o,s=r-n;return a&gt;=0&amp;&amp;s&gt;=0&amp;&amp;{top:n,bottom:r,left:o,right:i,width:a,height:s}}(s,r)))break;o=u(o)}return r}},r.prototype._getRootRect=function(){var e;if(this.root)e=a(this.root);else{var n=t.documentElement,r=t.body;e={top:0,left:0,right:n.clientWidth||r.clientWidth,width:n.clientWidth||r.clientWidth,bottom:n.clientHeight||r.clientHeight,height:n.clientHeight||r.clientHeight}}return this._expandRectByRootMargin(e)},r.prototype._expandRectByRootMargin=function(t){var e=this._rootMarginValues.map(function(e,n){return&quot;px&quot;==e.unit?e.value:e.value*(n%2?t.width:t.height)\\/100}),n={top:t.top-e[0],right:t.right+e[1],bottom:t.bottom+e[2],left:t.left-e[3]};return n.width=n.right-n.left,n.height=n.bottom-n.top,n},r.prototype._hasCrossedThreshold=function(t,e){var n=t&amp;&amp;t.isIntersecting?t.intersectionRatio||0:-1,r=e.isIntersecting?e.intersectionRatio||0:-1;if(n!==r)for(var o=0;o&lt;this.thresholds.length;o++){var i=this.thresholds[o];if(i==n||i==r||i&lt;n!=i&lt;r)return!0}},r.prototype._rootIsInDom=function(){return!this.root||c(t,this.root)},r.prototype._rootContainsTarget=function(e){return c(this.root||t,e)},r.prototype._registerInstance=function(){0&gt;e.indexOf(this)&amp;&amp;e.push(this)},r.prototype._unregisterInstance=function(){var t=e.indexOf(this);-1!=t&amp;&amp;e.splice(t,1)},window.IntersectionObserver=r,window.IntersectionObserverEntry=n}function n(t){this.time=t.time,this.target=t.target,this.rootBounds=t.rootBounds,this.boundingClientRect=t.boundingClientRect,this.intersectionRect=t.intersectionRect||s(),this.isIntersecting=!!t.intersectionRect;var e=this.boundingClientRect,n=e.width*e.height,r=this.intersectionRect,o=r.width*r.height;n?this.intersectionRatio=Number((o\\/n).toFixed(4)):this.intersectionRatio=this.isIntersecting?1:0}function r(t,e){var n,r,o,i=e||{};if(&quot;function&quot;!=typeof t)throw Error(&quot;callback must be a function&quot;);if(i.root&amp;&amp;1!=i.root.nodeType)throw Error(&quot;root must be an Element&quot;);this._checkForIntersections=(n=this._checkForIntersections.bind(this),r=this.THROTTLE_TIMEOUT,o=null,function(){o||(o=setTimeout(function(){n(),o=null},r))}),this._callback=t,this._observationTargets=[],this._queuedEntries=[],this._rootMarginValues=this._parseRootMargin(i.rootMargin),this.thresholds=this._initThresholds(i.threshold),this.root=i.root||null,this.rootMargin=this._rootMarginValues.map(function(t){return t.value+t.unit}).join(&quot; &quot;)}function o(t,e,n,r){&quot;function&quot;==typeof t.addEventListener?t.addEventListener(e,n,r||!1):&quot;function&quot;==typeof t.attachEvent&amp;&amp;t.attachEvent(&quot;on&quot;+e,n)}function i(t,e,n,r){&quot;function&quot;==typeof t.removeEventListener?t.removeEventListener(e,n,r||!1):&quot;function&quot;==typeof t.detatchEvent&amp;&amp;t.detatchEvent(&quot;on&quot;+e,n)}function a(t){var e;try{e=t.getBoundingClientRect()}catch(t){}return e?(e.width&amp;&amp;e.height||(e={top:e.top,right:e.right,bottom:e.bottom,left:e.left,width:e.right-e.left,height:e.bottom-e.top}),e):s()}function s(){return{top:0,bottom:0,left:0,right:0,width:0,height:0}}function c(t,e){for(var n=e;n;){if(n==t)return!0;n=u(n)}return!1}function u(t){var e=t.parentNode;return e&amp;&amp;11==e.nodeType&amp;&amp;e.host?e.host:e&amp;&amp;e.assignedSlot?e.assignedSlot.parentNode:e}}();var L=&quot;observer&quot;;function C(){}function N(t){var e=t.container,n=t.url,r=t.params;this.opts={container:e,url:n,params:void 0===r?{}:r},this.init()}N.prototype={constructor:N,init:function(){var t=this,e=t.opts.container;t.observer=new IntersectionObserver(t.observeCB.bind(t)),e&amp;&amp;Array.prototype.slice.call(document.querySelectorAll(e)).forEach(function(e){t.observer.observe(e)})},observe:function(t){this.observer.observe(t)},observeCB:function(t){var e=this;t.forEach(function(t){if(t.isIntersecting){var n=t.target;if(!n.getAttribute(L)){var r=e.combineData(n);e.log(r),e.observer.unobserve(n),n.setAttribute(L,1)}}})},combineData:function(t){var e=this.opts.params,n={data:{}};for(var r in e)if(e.hasOwnProperty(r)){var o=t.getAttribute(e[r]);&quot;&quot;!==o&amp;&amp;(n.data[r]=o)}return n},log:function(t){this.nclick(t)},nclick:function(t){var e=this.opts.url;t.rand=this.addRand();var n=&quot;&quot;.concat(e,&quot;?&quot;).concat(this.encodeSearchParams(t));this.imgRequest(n,t)},imgRequest:function(t,e){try{var n=e.rand,r=new Image;window[&quot;--IMAGE&quot;+n]=r,r.onload=r.onerror=r.onabort=function(){r.onload=r.onerror=r.onabort=null,r=null,window[&quot;--IMAGE&quot;+n]=C},r.src=t}catch(t){}},addRand:function(){return Math.random().toString(16).slice(2,8)+Math.random()},encodeSearchParams:function(t){var e=[];for(var n in t)if(t.hasOwnProperty(n)){var r=t[n];&quot;object&quot;==typeof r&amp;&amp;(r=JSON.stringify(r)),e.push([n,encodeURIComponent(r)].join(&quot;=&quot;))}return e.join(&quot;&amp;&quot;)}};var q={init:function(){new N({container:&quot;[data-nvk]&quot;,url:&quot;https:\\/\\/ada.baidu.com\\/udpl\\/exp&quot;,params:{exp:&quot;data-nvk&quot;}})}};t.PARAMS={},t.init=function(e){t.PARAMS=e;var n=&quot;.&quot;+t.PARAMS.resultClass;E.getInstance({}).support(function(){t.PARAMS.flags.tiebaCkFix&amp;&amp;-1!==[&quot;pc_tieba_list&quot;,&quot;pc_tieba_detail&quot;].indexOf(t.PARAMS.pageid)?A.init(n,t.PARAMS.imTimeSign):o.init(n,t.PARAMS.imTimeSign),q.init(),t.PARAMS.flags.tiebaCkFix&amp;&amp;-1!==[&quot;pc_tieba_list&quot;,&quot;pc_tieba_detail&quot;].indexOf(t.PARAMS.pageid)&amp;&amp;j.init(n,t.PARAMS)})},t.request=e}(this.ecomNsPcGlobal=this.ecomNsPcGlobal||{});\\n\\n            (function (variable) {\\n                window.ecomNsPcGlobal.init(variable);\\n            })({&quot;searchid&quot;:&quot;000000006ff4131f&quot;,&quot;eid&quot;:&quot;120201_120702_7869012_300003&quot;,&quot;bwsid&quot;:0,&quot;osid&quot;:0,&quot;pageid&quot;:&quot;pc_tieba_detail&quot;,&quot;baiduid&quot;:&quot;00E51832EC6DAA0D10E1C0699C5E6670&quot;,&quot;ovlid&quot;:&quot;129424-dz#129771-dz#127633-9#119767-dz#125784-6#119725-17#124778-17#167nj-0&quot;,&quot;wpt&quot;:0,&quot;netType&quot;:0,&quot;cuid&quot;:&quot;&quot;,&quot;feedCuid&quot;:&quot;&quot;,&quot;query&quot;:&quot;%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&quot;,&quot;imTimeSign&quot;:108,&quot;asynMode&quot;:0,&quot;asynUrl&quot;:&quot;&quot;,&quot;isWiseDropDown&quot;:false,&quot;asynsid&quot;:&quot;&quot;,&quot;aspTime&quot;:1722965478873,&quot;sourceAdNum&quot;:{&quot;ads_2327&quot;:1},&quot;asynQuery&quot;:&quot;&quot;,&quot;jFieldLinkMap&quot;:{&quot;7R_NR2Ar5Od66EzgSNerQ0BK-qjgKZLqWAZ1vmIMo9vxgj4e_5o33IOM9tSMjld3xg4mx5u9qx-9qEH9tOZjexZjES8Z1vmxgI9vNqIT1VQDpyuCp88EDkYvIMWgvX5WElkYP77BOoZBmoLNvNtTMNM-eRlrKYdvFWG_LU81k_tIhOubl_t8aFqjDk_3tILZkzXPMZJ1z3lQnyFWWuE_ooLeVOySe-SWDk7SOYOohzsOwSUqEHISUtVjVOPSLjqAJEklcELecqNxKYxhoOdkOhzqPL4EvqxuPSOOolltHDgeOHS8UQjqZ4EvqPL4EzYrLtLeT5YpJO-d9JmerVqLQxYwYA5Pe5O6ObI8eO_xenI---MO6kOSjGSgz_9BOBRU57-OHk_______OxdTgHgyyyyyyyyyyyyf4UcSjqOOgv1um8Z6OdkxwsxQkOtDgzdq_gzOdq8881lFELtSgtLSEOgqZ4EvOYcOusO-ItEd5kexSkOw_Ot7-----IO3Otj6SN--MO6qEdYXx_OU_____dvpVIbgjePyWqxlZSzM-HJdTXgSwOs51OxveqMSzevOBhpletx1OSjqXxSW3OBeO6XEU4e2OSQeqZoZqS1C3mElrWqiQOuoOejEzqZQSpolrZter1-4p81uYvyyX5qA1lry6GyAp7WW_3e826&quot;:&quot;https:\\/\\/b2b.baidu.com\\/aitf\\/s?q=%E8%8B%8F%E5%B7%9E%E6%B1%BD%E8%BD%A6%E7%A7%9F%E8%B5%81&amp;from=search&amp;fid=604714779&amp;styl=b&amp;sid=1510132&amp;a_keywordid={keywordid}&amp;a_unitid={unitid}&amp;a_planid={planid}&quot;},&quot;upAdNum&quot;:0,&quot;middleAdNum&quot;:0,&quot;downAdNum&quot;:0,&quot;flags&quot;:{&quot;fixPlusSign&quot;:true},&quot;variable&quot;:{},&quot;rsContent&quot;:[],&quot;ecomData204&quot;:&quot;&quot;,&quot;ecomData213&quot;:&quot;&quot;,&quot;ecomData217&quot;:&quot;&quot;,&quot;ad204Num&quot;:0,&quot;ad213Num&quot;:0,&quot;ad217Num&quot;:0,&quot;isHasImlp&quot;:false,&quot;adsInfo&quot;:{&quot;000000006ff4131f_1626_0&quot;:{&quot;ideaId&quot;:75048564995,&quot;docId&quot;:&quot;0&quot;,&quot;mts&quot;:[2410,2051]}},&quot;bdCid&quot;:93,&quot;bdPid&quot;:4,&quot;queryWordEnc&quot;:&quot;%CD%F8%C7%F2%B7%E7%D4%C6&quot;,&quot;wiseSt&quot;:&quot;&quot;,&quot;requestIpV4&quot;:3604745399,&quot;fnizebrab&quot;:&quot;&quot;,&quot;nsVerticalKdomainList&quot;:[],&quot;wiseExposureAds&quot;:[],&quot;is_rm_asyn&quot;:true,&quot;mod&quot;:&quot;&quot;,&quot;app_verison&quot;:&quot;&quot;,&quot;os_version&quot;:&quot;&quot;,&quot;bd_version&quot;:&quot;&quot;,&quot;ios_version&quot;:0,&quot;passportId&quot;:0,&quot;hasYunyingCard&quot;:false,&quot;wiseFrom&quot;:&quot;&quot;,&quot;resultClass&quot;:&quot;fc-000000006ff4131f-2327&quot;});\\n        \",    }]);</script><script>    _.Module.use('adsense/widget/fengchaoPbFeed', [{        'adIndex': 3,        'flowType': \"normal\"}]);</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 2;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 3;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 4;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 5;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 6;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 7;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 8;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 9;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 10;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 11;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 12;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 13;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 14;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 15;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 16;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 17;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 18;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 19;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 20;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 21;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 22;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 23;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 24;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 25;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 26;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 27;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 28;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 29;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9119688421?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('adsense/widget/tpl_ext', [{        'type': 'POST',        'adDataList': {\"PC_PB_LEFT\":[{\"id\":\"37477\",\"name\":\"\\u6e38\\u620f\\u5408\\u4f5c-\\u5dc5\\u5cf0\\u51a0\\u519b\\u8db3\\u7403-\\u65b01-\\u7c7b\\u76ee\",\"adv_type\":\"0\",\"typeid\":\"0200\",\"pos_name\":\"LEFT\",\"loc_code\":\"p0015\",\"client_type\":\"PC\",\"page_name\":\"PB\",\"app_type\":\"13\",\"tpl_name\":\"9\",\"locator\":\"-\",\"load_type\":\"append\",\"first_screen\":\"0\",\"url_type\":1,\"throw_type\":\"0\",\"url\":\"http:\\/\\/tieba.baidu.com\\/link?tbjump=lid%3D1878266655_37477_13_4513750_9119688421_0%26url%3D2b2ekZ10nJMbDL8YzBmjDm5DM5hLQq28ld1oEfYY4BM9GebyFHT-NjuEr4NBh0vmHeoegQjnzDry7YMmIuwpWK72Mj4_e-ZgEhG8mqqpL8oYMn4tGbnkFjBtYLPzMTcY4DvPJOR-v5MktsSmREWy_4MQaPzZAjNcr4mOmnjxFkwFB1027Y-4JcA7y-q6Ggxm0bqGDUGJ6H9iFQFliJ1B-4wl3ZihvgjcIkqxK_ggwiOenlN8-RUOENVeZIUngbzbxzTxBYzZBDaYCN55MdOudE8Xoo2NxBfB8xswbuW8a0j18tCr57t-rezQV-KSdTTYIm61DMKmlRXVqrCh2fcYRTvJHQnATAPfebjbzOVBLWt0PD7KgrU74B8Jx-yP95IlJKmncQ54MP84iyjAPmhNrq2o1aGuk31o7hLteGsQFf-exDKenejY2vJgYLM4E-WZqROcj42zMjHOOfr9OY8lCJzy4CXumklmXYoNON9m90_QaDYjKSPinuyi6mparwVZWBH_nYTdfy06UGZn9fwJyIXBH5a8oLkXleMIinOQZbV86YznQ3JqkKc19CqoUS7iqS9DvQHql2z4cdSztGiThoKxzp4ZR81MiR06YLgjfxLnkX0CaNXjrhMY_9Llg178lP3ItSQZBjpgzC_a1dwyYXgSDXsyGjwGcdP6xfS2kAWX864e0MhlfSg07Z4GRjwNlGC0EjX7cxO_c27yHQVoYGPUsC5NB0dmDlgGsTZ2i3tv_f75dXA1v1PQym5kjx8lOyLk-5zzYa4ILGssBg_5AkdrkWb3AZ9gVzQkYUoAT_m1pgN9V7vL-3JLs8_w5yZj-IlWQhsYYoO_-oF4LymhxK4m4owdJ_jx6ZhvJ8keZqXcV6EwFdyMsGBqHblEOP7qschHBtbrBNSF0pTL4NyBXxhn9zoJuVXthsmoupxa-pxXgsyswv3bOEHjLAWHI8OupLsrv-k60ce9gbP6NHOWsehAtariAUw2BkseQrzFLEEWOGa2vhQj-_yIoKbX9by6NBZ1bx4lbCCr3j3lH3Z67LZIAIh1IThP5UmYlNIJK3XUMjZjC93wqXy-1tMH3Nk9xInzsVXjhIxgcBbPbdmmambD4_Pic5zql2QyD_9SnMT-c7KMhOnYXZKwnWN0We4ZoGPY4ss6_zVDsefkhplK3M2CiPGubwgK0UJKFgUKNmosyEi2RYW50wd4prOc8d1_NWderEzCACYlewlM0KQAukF6YqjrBDjBER2ApcYFszK4oZJiizKq7bqwTCK8mupD2YBj8BXtbDOM59nmIo7I39O7CmvRYZGkbFmCbHBV82_GhtOoz_ERVvQr9KGHLZx4gWKBkzf9jGb5MMMWL_q86tR-nmx4qpMx_W04xSwagjh5rHef3R70m2NZ9UuXix46tVKNur9K9CJgNJHg8-LowkjlQVzjeUodSxXcb_qlfq6u60fmsdNl1pTPU1OMGSy1SM0nyA-Yl-dsubdNxxUBKEtJxlGPfpunk-nt5YbDbQegm7CfEhDoFw2mhTlhHgctM1_iDfnN1AeZGd4a6t1Vs31c91MYJrK4Yo15r4Zs9BZO6sOaMwRibHWz8nw18UNPQQofbgGW7PLx5JR3jO8ASdSehxV_bwmLNaEK03ijxA\",\"ios_url\":\"\",\"apk_url\":\"\",\"apk_name\":\"\",\"first_name\":\"\\u5185\\u5bb9\",\"second_name\":\"\\u5185\\u5bb9\",\"goods_info\":[{\"close_pic\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/ngmis\\/adsense\\/file_1420437480279.jpg\",\"content_pic\":\"https:\\/\\/tieba-ares.cdn.bcebos.com\\/mis\\/2024-8\\/1722586936824\\/82195b2e9cf4.gif\",\"hover_pic\":\"https:\\/\\/tieba-ares.cdn.bcebos.com\\/mis\\/2024-8\\/1722586936824\\/82195b2e9cf4.gif\",\"video_info\":[],\"id\":\"57953\",\"ad_source\":\"\",\"ad_source_name\":\"\\u8d34\\u5427\\u5206\\u53d1\",\"width\":0,\"height\":0,\"label_measure\":1}],\"cpid\":\"13\",\"abtest\":\"\",\"price\":10,\"plan_id\":1,\"user_id\":\"37676788\",\"ext_info\":\"1_0_0_0_GD_0_0_0_p0015_\\u4f53\\u80b2_\\u7efc\\u5408\\u4f53\\u80b2_\\u6e38\\u620f\\u5408\\u4f5c-\\u5dc5\\u5cf0\\u51a0\\u519b\\u8db3\\u7403-\\u65b01-\\u7c7b\\u76ee_\\u5185\\u5bb9_\\u5185\\u5bb9_3629310648998897664_0_0_0_0_CPM_GD__3_0_G_eyJwbCI6IjM3NDc3IiwidW4iOiI1Nzk1MyIsInNlYXJjaF90aW1lIjoxNzIyOTY1NDc4LCJzZWFyY2hfaWQiOjM2MjkzMTA2NDg5OTg4OTc2NjQsInNpcCI6IjE4My4xMi4yMjAuMjE0IiwidWlkIjoxNTI3NTU2MzQzLCJmb3J1bV9pZCI6NDUxMzc1MCwiZm9ydW1fZGlyIjoiXHU0ZjUzXHU4MGIyIiwiZm9ydW1fc2Vjb25kX2RpciI6Ilx1N2VmY1x1NTQwOFx1NGY1M1x1ODBiMiIsInR5cGVpZCI6IjAyMDAiLCJwYWdlIjoiUEIiLCJleHQxIjo5MTE5Njg4NDIxfQ==_0_\",\"search_id\":3629310648998897664,\"imTimeSign\":null,\"ad_tags\":[],\"verify\":\"41e649a49dd4f9478dc46f5d7b50e505\",\"raw_adurl\":\"http:\\/\\/gamein.baidu.com\\/game\\/link\\/jump?number=54\",\"pb_log\":{\"forum_id\":4513750,\"forum_name\":\"\\u7f51\\u7403\\u98ce\\u4e91\",\"forum_dir\":\"\\u4f53\\u80b2\",\"forum_second_dir\":\"\\u7efc\\u5408\\u4f53\\u80b2\",\"click_url\":\"http:\\/\\/gamein.baidu.com\\/game\\/link\\/jump?number=54\",\"action_type\":2,\"client_type\":1,\"task\":\"tbda\",\"loc_param\":1,\"page\":3,\"location\":\"p0015\"},\"click_url_params\":\"lid%3D1878266655_37477_13_4513750_9119688421_0%26url%3D2b2ekZ10nJMbDL8YzBmjDm5DM5hLQq28ld1oEfYY4BM9GebyFHT-NjuEr4NBh0vmHeoegQjnzDry7YMmIuwpWK72Mj4_e-ZgEhG8mqqpL8oYMn4tGbnkFjBtYLPzMTcY4DvPJOR-v5MktsSmREWy_4MQaPzZAjNcr4mOmnjxFkwFB1027Y-4JcA7y-q6Ggxm0bqGDUGJ6H9iFQFliJ1B-4wl3ZihvgjcIkqxK_ggwiOenlN8-RUOENVeZIUngbzbxzTxBYzZBDaYCN55MdOudE8Xoo2NxBfB8xswbuW8a0j18tCr57t-rezQV-KSdTTYIm61DMKmlRXVqrCh2fcYRTvJHQnATAPfebjbzOVBLWt0PD7KgrU74B8Jx-yP95IlJKmncQ54MP84iyjAPmhNrq2o1aGuk31o7hLteGsQFf-exDKenejY2vJgYLM4E-WZqROcj42zMjHOOfr9OY8lCJzy4CXumklmXYoNON9m90_QaDYjKSPinuyi6mparwVZWBH_nYTdfy06UGZn9fwJyIXBH5a8oLkXleMIinOQZbV86YznQ3JqkKc19CqoUS7iqS9DvQHql2z4cdSztGiThoKxzp4ZR81MiR06YLgjfxLnkX0CaNXjrhMY_9Llg178lP3ItSQZBjpgzC_a1dwyYXgSDXsyGjwGcdP6xfS2kAWX864e0MhlfSg07Z4GRjwNlGC0EjX7cxO_c27yHQVoYGPUsC5NB0dmDlgGsTZ2i3tv_f75dXA1v1PQym5kjx8lOyLk-5zzYa4ILGssBg_5AkdrkWb3AZ9gVzQkYUoAT_m1pgN9V7vL-3JLs8_w5yZj-IlWQhsYYoO_-oF4LymhxK4m4owdJ_jx6ZhvJ8keZqXcV6EwFdyMsGBqHblEOP7qschHBtbrBNSF0pTL4NyBXxhn9zoJuVXthsmoupxa-pxXgsyswv3bOEHjLAWHI8OupLsrv-k60ce9gbP6NHOWsehAtariAUw2BkseQrzFLEEWOGa2vhQj-_yIoKbX9by6NBZ1bx4lbCCr3j3lH3Z67LZIAIh1IThP5UmYlNIJK3XUMjZjC93wqXy-1tMH3Nk9xInzsVXjhIxgcBbPbdmmambD4_Pic5zql2QyD_9SnMT-c7KMhOnYXZKwnWN0We4ZoGPY4ss6_zVDsefkhplK3M2CiPGubwgK0UJKFgUKNmosyEi2RYW50wd4prOc8d1_NWderEzCACYlewlM0KQAukF6YqjrBDjBER2ApcYFszK4oZJiizKq7bqwTCK8mupD2YBj8BXtbDOM59nmIo7I39O7CmvRYZGkbFmCbHBV82_GhtOoz_ERVvQr9KGHLZx4gWKBkzf9jGb5MMMWL_q86tR-nmx4qpMx_W04xSwagjh5rHef3R70m2NZ9UuXix46tVKNur9K9CJgNJHg8-LowkjlQVzjeUodSxXcb_qlfq6u60fmsdNl1pTPU1OMGSy1SM0nyA-Yl-dsubdNxxUBKEtJxlGPfpunk-nt5YbDbQegm7CfEhDoFw2mhTlhHgctM1_iDfnN1AeZGd4a6t1Vs31c91MYJrK4Yo15r4Zs9BZO6sOaMwRibHWz8nw18UNPQQofbgGW7PLx5JR3jO8ASdSehxV_bwmLNaEK03ijxA\"}],\"PC_FC_FL\":{\"ad_num\":1,\"js\":\"!function(t){&quot;use strict&quot;;function e(t,e){if(t){var n=new Date().getTime(),r=new Image;t+=&quot;&amp;rand=&quot;+(n+Math.random()),window.ecomLogImage||(window.ecomLogImage={}),window.ecomLogImage[&quot;--IMAGE&quot;+n]=r,e=e||{};var o=!1;r.onload=r.onerror=r.onabort=function(i){if(!e.charge){if(i&amp;&amp;&quot;load&quot;!==i.type){if(o)&quot;error&quot;in e&amp;&amp;e.error();else{r.src=t,o=!0;return}}else&quot;load&quot;in e&amp;&amp;e.load()}r.onload=r.onerror=r.onabort=null,window.ecomLogImage[&quot;--IMAGE&quot;+n]=null,r=null},r.src=t}}var n,r=function(){var t,e,n,r=0,o=0,i=0,a=0,s=0,c=0,u=0,f=0,h=\\/link\\\\?url\\\\=([^\\\\&amp;]+)\\/,l=\\/\\\\?url\\\\=([^\\\\.]+)\\\\.\\/,p=&quot;data-cklink&quot;,d=\\/[?&amp;]tn=([^&amp;]*)\\/;function v(t){if(!t)return!1;var e=h.exec(t)||l.exec(t);return!!e&amp;&amp;(h.exec(t)?e[1].length&lt;20?e[1]:e[1].substr(0,20):e[1])}function g(n){var a,s,h,l,d,g=(l=f.href,d=f.getAttribute(p),v(l)||v(d));!1!==g&amp;&amp;(a=&quot;&amp;ck=&quot;+[function(t,e){for(var n=0,r=0;r&lt;i*e%99+9;r++)n+=t.charCodeAt(u*r%t.length);return n}(g,n),i,u,Math.round(r),Math.round(o),Math.round(t),Math.round(e),c].join(&quot;.&quot;),s=f.href,h=f.getAttribute(p),s&amp;&amp;v(s)&amp;&amp;(f.href=y(s,a)+m(s)),h&amp;&amp;v(h)&amp;&amp;f.setAttribute(p,y(h,a)+m(h)))}function m(t){var e=&quot;&quot;;if(-1===t.indexOf(&quot;&amp;shh=&quot;)&amp;&amp;-1===t.indexOf(&quot;?shh=&quot;)&amp;&amp;(e=&quot;&amp;shh=&quot;+location.hostname),-1===t.indexOf(&quot;&amp;sht=&quot;)&amp;&amp;-1===t.indexOf(&quot;?sht=&quot;)){var n=location.href.match(d);n&amp;&amp;(e+=&quot;&amp;sht=&quot;+n[1])}return e}function y(t,e){return v(t)&amp;&amp;(-1===t.indexOf(&quot;&amp;ck=&quot;)?t+=e:t=t.replace(\\/&amp;ck=[\\\\d.]*\\/,e)),t}function b(n,h,l){void 0===n.length&amp;&amp;(n=[n]);for(var d=n.length,b=0,w=[function(n){var s;f=(s=(s=n)||window.event).target||s.srcElement,i++,void 0===t&amp;&amp;(t=s.clientX),void 0===e&amp;&amp;(e=s.clientY),r=0,o=0,u=0,c=0,a=new Date().getTime(),g(h)},function(t){!function(t,e){for(f=(t=t||window.event).target||t.srcElement;f&amp;&amp;&quot;A&quot;!==f.tagName;)f=f.parentNode;s=new Date().getTime(),u=9999,r=t.clientX,o=t.clientY,c=0===a?0:s-a,g(e)}(t,h)},function(t){u=new Date().getTime()-s,g(h)}];b&lt;d;b++)l||function(t){var e=t.href;if(v(e)){var n=&quot;&amp;ck=&quot;+[0,i,u,Math.round(r),Math.round(o),0,0,c].join(&quot;.&quot;),a=t.getAttribute(p);e&amp;&amp;(t.href=y(e,n)+m(e)),a&amp;&amp;t.setAttribute(p,y(a,n)+m(a))}}(n[b]),function(t,e,n){for(var r,o,i=e.length,a=0;a&lt;i;a++)r=e[a],o=n[a],window.attachEvent?t.attachEvent(&quot;on&quot;+r,o):t.addEventListener(r,o,!1)}(n[b],[&quot;mouseover&quot;,&quot;mousedown&quot;,&quot;mouseup&quot;],w)}return{getInstance:function(t){return n||(n={addAdsCk:b}),n}}},o={init:function(t,e,o){var i=r().getInstance(t);n=i;for(var a=document.querySelectorAll(t),s=0;s&lt;a.length;s++){var c=a[s],u=c.getAttribute(&quot;data-ecimtimesign&quot;)||c.getAttribute(&quot;data-pz-sign&quot;)||e,f=c.getElementsByTagName(&quot;A&quot;);i.addAdsCk(f,u,o)}return i},getInstance:function(){return n}},i=&quot;undefined&quot;!=typeof globalThis?globalThis:&quot;undefined&quot;!=typeof window?window:&quot;undefined&quot;!=typeof global?global:&quot;undefined&quot;!=typeof self?self:{},a={exports:{}};!function(t){var e=Object.prototype.hasOwnProperty,n=&quot;~&quot;;function r(){}function o(t,e,n){this.fn=t,this.context=e,this.once=n||!1}function i(t,e,r,i,a){if(&quot;function&quot;!=typeof r)throw TypeError(&quot;The listener must be a function&quot;);var s=new o(r,i||t,a),c=n?n+e:e;return t._events[c]?t._events[c].fn?t._events[c]=[t._events[c],s]:t._events[c].push(s):(t._events[c]=s,t._eventsCount++),t}function a(t,e){0==--t._eventsCount?t._events=new r:delete t._events[e]}function s(){this._events=new r,this._eventsCount=0}Object.create&amp;&amp;(r.prototype=Object.create(null),new r().__proto__||(n=!1)),s.prototype.eventNames=function(){var t,r,o=[];if(0===this._eventsCount)return o;for(r in t=this._events)e.call(t,r)&amp;&amp;o.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?o.concat(Object.getOwnPropertySymbols(t)):o},s.prototype.listeners=function(t){var e=n?n+t:t,r=this._events[e];if(!r)return[];if(r.fn)return[r.fn];for(var o=0,i=r.length,a=Array(i);o&lt;i;o++)a[o]=r[o].fn;return a},s.prototype.listenerCount=function(t){var e=n?n+t:t,r=this._events[e];return r?r.fn?1:r.length:0},s.prototype.emit=function(t,e,r,o,i,a){var s=n?n+t:t;if(!this._events[s])return!1;var c,u,f=this._events[s],h=arguments.length;if(f.fn){switch(f.once&amp;&amp;this.removeListener(t,f.fn,void 0,!0),h){case 1:return f.fn.call(f.context),!0;case 2:return f.fn.call(f.context,e),!0;case 3:return f.fn.call(f.context,e,r),!0;case 4:return f.fn.call(f.context,e,r,o),!0;case 5:return f.fn.call(f.context,e,r,o,i),!0;case 6:return f.fn.call(f.context,e,r,o,i,a),!0}for(u=1,c=Array(h-1);u&lt;h;u++)c[u-1]=arguments[u];f.fn.apply(f.context,c)}else{var l,p=f.length;for(u=0;u&lt;p;u++)switch(f[u].once&amp;&amp;this.removeListener(t,f[u].fn,void 0,!0),h){case 1:f[u].fn.call(f[u].context);break;case 2:f[u].fn.call(f[u].context,e);break;case 3:f[u].fn.call(f[u].context,e,r);break;case 4:f[u].fn.call(f[u].context,e,r,o);break;default:if(!c)for(l=1,c=Array(h-1);l&lt;h;l++)c[l-1]=arguments[l];f[u].fn.apply(f[u].context,c)}}return!0},s.prototype.on=function(t,e,n){return i(this,t,e,n,!1)},s.prototype.once=function(t,e,n){return i(this,t,e,n,!0)},s.prototype.removeListener=function(t,e,r,o){var i=n?n+t:t;if(!this._events[i])return this;if(!e)return a(this,i),this;var s=this._events[i];if(s.fn)s.fn!==e||o&amp;&amp;!s.once||r&amp;&amp;s.context!==r||a(this,i);else{for(var c=0,u=[],f=s.length;c&lt;f;c++)(s[c].fn!==e||o&amp;&amp;!s[c].once||r&amp;&amp;s[c].context!==r)&amp;&amp;u.push(s[c]);u.length?this._events[i]=1===u.length?u[0]:u:a(this,i)}return this},s.prototype.removeAllListeners=function(t){var e;return t?(e=n?n+t:t,this._events[e]&amp;&amp;a(this,e)):(this._events=new r,this._eventsCount=0),this},s.prototype.off=s.prototype.removeListener,s.prototype.addListener=s.prototype.on,s.prefixed=n,s.EventEmitter=s,t.exports=s}(a);var s=(b=a.exports)&amp;&amp;b.__esModule&amp;&amp;Object.prototype.hasOwnProperty.call(b,&quot;default&quot;)?b.default:b;function c(t){return(c=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}function u(t,e){return(u=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}var f={},h={},l=function(t){!function(t,e){if(&quot;function&quot;!=typeof e&amp;&amp;null!==e)throw TypeError(&quot;Super expression must either be null or a function&quot;);t.prototype=Object.create(e&amp;&amp;e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&amp;&amp;u(t,e)}(o,t);var e,n,r=(e=function(){if(&quot;undefined&quot;==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if(&quot;function&quot;==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(t){return!1}}(),function(){var t,n,r=c(o);if(e){var i=c(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return(t=n)&amp;&amp;(&quot;object&quot;==(t&amp;&amp;&quot;undefined&quot;!=typeof Symbol&amp;&amp;t.constructor===Symbol?&quot;symbol&quot;:typeof t)||&quot;function&quot;==typeof t)?t:function(t){if(void 0===t)throw ReferenceError(&quot;this hasn&#039;t been initialised - super() hasn&#039;t been called&quot;);return t}(this)});function o(t){!function(t,e){if(!(t instanceof e))throw TypeError(&quot;Cannot call a class as a function&quot;)}(this,o);var e=r.call(this);return f=t,h=t,e}return n=[{key:&quot;set&quot;,value:function(t,e){for(var n=this.get(t),r=t.split(&quot;.&quot;),o=f,i=0,a=r.length;i&lt;a;i++)void 0===o[r[i]]&amp;&amp;(o[r[i]]={}),i===a-1&amp;&amp;(o[r[i]]=e,this.emit(&quot;env:change[&quot;.concat(t,&quot;]&quot;),[n,e])),o=o[r[i]]}},{key:&quot;get&quot;,value:function(t){for(var e=t.split(&quot;.&quot;),n=f,r=0,o=e.length;r&lt;o;r++){if(void 0===n[e[r]])return n[e[r]];n=n[e[r]]}return n}},{key:&quot;getValue&quot;,value:function(){return Object.assign({},f)}},{key:&quot;getInitValue&quot;,value:function(){return Object.assign({},h)}}],function(t,e){for(var n=0;n&lt;e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,&quot;value&quot;in r&amp;&amp;(r.writable=!0),Object.defineProperty(t,r.key,r)}}(o.prototype,n),o}(s),p=null,d={getInstance:function(t){return p||(p=new l(t)),p}},v=&quot;https:\\/\\/fclick.baidu.com\\/w.gif&quot;,g=&quot;https:\\/\\/fclickv4.baidu.com\\/w.gif&quot;;function m(t){var e,n=d.getInstance().getValue();!t.searchId&amp;&amp;n&amp;&amp;n.searchid&amp;&amp;(t.searchId=n.searchid),(null==n?void 0:null===(e=n.flags)||void 0===e?void 0:e.expFlagFixAsynSlideLog)||&quot;ecom_wise_listen_n&quot;!==t.tag||!n||(!t.asp_time&amp;&amp;n.aspTime&amp;&amp;(t.asp_time=n.aspTime),!t.query&amp;&amp;n.queryWordEnc&amp;&amp;(t.query=n.queryWordEnc),t.queryUtf8||!n.query||(t.queryUtf8=n.query));var r=[];for(var o in t)t.hasOwnProperty(o)&amp;&amp;r.push(encodeURIComponent(o)+&quot;=&quot;+encodeURIComponent(t[o]));return r.join(&quot;&amp;&quot;)}function y(t){var n=arguments.length&gt;1&amp;&amp;void 0!==arguments[1]&amp;&amp;arguments[1],r=d.getInstance().getValue();if(r&amp;&amp;r.flags&amp;&amp;r.flags.changeFclickToBeacon){!function(t){var n,r=arguments.length&gt;1&amp;&amp;void 0!==arguments[1]&amp;&amp;arguments[1],o=new Date().getTime();t&amp;&amp;(t.rand=o+Math.random()),function(t){var e=!1;try{t&amp;&amp;navigator.sendBeacon&amp;&amp;(e=navigator.sendBeacon(t))}catch(t){}return e}(n=[r?g:v,m(t)].join(&quot;?&quot;))||e(n)}(t,n);return}e([n?g:v,m(t)].join(&quot;?&quot;))}var b,w,_=function(t){this.env=t||{}};_.prototype={report:function(t){y(this.extend(this.env,{tag:&quot;ps-js-error&quot;,datetime:new Date().getTime(),message:t.message,stack:t.stack}))},support:function(t,e){if(&quot;function&quot;==typeof t){e=t;try{e()}catch(t){this.report(t)}}else{var n=t[e];t[e]=function(){for(var e=arguments.length,r=Array(e),o=0;o&lt;e;o++)r[o]=arguments[o];try{n.apply(t,r)}catch(t){this.report(t)}}}},extend:function(){for(var t={},e=0,n=arguments.length;e&lt;n;e++)if(&quot;[object Object]&quot;===Object.prototype.toString.call(arguments[e]))for(var r in arguments[e])t[r]=arguments[e][r];return t}};var I,E={getInstance:function(t){return w||(w=new _(t)),w}},O=function(){var t,e,n,r=0,o=0,i=0,a=0,s=0,c=0,u=0,f=0,h=\\/link\\\\?url\\\\=([^\\\\&amp;]+)\\/,l=\\/\\\\?url\\\\=([^\\\\.]+)\\\\.\\/,p=&quot;data-cklink&quot;,d=\\/[?&amp;]tn=([^&amp;]*)\\/;function v(t){if(!t)return!1;var e=h.exec(t)||l.exec(t);return!!e&amp;&amp;(h.exec(t)?e[1].length&lt;20?e[1]:e[1].substr(0,20):e[1])}function g(n){var a,s,h,l,d,g=(l=f.href,d=f.getAttribute(p),v(l)||v(d));!1!==g&amp;&amp;(a=&quot;&amp;ck=&quot;+[function(t,e){for(var n=0,r=0;r&lt;i*e%99+9;r++)n+=t.charCodeAt(u*r%t.length);return n}(g,n),i,u,Math.round(r),Math.round(o),Math.round(t),Math.round(e),c].join(&quot;.&quot;),s=f.href,h=f.getAttribute(p),s&amp;&amp;v(s)&amp;&amp;(f.href=y(s,a)+m(s)),h&amp;&amp;v(h)&amp;&amp;f.setAttribute(p,y(h,a)+m(h)))}function m(t){var e=&quot;&quot;;if(-1===t.indexOf(&quot;&amp;shh=&quot;)&amp;&amp;-1===t.indexOf(&quot;?shh=&quot;)&amp;&amp;(e=&quot;&amp;shh=&quot;+location.hostname),-1===t.indexOf(&quot;&amp;sht=&quot;)&amp;&amp;-1===t.indexOf(&quot;?sht=&quot;)){var n=location.href.match(d);n&amp;&amp;(e+=&quot;&amp;sht=&quot;+n[1])}return e}function y(t,e){return v(t)&amp;&amp;(-1===t.indexOf(&quot;&amp;ck=&quot;)?t+=e:t=t.replace(\\/&amp;ck=[\\\\d.]*\\/,e)),t}function b(n,h,l){void 0===n.length&amp;&amp;(n=[n]);for(var d=n.length,b=0,w=[function(n){!function(n,s){for(f=(n=n||window.event).target||n.srcElement;f&amp;&amp;&quot;A&quot;!==f.tagName;)f=f.parentNode;i++,void 0===t&amp;&amp;(t=n.clientX),void 0===e&amp;&amp;(e=n.clientY),r=0,o=0,u=0,c=0,a=new Date().getTime(),g(s)}(n,h)},function(t){!function(t,e){for(f=(t=t||window.event).target||t.srcElement;f&amp;&amp;&quot;A&quot;!==f.tagName;)f=f.parentNode;s=new Date().getTime(),u=9999,r=t.clientX,o=t.clientY,c=0===a?0:s-a,g(e)}(t,h)},function(t){u=new Date().getTime()-s,g(h)}];b&lt;d;b++)l||function(t){var e=t.href;if(v(e)){var n=&quot;&amp;ck=&quot;+[0,i,u,Math.round(r),Math.round(o),0,0,c].join(&quot;.&quot;),a=t.getAttribute(p);e&amp;&amp;(t.href=y(e,n)+m(e)),a&amp;&amp;t.setAttribute(p,y(a,n)+m(a))}}(n[b]),function(t,e,n){for(var r,o,i=e.length,a=0;a&lt;i;a++)r=e[a],o=n[a],window.attachEvent?t.attachEvent(&quot;on&quot;+r,o):t.addEventListener(r,o,!1)}(n[b],[&quot;mouseover&quot;,&quot;mousedown&quot;,&quot;mouseup&quot;],w)}return{getInstance:function(t){return n||(n={addAdsCk:b}),n}}},A={init:function(t,e,n){var r=O().getInstance(t);I=r;for(var o=document.querySelectorAll(t),i=0;i&lt;o.length;i++){var a=o[i],s=a.getAttribute(&quot;data-ecimtimesign&quot;)||a.getAttribute(&quot;data-pz-sign&quot;)||e,c=a.getElementsByTagName(&quot;A&quot;);r.addAdsCk(c,s,n)}return r},getInstance:function(){return I}};function R(t,e){return null!=e&amp;&amp;&quot;undefined&quot;!=typeof Symbol&amp;&amp;e[Symbol.hasInstance]?!!e[Symbol.hasInstance](t):t instanceof e}function S(t){for(var e=t.target||t.srcElement;e&amp;&amp;&quot;A&quot;!==e.tagName;)e=e.parentNode;var n=e.href;if(x(n)){var r,o=new URLSearchParams(n).get(&quot;ck&quot;);o&amp;&amp;k(e,[0,&quot;00000000&quot;===(r=o.split(&quot;.&quot;)).join(&quot;&quot;)?1:&quot;0&quot;===r[2]&amp;&amp;&quot;0&quot;===r[3]&amp;&amp;&quot;0&quot;===r[4]&amp;&amp;&quot;0&quot;===r[7]?2:3,0,0])}}function x(t){return&quot;string&quot;==typeof t&amp;&amp;-1!==t.indexOf(&quot;baidu.php&quot;)}function T(t,e){var n=window.navigator.mimeTypes;for(var r in n)if(n[r][t]===e)return!0;return!1}function k(t,e){var n=t.href;if(x(n)){var r=new URLSearchParams(n),o=r.get(&quot;us&quot;),i=[];if(o){var a=&quot;newvui&quot;===o?[]:o.split(&quot;.&quot;);i=e.map(function(t,n){return e[n]?e[n]:a[n]||0})}else i=e.map(function(t){return t||0});r.set(&quot;us&quot;,i.join(&quot;.&quot;)),t.href=decodeURIComponent(r.toString())}}function M(t,e){var n=!0,r=!1,o=void 0;try{for(var i,a=t[Symbol.iterator]();!(n=(i=a.next()).done);n=!0){var s=i.value;&quot;attributes&quot;===s.type&amp;&amp;&quot;se_prerender_url&quot;===s.attributeName&amp;&amp;&quot;complete&quot;===s.target.getAttribute(&quot;se_prerender_url&quot;)&amp;&amp;(k(s.target,[0,0,0,1]),y({tag:&quot;ecom_msa_tmp_4&quot;,action:&quot;prerender&quot;,href:s.target.getAttribute(&quot;href&quot;)}))}}catch(t){r=!0,o=t}finally{try{n||null==a.return||a.return()}finally{if(r)throw o}}}!function(t){var e,n,r=function(){try{if(t.URLSearchParams&amp;&amp;&quot;bar&quot;===new t.URLSearchParams(&quot;foo=bar&quot;).get(&quot;foo&quot;))return t.URLSearchParams}catch(t){}return null}(),o=r&amp;&amp;&quot;a=1&quot;===new r({a:1}).toString(),i=r&amp;&amp;&quot;+&quot;===new r(&quot;s=%2B&quot;).get(&quot;s&quot;),a=&quot;__URLSearchParams__&quot;,s=!r||((e=new r).append(&quot;s&quot;,&quot; &amp;&quot;),&quot;s=+%26&quot;===e.toString()),c=h.prototype,u=!!(t.Symbol&amp;&amp;t.Symbol.iterator);if(!r||!o||!i||!s){c.append=function(t,e){g(this[a],t,e)},c.delete=function(t){delete this[a][t]},c.get=function(t){var e=this[a];return this.has(t)?e[t][0]:null},c.getAll=function(t){var e=this[a];return this.has(t)?e[t].slice(0):[]},c.has=function(t){return y(this[a],t)},c.set=function(t,e){this[a][t]=[&quot;&quot;+e]},c.toString=function(){var t,e,n,r,o=this[a],i=[];for(e in o)for(t=0,n=l(e),r=o[e];t&lt;r.length;t++)i.push(n+&quot;=&quot;+l(r[t]));return i.join(&quot;&amp;&quot;)},i&amp;&amp;r&amp;&amp;!o&amp;&amp;t.Proxy?(n=new Proxy(r,{construct:function(t,e){return new t(new h(e[0]).toString())}})).toString=Function.prototype.toString.bind(h):n=h,Object.defineProperty(t,&quot;URLSearchParams&quot;,{value:n});var f=t.URLSearchParams.prototype;f.polyfill=!0,f.forEach=f.forEach||function(t,e){var n=v(this.toString());Object.getOwnPropertyNames(n).forEach(function(r){n[r].forEach(function(n){t.call(e,n,r,this)},this)},this)},f.sort=f.sort||function(){var t,e,n,r=v(this.toString()),o=[];for(t in r)o.push(t);for(o.sort(),e=0;e&lt;o.length;e++)this.delete(o[e]);for(e=0;e&lt;o.length;e++){var i=o[e],a=r[i];for(n=0;n&lt;a.length;n++)this.append(i,a[n])}},f.keys=f.keys||function(){var t=[];return this.forEach(function(e,n){t.push(n)}),d(t)},f.values=f.values||function(){var t=[];return this.forEach(function(e){t.push(e)}),d(t)},f.entries=f.entries||function(){var t=[];return this.forEach(function(e,n){t.push([n,e])}),d(t)},u&amp;&amp;(f[t.Symbol.iterator]=f[t.Symbol.iterator]||f.entries)}function h(t){(R(t=t||&quot;&quot;,URLSearchParams)||R(t,h))&amp;&amp;(t=t.toString()),this[a]=v(t)}function l(t){var e={&quot;!&quot;:&quot;%21&quot;,&quot;&#039;&quot;:&quot;%27&quot;,&quot;(&quot;:&quot;%28&quot;,&quot;)&quot;:&quot;%29&quot;,&quot;~&quot;:&quot;%7E&quot;,&quot;%20&quot;:&quot;+&quot;,&quot;%00&quot;:&quot;\\\\x00&quot;};return encodeURIComponent(t).replace(\\/[!&#039;\\\\(\\\\)~]|%20|%00\\/g,function(t){return e[t]})}function p(t){return t.replace(\\/[ +]\\/g,&quot;%20&quot;).replace(\\/(%[a-f0-9]{2})+\\/ig,function(t){return decodeURIComponent(t)})}function d(e){var n={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return u&amp;&amp;(n[t.Symbol.iterator]=function(){return n}),n}function v(t){var e={};if(&quot;object&quot;==typeof t){if(m(t))for(var n=0;n&lt;t.length;n++){var r=t[n];if(m(r)&amp;&amp;2===r.length)g(e,r[0],r[1]);else throw TypeError(&quot;Failed to construct &#039;URLSearchParams&#039;: Sequence initializer must only contain pair elements&quot;)}else for(var o in t)t.hasOwnProperty(o)&amp;&amp;g(e,o,t[o])}else{0===t.indexOf(&quot;?&quot;)&amp;&amp;(t=t.slice(1));for(var i=t.split(&quot;&amp;&quot;),a=0;a&lt;i.length;a++){var s=i[a],c=s.indexOf(&quot;=&quot;);-1&lt;c?g(e,p(s.slice(0,c)),p(s.slice(c+1))):s&amp;&amp;g(e,p(s),&quot;&quot;)}}return e}function g(t,e,n){var r=&quot;string&quot;==typeof n?n:null!=n&amp;&amp;&quot;function&quot;==typeof n.toString?n.toString():JSON.stringify(n);y(t,e)?t[e].push(r):t[e]=[r]}function m(t){return!!t&amp;&amp;&quot;[object Array]&quot;===Object.prototype.toString.call(t)}function y(t,e){return Object.prototype.hasOwnProperty.call(t,e)}}(void 0!==i?i:&quot;undefined&quot;!=typeof window?window:i);var P={attributes:!0,childList:!1,subtree:!1},j={init:function(t,e){var n=&quot;&quot;;MutationObserver&amp;&amp;(n=new MutationObserver(M));for(var r=document.querySelectorAll(t),o=0;o&lt;r.length;o++)for(var i,a,s=r[o].getElementsByTagName(&quot;A&quot;),c=0;c&lt;s.length;c++)n&amp;&amp;n.observe(s[c],P),i=s[c],a=&quot;click&quot;,window.attachEvent?i.attachEvent(&quot;on&quot;+a,S):i.addEventListener(a,S,!1),k(s[c],[function(){var t=!1,e=window.navigator,n=e.userAgent;if(window.chrome){var r=n.replace(\\/^.*Chrome\\\\\\/([\\\\d]+).*$\\/,&quot;$1&quot;);window.chrome.adblock2345||window.chrome.common2345||(T(&quot;type&quot;,&quot;application\\/360softmgrplugin&quot;)||T(&quot;type&quot;,&quot;application\\/mozilla-npqihooquicklogin&quot;)?t=!0:r&gt;36&amp;&amp;window.showModalDialog?t=!0:!(r&gt;45)||(t=T(&quot;type&quot;,&quot;application\\/vnd.chromium.remoting-viewer&quot;))||!(r&gt;=69)||(t=T(&quot;type&quot;,&quot;application\\/hwepass2001.installepass2001&quot;)||T(&quot;type&quot;,&quot;application\\/asx&quot;)))}return t?T(&quot;type&quot;,&quot;application\\/gameplugin&quot;)?2:e&amp;&amp;void 0!==e.connection&amp;&amp;void 0===e.connection.saveData?2:1:0}(),0,0,0])}};!function(){if(&quot;object&quot;==typeof window){if(&quot;IntersectionObserver&quot;in window&amp;&amp;&quot;IntersectionObserverEntry&quot;in window&amp;&amp;&quot;intersectionRatio&quot;in window.IntersectionObserverEntry.prototype){&quot;isIntersecting&quot;in window.IntersectionObserverEntry.prototype||Object.defineProperty(window.IntersectionObserverEntry.prototype,&quot;isIntersecting&quot;,{get:function(){return this.intersectionRatio&gt;0}});return}var t=window.document,e=[];r.prototype.THROTTLE_TIMEOUT=100,r.prototype.POLL_INTERVAL=null,r.prototype.USE_MUTATION_OBSERVER=!0,r.prototype.observe=function(t){if(!this._observationTargets.some(function(e){return e.element==t})){if(!(t&amp;&amp;1==t.nodeType))throw Error(&quot;target must be an Element&quot;);this._registerInstance(),this._observationTargets.push({element:t,entry:null}),this._monitorIntersections(),this._checkForIntersections()}},r.prototype.unobserve=function(t){this._observationTargets=this._observationTargets.filter(function(e){return e.element!=t}),this._observationTargets.length||(this._unmonitorIntersections(),this._unregisterInstance())},r.prototype.disconnect=function(){this._observationTargets=[],this._unmonitorIntersections(),this._unregisterInstance()},r.prototype.takeRecords=function(){var t=this._queuedEntries.slice();return this._queuedEntries=[],t},r.prototype._initThresholds=function(t){var e=t||[0];return Array.isArray(e)||(e=[e]),e.sort().filter(function(t,e,n){if(&quot;number&quot;!=typeof t||isNaN(t)||t&lt;0||t&gt;1)throw Error(&quot;threshold must be a number between 0 and 1 inclusively&quot;);return t!==n[e-1]})},r.prototype._parseRootMargin=function(t){var e=(t||&quot;0px&quot;).split(\\/\\\\s+\\/).map(function(t){var e=\\/^(-?\\\\d*\\\\.?\\\\d+)(px|%)$\\/.exec(t);if(!e)throw Error(&quot;rootMargin must be specified in pixels or percent&quot;);return{value:parseFloat(e[1]),unit:e[2]}});return e[1]=e[1]||e[0],e[2]=e[2]||e[0],e[3]=e[3]||e[1],e},r.prototype._monitorIntersections=function(){!this._monitoringIntersections&amp;&amp;(this._monitoringIntersections=!0,this.POLL_INTERVAL?this._monitoringInterval=setInterval(this._checkForIntersections,this.POLL_INTERVAL):(o(window,&quot;resize&quot;,this._checkForIntersections,!0),o(t,&quot;scroll&quot;,this._checkForIntersections,!0),this.USE_MUTATION_OBSERVER&amp;&amp;&quot;MutationObserver&quot;in window&amp;&amp;(this._domObserver=new MutationObserver(this._checkForIntersections),this._domObserver.observe(t,{attributes:!0,childList:!0,characterData:!0,subtree:!0}))))},r.prototype._unmonitorIntersections=function(){this._monitoringIntersections&amp;&amp;(this._monitoringIntersections=!1,clearInterval(this._monitoringInterval),this._monitoringInterval=null,i(window,&quot;resize&quot;,this._checkForIntersections,!0),i(t,&quot;scroll&quot;,this._checkForIntersections,!0),this._domObserver&amp;&amp;(this._domObserver.disconnect(),this._domObserver=null))},r.prototype._checkForIntersections=function(){var t=this._rootIsInDom(),e=t?this._getRootRect():s();this._observationTargets.forEach(function(r){var o=r.element,i=a(o),s=this._rootContainsTarget(o),c=r.entry,u=t&amp;&amp;s&amp;&amp;this._computeTargetAndRootIntersection(o,e),f=r.entry=new n({time:window.performance&amp;&amp;performance.now&amp;&amp;performance.now(),target:o,boundingClientRect:i,rootBounds:e,intersectionRect:u});c?t&amp;&amp;s?this._hasCrossedThreshold(c,f)&amp;&amp;this._queuedEntries.push(f):c&amp;&amp;c.isIntersecting&amp;&amp;this._queuedEntries.push(f):this._queuedEntries.push(f)},this),this._queuedEntries.length&amp;&amp;this._callback(this.takeRecords(),this)},r.prototype._computeTargetAndRootIntersection=function(e,n){if(&quot;none&quot;!=window.getComputedStyle(e).display){for(var r=a(e),o=u(e),i=!1;!i;){var s=null,c=1==o.nodeType?window.getComputedStyle(o):{};if(&quot;none&quot;==c.display)return;if(o==this.root||o==t?(i=!0,s=n):o!=t.body&amp;&amp;o!=t.documentElement&amp;&amp;&quot;visible&quot;!=c.overflow&amp;&amp;(s=a(o)),s&amp;&amp;!(r=function(t,e){var n=Math.max(t.top,e.top),r=Math.min(t.bottom,e.bottom),o=Math.max(t.left,e.left),i=Math.min(t.right,e.right),a=i-o,s=r-n;return a&gt;=0&amp;&amp;s&gt;=0&amp;&amp;{top:n,bottom:r,left:o,right:i,width:a,height:s}}(s,r)))break;o=u(o)}return r}},r.prototype._getRootRect=function(){var e;if(this.root)e=a(this.root);else{var n=t.documentElement,r=t.body;e={top:0,left:0,right:n.clientWidth||r.clientWidth,width:n.clientWidth||r.clientWidth,bottom:n.clientHeight||r.clientHeight,height:n.clientHeight||r.clientHeight}}return this._expandRectByRootMargin(e)},r.prototype._expandRectByRootMargin=function(t){var e=this._rootMarginValues.map(function(e,n){return&quot;px&quot;==e.unit?e.value:e.value*(n%2?t.width:t.height)\\/100}),n={top:t.top-e[0],right:t.right+e[1],bottom:t.bottom+e[2],left:t.left-e[3]};return n.width=n.right-n.left,n.height=n.bottom-n.top,n},r.prototype._hasCrossedThreshold=function(t,e){var n=t&amp;&amp;t.isIntersecting?t.intersectionRatio||0:-1,r=e.isIntersecting?e.intersectionRatio||0:-1;if(n!==r)for(var o=0;o&lt;this.thresholds.length;o++){var i=this.thresholds[o];if(i==n||i==r||i&lt;n!=i&lt;r)return!0}},r.prototype._rootIsInDom=function(){return!this.root||c(t,this.root)},r.prototype._rootContainsTarget=function(e){return c(this.root||t,e)},r.prototype._registerInstance=function(){0&gt;e.indexOf(this)&amp;&amp;e.push(this)},r.prototype._unregisterInstance=function(){var t=e.indexOf(this);-1!=t&amp;&amp;e.splice(t,1)},window.IntersectionObserver=r,window.IntersectionObserverEntry=n}function n(t){this.time=t.time,this.target=t.target,this.rootBounds=t.rootBounds,this.boundingClientRect=t.boundingClientRect,this.intersectionRect=t.intersectionRect||s(),this.isIntersecting=!!t.intersectionRect;var e=this.boundingClientRect,n=e.width*e.height,r=this.intersectionRect,o=r.width*r.height;n?this.intersectionRatio=Number((o\\/n).toFixed(4)):this.intersectionRatio=this.isIntersecting?1:0}function r(t,e){var n,r,o,i=e||{};if(&quot;function&quot;!=typeof t)throw Error(&quot;callback must be a function&quot;);if(i.root&amp;&amp;1!=i.root.nodeType)throw Error(&quot;root must be an Element&quot;);this._checkForIntersections=(n=this._checkForIntersections.bind(this),r=this.THROTTLE_TIMEOUT,o=null,function(){o||(o=setTimeout(function(){n(),o=null},r))}),this._callback=t,this._observationTargets=[],this._queuedEntries=[],this._rootMarginValues=this._parseRootMargin(i.rootMargin),this.thresholds=this._initThresholds(i.threshold),this.root=i.root||null,this.rootMargin=this._rootMarginValues.map(function(t){return t.value+t.unit}).join(&quot; &quot;)}function o(t,e,n,r){&quot;function&quot;==typeof t.addEventListener?t.addEventListener(e,n,r||!1):&quot;function&quot;==typeof t.attachEvent&amp;&amp;t.attachEvent(&quot;on&quot;+e,n)}function i(t,e,n,r){&quot;function&quot;==typeof t.removeEventListener?t.removeEventListener(e,n,r||!1):&quot;function&quot;==typeof t.detatchEvent&amp;&amp;t.detatchEvent(&quot;on&quot;+e,n)}function a(t){var e;try{e=t.getBoundingClientRect()}catch(t){}return e?(e.width&amp;&amp;e.height||(e={top:e.top,right:e.right,bottom:e.bottom,left:e.left,width:e.right-e.left,height:e.bottom-e.top}),e):s()}function s(){return{top:0,bottom:0,left:0,right:0,width:0,height:0}}function c(t,e){for(var n=e;n;){if(n==t)return!0;n=u(n)}return!1}function u(t){var e=t.parentNode;return e&amp;&amp;11==e.nodeType&amp;&amp;e.host?e.host:e&amp;&amp;e.assignedSlot?e.assignedSlot.parentNode:e}}();var L=&quot;observer&quot;;function C(){}function N(t){var e=t.container,n=t.url,r=t.params;this.opts={container:e,url:n,params:void 0===r?{}:r},this.init()}N.prototype={constructor:N,init:function(){var t=this,e=t.opts.container;t.observer=new IntersectionObserver(t.observeCB.bind(t)),e&amp;&amp;Array.prototype.slice.call(document.querySelectorAll(e)).forEach(function(e){t.observer.observe(e)})},observe:function(t){this.observer.observe(t)},observeCB:function(t){var e=this;t.forEach(function(t){if(t.isIntersecting){var n=t.target;if(!n.getAttribute(L)){var r=e.combineData(n);e.log(r),e.observer.unobserve(n),n.setAttribute(L,1)}}})},combineData:function(t){var e=this.opts.params,n={data:{}};for(var r in e)if(e.hasOwnProperty(r)){var o=t.getAttribute(e[r]);&quot;&quot;!==o&amp;&amp;(n.data[r]=o)}return n},log:function(t){this.nclick(t)},nclick:function(t){var e=this.opts.url;t.rand=this.addRand();var n=&quot;&quot;.concat(e,&quot;?&quot;).concat(this.encodeSearchParams(t));this.imgRequest(n,t)},imgRequest:function(t,e){try{var n=e.rand,r=new Image;window[&quot;--IMAGE&quot;+n]=r,r.onload=r.onerror=r.onabort=function(){r.onload=r.onerror=r.onabort=null,r=null,window[&quot;--IMAGE&quot;+n]=C},r.src=t}catch(t){}},addRand:function(){return Math.random().toString(16).slice(2,8)+Math.random()},encodeSearchParams:function(t){var e=[];for(var n in t)if(t.hasOwnProperty(n)){var r=t[n];&quot;object&quot;==typeof r&amp;&amp;(r=JSON.stringify(r)),e.push([n,encodeURIComponent(r)].join(&quot;=&quot;))}return e.join(&quot;&amp;&quot;)}};var q={init:function(){new N({container:&quot;[data-nvk]&quot;,url:&quot;https:\\/\\/ada.baidu.com\\/udpl\\/exp&quot;,params:{exp:&quot;data-nvk&quot;}})}};t.PARAMS={},t.init=function(e){t.PARAMS=e;var n=&quot;.&quot;+t.PARAMS.resultClass;E.getInstance({}).support(function(){t.PARAMS.flags.tiebaCkFix&amp;&amp;-1!==[&quot;pc_tieba_list&quot;,&quot;pc_tieba_detail&quot;].indexOf(t.PARAMS.pageid)?A.init(n,t.PARAMS.imTimeSign):o.init(n,t.PARAMS.imTimeSign),q.init(),t.PARAMS.flags.tiebaCkFix&amp;&amp;-1!==[&quot;pc_tieba_list&quot;,&quot;pc_tieba_detail&quot;].indexOf(t.PARAMS.pageid)&amp;&amp;j.init(n,t.PARAMS)})},t.request=e}(this.ecomNsPcGlobal=this.ecomNsPcGlobal||{});\\n\\n            (function (variable) {\\n                window.ecomNsPcGlobal.init(variable);\\n            })({&quot;searchid&quot;:&quot;000000006ff4131f&quot;,&quot;eid&quot;:&quot;120201_120702_7869012_300003&quot;,&quot;bwsid&quot;:0,&quot;osid&quot;:0,&quot;pageid&quot;:&quot;pc_tieba_detail&quot;,&quot;baiduid&quot;:&quot;00E51832EC6DAA0D10E1C0699C5E6670&quot;,&quot;ovlid&quot;:&quot;129424-dz#129771-dz#127633-9#119767-dz#125784-6#119725-17#124778-17#167nj-0&quot;,&quot;wpt&quot;:0,&quot;netType&quot;:0,&quot;cuid&quot;:&quot;&quot;,&quot;feedCuid&quot;:&quot;&quot;,&quot;query&quot;:&quot;%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&quot;,&quot;imTimeSign&quot;:108,&quot;asynMode&quot;:0,&quot;asynUrl&quot;:&quot;&quot;,&quot;isWiseDropDown&quot;:false,&quot;asynsid&quot;:&quot;&quot;,&quot;aspTime&quot;:1722965478873,&quot;sourceAdNum&quot;:{&quot;ads_2327&quot;:1},&quot;asynQuery&quot;:&quot;&quot;,&quot;jFieldLinkMap&quot;:{&quot;7R_NR2Ar5Od66EzgSNerQ0BK-qjgKZLqWAZ1vmIMo9vxgj4e_5o33IOM9tSMjld3xg4mx5u9qx-9qEH9tOZjexZjES8Z1vmxgI9vNqIT1VQDpyuCp88EDkYvIMWgvX5WElkYP77BOoZBmoLNvNtTMNM-eRlrKYdvFWG_LU81k_tIhOubl_t8aFqjDk_3tILZkzXPMZJ1z3lQnyFWWuE_ooLeVOySe-SWDk7SOYOohzsOwSUqEHISUtVjVOPSLjqAJEklcELecqNxKYxhoOdkOhzqPL4EvqxuPSOOolltHDgeOHS8UQjqZ4EvqPL4EzYrLtLeT5YpJO-d9JmerVqLQxYwYA5Pe5O6ObI8eO_xenI---MO6kOSjGSgz_9BOBRU57-OHk_______OxdTgHgyyyyyyyyyyyyf4UcSjqOOgv1um8Z6OdkxwsxQkOtDgzdq_gzOdq8881lFELtSgtLSEOgqZ4EvOYcOusO-ItEd5kexSkOw_Ot7-----IO3Otj6SN--MO6qEdYXx_OU_____dvpVIbgjePyWqxlZSzM-HJdTXgSwOs51OxveqMSzevOBhpletx1OSjqXxSW3OBeO6XEU4e2OSQeqZoZqS1C3mElrWqiQOuoOejEzqZQSpolrZter1-4p81uYvyyX5qA1lry6GyAp7WW_3e826&quot;:&quot;https:\\/\\/b2b.baidu.com\\/aitf\\/s?q=%E8%8B%8F%E5%B7%9E%E6%B1%BD%E8%BD%A6%E7%A7%9F%E8%B5%81&amp;from=search&amp;fid=604714779&amp;styl=b&amp;sid=1510132&amp;a_keywordid={keywordid}&amp;a_unitid={unitid}&amp;a_planid={planid}&quot;},&quot;upAdNum&quot;:0,&quot;middleAdNum&quot;:0,&quot;downAdNum&quot;:0,&quot;flags&quot;:{&quot;fixPlusSign&quot;:true},&quot;variable&quot;:{},&quot;rsContent&quot;:[],&quot;ecomData204&quot;:&quot;&quot;,&quot;ecomData213&quot;:&quot;&quot;,&quot;ecomData217&quot;:&quot;&quot;,&quot;ad204Num&quot;:0,&quot;ad213Num&quot;:0,&quot;ad217Num&quot;:0,&quot;isHasImlp&quot;:false,&quot;adsInfo&quot;:{&quot;000000006ff4131f_1626_0&quot;:{&quot;ideaId&quot;:75048564995,&quot;docId&quot;:&quot;0&quot;,&quot;mts&quot;:[2410,2051]}},&quot;bdCid&quot;:93,&quot;bdPid&quot;:4,&quot;queryWordEnc&quot;:&quot;%CD%F8%C7%F2%B7%E7%D4%C6&quot;,&quot;wiseSt&quot;:&quot;&quot;,&quot;requestIpV4&quot;:3604745399,&quot;fnizebrab&quot;:&quot;&quot;,&quot;nsVerticalKdomainList&quot;:[],&quot;wiseExposureAds&quot;:[],&quot;is_rm_asyn&quot;:true,&quot;mod&quot;:&quot;&quot;,&quot;app_verison&quot;:&quot;&quot;,&quot;os_version&quot;:&quot;&quot;,&quot;bd_version&quot;:&quot;&quot;,&quot;ios_version&quot;:0,&quot;passportId&quot;:0,&quot;hasYunyingCard&quot;:false,&quot;wiseFrom&quot;:&quot;&quot;,&quot;resultClass&quot;:&quot;fc-000000006ff4131f-2327&quot;});\\n        \",\"css\":\"._1eqtk61{border-bottom:0 solid #f5f5f5}._8x9ty64{border-bottom:1px solid #eee;margin:0;padding:0;position:relative}._8x9ty64 h3{font-weight:400;padding:0}._8x9ty64 a{text-decoration:none}._8x9ty64 em{color:#3066b4;font-style:normal}._8x9ty64:last-child{border-bottom:0}._1n8n23c{margin:0}.b47yy3h{padding-top:0}._8x9ty64{background-color:#fafbfc;border-left:1px solid #e5e5e5;font-family:PingFangSC-Medium,Helvetica Neue,Helvetica,Arial,sans-serif}._8x9ty64,._8x9ty64:last-child{border-bottom:1px solid #e5e5e5}.ghmaff1{margin-bottom:15px}._2cj3g78{margin-bottom:10px}.edshq5u{margin-top:15px}._4skftda,.pe5wcz2{margin-top:10px}.ugaqg4d{align-items:center;display:flex;height:100%}.km5nyww{margin-bottom:15px}._9s8xgss{margin-top:15px}.ghmaff1+.pe5wcz2{margin-top:-5px}.bh9veya{float:right;width:74px}.tumcbnr{float:left;margin-top:19px;width:130px}.fjyf1br{background-color:#fff;margin-left:130px;padding:25px 0 8px 20px}.fjyf1br:hover{background-color:transparent}body a.hdyqnku,body div.hdyqnku{color:#000;display:block;font-family:Arial,Helvetica,sans-serif;font-size:20px;font-weight:400;line-height:30px;margin:0;padding-top:0;text-decoration:none;transform:translateY(.25em)}body a.hdyqnku:before,body div.hdyqnku:before{content:&quot;&quot;;display:block;height:0;margin-top:-10px}a.hdyqnku div{word-break:break-all}.v3zrcrj{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.q1dpns8{-webkit-line-clamp:2}.ndfxdqz,.q1dpns8{word-wrap:break-word;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden;word-break:break-all}.ndfxdqz{-webkit-line-clamp:3}._7qtpw9j{-webkit-line-clamp:4}._2dt35k2,._7qtpw9j{word-wrap:break-word;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden;word-break:break-all}._2dt35k2{-webkit-line-clamp:5}._1r3uysh{-webkit-line-clamp:10}._1r3uysh,.yux2cc6{word-wrap:break-word;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden;word-break:break-all}.yux2cc6{-webkit-line-clamp:12}._4bxpxs9{-webkit-line-clamp:18;word-wrap:break-word;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden;word-break:break-all}body ._9cy84ta{color:#999;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:22px;padding-top:0;position:relative;transform:translateY(.4666666667em)}body ._9cy84ta:before{content:&quot;&quot;;display:block;height:0;margin-top:-10px}body ._9cy84ta a{color:#999;display:block}body ._9cy84ta a .j4rc4ke{color:#999}body ._9cy84ta button{background:#fff;border:1px solid;border-radius:3px;bottom:0;color:#38f;float:right;font-size:12px;line-height:12px;padding:7px 13px;position:absolute;right:0}body ._9cy84ta ._3cyr2tj{margin-left:5px}body ._9cy84ta .wwhy5qm{border:1px solid #eee;border-radius:50%;display:inline-block;height:22px;line-height:0;margin-right:7px;margin-top:-2px;vertical-align:middle;width:22px}body ._9cy84ta .q76dsk8{margin-right:8px}.tbmu64u{position:absolute;right:0}._5kn8sv5{-webkit-box-orient:horizontal;-webkit-box-align:stretch;-webkit-align-content:flex-start;-webkit-align-items:stretch;display:-webkit-flex;-webkit-flex-wrap:nowrap;-webkit-justify-content:space-between;width:auto}.z8bq2t7{flex:1}body ._9cy84ta a.mk8dv2x,body ._9cy84ta div.mk8dv2x{display:flex;justify-content:space-between}body ._9cy84ta{font-family:PingFangSC-Medium,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:1;margin-right:13px;text-align:right;transform:none}.qqvbase,body ._9cy84ta .shjuuby{display:inline-block}.qqvbase{margin-left:12px;margin-right:2px;vertical-align:middle;width:64px}._6kd2k9z{display:inline-block}._9fe13qw{background:#f5f5f5;border-radius:4px;color:#3066b4;font-size:14px;height:28px;line-height:28px;overflow:hidden;padding:0 8px;text-overflow:ellipsis;white-space:nowrap}._2jze4xh{display:inline-block;width:100%}._9zhq8sa{display:block}._9fe13qw i,._9fe13qw img{margin-right:5px}._9fe13qw img{display:block;float:left;height:16px;margin-top:6px;width:16px}.e5xahd5 i{margin-right:5px}.c91q684{color:#33cc75}.e8eykyd{color:#00c8c8}._9fe13qw{background-color:#fff;border:1px solid #3066b4;border-radius:2px;font-family:PingFangSC-Regular,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:12px;height:26px;line-height:26px;padding:0;text-align:center}._94sn3jw{margin-left:4px}._47q9e4t{margin-left:0}body ._7dx78mp{font-size:14px;line-height:24px;padding-top:0;transform:translateY(.3571428571em)}body ._7dx78mp:before{content:&quot;&quot;;display:block;height:0;margin-top:-10px}body ._7dx78mp a,body ._7dx78mp div{color:#3066b4}body ._7dx78mp ._1d7gc64{color:#999;font-size:15px;line-height:25px}body ._7dx78mp .erq8uj7{margin-right:5px}body ._7dx78mp{padding-right:20px}body ._7dx78mp .uq8p2c4{max-height:75px}._7kjxh8t{padding-bottom:100%}.xtq5v37{padding-bottom:133.33333333%}.uwucu2h{padding-bottom:33.3333333333%}._3zt36qa{padding-bottom:56.25%}.y7m392e{padding-bottom:50%}.ajthcgk{padding-bottom:75%}.pvkf2b2{padding-bottom:66.66666667%}.d94ksm9{padding-bottom:40%}._5dc27n3{background-position:50%;background-repeat:no-repeat;background-size:cover}._3zt36qa,._7kjxh8t,.ajthcgk,.d94ksm9,.pvkf2b2,.uwucu2h,.xtq5v37,.y7m392e{height:0;overflow:hidden}._3zt36qa img,._7kjxh8t img,.ajthcgk img,.d94ksm9 img,.pvkf2b2 img,.uwucu2h img,.xtq5v37 img,.y7m392e img{width:100%}.s6zxc2c{border-radius:9px}.r1n7ehc{border-top-left-radius:0}.ruyfyqy{border-top-right-radius:0}.x17vnj2{border-bottom-right-radius:0}._5k9skk2{border-bottom-left-radius:0}.dz8whjw{color:#333;font-size:14px;line-height:24px;margin-top:2px}._32jnwrs{color:#f60;font-size:14px;line-height:22px;margin:5px 0;vertical-align:middle}.na9zhar{position:relative}.nb41sx9{background:radial-gradient(transparent 50%,rgba(0,0,0,.05) 100%);height:100%;left:0;position:absolute;top:0;transform:translateZ(0);width:100%}.s6zxc2c .nb41sx9{border-radius:9px}.r1n7ehc .nb41sx9{border-top-left-radius:0}.ruyfyqy .nb41sx9{border-top-right-radius:0}.x17vnj2 .nb41sx9{border-bottom-right-radius:0}._5k9skk2 .nb41sx9{border-bottom-left-radius:0}.na9zhar img{border:none}body .zz8sa9f{display:flex;font-size:0;overflow:hidden}body .bhz4zux{margin-right:8px;max-width:35px;min-width:35px;vertical-align:top}body ._2md9tzv{background:url(\\/\\/nv00.cdn.bcebos.com\\/nv01\\/static\\/ecom\\/img\\/pc\\/head-img-535c333798.png) no-repeat 50%;background-size:100% 100%;height:100%;width:100%}body .tnf86n6{height:35px;min-width:0}body .ruezuqm{color:#000;font-size:16px;font-weight:inherit;margin-bottom:8px;text-overflow:ellipsis;white-space:nowrap}body ._2gtkx1q{color:#999;font-size:12px;line-height:1}body .zz8sa9f .br54c5r img{width:100%}body .zz8sa9f{display:block}body .bhz4zux{border:1px solid #ccc;height:80px;margin:0 17px;max-width:80px;min-width:80px;padding:3px;width:80px}body .tnf86n6{display:block;height:auto}body .ruezuqm{color:#2d64b3;font-size:12px;height:12px;line-height:1;margin-top:24px;overflow:hidden;text-align:center;word-break:break-all}\",\"data_list\":{\"3\":\"&lt;div&gt;&lt;div class=&quot;_1eqtk61&quot;&gt;&lt;div&gt;&lt;div class=&quot;_8x9ty64 fc-000000006ff4131f-2327 _8x9ty64&quot; data-cegduid=&quot;&quot; data-lp=&quot;https%3A%2F%2Fb2b.baidu.com%2Faitf%2Fs%3Fq%3D%25E8%258B%258F%25E5%25B7%259E%25E6%25B1%25BD%25E8%25BD%25A6%25E7%25A7%259F%25E8%25B5%2581%26from%3Dsearch%26fid%3D604714779%26styl%3Db%26sid%3D1510132%26a_keywordid%3D%7Bkeywordid%7D%26a_unitid%3D%7Bunitid%7D%26a_planid%3D%7Bplanid%7D&quot; data-change-wise-baozhang-text=&quot;true&quot; data-rank=&quot;0&quot; data-nvk=&quot;Tv-b5HD3P16zPWmvPHR0mvYqnHmzP6Kzmy4o5HD0ThNkIjYkP1czrHmdPjT3rjT10A-s5HnvnjfLPjR1rHb0Iv-8uhtqPW0dPHfLnjT3rH6z&quot; data-extra=&quot;&quot; data-ecimtimesign=&quot;108&quot; data-srcid=&quot;2327&quot; data-placeid=&quot;2327&quot; data-cmatchid=&quot;1626&quot; data-general-xst=&quot;m1YKmWYsnDRdnH61nbNjPbwKfHKDnHK7nRnsPWb4f1N7PWmLn0715HD3P16zPWmvPHNxnHmzP-ts0gTqzqgyLTUe_egg3_ZX0gDq1xWZtoxMdnmKIHY1nHb4nHm3ns7Y5HDLnWc4PWRYP16KUgDqnfcs0VxB_eRKmv6quhPxTAnKTMfqn0D1PH0LP1bLnjmL&quot; data-appinfo=&quot;0_2000000000_1_1&quot; data-tradeid=&quot;&quot; data-show-card-top=&quot;0&quot; data-bidword=&quot;&quot; data-ecr-async-infos=&quot;&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;div class=&quot;tumcbnr tumcbnr&quot;&gt;&lt;div&gt;&lt;a class=&quot;zz8sa9f&quot; href=&quot;http:\\/\\/www.baidu.com\\/baidu.php?url=af0000KpxzUee8WytKujPIpl05C_G70Z_GA_P5FkAyo16E_gY6Jauyw5jZN1ztXRWPi6x2IQc-HkgXS2vvsudUYnINDFSSQEIHNE5ggCcOe05ha7mY-EPnff2cJgl6_u5loRTTtCQ7ORVcyViAk_axuoe442ZyAgGXOoZKDc6RUm6sxCrOa4w90ziKZ_5sPlPHfeyIFJ0AGZEekDvb3quHygBmup.7R_NR2Ar5Od66EzgSNerQ0BK-qjgKZLqWAZ1vmIMo9vxgj4e_5o33IOM9tSMjld3xg4mx5u9qx-9qEH9tOZjexZjES8Z1vmxgI9vNqIT1VQDpyuCp88EDkYvIMWgvX5WElkYP77BOoZBmoLNvNtTMNM-eRlrKYdvFWG_LU81k_tIhOubl_t8aFqjDk_3tILZkzXPMZJ1z3lQnyFWWuE_ooLeVOySe-SWDk7SOYOohzsOwSUqEHISUtVjVOPSLjqAJEklcELecqNxKYxhoOdkOhzqPL4EvqxuPSOOolltHDgeOHS8UQjqZ4EvqPL4EzYrLtLeT5YpJO-d9JmerVqLQxYwYA5Pe5O6ObI8eO_xenI---MO6kOSjGSgz_9BOBRU57-OHk_______OxdTgHgyyyyyyyyyyyyf4UcSjqOOgv1um8Z6OdkxwsxQkOtDgzdq_gzOdq8881lFELtSgtLSEOgqZ4EvOYcOusO-ItEd5kexSkOw_Ot7-----IO3Otj6SN--MO6qEdYXx_OU_____dvpVIbgjePyWqxlZSzM-HJdTXgSwOs51OxveqMSzevOBhpletx1OSjqXxSW3OBeO6XEU4e2OSQeqZoZqS1C3mElrWqiQOuoOejEzqZQSpolrZter1-4p81uYvyyX5qA1lry6GyAp7WW_3e826.U1Yk0ZDq1xWZtoxMdnm0IjLQdIUIkE81VIxBsI30pyYqnHmzP6KdpHY0TA-b5Hf0mv-b5Hb10AFG5HnsnfKhIjYs0ZKC5H00ULnqn0KBI1Ys0A4Y5H00TLCq0ZFMIA7M5H00UMus5H08nj0snj0snj00ugFM5H00IZF9uARqn0KBuA-b5H0swHRkrjnzwRnvwD7KnDfknDRkf10vrH-jPRRvPWTs0AwWmvfq0A71gv-bm1dsTzd8p6KM5gI1UMn0UL0k5H00TZ0Y5H00TMfqPWTY0Z7spyfqn0Kkmv-b5H00mycqn7ts0ZKs5H00Ugws5H00uAwETjYk0ZFJ5H00IZN15HD4PHmsrHbzP1bYrH61PHnLrj00mynqnfKsUWYs0ZK9I7qhUA7M5H00TyILujYs0AN1IjYs0ANYpyfqQHD0mgPsmvnqn0KdTA-8mvnqn0KhmLNY5H00mywhUA7M5HD0IvuzUvYq0AFY5H00XZPYIHY1nHb4nHm3nsKzug7Y5HDLnWc4PWRYP163P1n0Tv-b5H0snj0snj0sPhuhPjD1nym0ULfqn0KETMKY5H0WnaPDw-fWnansc10Wna3sc10WwDuRc10WwDuRc108nj0snj0sc1D8nj0snj0sc10WnansQW0snj0snansc10Wnansc100TMw9pyfq0AVG5H00UgfqnWfkn7tznjRk0AdW5HKxnW0dnfKVmdqhThqV5HKxn0Kbmy4dmhNxTAk9Uh-bT1Ysg100mywkXHLg3ord0A7bTgfqn0KGTvP_5H00TydY5H00mywxTvqdThP-5H0WpAqYgLIEThfW0APzm1YYnH0Yr0&amp;us=newvui&amp;xst=m1YKmWYsnDRdnH61nbNjPbwKfHKDnHK7nRnsPWb4f1N7PWmLn0715HD3P16zPWmvPHNxnHmzP-ts0gTqzqgyLTUe_egg3_ZX0gDq1xWZtoxMdnmKIHY1nHb4nHm3ns7Y5HDLnWc4PWRYP16KUgDqnfcs0VxB_eRKmv6quhPxTAnKTMfqn0D1PH0LP1bLnjmL&amp;ai=0_2000000000_1_1&amp;word=&quot; target=&quot;_blank&quot;&gt;&lt;div class=&quot;bhz4zux&quot;&gt; &lt;div class=&quot;_2md9tzv&quot;&gt;&lt;\\/div&gt;&lt;\\/div&gt;&lt;div class=&quot;tnf86n6&quot;&gt;&lt;div class=&quot;ruezuqm&quot;&gt;\\u767e\\u5ea6\\u7231\\u91c7\\u8d2d&lt;\\/div&gt;&lt;\\/div&gt;&lt;\\/a&gt;&lt;\\/div&gt;&lt;\\/div&gt;&lt;div class=&quot;fjyf1br fjyf1br&quot;&gt;&lt;div style=&quot;margin-bottom: 12px;&quot;&gt;&lt;div class=&quot;_7dx78mp&quot;&gt;&lt;a href=&quot;http:\\/\\/www.baidu.com\\/baidu.php?url=af0000KpxzUee8WytKujPIpl05C_G70Z_GA_P5FkAyo16E_gY6Jauyw5jZN1ztXRWPi6x2IQc-HkgXS2vvsudUYnINDFSSQEIHNE5ggCcOe05ha7mY-EPnff2cJgl6_u5loRTTtCQ7ORVcyViAk_axuoe442ZyAgGXOoZKDc6RUm6sxCrOa4w90ziKZ_5sPlPHfeyIFJ0AGZEekDvb3quHygBmup.7R_NR2Ar5Od66EzgSNerQ0BK-qjgKZLqWAZ1vmIMo9vxgj4e_5o33IOM9tSMjld3xg4mx5u9qx-9qEH9tOZjexZjES8Z1vmxgI9vNqIT1VQDpyuCp88EDkYvIMWgvX5WElkYP77BOoZBmoLNvNtTMNM-eRlrKYdvFWG_LU81k_tIhOubl_t8aFqjDk_3tILZkzXPMZJ1z3lQnyFWWuE_ooLeVOySe-SWDk7SOYOohzsOwSUqEHISUtVjVOPSLjqAJEklcELecqNxKYxhoOdkOhzqPL4EvqxuPSOOolltHDgeOHS8UQjqZ4EvqPL4EzYrLtLeT5YpJO-d9JmerVqLQxYwYA5Pe5O6ObI8eO_xenI---MO6kOSjGSgz_9BOBRU57-OHk_______OxdTgHgyyyyyyyyyyyyf4UcSjqOOgv1um8Z6OdkxwsxQkOtDgzdq_gzOdq8881lFELtSgtLSEOgqZ4EvOYcOusO-ItEd5kexSkOw_Ot7-----IO3Otj6SN--MO6qEdYXx_OU_____dvpVIbgjePyWqxlZSzM-HJdTXgSwOs51OxveqMSzevOBhpletx1OSjqXxSW3OBeO6XEU4e2OSQeqZoZqS1C3mElrWqiQOuoOejEzqZQSpolrZter1-4p81uYvyyX5qA1lry6GyAp7WW_3e826.U1Yk0ZDq1xWZtoxMdnm0IjLQdIUIkE81VIxBsI30pyYqnHmzP6KdpHY0TA-b5Hf0mv-b5Hb10AFG5HnsnfKhIjYs0ZKC5H00ULnqn0KBI1Ys0A4Y5H00TLCq0ZFMIA7M5H00UMus5H08nj0snj0snj00ugFM5H00IZF9uARqn0KBuA-b5H0swHRkrjnzwRnvwD7KnDfknDRkf10vrH-jPRRvPWTs0AwWmvfq0A71gv-bm1dsTzd8p6KM5gI1UMn0UL0k5H00TZ0Y5H00TMfqPWTY0Z7spyfqn0Kkmv-b5H00mycqn7ts0ZKs5H00Ugws5H00uAwETjYk0ZFJ5H00IZN15HD4PHmsrHbzP1bYrH61PHnLrj00mynqnfKsUWYs0ZK9I7qhUA7M5H00TyILujYs0AN1IjYs0ANYpyfqQHD0mgPsmvnqn0KdTA-8mvnqn0KhmLNY5H00mywhUA7M5HD0IvuzUvYq0AFY5H00XZPYIHY1nHb4nHm3nsKzug7Y5HDLnWc4PWRYP163P1n0Tv-b5H0snj0snj0sPhuhPjD1nym0ULfqn0KETMKY5H0WnaPDw-fWnansc10Wna3sc10WwDuRc10WwDuRc108nj0snj0sc1D8nj0snj0sc10WnansQW0snj0snansc10Wnansc100TMw9pyfq0AVG5H00UgfqnWfkn7tznjRk0AdW5HKxnW0dnfKVmdqhThqV5HKxn0Kbmy4dmhNxTAk9Uh-bT1Ysg100mywkXHLg3ord0A7bTgfqn0KGTvP_5H00TydY5H00mywxTvqdThP-5H0WpAqYgLIEThfW0APzm1YYnH0Yr0&amp;us=newvui&amp;xst=m1YKmWYsnDRdnH61nbNjPbwKfHKDnHK7nRnsPWb4f1N7PWmLn0715HD3P16zPWmvPHNxnHmzP-ts0gTqzqgyLTUe_egg3_ZX0gDq1xWZtoxMdnmKIHY1nHb4nHm3ns7Y5HDLnWc4PWRYP16KUgDqnfcs0VxB_eRKmv6quhPxTAnKTMfqn0D1PH0LP1bLnjmL&amp;ai=0_2000000000_1_1&amp;word=&quot; target=&quot;_blank&quot;&gt;&lt;div class=&quot;ndfxdqz ec_desc uq8p2c4&quot;&gt;&lt;span&gt;\\u767e\\u5ea6\\u7231\\u91c7\\u8d2d\\u4e3a\\u4f60\\u4f18\\u9009\\u6d77\\u91cf\\u6c7d\\u8f66\\u79df\\u8d41\\u70ed\\u9500\\u8d27\\u6e90\\uff0c\\u652f\\u6301\\u5728\\u7ebf\\u9009\\u8d2d\\uff0c\\u5b9e\\u65f6\\u8be2\\u4ef7\\u3002\\u6279\\u53d1\\u9009\\u8d2d\\u6c7d\\u8f66\\u79df\\u8d41\\uff0c\\u4e0a\\u767e\\u5ea6\\u7231\\u91c7\\u8d2d\\u6c7d\\u8f66\\u79df\\u8d41\\u4e13\\u9898\\u9875\\u3002&lt;\\/span&gt;&lt;\\/div&gt;&lt;\\/a&gt;&lt;\\/div&gt;&lt;\\/div&gt;&lt;div style=&quot;margin-bottom: 24px; width: 310px;&quot;&gt;&lt;a href=&quot;http:\\/\\/www.baidu.com\\/baidu.php?url=af0000KpxzUee8WytKujPIpl05C_G70Z_GA_P5FkAyo16E_gY6Jauyw5jZN1ztXRWPi6x2IQc-HkgXS2vvsudUYnINDFSSQEIHNE5ggCcOe05ha7mY-EPnff2cJgl6_u5loRTTtCQ7ORVcyViAk_axuoe442ZyAgGXOoZKDc6RUm6sxCrOa4w90ziKZ_5sPlPHfeyIFJ0AGZEekDvb3quHygBmup.7R_NR2Ar5Od66EzgSNerQ0BK-qjgKZLqWAZ1vmIMo9vxgj4e_5o33IOM9tSMjld3xg4mx5u9qx-9qEH9tOZjexZjES8Z1vmxgI9vNqIT1VQDpyuCp88EDkYvIMWgvX5WElkYP77BOoZBmoLNvNtTMNM-eRlrKYdvFWG_LU81k_tIhOubl_t8aFqjDk_3tILZkzXPMZJ1z3lQnyFWWuE_ooLeVOySe-SWDk7SOYOohzsOwSUqEHISUtVjVOPSLjqAJEklcELecqNxKYxhoOdkOhzqPL4EvqxuPSOOolltHDgeOHS8UQjqZ4EvqPL4EzYrLtLeT5YpJO-d9JmerVqLQxYwYA5Pe5O6ObI8eO_xenI---MO6kOSjGSgz_9BOBRU57-OHk_______OxdTgHgyyyyyyyyyyyyf4UcSjqOOgv1um8Z6OdkxwsxQkOtDgzdq_gzOdq8881lFELtSgtLSEOgqZ4EvOYcOusO-ItEd5kexSkOw_Ot7-----IO3Otj6SN--MO6qEdYXx_OU_____dvpVIbgjePyWqxlZSzM-HJdTXgSwOs51OxveqMSzevOBhpletx1OSjqXxSW3OBeO6XEU4e2OSQeqZoZqS1C3mElrWqiQOuoOejEzqZQSpolrZter1-4p81uYvyyX5qA1lry6GyAp7WW_3e826.U1Yk0ZDq1xWZtoxMdnm0IjLQdIUIkE81VIxBsI30pyYqnHmzP6KdpHY0TA-b5Hf0mv-b5Hb10AFG5HnsnfKhIjYs0ZKC5H00ULnqn0KBI1Ys0A4Y5H00TLCq0ZFMIA7M5H00UMus5H08nj0snj0snj00ugFM5H00IZF9uARqn0KBuA-b5H0swHRkrjnzwRnvwD7KnDfknDRkf10vrH-jPRRvPWTs0AwWmvfq0A71gv-bm1dsTzd8p6KM5gI1UMn0UL0k5H00TZ0Y5H00TMfqPWTY0Z7spyfqn0Kkmv-b5H00mycqn7ts0ZKs5H00Ugws5H00uAwETjYk0ZFJ5H00IZN15HD4PHmsrHbzP1bYrH61PHnLrj00mynqnfKsUWYs0ZK9I7qhUA7M5H00TyILujYs0AN1IjYs0ANYpyfqQHD0mgPsmvnqn0KdTA-8mvnqn0KhmLNY5H00mywhUA7M5HD0IvuzUvYq0AFY5H00XZPYIHY1nHb4nHm3nsKzug7Y5HDLnWc4PWRYP163P1n0Tv-b5H0snj0snj0sPhuhPjD1nym0ULfqn0KETMKY5H0WnaPDw-fWnansc10Wna3sc10WwDuRc10WwDuRc108nj0snj0sc1D8nj0snj0sc10WnansQW0snj0snansc10Wnansc100TMw9pyfq0AVG5H00UgfqnWfkn7tznjRk0AdW5HKxnW0dnfKVmdqhThqV5HKxn0Kbmy4dmhNxTAk9Uh-bT1Ysg100mywkXHLg3ord0A7bTgfqn0KGTvP_5H00TydY5H00mywxTvqdThP-5H0WpAqYgLIEThfW0APzm1YYnH0Yr0&amp;us=newvui&amp;xst=m1YKmWYsnDRdnH61nbNjPbwKfHKDnHK7nRnsPWb4f1N7PWmLn0715HD3P16zPWmvPHNxnHmzP-ts0gTqzqgyLTUe_egg3_ZX0gDq1xWZtoxMdnmKIHY1nHb4nHm3ns7Y5HDLnWc4PWRYP16KUgDqnfcs0VxB_eRKmv6quhPxTAnKTMfqn0D1PH0LP1bLnjmL&amp;ai=0_2000000000_1_1&amp;word=&quot; target=&quot;_blank&quot;&gt;&lt;div class=&quot;_5dc27n3 r1n7ehc ruyfyqy x17vnj2 _5k9skk2 _3zt36qa na9zhar ec-img&quot;&gt;&lt;img src=&quot;https:\\/\\/ns-strategy.cdn.bcebos.com\\/ns-strategy\\/upload\\/fc_big_pic\\/part-00564-1575.jpg&quot;\\/&gt;&lt;div class=&quot;nb41sx9&quot;&gt;&lt;\\/div&gt;&lt;\\/div&gt;&lt;\\/a&gt;&lt;\\/div&gt;&lt;div&gt;&lt;div class=&quot;_9cy84ta&quot;&gt;&lt;div class=&quot;v3zrcrj&quot;&gt;&lt;span&gt;2024-08-07 01:31&lt;\\/span&gt;&lt;span class=&quot;j4rc4ke&quot;&gt;&lt;span class=&quot;ec-tuiguang ecfc-tuiguang _94sn3jw&quot;&gt;\\u5e7f\\u544a&lt;\\/span&gt;&lt;\\/span&gt;&lt;span class=&quot;qqvbase&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;a href=&quot;http:\\/\\/www.baidu.com\\/baidu.php?url=af0000KpxzUee8WytKujPIpl05C_G70Z_GA_P5FkAyo16E_gY6Jauyw5jZN1ztXRWPi6x2IQc-HkgXS2vvsudUYnINDFSSQEIHNE5ggCcOe05ha7mY-EPnff2cJgl6_u5loRTTtCQ7ORVcyViAk_axuoe442ZyAgGXOoZKDc6RUm6sxCrOa4w90ziKZ_5sPlPHfeyIFJ0AGZEekDvb3quHygBmup.7R_NR2Ar5Od66EzgSNerQ0BK-qjgKZLqWAZ1vmIMo9vxgj4e_5o33IOM9tSMjld3xg4mx5u9qx-9qEH9tOZjexZjES8Z1vmxgI9vNqIT1VQDpyuCp88EDkYvIMWgvX5WElkYP77BOoZBmoLNvNtTMNM-eRlrKYdvFWG_LU81k_tIhOubl_t8aFqjDk_3tILZkzXPMZJ1z3lQnyFWWuE_ooLeVOySe-SWDk7SOYOohzsOwSUqEHISUtVjVOPSLjqAJEklcELecqNxKYxhoOdkOhzqPL4EvqxuPSOOolltHDgeOHS8UQjqZ4EvqPL4EzYrLtLeT5YpJO-d9JmerVqLQxYwYA5Pe5O6ObI8eO_xenI---MO6kOSjGSgz_9BOBRU57-OHk_______OxdTgHgyyyyyyyyyyyyf4UcSjqOOgv1um8Z6OdkxwsxQkOtDgzdq_gzOdq8881lFELtSgtLSEOgqZ4EvOYcOusO-ItEd5kexSkOw_Ot7-----IO3Otj6SN--MO6qEdYXx_OU_____dvpVIbgjePyWqxlZSzM-HJdTXgSwOs51OxveqMSzevOBhpletx1OSjqXxSW3OBeO6XEU4e2OSQeqZoZqS1C3mElrWqiQOuoOejEzqZQSpolrZter1-4p81uYvyyX5qA1lry6GyAp7WW_3e826.U1Yk0ZDq1xWZtoxMdnm0IjLQdIUIkE81VIxBsI30pyYqnHmzP6KdpHY0TA-b5Hf0mv-b5Hb10AFG5HnsnfKhIjYs0ZKC5H00ULnqn0KBI1Ys0A4Y5H00TLCq0ZFMIA7M5H00UMus5H08nj0snj0snj00ugFM5H00IZF9uARqn0KBuA-b5H0swHRkrjnzwRnvwD7KnDfknDRkf10vrH-jPRRvPWTs0AwWmvfq0A71gv-bm1dsTzd8p6KM5gI1UMn0UL0k5H00TZ0Y5H00TMfqPWTY0Z7spyfqn0Kkmv-b5H00mycqn7ts0ZKs5H00Ugws5H00uAwETjYk0ZFJ5H00IZN15HD4PHmsrHbzP1bYrH61PHnLrj00mynqnfKsUWYs0ZK9I7qhUA7M5H00TyILujYs0AN1IjYs0ANYpyfqQHD0mgPsmvnqn0KdTA-8mvnqn0KhmLNY5H00mywhUA7M5HD0IvuzUvYq0AFY5H00XZPYIHY1nHb4nHm3nsKzug7Y5HDLnWc4PWRYP163P1n0Tv-b5H0snj0snj0sPhuhPjD1nym0ULfqn0KETMKY5H0WnaPDw-fWnansc10Wna3sc10WwDuRc10WwDuRc108nj0snj0sc1D8nj0snj0sc10WnansQW0snj0snansc10Wnansc100TMw9pyfq0AVG5H00UgfqnWfkn7tznjRk0AdW5HKxnW0dnfKVmdqhThqV5HKxn0Kbmy4dmhNxTAk9Uh-bT1Ysg100mywkXHLg3ord0A7bTgfqn0KGTvP_5H00TydY5H00mywxTvqdThP-5H0WpAqYgLIEThfW0APzm1YYnH0Yr0&amp;us=newvui&amp;xst=m1YKmWYsnDRdnH61nbNjPbwKfHKDnHK7nRnsPWb4f1N7PWmLn0715HD3P16zPWmvPHNxnHmzP-ts0gTqzqgyLTUe_egg3_ZX0gDq1xWZtoxMdnmKIHY1nHb4nHm3ns7Y5HDLnWc4PWRYP16KUgDqnfcs0VxB_eRKmv6quhPxTAnKTMfqn0D1PH0LP1bLnjmL&amp;ai=0_2000000000_1_1&amp;word=&quot; target=&quot;_blank&quot;&gt;&lt;div class=&quot;_9fe13qw _2jze4xh&quot;&gt;&lt;span&gt;\\u7acb\\u5373\\u67e5\\u770b&lt;\\/span&gt;&lt;div&gt;&lt;\\/div&gt;&lt;\\/div&gt;&lt;\\/a&gt;&lt;\\/div&gt;&lt;\\/div&gt;&lt;\\/div&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;\"}}}}]);</script><script>    _.Module.use('user/widget/icon_tip',{ myIcons:[\"starmaster\"] });</script><script>/* 贴子列表*/_.Module.use(\"pb/widget/postList\", [{    \"searchPid\" : \"0\",    \"searchCid\" : \"0\",    \"pn\" : \"1\",    \"game_bar_name\": [\"cf\\u624b\\u6e38\",\"gta5\",\"h1z1\",\"mcbbs\",\"ps4\",\"steam\",\"\\u4e09\\u56fd\\u6740\",\"\\u4e5d\\u5dde\\u5929\\u7a7a\\u57ce\\u624b\\u6e38\",\"\\u5730\\u4e0b\\u57ce\\u4e0e\\u52c7\\u58eb\",\"\\u5929\\u5929\\u72fc\\u4eba\\u6740\",\"\\u5d29\\u574f3rd\",\"\\u6211\\u7684\\u4e16\\u754c\",\"\\u6211\\u7684\\u4e16\\u754cmcbbs\",\"\\u6211\\u7684\\u4e16\\u754cpe\",\"\\u6211\\u7684\\u4e16\\u754c\\u624b\\u673a\\u7248\",\"\\u6211\\u7684\\u4e16\\u754c\\u624b\\u673a\\u7248\\u670d\\u52a1\\u5668\",\"\\u6211\\u7684\\u4e16\\u754c\\u670d\\u52a1\\u5668\",\"\\u6211\\u7684\\u4e16\\u754c\\u718a\\u5b69\\u5b50\",\"\\u6211\\u7684\\u4e16\\u754c\\u7c7d\\u5cb7\",\"\\u6211\\u7684\\u4e16\\u754c\\u8054\\u673a\",\"\\u6218\\u8230\\u8054\\u76df\",\"\\u670d\\u52a1\\u5668\",\"\\u706b\\u5f71\\u5fcd\\u8005\\u624b\\u6e38\",\"\\u7089\\u77f3\\u4f20\\u8bf4\",\"\\u738b\\u8005\\u8363\\u8000\",\"\\u78a7\\u84dd\\u822a\\u7ebf\",\"\\u7a7f\\u8d8a\\u706b\\u7ebf\",\"\\u7f51\\u6613\\u9634\\u9633\\u5e08\",\"\\u795e\\u65e0\\u6708\\u624b\\u6e38\",\"\\u9a6f\\u9f99\\u4e09\\u56fd\",\"\\u77f3\\u5668\\u65f6\\u4ee3\",\"bztest\",\"\\u77f3\\u5668\\u65f6\\u4ee3\\u624b\\u6e38\",\"\\u8ff7\\u4f60\\u4e16\\u754c\",\"\\u7a7f\\u8d8a\\u706b\\u7ebf\\u67aa\\u6218\\u738b\\u8005\",\"\\u7a7f\\u8d8a\\u706b\\u7ebf\\u624b\\u6e38\",\"\\u8ff7\\u4f60\\u4e16\\u754c\\u624b\\u6e38\",\"\\u8ff7\\u4f60\\u4e16\\u754c\",\"\\u5168\\u6c11\\u67aa\\u6218\",\"\\u5929\\u5929\\u9177\\u8dd1\",\"\\u5929\\u5929\\u9177\\u8dd1\\u9001\\u5fc3\",\"\\u738b\\u8005\\u8363\\u8000\\u624b\\u6e38\",\"\\u6211\\u7684\\u4e16\\u754cpe\\u670d\\u52a1\\u5668\",\"\\u9ed1\\u8272\\u73ab\\u7470\",\"\\u5251\\u4e0e\\u5bb6\\u56ed\",\"\\u95ee\\u9053\\u624b\\u6e38\",\"\\u9b54\\u6cd5\\u7981\\u4e66\\u76ee\\u5f55\\u624b\\u6e38\",\"\\u7edd\\u5730\\u6c42\\u751f\",\"dota2\"],    \"isSeeLz\" : \"\",    \"promoterAttr\" : [],    \"promoterUserIds\" : [],    \"promoterMasterTitle\" : '青龙',    \"needPaypostAgree\": 0,    \"maskDays\": null,    \"firstPost\": {\"thread_id\":9119688421,\"post_id\":150726491368,\"content\":\"\\u4e2d\\u56fd\\u961f\\u7b2c22\\u91d1\\uff01\\u65e0\\u60ac\\u5ff5\\uff01<br><img class=\\\"BDE_Image\\\" src=\\\"http:\\/\\/tiebapic.baidu.com\\/forum\\/w%3D580\\/sign=fa4e9202f67eca80120539efa1239712\\/07d6f7de9c82d15884e06d90c60a19d8bd3e4294.jpg?tbpicau=2024-08-18-05_d05a4e18efd81f49f38ed55275a28c4e\\\" size=\\\"616758\\\" changedsize=\\\"true\\\" width=\\\"560\\\" height=\\\"303\\\" size=\\\"616758\\\"><br><img class=\\\"BDE_Image\\\" src=\\\"http:\\/\\/tiebapic.baidu.com\\/forum\\/w%3D580\\/sign=81df64294ad79123e0e0947c9d345917\\/078788bf6c81800a5287bd2ff73533fa838b4794.jpg?tbpicau=2024-08-18-05_bad4bc8570a2a6ca4da65d61a4001daa\\\" size=\\\"550140\\\" changedsize=\\\"true\\\" width=\\\"560\\\" height=\\\"310\\\" size=\\\"550140\\\">\",\"title\":\"\\u3010\\u5f3a\\u70c8\\u606d\\u559c\\u3011\\u5168\\u7ea2\\u5a75\\u9648\\u5b87\\u6c50\\u5305\\u63fd\\u8df3\\u6c34\\u5973\\u5b5010\\u7c73\\u53f0\\u5df4\\u9ece\\u5965\\u8fd0\\u91d1\\u94f6\\u724c\\uff01\",\"word\":\"\\u7f51\\u7403\\u98ce\\u4e91\",\"now_time\":1722953344,\"is_vote\":0,\"forum_id\":4513750,\"sign_id\":0,\"user_id\":1635505954,\"openid\":\"tbclient\",\"thread_type\":0,\"code_type\":385875968,\"from_thread_id\":0,\"ptype\":0,\"ip6\":\"::0\",\"is_post_visible\":0,\"post_no\":1,\"imgWaterInfo\":\"a:0:{}\",\"agree_num\":108,\"v_forum_id\":4513750,\"version\":1722953344421,\"display_switch\":1,\"yunying_flag\":\"1\",\"is_anonym\":false,\"open_type\":\"android\",\"need_bold\":false,\"type\":0,\"vote_crypt\":\"\",\"during_time\":null,\"has_pushed\":0,\"ip_address\":\"\\u798f\\u5efa\"},    \"forum\": {\"forum_name\":\"\\u7f51\\u7403\\u98ce\\u4e91\",\"forum_id\":4513750,\"level_1_name\":\"\\u4f53\\u80b2\",\"level_2_name\":\"\\u7efc\\u5408\\u4f53\\u80b2\",\"managers\":[{\"user\":{\"forum_id\":4513750,\"user_id\":1730664262,\"role_id\":1,\"op_user_id\":3447387038,\"update_time\":1567908325,\"expire_time\":2147483647,\"user_name\":\"\\u65af\\u5fb7\\u54e5\\u5c14\\u6469\\u96ea\\u5c71\",\"user_nickname\":\"\\u65af\\u5fb7\\u54e5\\u5c14\\u6469\\u96ea\\u5c71\",\"user_nickname_v2\":\"\\u7126\\u7cd6\\u739b\\u5947\\u6735\\u2615\",\"role_name\":\"manager\",\"portrait_time\":\"1700160005\"}}],\"fourthmanager\":[],\"forbid_flag\":1,\"background\":{\"bg_id\":1,\"more_bg_open\":0,\"more_bg_types\":0},\"attrs\":{\"bg_color\":\"{&quot;day&quot;:{&quot;common_color&quot;:&quot;4070FF&quot;}}\",\"card_p1\":{\"module_id\":5,\"style_id\":1,\"style_name\":\"{&quot;avatar&quot;:&quot;http:\\/\\/tiebapic.baidu.com\\/forum\\/w%3D120%3Bh%3D120\\/sign=4193c9ec7f01213fcf334ade64dc5eec\\/dcc451da81cb39db7a7e9a6396160924ab18304d.jpg?tbpicau=2024-08-18-05_9e144ae7eb619394f7774773074f33c1&quot;,&quot;slogan&quot;:&quot;\\u4e00\\u7f51\\u60c5\\u6df1\\uff0c\\u6709\\u7403\\u5fc5\\u5e94&quot;,&quot;desc&quot;:&quot;\\u4e2d\\u56fd\\u7f51\\u7403\\u8ff7\\u7684\\u5927\\u578b\\u8d44\\u8baf\\u793e\\u533a\\u3002 \\u7f51\\u7403\\u56db\\u5927\\u6ee1\\u8d2f\\u3001\\u804c\\u4e1a\\u5de1\\u56de\\u8d5b\\u3001\\u4e16\\u754c\\u6311\\u6218\\u8d5b\\u7684\\u8d5b\\u7a0b\\u548c\\u7b7e\\u8868\\u5b89\\u6392\\uff1b\\u7f51\\u575b\\u5404\\u8def\\u7403\\u661f\\u7684\\u5168\\u9762\\u52a8\\u6001\\uff1b\\u4f53\\u575b\\u6700\\u65b0\\u3001\\u6700\\u5168\\u9762\\u7684\\u8981\\u95fb\\u5c55\\u793a\\u3002 \\u7f51\\u7403\\u8ff7\\u3001\\u4f53\\u80b2\\u8ff7\\u5171\\u540c\\u7684\\u5bb6\\u56ed\\u3002&quot;,&quot;desc_rich_text&quot;:&quot;&quot;}\"},\"customlink_p1\":{\"module_id\":1002,\"style_id\":1,\"style_name\":1},\"election\":{\"apply\":\"1567247307\",\"end\":\"1567908000\",\"public\":\"1567648800\",\"status\":\"6\",\"vote\":\"1567476000\"},\"f_share_img\":\"http:\\/\\/tiebapic.baidu.com\\/forum\\/pic\\/item\\/48540923dd54564e344a660bf5de9c82d1584fd1.jpg?tbpicau=2024-08-18-05_4e2fe1cd04f4ce6f2cd62ff6f59f02f6\",\"forum_grade\":{\"grade\":3,\"op_time\":1698970243},\"forum_live\":[{\"end_time\":\"1722841560\",\"extra_info\":{\"is_new\":1,\"live_launch_type\":\"2\",\"show_client_type\":0},\"operator_flag\":0,\"show_filter\":\"000\",\"start_time\":\"1721993400\",\"task_id\":\"1531694\",\"thread_id\":\"9105072975\",\"type\":1}],\"has_activityhead\":{\"has_act\":1},\"has_thread_album\":1,\"head_pic\":\"{&quot;img_url&quot;:&quot;http:\\/\\/tiebapic.baidu.com\\/forum\\/pic\\/item\\/0fb30f2442a7d933ae97ef46eb4bd11373f001c3.jpg?tbpicau=2024-08-18-05_e2b07830f873e0005e62d0d7965c696b&quot;,&quot;type&quot;:1}\",\"head_pic_bg_color\":\"{&quot;original_color&quot;:{&quot;hex&quot;:&quot;1891CD&quot;,&quot;hsb&quot;:{&quot;h&quot;:199,&quot;s&quot;:88,&quot;b&quot;:80}}}\",\"helper_info\":\"{&quot;name&quot;:&quot;\\\\u98ce\\\\u4e91\\\\u5427\\\\u5927\\\\u7ba1\\\\u5bb6&quot;,&quot;avatar_url&quot;:&quot;https:\\\\\\/\\\\\\/tiebapic.baidu.com\\\\\\/forum\\\\\\/w%3D120%3Bh%3D120\\\\\\/sign=4193c9ec7f01213fcf334ade64dc5eec\\\\\\/dcc451da81cb39db7a7e9a6396160924ab18304d.jpg?tbpicau=2024-05-22-02_b20bf9b9c974bd23d0192c94662c06da&quot;}\",\"is_smart_frs_forum\":1,\"photo_p1\":{\"module_id\":99,\"style_id\":1,\"style_name\":\"photo\"},\"pushinfo\":{\"description\":\"\\u672c\\u5427\\u70ed\\u5e16: 1-\\u3010\\u6c14\\u6655\\u3011\\u7f8e\\u56fd\\u5973\\u6392\\u8d62\\u6ce2\\u5170\\u5973\\u6392\\u8fdb\\u56db\\u5f3a\\u4e86 2-[807]\\u660e\\u5929807\\u51b2\\u91d1\\u70b9\\u4e0d\\u5c11\\uff0c\\u4e3e\\u91cd\\u5f00\\u59cb\\u4e86 3-\\u3010\\u3011\\u62ff\\u6f58\\u5c55\\u4e50\\u538b\\u90d1\\u94a6\\u6587\\u7684\\u90a3\\u4e2a\\u4e50\\u8272\\u80fd\\u4e0d\\u80fd\\u6eda\\u51fa\\u8fd9\\u91cc\\u5440\\uff1f 4-\\u3010\\u7f8e\\u56fd\\u3011\\u8fd9\\u6b21\\u770b\\u6765\\u5bf9\\u4e09\\u5927\\u7403\\u8981\\u5927\\u5305\\u5927\\u63fd 5-\\u3010\\u63d0\\u95ee\\u3011\\u6211\\u56fd\\u6709\\u54ea\\u4f4d\\u8fd0\\u52a8\\u5458\\u516c\\u5f00\\u70ae\\u8f70\\u56fd\\u5bb6\\u961f\\u7684\\u5417\\uff1f 6-\\u3010\\u4e2d\\u56fd\\u519b\\u56e2\\u3011\\u5df4\\u9ece\\u5965\\u8fd0\\u4f1a\\u5956\\u724c\\u699c 7-\\u3010\\u5168\\u4f53\\u5427\\u53cb\\u3011 8-\\u3010\\u6ce2\\u5170\\u6bd4\\u60f3\\u8c61\\u4e2d\\u8fd8\\u8981\\u5dee\\u3011\\u7ed3\\u679c\\u7edd\\u4e16\\u597d\\u7b7e\\u7adf\\u7136\\u88ab\\u5c0f\\u7ec4\\u7b2c\\u4e8c\\u7f8e\\u56fd\\u62ff\\u8d70\\uff01\",\"keywords\":\"\\u7f51\\u7403\\u98ce\\u4e91,\\u7efc\\u5408\\u4f53\\u80b2,\\u4f53\\u80b2\",\"tag_title\":\"\\u7f51\\u7403\\u98ce\\u4e91\\u5427-\\u767e\\u5ea6\\u8d34\\u5427--\\u4e00\\u7f51\\u60c5\\u6df1\\uff0c\\u6709\\u7403\\u5fc5\\u5e94--\\u4e2d\\u56fd\\u7f51\\u7403\\u8ff7\\u7684\\u5927\\u578b\\u8d44\\u8baf\\u793e\\u533a\\u3002 \\u7f51\\u7403\\u56db\\u5927\\u6ee1\\u8d2f\\u3001\\u804c\\u4e1a\\u5de1\\u56de\\u8d5b\\u3001\\u4e16\\u754c\\u6311\\u6218\\u8d5b\\u7684\\u8d5b\\u7a0b\\u548c\\u7b7e\\u8868\\u5b89\\u6392\\uff1b\\u7f51\\u575b\\u5404\\u8def\\u7403\\u661f\\u7684\\u5168\\u9762\\u52a8\\u6001\\uff1b\\u4f53\\u575b\\u6700\\u65b0\\u3001\\u6700\\u5168\\u9762\\u7684\\u8981\\u95fb\\u5c55\\u793a\\u3002 \\u7f51\\u7403\\u8ff7\\u3001\\u4f53\\u80b2\\u8ff7\\u5171\\u540c\\u7684\\u5bb6\"},\"smart_frs_user_percent\":100,\"tabs_info\":{\"display_info\":{\"1\":{\"tab_id\":\"2605554\",\"tab_name\":\"WTA\"},\"2\":{\"tab_id\":\"2605555\",\"tab_name\":\"ATP\"},\"3\":{\"tab_id\":\"2605556\",\"tab_name\":\"\\u7ecf\\u5178\\u56de\\u987e\"},\"4\":{\"tab_id\":\"2605558\",\"tab_name\":\"\\u79d1\\u666e\"},\"5\":{\"tab_id\":\"2675554\",\"tab_name\":\"\\u4f53\\u575b\\u98ce\\u4e91\"},\"6\":{\"tab_id\":\"2605562\",\"tab_name\":\"\\u5427\\u52a1\\u5de5\\u4f5c\"}},\"tab_info\":{\"2605554\":{\"create_time\":\"1676254949\",\"create_uid\":\"1730664262\",\"forum_id\":\"4513750\",\"id\":\"2605554\",\"inner_sort\":\"1\",\"last_op_time\":\"0\",\"last_op_uid\":\"0\",\"status\":\"exist\",\"tab_name\":\"WTA\",\"tab_type\":\"0\"},\"2605555\":{\"create_time\":\"1676254957\",\"create_uid\":\"1730664262\",\"forum_id\":\"4513750\",\"id\":\"2605555\",\"inner_sort\":\"2\",\"last_op_time\":\"0\",\"last_op_uid\":\"0\",\"status\":\"exist\",\"tab_name\":\"ATP\",\"tab_type\":\"0\"},\"2605556\":{\"create_time\":\"1676254970\",\"create_uid\":\"1730664262\",\"forum_id\":\"4513750\",\"id\":\"2605556\",\"inner_sort\":\"3\",\"last_op_time\":\"0\",\"last_op_uid\":\"0\",\"status\":\"exist\",\"tab_name\":\"\\u7ecf\\u5178\\u56de\\u987e\",\"tab_type\":\"0\"},\"2605558\":{\"create_time\":\"1676254988\",\"create_uid\":\"1730664262\",\"forum_id\":\"4513750\",\"id\":\"2605558\",\"inner_sort\":\"4\",\"last_op_time\":\"0\",\"last_op_uid\":\"0\",\"status\":\"exist\",\"tab_name\":\"\\u79d1\\u666e\",\"tab_type\":\"0\"},\"2605562\":{\"create_time\":\"1676255016\",\"create_uid\":\"1730664262\",\"forum_id\":\"4513750\",\"id\":\"2605562\",\"inner_sort\":\"6\",\"last_op_time\":\"1681666295\",\"last_op_uid\":\"1730664262\",\"status\":\"exist\",\"tab_name\":\"\\u5427\\u52a1\\u5de5\\u4f5c\",\"tab_type\":\"0\"},\"2675554\":{\"create_time\":\"1679074371\",\"create_uid\":\"1730664262\",\"forum_id\":\"4513750\",\"id\":\"2675554\",\"inner_sort\":\"5\",\"last_op_time\":\"1701484067\",\"last_op_uid\":\"1730664262\",\"status\":\"exist\",\"tab_name\":\"\\u4f53\\u575b\\u98ce\\u4e91\",\"tab_type\":\"0\"}}},\"theme_color\":\"{&quot;day&quot;:{&quot;light_color&quot;:&quot;272228&quot;,&quot;dark_color&quot;:&quot;1D1A1E&quot;,&quot;common_color&quot;:&quot;201C21&quot;,&quot;font_color&quot;:&quot;201C21&quot;},&quot;night&quot;:{&quot;light_color&quot;:&quot;272228&quot;,&quot;dark_color&quot;:&quot;1D1A1E&quot;,&quot;common_color&quot;:&quot;201C21&quot;,&quot;font_color&quot;:&quot;D3D3D3&quot;},&quot;dark&quot;:{&quot;light_color&quot;:&quot;272228&quot;,&quot;dark_color&quot;:&quot;1D1A1E&quot;,&quot;common_color&quot;:&quot;201C21&quot;,&quot;font_color&quot;:&quot;EAEAEA&quot;},&quot;original_color&quot;:{&quot;hex&quot;:&quot;201C21&quot;,&quot;hsb&quot;:{&quot;h&quot;:288,&quot;s&quot;:15,&quot;b&quot;:12}}}\",\"toutu\":{\"module_id\":100,\"style_id\":100,\"style_name\":\"{&quot;avatar&quot;:&quot;https:\\/\\/tiebapic.baidu.com\\/forum\\/pic\\/item\\/b7fd5266d01609245f7132cc910735fae7cd3495.jpg?tbpicau=2024-08-18-05_60358e925899486054d4fca77d197f4e&quot;,&quot;is_show&quot;:1}\"},\"video_tab_forum\":{\"videoTabId\":\"448391\"},\"zyqdefine\":{\"ATP\\u5b98\\u7f51\":\"http:\\/\\/www.atpworldtour.com\\/\",\"ITF\\u5b98\\u7f51\":\"http:\\/\\/www.itftennis.com\\/\",\"WTA\\u5b98\\u7f51\":\"http:\\/\\/www.wtatennis.com\\/home\",\"\\u4e18\\u7684\\u7f51\\u7403\":\"https:\\/\\/www.rank-tennis.com\\/zh\\/home\",\"\\u56fd\\u5bb6\\u4f53\\u80b2\\u603b\\u5c40\\u5b98\\u7f51\":\"https:\\/\\/www.sport.gov.cn\\/index.html\"},\"zyqfriend\":[\"\\u7f51\\u7403\\u5427\",\"\\u4e2d\\u56fd\\u5973\\u7f51\"]},\"need_safe\":0,\"can_forum_topic\":0,\"member_name\":\"Ace\",\"member_count\":48523,\"album_forum\":false,\"ban_pic_topic\":0,\"is_album_post\":false,\"album_good_smallflow\":false,\"no_post_pic\":0,\"is_video_v1\":false,\"is_readonly\":0,\"has_picture_frs\":1,\"shield_post\":true,\"global_attr\":{\"bonus_global_rank\":{\"rk\":[{\"l\":2,\"n\":\"\\u82f1\\u4e09\\u5609\\u54e5\",\"s\":\"197300000\"},{\"l\":2,\"n\":\"\\u60b2\\u4f24\\u7684\\u7f94\\u7f8a\",\"s\":\"23000000\"},{\"l\":2,\"n\":\"\\u5e73\\u6de1\\u5982\\u6c34CLUB\",\"s\":\"16000000\"}],\"tn\":13533},\"ideas\":{\"10\":\"recently_at_list\",\"11\":\"shortcut\",\"12\":\"datarecommend\",\"13\":\"markname\",\"14\":\"thread_list_order\",\"15\":\"see_image\",\"3\":\"owner\",\"4\":\"roundavatar\",\"5\":\"wrap_word_repost\",\"6\":\"deepread\",\"7\":\"elevator\",\"8\":\"night_mode\",\"9\":\"short_feedback\"},\"react_native\":1,\"tb_recommend_app\":[{\"ficon\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/dbc2d88065380cd7757468e1ab44ad3458828195.jpg\",\"fid\":\"1227883\",\"fname\":\"\\u84dd\\u94bb\"},{\"ficon\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/9df0bf2c11dfa9ec1d8650986bd0f703908fc1bd.jpg\",\"fid\":\"15213423\",\"fname\":\"t\\u8c46\\u5a31\\u4e50\\u57ce\"},{\"ficon\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/6d308718367adab40eca02cc82d4b31c8601e4d4.jpg\",\"fid\":\"76181\",\"fname\":\"\\u6597\\u5730\\u4e3b\"},{\"ficon\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/88ba47086e061d95b01030b772f40ad163d9ca22.jpg\",\"fid\":\"768801\",\"fname\":\"\\u98df\\u795e\\u4e89\\u9738\"}],\"xiu8_live_list\":[{\"address\":\"\\u6cb3\\u5357\",\"big_pic\":\"5\",\"charm_value\":5,\"chat_weight\":\"5\",\"forum_id\":\"5\",\"forum_name\":\"5\",\"is_live\":1,\"media_id\":\"5\",\"onlive_time\":0,\"pic\":\"5\",\"room_id\":\"5\",\"tag\":\"\\u840c\\u840c\\u54d2\",\"user_name\":\"5\"},{\"address\":\"\\u5e7f\\u4e1c\",\"big_pic\":\"\",\"charm_value\":0,\"chat_weight\":\"\",\"forum_id\":\"\",\"forum_name\":\"\",\"is_live\":1,\"media_id\":\"\",\"onlive_time\":0,\"pic\":\"\",\"room_id\":\"\",\"tag\":\"\\u90bb\\u5bb6\\u5c0f\\u59b9\",\"user_name\":\"\"},{\"address\":\"\\u56db\\u5ddd\",\"big_pic\":null,\"charm_value\":0,\"chat_weight\":null,\"forum_id\":null,\"forum_name\":null,\"is_live\":1,\"media_id\":null,\"onlive_time\":0,\"pic\":null,\"room_id\":null,\"tag\":\"\\u840c\\u840c\\u54d2\",\"user_name\":null}]},\"hide_forum_info\":false,\"forum_name_shared\":[],\"true_forum_id\":4513750,\"forum_shared_deleted\":[],\"pcdrift\":{\"switch\":0,\"jumpurl\":\"\",\"picurl\":\"\"},\"avatar\":\"http:\\/\\/tiebapic.baidu.com\\/forum\\/w%3D120%3Bh%3D120\\/sign=4193c9ec7f01213fcf334ade64dc5eec\\/dcc451da81cb39db7a7e9a6396160924ab18304d.jpg?tbpicau=2024-08-18-05_9e144ae7eb619394f7774773074f33c1\",\"post_num\":5418043},    \"beyondChannel\": [],    \"isPostVisible\": false,    \"isPrivateForum\": false,    \"thread\": {\"tag_title\":\"\\u3010\\u5f3a\\u70c8\\u606d\\u559c\\u3011\\u5168\\u7ea2\\u5a75\\u9648\\u5b87\\u6c50\\u5305\\u63fd\\u8df3\\u6c34\\u5973\\u5b5010\\u7c73\\u53f0\\u5df4\\u9ece\\u5965\\u8fd0\\u91d1\\u94f6\\u724c\\uff01\",\"title\":\"\\u3010\\u5f3a\\u70c8\\u606d\\u559c\\u3011\\u5168\\u7ea2\\u5a75\\u9648\\u5b87\\u6c50\\u5305\\u63fd\\u8df3\\u6c34\\u5973\\u5b5010\\u7c73\\u53f0\\u5df4\\u9ece\\u5965\\u8fd0\\u91d1\\u94f6\\u724c\\uff01\",\"thread_id\":9119688421,\"thread_type\":0,\"author_name\":\"heinzfrentzen\",\"author_info\":{\"birthday_show_status\":0,\"birthday_time\":0,\"card\":{\"good_num\":3,\"is_novice\":0,\"like_forum\":{\"10\":{\"count\":1,\"forum_list\":[\"\\u8c22\\u5c14\\u5df4\\u79d1\\u5a03\"]},\"11\":{\"count\":1,\"forum_list\":[\"\\u822a\\u7a7a\\u6bcd\\u8230\"]},\"12\":{\"count\":2,\"forum_list\":[\"wta\",\"\\u5916\\u4e61\\u4eba\"]},\"13\":{\"count\":9,\"forum_list\":[\"\\u65af\\u5c3c\\u4e9a\\u79d1\\u5a03\",\"\\u672c\\u897f\\u5947\",\"\\u5361\\u8428\\u91d1\\u5a1c\",\"\\u683c\\u5c14\\u683c\\u65af\"]},\"15\":{\"count\":2,\"forum_list\":[\"\\u7f51\\u7403\",\"\\u7f51\\u7403\\u98ce\\u4e91\"]}},\"manager_info\":{\"assist\":{\"count\":0,\"forum_list\":[]},\"manager\":{\"count\":0,\"forum_list\":[]}},\"op_time\":1722956117,\"post_num\":71893},\"chatroom_bubble_info\":[{\"end_time\":0,\"id\":1380005,\"open_status\":1,\"start_time\":1701794174,\"type\":2},{\"end_time\":0,\"id\":1380006,\"start_time\":1707951925,\"type\":2}],\"cur_score\":35840,\"display_name\":\"heinzfrentzen\",\"editing_nickname\":\"\",\"god_info\":{\"apply_source\":2,\"field\":9,\"field_name\":\"\\u4f53\\u80b2\",\"level_1_dir\":[\"\\u4f53\\u80b2\"],\"status\":3,\"type\":1,\"type_name\":\"\\u901a\\u7528\",\"update_time\":1654573129},\"is_black\":0,\"is_like\":1,\"is_usable\":1,\"level_id\":15,\"level_name\":\"\\u91d1\\u6ee1\\u8d2f\",\"live_watch_time\":1711320039,\"mParr_props\":[],\"meizhi_level\":0,\"new_active_forum\":[{\"fid\":4513750,\"fname\":\"\\u7f51\\u7403\\u98ce\\u4e91\"},{\"fid\":1398048,\"fname\":\"\\u5317\\u7f8e\\u7968\\u623f\\u699c\"},{\"fid\":507725,\"fname\":\"wta\"}],\"new_iconinfo\":{\"1\":{\"slot_no\":\"1\",\"slot_type\":\"0\",\"icon\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1461120181163.png\",\"value\":\"3\",\"end_time\":\"1650384000\",\"name\":\"signprize\",\"level\":\"3\",\"weight\":1,\"position\":{\"frs\":1,\"pb\":1,\"home\":1,\"card\":1},\"terminal\":{\"pc\":1,\"wap\":1,\"client\":1},\"sprite\":{\"1\":\"1722691615,94\",\"2\":\"1722691615,95\",\"3\":\"1722691615,96\"},\"category_id\":104,\"type\":2,\"price\":0,\"is_force\":0,\"is_advanced\":0,\"title\":\"\\u521d\\u7ea7\\u6838\\u5fc3\\u7528\\u6237\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/mo\\/q\\/medal\",\"intro\":\"\\u624b\\u673a\\u7aef\\u8fde\\u7eed\\u7b7e\\u52307\\u5929\\u53ef\\u83b7\\u5f97\\u672c\\u5370\\u8bb0\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/mo\\/q\\/medal\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\",\"level_1\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1461120125568.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1461120127398.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1461120129311.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1461120131365.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1461120133253.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1461120134989.png\",\"level_info\":{\"title\":\"\\u521d\\u7ea7\\u6838\\u5fc3\\u7528\\u6237\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/mo\\/q\\/medal\",\"intro\":\"\\u624b\\u673a\\u7aef\\u8fde\\u7eed\\u7b7e\\u52307\\u5929\\u53ef\\u83b7\\u5f97\\u672c\\u5370\\u8bb0\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/mo\\/q\\/medal\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}},\"level_2\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1461120154957.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1461120156578.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1461120158133.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1461120159955.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1461120161806.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1461120163634.png\",\"level_info\":{\"title\":\"\\u4e2d\\u7ea7\\u6838\\u5fc3\\u7528\\u6237\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/mo\\/q\\/medal\",\"intro\":\"\\u624b\\u673a\\u7aef\\u8fde\\u7eed\\u7b7e\\u523030\\u5929\\u53ef\\u83b7\\u5f97\\u672c\\u5370\\u8bb0\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/mo\\/q\\/medal\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}},\"level_3\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1461120181163.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1461120183110.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1461120185989.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1461120187522.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1461120189864.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1461120192434.png\",\"level_info\":{\"title\":\"\\u9ad8\\u7ea7\\u6838\\u5fc3\\u7528\\u6237\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/mo\\/q\\/medal\",\"intro\":\"\\u624b\\u673a\\u7aef\\u8fde\\u7eed\\u7b7e\\u523090\\u5929\\u53ef\\u83b7\\u5f97\\u672c\\u5370\\u8bb0\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/mo\\/q\\/medal\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}}}},\"portrait_time\":\"1532192361\",\"priv_sets\":{\"location\":\"3\"},\"risk_control_limit\":\"1007\",\"score_left\":24160,\"tbscore_repeate_finish_time\":\"1460955476\",\"theme_pendant\":{\"end_time\":4762890893,\"img\":\"https:\\/\\/tiebapic.baidu.com\\/forum\\/pic\\/item\\/5882b2b7d0a20cf4b3bc139a61094b36acaf9943.jpg?tbpicau=2024-08-18-05_2cb0f621b5f656bbd3731d5c90c88526\",\"level\":0,\"props_id\":1310063},\"tieba_uid\":\"332305416\",\"use_sig\":0,\"user_brief\":\" \",\"user_id\":1635505954,\"user_name\":\"heinzfrentzen\",\"user_nickname\":\"\\u8d34\\u5427\\u7528\\u6237_Q6eeVK7\",\"user_nickname_v2\":\"heinzfrentzen\",\"user_nickname_v2_update_time\":1659702540,\"user_sex\":1,\"user_state\":0,\"user_status\":0,\"user_type\":0,\"world_cup_info\":{\"throw_uid\":\"2736490405\",\"thrown_team_id\":\"2022world_cup_0\",\"thrown_time\":1671971434},\"is_forum_business_account\":0},\"reply_num\":252,\"is_not_top_stick\":0,\"type_array\":[],\"_show\":null,\"disable_share\":0,\"works_info\":{\"is_works\":0},\"is_launched_tiebaplus\":0,\"is_pictxt\":null},    \"frs_mask_info\": {\"is_frs_mask_forum\":0},    'is_track_banner': 0,    'power': {\"can_add_celebrity\":false,\"can_add_manager_team\":false,\"can_bws_FDS\":false,\"can_bws_bawu_center\":false,\"can_bws_bawu_info\":false,\"can_bws_bawu_log\":false,\"can_bws_filter_ip_tbs\":false,\"can_bws_limit_bawu_log\":false,\"can_cancel_filter_id\":false,\"can_cancel_mask_delete\":false,\"can_cancel_mask_good\":false,\"can_cancel_mask_top\":false,\"can_chatroom_change_announce\":false,\"can_chatroom_change_avatar\":false,\"can_chatroom_change_name\":false,\"can_chatroom_create\":false,\"can_chatroom_delete\":false,\"can_chatroom_exempt_mute_all\":false,\"can_chatroom_manage_admin\":false,\"can_chatroom_mute_all\":false,\"can_chatroom_mute_normal\":false,\"can_chatroom_recall_admin\":false,\"can_chatroom_recall_normal\":false,\"can_chatroom_set_send_level\":false,\"can_chatroom_set_talk_type\":false,\"can_chatroom_set_view_level\":false,\"can_del_manager_team\":false,\"can_edit_bakan\":false,\"can_edit_daquan\":false,\"can_edit_gconforum\":false,\"can_filter_id\":false,\"can_filter_ip\":false,\"can_mask_delete\":false,\"can_mask_good\":false,\"can_mask_top\":false,\"can_member_top\":false,\"can_op_FDS\":false,\"can_op_as_4thmgr\":false,\"can_op_as_broadcast_admin\":false,\"can_op_as_category_editor\":false,\"can_op_as_editor\":false,\"can_op_as_entertainment_manager\":false,\"can_op_as_operator\":false,\"can_op_as_profession_manager\":false,\"can_op_as_vertical_operator\":false,\"can_op_common_bawu\":false,\"can_op_disk\":false,\"can_op_frsbg\":false,\"can_op_good_class\":false,\"can_op_pic\":false,\"can_op_topic\":false,\"can_op_video\":false,\"can_op_wise_group\":false,\"can_paper_ignore_vcode\":false,\"can_pass_media_limit\":false,\"can_post\":true,\"can_post_frs\":true,\"can_post_pb\":true,\"can_send_memo\":false,\"can_super\":false,\"can_tobe_assist\":false,\"can_tobe_editor\":false,\"can_tobe_manager\":false,\"can_tobe_pri_content_assist\":false,\"can_tobe_pri_manage_assist\":false,\"can_toms_operator_alt_basic\":false,\"can_toms_operator_basic\":false,\"can_type1_audit_post\":false,\"can_type2_audit_post\":false,\"can_type3_audit_post\":false,\"can_type4_audit_post\":false,\"can_type5_audit_post\":false,\"can_unknown\":false,\"can_view_freq\":false,\"can_vip_jubao\":false,\"can_vote\":false,\"forever_ban\":0,\"lz_del\":false,\"picasso\":false,\"share_forum_perm\":[],\"can_set_topic\":false,\"reply_private_flag\":1},    'delReason': null,    'user': {\"is_login\":true,\"user_id\":1527556343,\"show_content_info\":[],\"user_name\":\"\\u6297\\u538b\\u5427\\u5427\\u52a1666\",\"no_un\":false,\"mobilephone\":\"131******21\",\"email\":\"\",\"urank\":[],\"userhide\":0,\"need_black_pop\":0,\"black_pop_level\":0,\"forbidden\":[],\"tips\":[],\"baidu_id\":\"00E51832EC6DAA0D10E1C0699C5E6670:FG=1\",\"is_videocreator\":false,\"pop_up_info\":1,\"Parr_props\":{\"all_level\":{\"2\":{\"end_time\":\"1421113470\",\"level\":2,\"score_limit\":8000}},\"level\":{\"end_time\":\"1421113470\",\"expired_notify\":1,\"expiring_notify\":1,\"left_num\":0,\"max_free_score\":8000,\"open_status\":null,\"pic_url\":null,\"props_category\":105,\"props_id\":2,\"props_type\":0,\"update_time\":null,\"used_status\":1}},\"ala_info\":{\"anchor_live\":\"0\",\"enter_live\":\"0\"},\"card\":{\"good_num\":0,\"is_novice\":0,\"like_forum\":{\"10\":{\"count\":1,\"forum_list\":[\"\\u6297\\u538b\"]},\"6\":{\"count\":1,\"forum_list\":[\"\\u73ed\\u5fb7\\u5c14\\u57ce\"]},\"8\":{\"count\":1,\"forum_list\":[\"\\u7535\\u8111\"]}},\"manager_info\":{\"assist\":{\"count\":0,\"forum_list\":[]},\"manager\":{\"count\":0,\"forum_list\":[]}},\"op_time\":1722782548,\"post_num\":1734},\"default_bubble\":\"1010015,a:1:{s:6:&quot;client&quot;;s:23:&quot;31_65_45_40_204_100_290&quot;;},1421113470\",\"display_name\":\"\\u6297\\u538b\\u5427\\u5427\\u52a1666\",\"forbidden_forumlist\":\"\",\"global\":{\"tbmall_newprops\":0},\"heavy_user\":1,\"is_friend_imported\":1,\"is_group_owner\":2,\"is_usable\":1,\"mParr_props\":{\"all_level\":{\"2\":{\"end_time\":\"1421113470\",\"level\":2,\"pic_url\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/6afa80cb39dbb6fdf9de234d0b24ab18962b37f0.jpg\",\"score_limit\":8000}},\"level\":{\"end_time\":\"1421113470\",\"pic_url\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/6afa80cb39dbb6fdf9de234d0b24ab18962b37f0.jpg\",\"props_id\":2}},\"meizhi_level\":0,\"new_iconinfo\":{\"1\":{\"slot_no\":\"1\",\"slot_type\":\"0\",\"icon\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429669987762.png\",\"value\":\"1\",\"end_time\":\"1735660800\",\"name\":\"starmaster\",\"level\":\"6\",\"weight\":1,\"position\":{\"frs\":1,\"pb\":1,\"home\":1,\"card\":1},\"terminal\":{\"pc\":1,\"wap\":1,\"client\":1},\"sprite\":{\"1\":\"1722691615,76\",\"2\":\"1722691615,77\",\"3\":\"1722691615,78\",\"4\":\"1722691615,79\",\"5\":\"1722691615,80\",\"6\":\"1722691615,81\"},\"category_id\":104,\"type\":2,\"price\":0,\"is_force\":0,\"is_advanced\":0,\"title\":\"\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\",\"level_1\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429669987762.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429669999852.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670005742.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670015949.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670023838.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670037795.png\",\"level_info\":{\"title\":\"\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}},\"level_2\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670195809.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670205542.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670220878.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670227517.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670235465.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670242217.png\",\"level_info\":{\"title\":\"\\u624b\\u6e381\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e381\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}},\"level_3\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670307639.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670315211.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670322063.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670328302.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670335960.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670342374.png\",\"level_info\":{\"title\":\"\\u624b\\u6e382\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e382\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}},\"level_4\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670565360.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670572100.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670579403.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670588885.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670595104.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670602958.png\",\"level_info\":{\"title\":\"\\u624b\\u6e383\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e383\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}},\"level_5\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670665956.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670671915.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670677756.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670683824.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670689692.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670695382.png\",\"level_info\":{\"title\":\"\\u624b\\u6e384\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e384\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}},\"level_6\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670737569.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670746212.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670751930.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670757612.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670763174.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670769025.png\",\"level_info\":{\"title\":\"\\u624b\\u6e385\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e385\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}}}},\"player_level_up\":\"1\",\"portrait_time\":\"1420595544\",\"priv_sets\":{\"like\":\"3\",\"post\":\"3\"},\"tailInfo\":[{\"fontColor\":\"646566\",\"fontKeyName\":\"Helvetica Neue\",\"is_selected\":\"1\",\"tailContent\":\"\\u4f5c\\u4e3a\\u4e00\\u540d\\u5927\\u4e09\\u5373\\u5c06\\u79bb\\u5f00\\u8fd9\\u6240\\u5b66\\u6821\\u7684\\u4eba\\uff0c\\u5df2\\u7ecf\\u4e0d\\u613f\\u610f\\u518d\\u82b1\\u8d39\\u65f6\\u95f4\\u53bb\\u548c\\u4e00\\u4e2a\\u964c\\u751f\\u4eba\\u7ecf\\u5386\\u4ece\\u964c\\u751f\\u5230\\u719f\\u6089\",\"tailId\":1420517715}],\"tbscore_repeate_finish_time\":\"1472232847\",\"tieba_uid\":\"1158580658\",\"ueg_profile\":\"70:1,60:0.2,73:135,460:1,51:1,475:1,71:1,476:1,62:1,53:1,474:1,18219:1\",\"use_sig\":0,\"user_sex\":2,\"user_state\":0,\"user_status\":1,\"user_type\":0,\"vipInfo\":{\"a_score\":-50,\"e_time\":\"1421113470\",\"ext_score\":\"0\",\"icon_url\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/icon_crown_super_non1.png\",\"n_score\":2600,\"s_time\":\"1542729600\",\"v_level\":1,\"v_status\":\"0\",\"y_score\":1000},\"vipexp_info\":{\"activated_num\":\"0\",\"create_time\":\"1420508670\",\"seed_num\":\"0\",\"status\":\"2\",\"update_time\":\"1420508670\",\"user_id\":\"1527556343\",\"vip_id\":\"121682015\"},\"cur_score\":0,\"is_black\":0,\"is_like\":0,\"level_id\":1,\"level_name\":\"\\u7f51\\u7403\\u840c\\u65b0\",\"score_left\":5,\"show_nickname\":\"\\u6297\\u538b\\u5427\\u5427\\u52a1666\",\"portrait\":\"tb.1.e6057aec.PmFeyCvKVx0KZKdGZ2v9oA?t=1420595544\",\"is_business_account\":0,\"pb_login_switch\":false,\"interaction_switch\":false,\"login_day\":5,\"edit_config\":null},}]);_.Module.use('pb/widget/adsInserted', {    mediago_info: {\"first_floor\":8,\"density\":6},    flow_type: \"normal\",    forum_name: \"\\u7f51\\u7403\\u98ce\\u4e91\",    first_dir: \"\\u4f53\\u80b2\",    second_dir: \"\\u7efc\\u5408\\u4f53\\u80b2\",    mediago_num: 30,    user_name: \"\\u6297\\u538b\\u5427\\u5427\\u52a1666\",    user_sex: 2,    user_uid: 1527556343,    fc_ad_number: 1,    is_adsense_fc: true});</script><script src=\"//mediago-static.cdn.bcebos.com/static/bundle.js?v=1.2.1\"></script><script>    _.Module.use('pb/widget/scrollEvent', [{    }], function(){});</script><script>        _.Module.use('encourage/widget/celebrity_expball', {            celebrity: null});</script><script>    _.Module.use('user/widget/celebrity', {        celebrity: null,        isCelebrityForum: false,        isCurForumMember: false,        memberLastDays: null});</script><script>    _.Module.use('pb/widget/aside_ad', {        flowType: null,        showMediago: false,        showFC: false});</script><script>        _.Module.use('user/widget/myTieba', [{            balvInfo: {\"is_black\":0,\"is_block\":null,\"opgroup\":null,\"block_reason\":null,\"member_num\":48523,\"rank\":{\"index\":null,\"status\":null},\"cur_score\":0,\"score_left\":5,\"is_guanzhu\":0,\"is_lvup\":0,\"level_id\":1,\"level_name\":\"\\u7f51\\u7403\\u840c\\u65b0\",\"levelup_score\":5,\"rights\":0,\"like_forums_num\":8},            style: \"\",            isBySys: \"\",            product: \"pb\"        }], function (initiate) {            initiate.init();        });</script>    <script>        _.Module.use(\"spage/widget/TopicRank\", {            isShowFC: false,            isShowLU: null,            isAdvertisement: 2,            isTopicListEmpty: false});</script><script>    _.Module.use('pb/widget/page_aside', {        fcFlag: null,        isShowFC: false,        isShowLU: null,        luType: null,        forumName: \"\\u7f51\\u7403\\u98ce\\u4e91\",        forumSecLvName: \"\\u7efc\\u5408\\u4f53\\u80b2\",        brandAdsenseSwitch: 1});</script><script type=\"text/javascript\" src=\"//passport.baidu.com/passApi/js/uni_forceverify_wrapper.js\"></script><script></script><script>        _.Module.use('comforum/widget/GameSwapWords');    </script><link rel=\"stylesheet\" href=\"//tb1.bdstatic.com/tb/static-common/style/ueditor_extend_ecf7725.css\">\n<script src=\"//tb1.bdstatic.com/??tb/static-common/js/ueditor_b3f5d31.js,tb/static-common/js/ueditor_extend_6965f2b.js\"></script>\n<script type=\"text/html\" id=\"j_simpleeditor_tpl\">        <div class=\"editor_for_container editor_lzl_container\" id=\"j_editor_for_container\"></div>        <p class=\"lzl_panel_error\" style=\"display: none;\"></p>        <table class=\"lzl_panel_wrapper\">            <tbody>            <tr>                <td style=\"width: 75%;\"><p style=\"color:#666;\"></p></td><td style=\"width: 25%; position:relative\"><div class=\"lzl_panel_btn\"><span class=\"lzl_panel_submit j_lzl_p_sb\" alog-action=\"lzlpostor\">发表</span><span class=\"lzl_panel_smile j_lzl_p_sm\"><div class=\"lzl_insertsmiley_holder\"></div></span>                        </div><div class=\"lzl_edui_dialog_container\"></div></td></tr></tbody></table></script><script>    PosterContext.loadContextFromPageData(PageData);    PosterContext.loadAuthorities({\"img_num\":10,\"video_num\":10,\"smiley_num\":100,\"white_list\":[\"http:\\/\\/www.tudou.com\\/\",\"http:\\/\\/v.blog.sohu.com\\/\",\"http:\\/\\/tv.sohu.com\\/\",\"http:\\/\\/share.vrs.sohu.com\\/\",\"http:\\/\\/my.tv.sohu.com\\/\",\"http:\\/\\/player.56.com\\/\",\"http:\\/\\/www.56.com\\/\",\"http:\\/\\/kankanews.com\\/\",\"http:\\/\\/video6.smgbb.cn\\/\",\"http:\\/\\/www.youku.com\\/\",\"http:\\/\\/player.youku.com\\/\",\"http:\\/\\/static.youku.com\\/\",\"http:\\/\\/www.ku6.com\\/\",\"http:\\/\\/player.ku6.com\\/\",\"http:\\/\\/video.sina.com.cn\\/\",\"http:\\/\\/vhead.blog.sina.com.cn\\/\",\"http:\\/\\/you.video.sina.com.cn\\/\",\"http:\\/\\/video.qq.com\\/\",\"http:\\/\\/www.baidu.com\\/\",\"http:\\/\\/box.baidu.com\\/\",\"http:\\/\\/hi.baidu.com\\/\",\"http:\\/\\/mv.baidu.com\\/\",\"http:\\/\\/mvimg.baidu.com\\/\",\"http:\\/\\/mvideo.baidu.com\\/\",\"http:\\/\\/player.cntv.cn\\/\",\"http:\\/\\/player.xiyou.cntv.cn\\/\",\"http:\\/\\/www.yinyuetai.com\\/\",\"http:\\/\\/player.yinyuetai.com\\/\",\"http:\\/\\/www.aipai.com\\/\",\"http:\\/\\/www.cutv.com\\/\",\"http:\\/\\/player.cutv.com\\/\",\"http:\\/\\/www.pptv.com\\/\",\"http:\\/\\/v.pptv.com\\/\",\"http:\\/\\/www.letv.com\\/\",\"http:\\/\\/www.iqiyi.com\\/\",\"http:\\/\\/yule.iqiyi.com\\/\",\"http:\\/\\/player.video.qiyi.com\\/\",\"http:\\/\\/www.ifeng.com\\/\",\"http:\\/\\/s.v.ifeng.com\\/\",\"http:\\/\\/v.ifeng.com\\/\",\"http:\\/\\/www.m1905.com\\/\",\"http:\\/\\/www.joy.cn\\/\",\"http:\\/\\/client.joy.cn\\/\",\"http:\\/\\/www.molihe.com\\/\",\"http:\\/\\/mv.molihe.com\\/\",\"http:\\/\\/swf.molihe.com\\/\",\"http:\\/\\/www.baomihua.com\\/\",\"http:\\/\\/video.baomihua.com\\/\",\"http:\\/\\/www.ouou.com\\/\",\"http:\\/\\/flash.ouou.com\\/\",\"http:\\/\\/dv.ouou.com\\/\",\"http:\\/\\/misc.home.news.cn\\/\",\"http:\\/\\/www.news.cn\\/\",\"http:\\/\\/www.wasu.cn\\/\",\"http:\\/\\/play1.wasu.cn\\/\",\"http:\\/\\/play.wasu.cn\\/\",\"http:\\/\\/v.iask.com\\/\",\"http:\\/\\/i7.imgs.letv.com\\/\",\"http:\\/\\/static.video.qq.com\\/\",\"http:\\/\\/player.pptv.com\\/\",\"http:\\/\\/www.mgtv.com\\/\",\"http:\\/\\/www.meipai.com\\/\",\"http:\\/\\/baishi.baidu.com\\/\",\"http:\\/\\/www.bilibili.com\\/\",\"http:\\/\\/share.acg.tv\\/\",\"http:\\/\\/static.hdslb.com\\/\",\"http:\\/\\/bangumi.bilibili.com\"],\"can_local_upload\":0,\"paypost\":\"\",\"music_num\":10,\"attachment_num\":5,\"attachment_size\":209715200,\"long_editor\":false,\"float_editor\":false,\"custom_emotion\":false,\"emotion_transform\":false,\"tb_gram\":false,\"formula_editor\":false},{\"is_user_has_right\":1,\"is_pro_thread\":null});</script><link rel=\"stylesheet\" href=\"//tb1.bdstatic.com/tb/static-common/style/ueditor_extend_ecf7725.css\">\n<script src=\"//tb1.bdstatic.com/??tb/static-common/js/ueditor_b3f5d31.js,tb/static-common/js/ueditor_extend_6965f2b.js\"></script>\n<script>    (function () {        var isGameTab = false;        function getNormalTabUrl() {            var location = $.tb.location;            var origin = location.getOrigin(), pathname = location.getPathname();            var searchValue = location.getSearchValue();            var searchString = '';            for (var i in searchValue) {                if (i != 'all_thread_tab') {                    searchString += i + '=' + searchValue[i];                }            }            return origin + pathname + '?' + searchString;        }        _.Module.use(\"common/widget/RichPoster\", {            prefix: undefined,            QinglangData: [],            redirectAfterPost: isGameTab ? getNormalTabUrl() : false,            imgNum: 10,            isPaypost: 0,            needPaypostAgree: !0,            isNotTopStick: 0,            threadType: 0,            liveTag: 0});    })();</script><script>_.Module.use('common/widget/footer',null, function(){});</script><script src=\"https://haokanupdate.cdn.bcebos.com/web/artplayer-polyfill-1.4.28.js\"></script><script>_.Module.use('pb/widget/NoAutoVideo',[{        text_videofrom: '',        can_auto_play: '0',        is_show_advideo: ''    }]);</script><script>    _.Module.use('ihome/widget/UserVisitCard',{'uname':'抗压吧吧务666','is_login':0,'tbs':''});</script><script>    _.Module.use('common/widget/Voice', {        canPlay: '1',        api: '',        useMd5: '',        playerType: ''    });</script><div style=\"width: 1px; height: 1px; overflow: hidden;\"><object id=\"audio_player_core\" width=\"1\" height=\"1\" classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#4,0,0,0\"><param name=\"quality\" value=\"high\"><param name=\"allowscriptaccess\" value=\"always\"><param name=\"scale\" value=\"noscale\"><param name=\"wmode\" value=\"window\"><param name=\"movie\" value=\"//tb1.bdstatic.com/tb/fmp.swf\"><embed name=\"audio_player_core\" width=\"1\" height=\"1\" allowscriptaccess=\"always\" wmode=\"window\" scale=\"noscale\" src=\"//tb1.bdstatic.com/tb/fmp.swf\" type=\"application/x-shockwave-flash\" pluginspage=\"http://www.macromedia.com/go/getflashplayer\"></object></div><script>_.Module.use('encourage/widget/meizhi_vote');</script><script>    _.Module.use('encourage/widget/WelfareIcon');</script><script>    _.Module.use('encourage/widget/achieveCard');</script><script>_.Module.use('fanclub/widget/fancard');</script><script>    $(\"body\").delegate('#j_meizhi_auth_btn, #j_meizhi_ysjg', 'click', function (e) {        _.Module.use('postor/widget/MeizhiPostor');        e.preventDefault();    });    if ($.cookie('zt2meizhi') == '1') {        _.Module.use('postor/widget/MeizhiPostor');    }    $.cookie('zt2meizhi',null);    //$.cookie('zt2meizhi', '1', {empires: 365, path: '/'});</script><script>    _.Module.use('frs/widget/frs_stamp_notice',[{    }]);</script><script>        _.Module.use('comforum/widget/GamePopWindow', [null]);</script>    <script>/*url安全界别检测  by tanjiawei*/_.Module.use('pb/widget/UrlCheck');</script><script>_.Module.use(\"props/widget/Feedback\",[{\"appraise\":null}]);</script><script>_.Module.use(\"tbmall/widget/NameplateRecast\",     [0, null]);</script><script>_.Module.use(\"pb/widget/PbTrack\");</script><script>    _.Module.use('adsense/widget/tpl_9', [{        'adData': {\"id\":\"37477\",\"name\":\"\\u6e38\\u620f\\u5408\\u4f5c-\\u5dc5\\u5cf0\\u51a0\\u519b\\u8db3\\u7403-\\u65b01-\\u7c7b\\u76ee\",\"adv_type\":\"0\",\"typeid\":\"0200\",\"pos_name\":\"LEFT\",\"loc_code\":\"p0015\",\"client_type\":\"PC\",\"page_name\":\"PB\",\"app_type\":\"13\",\"tpl_name\":\"9\",\"locator\":\"body\",\"load_type\":\"append\",\"first_screen\":\"0\",\"url_type\":1,\"throw_type\":\"0\",\"url\":\"http:\\/\\/tieba.baidu.com\\/link?tbjump=lid%3D1878266655_37477_13_4513750_9119688421_0%26url%3D2b2ekZ10nJMbDL8YzBmjDm5DM5hLQq28ld1oEfYY4BM9GebyFHT-NjuEr4NBh0vmHeoegQjnzDry7YMmIuwpWK72Mj4_e-ZgEhG8mqqpL8oYMn4tGbnkFjBtYLPzMTcY4DvPJOR-v5MktsSmREWy_4MQaPzZAjNcr4mOmnjxFkwFB1027Y-4JcA7y-q6Ggxm0bqGDUGJ6H9iFQFliJ1B-4wl3ZihvgjcIkqxK_ggwiOenlN8-RUOENVeZIUngbzbxzTxBYzZBDaYCN55MdOudE8Xoo2NxBfB8xswbuW8a0j18tCr57t-rezQV-KSdTTYIm61DMKmlRXVqrCh2fcYRTvJHQnATAPfebjbzOVBLWt0PD7KgrU74B8Jx-yP95IlJKmncQ54MP84iyjAPmhNrq2o1aGuk31o7hLteGsQFf-exDKenejY2vJgYLM4E-WZqROcj42zMjHOOfr9OY8lCJzy4CXumklmXYoNON9m90_QaDYjKSPinuyi6mparwVZWBH_nYTdfy06UGZn9fwJyIXBH5a8oLkXleMIinOQZbV86YznQ3JqkKc19CqoUS7iqS9DvQHql2z4cdSztGiThoKxzp4ZR81MiR06YLgjfxLnkX0CaNXjrhMY_9Llg178lP3ItSQZBjpgzC_a1dwyYXgSDXsyGjwGcdP6xfS2kAWX864e0MhlfSg07Z4GRjwNlGC0EjX7cxO_c27yHQVoYGPUsC5NB0dmDlgGsTZ2i3tv_f75dXA1v1PQym5kjx8lOyLk-5zzYa4ILGssBg_5AkdrkWb3AZ9gVzQkYUoAT_m1pgN9V7vL-3JLs8_w5yZj-IlWQhsYYoO_-oF4LymhxK4m4owdJ_jx6ZhvJ8keZqXcV6EwFdyMsGBqHblEOP7qschHBtbrBNSF0pTL4NyBXxhn9zoJuVXthsmoupxa-pxXgsyswv3bOEHjLAWHI8OupLsrv-k60ce9gbP6NHOWsehAtariAUw2BkseQrzFLEEWOGa2vhQj-_yIoKbX9by6NBZ1bx4lbCCr3j3lH3Z67LZIAIh1IThP5UmYlNIJK3XUMjZjC93wqXy-1tMH3Nk9xInzsVXjhIxgcBbPbdmmambD4_Pic5zql2QyD_9SnMT-c7KMhOnYXZKwnWN0We4ZoGPY4ss6_zVDsefkhplK3M2CiPGubwgK0UJKFgUKNmosyEi2RYW50wd4prOc8d1_NWderEzCACYlewlM0KQAukF6YqjrBDjBER2ApcYFszK4oZJiizKq7bqwTCK8mupD2YBj8BXtbDOM59nmIo7I39O7CmvRYZGkbFmCbHBV82_GhtOoz_ERVvQr9KGHLZx4gWKBkzf9jGb5MMMWL_q86tR-nmx4qpMx_W04xSwagjh5rHef3R70m2NZ9UuXix46tVKNur9K9CJgNJHg8-LowkjlQVzjeUodSxXcb_qlfq6u60fmsdNl1pTPU1OMGSy1SM0nyA-Yl-dsubdNxxUBKEtJxlGPfpunk-nt5YbDbQegm7CfEhDoFw2mhTlhHgctM1_iDfnN1AeZGd4a6t1Vs31c91MYJrK4Yo15r4Zs9BZO6sOaMwRibHWz8nw18UNPQQofbgGW7PLx5JR3jO8ASdSehxV_bwmLNaEK03ijxA\",\"ios_url\":\"\",\"apk_url\":\"\",\"apk_name\":\"\",\"first_name\":\"\\u5185\\u5bb9\",\"second_name\":\"\\u5185\\u5bb9\",\"goods_info\":[{\"close_pic\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/ngmis\\/adsense\\/file_1420437480279.jpg\",\"content_pic\":\"https:\\/\\/tieba-ares.cdn.bcebos.com\\/mis\\/2024-8\\/1722586936824\\/82195b2e9cf4.gif\",\"hover_pic\":\"https:\\/\\/tieba-ares.cdn.bcebos.com\\/mis\\/2024-8\\/1722586936824\\/82195b2e9cf4.gif\",\"video_info\":[],\"id\":\"57953\",\"ad_source\":\"\",\"ad_source_name\":\"\\u8d34\\u5427\\u5206\\u53d1\",\"width\":0,\"height\":0,\"label_measure\":1}],\"cpid\":\"13\",\"abtest\":\"\",\"price\":10,\"plan_id\":1,\"user_id\":\"37676788\",\"ext_info\":\"1_0_0_0_GD_0_0_0_p0015_\\u4f53\\u80b2_\\u7efc\\u5408\\u4f53\\u80b2_\\u6e38\\u620f\\u5408\\u4f5c-\\u5dc5\\u5cf0\\u51a0\\u519b\\u8db3\\u7403-\\u65b01-\\u7c7b\\u76ee_\\u5185\\u5bb9_\\u5185\\u5bb9_3629310648998897664_0_0_0_0_CPM_GD__3_0_G_eyJwbCI6IjM3NDc3IiwidW4iOiI1Nzk1MyIsInNlYXJjaF90aW1lIjoxNzIyOTY1NDc4LCJzZWFyY2hfaWQiOjM2MjkzMTA2NDg5OTg4OTc2NjQsInNpcCI6IjE4My4xMi4yMjAuMjE0IiwidWlkIjoxNTI3NTU2MzQzLCJmb3J1bV9pZCI6NDUxMzc1MCwiZm9ydW1fZGlyIjoiXHU0ZjUzXHU4MGIyIiwiZm9ydW1fc2Vjb25kX2RpciI6Ilx1N2VmY1x1NTQwOFx1NGY1M1x1ODBiMiIsInR5cGVpZCI6IjAyMDAiLCJwYWdlIjoiUEIiLCJleHQxIjo5MTE5Njg4NDIxfQ==_0_\",\"search_id\":3629310648998897664,\"imTimeSign\":null,\"ad_tags\":[],\"verify\":\"41e649a49dd4f9478dc46f5d7b50e505\",\"raw_adurl\":\"http:\\/\\/gamein.baidu.com\\/game\\/link\\/jump?number=54\",\"pb_log\":{\"forum_id\":4513750,\"forum_name\":\"\\u7f51\\u7403\\u98ce\\u4e91\",\"forum_dir\":\"\\u4f53\\u80b2\",\"forum_second_dir\":\"\\u7efc\\u5408\\u4f53\\u80b2\",\"click_url\":\"http:\\/\\/gamein.baidu.com\\/game\\/link\\/jump?number=54\",\"action_type\":2,\"client_type\":1,\"task\":\"tbda\",\"loc_param\":1,\"page\":3,\"location\":\"p0015\"},\"click_url_params\":\"lid%3D1878266655_37477_13_4513750_9119688421_0%26url%3D2b2ekZ10nJMbDL8YzBmjDm5DM5hLQq28ld1oEfYY4BM9GebyFHT-NjuEr4NBh0vmHeoegQjnzDry7YMmIuwpWK72Mj4_e-ZgEhG8mqqpL8oYMn4tGbnkFjBtYLPzMTcY4DvPJOR-v5MktsSmREWy_4MQaPzZAjNcr4mOmnjxFkwFB1027Y-4JcA7y-q6Ggxm0bqGDUGJ6H9iFQFliJ1B-4wl3ZihvgjcIkqxK_ggwiOenlN8-RUOENVeZIUngbzbxzTxBYzZBDaYCN55MdOudE8Xoo2NxBfB8xswbuW8a0j18tCr57t-rezQV-KSdTTYIm61DMKmlRXVqrCh2fcYRTvJHQnATAPfebjbzOVBLWt0PD7KgrU74B8Jx-yP95IlJKmncQ54MP84iyjAPmhNrq2o1aGuk31o7hLteGsQFf-exDKenejY2vJgYLM4E-WZqROcj42zMjHOOfr9OY8lCJzy4CXumklmXYoNON9m90_QaDYjKSPinuyi6mparwVZWBH_nYTdfy06UGZn9fwJyIXBH5a8oLkXleMIinOQZbV86YznQ3JqkKc19CqoUS7iqS9DvQHql2z4cdSztGiThoKxzp4ZR81MiR06YLgjfxLnkX0CaNXjrhMY_9Llg178lP3ItSQZBjpgzC_a1dwyYXgSDXsyGjwGcdP6xfS2kAWX864e0MhlfSg07Z4GRjwNlGC0EjX7cxO_c27yHQVoYGPUsC5NB0dmDlgGsTZ2i3tv_f75dXA1v1PQym5kjx8lOyLk-5zzYa4ILGssBg_5AkdrkWb3AZ9gVzQkYUoAT_m1pgN9V7vL-3JLs8_w5yZj-IlWQhsYYoO_-oF4LymhxK4m4owdJ_jx6ZhvJ8keZqXcV6EwFdyMsGBqHblEOP7qschHBtbrBNSF0pTL4NyBXxhn9zoJuVXthsmoupxa-pxXgsyswv3bOEHjLAWHI8OupLsrv-k60ce9gbP6NHOWsehAtariAUw2BkseQrzFLEEWOGa2vhQj-_yIoKbX9by6NBZ1bx4lbCCr3j3lH3Z67LZIAIh1IThP5UmYlNIJK3XUMjZjC93wqXy-1tMH3Nk9xInzsVXjhIxgcBbPbdmmambD4_Pic5zql2QyD_9SnMT-c7KMhOnYXZKwnWN0We4ZoGPY4ss6_zVDsefkhplK3M2CiPGubwgK0UJKFgUKNmosyEi2RYW50wd4prOc8d1_NWderEzCACYlewlM0KQAukF6YqjrBDjBER2ApcYFszK4oZJiizKq7bqwTCK8mupD2YBj8BXtbDOM59nmIo7I39O7CmvRYZGkbFmCbHBV82_GhtOoz_ERVvQr9KGHLZx4gWKBkzf9jGb5MMMWL_q86tR-nmx4qpMx_W04xSwagjh5rHef3R70m2NZ9UuXix46tVKNur9K9CJgNJHg8-LowkjlQVzjeUodSxXcb_qlfq6u60fmsdNl1pTPU1OMGSy1SM0nyA-Yl-dsubdNxxUBKEtJxlGPfpunk-nt5YbDbQegm7CfEhDoFw2mhTlhHgctM1_iDfnN1AeZGd4a6t1Vs31c91MYJrK4Yo15r4Zs9BZO6sOaMwRibHWz8nw18UNPQQofbgGW7PLx5JR3jO8ASdSehxV_bwmLNaEK03ijxA\",\"loc_index\":1},           /* 广告数据 */        'className': 'u491342ad2',     /* 广告定位器 */        'asyncHTML': '<div class=\\\"u491342ad2  clearfix\\\" ad-dom-img=\\\"true\\\">\\n    <span class=\\\"label_text\\\">广告<\\/span>\\n    <img class=\\\"close_btn j_click_close\\\" src=\\\"https:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/ngmis\\/adsense\\/file_1420437480279.jpg\\\" ad-dom-img=\\\"true\\\" data-locate=\\\"点击关闭\\\"\\/>\\n    <div>\\n        <a class=\\\"j_click_stats\\\" href=\\\"\\/link?client_type=pc_web&tbjump=lid%253D1878266655_37477_13_4513750_9119688421_0%2526url%253D2b2ekZ10nJMbDL8YzBmjDm5DM5hLQq28ld1oEfYY4BM9GebyFHT-NjuEr4NBh0vmHeoegQjnzDry7YMmIuwpWK72Mj4_e-ZgEhG8mqqpL8oYMn4tGbnkFjBtYLPzMTcY4DvPJOR-v5MktsSmREWy_4MQaPzZAjNcr4mOmnjxFkwFB1027Y-4JcA7y-q6Ggxm0bqGDUGJ6H9iFQFliJ1B-4wl3ZihvgjcIkqxK_ggwiOenlN8-RUOENVeZIUngbzbxzTxBYzZBDaYCN55MdOudE8Xoo2NxBfB8xswbuW8a0j18tCr57t-rezQV-KSdTTYIm61DMKmlRXVqrCh2fcYRTvJHQnATAPfebjbzOVBLWt0PD7KgrU74B8Jx-yP95IlJKmncQ54MP84iyjAPmhNrq2o1aGuk31o7hLteGsQFf-exDKenejY2vJgYLM4E-WZqROcj42zMjHOOfr9OY8lCJzy4CXumklmXYoNON9m90_QaDYjKSPinuyi6mparwVZWBH_nYTdfy06UGZn9fwJyIXBH5a8oLkXleMIinOQZbV86YznQ3JqkKc19CqoUS7iqS9DvQHql2z4cdSztGiThoKxzp4ZR81MiR06YLgjfxLnkX0CaNXjrhMY_9Llg178lP3ItSQZBjpgzC_a1dwyYXgSDXsyGjwGcdP6xfS2kAWX864e0MhlfSg07Z4GRjwNlGC0EjX7cxO_c27yHQVoYGPUsC5NB0dmDlgGsTZ2i3tv_f75dXA1v1PQym5kjx8lOyLk-5zzYa4ILGssBg_5AkdrkWb3AZ9gVzQkYUoAT_m1pgN9V7vL-3JLs8_w5yZj-IlWQhsYYoO_-oF4LymhxK4m4owdJ_jx6ZhvJ8keZqXcV6EwFdyMsGBqHblEOP7qschHBtbrBNSF0pTL4NyBXxhn9zoJuVXthsmoupxa-pxXgsyswv3bOEHjLAWHI8OupLsrv-k60ce9gbP6NHOWsehAtariAUw2BkseQrzFLEEWOGa2vhQj-_yIoKbX9by6NBZ1bx4lbCCr3j3lH3Z67LZIAIh1IThP5UmYlNIJK3XUMjZjC93wqXy-1tMH3Nk9xInzsVXjhIxgcBbPbdmmambD4_Pic5zql2QyD_9SnMT-c7KMhOnYXZKwnWN0We4ZoGPY4ss6_zVDsefkhplK3M2CiPGubwgK0UJKFgUKNmosyEi2RYW50wd4prOc8d1_NWderEzCACYlewlM0KQAukF6YqjrBDjBER2ApcYFszK4oZJiizKq7bqwTCK8mupD2YBj8BXtbDOM59nmIo7I39O7CmvRYZGkbFmCbHBV82_GhtOoz_ERVvQr9KGHLZx4gWKBkzf9jGb5MMMWL_q86tR-nmx4qpMx_W04xSwagjh5rHef3R70m2NZ9UuXix46tVKNur9K9CJgNJHg8-LowkjlQVzjeUodSxXcb_qlfq6u60fmsdNl1pTPU1OMGSy1SM0nyA-Yl-dsubdNxxUBKEtJxlGPfpunk-nt5YbDbQegm7CfEhDoFw2mhTlhHgctM1_iDfnN1AeZGd4a6t1Vs31c91MYJrK4Yo15r4Zs9BZO6sOaMwRibHWz8nw18UNPQQofbgGW7PLx5JR3jO8ASdSehxV_bwmLNaEK03ijxA&ie=utf-8&task=&locate=&page=pb&type=click&url=http%3A%2F%2Ftieba.baidu.com%2Fp%2F9119688421%3F&ie=utf-8&refer=https%3A%2F%2Ftieba.baidu.com%2Fhottopic%2Fbrowse%2Fhottopic%3Ftopic_id%3D27785074%26topic_name%3D%25E5%2585%25A8%25E7%25BA%25A2%25E5%25A9%25B5%25E9%2599%2588%25E8%258A%258B%25E6%25B1%2590%25E5%258C%2585%25E6%258F%25BD10%25E7%25B1%25B3%25E5%258F%25B0%25E9%2587%2591%25E9%2593%25B6&ie=utf-8&fid=4513750&ie=utf-8&fname=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&ie=utf-8&uid=1527556343&ie=utf-8&uname=%E6%8A%97%E5%8E%8B%E5%90%A7%E5%90%A7%E5%8A%A1666&ie=utf-8&is_new_user=&tid=9119688421&ie=utf-8&_t=1722965479&obj_id=37477\\\" target=\\\"_blank\\\"  data-locate=\\\"点击跳转\\\" >\\n            <img class=\\\"hover_btn\\\" src=\\\"https:\\/\\/tieba-ares.cdn.bcebos.com\\/mis\\/2024-8\\/1722586936824\\/82195b2e9cf4.gif\\\" ad-dom-img=\\\"true\\\" data-hover=\\\"https:\\/\\/tieba-ares.cdn.bcebos.com\\/mis\\/2024-8\\/1722586936824\\/82195b2e9cf4.gif\\\"\\/>\\n        <\\/a>\\n    <\\/div>\\n<\\/div>\\n\\n<style>\\n    div.u491342ad2 {\\n        position: fixed;\\n        right: 50%;\\n        top: 325px;\\n        width: 116px;\\n        overflow: hidden;\\n        margin-right: 508px;\\n        z-index: 1005;\\n        _position: absolute;\\n        _top: expression(documentElement.scrollTop+200);\\n    }\\n\\n    div.u491342ad2 div {\\n        vertical-align: top;\\n        width: 100%;\\n        height: 100%;\\n    }\\n\\n    div.u491342ad2 a {\\n        text-decoration: none;\\n    }\\n\\n    div.u491342ad2 .close_btn {\\n        position: relative;\\n        width: 17px;\\n        height: 18px;\\n        cursor: pointer;\\n        display: block;\\n        z-index: 300;\\n        left: 99px;\\n    }\\n\\n    div.u491342ad2 .label_text {\\n        position: absolute;\\n        height: 18px;\\n        right: 16px;\\n        line-height: 18px;\\n        background:#666;\\n        opacity:0.75;\\n        padding:0 3px;\\n        color:#fff;\\n    }\\n\\n    div.u491342ad2 .hover_btn {\\n        max-width: 116px;\\n        max-height: 225px;\\n        border: 0px;\\n    }\\n\\n<\\/style>\\n',     /* 异步加载的广告字符串 */        'isAsync': '1',         /* 是否为异步加载 */        'needStats': true                       /* 是否需要点击统计 */    }]);</script><div class=\"u491342ad2  clearfix\" ad-dom-img=\"true\">\n    <span class=\"label_text\">广告</span>\n    <img class=\"close_btn j_click_close\" src=\"https://tb1.bdstatic.com/tb/cms/ngmis/adsense/file_1420437480279.jpg\" ad-dom-img=\"true\" data-locate=\"点击关闭\">\n    <div>\n        <a class=\"j_click_stats\" href=\"/link?client_type=pc_web&amp;tbjump=lid%253D1878266655_37477_13_4513750_9119688421_0%2526url%253D2b2ekZ10nJMbDL8YzBmjDm5DM5hLQq28ld1oEfYY4BM9GebyFHT-NjuEr4NBh0vmHeoegQjnzDry7YMmIuwpWK72Mj4_e-ZgEhG8mqqpL8oYMn4tGbnkFjBtYLPzMTcY4DvPJOR-v5MktsSmREWy_4MQaPzZAjNcr4mOmnjxFkwFB1027Y-4JcA7y-q6Ggxm0bqGDUGJ6H9iFQFliJ1B-4wl3ZihvgjcIkqxK_ggwiOenlN8-RUOENVeZIUngbzbxzTxBYzZBDaYCN55MdOudE8Xoo2NxBfB8xswbuW8a0j18tCr57t-rezQV-KSdTTYIm61DMKmlRXVqrCh2fcYRTvJHQnATAPfebjbzOVBLWt0PD7KgrU74B8Jx-yP95IlJKmncQ54MP84iyjAPmhNrq2o1aGuk31o7hLteGsQFf-exDKenejY2vJgYLM4E-WZqROcj42zMjHOOfr9OY8lCJzy4CXumklmXYoNON9m90_QaDYjKSPinuyi6mparwVZWBH_nYTdfy06UGZn9fwJyIXBH5a8oLkXleMIinOQZbV86YznQ3JqkKc19CqoUS7iqS9DvQHql2z4cdSztGiThoKxzp4ZR81MiR06YLgjfxLnkX0CaNXjrhMY_9Llg178lP3ItSQZBjpgzC_a1dwyYXgSDXsyGjwGcdP6xfS2kAWX864e0MhlfSg07Z4GRjwNlGC0EjX7cxO_c27yHQVoYGPUsC5NB0dmDlgGsTZ2i3tv_f75dXA1v1PQym5kjx8lOyLk-5zzYa4ILGssBg_5AkdrkWb3AZ9gVzQkYUoAT_m1pgN9V7vL-3JLs8_w5yZj-IlWQhsYYoO_-oF4LymhxK4m4owdJ_jx6ZhvJ8keZqXcV6EwFdyMsGBqHblEOP7qschHBtbrBNSF0pTL4NyBXxhn9zoJuVXthsmoupxa-pxXgsyswv3bOEHjLAWHI8OupLsrv-k60ce9gbP6NHOWsehAtariAUw2BkseQrzFLEEWOGa2vhQj-_yIoKbX9by6NBZ1bx4lbCCr3j3lH3Z67LZIAIh1IThP5UmYlNIJK3XUMjZjC93wqXy-1tMH3Nk9xInzsVXjhIxgcBbPbdmmambD4_Pic5zql2QyD_9SnMT-c7KMhOnYXZKwnWN0We4ZoGPY4ss6_zVDsefkhplK3M2CiPGubwgK0UJKFgUKNmosyEi2RYW50wd4prOc8d1_NWderEzCACYlewlM0KQAukF6YqjrBDjBER2ApcYFszK4oZJiizKq7bqwTCK8mupD2YBj8BXtbDOM59nmIo7I39O7CmvRYZGkbFmCbHBV82_GhtOoz_ERVvQr9KGHLZx4gWKBkzf9jGb5MMMWL_q86tR-nmx4qpMx_W04xSwagjh5rHef3R70m2NZ9UuXix46tVKNur9K9CJgNJHg8-LowkjlQVzjeUodSxXcb_qlfq6u60fmsdNl1pTPU1OMGSy1SM0nyA-Yl-dsubdNxxUBKEtJxlGPfpunk-nt5YbDbQegm7CfEhDoFw2mhTlhHgctM1_iDfnN1AeZGd4a6t1Vs31c91MYJrK4Yo15r4Zs9BZO6sOaMwRibHWz8nw18UNPQQofbgGW7PLx5JR3jO8ASdSehxV_bwmLNaEK03ijxA&amp;ie=utf-8&amp;task=&amp;locate=&amp;page=pb&amp;type=click&amp;url=http%3A%2F%2Ftieba.baidu.com%2Fp%2F9119688421%3F&amp;ie=utf-8&amp;refer=https%3A%2F%2Ftieba.baidu.com%2Fhottopic%2Fbrowse%2Fhottopic%3Ftopic_id%3D27785074%26topic_name%3D%25E5%2585%25A8%25E7%25BA%25A2%25E5%25A9%25B5%25E9%2599%2588%25E8%258A%258B%25E6%25B1%2590%25E5%258C%2585%25E6%258F%25BD10%25E7%25B1%25B3%25E5%258F%25B0%25E9%2587%2591%25E9%2593%25B6&amp;ie=utf-8&amp;fid=4513750&amp;ie=utf-8&amp;fname=%E7%BD%91%E7%90%83%E9%A3%8E%E4%BA%91&amp;ie=utf-8&amp;uid=1527556343&amp;ie=utf-8&amp;uname=%E6%8A%97%E5%8E%8B%E5%90%A7%E5%90%A7%E5%8A%A1666&amp;ie=utf-8&amp;is_new_user=&amp;tid=9119688421&amp;ie=utf-8&amp;_t=1722965479&amp;obj_id=37477\" target=\"_blank\" data-locate=\"点击跳转\">\n            <img class=\"hover_btn\" src=\"https://tieba-ares.cdn.bcebos.com/mis/2024-8/1722586936824/82195b2e9cf4.gif\" ad-dom-img=\"true\" data-hover=\"https://tieba-ares.cdn.bcebos.com/mis/2024-8/1722586936824/82195b2e9cf4.gif\">\n        </a>\n    </div>\n</div>\n\n<style style=\"display: none;\">\n    div.u491342ad2 {\n        position: fixed;\n        right: 50%;\n        top: 325px;\n        width: 116px;\n        overflow: hidden;\n        margin-right: 508px;\n        z-index: 1005;\n        _position: absolute;\n        _top: expression(documentElement.scrollTop+200);\n    }\n\n    div.u491342ad2 div {\n        vertical-align: top;\n        width: 100%;\n        height: 100%;\n    }\n\n    div.u491342ad2 a {\n        text-decoration: none;\n    }\n\n    div.u491342ad2 .close_btn {\n        position: relative;\n        width: 17px;\n        height: 18px;\n        cursor: pointer;\n        display: block;\n        z-index: 300;\n        left: 99px;\n    }\n\n    div.u491342ad2 .label_text {\n        position: absolute;\n        height: 18px;\n        right: 16px;\n        line-height: 18px;\n        background:#666;\n        opacity:0.75;\n        padding:0 3px;\n        color:#fff;\n    }\n\n    div.u491342ad2 .hover_btn {\n        max-width: 116px;\n        max-height: 225px;\n        border: 0px;\n    }\n\n</style><script>    _.Module.use('adsense/widget/data_handler_async', [], function (instance){    instance.addData({    'forum_vdir': null});    });</script><script>    _.Module.use('tbmall/widget/grab_treasure_dialog_success',[{    diamondData: []}]);</script><script>    /*加载无刷新组件*/    _.Module.use('pb/widget/NoRefresh', [\"\\/p\\/9119688421?pn=\", false]);</script><script>        _.Module.use('spage/widget/fixed_bar', [], function(){});        if ('' === 'showBar'){            $.stats.track('底部', '新用户红包', 'spage', 'show');        }</script><script>    _.Module.use('creativeplatform/widget/normalApp', [[]]);</script><script>PageData.lcs = {};PageData.lcs.sbduss = '6OC0dZS7NfIjUYDTwVI3zOZjAL7yD8MY8lDs9FZMXTlb\\/XpIjjRep98GDwuufTb2q1TK5Ku+yLHr3U5kdcjZYzfQdjoUHU+p0P2QQKbNitPfpLXCmS84lGwv2QA6WN+UeYdtI6fZ7nMWEbewI2Qq50F6sDg8FyuOQXqwODwXK45BerA4PBcrjkF6sDg8FyuOQXqwODwXK45BerA4PBcrjkF6sDg8FyuOQXqwODwXK46F2JPjzJJF2Ryz1avRGHOI';</script><script></script><script>    PageData.user.joinEmoji = \"initial\";    PageData.user.is_uc_account = null;    PageData.user.business_account = null;    PageData.userBarExtraConfig = {\"switch\":\"0\",\"word\":\"hao123\",\"url\":\"https:\\/\\/www.hao123.com\\/?tn=50000076_hao_pg\"};_.Module.use(\"common/widget/Userbar\", [PageData.user, PageData.product, {    bluePushUnit: {\"url\":[\"http:\\/\\/push.dui1dui.com\\/tieba\\/awaken\"],\"button\":[\"\\u9a6c\\u4e0a\\u62a2\"],\"text\":[\"\\u4eb2\\u7231\\u7684\\uff0c\\u4f60\\u4e0d\\u77e5\\u9053\\u5417\\uff1f\\u4f60\\u8d26\\u6237\\u4e2d\\u7684\\u84dd\\u94bb\\u53ef\\u4ee5\\u7528\\u6765\\u5151\\u6362\\u8d34\\u5427\\u4f1a\\u5458\\uff01\\u540d\\u989d\\u6709\\u9650\\uff0c\\u901f\\u6765\\u62a2\\uff01\"]},    bluePushFlag: \"all\",    userDiamond: null}]);</script><script>        _.Module.use('common/widget/AdStats', [{}]);    </script><script>_.Module.use('common/widget/tbskin', [\"normal\"]);</script><script>_.Module.use(\"pb/widget/Stat\");</script><script>var topic_thread = PageData.thread.topic || {},thread_topic_type = topic_thread.is_topic ? \"1\" : \"0\",thread_topic_subtype = (thread_topic_type == \"1\" && topic_thread.topic_type == \"2\") ? \"3\" : \"0\";        var is_post_visible = 0 || 0;    _.Module.use(\"common/widget/AsideFloatBar\",[{        buttons: [            \"auxiliaryCare\",\"down\",            \"post\",        \"props\",            \"tsukkomi\",            \"share\",\"favor\",            \"feedback\",            \"top\"        ],        dataPostor : {            canPostor : {                isBlock: (PageData.user.balv.is_block || PageData.user.forbidden.isForbid) ? true : false,                noUn : PageData[\"user\"][\"no_un\"],                forbidFlag:'1',                login:'1',                canPost:'1'            },            data : {                kw:'网球风云',                ie:'utf-8',                rich_text:'1',                floor_num:\"\",                fid:'4513750',                tbs : PageData[\"tbs\"],                tid:'9119688421',                lp_type: thread_topic_type,                lp_sub_type:thread_topic_subtype            }        },        radarData : {            link: 'http:\\/\\/c.tieba.baidu.com\\/c\\/s\\/download\\/pc?tab=kanpian'        }        ,propsData : {        \"owner\" : null},        is_post_visible: is_post_visible    }]);</script><ul class=\"tbui_aside_float_bar\"><li class=\"tbui_aside_fbar_button tbui_fbar_auxiliaryCare\"><a href=\"javascript:void\"></a></li><li class=\"tbui_aside_fbar_button tbui_fbar_down\"><a href=\"#\"></a></li><li class=\"tbui_aside_fbar_button tbui_fbar_post\"><a href=\"#sub\"></a></li><li class=\"tbui_aside_fbar_button tbui_fbar_props\"><a href=\"#\"></a><ul class=\"tbui_aside_props_list clearfix\" id=\"tbui_aside_props_list\" style=\"display: none;\"><li class=\"props_item props_item_1070001\"><a class=\"props_item_btn\" target=\"_blank\" href=\"/tbmall/propslist?category=107\" data-id=\"1070001\"><img src=\"//tb2.bdstatic.com/tb/static-props/img/props/worship.png\"><span class=\"props_buy_icon\"></span></a><p class=\"props_item_title\"><span>魔拜</span></p></li><li class=\"props_item props_item_1070002\"><a class=\"props_item_btn\" target=\"_blank\" href=\"/tbmall/propslist?category=107\" data-id=\"1070002\"><img src=\"//tb2.bdstatic.com/tb/static-props/img/props/egg.png\"><span class=\"props_buy_icon\"></span></a><p class=\"props_item_title\"><span>魔蛋</span></p></li></ul></li><li class=\"tbui_aside_fbar_button tbui_fbar_tsukkomi\"><a href=\"#\"></a><div class=\"tbui_aside_smiley\" style=\"display: none;\"><div class=\"tbui_scroll_panel tbui_no_scroll_bar\"><div class=\"tbui_panel_content j_panel_content clearfix\" style=\"padding: 9px 0px 0px; height: 0px;\"><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"小度熊惊吓道：直到我膝盖中了一箭\" data-num=\"1\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0001.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"波波喷了口血说：我擦\" data-num=\"2\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0002.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"小度熊扔了个肥皂：你懂的\" data-num=\"3\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0003.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"小度熊称赞道：这真是极好的\" data-num=\"4\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0004.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"小度熊激动地说：给力！\" data-num=\"5\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0005.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"布鲁鄙视地说：你妹\" data-num=\"6\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0006.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"小度熊悲伤地说：感觉不会再爱了\" data-num=\"7\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0007.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"王叔淫笑地说：楼下怎么看？\" data-num=\"8\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0008.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"小度熊挑衅地说：呵呵\" data-num=\"9\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0009.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"小度熊顶着贴说：专业顶帖只需2毛\" data-num=\"10\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0010.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"小度熊拿着火钳说：火钳留名\" data-num=\"11\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0011.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"贴贴痴痴地说：楼主好人一生平安\" data-num=\"12\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0012.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"小度熊戏谑道：挽尊\" data-num=\"13\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0013.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"小度熊摊开手说：然并卵\" data-num=\"14\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0014.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"布鲁挤着贴贴说：挤挤\" data-num=\"15\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0015.png\"></div></div><div class=\"tbui_scroll_bar j_scroll_bar\" style=\"display: none;\"><div class=\"tbui_scroll_button j_scroll_button ui-draggable\" style=\"position: relative;\">&nbsp;</div></div></div></div></li><li class=\"tbui_aside_fbar_button tbui_fbar_share\"><a href=\"#\"><div class=\"tbshare_popup_wrapper\"><div class=\"tbshare_popup_enter\"></div><div class=\"tbshare_popup_main clearfix\" style=\"display: none;\"><div class=\"tbshare_wrapper_theme_coco\"><ul class=\"\"><li><div class=\"tbshare_tieba tbshare_icon\" title=\"百度贴吧\" data-share=\"tieba\"><div class=\"tbshare_title_box\">百度贴吧</div></div></li><li><div class=\"tbshare_weixin tbshare_icon\" title=\"微信\" data-share=\"weixin\"><div class=\"tbshare_title_box\">微信</div></div></li><li><div class=\"tbshare_tsina tbshare_icon\" title=\"新浪微博\" data-share=\"tsina\"><div class=\"tbshare_title_box\">新浪微博</div></div></li><li><div class=\"tbshare_qqzone tbshare_icon\" title=\"QQ空间\" data-share=\"qqzone\"><div class=\"tbshare_title_box\">QQ空间</div></div></li><li><div class=\"tbshare_copy tbshare_icon\" onclick=\"return false;\" title=\"复制链接\" data-share=\"copy\"><div class=\"tbshare_title_box\">复制链接</div></div></li></ul><div class=\"tbshare_qrcode_mask\" style=\"display: none;\"><div class=\"tbshare_qrcode_outer\"><div class=\"tbshare_qrcode_wrapper\"><h6>扫一扫分享到微信</h6><div class=\"tbshare_qrcode_content\" title=\"https://tieba.baidu.com/p/9119688421\"><canvas width=\"90\" height=\"90\" style=\"display: none;\"></canvas><img alt=\"Scan me!\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABaCAYAAAA4qEECAAAAAXNSR0IArs4c6QAABe1JREFUeF7tndF22zAMQ5P//+juJK1zbJYCLmW5zTbubbEjSxBIgLSd3m+328ft5L+Pj/EQ9/v9Obo653E8nrf9f//d/Wdqytu13PnqPDoGhe6BQgP9RYY9aJcB7RgXd04xbj9Wxmj12XadbD6U5e67cS0kIklUKoxejG6g8ySQbS5OF7tI+Qb0TF4jjHAs3yavrk/JMBtFGWtpFLm000AHesbNbKBF/P43jF7BgplUQ1KYC/EoxivW8rSvm72jdiY774pwa6C/ihOlxpmgOSFTBYuyfHuGzo5B13KGjJcz+mqQGmij5iNzT8rikQ7+VYyeMeMRnDP5VaUdKkwuTak1kp7LDEa/UhlmxQlh8j8BNN2l7Lwqo4nPdaAq90PGf1qupLNI0s8MVku7d2TiMwskoO7L56vmMQPwK3pXtkmvWuA/AfTHGeUIW0wbQq5xRVqSZAzHwIVLd5e63Rtoi9GSExDQlD2q4Z5ZvqzvkK2KpqSRN8/y9+gz1euYLb6eukQY3UAft9ClnJQYG9Az/YnMD0dWkSbU3onQOCXR49aUAUKiYn8OGePAaDcpBQARQdW4aaDFYwTZrpJiZuQoaHpSeZIUG7Q9kEUriaIRIZfkaNI+VJOk6YKKpwLJbaiqckmqHBJphRg20F4sJaOrtsqxRTGXNJVcuiJsdGOMxLyiI9laGmiTt5z/p7rUQP8U0LGp5HaQ+GKXQpzhj2FaVXvqbTOM3dyj2BFr+1xPA32E+3Kgq2KkRMVZuSpDq7ZKMbp6Q2FFhB8Y3UB/bie5W5T5eVv5kgdoXE6N4daM/v7I+bTroLaGiKerDGkqiOW569+o41RQ3TVeaU9VhqpgaaA/ESgDTb+gLNGsyO0nrNKUEzJV1c1auSwfu7FSHFb2oxvoo6AenBkBmnhLuvMjW+gEtxKmmR2skgAXIsmLRinjG+j81bwGOtClmtOziHJ2VOV+Gu0ve0dbosRqVSfu7J06ru6Y2CJChP2ZDUSpQ03cuQOyCWdAVZYym9tbAk0FJDuPMM4tOo7rosIdf4znSEPWTC2lE/NvlWEVEMfQamVIo6KBHohVdQMdkO742zFaNZUoG6kVImnHheBPj+FcBe16ypeFGui8l5EVZ66FUX61wu3wyHO61FFttW7XqVZ8o8p0NJ6bN4mwpyOKqcOJWwOdI+RwaaBNpbmM0bEfTQdOqx/x8s1MXqNhGcOe9tGVBlGbSWqIZ+pooI+Cp+4Zzm68BToTiKqVI9UXFSir7PCHsiILZ9dE591AfyH1K0Bnu+R6BmSiTpVHeTZWeConkrxK10JtI1l7yugGevw7fVRk05Q7exc8Y0bGNlWi0vOrZXmVjY7lUWeqa8eMdkUMtThqwhWBGqUTlTqoY4ib5FIeblMQRjfQYwQw0NV3wWkYE4aSVqdjr0o/FftFGR+vR/Eo/7oBHbiBPiLQQAdGuJw8zejZEpzeS8usThbuqk2KvSp4mMU5DDIPN0a6vgY6v4mbemHwizUj2Sw/tqvYiBUYPE8x00WkzK+4KDcP1X/ZH2ugDeoNdALQWzOa+Gjnd2ctHxFFF+a03FbjVJ0GndMhdTTQ/k63A3Zk+XCOrl5gZehSlimrRW8U0OpSVY8uqtHPSFDAG+gxUuXKUO3+mX7tLFuovcJPFAWvXC3Mhr0ZkqMdo9UNzSrLXbhXeigUJJp+aG89FegGWj/eSzdrTwAJtEvmikkkLGeMf7WBU42eFekKV8PVR8KyyTXQ+bMhe6Is/el5ml+JaNL7ck4/VkYFvRZKHc6/qlBpoD+3ooEu/Lk/yl5a7CxNHdX8TTy5U/NDHgztV9ejISA5Eacb0kAHpNTjBlVndpkYZrt7Jm8TttDxlZVTUUPHd+ddwmgVzkOxWPgkqGIeFfuqx26gQ1i8DdAkXB/nKJGgi1HlLRUy5bfp3Wo6D7cu5dnL77AoZ1HNg3SBNIwjEG8JNGXySktEW5zbNZ3qx4rTWbOV13dsX9qPJmynQunERTkc3Ogp/pnqMyLbQA98dHWjHaP/AHzSN+9NioAXAAAAAElFTkSuQmCC\" style=\"display: block;\"></div><div class=\"tbshare_qrcode_instruction\"><p>打开微信，点击底部的“发现”，<br>使用“扫一扫”即可将网页分享至朋友圈。</p></div><div class=\"tbshare_qrcode_close\">×</div></div></div><div class=\"tbshare_qrcode_triangle\"></div></div></div></div></div></a></li><li class=\"tbui_aside_fbar_button tbui_fbar_favor\"><a href=\"#\"></a><ul class=\"tbui_aside_favor_list clearfix\" id=\"tbui_aside_favor_list\" style=\"display: none;\"><li class=\"j_favor_loading\" style=\"display: none;\"><div class=\"favor_loading\"><img src=\"http://tb2.bdstatic.com/tb/static-common/widget/aside_float_bar/images/loading2_a8a93d0.gif\">正在加载，请稍后。。。</div></li><li><a href=\"//tieba.baidu.com/f?ie=utf-8&amp;kw=%E7%94%B5%E8%84%91\" target=\"_blank\" class=\"ui_text_summary\">电脑</a></li><li><a href=\"//tieba.baidu.com/f?ie=utf-8&amp;kw=%E7%8F%AD%E5%BE%B7%E5%B0%94%E5%9F%8E\" target=\"_blank\" class=\"ui_text_summary\">班德尔城</a></li><li><a href=\"//tieba.baidu.com/f?ie=utf-8&amp;kw=%E7%88%B1%E6%83%85\" target=\"_blank\" class=\"ui_text_summary\">爱情</a></li><li><a href=\"//tieba.baidu.com/f?ie=utf-8&amp;kw=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80\" target=\"_blank\" class=\"ui_text_summary\">王者荣耀</a></li><li><a href=\"//tieba.baidu.com/f?ie=utf-8&amp;kw=yy\" target=\"_blank\" class=\"ui_text_summary\">yy</a></li><li><a href=\"//tieba.baidu.com/f?ie=utf-8&amp;kw=%E7%BE%A4%E6%99%96\" target=\"_blank\" class=\"ui_text_summary\">群晖</a></li><li><a href=\"//tieba.baidu.com/f?ie=utf-8&amp;kw=nas\" target=\"_blank\" class=\"ui_text_summary\">nas</a></li></ul></li><li class=\"tbui_aside_fbar_button tbui_fbar_feedback\"><a href=\"/pmc/feedback\" target=\"_blank\"></a></li><li class=\"tbui_aside_fbar_button tbui_fbar_top\" style=\"visibility: visible;\"><a href=\"#\"></a></li></ul><script>    _.Module.use('comforum/widget/Comtrial',[{'page':'pb','hide_searchad':0,  'query': '', 'query_encode': '', 'forumName': '网球风云', 'threadTitle': '【强烈恭喜】全红婵陈宇汐包揽跳水女子10米台巴黎奥运金银牌！'}]);</script><script type=\"text/javascript\">!function(e){function o(e){if(0!=e.length){var o=new Image(1,1),t=\"img_\"+ +new Date,a=[],n=e.split(\"&\");a.push(\"ts=9mp&t=csp&sid=\"+v+\"&dv=5&page=\"+encodeURIComponent(d.pageId)+\"&p=\"+encodeURIComponent(d.productId)+\"&type=CROSS_SITE_RES\");for(var r=0;r<n.length;++r)a.push(\"desc\"+r+\"=\"+n[r]);I[t]=o,o.onload=o.onerror=function(){I[t]=o=o.onload=o.onerror=null,delete I[t]},o.src=l+\"/tb/pms/img/st.gif?\"+a.join(\"&\")}}function t(e){return e=e.replace(/\\s/g,\"\").replace(/\\./g,\"\\\\.\").replace(/\\*/g,\".*\").replace(/\\?/g,\".\"),\"^\"+e+\"$\"}function a(){for(var e=d[\"default-exclude\"],o=0;o<e.length;++o){var a=RegExp(t(e[o]),\"i\");g.push(a)}1==d[\"exclude-host\"]&&g.push(RegExp(m,\"i\"))}function n(){var e=window.performance.getEntriesByType(\"resource\");window.performance.clearResourceTimings&&window.performance.clearResourceTimings();for(var t=0;t<e.length;++t){var a=e[t].name;if(a&&void 0==s[a]){var n=a.match(f);if(n){n=n[1],/[:@]/.test(n)&&(n=n.split(\"@\").pop().split(\":\")[0]);for(var r=0;r<g.length;++r){var i=g[r];if(i.test(n)){s[a]=1;break}}a.indexOf(l)>=0&&(s[a]=1),void 0==s[a]&&(s[a]=0)}}}var p=[],c=0;for(var d in s)if(0==s[d]){var m=encodeURIComponent(d);c+m.length>=u&&(c>0&&o(p.join(\"&\")),c=0,p=[]),c+=m.length,p.push(m),s[d]=1}p.length>0&&o(p.join(\"&\"))}function r(){var e=48,o=2,t=1e4,a=0,i=setInterval(function(){a++},16),p=0,c=setInterval(function(){e>a?p=0:++p==o&&(clearInterval(i),clearInterval(c),n(),setTimeout(r,t)),a=0},1e3)}function i(){a(),window.performance&&window.performance.getEntriesByType&&r()}var p={index:{pv:65e6,pageId:\"14_329\",leakPageId:\"14_342\"},frs:{pv:13e7,pageId:\"14_331\",leakPageId:\"14_343\"},pb:{pv:3e8,pageId:\"14_333\",leakPageId:\"14_344\"},ihome:{pv:3e6,pageId:\"14_321\",leakPageId:\"14_341\"},tbmall:{pv:3e6,pageId:\"14_322\",leakPageId:\"14_345\"},itieba3:{pv:5e6,pageId:\"14_323\",leakPageId:\"14_346\"},other:{pv:3e5,pageId:\"14_327\",leakPageId:\"14_347\"}},c=p[PageData.product]?PageData.product:\"other\",d={sample:1e5/p[c].pv,\"exclude-host\":\"https:\"==window.location.protocol?!1:!0,\"default-exclude\":\"https:\"==window.location.protocol?[]:[\"*.bdstatic.com\",\"*.baidu.com\",\"*.tiebaimg.com\",\"*.bdimg.com\",\"*.duoku.com\",\"*.bcebos.com\",\"*.ykimg.com\",\"*.youku.com\"],productId:14,pageId:\"https:\"==window.location.protocol?p[c].leakPageId:p[c].pageId},l=\"http://static.tieba.baidu.com\";\"https:\"==window.location.protocol&&(l=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\");var g=[],s={},u=1200,m=location.hostname,I={},v=e.logId||(+new Date).toString(36)+Math.random().toString(36).substr(2,3),f=/^(?:http?:\\/\\/)([^\\/]+)/i;Math.random()<=d.sample&&i()}(window);</script><script inline=\"\" type=\"text/javascript\" defer=\"\" src=\"https://xlab.baidu.com/res/bundle.z.php\"></script><script defer=\"\" type=\"text/javascript\" src=\"//tb5.bdstatic.com/api/wza/aria.js?appid=c890648bf4dd00d05eb9751dd0548c30\" charset=\"”utf-8”\" id=\"aria\"></script><script type=\"text/javascript\">!function(){\"use strict\";if(window.radar){var t=document.createElement(\"script\");t.src=\"//tb3.bdstatic.com/radar-sdk/prod/js/2.0.0/es3/radar.min.js?t=\"+(new Date).getTime(),document.getElementsByTagName(\"body\")[0].appendChild(t)}}();</script><script src=\"//tb3.bdstatic.com/radar-sdk/prod/js/2.0.0/es3/radar.min.js?t=1722965479433\"></script><script type=\"text/javascript\">        window.weirwoodParams = {\"common\":{\"buildid\":\"pc__pb\",\"token\":\"37c001b924cf44f9b4801f02747b4693\",\"ignoreUrls\":[]},\"error\":{\"sampleRate\":0.002,\"collectWindowErrors\":true,\"collectUnhandledRejections\":true,\"collectResourceLoadErrors\":true},\"perf\":{\"sampleRate\":0.002,\"spa\":false,\"history\":true}};        !function(){\"use strict\";function r(o){return function(o){if(Array.isArray(o)){for(var e=0,r=new Array(o.length);e<o.length;e++)r[e]=o[e];return r}}(o)||function(o){if(Symbol.iterator in Object(o)||\"[object Arguments]\"===Object.prototype.toString.call(o))return Array.from(o)}(o)||function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance\")}()}var o;(o=document.createElement(\"script\")).src=\"https://dmpstatic.cdn.bcebos.com/weirwood-sdk/1/1.3.7/bundle.min.js\",o.onload=function(){var e=Weirwood.init(window.spaWeirwoodParams||window.weirwoodParams);__tieba__weirwood__.jsExceptions.forEach(function(o){var e;(e=window).onerror.apply(e,r(o))}),__tieba__weirwood__.resourceExceptions.forEach(function(o){__tieba__weirwood__.weirwoodResourceListener(o)}),__tieba__weirwood__.apiExceptions.forEach(function(o){window.onunhandledrejection(o)}),__tieba__weirwood__.customExceptions.forEach(function(o){e.error.captureException(o)}),window.addEventListener=__tieba__weirwood__.windowAddEventListener,__tieba__weirwood__.reportException=e.error.captureException.bind(e.error)},document.body.appendChild(o)}();</script><script src=\"https://dmpstatic.cdn.bcebos.com/weirwood-sdk/1/1.3.7/bundle.min.js\"></script><script type=\"text/javascript\">var templateName = \"bright\\/bright.php\" || 'noTemplateName';var moduleName = \"pb\" || 'noModuleName';templateName = templateName.split('/')[0]; /* task：online_template；locate: 模版名称；page：模块名称；*/ $.stats.track(templateName, 'online_template', moduleName, 'view');</script><script>var parisUrl = '//tb3.bdstatic.com/api/acs/paris-v2.min.js';$.stats.importScript(parisUrl, {        retryCount: 3,        successCallback: function() {            if (!ParisFactory) {                return;            }            ParisFactory.create({                sid: 2027,                timeout: 5000,                acsUrl: 'https://dlswbr.baidu.com/heicha/mm/2027/acs-2027.js',                disasterConfig: {                    acsUrl: 'https://miaowu.baidu.com/sdk/heicha/mm/2027/acs-2027.js',                }            });        },        failureCallback: function() {            $.stats.track('acs_paris', 'acs_paris_load_fail', 'common', 'view');        }    })</script><script src=\"//tb3.bdstatic.com/api/acs/paris-v2.min.js\"></script><script>    (() => {        if(window.PerformanceObserver && window.performance) {            /** 打点未添加图片防盗链的图片请求 */            function trackLostAntiTheftChain(resources) {                var antiTheftUrlRegexp = /^https?:\\/\\/tiebapic.baidu.com/;                for(var resource of resources) {                    /** 图片防盗链例子：http://tiebapic.baidu.com/tieba/pic/item/2934349b033b5bb5d15bec2473d3d539b700bc58.jpg?tbpicau=2022-07-15-17_a2216276f09dcac2ede6c16a81d97751 */                    if(antiTheftUrlRegexp.test(resource.name)) {                        if(resource.name.indexOf('tbpicau') === -1) {                            var templateName = \"bright\\/bright.php\" || 'noTemplateName';                            var moduleName = \"pb\" || 'noModuleName';                            templateName = templateName.split('/')[0];                            /* locate: 模版名称; task：anti_theft; page：模块名称; type: view */                             $.stats.track(templateName, 'anti_theft', moduleName, 'view', {resourceURL: resource.name});                        }                    }                }            }            /** DOMContentLoaded -> load */            var observer = new PerformanceObserver((loadedResources) => {                trackLostAntiTheftChain(loadedResources.getEntries());            });            observer.observe({entryTypes: ['resource']});            /** navigationStart -> DOMContentLoaded */            var DOMContentLoadedResources = window.performance.getEntriesByType('resource');            trackLostAntiTheftChain(DOMContentLoadedResources);        }    })()</script><script src=\"https://hector.baidu.com/a.js\" defer=\"\"></script><main class=\"svelte-zmnt4x\"></main><iframe style=\"display: none !important;\" id=\"aria7m8m0w7gya4\"></iframe><div id=\"monica-content-root\" class=\"monica-widget\"></div></body><chatgpt-sidebar data-gpts-theme=\"light\"></chatgpt-sidebar><chatgpt-sidebar-popups data-gpts-theme=\"light\"></chatgpt-sidebar-popups></html>"
  },
  {
    "path": "media_platform/tieba/test_data/note_detail.html",
    "content": "<html><script type=\"text/javascript\" async=\"\" src=\"https://pos.baidu.com/auto_dup?di=0&amp;uuid=5ded6665513a5df6&amp;dri=0&amp;dis=0&amp;dai=0&amp;ps=0x0&amp;enu=encoding&amp;exps=110011&amp;ant=0&amp;psi=fafa0818e41f3a15&amp;dcb=___baidu_union_callback&amp;dtm=AUTO_JSONP&amp;dvi=0.0&amp;dci=-1&amp;dpt=none&amp;tpr=1722942841598&amp;ti=%E5%AF%B9%E4%BA%8E%E4%B8%80%E4%B8%AA%E7%88%B6%E4%BA%B2%E6%9D%A5%E8%AF%B4%EF%BC%8C%E8%BF%99%E4%B8%AA%E5%A5%B3%E5%84%BF14%E5%B2%81%E5%B0%B1%E6%AD%BB%E4%BA%86%E3%80%90%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9%E5%90%A7%E3%80%91_%E7%99%BE%E5%BA%A6%E8%B4%B4%E5%90%A7&amp;ari=2&amp;ver=0722&amp;kws=%E7%99%BE%E5%BA%A6%E8%B4%B4%E5%90%A7%2C%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9%2C14%2C%E4%BA%8E%E4%B8%80%2C%E4%B8%AA%E7%88%B6&amp;dps=%E5%AF%B9%E4%BA%8E%E4%B8%80%E4%B8%AA%E7%88%B6%E4%BA%B2%E6%9D%A5%E8%AF%B4%EF%BC%8C%E8%BF%99..%E5%8F%9B%E9%80%86%E6%9C%9F%EF%BC%8C%E6%98%AF%E6%88%91%E6%87%82%E7%9A%84%E9%82%A3%E4%B8%AA%E5%90%97%3F%E5%B0%B1%E6%98%AF%E5%92%92%E4%BB%96%E7%88%B8%E8%A6%81%E6%AD%BB%E8%BF%98%E6%89%BE%E7%83%82%E4%BB%94%E6%9D%A5%E5%AF%B9%E4%BB%98%E4%BB%96%E7%88%B8%EF%BC%8C%E7%BB%99%E4%BA%BA%E5%BD%93%E8%A1%97%E4%B8%80%E9%A1%BF%E6%89%93%E8%87%AA%E5%B7%B1%E8%B7%91%E8%B7%AF%E4%BA%86%E9%82%A3%E4%B8%AA%E5%90%97%3F%E8%A6%81%E6%88%91%E8%AF%B4&amp;dbv=2&amp;drs=1&amp;pcs=2545x1230&amp;pss=2545x16682&amp;cfv=0&amp;cpl=5&amp;chi=2&amp;cce=true&amp;cec=UTF-8&amp;tlm=1722942841&amp;prot=2&amp;rw=1230&amp;ltu=https%3A%2F%2Ftieba.baidu.com%2Fp%2F9117905169%3F&amp;ltr=https%3A%2F%2Ftieba.baidu.com%2Fp%2F9117905169%3Fsee_lz%3D1&amp;ecd=1&amp;dft=0&amp;uc=2560x1351&amp;pis=-1x-1&amp;sr=2560x1440&amp;tcn=1722942842&amp;dc=4&amp;aa=1\"></script><script src=\"https://dlswbr.baidu.com/heicha/mw/abclite-2027-s.js\"></script><script src=\"https://hm.baidu.com/hm.js?292b2e1608b0823c1cb6beef7243ef34\"></script><head><meta name=\"keywords\" content=\"百度贴吧,以太比特,14,于一,个父\"><meta name=\"description\" content=\"对于一个父亲来说，这..叛逆期，是我懂的那个吗?就是咒他爸要死还找烂仔来对付他爸，给人当街一顿打自己跑路了那个吗?要我说，父母都体现出最大的斯文和忍让了，换作素质低点的可能牙齿都给人干碎了。\"><meta charset=\"UTF-8\"><meta furl=\"tieba.baidu.com/f?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8\" fname=\"以太比特\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=10,chrome=1\"><meta name=\"baidu-site-verification\" content=\"jpBCrwX689\"><meta name=\"baidu-site-verification\" content=\"code-ku2CCMz5nv\"><link rel=\"search\" type=\"application/opensearchdescription+xml\" href=\"/tb/cms/content-search.xml\" title=\"百度贴吧\"><title>对于一个父亲来说，这个女儿14岁就死了【以太比特吧】_百度贴吧</title><!--[if lt IE 9]><script>(function(){    var tags = ['header','footer','figure','figcaption','details','summary','hgroup','nav','aside','article','section','mark','abbr','meter','output','progress','time','video','audio','canvas','dialog'];    for(var i=tags.length - 1;i>-1;i--){ document.createElement(tags[i]);}})();</script><![endif]--><link rel=\"shortcut icon\" href=\"//tb3.bdstatic.com/public/icon/favicon-v2.ico\">    <script type=\"text/javascript\" id=\"weirwood-init-script\">            !function(){\"use strict\";function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function a(t,e){var n=Object.keys(t);return Object.getOwnPropertySymbols&&n.push.apply(n,Object.getOwnPropertySymbols(t)),e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n}var e=new(function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,e),this.frame=0,this.fpsStandard=30,this.durationCount=2,this.trackData={},this.stateChangeHandler=this.stateChange.bind(this)}return function(e,t,n){t&&i(e.prototype,t),n&&i(e,n)}(e,[{key:\"start\",value:function(e,t,n){+e.fpsStandard&&(this.fpsStandard=+e.fpsStandard),+e.durationCount&&(this.durationCount=+e.durationCount),this.trackData=t||{},this.callback=n,this.init(),document.addEventListener(\"visibilitychange\",this.stateChangeHandler)}},{key:\"stop\",value:function(){this.disconnect(),document.removeEventListener(\"visibilitychange\",this.stateChangeHandler)}},{key:\"init\",value:function(){var o=this;this.frame=0,this.frameLoop(),this.lastTime=Date.now(),this.fpsList=[],this.fpsInterval=setInterval(function(){var e=Date.now(),t=e-o.lastTime,n=1e3*o.frame/t;if(o.lastTime=e,o.frame=0,o.fpsList.push(n),o.fpsList.length>o.durationCount&&o.fpsList.shift(),Math.round(t/1e3)>o.durationCount||o.fpsList.every(function(e){return e<o.fpsStandard})){var i=function(r){for(var e=1;e<arguments.length;e++){var o=null!=arguments[e]?arguments[e]:{};e%2?a(o,!0).forEach(function(e){var t,n,i;t=r,i=o[n=e],n in t?Object.defineProperty(t,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[n]=i}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(o)):a(o).forEach(function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(o,e))})}return r}({fps:o.fpsList},o.trackData),r=new Error(JSON.stringify(i));r.name=\"fpsError\";try{__tieba__weirwood__.reportException(r)}catch(e){throw r}o.callback&&o.callback()}},1e3)}},{key:\"frameLoop\",value:function(){this.frame++,this.frsRequestFrame=window.requestAnimationFrame(this.frameLoop.bind(this))}},{key:\"stateChange\",value:function(){\"hidden\"===document.visibilityState?this.disconnect():this.init()}},{key:\"disconnect\",value:function(){this.fpsInterval&&clearInterval(Number(this.fpsInterval)),this.frsRequestFrame&&cancelAnimationFrame(Number(this.frsRequestFrame))}}]),e}());!function(){try{window.__tieba__weirwood__={jsExceptions:[],resourceExceptions:[],apiExceptions:[],customExceptions:[],weirwoodResourceListener:null,jsListener:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];__tieba__weirwood__.jsExceptions.push(t)},resourceListener:function(e){-1!==[\"SCRIPT\",\"LINK\",\"IMG\",\"OBJECT\",\"IFRAME\",\"FRAME\"].indexOf(e.target.tagName)&&__tieba__weirwood__.resourceExceptions.push(e)},apiListener:function(e){__tieba__weirwood__.apiExceptions.push(e)},windowAddEventListener:window.addEventListener,reportException:function(e){__tieba__weirwood__.customExceptions.push(e)},fpsObserver:e};var a=/\\\"SCRIPT\\\",\\\"LINK\\\",\\\"IMG\\\"/;__tieba__weirwood__.windowAddEventListener&&(window.addEventListener=function(e,t){var n;\"error\"===e&&a.test(t.toString())&&(__tieba__weirwood__.weirwoodResourceListener=t);for(var i=arguments.length,r=new Array(2<i?i-2:0),o=2;o<i;o++)r[o-2]=arguments[o];return(n=__tieba__weirwood__.windowAddEventListener).call.apply(n,[window,e,t].concat(r))},window.onerror=__tieba__weirwood__.jsListener,window.addEventListener(\"error\",__tieba__weirwood__.resourceListener,!0),window.addEventListener(\"unhandledrejection\",__tieba__weirwood__.apiListener))}catch(e){}}()}();        </script>    <link rel=\"canonical\" href=\"//tieba.baidu.com/p/9117905169\"><script type=\"text/javascript\" defer=\"\" src=\"https://hectorstatic.baidu.com/1371300bc53d20f8.js\"></script>\n<link rel=\"stylesheet\" href=\"//tb1.bdstatic.com/??tb/static-common/style/tb_ui_fb24b59.css,tb/static-common/style/tb_common_89ff863.css\">\n<link rel=\"stylesheet\" href=\"//tb1.bdstatic.com/??/tb/_/card_a71b18a.css,/tb/_/js_pager_5be1e39.css,/tb/_/login_dialog_576d425.css,/tb/_/user_head_35f26e0.css,/tb/_/icons_2fd4588.css,/tb/_/wallet_dialog_1dc8782.css,/tb/_/flash_lcs_d41d8cd.css,/tb/_/new_message_system_53904e7.css,/tb/_/base_user_data_21c823c.css,/tb/_/cashier_dialog_ef027d2.css,/tb/_/creative_bar_560213f.css,/tb/_/qianbao_cashier_dialog_4c73f91.css,/tb/_/base_dialog_user_bar_d089a50.css,/tb/_/qianbao_purchase_member_452e113.css,/tb/_/pay_member_d41d8cd.css,/tb/_/http_transform_d41d8cd.css,/tb/_/official_bar_b4be455.css,/tb/_/userbar_bf3b266.css,/tb/_/poptip_f0fdc70.css,/tb/_/conf_skin_e7f8d17.css,/tb/_/platform_skin_a109270.css,/tb/_/pageskin_32b2c20.css,/tb/_/suggestion_41d3e9a.css,/tb/_/search_bright_e9471f1.css,/tb/_/snowflow_45a89bb.css,/tb/_/bright_6be6ada.css,/tb/_/attention_category_game_1e9cfe3.css,/tb/_/slide_show_aad29db.css,/tb/_/stock_banner_cceddb9.css,/tb/_/vip_dialog_44319b9.css\">\n<link rel=\"stylesheet\" href=\"//tb1.bdstatic.com/??/tb/_/dialog_6ed86bb.css,/tb/_/cont_sign_card_24bfda0.css,/tb/_/sign_tip_7f44335.css,/tb/_/sign_mod_bright_89ea30c.css,/tb/_/medal_a1f52a8.css,/tb/_/forum_card_beea95b.css,/tb/_/my_often_forum_237a2ee.css,/tb/_/tbnav_bright_fd2abd1.css,/tb/_/pager_9877ab4.css,/tb/_/share_74ded87.css,/tb/_/verify_manager_phone_f76b21c.css,/tb/_/block_user_84f09d6.css,/tb/_/forbid_speech_9a7a37c.css,/tb/_/paypost_agree_dialog_fd57709.css,/tb/_/admin_b3de171.css,/tb/_/to_frs_4ae81b8.css,/tb/_/no_refresh_pager_517ba2f.css,/tb/_/verify_dialog_74d8af1.css,/tb/_/favthread_c74c255.css,/tb/_/like_tip_a256b20.css,/tb/_/paykey_dialog_8f2a8db.css,/tb/_/paykey_mobile_9ab2a52.css,/tb/_/tbean_safe_3c779a3.css,/tb/_/payment_dialog_title_493782f.css,/tb/_/qianbao_purchase_tdou_4b31f54.css,/tb/_/tdou_get_de33d2b.css,/tb/_/tcharge_dialog_a6fd677.css,/tb/_/tb_region_e558306.css,/tb/_/umoney_query_0a188d5.css,/tb/_/nameplate_ecf7604.css\">\n<link rel=\"stylesheet\" href=\"//tb1.bdstatic.com/??/tb/_/my_current_forum_274c0a1.css,/tb/_/tb_spam_814ec43.css,/tb/_/my_tieba_4a1aa01.css,/tb/_/rich_ueditor_3283067.css,/tb/_/pic_act_poster_38b0720.css,/tb/_/follower_bc7c9ff.css,/tb/_/forum_title_a7a033e.css,/tb/_/novel_icons_8d150ae.css,/tb/_/save_face_fa1020d.css,/tb/_/pb_marry_ecbd581.css,/tb/_/fengchao_pb_feed_c7fdae2.css,/tb/_/promoter_master_house_9b0d01e.css,/tb/_/promoter_fans_supprise_bba005a.css,/tb/_/residual_87ce152.css,/tb/_/single_icons_3112de2.css,/tb/_/pb_author_d843ad0.css,/tb/_/novel_award_dialog_7b95981.css,/tb/_/novel_award_thread_d41d8cd.css,/tb/_/diamond_bind_mob_603bf34.css,/tb/_/grab_treasure_report_1152cd7.css,/tb/_/treasure_payment_dialog_de1650b.css,/tb/_/treasure_rule_dialog_021b23c.css,/tb/_/grab_treasure_ctrl_47136a4.css,/tb/_/pb_grab_treasure_2be04cb.css,/tb/_/scroll_panel_eb74727.css,/tb/_/promoter_post_opts_df5e95d.css,/tb/_/promoter_post_body_5da1d7c.css,/tb/_/post_tpoint_skin_dc0a7bb.css,/tb/_/idisk_5c0175c.css,/tb/_/paypost_guide_2bcd461.css\">\n<link rel=\"stylesheet\" href=\"//tb1.bdstatic.com/??/tb/_/paypost_6652964.css,/tb/_/content_recommend_04b27f3.css,/tb/_/gift_page_ctrl_4f3b88d.css,/tb/_/gift_loading_css_e2c23e9.css,/tb/_/send_gift_dialog_5d44fcd.css,/tb/_/pb_post_foot_send_gift_567544c.css,/tb/_/props_api_48f4f3d.css,/tb/_/tail_9e503e0.css,/tb/_/complient_thread_6dbe6e6.css,/tb/_/sub_list_970ecfb.css,/tb/_/forbid_speech_banner_f77182c.css,/tb/_/post_body_9d9f5e0.css,/tb/_/icon_tip_db299f2.css,/tb/_/tbshare_dc77707.css,/tb/_/card_0f960cd.css,/tb/_/post_list_97d41a1.css,/tb/_/forum_member_dialog_54bcbdc.css,/tb/_/exp_package_dialog_0658eb6.css,/tb/_/celebrity_widget_a846795.css,/tb/_/celebrity_forum_dialog_c86b274.css,/tb/_/guide_40dd704.css,/tb/_/interaction_d4668aa.css,/tb/_/month_icon_c245f06.css,/tb/_/user_visit_card_3010a85.css,/tb/_/head_preview_2d66852.css,/tb/_/buy_controller_da2afc7.css,/tb/_/celebrity_expball_7db46a5.css,/tb/_/celebrity_de017d6.css,/tb/_/aside_ad_d0e7d6c.css,/tb/_/app_download_7afdfb3.css\">\n<link rel=\"stylesheet\" href=\"//tb1.bdstatic.com/??/tb/_/video_player_ebb96a6.css,/tb/_/avideo_b97cdbe.css,/tb/_/search_back_e528995.css,/tb/_/topic_rank_085edda.css,/tb/_/spider_thread_recommend_0db4928.css,/tb/_/notice_7be1fa6.css,/tb/_/news_recommend_a1b3be3.css,/tb/_/showlist_45d286d.css,/tb/_/cps_ad_dcff595.css,/tb/_/duoku_servers_dialog_60e3165.css,/tb/_/duoku_servers_list_5d2afff.css,/tb/_/game_swap_words_ae08f57.css,/tb/_/thread_footer_43a88b5.css,/tb/_/scroll_panel_eb74727.css,/tb/_/custom_emotion_2d0490a.css,/tb/_/ueditor_emotion_8ff59b7.css,/tb/_/independent_emotion_bacfb1e.css,/tb/_/simple_poster_3c87768.css,/tb/_/word_limit_3c5481d.css,/tb/_/post_guessing_new_6962194.css,/tb/_/complaint_bar_owner_444c0fd.css,/tb/_/quick_reply_edit_f958ea8.css,/tb/_/post_marry_3ea54fd.css,/tb/_/rich_poster_812c34a.css,/tb/_/music_player_768d3e7.css,/tb/_/no_auto_video_258d904.css,/tb/_/voice_1254e97.css,/tb/_/meizhi_vote_3317f30.css,/tb/_/achieve_card_667ea68.css,/tb/_/fancard_9a01890.css\">\n<link rel=\"stylesheet\" href=\"//tb1.bdstatic.com/??/tb/_/xiu8_follow_warn_05c0a67.css,/tb/_/locality_pop_window_f10628a.css,/tb/_/platform_spread_layer_6bc2cd1.css,/tb/_/pk_fixed_bubble_2ffe171.css,/tb/_/platform_spread_video_f735452.css,/tb/_/image_flash_editor_74399a4.css,/tb/_/editor_pic_meizhi_de1b9cf.css,/tb/_/meizhi_postor_8cc4278.css,/tb/_/frs_stamp_notice_4756b7e.css,/tb/_/interest_smiley_19518d2.css,/tb/_/comtrial_907cfaf.css,/tb/_/skin_click_6ad5c16.css,/tb/_/game_pop_window_5c57ec5.css,/tb/_/share_thread_afd8b78.css,/tb/_/url_check_3923d6f.css,/tb/_/residual_87ce152.css,/tb/_/magic_props_eedd477.css,/tb/_/feedback_b53cf14.css,/tb/_/nameplate_recast_982421e.css,/tb/_/tshow_out_date_warn_9bdad5d.css,/tb/_/umoney_promotion_dialog_c159e0e.css,/tb/_/advertise_right_e986075.css,/tb/_/grab_treasure_dialog_success_a7da6c4.css,/tb/_/fixed_bar_fbd9428.css,/tb/_/bazhu_fixed_daoliu_bar_c763972.css,/tb/_/fixed_daoliu_bc7dfde.css,/tb/_/bright_b5494ba.css,/tb/_/tope_e1fb72f.css,/tb/_/thread_recommend_d41d8cd.css,/tb/_/info_collection_0719958.css\">\n<link rel=\"stylesheet\" href=\"//tb1.bdstatic.com/??/tb/_/grade_73b75ae.css,/tb/_/aside_float_bar_6a6b889.css,/tb/_/magic_props_2e28130.css\">\n        <script>    var PageData = {        \"tbs\": \"6aefff9e364cb9e41722942842\",        \"charset\": \"UTF-8\",        \"product\": \"pb\",        \"page\": \"pb_bright\"    };    var yyConfig = {\"yy_is_convert\":1,\"yy_pay_open\":1,\"yy_scores\":0};    var userIdentity = {\"is_tiebaplus_agent\":0,\"is_business_agent\":0};    PageData.user = {        \"id\": \"1527556343\",        \"user_id\": \"1527556343\",        \"name\": \"抗压吧吧务666\",        \"user_name\": \"抗压吧吧务666\",        \"user_nickname\" : \"\",        \"show_nickname\" : \"抗压吧吧务666\",        \"name_url\": \"&ie=utf-8\",        \"no_un\": 0,        \"is_login\": 1,        \"portrait\": \"tb.1.e6057aec.PmFeyCvKVx0KZKdGZ2v9oA?t=1420595544\",        \"balv\": {}, /* Ban 这个模块真够讨厌的 */\"Parr_props\": {\"all_level\":{\"2\":{\"end_time\":\"1421113470\",\"level\":2,\"score_limit\":8000}},\"level\":{\"end_time\":\"1421113470\",\"expired_notify\":1,\"expiring_notify\":1,\"left_num\":0,\"max_free_score\":8000,\"open_status\":null,\"pic_url\":null,\"props_category\":105,\"props_id\":2,\"props_type\":0,\"update_time\":null,\"used_status\":1}},\"Parr_scores\": null,\"mParr_props\": {\"all_level\":{\"2\":{\"end_time\":\"1421113470\",\"level\":2,\"pic_url\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/6afa80cb39dbb6fdf9de234d0b24ab18962b37f0.jpg\",\"score_limit\":8000}},\"level\":{\"end_time\":\"1421113470\",\"pic_url\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/6afa80cb39dbb6fdf9de234d0b24ab18962b37f0.jpg\",\"props_id\":2}},        \"vipInfo\": {\"a_score\":-50,\"e_time\":\"1421113470\",\"ext_score\":\"0\",\"icon_url\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/icon_crown_super_non1.png\",\"n_score\":2600,\"s_time\":\"1542729600\",\"v_level\":1,\"v_status\":\"0\",\"y_score\":1000},        \"new_iconinfo\": {\"1\":{\"slot_no\":\"1\",\"slot_type\":\"0\",\"icon\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429669987762.png\",\"value\":\"1\",\"end_time\":\"1735660800\",\"name\":\"starmaster\",\"level\":\"6\",\"weight\":1,\"position\":{\"frs\":1,\"pb\":1,\"home\":1,\"card\":1},\"terminal\":{\"pc\":1,\"wap\":1,\"client\":1},\"sprite\":{\"1\":\"1722691615,76\",\"2\":\"1722691615,77\",\"3\":\"1722691615,78\",\"4\":\"1722691615,79\",\"5\":\"1722691615,80\",\"6\":\"1722691615,81\"},\"category_id\":104,\"type\":2,\"price\":0,\"is_force\":0,\"is_advanced\":0,\"title\":\"\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\",\"level_1\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429669987762.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429669999852.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670005742.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670015949.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670023838.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670037795.png\",\"level_info\":{\"title\":\"\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}},\"level_2\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670195809.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670205542.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670220878.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670227517.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670235465.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670242217.png\",\"level_info\":{\"title\":\"\\u624b\\u6e381\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e381\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}},\"level_3\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670307639.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670315211.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670322063.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670328302.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670335960.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670342374.png\",\"level_info\":{\"title\":\"\\u624b\\u6e382\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e382\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}},\"level_4\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670565360.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670572100.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670579403.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670588885.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670595104.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670602958.png\",\"level_info\":{\"title\":\"\\u624b\\u6e383\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e383\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}},\"level_5\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670665956.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670671915.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670677756.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670683824.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670689692.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670695382.png\",\"level_info\":{\"title\":\"\\u624b\\u6e384\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e384\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}},\"level_6\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670737569.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670746212.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670751930.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670757612.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670763174.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670769025.png\",\"level_info\":{\"title\":\"\\u624b\\u6e385\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e385\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}}}},        \"power\": {},        \"pb_login_switch\": false,        \"is_videocreator\": 0,        \"interaction_switch\": false,        \"no_login_user_browse_switch\": null,        \"login_popup_phone_switch\": null,        \"login_day\": 5,        \"open_switch\": +yyConfig.yy_pay_open,        \"open_convert\": +yyConfig.yy_is_convert,        \"yy_scores\": yyConfig.yy_scores && +yyConfig.yy_scores || 0,        \"is_business_agent\": 0 || userIdentity.is_business_agent,        \"is_tiebaplus_agent\": 0 ||  userIdentity.is_tiebaplus_agent,        \"is_business_account\": 0,    };    PageData.search_what = \"\";    var Env = {        server_time: 1722942843000};    var Tbs = {\"forward\":\"ee2485da5959d883\",\"follow\":\"8b75b056990cbc81\",\"upload_img\":\"565fbde35a81c207017229428420125500_1\",\"common\":\"6aefff9e364cb9e41722942842\",\"rp\":\"4b0197e35b46235cb4cee4c2\"};    if (yyConfig.yy_pay_open === 1 && yyConfig.yy_is_convert === 1) {        var user = PageData.user;        if (!user.Parr_scores) {            user.Parr_scores = {};        }        user.Parr_scores.scores_money = user.yy_scores;        user.Parr_scores.scores_other = 0;        user.Parr_scores.scores_total = user.yy_scores;    }</script><script type=\"text/javascript\">function resizePic_temp(e,t,i,s,n){function r(e,t,i,s){var n=0,r=e,a=t;switch(e>i&&(n+=1),t>s&&(n+=2),n){case 1:r=i,a=t*i/e;case 2:a=s,r=e*s/t;case 3:a=t/s>e/i?s:t*i/e,r=t/s>e/i?e*s/t:i}return 0!=n&&(l=!0),[r,a]}var a=t||120,c=i||120,l=!1,p=new Image;p.src=e.src;var h=r(p.width,p.height,a,c);return e.style.width=h[0]+\"px\",e.style.height=h[1]+\"px\",\"function\"==typeof n&&n.apply(this,arguments),e.style.visibility=\"visible\",1==s&&(e.style.marginTop=(i-parseInt(h[1]))/2+\"px\"),p=null,l}</script>        <script type=\"text/javascript\">                ;(function() {                    var track = function(locate,task,page,type, extra){                        if (page && typeof page == 'object') { extra = page; page = ''; }                        if (type && typeof type == 'object') { extra = type; type = ''; }                        if (document.images) {                            var img = new Image();                            window[\"bd_pv_\" + (new Date().getTime())] = img;                            var trackUrl;                            if (document.location.protocol === 'https:') {                                trackUrl = \"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/img/track.gif?\";                            }                            else {                                trackUrl = \"http://static.\"+\"tieba.baidu.com/tb/img/track.gif?\";                            }                            var paramArr = [                                \"client_type=pc_web\",                                \"task=\" + (task && encodeURIComponent(task) || \"\"),                                \"locate=\" + (locate && encodeURIComponent(locate) || \"\"),                                \"type=\" + (type && encodeURIComponent(type) || \"click\"),                                \"url=\" + encodeURIComponent(document.location.href),                                \"refer=\" + encodeURIComponent(document.referrer)                            ];                            if(PageData){                                paramArr.push(\"page=\" + (page || PageData.product || \"\"));                                if(PageData.forum){                                    paramArr.push(\"fid=\" + (PageData.forum.forum_id || \"\"));                                    paramArr.push(\"fname=\" + encodeURIComponent(PageData.forum.forum_name || \"\"));                                }                                if(PageData.user){                                    paramArr.push(\"uid=\" + (PageData.user.user_id || PageData.user.user_id || \"\"));                                    paramArr.push(\"uname=\" + encodeURIComponent(PageData.user.user_name || \"\"));                                    paramArr.push(\"is_new_user=\" + (PageData.user.is_new_user || \"\"));                                }                                if(PageData.thread){                                    paramArr.push(\"tid=\" + ((PageData.thread && PageData.thread.thread_id) || \"\"));                                }                            }                            for (var i in extra) {                                if (extra.hasOwnProperty(i)) {                                    paramArr.push(i + \"=\" + encodeURIComponent(extra[i]));                                }                            }                            trackUrl += paramArr.join(\"&\");                                                 img.src = trackUrl + \"&t=\" + new Date().getTime();                            img = null;                        }                    };                    track('pb_pv', 'pb_normal', 'pb', 'show');                    })();</script>        <script type=\"text/javascript\" id=\"radar-init-script\">!function(){\"use strict\";function n(n,t){return n(t={exports:{}},t.exports),t.exports}function i(n){return\"object\"==typeof n?null!==n:\"function\"==typeof n}function o(n){if(!i(n))throw TypeError(n+\" is not an object!\");return n}function t(n){try{return!!n()}catch(t){return!0}}function c(n,t){return h.call(n,t)}function f(n){return\"Symbol(\".concat(n===undefined?\"\":n,\")_\",(++d+g).toString(36))}function u(n){if(\"function\"!=typeof n)throw TypeError(n+\" is not a function!\");return n}function y(e,o,n){if(u(e),o===undefined)return e;switch(n){case 1:return function(n){return e.call(o,n)};case 2:return function(n,t){return e.call(o,n,t)};case 3:return function(n,t,r){return e.call(o,n,t,r)}}return function(){return e.apply(o,arguments)}}var v=n(function(n){var t=n.exports=\"undefined\"!=typeof window&&window.Math==Math?window:\"undefined\"!=typeof self&&self.Math==Math?self:Function(\"return this\")();\"number\"==typeof __g&&(__g=t)}),m=n(function(n){var t=n.exports={version:\"2.6.9\"};\"number\"==typeof __e&&(__e=t)}),p=(m.version,!t(function(){return 7!=Object.defineProperty({},\"a\",{get:function(){return 7}}).a})),r=v.document,e=i(r)&&i(r.createElement),a=!p&&!t(function(){return 7!=Object.defineProperty(function(n){return e?r.createElement(n):{}}(\"div\"),\"a\",{get:function(){return 7}}).a}),s=Object.defineProperty,l={f:p?Object.defineProperty:function(n,t,r){if(o(n),t=function(n,t){if(!i(n))return n;var r,e;if(t&&\"function\"==typeof(r=n.toString)&&!i(e=r.call(n)))return e;if(\"function\"==typeof(r=n.valueOf)&&!i(e=r.call(n)))return e;if(!t&&\"function\"==typeof(r=n.toString)&&!i(e=r.call(n)))return e;throw TypeError(\"Can't convert object to primitive value\")}(t,!0),o(r),a)try{return s(n,t,r)}catch(e){}if(\"get\"in r||\"set\"in r)throw TypeError(\"Accessors not supported!\");return\"value\"in r&&(n[t]=r.value),n}},w=p?function(n,t,r){return l.f(n,t,function(n,t){return{enumerable:!(1&n),configurable:!(2&n),writable:!(4&n),value:t}}(1,r))}:function(n,t,r){return n[t]=r,n},h={}.hasOwnProperty,d=0,g=Math.random(),b=n(function(n){var t=\"__core-js_shared__\",r=v[t]||(v[t]={});(n.exports=function(n,t){return r[n]||(r[n]=t!==undefined?t:{})})(\"versions\",[]).push({version:m.version,mode:\"global\",copyright:\"© 2019 Denis Pushkarev (zloirock.ru)\"})}),E=b(\"native-function-to-string\",Function.toString),O=n(function(n){var i=f(\"src\"),t=\"toString\",u=(\"\"+E).split(t);m.inspectSource=function(n){return E.call(n)},(n.exports=function(n,t,r,e){var o=\"function\"==typeof r;o&&(c(r,\"name\")||w(r,\"name\",t)),n[t]!==r&&(o&&(c(r,i)||w(r,i,n[t]?\"\"+n[t]:u.join(String(t)))),n===v?n[t]=r:e?n[t]?n[t]=r:w(n,t,r):(delete n[t],w(n,t,r)))})(Function.prototype,t,function(){return\"function\"==typeof this&&this[i]||E.call(this)})}),j=\"prototype\",S=function(n,t,r){var e,o,i,u,c=n&S.F,f=n&S.G,a=n&S.S,s=n&S.P,l=n&S.B,p=f?v:a?v[t]||(v[t]={}):(v[t]||{})[j],h=f?m:m[t]||(m[t]={}),d=h[j]||(h[j]={});for(e in f&&(r=t),r)i=((o=!c&&p&&p[e]!==undefined)?p:r)[e],u=l&&o?y(i,v):s&&\"function\"==typeof i?y(Function.call,i):i,p&&O(p,e,i,n&S.U),h[e]!=i&&w(h,e,u),s&&d[e]!=i&&(d[e]=i)};v.core=m,S.F=1,S.G=2,S.S=4,S.P=8,S.B=16,S.W=32,S.U=64,S.R=128;function _(n){return C.call(n).slice(8,-1)}function R(n){if(n==undefined)throw TypeError(\"Can't call method on  \"+n);return n}function A(n){return D(R(n))}function F(n){return isNaN(n=+n)?0:(0<n?I:L)(n)}function P(n){return 0<n?B(F(n),9007199254740991):0}function k(n){return Object(R(n))}var M,T,x=S,C={}.toString,D=Object(\"z\").propertyIsEnumerable(0)?Object:function(n){return\"String\"==_(n)?n.split(\"\"):Object(n)},L=Math.ceil,I=Math.floor,B=Math.min,N=Math.max,z=Math.min,G=b(\"keys\"),U=(M=!1,function(n,t,r){var e,o=A(n),i=P(o.length),u=function(n,t){return(n=F(n))<0?N(n+t,0):z(n,t)}(r,i);if(M&&t!=t){for(;u<i;)if((e=o[u++])!=e)return!0}else for(;u<i;u++)if((M||u in o)&&o[u]===t)return M||u||0;return!M&&-1}),q=G[T=\"IE_PROTO\"]||(G[T]=f(T)),W=\"constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf\".split(\",\"),Y=Object.keys||function(n){return function(n,t){var r,e=A(n),o=0,i=[];for(r in e)r!=q&&c(e,r)&&i.push(r);for(;t.length>o;)c(e,r=t[o++])&&(~U(i,r)||i.push(r));return i}(n,W)},$={f:Object.getOwnPropertySymbols},H={f:{}.propertyIsEnumerable},J=Object.assign,K=!J||t(function(){var n={},t={},r=Symbol(),e=\"abcdefghijklmnopqrst\";return n[r]=7,e.split(\"\").forEach(function(n){t[n]=n}),7!=J({},n)[r]||Object.keys(J({},t)).join(\"\")!=e})?function(n,t){for(var r=k(n),e=arguments.length,o=1,i=$.f,u=H.f;o<e;)for(var c,f=D(arguments[o++]),a=i?Y(f).concat(i(f)):Y(f),s=a.length,l=0;l<s;)c=a[l++],p&&!u.call(f,c)||(r[c]=f[c]);return r}:J;x(x.S+x.F,\"Object\",{assign:K});var Q=l.f,V=Function.prototype,X=/^\\s*function ([^ (]*)/;\"name\"in V||p&&Q(V,\"name\",{configurable:!0,get:function(){try{return(\"\"+this).match(X)[1]}catch(n){return\"\"}}});var Z,nn,tn,rn,en,on,un,cn,fn,an,sn,ln=Array.isArray||function(n){return\"Array\"==_(n)},pn=n(function(n){var t=b(\"wks\"),r=v.Symbol,e=\"function\"==typeof r;(n.exports=function(n){return t[n]||(t[n]=e&&r[n]||(e?r:f)(\"Symbol.\"+n))}).store=t})(\"species\"),hn=(tn=1==(Z=0),rn=2==Z,en=3==Z,on=4==Z,un=6==Z,cn=5==Z||un,fn=nn||function(n,t){return new(function(n){var t;return ln(n)&&(\"function\"!=typeof(t=n.constructor)||t!==Array&&!ln(t.prototype)||(t=undefined),i(t)&&null===(t=t[pn])&&(t=undefined)),t===undefined?Array:t}(n))(t)},function(n,t,r){for(var e,o,i=k(n),u=D(i),c=y(t,r,3),f=P(u.length),a=0,s=tn?fn(n,f):rn?fn(n,0):undefined;a<f;a++)if((cn||a in u)&&(o=c(e=u[a],a,i),Z))if(tn)s[a]=o;else if(o)switch(Z){case 3:return!0;case 5:return e;case 6:return a;case 2:s.push(e)}else if(on)return!1;return un?-1:en||on?on:s}),dn=(sn=!0,!!(an=[].forEach)&&t(function(){sn?an.call(null,function(){},1):an.call(null)}));x(x.P+x.F*!dn,\"Array\",{forEach:function(n){return hn(this,n,arguments[1])}});var yn={\"load.ready\":\"READAR_LOAD_READY\",\"perfamance.beforeReport\":\"PERFAMANCE_BEFORE_REPORT\"},vn=new(function(){function n(){this.events={}}var t=n.prototype;return t.on=function(n,t){(n=yn[n])&&(this.events[n]?this.events[n].push(t):this.events[n]=[t])},t.emit=function(n){for(var t=this,r=arguments.length,e=new Array(1<r?r-1:0),o=1;o<r;o++)e[o-1]=arguments[o];(n=yn[n])&&this.events&&this.events[n]&&this.events[n].forEach(function(n){return n.apply(t,e)})},t.off=function(r,e){var o=this;(r=yn[r])&&this.events[r]!==undefined&&0<this.events[r].length&&(e!==undefined?this.events[r].forEach(function(n,t){n===e&&o.events[r].splice(t,1)}):delete this.events[r])},t.clear=function(){this.events={}},n}()),mn=[].slice,wn={},gn=Function.bind||function(t){var r=u(this),e=mn.call(arguments,1),o=function(){var n=e.concat(mn.call(arguments));return this instanceof o?function(n,t,r){if(!(t in wn)){for(var e=[],o=0;o<t;o++)e[o]=\"a[\"+o+\"]\";wn[t]=Function(\"F,a\",\"return new F(\"+e.join(\",\")+\")\")}return wn[t](n,r)}(r,n.length,n):function(n,t,r){var e=r===undefined;switch(t.length){case 0:return e?n():n.call(r);case 1:return e?n(t[0]):n.call(r,t[0]);case 2:return e?n(t[0],t[1]):n.call(r,t[0],t[1]);case 3:return e?n(t[0],t[1],t[2]):n.call(r,t[0],t[1],t[2]);case 4:return e?n(t[0],t[1],t[2],t[3]):n.call(r,t[0],t[1],t[2],t[3])}return n.apply(r,t)}(r,n,t)};return i(r.prototype)&&(o.prototype=r.prototype),o};x(x.P,\"Function\",{bind:gn});try{var bn=function bn(n,t){5<En.errs.length||(n.errType=t,En.errs.push(n))};window.radar={config:{performanceAutoReport:!0,sample:.01},errs:[],marks:{},cusMarks:{},$event:vn};var En=window.radar;window.addEventListener&&(window.addEventListener(\"error\",function(n){return bn(n,\"jsErr\")},!0),window.addEventListener(\"unhandledrejection\",function(n){return bn(n,\"promiseErr\")})),En.setConfig=function(n){for(var t in n)En.config[t]=n[t]};var On=function On(){if(En.config.performanceAutoReport&&\"csr\"===En.config.renderType){setTimeout(function(){window.radar.performanceReport&&\"function\"==typeof window.radar.performanceReport&&window.radar.performanceReport()},1e3)}};En.mark=function(n){En.marks[n]=+new Date,\"fs\"===n&&On()},En.markCustom=function(n){if(!(n&&n instanceof Object))throw\"[ERROR]markCustom方法参数错误\";En.cusMarks=Object.assign({},En.cusMarks,{},n),n.fs&&On()}}catch(jn){!function Aa(t){if(window.console){for(var r,e=arguments.length,o=new Array(1<e?e-1:0),i=1;i<e;i++)o[i-1]=arguments[i];setTimeout((r=console[t]).bind.apply(r,[console].concat(o)))}}(\"error\",jn)}}();window.radar && window.radar.setConfig({page: 'hYx_K1fJL',                sample: 0.05,                clientType: 'pc_web',                renderType: 'ssr'})</script><script>var _hmt = _hmt || [];(function() {  var hm = document.createElement(\"script\");  hm.src = \"https://hm.baidu.com/hm.js?292b2e1608b0823c1cb6beef7243ef34\";  var s = document.getElementsByTagName(\"script\")[0];   s.parentNode.insertBefore(hm, s);})();</script><script src=\"https://efe-h2.cdn.bcebos.com/cliresource/@baidu/ubc-report-sdk/3.3.3/ubc-report-sdk.iife.polyfill.min.js\"></script><link rel=\"stylesheet\" href=\"//tb5.bdstatic.com/tb/pc/common-bawu-report/1.0.10/css/report-start-dialog.css\"><script src=\"//tb5.bdstatic.com/tb/pc/common-bawu-report/1.0.10/report-start-dialog.umd.js\"></script><script src=\"//tb5.bdstatic.com/tb/pc/common-bawu-report/1.0.10/report-dialog.umd.js\"></script><script src=\"//tb5.bdstatic.com/tb/pc/common-bawu-report/1.0.10/interflow-dialog.umd.js\"></script><link rel=\"stylesheet\" href=\"//tb5.bdstatic.com/tb/pc/common-bawu-report/1.0.10/css/report-dialog.css\"><link rel=\"stylesheet\" href=\"//tb5.bdstatic.com/tb/pc/common-bawu-report/1.0.10/css/interflow-dialog.css\"><script type=\"text/javascript\" src=\"https://ecma.bdimg.com/lego-tpl/acde942d-7ec3-483c-aae9-eeffbc714af4.js\"></script><style type=\"text/css\">.art-undercover{position:fixed;display:none;opacity:.9;z-index:10}.art-undercover,.error-wrap{background:#000;top:0;left:0;height:100%;width:100%}.error-wrap{position:absolute;z-index:33;color:#fff;text-align:center;line-height:200px}.error-wrap a{text-decoration:underline}@-webkit-keyframes biggerAni{0%{transform:scale(1);opacity:.8}50%{transform:scale(1.2);opacity:1}to{transform:scale(1);opacity:1}}@keyframes biggerAni{0%{transform:scale(1);opacity:.8}50%{transform:scale(1.2);opacity:1}to{transform:scale(1);opacity:1}}.biggerAnimation{-webkit-animation:biggerAni .5s;animation:biggerAni .5s}.currentTime,.durationTime{color:#fff;font-weight:600}.durationTime{opacity:.6}.art-video-player{display:flex;position:relative;margin:0 auto;z-index:20;max-width:100%;width:100%;height:0;padding-top:56.25%;outline:0;zoom:1;font-family:Roboto,Arial,Helvetica,sans-serif;color:#eee;background:#000 none 50%/cover no-repeat;text-align:left;direction:ltr;font-size:14px;line-height:1.3;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:rgba(0,0,0,0);touch-action:manipulation;-ms-high-contrast-adjust:none}.art-video-player *{margin:0;padding:0;box-sizing:border-box}.art-video-player ::-webkit-scrollbar{width:5px}.art-video-player ::-webkit-scrollbar-thumb{background-color:#666}.art-video-player ::-webkit-scrollbar-thumb:hover{background-color:#ccc}.art-video-player .art-icon{display:inline-flex;justify-content:center;align-items:center;line-height:1.5}.art-video-player .art-icon svg{fill:#fff}.art-video-player img{max-width:100%;vertical-align:top}@supports ((-webkit-backdrop-filter:initial) or (backdrop-filter:initial)){.art-video-player .art-backdrop-filter{-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px)}}.art-setting-switch-wrap .art-switch-title{display:inline-block;color:#fff;font-size:14px}.art-setting-switch-wrap .art-switch-btn{float:right;position:relative;width:32px;height:18px;border:1px solid hsla(0,0%,100%,.8);border-radius:11px;outline:none;box-sizing:border-box;cursor:pointer;transition:border-color .3s,background-color .3s;vertical-align:middle}.art-setting-switch-wrap .art-switch-btn .art-switch-handle{position:absolute;top:1px;left:1px;transition:transform .3s;width:14px;height:14px;border-radius:50%;background-color:#fff}.art-setting-switch-wrap .art-switch-btn.active{border-color:#ff4141}.art-setting-switch-wrap .art-switch-btn.active span{transform:translateX(14px);background-color:#ff4141}.mini-replay{position:absolute;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.54);display:none;z-index:100}.mini-replay .mini-replay-svg{border-radius:100%;cursor:pointer;position:absolute;left:50%;top:50%;margin-left:-24px;margin-top:-24px}.art-controls-right .art-control{opacity:.8}.art-controls-right .art-control:hover{opacity:1}.art-controls-right .art-control-playrate,.art-controls-right .art-control-quality{opacity:.9}.art-controls-right .art-control-playrate:hover,.art-controls-right .art-control-quality:hover{opacity:1}.art-control-next{margin-right:10px}.art-control-next svg{position:absolute;top:6px;left:8px}.art-mini-icon{position:absolute;left:50%;top:50%;display:none}.art-animation-volume{height:100%;padding:5px}.art-close-automini{color:#fff;height:35px;line-height:35px;cursor:pointer}.art-close-automini .empty-circle{width:11px;height:11px;background:transparent;border-radius:50%;border:1px solid #fff;float:left;margin-top:11px;opacity:.8}.art-close-automini .close-text{float:left;margin-left:5px;margin-right:10px;opacity:.8}.art-close-automini .close-tip-text{display:none;background:rgba(17,17,17,.7);border-radius:8px;color:#fff;height:30px;line-height:30px;font-size:14px;position:absolute;bottom:-38px;right:10px;padding:0 8px}.art-close-automini:hover .close-text,.art-close-automini:hover .empty-circle{opacity:1}.art-close-automini:hover .close-tip-text{display:block}.art-control svg{max-width:34px}.art-control.art-control-playAndPause{margin-left:5px}.art-control.art-control-playAndPause svg{max-width:44px}.hkplayer-is-cssfullscreen{position:fixed!important;left:0!important;top:0!important;width:100%!important;height:100%!important;z-index:99999!important;padding-top:0!important}.art-video-player .art-video{z-index:10;background-color:#000;cursor:pointer}.art-video-player .art-poster,.art-video-player .art-video{position:absolute;left:0;top:0;right:0;bottom:0;width:100%;height:100%}.art-video-player .art-poster{z-index:11;background-position:50%;background-repeat:no-repeat;background-size:cover;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}.art-video-player .art-subtitle{display:none;position:absolute;z-index:20;bottom:10px;width:100%;padding:0 20px;text-align:center;color:#fff;font-size:20px;pointer-events:none;text-shadow:1px 0 1px #000,0 1px 1px #000,-1px 0 1px #000,0 -1px 1px #000,1px 1px 1px #000,-1px -1px 1px #000,1px -1px 1px #000,-1px 1px 1px #000}.art-video-player .art-subtitle p{word-break:break-all;height:-webkit-fit-content;height:-moz-fit-content;height:fit-content;margin:5px 0 0;line-height:1.2}.art-video-player .art-bilingual p:nth-child(n+2){transform:scale(.6);transform-origin:center top}.art-video-player.art-subtitle-show .art-subtitle{display:block}.art-video-player.art-control-show .art-subtitle{bottom:50px}.art-video-player .art-danmuku{z-index:30}.art-video-player .art-danmuku,.art-video-player .art-layers{position:absolute;left:0;top:0;right:0;bottom:0;width:100%;height:100%;overflow:hidden;pointer-events:none}.art-video-player .art-layers{display:none;z-index:40}.art-video-player .art-layers .art-layer{position:absolute;top:20px;right:20px;width:5%}.art-video-player.art-layer-show .art-layers{display:block}.art-video-player .art-mask{display:none;align-items:center;justify-content:center;position:absolute;z-index:50;left:0;top:0;right:0;bottom:0;width:100%;height:100%;overflow:hidden;pointer-events:none}.art-video-player .art-mask .art-state{width:88px;height:88px;overflow:hidden;text-align:center;vertical-align:middle;position:absolute;left:50%;top:50%;z-index:115;margin-top:-44px;margin-left:-44px;cursor:pointer}.art-video-player.art-mask-show .art-mask{display:flex}.art-video-player .art-loading{display:none;position:absolute;z-index:70;left:0;top:0;right:0;bottom:0;width:100%;height:100%;align-items:center;justify-content:center;pointer-events:none}.art-video-player.art-loading-show .art-loading{display:flex;width:60px;height:60px;left:50%;top:50%;margin-left:-30px;margin-top:-30px}.art-video-player .art-bottom{position:absolute;z-index:60;left:0;right:0;bottom:0;height:76px;opacity:0;visibility:hidden;transition:all .2s ease-in-out;pointer-events:none;background:linear-gradient(180deg,transparent,rgba(0,0,0,.5))}.art-video-player .art-bottom .art-progress{position:relative;pointer-events:auto;z-index:2}.art-video-player .art-bottom .art-progress .art-control-progress{position:relative;display:flex;flex-direction:row;align-items:center;height:24px;padding-top:8px;padding-bottom:8px;cursor:pointer}.art-video-player .art-bottom .art-progress .art-control-progress .art-control-progress-inner{position:relative;height:50%;width:100%;background:hsla(0,0%,100%,.2)}.art-video-player .art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-loaded{position:absolute;z-index:10;left:0;top:0;right:0;bottom:0;height:100%;width:0;background:hsla(0,0%,100%,.4);border-top-right-radius:20px;border-bottom-right-radius:20px}.art-video-player .art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-played{border-top-right-radius:20px;border-bottom-right-radius:20px;position:absolute;z-index:20;left:0;top:0;right:0;bottom:0;height:100%;width:0}.art-video-player .art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight{position:absolute;z-index:30;left:0;top:0;right:0;bottom:0;height:100%;pointer-events:none}.art-video-player .art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight span{display:inline-block;position:absolute;left:0;top:0;width:2px;height:100%;background:#fff;pointer-events:auto}.art-video-player .art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{display:none;position:absolute;z-index:40;top:-5px;left:-6.5px;width:18px;height:18px;border-radius:50%;background:#fff!important}.art-video-player .art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator.art-show-indicator{display:block}.art-video-player .art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-tip{display:none;position:absolute;z-index:50;top:-25px;left:0;height:20px;padding:0 5px;line-height:20px;color:#fff;font-size:12px;text-align:center;background:rgba(0,0,0,.7);border-radius:3px;font-weight:700;white-space:nowrap;pointer-events:none}.art-video-player .art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-pointer{display:none;position:absolute;z-index:20;top:0;left:0;height:100%;width:2px;background:#fff;pointer-events:none}.art-video-player .art-bottom .art-progress .art-control-progress:hover .art-control-progress-inner{height:100%}.art-video-player .art-bottom .art-progress .art-control-progress:hover .art-control-progress-inner .art-progress-indicator,.art-video-player .art-bottom .art-progress .art-control-progress:hover .art-control-progress-inner .art-progress-pointer,.art-video-player .art-bottom .art-progress .art-control-progress:hover .art-control-progress-inner .art-progress-tip{display:block}.art-video-player .art-bottom .art-progress .art-control-thumbnails{display:none;position:absolute;bottom:50px;left:0;pointer-events:none;background-color:rgba(0,0,0,.7);border:1.5px solid #fff;border-radius:3px;transform-origin:center bottom;transform:scale(1)}.art-video-player .art-bottom .art-progress .art-control-loop{display:none;position:absolute;width:100%;height:100%;left:0;top:0;right:0;bottom:0;pointer-events:none}.art-video-player .art-bottom .art-progress .art-control-loop .art-loop-point{position:absolute;left:0;top:-2px;width:2px;height:8px;background:hsla(0,0%,100%,.75)}.art-video-player .art-bottom .art-controls{position:absolute;left:0;right:0;bottom:6px;pointer-events:auto;display:flex;align-items:center;justify-content:space-between;height:40px;padding:0\\0;margin-top:6px}.art-video-player .art-bottom .art-controls .art-controls-left{display:flex;float:left\\0}.art-video-player .art-bottom .art-controls .art-controls-left .art-control{float:left\\0}.art-video-player .art-bottom .art-controls .art-controls-right{display:flex;float:right\\0;margin-right:2px}.art-video-player .art-bottom .art-controls .art-controls-right .art-control{margin-right:10px;float:left\\0}.art-video-player .art-bottom .art-controls .art-controls-right .art-control .art-icon-fullscreen.ie9hack{margin-top:5px;margin-left:0}.art-video-player .art-bottom .art-controls .art-controls-right .art-control-playrate,.art-video-player .art-bottom .art-controls .art-controls-right .art-control-quality{margin-right:5px}.art-video-player .art-bottom .art-controls .art-control{font-size:12px;height:40px;min-width:44px;line-height:40px;text-align:center;cursor:pointer;white-space:nowrap}.art-video-player .art-bottom .art-controls .art-control .art-icon{display:flex;align-items:center;justify-content:center;float:left;height:40px;width:44px}.art-video-player .art-bottom .art-controls .art-control .art-icon-volumeClose{padding:8px\\0}.art-video-player .art-bottom .art-controls .art-control-setting{position:relative}.art-video-player .art-bottom .art-controls .art-control-time{font-size:14px}.art-video-player .art-bottom .art-controls .playnext-icon{margin-top:6px}.art-video-player .art-bottom .art-controls .art-control-control10,.art-video-player .art-bottom .art-controls .art-control-control11{display:flex;align-items:center;justify-content:center;float:left;height:40px;width:44px}.art-video-player .art-bottom .art-controls .art-control-playrate,.art-video-player .art-bottom .art-controls .art-control-quality,.art-video-player .art-bottom .art-controls .art-control-screenshot{margin-right:5px}.art-video-player .art-bottom .art-controls .art-control-onlyText{padding:0 10px}.art-video-player .art-bottom .art-controls .art-control-volume{z-index:99}.art-video-player .art-bottom .art-controls .art-control-volume .art-volume-hover-area{position:absolute;bottom:30px;width:44px;height:154px;z-index:21;display:none}.art-video-player .art-bottom .art-controls .art-control-volume .art-volume-panel-wrap{position:absolute;width:44px;height:134px;clear:both;background:rgba(17,17,17,.7);border-radius:8px}.art-video-player .art-bottom .art-controls .art-control-volume .art-volume-panel-wrap span{float:left;width:100%;height:30px;line-height:30px;display:block}.art-video-player .art-bottom .art-controls .art-control-volume .art-volume-panel-wrap:after{content:\"\";display:block;position:absolute;bottom:-16px;left:50%;transform:translateX(-50%);width:0;height:0;border:8px solid transparent;border-top-color:rgba(17,17,17,.7)}.art-video-player .art-bottom .art-controls .art-control-volume .art-volume-panel-wrap .art-volume-panel{position:relative;float:left;width:44px;height:91px;transition:margin .2s cubic-bezier(.4,0,1,1),width .2s cubic-bezier(.4,0,1,1);overflow:hidden;margin:0 auto}.art-video-player .art-bottom .art-controls .art-control-volume .art-volume-panel-wrap .art-volume-panel .art-volume-slider-handle{position:absolute;left:50%;width:13px;height:13px;border-radius:50%;margin-top:0;background:#fff;margin-left:-6.5px;z-index:2}.art-video-player .art-bottom .art-controls .art-control-volume .art-volume-panel-wrap .art-volume-panel .art-volume-top-bottom{width:3px;height:90px;left:50%;position:absolute;margin-left:-1.5px;z-index:1;border-radius:8px;background:#fff}.art-video-player .art-bottom .art-controls .art-control-volume .art-volume-panel-wrap .art-volume-panel .art-volume-bottom,.art-video-player .art-bottom .art-controls .art-control-volume .art-volume-panel-wrap .art-volume-panel .art-volume-top{position:absolute;display:block;height:90px;width:3px;left:50%;margin-left:-1.5px}.art-video-player .art-bottom .art-controls .art-control-volume .art-volume-panel-wrap .art-volume-panel .art-volume-top{bottom:-64px;background:rgba(0,0,0,.6)}.art-video-player .art-bottom .art-controls .art-control-volume:hover .art-volume-hover-area{display:block}.art-video-player .art-bottom .art-controls .art-control-quality{position:relative;z-index:30}.art-video-player .art-bottom .art-controls .art-control-quality .art-qualitys{display:none;position:absolute;bottom:35px;width:100px;padding:5px 0;text-align:center;color:#fff;background:rgba(0,0,0,.8);border-radius:3px}.art-video-player .art-bottom .art-controls .art-control-quality .art-qualitys .art-quality-item{height:30px;line-height:30px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-shadow:0 0 2px rgba(0,0,0,.5)}.art-video-player .art-bottom .art-controls .art-control-quality .art-qualitys .art-quality-item:hover{background-color:hsla(0,0%,100%,.1)}.art-video-player .art-bottom .art-controls .art-control-quality:hover .art-qualitys{display:block}.art-video-player.art-control-show .art-bottom,.art-video-player.art-hover .art-bottom{opacity:1;visibility:visible}.art-video-player.art-destroy .art-progress-indicator,.art-video-player.art-destroy .art-progress-pointer,.art-video-player.art-destroy .art-progress-tip,.art-video-player.art-error .art-progress-indicator,.art-video-player.art-error .art-progress-pointer,.art-video-player.art-error .art-progress-tip{display:none!important}.art-video-player .art-notice{display:none;font-size:14px;position:absolute;z-index:80;left:0;top:0;padding:10px;width:100%;pointer-events:none}.art-video-player .art-notice .art-notice-inner{display:none;padding:5px 10px;color:#fff;background:rgba(0,0,0,.6);border-radius:3px}.art-video-player.art-notice-show .art-notice{display:flex}.art-video-player .art-contextmenus{display:none;flex-direction:column;position:absolute;z-index:120;left:0;top:0;min-width:160px;background-color:rgba(26,26,26,.96);border-radius:5px}.art-video-player .art-contextmenus .art-contextmenu{cursor:pointer;font-size:14px;display:block;color:#fff;padding:15px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;opacity:.8}.art-video-player .art-contextmenus .art-contextmenu:hover{opacity:1}.art-video-player.art-contextmenu-show .art-contextmenus{display:flex}.art-video-player .art-settings{display:flex;align-items:center;justify-content:center;position:absolute;z-index:90;left:0;top:0;height:100%;width:100%;pointer-events:none}.art-video-player .art-settings .art-setting-inner{position:absolute;bottom:30px;padding-bottom:20px;width:155px;font-size:12px;z-index:200;overflow:hidden;opacity:0;visibility:hidden}.art-video-player .art-settings .art-setting-inner:after{content:\"\";display:block;position:absolute;bottom:6.5px;left:50%;transform:translateX(-50%);width:0;height:0;border:7px solid transparent;border-top-color:rgba(17,17,17,.7)}.art-video-player .art-settings .art-setting-inner .art-setting-body{overflow-y:auto;padding:8.5px 16px;background-color:rgba(17,17,17,.7);border-radius:8px;line-height:1.3}.art-video-player .art-settings .art-setting-inner .art-setting-body .art-setting{padding:11.5px 0;text-align:left}.art-video-player .art-settings .art-setting-inner .art-setting-body .art-setting .art-setting-header{margin-bottom:5px}.art-video-player .art-settings .art-setting-radio{display:flex}.art-video-player .art-settings .art-setting-radio .art-radio-item{flex:1;padding:0 2px}.art-video-player .art-settings .art-setting-radio .art-radio-item button{height:22px;width:100%;border:none;outline:none;color:#fff;background:hsla(0,0%,100%,.2);border-radius:2px}.art-video-player .art-settings .art-setting-radio .art-radio-item.current button,.art-video-player .art-settings .art-setting-radio .art-radio-item button:active{background-color:#00a1d6}.art-video-player .art-settings .art-setting-range input{width:100%;height:3px;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:hsla(0,0%,100%,.5)}.art-video-player .art-settings .art-setting-checkbox{display:flex;align-items:center}.art-video-player .art-settings .art-setting-checkbox input{height:14px;width:14px;margin-right:5px}.art-video-player .art-settings .art-setting-upload{display:flex}.art-video-player .art-settings .art-setting-upload .art-upload-btn{width:80px;height:22px;line-height:22px;border:none;outline:none;color:#fff;background:hsla(0,0%,100%,.2);border-radius:2px;text-align:center}.art-video-player .art-settings .art-setting-upload .art-upload-value{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;height:22px;line-height:22px;padding-left:10px}.art-video-player.art-setting-show .art-setting-inner{opacity:1;visibility:visible;pointer-events:auto}.art-video-player .art-info{display:none;flex-direction:column;position:absolute;left:10px;top:10px;z-index:100;width:360px;padding:20px 20px 25px;border-radius:5px;color:#fff;font-size:12px;font-family:Noto Sans CJK SC DemiLight,Roboto,Segoe UI,Tahoma,Arial,Helvetica,sans-serif;-webkit-font-smoothing:antialiased;background-color:rgba(26,26,26,.96)}.art-video-player .art-info .art-info-title{margin-left:10px;margin-bottom:12px;font-size:16px;color:#fff}.art-video-player .art-info .hkvideo-ctxmenuhelp-list{font-size:14px}.art-video-player .art-info .hkvideo-ctxmenuhelp-list .hkvideo-ctxmenuhelp-item{padding:0 15px;height:32px;width:50%;line-height:32px;display:inline-block;border-radius:14px;margin-bottom:2px;color:#999;cursor:pointer;float:left}.art-video-player .art-info .hkvideo-ctxmenuhelp-list .hkvideo-ctxmenuhelp-item .menuhelp-label{color:#fff}.art-video-player .art-info .art-info-item{display:flex;margin-bottom:5px}.art-video-player .art-info .art-info-item .art-info-title{width:100px;text-align:right}.art-video-player .art-info .art-info-item .art-info-content{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-left:5px}.art-video-player .art-info .art-info-item:last-child{margin-bottom:0}.art-video-player .art-info .art-info-close{position:absolute;top:8px;right:8px;cursor:pointer}.art-video-player .art-info .art-info-close .hkplayer-close{fill:#fff;cursor:pointer}.art-video-player.art-info-show .art-info{display:flex}.art-video-player.art-hide-cursor *{cursor:none!important}.art-video-player[data-aspect-ratio] video{box-sizing:content-box;-o-object-fit:fill;object-fit:fill}.art-fullscreen-web,.art-video-player.art-fullscreen-web{position:fixed;z-index:9999;width:100%!important;height:100%!important;left:0;top:0;right:0;bottom:0;padding-top:0!important}.art-fullscreen-web .art-video-player{height:100%;padding:0}.art-fullscreen-web .art-container{height:100%}.art-fullscreen-rotate{position:fixed;z-index:9999;width:100%;height:100%;left:0;top:0;right:0;bottom:0;background:#000}.art-fullscreen .art-container{height:100%}.art-fullscreen .art-video-player{height:100%;padding:0}.art-video-player .art-mini-header{display:none;position:absolute;z-index:110;left:0;top:0;right:0;height:35px;line-height:35px;color:#fff;background:linear-gradient(180deg,rgba(0,0,0,.6),transparent);align-items:center;justify-content:space-between;opacity:0;visibility:hidden;transition:all .2s ease-in-out}.art-video-player .art-mini-header .art-mini-title{flex:1;padding:0 10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:move}.art-video-player .art-mini-header .art-mini-close{width:35px;height:35px;text-align:center;font-size:22px;cursor:pointer;padding:3px}.art-video-player .art-mini-header .art-mini-close svg{opacity:.8}.art-video-player .art-mini-header .art-mini-close svg:hover{opacity:1}.art-video-player.art-is-dragging{opacity:.7}.art-video-player.art-mini{position:fixed;z-index:9999;width:400px;height:225px;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 3px 6px 0 rgba(0,0,0,.2);padding-top:0!important}.art-video-player.art-mini .art-icon-state{display:block}.art-video-player.art-mini .hkplayer-close{fill:#fff}.art-video-player.art-mini .art-mini-header{display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.art-video-player.art-mini.art-hover .art-mini-header{opacity:1;visibility:visible}.art-video-player.art-mini .art-mask .art-state{display:inline-block;position:static;position:absolute;left:50%;top:50%;width:50px;height:50px;margin:-25px auto auto -25px}.art-video-player.art-mini .art-mask .art-state .art-icon-state{transform:scale(.4);width:88px;height:88px;overflow:hidden;margin-left:-19px;margin-top:-19px}.art-video-player.art-mini .art-contextmenu,.art-video-player.art-mini .art-danmu,.art-video-player.art-mini .art-info,.art-video-player.art-mini .art-notice,.art-video-player.art-mini .art-subtitle{display:none}.art-video-player.art-mini .art-bottom .art-progress{display:block;position:absolute;bottom:-2px;width:100%}.art-video-player.art-mini .art-bottom .art-progress .art-control-progress{height:8px;padding-top:0;padding-bottom:0}.art-video-player.art-mini .art-bottom .art-progress .art-control-progress:hover .art-control-progress-inner{height:50%}.art-video-player.art-mini .art-bottom .art-progress .art-control-progress .art-progress-indicator{top:-8px}.art-video-player.art-mini .art-control-time{position:absolute;bottom:2px;left:6px;padding:0;line-height:24px;height:24px}.art-video-player.art-mini .art-controls .art-control-next,.art-video-player.art-mini .art-controls .art-control-playAndPause,.art-video-player.art-mini .art-controls .art-control-volume,.art-video-player.art-mini .art-controls .art-controls-right{display:none}.art-video-player.art-mini .art-bottom{height:auto;background:none}.art-video-player .art-icon-state{display:none}.art-video-player .art-mini-mask{display:none;height:100%;width:100%;background-color:rgba(0,0,0,.2);z-index:100}.art-video-player.art-mini.art-hover .art-mini-mask{display:flex}.art-video-player[data-flip=horizontal] .art-video{transform:scaleX(-1)}.art-video-player[data-flip=vertical] .art-video{transform:scaleY(-1)}.art-video-player .art-layers .art-layer-log{display:none;position:absolute;left:10px;bottom:10px;width:120px;color:#fff;text-shadow:0 0 2px rgba(0,0,0,.5);background-color:rgba(0,0,0,.5);border-radius:3px;padding:5px;font-size:13px;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.art-video-player .art-layers .art-layer-log p{margin-bottom:0;word-break:break-all}.art-video-player .art-control-selector{position:relative}.art-video-player .art-control-selector .art-selector-list-wrap{display:none;padding-bottom:20px;position:absolute;z-index:200;left:50%;bottom:30px;transform:translateX(-50%)}.art-video-player .art-control-selector .art-selector-value{text-align:center;font-family:PingFangSC-Medium;font-size:16px;color:hsla(0,0%,100%,.8);letter-spacing:0;line-height:40px;font-weight:500;cursor:pointer;width:60px;height:40px;border-radius:3px;display:inline-block;vertical-align:middle}.art-video-player .art-control-selector .art-selector-value:hover{color:#fff}.art-video-player .art-control-selector .art-selector-list{padding:10px 15px;text-align:center;color:#fff;background:rgba(17,17,17,.7);border-radius:8px}.art-video-player .art-control-selector .art-selector-list:after{content:\"\";display:block;position:absolute;bottom:6px;left:50%;transform:translateX(-50%);width:0;height:0;border:7px solid transparent;border-top-color:rgba(17,17,17,.7)}.art-video-player .art-control-selector .art-selector-list .art-selector-item{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-left:29px;padding-right:26px;min-width:99px;position:relative;height:34px;line-height:34px;margin-top:7px;border-radius:17px;font-weight:400;font-size:14px;opacity:.8}.art-video-player .art-control-selector .art-selector-list .art-selector-item:hover{background-color:hsla(0,0%,100%,.1)}.art-video-player .art-control-selector .art-selector-list .art-selector-item svg{display:none;position:absolute;left:10px;top:10px}.art-video-player .art-control-selector .art-selector-list .art-selector-item .art-selector-item-name{pointer-events:none}.art-video-player .art-control-selector .art-selector-list .art-selector-item-active{color:#fff;background:hsla(0,0%,100%,.15);font-size:16px;font-weight:600;opacity:1}.art-video-player .art-control-selector .art-selector-list .art-selector-item-active svg,.art-video-player .art-control-selector:hover .art-selector-list-wrap{display:block}.art-video-player .art-control-quality .art-selector-dash{width:160px}:root{--balloon-color:rgba(0,0,0,0.8);--balloon-font-size:12px;--balloon-move:4px}button[aria-label][data-balloon-pos]{overflow:visible}[aria-label][data-balloon-pos]{position:relative;cursor:pointer}[aria-label][data-balloon-pos]:after{text-indent:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;font-weight:400;font-style:normal;text-shadow:none;font-size:12px;background:rgba(17,17,17,.7);border-radius:8px;color:#fff;content:attr(aria-label);padding:.5em 1em;white-space:nowrap;line-height:1.2}[aria-label][data-balloon-pos]:after,[aria-label][data-balloon-pos]:before{opacity:0;pointer-events:none;transition:all .18s ease-out .18s;position:absolute;z-index:10}[aria-label][data-balloon-pos]:before{width:0;height:0;content:\"\"}[aria-label][data-balloon-pos]:hover:after,[aria-label][data-balloon-pos]:hover:before{opacity:1;pointer-events:none}[aria-label][data-balloon-pos][data-balloon-pos=up]:after{margin-bottom:10px}[aria-label][data-balloon-pos][data-balloon-pos=up]:after,[aria-label][data-balloon-pos][data-balloon-pos=up]:before{bottom:100%;left:50%;transform:translate(-50%,4px);transform-origin:top}[aria-label][data-balloon-pos][data-balloon-pos=up]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=up]:hover:before{transform:translate(-50%)}.small-control .art-bottom{height:39px}.small-control .art-bottom .art-progress .art-control-progress{height:6px;padding-top:1px;padding-bottom:1px}.small-control .art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{width:14px;height:14px}.small-control .art-bottom .art-controls{margin-top:0;height:auto}.small-control .art-bottom .art-controls .art-control{height:33px;line-height:33px;min-width:37px}.small-control .art-bottom .art-controls .art-controls-left .art-control-time{font-size:14px;margin-left:5px}.small-control .art-bottom .art-controls .art-controls-left .art-control-playAndPause:after{left:22px;margin-bottom:2px}.small-control .art-bottom .art-controls .art-controls-right .art-control,.small-control .art-bottom .art-controls .art-controls-right .art-control-playrate{margin-right:0}.small-control .art-bottom .art-controls .art-controls-right .art-control-selector .art-selector-value{font-size:14px;height:33px;line-height:33px;width:40px}.small-control .art-bottom .art-controls .art-controls-right .art-control-selector .art-selector-value:hover{color:#fff}.small-control .art-bottom .art-controls .art-controls-right .art-control-selector .art-selector-list-wrap{padding-bottom:10px;width:120px}.small-control .art-bottom .art-controls .art-controls-right .art-control-selector .art-selector-list-wrap .art-selector-list{padding:8px}.small-control .art-bottom .art-controls .art-controls-right .art-control-selector .art-selector-list-wrap .art-selector-list .art-selector-item{height:26px;line-height:26px;min-width:89px;margin-top:4px}.small-control .art-bottom .art-controls .art-controls-right .art-control-selector .art-selector-list-wrap .art-selector-list .art-selector-item svg{left:12px;top:7px}.small-control .art-bottom .art-controls .art-controls-right .art-control-selector .art-selector-list-wrap .art-selector-list .art-selector-item:first-child{margin-top:0}.small-control .art-bottom .art-controls .art-controls-right .art-control-selector .art-selector-list-wrap .art-selector-list:after{bottom:-4px}.small-control .art-bottom .art-controls .art-controls-right .art-control-fullscreen .art-icon{width:20px;height:16px;margin-left:6px;margin-top:8px}.small-control .art-bottom .art-controls .art-controls-right .art-control-fullscreen:after{margin-bottom:2px;left:10px}.small-control .art-bottom .art-controls .art-controls-right .art-control-pip:after{margin-bottom:2px}.small-control .art-bottom .art-controls .art-controls-right .art-control-volume{position:relative}.small-control .art-bottom .art-controls .art-controls-right .art-control-volume .art-animation-volume{padding:4px 4.5px 5px}.small-control .art-bottom .art-controls .art-controls-right .art-control-volume .art-volume-hover-area{width:40px;bottom:23px;left:-1px;height:121px}.small-control .art-bottom .art-controls .art-controls-right .art-control-volume .art-volume-hover-area .art-volume-panel-wrap{width:40px;height:109px}.small-control .art-bottom .art-controls .art-controls-right .art-control-volume .art-volume-hover-area .art-volume-panel-wrap .art-volume-panel{width:40px;height:71px}.small-control .art-bottom .art-controls .art-controls-right .art-control-volume .art-volume-hover-area .art-volume-panel-wrap .art-volume-panel .art-volume-top-bottom,.small-control .art-bottom .art-controls .art-controls-right .art-control-volume .art-volume-hover-area .art-volume-panel-wrap .art-volume-panel .art-volume-top-bottom .art-volume-top{height:70px}.small-control .art-bottom .art-controls .art-controls-right .art-control-volume .art-volume-hover-area .art-volume-panel-wrap:after{border:7px solid transparent;border-top-color:rgba(17,17,17,.7);bottom:-14px}.small-control .art-bottom .art-controls .art-controls-right .art-icon-volumeClose{width:37px;height:33px;padding:8px 8.5px 9px}.small-control .art-bottom .art-controls .art-controls-right .art-control-pip i{width:20px;height:16px;margin-left:6px;margin-top:8px}</style><script type=\"text/javascript\" src=\"//tb1.bdstatic.com/tb/static-common/component/commonLogic/common/crosspage_msg_system/MsgSystem.js?v=18.8\"></script><link id=\"css_skin\" href=\"//tb1.bdstatic.com/tb/cms/common/tbskin/skins/skin_normal.css?v=\" rel=\"stylesheet\"><script type=\"text/javascript\" src=\"https://cpro.baidustatic.com/js/m.js\"></script><script type=\"text/javascript\" charset=\"utf8\" async=\"\" src=\"https://dlswbr.baidu.com/heicha/mm/2027/acs-2027.js\"></script><style>/* html, body {\n    position: relative;\n    width: 100%;\n    height: 100%;\n}\n\nbody {\n    color: #333;\n    margin: 0;\n    padding: 8px;\n    box-sizing: border-box;\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n} */\n\n.mediago-ad-wrapper a {\n    color: rgb(0, 100, 200);\n    text-decoration: none;\n}\n\n.mediago-ad-wrapper a:hover {\n    text-decoration: underline;\n}\n\n.mediago-ad-wrapper a:visited {\n    color: rgb(0, 80, 160);\n}\n\n.mediago-ad-wrapper label {\n    display: block;\n}\n\n.mediago-ad-wrapper input,\n.mediago-ad-wrapper button,\n.mediago-ad-wrapper select,\n.mediago-ad-wrapper textarea {\n    font-family: inherit;\n    font-size: inherit;\n    -webkit-padding: 0.4em 0;\n    padding: 0.4em;\n    margin: 0 0 0.5em 0;\n    box-sizing: border-box;\n    border: 1px solid #ccc;\n    border-radius: 2px;\n}\n\n.mediago-ad-wrapper input:disabled {\n    color: #ccc;\n}\n\n.mediago-ad-wrapper button {\n    color: #333;\n    background-color: #f4f4f4;\n    outline: none;\n}\n\n.mediago-ad-wrapper button:disabled {\n    color: #999;\n}\n\n.mediago-ad-wrapper button:not(:disabled):active {\n    background-color: #ddd;\n}\n\n.mediago-ad-wrapper button:focus {\n    border-color: #666;\n}\n</style><style>.mediago-ad-pb-751-wrapper.svelte-1js710s.svelte-1js710s{text-align:center;width:738px;background:#ffffff;border-bottom:1px solid #e5e5e5;border-left:1px solid #e5e5e5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;font-size:0px}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-userInfo.svelte-1js710s{display:inline-block;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:130px;background:#fafbfc;vertical-align:top}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-userInfo .mediago-header.svelte-1js710s{width:88px;height:88px;margin:auto;margin-top:20px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #cccccc}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-userInfo .mediago-header img.svelte-1js710s{width:80px;height:80px;margin:auto;margin-top:3px}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-userInfo .mediago-nickName.svelte-1js710s{margin:auto;margin-top:24px;width:90%;text-align:center;font-size:12px;color:#2d64b3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;line-height:12px}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-content.svelte-1js710s{display:inline-block;width:608px;height:100%;padding-left:20px;position:relative;vertical-align:top;-webkit-box-sizing:border-box;box-sizing:border-box}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-content .mediago-title.svelte-1js710s{width:568px;font-size:14px;color:#3066b4;letter-spacing:0;text-align:justify;line-height:18px;margin-top:30px}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-content .mediago-desc.svelte-1js710s{width:568px;font-size:12px;color:#3066b4;letter-spacing:0;text-align:justify;line-height:18px;margin-top:6px}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-content .mediago-checkBtn.svelte-1js710s{margin-top:12px;width:64px;height:28px;line-height:28px;border:1px solid #3066b4;border-radius:2px;font-size:12px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;font-weight:400;text-align:center}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-content .mediago-img.svelte-1js710s{display:block;margin-top:12px;margin-bottom:40px;width:290px;height:auto;background-position:center;background-repeat:no-repeat}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-close.svelte-1js710s{cursor:pointer;position:absolute;bottom:16px;right:6px;width:10px;height:10px;background:url(https://mediago-static.cdn.bcebos.com/assets/images/icon-close10.png) no-repeat center;background-size:contain}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-dislikeReason.svelte-1js710s{cursor:pointer;width:60px;background:rgba(0, 0, 0, 0.5);border-radius:2px;position:absolute;bottom:34px;right:6px;font-size:12px;color:white;padding:5px 0;line-height:12px}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-dislikeReason div.svelte-1js710s{padding:5px 0px}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-dislikeReason .svelte-1js710s:hover{text-decoration:underline}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-footer.svelte-1js710s{position:absolute;bottom:16px;right:20px;height:12px}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-footer .mediago-date.svelte-1js710s{width:102px;height:12px;font-size:12px;color:#999999;line-height:12px}.mediago-ad-pb-751-wrapper.svelte-1js710s .mediago-footer .mediago-ad.svelte-1js710s{width:24px;height:12px;font-size:12px;color:#999999;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;line-height:12px;margin-left:6px}</style><style>.mediago-ad-pb-751-4-wrapper.svelte-mbrgci.svelte-mbrgci{text-align:center;width:738px;background:#ffffff;border-bottom:1px solid #e5e5e5;border-left:1px solid #e5e5e5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;font-size:0px}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-userInfo.svelte-mbrgci{display:inline-block;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:130px;background:#fafbfc;vertical-align:top}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-userInfo .mediago-header.svelte-mbrgci{width:88px;height:88px;margin:auto;margin-top:20px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #cccccc}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-userInfo .mediago-header img.svelte-mbrgci{width:80px;height:80px;margin:auto;margin-top:3px}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-userInfo .mediago-nickName.svelte-mbrgci{margin:auto;margin-top:24px;width:90%;text-align:center;font-size:12px;color:#2d64b3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;line-height:12px}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-content.svelte-mbrgci{display:inline-block;width:608px;height:100%;padding-left:20px;position:relative;vertical-align:top;-webkit-box-sizing:border-box;box-sizing:border-box}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-content .mediago-title.svelte-mbrgci{width:568px;font-size:14px;color:#3066b4;letter-spacing:0;text-align:justify;line-height:18px;margin-top:30px}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-content .mediago-desc.svelte-mbrgci{width:568px;font-size:12px;color:#3066b4;letter-spacing:0;text-align:justify;line-height:18px;margin-top:6px}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-content .mediago-checkBtn.svelte-mbrgci{margin-top:12px;width:64px;height:28px;line-height:28px;border:1px solid #3066b4;border-radius:2px;font-size:12px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;font-weight:400;text-align:center}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-content .mediago-img-line.svelte-mbrgci{display:block;margin-top:12px;margin-bottom:40px;height:auto;text-align:left}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-content .mediago-img.svelte-mbrgci{display:inline-block;margin-right:8px;width:100px;height:100px;background-position:center;background-repeat:no-repeat}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-close.svelte-mbrgci{cursor:pointer;position:absolute;bottom:16px;right:6px;width:10px;height:10px;background:url(https://mediago-static.cdn.bcebos.com/assets/images/icon-close10.png) no-repeat center;background-size:contain}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-dislikeReason.svelte-mbrgci{cursor:pointer;width:60px;background:rgba(0, 0, 0, 0.5);border-radius:2px;position:absolute;bottom:34px;right:6px;font-size:12px;color:white;padding:5px 0;line-height:12px}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-dislikeReason div.svelte-mbrgci{padding:5px 0px}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-dislikeReason .svelte-mbrgci:hover{text-decoration:underline}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-footer.svelte-mbrgci{position:absolute;bottom:16px;right:20px;height:12px}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-footer .mediago-date.svelte-mbrgci{width:102px;height:12px;font-size:12px;color:#999999;line-height:12px}.mediago-ad-pb-751-4-wrapper.svelte-mbrgci .mediago-footer .mediago-ad.svelte-mbrgci{width:24px;height:12px;font-size:12px;color:#999999;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;line-height:12px;margin-left:6px}</style><style>.mediago-ad-pb-751-4-wrapper.svelte-3aadk2.svelte-3aadk2{text-align:center;width:738px;background:#ffffff;border-bottom:1px solid #e5e5e5;border-left:1px solid #e5e5e5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;font-size:0px}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-userInfo.svelte-3aadk2{display:inline-block;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:130px;background:#fafbfc;vertical-align:top}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-userInfo .mediago-header.svelte-3aadk2{width:88px;height:88px;margin:auto;margin-top:20px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #cccccc}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-userInfo .mediago-header img.svelte-3aadk2{width:80px;height:80px;margin:auto;margin-top:3px}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-userInfo .mediago-nickName.svelte-3aadk2{margin:auto;margin-top:24px;width:90%;text-align:center;font-size:12px;color:#2d64b3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;line-height:12px}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-content.svelte-3aadk2{display:inline-block;width:608px;height:100%;padding-left:20px;position:relative;vertical-align:top;-webkit-box-sizing:border-box;box-sizing:border-box}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-content .mediago-title.svelte-3aadk2{width:568px;font-size:14px;color:#3066b4;letter-spacing:0;text-align:justify;line-height:18px;margin-top:30px}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-content .mediago-desc.svelte-3aadk2{width:568px;font-size:12px;color:#3066b4;letter-spacing:0;text-align:justify;line-height:18px;margin-top:6px}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-content .mediago-checkBtn.svelte-3aadk2{margin-top:12px;width:64px;height:28px;line-height:28px;border:1px solid #3066b4;border-radius:2px;font-size:12px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;font-weight:400;text-align:center}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-content .mediago-img-line.svelte-3aadk2{display:block;margin-top:12px;margin-bottom:40px;height:auto;text-align:left}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-content .mediago-img.svelte-3aadk2{display:inline-block;margin-right:8px;width:186px;height:186px;background-position:center;background-repeat:no-repeat}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-close.svelte-3aadk2{cursor:pointer;position:absolute;bottom:16px;right:6px;width:10px;height:10px;background:url(https://mediago-static.cdn.bcebos.com/assets/images/icon-close10.png) no-repeat center;background-size:contain}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-dislikeReason.svelte-3aadk2{cursor:pointer;width:60px;background:rgba(0, 0, 0, 0.5);border-radius:2px;position:absolute;bottom:34px;right:6px;font-size:12px;color:white;padding:5px 0;line-height:12px}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-dislikeReason div.svelte-3aadk2{padding:5px 0px}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-dislikeReason .svelte-3aadk2:hover{text-decoration:underline}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-footer.svelte-3aadk2{position:absolute;bottom:16px;right:20px;height:12px}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-footer .mediago-date.svelte-3aadk2{width:102px;height:12px;font-size:12px;color:#999999;line-height:12px}.mediago-ad-pb-751-4-wrapper.svelte-3aadk2 .mediago-footer .mediago-ad.svelte-3aadk2{width:24px;height:12px;font-size:12px;color:#999999;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;line-height:12px;margin-left:6px}</style><style>.mediago-ad-pb-751-video-wrapper.svelte-s6he8h.svelte-s6he8h{text-align:center;width:738px;background:#ffffff;border-bottom:1px solid #e5e5e5;border-left:1px solid #e5e5e5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;font-size:0px}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-userInfo.svelte-s6he8h{display:inline-block;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:130px;background:#fafbfc;vertical-align:top}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-userInfo .mediago-header.svelte-s6he8h{width:88px;height:88px;margin:auto;margin-top:20px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #cccccc}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-userInfo .mediago-header img.svelte-s6he8h{width:80px;height:80px;margin:auto;margin-top:3px}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-userInfo .mediago-nickName.svelte-s6he8h{margin:auto;margin-top:24px;width:90%;text-align:center;font-size:12px;color:#2d64b3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;line-height:12px}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-content.svelte-s6he8h{display:inline-block;width:608px;height:100%;padding-left:20px;position:relative;vertical-align:top;-webkit-box-sizing:border-box;box-sizing:border-box}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-content .mediago-title.svelte-s6he8h{width:568px;font-size:14px;color:#3066b4;letter-spacing:0;text-align:justify;line-height:18px;margin-top:30px}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-content .mediago-desc.svelte-s6he8h{width:568px;font-size:12px;color:#3066b4;letter-spacing:0;text-align:justify;line-height:18px;margin-top:6px}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-content .mediago-checkBtn.svelte-s6he8h{margin-top:12px;width:64px;height:28px;line-height:28px;border:1px solid #3066b4;border-radius:2px;font-size:12px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;font-weight:400;text-align:center}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-content .mediago-video.svelte-s6he8h{position:relative;display:block;width:290px;height:auto;max-height:290px;overflow:hidden;margin-top:12px;margin-bottom:40px}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-content .mediago-video video.svelte-s6he8h{position:relative;display:block;width:100%;height:100%;margin:auto}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-content .mediago-video .bgImg.svelte-s6he8h{position:absolute;top:0;left:0;display:block;width:100%;height:100%;margin:auto}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-content .mediago-video .mediago-volume.svelte-s6he8h{position:absolute;bottom:8px;right:8px;width:18px;height:18px}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-content .mediago-play-btn.svelte-s6he8h{position:absolute;left:50%;top:50%;width:55px;height:55px;background:url(https://tb2.bdstatic.com/tb/img/video_play_btn_hover_7a1975f.png) no-repeat center;background-size:contain;position:absolute;-webkit-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);transform:translate(-50%, -50%)}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-close.svelte-s6he8h{cursor:pointer;position:absolute;bottom:16px;right:6px;width:10px;height:10px;background:url(https://mediago-static.cdn.bcebos.com/assets/images/icon-close10.png) no-repeat center;background-size:contain}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-dislikeReason.svelte-s6he8h{cursor:pointer;width:60px;background:rgba(0, 0, 0, 0.5);border-radius:2px;position:absolute;bottom:34px;right:6px;font-size:12px;color:white;padding:5px 0;line-height:12px}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-dislikeReason div.svelte-s6he8h{padding:5px 0px}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-dislikeReason .svelte-s6he8h:hover{text-decoration:underline}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-footer.svelte-s6he8h{position:absolute;bottom:16px;right:20px;height:12px}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-footer .mediago-date.svelte-s6he8h{width:102px;height:12px;font-size:12px;color:#999999;line-height:12px}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h .mediago-footer .mediago-ad.svelte-s6he8h{width:24px;height:12px;font-size:12px;color:#999999;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;line-height:12px;margin-left:6px}.mediago-ad-pb-751-video-wrapper.svelte-s6he8h img.svelte-s6he8h{width:100%;height:100%}</style><style>.mediago-ad-pb-751-left-wrapper.svelte-jhowbw.svelte-jhowbw{text-align:center;width:738px;min-height:180px;background:#ffffff;border-bottom:1px solid #e5e5e5;border-left:1px solid #e5e5e5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;font-size:0px}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-userInfo.svelte-jhowbw{display:inline-block;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:130px;background:#fafbfc;vertical-align:top}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-userInfo .mediago-header.svelte-jhowbw{width:88px;height:88px;margin:auto;margin-top:20px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #cccccc}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-userInfo .mediago-header img.svelte-jhowbw{width:80px;height:80px;margin:auto;margin-top:3px}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-userInfo .mediago-nickName.svelte-jhowbw{margin:auto;margin-top:24px;width:90%;text-align:center;font-size:12px;color:#2d64b3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;line-height:12px}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-content.svelte-jhowbw{display:inline-block;width:608px;height:100%;padding-left:20px;position:relative;vertical-align:top;-webkit-box-sizing:border-box;box-sizing:border-box}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-content .mediago-left.svelte-jhowbw{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:30px;margin-bottom:40px}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-content .mediago-img.svelte-jhowbw{display:inline-block;width:140px;height:78px}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-content .mediago-right.svelte-jhowbw{display:inline-block;margin-left:12px}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-content .mediago-title.svelte-jhowbw{display:inline-block;width:420px;font-size:14px;color:#3066b4;letter-spacing:0;text-align:left;line-height:18px}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-content .mediago-desc.svelte-jhowbw{width:420px;font-size:12px;color:#3066b4;letter-spacing:0;text-align:left;line-height:16px;margin-top:8px}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-content .mediago-checkBtn.svelte-jhowbw{margin-top:12px;width:64px;height:28px;line-height:28px;border:1px solid #3066b4;border-radius:2px;font-size:12px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;font-weight:400;text-align:center}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-close.svelte-jhowbw{cursor:pointer;position:absolute;bottom:16px;right:6px;width:10px;height:10px;background:url(https://mediago-static.cdn.bcebos.com/assets/images/icon-close10.png) no-repeat center;background-size:contain}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-dislikeReason.svelte-jhowbw{cursor:pointer;width:60px;background:rgba(0, 0, 0, 0.5);border-radius:2px;position:absolute;bottom:34px;right:6px;font-size:12px;color:white;padding:5px 0;line-height:12px}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-dislikeReason div.svelte-jhowbw{padding:5px 0px}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-dislikeReason .svelte-jhowbw:hover{text-decoration:underline}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-footer.svelte-jhowbw{position:absolute;bottom:16px;right:20px;height:12px}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-footer .mediago-date.svelte-jhowbw{width:102px;height:12px;font-size:12px;color:#999999;line-height:12px}.mediago-ad-pb-751-left-wrapper.svelte-jhowbw .mediago-footer .mediago-ad.svelte-jhowbw{width:24px;height:12px;font-size:12px;color:#999999;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;line-height:12px;margin-left:6px}</style><style>.mediago-ad-frs-751-wrapper.svelte-l6akol.svelte-l6akol{position:relative;text-align:center;width:737px;background:#ffffff;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #e5e5e5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-bottom:15px;font-size:0px}.mediago-ad-frs-751-wrapper.svelte-l6akol.svelte-l6akol:hover{background-color:#f7f9fc}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-reply.svelte-l6akol,.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-content.svelte-l6akol,.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-mid.svelte-l6akol,.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-right.svelte-l6akol{display:inline-block;height:auto;vertical-align:top}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-reply.svelte-l6akol{width:90px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-top:10px}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-reply .mediago-reply-num.svelte-l6akol{width:50px;height:30px;line-height:26px;margin:auto;display:block;color:#333;font-size:12px;text-align:center;background:url(http://tb2.bdstatic.com/tb/static-hottopic/img/f_reply_bg_89030dc.png) no-repeat}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-content.svelte-l6akol{width:647px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;padding-top:12px}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-content .mediago-title.svelte-l6akol{width:450px;font-size:14px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:14px}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-content .mediago-desc.svelte-l6akol{width:420px;font-size:12px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:12px;margin-top:14px}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-content .mediago-checkBtn.svelte-l6akol{margin-top:12px;width:64px;height:28px;line-height:28px;border:1px solid #3066b4;border-radius:2px;font-size:12px;color:#3066b4;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;font-weight:400}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-content .mediago-img.svelte-l6akol{display:block;margin-top:12px;width:290px;height:auto;background-position:center;background-repeat:no-repeat}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-content .mediago-mid.svelte-l6akol{width:465px}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-content .mediago-right.svelte-l6akol{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:182px}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-userInfo.svelte-l6akol,.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-header.svelte-l6akol,.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-adName.svelte-l6akol,.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-ad.svelte-l6akol{display:inline-block;vertical-align:top}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-userInfo.svelte-l6akol{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-userInfo .mediago-header.svelte-l6akol{font-size:12px;height:20px;line-height:1;background:transparent url(http://tb2.bdstatic.com/tb/img/icon_author_112d0bd.png?__sprite=) no-repeat 4px 0px;padding:0px 0 0 25px;overflow:hidden;display:inline-block}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-userInfo .mediago-adName.svelte-l6akol{width:66px;font-size:12px;color:#a3a3a3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:20px;margin-right:45px}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-ad.svelte-l6akol{width:24px;height:20px;line-height:21px;font-size:12px;color:#a3a3a3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;margin-right:20px}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-close.svelte-l6akol{cursor:pointer;position:absolute;top:17px;right:6px;width:10px;height:10px;background:url(https://mediago-static.cdn.bcebos.com/assets/images/icon-close10.png) no-repeat center;background-size:contain}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-dislikeReason.svelte-l6akol{cursor:pointer;width:60px;background:rgba(0, 0, 0, 0.5);border-radius:2px;position:absolute;top:41px;right:7px;font-size:12px;color:white;padding:5px 0;line-height:12px}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-dislikeReason div.svelte-l6akol{padding:5px 0px}.mediago-ad-frs-751-wrapper.svelte-l6akol .mediago-dislikeReason .svelte-l6akol:hover{text-decoration:underline}</style><style>.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl.svelte-1pzpydl{position:relative;text-align:center;width:737px;min-height:120px;background:#ffffff;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #e5e5e5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-bottom:15px;font-size:0px}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl.svelte-1pzpydl:hover{background-color:#f7f9fc}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-reply.svelte-1pzpydl,.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-content.svelte-1pzpydl,.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-mid.svelte-1pzpydl,.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-right.svelte-1pzpydl{display:inline-block;height:auto;vertical-align:top}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-reply.svelte-1pzpydl{width:90px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-top:10px}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-reply .mediago-reply-num.svelte-1pzpydl{width:50px;height:30px;line-height:26px;margin:auto;display:block;color:#333;font-size:12px;text-align:center;background:url(http://tb2.bdstatic.com/tb/static-hottopic/img/f_reply_bg_89030dc.png) no-repeat}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-content.svelte-1pzpydl{width:647px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;padding-top:12px}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-content .mediago-mid.svelte-1pzpydl{width:465px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-content .mediago-mid .mediago-img.svelte-1pzpydl{display:inline-block;width:140px;height:78px}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-content .mediago-mid .mediago-text.svelte-1pzpydl{display:inline-block;margin-left:12px}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-content .mediago-mid .mediago-text .mediago-title.svelte-1pzpydl{width:310px;font-size:14px;color:#3066b4;letter-spacing:0;line-height:18px;text-align:left}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-content .mediago-mid .mediago-text .mediago-desc.svelte-1pzpydl{width:310px;font-size:12px;color:#3066b4;letter-spacing:0;line-height:16px;margin-top:8px;text-align:left}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-content .mediago-mid .mediago-text .mediago-checkBtn.svelte-1pzpydl{margin-top:12px;width:64px;height:28px;line-height:28px;border:1px solid #3066b4;border-radius:2px;font-size:12px;color:#3066b4;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;font-weight:400}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-content .mediago-right.svelte-1pzpydl{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:182px}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-userInfo.svelte-1pzpydl,.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-header.svelte-1pzpydl,.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-adName.svelte-1pzpydl,.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-ad.svelte-1pzpydl{display:inline-block;vertical-align:top}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-userInfo.svelte-1pzpydl{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-userInfo .mediago-header.svelte-1pzpydl{font-size:12px;height:20px;line-height:1;background:transparent url(http://tb2.bdstatic.com/tb/img/icon_author_112d0bd.png?__sprite=) no-repeat 4px 0px;padding:0px 0 0 25px;overflow:hidden;display:inline-block}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-userInfo .mediago-adName.svelte-1pzpydl{width:66px;font-size:12px;color:#a3a3a3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:20px;margin-right:45px}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-ad.svelte-1pzpydl{width:24px;height:20px;line-height:21px;font-size:12px;color:#a3a3a3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;margin-right:20px}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-close.svelte-1pzpydl{cursor:pointer;position:absolute;top:17px;right:6px;width:10px;height:10px;background:url(https://mediago-static.cdn.bcebos.com/assets/images/icon-close10.png) no-repeat center;background-size:contain}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-dislikeReason.svelte-1pzpydl{cursor:pointer;width:60px;background:rgba(0, 0, 0, 0.5);border-radius:2px;position:absolute;top:41px;right:7px;font-size:12px;color:white;padding:5px 0;line-height:12px}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-dislikeReason div.svelte-1pzpydl{padding:5px 0px}.mediago-ad-frs-751-left-wrapper.svelte-1pzpydl .mediago-dislikeReason .svelte-1pzpydl:hover{text-decoration:underline}</style><style>.mediago-ad-frs-751-4-wrapper.svelte-e5pf92.svelte-e5pf92{position:relative;text-align:center;width:737px;background:#ffffff;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #e5e5e5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-bottom:15px;font-size:0px}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92.svelte-e5pf92:hover{background-color:#f7f9fc}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-reply.svelte-e5pf92,.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-content.svelte-e5pf92,.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-mid.svelte-e5pf92,.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-right.svelte-e5pf92{display:inline-block;height:auto;vertical-align:top}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-reply.svelte-e5pf92{width:90px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-top:10px}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-reply .mediago-reply-num.svelte-e5pf92{width:50px;height:30px;line-height:26px;margin:auto;display:block;color:#333;font-size:12px;text-align:center;background:url(http://tb2.bdstatic.com/tb/static-hottopic/img/f_reply_bg_89030dc.png) no-repeat}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-content.svelte-e5pf92{width:647px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;padding-top:12px}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-content .mediago-title.svelte-e5pf92{width:450px;font-size:14px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:14px}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-content .mediago-desc.svelte-e5pf92{width:420px;font-size:12px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:12px;margin-top:14px}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-content .mediago-checkBtn.svelte-e5pf92{margin-top:12px;width:64px;height:28px;line-height:28px;border:1px solid #3066b4;border-radius:2px;font-size:12px;color:#3066b4;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;font-weight:400}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-content .mediago-img-line.svelte-e5pf92{display:block;margin-top:12px;height:auto;text-align:left}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-content .mediago-img.svelte-e5pf92{display:inline-block;margin-right:8px;width:100px;height:100px;background-position:center;background-repeat:no-repeat}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-content .mediago-mid.svelte-e5pf92{width:465px}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-content .mediago-right.svelte-e5pf92{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:182px}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-userInfo.svelte-e5pf92,.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-header.svelte-e5pf92,.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-adName.svelte-e5pf92,.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-ad.svelte-e5pf92{display:inline-block;vertical-align:top}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-userInfo.svelte-e5pf92{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-userInfo .mediago-header.svelte-e5pf92{font-size:12px;height:20px;line-height:1;background:transparent url(http://tb2.bdstatic.com/tb/img/icon_author_112d0bd.png?__sprite=) no-repeat 4px 0px;padding:0px 0 0 25px;overflow:hidden;display:inline-block}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-userInfo .mediago-adName.svelte-e5pf92{width:66px;font-size:12px;color:#a3a3a3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:20px;margin-right:45px}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-ad.svelte-e5pf92{width:24px;height:20px;line-height:21px;font-size:12px;color:#a3a3a3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;margin-right:20px}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-close.svelte-e5pf92{cursor:pointer;position:absolute;top:17px;right:6px;width:10px;height:10px;background:url(https://mediago-static.cdn.bcebos.com/assets/images/icon-close10.png) no-repeat center;background-size:contain}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-dislikeReason.svelte-e5pf92{cursor:pointer;width:60px;background:rgba(0, 0, 0, 0.5);border-radius:2px;position:absolute;top:41px;right:7px;font-size:12px;color:white;padding:5px 0;line-height:12px}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-dislikeReason div.svelte-e5pf92{padding:5px 0px}.mediago-ad-frs-751-4-wrapper.svelte-e5pf92 .mediago-dislikeReason .svelte-e5pf92:hover{text-decoration:underline}</style><style>.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8.svelte-1wtw7m8{position:relative;text-align:center;width:737px;background:#ffffff;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #e5e5e5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-bottom:15px;font-size:0px}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8.svelte-1wtw7m8:hover{background-color:#f7f9fc}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-reply.svelte-1wtw7m8,.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-content.svelte-1wtw7m8,.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-mid.svelte-1wtw7m8,.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-right.svelte-1wtw7m8{display:inline-block;height:auto;vertical-align:top}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-reply.svelte-1wtw7m8{width:90px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-top:10px}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-reply .mediago-reply-num.svelte-1wtw7m8{width:50px;height:30px;line-height:26px;margin:auto;display:block;color:#333;font-size:12px;text-align:center;background:url(http://tb2.bdstatic.com/tb/static-hottopic/img/f_reply_bg_89030dc.png) no-repeat}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-content.svelte-1wtw7m8{width:647px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;padding-top:12px}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-content .mediago-title.svelte-1wtw7m8{width:450px;font-size:14px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:14px}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-content .mediago-desc.svelte-1wtw7m8{width:420px;font-size:12px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:12px;margin-top:14px}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-content .mediago-checkBtn.svelte-1wtw7m8{margin-top:12px;width:64px;height:28px;line-height:28px;border:1px solid #3066b4;border-radius:2px;font-size:12px;color:#3066b4;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;font-weight:400}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-content .mediago-img-line.svelte-1wtw7m8{display:block;margin-top:12px;width:600px;height:auto;text-align:left}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-content .mediago-img.svelte-1wtw7m8{display:inline-block;margin-right:10px;width:186px;height:186px;background-position:center;background-repeat:no-repeat}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-content .mediago-mid.svelte-1wtw7m8{width:465px}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-content .mediago-right.svelte-1wtw7m8{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:182px}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-userInfo.svelte-1wtw7m8,.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-header.svelte-1wtw7m8,.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-adName.svelte-1wtw7m8,.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-ad.svelte-1wtw7m8{display:inline-block;vertical-align:top}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-userInfo.svelte-1wtw7m8{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-userInfo .mediago-header.svelte-1wtw7m8{font-size:12px;height:20px;line-height:1;background:transparent url(http://tb2.bdstatic.com/tb/img/icon_author_112d0bd.png?__sprite=) no-repeat 4px 0px;padding:0px 0 0 25px;overflow:hidden;display:inline-block}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-userInfo .mediago-adName.svelte-1wtw7m8{width:66px;font-size:12px;color:#a3a3a3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:20px;margin-right:45px}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-ad.svelte-1wtw7m8{width:24px;height:20px;line-height:21px;font-size:12px;color:#a3a3a3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;margin-right:20px}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-close.svelte-1wtw7m8{cursor:pointer;position:absolute;top:17px;right:6px;width:10px;height:10px;background:url(https://mediago-static.cdn.bcebos.com/assets/images/icon-close10.png) no-repeat center;background-size:contain}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-dislikeReason.svelte-1wtw7m8{cursor:pointer;width:60px;background:rgba(0, 0, 0, 0.5);border-radius:2px;position:absolute;top:41px;right:7px;font-size:12px;color:white;padding:5px 0;line-height:12px}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-dislikeReason div.svelte-1wtw7m8{padding:5px 0px}.mediago-ad-frs-751-4-wrapper.svelte-1wtw7m8 .mediago-dislikeReason .svelte-1wtw7m8:hover{text-decoration:underline}</style><style>.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31.svelte-1nyxj31{position:relative;text-align:center;width:737px;background:#ffffff;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #e5e5e5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-bottom:15px;font-size:0px}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31.svelte-1nyxj31:hover{background-color:#f7f9fc}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-reply.svelte-1nyxj31,.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-content.svelte-1nyxj31,.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-mid.svelte-1nyxj31,.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-right.svelte-1nyxj31{display:inline-block;height:auto;vertical-align:top}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-reply.svelte-1nyxj31{width:90px;margin-top:10px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-reply .mediago-reply-num.svelte-1nyxj31{width:50px;height:30px;line-height:26px;margin:auto;display:block;color:#333;font-size:12px;text-align:center;background:url(http://tb2.bdstatic.com/tb/static-hottopic/img/f_reply_bg_89030dc.png) no-repeat}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-content.svelte-1nyxj31{width:647px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-top:12px}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-content .mediago-title.svelte-1nyxj31{width:450px;font-size:14px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:14px}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-content .mediago-desc.svelte-1nyxj31{width:420px;font-size:12px;color:#3066b4;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:12px;margin-top:14px}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-content .mediago-checkBtn.svelte-1nyxj31{margin-top:12px;width:64px;height:28px;line-height:28px;border:1px solid #3066b4;border-radius:2px;font-size:12px;color:#3066b4;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;font-weight:400}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-content .mediago-video.svelte-1nyxj31{position:relative;display:block;width:290px;height:auto;max-height:290px;overflow:hidden;margin-top:12px;margin-bottom:40px}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-content .mediago-video video.svelte-1nyxj31{position:relative;display:block;width:100%;height:100%;margin:auto}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-content .mediago-video .bgImg.svelte-1nyxj31{position:absolute;top:0;left:0;display:block;width:100%;height:100%;margin:auto}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-content .mediago-video .mediago-volume.svelte-1nyxj31{position:absolute;bottom:8px;right:8px;width:18px;height:18px}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-content .mediago-video .mediago-play-btn.svelte-1nyxj31{width:55px;height:55px;background:url(https://tb2.bdstatic.com/tb/img/video_play_btn_hover_7a1975f.png) no-repeat center;background-size:contain;position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);transform:translate(-50%, -50%)}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-content .mediago-mid.svelte-1nyxj31{width:465px}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-content .mediago-right.svelte-1nyxj31{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:182px}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-userInfo.svelte-1nyxj31,.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-header.svelte-1nyxj31,.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-adName.svelte-1nyxj31,.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-ad.svelte-1nyxj31{display:inline-block;vertical-align:top}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-userInfo.svelte-1nyxj31{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-userInfo .mediago-header.svelte-1nyxj31{font-size:12px;height:20px;line-height:1;background:transparent url(http://tb2.bdstatic.com/tb/img/icon_author_112d0bd.png?__sprite=) no-repeat 4px 0px;padding:0px 0 0 25px;overflow:hidden;display:inline-block}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-userInfo .mediago-adName.svelte-1nyxj31{width:66px;font-size:12px;color:#a3a3a3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;line-height:20px;margin-right:45px}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-ad.svelte-1nyxj31{width:24px;height:20px;line-height:21px;font-size:12px;color:#a3a3a3;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;text-align:justify;margin-right:20px}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-close.svelte-1nyxj31{cursor:pointer;position:absolute;top:17px;right:6px;width:10px;height:10px;background:url(https://mediago-static.cdn.bcebos.com/assets/images/icon-close10.png) no-repeat center;background-size:contain}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-dislikeReason.svelte-1nyxj31{cursor:pointer;width:60px;background:rgba(0, 0, 0, 0.5);border-radius:2px;position:absolute;top:41px;right:7px;font-size:12px;color:white;padding:5px 0;line-height:12px}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-dislikeReason div.svelte-1nyxj31{padding:5px 0px}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 .mediago-dislikeReason .svelte-1nyxj31:hover{text-decoration:underline}.mediago-ad-frs-751-video-wrapper.svelte-1nyxj31 img.svelte-1nyxj31{width:100%;height:100%}</style><style>@charset \"UTF-8\";.mediago-ad-360-237-wrapper.svelte-155n2vl.svelte-155n2vl{position:relative;text-align:center;width:238px;border-bottom:1px solid #e5e5e5;-webkit-box-sizing:border-box;box-sizing:border-box}.mediago-ad-360-237-wrapper.svelte-155n2vl .mediago-a-tag.svelte-155n2vl{display:block}.mediago-ad-360-237-wrapper.svelte-155n2vl .mediago-desc.svelte-155n2vl{width:238px;height:33px;background:#ffffff;font-size:12px;color:#272829;font-weight:400;padding:8px;margin:0px;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:left;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.mediago-ad-360-237-wrapper.svelte-155n2vl .mediago-img.svelte-155n2vl{position:relative;width:238px;height:238px}.mediago-ad-360-237-wrapper.svelte-155n2vl .mediago-close-btn.svelte-155n2vl{position:absolute;top:8px;right:6px;width:16px;height:16px;background:url(http://mediago-static.cdn.bcebos.com/static/images/close.a57e14.png) no-repeat center;background-size:contain}.mediago-ad-360-237-wrapper.svelte-155n2vl .mediago-dislikeReason.svelte-155n2vl{cursor:pointer;width:60px;background-color:rgba(0, 0, 0, 0.5);border-radius:2px;position:absolute;top:28px;right:6px;font-size:12px;color:white;padding:5px 0;line-height:12px}.mediago-ad-360-237-wrapper.svelte-155n2vl .mediago-dislikeReason div.svelte-155n2vl{padding:5px 0px}.mediago-ad-360-237-wrapper.svelte-155n2vl .mediago-dislikeReason .svelte-155n2vl:hover{text-decoration:underline}.mediago-ad-360-237-wrapper.svelte-155n2vl .mediago-ad-logo.svelte-155n2vl{position:absolute;bottom:8px;left:10px;width:32px;height:19px;background:rgba(0, 0, 0, 0.33);border-radius:2px}.mediago-ad-360-237-wrapper.svelte-155n2vl .mediago-ad-logo .mediago-text.svelte-155n2vl{display:inline-block;font-size:12px;-webkit-transform:scale(0.8333333333);-ms-transform:scale(0.8333333333);transform:scale(0.8333333333);color:#ffffff;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;line-height:19px}</style><style>@charset \"UTF-8\";.mediago-ad-video-360-wrapper.svelte-zxnafr.svelte-zxnafr{position:relative;text-align:center;width:238px;border-bottom:1px solid #e5e5e5;-webkit-box-sizing:border-box;box-sizing:border-box}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-a-tag.svelte-zxnafr{display:block}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-desc.svelte-zxnafr{width:238px;height:33px;background:#ffffff;font-size:12px;color:#272829;font-weight:400;padding:8px;margin:0px;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:left;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-video.svelte-zxnafr{position:relative;width:238px;max-height:238px;overflow:hidden}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-video video.svelte-zxnafr{position:relative;display:block;width:100%;height:100%;margin:auto}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-video .bgImg.svelte-zxnafr{position:absolute;top:0;left:0;display:block;width:100%;height:100%;margin:auto}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-close-btn.svelte-zxnafr{position:absolute;top:8px;right:6px;width:16px;height:16px;background:url(http://mediago-static.cdn.bcebos.com/static/images/close.a57e14.png) no-repeat center;background-size:contain}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-volume.svelte-zxnafr{position:absolute;bottom:8px;right:8px;width:18px;height:18px}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-play.svelte-zxnafr{position:absolute;width:100%;height:100%;left:0;top:0}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-play .mediago-play-btn.svelte-zxnafr{width:55px;height:55px;background:url(https://tb2.bdstatic.com/tb/img/video_play_btn_hover_7a1975f.png) no-repeat center;background-size:contain;position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);transform:translate(-50%, -50%)}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-dislikeReason.svelte-zxnafr{cursor:pointer;width:60px;background-color:rgba(0, 0, 0, 0.5);border-radius:2px;position:absolute;top:28px;right:6px;font-size:12px;color:white;padding:5px 0;line-height:12px}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-dislikeReason div.svelte-zxnafr{padding:5px 0px}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-dislikeReason .svelte-zxnafr:hover{text-decoration:underline}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-ad-logo.svelte-zxnafr{position:absolute;bottom:8px;left:10px;width:32px;height:19px;background:rgba(0, 0, 0, 0.33);border-radius:2px}.mediago-ad-video-360-wrapper.svelte-zxnafr .mediago-ad-logo .mediago-text.svelte-zxnafr{display:inline-block;font-size:12px;-webkit-transform:scale(0.8333333333);-ms-transform:scale(0.8333333333);transform:scale(0.8333333333);color:#ffffff;letter-spacing:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-break:break-all;line-height:19px}.mediago-ad-video-360-wrapper.svelte-zxnafr img.svelte-zxnafr{width:100%;height:100%}</style><style>.mediago-adsense_container.svelte-1fak9tc{position:relative;width:237px}</style><style>main.svelte-zmnt4x{text-align:center;padding:1em;max-width:240px;margin:0 auto}@media(min-width: 640px){main.svelte-zmnt4x{max-width:none}}</style><script src=\"https://gsp0.baidu.com/9bMYfHSm2Q5IlBGlnYG/tieba?word=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;sec_dir=%E6%90%9E%E7%AC%91&amp;srcid=1452&amp;callback=bd__cbs__m9661f8b4\" type=\"text/javascript\" async=\"\"></script><script type=\"text/javascript\" src=\"//tb1.bdstatic.com/tb/static-common/component/commonLogic/common/common_default_merger.js?v=18.8\"></script><script type=\"text/javascript\" src=\"//tb1.bdstatic.com/tb/static-common/component/commonLogic/common/user_message/UserMessage.js?v=18.8\"></script><style id=\"monica-reading-highlight-style\">\n        .monica-reading-highlight {\n          animation: fadeInOut 1.5s ease-in-out;\n        }\n\n        @keyframes fadeInOut {\n          0%, 100% { background-color: transparent; }\n          30%, 70% { background-color: rgba(2, 118, 255, 0.20); }\n        }\n      </style><script type=\"text/javascript\" src=\"http://tb1.bdstatic.com/tb/_/qrcode_fdc9a64.js\"></script></head><body class=\"skin_normal\" monica-locale=\"zh_CN\" monica-version=\"5.9.6\" monica-id=\"ofpnmcalabcbjgholdjcjblkibolbppb\"><a id=\"ariaTipText\" role=\"pagedescription\" aria-label=\"æ¬¢è¿Žè¿›å…¥ 对于一个父亲来说，这个女儿14岁就死了【以太比特吧】_百度贴吧,ç›²äººç”¨æˆ·ä½¿ç”¨æ“ä½œæ™ºèƒ½å¼•å¯¼ï¼Œè¯·æŒ‰å¿«æ·é”®Ctrl+Alt+Rï¼›é˜…è¯»è¯¦ç»†æ“ä½œè¯´æ˜Žè¯·æŒ‰å¿«æ·é”®Ctrl+Alt+é—®å·é”®ã€‚\" aria-atomic=\"true\" href=\"javascript:void(0)\" class=\"skipAutoFix\" style=\"width: 1px; height: 1px;\"><img src=\"\" style=\"width:1px !important;height:1px !important;position:absolute;top:0;\"></a><div id=\"com_userbar\" class=\"userbar \" style=\"z-index: 10005;\"><ul><li class=\"u_split\"></li><li class=\"u_bdhome\"><div class=\"u_menu_item u_menu_bdhome j_u_menu_bd_home_link\"><a rel=\"noopener\" href=\"//www.baidu.com?tn=SE_hldp03480_530ir7bs\" target=\"_blank\" onclick=\"$.stats.track('top_baiduhomepage_link', 'ps_callback_statics')\">百度首页</a></div></li><li class=\"u_extraurl\"></li><li class=\"u_username\" id=\"j_u_username\"><div class=\"u_menu_item u_menu_username\"><a rel=\"noopener\" href=\"//tieba.baidu.com/home/main?id=tb.1.e6057aec.PmFeyCvKVx0KZKdGZ2v9oA&amp;fr=userbar\" title=\"点击到个人中心\" class=\"u_username_wrap\"><span class=\"u_username_title\">抗压吧吧务666</span><i class=\"i-arrow-down\"></i></a></div><div class=\"u_ddl\"><div class=\"u_ddl_con\"><span class=\"u_ddl_arrow\"> <em></em> </span><div class=\"u_ddl_con_top\"><ul><li class=\"u_itieba\"><a rel=\"noopener\" href=\"/home/main?id=tb.1.e6057aec.PmFeyCvKVx0KZKdGZ2v9oA&amp;fr=userbar\">我的贴吧</a></li><li class=\"u_mytbmall\"><a rel=\"noopener\" href=\"/tbmall/mymall\" target=\"_blank\">我的商城</a></li><li class=\"u_favor\" location=\"user_favor_ch\"><a rel=\"noopener\" href=\"/i/sys/jump?un=抗压吧吧务666&amp;ie=utf-8&amp;ie=utf-8&amp;type=storethread&amp;st_mod=userbar&amp;fr=tb0_pb\" target=\"_blank\">我的收藏</a></li><li class=\"u_pan\"><a rel=\"noopener\" href=\"https://pan.baidu.com/\" target=\"_blank\">我的网盘</a></li><li class=\"u_game\"><a rel=\"noopener\" href=\"https://wan.baidu.com/user?idfrom=2024\" target=\"_blank\">我的游戏</a></li></ul></div><div class=\"d_ddl_con_bottom\"></div></div></div></li><li class=\"u_news\"><div class=\"u_ddl\"><div class=\"u_ddl_con\"><span class=\"u_ddl_arrow\"> <em></em> </span><div class=\"u_ddl_con_top\"><div class=\"u_notity_bd\">    <ul class=\"sys_notify j_sys_notify j_category_list\">    <li class=\"category_item category_item_empty\">        <a class=\"j_cleardata\" href=\"/im/pcmsg\" target=\"sixin\" data-type=\"\">查看私信            </a>        </li></ul>    <ul class=\"sys_notify_last\">        <li class=\"category_item  category_item_last j_category_item_last\">            <a target=\"_blank\" href=\"/sysmsg/index?type=notity\">                我的通知<span class=\"unread_num\">8</span>            </a>            <ul class=\"new_message j_new_message j_category_list\">            </ul>        </li>    </ul></div></div><div class=\"d_ddl_con_bottom\"></div></div></div><div class=\"u_menu_item u_menu_news\"><a href=\"#\" class=\"u_news_wrap j_news\" onclick=\"return false;\">消息<span>(8)</span><i class=\"i-arrow-down\"></i></a></div></li><li class=\"u_creative\"></li><li class=\"u_official\"><div class=\"u_menu_item\"><span class=\"post_head_official\">官方号服务中心</span></div></li><li class=\"u_agent\"></li><li class=\"u_member\"><div class=\"u_menu_item u_menu_member\"><a rel=\"noopener\" class=\"u_member_wrap\" href=\"#\" onclick=\"return false;\"><i class=\"i-member\"></i>会员<i class=\"i-arrow-down\"></i></a></div><div class=\"u_ddl\"><div class=\"u_ddl_con\"><span class=\"u_ddl_arrow\"> <em></em> </span><div class=\"u_ddl_con_top\"><ul><li><a rel=\"noopener\" class=\"dropdown-dou j_wallet\" href=\"#\" onclick=\"return false\"><i class=\"i-dropdown-dou\"></i>Y币钱包</a></li><li><a rel=\"noopener\" class=\"dropdown-tbmall\" href=\"//tieba.baidu.com/tbmall/home\" target=\"_blank\"><i class=\"i-dropdown-tbmall\"></i>Y币商城</a></li><li><a rel=\"noopener\" class=\"u_joinvip_wrap vip_red j_btn_getmember\" href=\"javascript:;\" target=\"_blank\"><i class=\"i-dropdown-member\"></i>开通会员</a></li></ul></div><div class=\"d_ddl_con_bottom\"></div></div></div></li><li class=\"u_setting\"><div class=\"u_menu_item u_menu_setting\"><a rel=\"noopener\" class=\"u_setting_wrap\" href=\"#\" onclick=\"return false;\">更多<i class=\"i-arrow-down\"></i></a></div><div class=\"u_ddl\"><div class=\"u_ddl_con\"><span class=\"u_ddl_arrow\"> <em></em> </span><div class=\"u_ddl_con_top\"><ul><li><a rel=\"noopener\" href=\"https://tiebac.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">手机APP</a></li><li><a rel=\"noopener\" href=\"/f?kw=%D3%A6%D3%C3%D6%D0%D0%C4&amp;fr=userbar\" target=\"_blank\">应用中心</a></li><li><a rel=\"noopener\" href=\"//passport.baidu.com/?center&amp;tpl=tb&amp;aid=6&amp;default_tab=3#3,0\">账号设置</a></li><li class=\"u_tb_profile\"><a rel=\"noopener\" href=\"/home/profile?un=抗压吧吧务666&amp;ie=utf-8\">贴吧设置</a></li><li class=\"pm_center\"><a rel=\"noopener\" href=\"//tieba.baidu.com/pmc\" class=\"j_pmc-center\" target=\"_blank\">服务中心</a></li><li class=\"fuwu_center\"><a rel=\"noopener\" href=\"//tieba.baidu.com/hermes/feedback\" class=\"j_help-center\" target=\"_blank\">问题反馈</a></li><li class=\"u_logout\"><a rel=\"noopener\" href=\"#\">退出</a></li></ul></div><div class=\"d_ddl_con_bottom\"></div></div></div></li></ul></div><script type=\"text/javascript\">window.radar && window.radar.mark('ht');</script><script type=\"text/template\" id=\"u_notify\"><div class=\"u_notity_bd\">    <ul class=\"sys_notify j_sys_notify j_category_list\">    </ul>    <ul class=\"sys_notify_last\">        <li class=\"category_item  category_item_last j_category_item_last\">            <a target=\"_blank\" href=\"/sysmsg/index?type=notity\">                我的通知<span class=\"unread_num\">0</span>            </a>            <ul class=\"new_message j_new_message j_category_list\">            </ul>        </li>    </ul></div></script><script type=\"text/template\" id=\"u_notify_item\"><%for (var i = 0; i < list.length; i++) {%>    <li class=\"category_item <% if(list[i].unread_count == 0) {%>category_item_empty<%}%>\">    <%if ( list[i].category_href ) {%>    <a class=\"j_cleardata\" href=\"<%=list[i].category_href%>\" target=\"_blank\" data-type=\"<%=list[i].type%>\"><%=list[i].category_name%>        <% if(list[i].unread_count != 0) {%>            <span class=\"unread_num\"><%=list[i].unread_count%></span>        <% } %>    </a>    <%} else {%>    <a href=\"/sysmsg/index?type=notity&category_id=<%=list[i].category_id%>\" target=\"_blank\" data-type=\"<%=list[i].type%>\"><%=list[i].category_name%>        <% if(list[i].unread_count != 0) {%>            <span class=\"unread_num\"><%=list[i].unread_count%></span>        <% } %>    </a>    <% } %>    </li><%}%></script><div id=\"local_flash_cnt\"></div><div class=\"wrap1\"><div class=\"wrap2\"><script type=\"text/javascript\">    var commonPageData = PageData || {};    var PageData = {        page: 'pb', product: 'pb',        tbs: '6aefff9e364cb9e41722942842',        can_post:1, can_anonym_post:0, forum_type: 1, follow_sign: \"8b75b056990cbc81\", forward_sign: \"ee2485da5959d883\", power: {\"can_add_celebrity\":false,\"can_add_manager_team\":false,\"can_bws_FDS\":false,\"can_bws_bawu_center\":false,\"can_bws_bawu_info\":false,\"can_bws_bawu_log\":false,\"can_bws_filter_ip_tbs\":false,\"can_bws_limit_bawu_log\":false,\"can_cancel_filter_id\":false,\"can_cancel_mask_delete\":false,\"can_cancel_mask_good\":false,\"can_cancel_mask_top\":false,\"can_chatroom_change_announce\":false,\"can_chatroom_change_avatar\":false,\"can_chatroom_change_name\":false,\"can_chatroom_create\":false,\"can_chatroom_delete\":false,\"can_chatroom_exempt_mute_all\":false,\"can_chatroom_manage_admin\":false,\"can_chatroom_mute_all\":false,\"can_chatroom_mute_normal\":false,\"can_chatroom_recall_admin\":false,\"can_chatroom_recall_normal\":false,\"can_chatroom_set_send_level\":false,\"can_chatroom_set_talk_type\":false,\"can_chatroom_set_view_level\":false,\"can_del_manager_team\":false,\"can_edit_bakan\":false,\"can_edit_daquan\":false,\"can_edit_gconforum\":false,\"can_filter_id\":false,\"can_filter_ip\":false,\"can_mask_delete\":false,\"can_mask_good\":false,\"can_mask_top\":false,\"can_member_top\":false,\"can_op_FDS\":false,\"can_op_as_4thmgr\":false,\"can_op_as_broadcast_admin\":false,\"can_op_as_category_editor\":false,\"can_op_as_editor\":false,\"can_op_as_entertainment_manager\":false,\"can_op_as_operator\":false,\"can_op_as_profession_manager\":false,\"can_op_as_vertical_operator\":false,\"can_op_common_bawu\":false,\"can_op_disk\":false,\"can_op_frsbg\":false,\"can_op_good_class\":false,\"can_op_pic\":false,\"can_op_topic\":false,\"can_op_video\":false,\"can_op_wise_group\":false,\"can_paper_ignore_vcode\":false,\"can_pass_media_limit\":false,\"can_post\":true,\"can_post_frs\":true,\"can_post_pb\":true,\"can_send_memo\":false,\"can_super\":false,\"can_tobe_assist\":false,\"can_tobe_editor\":false,\"can_tobe_manager\":false,\"can_tobe_pri_content_assist\":false,\"can_tobe_pri_manage_assist\":false,\"can_toms_operator_alt_basic\":false,\"can_toms_operator_basic\":false,\"can_type1_audit_post\":false,\"can_type2_audit_post\":false,\"can_type3_audit_post\":false,\"can_type4_audit_post\":false,\"can_type5_audit_post\":false,\"can_unknown\":false,\"can_view_freq\":false,\"can_vip_jubao\":false,\"can_vote\":false,\"forever_ban\":0,\"lz_del\":false,\"picasso\":false,\"share_forum_perm\":[],\"can_set_topic\":false,\"reply_private_flag\":1},        is_thread_admin:0,        is_posts_admin:0,        staticDomain: \"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/\"    };    for (var item in commonPageData) {        PageData[item] = commonPageData[item];    }    PageData.forum = {        id: \"27927174\",        forum_id: \"27927174\",        name: '以太比特', forum_name: '以太比特', name_url: \"%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&ie=utf-8\",        name_encode: \"%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&ie=utf-8\",        member_name_url: \"%E4%BC%9A%E5%91%98&ie=utf-8\",        first_class: \"搞笑\",        second_class: \"搞笑\",        album_good_smallflow: \"\",        avatar: \"http:\\/\\/tiebapic.baidu.com\\/forum\\/w%3D120%3Bh%3D120\\/sign=293820c7a0dde711e7d247f497d4a626\\/e7cd7b899e510fb3f37ee7559c33c895d0430c89.jpg?tbpicau=2024-08-17-05_ad8d47a48b9849e95d04c7f3d84d0d88\",        forbid_flag: \"1\",        has_picture_frs: \"1\",        member_count: \"309573\",        member_name: \"会员\",        post_num: \"5368434\",        shield_post: \"1\",        sign_in_info: {\"user_info\":{\"user_id\":1527556343,\"is_sign_in\":0,\"user_sign_rank\":0,\"sign_time\":0,\"cont_sign_num\":0,\"cout_total_sing_num\":0,\"total_resign_num\":0,\"hun_sign_num\":0,\"is_org_disabled\":0,\"c_sign_num\":0,\"cm_sign_num\":0},\"forum_info\":{\"is_on\":true,\"is_filter\":false,\"forum_info\":{\"forum_id\":27927174,\"level_1_dir_name\":\"\\u641e\\u7b11\"},\"current_rank_info\":{\"sign_count\":3931,\"member_count\":309472,\"sign_rank\":15,\"dir_rate\":\"0.1\"},\"level_1_dir_name\":\"\\u641e\\u7b11\",\"level_2_dir_name\":\"\\u641e\\u7b11\",\"yesterday_rank_info\":{\"sign_count\":4476,\"member_count\":309375,\"sign_rank\":15,\"dir_rate\":\"0.1\"},\"weekly_rank_info\":{\"sign_count\":4316,\"member_count\":308123,\"sign_rank\":15},\"monthly_rank_info\":{\"sign_count\":4270,\"member_count\":300344,\"sign_rank\":15}}}};    var commonPageDataUser = {        bg_id: \"\",        cur_score: \"0\",        email: \"\",        feedNumNew: \"\",        free_flag: \"\",        is_black: 0,        is_block: 0,        is_half_user: 0,        is_like: 0,        is_tenyear: 0,        itieba_id: \"\",        level_id: \"1\",        level_name: \"初级粉丝\",        meizhi_level: 0,        mobile: \"\",        mobilephone: \"131******21\",        name_link: \"&ie=utf-8\",        name_show: \"\",        name_weak: \"\",        open_uid: \"\",        score_card: \"\",        score_left: \"5\",        sid: \"\",        source_id: \"\",        start_time: \"\",        superboy: \"\",        use_sig: 0,        user_sex: 2,        user_status: 1,        user_type: 0,        userhide: 0,        picasso: \"\",        global: {\"tbmall_newprops\":0},        rank: null,        tbguess_card: null,        tips: [],        urank: []};    for (var key in commonPageDataUser) {        PageData['user'][key] = commonPageDataUser[key];    }    PageData.user.forbidden = PageData.user.is_login ? [] : {};    PageData.thread = {        author: \"怪物大宝贝\",        thread_id:9117905169,        title: \"对于一个父亲来说，这个女儿14岁就死了\", reply_num:787, thread_type: \"0\",        topic: {            is_topic: false,            topic_type: false,            is_live_post: false,            is_lpost: false,            lpost_type: 0        }, /*null,*/        is_ad:0, video_url: \"\" };    PageData.post_perm = {\"img_num\":10,\"video_num\":10,\"smiley_num\":100,\"white_list\":[\"http:\\/\\/www.tudou.com\\/\",\"http:\\/\\/v.blog.sohu.com\\/\",\"http:\\/\\/tv.sohu.com\\/\",\"http:\\/\\/share.vrs.sohu.com\\/\",\"http:\\/\\/my.tv.sohu.com\\/\",\"http:\\/\\/player.56.com\\/\",\"http:\\/\\/www.56.com\\/\",\"http:\\/\\/kankanews.com\\/\",\"http:\\/\\/video6.smgbb.cn\\/\",\"http:\\/\\/www.youku.com\\/\",\"http:\\/\\/player.youku.com\\/\",\"http:\\/\\/static.youku.com\\/\",\"http:\\/\\/www.ku6.com\\/\",\"http:\\/\\/player.ku6.com\\/\",\"http:\\/\\/video.sina.com.cn\\/\",\"http:\\/\\/vhead.blog.sina.com.cn\\/\",\"http:\\/\\/you.video.sina.com.cn\\/\",\"http:\\/\\/video.qq.com\\/\",\"http:\\/\\/www.baidu.com\\/\",\"http:\\/\\/box.baidu.com\\/\",\"http:\\/\\/hi.baidu.com\\/\",\"http:\\/\\/mv.baidu.com\\/\",\"http:\\/\\/mvimg.baidu.com\\/\",\"http:\\/\\/mvideo.baidu.com\\/\",\"http:\\/\\/player.cntv.cn\\/\",\"http:\\/\\/player.xiyou.cntv.cn\\/\",\"http:\\/\\/www.yinyuetai.com\\/\",\"http:\\/\\/player.yinyuetai.com\\/\",\"http:\\/\\/www.aipai.com\\/\",\"http:\\/\\/www.cutv.com\\/\",\"http:\\/\\/player.cutv.com\\/\",\"http:\\/\\/www.pptv.com\\/\",\"http:\\/\\/v.pptv.com\\/\",\"http:\\/\\/www.letv.com\\/\",\"http:\\/\\/www.iqiyi.com\\/\",\"http:\\/\\/yule.iqiyi.com\\/\",\"http:\\/\\/player.video.qiyi.com\\/\",\"http:\\/\\/www.ifeng.com\\/\",\"http:\\/\\/s.v.ifeng.com\\/\",\"http:\\/\\/v.ifeng.com\\/\",\"http:\\/\\/www.m1905.com\\/\",\"http:\\/\\/www.joy.cn\\/\",\"http:\\/\\/client.joy.cn\\/\",\"http:\\/\\/www.molihe.com\\/\",\"http:\\/\\/mv.molihe.com\\/\",\"http:\\/\\/swf.molihe.com\\/\",\"http:\\/\\/www.baomihua.com\\/\",\"http:\\/\\/video.baomihua.com\\/\",\"http:\\/\\/www.ouou.com\\/\",\"http:\\/\\/flash.ouou.com\\/\",\"http:\\/\\/dv.ouou.com\\/\",\"http:\\/\\/misc.home.news.cn\\/\",\"http:\\/\\/www.news.cn\\/\",\"http:\\/\\/www.wasu.cn\\/\",\"http:\\/\\/play1.wasu.cn\\/\",\"http:\\/\\/play.wasu.cn\\/\",\"http:\\/\\/v.iask.com\\/\",\"http:\\/\\/i7.imgs.letv.com\\/\",\"http:\\/\\/static.video.qq.com\\/\",\"http:\\/\\/player.pptv.com\\/\",\"http:\\/\\/www.mgtv.com\\/\",\"http:\\/\\/www.meipai.com\\/\",\"http:\\/\\/baishi.baidu.com\\/\",\"http:\\/\\/www.bilibili.com\\/\",\"http:\\/\\/share.acg.tv\\/\",\"http:\\/\\/static.hdslb.com\\/\",\"http:\\/\\/bangumi.bilibili.com\"]};    PageData.special = {\"has_sub_post\":1,\"has_grade\":1,\"has_lucky_lottery\":0,\"has_basket_lottery\":0,\"has_ssq_lottery\":0,\"has_foot_lottery\":0,\"is_match_news\":0,\"lz_only\":0,\"has_lz_only\":1,\"is_from_spider\":false};    PageData.isPicBa = \"1\";    PageData.pager = {\"cur_page\":1,\"total_page\":13,\"page_size\":30};        var g_pg = {        imageLimite: 10,        flashWhiteList:[\"http:\\/\\/www.tudou.com\\/\",\"http:\\/\\/v.blog.sohu.com\\/\",\"http:\\/\\/tv.sohu.com\\/\",\"http:\\/\\/share.vrs.sohu.com\\/\",\"http:\\/\\/my.tv.sohu.com\\/\",\"http:\\/\\/player.56.com\\/\",\"http:\\/\\/www.56.com\\/\",\"http:\\/\\/kankanews.com\\/\",\"http:\\/\\/video6.smgbb.cn\\/\",\"http:\\/\\/www.youku.com\\/\",\"http:\\/\\/player.youku.com\\/\",\"http:\\/\\/static.youku.com\\/\",\"http:\\/\\/www.ku6.com\\/\",\"http:\\/\\/player.ku6.com\\/\",\"http:\\/\\/video.sina.com.cn\\/\",\"http:\\/\\/vhead.blog.sina.com.cn\\/\",\"http:\\/\\/you.video.sina.com.cn\\/\",\"http:\\/\\/video.qq.com\\/\",\"http:\\/\\/www.baidu.com\\/\",\"http:\\/\\/box.baidu.com\\/\",\"http:\\/\\/hi.baidu.com\\/\",\"http:\\/\\/mv.baidu.com\\/\",\"http:\\/\\/mvimg.baidu.com\\/\",\"http:\\/\\/mvideo.baidu.com\\/\",\"http:\\/\\/player.cntv.cn\\/\",\"http:\\/\\/player.xiyou.cntv.cn\\/\",\"http:\\/\\/www.yinyuetai.com\\/\",\"http:\\/\\/player.yinyuetai.com\\/\",\"http:\\/\\/www.aipai.com\\/\",\"http:\\/\\/www.cutv.com\\/\",\"http:\\/\\/player.cutv.com\\/\",\"http:\\/\\/www.pptv.com\\/\",\"http:\\/\\/v.pptv.com\\/\",\"http:\\/\\/www.letv.com\\/\",\"http:\\/\\/www.iqiyi.com\\/\",\"http:\\/\\/yule.iqiyi.com\\/\",\"http:\\/\\/player.video.qiyi.com\\/\",\"http:\\/\\/www.ifeng.com\\/\",\"http:\\/\\/s.v.ifeng.com\\/\",\"http:\\/\\/v.ifeng.com\\/\",\"http:\\/\\/www.m1905.com\\/\",\"http:\\/\\/www.joy.cn\\/\",\"http:\\/\\/client.joy.cn\\/\",\"http:\\/\\/www.molihe.com\\/\",\"http:\\/\\/mv.molihe.com\\/\",\"http:\\/\\/swf.molihe.com\\/\",\"http:\\/\\/www.baomihua.com\\/\",\"http:\\/\\/video.baomihua.com\\/\",\"http:\\/\\/www.ouou.com\\/\",\"http:\\/\\/flash.ouou.com\\/\",\"http:\\/\\/dv.ouou.com\\/\",\"http:\\/\\/misc.home.news.cn\\/\",\"http:\\/\\/www.news.cn\\/\",\"http:\\/\\/www.wasu.cn\\/\",\"http:\\/\\/play1.wasu.cn\\/\",\"http:\\/\\/play.wasu.cn\\/\",\"http:\\/\\/v.iask.com\\/\",\"http:\\/\\/i7.imgs.letv.com\\/\",\"http:\\/\\/static.video.qq.com\\/\",\"http:\\/\\/player.pptv.com\\/\",\"http:\\/\\/www.mgtv.com\\/\",\"http:\\/\\/www.meipai.com\\/\",\"http:\\/\\/baishi.baidu.com\\/\",\"http:\\/\\/www.bilibili.com\\/\",\"http:\\/\\/share.acg.tv\\/\",\"http:\\/\\/static.hdslb.com\\/\",\"http:\\/\\/bangumi.bilibili.com\"],        flashLimite: 10,        smileyLimite:100};</script><script type=\"text/javascript\">/*缩放图片的方法需要放在前面，因为有onload*//*common里也有这个方法，但是common里有setTimeout的判断，在IE下会导致内存占用很大*/function resizePic_temp(o, Mw, Mh, need_margin) {    var _Mw = Mw || 120;    var _Mh = Mh || 120;    var need_resize = false;    var _image = new Image();    _image.src = o.src;    function getRightWH(Rw, Rh, Mw, Mh) {        var index = 0,        _Rw = Rw,        _Rh = Rh;        if (Rw > Mw) index += 1;        if (Rh > Mh) index += 2;        switch (index) {        case 1:            _Rw = Mw;            _Rw = Rh * Mw / Rw;        case 2:            _Rh = Mh;            _Rw = Rw * Mh / Rh;        case 3:            _Rh = (Rh / Mh > Rw / Mw) ? Mh: Rh * Mw / Rw;            _Rw = (Rh / Mh > Rw / Mw) ? Rw * Mh / Rh: Mw        }        if (index != 0) {            need_resize = true        }        return [_Rw, _Rh]    }    var wh = getRightWH(_image.width, _image.height, _Mw, _Mh);    o.style.width = wh[0] + 'px';    o.style.height = wh[1] + 'px';    o.setAttribute(\"width\",wh[0]);    o.setAttribute(\"height\",wh[1]);    o.style.visibility = 'visible';    if (need_margin == true) {        o.style.marginTop = (Mh - parseInt(wh[1])) / 2 + 'px'    }    _image = null;    return need_resize}/*签名档加载失败处理*/function sign_change_img(img){img.src='//tb1.bdstatic.com/tb/static-itieba/img/sign_err.png';img.width=100;img.height=25;}</script><div id=\"head\" class=\" search_bright clearfix\" style=\"\"><div class=\"head_inner\"><div class=\"search_top clearfix\"><div class=\"search_nav j_search_nav\" style=\"margin-right: 547px;\"><a rel=\"noopener\" param=\"wd\" href=\"https://www.baidu.com/s?cl=3&amp;\">网页</a><a rel=\"noopener\" param=\"word\" href=\"https://www.baidu.com/s?rtt=1&amp;bsst=1&amp;cl=2&amp;tn=news&amp;fr=tieba&amp;\" mark=\"news\">资讯</a><a rel=\"noopener\" param=\"word\" href=\"https://www.baidu.com/sf/vsearch?pd=video&amp;tn=vsearch&amp;ct=301989888&amp;rn=20&amp;pn=0&amp;db=0&amp;s=21&amp;rsv_spt=11&amp;\">视频</a><a rel=\"noopener\" param=\"word\" href=\"https://image.baidu.com/i?tn=baiduimage&amp;ct=201326592&amp;lm=-1&amp;cl=2&amp;\">图片</a><a rel=\"noopener\" param=\"word\" href=\"https://zhidao.baidu.com/q?ct=17&amp;pn=0&amp;tn=ikaslist&amp;rn=10&amp;\">知道</a><a rel=\"noopener\" href=\"https://wenku.baidu.com/search?fr=tieba&amp;lm=0&amp;od=0&amp;\" param=\"word\">文库</a><b>贴吧</b><a rel=\"noopener\" param=\"word\" href=\"https://map.baidu.com/m?fr=map006&amp;\">地图</a><a rel=\"noopener\" param=\"q\" href=\"https://b2b.baidu.com/s?fr=tieba&amp;\">采购</a></div></div><div class=\"search_main_wrap\"><div class=\"search_main clearfix\"><div class=\"search_form\"><a rel=\"noopener\" title=\"到贴吧首页\" href=\"/\" class=\"search_logo\" style=\"\"></a>                <form name=\"f1\" class=\"clearfix j_search_form\" action=\"/f\" id=\"tb_header_search_form\"><input class=\"search_ipt search_inp_border j_search_input tb_header_search_input\" name=\"kw1\" value=\"以太比特\" type=\"text\" autocomplete=\"off\" size=\"42\" tabindex=\"1\" id=\"wd1\" maxlength=\"100\" x-webkit-grammar=\"builtin:search\" x-webkit-speech=\"true\"><input autocomplete=\"off\" type=\"hidden\" name=\"kw\" value=\"以太比特\" id=\"wd2\"><span class=\"search_btn_wrap search_btn_enter_ba_wrap\"><a rel=\"noopener\" class=\"search_btn search_btn_enter_ba j_enter_ba\" href=\"#\" onclick=\"return false;\" onmousedown=\"this.className+=' search_btn_down'\" onmouseout=\"this.className=this.className.replace('search_btn_down','')\">进入贴吧</a></span><span class=\"search_btn_wrap\"><a rel=\"noopener\" class=\"search_btn j_search_post\" href=\"#\" onclick=\"return false;\">全吧搜索</a></span><span id=\"search_baidu_promote\"><a id=\"search_baidu_promote_download\" style=\"color:red;padding-left:8px;text-decoration:underline;\" pv_code=\"0\" href=\"#\" target=\"_self\"></a></span></form><p style=\"display:none;\" class=\"switch_radios\"><input type=\"radio\" class=\"nowtb\" name=\"tb\" id=\"nowtb\"><label for=\"nowtb\">吧内搜索</label><input type=\"radio\" class=\"searchtb\" name=\"tb\" id=\"searchtb\"><label for=\"searchtb\">搜贴</label><input type=\"radio\" class=\"authortb\" name=\"tb\" id=\"authortb\"><label for=\"authortb\">搜人</label><input type=\"radio\" class=\"jointb\" checked=\"checked\" name=\"tb\" id=\"jointb\"><label for=\"jointb\">进吧</label><input type=\"radio\" class=\"searchtag\" name=\"tb\" id=\"searchtag\" style=\"display:none;\"><label for=\"searchtag\" style=\"display:none;\">搜标签</label></p></div><div class=\"suggestion\" style=\"left: 466px; width: 534px; top: 104px; display: none;\"><ul class=\"suggestion_list\"></ul></div></div></div></div>  </div><div id=\"container\" class=\"l_container  \"><div class=\"content clearfix\"><div class=\"card_top_wrap clearfix card_top_theme2 \"><div class=\"card_top_right\">    <div class=\"sign_mod_bright\" id=\"sign_mod\"><div class=\"sign_tip_container\"><div class=\"j_succ_info sign_succ1\" style=\"display:none\"><div class=\"sign_tip_bdwrap clearfix\"><div class=\"sign_tip_bd_arr\"></div><div class=\"sign_tip_main\"><div class=\"sign_succ_calendar\"><div class=\"sign_succ_calendar_title\"><div class=\"calendar_title_month clearfix\"><div class=\"calendar_month_next j_calendar_month_next\">&nbsp;</div><div class=\"calendar_month_prev j_calendar_month_prev\">&nbsp;</div><div class=\"calendar_month_span j_calendar_month\">&nbsp;</div></div></div><table class=\"sign_succ_table \"><thead align=\"center\"><tr class=\"sign_succ_canlerdar_head\"><td>日</td><td>一</td><td>二</td><td>三</td><td>四</td><td>五</td><td>六</td></tr></thead><tbody align=\"center\" class=\"sign_succ_canlerdar_days j_canlerdar_days\"><tr><td class=\"j_1_0\">&nbsp;</td><td class=\"j_1_1\">&nbsp;</td><td class=\"j_1_2\">&nbsp;</td><td class=\"j_1_3\">&nbsp;</td><td class=\"j_1_4\">&nbsp;</td><td class=\"j_1_5\">&nbsp;</td><td class=\"j_1_6\">&nbsp;</td></tr><tr><td class=\"j_2_0\">&nbsp;</td><td class=\"j_2_1\">&nbsp;</td><td class=\"j_2_2\">&nbsp;</td><td class=\"j_2_3\">&nbsp;</td><td class=\"j_2_4\">&nbsp;</td><td class=\"j_2_5\">&nbsp;</td><td class=\"j_2_6\">&nbsp;</td></tr><tr><td class=\"j_3_0\">&nbsp;</td><td class=\"j_3_1\">&nbsp;</td><td class=\"j_3_2\">&nbsp;</td><td class=\"j_3_3\">&nbsp;</td><td class=\"j_3_4\">&nbsp;</td><td class=\"j_3_5\">&nbsp;</td><td class=\"j_3_6\">&nbsp;</td></tr><tr><td class=\"j_4_0\">&nbsp;</td><td class=\"j_4_1\">&nbsp;</td><td class=\"j_4_2\">&nbsp;</td><td class=\"j_4_3\">&nbsp;</td><td class=\"j_4_4\">&nbsp;</td><td class=\"j_4_5\">&nbsp;</td><td class=\"j_4_6\">&nbsp;</td></tr><tr class=\"j_5\" style=\"display:none\"><td class=\"j_5_0\">&nbsp;</td><td class=\"j_5_1\">&nbsp;</td><td class=\"j_5_2\">&nbsp;</td><td class=\"j_5_3\">&nbsp;</td><td class=\"j_5_4\">&nbsp;</td><td class=\"j_5_5\">&nbsp;</td><td class=\"j_5_6\">&nbsp;</td></tr><tr class=\"j_6\" style=\"display:none\"><td class=\"j_6_0\">&nbsp;</td><td class=\"j_6_1\">&nbsp;</td><td class=\"j_6_2\">&nbsp;</td><td class=\"j_6_3\">&nbsp;</td><td class=\"j_6_4\">&nbsp;</td><td class=\"j_6_5\">&nbsp;</td><td class=\"j_6_6\">&nbsp;</td></tr></tbody></table></div><div class=\"sign_tip_boards\"><div class=\"sign_tip_board sign_tip_board_urank j_sign_ad_mobi\"><div class=\"sign_tip_board_ico\"></div><p>签到排名：今日本吧第<span class=\"sign_index_num j_signin_index\">0</span>个签到，</p><p><span class=\"j_succ_text\">本吧因你更精彩，明天继续来努力！</span></p></div><div class=\"sign_tip_board sign_tip_board_barrank\"><div class=\"sign_tip_board_ico\"></div>                        <p>本吧排名：<a rel=\"noreferrer\" target=\"_blank\" href=\"/sign/index?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8\">15</a></p>                        <p>本吧签到人数：3931</p></div></div></div><div class=\"sign_tip_aside\">                <div class=\"sign_tip_sbox sign_tip_sbox_first sign_tip_sbox_1key\"><div class=\"sign_tip_sbox_hd\">一键签到</div><div class=\"sign_tip_sbox_bd\"><div class=\"sign_tip_sbox_cnt\"><a rel=\"noreferrer\" class=\"sign_tip_sbox_card j_sign_tip_1key_icon sign_tip_sbox_card_pencil\" href=\"/tbmall/tshow?tab=detail\" target=\"_blank\"></a><div class=\"sign_tip_sbox_txt\">可签<span class=\"orange_text\">7</span>级以上的吧<span class=\"orange_text\">50</span>个</div><div class=\"sign_tip_sbox_btn\"><a rel=\"noreferrer\" href=\"/home/main?id=tb.1.e6057aec.PmFeyCvKVx0KZKdGZ2v9oA?t=1420595544#stipsign\" target=\"_blank\" class=\"ui_btn ui_btn_sub_s\"><span><em><b class=\"sign_crown sign_crown_pencil\" title=\"无瑕的T秀勋章\"></b>一键签到</em></span></a></div></div></div></div>                <div class=\"sign_tip_sbox sign_tip_sbox_fixsign\"><div class=\"sign_tip_sbox_hd sign_tip_sbox_hd_inf j_need_rpln_wrap\">本月漏签<span class=\"j_lack_sign_monthly_count sign_num\">0</span>次！</div><div class=\"sign_tip_sbox_bd\"><div class=\"sign_tip_sbox_cnt\"><a rel=\"noreferrer\" href=\"/tbmall/propslist?category=108\" class=\"sign_tip_sbox_card\" target=\"_blank\"><span class=\"sign_num\"><span class=\"j_rpln_card_count\">0</span></span></a><div class=\"sign_tip_sbox_txt\">成为超级会员，赠送8张补签卡</div><div class=\"sign_tip_sbox_btn\"><a rel=\"noreferrer\" href=\"#\" class=\"ui_btn ui_btn_sub_s j_lack_sign_monthly_help\" target=\"_blank\"><span><em>如何使用？</em></span></a><div class=\"lack_sign_monthly_tip_wrap\"><div class=\"ui_card_wrap lack_sign_monthly_tip_card j_lack_sign_monthly_tip_card\" style=\"display:none;\"><div class=\"ui_card_content \"><div class=\"time_gift_tip\">点击日历上漏签日期，即可进行<span class=\"strongerText\">补签</span>。</div></div><span class=\"arrow ui_white_down\" style=\"left:48%;\"></span></div></div></div></div></div></div><div class=\"sign_tip_sbox sign_tip_sbox_chainsign\"><div class=\"sign_tip_sbox_hd sign_tip_sbox_hd_inf\">连续签到：<span class=\"sign_num j_sign_succ_keep\"></span>天&nbsp;&nbsp;累计签到：<span class=\"sign_num j_sign_succ_count\"></span>天</div><div class=\"sign_tip_sbox_bd\"><div class=\"sign_tip_sbox_cnt\"><a rel=\"noreferrer\" href=\"/tbmall/propslist?category=108\" class=\"sign_tip_sbox_card\" target=\"_blank\"><span class=\"sign_num\"><span class=\"j_sign_chainsign_num\">0</span></span></a><div class=\"sign_tip_sbox_txt\">超级会员单次开通12个月以上，赠送连续签到卡3张</div><div class=\"sign_tip_sbox_btn\"><a rel=\"noreferrer\" href=\"#\" class=\"ui_btn ui_btn_sub_s j_cont_sign_card\" target=\"_blank\"><span><em>使用连续签到卡</em></span></a></div></div></div></div><div class=\"sign_tip_sbox sign_tip_sbox_last sign_tip_sbox_rights\"><div class=\"sign_tip_sbox_bd j_sign_rights\"><div class=\"sign_rights_display clearfix\"><div class=\"sign_rights_icon j_sign_rights_icon rights_1\"></div><div class=\"sign_rights_icon j_sign_rights_icon rights_2\"></div><div class=\"sign_rights_icon j_sign_rights_icon rights_3\"></div><div class=\"sign_rights_icon j_sign_rights_icon rights_4\"></div><div class=\"sign_rights_icon j_sign_rights_icon rights_5\"></div><span class=\"split_line\"></span><a rel=\"noreferrer\" href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_who\" class=\"balv_help\" title=\"签到规则\" target=\"_blank\"></a></div></div></div></div>            </div></div></div><div id=\"signstar_wrapper\" class=\"j_sign_box sign_box_bright\"><a rel=\"noreferrer\" href=\"#\" onclick=\"return false\" data-dw=\"2\" tabindex=\"3\" title=\"签到\" class=\"j_signbtn sign_btn_bright j_cansign\"><span class=\"sign_today_date\">08月06日</span><span class=\"sign_month_lack_days\">漏签<span class=\"j_sign_month_lack_days\">0</span>天</span></a></div>        </div></div><div class=\"card_top  clearfix\">        <div class=\"card_head \"><a href=\"/f?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8\">                        <img class=\"card_head_img\" src=\"https://tiebapic.baidu.com/forum/w%3D150%3Bh%3D150%3Bq%3D80%3B/sign=2cf8a90674adcbef01347a039c9446e0/e7cd7b899e510fb3f37ee7559c33c895d0430c89.jpg?tbpicau=2024-08-17-05_cd621e79e0e429981e5e498ac4bc90e1\">            </a></div><div class=\"card_title \">        <a class=\"card_title_fname\" title=\"\" href=\"/f?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8\">            以太比特吧 </a>                                                <a href=\"#\" onclick=\"return false\" class=\"focus_btn islike_focus\" id=\"j_head_focus_btn\" style=\"margin-top:2px;\"></a>                <span class=\"card_num \"><span class=\"card_numLabel\">关注：</span><span class=\"card_menNum\">309,573</span><span class=\"card_numLabel\">贴子：</span><span class=\"card_infoNum\">5,368,434</span></span>        </div></div></div><div class=\"nav_wrap nav_wrap_add_border\" id=\"tb_nav\"><ul class=\"nav_list j_nav_list\"><li class=\" j_tbnav_tab\">\n    <a href=\"/f?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;tp=0\" class=\" j_tbnav_tab_a\" id=\"tab_forumname\" stats-data=\"fr=tb0_forum&amp;st_mod=frs&amp;st_value=tabmain\">看贴</a>\n</li><li class=\" j_tbnav_tab\">\n    <a href=\"\" class=\" j_tbnav_tab_a\"></a>\n</li><li class=\" j_tbnav_tab\">\n    <a href=\"/f?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;tab=album\" class=\" j_tbnav_tab_a\" stats-data=\"fr=tb0_forum&amp;st_mod=frs&amp;st_value=tabfrsphotogood\" frs-page=\"\" id=\"tab_picture\">图片</a>\n</li><li class=\" j_tbnav_tab\">\n    <a href=\"/f?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;tab=good&amp;cid=\" class=\" j_tbnav_tab_a\" stats-data=\"fr=tb0_forum&amp;st_mod=frs&amp;st_value=tabgood\">吧主推荐</a>\n</li><li class=\" j_tbnav_tab\">\n    <a href=\"/f?ie=utf-8&amp;kw=%E6%B8%B8%E6%88%8F%E4%B8%AD%E5%BF%83&amp;ie=utf-8\" class=\" j_tbnav_tab_a\" id=\"j_navtab_game\" target=\"_blank\" location=\"tabplay\" stats-data=\"fr=tb0_forum&amp;st_mod=&amp;st_value=tabplay&amp;fname=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8\">游戏</a>\n</li></ul></div><div class=\"p_thread thread_theme_5\" id=\"thread_theme_5\"><div class=\"l_thread_info\"><ul class=\"l_posts_num\">\n\t<li class=\"l_pager pager_theme_4 pb_list_pager\"><span class=\"tP\">1</span>\n<a href=\"/p/9117905169?pn=2\">2</a>\n<a href=\"/p/9117905169?pn=3\">3</a>\n<a href=\"/p/9117905169?pn=4\">4</a>\n<a href=\"/p/9117905169?pn=5\">5</a>\n<a href=\"/p/9117905169?pn=6\">6</a>\n<a href=\"/p/9117905169?pn=7\">7</a>\n<a href=\"/p/9117905169?pn=8\">8</a>\n<a href=\"/p/9117905169?pn=9\">9</a>\n<a href=\"/p/9117905169?pn=10\">10</a>\n<a href=\"/p/9117905169?pn=2\">下一页</a>\n<a href=\"/p/9117905169?pn=13\">尾页</a>\n</li>\n\t<li class=\"l_reply_num\" style=\"margin-left:8px\"><span class=\"red\" style=\"margin-right:3px\">786</span>回复贴，共<span class=\"red\">13</span>页</li>\n\t<li class=\"l_reply_num\">，跳到 <input theme=\"4\" id=\"jumpPage4\" max-page=\"13\" type=\"text\" class=\"jump_input_bright\"> 页&nbsp;<button id=\"pager_go4\" type=\"button\" value=\"确定\" class=\"btn-sub btn-small jump_btn_bright\">确定</button>&nbsp;</li>\n</ul>\n<div id=\"tofrs_up\" class=\"tofrs_up\"><a href=\"/f?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8\" title=\"以太比特\">&lt;返回以太比特吧</a></div></div><div class=\"l_thread_manage\">\n\n\n    <div id=\"d_post_manage\">\n\t\t<a rel=\"noopener\" href=\"#\" class=\"d_post_manage_link\">贴子管理</a>\n\t    <ul id=\"j_quick_thread\" class=\"quick_thread_theme2\">\n\n\t    </ul>\n    </div>\n    <div id=\"notify_bubble\"></div>\n</div>\n<div class=\"loading-tip\" style=\"display:none;\"><span class=\"text\">&gt;0&lt; 加载中...</span></div></div><div class=\"pb_content clearfix\" id=\"pb_content\"><div class=\"left_section\"><div class=\"core_title_wrap_bright clearfix\" id=\"j_core_title_wrap\" style=\"top: 0px;\"><div class=\"core_title_bg j_core_title_bg\"></div>        <h3 class=\"core_title_txt pull-left text-overflow  \" title=\"对于一个父亲来说，这个女儿14岁就死了\" style=\"width: 416px;\">        对于一个父亲来说，这个女儿14岁就死了</h3><span class=\"core_title_btns pull-right\">        <a rel=\"noopener\" id=\"lzonly_cntn\" href=\"/p/9117905169?see_lz=1\" alog-alias=\"lzonly\" class=\"btn-sub btn-small\"><span id=\"lzonly\" class=\"d_lzonly_bdaside\">只看楼主</span></a><a rel=\"noopener\" class=\"btn-sub btn-small j_favor\" data-field=\"{&quot;status&quot;:0,&quot;is_anonym&quot;:false}\">收藏</a><a rel=\"noopener\" href=\"#\" id=\"quick_reply\" class=\"btn-small btn-sub j_quick_reply\"><i class=\"icon-reply\"></i>回复</a>    </span><div id=\"j_favthread\" class=\"p_favthread\"><p class=\"p_favthr_tip\"></p></div>    </div><div class=\"tittle_fill_dom\"></div> <div class=\"p_postlist\" id=\"j_p_postlist\"><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:3424043879,&quot;user_name&quot;:&quot;\\u602a\\u7269\\u5927\\u5b9d\\u8d1d&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.6ae447d1.1kSMO_ldLGD7OUTJ7rd_Bw?t=1712161997&quot;,&quot;user_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_5JQP6NR&quot;},&quot;content&quot;:{&quot;post_id&quot;:150719031818,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;<img class=\\&quot;BDE_Image\\&quot; src=\\&quot;http:\\/\\/tiebapic.baidu.com\\/forum\\/w%3D580\\/sign=38506042de22720e7bcee2f24bca0a3a\\/0a763eeff01f3a291c5210eedf25bc315c607c18.jpg?tbpicau=2024-08-17-05_ff738b4f1cd44821a9ce4ffe7e563a8d\\&quot; size=\\&quot;900943\\&quot; changedsize=\\&quot;true\\&quot; width=\\&quot;560\\&quot; height=\\&quot;4369\\&quot; size=\\&quot;900943\\&quot;>&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:1,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:0,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:0,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150719031818\">                    <div class=\"d_author\">                    <div class=\"louzhubiaoshi_wrap\">\n                    <div class=\"louzhubiaoshi  j_louzhubiaoshi\" author=\"怪物大宝贝\">\n                        <a href=\"/p/9117905169?pid=150719031818&amp;see_lz=1#150719031818\"></a>\n                        </div>\n                </div>            <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u602a\\u7269\\u5927\\u5b9d\\u8d1d&quot;,&quot;id&quot;:&quot;tb.1.6ae447d1.1kSMO_ldLGD7OUTJ7rd_Bw?t=1712161997&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.6ae447d1.1kSMO_ldLGD7OUTJ7rd_Bw?t=1712161997&amp;fr=pb\"><img username=\"怪物大宝贝\" class=\"\" src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.6ae447d1.1kSMO_ldLGD7OUTJ7rd_Bw?t=1712161997\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:3424043879}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u602a\\u7269\\u5927\\u5b9d\\u8d1d&quot;,&quot;id&quot;:&quot;tb.1.6ae447d1.1kSMO_ldLGD7OUTJ7rd_Bw?t=1712161997&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.6ae447d1.1kSMO_ldLGD7OUTJ7rd_Bw?t=1712161997&amp;fr=pb\" target=\"_blank\">章景轩</a>\n\n                </li>\n                            <li class=\"d_icons\">\n                <span class=\"icon_wrap  icon_wrap_theme1 d_pb_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/102_14.png?stamp=1722691615) no-repeat -1000px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"juxie\" data-field=\"{&quot;name&quot;:&quot;juxie&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:102,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u5de8\\u87f9\\u5ea7\\u5370\\u8bb0&quot;,&quot;intro&quot;:&quot;\\u83b7\\u53d6\\u89c4\\u5219\\uff1a\\u5728\\u661f\\u5ea7\\u52cb\\u7ae0\\u9986\\u4e2d\\u83b7\\u5f97\\u3002&quot;,&quot;intro_url&quot;:&quot;https:\\/\\/tieba.baidu.com\\/f?ie=utf-8&amp;amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;amp;fr=search&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,20&quot;}}\" target=\"_blank\" href=\"https://tieba.baidu.com/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search\" class=\"j_icon_slot\" title=\"巨蟹座印记\" locate=\"juxie_1#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span>\n\n            </li>\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon3_1\" title=\"本吧头衔12级，经验值8933，点击进入等级头衔说明页\"><div class=\"d_badge_title \">人气楷模</div><div class=\"d_badge_lv\">12</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main  d_post_content_firstfloor\" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                            <div style=\"word-wrap:break-word;width:100%;\">\n                <div id=\"voteFlashPanel\"></div>\n            </div>\n            <div id=\"my_friends_vote_detail\" style=\"display:none;\"></div><cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150719031818\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    <div class=\"replace_div\" style=\"width: 560px;\"><img class=\"BDE_Image\" src=\"http://tiebapic.baidu.com/forum/w%3D580/sign=38506042de22720e7bcee2f24bca0a3a/0a763eeff01f3a291c5210eedf25bc315c607c18.jpg?tbpicau=2024-08-17-05_ff738b4f1cd44821a9ce4ffe7e563a8d\" size=\"900943\" changedsize=\"true\" width=\"560\" height=\"4369\"><div class=\"replace_tip\" style=\"width: 558px;\"><i class=\"icon-expand\"></i>点击展开，查看完整图片</div></div></div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"share_btn_wrapper\">                        <a href=\"javascript:;\" class=\"post-foot-send-gift-btn j-post-send-gift\" data-gift=\"{&quot;userId&quot;:&quot;3424043879&quot;,&quot;threadId&quot;:&quot;9117905169&quot;,&quot;postId&quot;:&quot;150719031818&quot;,&quot;userName&quot;:&quot;怪物大宝贝&quot;}\">送TA礼物</a>                    <div class=\"share_thread share_thread_wrapper\">\n                        <div id=\"pb_tbshare_container\"><div class=\"tbshare_popup_wrapper\"><div class=\"tbshare_popup_enter\"></div><div class=\"tbshare_popup_main clearfix\" style=\"display: none;\"><div class=\"tbshare_wrapper_theme_coco\"><ul class=\"\"><li><div class=\"tbshare_tieba tbshare_icon\" title=\"百度贴吧\" data-share=\"tieba\"><div class=\"tbshare_title_box\">百度贴吧</div></div></li><li><div class=\"tbshare_weixin tbshare_icon\" title=\"微信\" data-share=\"weixin\"><div class=\"tbshare_title_box\">微信</div></div></li><li><div class=\"tbshare_tsina tbshare_icon\" title=\"新浪微博\" data-share=\"tsina\"><div class=\"tbshare_title_box\">新浪微博</div></div></li><li><div class=\"tbshare_qqzone tbshare_icon\" title=\"QQ空间\" data-share=\"qqzone\"><div class=\"tbshare_title_box\">QQ空间</div></div></li><li><div class=\"tbshare_copy tbshare_icon\" onclick=\"return false;\" title=\"复制链接\" data-share=\"copy\"><div class=\"tbshare_title_box\">复制链接</div></div></li></ul><div class=\"tbshare_qrcode_mask\" style=\"display: none;\"><div class=\"tbshare_qrcode_outer\"><div class=\"tbshare_qrcode_wrapper\"><h6>扫一扫分享到微信</h6><div class=\"tbshare_qrcode_content\" title=\"https://tieba.baidu.com/p/9117905169?\"><canvas width=\"90\" height=\"90\" style=\"display: none;\"></canvas><img alt=\"Scan me!\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABaCAYAAAA4qEECAAAAAXNSR0IArs4c6QAABeJJREFUeF7tneF24joMhOH9H5o9UNJjhDzzyXF37y3qzxJsZzwajeQ0vV4ul9vl5M/t9jrE9XqVIx7Xq+vGMY/r4jxxkjheNsb4HTfe/Vp3LxS6OyINtEBrO9Bkd8f1jAtQ311dKF1Pto4sAmj0qCihazrGGOf8ZvSZQRroPCQk0I6Bmb7G37lNqzLuuA2q29k9kLxwn0flm+oYDbTQ5AY6sE05kY9ktJOiTBZmtiqTJJUMMyunNmGcl0jkLDCy774lQwcMWYDzr9kCiRdvoEPBMrOBEWC1IQ7UWSS4IsMlamLvVsi4ldEZU6l/VVVd5ksb6IB2A/0FyI8XLLQXoFhLNN1JhooAtUZaAbtobqANE7YDXWWesk6uglOVIXE1YwVX7XVU1+YSH8Vta/eOAJh51RX/SjakCqpbBwU1lZGdbdIGer4V11vVWC5uq9O61aZ9VTqU5GWfLd7u29ca6Mkpym7+SaCrzRmim44hqiJ0pb1q17oeR7SXFGg8rpKOBtrRIj9TTMlyAE1tzI7TFNVAp831agmuoq1asLiOYQMd9JjIAwXVJvtmtJaH7UDvCJ+sX0HbnV4N38/zaH/DVZKuTxE/J5EQ14bsHd3VBvp1S9LDWcKokRmUBTQJkWTs7F1MkM56VV1Vds/4/qoleNV14IWYx8jiJpM+dwOdHH39ekbHgsXalIR51YNVx7SYSKi3pkmKyuQs2a7M85YMG+h5QlNFkts8dMJCGDjuvttx1U5VC3ZW0c1LImW1X2IJeiTD1SQ3ApMBqNwJdRG03G6gA9ofzeiq/uzwoCP+1ZA9IzGV7zrZJG7pIVnRR5Pwc9mYTv7RQKubzz7LNFpVUC47H5+75KKuo7mC5o943QqR5Ck46Rs30Iw6W46yVjdE2TVn5YjOumYYibwdkfWQ2h1HWQ3065FWhkcDHWit2gm01kBAUztDw54mDmXvVNKizkVJjZKYrKiisvbyXdVUyry1yuirhch9no8DmuXQXJOoXSIsd0wiBdNKTUDkwa0ts57oKMuF7uriiHMYiyPXG6lGxapnb6CfBwrVgqVq4ZaAVt07clyUMa668EyjXYVKosjJIBnDyQ/NS7If3UDnjzhk1bCTtfKD6KQ4ccnOsWSMEtdfUS0AGuIKOFpdNtBPFKlux+sa6ESAYyT9pxgdn71zVU81gTgZiUWRSi5n1qasXDUXuWZUeg8NtH5vktNeWj3LExbKxmyyyCDHxhmzR+tXzfZuziyxVxO1m+MbB3WU1UDnTtzVCRlu3yX4alZ2LKuWuVRLCRudY1BWlUoCXW8Dbd5tR52L29QG+m8DnYUASXJZn8KxgMiUYwhJWqpqnCVZ1x+Jn5P+/KPSrTb+iSY10F8ojWRBTaUz7CG9kbioyBpqoUg/Wh0YZGymzsth1EAnLxV0kuMqw3TDSD/a7dZMtzL9Hq9dqbpILqG6qXKQmucU0Gd842qoZ6CTs0CXyGi4E8BoceJIg0pwqpHUpagb/PVAKzCddKj2pHIpmRaqis9ZvrjRO9jo7p1I2SPZ79DoBtq/5aCBnrxcliRK505edDsymoZnprNUe6k8rCZZcjjhHNGZ+0P2roGmEH9dRzqAD43e+fIq6l8Jo10SUkdeyqpWLWXKTvDn1NGCNtALL6+iPj3V6FrAvF5N+xnKCpH5qZ+vrueMzaR5qfwADR34TPEyA72BDg8XZjrorNDHMNolnwiEqrpoRaY2hLofuu7qsxvUItLEi/7o3mXeuKgG+v1/hW199Tw5onp4yqc9qrLGSRKRnx0StrKOBrq6O+F6LF2qBKcOgxwhKQvlpEmt4wxO1A+rOf4p0PTms2Y5Xbjy5NQGEgDpGaPNSz/B6Ab6/V9EbtVoJQGUZaQPcp+HMN+yTPQsqut1SbaBnoRfA/0E5n/PaKqvLixVslp1EW5O4iJoAiZjjRLmrv+RytDp1UcDTZlMQHKWyO1+nIO2PWPFSSNAsXxljCyat7ZJqbdtoBdprZpKx5AZa+h0v4HRfwBmEV83VHfNTAAAAABJRU5ErkJggg==\" style=\"display: block;\"></div><div class=\"tbshare_qrcode_instruction\"><p>打开微信，点击底部的“发现”，<br>使用“扫一扫”即可将网页分享至朋友圈。</p></div><div class=\"tbshare_qrcode_close\">×</div></div></div><div class=\"tbshare_qrcode_triangle\"></div></div></div></div></div></div>\n                    </div></div><div class=\"post-foot-send-gift-container\">    </div><div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:广东</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">1楼</span><span class=\"tail-info\">2024-08-05 16:56</span><a rel=\"noopener\" href=\"#\" class=\"p_reply p_reply_first\">回复</a></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper\" style=\"min-height: 0px; display: none;\" data-field=\"{&quot;pid&quot;:150719031818,&quot;floor_num&quot;:1,&quot;total_num&quot;:0}\"><div class=\"core_reply_border_top\"></div><div class=\"j_lzl_c_b_a core_reply_content\"><ul class=\"j_lzl_m_w\" style=\"display:none\"><li class=\"lzl_li_pager j_lzl_l_p lzl_li_pager_s\" data-field=\"{total_num:0,total_page:0}\"><a rel=\"noopener\" class=\"j_lzl_p btn-sub btn-small pull-right\" href=\"##\"><i class=\"icon-reply\"></i>我也说一句</a><p>&nbsp;</p></li></ul><div class=\"lzl_editor_container j_lzl_e_c lzl_editor_container_s\" style=\"display:none;\"></div><input type=\"text\" class=\"j_lzl_e_f_h\" style=\"display:none;\"></div><div class=\"core_reply_border_bottom\"></div></div></div></div></div><script>window.radar && window.radar.mark('fs');</script><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:85535194,&quot;user_name&quot;:&quot;jkl028&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.e6799915.LKjPxJqJYl63wghcm6hl4w?t=1720599810&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150719088158,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u672c\\u6765\\u89c9\\u5f97\\u5c31\\u51ed14\\u5c81\\u7684\\u8fd9\\u70b9\\u53db\\u9006\\u7236\\u4eb2\\u4e0d\\u518d\\u7406\\u5979\\u89c9\\u5f97\\u8fd9\\u4e2a\\u8fd9\\u4e2a\\u7236\\u4eb2\\u662f\\u6709\\u70b9\\u95ee\\u9898\\u7684\\uff0c\\u540e\\u6765\\u770b\\u5230\\u6bcd\\u4eb2\\u4e5f\\u4e0d\\u7406\\u4e86\\uff0c\\u6211\\u5c31\\u77e5\\u9053\\u8fd9\\u5973\\u7684\\u80af\\u5b9a\\u9690\\u85cf\\u4e86\\u5f88\\u591a\\u81ea\\u5df1\\u5e72\\u5f97\\u5783\\u573e\\u4e8b\\u6ca1\\u8bf4\\uff0c\\u5979\\u6d3b\\u8be5<br><img class=\\&quot;BDE_Image\\&quot; src=\\&quot;http:\\/\\/tiebapic.baidu.com\\/forum\\/w%3D580\\/sign=d271cb1828061d957d4637304bf40a5d\\/f02be137acaf2eddd8bcfbc9cb1001e939019361.jpg?tbpicau=2024-08-17-05_dede8bceb74cf4b59a3c1b829ee17f4b\\&quot; size=\\&quot;148855\\&quot; changedsize=\\&quot;true\\&quot; width=\\&quot;560\\&quot; height=\\&quot;818\\&quot; size=\\&quot;148855\\&quot;>&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:2,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:123,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:1,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150719088158\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;jkl028&quot;,&quot;id&quot;:&quot;tb.1.e6799915.LKjPxJqJYl63wghcm6hl4w?t=1720599810&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.e6799915.LKjPxJqJYl63wghcm6hl4w?t=1720599810&amp;fr=pb\"><img username=\"jkl028\" class=\"\" src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.e6799915.LKjPxJqJYl63wghcm6hl4w?t=1720599810\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:85535194}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;jkl028&quot;,&quot;id&quot;:&quot;tb.1.e6799915.LKjPxJqJYl63wghcm6hl4w?t=1720599810&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.e6799915.LKjPxJqJYl63wghcm6hl4w?t=1720599810&amp;fr=pb\" target=\"_blank\">杜草莓</a>\n\n                </li>\n                            <li class=\"d_icons\">\n                <span class=\"icon_wrap  icon_wrap_theme1 d_pb_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/107_14.png?stamp=1722691615) no-repeat -5450px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"shoucihuitie\" data-field=\"{&quot;name&quot;:&quot;shoucihuitie&quot;,&quot;end_time&quot;:&quot;1725783571&quot;,&quot;category_id&quot;:107,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u9996\\u6b21\\u56de\\u8d34&quot;,&quot;intro&quot;:&quot;\\u9996\\u6b21\\u56de\\u8d34&quot;,&quot;intro_url&quot;:&quot;https:\\/\\/tieba.baidu.com\\/wxf\\/324179?kw=%E5%8D%B0%E8%AE%B0&amp;amp;fr=frsshare&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,109&quot;}}\" target=\"_blank\" href=\"https://tieba.baidu.com/wxf/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare\" class=\"j_icon_slot\" title=\"首次回贴\" locate=\"shoucihuitie_1#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span>\n\n            </li>\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon2_1\" title=\"本吧头衔7级，经验值232，点击进入等级头衔说明页\"><div class=\"d_badge_title \">核心吧友</div><div class=\"d_badge_lv\">7</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150719088158\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    本来觉得就凭14岁的这点叛逆父亲不再理她觉得这个这个父亲是有点问题的，后来看到母亲也不理了，我就知道这女的肯定隐藏了很多自己干得垃圾事没说，她活该<br><img class=\"BDE_Image\" src=\"http://tiebapic.baidu.com/forum/w%3D580/sign=d271cb1828061d957d4637304bf40a5d/f02be137acaf2eddd8bcfbc9cb1001e939019361.jpg?tbpicau=2024-08-17-05_dede8bceb74cf4b59a3c1b829ee17f4b\" size=\"148855\" changedsize=\"true\" width=\"560\" height=\"818\"></div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <a rel=\"noopener\" class=\"l_post_anchor\" name=\"150719088158l\"></a><div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:广东</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">2楼</span><span class=\"tail-info\">2024-08-05 17:07</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150719088158,&quot;total_num&quot;:123}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(123)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper\" style=\"min-height: 0px;\" data-field=\"{&quot;pid&quot;:150719088158,&quot;floor_num&quot;:2,&quot;total_num&quot;:123}\"><div class=\"core_reply_border_top\"></div><div class=\"j_lzl_c_b_a core_reply_content\"><ul class=\"j_lzl_m_w\" style=\"display:\"><li class=\"lzl_single_post j_lzl_s_p first_no_border\" data-field=\"{'pid':'150719088158','spid':'150721163086','user_name':'保护色度','portrait':'tb.1.50fbb2e5.GDjkCVIqNasbD1qp4d5oQg','showname':'铭寒◆','user_nickname':'铭寒◆'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'保护色度', 'id':'tb.1.50fbb2e5.GDjkCVIqNasbD1qp4d5oQg'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.50fbb2e5.GDjkCVIqNasbD1qp4d5oQg&amp;ie=utf-8&amp;fr=pb\" username=\"保护色度\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.50fbb2e5.GDjkCVIqNasbD1qp4d5oQg\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'保护色度', 'id':'tb.1.50fbb2e5.GDjkCVIqNasbD1qp4d5oQg'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.50fbb2e5.GDjkCVIqNasbD1qp4d5oQg&amp;ie=utf-8&amp;fr=pb\" username=\"保护色度\">铭寒<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/1-5.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">号废了重练一个而已，只是她妈后来才明白这一点</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-5&nbsp;23:48</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150719088158','spid':'150721875129','user_name':'youxi卡米糯','portrait':'tb.1.87ba399a.nTYu6dDgK8fCctV2WCuapw','showname':'youxi卡米糯','user_nickname':'youxi卡米糯'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'youxi卡米糯', 'id':'tb.1.87ba399a.nTYu6dDgK8fCctV2WCuapw'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.87ba399a.nTYu6dDgK8fCctV2WCuapw&amp;ie=utf-8&amp;fr=pb\" username=\"youxi卡米糯\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.87ba399a.nTYu6dDgK8fCctV2WCuapw\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'youxi卡米糯', 'id':'tb.1.87ba399a.nTYu6dDgK8fCctV2WCuapw'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.87ba399a.nTYu6dDgK8fCctV2WCuapw&amp;ie=utf-8&amp;fr=pb\" username=\"youxi卡米糯\">youxi卡米糯</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">小错一般都能包容，能这样多半是原则上大是大非</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;03:25</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150719088158','spid':'150721972247','user_name':'sky666sss666','portrait':'tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ','showname':'你的隔壁王哥🍺','user_nickname':'你的隔壁王哥🍺'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'sky666sss666', 'id':'tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ&amp;ie=utf-8&amp;fr=pb\" username=\"sky666sss666\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'sky666sss666', 'id':'tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ&amp;ie=utf-8&amp;fr=pb\" username=\"sky666sss666\">你的隔壁王哥<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/2-10.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">十四岁能把人逼到没有一点犹豫的跳楼，有多大的学习压力想过没？这种家庭内为了子女成才会不记一切代价，甚至是以折磨的方式，而之后的一切变故都是由于这次跳楼父亲不闻不问的态度，换作是你心灰意泠后只会做的比他更过分，亲情破裂会让最后一丝克制也一同丧失。</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;04:41</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150719088158','spid':'150721980258','user_name':'给你磕头辣咚咚','portrait':'tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg','showname':'快拉黑尔父','user_nickname':'贴吧用户_5bybbZ2'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'给你磕头辣咚咚', 'id':'tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg&amp;ie=utf-8&amp;fr=pb\" username=\"给你磕头辣咚咚\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg\"></a><div class=\"lzl_cnt\"><div class=\"pre_icon_wrap pre_icon_wrap_theme1\"><a class=\"icon_tbworld icon-crown-year-v5\" href=\"/tbmall/tshow\" target=\"_blank\" title=\"贴吧超级会员\"></a></div><a class=\"at j_user_card  vip_red \" data-field=\"{'un':'给你磕头辣咚咚', 'id':'tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg&amp;ie=utf-8&amp;fr=pb\" username=\"给你磕头辣咚咚\">快拉黑尔父</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">回复 <a href=\"\" onclick=\"Stats.sendRequest('fr=tb0_forum&amp;st_mod=pb&amp;st_value=atlink');\" onmouseover=\"showattip(this)\" onmouseout=\"hideattip(this)\" username=\" \" portrait=\"tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ\" target=\"_blank\" class=\"at\">你的隔壁王哥<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/2-10.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a> :闷油瓶的话还能理解一下，小太妹为了得到什么说跳就跳我是一点也不怀疑也不同情的。你现在同情小心以后糟老罪咯。真要对她不好也不至于长大了好多事想明白了反而一直想修复关系。</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;04:48</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150719088158','spid':'150721995873','user_name':'sky666sss666','portrait':'tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ','showname':'你的隔壁王哥🍺','user_nickname':'你的隔壁王哥🍺'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'sky666sss666', 'id':'tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ&amp;ie=utf-8&amp;fr=pb\" username=\"sky666sss666\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'sky666sss666', 'id':'tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ&amp;ie=utf-8&amp;fr=pb\" username=\"sky666sss666\">你的隔壁王哥<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/2-10.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">回复 <a href=\"\" onclick=\"Stats.sendRequest('fr=tb0_forum&amp;st_mod=pb&amp;st_value=atlink');\" onmouseover=\"showattip(this)\" onmouseout=\"hideattip(this)\" username=\" \" portrait=\"tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg\" target=\"_blank\" class=\"at\">快拉黑尔父</a> :十四岁第一次逃学，还在担心父母会不会打他，说明在此之前完全就是个乖乖女。初三才逃第一次学，如果是太妹初二就已经插着翅膀到处飞了，而且跳楼母亲没有任何心里准备，就说明在以往的形象里是不可能做出这事，说明从一开始就只是正常女学生。</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;05:04</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><ul class=\"lzl_post_hidden\" id=\"lzl_hidden_1\"><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150719088158','spid':'150721998564','user_name':'给你磕头辣咚咚','portrait':'tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg','showname':'快拉黑尔父','user_nickname':'贴吧用户_5bybbZ2'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'给你磕头辣咚咚', 'id':'tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg&amp;ie=utf-8&amp;fr=pb\" username=\"给你磕头辣咚咚\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg\"></a><div class=\"lzl_cnt\"><div class=\"pre_icon_wrap pre_icon_wrap_theme1\"><a class=\"icon_tbworld icon-crown-year-v5\" href=\"/tbmall/tshow\" target=\"_blank\" title=\"贴吧超级会员\"></a></div><a class=\"at j_user_card  vip_red \" data-field=\"{'un':'给你磕头辣咚咚', 'id':'tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg&amp;ie=utf-8&amp;fr=pb\" username=\"给你磕头辣咚咚\">快拉黑尔父</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">回复 <a href=\"\" onclick=\"Stats.sendRequest('fr=tb0_forum&amp;st_mod=pb&amp;st_value=atlink');\" onmouseover=\"showattip(this)\" onmouseout=\"hideattip(this)\" username=\" \" portrait=\"tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ\" target=\"_blank\" class=\"at\">你的隔壁王哥<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/2-10.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a> :人变成太妹，性格一完全变成了很难理解吗？初中时代常有的事</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;05:06</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150719088158','spid':'150722000360','user_name':'sky666sss666','portrait':'tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ','showname':'你的隔壁王哥🍺','user_nickname':'你的隔壁王哥🍺'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'sky666sss666', 'id':'tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ&amp;ie=utf-8&amp;fr=pb\" username=\"sky666sss666\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'sky666sss666', 'id':'tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ&amp;ie=utf-8&amp;fr=pb\" username=\"sky666sss666\">你的隔壁王哥<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/2-10.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">回复 <a href=\"\" onclick=\"Stats.sendRequest('fr=tb0_forum&amp;st_mod=pb&amp;st_value=atlink');\" onmouseover=\"showattip(this)\" onmouseout=\"hideattip(this)\" username=\" \" portrait=\"tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg\" target=\"_blank\" class=\"at\">快拉黑尔父</a> :如果说是太妹，那么跳楼之前必然会有各种前车之鉴，换句话说为了得到某样需求常用跳楼作为威胁。这种头也不回没有任何犹豫的跳楼，显然不是为了得到什么，就是单纯的寻死，你觉得太妹会这么纯粹的寻死吗？太妹的心理承受能力可高多了，只有未经世事的小白心里破防了才会这么干脆。</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;05:08</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150719088158','spid':'150722002024','user_name':'给你磕头辣咚咚','portrait':'tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg','showname':'快拉黑尔父','user_nickname':'贴吧用户_5bybbZ2'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'给你磕头辣咚咚', 'id':'tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg&amp;ie=utf-8&amp;fr=pb\" username=\"给你磕头辣咚咚\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg\"></a><div class=\"lzl_cnt\"><div class=\"pre_icon_wrap pre_icon_wrap_theme1\"><a class=\"icon_tbworld icon-crown-year-v5\" href=\"/tbmall/tshow\" target=\"_blank\" title=\"贴吧超级会员\"></a></div><a class=\"at j_user_card  vip_red \" data-field=\"{'un':'给你磕头辣咚咚', 'id':'tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg&amp;ie=utf-8&amp;fr=pb\" username=\"给你磕头辣咚咚\">快拉黑尔父</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">回复 <a href=\"\" onclick=\"Stats.sendRequest('fr=tb0_forum&amp;st_mod=pb&amp;st_value=atlink');\" onmouseover=\"showattip(this)\" onmouseout=\"hideattip(this)\" username=\" \" portrait=\"tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ\" target=\"_blank\" class=\"at\">你的隔壁王哥<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/2-10.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a> :完全的一面之词，结果可以看到的是什么？14岁钱的好父亲当她死了。对她一直很好的母亲也断了联系。想修复关系的反而是她。告诉你一个众所周知的事，人发言，一定，一定会下意识的美化自己。这是下意识。然后你再看看这个故事。</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;05:10</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150719088158','spid':'150722003466','user_name':'给你磕头辣咚咚','portrait':'tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg','showname':'快拉黑尔父','user_nickname':'贴吧用户_5bybbZ2'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'给你磕头辣咚咚', 'id':'tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg&amp;ie=utf-8&amp;fr=pb\" username=\"给你磕头辣咚咚\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg\"></a><div class=\"lzl_cnt\"><div class=\"pre_icon_wrap pre_icon_wrap_theme1\"><a class=\"icon_tbworld icon-crown-year-v5\" href=\"/tbmall/tshow\" target=\"_blank\" title=\"贴吧超级会员\"></a></div><a class=\"at j_user_card  vip_red \" data-field=\"{'un':'给你磕头辣咚咚', 'id':'tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg&amp;ie=utf-8&amp;fr=pb\" username=\"给你磕头辣咚咚\">快拉黑尔父</a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">回复 <a href=\"\" onclick=\"Stats.sendRequest('fr=tb0_forum&amp;st_mod=pb&amp;st_value=atlink');\" onmouseover=\"showattip(this)\" onmouseout=\"hideattip(this)\" username=\" \" portrait=\"tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ\" target=\"_blank\" class=\"at\">你的隔壁王哥<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/2-10.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a> :而你所说的这个想索求什么，全包含在了一句叛逆期懂得都懂这一句话里面隐藏了。这就是她下意识的掩盖的事了。</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;05:11</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li><li class=\"lzl_single_post j_lzl_s_p \" data-field=\"{'pid':'150719088158','spid':'150722005338','user_name':'sky666sss666','portrait':'tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ','showname':'你的隔壁王哥🍺','user_nickname':'你的隔壁王哥🍺'}\" data-lzl-author=\"0\"><a data-field=\"{'un':'sky666sss666', 'id':'tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ'}\" target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ&amp;ie=utf-8&amp;fr=pb\" username=\"sky666sss666\"><img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ\"></a><div class=\"lzl_cnt\"><a class=\"at j_user_card \" data-field=\"{'un':'sky666sss666', 'id':'tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ'}\" alog-group=\"p_author\" target=\"_blank\" href=\"/home/main?id=tb.1.19826a6a.7dWQaffOux5YCZreboaTHQ&amp;ie=utf-8&amp;fr=pb\" username=\"sky666sss666\">你的隔壁王哥<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/2-10.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a>:&nbsp;<span class=\"lzl_content_main\" data-username=\"undefined\">回复 <a href=\"\" onclick=\"Stats.sendRequest('fr=tb0_forum&amp;st_mod=pb&amp;st_value=atlink');\" onmouseover=\"showattip(this)\" onmouseout=\"hideattip(this)\" username=\" \" portrait=\"tb.1.c42e64ac.OhZlpd4_OUeFpAX3DydSHg\" target=\"_blank\" class=\"at\">快拉黑尔父</a> :你要分析心理啊，纯粹的寻死只会在心里破防的时候才会存在，你如果接触过混社会的太妹，你就会发现他们会以寻求刺激为炫耀的资本，在这种群体内心理承受能力高的离谱。要想让一个学生心里破防，只能让她的天塌了，脆弱的心里才会在极短时间内崩溃，只有长期压抑才会产生这种心理。</span><div class=\"lzl_content_reply\"><span class=\"lzl_jb\" style=\"display:none\"><a href=\"###\" class=\"lzl_jb_in\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </a></span><span class=\"lzl_op_list j_lzl_o_l\"></span><span class=\"lzl_time\">2024-8-6&nbsp;05:13</span><a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a></div></div></li></ul><li class=\"lzl_li_pager j_lzl_l_p lzl_li_pager_s\" data-field=\"{total_num:123,total_page:13}\"><a rel=\"noopener\" class=\"j_lzl_p btn-sub btn-small pull-right\" href=\"##\"><i class=\"icon-reply\"></i>我也说一句</a><p class=\"lzl_more\"><span>还有118条回复，</span><a rel=\"noopener\" href=\"#\" class=\"j_lzl_m\" lzlid=\"lzl_hidden_1\">点击查看</a></p><p class=\"j_pager l_pager pager_theme_2 lzl_pager\" style=\"display:none\"><span class=\"tP\">1</span><a href=\"#\" index=\"2\">2</a><a href=\"#\" index=\"3\">3</a><a href=\"#\" index=\"4\">4</a><a href=\"#\" index=\"5\">5</a><a href=\"#\" index=\"6\">6</a><a href=\"#\" index=\"7\">7</a><a href=\"#\" index=\"8\">8</a><a href=\"#\" index=\"9\">9</a><a href=\"#\" index=\"10\">10</a><a href=\"#\" index=\"2\">下一页</a><a href=\"#\" index=\"13\">尾页</a></p></li></ul><div class=\"lzl_editor_container j_lzl_e_c lzl_editor_container_s\" style=\"display:none;\"></div><input type=\"text\" class=\"j_lzl_e_f_h\" style=\"display:none;\"></div><div class=\"core_reply_border_bottom\"></div></div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix\" data-field=\"{}\" data-index=\"3\">        <style>        ._1eqtk61{border-bottom:0 solid #f5f5f5}._8x9ty64{border-bottom:1px solid #eee;margin:0;padding:0;position:relative}._8x9ty64 h3{font-weight:400;padding:0}._8x9ty64 a{text-decoration:none}._8x9ty64 em{color:#3066b4;font-style:normal}._8x9ty64:last-child{border-bottom:0}._1n8n23c{margin:0}.b47yy3h{padding-top:0}._8x9ty64{background-color:#fafbfc;border-left:1px solid #e5e5e5;font-family:PingFangSC-Medium,Helvetica Neue,Helvetica,Arial,sans-serif}._8x9ty64,._8x9ty64:last-child{border-bottom:1px solid #e5e5e5}.ghmaff1{margin-bottom:15px}._2cj3g78{margin-bottom:10px}.edshq5u{margin-top:15px}._4skftda,.pe5wcz2{margin-top:10px}.ugaqg4d{align-items:center;display:flex;height:100%}.km5nyww{margin-bottom:15px}._9s8xgss{margin-top:15px}.ghmaff1+.pe5wcz2{margin-top:-5px}.bh9veya{float:right;width:74px}.tumcbnr{float:left;margin-top:19px;width:130px}.fjyf1br{background-color:#fff;margin-left:130px;padding:25px 0 8px 20px}.fjyf1br:hover{background-color:transparent}body a.hdyqnku,body div.hdyqnku{color:#000;display:block;font-family:Arial,Helvetica,sans-serif;font-size:20px;font-weight:400;line-height:30px;margin:0;padding-top:0;text-decoration:none;transform:translateY(.25em)}body a.hdyqnku:before,body div.hdyqnku:before{content:\"\";display:block;height:0;margin-top:-10px}a.hdyqnku div{word-break:break-all}.v3zrcrj{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.q1dpns8{-webkit-line-clamp:2}.ndfxdqz,.q1dpns8{word-wrap:break-word;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden;word-break:break-all}.ndfxdqz{-webkit-line-clamp:3}._7qtpw9j{-webkit-line-clamp:4}._2dt35k2,._7qtpw9j{word-wrap:break-word;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden;word-break:break-all}._2dt35k2{-webkit-line-clamp:5}._1r3uysh{-webkit-line-clamp:10}._1r3uysh,.yux2cc6{word-wrap:break-word;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden;word-break:break-all}.yux2cc6{-webkit-line-clamp:12}._4bxpxs9{-webkit-line-clamp:18;word-wrap:break-word;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden;word-break:break-all}body ._9cy84ta{color:#999;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:22px;padding-top:0;position:relative;transform:translateY(.4666666667em)}body ._9cy84ta:before{content:\"\";display:block;height:0;margin-top:-10px}body ._9cy84ta a{color:#999;display:block}body ._9cy84ta a .j4rc4ke{color:#999}body ._9cy84ta button{background:#fff;border:1px solid;border-radius:3px;bottom:0;color:#38f;float:right;font-size:12px;line-height:12px;padding:7px 13px;position:absolute;right:0}body ._9cy84ta ._3cyr2tj{margin-left:5px}body ._9cy84ta .wwhy5qm{border:1px solid #eee;border-radius:50%;display:inline-block;height:22px;line-height:0;margin-right:7px;margin-top:-2px;vertical-align:middle;width:22px}body ._9cy84ta .q76dsk8{margin-right:8px}.tbmu64u{position:absolute;right:0}._5kn8sv5{-webkit-box-orient:horizontal;-webkit-box-align:stretch;-webkit-align-content:flex-start;-webkit-align-items:stretch;display:-webkit-flex;-webkit-flex-wrap:nowrap;-webkit-justify-content:space-between;width:auto}.z8bq2t7{flex:1}body ._9cy84ta a.mk8dv2x,body ._9cy84ta div.mk8dv2x{display:flex;justify-content:space-between}body ._9cy84ta{font-family:PingFangSC-Medium,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:1;margin-right:13px;text-align:right;transform:none}.qqvbase,body ._9cy84ta .shjuuby{display:inline-block}.qqvbase{margin-left:12px;margin-right:2px;vertical-align:middle;width:64px}._6kd2k9z{display:inline-block}._9fe13qw{background:#f5f5f5;border-radius:4px;color:#3066b4;font-size:14px;height:28px;line-height:28px;overflow:hidden;padding:0 8px;text-overflow:ellipsis;white-space:nowrap}._2jze4xh{display:inline-block;width:100%}._9zhq8sa{display:block}._9fe13qw i,._9fe13qw img{margin-right:5px}._9fe13qw img{display:block;float:left;height:16px;margin-top:6px;width:16px}.e5xahd5 i{margin-right:5px}.c91q684{color:#33cc75}.e8eykyd{color:#00c8c8}._9fe13qw{background-color:#fff;border:1px solid #3066b4;border-radius:2px;font-family:PingFangSC-Regular,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:12px;height:26px;line-height:26px;padding:0;text-align:center}._94sn3jw{margin-left:4px}._47q9e4t{margin-left:0}body ._7dx78mp{font-size:14px;line-height:24px;padding-top:0;transform:translateY(.3571428571em)}body ._7dx78mp:before{content:\"\";display:block;height:0;margin-top:-10px}body ._7dx78mp a,body ._7dx78mp div{color:#3066b4}body ._7dx78mp ._1d7gc64{color:#999;font-size:15px;line-height:25px}body ._7dx78mp .erq8uj7{margin-right:5px}body ._7dx78mp{padding-right:20px}body ._7dx78mp .uq8p2c4{max-height:75px}._7kjxh8t{padding-bottom:100%}.xtq5v37{padding-bottom:133.33333333%}.uwucu2h{padding-bottom:33.3333333333%}._3zt36qa{padding-bottom:56.25%}.y7m392e{padding-bottom:50%}.ajthcgk{padding-bottom:75%}.pvkf2b2{padding-bottom:66.66666667%}.d94ksm9{padding-bottom:40%}._5dc27n3{background-position:50%;background-repeat:no-repeat;background-size:cover}._3zt36qa,._7kjxh8t,.ajthcgk,.d94ksm9,.pvkf2b2,.uwucu2h,.xtq5v37,.y7m392e{height:0;overflow:hidden}._3zt36qa img,._7kjxh8t img,.ajthcgk img,.d94ksm9 img,.pvkf2b2 img,.uwucu2h img,.xtq5v37 img,.y7m392e img{width:100%}.s6zxc2c{border-radius:9px}.r1n7ehc{border-top-left-radius:0}.ruyfyqy{border-top-right-radius:0}.x17vnj2{border-bottom-right-radius:0}._5k9skk2{border-bottom-left-radius:0}.dz8whjw{color:#333;font-size:14px;line-height:24px;margin-top:2px}._32jnwrs{color:#f60;font-size:14px;line-height:22px;margin:5px 0;vertical-align:middle}.na9zhar{position:relative}.nb41sx9{background:radial-gradient(transparent 50%,rgba(0,0,0,.05) 100%);height:100%;left:0;position:absolute;top:0;transform:translateZ(0);width:100%}.s6zxc2c .nb41sx9{border-radius:9px}.r1n7ehc .nb41sx9{border-top-left-radius:0}.ruyfyqy .nb41sx9{border-top-right-radius:0}.x17vnj2 .nb41sx9{border-bottom-right-radius:0}._5k9skk2 .nb41sx9{border-bottom-left-radius:0}.na9zhar img{border:none}body .zz8sa9f{display:flex;font-size:0;overflow:hidden}body .bhz4zux{margin-right:8px;max-width:35px;min-width:35px;vertical-align:top}body ._2md9tzv{background:url(//nv00.cdn.bcebos.com/nv01/static/ecom/img/pc/head-img-535c333798.png) no-repeat 50%;background-size:100% 100%;height:100%;width:100%}body .tnf86n6{height:35px;min-width:0}body .ruezuqm{color:#000;font-size:16px;font-weight:inherit;margin-bottom:8px;text-overflow:ellipsis;white-space:nowrap}body ._2gtkx1q{color:#999;font-size:12px;line-height:1}body .zz8sa9f .br54c5r img{width:100%}body .zz8sa9f{display:block}body .bhz4zux{border:1px solid #ccc;height:80px;margin:0 17px;max-width:80px;min-width:80px;padding:3px;width:80px}body .tnf86n6{display:block;height:auto}body .ruezuqm{color:#2d64b3;font-size:12px;height:12px;line-height:1;margin-top:24px;overflow:hidden;text-align:center;word-break:break-all}</style><div>        <div><div class=\"_1eqtk61\"><div><div class=\"_8x9ty64 fc-000000003236df83-2327 _8x9ty64\" data-cegduid=\"\" data-lp=\"http%3A%2F%2Fxsxh.haohuyue.com%2Fxxs%2Fxsx%2Fhtml%2Fzhxs.html\" data-change-wise-baozhang-text=\"true\" data-rank=\"0\" data-nvk=\"Tv-b5H6YnWfdPWbvnsKWUHYkPWcv0ZF9Uh_qnfKzug7Y5HDLnWc4Pjc3PjnkP1f0pg0qn1msPjTYPHn4rfKLpy4hU1Y3nHT1PHD4PW61P1D\" data-extra=\"\" data-ecimtimesign=\"73\" data-srcid=\"2327\" data-placeid=\"2327\" data-cmatchid=\"1626\" data-general-xst=\"\" data-appinfo=\"0_429732241_1_0\" data-tradeid=\"\" data-show-card-top=\"0\" data-bidword=\"\" data-ecr-async-infos=\"\"><div><div><div class=\"tumcbnr tumcbnr\"><div><a class=\"zz8sa9f\" href=\"http://www.baidu.com/baidu.php?url=a00000KEJeCxDFezE9zWs0cAy48SKaP28i3rtS_b1Qk61FXZFQcfMQUN06D1KVJFwO3d3zasDDuMJQjmC2l016i4eEeCr_vZVXtzAMtixbONugRUmSLlN4wR1bCutTNub_5yi7Be5d-L7aFIDojxT41LTgGVJoMRuSmYdXb3VvmXuyX37YBUhYMWARKRJjGxWb6-u8-wUZEmz3whdEYfBoN4WFcm.7R_iIDxwN4Nn8JspnaRfIZwZKYwqD7NjHw63p8B5hGyAp7WFg8o3J0.U1Yk0ZDqYVHnJeZc1P60IjLcOTh1Eoad3sKGUHYkPWcv0ZNG5fKspyfqP0KWpyfqrHn0mhbqn10k0AuY5H00TA6qn0KET1Ys0AFL5H00UMfqn0K1XWY0ThIYmyTqn0K8IM0qna3snj0snj0sn0K-ThTqn0KYTh7buHYs0AFbpyfqnjK7PHD3n1F7f1uDfRDswjDswH7jnjm4rRndwHmvP100uAPWujY0mgPxpywW5gK1Qy4J0AqW5HD0u1dLTv41IZc0UL0k5H00TZ0Y5H00TMfqPWTY0Z7spyfqn0Kkmv-b5H00mycqn7ts0ZKs5H00Ugws5H00uAwETjYs0ZFJ5H00IZN15Hb3Pj6sPjn1rHczrHf1rjb1njm0mynqnfKsUWYs0ZK9I7qhUA7M5H00TyILujYs0AN1IjYs0ANYpyfqQHD0mgPsmvnqn0KdTA-8mvnqn0KhmLNY5H00mywhUA7M5HD0IvuzUvYq0AFY5HD0ThNkIjYkP1czrHfzrjf1nHTY0ZPGujYsnj0snj0snjnzn1ubuW610AqY5HD0ULFsIjYzc10Wn1RWnH0snan1PjDzrjTdPjD3c1bdnj0WrHRsna3sc1nWnH0snanscYwANansQW01rHRdninkQW0snj0snankc10Wna3snj0snj0Wnan3PjDYnHb3Pjcvc10Wnank0ZFYmy-b5fKopHYs0AdY5HcYnHKxnW0dnfKVm1Ysg1csPHD0UyPxuMFEUHYsg100uA78IyF-gLK_my4GuZnqn7ts0A7bTgbqz5LwktB-z5LF_tofd5gjVnB-0A7bTgfqn0KGTvP_5H00TydY5H00mywxTvqdThP-5H0WpAqYgLIEThfW0APzm1YLPHnz&amp;us=newvui&amp;ai=0_429732241_1_0&amp;word=&amp;ck=0.0.0.0.0.0.0.0&amp;shh=tieba.baidu.com\" target=\"_blank\"><div class=\"bhz4zux\"> <div class=\"_2md9tzv\"></div></div><div class=\"tnf86n6\"><div class=\"ruezuqm\">北京豪湖月国际旅行社</div></div></a></div></div><div class=\"fjyf1br fjyf1br\"><div style=\"margin-bottom: 12px;\"><div class=\"_7dx78mp\"><a href=\"http://www.baidu.com/baidu.php?url=a00000KEJeCxDFezE9zWs0cAy48SKaP28i3rtS_b1Qk61FXZFQcfMQUN06D1KVJFwO3d3zasDDuMJQjmC2l016i4eEeCr_vZVXtzAMtixbONugRUmSLlN4wR1bCutTNub_5yi7Be5d-L7aFIDojxT41LTgGVJoMRuSmYdXb3VvmXuyX37YBUhYMWARKRJjGxWb6-u8-wUZEmz3whdEYfBoN4WFcm.7R_iIDxwN4Nn8JspnaRfIZwZKYwqD7NjHw63p8B5hGyAp7WFg8o3J0.U1Yk0ZDqYVHnJeZc1P60IjLcOTh1Eoad3sKGUHYkPWcv0ZNG5fKspyfqP0KWpyfqrHn0mhbqn10k0AuY5H00TA6qn0KET1Ys0AFL5H00UMfqn0K1XWY0ThIYmyTqn0K8IM0qna3snj0snj0sn0K-ThTqn0KYTh7buHYs0AFbpyfqnjK7PHD3n1F7f1uDfRDswjDswH7jnjm4rRndwHmvP100uAPWujY0mgPxpywW5gK1Qy4J0AqW5HD0u1dLTv41IZc0UL0k5H00TZ0Y5H00TMfqPWTY0Z7spyfqn0Kkmv-b5H00mycqn7ts0ZKs5H00Ugws5H00uAwETjYs0ZFJ5H00IZN15Hb3Pj6sPjn1rHczrHf1rjb1njm0mynqnfKsUWYs0ZK9I7qhUA7M5H00TyILujYs0AN1IjYs0ANYpyfqQHD0mgPsmvnqn0KdTA-8mvnqn0KhmLNY5H00mywhUA7M5HD0IvuzUvYq0AFY5HD0ThNkIjYkP1czrHfzrjf1nHTY0ZPGujYsnj0snj0snjnzn1ubuW610AqY5HD0ULFsIjYzc10Wn1RWnH0snan1PjDzrjTdPjD3c1bdnj0WrHRsna3sc1nWnH0snanscYwANansQW01rHRdninkQW0snj0snankc10Wna3snj0snj0Wnan3PjDYnHb3Pjcvc10Wnank0ZFYmy-b5fKopHYs0AdY5HcYnHKxnW0dnfKVm1Ysg1csPHD0UyPxuMFEUHYsg100uA78IyF-gLK_my4GuZnqn7ts0A7bTgbqz5LwktB-z5LF_tofd5gjVnB-0A7bTgfqn0KGTvP_5H00TydY5H00mywxTvqdThP-5H0WpAqYgLIEThfW0APzm1YLPHnz&amp;us=newvui&amp;ai=0_429732241_1_0&amp;word=&amp;ck=0.0.0.0.0.0.0.0&amp;shh=tieba.baidu.com\" target=\"_blank\"><div class=\"ndfxdqz ec_desc uq8p2c4\"><span>三沙景点，两个人去三沙多少钱，不跟团自由行，低预算就能玩，必去景点都玩了一遍，全程行程分享，带你圆梦三沙</span></div></a></div></div><div style=\"margin-bottom: 24px; width: 310px;\"><a href=\"http://www.baidu.com/baidu.php?url=a00000KEJeCxDFezE9zWs0cAy48SKaP28i3rtS_b1Qk61FXZFQcfMQUN06D1KVJFwO3d3zasDDuMJQjmC2l016i4eEeCr_vZVXtzAMtixbONugRUmSLlN4wR1bCutTNub_5yi7Be5d-L7aFIDojxT41LTgGVJoMRuSmYdXb3VvmXuyX37YBUhYMWARKRJjGxWb6-u8-wUZEmz3whdEYfBoN4WFcm.7R_iIDxwN4Nn8JspnaRfIZwZKYwqD7NjHw63p8B5hGyAp7WFg8o3J0.U1Yk0ZDqYVHnJeZc1P60IjLcOTh1Eoad3sKGUHYkPWcv0ZNG5fKspyfqP0KWpyfqrHn0mhbqn10k0AuY5H00TA6qn0KET1Ys0AFL5H00UMfqn0K1XWY0ThIYmyTqn0K8IM0qna3snj0snj0sn0K-ThTqn0KYTh7buHYs0AFbpyfqnjK7PHD3n1F7f1uDfRDswjDswH7jnjm4rRndwHmvP100uAPWujY0mgPxpywW5gK1Qy4J0AqW5HD0u1dLTv41IZc0UL0k5H00TZ0Y5H00TMfqPWTY0Z7spyfqn0Kkmv-b5H00mycqn7ts0ZKs5H00Ugws5H00uAwETjYs0ZFJ5H00IZN15Hb3Pj6sPjn1rHczrHf1rjb1njm0mynqnfKsUWYs0ZK9I7qhUA7M5H00TyILujYs0AN1IjYs0ANYpyfqQHD0mgPsmvnqn0KdTA-8mvnqn0KhmLNY5H00mywhUA7M5HD0IvuzUvYq0AFY5HD0ThNkIjYkP1czrHfzrjf1nHTY0ZPGujYsnj0snj0snjnzn1ubuW610AqY5HD0ULFsIjYzc10Wn1RWnH0snan1PjDzrjTdPjD3c1bdnj0WrHRsna3sc1nWnH0snanscYwANansQW01rHRdninkQW0snj0snankc10Wna3snj0snj0Wnan3PjDYnHb3Pjcvc10Wnank0ZFYmy-b5fKopHYs0AdY5HcYnHKxnW0dnfKVm1Ysg1csPHD0UyPxuMFEUHYsg100uA78IyF-gLK_my4GuZnqn7ts0A7bTgbqz5LwktB-z5LF_tofd5gjVnB-0A7bTgfqn0KGTvP_5H00TydY5H00mywxTvqdThP-5H0WpAqYgLIEThfW0APzm1YLPHnz&amp;us=newvui&amp;ai=0_429732241_1_0&amp;word=&amp;ck=0.0.0.0.0.0.0.0&amp;shh=tieba.baidu.com\" target=\"_blank\"><div class=\"_5dc27n3 r1n7ehc ruyfyqy x17vnj2 _5k9skk2 _3zt36qa na9zhar ec-img\"><img src=\"https://ns-strategy.cdn.bcebos.com/ns-strategy/upload/fc_big_pic/part-00451-4286.jpg\"><div class=\"nb41sx9\"></div></div></a></div><div><div class=\"_9cy84ta\"><div class=\"v3zrcrj\"><span>2024-08-06 19:14</span><span class=\"j4rc4ke\"><span class=\"ec-tuiguang ecfc-tuiguang _94sn3jw\">广告</span></span><span class=\"qqvbase\"><div><div><div><a href=\"http://www.baidu.com/baidu.php?url=a00000KEJeCxDFezE9zWs0cAy48SKaP28i3rtS_b1Qk61FXZFQcfMQUN06D1KVJFwO3d3zasDDuMJQjmC2l016i4eEeCr_vZVXtzAMtixbONugRUmSLlN4wR1bCutTNub_5yi7Be5d-L7aFIDojxT41LTgGVJoMRuSmYdXb3VvmXuyX37YBUhYMWARKRJjGxWb6-u8-wUZEmz3whdEYfBoN4WFcm.7R_iIDxwN4Nn8JspnaRfIZwZKYwqD7NjHw63p8B5hGyAp7WFg8o3J0.U1Yk0ZDqYVHnJeZc1P60IjLcOTh1Eoad3sKGUHYkPWcv0ZNG5fKspyfqP0KWpyfqrHn0mhbqn10k0AuY5H00TA6qn0KET1Ys0AFL5H00UMfqn0K1XWY0ThIYmyTqn0K8IM0qna3snj0snj0sn0K-ThTqn0KYTh7buHYs0AFbpyfqnjK7PHD3n1F7f1uDfRDswjDswH7jnjm4rRndwHmvP100uAPWujY0mgPxpywW5gK1Qy4J0AqW5HD0u1dLTv41IZc0UL0k5H00TZ0Y5H00TMfqPWTY0Z7spyfqn0Kkmv-b5H00mycqn7ts0ZKs5H00Ugws5H00uAwETjYs0ZFJ5H00IZN15Hb3Pj6sPjn1rHczrHf1rjb1njm0mynqnfKsUWYs0ZK9I7qhUA7M5H00TyILujYs0AN1IjYs0ANYpyfqQHD0mgPsmvnqn0KdTA-8mvnqn0KhmLNY5H00mywhUA7M5HD0IvuzUvYq0AFY5HD0ThNkIjYkP1czrHfzrjf1nHTY0ZPGujYsnj0snj0snjnzn1ubuW610AqY5HD0ULFsIjYzc10Wn1RWnH0snan1PjDzrjTdPjD3c1bdnj0WrHRsna3sc1nWnH0snanscYwANansQW01rHRdninkQW0snj0snankc10Wna3snj0snj0Wnan3PjDYnHb3Pjcvc10Wnank0ZFYmy-b5fKopHYs0AdY5HcYnHKxnW0dnfKVm1Ysg1csPHD0UyPxuMFEUHYsg100uA78IyF-gLK_my4GuZnqn7ts0A7bTgbqz5LwktB-z5LF_tofd5gjVnB-0A7bTgfqn0KGTvP_5H00TydY5H00mywxTvqdThP-5H0WpAqYgLIEThfW0APzm1YLPHnz&amp;us=newvui&amp;ai=0_429732241_1_0&amp;word=&amp;ck=0.0.0.0.0.0.0.0&amp;shh=tieba.baidu.com\" target=\"_blank\"><div class=\"_9fe13qw _2jze4xh\"><span>立即查看</span><div></div></div></a></div></div></div></span></div></div></div></div></div></div></div></div></div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:1860487002,&quot;user_name&quot;:&quot;\\u54b8\\u9c7c\\u6ca1\\u6709\\u672a\\u6765&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.4c698014.LURMudV1qobUOJrpLor3Fw?t=1652419350&quot;,&quot;user_nickname&quot;:&quot;\\u6211\\u53ea\\u662f\\u4e2a\\u85af\\u6761\\ud83c\\udf38&quot;},&quot;content&quot;:{&quot;post_id&quot;:150719258551,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u8fd9\\u5973\\u7684\\u665a\\u4e0a\\u4e0d\\u56de\\u5bb6\\u5979\\u7239\\u53bb\\u627e\\u5979\\uff0c\\u88ab\\u9ec4\\u6bdb\\u6253\\u8fdb\\u533b\\u9662\\uff0c\\u4e5f\\u6ca1\\u6765\\u533b\\u9662\\u770b\\u8fc7\\uff0c\\u6700\\u540e\\u548c\\u9ec4\\u6bdb\\u7ed3\\u5a5a\\u4e5f\\u4e0d\\u6765\\u5f80\\u3002\\u60f3\\u8d77\\u4e09\\u5957\\u623f\\u60f3\\u7206\\u5979\\u7239\\u91d1\\u5e01\\uff0c\\u7ed3\\u679c\\u627e\\u4e0d\\u5230\\u6c42\\u52a9\\u5e73\\u53f0\\u3002\\u5e78\\u597d\\u5979\\u7239\\u8dd1\\u5f97\\u5feb\\u3002&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:4,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:37,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:2,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150719258551\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u54b8\\u9c7c\\u6ca1\\u6709\\u672a\\u6765&quot;,&quot;id&quot;:&quot;tb.1.4c698014.LURMudV1qobUOJrpLor3Fw?t=1652419350&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.4c698014.LURMudV1qobUOJrpLor3Fw?t=1652419350&amp;fr=pb\"><img username=\"咸鱼没有未来\" class=\"\" src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.4c698014.LURMudV1qobUOJrpLor3Fw?t=1652419350\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:1860487002}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u54b8\\u9c7c\\u6ca1\\u6709\\u672a\\u6765&quot;,&quot;id&quot;:&quot;tb.1.4c698014.LURMudV1qobUOJrpLor3Fw?t=1652419350&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.4c698014.LURMudV1qobUOJrpLor3Fw?t=1652419350&amp;fr=pb\" target=\"_blank\">我只是个薯条<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/3-1.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a>\n\n                </li>\n                            <li class=\"d_icons\">\n                <span class=\"icon_wrap  icon_wrap_theme1 d_pb_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1722691615) no-repeat -3850px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"starmaster\" data-field=\"{&quot;name&quot;:&quot;starmaster&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u624b\\u6e380\\u661f\\u8fbe\\u4eba&quot;,&quot;intro&quot;:&quot;\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~&quot;,&quot;intro_url&quot;:&quot;https:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;amp;ie=utf-8&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;2&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,76&quot;,&quot;2&quot;:&quot;1722691615,77&quot;,&quot;3&quot;:&quot;1722691615,78&quot;,&quot;4&quot;:&quot;1722691615,79&quot;,&quot;5&quot;:&quot;1722691615,80&quot;,&quot;6&quot;:&quot;1722691615,81&quot;}}\" target=\"_blank\" href=\"https://tieba.baidu.com/f?kw=玩家认证&amp;ie=utf-8\" class=\"j_icon_slot\" title=\"手游0星达人\" locate=\"starmaster_2#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span>\n\n            </li>\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150719258551\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    这女的晚上不回家她爹去找她，被黄毛打进医院，也没来医院看过，最后和黄毛结婚也不来往。想起三套房想爆她爹金币，结果找不到求助平台。幸好她爹跑得快。</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <a rel=\"noopener\" class=\"l_post_anchor\" name=\"150719258551l\"></a><div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:福建</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">4楼</span><span class=\"tail-info\">2024-08-05 17:38</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150719258551,&quot;total_num&quot;:37}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(37)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:350px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:2841895442,&quot;user_name&quot;:&quot;\\u4e0a\\u5c9b\\u590f\\u76ee&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.662ba1dc.GNUm8KOSZgW0Gb8SUmOJEg?t=1661244031&quot;,&quot;user_nickname&quot;:&quot;\\u767d\\u660e\\u4e2b\\u266c&quot;},&quot;content&quot;:{&quot;post_id&quot;:150719564162,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u6211\\u77e5\\u9053\\uff0c\\u53ef\\u601c\\u4e4b\\u4eba\\uff0c\\u5fc5\\u6709\\uff08\\uff09&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:7,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:19,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:3,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150719564162\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u4e0a\\u5c9b\\u590f\\u76ee&quot;,&quot;id&quot;:&quot;tb.1.662ba1dc.GNUm8KOSZgW0Gb8SUmOJEg?t=1661244031&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.662ba1dc.GNUm8KOSZgW0Gb8SUmOJEg?t=1661244031&amp;fr=pb\"><img username=\"上岛夏目\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.662ba1dc.GNUm8KOSZgW0Gb8SUmOJEg?t=1661244031\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:2841895442}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u4e0a\\u5c9b\\u590f\\u76ee&quot;,&quot;id&quot;:&quot;tb.1.662ba1dc.GNUm8KOSZgW0Gb8SUmOJEg?t=1661244031&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.662ba1dc.GNUm8KOSZgW0Gb8SUmOJEg?t=1661244031&amp;fr=pb\" target=\"_blank\">森歌の友</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150719564162\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    我知道，可怜之人，必有（）</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <a rel=\"noopener\" class=\"l_post_anchor\" name=\"150719564162l\"></a><div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:浙江</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">7楼</span><span class=\"tail-info\">2024-08-05 18:38</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150719564162,&quot;total_num&quot;:19}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(19)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:350px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:81196832,&quot;user_name&quot;:&quot;\\u6c89\\u5bc2V\\u6b87&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.ee54c4f.WXJIhqmqZEapjqYlbpDrOA?t=1392085157&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150719589849,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u592a\\u5047\\u4e86\\uff0c\\u6df7\\u793e\\u4f1a\\u4e0d\\u826f\\u592a\\u59b9\\uff0c\\u8fd8\\u8003\\u9ad8\\u4e2d\\uff0c\\u9009\\u4e13\\u4e1a\\u3002\\u5f53\\u6ca1\\u6709\\u5927\\u4e13\\u4e48&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:8,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:7,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:4,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150719589849\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u6c89\\u5bc2V\\u6b87&quot;,&quot;id&quot;:&quot;tb.1.ee54c4f.WXJIhqmqZEapjqYlbpDrOA?t=1392085157&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.ee54c4f.WXJIhqmqZEapjqYlbpDrOA?t=1392085157&amp;fr=pb\"><img username=\"沉寂V殇\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.ee54c4f.WXJIhqmqZEapjqYlbpDrOA?t=1392085157\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:81196832}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u6c89\\u5bc2V\\u6b87&quot;,&quot;id&quot;:&quot;tb.1.ee54c4f.WXJIhqmqZEapjqYlbpDrOA?t=1392085157&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.ee54c4f.WXJIhqmqZEapjqYlbpDrOA?t=1392085157&amp;fr=pb\" target=\"_blank\">沉寂V殇</a>\n\n                </li>\n                            <li class=\"d_icons\">\n                <span class=\"icon_wrap  icon_wrap_theme1 d_pb_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1722691615) no-repeat -3950px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"starmaster\" data-field=\"{&quot;name&quot;:&quot;starmaster&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u624b\\u6e380\\u661f\\u8fbe\\u4eba&quot;,&quot;intro&quot;:&quot;\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~&quot;,&quot;intro_url&quot;:&quot;https:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;amp;ie=utf-8&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;4&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,76&quot;,&quot;2&quot;:&quot;1722691615,77&quot;,&quot;3&quot;:&quot;1722691615,78&quot;,&quot;4&quot;:&quot;1722691615,79&quot;,&quot;5&quot;:&quot;1722691615,80&quot;,&quot;6&quot;:&quot;1722691615,81&quot;}}\" target=\"_blank\" href=\"https://tieba.baidu.com/f?kw=玩家认证&amp;ie=utf-8\" class=\"j_icon_slot\" title=\"手游0星达人\" locate=\"starmaster_4#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span>\n\n            </li>\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150719589849\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    太假了，混社会不良太妹，还考高中，选专业。当没有大专么</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:天津</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">8楼</span><span class=\"tail-info\">2024-08-05 18:43</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150719589849,&quot;total_num&quot;:7}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(7)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:350px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:4603874465,&quot;user_name&quot;:&quot;Yankee_is_dick&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.1bf88a52.bRjNr1xUwrQYCbsXamisUw?t=1656314757&quot;,&quot;user_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_a4Jb5GQ&quot;},&quot;content&quot;:{&quot;post_id&quot;:150719634108,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u8fb9\\u502am\\u84d6&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:9,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:0,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:5,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150719634108\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;Yankee_is_dick&quot;,&quot;id&quot;:&quot;tb.1.1bf88a52.bRjNr1xUwrQYCbsXamisUw?t=1656314757&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.1bf88a52.bRjNr1xUwrQYCbsXamisUw?t=1656314757&amp;fr=pb\"><img username=\"Yankee_is_dick\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.1bf88a52.bRjNr1xUwrQYCbsXamisUw?t=1656314757\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:4603874465}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;Yankee_is_dick&quot;,&quot;id&quot;:&quot;tb.1.1bf88a52.bRjNr1xUwrQYCbsXamisUw?t=1656314757&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.1bf88a52.bRjNr1xUwrQYCbsXamisUw?t=1656314757&amp;fr=pb\" target=\"_blank\">独爱小尹<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/1-25.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150719634108\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    边倪m蓖</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:广东</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">9楼</span><span class=\"tail-info\">2024-08-05 18:52</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150719634108,&quot;total_num&quot;:null}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:;\">回复</a><span class=\"lzl_link_fold\" style=\"display:none\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:50px\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:2362240276,&quot;user_name&quot;:&quot;\\u5723\\u4eba\\u59ec\\u60e0&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.f23bfd54.rJuq9eu7OmuLCWxo3ZpXHg?t=1501582907&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150719669703,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u7236\\u4eb2\\u95ee\\u9898\\u5f88\\u5927\\uff0c\\u5e94\\u8be5\\u572814\\u5c81\\u90a3\\u5e74\\u518d\\u751f\\u4e00\\u4e2a\\u6216\\u8005\\u9886\\u517b\\u4e00\\u4e2a<img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon3.png\\&quot; >&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:10,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:14,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:6,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150719669703\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u5723\\u4eba\\u59ec\\u60e0&quot;,&quot;id&quot;:&quot;tb.1.f23bfd54.rJuq9eu7OmuLCWxo3ZpXHg?t=1501582907&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.f23bfd54.rJuq9eu7OmuLCWxo3ZpXHg?t=1501582907&amp;fr=pb\"><img username=\"圣人姬惠\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.f23bfd54.rJuq9eu7OmuLCWxo3ZpXHg?t=1501582907\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:2362240276}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u5723\\u4eba\\u59ec\\u60e0&quot;,&quot;id&quot;:&quot;tb.1.f23bfd54.rJuq9eu7OmuLCWxo3ZpXHg?t=1501582907&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.f23bfd54.rJuq9eu7OmuLCWxo3ZpXHg?t=1501582907&amp;fr=pb\" target=\"_blank\">圣人姬惠</a>\n\n                </li>\n                            <li class=\"d_icons\">\n                <span class=\"icon_wrap  icon_wrap_theme1 d_pb_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1722691615) no-repeat -3900px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"starmaster\" data-field=\"{&quot;name&quot;:&quot;starmaster&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u624b\\u6e380\\u661f\\u8fbe\\u4eba&quot;,&quot;intro&quot;:&quot;\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~&quot;,&quot;intro_url&quot;:&quot;https:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;amp;ie=utf-8&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;3&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,76&quot;,&quot;2&quot;:&quot;1722691615,77&quot;,&quot;3&quot;:&quot;1722691615,78&quot;,&quot;4&quot;:&quot;1722691615,79&quot;,&quot;5&quot;:&quot;1722691615,80&quot;,&quot;6&quot;:&quot;1722691615,81&quot;}}\" target=\"_blank\" href=\"https://tieba.baidu.com/f?kw=玩家认证&amp;ie=utf-8\" class=\"j_icon_slot\" title=\"手游0星达人\" locate=\"starmaster_3#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span>\n\n            </li>\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150719669703\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    父亲问题很大，应该在14岁那年再生一个或者领养一个<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon3.png\"></div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <a rel=\"noopener\" class=\"l_post_anchor\" name=\"150719669703l\"></a><div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:河北</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">10楼</span><span class=\"tail-info\">2024-08-05 18:59</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150719669703,&quot;total_num&quot;:14}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(14)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:350px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:1587096962,&quot;user_name&quot;:&quot;\\u4e8b\\u6545\\u53d1\\u751f\\u5927\\u672c\\u8425&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.122a64d3.lNAZaaL7B6lErfJKagAjtw?t=1653733223&quot;,&quot;user_nickname&quot;:&quot;ID\\u4e0d\\u91cd\\u8981\\u00ba&quot;},&quot;content&quot;:{&quot;post_id&quot;:150719719358,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u5979\\u7238\\u600e\\u4e48\\u5fcd\\u4f4f\\u4e0d\\u521b\\u5c0f\\u53f7\\u7684&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:12,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:18,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:7,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150719719358\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u4e8b\\u6545\\u53d1\\u751f\\u5927\\u672c\\u8425&quot;,&quot;id&quot;:&quot;tb.1.122a64d3.lNAZaaL7B6lErfJKagAjtw?t=1653733223&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.122a64d3.lNAZaaL7B6lErfJKagAjtw?t=1653733223&amp;fr=pb\"><img username=\"事故发生大本营\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.122a64d3.lNAZaaL7B6lErfJKagAjtw?t=1653733223\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:1587096962}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u4e8b\\u6545\\u53d1\\u751f\\u5927\\u672c\\u8425&quot;,&quot;id&quot;:&quot;tb.1.122a64d3.lNAZaaL7B6lErfJKagAjtw?t=1653733223&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.122a64d3.lNAZaaL7B6lErfJKagAjtw?t=1653733223&amp;fr=pb\" target=\"_blank\">ID不重要<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/1-1.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值1，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150719719358\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    她爸怎么忍住不创小号的</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <a rel=\"noopener\" class=\"l_post_anchor\" name=\"150719719358l\"></a><div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:浙江</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">12楼</span><span class=\"tail-info\">2024-08-05 19:09</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150719719358,&quot;total_num&quot;:18}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(18)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:350px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div id=\"mediago-tb-pb-list-8\" data-po=\"8\"><div class=\"mediago-ad-pb-751-video-wrapper mediago-ad-wrapper svelte-s6he8h\"><div class=\"mediago-userInfo svelte-s6he8h\"><div class=\"mediago-header svelte-s6he8h\"><img src=\"https://mediago-static.cdn.bcebos.com/assets/images/header/3.png\" alt=\"\" class=\"svelte-s6he8h\"></div> <p class=\"mediago-nickName svelte-s6he8h\">全新合击传奇</p></div> <a class=\"mediago-content svelte-s6he8h\" href=\"javascript:;\"><div class=\"mediago-title svelte-s6he8h\">2024全新传奇，玩的就是爽，超快攻速，超高爆率，玩就完了！！</div> <div class=\"mediago-desc svelte-s6he8h\">传奇不等待，要爽趁现在！全新合击版本爆率升级，神装全靠打！</div> <div class=\"mediago-checkBtn svelte-s6he8h\">立即查看</div> <div class=\"mediago-video svelte-s6he8h\"><img class=\"bgImg svelte-s6he8h\" src=\"https://s3m7.fenxi.com/galileo/7f878222e69190c37017cef7bbfa07a3_1920x1080_cover.jpg\" alt=\"\"> <video src=\"https://live-s3m.mediav.com/nativevideo/7f878222e69190c37017cef7bbfa07a3-bit_zdgq768.mp4?bit=512\" class=\"svelte-s6he8h\">您的浏览器不支持 video 标签。\n                <track kind=\"captions\" srclang=\"en\" label=\"English\" default=\"\" class=\"svelte-s6he8h\"></video> <div class=\"mediago-play-btn svelte-s6he8h\"></div> <div class=\"mediago-volume svelte-s6he8h\"><img src=\"https://mediago-static.cdn.bcebos.com/assets/images/mute.png\" alt=\"\" class=\"svelte-s6he8h\"></div></div></a> <div class=\"mediago-footer svelte-s6he8h\"><span class=\"mediago-date svelte-s6he8h\">2024-08-06 19:14:02</span> <span class=\"mediago-ad svelte-s6he8h\">广告</span></div> <div class=\"mediago-close svelte-s6he8h\"></div> </div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:1856235050,&quot;user_name&quot;:&quot;\\u730e\\u841d\\u8005&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.85cbc8c2.s_sZajcMiD9PNmlgBjC1Ig?t=1489514326&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150719726129,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u7ad9\\u5728\\u4f5c\\u8005\\u7684\\u89d2\\u5ea6\\u6765\\u770b\\uff0c\\u80af\\u5b9a\\u90fd\\u662f\\u6311\\u4e86\\u5bf9\\u81ea\\u5df1\\u53ca\\u5176\\u6709\\u5229\\u7684\\u4e1c\\u897f\\u6765\\u8bf4\\u4e86\\uff0c\\u7136\\u800c&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:13,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:5,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:8,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150719726129\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u730e\\u841d\\u8005&quot;,&quot;id&quot;:&quot;tb.1.85cbc8c2.s_sZajcMiD9PNmlgBjC1Ig?t=1489514326&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.85cbc8c2.s_sZajcMiD9PNmlgBjC1Ig?t=1489514326&amp;fr=pb\"><img username=\"猎萝者\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.85cbc8c2.s_sZajcMiD9PNmlgBjC1Ig?t=1489514326\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:1856235050}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u730e\\u841d\\u8005&quot;,&quot;id&quot;:&quot;tb.1.85cbc8c2.s_sZajcMiD9PNmlgBjC1Ig?t=1489514326&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.85cbc8c2.s_sZajcMiD9PNmlgBjC1Ig?t=1489514326&amp;fr=pb\" target=\"_blank\">猎萝者</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150719726129\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    站在作者的角度来看，肯定都是挑了对自己及其有利的东西来说了，然而</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:四川</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">13楼</span><span class=\"tail-info\">2024-08-05 19:11</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150719726129,&quot;total_num&quot;:5}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(5)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:350px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:1032084675,&quot;user_name&quot;:&quot;\\u88c5\\u6df1\\u6c89\\u672a\\u9042&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.4fccd28d.CYrY_i0s3F7YB59EhDUygg?t=1561347027&quot;,&quot;user_nickname&quot;:&quot;\\u5c0f\\u9738\\u738b\\u590d\\u8bfb\\u673a\\u10da&quot;},&quot;content&quot;:{&quot;post_id&quot;:150719833674,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u8fd9\\u4e2a\\u597d\\u50cf\\u662f\\u4e4b\\u524d\\u65b0\\u95fb\\u91cc\\u7684&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:17,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:1,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:9,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150719833674\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u88c5\\u6df1\\u6c89\\u672a\\u9042&quot;,&quot;id&quot;:&quot;tb.1.4fccd28d.CYrY_i0s3F7YB59EhDUygg?t=1561347027&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.4fccd28d.CYrY_i0s3F7YB59EhDUygg?t=1561347027&amp;fr=pb\"><img username=\"装深沉未遂\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.4fccd28d.CYrY_i0s3F7YB59EhDUygg?t=1561347027\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:1032084675}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u88c5\\u6df1\\u6c89\\u672a\\u9042&quot;,&quot;id&quot;:&quot;tb.1.4fccd28d.CYrY_i0s3F7YB59EhDUygg?t=1561347027&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.4fccd28d.CYrY_i0s3F7YB59EhDUygg?t=1561347027&amp;fr=pb\" target=\"_blank\">小霸王复读机<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/1-9.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150719833674\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    这个好像是之前新闻里的</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:江苏</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">17楼</span><span class=\"tail-info\">2024-08-05 19:31</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150719833674,&quot;total_num&quot;:1}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(1)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:110px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:3432426854,&quot;user_name&quot;:&quot;gdusni&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.420e1eab.cf2azloOTHbXtRcrv3KzAg?t=1593915883&quot;,&quot;user_nickname&quot;:&quot;\\u5e78\\u798f\\u7684\\u6a58\\u5b50\\u00ba&quot;},&quot;content&quot;:{&quot;post_id&quot;:150720011488,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u53db\\u9006\\u671f\\u4f60\\u61c2\\u7684\\u8fd96\\u4e2a\\u5b57\\u5305\\u542b\\u4e86\\u4e0d\\u77e5\\u9053\\u591a\\u5c11\\u4e8b<img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon3.png\\&quot; >\\u7236\\u6bcd\\u6ca1\\u5bf9\\u4ed6\\u53d1\\u706b\\u800c\\u662f\\u8010\\u5fc3\\u529d\\u5bfc\\u4e5f\\u4e0d\\u77e5\\u9053\\u5305\\u542b\\u4e86\\u591a\\u5c11\\uff0c\\u6211\\u4e0d\\u597d\\u8bf4\\uff0c\\u800c\\u4e1414\\u5c81\\u9003\\u5b66\\u6df7\\u793e\\u4f1a<img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon10.png\\&quot; >\\u521d\\u4e09\\u9ad8\\u4e00\\u7684\\u5b66\\u751f\\u8fd9\\u4e48\\u5f04\\u57fa\\u672c\\u4e5f\\u662f\\u70c2\\u4e86&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:21,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:8,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:10,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150720011488\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;gdusni&quot;,&quot;id&quot;:&quot;tb.1.420e1eab.cf2azloOTHbXtRcrv3KzAg?t=1593915883&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.420e1eab.cf2azloOTHbXtRcrv3KzAg?t=1593915883&amp;fr=pb\"><img username=\"gdusni\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.420e1eab.cf2azloOTHbXtRcrv3KzAg?t=1593915883\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:3432426854}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;gdusni&quot;,&quot;id&quot;:&quot;tb.1.420e1eab.cf2azloOTHbXtRcrv3KzAg?t=1593915883&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.420e1eab.cf2azloOTHbXtRcrv3KzAg?t=1593915883&amp;fr=pb\" target=\"_blank\">幸福的橘子<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/1-1.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150720011488\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    叛逆期你懂的这6个字包含了不知道多少事<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon3.png\">父母没对他发火而是耐心劝导也不知道包含了多少，我不好说，而且14岁逃学混社会<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon10.png\">初三高一的学生这么弄基本也是烂了</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:黑龙江</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">21楼</span><span class=\"tail-info\">2024-08-05 20:06</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150720011488,&quot;total_num&quot;:8}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(8)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:350px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:1922219139,&quot;user_name&quot;:&quot;\\u82cd\\u5929\\u9976\\u8fc7\\u4eba&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.dab28717.2SafV8iXbywUidiazpWc5Q?t=1683853143&quot;,&quot;user_nickname&quot;:&quot;\\u840c\\u65b0\\u9f8d\\u50b2\\u5929\\ud83c\\udf80&quot;},&quot;content&quot;:{&quot;post_id&quot;:150720076907,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u6211\\u4eec\\u7fa4\\u6709\\u4e2a\\u5973\\u7684\\u3002\\u3002\\u3002\\u4ed6\\u8bf4\\u4ed6\\u7239\\u5bb6\\u66b4\\u3002\\u3002\\u3002\\u559d\\u70b9\\u9152\\u6253\\u5979\\u8ddf\\u4ed6\\u5988\\u3002\\u3002\\u5979\\u8fd8\\u8f7b\\u751f\\u8fc7\\u3002\\u3002\\u3002\\u6162\\u6162\\u7684\\u7684\\u4e86\\u89e3\\u4e86\\u3002\\u3002\\u3002\\u3002\\u4ed6\\u7239\\u597d\\u50cf\\u6ca1\\u90a3\\u4e48\\u4e0d\\u582a\\u3002\\u3002\\u3002\\u4e00\\u4e2a\\u67084000\\u591a\\u751f\\u6d3b\\u8d39\\u7ed9\\u5979\\u3002\\u3002\\u3002\\u5979\\u4e0a\\u5b66\\u90fd\\u6253\\u51fa\\u79df\\u8f66\\u3002\\u3002\\u3002\\u4ed6\\u7239\\u8fd8\\u4e0d\\u600e\\u4e48\\u559d\\u9152\\u3002\\u3002\\u3002<img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon10.png\\&quot; ><img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon10.png\\&quot; ><img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon10.png\\&quot; >\\u4ed6\\u6709\\u6291\\u90c1\\u75c7\\u4ed6\\u7239\\u8fd8\\u5e26\\u5979\\u53bb\\u770b\\u75c5\\u3002\\u3002\\u3002\\u3002\\u8fd8\\u5b66\\u4e86\\u4e2d\\u533b\\u7ed9\\u5979\\u98df\\u8865\\u3002\\u3002\\u4f46\\u662f\\u4ed6\\u5c31\\u8bb0\\u5f97\\u4ed6\\u7239\\u559d\\u9152\\u6253\\u5979\\u8ddf\\u4ed6\\u5988\\uff0c\\u3002\\u3002\\u3002\\u3002<img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon10.png\\&quot; >\\u6211\\u5c31\\u7eb3\\u4e86\\u95f7\\u4e86\\u3002\\u3002\\u3002\\u3002\\u8fd9\\u4e24\\u4e2a\\u7248\\u672c\\u7684\\u6545\\u4e8b\\u4e0d\\u5927\\u5bf9\\u3002\\u3002\\u3002\\u3002\\u5973\\u4eba\\u5634\\u91cc\\u6ca1\\u5b9e\\u8bdd\\u554a\\u3002\\u3002\\u3002\\u3002\\u3002\\u5979\\u8bf4\\u5979\\u7239\\u559d\\u9152\\u6253\\u4ed6\\u5988\\uff0c\\u4ed6\\u76f4\\u63a5\\u62ff\\u6c34\\u679c\\u5200\\u7ed9\\u4ed6\\u7239\\u6345\\u4e86\\u3002\\u6dcc\\u4e86\\u597d\\u591a\\u8840\\uff0c\\u6240\\u4ee5\\u4ed6\\u7239\\u9001\\u5979\\u8fdb\\u7cbe\\u795e\\u75c5\\u9662<img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon8.png\\&quot; ><img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon8.png\\&quot; ><img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon8.png\\&quot; >   \\u53cd\\u6b63\\u633a\\u6df7\\u4e71\\u7684\\u3002\\u3002\\u3002\\u633a\\u6f02\\u4eae\\u7684\\u4e00\\u4e2a\\u9ad8\\u4e2d\\u5973\\u5b69\\uff0c\\u5c31\\u559c\\u6b22\\u9152\\u5427\\u559d\\u9152\\u3002\\u3002\\u8e66\\u8fea\\u3002\\u3002\\u3002\\u8bf4\\u5168\\u73ed\\u7537\\u7684\\u90fd\\u7ed9\\u5979\\u8868\\u8fc7\\u767d\\u3002\\u3002\\u3002\\u4f46\\u662f\\u5c31\\u559c\\u6b22\\u5c0f\\u6df7\\u6df7\\u3002\\u3002\\u3002<br><img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon10.png\\&quot; >\\u6211\\u5f97\\u51fa\\u4e00\\u4e2a\\u7ed3\\u8bba\\u3002\\u8fd9\\u5bb6\\u4f19\\u771f\\u6709\\u75c5\\u3002\\u3002\\u3002\\u3002\\u5979\\u7239\\u7edd\\u5bf9\\u5bf9\\u5979\\u4e0d\\u9519\\u3002\\u3002\\u3002\\u3002\\u3002\\u4e5f\\u662f\\u8d31\\u9ad8\\u4e2d\\u5bb6\\u5ead\\u597d\\uff0c\\u8fd8\\u559c\\u6b22\\u6df7\\u6df7\\u5f88\\u8e66\\u8fea\\u3002\\u3002\\u3002\\u3002\\u9ad8\\u8003\\u624d\\u4e24\\u767e\\u8fd8\\u662f\\u4e09\\u767e\\u591a<img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon8.png\\&quot; >\\u8ba9\\u540c\\u5b66\\u9a82\\u4e86\\u4e00\\u987f\\u3002\\u3002\\u3002\\u3002\\u7834\\u9632\\u4e86\\u5728\\u7fa4\\u91cc\\u54ed\\u8dd1\\u8def\\u4e86\\u3002\\u3002\\u3002&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:22,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:39,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:11,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150720076907\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u82cd\\u5929\\u9976\\u8fc7\\u4eba&quot;,&quot;id&quot;:&quot;tb.1.dab28717.2SafV8iXbywUidiazpWc5Q?t=1683853143&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.dab28717.2SafV8iXbywUidiazpWc5Q?t=1683853143&amp;fr=pb\"><img username=\"苍天饶过人\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.dab28717.2SafV8iXbywUidiazpWc5Q?t=1683853143\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:1922219139}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u82cd\\u5929\\u9976\\u8fc7\\u4eba&quot;,&quot;id&quot;:&quot;tb.1.dab28717.2SafV8iXbywUidiazpWc5Q?t=1683853143&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.dab28717.2SafV8iXbywUidiazpWc5Q?t=1683853143&amp;fr=pb\" target=\"_blank\">萌新龍傲天<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/4-1.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a>\n\n                </li>\n                            <li class=\"d_icons\">\n                <span class=\"icon_wrap  icon_wrap_theme1 d_pb_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1722691615) no-repeat -3800px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"starmaster\" data-field=\"{&quot;name&quot;:&quot;starmaster&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u624b\\u6e380\\u661f\\u8fbe\\u4eba&quot;,&quot;intro&quot;:&quot;\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~&quot;,&quot;intro_url&quot;:&quot;https:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;amp;ie=utf-8&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,76&quot;,&quot;2&quot;:&quot;1722691615,77&quot;,&quot;3&quot;:&quot;1722691615,78&quot;,&quot;4&quot;:&quot;1722691615,79&quot;,&quot;5&quot;:&quot;1722691615,80&quot;,&quot;6&quot;:&quot;1722691615,81&quot;}}\" target=\"_blank\" href=\"https://tieba.baidu.com/f?kw=玩家认证&amp;ie=utf-8\" class=\"j_icon_slot\" title=\"手游0星达人\" locate=\"starmaster_1#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span>\n\n            </li>\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150720076907\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    我们群有个女的。。。他说他爹家暴。。。喝点酒打她跟他妈。。她还轻生过。。。慢慢的的了解了。。。。他爹好像没那么不堪。。。一个月4000多生活费给她。。。她上学都打出租车。。。他爹还不怎么喝酒。。。<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon10.png\"><img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon10.png\"><img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon10.png\">他有抑郁症他爹还带她去看病。。。。还学了中医给她食补。。但是他就记得他爹喝酒打她跟他妈，。。。。<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon10.png\">我就纳了闷了。。。。这两个版本的故事不大对。。。。女人嘴里没实话啊。。。。。她说她爹喝酒打他妈，他直接拿水果刀给他爹捅了。淌了好多血，所以他爹送她进精神病院<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon8.png\"><img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon8.png\"><img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon8.png\">   反正挺混乱的。。。挺漂亮的一个高中女孩，就喜欢酒吧喝酒。。蹦迪。。。说全班男的都给她表过白。。。但是就喜欢小混混。。。<br><img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon10.png\">我得出一个结论。这家伙真有病。。。。她爹绝对对她不错。。。。。也是贱高中家庭好，还喜欢混混很蹦迪。。。。高考才两百还是三百多<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon8.png\">让同学骂了一顿。。。。破防了在群里哭跑路了。。。</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <a rel=\"noopener\" class=\"l_post_anchor\" name=\"150720076907l\"></a><div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:山东</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">22楼</span><span class=\"tail-info\">2024-08-05 20:19</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150720076907,&quot;total_num&quot;:39}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(39)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:350px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:824094285,&quot;user_name&quot;:&quot;\\u591a\\u7c73\\u5427&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.9cad2cfc.TPhhZhaaP-Ku5Gtn8-9tLg&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150720157319,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u5973\\u7684\\u72ec\\u751f\\uff0c\\u516b\\u6210\\u662f\\u7ed3\\u5a5a\\u5ac1\\u4e86\\u6df7\\u6df7\\u65e5\\u5b50\\u4e0d\\u5982\\u610f\\uff0c\\u60f3\\u7740\\u7206\\u7236\\u6bcd\\u91d1\\u5e013\\u5957\\u623f\\uff0c\\u540e\\u6765\\u8fde\\u6bcd\\u4eb2\\u90fd\\u8eb2\\u7740\\u5979\\u8db3\\u4ee5\\u8bf4\\u660e\\u4e00\\u5207&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:23,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:10,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:12,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150720157319\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u591a\\u7c73\\u5427&quot;,&quot;id&quot;:&quot;tb.1.9cad2cfc.TPhhZhaaP-Ku5Gtn8-9tLg&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.9cad2cfc.TPhhZhaaP-Ku5Gtn8-9tLg&amp;fr=pb\"><img username=\"多米吧\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.9cad2cfc.TPhhZhaaP-Ku5Gtn8-9tLg\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:824094285}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u591a\\u7c73\\u5427&quot;,&quot;id&quot;:&quot;tb.1.9cad2cfc.TPhhZhaaP-Ku5Gtn8-9tLg&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.9cad2cfc.TPhhZhaaP-Ku5Gtn8-9tLg&amp;fr=pb\" target=\"_blank\">多米吧</a>\n\n                </li>\n                            <li class=\"d_icons\">\n                <span class=\"icon_wrap  icon_wrap_theme1 d_pb_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1722691615) no-repeat -4000px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"starmaster\" data-field=\"{&quot;name&quot;:&quot;starmaster&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u624b\\u6e380\\u661f\\u8fbe\\u4eba&quot;,&quot;intro&quot;:&quot;\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~&quot;,&quot;intro_url&quot;:&quot;https:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;amp;ie=utf-8&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;5&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,76&quot;,&quot;2&quot;:&quot;1722691615,77&quot;,&quot;3&quot;:&quot;1722691615,78&quot;,&quot;4&quot;:&quot;1722691615,79&quot;,&quot;5&quot;:&quot;1722691615,80&quot;,&quot;6&quot;:&quot;1722691615,81&quot;}}\" target=\"_blank\" href=\"https://tieba.baidu.com/f?kw=玩家认证&amp;ie=utf-8\" class=\"j_icon_slot\" title=\"手游0星达人\" locate=\"starmaster_5#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span>\n\n            </li>\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150720157319\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    女的独生，八成是结婚嫁了混混日子不如意，想着爆父母金币3套房，后来连母亲都躲着她足以说明一切</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:广东</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">23楼</span><span class=\"tail-info\">2024-08-05 20:35</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150720157319,&quot;total_num&quot;:10}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(10)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:350px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:1675809499,&quot;user_name&quot;:&quot;\\u770b\\u5ba255330496&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.4609953f.IyqbokUV5y5iysEGEfoANw?t=1544099004&quot;,&quot;user_nickname&quot;:&quot;\\u9694\\u6d41\\u5149-\\u6c89\\u6696&quot;},&quot;content&quot;:{&quot;post_id&quot;:150720167658,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u6d3b\\u8be5\\uff0c\\u65e9\\u70b9\\u6b7b\\u522b\\u803d\\u8bef\\u522b\\u4eba&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:24,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:0,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:13,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150720167658\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u770b\\u5ba255330496&quot;,&quot;id&quot;:&quot;tb.1.4609953f.IyqbokUV5y5iysEGEfoANw?t=1544099004&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.4609953f.IyqbokUV5y5iysEGEfoANw?t=1544099004&amp;fr=pb\"><img username=\"看客55330496\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.4609953f.IyqbokUV5y5iysEGEfoANw?t=1544099004\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:1675809499}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u770b\\u5ba255330496&quot;,&quot;id&quot;:&quot;tb.1.4609953f.IyqbokUV5y5iysEGEfoANw?t=1544099004&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.4609953f.IyqbokUV5y5iysEGEfoANw?t=1544099004&amp;fr=pb\" target=\"_blank\">隔流光-沉暖</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150720167658\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    活该，早点死别耽误别人</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:江西</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">24楼</span><span class=\"tail-info\">2024-08-05 20:37</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150720167658,&quot;total_num&quot;:null}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:;\">回复</a><span class=\"lzl_link_fold\" style=\"display:none\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:50px\">        </div></div></div></div><div id=\"mediago-tb-pb-list-14\" data-po=\"14\"><div class=\"mediago-ad-pb-751-wrapper mediago-ad-wrapper svelte-1js710s\"><div class=\"mediago-userInfo svelte-1js710s\"><div class=\"mediago-header svelte-1js710s\"><img src=\"https://mediago-static.cdn.bcebos.com/assets/images/header/4.png\" alt=\"\" class=\"svelte-1js710s\"></div> <p class=\"mediago-nickName svelte-1js710s\">恒之旅旅行 · 效卓</p></div> <a class=\"mediago-content svelte-1js710s\" href=\"javascript:;\"><div class=\"mediago-title svelte-1js710s\">贵州旅游，5天4晚，11680元/两人，吃住行全包！(内附行程+费用)</div> <div class=\"mediago-desc svelte-1js710s\">贵州旅游，5天4晚，11680元/两人，吃住行全包！(内附行程+费用)</div> <div class=\"mediago-checkBtn svelte-1js710s\">立即查看</div> <img class=\"mediago-img svelte-1js710s\" src=\"https://s3m7.fenxi.com/galileo/ff7b2116e1177e3ea15886b4d362ffb5.jpg\" alt=\"\"></a> <div class=\"mediago-footer svelte-1js710s\"><span class=\"mediago-date svelte-1js710s\">2024-08-06 19:14:02</span> <span class=\"mediago-ad svelte-1js710s\">广告</span></div> <div class=\"mediago-close svelte-1js710s\"></div> </div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:2722375717,&quot;user_name&quot;:&quot;ghcfg435383&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.4538e251.VyaxjyqP_87JvDbn7EM5Zw?t=1561737555&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150720880945,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u5bf9\\u81ea\\u5df1\\u95ed\\u53e3\\u4e0d\\u8c08\\uff0c<img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon1.png\\&quot; >\\u4e0d\\u597d\\u8bc4\\u4ef7&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:25,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:0,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:14,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150720880945\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;ghcfg435383&quot;,&quot;id&quot;:&quot;tb.1.4538e251.VyaxjyqP_87JvDbn7EM5Zw?t=1561737555&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.4538e251.VyaxjyqP_87JvDbn7EM5Zw?t=1561737555&amp;fr=pb\"><img username=\"ghcfg435383\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.4538e251.VyaxjyqP_87JvDbn7EM5Zw?t=1561737555\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:2722375717}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;ghcfg435383&quot;,&quot;id&quot;:&quot;tb.1.4538e251.VyaxjyqP_87JvDbn7EM5Zw?t=1561737555&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.4538e251.VyaxjyqP_87JvDbn7EM5Zw?t=1561737555&amp;fr=pb\" target=\"_blank\">最后的轻语7</a>\n\n                </li>\n                            <li class=\"d_icons\">\n                <span class=\"icon_wrap  icon_wrap_theme1 d_pb_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1722691615) no-repeat -3800px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"starmaster\" data-field=\"{&quot;name&quot;:&quot;starmaster&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u624b\\u6e380\\u661f\\u8fbe\\u4eba&quot;,&quot;intro&quot;:&quot;\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~&quot;,&quot;intro_url&quot;:&quot;https:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;amp;ie=utf-8&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,76&quot;,&quot;2&quot;:&quot;1722691615,77&quot;,&quot;3&quot;:&quot;1722691615,78&quot;,&quot;4&quot;:&quot;1722691615,79&quot;,&quot;5&quot;:&quot;1722691615,80&quot;,&quot;6&quot;:&quot;1722691615,81&quot;}}\" target=\"_blank\" href=\"https://tieba.baidu.com/f?kw=玩家认证&amp;ie=utf-8\" class=\"j_icon_slot\" title=\"手游0星达人\" locate=\"starmaster_1#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span>\n\n            </li>\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150720880945\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    对自己闭口不谈，<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon1.png\">不好评价</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:安徽</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">25楼</span><span class=\"tail-info\">2024-08-05 22:54</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150720880945,&quot;total_num&quot;:null}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:;\">回复</a><span class=\"lzl_link_fold\" style=\"display:none\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:50px\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:268901979,&quot;user_name&quot;:&quot;504033200&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.6c7cf56.0mvtm0etz7-GpiSsGFAHAw?t=1511015774&quot;,&quot;user_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_0AS9RWN&quot;},&quot;content&quot;:{&quot;post_id&quot;:150720893069,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u518d\\u53db\\u9006\\u4e5f\\u4e0d\\u81f3\\u4e8e\\u5bfb\\u6b7b<br>\\u786c\\u8981\\u6b7b\\u90a3\\u5c31\\u6ee1\\u8db3\\u4f60\\u5f53\\u4f60\\u6b7b\\u4e86&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:26,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:0,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:15,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150720893069\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;504033200&quot;,&quot;id&quot;:&quot;tb.1.6c7cf56.0mvtm0etz7-GpiSsGFAHAw?t=1511015774&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.6c7cf56.0mvtm0etz7-GpiSsGFAHAw?t=1511015774&amp;fr=pb\"><img username=\"504033200\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.6c7cf56.0mvtm0etz7-GpiSsGFAHAw?t=1511015774\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:268901979}\">\n                    <span class=\"pre_icon_wrap pre_icon_wrap_theme1 d_name_icon\"><a class=\"icon_tbworld icon-crown-year-v5\" href=\"/tbmall/tshow\" data-field=\"{&quot;user_id&quot;:268901979}\" target=\"_blank\" title=\"贴吧超级会员\"></a></span>\n                    <a data-field=\"{&quot;un&quot;:&quot;504033200&quot;,&quot;id&quot;:&quot;tb.1.6c7cf56.0mvtm0etz7-GpiSsGFAHAw?t=1511015774&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card vip_red \" href=\"/home/main?id=tb.1.6c7cf56.0mvtm0etz7-GpiSsGFAHAw?t=1511015774&amp;fr=pb\" target=\"_blank\">贴吧用户_0AS9RWN</a>\n\n                </li>\n                            <li class=\"d_icons\">\n                <span class=\"icon_wrap  icon_wrap_theme1 d_pb_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/102_14.png?stamp=1722691615) no-repeat -850px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"shuangyu\" data-field=\"{&quot;name&quot;:&quot;shuangyu&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:102,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u53cc\\u9c7c\\u5ea7\\u5370\\u8bb0&quot;,&quot;intro&quot;:&quot;\\u83b7\\u53d6\\u89c4\\u5219\\uff1a\\u5728\\u661f\\u5ea7\\u52cb\\u7ae0\\u9986\\u4e2d\\u83b7\\u5f97\\u3002&quot;,&quot;intro_url&quot;:&quot;https:\\/\\/tieba.baidu.com\\/f?ie=utf-8&amp;amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;amp;fr=search&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,17&quot;}}\" target=\"_blank\" href=\"https://tieba.baidu.com/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search\" class=\"j_icon_slot\" title=\"双鱼座印记\" locate=\"shuangyu_1#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span>\n\n            </li>\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon2\" title=\"本吧头衔5级，经验值53，点击进入等级头衔说明页\"><div class=\"d_badge_title \">活跃吧友</div><div class=\"d_badge_lv\">5</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg save_face_bg_2\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150720893069\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    再叛逆也不至于寻死<br>硬要死那就满足你当你死了</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:广西</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">26楼</span><span class=\"tail-info\">2024-08-05 22:57</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150720893069,&quot;total_num&quot;:null}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:;\">回复</a><span class=\"lzl_link_fold\" style=\"display:none\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:50px\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:3528523519,&quot;user_name&quot;:&quot;\\u540d\\u5b57\\u88ab\\u82df\\u62a2\\u4e86&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.4cc24591.2381pvOIr-D0Zc1KcnUd5g?t=1562259337&quot;,&quot;user_nickname&quot;:&quot;\\u6211\\u5c31\\u662f\\u9c7c\\ud83d\\udc36&quot;},&quot;content&quot;:{&quot;post_id&quot;:150720924881,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;xxn\\u7684\\u8bdd\\u4e00\\u4e2a\\u6807\\u70b9\\u7b26\\u53f7\\u90fd\\u4e0d\\u80fd\\u4fe1&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:27,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:0,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:16,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150720924881\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u540d\\u5b57\\u88ab\\u82df\\u62a2\\u4e86&quot;,&quot;id&quot;:&quot;tb.1.4cc24591.2381pvOIr-D0Zc1KcnUd5g?t=1562259337&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.4cc24591.2381pvOIr-D0Zc1KcnUd5g?t=1562259337&amp;fr=pb\"><img username=\"名字被苟抢了\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.4cc24591.2381pvOIr-D0Zc1KcnUd5g?t=1562259337\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:3528523519}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u540d\\u5b57\\u88ab\\u82df\\u62a2\\u4e86&quot;,&quot;id&quot;:&quot;tb.1.4cc24591.2381pvOIr-D0Zc1KcnUd5g?t=1562259337&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.4cc24591.2381pvOIr-D0Zc1KcnUd5g?t=1562259337&amp;fr=pb\" target=\"_blank\">我就是鱼<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/2-2.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a>\n\n                </li>\n                            <li class=\"d_icons\">\n                <span class=\"icon_wrap  icon_wrap_theme1 d_pb_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1722691615) no-repeat -3900px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"starmaster\" data-field=\"{&quot;name&quot;:&quot;starmaster&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u624b\\u6e380\\u661f\\u8fbe\\u4eba&quot;,&quot;intro&quot;:&quot;\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~&quot;,&quot;intro_url&quot;:&quot;https:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;amp;ie=utf-8&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;3&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,76&quot;,&quot;2&quot;:&quot;1722691615,77&quot;,&quot;3&quot;:&quot;1722691615,78&quot;,&quot;4&quot;:&quot;1722691615,79&quot;,&quot;5&quot;:&quot;1722691615,80&quot;,&quot;6&quot;:&quot;1722691615,81&quot;}}\" target=\"_blank\" href=\"https://tieba.baidu.com/f?kw=玩家认证&amp;ie=utf-8\" class=\"j_icon_slot\" title=\"手游0星达人\" locate=\"starmaster_3#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span>\n\n            </li>\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150720924881\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    xxn的话一个标点符号都不能信</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:广西</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">27楼</span><span class=\"tail-info\">2024-08-05 23:03</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150720924881,&quot;total_num&quot;:null}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:;\">回复</a><span class=\"lzl_link_fold\" style=\"display:none\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:50px\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:1340153282,&quot;user_name&quot;:&quot;Fluorine_09&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.54893bfc.sdJcp1uSvufa6TDIBZHD4w?t=1625562261&quot;,&quot;user_nickname&quot;:&quot;\\u96f6\\u4e5d-&quot;},&quot;content&quot;:{&quot;post_id&quot;:150720938333,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u6545\\u4e8b\\u592a\\u8fc7\\u4e8e\\u79bb\\u8c31\\uff0c\\u662f\\u6ca1\\u8bb2\\u5b8c\\u8fd8\\u662f\\u7f16\\u7684&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:28,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:5,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:17,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150720938333\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;Fluorine_09&quot;,&quot;id&quot;:&quot;tb.1.54893bfc.sdJcp1uSvufa6TDIBZHD4w?t=1625562261&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.54893bfc.sdJcp1uSvufa6TDIBZHD4w?t=1625562261&amp;fr=pb\"><img username=\"Fluorine_09\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.54893bfc.sdJcp1uSvufa6TDIBZHD4w?t=1625562261\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:1340153282}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;Fluorine_09&quot;,&quot;id&quot;:&quot;tb.1.54893bfc.sdJcp1uSvufa6TDIBZHD4w?t=1625562261&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.54893bfc.sdJcp1uSvufa6TDIBZHD4w?t=1625562261&amp;fr=pb\" target=\"_blank\">零九-</a>\n\n                </li>\n                            <li class=\"d_icons\">\n                <span class=\"icon_wrap  icon_wrap_theme1 d_pb_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1722691615) no-repeat -3800px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"starmaster\" data-field=\"{&quot;name&quot;:&quot;starmaster&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u624b\\u6e380\\u661f\\u8fbe\\u4eba&quot;,&quot;intro&quot;:&quot;\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~&quot;,&quot;intro_url&quot;:&quot;https:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;amp;ie=utf-8&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,76&quot;,&quot;2&quot;:&quot;1722691615,77&quot;,&quot;3&quot;:&quot;1722691615,78&quot;,&quot;4&quot;:&quot;1722691615,79&quot;,&quot;5&quot;:&quot;1722691615,80&quot;,&quot;6&quot;:&quot;1722691615,81&quot;}}\" target=\"_blank\" href=\"https://tieba.baidu.com/f?kw=玩家认证&amp;ie=utf-8\" class=\"j_icon_slot\" title=\"手游0星达人\" locate=\"starmaster_1#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span>\n\n            </li>\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150720938333\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    故事太过于离谱，是没讲完还是编的</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:湖北</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">28楼</span><span class=\"tail-info\">2024-08-05 23:05</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150720938333,&quot;total_num&quot;:5}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(5)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:350px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:2930503903,&quot;user_name&quot;:&quot;\\u7b11\\u5e73\\u5929\\u5c0a\\u5468\\u9752&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.cc051293.WYWYVC3tzWJTfmykMXGnug&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150721080925,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u5979\\u7684\\u6bcd\\u4eb2\\u4ece\\u524d\\u90a3\\u4e48\\u5e0c\\u671b\\u8fd9\\u4e2a\\u5bb6\\u548c\\u597d\\uff0c\\u5bf9\\u5973\\u513f\\u4e5f\\u5f88\\u597d\\uff0c\\u7ed3\\u679c\\u7a81\\u7136\\u4e5f\\u8eb2\\u7740\\u5979<img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon68.png\\&quot; >&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:30,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:0,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:18,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150721080925\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u7b11\\u5e73\\u5929\\u5c0a\\u5468\\u9752&quot;,&quot;id&quot;:&quot;tb.1.cc051293.WYWYVC3tzWJTfmykMXGnug&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.cc051293.WYWYVC3tzWJTfmykMXGnug&amp;fr=pb\"><img username=\"笑平天尊周青\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.cc051293.WYWYVC3tzWJTfmykMXGnug\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:2930503903}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u7b11\\u5e73\\u5929\\u5c0a\\u5468\\u9752&quot;,&quot;id&quot;:&quot;tb.1.cc051293.WYWYVC3tzWJTfmykMXGnug&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.cc051293.WYWYVC3tzWJTfmykMXGnug&amp;fr=pb\" target=\"_blank\">笑平天尊周青</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150721080925\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    她的母亲从前那么希望这个家和好，对女儿也很好，结果突然也躲着她<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon68.png\"></div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:新疆</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">30楼</span><span class=\"tail-info\">2024-08-05 23:32</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150721080925,&quot;total_num&quot;:null}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:;\">回复</a><span class=\"lzl_link_fold\" style=\"display:none\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:50px\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:1464463498,&quot;user_name&quot;:&quot;love\\u591c\\u591c\\u58f0\\u58f0&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.41f05809.rY1eLvHbC7hJ3Aq7qwJD9g?t=1669184791&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150721145924,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u4e00\\u773c\\u5c31\\u662f\\u907f\\u91cd\\u5c31\\u8f7b\\uff0c\\u80fd\\u8bf4\\u7684\\u90fd\\u662f\\u6700\\u8f7b\\u7684\\u4e86&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:31,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:1,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:19,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150721145924\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;love\\u591c\\u591c\\u58f0\\u58f0&quot;,&quot;id&quot;:&quot;tb.1.41f05809.rY1eLvHbC7hJ3Aq7qwJD9g?t=1669184791&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.41f05809.rY1eLvHbC7hJ3Aq7qwJD9g?t=1669184791&amp;fr=pb\"><img username=\"love夜夜声声\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.41f05809.rY1eLvHbC7hJ3Aq7qwJD9g?t=1669184791\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:1464463498}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;love\\u591c\\u591c\\u58f0\\u58f0&quot;,&quot;id&quot;:&quot;tb.1.41f05809.rY1eLvHbC7hJ3Aq7qwJD9g?t=1669184791&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.41f05809.rY1eLvHbC7hJ3Aq7qwJD9g?t=1669184791&amp;fr=pb\" target=\"_blank\">love夜夜声声</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150721145924\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    一眼就是避重就轻，能说的都是最轻的了</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:广东</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"贴吧群时代开启，快到群里来！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?tab=qunliao\" target=\"_blank\">iPhone客户端</a></span><span class=\"tail-info\">31楼</span><span class=\"tail-info\">2024-08-05 23:45</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150721145924,&quot;total_num&quot;:1}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(1)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:110px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div id=\"mediago-tb-pb-list-20\" data-po=\"20\"><div class=\"mediago-ad-pb-751-wrapper mediago-ad-wrapper svelte-1js710s\"><div class=\"mediago-userInfo svelte-1js710s\"><div class=\"mediago-header svelte-1js710s\"><img src=\"https://mediago-static.cdn.bcebos.com/assets/images/header/3.png\" alt=\"\" class=\"svelte-1js710s\"></div> <p class=\"mediago-nickName svelte-1js710s\">聚搜小说 · 效卓</p></div> <a class=\"mediago-content svelte-1js710s\" href=\"javascript:;\"><div class=\"mediago-title svelte-1js710s\"> 超刺激的乡村小说，三分钟就会起劲！偷偷收藏熬夜看.....</div> <div class=\"mediago-desc svelte-1js710s\"> 超刺激的乡村小说，三分钟就会起劲！偷偷收藏熬夜看.....</div> <div class=\"mediago-checkBtn svelte-1js710s\">立即查看</div> <img class=\"mediago-img svelte-1js710s\" src=\"https://s3m7.fenxi.com/galileo/35d6f36d4ee97bdfaa25c8772d083384.jpg\" alt=\"\"></a> <div class=\"mediago-footer svelte-1js710s\"><span class=\"mediago-date svelte-1js710s\">2024-08-06 19:14:02</span> <span class=\"mediago-ad svelte-1js710s\">广告</span></div> <div class=\"mediago-close svelte-1js710s\"></div> </div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:920178392,&quot;user_name&quot;:&quot;\\u674e\\u6c5f\\u5e73001&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.15e87cce.ZD2ygDetwhzCJvps7_7F3w?t=1542305906&quot;,&quot;user_nickname&quot;:&quot;\\u900f\\u7834\\u82cd\\u7a79\\u25ce&quot;},&quot;content&quot;:{&quot;post_id&quot;:150721264289,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u7f51\\u4f20\\u7684\\u88ab\\u9690\\u7792\\u7684\\u53e6\\u4e00\\u90e8\\u5206\\u6545\\u4e8b\\uff0c\\u4e0d\\u4fdd\\u771f<br><img class=\\&quot;BDE_Image\\&quot; src=\\&quot;http:\\/\\/tiebapic.baidu.com\\/forum\\/w%3D580\\/sign=0b67090f0734970a47731027a5cbd1c0\\/35391a50f819861895ce2ea40ced2e738bd4e62e.jpg?tbpicau=2024-08-17-05_4357d21eaa3736dd31d72457516b3b2e\\&quot; size=\\&quot;432176\\&quot; changedsize=\\&quot;true\\&quot; width=\\&quot;560\\&quot; height=\\&quot;952\\&quot; size=\\&quot;432176\\&quot;>&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:32,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:33,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:20,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150721264289\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u674e\\u6c5f\\u5e73001&quot;,&quot;id&quot;:&quot;tb.1.15e87cce.ZD2ygDetwhzCJvps7_7F3w?t=1542305906&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.15e87cce.ZD2ygDetwhzCJvps7_7F3w?t=1542305906&amp;fr=pb\"><img username=\"李江平001\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.15e87cce.ZD2ygDetwhzCJvps7_7F3w?t=1542305906\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:920178392}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u674e\\u6c5f\\u5e73001&quot;,&quot;id&quot;:&quot;tb.1.15e87cce.ZD2ygDetwhzCJvps7_7F3w?t=1542305906&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.15e87cce.ZD2ygDetwhzCJvps7_7F3w?t=1542305906&amp;fr=pb\" target=\"_blank\">透破苍穹<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/1-2.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"></a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150721264289\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    网传的被隐瞒的另一部分故事，不保真<br><img class=\"BDE_Image\" src=\"http://tiebapic.baidu.com/forum/w%3D580/sign=0b67090f0734970a47731027a5cbd1c0/35391a50f819861895ce2ea40ced2e738bd4e62e.jpg?tbpicau=2024-08-17-05_4357d21eaa3736dd31d72457516b3b2e\" size=\"432176\" changedsize=\"true\" width=\"560\" height=\"952\"></div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <a rel=\"noopener\" class=\"l_post_anchor\" name=\"150721264289l\"></a><div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:湖南</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">32楼</span><span class=\"tail-info\">2024-08-06 00:08</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150721264289,&quot;total_num&quot;:33}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(33)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:350px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:499264613,&quot;user_name&quot;:&quot;\\u642c\\u7816\\u732b\\u5927\\u7237&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.f108677f.kgoaQSqBC9s8ZGPBxXYv6g?t=1680966876&quot;,&quot;user_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_093a15G&quot;},&quot;content&quot;:{&quot;post_id&quot;:150721264924,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u4e00\\u822c\\u4eba\\u505a\\u4e0d\\u5230\\u7684\\u7edd\\u60c5\\uff0c\\u53ef\\u7591&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:33,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:1,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:21,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150721264924\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u642c\\u7816\\u732b\\u5927\\u7237&quot;,&quot;id&quot;:&quot;tb.1.f108677f.kgoaQSqBC9s8ZGPBxXYv6g?t=1680966876&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.f108677f.kgoaQSqBC9s8ZGPBxXYv6g?t=1680966876&amp;fr=pb\"><img username=\"搬砖猫大爷\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.f108677f.kgoaQSqBC9s8ZGPBxXYv6g?t=1680966876\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:499264613}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u642c\\u7816\\u732b\\u5927\\u7237&quot;,&quot;id&quot;:&quot;tb.1.f108677f.kgoaQSqBC9s8ZGPBxXYv6g?t=1680966876&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.f108677f.kgoaQSqBC9s8ZGPBxXYv6g?t=1680966876&amp;fr=pb\" target=\"_blank\">搬砖猫表哥</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150721264924\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    一般人做不到的绝情，可疑</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:陕西</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">33楼</span><span class=\"tail-info\">2024-08-06 00:08</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150721264924,&quot;total_num&quot;:1}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(1)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:110px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:835917811,&quot;user_name&quot;:&quot;\\u5c0f\\u87f9echo&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.6297fcd9.Z24yEJoVruSOV-vzkLqmwg?t=1457665804&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150721292510,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u5feb\\u9a6c\\u52a0\\u7f16&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:35,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:0,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:22,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150721292510\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u5c0f\\u87f9echo&quot;,&quot;id&quot;:&quot;tb.1.6297fcd9.Z24yEJoVruSOV-vzkLqmwg?t=1457665804&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.6297fcd9.Z24yEJoVruSOV-vzkLqmwg?t=1457665804&amp;fr=pb\"><img username=\"小蟹echo\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.6297fcd9.Z24yEJoVruSOV-vzkLqmwg?t=1457665804\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:835917811}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u5c0f\\u87f9echo&quot;,&quot;id&quot;:&quot;tb.1.6297fcd9.Z24yEJoVruSOV-vzkLqmwg?t=1457665804&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.6297fcd9.Z24yEJoVruSOV-vzkLqmwg?t=1457665804&amp;fr=pb\" target=\"_blank\">小蟹echo</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150721292510\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    快马加编</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:四川</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">35楼</span><span class=\"tail-info\">2024-08-06 00:13</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150721292510,&quot;total_num&quot;:null}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:;\">回复</a><span class=\"lzl_link_fold\" style=\"display:none\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:50px\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:623835303,&quot;user_name&quot;:&quot;Von_Telum&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.9c64f09f.i7MNQELR7EKRmUU1sY5uDg&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150721373501,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u9ed8\\u8ba4\\u4fe1xxn\\u8bf4\\u7684\\u8bdd\\u5df2\\u7ecf\\u5f88\\u53cd\\u6620\\u73b0\\u5728\\u7684\\u73af\\u5883\\u4e86<img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon22.png\\&quot; >&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:36,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:0,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:23,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150721373501\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;Von_Telum&quot;,&quot;id&quot;:&quot;tb.1.9c64f09f.i7MNQELR7EKRmUU1sY5uDg&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.9c64f09f.i7MNQELR7EKRmUU1sY5uDg&amp;fr=pb\"><img username=\"Von_Telum\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.9c64f09f.i7MNQELR7EKRmUU1sY5uDg\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:623835303}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;Von_Telum&quot;,&quot;id&quot;:&quot;tb.1.9c64f09f.i7MNQELR7EKRmUU1sY5uDg&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.9c64f09f.i7MNQELR7EKRmUU1sY5uDg&amp;fr=pb\" target=\"_blank\">Von_Telum</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150721373501\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    默认信xxn说的话已经很反映现在的环境了<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon22.png\"></div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:上海</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"贴吧群时代开启，快到群里来！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?tab=qunliao\" target=\"_blank\">iPhone客户端</a></span><span class=\"tail-info\">36楼</span><span class=\"tail-info\">2024-08-06 00:30</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150721373501,&quot;total_num&quot;:null}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:;\">回复</a><span class=\"lzl_link_fold\" style=\"display:none\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:50px\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:6681500957,&quot;user_name&quot;:&quot;&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.c5912c6a.uP2yV0JF6CPsRTTrLjoiyQ?t=1721308695&quot;,&quot;user_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_JR5CRAD&quot;},&quot;content&quot;:{&quot;post_id&quot;:150721416262,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u9019\\u662f\\u6700\\u5f8c\\u4e00\\u500b\\u6559\\u8a13\\u4e86<br>\\u7236\\u89aa\\u7d66\\u7684\\u6700\\u5f8c\\u4e00\\u500b\\u6559\\u8a13\\uff0c\\u505c\\u6b62\\u4e86\\u4f60\\u7684\\u53cd\\u53db\\u671f\\uff0c\\u6c38\\u4e45\\u6709\\u6548&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:37,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:0,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:24,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150721416262\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;&quot;,&quot;id&quot;:&quot;tb.1.c5912c6a.uP2yV0JF6CPsRTTrLjoiyQ?t=1721308695&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.c5912c6a.uP2yV0JF6CPsRTTrLjoiyQ?t=1721308695&amp;fr=pb\"><img username=\"\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.c5912c6a.uP2yV0JF6CPsRTTrLjoiyQ?t=1721308695\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:6681500957}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;&quot;,&quot;id&quot;:&quot;tb.1.c5912c6a.uP2yV0JF6CPsRTTrLjoiyQ?t=1721308695&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.c5912c6a.uP2yV0JF6CPsRTTrLjoiyQ?t=1721308695&amp;fr=pb\" target=\"_blank\">贴吧用户_JR5CRAD</a>\n\n                </li>\n                            <li class=\"d_icons\">\n                <span class=\"icon_wrap  icon_wrap_theme1 d_pb_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/107_14.png?stamp=1722691615) no-repeat -5450px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"shoucihuitie\" data-field=\"{&quot;name&quot;:&quot;shoucihuitie&quot;,&quot;end_time&quot;:&quot;1726493625&quot;,&quot;category_id&quot;:107,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u9996\\u6b21\\u56de\\u8d34&quot;,&quot;intro&quot;:&quot;\\u9996\\u6b21\\u56de\\u8d34&quot;,&quot;intro_url&quot;:&quot;https:\\/\\/tieba.baidu.com\\/wxf\\/324179?kw=%E5%8D%B0%E8%AE%B0&amp;amp;fr=frsshare&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,109&quot;}}\" target=\"_blank\" href=\"https://tieba.baidu.com/wxf/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare\" class=\"j_icon_slot\" title=\"首次回贴\" locate=\"shoucihuitie_1#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span>\n\n            </li>\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150721416262\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    這是最後一個教訓了<br>父親給的最後一個教訓，停止了你的反叛期，永久有效</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:中国香港</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">37楼</span><span class=\"tail-info\">2024-08-06 00:39</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150721416262,&quot;total_num&quot;:null}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:;\">回复</a><span class=\"lzl_link_fold\" style=\"display:none\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:50px\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:1389861394,&quot;user_name&quot;:&quot;\\u6210\\u4e3a\\u70e4\\u9c7c\\u7684\\u5bff\\u53f8&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.ca33f846.iS5jXWtsKaLoMQLQ6CjTCA?t=1411422751&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150721417158,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u7f16&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:38,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:0,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:25,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150721417158\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u6210\\u4e3a\\u70e4\\u9c7c\\u7684\\u5bff\\u53f8&quot;,&quot;id&quot;:&quot;tb.1.ca33f846.iS5jXWtsKaLoMQLQ6CjTCA?t=1411422751&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.ca33f846.iS5jXWtsKaLoMQLQ6CjTCA?t=1411422751&amp;fr=pb\"><img username=\"成为烤鱼的寿司\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.ca33f846.iS5jXWtsKaLoMQLQ6CjTCA?t=1411422751\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:1389861394}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u6210\\u4e3a\\u70e4\\u9c7c\\u7684\\u5bff\\u53f8&quot;,&quot;id&quot;:&quot;tb.1.ca33f846.iS5jXWtsKaLoMQLQ6CjTCA?t=1411422751&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.ca33f846.iS5jXWtsKaLoMQLQ6CjTCA?t=1411422751&amp;fr=pb\" target=\"_blank\">成为烤鱼的寿司</a>\n\n                </li>\n                            <li class=\"d_icons\">\n                <span class=\"icon_wrap  icon_wrap_theme1 d_pb_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1722691615) no-repeat -3800px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"starmaster\" data-field=\"{&quot;name&quot;:&quot;starmaster&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u624b\\u6e380\\u661f\\u8fbe\\u4eba&quot;,&quot;intro&quot;:&quot;\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~&quot;,&quot;intro_url&quot;:&quot;https:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;amp;ie=utf-8&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,76&quot;,&quot;2&quot;:&quot;1722691615,77&quot;,&quot;3&quot;:&quot;1722691615,78&quot;,&quot;4&quot;:&quot;1722691615,79&quot;,&quot;5&quot;:&quot;1722691615,80&quot;,&quot;6&quot;:&quot;1722691615,81&quot;}}\" target=\"_blank\" href=\"https://tieba.baidu.com/f?kw=玩家认证&amp;ie=utf-8\" class=\"j_icon_slot\" title=\"手游0星达人\" locate=\"starmaster_1#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span>\n\n            </li>\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150721417158\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    编</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:河北</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">38楼</span><span class=\"tail-info\">2024-08-06 00:39</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150721417158,&quot;total_num&quot;:null}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:;\">回复</a><span class=\"lzl_link_fold\" style=\"display:none\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:50px\">        </div></div></div></div><div id=\"mediago-tb-pb-list-26\" data-po=\"26\"><div class=\"mediago-ad-pb-751-wrapper mediago-ad-wrapper svelte-1js710s\"><div class=\"mediago-userInfo svelte-1js710s\"><div class=\"mediago-header svelte-1js710s\"><img src=\"https://mediago-static.cdn.bcebos.com/assets/images/header/5.png\" alt=\"\" class=\"svelte-1js710s\"></div> <p class=\"mediago-nickName svelte-1js710s\">0充值打金 · 效卓</p></div> <a class=\"mediago-content svelte-1js710s\" href=\"javascript:;\"><div class=\"mediago-title svelte-1js710s\">刷定制地图，领绝版神装，这款游戏打金玩到你手软！</div> <div class=\"mediago-desc svelte-1js710s\">刷定制地图，领绝版神装，这款游戏打金玩到你手软！</div> <div class=\"mediago-checkBtn svelte-1js710s\">立即查看</div> <img class=\"mediago-img svelte-1js710s\" src=\"https://s3m.mediav.com/galileo/80f648af3fa8f7e0e721e99de230a59e.gif\" alt=\"\"></a> <div class=\"mediago-footer svelte-1js710s\"><span class=\"mediago-date svelte-1js710s\">2024-08-06 19:14:02</span> <span class=\"mediago-ad svelte-1js710s\">广告</span></div> <div class=\"mediago-close svelte-1js710s\"></div> </div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:2533708613,&quot;user_name&quot;:&quot;\\u9a57\\u6867&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.a49055e4.wpVV9AcAit8xDO8kaisTKA&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150721423765,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u54c7\\uff0c\\u662f\\u6ca1\\u5934\\u6ca1\\u5c3e\\u7684\\u8bb2\\u6545\\u4e8b\\uff0c\\u751a\\u81f3\\u6bd4\\u804a\\u5929\\u8bb0\\u5f55\\u8fd8\\u5e72\\u51c0\\uff0c\\u8fd9\\u4e0b\\u4e0d\\u5f97\\u4e0d\\u4fe1\\u4e86&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:39,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:2,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:26,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150721423765\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u9a57\\u6867&quot;,&quot;id&quot;:&quot;tb.1.a49055e4.wpVV9AcAit8xDO8kaisTKA&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.a49055e4.wpVV9AcAit8xDO8kaisTKA&amp;fr=pb\"><img username=\"驗桧\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.a49055e4.wpVV9AcAit8xDO8kaisTKA\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:2533708613}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u9a57\\u6867&quot;,&quot;id&quot;:&quot;tb.1.a49055e4.wpVV9AcAit8xDO8kaisTKA&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.a49055e4.wpVV9AcAit8xDO8kaisTKA&amp;fr=pb\" target=\"_blank\">驗桧</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150721423765\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    哇，是没头没尾的讲故事，甚至比聊天记录还干净，这下不得不信了</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:湖北</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">39楼</span><span class=\"tail-info\">2024-08-06 00:40</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150721423765,&quot;total_num&quot;:2}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(2)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:170px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:248758732,&quot;user_name&quot;:&quot;Evn\\u94f6&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.f39b2b39._08jqKnzwtPdpsEErk93EQ?t=1716122751&quot;,&quot;user_nickname&quot;:&quot;\\u8bb0\\u5f97\\u5403\\u996d\\u634f\\ud83d\\udca7&quot;},&quot;content&quot;:{&quot;post_id&quot;:150721446041,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;<img class=\\&quot;BDE_Image\\&quot; src=\\&quot;http:\\/\\/tiebapic.baidu.com\\/forum\\/w%3D580\\/sign=bd471ee85c4c510faec4e21250592528\\/8f017755564e9258eb0a46ceda82d158ccbf4efc.jpg?tbpicau=2024-08-17-05_d4a6331925ea979b02662706b77c9268\\&quot; size=\\&quot;187253\\&quot; width=\\&quot;480\\&quot; height=\\&quot;998\\&quot; size=\\&quot;187253\\&quot;>&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:40,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:2,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:27,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150721446041\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;Evn\\u94f6&quot;,&quot;id&quot;:&quot;tb.1.f39b2b39._08jqKnzwtPdpsEErk93EQ?t=1716122751&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.f39b2b39._08jqKnzwtPdpsEErk93EQ?t=1716122751&amp;fr=pb\"><img username=\"Evn银\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.f39b2b39._08jqKnzwtPdpsEErk93EQ?t=1716122751\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:248758732}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;Evn\\u94f6&quot;,&quot;id&quot;:&quot;tb.1.f39b2b39._08jqKnzwtPdpsEErk93EQ?t=1716122751&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.f39b2b39._08jqKnzwtPdpsEErk93EQ?t=1716122751&amp;fr=pb\" target=\"_blank\">蓝染暗恋千神</a>\n\n                </li>\n                            <li class=\"d_icons\">\n                <span class=\"icon_wrap  icon_wrap_theme1 d_pb_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1722691615) no-repeat -4000px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"starmaster\" data-field=\"{&quot;name&quot;:&quot;starmaster&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u624b\\u6e380\\u661f\\u8fbe\\u4eba&quot;,&quot;intro&quot;:&quot;\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~&quot;,&quot;intro_url&quot;:&quot;https:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;amp;ie=utf-8&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;5&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,76&quot;,&quot;2&quot;:&quot;1722691615,77&quot;,&quot;3&quot;:&quot;1722691615,78&quot;,&quot;4&quot;:&quot;1722691615,79&quot;,&quot;5&quot;:&quot;1722691615,80&quot;,&quot;6&quot;:&quot;1722691615,81&quot;}}\" target=\"_blank\" href=\"https://tieba.baidu.com/f?kw=玩家认证&amp;ie=utf-8\" class=\"j_icon_slot\" title=\"手游0星达人\" locate=\"starmaster_5#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span>\n\n            </li>\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值0，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150721446041\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    <img class=\"BDE_Image\" src=\"http://tiebapic.baidu.com/forum/w%3D580/sign=bd471ee85c4c510faec4e21250592528/8f017755564e9258eb0a46ceda82d158ccbf4efc.jpg?tbpicau=2024-08-17-05_d4a6331925ea979b02662706b77c9268\" size=\"187253\" width=\"480\" height=\"998\"></div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:湖北</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"贴吧群时代开启，快到群里来！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?tab=qunliao\" target=\"_blank\">iPhone客户端</a></span><span class=\"tail-info\">40楼</span><span class=\"tail-info\">2024-08-06 00:46</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150721446041,&quot;total_num&quot;:2}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(2)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:170px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:5413858426,&quot;user_name&quot;:&quot;MaxwellClancy&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.d4be2b0e.wZ16-fZMVst67Z3hv6VaBg&quot;,&quot;user_nickname&quot;:null},&quot;content&quot;:{&quot;post_id&quot;:150721473274,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u53db\\u9006\\u671f\\uff0c\\u662f\\u6211\\u61c2\\u7684\\u90a3\\u4e2a\\u5417?<br>\\u5c31\\u662f\\u5492\\u4ed6\\u7238\\u8981\\u6b7b\\u8fd8\\u627e\\u70c2\\u4ed4\\u6765\\u5bf9\\u4ed8\\u4ed6\\u7238\\uff0c\\u7ed9\\u4eba\\u5f53\\u8857\\u4e00\\u987f\\u6253\\u81ea\\u5df1\\u8dd1\\u8def\\u4e86\\u90a3\\u4e2a\\u5417?<br>\\u8981\\u6211\\u8bf4\\uff0c\\u7236\\u6bcd\\u90fd\\u4f53\\u73b0\\u51fa\\u6700\\u5927\\u7684\\u65af\\u6587\\u548c\\u5fcd\\u8ba9\\u4e86\\uff0c\\u6362\\u4f5c\\u7d20\\u8d28\\u4f4e\\u70b9\\u7684\\u53ef\\u80fd\\u7259\\u9f7f\\u90fd\\u7ed9\\u4eba\\u5e72\\u788e\\u4e86\\u3002&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:41,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:1,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:28,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150721473274\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;MaxwellClancy&quot;,&quot;id&quot;:&quot;tb.1.d4be2b0e.wZ16-fZMVst67Z3hv6VaBg&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.d4be2b0e.wZ16-fZMVst67Z3hv6VaBg&amp;fr=pb\"><img username=\"MaxwellClancy\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.d4be2b0e.wZ16-fZMVst67Z3hv6VaBg\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:5413858426}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;MaxwellClancy&quot;,&quot;id&quot;:&quot;tb.1.d4be2b0e.wZ16-fZMVst67Z3hv6VaBg&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.d4be2b0e.wZ16-fZMVst67Z3hv6VaBg&amp;fr=pb\" target=\"_blank\">MaxwellClancy</a>\n\n                </li>\n\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔2级，经验值5，点击进入等级头衔说明页\"><div class=\"d_badge_title \">中级粉丝</div><div class=\"d_badge_lv\">2</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150721473274\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    叛逆期，是我懂的那个吗?<br>就是咒他爸要死还找烂仔来对付他爸，给人当街一顿打自己跑路了那个吗?<br>要我说，父母都体现出最大的斯文和忍让了，换作素质低点的可能牙齿都给人干碎了。</div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:广西</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">41楼</span><span class=\"tail-info\">2024-08-06 00:52</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150721473274,&quot;total_num&quot;:1}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:none;\">回复(1)</a><span class=\"lzl_link_fold\" style=\"display:\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:110px\">        <img class=\"loading_reply\" src=\"//tb2.bdstatic.com/tb/static-pb/img/loading_69032b0.gif\">        </div></div></div></div><div class=\"l_post l_post_bright j_l_post clearfix  \" data-field=\"{&quot;author&quot;:{&quot;user_id&quot;:6559118536,&quot;user_name&quot;:&quot;\\u68a6\\u56de\\u98ce\\u534e\\u7edd\\u4ee3&quot;,&quot;props&quot;:null,&quot;portrait&quot;:&quot;tb.1.f77e9cad.neXUXYby-7LwI3c0AZsfDQ?t=1711466396&quot;,&quot;user_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_J5ZAPJA&quot;},&quot;content&quot;:{&quot;post_id&quot;:150721484814,&quot;is_anonym&quot;:false,&quot;forum_id&quot;:27927174,&quot;thread_id&quot;:9117905169,&quot;content&quot;:&quot;\\u81ea\\u5df1\\u72af\\u8d31\\u80fd\\u602a\\u8c01\\u5462<img class=\\&quot;BDE_Smiley\\&quot; width=\\&quot;30\\&quot; height=\\&quot;30\\&quot; changedsize=\\&quot;false\\&quot; src=\\&quot;https:\\/\\/gsp0.baidu.com\\/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\\/tb\\/editor\\/images\\/client\\/image_emoticon2.png\\&quot; >&quot;,&quot;isPlus&quot;:0,&quot;builderId&quot;:3424043879,&quot;post_no&quot;:42,&quot;type&quot;:&quot;0&quot;,&quot;comment_num&quot;:0,&quot;is_fold&quot;:0,&quot;props&quot;:null,&quot;post_index&quot;:29,&quot;pb_tpoint&quot;:null}}\" data-pid=\"150721484814\">                    <div class=\"d_author\">                <ul class=\"p_author\">\n                <li class=\"icon\">\n                    <div class=\"icon_relative j_user_card\" data-field=\"{&quot;un&quot;:&quot;\\u68a6\\u56de\\u98ce\\u534e\\u7edd\\u4ee3&quot;,&quot;id&quot;:&quot;tb.1.f77e9cad.neXUXYby-7LwI3c0AZsfDQ?t=1711466396&quot;}\">\n                        <a style=\"\" target=\"_blank\" class=\"p_author_face \" href=\"/home/main?id=tb.1.f77e9cad.neXUXYby-7LwI3c0AZsfDQ?t=1711466396&amp;fr=pb\"><img username=\"梦回风华绝代\" class=\"\" src=\"//tb2.bdstatic.com/tb/static-pb/img/head_80.jpg\" data-tb-lazyload=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.f77e9cad.neXUXYby-7LwI3c0AZsfDQ?t=1711466396\"></a>\n\n                    </div>\n                </li>\n                <li class=\"d_nameplate\">\n\n                </li>\n                <li class=\"d_name\" data-field=\"{&quot;user_id&quot;:6559118536}\">\n\n                    <a data-field=\"{&quot;un&quot;:&quot;\\u68a6\\u56de\\u98ce\\u534e\\u7edd\\u4ee3&quot;,&quot;id&quot;:&quot;tb.1.f77e9cad.neXUXYby-7LwI3c0AZsfDQ?t=1711466396&quot;}\" alog-group=\"p_author\" class=\"p_author_name j_user_card\" href=\"/home/main?id=tb.1.f77e9cad.neXUXYby-7LwI3c0AZsfDQ?t=1711466396&amp;fr=pb\" target=\"_blank\">百里逐星</a>\n\n                </li>\n                            <li class=\"d_icons\">\n                <span class=\"icon_wrap  icon_wrap_theme1 d_pb_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/107_14.png?stamp=1722691615) no-repeat -5400px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"shoucifaite\" data-field=\"{&quot;name&quot;:&quot;shoucifaite&quot;,&quot;end_time&quot;:&quot;1724258983&quot;,&quot;category_id&quot;:107,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u9996\\u6b21\\u53d1\\u8d34&quot;,&quot;intro&quot;:&quot;\\u9996\\u6b21\\u53d1\\u8d34&quot;,&quot;intro_url&quot;:&quot;https:\\/\\/tieba.baidu.com\\/wxf\\/324179?kw=%E5%8D%B0%E8%AE%B0&amp;amp;fr=frsshare&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,108&quot;}}\" target=\"_blank\" href=\"https://tieba.baidu.com/wxf/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare\" class=\"j_icon_slot\" title=\"首次发贴\" locate=\"shoucifaite_1#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span>\n\n            </li>\n                <li class=\"l_badge\" style=\"display:block;\">\n                    <div class=\"p_badge\">\n                        <a href=\"/f/like/level?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8&amp;lv_t=lv_nav_intro\" target=\"_blank\" class=\"user_badge d_badge_bright d_badge_icon1\" title=\"本吧头衔1级，经验值1，点击进入等级头衔说明页\"><div class=\"d_badge_title \">初级粉丝</div><div class=\"d_badge_lv\">1</div></a>\n                    </div>\n                </li>\n            </ul></div><div class=\"d_post_content_main \" data-author=\"0\">            <div class=\"p_content  \">                <div class=\"save_face_bg_hidden save_face_bg_0\"><a rel=\"noopener\" class=\"save_face_card\"></a></div>                <cc>            <div class=\"j_ueg_post_content p_forbidden_tip\" style=\"display:none;\">该楼层疑似违规已被系统折叠&nbsp;<a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_unfold\" style=\"display:;\">隐藏此楼</a><a rel=\"noopener\" href=\"###\" class=\"p_forbidden_post_content_fold\" style=\"display:none;\">查看此楼</a></div><div id=\"post_content_150721484814\" class=\"d_post_content j_d_post_content \" style=\"display:;\">                    自己犯贱能怪谁呢<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon2.png\"></div><br>                            </cc>        <br>        <div class=\"user-hide-post-down\" style=\"display: none;\"></div>                </div>    <div class=\"core_reply j_lzl_wrapper\"><div class=\"core_reply_tail clearfix\"><div class=\"post-tail-wrap\"><span>IP属地:浙江</span><span class=\"question-image\"></span><span class=\"j_jb_ele\"><a rel=\"noopener\" href=\"###\" class=\"tail-info\" data-checkun=\"un\"><img class=\"icon-jubao\" src=\"//tb2.bdstatic.com/tb/static-pb/img/jubao_button_4ee5c4f.png\"></a></span><span class=\"tail-info\">来自<a rel=\"noopener\" data-tip=\"超萌态动画表情来袭，速度抢先体验！\" href=\"http://c.tieba.baidu.com/c/s/download/pc?src=webtbGF\" target=\"_blank\">Android客户端</a></span><span class=\"tail-info\">42楼</span><span class=\"tail-info\">2024-08-06 00:55</span><div class=\"j_lzl_r p_reply\" data-field=\"{&quot;pid&quot;:150721484814,&quot;total_num&quot;:null}\"><a rel=\"noopener\" href=\"#\" class=\"lzl_link_unfold\" style=\"display:;\">回复</a><span class=\"lzl_link_fold\" style=\"display:none\">收起回复</span></div></div><ul class=\"p_props_tail props_appraise_wrap\"></ul></div><div class=\"j_lzl_container core_reply_wrapper hideLzl\" style=\"min-height:50px\">        </div></div></div></div></div></div><div class=\"right_section right_bright\"><div id=\"celebrity\" class=\"region_bright celebrity\" data-region=\"\" data-mod_type=\"\"><h4 class=\"region_header clearfix\">        <span class=\"pull_right j_op\"> </span></h4><div class=\"region_cnt clearfix\"><div class=\"intro\"><div class=\"col2-left\"><a class=\"gift-wrapper j-gift-buy\" href=\"javascript:;\"><span class=\"gift\"><img src=\"http://tb2.bdstatic.com/tb/static-user/widget/celebrity/img/single_member_100_8a10f9f.png\"></span>皇冠身份</a></div><div class=\"col2-right\"><ul class=\"privilege-list\"><li><i class=\"icon icon-red-thread-title\"></i>发贴红色标题</li><li><i class=\"icon icon-red-name\"></i>显示红名</li><li><i class=\"icon icon-sign-exp\"></i>签到六倍经验</li></ul></div></div><div class=\"more-privilege-container\"><div class=\"first-show-container\"><button class=\"purchase-member-btn j-gift-buy\">兑换本吧会员</button></div></div><p class=\"gray-text\">赠送补签卡1张，获得<a href=\"#\" class=\"celebrity-purchase-exp\" onclick=\"return false\" target=\"_blank\">[经验书购买权]</a></p></div><div class=\"region_footer\"></div></div>    <div id=\"my_tieba_mod\" class=\"region_bright my_tieba_mod \" data-region=\"\" data-mod_type=\"\"><h4 class=\"region_header clearfix\">        我在贴吧<span class=\"pull_right j_op\"> </span></h4><div class=\"region_cnt clearfix\">                <div class=\"media_horizontal clearfix \" id=\"user_info\"><a class=\"media_left\" style=\"\" href=\"/home/main?id=tb.1.e6057aec.PmFeyCvKVx0KZKdGZ2v9oA?t=1420595544&amp;fr=pb\" target=\"_blank\"><img class=\"head_img\" src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.e6057aec.PmFeyCvKVx0KZKdGZ2v9oA?t=1420595544\"></a><div class=\"media_right\">            <div class=\"user_name text_overflow\">                <span class=\"pre_icon_wrap pre_icon_wrap_theme2 \"><a class=\"icon_tbworld icon-crown-super-non1\" href=\"/tbmall/tshow\" target=\"_blank\" title=\"贴吧超级会员\"></a></span><a class=\"\" id=\"nameValue\" title=\"\" href=\"/home/main?id=tb.1.e6057aec.PmFeyCvKVx0KZKdGZ2v9oA?t=1420595544&amp;fr=pb\" target=\"_blank\" data-field=\"{&quot;user_id&quot;:null}\">抗压吧吧务666</a></div>            <div class=\"user_score\"><i class=\"                    icon_tbean yy-icon                    \"></i><a class=\"orange_text score_num j_score_num\" href=\"#\" onclick=\"return false\">                    0</a><a id=\"j_tcharge_dialog\" href=\"javascript:;\">[获取]</a></div>                                    <div class=\"user_tbmall clearfix\">                    <span class=\"icon_wrap  icon_wrap_theme1 balv_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1722691615) no-repeat -3800px  0;top:0px;left:0px\" data-slot=\"1\" data-name=\"starmaster\" data-field=\"{&quot;name&quot;:&quot;starmaster&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u624b\\u6e380\\u661f\\u8fbe\\u4eba&quot;,&quot;intro&quot;:&quot;\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;amp;ie=utf-8&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1722691615,76&quot;,&quot;2&quot;:&quot;1722691615,77&quot;,&quot;3&quot;:&quot;1722691615,78&quot;,&quot;4&quot;:&quot;1722691615,79&quot;,&quot;5&quot;:&quot;1722691615,80&quot;,&quot;6&quot;:&quot;1722691615,81&quot;}}\" target=\"_blank\" href=\"http://tieba.baidu.com/f?kw=玩家认证&amp;ie=utf-8\" class=\"j_icon_slot\" title=\"手游0星达人\" locate=\"starmaster_1#icon\">  <div class=\" j_icon_slot_refresh\"></div></a></span></div>            </div></div>    <div class=\"media-bottom\">                <div id=\"j_profile_pop\" class=\"profile_pop\"></div></div>        </div><div class=\"region_footer\"></div></div>    <div class=\"region_bright app_download_box\"><h4 class=\"region_header\"><span class=\"title\">扫二维码下载贴吧客户端</span></h4><div class=\"clearfix app_download_wrap region_cnt\"><div class=\"app_download_icon\"></div><div class=\"app_download_info\">下载贴吧APP<br>看高清直播、视频！</div></div></div><div style=\"height: 394px;\"><div class=\"topic_list_box\" style=\"width: 240px;\">        <div class=\"item_hd\"><span class=\"title\">贴吧热议榜</span></div><ul class=\"topic_list_hot topic_list j_topic_toplist\">                <li class=\"topic_item\"><span class=\"topic_flag_hot\">1</span><a target=\"_blank\" href=\"http://tieba.baidu.com/hottopic/browse/hottopic?topic_id=27784245&amp;topic_name=%E4%B8%AD%E5%9B%BD%E5%A5%B3%E6%8E%92%E4%B8%8D%E6%95%8C%E5%9C%9F%E8%80%B3%E5%85%B6%E6%97%A0%E7%BC%984%E5%BC%BA\" class=\"topic_name\">中国女排不敌土耳其无缘4强</a><span class=\"topic_num\">1839540</span></li>                <li class=\"topic_item\"><span class=\"topic_flag_hot\">2</span><a target=\"_blank\" href=\"http://tieba.baidu.com/hottopic/browse/hottopic?topic_id=27784844&amp;topic_name=%E9%A9%AC%E9%BE%99%E7%8E%8B%E6%A5%9A%E9%92%A63%E6%AF%940%E5%8D%B0%E5%BA%A6%E7%BB%84%E5%90%88\" class=\"topic_name\">马龙王楚钦3比0印度组合</a><span class=\"topic_num\">1527111</span></li>                <li class=\"topic_item\"><span class=\"topic_flag_hot\">3</span><a target=\"_blank\" href=\"http://tieba.baidu.com/hottopic/browse/hottopic?topic_id=27787738&amp;topic_name=%E5%90%A7%E5%8F%8B%E6%9D%A5%E9%A2%84%E6%B5%8B%E5%B7%B4%E9%BB%8E%E9%97%AD%E5%B9%95%E5%BC%8F%E6%97%97%E6%89%8B\" class=\"topic_name\">吧友来预测巴黎闭幕式旗手</a><span class=\"topic_num\">1187816</span></li>                <li class=\"topic_item\"><span class=\"topic_flag\">4</span><a target=\"_blank\" href=\"http://tieba.baidu.com/hottopic/browse/hottopic?topic_id=27785879&amp;topic_name=%E4%BD%93%E8%82%B2%E6%80%BB%E5%B1%80%E5%AF%B9%E8%A2%81%E6%98%8A%E7%84%B6%E8%BF%9B%E8%A1%8C%E8%B0%83%E6%9F%A5\" class=\"topic_name\">体育总局对袁昊然进行调查</a><span class=\"topic_num\">1119960</span></li>                <li class=\"topic_item\"><span class=\"topic_flag\">5</span><a target=\"_blank\" href=\"http://tieba.baidu.com/hottopic/browse/hottopic?topic_id=27770547&amp;topic_name=%E9%BB%91%E7%A5%9E%E8%AF%9D%E6%82%9F%E7%A9%BA%E6%AD%A3%E5%BC%8F%E7%89%88%E5%BC%80%E5%8F%91%E5%AE%8C%E6%88%90\" class=\"topic_name\">黑神话悟空正式版开发完成</a><span class=\"topic_num\">964184</span></li>                <li class=\"topic_item\"><span class=\"topic_flag\">6</span><a target=\"_blank\" href=\"http://tieba.baidu.com/hottopic/browse/hottopic?topic_id=27785074&amp;topic_name=%E5%85%A8%E7%BA%A2%E5%A9%B5%E9%99%88%E8%8A%8B%E6%B1%90%E5%87%BA%E6%88%9810%E7%B1%B3%E5%8F%B0%E5%86%B3%E8%B5%9B\" class=\"topic_name\">全红婵陈芋汐出战10米台决赛</a><span class=\"topic_num\">718250</span></li>                <li class=\"topic_item\"><span class=\"topic_flag\">7</span><a target=\"_blank\" href=\"http://tieba.baidu.com/hottopic/browse/hottopic?topic_id=27770414&amp;topic_name=%E8%80%81%E7%8E%8B%E6%9D%AF%E5%B0%8F%E4%BA%88%E7%A5%9E%E5%BC%80%E5%9B%A2%E9%B9%BF%E5%B0%8F%E9%B8%A3\" class=\"topic_name\">老王杯小予神开团鹿小鸣</a><span class=\"topic_num\">661632</span></li>                <li class=\"topic_item\"><span class=\"topic_flag\">8</span><a target=\"_blank\" href=\"http://tieba.baidu.com/hottopic/browse/hottopic?topic_id=27789490&amp;topic_name=%E5%BC%A0%E7%BB%A7%E7%A7%91%E5%BC%80%E8%AF%BE%E6%95%99%E4%B9%92%E4%B9%93%E7%90%83\" class=\"topic_name\">张继科开课教乒乓球</a><span class=\"topic_num\">608097</span></li>                <li class=\"topic_item\"><span class=\"topic_flag\">9</span><a target=\"_blank\" href=\"http://tieba.baidu.com/hottopic/browse/hottopic?topic_id=27784965&amp;topic_name=%E7%BE%8E%E5%9B%BD%E4%B8%80%E5%A5%A5%E8%BF%90%E9%80%89%E6%89%8B%E5%85%B4%E5%A5%8B%E5%89%82%E9%98%B3%E6%80%A7\" class=\"topic_name\">美国一奥运选手兴奋剂阳性</a><span class=\"topic_num\">579590</span></li>                <li class=\"topic_item\"><span class=\"topic_flag\">10</span><a target=\"_blank\" href=\"http://tieba.baidu.com/hottopic/browse/hottopic?topic_id=27770151&amp;topic_name=%E8%8B%8F%E7%82%9C%E5%BE%B7%E5%9B%9E%E5%BA%94%E6%8E%89%E6%9D%A0%E7%AD%89%E5%A4%B1%E8%AF%AF\" class=\"topic_name\">苏炜德回应掉杠等失误</a><span class=\"topic_num\">409941</span></li>                </ul>        </div></div><div class=\"region_bright\" id=\"tieba-notice\"><ul class=\"unordered-list\"><li class=\"text-overflow\"><i class=\"notice-icon notice-icon-feedback\"></i><a pv_code=\"0\" href=\"http://tieba.baidu.com/f?ie=utf-8&amp;kw=%E8%B4%B4%E5%90%A7%E6%84%8F%E8%A7%81%E5%8F%8D%E9%A6%88\" target=\"_blank\">贴吧页面意见反馈</a></li><li class=\"text-overflow\"><i class=\"notice-icon notice-icon-screen\"></i><a pv_code=\"0\" href=\"http://tieba.baidu.com/f?ie=utf8&amp;kw=%E8%B4%B4%E5%90%A7%E6%9B%9D%E5%85%89%E5%8F%B0&amp;fr=wwwt\" target=\"_blank\">违规贴吧举报反馈通道</a></li><li class=\"text-overflow\"><i class=\"notice-icon notice-icon-trash\"></i><a pv_code=\"0\" href=\"http://tieba.baidu.com/tb/zt/notice.html\" target=\"_blank\">贴吧违规信息处理公示</a></li></ul></div><div id=\"branding_ads\"></div></div></div><div class=\"pb_footer\"><div class=\"p_thread thread_theme_7\" id=\"thread_theme_7\"><div class=\"l_thread_info\"><ul class=\"l_posts_num\">\n\t<li class=\"l_pager pager_theme_5 pb_list_pager\"><span class=\"tP\">1</span>\n<a href=\"/p/9117905169?pn=2\">2</a>\n<a href=\"/p/9117905169?pn=3\">3</a>\n<a href=\"/p/9117905169?pn=4\">4</a>\n<a href=\"/p/9117905169?pn=5\">5</a>\n<a href=\"/p/9117905169?pn=6\">6</a>\n<a href=\"/p/9117905169?pn=2\">下一页</a>\n<a href=\"/p/9117905169?pn=13\">尾页</a>\n</li>\n\t<li class=\"l_reply_num\" style=\"margin-left:8px\"><span class=\"red\" style=\"margin-right:3px\">786</span>回复贴，共<span class=\"red\">13</span>页</li>\n\t<li class=\"l_reply_num\">，跳到 <input theme=\"6\" id=\"jumpPage6\" max-page=\"13\" type=\"text\" class=\"jump_input_bright\"> 页&nbsp;<button id=\"pager_go6\" type=\"button\" value=\"确定\" class=\"btn-sub btn-small jump_btn_bright\">确定</button>&nbsp;</li>\n</ul>\n</div><div id=\"tofrs_up\" class=\"tofrs_up\"><a href=\"/f?kw=%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&amp;ie=utf-8\" title=\"以太比特\">&lt;返回以太比特吧</a></div></div><div id=\"pb-footer-header\"></div><a name=\"sub\"></a><div id=\"tb_rich_poster_container\" class=\"tb_rich_poster_container\"><div id=\"rich_ueditor_tpl\"><div id=\"tb_rich_poster\" class=\"tb_rich_poster  \"><div class=\"j_bubble_container\"></div><div class=\"poster_head clearfix\"><div class=\"poster_head_text\">                    <a class=\"add_thread_btn post_head_btn cur\" title=\"发表回复\" href=\"javascript:;\"><span class=\"post_head_btn_icon post_head_btn_icon_post\"></span>发表回复</a>                    </div>                <div class=\"poster_head_surveillance j_surveillance\">发贴请遵守<a href=\"/tb/eula.html\" target=\"_blank\" onclick=\"$.stats.track('post_agreement', 'poster')\">贴吧协议及“七条底线”</a><a href=\"javascript:;\" id=\"frs_footer_tieba_report\" class=\"btn_tousu fr post_head_tousu\" data-checkun=\"un\">贴吧投诉</a>                    <button type=\"button\" class=\"poster_disable_float j_disable_float\" title=\"停止浮动\">停止浮动</button></div>                </div><div class=\"poster_body editor_wrapper\">                <div class=\"poster_component editor_content_wrapper ueditor_container\"><div class=\"poster_reply\">内&nbsp;&nbsp;容:</div><div class=\"old_style_wrapper\"><div id=\"ueditor_replace\" style=\"width: 700px; height: 220px;\"></div></div><div class=\"poster_error j_error\"></div></div>                <div class=\"j_poster_signature poster_signature\"><label><input type=\"checkbox\" class=\"j_use_signature\">使用签名档</label>&nbsp;<span class=\"j_signature_wrapper signature_wrapper\"><select name=\"sign_id\" class=\"j_sign_id\"></select>&nbsp;<a style=\"color:#0449BE\" target=\"_blank\" href=\"/i/sys/jump?type=signsetting\">查看全部</a></span></div>                <div class=\"poster_component editor_bottom_panel clearfix\"><div class=\"j_floating\"><a href=\"#\" class=\"ui_btn ui_btn_m j_submit poster_submit\" title=\"Ctrl+Enter快捷发表\"><span><em>发 表</em></span></a>                        <span class=\"poster_posting_status j_posting_status\"></span><div class=\"poster-right-area\">                            <div class=\"save-to-quick-reply-btn\">保存至<span>快速回贴</span></div>                            <br>                            <div class=\"poster_draft_status j_draft\" style=\"display: none;\"><span class=\"j_content\"></span><span title=\"清空草稿\" class=\"poster_draft_delete j_clear\"></span></div>                            </div><button class=\"btn_sub btn_middle j_clear_fullscreen poster_clear_fullscreen\" title=\"\">退 出</button></div></div></div>                        </div></div></div><div id=\"footer\" class=\"footer\">                                                                                                      <span>©2024 Baidu</span><a pv_code=\"0\" href=\"/tb/eula.html\" target=\"_blank\">贴吧协议</a><span>|</span><a pv_code=\"0\" href=\"https://tieba.baidu.com/tb/cms/tieba-fe/tieba_promise.html\" target=\"_blank\">隐私政策</a><span>|</span><a pv_code=\"0\" href=\"http://tieba.baidu.com/tb/system.html\" target=\"_blank\">吧主制度</a><span>|</span><a class=\"ueg_feedback-link\" data-site=\"feedbackLink\" pv_code=\"0\" href=\"http://tieba.baidu.com/hermes/feedback\" target=\"_blank\">意见反馈</a><span>|</span><a pv_code=\"0\" href=\"/tb/zt/declare/\" target=\"_blank\">网络谣言警示</a></div>    </div></div></div><div id=\"fixed_bar\" class=\"\"><img src=\"//tb1.bdstatic.com/tb/cms/PC%E7%AB%AF%E5%BA%95%E9%83%A8%E9%80%9A%E6%A0%8F%E5%BC%B9%E5%B1%821000x120.png\" alt=\"\"><img src=\"//tb2.bdstatic.com/tb/static-spage/widget/fixed_bar/images/icon_close_1683259.png\" alt=\"\" class=\"close\"></div><a id=\"fixed_daoliu\" href=\"\" target=\"_blank\" data-switch=\"0\"><img src=\"\"><span class=\"close\"></span></a>\n </div></div><script>PageUnitData={\"search_input_tip\":\"\\u8f93\\u5165\\u4f60\\u611f\\u5174\\u8da3\\u7684\\u4e1c\\u4e1c\",\"snowflow_imgs\":\"\",\"snowflow_url\":\"\",\"sign_mod_card_title\":\"\\u4e00\\u952e\\u7b7e\\u5230\\uff0c\\u6700\\u9ad8<span>6\\u500d\\u7ecf\\u9a8c\\uff01<\\/span>\",\"sign_mod_card_detail\":\"\",\"sign_mod_card_positive_btn\":\"<i class=\\\"icon\\\"><\\/i>\\u5ba2\\u6237\\u7aef\\u514d\\u8d39\\u4f53\\u9a8c\",\"sign_mod_card_no_txt\":\"<i class=\\\"icon\\\"><\\/i>\\u4f1a\\u5458\\u4e00\\u952e\\u7b7e\\u5230\",\"sign_mod_tiptitle1\":\"\\u7b7e\\u5230\\u7ecf\\u9a8c\\u5956\\u52b1\",\"sign_mod_tiptitle2\":\"\\u8fde\\u7eed\\u7b7e\\u5230\\u53cc\\u500d\\u7ecf\\u9a8c\",\"sign_mod_tiptitle3\":\"\\u52a0\\u7c97\\u5b57\\u4f53\\u4f7f\\u7528\\u7279\\u6743\",\"sign_mod_tiptitle4\":\"\\u7ea2\\u8272\\u5b57\\u4f53\\u4f7f\\u7528\\u7279\\u6743\",\"sign_mod_tiptitle5\":\"\\u4e00\\u4e3e\\u6a59\\u540d\",\"sign_mod_tiptext1\":\"\\u7b7e\\u5230\\u5373\\u5956\\u52b12\\u4e2a\\u7ecf\\u9a8c\\u503c\\u3002<br \\/>\\u624b\\u673a\\u7b7e\\u5230\\u989d\\u5916\\u5956\\u52b12\\u4e2a\\u7ecf\\u9a8c\\u503c\\u3002\",\"sign_mod_tiptext2\":\"\\u8fde\\u7eed\\u7b7e\\u5230\\u5956\\u52b1\\u7ecf\\u9a8c\\u503c\\u53cc\\u500d\\u3002\",\"sign_mod_tiptext3\":\"\\u5728\\u672c\\u5427\\u53d1\\u8d34\\u65f6\\u53ef\\u4ee5\\u4f7f\\u7528\\u52a0\\u7c97\\u5b57\\u4f53\\u3002\",\"sign_mod_tiptext4\":\"\\u5728\\u672c\\u5427\\u53d1\\u8d34\\u65f6\\u53ef\\u4ee5\\u4f7f\\u7528\\u7ea2\\u8272\\u5b57\\u4f53\\u3002\",\"sign_mod_tiptext5\":\"\\u5728\\u672c\\u5427\\u7528\\u6237ID\\u6a59\\u540d\\u9ad8\\u4eae\\u663e\\u793a\\u3002\",\"sign_mod_tipcondition1\":\"\\u6761\\u4ef6\\uff1a\\u6bcf\\u5929\\u70b9\\u51fb\\u7b7e\\u5230\\u540e\\u5373\\u53ef\\u83b7\\u5f97\\u3002\",\"sign_mod_tipcondition2\":\"\\u6761\\u4ef6\\uff1a\\u4fdd\\u6301\\u8fde\\u7eed\\u7b7e\\u52302\\u5929\\u53ca\\u4ee5\\u4e0a\\u3002\",\"sign_mod_tipcondition3\":\"\\u6761\\u4ef6\\uff1a\\u8fde\\u7eed\\u7b7e\\u523010\\u5929\\u53ca\\u4ee5\\u4e0a\\uff0c\\u4e0d\\u80fd\\u4e2d\\u65ad\\u54e6\",\"sign_mod_tipcondition4\":\"\\u6761\\u4ef6\\uff1a\\u8fde\\u7eed\\u7b7e\\u523020\\u5929\\u53ca\\u4ee5\\u4e0a\\uff0c\\u4e0d\\u80fd\\u4e2d\\u65ad\\u54e6\",\"sign_mod_tipcondition5\":\"\\u6761\\u4ef6\\uff1a\\u8fde\\u7eed\\u7b7e\\u523030\\u5929\\u53ca\\u4ee5\\u4e0a\\uff0c\\u4e0d\\u80fd\\u4e2d\\u65ad\\u54e6\",\"tbnav_bright_wanle_type\":\"\",\"icons_category\":{\"101\":[\"\\u5df4\\u897f\\u4e16\\u754c\\u676f\"],\"102\":[\"\\u661f\\u5ea7\\u5370\\u8bb0\"],\"104\":[\"\\u8d34\\u5427\\u5370\\u8bb0\"]},\"dasense_messenger_whitelist\":[[\"http:\\/\\/fedev.baidu.com\"],[\"http:\\/\\/jiaoyu.baidu.com\"],[\"http:\\/\\/caifu.baidu.com\"],[\"http:\\/\\/jiankang.baidu.com\"],[\"http:\\/\\/tieba.dre8.com\"],[\"http:\\/\\/tdsp.nuomi.com\"],[\"http:\\/\\/baiju.baidu.com\"],[\"http:\\/\\/temai.baidu.com\"],[\"http:\\/\\/tieba.baidu.com\"],[\"http:\\/\\/zt.chuanke.com\"],[\"http:\\/\\/window.sturgeon.mopaas.com\"],[\"http:\\/\\/api.union.vip.com\"],[\"http:\\/\\/api.dongqiudi.com\"],[\"http:\\/\\/www.chuanke.com\"],[\"http:\\/\\/dcp.kuaizitech.com\\/\"]],\"like_tip_svip_black_list\":\"\",\"rich_poster_show_music_recommend\":\"\",\"rich_poster_feedback\":\"<p>\\u6e29\\u99a8\\u63d0\\u793a\\uff1a\\u53cd\\u9988bug\\u3001\\u5e10\\u53f7\\u5f02\\u5e38\\u6216\\u5220\\u8d34\\u95ee\\u9898\\u65f6\\uff0c\\u8bf7\\u63d0\\u4f9b\\u6587\\u5b57\\u5f62\\u5f0f\\u7684\\u95ee\\u9898\\u5e10\\u53f7\\uff08\\u975e\\u622a\\u56fe\\uff09\\u3001\\u95ee\\u9898\\u53d1\\u751f\\u7684\\u65f6\\u95f4\\uff0c\\u5e76\\u5c3d\\u53ef\\u80fd\\u4e0a\\u4f20\\u622a\\u56fe\\uff0c\\u4ee5\\u4e0a\\u4fe1\\u606f\\u6709\\u52a9\\u4e8e\\u8d34\\u5427\\u66f4\\u597d\\u7684\\u89e3\\u51b3\\u60a8\\u7684\\u95ee\\u9898\\u3002<\\/p>\",\"tope_pbbanner_swf\":\"\"};</script>\n<script src=\"//tb1.bdstatic.com/??tb/static-common/lib/tb_lib_ab6c0e0.js,tb/static-common/ui/common_logic_v2_59deee8.js,tb/static-common/js/tb_ui_c1c5c89.js,/tb/_/ban_8422f6c.js\"></script>\n<script>    (function(F){var _JSSTAMP = {\"pb\\/widget\\/video_player\\/video_player.js\":\"\\/tb\\/_\\/video_player_5678bdc.js\",\"pb\\/widget\\/video_player_html5\\/video_player_html5.js\":\"\\/tb\\/_\\/video_player_html5_b1304d8.js\",\"common\\/widget\\/block_user\\/block_user.js\":\"\\/tb\\/_\\/block_user_4fe7e3b.js\",\"encourage\\/widget\\/forbid_speech\\/forbid_speech.js\":\"\\/tb\\/_\\/forbid_speech_7b2f433.js\",\"common\\/widget\\/live_complaint\\/live_complaint.js\":\"\\/tb\\/_\\/live_complaint_4caab2c.js\",\"encourage\\/widget\\/paypost_agree_dialog\\/paypost_agree_dialog.js\":\"\\/tb\\/_\\/paypost_agree_dialog_086c5e0.js\",\"pb\\/widget\\/message\\/message.js\":\"\\/tb\\/_\\/message_e4c51fc.js\",\"common\\/widget\\/verify_dialog\\/verify_dialog.js\":\"\\/tb\\/_\\/verify_dialog_69e5571.js\",\"common\\/widget\\/login_verify_check\\/login_verify_check.js\":\"\\/tb\\/_\\/login_verify_check_8202383.js\",\"pb\\/widget\\/posts\\/posts.js\":\"\\/tb\\/_\\/posts_3224911.js\",\"pb\\/widget\\/pic_act_vote\\/pic_act_vote.js\":\"\\/tb\\/_\\/pic_act_vote_6c70142.js\",\"pb\\/widget\\/pic_act_repost\\/pic_act_repost.js\":\"\\/tb\\/_\\/pic_act_repost_ecdd7f4.js\",\"pb\\/widget\\/sub_list\\/sub_list_total.js\":\"\\/tb\\/_\\/sub_list_total_e32b978.js\",\"common\\/component\\/card\\/card.js\":\"\\/tb\\/_\\/card_aceb7b2.js\",\"pb\\/widget\\/favthread\\/favthread.js\":\"\\/tb\\/_\\/favthread_3d6669c.js\",\"pb\\/widget\\/pic_act_poster\\/pic_act_poster.js\":\"\\/tb\\/_\\/pic_act_poster_0ce65e4.js\",\"common\\/component\\/follower\\/follower.js\":\"\\/tb\\/_\\/follower_7ce74f3.js\",\"common\\/component\\/slide_show\\/slide_show.js\":\"\\/tb\\/_\\/slide_show_27c9ac6.js\",\"frs\\/widget\\/pic_sliding_window\\/pic_sliding_window.js\":\"\\/tb\\/_\\/pic_sliding_window_c9c5daf.js\",\"tbmall\\/widget\\/tbean_safe_ajax\\/tbean_safe_ajax.js\":\"\\/tb\\/_\\/tbean_safe_ajax_94e7ca2.js\",\"common\\/widget\\/tdou\\/tdou_view_pay.js\":\"\\/tb\\/_\\/tdou_view_pay_bfa4cf6.js\",\"common\\/component\\/force_login\\/force_login.js\":\"\\/tb\\/_\\/force_login_51097b2.js\",\"common\\/widget\\/post_service\\/post_service.js\":\"\\/tb\\/_\\/post_service_18ba763.js\",\"common\\/widget\\/image_uploader_manager\\/image_uploader_manager.js\":\"\\/tb\\/_\\/image_uploader_manager_d5f9d1a.js\",\"user\\/widget\\/my_tieba\\/my_tieba.js\":\"\\/tb\\/_\\/my_tieba_c65780e.js\",\"pb\\/widget\\/admin\\/admin.js\":\"\\/tb\\/_\\/admin_4b3a47c.js\",\"encourage\\/widget\\/novel_icons\\/novel_icons.js\":\"\\/tb\\/_\\/novel_icons_81de300.js\",\"common\\/widget\\/tbshare\\/tbshare.js\":\"\\/tb\\/_\\/tbshare_9c90235.js\",\"pb\\/widget\\/complient_thread\\/complient_thread.js\":\"\\/tb\\/_\\/complient_thread_91cf82c.js\",\"pb\\/widget\\/bind_hover\\/bind_hover.js\":\"\\/tb\\/_\\/bind_hover_f0f5c0f.js\",\"pcommon\\/component\\/login_dialog\\/login_dialog.js\":\"\\/tb\\/_\\/login_dialog_13c6b09.js\",\"common\\/component\\/js_pager\\/js_pager.js\":\"\\/tb\\/_\\/js_pager_ebc4a27.js\",\"props\\/component\\/props_api\\/props_api.js\":\"\\/tb\\/_\\/props_api_0ea4885.js\",\"user\\/widget\\/icons\\/icons.js\":\"\\/tb\\/_\\/icons_05b0275.js\",\"user\\/widget\\/pb_user_base\\/pb_user_base.js\":\"\\/tb\\/_\\/pb_user_base_ef1b60f.js\",\"common\\/widget\\/music_player\\/music_player.js\":\"\\/tb\\/_\\/music_player_9fe7a02.js\",\"pb\\/widget\\/baidusearch\\/baidusearch.js\":\"\\/tb\\/_\\/baidusearch_2832d79.js\",\"common\\/widget\\/login_dialog\\/login_dialog.js\":\"\\/tb\\/_\\/login_dialog_2b72cab.js\",\"pcommon\\/widget\\/pb_track\\/pb_track.js\":\"\\/tb\\/_\\/pb_track_234a8c1.js\",\"common\\/widget\\/lcs\\/lcs.js\":\"\\/tb\\/_\\/lcs_43bf602.js\",\"common\\/widget\\/card\\/card.js\":\"\\/tb\\/_\\/card_99bd0cd.js\",\"common\\/widget\\/wallet_dialog\\/wallet_dialog.js\":\"\\/tb\\/_\\/wallet_dialog_8b40af5.js\",\"common\\/widget\\/new_message_system\\/new_message_system.js\":\"\\/tb\\/_\\/new_message_system_5e2e122.js\",\"common\\/widget\\/cashier_dialog\\/cashier_dialog.js\":\"\\/tb\\/_\\/cashier_dialog_0c1473f.js\",\"common\\/widget\\/messenger\\/messenger.js\":\"\\/tb\\/_\\/messenger_040cae5.js\",\"common\\/widget\\/creative_bar\\/creative_bar.js\":\"\\/tb\\/_\\/creative_bar_2dbbad3.js\",\"common\\/widget\\/base_user_data\\/base_user_data.js\":\"\\/tb\\/_\\/base_user_data_72c8498.js\",\"common\\/widget\\/pay_member\\/pay_member.js\":\"\\/tb\\/_\\/pay_member_440a15e.js\",\"common\\/widget\\/http_transform\\/http_transform.js\":\"\\/tb\\/_\\/http_transform_e33a140.js\",\"common\\/widget\\/official_bar\\/official_bar.js\":\"\\/tb\\/_\\/official_bar_6be7442.js\",\"common\\/widget\\/business_agent\\/business_agent.js\":\"\\/tb\\/_\\/business_agent_832a519.js\",\"common\\/widget\\/global_switch\\/global_switch.js\":\"\\/tb\\/_\\/global_switch_d67de47.js\",\"common\\/widget\\/search_handler\\/search_handler.js\":\"\\/tb\\/_\\/search_handler_0e0c91c.js\",\"common\\/widget\\/suggestion\\/suggestion.js\":\"\\/tb\\/_\\/suggestion_96e27f5.js\",\"common\\/widget\\/animate_base\\/animate_base.js\":\"\\/tb\\/_\\/animate_base_51879f8.js\",\"common\\/component\\/captcha\\/captcha.js\":\"\\/tb\\/_\\/captcha_28c5dc5.js\",\"common\\/component\\/captcha_meizhi\\/captcha_meizhi.js\":\"\\/tb\\/_\\/captcha_meizhi_5f61aad.js\",\"common\\/component\\/image_uploader\\/image_uploader.js\":\"\\/tb\\/_\\/image_uploader_0093b47.js\",\"common\\/component\\/image_exif\\/image_exif.js\":\"\\/tb\\/_\\/image_exif_1b57cf0.js\",\"common\\/component\\/captcha_dialog\\/captcha_dialog.js\":\"\\/tb\\/_\\/captcha_dialog_b73e617.js\",\"common\\/component\\/postor_service\\/postor_service.js\":\"\\/tb\\/_\\/postor_service_53ed8e8.js\",\"common\\/component\\/scroll_panel\\/scroll_panel.js\":\"\\/tb\\/_\\/scroll_panel_9e28dd8.js\",\"common\\/component\\/suggestion\\/suggestion.js\":\"\\/tb\\/_\\/suggestion_9b05426.js\",\"common\\/component\\/toolbar\\/toolbar.js\":\"\\/tb\\/_\\/toolbar_5516683.js\",\"common\\/component\\/sketchpad_dialog\\/sketchpad_dialog.js\":\"\\/tb\\/_\\/sketchpad_dialog_abf416a.js\",\"common\\/component\\/tabs\\/tabs.js\":\"\\/tb\\/_\\/tabs_fca6d95.js\",\"common\\/widget\\/word_limit\\/word_limit.js\":\"\\/tb\\/_\\/word_limit_c99778f.js\",\"common\\/widget\\/aside_float_bar\\/aside_float_bar.js\":\"\\/tb\\/_\\/aside_float_bar_742aedf.js\",\"common\\/component\\/editor_pic\\/editor_pic.js\":\"\\/tb\\/_\\/editor_pic_e438e58.js\",\"common\\/component\\/editor_video\\/editor_video.js\":\"\\/tb\\/_\\/editor_video_61d8470.js\",\"common\\/component\\/editor_smiley\\/editor_smiley.js\":\"\\/tb\\/_\\/editor_smiley_2c8ea1a.js\",\"common\\/component\\/editor_music\\/editor_music.js\":\"\\/tb\\/_\\/editor_music_0128554.js\",\"common\\/component\\/editor_sketchpad\\/editor_sketchpad.js\":\"\\/tb\\/_\\/editor_sketchpad_159cc32.js\",\"common\\/component\\/area_select\\/area_select.js\":\"\\/tb\\/_\\/area_select_f396383.js\",\"common\\/component\\/sketchpad\\/sketchpad.js\":\"\\/tb\\/_\\/sketchpad_2e28d93.js\",\"common\\/component\\/interest_smiley\\/interest_smiley.js\":\"\\/tb\\/_\\/interest_smiley_863907f.js\",\"common\\/component\\/animate_keyframes_bouncein\\/animate_keyframes_bouncein.js\":\"\\/tb\\/_\\/animate_keyframes_bouncein_8d70c27.js\",\"common\\/component\\/animate_keyframes_bounceout\\/animate_keyframes_bounceout.js\":\"\\/tb\\/_\\/animate_keyframes_bounceout_8f15463.js\",\"common\\/component\\/animate_keyframes_fadein\\/animate_keyframes_fadein.js\":\"\\/tb\\/_\\/animate_keyframes_fadein_178e937.js\",\"common\\/component\\/animate_keyframes_fadeout\\/animate_keyframes_fadeout.js\":\"\\/tb\\/_\\/animate_keyframes_fadeout_44f964c.js\",\"common\\/component\\/animate_keyframes_flip\\/animate_keyframes_flip.js\":\"\\/tb\\/_\\/animate_keyframes_flip_44dec23.js\",\"common\\/component\\/animate_keyframes_focus\\/animate_keyframes_focus.js\":\"\\/tb\\/_\\/animate_keyframes_focus_de0bedc.js\",\"common\\/component\\/animate_keyframes_lightspeed\\/animate_keyframes_lightspeed.js\":\"\\/tb\\/_\\/animate_keyframes_lightspeed_6109fe5.js\",\"common\\/component\\/animate_keyframes_rotatein\\/animate_keyframes_rotatein.js\":\"\\/tb\\/_\\/animate_keyframes_rotatein_0b7ba89.js\",\"common\\/component\\/animate_keyframes_rotateout\\/animate_keyframes_rotateout.js\":\"\\/tb\\/_\\/animate_keyframes_rotateout_884da6a.js\",\"common\\/component\\/animate_keyframes_slidein\\/animate_keyframes_slidein.js\":\"\\/tb\\/_\\/animate_keyframes_slidein_38b544d.js\",\"common\\/component\\/animate_keyframes_slideout\\/animate_keyframes_slideout.js\":\"\\/tb\\/_\\/animate_keyframes_slideout_a86a043.js\",\"common\\/component\\/animate_keyframes_special\\/animate_keyframes_special.js\":\"\\/tb\\/_\\/animate_keyframes_special_fa9a9be.js\",\"common\\/component\\/animate_keyframes_zoomin\\/animate_keyframes_zoomin.js\":\"\\/tb\\/_\\/animate_keyframes_zoomin_9b12f77.js\",\"common\\/component\\/animate_keyframes_zoomout\\/animate_keyframes_zoomout.js\":\"\\/tb\\/_\\/animate_keyframes_zoomout_73cbdb0.js\",\"user\\/widget\\/user_api\\/user_api.js\":\"\\/tb\\/_\\/user_api_c1c17f1.js\",\"common\\/widget\\/qianbao_purchase_member\\/qianbao_purchase_member.js\":\"\\/tb\\/_\\/qianbao_purchase_member_ca949f3.js\",\"common\\/widget\\/tdou\\/tdou_open_type.js\":\"\\/tb\\/_\\/tdou_open_type_6e74792.js\",\"common\\/widget\\/qianbao_cashier_dialog\\/qianbao_cashier_dialog.js\":\"\\/tb\\/_\\/qianbao_cashier_dialog_3d909ce.js\",\"common\\/widget\\/base_dialog_user_bar\\/base_dialog_user_bar.js\":\"\\/tb\\/_\\/base_dialog_user_bar_9d205a7.js\",\"common\\/widget\\/show_dialog\\/show_dialog.js\":\"\\/tb\\/_\\/show_dialog_1644928.js\",\"common\\/widget\\/placeholder\\/placeholder.js\":\"\\/tb\\/_\\/placeholder_e682b0c.js\",\"common\\/widget\\/tbcopy\\/tbcopy.js\":\"\\/tb\\/_\\/tbcopy_8dc608c.js\",\"common\\/widget\\/tdou_get\\/tdou_get.js\":\"\\/tb\\/_\\/tdou_get_aaf9354.js\",\"common\\/widget\\/umoney_query\\/umoney_query.js\":\"\\/tb\\/_\\/umoney_query_c9b7960.js\",\"common\\/widget\\/qianbao_purchase_tdou\\/qianbao_purchase_tdou.js\":\"\\/tb\\/_\\/qianbao_purchase_tdou_f7bef41.js\",\"common\\/widget\\/umoney\\/umoney.js\":\"\\/tb\\/_\\/umoney_ed41085.js\",\"common\\/widget\\/payment_dialog_title\\/payment_dialog_title.js\":\"\\/tb\\/_\\/payment_dialog_title_a606194.js\",\"common\\/widget\\/tdou\\/tdou_data.js\":\"\\/tb\\/_\\/tdou_data_621617e.js\",\"common\\/widget\\/audio_player\\/audio_player.js\":\"\\/tb\\/_\\/audio_player_3ce73ee.js\",\"common\\/widget\\/voice_player\\/voice_player.js\":\"\\/tb\\/_\\/voice_player_9a9b6dc.js\",\"common\\/widget\\/user_head\\/user_head.js\":\"\\/tb\\/_\\/user_head_e9d6026.js\",\"common\\/component\\/image_previewer\\/image_previewer.js\":\"\\/tb\\/_\\/image_previewer_73d5f03.js\",\"common\\/component\\/image_editor\\/image_editor.js\":\"\\/tb\\/_\\/image_editor_7d1aff6.js\",\"common\\/component\\/image_previewer_list\\/image_previewer_list.js\":\"\\/tb\\/_\\/image_previewer_list_67f0ada.js\",\"common\\/component\\/image_previewer_rotate\\/image_previewer_rotate.js\":\"\\/tb\\/_\\/image_previewer_rotate_c7cabf0.js\",\"common\\/component\\/image_uploader_queue\\/image_uploader_queue.js\":\"\\/tb\\/_\\/image_uploader_queue_233b0a9.js\",\"common\\/component\\/image_progress_bar\\/image_progress_bar.js\":\"\\/tb\\/_\\/image_progress_bar_12c6eb4.js\",\"common\\/widget\\/pic_poster\\/pic_poster.js\":\"\\/tb\\/_\\/pic_poster_c887e05.js\",\"common\\/component\\/image_water\\/image_water.js\":\"\\/tb\\/_\\/image_water_7d6a194.js\",\"common\\/widget\\/scroll_panel\\/scroll_panel.js\":\"\\/tb\\/_\\/scroll_panel_51b7780.js\",\"common\\/component\\/image_flash_editor\\/image_flash_editor.js\":\"\\/tb\\/_\\/image_flash_editor_629e8f5.js\",\"common\\/widget\\/params_xss_handler\\/params_xss_handler.js\":\"\\/tb\\/_\\/params_xss_handler_bbb0828.js\",\"common\\/widget\\/bsk_service\\/bsk_service.js\":\"\\/tb\\/_\\/bsk_service_72c6560.js\",\"common\\/component\\/select\\/select.js\":\"\\/tb\\/_\\/select_8d82f79.js\",\"common\\/widget\\/acs_sdk\\/acs_sdk.js\":\"\\/tb\\/_\\/acs_sdk_40080a1.js\",\"ucenter\\/widget\\/like_tip\\/like_tip.js\":\"\\/tb\\/_\\/like_tip_9e62fca.js\",\"tbmall\\/widget\\/tbean_safe\\/tbean_safe.js\":\"\\/tb\\/_\\/tbean_safe_14418e9.js\",\"pcommon\\/widget\\/params_xss_handler\\/params_xss_handler.js\":\"\\/tb\\/_\\/params_xss_handler_6be09db.js\",\"common\\/widget\\/jiyan_service\\/jiyan_service.js\":\"\\/tb\\/_\\/jiyan_service_44ae7c8.js\",\"common\\/widget\\/vip_dialog\\/vip_dialog.js\":\"\\/tb\\/_\\/vip_dialog_590e8b6.js\",\"common\\/widget\\/hao_tian_mirror\\/hao_tian_mirror.js\":\"\\/tb\\/_\\/hao_tian_mirror_854bd07.js\",\"common\\/widget\\/post_prefix\\/post_prefix.js\":\"\\/tb\\/_\\/post_prefix_daad9e7.js\",\"common\\/widget\\/post_signature\\/post_signature.js\":\"\\/tb\\/_\\/post_signature_4c43552.js\",\"common\\/widget\\/mouse_pwd\\/mouse_pwd.js\":\"\\/tb\\/_\\/mouse_pwd_f31d0b4.js\",\"encourage\\/widget\\/post_guessing_new\\/post_guessing_new.js\":\"\\/tb\\/_\\/post_guessing_new_f924d5d.js\",\"common\\/component\\/bubble_factory\\/bubble_factory.js\":\"\\/tb\\/_\\/bubble_factory_f970c47.js\",\"bawu\\/widget\\/complaint_bar_owner\\/complaint_bar_owner.js\":\"\\/tb\\/_\\/complaint_bar_owner_8fddc2c.js\",\"common\\/component\\/quick_reply_edit\\/quick_reply_edit.js\":\"\\/tb\\/_\\/quick_reply_edit_9678e8c.js\",\"encourage\\/widget\\/post_marry\\/post_marry.js\":\"\\/tb\\/_\\/post_marry_6ee69ee.js\",\"common\\/widget\\/paypost_data\\/paypost_data.js\":\"\\/tb\\/_\\/paypost_data_62a7ae4.js\",\"props\\/widget\\/props_data\\/props_data.js\":\"\\/tb\\/_\\/props_data_a25400f.js\",\"common\\/component\\/slide_select\\/slide_select.js\":\"\\/tb\\/_\\/slide_select_01ec4cf.js\",\"common\\/component\\/post_props\\/post_props.js\":\"\\/tb\\/_\\/post_props_73bc086.js\",\"common\\/component\\/attachment_uploader\\/attachment_uploader.js\":\"\\/tb\\/_\\/attachment_uploader_a9da3e8.js\",\"common\\/component\\/picture_album_selector\\/picture_album_selector.js\":\"\\/tb\\/_\\/picture_album_selector_6b0a6cf.js\",\"common\\/component\\/picture_selector\\/picture_selector.js\":\"\\/tb\\/_\\/picture_selector_e6c54bf.js\",\"common\\/component\\/picture_uploader\\/picture_uploader.js\":\"\\/tb\\/_\\/picture_uploader_ac18c84.js\",\"common\\/component\\/picture_web_selector\\/picture_web_selector.js\":\"\\/tb\\/_\\/picture_web_selector_38937a8.js\",\"common\\/component\\/scrawl\\/scrawl.js\":\"\\/tb\\/_\\/scrawl_e0ae790.js\",\"common\\/component\\/ueditor_emotion\\/ueditor_emotion.js\":\"\\/tb\\/_\\/ueditor_emotion_a903913.js\",\"common\\/component\\/ueditor_music\\/ueditor_music.js\":\"\\/tb\\/_\\/ueditor_music_0276fa3.js\",\"common\\/component\\/ueditor_video\\/ueditor_video.js\":\"\\/tb\\/_\\/ueditor_video_fd96c67.js\",\"common\\/component\\/slide_select_image\\/slide_select_image.js\":\"\\/tb\\/_\\/slide_select_image_e6dbcd3.js\",\"common\\/component\\/colorful\\/colorful.js\":\"\\/tb\\/_\\/colorful_4f85c36.js\",\"common\\/component\\/custom_emotion\\/custom_emotion.js\":\"\\/tb\\/_\\/custom_emotion_c7f15af.js\",\"common\\/component\\/post_bubble\\/post_bubble.js\":\"\\/tb\\/_\\/post_bubble_9f3833e.js\",\"common\\/component\\/tb_gram\\/tb_gram.js\":\"\\/tb\\/_\\/tb_gram_5afa029.js\",\"common\\/component\\/formula\\/formula.js\":\"\\/tb\\/_\\/formula_58b7814.js\",\"common\\/component\\/post_setting\\/post_setting.js\":\"\\/tb\\/_\\/post_setting_ac01c94.js\",\"common\\/component\\/paypost\\/paypost.js\":\"\\/tb\\/_\\/paypost_62e57ae.js\",\"common\\/widget\\/join_vip_dialog\\/join_vip_dialog.js\":\"\\/tb\\/_\\/join_vip_dialog_e8b24ea.js\",\"common\\/component\\/quick_reply_data_handler\\/quick_reply_data_handler.js\":\"\\/tb\\/_\\/quick_reply_data_handler_256a70d.js\",\"common\\/widget\\/scroll_horizontal\\/scroll_horizontal.js\":\"\\/tb\\/_\\/scroll_horizontal_beb7cc0.js\",\"common\\/widget\\/detect_manager_block\\/detect_manager_block.js\":\"\\/tb\\/_\\/detect_manager_block_713b838.js\",\"common\\/widget\\/verify_manager_phone\\/verify_manager_phone.js\":\"\\/tb\\/_\\/verify_manager_phone_6f07b28.js\",\"common\\/widget\\/tb_lcs\\/tb_lcs.js\":\"\\/tb\\/_\\/tb_lcs_544b5c9.js\",\"common\\/widget\\/event_center\\/event_center.js\":\"\\/tb\\/_\\/event_center_08fbacd.js\"};         F.tbConfig(_JSSTAMP);    })(F);</script><script src=\"//tb1.bdstatic.com/??/tb/_/app_f6b8e80.js,/tb/_/card_99bd0cd.js,/tb/_/js_pager_ebc4a27.js,/tb/_/login_dialog_2b72cab.js,/tb/_/user_head_e9d6026.js,/tb/_/user_api_c1c17f1.js,/tb/_/global_switch_d67de47.js,/tb/_/icons_05b0275.js,/tb/_/wallet_dialog_8b40af5.js,/tb/_/event_center_08fbacd.js,/tb/_/lcs_43bf602.js,/tb/_/tb_lcs_544b5c9.js,/tb/_/flash_lcs_ccd5d3e.js,/tb/_/new_message_system_5e2e122.js,/tb/_/messenger_040cae5.js,/tb/_/base_user_data_72c8498.js,/tb/_/cashier_dialog_0c1473f.js,/tb/_/creative_bar_2dbbad3.js,/tb/_/qianbao_cashier_dialog_3d909ce.js,/tb/_/base_dialog_user_bar_9d205a7.js,/tb/_/qianbao_purchase_member_ca949f3.js,/tb/_/pay_member_440a15e.js,/tb/_/http_transform_e33a140.js,/tb/_/official_bar_6be7442.js,/tb/_/business_agent_832a519.js,/tb/_/userbar_8b82a68.js,/tb/_/footer_af59471.js,/tb/_/poptip_74068e9.js,/tb/_/ad_stats_008fc58.js,/tb/_/util_8d5f753.js\"></script>\n<script src=\"//tb1.bdstatic.com/??/tb/_/preview_01cc209.js,/tb/_/pb_track_234a8c1.js,/tb/_/conf_skin_0e0d6d7.js,/tb/_/platform_skin_d41d8cd.js,/tb/_/tbskin_c103c2e.js,/tb/_/search_handler_0e0c91c.js,/tb/_/suggestion_96e27f5.js,/tb/_/search_bright_8b6cf6f.js,/tb/_/snowflow_87a4cb6.js,/tb/_/attention_category_game_8156abe.js,/tb/_/slide_show_27c9ac6.js,/tb/_/stock_banner_b12b140.js,/tb/_/vip_dialog_590e8b6.js,/tb/_/util_02ce566.js,/tb/_/dialog_dc42202.js,/tb/_/join_vip_dialog_e8b24ea.js,/tb/_/cont_sign_card_15e0274.js,/tb/_/sign_mod_bright_62b82d6.js,/tb/_/medal_9a95e9d.js,/tb/_/forum_card_b1a17f4.js,/tb/_/my_often_forum_572ef85.js,/tb/_/frs_version_0876485.js,/tb/_/stock_nav_ab6d85a.js,/tb/_/tbnav_bright_036ff50.js,/tb/_/pager_f29e87d.js,/tb/_/share_bf89626.js,/tb/_/verify_manager_phone_6f07b28.js,/tb/_/detect_manager_block_713b838.js,/tb/_/block_user_4fe7e3b.js,/tb/_/forbid_speech_7b2f433.js\"></script>\n<script src=\"//tb1.bdstatic.com/??/tb/_/live_complaint_4caab2c.js,/tb/_/paypost_data_62a7ae4.js,/tb/_/paypost_agree_dialog_086c5e0.js,/tb/_/message_e4c51fc.js,/tb/_/admin_4b3a47c.js,/tb/_/no_refresh_pager_acf67ae.js,/tb/_/content_head_4019475.js,/tb/_/verify_dialog_69e5571.js,/tb/_/login_verify_check_8202383.js,/tb/_/favthread_3d6669c.js,/tb/_/force_login_51097b2.js,/tb/_/bsk_service_72c6560.js,/tb/_/acs_sdk_40080a1.js,/tb/_/tool_async_9035e8b.js,/tb/_/loader_async_acecc9f.js,/tb/_/like_tip_9e62fca.js,/tb/_/captcha_payment_df7462b.js,/tb/_/paykey_rsa_95bd914.js,/tb/_/paykey_dialog_13360a3.js,/tb/_/paykey_mobile_905c4dc.js,/tb/_/tbean_safe_14418e9.js,/tb/_/params_xss_handler_6be09db.js,/tb/_/jiyan_service_44ae7c8.js,/tb/_/post_service_18ba763.js,/tb/_/image_exif_1b57cf0.js,/tb/_/image_uploader_0093b47.js,/tb/_/image_uploader_manager_d5f9d1a.js,/tb/_/payment_dialog_title_a606194.js,/tb/_/show_dialog_1644928.js,/tb/_/qianbao_purchase_tdou_f7bef41.js\"></script>\n<script src=\"//tb1.bdstatic.com/??/tb/_/tdou_get_aaf9354.js,/tb/_/tcharge_dialog_5aff197.js,/tb/_/member_api_722ea18.js,/tb/_/umoney_query_c9b7960.js,/tb/_/nameplate_d41d8cd.js,/tb/_/my_current_forum_97a6354.js,/tb/_/tb_spam_846204f.js,/tb/_/my_tieba_c65780e.js,/tb/_/pic_act_poster_0ce65e4.js,/tb/_/follower_7ce74f3.js,/tb/_/pb_user_base_ef1b60f.js,/tb/_/forum_title_305bddf.js,/tb/_/novel_icons_81de300.js,/tb/_/save_face_3badee6.js,/tb/_/login_dialog_13c6b09.js,/tb/_/posts_3224911.js,/tb/_/tbean_safe_ajax_94e7ca2.js,/tb/_/pb_marry_142250d.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/data_handler_async_02038fe.js,/tb/_/fengchao_ad_tpl_c227d78.js,/tb/_/fengchao_pb_feed_85cbfeb.js,/tb/_/loader_95a0692.js,/tb/_/residual_250f75d.js,/tb/_/single_icons_58a2377.js,/tb/_/animate_base_51879f8.js,/tb/_/animate_keyframes_bouncein_8d70c27.js,/tb/_/animate_keyframes_bounceout_8f15463.js,/tb/_/animate_keyframes_fadein_178e937.js,/tb/_/animate_keyframes_fadeout_44f964c.js\"></script>\n<script src=\"//tb1.bdstatic.com/??/tb/_/animate_keyframes_flip_44dec23.js,/tb/_/animate_keyframes_focus_de0bedc.js,/tb/_/animate_keyframes_lightspeed_6109fe5.js,/tb/_/animate_keyframes_rotatein_0b7ba89.js,/tb/_/animate_keyframes_rotateout_884da6a.js,/tb/_/animate_keyframes_slidein_38b544d.js,/tb/_/animate_keyframes_slideout_a86a043.js,/tb/_/animate_keyframes_special_fa9a9be.js,/tb/_/animate_keyframes_zoomin_9b12f77.js,/tb/_/animate_keyframes_zoomout_73cbdb0.js,/tb/_/animate_0dcace2.js,/tb/_/novel_award_dialog_a496a9e.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/novel_award_thread_d1402f1.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/diamond_bind_mob_8dcdf1a.js,/tb/_/grab_treasure_report_73d05a2.js,/tb/_/treasure_payment_dialog_1ec3a33.js,/tb/_/treasure_rule_dialog_0a12b65.js,/tb/_/grab_treasure_ctrl_a4287bd.js,/tb/_/pb_grab_treasure_4aa555b.js,/tb/_/scroll_panel_51b7780.js,/tb/_/promoter_post_opts_7100968.js,/tb/_/promoter_post_body_3c1f785.js,/tb/_/idisk_2233809.js,/tb/_/paypost_guide_54a2ff9.js,/tb/_/paypost_42358a1.js,/tb/_/content_recommend_eb95cc3.js,/tb/_/gift_page_ctrl_75f0eea.js,/tb/_/gift_loading_css_ef8eeff.js\"></script>\n<script src=\"//tb1.bdstatic.com/??/tb/_/send_gift_dialog_3aa2de7.js,/tb/_/pb_post_foot_send_gift_c06bd02.js,/tb/_/props_api_0ea4885.js,/tb/_/complient_thread_91cf82c.js,/tb/_/sub_list_590ad31.js,/tb/_/forbid_speech_banner_570a9fc.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/icon_tip_b81012f.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/tbcopy_8dc608c.js,/tb/_/tbshare_9c90235.js,/tb/_/bind_hover_f0f5c0f.js,/tb/_/card_aceb7b2.js,/tb/_/post_list_7310a6c.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/scroll_event_e92b229.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/forum_member_dialog_f9a7e85.js,/tb/_/exp_package_dialog_d48cdd3.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/celebrity_widget_7938756.js,/tb/_/celebrity_forum_dialog_2c2a2fd.js,/tb/_/util_f73facc.js,/tb/_/net_proxy_fe50f68.js,/tb/_/guide_4fa0de1.js,/tb/_/use_controller_8cf114c.js,/tb/_/interaction_9de54e4.js,/tb/_/month_icon_27518ed.js,/tb/_/user_visit_card_4125815.js\"></script>\n<script src=\"//tb1.bdstatic.com/??/tb/_/head_preview_8a7862f.js,/tb/_/buy_controller_bfff055.js,/tb/_/celebrity_expball_87cd404.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/celebrity_6d8fa24.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/npc_vote_action_b3f8ded.js,/tb/_/aside_ad_b3d4853.js,/tb/_/video_player_html5_b1304d8.js,/tb/_/video_player_5678bdc.js,/tb/_/avideo_b554617.js,/tb/_/search_back_8e0f1ba.js,/tb/_/topic_rank_b4f4b25.js,/tb/_/news_recommend_78ab97c.js,/tb/_/showlist_781bbee.js,/tb/_/cps_ad_6a3c1e2.js,/tb/_/page_aside_c59e8c4.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/npc_vote_action_b3f8ded.js,/tb/_/duoku_servers_dialog_2eaf095.js,/tb/_/duoku_servers_list_ab581bb.js,/tb/_/inform_manager_verify_phone_2befbc3.js,/tb/_/game_swap_words_edd1502.js,/tb/_/hao_tian_mirror_854bd07.js,/tb/_/params_xss_handler_bbb0828.js,/tb/_/mouse_pwd_f31d0b4.js,/tb/_/postor_common_d743e96.js,/tb/_/scroll_panel_9e28dd8.js,/tb/_/custom_emotion_c7f15af.js,/tb/_/ueditor_emotion_a903913.js\"></script>\n<script src=\"//tb1.bdstatic.com/??/tb/_/independent_emotion_aac4632.js,/tb/_/simple_poster_4121714.js,/tb/_/word_limit_c99778f.js,/tb/_/post_prefix_daad9e7.js,/tb/_/post_signature_4c43552.js,/tb/_/post_guessing_new_f924d5d.js,/tb/_/props_data_a25400f.js,/tb/_/bubble_factory_f970c47.js,/tb/_/complaint_bar_owner_8fddc2c.js,/tb/_/quick_reply_data_handler_256a70d.js,/tb/_/quick_reply_edit_9678e8c.js,/tb/_/post_marry_6ee69ee.js,/tb/_/poster_context_c5c4772.js,/tb/_/rich_poster_4873152.js,/tb/_/baidusearch_2832d79.js,/tb/_/stat_300888d.js,/tb/_/music_player_9fe7a02.js,/tb/_/no_auto_video_de13e7b.js,/tb/_/audio_player_3ce73ee.js,/tb/_/voice_player_9a9b6dc.js,/tb/_/voice_0a018d7.js,/tb/_/meizhi_vote_b66b525.js,/tb/_/welfare_icon_1437499.js,/tb/_/achieve_card_4fb9554.js,/tb/_/fancard_944a898.js,/tb/_/xiu8_follow_warn_bf7a2e8.js,/tb/_/focus_btn_d48447a.js,/tb/_/locality_pop_window_0777bb3.js,/tb/_/platform_spread_layer_927b358.js,/tb/_/pk_fixed_bubble_696f045.js\"></script>\n<script src=\"//tb1.bdstatic.com/??/tb/_/platform_spread_video_5835970.js,/tb/_/popWindow_62e5db8.js,/tb/_/image_flash_editor_629e8f5.js,/tb/_/editor_pic_meizhi_2636c0d.js,/tb/_/meizhi_postor_af0d8da.js,/tb/_/frs_stamp_notice_7e52ec6.js,/tb/_/postor_service_53ed8e8.js,/tb/_/image_water_7d6a194.js,/tb/_/interest_smiley_863907f.js,/tb/_/comtrial_ec0f124.js,/tb/_/skin_click_5308cee.js,/tb/_/game_pop_window_55af3b8.js,/tb/_/bd_share_567729f.js,/tb/_/url_check_a9f025b.js,/tb/_/residual_a0c9367.js,/tb/_/magic_props_4930cc2.js,/tb/_/feedback_22ddff1.js,/tb/_/nameplate_recast_f965ef3.js,/tb/_/tshow_out_date_warn_1e57655.js,/tb/_/pb_track_a6c2233.js,/tb/_/umoney_promotion_dialog_3e69cde.js,/tb/_/advertise_right_74d24fc.js,/tb/_/grab_treasure_dialog_success_ad7b720.js,/tb/_/focus_btn_d48447a.js,/tb/_/fixed_bar_163a2a0.js,/tb/_/fixed_daoliu_f57f4ca.js,/tb/_/bright_5275f61.js,/tb/_/tdou_view_pay_bfa4cf6.js,/tb/_/npc_vote_action_b3f8ded.js,/tb/_/focus_btn_d48447a.js\"></script>\n<script src=\"//tb1.bdstatic.com/??/tb/_/thread_recommend_74cb56d.js,/tb/_/info_collection_24e3fec.js,/tb/_/tpl_ext_1373d5a.js,/tb/_/aside_float_bar_742aedf.js,/tb/_/magic_props_139f233.js\"></script>\n<script>window.modDiscardTemplate={};</script>\n<script>    _.Module.use('creativeplatform/widget/aopApp', [[]]);</script><script>    _.Module.use('pcommon/widget/preview', [], function(){});  </script><script>    _.Module.use('common/widget/httpTransform', [], function(){});  </script><script>_.Module.use('common/widget/suggestion', [], function(){});</script><script>_.Module.use('common/widget/searchBright',[$('#head'),{    style:'bright',    theme:'bright_pb',    forumName:'以太比特',    searchFixed:'',    sugOn:'1'}]);</script><script>PageData.user.is_like = 0;PageData.user.is_block = 0;PageData.is_sign_in = 0; PageData.is_star = 0;PageData.sign_forum_info = {\"is_on\":true,\"is_filter\":false,\"forum_info\":{\"forum_id\":27927174,\"level_1_dir_name\":\"\\u641e\\u7b11\"},\"current_rank_info\":{\"sign_count\":3931,\"member_count\":309472,\"sign_rank\":15,\"dir_rate\":\"0.1\"},\"level_1_dir_name\":\"\\u641e\\u7b11\",\"level_2_dir_name\":\"\\u641e\\u7b11\",\"yesterday_rank_info\":{\"sign_count\":4476,\"member_count\":309375,\"sign_rank\":15,\"dir_rate\":\"0.1\"},\"weekly_rank_info\":{\"sign_count\":4316,\"member_count\":308123,\"sign_rank\":15},\"monthly_rank_info\":{\"sign_count\":4270,\"member_count\":300344,\"sign_rank\":15}},PageData.memberTitle = \"会员\";PageData.memberNumber = \"\";PageData.is_activity_sign = '';    PageData.annualMemberMode = false;_.Module.use('ucenter/widget/sign_mod',[$('#sign_mod'),{'hasClass': 1, 'page': ''}]);</script><script>    _.Module.use('frs/widget/forum_card');    _.Module.use('frs/widget/forum_card/focus_btn',[{        \"islike\":\"0\",        \"isCategoryOfGame\": true,        \"forum_name\":\"以太比特\" ,        \"fr\":\"\",        \"userForumList\": []}]);</script><script>_.Module.use('common/widget/tbnav_bright', [$('#tb_nav'),{jq_search:$('#tb_nav').find('.j_search_internal_forum'),forumName:'以太比特'},{promotion_setting: [[]]}]);</script><script type=\"text/javascript\" src=\"//passport.baidu.com/passApi/js/uni_forceverify_wrapper.js\"></script><script></script><script>    _.Module.use(\"pb/widget/ForumTitle\",[{        'is_pic_act_underway': false}],  function(forumTitle){        window.forumTitle = forumTitle;    });</script><script>    _.Module.use('pb/widget/saveFace', [{        'isLogin': \"1\",        'props': {\"all_level\":{\"2\":{\"end_time\":\"1421113470\",\"level\":2,\"score_limit\":8000}},\"level\":{\"end_time\":\"1421113470\",\"expired_notify\":1,\"expiring_notify\":1,\"left_num\":0,\"max_free_score\":8000,\"open_status\":null,\"pic_url\":null,\"props_category\":105,\"props_id\":2,\"props_type\":0,\"update_time\":null,\"used_status\":1}},        'forumId': \"27927174\",        'threadId': \"9117905169\"    }], function(){});</script><script>    _.Module.use(\"encourage/widget/pb_marry\", {});</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    _.Module.use('tbmall/widget/pb_post_foot_send_gift', {        container: '.post-foot-send-gift-container',        box: '.post-foot-send-gift',        authorId: 3424043879,        postId: 150719031818,        presentNum: 0});</script><script>    var idx = 0;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 1;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('adsense/widget/fengchao_ad_tpl', [{        'commonJsData': \"!function(t){&quot;use strict&quot;;function e(t,e){if(t){var n=new Date().getTime(),r=new Image;t+=&quot;&amp;rand=&quot;+(n+Math.random()),window.ecomLogImage||(window.ecomLogImage={}),window.ecomLogImage[&quot;--IMAGE&quot;+n]=r,e=e||{};var o=!1;r.onload=r.onerror=r.onabort=function(i){if(!e.charge){if(i&amp;&amp;&quot;load&quot;!==i.type){if(o)&quot;error&quot;in e&amp;&amp;e.error();else{r.src=t,o=!0;return}}else&quot;load&quot;in e&amp;&amp;e.load()}r.onload=r.onerror=r.onabort=null,window.ecomLogImage[&quot;--IMAGE&quot;+n]=null,r=null},r.src=t}}var n,r=function(){var t,e,n,r=0,o=0,i=0,a=0,s=0,c=0,u=0,f=0,h=\\/link\\\\?url\\\\=([^\\\\&amp;]+)\\/,l=\\/\\\\?url\\\\=([^\\\\.]+)\\\\.\\/,p=&quot;data-cklink&quot;,d=\\/[?&amp;]tn=([^&amp;]*)\\/;function v(t){if(!t)return!1;var e=h.exec(t)||l.exec(t);return!!e&amp;&amp;(h.exec(t)?e[1].length&lt;20?e[1]:e[1].substr(0,20):e[1])}function g(n){var a,s,h,l,d,g=(l=f.href,d=f.getAttribute(p),v(l)||v(d));!1!==g&amp;&amp;(a=&quot;&amp;ck=&quot;+[function(t,e){for(var n=0,r=0;r&lt;i*e%99+9;r++)n+=t.charCodeAt(u*r%t.length);return n}(g,n),i,u,Math.round(r),Math.round(o),Math.round(t),Math.round(e),c].join(&quot;.&quot;),s=f.href,h=f.getAttribute(p),s&amp;&amp;v(s)&amp;&amp;(f.href=y(s,a)+m(s)),h&amp;&amp;v(h)&amp;&amp;f.setAttribute(p,y(h,a)+m(h)))}function m(t){var e=&quot;&quot;;if(-1===t.indexOf(&quot;&amp;shh=&quot;)&amp;&amp;-1===t.indexOf(&quot;?shh=&quot;)&amp;&amp;(e=&quot;&amp;shh=&quot;+location.hostname),-1===t.indexOf(&quot;&amp;sht=&quot;)&amp;&amp;-1===t.indexOf(&quot;?sht=&quot;)){var n=location.href.match(d);n&amp;&amp;(e+=&quot;&amp;sht=&quot;+n[1])}return e}function y(t,e){return v(t)&amp;&amp;(-1===t.indexOf(&quot;&amp;ck=&quot;)?t+=e:t=t.replace(\\/&amp;ck=[\\\\d.]*\\/,e)),t}function b(n,h,l){void 0===n.length&amp;&amp;(n=[n]);for(var d=n.length,b=0,w=[function(n){var s;f=(s=(s=n)||window.event).target||s.srcElement,i++,void 0===t&amp;&amp;(t=s.clientX),void 0===e&amp;&amp;(e=s.clientY),r=0,o=0,u=0,c=0,a=new Date().getTime(),g(h)},function(t){!function(t,e){for(f=(t=t||window.event).target||t.srcElement;f&amp;&amp;&quot;A&quot;!==f.tagName;)f=f.parentNode;s=new Date().getTime(),u=9999,r=t.clientX,o=t.clientY,c=0===a?0:s-a,g(e)}(t,h)},function(t){u=new Date().getTime()-s,g(h)}];b&lt;d;b++)l||function(t){var e=t.href;if(v(e)){var n=&quot;&amp;ck=&quot;+[0,i,u,Math.round(r),Math.round(o),0,0,c].join(&quot;.&quot;),a=t.getAttribute(p);e&amp;&amp;(t.href=y(e,n)+m(e)),a&amp;&amp;t.setAttribute(p,y(a,n)+m(a))}}(n[b]),function(t,e,n){for(var r,o,i=e.length,a=0;a&lt;i;a++)r=e[a],o=n[a],window.attachEvent?t.attachEvent(&quot;on&quot;+r,o):t.addEventListener(r,o,!1)}(n[b],[&quot;mouseover&quot;,&quot;mousedown&quot;,&quot;mouseup&quot;],w)}return{getInstance:function(t){return n||(n={addAdsCk:b}),n}}},o={init:function(t,e,o){var i=r().getInstance(t);n=i;for(var a=document.querySelectorAll(t),s=0;s&lt;a.length;s++){var c=a[s],u=c.getAttribute(&quot;data-ecimtimesign&quot;)||c.getAttribute(&quot;data-pz-sign&quot;)||e,f=c.getElementsByTagName(&quot;A&quot;);i.addAdsCk(f,u,o)}return i},getInstance:function(){return n}},i=&quot;undefined&quot;!=typeof globalThis?globalThis:&quot;undefined&quot;!=typeof window?window:&quot;undefined&quot;!=typeof global?global:&quot;undefined&quot;!=typeof self?self:{},a={exports:{}};!function(t){var e=Object.prototype.hasOwnProperty,n=&quot;~&quot;;function r(){}function o(t,e,n){this.fn=t,this.context=e,this.once=n||!1}function i(t,e,r,i,a){if(&quot;function&quot;!=typeof r)throw TypeError(&quot;The listener must be a function&quot;);var s=new o(r,i||t,a),c=n?n+e:e;return t._events[c]?t._events[c].fn?t._events[c]=[t._events[c],s]:t._events[c].push(s):(t._events[c]=s,t._eventsCount++),t}function a(t,e){0==--t._eventsCount?t._events=new r:delete t._events[e]}function s(){this._events=new r,this._eventsCount=0}Object.create&amp;&amp;(r.prototype=Object.create(null),new r().__proto__||(n=!1)),s.prototype.eventNames=function(){var t,r,o=[];if(0===this._eventsCount)return o;for(r in t=this._events)e.call(t,r)&amp;&amp;o.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?o.concat(Object.getOwnPropertySymbols(t)):o},s.prototype.listeners=function(t){var e=n?n+t:t,r=this._events[e];if(!r)return[];if(r.fn)return[r.fn];for(var o=0,i=r.length,a=Array(i);o&lt;i;o++)a[o]=r[o].fn;return a},s.prototype.listenerCount=function(t){var e=n?n+t:t,r=this._events[e];return r?r.fn?1:r.length:0},s.prototype.emit=function(t,e,r,o,i,a){var s=n?n+t:t;if(!this._events[s])return!1;var c,u,f=this._events[s],h=arguments.length;if(f.fn){switch(f.once&amp;&amp;this.removeListener(t,f.fn,void 0,!0),h){case 1:return f.fn.call(f.context),!0;case 2:return f.fn.call(f.context,e),!0;case 3:return f.fn.call(f.context,e,r),!0;case 4:return f.fn.call(f.context,e,r,o),!0;case 5:return f.fn.call(f.context,e,r,o,i),!0;case 6:return f.fn.call(f.context,e,r,o,i,a),!0}for(u=1,c=Array(h-1);u&lt;h;u++)c[u-1]=arguments[u];f.fn.apply(f.context,c)}else{var l,p=f.length;for(u=0;u&lt;p;u++)switch(f[u].once&amp;&amp;this.removeListener(t,f[u].fn,void 0,!0),h){case 1:f[u].fn.call(f[u].context);break;case 2:f[u].fn.call(f[u].context,e);break;case 3:f[u].fn.call(f[u].context,e,r);break;case 4:f[u].fn.call(f[u].context,e,r,o);break;default:if(!c)for(l=1,c=Array(h-1);l&lt;h;l++)c[l-1]=arguments[l];f[u].fn.apply(f[u].context,c)}}return!0},s.prototype.on=function(t,e,n){return i(this,t,e,n,!1)},s.prototype.once=function(t,e,n){return i(this,t,e,n,!0)},s.prototype.removeListener=function(t,e,r,o){var i=n?n+t:t;if(!this._events[i])return this;if(!e)return a(this,i),this;var s=this._events[i];if(s.fn)s.fn!==e||o&amp;&amp;!s.once||r&amp;&amp;s.context!==r||a(this,i);else{for(var c=0,u=[],f=s.length;c&lt;f;c++)(s[c].fn!==e||o&amp;&amp;!s[c].once||r&amp;&amp;s[c].context!==r)&amp;&amp;u.push(s[c]);u.length?this._events[i]=1===u.length?u[0]:u:a(this,i)}return this},s.prototype.removeAllListeners=function(t){var e;return t?(e=n?n+t:t,this._events[e]&amp;&amp;a(this,e)):(this._events=new r,this._eventsCount=0),this},s.prototype.off=s.prototype.removeListener,s.prototype.addListener=s.prototype.on,s.prefixed=n,s.EventEmitter=s,t.exports=s}(a);var s=(b=a.exports)&amp;&amp;b.__esModule&amp;&amp;Object.prototype.hasOwnProperty.call(b,&quot;default&quot;)?b.default:b;function c(t){return(c=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}function u(t,e){return(u=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}var f={},h={},l=function(t){!function(t,e){if(&quot;function&quot;!=typeof e&amp;&amp;null!==e)throw TypeError(&quot;Super expression must either be null or a function&quot;);t.prototype=Object.create(e&amp;&amp;e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&amp;&amp;u(t,e)}(o,t);var e,n,r=(e=function(){if(&quot;undefined&quot;==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if(&quot;function&quot;==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(t){return!1}}(),function(){var t,n,r=c(o);if(e){var i=c(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return(t=n)&amp;&amp;(&quot;object&quot;==(t&amp;&amp;&quot;undefined&quot;!=typeof Symbol&amp;&amp;t.constructor===Symbol?&quot;symbol&quot;:typeof t)||&quot;function&quot;==typeof t)?t:function(t){if(void 0===t)throw ReferenceError(&quot;this hasn&#039;t been initialised - super() hasn&#039;t been called&quot;);return t}(this)});function o(t){!function(t,e){if(!(t instanceof e))throw TypeError(&quot;Cannot call a class as a function&quot;)}(this,o);var e=r.call(this);return f=t,h=t,e}return n=[{key:&quot;set&quot;,value:function(t,e){for(var n=this.get(t),r=t.split(&quot;.&quot;),o=f,i=0,a=r.length;i&lt;a;i++)void 0===o[r[i]]&amp;&amp;(o[r[i]]={}),i===a-1&amp;&amp;(o[r[i]]=e,this.emit(&quot;env:change[&quot;.concat(t,&quot;]&quot;),[n,e])),o=o[r[i]]}},{key:&quot;get&quot;,value:function(t){for(var e=t.split(&quot;.&quot;),n=f,r=0,o=e.length;r&lt;o;r++){if(void 0===n[e[r]])return n[e[r]];n=n[e[r]]}return n}},{key:&quot;getValue&quot;,value:function(){return Object.assign({},f)}},{key:&quot;getInitValue&quot;,value:function(){return Object.assign({},h)}}],function(t,e){for(var n=0;n&lt;e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,&quot;value&quot;in r&amp;&amp;(r.writable=!0),Object.defineProperty(t,r.key,r)}}(o.prototype,n),o}(s),p=null,d={getInstance:function(t){return p||(p=new l(t)),p}},v=&quot;https:\\/\\/fclick.baidu.com\\/w.gif&quot;,g=&quot;https:\\/\\/fclickv4.baidu.com\\/w.gif&quot;;function m(t){var e,n=d.getInstance().getValue();!t.searchId&amp;&amp;n&amp;&amp;n.searchid&amp;&amp;(t.searchId=n.searchid),(null==n?void 0:null===(e=n.flags)||void 0===e?void 0:e.expFlagFixAsynSlideLog)||&quot;ecom_wise_listen_n&quot;!==t.tag||!n||(!t.asp_time&amp;&amp;n.aspTime&amp;&amp;(t.asp_time=n.aspTime),!t.query&amp;&amp;n.queryWordEnc&amp;&amp;(t.query=n.queryWordEnc),t.queryUtf8||!n.query||(t.queryUtf8=n.query));var r=[];for(var o in t)t.hasOwnProperty(o)&amp;&amp;r.push(encodeURIComponent(o)+&quot;=&quot;+encodeURIComponent(t[o]));return r.join(&quot;&amp;&quot;)}function y(t){var n=arguments.length&gt;1&amp;&amp;void 0!==arguments[1]&amp;&amp;arguments[1],r=d.getInstance().getValue();if(r&amp;&amp;r.flags&amp;&amp;r.flags.changeFclickToBeacon){!function(t){var n,r=arguments.length&gt;1&amp;&amp;void 0!==arguments[1]&amp;&amp;arguments[1],o=new Date().getTime();t&amp;&amp;(t.rand=o+Math.random()),function(t){var e=!1;try{t&amp;&amp;navigator.sendBeacon&amp;&amp;(e=navigator.sendBeacon(t))}catch(t){}return e}(n=[r?g:v,m(t)].join(&quot;?&quot;))||e(n)}(t,n);return}e([n?g:v,m(t)].join(&quot;?&quot;))}var b,w,_=function(t){this.env=t||{}};_.prototype={report:function(t){y(this.extend(this.env,{tag:&quot;ps-js-error&quot;,datetime:new Date().getTime(),message:t.message,stack:t.stack}))},support:function(t,e){if(&quot;function&quot;==typeof t){e=t;try{e()}catch(t){this.report(t)}}else{var n=t[e];t[e]=function(){for(var e=arguments.length,r=Array(e),o=0;o&lt;e;o++)r[o]=arguments[o];try{n.apply(t,r)}catch(t){this.report(t)}}}},extend:function(){for(var t={},e=0,n=arguments.length;e&lt;n;e++)if(&quot;[object Object]&quot;===Object.prototype.toString.call(arguments[e]))for(var r in arguments[e])t[r]=arguments[e][r];return t}};var I,E={getInstance:function(t){return w||(w=new _(t)),w}},O=function(){var t,e,n,r=0,o=0,i=0,a=0,s=0,c=0,u=0,f=0,h=\\/link\\\\?url\\\\=([^\\\\&amp;]+)\\/,l=\\/\\\\?url\\\\=([^\\\\.]+)\\\\.\\/,p=&quot;data-cklink&quot;,d=\\/[?&amp;]tn=([^&amp;]*)\\/;function v(t){if(!t)return!1;var e=h.exec(t)||l.exec(t);return!!e&amp;&amp;(h.exec(t)?e[1].length&lt;20?e[1]:e[1].substr(0,20):e[1])}function g(n){var a,s,h,l,d,g=(l=f.href,d=f.getAttribute(p),v(l)||v(d));!1!==g&amp;&amp;(a=&quot;&amp;ck=&quot;+[function(t,e){for(var n=0,r=0;r&lt;i*e%99+9;r++)n+=t.charCodeAt(u*r%t.length);return n}(g,n),i,u,Math.round(r),Math.round(o),Math.round(t),Math.round(e),c].join(&quot;.&quot;),s=f.href,h=f.getAttribute(p),s&amp;&amp;v(s)&amp;&amp;(f.href=y(s,a)+m(s)),h&amp;&amp;v(h)&amp;&amp;f.setAttribute(p,y(h,a)+m(h)))}function m(t){var e=&quot;&quot;;if(-1===t.indexOf(&quot;&amp;shh=&quot;)&amp;&amp;-1===t.indexOf(&quot;?shh=&quot;)&amp;&amp;(e=&quot;&amp;shh=&quot;+location.hostname),-1===t.indexOf(&quot;&amp;sht=&quot;)&amp;&amp;-1===t.indexOf(&quot;?sht=&quot;)){var n=location.href.match(d);n&amp;&amp;(e+=&quot;&amp;sht=&quot;+n[1])}return e}function y(t,e){return v(t)&amp;&amp;(-1===t.indexOf(&quot;&amp;ck=&quot;)?t+=e:t=t.replace(\\/&amp;ck=[\\\\d.]*\\/,e)),t}function b(n,h,l){void 0===n.length&amp;&amp;(n=[n]);for(var d=n.length,b=0,w=[function(n){!function(n,s){for(f=(n=n||window.event).target||n.srcElement;f&amp;&amp;&quot;A&quot;!==f.tagName;)f=f.parentNode;i++,void 0===t&amp;&amp;(t=n.clientX),void 0===e&amp;&amp;(e=n.clientY),r=0,o=0,u=0,c=0,a=new Date().getTime(),g(s)}(n,h)},function(t){!function(t,e){for(f=(t=t||window.event).target||t.srcElement;f&amp;&amp;&quot;A&quot;!==f.tagName;)f=f.parentNode;s=new Date().getTime(),u=9999,r=t.clientX,o=t.clientY,c=0===a?0:s-a,g(e)}(t,h)},function(t){u=new Date().getTime()-s,g(h)}];b&lt;d;b++)l||function(t){var e=t.href;if(v(e)){var n=&quot;&amp;ck=&quot;+[0,i,u,Math.round(r),Math.round(o),0,0,c].join(&quot;.&quot;),a=t.getAttribute(p);e&amp;&amp;(t.href=y(e,n)+m(e)),a&amp;&amp;t.setAttribute(p,y(a,n)+m(a))}}(n[b]),function(t,e,n){for(var r,o,i=e.length,a=0;a&lt;i;a++)r=e[a],o=n[a],window.attachEvent?t.attachEvent(&quot;on&quot;+r,o):t.addEventListener(r,o,!1)}(n[b],[&quot;mouseover&quot;,&quot;mousedown&quot;,&quot;mouseup&quot;],w)}return{getInstance:function(t){return n||(n={addAdsCk:b}),n}}},A={init:function(t,e,n){var r=O().getInstance(t);I=r;for(var o=document.querySelectorAll(t),i=0;i&lt;o.length;i++){var a=o[i],s=a.getAttribute(&quot;data-ecimtimesign&quot;)||a.getAttribute(&quot;data-pz-sign&quot;)||e,c=a.getElementsByTagName(&quot;A&quot;);r.addAdsCk(c,s,n)}return r},getInstance:function(){return I}};function R(t,e){return null!=e&amp;&amp;&quot;undefined&quot;!=typeof Symbol&amp;&amp;e[Symbol.hasInstance]?!!e[Symbol.hasInstance](t):t instanceof e}function S(t){for(var e=t.target||t.srcElement;e&amp;&amp;&quot;A&quot;!==e.tagName;)e=e.parentNode;var n=e.href;if(x(n)){var r,o=new URLSearchParams(n).get(&quot;ck&quot;);o&amp;&amp;k(e,[0,&quot;00000000&quot;===(r=o.split(&quot;.&quot;)).join(&quot;&quot;)?1:&quot;0&quot;===r[2]&amp;&amp;&quot;0&quot;===r[3]&amp;&amp;&quot;0&quot;===r[4]&amp;&amp;&quot;0&quot;===r[7]?2:3,0,0])}}function x(t){return&quot;string&quot;==typeof t&amp;&amp;-1!==t.indexOf(&quot;baidu.php&quot;)}function T(t,e){var n=window.navigator.mimeTypes;for(var r in n)if(n[r][t]===e)return!0;return!1}function k(t,e){var n=t.href;if(x(n)){var r=new URLSearchParams(n),o=r.get(&quot;us&quot;),i=[];if(o){var a=&quot;newvui&quot;===o?[]:o.split(&quot;.&quot;);i=e.map(function(t,n){return e[n]?e[n]:a[n]||0})}else i=e.map(function(t){return t||0});r.set(&quot;us&quot;,i.join(&quot;.&quot;)),t.href=decodeURIComponent(r.toString())}}function M(t,e){var n=!0,r=!1,o=void 0;try{for(var i,a=t[Symbol.iterator]();!(n=(i=a.next()).done);n=!0){var s=i.value;&quot;attributes&quot;===s.type&amp;&amp;&quot;se_prerender_url&quot;===s.attributeName&amp;&amp;&quot;complete&quot;===s.target.getAttribute(&quot;se_prerender_url&quot;)&amp;&amp;(k(s.target,[0,0,0,1]),y({tag:&quot;ecom_msa_tmp_4&quot;,action:&quot;prerender&quot;,href:s.target.getAttribute(&quot;href&quot;)}))}}catch(t){r=!0,o=t}finally{try{n||null==a.return||a.return()}finally{if(r)throw o}}}!function(t){var e,n,r=function(){try{if(t.URLSearchParams&amp;&amp;&quot;bar&quot;===new t.URLSearchParams(&quot;foo=bar&quot;).get(&quot;foo&quot;))return t.URLSearchParams}catch(t){}return null}(),o=r&amp;&amp;&quot;a=1&quot;===new r({a:1}).toString(),i=r&amp;&amp;&quot;+&quot;===new r(&quot;s=%2B&quot;).get(&quot;s&quot;),a=&quot;__URLSearchParams__&quot;,s=!r||((e=new r).append(&quot;s&quot;,&quot; &amp;&quot;),&quot;s=+%26&quot;===e.toString()),c=h.prototype,u=!!(t.Symbol&amp;&amp;t.Symbol.iterator);if(!r||!o||!i||!s){c.append=function(t,e){g(this[a],t,e)},c.delete=function(t){delete this[a][t]},c.get=function(t){var e=this[a];return this.has(t)?e[t][0]:null},c.getAll=function(t){var e=this[a];return this.has(t)?e[t].slice(0):[]},c.has=function(t){return y(this[a],t)},c.set=function(t,e){this[a][t]=[&quot;&quot;+e]},c.toString=function(){var t,e,n,r,o=this[a],i=[];for(e in o)for(t=0,n=l(e),r=o[e];t&lt;r.length;t++)i.push(n+&quot;=&quot;+l(r[t]));return i.join(&quot;&amp;&quot;)},i&amp;&amp;r&amp;&amp;!o&amp;&amp;t.Proxy?(n=new Proxy(r,{construct:function(t,e){return new t(new h(e[0]).toString())}})).toString=Function.prototype.toString.bind(h):n=h,Object.defineProperty(t,&quot;URLSearchParams&quot;,{value:n});var f=t.URLSearchParams.prototype;f.polyfill=!0,f.forEach=f.forEach||function(t,e){var n=v(this.toString());Object.getOwnPropertyNames(n).forEach(function(r){n[r].forEach(function(n){t.call(e,n,r,this)},this)},this)},f.sort=f.sort||function(){var t,e,n,r=v(this.toString()),o=[];for(t in r)o.push(t);for(o.sort(),e=0;e&lt;o.length;e++)this.delete(o[e]);for(e=0;e&lt;o.length;e++){var i=o[e],a=r[i];for(n=0;n&lt;a.length;n++)this.append(i,a[n])}},f.keys=f.keys||function(){var t=[];return this.forEach(function(e,n){t.push(n)}),d(t)},f.values=f.values||function(){var t=[];return this.forEach(function(e){t.push(e)}),d(t)},f.entries=f.entries||function(){var t=[];return this.forEach(function(e,n){t.push([n,e])}),d(t)},u&amp;&amp;(f[t.Symbol.iterator]=f[t.Symbol.iterator]||f.entries)}function h(t){(R(t=t||&quot;&quot;,URLSearchParams)||R(t,h))&amp;&amp;(t=t.toString()),this[a]=v(t)}function l(t){var e={&quot;!&quot;:&quot;%21&quot;,&quot;&#039;&quot;:&quot;%27&quot;,&quot;(&quot;:&quot;%28&quot;,&quot;)&quot;:&quot;%29&quot;,&quot;~&quot;:&quot;%7E&quot;,&quot;%20&quot;:&quot;+&quot;,&quot;%00&quot;:&quot;\\\\x00&quot;};return encodeURIComponent(t).replace(\\/[!&#039;\\\\(\\\\)~]|%20|%00\\/g,function(t){return e[t]})}function p(t){return t.replace(\\/[ +]\\/g,&quot;%20&quot;).replace(\\/(%[a-f0-9]{2})+\\/ig,function(t){return decodeURIComponent(t)})}function d(e){var n={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return u&amp;&amp;(n[t.Symbol.iterator]=function(){return n}),n}function v(t){var e={};if(&quot;object&quot;==typeof t){if(m(t))for(var n=0;n&lt;t.length;n++){var r=t[n];if(m(r)&amp;&amp;2===r.length)g(e,r[0],r[1]);else throw TypeError(&quot;Failed to construct &#039;URLSearchParams&#039;: Sequence initializer must only contain pair elements&quot;)}else for(var o in t)t.hasOwnProperty(o)&amp;&amp;g(e,o,t[o])}else{0===t.indexOf(&quot;?&quot;)&amp;&amp;(t=t.slice(1));for(var i=t.split(&quot;&amp;&quot;),a=0;a&lt;i.length;a++){var s=i[a],c=s.indexOf(&quot;=&quot;);-1&lt;c?g(e,p(s.slice(0,c)),p(s.slice(c+1))):s&amp;&amp;g(e,p(s),&quot;&quot;)}}return e}function g(t,e,n){var r=&quot;string&quot;==typeof n?n:null!=n&amp;&amp;&quot;function&quot;==typeof n.toString?n.toString():JSON.stringify(n);y(t,e)?t[e].push(r):t[e]=[r]}function m(t){return!!t&amp;&amp;&quot;[object Array]&quot;===Object.prototype.toString.call(t)}function y(t,e){return Object.prototype.hasOwnProperty.call(t,e)}}(void 0!==i?i:&quot;undefined&quot;!=typeof window?window:i);var P={attributes:!0,childList:!1,subtree:!1},j={init:function(t,e){var n=&quot;&quot;;MutationObserver&amp;&amp;(n=new MutationObserver(M));for(var r=document.querySelectorAll(t),o=0;o&lt;r.length;o++)for(var i,a,s=r[o].getElementsByTagName(&quot;A&quot;),c=0;c&lt;s.length;c++)n&amp;&amp;n.observe(s[c],P),i=s[c],a=&quot;click&quot;,window.attachEvent?i.attachEvent(&quot;on&quot;+a,S):i.addEventListener(a,S,!1),k(s[c],[function(){var t=!1,e=window.navigator,n=e.userAgent;if(window.chrome){var r=n.replace(\\/^.*Chrome\\\\\\/([\\\\d]+).*$\\/,&quot;$1&quot;);window.chrome.adblock2345||window.chrome.common2345||(T(&quot;type&quot;,&quot;application\\/360softmgrplugin&quot;)||T(&quot;type&quot;,&quot;application\\/mozilla-npqihooquicklogin&quot;)?t=!0:r&gt;36&amp;&amp;window.showModalDialog?t=!0:!(r&gt;45)||(t=T(&quot;type&quot;,&quot;application\\/vnd.chromium.remoting-viewer&quot;))||!(r&gt;=69)||(t=T(&quot;type&quot;,&quot;application\\/hwepass2001.installepass2001&quot;)||T(&quot;type&quot;,&quot;application\\/asx&quot;)))}return t?T(&quot;type&quot;,&quot;application\\/gameplugin&quot;)?2:e&amp;&amp;void 0!==e.connection&amp;&amp;void 0===e.connection.saveData?2:1:0}(),0,0,0])}};!function(){if(&quot;object&quot;==typeof window){if(&quot;IntersectionObserver&quot;in window&amp;&amp;&quot;IntersectionObserverEntry&quot;in window&amp;&amp;&quot;intersectionRatio&quot;in window.IntersectionObserverEntry.prototype){&quot;isIntersecting&quot;in window.IntersectionObserverEntry.prototype||Object.defineProperty(window.IntersectionObserverEntry.prototype,&quot;isIntersecting&quot;,{get:function(){return this.intersectionRatio&gt;0}});return}var t=window.document,e=[];r.prototype.THROTTLE_TIMEOUT=100,r.prototype.POLL_INTERVAL=null,r.prototype.USE_MUTATION_OBSERVER=!0,r.prototype.observe=function(t){if(!this._observationTargets.some(function(e){return e.element==t})){if(!(t&amp;&amp;1==t.nodeType))throw Error(&quot;target must be an Element&quot;);this._registerInstance(),this._observationTargets.push({element:t,entry:null}),this._monitorIntersections(),this._checkForIntersections()}},r.prototype.unobserve=function(t){this._observationTargets=this._observationTargets.filter(function(e){return e.element!=t}),this._observationTargets.length||(this._unmonitorIntersections(),this._unregisterInstance())},r.prototype.disconnect=function(){this._observationTargets=[],this._unmonitorIntersections(),this._unregisterInstance()},r.prototype.takeRecords=function(){var t=this._queuedEntries.slice();return this._queuedEntries=[],t},r.prototype._initThresholds=function(t){var e=t||[0];return Array.isArray(e)||(e=[e]),e.sort().filter(function(t,e,n){if(&quot;number&quot;!=typeof t||isNaN(t)||t&lt;0||t&gt;1)throw Error(&quot;threshold must be a number between 0 and 1 inclusively&quot;);return t!==n[e-1]})},r.prototype._parseRootMargin=function(t){var e=(t||&quot;0px&quot;).split(\\/\\\\s+\\/).map(function(t){var e=\\/^(-?\\\\d*\\\\.?\\\\d+)(px|%)$\\/.exec(t);if(!e)throw Error(&quot;rootMargin must be specified in pixels or percent&quot;);return{value:parseFloat(e[1]),unit:e[2]}});return e[1]=e[1]||e[0],e[2]=e[2]||e[0],e[3]=e[3]||e[1],e},r.prototype._monitorIntersections=function(){!this._monitoringIntersections&amp;&amp;(this._monitoringIntersections=!0,this.POLL_INTERVAL?this._monitoringInterval=setInterval(this._checkForIntersections,this.POLL_INTERVAL):(o(window,&quot;resize&quot;,this._checkForIntersections,!0),o(t,&quot;scroll&quot;,this._checkForIntersections,!0),this.USE_MUTATION_OBSERVER&amp;&amp;&quot;MutationObserver&quot;in window&amp;&amp;(this._domObserver=new MutationObserver(this._checkForIntersections),this._domObserver.observe(t,{attributes:!0,childList:!0,characterData:!0,subtree:!0}))))},r.prototype._unmonitorIntersections=function(){this._monitoringIntersections&amp;&amp;(this._monitoringIntersections=!1,clearInterval(this._monitoringInterval),this._monitoringInterval=null,i(window,&quot;resize&quot;,this._checkForIntersections,!0),i(t,&quot;scroll&quot;,this._checkForIntersections,!0),this._domObserver&amp;&amp;(this._domObserver.disconnect(),this._domObserver=null))},r.prototype._checkForIntersections=function(){var t=this._rootIsInDom(),e=t?this._getRootRect():s();this._observationTargets.forEach(function(r){var o=r.element,i=a(o),s=this._rootContainsTarget(o),c=r.entry,u=t&amp;&amp;s&amp;&amp;this._computeTargetAndRootIntersection(o,e),f=r.entry=new n({time:window.performance&amp;&amp;performance.now&amp;&amp;performance.now(),target:o,boundingClientRect:i,rootBounds:e,intersectionRect:u});c?t&amp;&amp;s?this._hasCrossedThreshold(c,f)&amp;&amp;this._queuedEntries.push(f):c&amp;&amp;c.isIntersecting&amp;&amp;this._queuedEntries.push(f):this._queuedEntries.push(f)},this),this._queuedEntries.length&amp;&amp;this._callback(this.takeRecords(),this)},r.prototype._computeTargetAndRootIntersection=function(e,n){if(&quot;none&quot;!=window.getComputedStyle(e).display){for(var r=a(e),o=u(e),i=!1;!i;){var s=null,c=1==o.nodeType?window.getComputedStyle(o):{};if(&quot;none&quot;==c.display)return;if(o==this.root||o==t?(i=!0,s=n):o!=t.body&amp;&amp;o!=t.documentElement&amp;&amp;&quot;visible&quot;!=c.overflow&amp;&amp;(s=a(o)),s&amp;&amp;!(r=function(t,e){var n=Math.max(t.top,e.top),r=Math.min(t.bottom,e.bottom),o=Math.max(t.left,e.left),i=Math.min(t.right,e.right),a=i-o,s=r-n;return a&gt;=0&amp;&amp;s&gt;=0&amp;&amp;{top:n,bottom:r,left:o,right:i,width:a,height:s}}(s,r)))break;o=u(o)}return r}},r.prototype._getRootRect=function(){var e;if(this.root)e=a(this.root);else{var n=t.documentElement,r=t.body;e={top:0,left:0,right:n.clientWidth||r.clientWidth,width:n.clientWidth||r.clientWidth,bottom:n.clientHeight||r.clientHeight,height:n.clientHeight||r.clientHeight}}return this._expandRectByRootMargin(e)},r.prototype._expandRectByRootMargin=function(t){var e=this._rootMarginValues.map(function(e,n){return&quot;px&quot;==e.unit?e.value:e.value*(n%2?t.width:t.height)\\/100}),n={top:t.top-e[0],right:t.right+e[1],bottom:t.bottom+e[2],left:t.left-e[3]};return n.width=n.right-n.left,n.height=n.bottom-n.top,n},r.prototype._hasCrossedThreshold=function(t,e){var n=t&amp;&amp;t.isIntersecting?t.intersectionRatio||0:-1,r=e.isIntersecting?e.intersectionRatio||0:-1;if(n!==r)for(var o=0;o&lt;this.thresholds.length;o++){var i=this.thresholds[o];if(i==n||i==r||i&lt;n!=i&lt;r)return!0}},r.prototype._rootIsInDom=function(){return!this.root||c(t,this.root)},r.prototype._rootContainsTarget=function(e){return c(this.root||t,e)},r.prototype._registerInstance=function(){0&gt;e.indexOf(this)&amp;&amp;e.push(this)},r.prototype._unregisterInstance=function(){var t=e.indexOf(this);-1!=t&amp;&amp;e.splice(t,1)},window.IntersectionObserver=r,window.IntersectionObserverEntry=n}function n(t){this.time=t.time,this.target=t.target,this.rootBounds=t.rootBounds,this.boundingClientRect=t.boundingClientRect,this.intersectionRect=t.intersectionRect||s(),this.isIntersecting=!!t.intersectionRect;var e=this.boundingClientRect,n=e.width*e.height,r=this.intersectionRect,o=r.width*r.height;n?this.intersectionRatio=Number((o\\/n).toFixed(4)):this.intersectionRatio=this.isIntersecting?1:0}function r(t,e){var n,r,o,i=e||{};if(&quot;function&quot;!=typeof t)throw Error(&quot;callback must be a function&quot;);if(i.root&amp;&amp;1!=i.root.nodeType)throw Error(&quot;root must be an Element&quot;);this._checkForIntersections=(n=this._checkForIntersections.bind(this),r=this.THROTTLE_TIMEOUT,o=null,function(){o||(o=setTimeout(function(){n(),o=null},r))}),this._callback=t,this._observationTargets=[],this._queuedEntries=[],this._rootMarginValues=this._parseRootMargin(i.rootMargin),this.thresholds=this._initThresholds(i.threshold),this.root=i.root||null,this.rootMargin=this._rootMarginValues.map(function(t){return t.value+t.unit}).join(&quot; &quot;)}function o(t,e,n,r){&quot;function&quot;==typeof t.addEventListener?t.addEventListener(e,n,r||!1):&quot;function&quot;==typeof t.attachEvent&amp;&amp;t.attachEvent(&quot;on&quot;+e,n)}function i(t,e,n,r){&quot;function&quot;==typeof t.removeEventListener?t.removeEventListener(e,n,r||!1):&quot;function&quot;==typeof t.detatchEvent&amp;&amp;t.detatchEvent(&quot;on&quot;+e,n)}function a(t){var e;try{e=t.getBoundingClientRect()}catch(t){}return e?(e.width&amp;&amp;e.height||(e={top:e.top,right:e.right,bottom:e.bottom,left:e.left,width:e.right-e.left,height:e.bottom-e.top}),e):s()}function s(){return{top:0,bottom:0,left:0,right:0,width:0,height:0}}function c(t,e){for(var n=e;n;){if(n==t)return!0;n=u(n)}return!1}function u(t){var e=t.parentNode;return e&amp;&amp;11==e.nodeType&amp;&amp;e.host?e.host:e&amp;&amp;e.assignedSlot?e.assignedSlot.parentNode:e}}();var L=&quot;observer&quot;;function C(){}function N(t){var e=t.container,n=t.url,r=t.params;this.opts={container:e,url:n,params:void 0===r?{}:r},this.init()}N.prototype={constructor:N,init:function(){var t=this,e=t.opts.container;t.observer=new IntersectionObserver(t.observeCB.bind(t)),e&amp;&amp;Array.prototype.slice.call(document.querySelectorAll(e)).forEach(function(e){t.observer.observe(e)})},observe:function(t){this.observer.observe(t)},observeCB:function(t){var e=this;t.forEach(function(t){if(t.isIntersecting){var n=t.target;if(!n.getAttribute(L)){var r=e.combineData(n);e.log(r),e.observer.unobserve(n),n.setAttribute(L,1)}}})},combineData:function(t){var e=this.opts.params,n={data:{}};for(var r in e)if(e.hasOwnProperty(r)){var o=t.getAttribute(e[r]);&quot;&quot;!==o&amp;&amp;(n.data[r]=o)}return n},log:function(t){this.nclick(t)},nclick:function(t){var e=this.opts.url;t.rand=this.addRand();var n=&quot;&quot;.concat(e,&quot;?&quot;).concat(this.encodeSearchParams(t));this.imgRequest(n,t)},imgRequest:function(t,e){try{var n=e.rand,r=new Image;window[&quot;--IMAGE&quot;+n]=r,r.onload=r.onerror=r.onabort=function(){r.onload=r.onerror=r.onabort=null,r=null,window[&quot;--IMAGE&quot;+n]=C},r.src=t}catch(t){}},addRand:function(){return Math.random().toString(16).slice(2,8)+Math.random()},encodeSearchParams:function(t){var e=[];for(var n in t)if(t.hasOwnProperty(n)){var r=t[n];&quot;object&quot;==typeof r&amp;&amp;(r=JSON.stringify(r)),e.push([n,encodeURIComponent(r)].join(&quot;=&quot;))}return e.join(&quot;&amp;&quot;)}};var q={init:function(){new N({container:&quot;[data-nvk]&quot;,url:&quot;https:\\/\\/ada.baidu.com\\/udpl\\/exp&quot;,params:{exp:&quot;data-nvk&quot;}})}};t.PARAMS={},t.init=function(e){t.PARAMS=e;var n=&quot;.&quot;+t.PARAMS.resultClass;E.getInstance({}).support(function(){t.PARAMS.flags.tiebaCkFix&amp;&amp;-1!==[&quot;pc_tieba_list&quot;,&quot;pc_tieba_detail&quot;].indexOf(t.PARAMS.pageid)?A.init(n,t.PARAMS.imTimeSign):o.init(n,t.PARAMS.imTimeSign),q.init(),t.PARAMS.flags.tiebaCkFix&amp;&amp;-1!==[&quot;pc_tieba_list&quot;,&quot;pc_tieba_detail&quot;].indexOf(t.PARAMS.pageid)&amp;&amp;j.init(n,t.PARAMS)})},t.request=e}(this.ecomNsPcGlobal=this.ecomNsPcGlobal||{});\\n\\n            (function (variable) {\\n                window.ecomNsPcGlobal.init(variable);\\n            })({&quot;searchid&quot;:&quot;000000003236df83&quot;,&quot;eid&quot;:&quot;120201_120702_7869012_300003&quot;,&quot;bwsid&quot;:0,&quot;osid&quot;:0,&quot;pageid&quot;:&quot;pc_tieba_detail&quot;,&quot;baiduid&quot;:&quot;00E51832EC6DAA0D10E1C0699C5E6670&quot;,&quot;ovlid&quot;:&quot;129424-dz#129771-dz#122828-4#129937-dz#129551-1#129665-5#126544-4#121730-5#109505-1#129380-dz#119725-1#47135-dz#123nj-0&quot;,&quot;wpt&quot;:0,&quot;netType&quot;:0,&quot;cuid&quot;:&quot;&quot;,&quot;feedCuid&quot;:&quot;&quot;,&quot;query&quot;:&quot;%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&quot;,&quot;imTimeSign&quot;:73,&quot;asynMode&quot;:0,&quot;asynUrl&quot;:&quot;&quot;,&quot;isWiseDropDown&quot;:false,&quot;asynsid&quot;:&quot;&quot;,&quot;aspTime&quot;:1722942843174,&quot;sourceAdNum&quot;:{&quot;ads_2327&quot;:1},&quot;asynQuery&quot;:&quot;&quot;,&quot;jFieldLinkMap&quot;:{&quot;7R_iIDxwN4Nn8JspnaRfIZwZKYwqD7NjHw63p8B5hGyAp7WFg8o3J0&quot;:&quot;http:\\/\\/xsxh.haohuyue.com\\/xxs\\/xsx\\/html\\/zhxs.html&quot;},&quot;upAdNum&quot;:0,&quot;middleAdNum&quot;:0,&quot;downAdNum&quot;:0,&quot;flags&quot;:{&quot;fixPlusSign&quot;:true},&quot;variable&quot;:{},&quot;rsContent&quot;:[],&quot;ecomData204&quot;:&quot;&quot;,&quot;ecomData213&quot;:&quot;&quot;,&quot;ecomData217&quot;:&quot;&quot;,&quot;ad204Num&quot;:0,&quot;ad213Num&quot;:0,&quot;ad217Num&quot;:0,&quot;isHasImlp&quot;:false,&quot;adsInfo&quot;:{&quot;000000003236df83_1626_0&quot;:{&quot;ideaId&quot;:95926895337,&quot;docId&quot;:&quot;0&quot;,&quot;mts&quot;:[2410,2051]}},&quot;bdCid&quot;:93,&quot;bdPid&quot;:4,&quot;queryWordEnc&quot;:&quot;%D2%D4%CC%AB%B1%C8%CC%D8&quot;,&quot;wiseSt&quot;:&quot;&quot;,&quot;requestIpV4&quot;:3604745399,&quot;fnizebrab&quot;:&quot;&quot;,&quot;nsVerticalKdomainList&quot;:[],&quot;wiseExposureAds&quot;:[],&quot;is_rm_asyn&quot;:true,&quot;mod&quot;:&quot;&quot;,&quot;app_verison&quot;:&quot;&quot;,&quot;os_version&quot;:&quot;&quot;,&quot;bd_version&quot;:&quot;&quot;,&quot;ios_version&quot;:0,&quot;passportId&quot;:0,&quot;hasYunyingCard&quot;:false,&quot;wiseFrom&quot;:&quot;&quot;,&quot;resultClass&quot;:&quot;fc-000000003236df83-2327&quot;});\\n        \",    }]);</script><script>    _.Module.use('adsense/widget/fengchaoPbFeed', [{        'adIndex': 3,        'flowType': \"normal\"}]);</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 2;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 3;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 4;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 5;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 6;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 7;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 8;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 9;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 10;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 11;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 12;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 13;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 14;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 15;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 16;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 17;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 18;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 19;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 20;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 21;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 22;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 23;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 24;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 25;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 26;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 27;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 28;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('user/widget/SingleIcons');</script><script>if ($.trim($('.d_pb_icons').html()).length === 0) {    $('.d_pb_icons').hide();  }</script><script>    var idx = 29;    var cutImg = \"\";    function getCodeImg() {        var codeUrl = \"https://chart.apis.google.com/chart?chs=70x70&cht=qr&chld=L|0&chl=https://tieba.baidu.com/p/9117905169?fr=pc_novel&obj_source=pc&obj_name=a0-bindex-c-d-e0\";        var imgDom = $(\"#cutImg\");        var backImg = \"https://mpics.bdstatic.com/qm/202310/pic_LKjuU5_1698313594.png\";        var img = new Image();        img.src = codeUrl;        img.onerror = function() {            $.stats.track('pb_novel_cut', 'img-err', 'pb', 'view');            imgDom.attr('src', backImg);        };    }    if (idx === 0 && cutImg && cutImg.length) {        $.stats.track('pb_novel_cut', 'show', 'pb', 'view');        getCodeImg();    }</script><script>    _.Module.use('adsense/widget/tpl_ext', [{        'type': 'POST',        'adDataList': {\"PC_FC_FL\":{\"ad_num\":1,\"js\":\"!function(t){&quot;use strict&quot;;function e(t,e){if(t){var n=new Date().getTime(),r=new Image;t+=&quot;&amp;rand=&quot;+(n+Math.random()),window.ecomLogImage||(window.ecomLogImage={}),window.ecomLogImage[&quot;--IMAGE&quot;+n]=r,e=e||{};var o=!1;r.onload=r.onerror=r.onabort=function(i){if(!e.charge){if(i&amp;&amp;&quot;load&quot;!==i.type){if(o)&quot;error&quot;in e&amp;&amp;e.error();else{r.src=t,o=!0;return}}else&quot;load&quot;in e&amp;&amp;e.load()}r.onload=r.onerror=r.onabort=null,window.ecomLogImage[&quot;--IMAGE&quot;+n]=null,r=null},r.src=t}}var n,r=function(){var t,e,n,r=0,o=0,i=0,a=0,s=0,c=0,u=0,f=0,h=\\/link\\\\?url\\\\=([^\\\\&amp;]+)\\/,l=\\/\\\\?url\\\\=([^\\\\.]+)\\\\.\\/,p=&quot;data-cklink&quot;,d=\\/[?&amp;]tn=([^&amp;]*)\\/;function v(t){if(!t)return!1;var e=h.exec(t)||l.exec(t);return!!e&amp;&amp;(h.exec(t)?e[1].length&lt;20?e[1]:e[1].substr(0,20):e[1])}function g(n){var a,s,h,l,d,g=(l=f.href,d=f.getAttribute(p),v(l)||v(d));!1!==g&amp;&amp;(a=&quot;&amp;ck=&quot;+[function(t,e){for(var n=0,r=0;r&lt;i*e%99+9;r++)n+=t.charCodeAt(u*r%t.length);return n}(g,n),i,u,Math.round(r),Math.round(o),Math.round(t),Math.round(e),c].join(&quot;.&quot;),s=f.href,h=f.getAttribute(p),s&amp;&amp;v(s)&amp;&amp;(f.href=y(s,a)+m(s)),h&amp;&amp;v(h)&amp;&amp;f.setAttribute(p,y(h,a)+m(h)))}function m(t){var e=&quot;&quot;;if(-1===t.indexOf(&quot;&amp;shh=&quot;)&amp;&amp;-1===t.indexOf(&quot;?shh=&quot;)&amp;&amp;(e=&quot;&amp;shh=&quot;+location.hostname),-1===t.indexOf(&quot;&amp;sht=&quot;)&amp;&amp;-1===t.indexOf(&quot;?sht=&quot;)){var n=location.href.match(d);n&amp;&amp;(e+=&quot;&amp;sht=&quot;+n[1])}return e}function y(t,e){return v(t)&amp;&amp;(-1===t.indexOf(&quot;&amp;ck=&quot;)?t+=e:t=t.replace(\\/&amp;ck=[\\\\d.]*\\/,e)),t}function b(n,h,l){void 0===n.length&amp;&amp;(n=[n]);for(var d=n.length,b=0,w=[function(n){var s;f=(s=(s=n)||window.event).target||s.srcElement,i++,void 0===t&amp;&amp;(t=s.clientX),void 0===e&amp;&amp;(e=s.clientY),r=0,o=0,u=0,c=0,a=new Date().getTime(),g(h)},function(t){!function(t,e){for(f=(t=t||window.event).target||t.srcElement;f&amp;&amp;&quot;A&quot;!==f.tagName;)f=f.parentNode;s=new Date().getTime(),u=9999,r=t.clientX,o=t.clientY,c=0===a?0:s-a,g(e)}(t,h)},function(t){u=new Date().getTime()-s,g(h)}];b&lt;d;b++)l||function(t){var e=t.href;if(v(e)){var n=&quot;&amp;ck=&quot;+[0,i,u,Math.round(r),Math.round(o),0,0,c].join(&quot;.&quot;),a=t.getAttribute(p);e&amp;&amp;(t.href=y(e,n)+m(e)),a&amp;&amp;t.setAttribute(p,y(a,n)+m(a))}}(n[b]),function(t,e,n){for(var r,o,i=e.length,a=0;a&lt;i;a++)r=e[a],o=n[a],window.attachEvent?t.attachEvent(&quot;on&quot;+r,o):t.addEventListener(r,o,!1)}(n[b],[&quot;mouseover&quot;,&quot;mousedown&quot;,&quot;mouseup&quot;],w)}return{getInstance:function(t){return n||(n={addAdsCk:b}),n}}},o={init:function(t,e,o){var i=r().getInstance(t);n=i;for(var a=document.querySelectorAll(t),s=0;s&lt;a.length;s++){var c=a[s],u=c.getAttribute(&quot;data-ecimtimesign&quot;)||c.getAttribute(&quot;data-pz-sign&quot;)||e,f=c.getElementsByTagName(&quot;A&quot;);i.addAdsCk(f,u,o)}return i},getInstance:function(){return n}},i=&quot;undefined&quot;!=typeof globalThis?globalThis:&quot;undefined&quot;!=typeof window?window:&quot;undefined&quot;!=typeof global?global:&quot;undefined&quot;!=typeof self?self:{},a={exports:{}};!function(t){var e=Object.prototype.hasOwnProperty,n=&quot;~&quot;;function r(){}function o(t,e,n){this.fn=t,this.context=e,this.once=n||!1}function i(t,e,r,i,a){if(&quot;function&quot;!=typeof r)throw TypeError(&quot;The listener must be a function&quot;);var s=new o(r,i||t,a),c=n?n+e:e;return t._events[c]?t._events[c].fn?t._events[c]=[t._events[c],s]:t._events[c].push(s):(t._events[c]=s,t._eventsCount++),t}function a(t,e){0==--t._eventsCount?t._events=new r:delete t._events[e]}function s(){this._events=new r,this._eventsCount=0}Object.create&amp;&amp;(r.prototype=Object.create(null),new r().__proto__||(n=!1)),s.prototype.eventNames=function(){var t,r,o=[];if(0===this._eventsCount)return o;for(r in t=this._events)e.call(t,r)&amp;&amp;o.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?o.concat(Object.getOwnPropertySymbols(t)):o},s.prototype.listeners=function(t){var e=n?n+t:t,r=this._events[e];if(!r)return[];if(r.fn)return[r.fn];for(var o=0,i=r.length,a=Array(i);o&lt;i;o++)a[o]=r[o].fn;return a},s.prototype.listenerCount=function(t){var e=n?n+t:t,r=this._events[e];return r?r.fn?1:r.length:0},s.prototype.emit=function(t,e,r,o,i,a){var s=n?n+t:t;if(!this._events[s])return!1;var c,u,f=this._events[s],h=arguments.length;if(f.fn){switch(f.once&amp;&amp;this.removeListener(t,f.fn,void 0,!0),h){case 1:return f.fn.call(f.context),!0;case 2:return f.fn.call(f.context,e),!0;case 3:return f.fn.call(f.context,e,r),!0;case 4:return f.fn.call(f.context,e,r,o),!0;case 5:return f.fn.call(f.context,e,r,o,i),!0;case 6:return f.fn.call(f.context,e,r,o,i,a),!0}for(u=1,c=Array(h-1);u&lt;h;u++)c[u-1]=arguments[u];f.fn.apply(f.context,c)}else{var l,p=f.length;for(u=0;u&lt;p;u++)switch(f[u].once&amp;&amp;this.removeListener(t,f[u].fn,void 0,!0),h){case 1:f[u].fn.call(f[u].context);break;case 2:f[u].fn.call(f[u].context,e);break;case 3:f[u].fn.call(f[u].context,e,r);break;case 4:f[u].fn.call(f[u].context,e,r,o);break;default:if(!c)for(l=1,c=Array(h-1);l&lt;h;l++)c[l-1]=arguments[l];f[u].fn.apply(f[u].context,c)}}return!0},s.prototype.on=function(t,e,n){return i(this,t,e,n,!1)},s.prototype.once=function(t,e,n){return i(this,t,e,n,!0)},s.prototype.removeListener=function(t,e,r,o){var i=n?n+t:t;if(!this._events[i])return this;if(!e)return a(this,i),this;var s=this._events[i];if(s.fn)s.fn!==e||o&amp;&amp;!s.once||r&amp;&amp;s.context!==r||a(this,i);else{for(var c=0,u=[],f=s.length;c&lt;f;c++)(s[c].fn!==e||o&amp;&amp;!s[c].once||r&amp;&amp;s[c].context!==r)&amp;&amp;u.push(s[c]);u.length?this._events[i]=1===u.length?u[0]:u:a(this,i)}return this},s.prototype.removeAllListeners=function(t){var e;return t?(e=n?n+t:t,this._events[e]&amp;&amp;a(this,e)):(this._events=new r,this._eventsCount=0),this},s.prototype.off=s.prototype.removeListener,s.prototype.addListener=s.prototype.on,s.prefixed=n,s.EventEmitter=s,t.exports=s}(a);var s=(b=a.exports)&amp;&amp;b.__esModule&amp;&amp;Object.prototype.hasOwnProperty.call(b,&quot;default&quot;)?b.default:b;function c(t){return(c=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}function u(t,e){return(u=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}var f={},h={},l=function(t){!function(t,e){if(&quot;function&quot;!=typeof e&amp;&amp;null!==e)throw TypeError(&quot;Super expression must either be null or a function&quot;);t.prototype=Object.create(e&amp;&amp;e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&amp;&amp;u(t,e)}(o,t);var e,n,r=(e=function(){if(&quot;undefined&quot;==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if(&quot;function&quot;==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(t){return!1}}(),function(){var t,n,r=c(o);if(e){var i=c(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return(t=n)&amp;&amp;(&quot;object&quot;==(t&amp;&amp;&quot;undefined&quot;!=typeof Symbol&amp;&amp;t.constructor===Symbol?&quot;symbol&quot;:typeof t)||&quot;function&quot;==typeof t)?t:function(t){if(void 0===t)throw ReferenceError(&quot;this hasn&#039;t been initialised - super() hasn&#039;t been called&quot;);return t}(this)});function o(t){!function(t,e){if(!(t instanceof e))throw TypeError(&quot;Cannot call a class as a function&quot;)}(this,o);var e=r.call(this);return f=t,h=t,e}return n=[{key:&quot;set&quot;,value:function(t,e){for(var n=this.get(t),r=t.split(&quot;.&quot;),o=f,i=0,a=r.length;i&lt;a;i++)void 0===o[r[i]]&amp;&amp;(o[r[i]]={}),i===a-1&amp;&amp;(o[r[i]]=e,this.emit(&quot;env:change[&quot;.concat(t,&quot;]&quot;),[n,e])),o=o[r[i]]}},{key:&quot;get&quot;,value:function(t){for(var e=t.split(&quot;.&quot;),n=f,r=0,o=e.length;r&lt;o;r++){if(void 0===n[e[r]])return n[e[r]];n=n[e[r]]}return n}},{key:&quot;getValue&quot;,value:function(){return Object.assign({},f)}},{key:&quot;getInitValue&quot;,value:function(){return Object.assign({},h)}}],function(t,e){for(var n=0;n&lt;e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,&quot;value&quot;in r&amp;&amp;(r.writable=!0),Object.defineProperty(t,r.key,r)}}(o.prototype,n),o}(s),p=null,d={getInstance:function(t){return p||(p=new l(t)),p}},v=&quot;https:\\/\\/fclick.baidu.com\\/w.gif&quot;,g=&quot;https:\\/\\/fclickv4.baidu.com\\/w.gif&quot;;function m(t){var e,n=d.getInstance().getValue();!t.searchId&amp;&amp;n&amp;&amp;n.searchid&amp;&amp;(t.searchId=n.searchid),(null==n?void 0:null===(e=n.flags)||void 0===e?void 0:e.expFlagFixAsynSlideLog)||&quot;ecom_wise_listen_n&quot;!==t.tag||!n||(!t.asp_time&amp;&amp;n.aspTime&amp;&amp;(t.asp_time=n.aspTime),!t.query&amp;&amp;n.queryWordEnc&amp;&amp;(t.query=n.queryWordEnc),t.queryUtf8||!n.query||(t.queryUtf8=n.query));var r=[];for(var o in t)t.hasOwnProperty(o)&amp;&amp;r.push(encodeURIComponent(o)+&quot;=&quot;+encodeURIComponent(t[o]));return r.join(&quot;&amp;&quot;)}function y(t){var n=arguments.length&gt;1&amp;&amp;void 0!==arguments[1]&amp;&amp;arguments[1],r=d.getInstance().getValue();if(r&amp;&amp;r.flags&amp;&amp;r.flags.changeFclickToBeacon){!function(t){var n,r=arguments.length&gt;1&amp;&amp;void 0!==arguments[1]&amp;&amp;arguments[1],o=new Date().getTime();t&amp;&amp;(t.rand=o+Math.random()),function(t){var e=!1;try{t&amp;&amp;navigator.sendBeacon&amp;&amp;(e=navigator.sendBeacon(t))}catch(t){}return e}(n=[r?g:v,m(t)].join(&quot;?&quot;))||e(n)}(t,n);return}e([n?g:v,m(t)].join(&quot;?&quot;))}var b,w,_=function(t){this.env=t||{}};_.prototype={report:function(t){y(this.extend(this.env,{tag:&quot;ps-js-error&quot;,datetime:new Date().getTime(),message:t.message,stack:t.stack}))},support:function(t,e){if(&quot;function&quot;==typeof t){e=t;try{e()}catch(t){this.report(t)}}else{var n=t[e];t[e]=function(){for(var e=arguments.length,r=Array(e),o=0;o&lt;e;o++)r[o]=arguments[o];try{n.apply(t,r)}catch(t){this.report(t)}}}},extend:function(){for(var t={},e=0,n=arguments.length;e&lt;n;e++)if(&quot;[object Object]&quot;===Object.prototype.toString.call(arguments[e]))for(var r in arguments[e])t[r]=arguments[e][r];return t}};var I,E={getInstance:function(t){return w||(w=new _(t)),w}},O=function(){var t,e,n,r=0,o=0,i=0,a=0,s=0,c=0,u=0,f=0,h=\\/link\\\\?url\\\\=([^\\\\&amp;]+)\\/,l=\\/\\\\?url\\\\=([^\\\\.]+)\\\\.\\/,p=&quot;data-cklink&quot;,d=\\/[?&amp;]tn=([^&amp;]*)\\/;function v(t){if(!t)return!1;var e=h.exec(t)||l.exec(t);return!!e&amp;&amp;(h.exec(t)?e[1].length&lt;20?e[1]:e[1].substr(0,20):e[1])}function g(n){var a,s,h,l,d,g=(l=f.href,d=f.getAttribute(p),v(l)||v(d));!1!==g&amp;&amp;(a=&quot;&amp;ck=&quot;+[function(t,e){for(var n=0,r=0;r&lt;i*e%99+9;r++)n+=t.charCodeAt(u*r%t.length);return n}(g,n),i,u,Math.round(r),Math.round(o),Math.round(t),Math.round(e),c].join(&quot;.&quot;),s=f.href,h=f.getAttribute(p),s&amp;&amp;v(s)&amp;&amp;(f.href=y(s,a)+m(s)),h&amp;&amp;v(h)&amp;&amp;f.setAttribute(p,y(h,a)+m(h)))}function m(t){var e=&quot;&quot;;if(-1===t.indexOf(&quot;&amp;shh=&quot;)&amp;&amp;-1===t.indexOf(&quot;?shh=&quot;)&amp;&amp;(e=&quot;&amp;shh=&quot;+location.hostname),-1===t.indexOf(&quot;&amp;sht=&quot;)&amp;&amp;-1===t.indexOf(&quot;?sht=&quot;)){var n=location.href.match(d);n&amp;&amp;(e+=&quot;&amp;sht=&quot;+n[1])}return e}function y(t,e){return v(t)&amp;&amp;(-1===t.indexOf(&quot;&amp;ck=&quot;)?t+=e:t=t.replace(\\/&amp;ck=[\\\\d.]*\\/,e)),t}function b(n,h,l){void 0===n.length&amp;&amp;(n=[n]);for(var d=n.length,b=0,w=[function(n){!function(n,s){for(f=(n=n||window.event).target||n.srcElement;f&amp;&amp;&quot;A&quot;!==f.tagName;)f=f.parentNode;i++,void 0===t&amp;&amp;(t=n.clientX),void 0===e&amp;&amp;(e=n.clientY),r=0,o=0,u=0,c=0,a=new Date().getTime(),g(s)}(n,h)},function(t){!function(t,e){for(f=(t=t||window.event).target||t.srcElement;f&amp;&amp;&quot;A&quot;!==f.tagName;)f=f.parentNode;s=new Date().getTime(),u=9999,r=t.clientX,o=t.clientY,c=0===a?0:s-a,g(e)}(t,h)},function(t){u=new Date().getTime()-s,g(h)}];b&lt;d;b++)l||function(t){var e=t.href;if(v(e)){var n=&quot;&amp;ck=&quot;+[0,i,u,Math.round(r),Math.round(o),0,0,c].join(&quot;.&quot;),a=t.getAttribute(p);e&amp;&amp;(t.href=y(e,n)+m(e)),a&amp;&amp;t.setAttribute(p,y(a,n)+m(a))}}(n[b]),function(t,e,n){for(var r,o,i=e.length,a=0;a&lt;i;a++)r=e[a],o=n[a],window.attachEvent?t.attachEvent(&quot;on&quot;+r,o):t.addEventListener(r,o,!1)}(n[b],[&quot;mouseover&quot;,&quot;mousedown&quot;,&quot;mouseup&quot;],w)}return{getInstance:function(t){return n||(n={addAdsCk:b}),n}}},A={init:function(t,e,n){var r=O().getInstance(t);I=r;for(var o=document.querySelectorAll(t),i=0;i&lt;o.length;i++){var a=o[i],s=a.getAttribute(&quot;data-ecimtimesign&quot;)||a.getAttribute(&quot;data-pz-sign&quot;)||e,c=a.getElementsByTagName(&quot;A&quot;);r.addAdsCk(c,s,n)}return r},getInstance:function(){return I}};function R(t,e){return null!=e&amp;&amp;&quot;undefined&quot;!=typeof Symbol&amp;&amp;e[Symbol.hasInstance]?!!e[Symbol.hasInstance](t):t instanceof e}function S(t){for(var e=t.target||t.srcElement;e&amp;&amp;&quot;A&quot;!==e.tagName;)e=e.parentNode;var n=e.href;if(x(n)){var r,o=new URLSearchParams(n).get(&quot;ck&quot;);o&amp;&amp;k(e,[0,&quot;00000000&quot;===(r=o.split(&quot;.&quot;)).join(&quot;&quot;)?1:&quot;0&quot;===r[2]&amp;&amp;&quot;0&quot;===r[3]&amp;&amp;&quot;0&quot;===r[4]&amp;&amp;&quot;0&quot;===r[7]?2:3,0,0])}}function x(t){return&quot;string&quot;==typeof t&amp;&amp;-1!==t.indexOf(&quot;baidu.php&quot;)}function T(t,e){var n=window.navigator.mimeTypes;for(var r in n)if(n[r][t]===e)return!0;return!1}function k(t,e){var n=t.href;if(x(n)){var r=new URLSearchParams(n),o=r.get(&quot;us&quot;),i=[];if(o){var a=&quot;newvui&quot;===o?[]:o.split(&quot;.&quot;);i=e.map(function(t,n){return e[n]?e[n]:a[n]||0})}else i=e.map(function(t){return t||0});r.set(&quot;us&quot;,i.join(&quot;.&quot;)),t.href=decodeURIComponent(r.toString())}}function M(t,e){var n=!0,r=!1,o=void 0;try{for(var i,a=t[Symbol.iterator]();!(n=(i=a.next()).done);n=!0){var s=i.value;&quot;attributes&quot;===s.type&amp;&amp;&quot;se_prerender_url&quot;===s.attributeName&amp;&amp;&quot;complete&quot;===s.target.getAttribute(&quot;se_prerender_url&quot;)&amp;&amp;(k(s.target,[0,0,0,1]),y({tag:&quot;ecom_msa_tmp_4&quot;,action:&quot;prerender&quot;,href:s.target.getAttribute(&quot;href&quot;)}))}}catch(t){r=!0,o=t}finally{try{n||null==a.return||a.return()}finally{if(r)throw o}}}!function(t){var e,n,r=function(){try{if(t.URLSearchParams&amp;&amp;&quot;bar&quot;===new t.URLSearchParams(&quot;foo=bar&quot;).get(&quot;foo&quot;))return t.URLSearchParams}catch(t){}return null}(),o=r&amp;&amp;&quot;a=1&quot;===new r({a:1}).toString(),i=r&amp;&amp;&quot;+&quot;===new r(&quot;s=%2B&quot;).get(&quot;s&quot;),a=&quot;__URLSearchParams__&quot;,s=!r||((e=new r).append(&quot;s&quot;,&quot; &amp;&quot;),&quot;s=+%26&quot;===e.toString()),c=h.prototype,u=!!(t.Symbol&amp;&amp;t.Symbol.iterator);if(!r||!o||!i||!s){c.append=function(t,e){g(this[a],t,e)},c.delete=function(t){delete this[a][t]},c.get=function(t){var e=this[a];return this.has(t)?e[t][0]:null},c.getAll=function(t){var e=this[a];return this.has(t)?e[t].slice(0):[]},c.has=function(t){return y(this[a],t)},c.set=function(t,e){this[a][t]=[&quot;&quot;+e]},c.toString=function(){var t,e,n,r,o=this[a],i=[];for(e in o)for(t=0,n=l(e),r=o[e];t&lt;r.length;t++)i.push(n+&quot;=&quot;+l(r[t]));return i.join(&quot;&amp;&quot;)},i&amp;&amp;r&amp;&amp;!o&amp;&amp;t.Proxy?(n=new Proxy(r,{construct:function(t,e){return new t(new h(e[0]).toString())}})).toString=Function.prototype.toString.bind(h):n=h,Object.defineProperty(t,&quot;URLSearchParams&quot;,{value:n});var f=t.URLSearchParams.prototype;f.polyfill=!0,f.forEach=f.forEach||function(t,e){var n=v(this.toString());Object.getOwnPropertyNames(n).forEach(function(r){n[r].forEach(function(n){t.call(e,n,r,this)},this)},this)},f.sort=f.sort||function(){var t,e,n,r=v(this.toString()),o=[];for(t in r)o.push(t);for(o.sort(),e=0;e&lt;o.length;e++)this.delete(o[e]);for(e=0;e&lt;o.length;e++){var i=o[e],a=r[i];for(n=0;n&lt;a.length;n++)this.append(i,a[n])}},f.keys=f.keys||function(){var t=[];return this.forEach(function(e,n){t.push(n)}),d(t)},f.values=f.values||function(){var t=[];return this.forEach(function(e){t.push(e)}),d(t)},f.entries=f.entries||function(){var t=[];return this.forEach(function(e,n){t.push([n,e])}),d(t)},u&amp;&amp;(f[t.Symbol.iterator]=f[t.Symbol.iterator]||f.entries)}function h(t){(R(t=t||&quot;&quot;,URLSearchParams)||R(t,h))&amp;&amp;(t=t.toString()),this[a]=v(t)}function l(t){var e={&quot;!&quot;:&quot;%21&quot;,&quot;&#039;&quot;:&quot;%27&quot;,&quot;(&quot;:&quot;%28&quot;,&quot;)&quot;:&quot;%29&quot;,&quot;~&quot;:&quot;%7E&quot;,&quot;%20&quot;:&quot;+&quot;,&quot;%00&quot;:&quot;\\\\x00&quot;};return encodeURIComponent(t).replace(\\/[!&#039;\\\\(\\\\)~]|%20|%00\\/g,function(t){return e[t]})}function p(t){return t.replace(\\/[ +]\\/g,&quot;%20&quot;).replace(\\/(%[a-f0-9]{2})+\\/ig,function(t){return decodeURIComponent(t)})}function d(e){var n={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return u&amp;&amp;(n[t.Symbol.iterator]=function(){return n}),n}function v(t){var e={};if(&quot;object&quot;==typeof t){if(m(t))for(var n=0;n&lt;t.length;n++){var r=t[n];if(m(r)&amp;&amp;2===r.length)g(e,r[0],r[1]);else throw TypeError(&quot;Failed to construct &#039;URLSearchParams&#039;: Sequence initializer must only contain pair elements&quot;)}else for(var o in t)t.hasOwnProperty(o)&amp;&amp;g(e,o,t[o])}else{0===t.indexOf(&quot;?&quot;)&amp;&amp;(t=t.slice(1));for(var i=t.split(&quot;&amp;&quot;),a=0;a&lt;i.length;a++){var s=i[a],c=s.indexOf(&quot;=&quot;);-1&lt;c?g(e,p(s.slice(0,c)),p(s.slice(c+1))):s&amp;&amp;g(e,p(s),&quot;&quot;)}}return e}function g(t,e,n){var r=&quot;string&quot;==typeof n?n:null!=n&amp;&amp;&quot;function&quot;==typeof n.toString?n.toString():JSON.stringify(n);y(t,e)?t[e].push(r):t[e]=[r]}function m(t){return!!t&amp;&amp;&quot;[object Array]&quot;===Object.prototype.toString.call(t)}function y(t,e){return Object.prototype.hasOwnProperty.call(t,e)}}(void 0!==i?i:&quot;undefined&quot;!=typeof window?window:i);var P={attributes:!0,childList:!1,subtree:!1},j={init:function(t,e){var n=&quot;&quot;;MutationObserver&amp;&amp;(n=new MutationObserver(M));for(var r=document.querySelectorAll(t),o=0;o&lt;r.length;o++)for(var i,a,s=r[o].getElementsByTagName(&quot;A&quot;),c=0;c&lt;s.length;c++)n&amp;&amp;n.observe(s[c],P),i=s[c],a=&quot;click&quot;,window.attachEvent?i.attachEvent(&quot;on&quot;+a,S):i.addEventListener(a,S,!1),k(s[c],[function(){var t=!1,e=window.navigator,n=e.userAgent;if(window.chrome){var r=n.replace(\\/^.*Chrome\\\\\\/([\\\\d]+).*$\\/,&quot;$1&quot;);window.chrome.adblock2345||window.chrome.common2345||(T(&quot;type&quot;,&quot;application\\/360softmgrplugin&quot;)||T(&quot;type&quot;,&quot;application\\/mozilla-npqihooquicklogin&quot;)?t=!0:r&gt;36&amp;&amp;window.showModalDialog?t=!0:!(r&gt;45)||(t=T(&quot;type&quot;,&quot;application\\/vnd.chromium.remoting-viewer&quot;))||!(r&gt;=69)||(t=T(&quot;type&quot;,&quot;application\\/hwepass2001.installepass2001&quot;)||T(&quot;type&quot;,&quot;application\\/asx&quot;)))}return t?T(&quot;type&quot;,&quot;application\\/gameplugin&quot;)?2:e&amp;&amp;void 0!==e.connection&amp;&amp;void 0===e.connection.saveData?2:1:0}(),0,0,0])}};!function(){if(&quot;object&quot;==typeof window){if(&quot;IntersectionObserver&quot;in window&amp;&amp;&quot;IntersectionObserverEntry&quot;in window&amp;&amp;&quot;intersectionRatio&quot;in window.IntersectionObserverEntry.prototype){&quot;isIntersecting&quot;in window.IntersectionObserverEntry.prototype||Object.defineProperty(window.IntersectionObserverEntry.prototype,&quot;isIntersecting&quot;,{get:function(){return this.intersectionRatio&gt;0}});return}var t=window.document,e=[];r.prototype.THROTTLE_TIMEOUT=100,r.prototype.POLL_INTERVAL=null,r.prototype.USE_MUTATION_OBSERVER=!0,r.prototype.observe=function(t){if(!this._observationTargets.some(function(e){return e.element==t})){if(!(t&amp;&amp;1==t.nodeType))throw Error(&quot;target must be an Element&quot;);this._registerInstance(),this._observationTargets.push({element:t,entry:null}),this._monitorIntersections(),this._checkForIntersections()}},r.prototype.unobserve=function(t){this._observationTargets=this._observationTargets.filter(function(e){return e.element!=t}),this._observationTargets.length||(this._unmonitorIntersections(),this._unregisterInstance())},r.prototype.disconnect=function(){this._observationTargets=[],this._unmonitorIntersections(),this._unregisterInstance()},r.prototype.takeRecords=function(){var t=this._queuedEntries.slice();return this._queuedEntries=[],t},r.prototype._initThresholds=function(t){var e=t||[0];return Array.isArray(e)||(e=[e]),e.sort().filter(function(t,e,n){if(&quot;number&quot;!=typeof t||isNaN(t)||t&lt;0||t&gt;1)throw Error(&quot;threshold must be a number between 0 and 1 inclusively&quot;);return t!==n[e-1]})},r.prototype._parseRootMargin=function(t){var e=(t||&quot;0px&quot;).split(\\/\\\\s+\\/).map(function(t){var e=\\/^(-?\\\\d*\\\\.?\\\\d+)(px|%)$\\/.exec(t);if(!e)throw Error(&quot;rootMargin must be specified in pixels or percent&quot;);return{value:parseFloat(e[1]),unit:e[2]}});return e[1]=e[1]||e[0],e[2]=e[2]||e[0],e[3]=e[3]||e[1],e},r.prototype._monitorIntersections=function(){!this._monitoringIntersections&amp;&amp;(this._monitoringIntersections=!0,this.POLL_INTERVAL?this._monitoringInterval=setInterval(this._checkForIntersections,this.POLL_INTERVAL):(o(window,&quot;resize&quot;,this._checkForIntersections,!0),o(t,&quot;scroll&quot;,this._checkForIntersections,!0),this.USE_MUTATION_OBSERVER&amp;&amp;&quot;MutationObserver&quot;in window&amp;&amp;(this._domObserver=new MutationObserver(this._checkForIntersections),this._domObserver.observe(t,{attributes:!0,childList:!0,characterData:!0,subtree:!0}))))},r.prototype._unmonitorIntersections=function(){this._monitoringIntersections&amp;&amp;(this._monitoringIntersections=!1,clearInterval(this._monitoringInterval),this._monitoringInterval=null,i(window,&quot;resize&quot;,this._checkForIntersections,!0),i(t,&quot;scroll&quot;,this._checkForIntersections,!0),this._domObserver&amp;&amp;(this._domObserver.disconnect(),this._domObserver=null))},r.prototype._checkForIntersections=function(){var t=this._rootIsInDom(),e=t?this._getRootRect():s();this._observationTargets.forEach(function(r){var o=r.element,i=a(o),s=this._rootContainsTarget(o),c=r.entry,u=t&amp;&amp;s&amp;&amp;this._computeTargetAndRootIntersection(o,e),f=r.entry=new n({time:window.performance&amp;&amp;performance.now&amp;&amp;performance.now(),target:o,boundingClientRect:i,rootBounds:e,intersectionRect:u});c?t&amp;&amp;s?this._hasCrossedThreshold(c,f)&amp;&amp;this._queuedEntries.push(f):c&amp;&amp;c.isIntersecting&amp;&amp;this._queuedEntries.push(f):this._queuedEntries.push(f)},this),this._queuedEntries.length&amp;&amp;this._callback(this.takeRecords(),this)},r.prototype._computeTargetAndRootIntersection=function(e,n){if(&quot;none&quot;!=window.getComputedStyle(e).display){for(var r=a(e),o=u(e),i=!1;!i;){var s=null,c=1==o.nodeType?window.getComputedStyle(o):{};if(&quot;none&quot;==c.display)return;if(o==this.root||o==t?(i=!0,s=n):o!=t.body&amp;&amp;o!=t.documentElement&amp;&amp;&quot;visible&quot;!=c.overflow&amp;&amp;(s=a(o)),s&amp;&amp;!(r=function(t,e){var n=Math.max(t.top,e.top),r=Math.min(t.bottom,e.bottom),o=Math.max(t.left,e.left),i=Math.min(t.right,e.right),a=i-o,s=r-n;return a&gt;=0&amp;&amp;s&gt;=0&amp;&amp;{top:n,bottom:r,left:o,right:i,width:a,height:s}}(s,r)))break;o=u(o)}return r}},r.prototype._getRootRect=function(){var e;if(this.root)e=a(this.root);else{var n=t.documentElement,r=t.body;e={top:0,left:0,right:n.clientWidth||r.clientWidth,width:n.clientWidth||r.clientWidth,bottom:n.clientHeight||r.clientHeight,height:n.clientHeight||r.clientHeight}}return this._expandRectByRootMargin(e)},r.prototype._expandRectByRootMargin=function(t){var e=this._rootMarginValues.map(function(e,n){return&quot;px&quot;==e.unit?e.value:e.value*(n%2?t.width:t.height)\\/100}),n={top:t.top-e[0],right:t.right+e[1],bottom:t.bottom+e[2],left:t.left-e[3]};return n.width=n.right-n.left,n.height=n.bottom-n.top,n},r.prototype._hasCrossedThreshold=function(t,e){var n=t&amp;&amp;t.isIntersecting?t.intersectionRatio||0:-1,r=e.isIntersecting?e.intersectionRatio||0:-1;if(n!==r)for(var o=0;o&lt;this.thresholds.length;o++){var i=this.thresholds[o];if(i==n||i==r||i&lt;n!=i&lt;r)return!0}},r.prototype._rootIsInDom=function(){return!this.root||c(t,this.root)},r.prototype._rootContainsTarget=function(e){return c(this.root||t,e)},r.prototype._registerInstance=function(){0&gt;e.indexOf(this)&amp;&amp;e.push(this)},r.prototype._unregisterInstance=function(){var t=e.indexOf(this);-1!=t&amp;&amp;e.splice(t,1)},window.IntersectionObserver=r,window.IntersectionObserverEntry=n}function n(t){this.time=t.time,this.target=t.target,this.rootBounds=t.rootBounds,this.boundingClientRect=t.boundingClientRect,this.intersectionRect=t.intersectionRect||s(),this.isIntersecting=!!t.intersectionRect;var e=this.boundingClientRect,n=e.width*e.height,r=this.intersectionRect,o=r.width*r.height;n?this.intersectionRatio=Number((o\\/n).toFixed(4)):this.intersectionRatio=this.isIntersecting?1:0}function r(t,e){var n,r,o,i=e||{};if(&quot;function&quot;!=typeof t)throw Error(&quot;callback must be a function&quot;);if(i.root&amp;&amp;1!=i.root.nodeType)throw Error(&quot;root must be an Element&quot;);this._checkForIntersections=(n=this._checkForIntersections.bind(this),r=this.THROTTLE_TIMEOUT,o=null,function(){o||(o=setTimeout(function(){n(),o=null},r))}),this._callback=t,this._observationTargets=[],this._queuedEntries=[],this._rootMarginValues=this._parseRootMargin(i.rootMargin),this.thresholds=this._initThresholds(i.threshold),this.root=i.root||null,this.rootMargin=this._rootMarginValues.map(function(t){return t.value+t.unit}).join(&quot; &quot;)}function o(t,e,n,r){&quot;function&quot;==typeof t.addEventListener?t.addEventListener(e,n,r||!1):&quot;function&quot;==typeof t.attachEvent&amp;&amp;t.attachEvent(&quot;on&quot;+e,n)}function i(t,e,n,r){&quot;function&quot;==typeof t.removeEventListener?t.removeEventListener(e,n,r||!1):&quot;function&quot;==typeof t.detatchEvent&amp;&amp;t.detatchEvent(&quot;on&quot;+e,n)}function a(t){var e;try{e=t.getBoundingClientRect()}catch(t){}return e?(e.width&amp;&amp;e.height||(e={top:e.top,right:e.right,bottom:e.bottom,left:e.left,width:e.right-e.left,height:e.bottom-e.top}),e):s()}function s(){return{top:0,bottom:0,left:0,right:0,width:0,height:0}}function c(t,e){for(var n=e;n;){if(n==t)return!0;n=u(n)}return!1}function u(t){var e=t.parentNode;return e&amp;&amp;11==e.nodeType&amp;&amp;e.host?e.host:e&amp;&amp;e.assignedSlot?e.assignedSlot.parentNode:e}}();var L=&quot;observer&quot;;function C(){}function N(t){var e=t.container,n=t.url,r=t.params;this.opts={container:e,url:n,params:void 0===r?{}:r},this.init()}N.prototype={constructor:N,init:function(){var t=this,e=t.opts.container;t.observer=new IntersectionObserver(t.observeCB.bind(t)),e&amp;&amp;Array.prototype.slice.call(document.querySelectorAll(e)).forEach(function(e){t.observer.observe(e)})},observe:function(t){this.observer.observe(t)},observeCB:function(t){var e=this;t.forEach(function(t){if(t.isIntersecting){var n=t.target;if(!n.getAttribute(L)){var r=e.combineData(n);e.log(r),e.observer.unobserve(n),n.setAttribute(L,1)}}})},combineData:function(t){var e=this.opts.params,n={data:{}};for(var r in e)if(e.hasOwnProperty(r)){var o=t.getAttribute(e[r]);&quot;&quot;!==o&amp;&amp;(n.data[r]=o)}return n},log:function(t){this.nclick(t)},nclick:function(t){var e=this.opts.url;t.rand=this.addRand();var n=&quot;&quot;.concat(e,&quot;?&quot;).concat(this.encodeSearchParams(t));this.imgRequest(n,t)},imgRequest:function(t,e){try{var n=e.rand,r=new Image;window[&quot;--IMAGE&quot;+n]=r,r.onload=r.onerror=r.onabort=function(){r.onload=r.onerror=r.onabort=null,r=null,window[&quot;--IMAGE&quot;+n]=C},r.src=t}catch(t){}},addRand:function(){return Math.random().toString(16).slice(2,8)+Math.random()},encodeSearchParams:function(t){var e=[];for(var n in t)if(t.hasOwnProperty(n)){var r=t[n];&quot;object&quot;==typeof r&amp;&amp;(r=JSON.stringify(r)),e.push([n,encodeURIComponent(r)].join(&quot;=&quot;))}return e.join(&quot;&amp;&quot;)}};var q={init:function(){new N({container:&quot;[data-nvk]&quot;,url:&quot;https:\\/\\/ada.baidu.com\\/udpl\\/exp&quot;,params:{exp:&quot;data-nvk&quot;}})}};t.PARAMS={},t.init=function(e){t.PARAMS=e;var n=&quot;.&quot;+t.PARAMS.resultClass;E.getInstance({}).support(function(){t.PARAMS.flags.tiebaCkFix&amp;&amp;-1!==[&quot;pc_tieba_list&quot;,&quot;pc_tieba_detail&quot;].indexOf(t.PARAMS.pageid)?A.init(n,t.PARAMS.imTimeSign):o.init(n,t.PARAMS.imTimeSign),q.init(),t.PARAMS.flags.tiebaCkFix&amp;&amp;-1!==[&quot;pc_tieba_list&quot;,&quot;pc_tieba_detail&quot;].indexOf(t.PARAMS.pageid)&amp;&amp;j.init(n,t.PARAMS)})},t.request=e}(this.ecomNsPcGlobal=this.ecomNsPcGlobal||{});\\n\\n            (function (variable) {\\n                window.ecomNsPcGlobal.init(variable);\\n            })({&quot;searchid&quot;:&quot;000000003236df83&quot;,&quot;eid&quot;:&quot;120201_120702_7869012_300003&quot;,&quot;bwsid&quot;:0,&quot;osid&quot;:0,&quot;pageid&quot;:&quot;pc_tieba_detail&quot;,&quot;baiduid&quot;:&quot;00E51832EC6DAA0D10E1C0699C5E6670&quot;,&quot;ovlid&quot;:&quot;129424-dz#129771-dz#122828-4#129937-dz#129551-1#129665-5#126544-4#121730-5#109505-1#129380-dz#119725-1#47135-dz#123nj-0&quot;,&quot;wpt&quot;:0,&quot;netType&quot;:0,&quot;cuid&quot;:&quot;&quot;,&quot;feedCuid&quot;:&quot;&quot;,&quot;query&quot;:&quot;%E4%BB%A5%E5%A4%AA%E6%AF%94%E7%89%B9&quot;,&quot;imTimeSign&quot;:73,&quot;asynMode&quot;:0,&quot;asynUrl&quot;:&quot;&quot;,&quot;isWiseDropDown&quot;:false,&quot;asynsid&quot;:&quot;&quot;,&quot;aspTime&quot;:1722942843174,&quot;sourceAdNum&quot;:{&quot;ads_2327&quot;:1},&quot;asynQuery&quot;:&quot;&quot;,&quot;jFieldLinkMap&quot;:{&quot;7R_iIDxwN4Nn8JspnaRfIZwZKYwqD7NjHw63p8B5hGyAp7WFg8o3J0&quot;:&quot;http:\\/\\/xsxh.haohuyue.com\\/xxs\\/xsx\\/html\\/zhxs.html&quot;},&quot;upAdNum&quot;:0,&quot;middleAdNum&quot;:0,&quot;downAdNum&quot;:0,&quot;flags&quot;:{&quot;fixPlusSign&quot;:true},&quot;variable&quot;:{},&quot;rsContent&quot;:[],&quot;ecomData204&quot;:&quot;&quot;,&quot;ecomData213&quot;:&quot;&quot;,&quot;ecomData217&quot;:&quot;&quot;,&quot;ad204Num&quot;:0,&quot;ad213Num&quot;:0,&quot;ad217Num&quot;:0,&quot;isHasImlp&quot;:false,&quot;adsInfo&quot;:{&quot;000000003236df83_1626_0&quot;:{&quot;ideaId&quot;:95926895337,&quot;docId&quot;:&quot;0&quot;,&quot;mts&quot;:[2410,2051]}},&quot;bdCid&quot;:93,&quot;bdPid&quot;:4,&quot;queryWordEnc&quot;:&quot;%D2%D4%CC%AB%B1%C8%CC%D8&quot;,&quot;wiseSt&quot;:&quot;&quot;,&quot;requestIpV4&quot;:3604745399,&quot;fnizebrab&quot;:&quot;&quot;,&quot;nsVerticalKdomainList&quot;:[],&quot;wiseExposureAds&quot;:[],&quot;is_rm_asyn&quot;:true,&quot;mod&quot;:&quot;&quot;,&quot;app_verison&quot;:&quot;&quot;,&quot;os_version&quot;:&quot;&quot;,&quot;bd_version&quot;:&quot;&quot;,&quot;ios_version&quot;:0,&quot;passportId&quot;:0,&quot;hasYunyingCard&quot;:false,&quot;wiseFrom&quot;:&quot;&quot;,&quot;resultClass&quot;:&quot;fc-000000003236df83-2327&quot;});\\n        \",\"css\":\"._1eqtk61{border-bottom:0 solid #f5f5f5}._8x9ty64{border-bottom:1px solid #eee;margin:0;padding:0;position:relative}._8x9ty64 h3{font-weight:400;padding:0}._8x9ty64 a{text-decoration:none}._8x9ty64 em{color:#3066b4;font-style:normal}._8x9ty64:last-child{border-bottom:0}._1n8n23c{margin:0}.b47yy3h{padding-top:0}._8x9ty64{background-color:#fafbfc;border-left:1px solid #e5e5e5;font-family:PingFangSC-Medium,Helvetica Neue,Helvetica,Arial,sans-serif}._8x9ty64,._8x9ty64:last-child{border-bottom:1px solid #e5e5e5}.ghmaff1{margin-bottom:15px}._2cj3g78{margin-bottom:10px}.edshq5u{margin-top:15px}._4skftda,.pe5wcz2{margin-top:10px}.ugaqg4d{align-items:center;display:flex;height:100%}.km5nyww{margin-bottom:15px}._9s8xgss{margin-top:15px}.ghmaff1+.pe5wcz2{margin-top:-5px}.bh9veya{float:right;width:74px}.tumcbnr{float:left;margin-top:19px;width:130px}.fjyf1br{background-color:#fff;margin-left:130px;padding:25px 0 8px 20px}.fjyf1br:hover{background-color:transparent}body a.hdyqnku,body div.hdyqnku{color:#000;display:block;font-family:Arial,Helvetica,sans-serif;font-size:20px;font-weight:400;line-height:30px;margin:0;padding-top:0;text-decoration:none;transform:translateY(.25em)}body a.hdyqnku:before,body div.hdyqnku:before{content:&quot;&quot;;display:block;height:0;margin-top:-10px}a.hdyqnku div{word-break:break-all}.v3zrcrj{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.q1dpns8{-webkit-line-clamp:2}.ndfxdqz,.q1dpns8{word-wrap:break-word;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden;word-break:break-all}.ndfxdqz{-webkit-line-clamp:3}._7qtpw9j{-webkit-line-clamp:4}._2dt35k2,._7qtpw9j{word-wrap:break-word;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden;word-break:break-all}._2dt35k2{-webkit-line-clamp:5}._1r3uysh{-webkit-line-clamp:10}._1r3uysh,.yux2cc6{word-wrap:break-word;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden;word-break:break-all}.yux2cc6{-webkit-line-clamp:12}._4bxpxs9{-webkit-line-clamp:18;word-wrap:break-word;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden;word-break:break-all}body ._9cy84ta{color:#999;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:22px;padding-top:0;position:relative;transform:translateY(.4666666667em)}body ._9cy84ta:before{content:&quot;&quot;;display:block;height:0;margin-top:-10px}body ._9cy84ta a{color:#999;display:block}body ._9cy84ta a .j4rc4ke{color:#999}body ._9cy84ta button{background:#fff;border:1px solid;border-radius:3px;bottom:0;color:#38f;float:right;font-size:12px;line-height:12px;padding:7px 13px;position:absolute;right:0}body ._9cy84ta ._3cyr2tj{margin-left:5px}body ._9cy84ta .wwhy5qm{border:1px solid #eee;border-radius:50%;display:inline-block;height:22px;line-height:0;margin-right:7px;margin-top:-2px;vertical-align:middle;width:22px}body ._9cy84ta .q76dsk8{margin-right:8px}.tbmu64u{position:absolute;right:0}._5kn8sv5{-webkit-box-orient:horizontal;-webkit-box-align:stretch;-webkit-align-content:flex-start;-webkit-align-items:stretch;display:-webkit-flex;-webkit-flex-wrap:nowrap;-webkit-justify-content:space-between;width:auto}.z8bq2t7{flex:1}body ._9cy84ta a.mk8dv2x,body ._9cy84ta div.mk8dv2x{display:flex;justify-content:space-between}body ._9cy84ta{font-family:PingFangSC-Medium,Helvetica Neue,Helvetica,Arial,sans-serif;line-height:1;margin-right:13px;text-align:right;transform:none}.qqvbase,body ._9cy84ta .shjuuby{display:inline-block}.qqvbase{margin-left:12px;margin-right:2px;vertical-align:middle;width:64px}._6kd2k9z{display:inline-block}._9fe13qw{background:#f5f5f5;border-radius:4px;color:#3066b4;font-size:14px;height:28px;line-height:28px;overflow:hidden;padding:0 8px;text-overflow:ellipsis;white-space:nowrap}._2jze4xh{display:inline-block;width:100%}._9zhq8sa{display:block}._9fe13qw i,._9fe13qw img{margin-right:5px}._9fe13qw img{display:block;float:left;height:16px;margin-top:6px;width:16px}.e5xahd5 i{margin-right:5px}.c91q684{color:#33cc75}.e8eykyd{color:#00c8c8}._9fe13qw{background-color:#fff;border:1px solid #3066b4;border-radius:2px;font-family:PingFangSC-Regular,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:12px;height:26px;line-height:26px;padding:0;text-align:center}._94sn3jw{margin-left:4px}._47q9e4t{margin-left:0}body ._7dx78mp{font-size:14px;line-height:24px;padding-top:0;transform:translateY(.3571428571em)}body ._7dx78mp:before{content:&quot;&quot;;display:block;height:0;margin-top:-10px}body ._7dx78mp a,body ._7dx78mp div{color:#3066b4}body ._7dx78mp ._1d7gc64{color:#999;font-size:15px;line-height:25px}body ._7dx78mp .erq8uj7{margin-right:5px}body ._7dx78mp{padding-right:20px}body ._7dx78mp .uq8p2c4{max-height:75px}._7kjxh8t{padding-bottom:100%}.xtq5v37{padding-bottom:133.33333333%}.uwucu2h{padding-bottom:33.3333333333%}._3zt36qa{padding-bottom:56.25%}.y7m392e{padding-bottom:50%}.ajthcgk{padding-bottom:75%}.pvkf2b2{padding-bottom:66.66666667%}.d94ksm9{padding-bottom:40%}._5dc27n3{background-position:50%;background-repeat:no-repeat;background-size:cover}._3zt36qa,._7kjxh8t,.ajthcgk,.d94ksm9,.pvkf2b2,.uwucu2h,.xtq5v37,.y7m392e{height:0;overflow:hidden}._3zt36qa img,._7kjxh8t img,.ajthcgk img,.d94ksm9 img,.pvkf2b2 img,.uwucu2h img,.xtq5v37 img,.y7m392e img{width:100%}.s6zxc2c{border-radius:9px}.r1n7ehc{border-top-left-radius:0}.ruyfyqy{border-top-right-radius:0}.x17vnj2{border-bottom-right-radius:0}._5k9skk2{border-bottom-left-radius:0}.dz8whjw{color:#333;font-size:14px;line-height:24px;margin-top:2px}._32jnwrs{color:#f60;font-size:14px;line-height:22px;margin:5px 0;vertical-align:middle}.na9zhar{position:relative}.nb41sx9{background:radial-gradient(transparent 50%,rgba(0,0,0,.05) 100%);height:100%;left:0;position:absolute;top:0;transform:translateZ(0);width:100%}.s6zxc2c .nb41sx9{border-radius:9px}.r1n7ehc .nb41sx9{border-top-left-radius:0}.ruyfyqy .nb41sx9{border-top-right-radius:0}.x17vnj2 .nb41sx9{border-bottom-right-radius:0}._5k9skk2 .nb41sx9{border-bottom-left-radius:0}.na9zhar img{border:none}body .zz8sa9f{display:flex;font-size:0;overflow:hidden}body .bhz4zux{margin-right:8px;max-width:35px;min-width:35px;vertical-align:top}body ._2md9tzv{background:url(\\/\\/nv00.cdn.bcebos.com\\/nv01\\/static\\/ecom\\/img\\/pc\\/head-img-535c333798.png) no-repeat 50%;background-size:100% 100%;height:100%;width:100%}body .tnf86n6{height:35px;min-width:0}body .ruezuqm{color:#000;font-size:16px;font-weight:inherit;margin-bottom:8px;text-overflow:ellipsis;white-space:nowrap}body ._2gtkx1q{color:#999;font-size:12px;line-height:1}body .zz8sa9f .br54c5r img{width:100%}body .zz8sa9f{display:block}body .bhz4zux{border:1px solid #ccc;height:80px;margin:0 17px;max-width:80px;min-width:80px;padding:3px;width:80px}body .tnf86n6{display:block;height:auto}body .ruezuqm{color:#2d64b3;font-size:12px;height:12px;line-height:1;margin-top:24px;overflow:hidden;text-align:center;word-break:break-all}\",\"data_list\":{\"3\":\"&lt;div&gt;&lt;div class=&quot;_1eqtk61&quot;&gt;&lt;div&gt;&lt;div class=&quot;_8x9ty64 fc-000000003236df83-2327 _8x9ty64&quot; data-cegduid=&quot;&quot; data-lp=&quot;http%3A%2F%2Fxsxh.haohuyue.com%2Fxxs%2Fxsx%2Fhtml%2Fzhxs.html&quot; data-change-wise-baozhang-text=&quot;true&quot; data-rank=&quot;0&quot; data-nvk=&quot;Tv-b5H6YnWfdPWbvnsKWUHYkPWcv0ZF9Uh_qnfKzug7Y5HDLnWc4Pjc3PjnkP1f0pg0qn1msPjTYPHn4rfKLpy4hU1Y3nHT1PHD4PW61P1D&quot; data-extra=&quot;&quot; data-ecimtimesign=&quot;73&quot; data-srcid=&quot;2327&quot; data-placeid=&quot;2327&quot; data-cmatchid=&quot;1626&quot; data-general-xst=&quot;&quot; data-appinfo=&quot;0_429732241_1_0&quot; data-tradeid=&quot;&quot; data-show-card-top=&quot;0&quot; data-bidword=&quot;&quot; data-ecr-async-infos=&quot;&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;div class=&quot;tumcbnr tumcbnr&quot;&gt;&lt;div&gt;&lt;a class=&quot;zz8sa9f&quot; href=&quot;http:\\/\\/www.baidu.com\\/baidu.php?url=a00000KEJeCxDFezE9zWs0cAy48SKaP28i3rtS_b1Qk61FXZFQcfMQUN06D1KVJFwO3d3zasDDuMJQjmC2l016i4eEeCr_vZVXtzAMtixbONugRUmSLlN4wR1bCutTNub_5yi7Be5d-L7aFIDojxT41LTgGVJoMRuSmYdXb3VvmXuyX37YBUhYMWARKRJjGxWb6-u8-wUZEmz3whdEYfBoN4WFcm.7R_iIDxwN4Nn8JspnaRfIZwZKYwqD7NjHw63p8B5hGyAp7WFg8o3J0.U1Yk0ZDqYVHnJeZc1P60IjLcOTh1Eoad3sKGUHYkPWcv0ZNG5fKspyfqP0KWpyfqrHn0mhbqn10k0AuY5H00TA6qn0KET1Ys0AFL5H00UMfqn0K1XWY0ThIYmyTqn0K8IM0qna3snj0snj0sn0K-ThTqn0KYTh7buHYs0AFbpyfqnjK7PHD3n1F7f1uDfRDswjDswH7jnjm4rRndwHmvP100uAPWujY0mgPxpywW5gK1Qy4J0AqW5HD0u1dLTv41IZc0UL0k5H00TZ0Y5H00TMfqPWTY0Z7spyfqn0Kkmv-b5H00mycqn7ts0ZKs5H00Ugws5H00uAwETjYs0ZFJ5H00IZN15Hb3Pj6sPjn1rHczrHf1rjb1njm0mynqnfKsUWYs0ZK9I7qhUA7M5H00TyILujYs0AN1IjYs0ANYpyfqQHD0mgPsmvnqn0KdTA-8mvnqn0KhmLNY5H00mywhUA7M5HD0IvuzUvYq0AFY5HD0ThNkIjYkP1czrHfzrjf1nHTY0ZPGujYsnj0snj0snjnzn1ubuW610AqY5HD0ULFsIjYzc10Wn1RWnH0snan1PjDzrjTdPjD3c1bdnj0WrHRsna3sc1nWnH0snanscYwANansQW01rHRdninkQW0snj0snankc10Wna3snj0snj0Wnan3PjDYnHb3Pjcvc10Wnank0ZFYmy-b5fKopHYs0AdY5HcYnHKxnW0dnfKVm1Ysg1csPHD0UyPxuMFEUHYsg100uA78IyF-gLK_my4GuZnqn7ts0A7bTgbqz5LwktB-z5LF_tofd5gjVnB-0A7bTgfqn0KGTvP_5H00TydY5H00mywxTvqdThP-5H0WpAqYgLIEThfW0APzm1YLPHnz&amp;us=newvui&amp;ai=0_429732241_1_0&amp;word=&quot; target=&quot;_blank&quot;&gt;&lt;div class=&quot;bhz4zux&quot;&gt; &lt;div class=&quot;_2md9tzv&quot;&gt;&lt;\\/div&gt;&lt;\\/div&gt;&lt;div class=&quot;tnf86n6&quot;&gt;&lt;div class=&quot;ruezuqm&quot;&gt;\\u5317\\u4eac\\u8c6a\\u6e56\\u6708\\u56fd\\u9645\\u65c5\\u884c\\u793e&lt;\\/div&gt;&lt;\\/div&gt;&lt;\\/a&gt;&lt;\\/div&gt;&lt;\\/div&gt;&lt;div class=&quot;fjyf1br fjyf1br&quot;&gt;&lt;div style=&quot;margin-bottom: 12px;&quot;&gt;&lt;div class=&quot;_7dx78mp&quot;&gt;&lt;a href=&quot;http:\\/\\/www.baidu.com\\/baidu.php?url=a00000KEJeCxDFezE9zWs0cAy48SKaP28i3rtS_b1Qk61FXZFQcfMQUN06D1KVJFwO3d3zasDDuMJQjmC2l016i4eEeCr_vZVXtzAMtixbONugRUmSLlN4wR1bCutTNub_5yi7Be5d-L7aFIDojxT41LTgGVJoMRuSmYdXb3VvmXuyX37YBUhYMWARKRJjGxWb6-u8-wUZEmz3whdEYfBoN4WFcm.7R_iIDxwN4Nn8JspnaRfIZwZKYwqD7NjHw63p8B5hGyAp7WFg8o3J0.U1Yk0ZDqYVHnJeZc1P60IjLcOTh1Eoad3sKGUHYkPWcv0ZNG5fKspyfqP0KWpyfqrHn0mhbqn10k0AuY5H00TA6qn0KET1Ys0AFL5H00UMfqn0K1XWY0ThIYmyTqn0K8IM0qna3snj0snj0sn0K-ThTqn0KYTh7buHYs0AFbpyfqnjK7PHD3n1F7f1uDfRDswjDswH7jnjm4rRndwHmvP100uAPWujY0mgPxpywW5gK1Qy4J0AqW5HD0u1dLTv41IZc0UL0k5H00TZ0Y5H00TMfqPWTY0Z7spyfqn0Kkmv-b5H00mycqn7ts0ZKs5H00Ugws5H00uAwETjYs0ZFJ5H00IZN15Hb3Pj6sPjn1rHczrHf1rjb1njm0mynqnfKsUWYs0ZK9I7qhUA7M5H00TyILujYs0AN1IjYs0ANYpyfqQHD0mgPsmvnqn0KdTA-8mvnqn0KhmLNY5H00mywhUA7M5HD0IvuzUvYq0AFY5HD0ThNkIjYkP1czrHfzrjf1nHTY0ZPGujYsnj0snj0snjnzn1ubuW610AqY5HD0ULFsIjYzc10Wn1RWnH0snan1PjDzrjTdPjD3c1bdnj0WrHRsna3sc1nWnH0snanscYwANansQW01rHRdninkQW0snj0snankc10Wna3snj0snj0Wnan3PjDYnHb3Pjcvc10Wnank0ZFYmy-b5fKopHYs0AdY5HcYnHKxnW0dnfKVm1Ysg1csPHD0UyPxuMFEUHYsg100uA78IyF-gLK_my4GuZnqn7ts0A7bTgbqz5LwktB-z5LF_tofd5gjVnB-0A7bTgfqn0KGTvP_5H00TydY5H00mywxTvqdThP-5H0WpAqYgLIEThfW0APzm1YLPHnz&amp;us=newvui&amp;ai=0_429732241_1_0&amp;word=&quot; target=&quot;_blank&quot;&gt;&lt;div class=&quot;ndfxdqz ec_desc uq8p2c4&quot;&gt;&lt;span&gt;\\u4e09\\u6c99\\u666f\\u70b9\\uff0c\\u4e24\\u4e2a\\u4eba\\u53bb\\u4e09\\u6c99\\u591a\\u5c11\\u94b1\\uff0c\\u4e0d\\u8ddf\\u56e2\\u81ea\\u7531\\u884c\\uff0c\\u4f4e\\u9884\\u7b97\\u5c31\\u80fd\\u73a9\\uff0c\\u5fc5\\u53bb\\u666f\\u70b9\\u90fd\\u73a9\\u4e86\\u4e00\\u904d\\uff0c\\u5168\\u7a0b\\u884c\\u7a0b\\u5206\\u4eab\\uff0c\\u5e26\\u4f60\\u5706\\u68a6\\u4e09\\u6c99&lt;\\/span&gt;&lt;\\/div&gt;&lt;\\/a&gt;&lt;\\/div&gt;&lt;\\/div&gt;&lt;div style=&quot;margin-bottom: 24px; width: 310px;&quot;&gt;&lt;a href=&quot;http:\\/\\/www.baidu.com\\/baidu.php?url=a00000KEJeCxDFezE9zWs0cAy48SKaP28i3rtS_b1Qk61FXZFQcfMQUN06D1KVJFwO3d3zasDDuMJQjmC2l016i4eEeCr_vZVXtzAMtixbONugRUmSLlN4wR1bCutTNub_5yi7Be5d-L7aFIDojxT41LTgGVJoMRuSmYdXb3VvmXuyX37YBUhYMWARKRJjGxWb6-u8-wUZEmz3whdEYfBoN4WFcm.7R_iIDxwN4Nn8JspnaRfIZwZKYwqD7NjHw63p8B5hGyAp7WFg8o3J0.U1Yk0ZDqYVHnJeZc1P60IjLcOTh1Eoad3sKGUHYkPWcv0ZNG5fKspyfqP0KWpyfqrHn0mhbqn10k0AuY5H00TA6qn0KET1Ys0AFL5H00UMfqn0K1XWY0ThIYmyTqn0K8IM0qna3snj0snj0sn0K-ThTqn0KYTh7buHYs0AFbpyfqnjK7PHD3n1F7f1uDfRDswjDswH7jnjm4rRndwHmvP100uAPWujY0mgPxpywW5gK1Qy4J0AqW5HD0u1dLTv41IZc0UL0k5H00TZ0Y5H00TMfqPWTY0Z7spyfqn0Kkmv-b5H00mycqn7ts0ZKs5H00Ugws5H00uAwETjYs0ZFJ5H00IZN15Hb3Pj6sPjn1rHczrHf1rjb1njm0mynqnfKsUWYs0ZK9I7qhUA7M5H00TyILujYs0AN1IjYs0ANYpyfqQHD0mgPsmvnqn0KdTA-8mvnqn0KhmLNY5H00mywhUA7M5HD0IvuzUvYq0AFY5HD0ThNkIjYkP1czrHfzrjf1nHTY0ZPGujYsnj0snj0snjnzn1ubuW610AqY5HD0ULFsIjYzc10Wn1RWnH0snan1PjDzrjTdPjD3c1bdnj0WrHRsna3sc1nWnH0snanscYwANansQW01rHRdninkQW0snj0snankc10Wna3snj0snj0Wnan3PjDYnHb3Pjcvc10Wnank0ZFYmy-b5fKopHYs0AdY5HcYnHKxnW0dnfKVm1Ysg1csPHD0UyPxuMFEUHYsg100uA78IyF-gLK_my4GuZnqn7ts0A7bTgbqz5LwktB-z5LF_tofd5gjVnB-0A7bTgfqn0KGTvP_5H00TydY5H00mywxTvqdThP-5H0WpAqYgLIEThfW0APzm1YLPHnz&amp;us=newvui&amp;ai=0_429732241_1_0&amp;word=&quot; target=&quot;_blank&quot;&gt;&lt;div class=&quot;_5dc27n3 r1n7ehc ruyfyqy x17vnj2 _5k9skk2 _3zt36qa na9zhar ec-img&quot;&gt;&lt;img src=&quot;https:\\/\\/ns-strategy.cdn.bcebos.com\\/ns-strategy\\/upload\\/fc_big_pic\\/part-00451-4286.jpg&quot;\\/&gt;&lt;div class=&quot;nb41sx9&quot;&gt;&lt;\\/div&gt;&lt;\\/div&gt;&lt;\\/a&gt;&lt;\\/div&gt;&lt;div&gt;&lt;div class=&quot;_9cy84ta&quot;&gt;&lt;div class=&quot;v3zrcrj&quot;&gt;&lt;span&gt;2024-08-06 19:14&lt;\\/span&gt;&lt;span class=&quot;j4rc4ke&quot;&gt;&lt;span class=&quot;ec-tuiguang ecfc-tuiguang _94sn3jw&quot;&gt;\\u5e7f\\u544a&lt;\\/span&gt;&lt;\\/span&gt;&lt;span class=&quot;qqvbase&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;a href=&quot;http:\\/\\/www.baidu.com\\/baidu.php?url=a00000KEJeCxDFezE9zWs0cAy48SKaP28i3rtS_b1Qk61FXZFQcfMQUN06D1KVJFwO3d3zasDDuMJQjmC2l016i4eEeCr_vZVXtzAMtixbONugRUmSLlN4wR1bCutTNub_5yi7Be5d-L7aFIDojxT41LTgGVJoMRuSmYdXb3VvmXuyX37YBUhYMWARKRJjGxWb6-u8-wUZEmz3whdEYfBoN4WFcm.7R_iIDxwN4Nn8JspnaRfIZwZKYwqD7NjHw63p8B5hGyAp7WFg8o3J0.U1Yk0ZDqYVHnJeZc1P60IjLcOTh1Eoad3sKGUHYkPWcv0ZNG5fKspyfqP0KWpyfqrHn0mhbqn10k0AuY5H00TA6qn0KET1Ys0AFL5H00UMfqn0K1XWY0ThIYmyTqn0K8IM0qna3snj0snj0sn0K-ThTqn0KYTh7buHYs0AFbpyfqnjK7PHD3n1F7f1uDfRDswjDswH7jnjm4rRndwHmvP100uAPWujY0mgPxpywW5gK1Qy4J0AqW5HD0u1dLTv41IZc0UL0k5H00TZ0Y5H00TMfqPWTY0Z7spyfqn0Kkmv-b5H00mycqn7ts0ZKs5H00Ugws5H00uAwETjYs0ZFJ5H00IZN15Hb3Pj6sPjn1rHczrHf1rjb1njm0mynqnfKsUWYs0ZK9I7qhUA7M5H00TyILujYs0AN1IjYs0ANYpyfqQHD0mgPsmvnqn0KdTA-8mvnqn0KhmLNY5H00mywhUA7M5HD0IvuzUvYq0AFY5HD0ThNkIjYkP1czrHfzrjf1nHTY0ZPGujYsnj0snj0snjnzn1ubuW610AqY5HD0ULFsIjYzc10Wn1RWnH0snan1PjDzrjTdPjD3c1bdnj0WrHRsna3sc1nWnH0snanscYwANansQW01rHRdninkQW0snj0snankc10Wna3snj0snj0Wnan3PjDYnHb3Pjcvc10Wnank0ZFYmy-b5fKopHYs0AdY5HcYnHKxnW0dnfKVm1Ysg1csPHD0UyPxuMFEUHYsg100uA78IyF-gLK_my4GuZnqn7ts0A7bTgbqz5LwktB-z5LF_tofd5gjVnB-0A7bTgfqn0KGTvP_5H00TydY5H00mywxTvqdThP-5H0WpAqYgLIEThfW0APzm1YLPHnz&amp;us=newvui&amp;ai=0_429732241_1_0&amp;word=&quot; target=&quot;_blank&quot;&gt;&lt;div class=&quot;_9fe13qw _2jze4xh&quot;&gt;&lt;span&gt;\\u7acb\\u5373\\u67e5\\u770b&lt;\\/span&gt;&lt;div&gt;&lt;\\/div&gt;&lt;\\/div&gt;&lt;\\/a&gt;&lt;\\/div&gt;&lt;\\/div&gt;&lt;\\/div&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;\"}}}}]);</script><script>    _.Module.use('user/widget/icon_tip',{ myIcons:[\"starmaster\"] });</script><script>/* 贴子列表*/_.Module.use(\"pb/widget/postList\", [{    \"searchPid\" : \"0\",    \"searchCid\" : \"0\",    \"pn\" : \"1\",    \"game_bar_name\": [\"cf\\u624b\\u6e38\",\"gta5\",\"h1z1\",\"mcbbs\",\"ps4\",\"steam\",\"\\u4e09\\u56fd\\u6740\",\"\\u4e5d\\u5dde\\u5929\\u7a7a\\u57ce\\u624b\\u6e38\",\"\\u5730\\u4e0b\\u57ce\\u4e0e\\u52c7\\u58eb\",\"\\u5929\\u5929\\u72fc\\u4eba\\u6740\",\"\\u5d29\\u574f3rd\",\"\\u6211\\u7684\\u4e16\\u754c\",\"\\u6211\\u7684\\u4e16\\u754cmcbbs\",\"\\u6211\\u7684\\u4e16\\u754cpe\",\"\\u6211\\u7684\\u4e16\\u754c\\u624b\\u673a\\u7248\",\"\\u6211\\u7684\\u4e16\\u754c\\u624b\\u673a\\u7248\\u670d\\u52a1\\u5668\",\"\\u6211\\u7684\\u4e16\\u754c\\u670d\\u52a1\\u5668\",\"\\u6211\\u7684\\u4e16\\u754c\\u718a\\u5b69\\u5b50\",\"\\u6211\\u7684\\u4e16\\u754c\\u7c7d\\u5cb7\",\"\\u6211\\u7684\\u4e16\\u754c\\u8054\\u673a\",\"\\u6218\\u8230\\u8054\\u76df\",\"\\u670d\\u52a1\\u5668\",\"\\u706b\\u5f71\\u5fcd\\u8005\\u624b\\u6e38\",\"\\u7089\\u77f3\\u4f20\\u8bf4\",\"\\u738b\\u8005\\u8363\\u8000\",\"\\u78a7\\u84dd\\u822a\\u7ebf\",\"\\u7a7f\\u8d8a\\u706b\\u7ebf\",\"\\u7f51\\u6613\\u9634\\u9633\\u5e08\",\"\\u795e\\u65e0\\u6708\\u624b\\u6e38\",\"\\u9a6f\\u9f99\\u4e09\\u56fd\",\"\\u77f3\\u5668\\u65f6\\u4ee3\",\"bztest\",\"\\u77f3\\u5668\\u65f6\\u4ee3\\u624b\\u6e38\",\"\\u8ff7\\u4f60\\u4e16\\u754c\",\"\\u7a7f\\u8d8a\\u706b\\u7ebf\\u67aa\\u6218\\u738b\\u8005\",\"\\u7a7f\\u8d8a\\u706b\\u7ebf\\u624b\\u6e38\",\"\\u8ff7\\u4f60\\u4e16\\u754c\\u624b\\u6e38\",\"\\u8ff7\\u4f60\\u4e16\\u754c\",\"\\u5168\\u6c11\\u67aa\\u6218\",\"\\u5929\\u5929\\u9177\\u8dd1\",\"\\u5929\\u5929\\u9177\\u8dd1\\u9001\\u5fc3\",\"\\u738b\\u8005\\u8363\\u8000\\u624b\\u6e38\",\"\\u6211\\u7684\\u4e16\\u754cpe\\u670d\\u52a1\\u5668\",\"\\u9ed1\\u8272\\u73ab\\u7470\",\"\\u5251\\u4e0e\\u5bb6\\u56ed\",\"\\u95ee\\u9053\\u624b\\u6e38\",\"\\u9b54\\u6cd5\\u7981\\u4e66\\u76ee\\u5f55\\u624b\\u6e38\",\"\\u7edd\\u5730\\u6c42\\u751f\",\"dota2\"],    \"isSeeLz\" : \"\",    \"promoterAttr\" : [],    \"promoterUserIds\" : [],    \"promoterMasterTitle\" : '青龙',    \"needPaypostAgree\": 0,    \"maskDays\": null,    \"firstPost\": {\"thread_id\":9117905169,\"post_id\":150719031818,\"content\":\"<img class=\\\"BDE_Image\\\" src=\\\"http:\\/\\/tiebapic.baidu.com\\/forum\\/w%3D580\\/sign=38506042de22720e7bcee2f24bca0a3a\\/0a763eeff01f3a291c5210eedf25bc315c607c18.jpg?tbpicau=2024-08-17-05_ff738b4f1cd44821a9ce4ffe7e563a8d\\\" size=\\\"900943\\\" changedsize=\\\"true\\\" width=\\\"560\\\" height=\\\"4369\\\" size=\\\"900943\\\">\",\"title\":\"\\u5bf9\\u4e8e\\u4e00\\u4e2a\\u7236\\u4eb2\\u6765\\u8bf4\\uff0c\\u8fd9\\u4e2a\\u5973\\u513f14\\u5c81\\u5c31\\u6b7b\\u4e86\",\"word\":\"\\u4ee5\\u592a\\u6bd4\\u7279\",\"now_time\":1722848210,\"is_vote\":0,\"forum_id\":27927174,\"sign_id\":0,\"user_id\":3424043879,\"openid\":\"tbclient\",\"thread_type\":0,\"code_type\":385875968,\"from_thread_id\":0,\"ptype\":0,\"ip6\":\"::0\",\"is_post_visible\":0,\"post_no\":1,\"imgWaterInfo\":\"a:0:{}\",\"agree_num\":993,\"v_forum_id\":27927174,\"disagree_num\":1,\"version\":1722848210623,\"is_anonym\":false,\"open_type\":\"android\",\"need_bold\":false,\"type\":0,\"vote_crypt\":\"\",\"during_time\":null,\"has_pushed\":0,\"ip_address\":\"\\u5e7f\\u4e1c\"},    \"forum\": {\"forum_name\":\"\\u4ee5\\u592a\\u6bd4\\u7279\",\"forum_id\":27927174,\"level_1_name\":\"\\u641e\\u7b11\",\"level_2_name\":\"\\u641e\\u7b11\",\"managers\":[{\"user\":{\"forum_id\":27927174,\"user_id\":2013993765,\"role_id\":1,\"op_user_id\":4446778646,\"update_time\":1677809974,\"expire_time\":2147483647,\"user_name\":\"\\u611f\\u6027\\u7684\\u4eceV\\u66f4\\u597d\",\"user_nickname_v2\":\"\\u5eb7\\u7eb3\\u9171\\u4e16\\u754c\\u7b2c\\u4e00\\u53ef\\u7231\",\"role_name\":\"manager\",\"portrait_time\":\"1668583131\"}}],\"fourthmanager\":[],\"forbid_flag\":1,\"background\":{\"bg_id\":1,\"more_bg_open\":0,\"more_bg_types\":0},\"attrs\":{\"bg_color\":\"{&quot;day&quot;:{&quot;common_color&quot;:&quot;7681F7&quot;}}\",\"card_p1\":{\"module_id\":5,\"style_id\":1,\"style_name\":\"{&quot;avatar&quot;:&quot;http:\\/\\/tiebapic.baidu.com\\/forum\\/w%3D120%3Bh%3D120\\/sign=293820c7a0dde711e7d247f497d4a626\\/e7cd7b899e510fb3f37ee7559c33c895d0430c89.jpg?tbpicau=2024-08-17-05_ad8d47a48b9849e95d04c7f3d84d0d88&quot;,&quot;slogan&quot;:&quot;&quot;,&quot;desc&quot;:&quot;&quot;,&quot;desc_rich_text&quot;:&quot;&quot;}\"},\"customlink_p1\":{\"module_id\":1002,\"style_id\":1,\"style_name\":1},\"election\":{\"apply\":1676956843,\"audit\":1677290400,\"end\":1677808800,\"public\":1677636000,\"status\":6,\"vote\":1677376800},\"f_share_img\":\"http:\\/\\/tiebapic.baidu.com\\/forum\\/pic\\/item\\/b3fb43166d224f4a410cd4224ff790529822d16e.jpg?tbpicau=2024-08-17-05_db095afe5eb0dfa5fec9ed8a9113cc3e\",\"forum_ctime\":1668827634,\"forum_grade\":{\"grade\":3,\"op_time\":1697779838},\"forum_live\":[{\"end_time\":\"1702310340\",\"extra_info\":{\"is_new\":1,\"live_launch_type\":\"2\",\"show_client_type\":0},\"operator_flag\":0,\"start_time\":\"1701670080\",\"task_id\":\"1528201\",\"thread_id\":\"8763908598\",\"type\":1}],\"has_activityhead\":{\"has_act\":1},\"is_private_forum\":0,\"is_smart_frs_forum\":1,\"photo_p1\":{\"module_id\":99,\"style_id\":1,\"style_name\":\"photo\"},\"pushinfo\":{\"description\":\"\\u672c\\u5427\\u70ed\\u5e16: 1-\\u4e3a\\u4ec0\\u4e48\\u53e4\\u4ee3\\u6253\\u4ed7\\u4e0d\\u76f4\\u63a5\\u7ed5\\u8fc7\\u53bb 2-\\u6709\\u94b1\\u548c\\u6ca1\\u94b1\\u5bf9\\u4e00\\u4e2a\\u4eba\\u7684\\u5f71\\u54cd\\u5230\\u5e95\\u6709\\u591a\\u5927\\uff1f 3-\\u8ba9\\u6211\\u4eec\\u6709\\u673a\\u4f1a\\u770b\\u5230\\u5e74\\u85aa\\u767e\\u4e07\\u7684\\u751f\\u6d3b\\u3002 4-\\u535a\\u7269\\u9986\\u4e2d\\u4ee4\\u4f60\\u6700\\u9707\\u60ca\\u7684\\u4e00\\u4ef6\\u6587\\u7269\\u662f\\u4ec0\\u4e48\\uff1f 5-\\u5b69\\u5b50\\u975e\\u8981\\u4e70\\u5927\\u6a31\\u6843\\u5403\\uff0c\\u6253\\u9a82\\u90fd\\u4e0d\\u7ba1\\u7528\\u600e\\u4e48\\u529e\\uff1f 6-\\u5bf9\\u4e8e\\u4e00\\u4e2a\\u7236\\u4eb2\\u6765\\u8bf4\\uff0c\\u8fd9\\u4e2a\\u5973\\u513f14\\u5c81\\u5c31\\u6b7b\\u4e86 7-\\u9009985\\u666e\\u901a\\u5973\\u751f\\u8fd8\\u662f\\u6f02\\u4eae\\u4e09\\u672c\\u5973\\u751f\\uff1f 8-\\u522b\\u4eba\\u8bdd\\u8d39\\u5145\\u9519\\u5230\\u6211\\u624b\\u673a\\u53f7\\u8be5\\u600e\\u4e48\\u529e 9-\\u53ea\\u662f\\u5e76\\u4e0d\\u662f\\u6240\\u6709\\u7684\\u75bc\\u75db\\uff0c\\u90fd\\u53ef\\u4ee5\\u5450\\u558a\\u3002 10-\\u8fd9\\u624d\\u53eb\\u5dc5\\u5cf0\\u5236\\u4f5c\\uff01\",\"keywords\":\"\\u4ee5\\u592a\\u6bd4\\u7279,\\u641e\\u7b11\",\"tag_title\":\"\\u4ee5\\u592a\\u6bd4\\u7279\\u5427-\\u767e\\u5ea6\\u8d34\\u5427\"},\"smart_frs_user_percent\":100,\"theme_color\":\"{&quot;original_color&quot;:{&quot;hex&quot;:&quot;65688D&quot;,&quot;hsb&quot;:{&quot;h&quot;:235,&quot;s&quot;:28,&quot;b&quot;:55}}}\",\"video_tab_forum\":{\"videoTabId\":\"2451679\"}},\"need_safe\":0,\"can_forum_topic\":0,\"member_name\":\"\\u4f1a\\u5458\",\"member_count\":309573,\"album_forum\":false,\"ban_pic_topic\":0,\"is_album_post\":false,\"album_good_smallflow\":false,\"no_post_pic\":0,\"is_video_v1\":false,\"is_readonly\":0,\"has_picture_frs\":1,\"shield_post\":true,\"global_attr\":{\"bonus_global_rank\":{\"rk\":[{\"l\":2,\"n\":\"\\u82f1\\u4e09\\u5609\\u54e5\",\"s\":\"197300000\"},{\"l\":2,\"n\":\"\\u60b2\\u4f24\\u7684\\u7f94\\u7f8a\",\"s\":\"23000000\"},{\"l\":2,\"n\":\"\\u5e73\\u6de1\\u5982\\u6c34CLUB\",\"s\":\"16000000\"}],\"tn\":13533},\"ideas\":{\"10\":\"recently_at_list\",\"11\":\"shortcut\",\"12\":\"datarecommend\",\"13\":\"markname\",\"14\":\"thread_list_order\",\"15\":\"see_image\",\"3\":\"owner\",\"4\":\"roundavatar\",\"5\":\"wrap_word_repost\",\"6\":\"deepread\",\"7\":\"elevator\",\"8\":\"night_mode\",\"9\":\"short_feedback\"},\"react_native\":1,\"tb_recommend_app\":[{\"ficon\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/dbc2d88065380cd7757468e1ab44ad3458828195.jpg\",\"fid\":\"1227883\",\"fname\":\"\\u84dd\\u94bb\"},{\"ficon\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/9df0bf2c11dfa9ec1d8650986bd0f703908fc1bd.jpg\",\"fid\":\"15213423\",\"fname\":\"t\\u8c46\\u5a31\\u4e50\\u57ce\"},{\"ficon\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/6d308718367adab40eca02cc82d4b31c8601e4d4.jpg\",\"fid\":\"76181\",\"fname\":\"\\u6597\\u5730\\u4e3b\"},{\"ficon\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/88ba47086e061d95b01030b772f40ad163d9ca22.jpg\",\"fid\":\"768801\",\"fname\":\"\\u98df\\u795e\\u4e89\\u9738\"}],\"xiu8_live_list\":[{\"address\":\"\\u6cb3\\u5357\",\"big_pic\":\"5\",\"charm_value\":5,\"chat_weight\":\"5\",\"forum_id\":\"5\",\"forum_name\":\"5\",\"is_live\":1,\"media_id\":\"5\",\"onlive_time\":0,\"pic\":\"5\",\"room_id\":\"5\",\"tag\":\"\\u840c\\u840c\\u54d2\",\"user_name\":\"5\"},{\"address\":\"\\u5e7f\\u4e1c\",\"big_pic\":\"\",\"charm_value\":0,\"chat_weight\":\"\",\"forum_id\":\"\",\"forum_name\":\"\",\"is_live\":1,\"media_id\":\"\",\"onlive_time\":0,\"pic\":\"\",\"room_id\":\"\",\"tag\":\"\\u90bb\\u5bb6\\u5c0f\\u59b9\",\"user_name\":\"\"},{\"address\":\"\\u56db\\u5ddd\",\"big_pic\":null,\"charm_value\":0,\"chat_weight\":null,\"forum_id\":null,\"forum_name\":null,\"is_live\":1,\"media_id\":null,\"onlive_time\":0,\"pic\":null,\"room_id\":null,\"tag\":\"\\u840c\\u840c\\u54d2\",\"user_name\":null}]},\"hide_forum_info\":false,\"forum_name_shared\":[],\"true_forum_id\":27927174,\"forum_shared_deleted\":[],\"pcdrift\":{\"switch\":0,\"jumpurl\":\"\",\"picurl\":\"\"},\"avatar\":\"http:\\/\\/tiebapic.baidu.com\\/forum\\/w%3D120%3Bh%3D120\\/sign=293820c7a0dde711e7d247f497d4a626\\/e7cd7b899e510fb3f37ee7559c33c895d0430c89.jpg?tbpicau=2024-08-17-05_ad8d47a48b9849e95d04c7f3d84d0d88\",\"post_num\":5368434},    \"beyondChannel\": [],    \"isPostVisible\": false,    \"isPrivateForum\": false,    \"thread\": {\"tag_title\":\"\\u5bf9\\u4e8e\\u4e00\\u4e2a\\u7236\\u4eb2\\u6765\\u8bf4\\uff0c\\u8fd9\\u4e2a\\u5973\\u513f14\\u5c81\\u5c31\\u6b7b\\u4e86\",\"title\":\"\\u5bf9\\u4e8e\\u4e00\\u4e2a\\u7236\\u4eb2\\u6765\\u8bf4\\uff0c\\u8fd9\\u4e2a\\u5973\\u513f14\\u5c81\\u5c31\\u6b7b\\u4e86\",\"thread_id\":9117905169,\"thread_type\":0,\"author_name\":\"\\u602a\\u7269\\u5927\\u5b9d\\u8d1d\",\"author_info\":{\"birthday_show_status\":0,\"birthday_time\":0,\"card\":{\"good_num\":0,\"is_novice\":0,\"like_forum\":{\"10\":{\"count\":3,\"forum_list\":[\"\\u9f99\\u9e23\\u96c6\\u56e2\",\"\\u80d6\\u732b\"]},\"11\":{\"count\":1,\"forum_list\":[\"\\u5370\\u5ea6\"]},\"12\":{\"count\":3,\"forum_list\":[\"\\u5947\\u8469\",\"\\u4ee5\\u592a\\u6bd4\\u7279\"]},\"6\":{\"count\":24,\"forum_list\":[\"\\u4e2d\\u56fd\\u4eba\\u53e3\",\"\\u91cd\\u5e86\"]},\"7\":{\"count\":7,\"forum_list\":[\"\\u5de5\\u4eba\",\"ikun\"]},\"8\":{\"count\":2,\"forum_list\":[\"\\u65b0\\u5b59\\u7b11\\u5ddd\",\"g-music\"]},\"9\":{\"count\":1,\"forum_list\":[\"\\u6768\\u8d85\\u8d8a\"]}},\"manager_info\":{\"assist\":{\"count\":0,\"forum_list\":[]},\"manager\":{\"count\":0,\"forum_list\":[]},\"profession_manager\":{\"count\":0}},\"op_time\":1722903005,\"post_num\":3611},\"chatroom_bubble_info\":[{\"end_time\":0,\"id\":1380005,\"open_status\":1,\"start_time\":1697908993,\"type\":2},{\"end_time\":0,\"id\":1380006,\"start_time\":1712124631,\"type\":2}],\"cur_score\":8933,\"display_name\":\"\\u602a\\u7269\\u5927\\u5b9d\\u8d1d\",\"editing_nickname\":\"\",\"is_black\":0,\"is_like\":1,\"is_usable\":1,\"level_id\":12,\"level_name\":\"\\u4eba\\u6c14\\u6977\\u6a21\",\"live_watch_time\":1722526910,\"mParr_props\":{\"all_level\":{\"1\":{\"end_time\":\"1720857161\",\"level\":1,\"pic_url\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/964edcc451da81cb906345a65066d016082431f0.jpg\",\"score_limit\":8000},\"2\":{\"end_time\":\"1720944864\",\"level\":2,\"pic_url\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/6afa80cb39dbb6fdf9de234d0b24ab18962b37f0.jpg\",\"score_limit\":8000}},\"level\":{\"end_time\":\"1720944864\",\"pic_url\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/6afa80cb39dbb6fdf9de234d0b24ab18962b37f0.jpg\",\"props_id\":2}},\"meizhi_level\":0,\"new_active_forum\":[{\"fid\":426299,\"fname\":\"\\u6768\\u8d85\\u8d8a\"},{\"fid\":27927174,\"fname\":\"\\u4ee5\\u592a\\u6bd4\\u7279\"},{\"fid\":472935,\"fname\":\"\\u80d6\\u732b\"}],\"new_iconinfo\":{\"1\":{\"slot_no\":\"1\",\"slot_type\":\"0\",\"icon\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/7c1ed21b0ef41bd5999c427b53da81cb38db3d75.png\",\"value\":\"1\",\"end_time\":\"1735660800\",\"name\":\"juxie\",\"level\":\"1\",\"weight\":1,\"position\":{\"frs\":1,\"pb\":1,\"home\":1,\"card\":1},\"terminal\":{\"pc\":1,\"wap\":1,\"client\":1},\"sprite\":{\"1\":\"1722691615,20\"},\"category_id\":102,\"type\":2,\"price\":0,\"is_force\":0,\"is_advanced\":0,\"title\":\"\\u5de8\\u87f9\\u5ea7\\u5370\\u8bb0\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search\",\"intro\":\"\\u83b7\\u53d6\\u89c4\\u5219\\uff1a\\u5728\\u661f\\u5ea7\\u52cb\\u7ae0\\u9986\\u4e2d\\u83b7\\u5f97\\u3002\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\",\"level_1\":{\"icon_3\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/7c1ed21b0ef41bd5999c427b53da81cb38db3d75.png\",\"icon_2\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/aa18972bd40735faa710e4369c510fb30e240858.png\",\"icon_1\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/d1160924ab18972bebdaaa45e4cd7b899f510a58.png\",\"icon_5\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/d31b0ef41bd5ad6ee836ce6583cb39dbb7fd3c75.png\",\"icon_4\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/962bd40735fae6cd395401ee0db30f2443a70f58.png\",\"icon_6\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/1ad5ad6eddc451dab639a664b4fd5266d1163275.png\",\"level_info\":{\"title\":\"\\u5de8\\u87f9\\u5ea7\\u5370\\u8bb0\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search\",\"intro\":\"\\u83b7\\u53d6\\u89c4\\u5219\\uff1a\\u5728\\u661f\\u5ea7\\u52cb\\u7ae0\\u9986\\u4e2d\\u83b7\\u5f97\\u3002\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}}}},\"portrait_time\":\"1712161997\",\"priv_sets\":{\"like\":\"3\"},\"risk_control_limit\":\"1007\",\"score_left\":1067,\"tieba_uid\":\"335208907\",\"use_sig\":0,\"user_brief\":\" \",\"user_id\":3424043879,\"user_name\":\"\\u602a\\u7269\\u5927\\u5b9d\\u8d1d\",\"user_nickname\":\"\\u8d34\\u5427\\u7528\\u6237_5JQP6NR\",\"user_nickname_v2\":\"\\u7ae0\\u666f\\u8f69\",\"user_nickname_v2_update_time\":1712161968,\"user_sex\":1,\"user_state\":0,\"user_status\":0,\"user_type\":0,\"vipInfo\":{\"a_score\":\"30\",\"e_time\":\"1723535561\",\"ext_score\":\"60\",\"icon_url\":\"https:\\/\\/tieba-ares.cdn.bcebos.com\\/mis\\/2023-7\\/1689061483110\\/92bc14e4c43f.png\",\"icon_url_new\":\"https:\\/\\/tieba-ares.cdn.bcebos.com\\/mis\\/2023-7\\/1689061483110\\/92bc14e4c43f.png\",\"n_score\":7800,\"s_time\":\"1718208000\",\"v_level\":2,\"v_status\":\"1\",\"y_score\":1000},\"is_forum_business_account\":0},\"reply_num\":787,\"is_not_top_stick\":0,\"type_array\":[],\"_show\":null,\"disable_share\":0,\"works_info\":{\"is_works\":0},\"is_launched_tiebaplus\":0,\"is_pictxt\":null},    \"frs_mask_info\": {\"is_frs_mask_forum\":0},    'is_track_banner': 0,    'power': {\"can_add_celebrity\":false,\"can_add_manager_team\":false,\"can_bws_FDS\":false,\"can_bws_bawu_center\":false,\"can_bws_bawu_info\":false,\"can_bws_bawu_log\":false,\"can_bws_filter_ip_tbs\":false,\"can_bws_limit_bawu_log\":false,\"can_cancel_filter_id\":false,\"can_cancel_mask_delete\":false,\"can_cancel_mask_good\":false,\"can_cancel_mask_top\":false,\"can_chatroom_change_announce\":false,\"can_chatroom_change_avatar\":false,\"can_chatroom_change_name\":false,\"can_chatroom_create\":false,\"can_chatroom_delete\":false,\"can_chatroom_exempt_mute_all\":false,\"can_chatroom_manage_admin\":false,\"can_chatroom_mute_all\":false,\"can_chatroom_mute_normal\":false,\"can_chatroom_recall_admin\":false,\"can_chatroom_recall_normal\":false,\"can_chatroom_set_send_level\":false,\"can_chatroom_set_talk_type\":false,\"can_chatroom_set_view_level\":false,\"can_del_manager_team\":false,\"can_edit_bakan\":false,\"can_edit_daquan\":false,\"can_edit_gconforum\":false,\"can_filter_id\":false,\"can_filter_ip\":false,\"can_mask_delete\":false,\"can_mask_good\":false,\"can_mask_top\":false,\"can_member_top\":false,\"can_op_FDS\":false,\"can_op_as_4thmgr\":false,\"can_op_as_broadcast_admin\":false,\"can_op_as_category_editor\":false,\"can_op_as_editor\":false,\"can_op_as_entertainment_manager\":false,\"can_op_as_operator\":false,\"can_op_as_profession_manager\":false,\"can_op_as_vertical_operator\":false,\"can_op_common_bawu\":false,\"can_op_disk\":false,\"can_op_frsbg\":false,\"can_op_good_class\":false,\"can_op_pic\":false,\"can_op_topic\":false,\"can_op_video\":false,\"can_op_wise_group\":false,\"can_paper_ignore_vcode\":false,\"can_pass_media_limit\":false,\"can_post\":true,\"can_post_frs\":true,\"can_post_pb\":true,\"can_send_memo\":false,\"can_super\":false,\"can_tobe_assist\":false,\"can_tobe_editor\":false,\"can_tobe_manager\":false,\"can_tobe_pri_content_assist\":false,\"can_tobe_pri_manage_assist\":false,\"can_toms_operator_alt_basic\":false,\"can_toms_operator_basic\":false,\"can_type1_audit_post\":false,\"can_type2_audit_post\":false,\"can_type3_audit_post\":false,\"can_type4_audit_post\":false,\"can_type5_audit_post\":false,\"can_unknown\":false,\"can_view_freq\":false,\"can_vip_jubao\":false,\"can_vote\":false,\"forever_ban\":0,\"lz_del\":false,\"picasso\":false,\"share_forum_perm\":[],\"can_set_topic\":false,\"reply_private_flag\":1},    'delReason': null,    'user': {\"is_login\":true,\"user_id\":1527556343,\"show_content_info\":[],\"user_name\":\"\\u6297\\u538b\\u5427\\u5427\\u52a1666\",\"no_un\":false,\"mobilephone\":\"131******21\",\"email\":\"\",\"urank\":[],\"userhide\":0,\"need_black_pop\":0,\"black_pop_level\":0,\"forbidden\":[],\"tips\":[],\"baidu_id\":\"00E51832EC6DAA0D10E1C0699C5E6670:FG=1\",\"is_videocreator\":false,\"pop_up_info\":1,\"Parr_props\":{\"all_level\":{\"2\":{\"end_time\":\"1421113470\",\"level\":2,\"score_limit\":8000}},\"level\":{\"end_time\":\"1421113470\",\"expired_notify\":1,\"expiring_notify\":1,\"left_num\":0,\"max_free_score\":8000,\"open_status\":null,\"pic_url\":null,\"props_category\":105,\"props_id\":2,\"props_type\":0,\"update_time\":null,\"used_status\":1}},\"ala_info\":{\"anchor_live\":\"0\",\"enter_live\":\"0\"},\"card\":{\"good_num\":0,\"is_novice\":0,\"like_forum\":{\"10\":{\"count\":1,\"forum_list\":[\"\\u6297\\u538b\"]},\"6\":{\"count\":1,\"forum_list\":[\"\\u73ed\\u5fb7\\u5c14\\u57ce\"]},\"8\":{\"count\":1,\"forum_list\":[\"\\u7535\\u8111\"]}},\"manager_info\":{\"assist\":{\"count\":0,\"forum_list\":[]},\"manager\":{\"count\":0,\"forum_list\":[]}},\"op_time\":1722782548,\"post_num\":1734},\"default_bubble\":\"1010015,a:1:{s:6:&quot;client&quot;;s:23:&quot;31_65_45_40_204_100_290&quot;;},1421113470\",\"display_name\":\"\\u6297\\u538b\\u5427\\u5427\\u52a1666\",\"forbidden_forumlist\":\"\",\"global\":{\"tbmall_newprops\":0},\"heavy_user\":1,\"is_friend_imported\":1,\"is_group_owner\":2,\"is_usable\":1,\"mParr_props\":{\"all_level\":{\"2\":{\"end_time\":\"1421113470\",\"level\":2,\"pic_url\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/6afa80cb39dbb6fdf9de234d0b24ab18962b37f0.jpg\",\"score_limit\":8000}},\"level\":{\"end_time\":\"1421113470\",\"pic_url\":\"http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/6afa80cb39dbb6fdf9de234d0b24ab18962b37f0.jpg\",\"props_id\":2}},\"meizhi_level\":0,\"new_iconinfo\":{\"1\":{\"slot_no\":\"1\",\"slot_type\":\"0\",\"icon\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429669987762.png\",\"value\":\"1\",\"end_time\":\"1735660800\",\"name\":\"starmaster\",\"level\":\"6\",\"weight\":1,\"position\":{\"frs\":1,\"pb\":1,\"home\":1,\"card\":1},\"terminal\":{\"pc\":1,\"wap\":1,\"client\":1},\"sprite\":{\"1\":\"1722691615,76\",\"2\":\"1722691615,77\",\"3\":\"1722691615,78\",\"4\":\"1722691615,79\",\"5\":\"1722691615,80\",\"6\":\"1722691615,81\"},\"category_id\":104,\"type\":2,\"price\":0,\"is_force\":0,\"is_advanced\":0,\"title\":\"\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\",\"level_1\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429669987762.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429669999852.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670005742.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670015949.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670023838.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670037795.png\",\"level_info\":{\"title\":\"\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}},\"level_2\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670195809.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670205542.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670220878.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670227517.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670235465.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670242217.png\",\"level_info\":{\"title\":\"\\u624b\\u6e381\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e381\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}},\"level_3\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670307639.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670315211.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670322063.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670328302.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670335960.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670342374.png\",\"level_info\":{\"title\":\"\\u624b\\u6e382\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e382\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}},\"level_4\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670565360.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670572100.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670579403.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670588885.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670595104.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670602958.png\",\"level_info\":{\"title\":\"\\u624b\\u6e383\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e383\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}},\"level_5\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670665956.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670671915.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670677756.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670683824.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670689692.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670695382.png\",\"level_info\":{\"title\":\"\\u624b\\u6e384\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e384\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}},\"level_6\":{\"icon_3\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670737569.png\",\"icon_2\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670746212.png\",\"icon_1\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670751930.png\",\"icon_5\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670757612.png\",\"icon_4\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670763174.png\",\"icon_6\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/com\\/icon\\/file_1429670769025.png\",\"level_info\":{\"title\":\"\\u624b\\u6e385\\u661f\\u8fbe\\u4eba\",\"title_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"intro\":\"\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e385\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~\",\"intro_url\":\"http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8\",\"forum_list\":\"\",\"pay_pic_pc\":\"\",\"pay_pic_pad\":\"\"}}}},\"player_level_up\":\"1\",\"portrait_time\":\"1420595544\",\"priv_sets\":{\"like\":\"3\",\"post\":\"3\"},\"tailInfo\":[{\"fontColor\":\"646566\",\"fontKeyName\":\"Helvetica Neue\",\"is_selected\":\"1\",\"tailContent\":\"\\u4f5c\\u4e3a\\u4e00\\u540d\\u5927\\u4e09\\u5373\\u5c06\\u79bb\\u5f00\\u8fd9\\u6240\\u5b66\\u6821\\u7684\\u4eba\\uff0c\\u5df2\\u7ecf\\u4e0d\\u613f\\u610f\\u518d\\u82b1\\u8d39\\u65f6\\u95f4\\u53bb\\u548c\\u4e00\\u4e2a\\u964c\\u751f\\u4eba\\u7ecf\\u5386\\u4ece\\u964c\\u751f\\u5230\\u719f\\u6089\",\"tailId\":1420517715}],\"tbscore_repeate_finish_time\":\"1472232847\",\"tieba_uid\":\"1158580658\",\"ueg_profile\":\"70:1,60:0.2,73:135,460:1,51:1,475:1,71:1,476:1,62:1,53:1,474:1,18219:1\",\"use_sig\":0,\"user_sex\":2,\"user_state\":0,\"user_status\":1,\"user_type\":0,\"vipInfo\":{\"a_score\":-50,\"e_time\":\"1421113470\",\"ext_score\":\"0\",\"icon_url\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/icon_crown_super_non1.png\",\"n_score\":2600,\"s_time\":\"1542729600\",\"v_level\":1,\"v_status\":\"0\",\"y_score\":1000},\"vipexp_info\":{\"activated_num\":\"0\",\"create_time\":\"1420508670\",\"seed_num\":\"0\",\"status\":\"2\",\"update_time\":\"1420508670\",\"user_id\":\"1527556343\",\"vip_id\":\"121682015\"},\"cur_score\":0,\"is_black\":0,\"is_like\":0,\"level_id\":1,\"level_name\":\"\\u521d\\u7ea7\\u7c89\\u4e1d\",\"score_left\":5,\"show_nickname\":\"\\u6297\\u538b\\u5427\\u5427\\u52a1666\",\"portrait\":\"tb.1.e6057aec.PmFeyCvKVx0KZKdGZ2v9oA?t=1420595544\",\"is_business_account\":0,\"pb_login_switch\":false,\"interaction_switch\":false,\"login_day\":5,\"edit_config\":null},}]);_.Module.use('pb/widget/adsInserted', {    mediago_info: {\"first_floor\":8,\"density\":6},    flow_type: \"normal\",    forum_name: \"\\u4ee5\\u592a\\u6bd4\\u7279\",    first_dir: \"\\u641e\\u7b11\",    second_dir: \"\\u641e\\u7b11\",    mediago_num: 30,    user_name: \"\\u6297\\u538b\\u5427\\u5427\\u52a1666\",    user_sex: 2,    user_uid: 1527556343,    fc_ad_number: 1,    is_adsense_fc: true});</script><script src=\"//mediago-static.cdn.bcebos.com/static/bundle.js?v=1.2.1\"></script><script>    _.Module.use('pb/widget/scrollEvent', [{    }], function(){});</script><script>        _.Module.use('encourage/widget/celebrity_expball', {            celebrity: null});</script><script>    _.Module.use('user/widget/celebrity', {        celebrity: null,        isCelebrityForum: false,        isCurForumMember: false,        memberLastDays: null});</script><script>    _.Module.use('pb/widget/aside_ad', {        flowType: null,        showMediago: false,        showFC: false});</script><script>        _.Module.use('user/widget/myTieba', [{            balvInfo: {\"is_black\":0,\"is_block\":null,\"opgroup\":null,\"block_reason\":null,\"member_num\":309573,\"rank\":{\"index\":null,\"status\":null},\"cur_score\":0,\"score_left\":5,\"is_guanzhu\":0,\"is_lvup\":0,\"level_id\":1,\"level_name\":\"\\u521d\\u7ea7\\u7c89\\u4e1d\",\"levelup_score\":5,\"rights\":0,\"like_forums_num\":8},            style: \"\",            isBySys: \"\",            product: \"pb\"        }], function (initiate) {            initiate.init();        });</script>    <script>        _.Module.use(\"spage/widget/TopicRank\", {            isShowFC: false,            isShowLU: null,            isAdvertisement: 2,            isTopicListEmpty: false});</script><script>    _.Module.use('pb/widget/page_aside', {        fcFlag: null,        isShowFC: false,        isShowLU: null,        luType: null,        forumName: \"\\u4ee5\\u592a\\u6bd4\\u7279\",        forumSecLvName: \"\\u641e\\u7b11\",        brandAdsenseSwitch: 1});</script><script type=\"text/javascript\" src=\"//passport.baidu.com/passApi/js/uni_forceverify_wrapper.js\"></script><script></script><script>        _.Module.use('comforum/widget/GameSwapWords');    </script><link rel=\"stylesheet\" href=\"//tb1.bdstatic.com/tb/static-common/style/ueditor_extend_ecf7725.css\">\n<script src=\"//tb1.bdstatic.com/??tb/static-common/js/ueditor_b3f5d31.js,tb/static-common/js/ueditor_extend_6965f2b.js\"></script>\n<script type=\"text/html\" id=\"j_simpleeditor_tpl\">        <div class=\"editor_for_container editor_lzl_container\" id=\"j_editor_for_container\"></div>        <p class=\"lzl_panel_error\" style=\"display: none;\"></p>        <table class=\"lzl_panel_wrapper\">            <tbody>            <tr>                <td style=\"width: 75%;\"><p style=\"color:#666;\"></p></td><td style=\"width: 25%; position:relative\"><div class=\"lzl_panel_btn\"><span class=\"lzl_panel_submit j_lzl_p_sb\" alog-action=\"lzlpostor\">发表</span><span class=\"lzl_panel_smile j_lzl_p_sm\"><div class=\"lzl_insertsmiley_holder\"></div></span>                        </div><div class=\"lzl_edui_dialog_container\"></div></td></tr></tbody></table></script><script>    PosterContext.loadContextFromPageData(PageData);    PosterContext.loadAuthorities({\"img_num\":10,\"video_num\":10,\"smiley_num\":100,\"white_list\":[\"http:\\/\\/www.tudou.com\\/\",\"http:\\/\\/v.blog.sohu.com\\/\",\"http:\\/\\/tv.sohu.com\\/\",\"http:\\/\\/share.vrs.sohu.com\\/\",\"http:\\/\\/my.tv.sohu.com\\/\",\"http:\\/\\/player.56.com\\/\",\"http:\\/\\/www.56.com\\/\",\"http:\\/\\/kankanews.com\\/\",\"http:\\/\\/video6.smgbb.cn\\/\",\"http:\\/\\/www.youku.com\\/\",\"http:\\/\\/player.youku.com\\/\",\"http:\\/\\/static.youku.com\\/\",\"http:\\/\\/www.ku6.com\\/\",\"http:\\/\\/player.ku6.com\\/\",\"http:\\/\\/video.sina.com.cn\\/\",\"http:\\/\\/vhead.blog.sina.com.cn\\/\",\"http:\\/\\/you.video.sina.com.cn\\/\",\"http:\\/\\/video.qq.com\\/\",\"http:\\/\\/www.baidu.com\\/\",\"http:\\/\\/box.baidu.com\\/\",\"http:\\/\\/hi.baidu.com\\/\",\"http:\\/\\/mv.baidu.com\\/\",\"http:\\/\\/mvimg.baidu.com\\/\",\"http:\\/\\/mvideo.baidu.com\\/\",\"http:\\/\\/player.cntv.cn\\/\",\"http:\\/\\/player.xiyou.cntv.cn\\/\",\"http:\\/\\/www.yinyuetai.com\\/\",\"http:\\/\\/player.yinyuetai.com\\/\",\"http:\\/\\/www.aipai.com\\/\",\"http:\\/\\/www.cutv.com\\/\",\"http:\\/\\/player.cutv.com\\/\",\"http:\\/\\/www.pptv.com\\/\",\"http:\\/\\/v.pptv.com\\/\",\"http:\\/\\/www.letv.com\\/\",\"http:\\/\\/www.iqiyi.com\\/\",\"http:\\/\\/yule.iqiyi.com\\/\",\"http:\\/\\/player.video.qiyi.com\\/\",\"http:\\/\\/www.ifeng.com\\/\",\"http:\\/\\/s.v.ifeng.com\\/\",\"http:\\/\\/v.ifeng.com\\/\",\"http:\\/\\/www.m1905.com\\/\",\"http:\\/\\/www.joy.cn\\/\",\"http:\\/\\/client.joy.cn\\/\",\"http:\\/\\/www.molihe.com\\/\",\"http:\\/\\/mv.molihe.com\\/\",\"http:\\/\\/swf.molihe.com\\/\",\"http:\\/\\/www.baomihua.com\\/\",\"http:\\/\\/video.baomihua.com\\/\",\"http:\\/\\/www.ouou.com\\/\",\"http:\\/\\/flash.ouou.com\\/\",\"http:\\/\\/dv.ouou.com\\/\",\"http:\\/\\/misc.home.news.cn\\/\",\"http:\\/\\/www.news.cn\\/\",\"http:\\/\\/www.wasu.cn\\/\",\"http:\\/\\/play1.wasu.cn\\/\",\"http:\\/\\/play.wasu.cn\\/\",\"http:\\/\\/v.iask.com\\/\",\"http:\\/\\/i7.imgs.letv.com\\/\",\"http:\\/\\/static.video.qq.com\\/\",\"http:\\/\\/player.pptv.com\\/\",\"http:\\/\\/www.mgtv.com\\/\",\"http:\\/\\/www.meipai.com\\/\",\"http:\\/\\/baishi.baidu.com\\/\",\"http:\\/\\/www.bilibili.com\\/\",\"http:\\/\\/share.acg.tv\\/\",\"http:\\/\\/static.hdslb.com\\/\",\"http:\\/\\/bangumi.bilibili.com\"],\"can_local_upload\":0,\"paypost\":\"\",\"music_num\":10,\"attachment_num\":5,\"attachment_size\":209715200,\"long_editor\":false,\"float_editor\":false,\"custom_emotion\":false,\"emotion_transform\":false,\"tb_gram\":false,\"formula_editor\":false},{\"is_user_has_right\":1,\"is_pro_thread\":null});</script><link rel=\"stylesheet\" href=\"//tb1.bdstatic.com/tb/static-common/style/ueditor_extend_ecf7725.css\">\n<script src=\"//tb1.bdstatic.com/??tb/static-common/js/ueditor_b3f5d31.js,tb/static-common/js/ueditor_extend_6965f2b.js\"></script>\n<script>    (function () {        var isGameTab = false;        function getNormalTabUrl() {            var location = $.tb.location;            var origin = location.getOrigin(), pathname = location.getPathname();            var searchValue = location.getSearchValue();            var searchString = '';            for (var i in searchValue) {                if (i != 'all_thread_tab') {                    searchString += i + '=' + searchValue[i];                }            }            return origin + pathname + '?' + searchString;        }        _.Module.use(\"common/widget/RichPoster\", {            prefix: undefined,            QinglangData: [],            redirectAfterPost: isGameTab ? getNormalTabUrl() : false,            imgNum: 10,            isPaypost: 0,            needPaypostAgree: !0,            isNotTopStick: 0,            threadType: 0,            liveTag: 0});    })();</script><script>_.Module.use('common/widget/footer',null, function(){});</script><script src=\"https://haokanupdate.cdn.bcebos.com/web/artplayer-polyfill-1.4.28.js\"></script><script>_.Module.use('pb/widget/NoAutoVideo',[{        text_videofrom: '',        can_auto_play: '0',        is_show_advideo: ''    }]);</script><script>    _.Module.use('ihome/widget/UserVisitCard',{'uname':'抗压吧吧务666','is_login':0,'tbs':''});</script><script>    _.Module.use('common/widget/Voice', {        canPlay: '1',        api: '',        useMd5: '',        playerType: ''    });</script><div style=\"width: 1px; height: 1px; overflow: hidden;\"><object id=\"audio_player_core\" width=\"1\" height=\"1\" classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#4,0,0,0\"><param name=\"quality\" value=\"high\"><param name=\"allowscriptaccess\" value=\"always\"><param name=\"scale\" value=\"noscale\"><param name=\"wmode\" value=\"window\"><param name=\"movie\" value=\"//tb1.bdstatic.com/tb/fmp.swf\"><embed name=\"audio_player_core\" width=\"1\" height=\"1\" allowscriptaccess=\"always\" wmode=\"window\" scale=\"noscale\" src=\"//tb1.bdstatic.com/tb/fmp.swf\" type=\"application/x-shockwave-flash\" pluginspage=\"http://www.macromedia.com/go/getflashplayer\"></object></div><script>_.Module.use('encourage/widget/meizhi_vote');</script><script>    _.Module.use('encourage/widget/WelfareIcon');</script><script>    _.Module.use('encourage/widget/achieveCard');</script><script>_.Module.use('fanclub/widget/fancard');</script><script>    $(\"body\").delegate('#j_meizhi_auth_btn, #j_meizhi_ysjg', 'click', function (e) {        _.Module.use('postor/widget/MeizhiPostor');        e.preventDefault();    });    if ($.cookie('zt2meizhi') == '1') {        _.Module.use('postor/widget/MeizhiPostor');    }    $.cookie('zt2meizhi',null);    //$.cookie('zt2meizhi', '1', {empires: 365, path: '/'});</script><script>    _.Module.use('frs/widget/frs_stamp_notice',[{    }]);</script><script>        _.Module.use('comforum/widget/GamePopWindow', [null]);</script>    <script>/*url安全界别检测  by tanjiawei*/_.Module.use('pb/widget/UrlCheck');</script><script>_.Module.use(\"props/widget/Feedback\",[{\"appraise\":null}]);</script><script>_.Module.use(\"tbmall/widget/NameplateRecast\",     [0, null]);</script><script>_.Module.use(\"pb/widget/PbTrack\");</script><script>    _.Module.use('adsense/widget/data_handler_async', [], function (instance){    instance.addData({    'forum_vdir': null});    });</script><script>    _.Module.use('tbmall/widget/grab_treasure_dialog_success',[{    diamondData: []}]);</script><script>    /*加载无刷新组件*/    _.Module.use('pb/widget/NoRefresh', [\"\\/p\\/9117905169?pn=\", false]);</script><script>        _.Module.use('spage/widget/fixed_bar', [], function(){});        if ('' === 'showBar'){            $.stats.track('底部', '新用户红包', 'spage', 'show');        }</script><script>    _.Module.use('creativeplatform/widget/normalApp', [[]]);</script><script>PageData.lcs = {};PageData.lcs.sbduss = '6OC0dZS7NfIjUYDTwVI3zOZjAL7yD8MY8lDs9FZMXTlb\\/XpIjjRep98GDwuufTb2q1TK5Ku+yLHr3U5kdcjZYzfQdjoUHU+p0P2QQKbNitPfpLXCmS84lGwv2QA6WN+UeYdtI6fZ7nMWEbewI2Qq50F6sDg8FyuOQXqwODwXK45BerA4PBcrjkF6sDg8FyuOQXqwODwXK45BerA4PBcrjkF6sDg8FyuOQXqwODwXK46F2JPjzJJF2Ryz1avRGHOI';</script><script></script><script>    PageData.user.joinEmoji = \"initial\";    PageData.user.is_uc_account = null;    PageData.user.business_account = null;    PageData.userBarExtraConfig = {\"switch\":\"0\",\"word\":\"hao123\",\"url\":\"https:\\/\\/www.hao123.com\\/?tn=50000076_hao_pg\"};_.Module.use(\"common/widget/Userbar\", [PageData.user, PageData.product, {    bluePushUnit: {\"url\":[\"http:\\/\\/push.dui1dui.com\\/tieba\\/awaken\"],\"button\":[\"\\u9a6c\\u4e0a\\u62a2\"],\"text\":[\"\\u4eb2\\u7231\\u7684\\uff0c\\u4f60\\u4e0d\\u77e5\\u9053\\u5417\\uff1f\\u4f60\\u8d26\\u6237\\u4e2d\\u7684\\u84dd\\u94bb\\u53ef\\u4ee5\\u7528\\u6765\\u5151\\u6362\\u8d34\\u5427\\u4f1a\\u5458\\uff01\\u540d\\u989d\\u6709\\u9650\\uff0c\\u901f\\u6765\\u62a2\\uff01\"]},    bluePushFlag: \"all\",    userDiamond: null}]);</script><script>        _.Module.use('common/widget/AdStats', [{}]);    </script><script>_.Module.use('common/widget/tbskin', [\"normal\"]);</script><script>_.Module.use(\"pb/widget/Stat\");</script><script>var topic_thread = PageData.thread.topic || {},thread_topic_type = topic_thread.is_topic ? \"1\" : \"0\",thread_topic_subtype = (thread_topic_type == \"1\" && topic_thread.topic_type == \"2\") ? \"3\" : \"0\";        var is_post_visible = 0 || 0;    _.Module.use(\"common/widget/AsideFloatBar\",[{        buttons: [            \"auxiliaryCare\",\"down\",            \"post\",        \"props\",            \"tsukkomi\",            \"share\",\"favor\",            \"feedback\",            \"top\"        ],        dataPostor : {            canPostor : {                isBlock: (PageData.user.balv.is_block || PageData.user.forbidden.isForbid) ? true : false,                noUn : PageData[\"user\"][\"no_un\"],                forbidFlag:'1',                login:'1',                canPost:'1'            },            data : {                kw:'以太比特',                ie:'utf-8',                rich_text:'1',                floor_num:\"\",                fid:'27927174',                tbs : PageData[\"tbs\"],                tid:'9117905169',                lp_type: thread_topic_type,                lp_sub_type:thread_topic_subtype            }        },        radarData : {            link: 'http:\\/\\/c.tieba.baidu.com\\/c\\/s\\/download\\/pc?tab=kanpian'        }        ,propsData : {        \"owner\" : null},        is_post_visible: is_post_visible    }]);</script><ul class=\"tbui_aside_float_bar\"><li class=\"tbui_aside_fbar_button tbui_fbar_auxiliaryCare\"><a href=\"javascript:void\"></a></li><li class=\"tbui_aside_fbar_button tbui_fbar_down\"><a href=\"#\"></a></li><li class=\"tbui_aside_fbar_button tbui_fbar_post\"><a href=\"#sub\"></a></li><li class=\"tbui_aside_fbar_button tbui_fbar_props\"><a href=\"#\"></a><ul class=\"tbui_aside_props_list clearfix\" id=\"tbui_aside_props_list\" style=\"display: none;\"><li class=\"props_item props_item_1070001\"><a class=\"props_item_btn\" target=\"_blank\" href=\"/tbmall/propslist?category=107\" data-id=\"1070001\"><img src=\"//tb2.bdstatic.com/tb/static-props/img/props/worship.png\"><span class=\"props_buy_icon\"></span></a><p class=\"props_item_title\"><span>魔拜</span></p></li><li class=\"props_item props_item_1070002\"><a class=\"props_item_btn\" target=\"_blank\" href=\"/tbmall/propslist?category=107\" data-id=\"1070002\"><img src=\"//tb2.bdstatic.com/tb/static-props/img/props/egg.png\"><span class=\"props_buy_icon\"></span></a><p class=\"props_item_title\"><span>魔蛋</span></p></li></ul></li><li class=\"tbui_aside_fbar_button tbui_fbar_tsukkomi\"><a href=\"#\"></a><div class=\"tbui_aside_smiley\"><div class=\"tbui_scroll_panel tbui_no_scroll_bar\"><div class=\"tbui_panel_content j_panel_content clearfix\" style=\"padding: 9px 0px 0px; height: 0px;\"><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"小度熊惊吓道：直到我膝盖中了一箭\" data-num=\"1\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0001.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"波波喷了口血说：我擦\" data-num=\"2\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0002.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"小度熊扔了个肥皂：你懂的\" data-num=\"3\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0003.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"小度熊称赞道：这真是极好的\" data-num=\"4\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0004.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"小度熊激动地说：给力！\" data-num=\"5\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0005.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"布鲁鄙视地说：你妹\" data-num=\"6\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0006.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"小度熊悲伤地说：感觉不会再爱了\" data-num=\"7\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0007.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"王叔淫笑地说：楼下怎么看？\" data-num=\"8\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0008.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"小度熊挑衅地说：呵呵\" data-num=\"9\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0009.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"小度熊顶着贴说：专业顶帖只需2毛\" data-num=\"10\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0010.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"小度熊拿着火钳说：火钳留名\" data-num=\"11\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0011.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"贴贴痴痴地说：楼主好人一生平安\" data-num=\"12\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0012.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"小度熊戏谑道：挽尊\" data-num=\"13\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0013.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"小度熊摊开手说：然并卵\" data-num=\"14\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0014.png\"></div><div class=\"s_image t_smile_bg\" data-type=\"qw_cat\" title=\"布鲁挤着贴贴说：挤挤\" data-num=\"15\"><img src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/cms/commonsub/editor/images/qw_review/qw_cat_0015.png\"></div></div><div class=\"tbui_scroll_bar j_scroll_bar\" style=\"display: none;\"><div class=\"tbui_scroll_button j_scroll_button ui-draggable\" style=\"position: relative;\">&nbsp;</div></div></div></div></li><li class=\"tbui_aside_fbar_button tbui_fbar_share\"><a href=\"#\"><div class=\"tbshare_popup_wrapper\"><div class=\"tbshare_popup_enter\"></div><div class=\"tbshare_popup_main clearfix\"><div class=\"tbshare_wrapper_theme_coco\"><ul class=\"\"><li><div class=\"tbshare_tieba tbshare_icon\" title=\"百度贴吧\" data-share=\"tieba\"><div class=\"tbshare_title_box\">百度贴吧</div></div></li><li><div class=\"tbshare_weixin tbshare_icon\" title=\"微信\" data-share=\"weixin\"><div class=\"tbshare_title_box\">微信</div></div></li><li><div class=\"tbshare_tsina tbshare_icon\" title=\"新浪微博\" data-share=\"tsina\"><div class=\"tbshare_title_box\">新浪微博</div></div></li><li><div class=\"tbshare_qqzone tbshare_icon\" title=\"QQ空间\" data-share=\"qqzone\"><div class=\"tbshare_title_box\">QQ空间</div></div></li><li><div class=\"tbshare_copy tbshare_icon\" onclick=\"return false;\" title=\"复制链接\" data-share=\"copy\"><div class=\"tbshare_title_box\">复制链接</div></div></li></ul></div></div></div></a></li><li class=\"tbui_aside_fbar_button tbui_fbar_favor\"><a href=\"#\"></a><ul class=\"tbui_aside_favor_list clearfix\" id=\"tbui_aside_favor_list\" style=\"display: none;\"><li class=\"j_favor_loading\" style=\"display: none;\"><div class=\"favor_loading\"><img src=\"http://tb2.bdstatic.com/tb/static-common/widget/aside_float_bar/images/loading2_a8a93d0.gif\">正在加载，请稍后。。。</div></li><li><a href=\"//tieba.baidu.com/f?ie=utf-8&amp;kw=%E7%94%B5%E8%84%91\" target=\"_blank\" class=\"ui_text_summary\">电脑</a></li><li><a href=\"//tieba.baidu.com/f?ie=utf-8&amp;kw=%E7%8F%AD%E5%BE%B7%E5%B0%94%E5%9F%8E\" target=\"_blank\" class=\"ui_text_summary\">班德尔城</a></li><li><a href=\"//tieba.baidu.com/f?ie=utf-8&amp;kw=%E7%88%B1%E6%83%85\" target=\"_blank\" class=\"ui_text_summary\">爱情</a></li><li><a href=\"//tieba.baidu.com/f?ie=utf-8&amp;kw=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80\" target=\"_blank\" class=\"ui_text_summary\">王者荣耀</a></li><li><a href=\"//tieba.baidu.com/f?ie=utf-8&amp;kw=yy\" target=\"_blank\" class=\"ui_text_summary\">yy</a></li><li><a href=\"//tieba.baidu.com/f?ie=utf-8&amp;kw=%E7%BE%A4%E6%99%96\" target=\"_blank\" class=\"ui_text_summary\">群晖</a></li><li><a href=\"//tieba.baidu.com/f?ie=utf-8&amp;kw=nas\" target=\"_blank\" class=\"ui_text_summary\">nas</a></li></ul></li><li class=\"tbui_aside_fbar_button tbui_fbar_feedback\"><a href=\"/pmc/feedback\" target=\"_blank\"></a></li><li class=\"tbui_aside_fbar_button tbui_fbar_top\" style=\"visibility: hidden;\"><a href=\"#\"></a></li></ul><script>    _.Module.use('comforum/widget/Comtrial',[{'page':'pb','hide_searchad':0,  'query': '', 'query_encode': '', 'forumName': '以太比特', 'threadTitle': '对于一个父亲来说，这个女儿14岁就死了'}]);</script><script type=\"text/javascript\">!function(e){function o(e){if(0!=e.length){var o=new Image(1,1),t=\"img_\"+ +new Date,a=[],n=e.split(\"&\");a.push(\"ts=9mp&t=csp&sid=\"+v+\"&dv=5&page=\"+encodeURIComponent(d.pageId)+\"&p=\"+encodeURIComponent(d.productId)+\"&type=CROSS_SITE_RES\");for(var r=0;r<n.length;++r)a.push(\"desc\"+r+\"=\"+n[r]);I[t]=o,o.onload=o.onerror=function(){I[t]=o=o.onload=o.onerror=null,delete I[t]},o.src=l+\"/tb/pms/img/st.gif?\"+a.join(\"&\")}}function t(e){return e=e.replace(/\\s/g,\"\").replace(/\\./g,\"\\\\.\").replace(/\\*/g,\".*\").replace(/\\?/g,\".\"),\"^\"+e+\"$\"}function a(){for(var e=d[\"default-exclude\"],o=0;o<e.length;++o){var a=RegExp(t(e[o]),\"i\");g.push(a)}1==d[\"exclude-host\"]&&g.push(RegExp(m,\"i\"))}function n(){var e=window.performance.getEntriesByType(\"resource\");window.performance.clearResourceTimings&&window.performance.clearResourceTimings();for(var t=0;t<e.length;++t){var a=e[t].name;if(a&&void 0==s[a]){var n=a.match(f);if(n){n=n[1],/[:@]/.test(n)&&(n=n.split(\"@\").pop().split(\":\")[0]);for(var r=0;r<g.length;++r){var i=g[r];if(i.test(n)){s[a]=1;break}}a.indexOf(l)>=0&&(s[a]=1),void 0==s[a]&&(s[a]=0)}}}var p=[],c=0;for(var d in s)if(0==s[d]){var m=encodeURIComponent(d);c+m.length>=u&&(c>0&&o(p.join(\"&\")),c=0,p=[]),c+=m.length,p.push(m),s[d]=1}p.length>0&&o(p.join(\"&\"))}function r(){var e=48,o=2,t=1e4,a=0,i=setInterval(function(){a++},16),p=0,c=setInterval(function(){e>a?p=0:++p==o&&(clearInterval(i),clearInterval(c),n(),setTimeout(r,t)),a=0},1e3)}function i(){a(),window.performance&&window.performance.getEntriesByType&&r()}var p={index:{pv:65e6,pageId:\"14_329\",leakPageId:\"14_342\"},frs:{pv:13e7,pageId:\"14_331\",leakPageId:\"14_343\"},pb:{pv:3e8,pageId:\"14_333\",leakPageId:\"14_344\"},ihome:{pv:3e6,pageId:\"14_321\",leakPageId:\"14_341\"},tbmall:{pv:3e6,pageId:\"14_322\",leakPageId:\"14_345\"},itieba3:{pv:5e6,pageId:\"14_323\",leakPageId:\"14_346\"},other:{pv:3e5,pageId:\"14_327\",leakPageId:\"14_347\"}},c=p[PageData.product]?PageData.product:\"other\",d={sample:1e5/p[c].pv,\"exclude-host\":\"https:\"==window.location.protocol?!1:!0,\"default-exclude\":\"https:\"==window.location.protocol?[]:[\"*.bdstatic.com\",\"*.baidu.com\",\"*.tiebaimg.com\",\"*.bdimg.com\",\"*.duoku.com\",\"*.bcebos.com\",\"*.ykimg.com\",\"*.youku.com\"],productId:14,pageId:\"https:\"==window.location.protocol?p[c].leakPageId:p[c].pageId},l=\"http://static.tieba.baidu.com\";\"https:\"==window.location.protocol&&(l=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK\");var g=[],s={},u=1200,m=location.hostname,I={},v=e.logId||(+new Date).toString(36)+Math.random().toString(36).substr(2,3),f=/^(?:http?:\\/\\/)([^\\/]+)/i;Math.random()<=d.sample&&i()}(window);</script><script inline=\"\" type=\"text/javascript\" defer=\"\" src=\"https://xlab.baidu.com/res/bundle.z.php\"></script><script defer=\"\" type=\"text/javascript\" src=\"//tb5.bdstatic.com/api/wza/aria.js?appid=c890648bf4dd00d05eb9751dd0548c30\" charset=\"”utf-8”\" id=\"aria\"></script><script type=\"text/javascript\">!function(){\"use strict\";if(window.radar){var t=document.createElement(\"script\");t.src=\"//tb3.bdstatic.com/radar-sdk/prod/js/2.0.0/es3/radar.min.js?t=\"+(new Date).getTime(),document.getElementsByTagName(\"body\")[0].appendChild(t)}}();</script><script src=\"//tb3.bdstatic.com/radar-sdk/prod/js/2.0.0/es3/radar.min.js?t=1722942841593\"></script><script type=\"text/javascript\">        window.weirwoodParams = {\"common\":{\"buildid\":\"pc__pb\",\"token\":\"37c001b924cf44f9b4801f02747b4693\",\"ignoreUrls\":[]},\"error\":{\"sampleRate\":0.002,\"collectWindowErrors\":true,\"collectUnhandledRejections\":true,\"collectResourceLoadErrors\":true},\"perf\":{\"sampleRate\":0.002,\"spa\":false,\"history\":true}};        !function(){\"use strict\";function r(o){return function(o){if(Array.isArray(o)){for(var e=0,r=new Array(o.length);e<o.length;e++)r[e]=o[e];return r}}(o)||function(o){if(Symbol.iterator in Object(o)||\"[object Arguments]\"===Object.prototype.toString.call(o))return Array.from(o)}(o)||function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance\")}()}var o;(o=document.createElement(\"script\")).src=\"https://dmpstatic.cdn.bcebos.com/weirwood-sdk/1/1.3.7/bundle.min.js\",o.onload=function(){var e=Weirwood.init(window.spaWeirwoodParams||window.weirwoodParams);__tieba__weirwood__.jsExceptions.forEach(function(o){var e;(e=window).onerror.apply(e,r(o))}),__tieba__weirwood__.resourceExceptions.forEach(function(o){__tieba__weirwood__.weirwoodResourceListener(o)}),__tieba__weirwood__.apiExceptions.forEach(function(o){window.onunhandledrejection(o)}),__tieba__weirwood__.customExceptions.forEach(function(o){e.error.captureException(o)}),window.addEventListener=__tieba__weirwood__.windowAddEventListener,__tieba__weirwood__.reportException=e.error.captureException.bind(e.error)},document.body.appendChild(o)}();</script><script src=\"https://dmpstatic.cdn.bcebos.com/weirwood-sdk/1/1.3.7/bundle.min.js\"></script><script type=\"text/javascript\">var templateName = \"bright\\/bright.php\" || 'noTemplateName';var moduleName = \"pb\" || 'noModuleName';templateName = templateName.split('/')[0]; /* task：online_template；locate: 模版名称；page：模块名称；*/ $.stats.track(templateName, 'online_template', moduleName, 'view');</script><script>var parisUrl = '//tb3.bdstatic.com/api/acs/paris-v2.min.js';$.stats.importScript(parisUrl, {        retryCount: 3,        successCallback: function() {            if (!ParisFactory) {                return;            }            ParisFactory.create({                sid: 2027,                timeout: 5000,                acsUrl: 'https://dlswbr.baidu.com/heicha/mm/2027/acs-2027.js',                disasterConfig: {                    acsUrl: 'https://miaowu.baidu.com/sdk/heicha/mm/2027/acs-2027.js',                }            });        },        failureCallback: function() {            $.stats.track('acs_paris', 'acs_paris_load_fail', 'common', 'view');        }    })</script><script src=\"//tb3.bdstatic.com/api/acs/paris-v2.min.js\"></script><script>    (() => {        if(window.PerformanceObserver && window.performance) {            /** 打点未添加图片防盗链的图片请求 */            function trackLostAntiTheftChain(resources) {                var antiTheftUrlRegexp = /^https?:\\/\\/tiebapic.baidu.com/;                for(var resource of resources) {                    /** 图片防盗链例子：http://tiebapic.baidu.com/tieba/pic/item/2934349b033b5bb5d15bec2473d3d539b700bc58.jpg?tbpicau=2022-07-15-17_a2216276f09dcac2ede6c16a81d97751 */                    if(antiTheftUrlRegexp.test(resource.name)) {                        if(resource.name.indexOf('tbpicau') === -1) {                            var templateName = \"bright\\/bright.php\" || 'noTemplateName';                            var moduleName = \"pb\" || 'noModuleName';                            templateName = templateName.split('/')[0];                            /* locate: 模版名称; task：anti_theft; page：模块名称; type: view */                             $.stats.track(templateName, 'anti_theft', moduleName, 'view', {resourceURL: resource.name});                        }                    }                }            }            /** DOMContentLoaded -> load */            var observer = new PerformanceObserver((loadedResources) => {                trackLostAntiTheftChain(loadedResources.getEntries());            });            observer.observe({entryTypes: ['resource']});            /** navigationStart -> DOMContentLoaded */            var DOMContentLoadedResources = window.performance.getEntriesByType('resource');            trackLostAntiTheftChain(DOMContentLoadedResources);        }    })()</script><iframe id=\"ariao01e0zxtmc0\" style=\"display: none !important;\"></iframe><script src=\"https://hector.baidu.com/a.js\" defer=\"\"></script><main class=\"svelte-zmnt4x\"></main><div id=\"monica-content-root\" class=\"monica-widget\"></div><iframe src=\"chrome-extension://hgimnogjllphhhkhlmebbmlgjoejdpjl/bar.html\" id=\"xh-bar\" class=\"\"></iframe></body><chatgpt-sidebar data-gpts-theme=\"light\"></chatgpt-sidebar><chatgpt-sidebar-popups data-gpts-theme=\"light\"></chatgpt-sidebar-popups></html>"
  },
  {
    "path": "media_platform/tieba/test_data/note_sub_comments.html",
    "content": "<li class=\"lzl_single_post j_lzl_s_p first_no_border\" data-field='{&quot;spid&quot;:150726504693,&quot;showname&quot;:&quot;heinzfrentzen&quot;,&quot;user_name&quot;:&quot;heinzfrentzen&quot;,&quot;portrait&quot;:&quot;tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA&quot;}'>\n    <a rel=\"noopener\" name=\"150726504693\"></a>\n    <a rel=\"noopener\" data-field='{&quot;un&quot;:&quot;heinzfrentzen&quot;,&quot;id&quot;:&quot;tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA&quot;}' target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA&fr=pb\" username=\"heinzfrentzen\">\n        <img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA\"/>\n    </a>\n    <div class=\"lzl_cnt\" data-field='{&quot;iconArr&quot;:[],&quot;free_flag&quot;:null}'>\n        <a rel=\"noopener\" class=\"at j_user_card \" data-field='{&quot;un&quot;:&quot;heinzfrentzen&quot;,&quot;id&quot;:&quot;tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA&quot;}' href=\"/home/main?id=tb.1.b08d8f12.IR-tbLlZ2GkD6ARA-mfGOA&ie=utf-8&fr=pb\" target=\"_blank\" username=\"heinzfrentzen\">heinzfrentzen</a>\n        :\n        <span class=\"lzl_content_main\" data-username=\"\">\n            <img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon25.png\">\n            <img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon25.png\">\n        </span>\n        <div class=\"lzl_content_reply\">\n            <span class=\"lzl_jb\" style=\"display:none;\"></span>\n            <span class=\"lzl_op_list j_lzl_o_l\" style=\"display:none;\"></span>\n            <span class=\"lzl_time\">2024-8-6 22:11</span>\n            <a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a>\n        </div>\n    </div>\n</li>\n<li class=\"lzl_single_post j_lzl_s_p \" data-field='{&quot;spid&quot;:150726506822,&quot;showname&quot;:&quot;\\u53ef\\u7231\\u7684\\u642c\\u8fd0\\u5de594&quot;,&quot;user_name&quot;:&quot;\\u53ef\\u7231\\u7684\\u642c\\u8fd0\\u5de594&quot;,&quot;portrait&quot;:&quot;tb.1.f1b47a84.Rixjf6fMP-PfH8fnS1CgRA&quot;}'>\n    <a rel=\"noopener\" name=\"150726506822\"></a>\n    <a rel=\"noopener\" data-field='{&quot;un&quot;:&quot;\\u53ef\\u7231\\u7684\\u642c\\u8fd0\\u5de594&quot;,&quot;id&quot;:&quot;tb.1.f1b47a84.Rixjf6fMP-PfH8fnS1CgRA&quot;}' target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.f1b47a84.Rixjf6fMP-PfH8fnS1CgRA&fr=pb\" username=\"可爱的搬运工94\">\n        <img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.f1b47a84.Rixjf6fMP-PfH8fnS1CgRA\"/>\n    </a>\n    <div class=\"lzl_cnt\" data-field='{&quot;iconArr&quot;:[],&quot;free_flag&quot;:null}'>\n        <a rel=\"noopener\" class=\"at j_user_card \" data-field='{&quot;un&quot;:&quot;\\u53ef\\u7231\\u7684\\u642c\\u8fd0\\u5de594&quot;,&quot;id&quot;:&quot;tb.1.f1b47a84.Rixjf6fMP-PfH8fnS1CgRA&quot;}' href=\"/home/main?id=tb.1.f1b47a84.Rixjf6fMP-PfH8fnS1CgRA&ie=utf-8&fr=pb\" target=\"_blank\" username=\"可爱的搬运工94\">可爱的搬运工94</a>\n        :<span class=\"lzl_content_main\" data-username=\"\">陈芋汐水花也不小        </span>\n        <div class=\"lzl_content_reply\">\n            <span class=\"lzl_jb\" style=\"display:none;\"></span>\n            <span class=\"lzl_op_list j_lzl_o_l\" style=\"display:none;\"></span>\n            <span class=\"lzl_time\">2024-8-6 22:12</span>\n            <a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a>\n        </div>\n    </div>\n</li>\n<li class=\"lzl_single_post j_lzl_s_p \" data-field='{&quot;spid&quot;:150726508024,&quot;showname&quot;:&quot;\\u56fd\\u9645\\u4f53\\u575b\\u5de8\\u661f\\u9752\\u6912\\u8089\\u4e1d&quot;,&quot;user_name&quot;:&quot;\\u8682\\u8681\\u96c5\\u864e\\u54c8\\u54c8&quot;,&quot;portrait&quot;:&quot;tb.1.c5c485ab.Cf5aDgd1NxLxZlej8r4LWg&quot;}'>\n    <a rel=\"noopener\" name=\"150726508024\"></a>\n    <a rel=\"noopener\" data-field='{&quot;un&quot;:&quot;\\u8682\\u8681\\u96c5\\u864e\\u54c8\\u54c8&quot;,&quot;id&quot;:&quot;tb.1.c5c485ab.Cf5aDgd1NxLxZlej8r4LWg&quot;}' target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.c5c485ab.Cf5aDgd1NxLxZlej8r4LWg&fr=pb\" username=\"蚂蚁雅虎哈哈\">\n        <img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.c5c485ab.Cf5aDgd1NxLxZlej8r4LWg\"/>\n    </a>\n    <div class=\"lzl_cnt\" data-field='{&quot;iconArr&quot;:[],&quot;free_flag&quot;:null}'>\n        <a rel=\"noopener\" class=\"at j_user_card \" data-field='{&quot;un&quot;:&quot;\\u8682\\u8681\\u96c5\\u864e\\u54c8\\u54c8&quot;,&quot;id&quot;:&quot;tb.1.c5c485ab.Cf5aDgd1NxLxZlej8r4LWg&quot;}' href=\"/home/main?id=tb.1.c5c485ab.Cf5aDgd1NxLxZlej8r4LWg&ie=utf-8&fr=pb\" target=\"_blank\" username=\"蚂蚁雅虎哈哈\">国际体坛巨星青椒肉丝</a>\n        :<span class=\"lzl_content_main\" data-username=\"\">你怀孕了吗 老是呕吐        </span>\n        <div class=\"lzl_content_reply\">\n            <span class=\"lzl_jb\" style=\"display:none;\"></span>\n            <span class=\"lzl_op_list j_lzl_o_l\" style=\"display:none;\"></span>\n            <span class=\"lzl_time\">2024-8-6 22:12</span>\n            <a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a>\n        </div>\n    </div>\n</li>\n<li class=\"lzl_single_post j_lzl_s_p \" data-field='{&quot;spid&quot;:150726509762,&quot;showname&quot;:&quot;\\u8317\\u82b1\\u5c11\\u5e05&quot;,&quot;user_name&quot;:&quot;\\u8317\\u82b1\\u5c11\\u5e05&quot;,&quot;portrait&quot;:&quot;tb.1.a0b6ca3c.54TCKizU2c9oSYWqNF7NqA&quot;}'>\n    <a rel=\"noopener\" name=\"150726509762\"></a>\n    <a rel=\"noopener\" data-field='{&quot;un&quot;:&quot;\\u8317\\u82b1\\u5c11\\u5e05&quot;,&quot;id&quot;:&quot;tb.1.a0b6ca3c.54TCKizU2c9oSYWqNF7NqA&quot;}' target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.a0b6ca3c.54TCKizU2c9oSYWqNF7NqA&fr=pb\" username=\"茗花少帅\">\n        <img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.a0b6ca3c.54TCKizU2c9oSYWqNF7NqA\"/>\n    </a>\n    <div class=\"lzl_cnt\" data-field='{&quot;iconArr&quot;:{&quot;all_level&quot;:{&quot;2&quot;:{&quot;end_time&quot;:&quot;1421248220&quot;,&quot;level&quot;:2,&quot;pic_url&quot;:&quot;http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/6afa80cb39dbb6fdf9de234d0b24ab18962b37f0.jpg&quot;,&quot;score_limit&quot;:8000}},&quot;level&quot;:{&quot;end_time&quot;:&quot;1421248220&quot;,&quot;pic_url&quot;:&quot;http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/6afa80cb39dbb6fdf9de234d0b24ab18962b37f0.jpg&quot;,&quot;props_id&quot;:2}},&quot;free_flag&quot;:null}'>\n        <a rel=\"noopener\" class=\"at j_user_card \" data-field='{&quot;un&quot;:&quot;\\u8317\\u82b1\\u5c11\\u5e05&quot;,&quot;id&quot;:&quot;tb.1.a0b6ca3c.54TCKizU2c9oSYWqNF7NqA&quot;}' href=\"/home/main?id=tb.1.a0b6ca3c.54TCKizU2c9oSYWqNF7NqA&ie=utf-8&fr=pb\" target=\"_blank\" username=\"茗花少帅\">茗花少帅</a>\n        :<span class=\"lzl_content_main\" data-username=\"\">你就只看水花，不看空中姿态吗        </span>\n        <div class=\"lzl_content_reply\">\n            <span class=\"lzl_jb\" style=\"display:none;\"></span>\n            <span class=\"lzl_op_list j_lzl_o_l\" style=\"display:none;\"></span>\n            <span class=\"lzl_time\">2024-8-6 22:12</span>\n            <a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a>\n        </div>\n    </div>\n</li>\n<li class=\"lzl_single_post j_lzl_s_p \" data-field='{&quot;spid&quot;:150726510645,&quot;showname&quot;:&quot;\\u4e1c\\u534e\\u6b66\\u5170&quot;,&quot;user_name&quot;:&quot;\\u897f\\u5b89\\u4ea4\\u5927\\u524d\\u4e00\\u767e&quot;,&quot;portrait&quot;:&quot;tb.1.774316af.RqsfwTN2w3AJQFmXAO_MHw&quot;}'>\n    <a rel=\"noopener\" name=\"150726510645\"></a>\n    <a rel=\"noopener\" data-field='{&quot;un&quot;:&quot;\\u897f\\u5b89\\u4ea4\\u5927\\u524d\\u4e00\\u767e&quot;,&quot;id&quot;:&quot;tb.1.774316af.RqsfwTN2w3AJQFmXAO_MHw&quot;}' target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.774316af.RqsfwTN2w3AJQFmXAO_MHw&fr=pb\" username=\"西安交大前一百\">\n        <img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.774316af.RqsfwTN2w3AJQFmXAO_MHw\"/>\n    </a>\n    <div class=\"lzl_cnt\" data-field='{&quot;iconArr&quot;:{&quot;all_level&quot;:{&quot;2&quot;:{&quot;end_time&quot;:&quot;1644033630&quot;,&quot;level&quot;:2,&quot;pic_url&quot;:&quot;http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/6afa80cb39dbb6fdf9de234d0b24ab18962b37f0.jpg&quot;,&quot;score_limit&quot;:8000}},&quot;level&quot;:{&quot;end_time&quot;:&quot;1644033630&quot;,&quot;pic_url&quot;:&quot;http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/6afa80cb39dbb6fdf9de234d0b24ab18962b37f0.jpg&quot;,&quot;props_id&quot;:2}},&quot;free_flag&quot;:null}'>\n        <a rel=\"noopener\" class=\"at j_user_card \" data-field='{&quot;un&quot;:&quot;\\u897f\\u5b89\\u4ea4\\u5927\\u524d\\u4e00\\u767e&quot;,&quot;id&quot;:&quot;tb.1.774316af.RqsfwTN2w3AJQFmXAO_MHw&quot;}' href=\"/home/main?id=tb.1.774316af.RqsfwTN2w3AJQFmXAO_MHw&ie=utf-8&fr=pb\" target=\"_blank\" username=\"西安交大前一百\">东华武兰</a>\n        :<span class=\"lzl_content_main\" data-username=\"\">经典只看水花        </span>\n        <div class=\"lzl_content_reply\">\n            <span class=\"lzl_jb\" style=\"display:none;\"></span>\n            <span class=\"lzl_op_list j_lzl_o_l\" style=\"display:none;\"></span>\n            <span class=\"lzl_time\">2024-8-6 22:12</span>\n            <a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a>\n        </div>\n    </div>\n</li>\n<li class=\"lzl_single_post j_lzl_s_p \" data-field='{&quot;spid&quot;:150726514057,&quot;showname&quot;:&quot;\\u4e0a\\u4e0b\\u73ed\\u8981\\u6ce8\\u610f&quot;,&quot;user_name&quot;:&quot;\\u4e0a\\u4e0b\\u73ed\\u8981\\u6ce8\\u610f&quot;,&quot;portrait&quot;:&quot;tb.1.bcab9641.aHxSViAprkm6E0KQWrw3pg&quot;}'>\n    <a rel=\"noopener\" name=\"150726514057\"></a>\n    <a rel=\"noopener\" data-field='{&quot;un&quot;:&quot;\\u4e0a\\u4e0b\\u73ed\\u8981\\u6ce8\\u610f&quot;,&quot;id&quot;:&quot;tb.1.bcab9641.aHxSViAprkm6E0KQWrw3pg&quot;}' target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.bcab9641.aHxSViAprkm6E0KQWrw3pg&fr=pb\" username=\"上下班要注意\">\n        <img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.bcab9641.aHxSViAprkm6E0KQWrw3pg\"/>\n    </a>\n    <div class=\"lzl_cnt\" data-field='{&quot;iconArr&quot;:[],&quot;free_flag&quot;:null}'>\n        <a rel=\"noopener\" class=\"at j_user_card \" data-field='{&quot;un&quot;:&quot;\\u4e0a\\u4e0b\\u73ed\\u8981\\u6ce8\\u610f&quot;,&quot;id&quot;:&quot;tb.1.bcab9641.aHxSViAprkm6E0KQWrw3pg&quot;}' href=\"/home/main?id=tb.1.bcab9641.aHxSViAprkm6E0KQWrw3pg&ie=utf-8&fr=pb\" target=\"_blank\" username=\"上下班要注意\">上下班要注意</a>\n        :<span class=\"lzl_content_main\" data-username=\"\">额，分数正常吧        </span>\n        <div class=\"lzl_content_reply\">\n            <span class=\"lzl_jb\" style=\"display:none;\"></span>\n            <span class=\"lzl_op_list j_lzl_o_l\" style=\"display:none;\"></span>\n            <span class=\"lzl_time\">2024-8-6 22:13</span>\n            <a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a>\n        </div>\n    </div>\n</li>\n<li class=\"lzl_single_post j_lzl_s_p \" data-field='{&quot;spid&quot;:150726520372,&quot;showname&quot;:&quot;\\u9759\\u770b\\u8682\\u8681\\u4e0a\\u6811&quot;,&quot;user_name&quot;:&quot;\\u9759\\u770b\\u8682\\u8681\\u4e0a\\u6811&quot;,&quot;portrait&quot;:&quot;tb.1.7ea539b2.dHz6uxKdbItmtGkwZeV6oQ&quot;}'>\n    <a rel=\"noopener\" name=\"150726520372\"></a>\n    <a rel=\"noopener\" data-field='{&quot;un&quot;:&quot;\\u9759\\u770b\\u8682\\u8681\\u4e0a\\u6811&quot;,&quot;id&quot;:&quot;tb.1.7ea539b2.dHz6uxKdbItmtGkwZeV6oQ&quot;}' target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.7ea539b2.dHz6uxKdbItmtGkwZeV6oQ&fr=pb\" username=\"静看蚂蚁上树\">\n        <img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.7ea539b2.dHz6uxKdbItmtGkwZeV6oQ\"/>\n    </a>\n    <div class=\"lzl_cnt\" data-field='{&quot;iconArr&quot;:[],&quot;free_flag&quot;:null}'>\n        <a rel=\"noopener\" class=\"at j_user_card \" data-field='{&quot;un&quot;:&quot;\\u9759\\u770b\\u8682\\u8681\\u4e0a\\u6811&quot;,&quot;id&quot;:&quot;tb.1.7ea539b2.dHz6uxKdbItmtGkwZeV6oQ&quot;}' href=\"/home/main?id=tb.1.7ea539b2.dHz6uxKdbItmtGkwZeV6oQ&ie=utf-8&fr=pb\" target=\"_blank\" username=\"静看蚂蚁上树\">静看蚂蚁上树</a>\n        :\n        <span class=\"lzl_content_main\" data-username=\"\">\n            回复 <a href=\"http://tieba.baidu.com/i/sys/jump?un= \" onclick=\"Stats.sendRequest('fr=tb0_forum&st_mod=pb&st_value=atlink');\" onmouseover=\"showattip(this)\" onmouseout=\"hideattip(this)\" username=\" \" portrait=\"tb.1.c5c485ab.Cf5aDgd1NxLxZlej8r4LWg\" target=\"_blank\" class=\"at\">国际体坛巨星青椒肉丝</a>\n            :吃酸黄瓜吃多了<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon22.png\">\n            <img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon22.png\">\n            <img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon22.png\">\n        </span>\n        <div class=\"lzl_content_reply\">\n            <span class=\"lzl_jb\" style=\"display:none;\"></span>\n            <span class=\"lzl_op_list j_lzl_o_l\" style=\"display:none;\"></span>\n            <span class=\"lzl_time\">2024-8-6 22:14</span>\n            <a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a>\n        </div>\n    </div>\n</li>\n<li class=\"lzl_single_post j_lzl_s_p \" data-field='{&quot;spid&quot;:150726524963,&quot;showname&quot;:&quot;\\u4e0d\\u61c2\\u53d6\\u5565\\u540d\\u5b57\\ud83d\\ude1c&quot;,&quot;user_name&quot;:&quot;\\u9ec4\\u5c0f\\u6e2forz&quot;,&quot;portrait&quot;:&quot;tb.1.e74fa44d.lLp46IIhj8NhhHk12z_qRA&quot;}'>\n    <a rel=\"noopener\" name=\"150726524963\"></a>\n    <a rel=\"noopener\" data-field='{&quot;un&quot;:&quot;\\u9ec4\\u5c0f\\u6e2forz&quot;,&quot;id&quot;:&quot;tb.1.e74fa44d.lLp46IIhj8NhhHk12z_qRA&quot;}' target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.e74fa44d.lLp46IIhj8NhhHk12z_qRA&fr=pb\" username=\"黄小港orz\">\n        <img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.e74fa44d.lLp46IIhj8NhhHk12z_qRA\"/>\n    </a>\n    <div class=\"lzl_cnt\" data-field='{&quot;iconArr&quot;:[],&quot;free_flag&quot;:null}'>\n        <a rel=\"noopener\" class=\"at j_user_card \" data-field='{&quot;un&quot;:&quot;\\u9ec4\\u5c0f\\u6e2forz&quot;,&quot;id&quot;:&quot;tb.1.e74fa44d.lLp46IIhj8NhhHk12z_qRA&quot;}' href=\"/home/main?id=tb.1.e74fa44d.lLp46IIhj8NhhHk12z_qRA&ie=utf-8&fr=pb\" target=\"_blank\" username=\"黄小港orz\">不懂取啥名字😜</a>\n        :\n        <span class=\"lzl_content_main\" data-username=\"\">\n            请你去跟国际泳联投诉<img class=\"BDE_Smiley\" width=\"30\" height=\"30\" changedsize=\"false\" src=\"https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon22.png\">\n        </span>\n        <div class=\"lzl_content_reply\">\n            <span class=\"lzl_jb\" style=\"display:none;\"></span>\n            <span class=\"lzl_op_list j_lzl_o_l\" style=\"display:none;\"></span>\n            <span class=\"lzl_time\">2024-8-6 22:15</span>\n            <a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a>\n        </div>\n    </div>\n</li>\n<li class=\"lzl_single_post j_lzl_s_p \" data-field='{&quot;spid&quot;:150726535666,&quot;showname&quot;:&quot;\\ud83d\\udcab\\u6cfd\\u8d6b\\u62c9\\ud83d\\udcaf&quot;,&quot;user_name&quot;:&quot;\\u5feb\\u770b\\u5361\\u5361\\u5361\\u5361&quot;,&quot;portrait&quot;:&quot;tb.1.5f510507.B4GLS91flqmWc5QXoaRCoQ&quot;}'>\n    <a rel=\"noopener\" name=\"150726535666\"></a>\n    <a rel=\"noopener\" data-field='{&quot;un&quot;:&quot;\\u5feb\\u770b\\u5361\\u5361\\u5361\\u5361&quot;,&quot;id&quot;:&quot;tb.1.5f510507.B4GLS91flqmWc5QXoaRCoQ&quot;}' target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.5f510507.B4GLS91flqmWc5QXoaRCoQ&fr=pb\" username=\"快看卡卡卡卡\">\n        <img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.5f510507.B4GLS91flqmWc5QXoaRCoQ\"/>\n    </a>\n    <div class=\"lzl_cnt\" data-field='{&quot;iconArr&quot;:{&quot;all_level&quot;:{&quot;2&quot;:{&quot;end_time&quot;:&quot;1539783937&quot;,&quot;level&quot;:2,&quot;pic_url&quot;:&quot;http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/6afa80cb39dbb6fdf9de234d0b24ab18962b37f0.jpg&quot;,&quot;score_limit&quot;:8000}},&quot;level&quot;:{&quot;end_time&quot;:&quot;1539783937&quot;,&quot;pic_url&quot;:&quot;http:\\/\\/imgsrc.baidu.com\\/forum\\/pic\\/item\\/6afa80cb39dbb6fdf9de234d0b24ab18962b37f0.jpg&quot;,&quot;props_id&quot;:2}},&quot;free_flag&quot;:null}'>\n        <a rel=\"noopener\" class=\"at j_user_card \" data-field='{&quot;un&quot;:&quot;\\u5feb\\u770b\\u5361\\u5361\\u5361\\u5361&quot;,&quot;id&quot;:&quot;tb.1.5f510507.B4GLS91flqmWc5QXoaRCoQ&quot;}' href=\"/home/main?id=tb.1.5f510507.B4GLS91flqmWc5QXoaRCoQ&ie=utf-8&fr=pb\" target=\"_blank\" username=\"快看卡卡卡卡\">💫泽赫拉💯</a>\n        :<span class=\"lzl_content_main\" data-username=\"\">第五跳陈空中分腿了，空中姿态明显全红婵更好        </span>\n        <div class=\"lzl_content_reply\">\n            <span class=\"lzl_jb\" style=\"display:none;\"></span>\n            <span class=\"lzl_op_list j_lzl_o_l\" style=\"display:none;\"></span>\n            <span class=\"lzl_time\">2024-8-6 22:17</span>\n            <a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a>\n        </div>\n    </div>\n</li>\n<li class=\"lzl_single_post j_lzl_s_p \" data-field='{&quot;spid&quot;:150726536076,&quot;showname&quot;:&quot;\\u55ef\\u55ef\\u54e6\\u54e6\\u554a\\u554a\\ud83d\\udc36&quot;,&quot;user_name&quot;:&quot;\\u55ef\\u55ef\\u54e6\\u54e6\\u554a\\u554a\\u54fc&quot;,&quot;portrait&quot;:&quot;tb.1.ba071e03._M1o8S5FX4p57pZBJa91CQ&quot;}'>\n    <a rel=\"noopener\" name=\"150726536076\"></a>\n    <a rel=\"noopener\" data-field='{&quot;un&quot;:&quot;\\u55ef\\u55ef\\u54e6\\u54e6\\u554a\\u554a\\u54fc&quot;,&quot;id&quot;:&quot;tb.1.ba071e03._M1o8S5FX4p57pZBJa91CQ&quot;}' target=\"_blank\" class=\"j_user_card lzl_p_p\" href=\"/home/main?id=tb.1.ba071e03._M1o8S5FX4p57pZBJa91CQ&fr=pb\" username=\"嗯嗯哦哦啊啊哼\">\n        <img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.ba071e03._M1o8S5FX4p57pZBJa91CQ\"/>\n    </a>\n    <div class=\"lzl_cnt\" data-field='{&quot;iconArr&quot;:null,&quot;free_flag&quot;:null}'>\n        <a rel=\"noopener\" class=\"at j_user_card \" data-field='{&quot;un&quot;:&quot;\\u55ef\\u55ef\\u54e6\\u54e6\\u554a\\u554a\\u54fc&quot;,&quot;id&quot;:&quot;tb.1.ba071e03._M1o8S5FX4p57pZBJa91CQ&quot;}' href=\"/home/main?id=tb.1.ba071e03._M1o8S5FX4p57pZBJa91CQ&ie=utf-8&fr=pb\" target=\"_blank\" username=\"嗯嗯哦哦啊啊哼\">嗯嗯哦哦啊啊🐶</a>\n        :\n        <span class=\"lzl_content_main\" data-username=\"\">\n            回复 <a href=\"http://tieba.baidu.com/i/sys/jump?un= \" onclick=\"Stats.sendRequest('fr=tb0_forum&st_mod=pb&st_value=atlink');\" onmouseover=\"showattip(this)\" onmouseout=\"hideattip(this)\" username=\" \" portrait=\"tb.1.84497425.b5GLK5lGm90mTB2BhjrgpA\" target=\"_blank\" class=\"at\">美味蟹黄堡💞</a>\n            :你不会看起跳高度和空中姿态？\n        </span>\n        <div class=\"lzl_content_reply\">\n            <span class=\"lzl_jb\" style=\"display:none;\"></span>\n            <span class=\"lzl_op_list j_lzl_o_l\" style=\"display:none;\"></span>\n            <span class=\"lzl_time\">2024-8-6 22:17</span>\n            <a rel=\"noopener\" href=\"#\" class=\"lzl_s_r\">回复</a>\n        </div>\n    </div>\n</li>\n<li class=\"lzl_li_pager j_lzl_l_p lzl_li_pager_s\" data-field='{&quot;total_num&quot;:16,&quot;total_page&quot;:2}'>\n    <a rel=\"noopener\" class=\"j_lzl_p btn-sub btn-small pull-right\" href=\"##\">\n        <i class=\"icon-reply\"></i>\n        我也说一句\n    </a>\n    <p class=\"j_pager l_pager pager_theme_2\">\n        <span class=\"tP\">1</span>\n        <a href=\"#2\">2</a>\n        <a href=\"#2\">下一页</a>\n        <a href=\"#2\">尾页</a>\n    </p>\n</li>\n"
  },
  {
    "path": "media_platform/tieba/test_data/search_keyword_notes.html",
    "content": "<div class=\"s_post_list\">\n\t<div class=\"s_post\"><span class=\"p_title\"><a data-tid=\"9117888152\" data-fid=\"26976424\" class=\"bluelink\"\n\t\t\t\t\t\t\t\t\t\t\t\t href=\"/p/9117888152?pid=150718967291&amp;cid=0#150718967291\"\n\t\t\t\t\t\t\t\t\t\t\t\t target=\"_blank\">武汉交互空间科技：富士康10亿加码中国大陆，印度为何逐渐“失宠</a></span>\n\t\t<div class=\"p_content\">\n\t\t\t全球知名的电子制造服务巨头富士康的母公司鸿海精密工业股份有限公司正式对外发布了一则重大投资公告，富士康将在郑州投资建设新事业总部大楼，承载新事业总部功能。这一战略举措不仅彰显了富士康对中国市场持续深化的承诺与信心，也预示着该集团业务版图的新一轮扩张与升级。\n\t\t\t项目一期选址位于郑东新区，建筑面积约700公亩，总投资约10亿元人民币。主要建设总部管理中心、研发中心和工程中心、战略产业发展中心、战略产业金融平台、\n\t\t</div>\n\t\t贴吧：<a data-fid=\"26976424\" class=\"p_forum\" href=\"/f?kw=%CE%E4%BA%BA%BD%BB%BB%A5%BF%D5%BC%E4\"\n\t\t\t\ttarget=\"_blank\"><font class=\"p_violet\">武汉交互空间</font></a>作者：<a\n\t\t\t\thref=\"/home/main?un=VR%D0%E9%C4%E2%B4%EF%C8%CB\" target=\"_blank\"><font class=\"p_violet\">VR虚拟达人</font></a>\n\t\t<font class=\"p_green p_date\">2024-08-05 16:45</font></div>\n\t<div class=\"s_post\"><span class=\"p_title\"><a data-tid=\"9114743782\" data-fid=\"90367\" class=\"bluelink\"\n\t\t\t\t\t\t\t\t\t\t\t\t href=\"/p/9114743782?pid=150705176739&amp;cid=0#150705176739\"\n\t\t\t\t\t\t\t\t\t\t\t\t target=\"_blank\">请各位急用玛尼的小心，骗子最多</a></span>\n\t\t<div class=\"p_content\">\n\t\t\t这里面到处是骗子，大家小心。特别那些叫出村背货的，基本是卖园区，天下没有那么好的事。就是有这好事，我们在边境上的人，比你们最清楚，轮不到你们，边境上比你们胆子大的人大把，你一不熟悉小路，为什么叫你带货。东南亚带货的集结地，一般在南宁，防城港，昆明，西双版纳，临沧然后师机接了走小路出去，南宁，防城港坐船出去。好多都是二十几手的中介，之前卖园区一个三十万，现在不知道行情，但好多园区不收\n\t\t</div>\n\t\t贴吧：<a data-fid=\"90367\" class=\"p_forum\" href=\"/f?kw=%B1%B3%B0%FC%BF%CD\" target=\"_blank\"><font class=\"p_violet\">背包客</font></a>作者：<a\n\t\t\t\thref=\"/home/main?un=%CC%F9%B0%C9%D3%C3%BB%A7_GC64AUS\" target=\"_blank\"><font class=\"p_violet\">贴吧用户_GC64AUS</font></a>\n\t\t<font class=\"p_green p_date\">2024-08-03 07:35</font></div>\n\t<div class=\"s_post\"><span class=\"p_title\"><a data-tid=\"9095684158\" data-fid=\"1388265\" class=\"bluelink\"\n\t\t\t\t\t\t\t\t\t\t\t\t href=\"/p/9095684158?pid=150616716870&amp;cid=0#150616716870\"\n\t\t\t\t\t\t\t\t\t\t\t\t target=\"_blank\">*2025泰国冷链制冷运输展*东南亚外贸出口</a></span>\n\t\t<div class=\"p_content\">**2025泰国曼谷国际冷库、空调制冷、仓储暨冷链运输展 *2025泰国冷链制冷运输展*东南亚外贸出口-观展游览考察\n\t\t\t展出时间：2025-7月（具体时间待定） 展出地点：泰国曼谷会展中心 展会周期：一年一届 组展单位：北京励航国际商务会展有限公司\n\t\t\t人员跟团观展补贴！为您节省成本，寻找适合您的市场：\n\t\t\t本公司为您提供观展考察机会，让您在大型展会上获得世界同行**科技的资料同时，感受异域文化气息。展会现场走展考察→→当地游览→→当地相关市\n\t\t</div>\n\t\t贴吧：<a data-fid=\"1388265\" class=\"p_forum\" href=\"/f?kw=%B9%FA%BC%CA%D5%B9%BB%E1\" target=\"_blank\"><font\n\t\t\t\tclass=\"p_violet\">国际展会</font></a>作者：<a href=\"/home/main?un=zhaot_188\" target=\"_blank\"><font\n\t\t\t\tclass=\"p_violet\">zhaot_188</font></a> <font class=\"p_green p_date\">2024-07-19 15:44</font></div>\n\t<div class=\"s_post\"><span class=\"p_title\"><a data-tid=\"9093564752\" data-fid=\"27984246\" class=\"bluelink\"\n\t\t\t\t\t\t\t\t\t\t\t\t href=\"/p/9093564752?pid=150606964195&amp;cid=0#150606964195\"\n\t\t\t\t\t\t\t\t\t\t\t\t target=\"_blank\">京湘楼创始人肖鑫：创立于北京，植根长沙，百年美食传承</a></span>\n\t\t<div class=\"p_content\">来源标题：京湘楼创始人肖鑫：创立于北京，植根长沙，百年美食传承 京湘楼（KING HERO）品牌创始人：肖鑫\n\t\t\t京湘楼，KING\n\t\t\tHERO，集酱板鸭、肥肠、鸭头、鸭脖、鸭肠、小龙虾、牛蛙、捆鸡、鸡爪、鱼嘴巴、鱼尾、鱿鱼、牛肉、猪头肉等特色食品卤制，加工、包装与生产经营。2022年3月在北京朝阳区双井开设了第一家“京湘楼·鲜卤集市”卤味熟食快餐店，2023年5月在湖南省长沙市开福区注册成立了“长沙京湘楼品牌管理有限公司”，以“京湘楼”作为品\n\t\t</div>\n\t\t贴吧：<a data-fid=\"27984246\" class=\"p_forum\" href=\"/f?kw=%BE%A9%CF%E6%C2%A5\" target=\"_blank\"><font\n\t\t\t\tclass=\"p_violet\">京湘楼</font></a>作者：<a href=\"/home/main?un=%CC%EC%C9%F1%B6%C9%B3%BE\" target=\"_blank\"><font\n\t\t\t\tclass=\"p_violet\">天神渡尘</font></a> <font class=\"p_green p_date\">2024-07-17 23:43</font></div>\n\t<div class=\"s_post\"><span class=\"p_title\"><a data-tid=\"9088419293\" data-fid=\"310\" class=\"bluelink\"\n\t\t\t\t\t\t\t\t\t\t\t\t href=\"/p/9088419293?pid=150582471307&amp;cid=0#150582471307\"\n\t\t\t\t\t\t\t\t\t\t\t\t target=\"_blank\">广州能争取到迪士尼与环球落户吗？</a></span>\n\t\t<div class=\"p_content\">\n\t\t\t不是二选一，而是全都要。上一组数据，上海迪士尼2016年开业就接待游客超过1.2亿人次，香港迪士尼2023全年游客人数才640万人次，约等于无，这么低的入园人次已经引来迪士尼方面的不悦。\n\t\t\t美国有两个迪士尼，说实话迪士尼的门票并不高，普通人都去的起，中国完全有能力建两到三个迪士尼，欧洲只有第一个迪士尼，因为它的人口只有中国的一半，假设中国人一年吃一包盐，一年就是14包，那么欧洲就是七亿包盐，盐再便宜，欧洲人也不可能一人吃\n\t\t</div>\n\t\t贴吧：<a data-fid=\"310\" class=\"p_forum\" href=\"/f?kw=%B5%D8%C0%ED\" target=\"_blank\"><font\n\t\t\t\tclass=\"p_violet\">地理</font></a>作者：<a href=\"/home/main?un=SeaRoutes\" target=\"_blank\"><font\n\t\t\t\tclass=\"p_violet\">SeaRoutes</font></a> <font class=\"p_green p_date\">2024-07-13 20:17</font></div>\n\t<div class=\"s_post\"><span class=\"p_title\"><a data-tid=\"9088416365\" data-fid=\"7561034\" class=\"bluelink\"\n\t\t\t\t\t\t\t\t\t\t\t\t href=\"/p/9088416365?pid=150582456551&amp;cid=0#150582456551\"\n\t\t\t\t\t\t\t\t\t\t\t\t target=\"_blank\">#城市GDP#广州应该全力去争取迪士尼和环球影城</a></span>\n\t\t<div class=\"p_content\">\n\t\t\t不是二选一，而是全都要。上一组数据，上海迪士尼2016年开业就接待游客超过1.2亿人次，香港迪士尼2023全年游客人数才640万人次，约等于无，这么低的入园人次已经引来迪士尼方面的不悦。\n\t\t\t美国有两个迪士尼，说实话迪士尼的门票并不高，普通人都去的起，中国完全有能力建两到三个迪士尼，欧洲只有第一个迪士尼，因为它的人口只有中国的一半，假设中国人一年吃一包盐，一年就是14包，那么欧洲就是七亿包盐，盐再便宜，欧洲人也不可能一人吃\n\t\t</div>\n\t\t贴吧：<a data-fid=\"7561034\" class=\"p_forum\" href=\"/f?kw=%B3%C7%CA%D0gdp\" target=\"_blank\"><font class=\"p_violet\">城市gdp</font></a>作者：<a\n\t\t\t\thref=\"/home/main?un=SeaRoutes\" target=\"_blank\"><font class=\"p_violet\">SeaRoutes</font></a> <font\n\t\t\t\tclass=\"p_green p_date\">2024-07-13 20:14</font></div>\n\t<div class=\"s_post\"><span class=\"p_title\"><a data-tid=\"9087419039\" data-fid=\"46374\" class=\"bluelink\"\n\t\t\t\t\t\t\t\t\t\t\t\t href=\"/p/9087419039?pid=150577861626&amp;cid=0#150577861626\"\n\t\t\t\t\t\t\t\t\t\t\t\t target=\"_blank\">云南省首批《云南日报》昆明新闻头条聚焦阳宗海省级物流枢纽建设</a></span>\n\t\t<div class=\"p_content\">\n\t\t\t7月11日《云南日报》昆明新闻头条刊发文章《阳宗海风景名胜区立足“衔接西部陆海新通道与中老铁路”优势——加速28个物流枢纽设施建设》聚焦昆明阳宗海风景名胜区系统推进省级物流枢纽建设和功能提升深挖比较优势壮大物流产业据云南省发展和改革委员会在昆明召开的新闻发布会上公布，今年全省共有5地纳入云南省第一批省级物流枢纽和省级骨干冷链物流基地建设名单，其中，昆明市有两家获批，阳宗海物流枢纽上榜！一起来看近日，云南省\n\t\t</div>\n\t\t贴吧：<a data-fid=\"46374\" class=\"p_forum\" href=\"/f?kw=%C0%A5%C3%F7\" target=\"_blank\"><font\n\t\t\t\tclass=\"p_violet\">昆明</font></a>作者：<a href=\"/home/main?un=%8F%EC\" target=\"_blank\"><font\n\t\t\t\tclass=\"p_violet\">忟</font></a> <font class=\"p_green p_date\">2024-07-12 23:04</font></div>\n\t<div class=\"s_post\"><span class=\"p_title\"><a data-tid=\"9085102046\" data-fid=\"348713\" class=\"bluelink\"\n\t\t\t\t\t\t\t\t\t\t\t\t href=\"/p/9085102046?pid=150567555367&amp;cid=0#150567555367\"\n\t\t\t\t\t\t\t\t\t\t\t\t target=\"_blank\">寻找弟弟，很久没跟家里联系</a></span>\n\t\t<div class=\"p_content\">Kk四期世纪园区，寻找弟弟，外号大佐，F3 2楼，公司cj集团</div>\n\t\t贴吧：<a data-fid=\"348713\" class=\"p_forum\" href=\"/f?kw=%B6%AB%C4%CF%D1%C7\" target=\"_blank\"><font\n\t\t\t\tclass=\"p_violet\">东南亚</font></a>作者：<a href=\"/home/main?un=%CC%F9%B0%C9%D3%C3%BB%A7_GC2CtRa\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  target=\"_blank\"><font class=\"p_violet\">贴吧用户_GC2CtRa</font></a>\n\t\t<font class=\"p_green p_date\">2024-07-11 07:53</font></div>\n\t<div class=\"s_post\"><span class=\"p_title\"><a data-tid=\"9083888071\" data-fid=\"30\" class=\"bluelink\"\n\t\t\t\t\t\t\t\t\t\t\t\t href=\"/p/9083888071?pid=150562129935&amp;cid=0#150562129935\"\n\t\t\t\t\t\t\t\t\t\t\t\t target=\"_blank\">拉美 非洲 东南亚 南亚等发展中国家不太可能普及八小时双休吧？</a></span>\n\t\t<div class=\"p_content\">拉美 和 东南亚的泰国 之类的连毒枭和黑色产业都管不好感觉普及八小时双休不太可能 缅甸和非洲军阀林立\n\t\t\t跟军阀谈八小时双休那么不开玩笑？缅北诈骗园区就能看出来。\n\t\t</div>\n\t\t贴吧：<a data-fid=\"30\" class=\"p_forum\" href=\"/f?kw=%C0%FA%CA%B7\" target=\"_blank\"><font\n\t\t\t\tclass=\"p_violet\">历史</font></a>作者：<a href=\"/home/main?un=yoursagain\" target=\"_blank\"><font\n\t\t\t\tclass=\"p_violet\">yoursagain</font></a> <font class=\"p_green p_date\">2024-07-10 09:00</font></div>\n\t<div class=\"s_post\"><span class=\"p_title\"><a data-tid=\"9071937582\" data-fid=\"8103241\" class=\"bluelink\"\n\t\t\t\t\t\t\t\t\t\t\t\t href=\"/p/9071937582?pid=150510120873&amp;cid=0#150510120873\"\n\t\t\t\t\t\t\t\t\t\t\t\t target=\"_blank\">东南亚，园区【 工 价 低 】</a></span>\n\t\t<div class=\"p_content\"></div>\n\t\t贴吧：<a data-fid=\"8103241\" class=\"p_forum\" href=\"/f?kw=%D4%B0%C7%F8%D5%D0%C9%CC\" target=\"_blank\"><font\n\t\t\t\tclass=\"p_violet\">园区招商</font></a>作者：<a href=\"/home/main?un=QQ59052966\" target=\"_blank\"><font\n\t\t\t\tclass=\"p_violet\">QQ59052966</font></a> <font class=\"p_green p_date\">2024-06-30 12:09</font></div>\n</div>"
  },
  {
    "path": "media_platform/tieba/test_data/tieba_note_list.html",
    "content": "<!DOCTYPE html>\n<!--STATUS OK-->\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <link rel=\"search\" type=\"application/opensearchdescription+xml\" href=\"/tb/cms/content-search.xml\" title=\"百度贴吧\" />\n                    <meta name=\"keywords\" content=\"盗墓笔记,奇幻·玄幻小说,文学\">\n        <meta name=\"description\" content=\"本吧热帖: 1-升级升级升级升级 2-不是，咋盗墓笔记都能磕cp啊 3-不是吧，这篇不会和王母鬼宴故事有关吧？ 4-这年头什么人都能自称稻米吗 5-明年就是2025年了，实打实追了10年，感觉追了个寂寞 6-盗墓笔记全集 txt小说，已整理 7-张起灵生孩子？….. 8-喜欢盗墓笔记的女生过生日送什么好 9-【张起灵家族】专属水楼 10-有没有明年817可以去长白山的妆娘啊 11-有疑问，求解答\">\n        <title>盗墓笔记吧-百度贴吧--喜爱盗墓笔记的有爱稻米聚集地--盗墓笔记吧致力于为广大喜爱《盗墓笔记》的吧友服务，传递官方最新资讯，小说相关同人作品，鼓励吧友原创精品，解密分析、图片、文章等。 </title>\n\n    <link rel=\"stylesheet\" href=\"//tb1.bdstatic.com/??/tb/static-common/style/tb.js/dialog_d30a0dc.css,/tb/static-common/lib/tbui/style/all_a9796b3.css\" />\n<link rel=\"stylesheet\" href=\"//tb1.bdstatic.com/??/tb/_/index_a147469.css,/tb/_/search_03d43b1.css,/tb/_/fixed_bar_af8c791.css,/tb/_/fixed_daoliu_ffac4fc.css,/tb/_/fixed_guide_71e177f.css\" />\n<link rel=\"shortcut icon\" href=\"//tb3.bdstatic.com/public/icon/favicon-v2.ico\"/>\n\n<script>\n    // 页面的基本信息\n    var PageData = {\n        'tbs': \"d1af71cf9c8bc1a21723088812\"    };\n\n    PageData.page = \"frs\";\n    // 用户的基本信息\n    PageData.user = {\n        'id': 0,\n        'name': \"\",\n        'no_un': 0,\n        'is_login': 0,\n        'is_new_user': 1,\n        'portrait': \"00000000\",\n        'name_url': \"&ie=utf-8\",\n        'frs_login_switch': false,\n        'no_login_user_browse_switch': 0,\n        'login_popup_phone_switch': 0,\n        \"is_videocreator\": 0,\n        \"is_business_account\": 0,\n        'interaction_switch': false,\n        'login_day': 5    };\n    // 吧的基本信息\n    PageData.forum = {\n        'id': 1525417,\n        'name': \"\\u76d7\\u5893\\u7b14\\u8bb0\",\n        'first_class': \"\\u6587\\u5b66\",\n        'second_class': \"\\u5947\\u5e7b\\u00b7\\u7384\\u5e7b\\u5c0f\\u8bf4\"    };\n\n\n</script>\n\n    <script id=\"radar-init-script\">\n        !function(){\"use strict\";function n(n,t){return n(t={exports:{}},t.exports),t.exports}function i(n){return\"object\"==typeof n?null!==n:\"function\"==typeof n}function o(n){if(!i(n))throw TypeError(n+\" is not an object!\");return n}function t(n){try{return!!n()}catch(t){return!0}}function c(n,t){return h.call(n,t)}function f(n){return\"Symbol(\".concat(n===undefined?\"\":n,\")_\",(++d+g).toString(36))}function u(n){if(\"function\"!=typeof n)throw TypeError(n+\" is not a function!\");return n}function y(e,o,n){if(u(e),o===undefined)return e;switch(n){case 1:return function(n){return e.call(o,n)};case 2:return function(n,t){return e.call(o,n,t)};case 3:return function(n,t,r){return e.call(o,n,t,r)}}return function(){return e.apply(o,arguments)}}var v=n(function(n){var t=n.exports=\"undefined\"!=typeof window&&window.Math==Math?window:\"undefined\"!=typeof self&&self.Math==Math?self:Function(\"return this\")();\"number\"==typeof __g&&(__g=t)}),m=n(function(n){var t=n.exports={version:\"2.6.9\"};\"number\"==typeof __e&&(__e=t)}),p=(m.version,!t(function(){return 7!=Object.defineProperty({},\"a\",{get:function(){return 7}}).a})),r=v.document,e=i(r)&&i(r.createElement),a=!p&&!t(function(){return 7!=Object.defineProperty(function(n){return e?r.createElement(n):{}}(\"div\"),\"a\",{get:function(){return 7}}).a}),s=Object.defineProperty,l={f:p?Object.defineProperty:function(n,t,r){if(o(n),t=function(n,t){if(!i(n))return n;var r,e;if(t&&\"function\"==typeof(r=n.toString)&&!i(e=r.call(n)))return e;if(\"function\"==typeof(r=n.valueOf)&&!i(e=r.call(n)))return e;if(!t&&\"function\"==typeof(r=n.toString)&&!i(e=r.call(n)))return e;throw TypeError(\"Can't convert object to primitive value\")}(t,!0),o(r),a)try{return s(n,t,r)}catch(e){}if(\"get\"in r||\"set\"in r)throw TypeError(\"Accessors not supported!\");return\"value\"in r&&(n[t]=r.value),n}},w=p?function(n,t,r){return l.f(n,t,function(n,t){return{enumerable:!(1&n),configurable:!(2&n),writable:!(4&n),value:t}}(1,r))}:function(n,t,r){return n[t]=r,n},h={}.hasOwnProperty,d=0,g=Math.random(),b=n(function(n){var t=\"__core-js_shared__\",r=v[t]||(v[t]={});(n.exports=function(n,t){return r[n]||(r[n]=t!==undefined?t:{})})(\"versions\",[]).push({version:m.version,mode:\"global\",copyright:\"© 2019 Denis Pushkarev (zloirock.ru)\"})}),E=b(\"native-function-to-string\",Function.toString),O=n(function(n){var i=f(\"src\"),t=\"toString\",u=(\"\"+E).split(t);m.inspectSource=function(n){return E.call(n)},(n.exports=function(n,t,r,e){var o=\"function\"==typeof r;o&&(c(r,\"name\")||w(r,\"name\",t)),n[t]!==r&&(o&&(c(r,i)||w(r,i,n[t]?\"\"+n[t]:u.join(String(t)))),n===v?n[t]=r:e?n[t]?n[t]=r:w(n,t,r):(delete n[t],w(n,t,r)))})(Function.prototype,t,function(){return\"function\"==typeof this&&this[i]||E.call(this)})}),j=\"prototype\",S=function(n,t,r){var e,o,i,u,c=n&S.F,f=n&S.G,a=n&S.S,s=n&S.P,l=n&S.B,p=f?v:a?v[t]||(v[t]={}):(v[t]||{})[j],h=f?m:m[t]||(m[t]={}),d=h[j]||(h[j]={});for(e in f&&(r=t),r)i=((o=!c&&p&&p[e]!==undefined)?p:r)[e],u=l&&o?y(i,v):s&&\"function\"==typeof i?y(Function.call,i):i,p&&O(p,e,i,n&S.U),h[e]!=i&&w(h,e,u),s&&d[e]!=i&&(d[e]=i)};v.core=m,S.F=1,S.G=2,S.S=4,S.P=8,S.B=16,S.W=32,S.U=64,S.R=128;function _(n){return C.call(n).slice(8,-1)}function R(n){if(n==undefined)throw TypeError(\"Can't call method on  \"+n);return n}function A(n){return D(R(n))}function F(n){return isNaN(n=+n)?0:(0<n?I:L)(n)}function P(n){return 0<n?B(F(n),9007199254740991):0}function k(n){return Object(R(n))}var M,T,x=S,C={}.toString,D=Object(\"z\").propertyIsEnumerable(0)?Object:function(n){return\"String\"==_(n)?n.split(\"\"):Object(n)},L=Math.ceil,I=Math.floor,B=Math.min,N=Math.max,z=Math.min,G=b(\"keys\"),U=(M=!1,function(n,t,r){var e,o=A(n),i=P(o.length),u=function(n,t){return(n=F(n))<0?N(n+t,0):z(n,t)}(r,i);if(M&&t!=t){for(;u<i;)if((e=o[u++])!=e)return!0}else for(;u<i;u++)if((M||u in o)&&o[u]===t)return M||u||0;return!M&&-1}),q=G[T=\"IE_PROTO\"]||(G[T]=f(T)),W=\"constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf\".split(\",\"),Y=Object.keys||function(n){return function(n,t){var r,e=A(n),o=0,i=[];for(r in e)r!=q&&c(e,r)&&i.push(r);for(;t.length>o;)c(e,r=t[o++])&&(~U(i,r)||i.push(r));return i}(n,W)},$={f:Object.getOwnPropertySymbols},H={f:{}.propertyIsEnumerable},J=Object.assign,K=!J||t(function(){var n={},t={},r=Symbol(),e=\"abcdefghijklmnopqrst\";return n[r]=7,e.split(\"\").forEach(function(n){t[n]=n}),7!=J({},n)[r]||Object.keys(J({},t)).join(\"\")!=e})?function(n,t){for(var r=k(n),e=arguments.length,o=1,i=$.f,u=H.f;o<e;)for(var c,f=D(arguments[o++]),a=i?Y(f).concat(i(f)):Y(f),s=a.length,l=0;l<s;)c=a[l++],p&&!u.call(f,c)||(r[c]=f[c]);return r}:J;x(x.S+x.F,\"Object\",{assign:K});var Q=l.f,V=Function.prototype,X=/^\\s*function ([^ (]*)/;\"name\"in V||p&&Q(V,\"name\",{configurable:!0,get:function(){try{return(\"\"+this).match(X)[1]}catch(n){return\"\"}}});var Z,nn,tn,rn,en,on,un,cn,fn,an,sn,ln=Array.isArray||function(n){return\"Array\"==_(n)},pn=n(function(n){var t=b(\"wks\"),r=v.Symbol,e=\"function\"==typeof r;(n.exports=function(n){return t[n]||(t[n]=e&&r[n]||(e?r:f)(\"Symbol.\"+n))}).store=t})(\"species\"),hn=(tn=1==(Z=0),rn=2==Z,en=3==Z,on=4==Z,un=6==Z,cn=5==Z||un,fn=nn||function(n,t){return new(function(n){var t;return ln(n)&&(\"function\"!=typeof(t=n.constructor)||t!==Array&&!ln(t.prototype)||(t=undefined),i(t)&&null===(t=t[pn])&&(t=undefined)),t===undefined?Array:t}(n))(t)},function(n,t,r){for(var e,o,i=k(n),u=D(i),c=y(t,r,3),f=P(u.length),a=0,s=tn?fn(n,f):rn?fn(n,0):undefined;a<f;a++)if((cn||a in u)&&(o=c(e=u[a],a,i),Z))if(tn)s[a]=o;else if(o)switch(Z){case 3:return!0;case 5:return e;case 6:return a;case 2:s.push(e)}else if(on)return!1;return un?-1:en||on?on:s}),dn=(sn=!0,!!(an=[].forEach)&&t(function(){sn?an.call(null,function(){},1):an.call(null)}));x(x.P+x.F*!dn,\"Array\",{forEach:function(n){return hn(this,n,arguments[1])}});var yn={\"load.ready\":\"READAR_LOAD_READY\",\"perfamance.beforeReport\":\"PERFAMANCE_BEFORE_REPORT\"},vn=new(function(){function n(){this.events={}}var t=n.prototype;return t.on=function(n,t){(n=yn[n])&&(this.events[n]?this.events[n].push(t):this.events[n]=[t])},t.emit=function(n){for(var t=this,r=arguments.length,e=new Array(1<r?r-1:0),o=1;o<r;o++)e[o-1]=arguments[o];(n=yn[n])&&this.events&&this.events[n]&&this.events[n].forEach(function(n){return n.apply(t,e)})},t.off=function(r,e){var o=this;(r=yn[r])&&this.events[r]!==undefined&&0<this.events[r].length&&(e!==undefined?this.events[r].forEach(function(n,t){n===e&&o.events[r].splice(t,1)}):delete this.events[r])},t.clear=function(){this.events={}},n}()),mn=[].slice,wn={},gn=Function.bind||function(t){var r=u(this),e=mn.call(arguments,1),o=function(){var n=e.concat(mn.call(arguments));return this instanceof o?function(n,t,r){if(!(t in wn)){for(var e=[],o=0;o<t;o++)e[o]=\"a[\"+o+\"]\";wn[t]=Function(\"F,a\",\"return new F(\"+e.join(\",\")+\")\")}return wn[t](n,r)}(r,n.length,n):function(n,t,r){var e=r===undefined;switch(t.length){case 0:return e?n():n.call(r);case 1:return e?n(t[0]):n.call(r,t[0]);case 2:return e?n(t[0],t[1]):n.call(r,t[0],t[1]);case 3:return e?n(t[0],t[1],t[2]):n.call(r,t[0],t[1],t[2]);case 4:return e?n(t[0],t[1],t[2],t[3]):n.call(r,t[0],t[1],t[2],t[3])}return n.apply(r,t)}(r,n,t)};return i(r.prototype)&&(o.prototype=r.prototype),o};x(x.P,\"Function\",{bind:gn});try{var bn=function bn(n,t){5<En.errs.length||(n.errType=t,En.errs.push(n))};window.radar={config:{performanceAutoReport:!0,sample:.01},errs:[],marks:{},cusMarks:{},$event:vn};var En=window.radar;window.addEventListener&&(window.addEventListener(\"error\",function(n){return bn(n,\"jsErr\")},!0),window.addEventListener(\"unhandledrejection\",function(n){return bn(n,\"promiseErr\")})),En.setConfig=function(n){for(var t in n)En.config[t]=n[t]};var On=function On(){if(En.config.performanceAutoReport&&\"csr\"===En.config.renderType){setTimeout(function(){window.radar.performanceReport&&\"function\"==typeof window.radar.performanceReport&&window.radar.performanceReport()},1e3)}};En.mark=function(n){En.marks[n]=+new Date,\"fs\"===n&&On()},En.markCustom=function(n){if(!(n&&n instanceof Object))throw\"[ERROR]markCustom方法参数错误\";En.cusMarks=Object.assign({},En.cusMarks,{},n),n.fs&&On()}}catch(jn){!function Aa(t){if(window.console){for(var r,e=arguments.length,o=new Array(1<e?e-1:0),i=1;i<e;i++)o[i-1]=arguments[i];setTimeout((r=console[t]).bind.apply(r,[console].concat(o)))}}(\"error\",jn)}}();\n        window.radar && window.radar.setConfig({\n            page: 'MRmilzahY',\n            sample: 0.1,\n            clientType: 'pc_web',\n            renderType: 'csr'\n        });\n    </script>\n    <script>\n        window.weirwoodParams = {\"common\":{\"buildid\":\"pc_frs\",\"token\":\"e78f3741fe004f9a94290a022bdbaeba\",\"ignoreUrls\":[]},\"error\":{\"sampleRate\":0.003,\"collectWindowErrors\":true,\"collectUnhandledRejections\":true,\"collectResourceLoadErrors\":true},\"perf\":{\"sampleRate\":0.003,\"spa\":false,\"history\":true}};\n    </script>\n    <!-- 引入weirwood异常与性能监控 -->\n    <script type=\"text/javascript\" id=\"weirwood-init-script\">\n        if (window.weirwoodParams) {\n            !function(){\"use strict\";function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function a(t,e){var n=Object.keys(t);return Object.getOwnPropertySymbols&&n.push.apply(n,Object.getOwnPropertySymbols(t)),e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n}var e=new(function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,e),this.frame=0,this.fpsStandard=30,this.durationCount=2,this.trackData={},this.stateChangeHandler=this.stateChange.bind(this)}return function(e,t,n){t&&i(e.prototype,t),n&&i(e,n)}(e,[{key:\"start\",value:function(e,t,n){+e.fpsStandard&&(this.fpsStandard=+e.fpsStandard),+e.durationCount&&(this.durationCount=+e.durationCount),this.trackData=t||{},this.callback=n,this.init(),document.addEventListener(\"visibilitychange\",this.stateChangeHandler)}},{key:\"stop\",value:function(){this.disconnect(),document.removeEventListener(\"visibilitychange\",this.stateChangeHandler)}},{key:\"init\",value:function(){var o=this;this.frame=0,this.frameLoop(),this.lastTime=Date.now(),this.fpsList=[],this.fpsInterval=setInterval(function(){var e=Date.now(),t=e-o.lastTime,n=1e3*o.frame/t;if(o.lastTime=e,o.frame=0,o.fpsList.push(n),o.fpsList.length>o.durationCount&&o.fpsList.shift(),Math.round(t/1e3)>o.durationCount||o.fpsList.every(function(e){return e<o.fpsStandard})){var i=function(r){for(var e=1;e<arguments.length;e++){var o=null!=arguments[e]?arguments[e]:{};e%2?a(o,!0).forEach(function(e){var t,n,i;t=r,i=o[n=e],n in t?Object.defineProperty(t,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[n]=i}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(o)):a(o).forEach(function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(o,e))})}return r}({fps:o.fpsList},o.trackData),r=new Error(JSON.stringify(i));r.name=\"fpsError\";try{__tieba__weirwood__.reportException(r)}catch(e){throw r}o.callback&&o.callback()}},1e3)}},{key:\"frameLoop\",value:function(){this.frame++,this.frsRequestFrame=window.requestAnimationFrame(this.frameLoop.bind(this))}},{key:\"stateChange\",value:function(){\"hidden\"===document.visibilityState?this.disconnect():this.init()}},{key:\"disconnect\",value:function(){this.fpsInterval&&clearInterval(Number(this.fpsInterval)),this.frsRequestFrame&&cancelAnimationFrame(Number(this.frsRequestFrame))}}]),e}());!function(){try{window.__tieba__weirwood__={jsExceptions:[],resourceExceptions:[],apiExceptions:[],customExceptions:[],weirwoodResourceListener:null,jsListener:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];__tieba__weirwood__.jsExceptions.push(t)},resourceListener:function(e){-1!==[\"SCRIPT\",\"LINK\",\"IMG\",\"OBJECT\",\"IFRAME\",\"FRAME\"].indexOf(e.target.tagName)&&__tieba__weirwood__.resourceExceptions.push(e)},apiListener:function(e){__tieba__weirwood__.apiExceptions.push(e)},windowAddEventListener:window.addEventListener,reportException:function(e){__tieba__weirwood__.customExceptions.push(e)},fpsObserver:e};var a=/\\\"SCRIPT\\\",\\\"LINK\\\",\\\"IMG\\\"/;__tieba__weirwood__.windowAddEventListener&&(window.addEventListener=function(e,t){var n;\"error\"===e&&a.test(t.toString())&&(__tieba__weirwood__.weirwoodResourceListener=t);for(var i=arguments.length,r=new Array(2<i?i-2:0),o=2;o<i;o++)r[o-2]=arguments[o];return(n=__tieba__weirwood__.windowAddEventListener).call.apply(n,[window,e,t].concat(r))},window.onerror=__tieba__weirwood__.jsListener,window.addEventListener(\"error\",__tieba__weirwood__.resourceListener,!0),window.addEventListener(\"unhandledrejection\",__tieba__weirwood__.apiListener))}catch(e){}}()}();\n        }\n    </script>\n\n    <!-- 引入百度统计 -->\n    <script>\n        var _hmt = _hmt || [];\n        (function() {\n            var hm = document.createElement(\"script\");\n            hm.src = \"https://hm.baidu.com/hm.js?292b2e1608b0823c1cb6beef7243ef34\";\n            var s = document.getElementsByTagName(\"script\")[0];\n            s.parentNode.insertBefore(hm, s);\n        })();\n    </script>\n    <div id=\"pagelet_common/pagelet/temptrack\"></div>    <script>\n        // TODO: 临时打点统计\n        function trackTemp(locate, task, page, type, extra) {\n            if (page && typeof page == 'object') {\n                extra = page;\n                page = '';\n            }\n            if (type && typeof type == 'object') {\n                extra = type;\n                type = '';\n            }\n            if (document.images) { //document.images永远为true，判断对img或者js的支持吗\n                var img = new Image();\n                window[\"bd_pv_\" + (new Date().getTime())] = img;\n                var trackUrl = \"https://gsp0.\" + \"baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/img/track.gif?\"; //统计发送URL\n                var paramArr = [\n                    \"client_type=pc_web\", //普通PC版本\n                    \"task=\" + (task && encodeURIComponent(task) || \"\"), //不同的icafe项目\n                    \"locate=\" + (locate && encodeURIComponent(locate) || \"\"), //标示参数名称\n                    \"type=\" + (type && encodeURIComponent(type) || \"click\"), //如果type为空，则type=click\n                    \"url=\" + encodeURIComponent(document.location.href), //当前页面URL\n                    \"refer=\" + encodeURIComponent(document.referrer) //当前页面refer\n                ];\n                if (PageData) { //页面数据全局变量\n                    paramArr.push(\"page=\" + (page || PageData.page || \"\")); //页面标示 frs|pb\n                    if (PageData.forum) { //判断吧信息是否存在\n                        paramArr.push(\"fid=\" + (PageData.forum.id || \"\")); //吧ID\n                        paramArr.push(\"fname=\" + encodeURIComponent(PageData.forum.name || \"\")); //吧名\n                    }\n                    if (PageData.user) { //用户信息是否存在\n                        paramArr.push(\"uid=\" + (PageData.user.id || \"\")); // 用户ID\n                        paramArr.push(\"uname=\" + encodeURIComponent(PageData.user.name || \"\")); //用户名\n                        paramArr.push(\"is_new_user=\" + (PageData.user.is_new_user || \"\")); //是否新用户\n                    }\n                    if (PageData.thread) { //主题信息是否存在 一般在pb页才会有此变量\n                        paramArr.push(\"tid=\" + ((PageData.thread && PageData.thread.thread_id) || \"\")); //贴子ID\n                    }\n                }\n\n                // 添加扩展属性\n                for (var i in extra) {\n                    if (extra.hasOwnProperty(i)) {\n                        paramArr.push(i + \"=\" + encodeURIComponent(extra[i]));\n                    }\n                }\n\n                //发送统计参数\n                trackUrl += paramArr.join(\"&\");\n                //发送统计\n                img.src = trackUrl + \"&t=\" + new Date().getTime();\n                img = null;\n            }\n        }\n        trackTemp('frs_pv', 'frs_normal', 'frs', 'show');\n    </script>\n\n    <!-- ubc打点统计sdk -->\n    </head>\n\n<body>\n    <script>\n        window.radar && window.radar.mark('ht');\n    </script>\n    <div class=\"wrap1\">\n        <div class=\"wrap2\">\n\n<div class=\"header\">\n    <div id=\"pagelet_common/pagelet/userbar\"></div>\n\n\n<div id=\"head\" class=\"search_bright clearfix\">\n<div class=\"head_inner\">\n    <div class=\"search_top clearfix\">\n        <div class=\"search_nav j_search_nav\">\n            <!-- 开始-php渲染模版 -->\n\t\t\t\t\t\t\t\t\t\t\t\t\t<a rel=\"noopener\" param=\"wd\" href=https://www.baidu.com/s?cl=3&amp; >网页</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a rel=\"noopener\" param=\"word\" href=\"http://www.baidu.com/s?rtt=1&amp;bsst=1&amp;cl=2&amp;tn=news&amp;fr=tieba&amp;\" mark=\"news\">资讯</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a rel=\"noopener\" param=\"word\" href=\"http://www.baidu.com/sf/vsearch?pd=video&amp;tn=vsearch&amp;ct=301989888&amp;rn=20&amp;pn=0&amp;db=0&amp;s=21&amp;rsv_spt=11&amp;\">视频</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a rel=\"noopener\" param=\"word\" href=\"http://image.baidu.com/i?tn=baiduimage&amp;ct=201326592&amp;lm=-1&amp;cl=2&amp;\">图片</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a rel=\"noopener\" param=\"word\" href=\"http://zhidao.baidu.com/q?ct=17&amp;pn=0&amp;tn=ikaslist&amp;rn=10&amp;\">知道</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a rel=\"noopener\" href=\"http://wenku.baidu.com/search?fr=tieba&lm=0&od=0&\" param=\"word\" target=\"_blank\">文库</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<b>贴吧</b>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a rel=\"noopener\" param=\"word\" href=\"http://map.baidu.com/m?fr=map006&amp;\">地图</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a rel=\"noopener\" param=\"q\" href=\"https://b2b.baidu.com/s?fr=tieba&amp;\">采购</a>\n\t\t\t\t\t\t\t\t\t\t\t\t<!-- 结束-php渲染模版 -->\n        </div>\n    </div>\n    <div class=\"search_main_wrap\">\n        <div class=\"search_main clearfix\">\n            <div class=\"search_form\">\n                <a rel=\"noopener\"  title=\"到贴吧首页\" href=\"/\" class=\"search_logo\" id=\"search_logo_large\"></a>\n                <a rel=\"noopener\"  id=\"search_logo_small\" class=\"\" title=\"到贴吧首页\" href=\"/\"></a>\n                <form name=\"f1\" class=\"clearfix j_search_form\" action=\"/f\"\n                      id=\"tb_header_search_form\">\n                                        <input class=\"search_ipt search_inp_border j_search_input tb_header_search_input\"\n                           name=\"kw1\" value=\"盗墓笔记\" type=\"text\" autocomplete=\"off\" size=\"42\"\n                           tabindex=\"1\" id=\"wd1\" maxlength=\"100\" x-webkit-grammar=\"builtin:search\"\n                           x-webkit-speech=\"true\"/>\n                    <input autocomplete=\"off\" type=\"hidden\" name=\"kw\" value=\"盗墓笔记\" id=\"wd2\"/>\n                    <span class=\"search_btn_wrap search_btn_enter_ba_wrap\">\n                        <a rel=\"noopener\"  class=\"search_btn search_btn_enter_ba j_enter_ba\" href=\"#\"\n                           onclick=\"return false;\"\n                           onmousedown=\"this.className+=' search_btn_down'\"\n                           onmouseout=\"this.className=this.className.replace('search_btn_down','')\">进入贴吧</a>\n                    </span>\n                    <span class=\"search_btn_wrap\">\n                        <a rel=\"noopener\"  class=\"search_btn j_search_post\" href=\"#\" onclick=\"return false;\"\n                           onmousedown=\"this.className+=' search_btn_down'\"\n                           onmouseout=\"this.className=this.className.replace('search_btn_down','')\">全吧搜索</a>\n                    </span>\n                    <div id=\"pagelet_search/pagelet/search_ad\"></div>                </form>\n                                <p style=\"display:none;\" class=\"switch_radios\">\n                    <input type=\"radio\" class=\"nowtb\" name=\"tb\" id=\"nowtb\"><label\n                        for=\"nowtb\">吧内搜索</label>\n                    <input type=\"radio\" class=\"searchtb\" name=\"tb\" id=\"searchtb\"><label for=\"searchtb\">搜贴</label>\n                    <input type=\"radio\" class=\"authortb\" name=\"tb\" id=\"authortb\"><label for=\"authortb\">搜人</label>\n                    <input type=\"radio\" class=\"jointb\" checked=\"checked\" name=\"tb\" id=\"jointb\"><label\n                        for=\"jointb\">进吧</label>\n                    <input type=\"radio\" class=\"searchtag\" name=\"tb\" id=\"searchtag\"\n                           style=\"display:none;\"><label for=\"searchtag\"\n                                                        style=\"display:none;\">搜标签</label>\n                </p>\n            </div>\n        </div>\n    </div>\n</div>\n</div>\n<script>\nif (window.alog && window.alog.fire) {\n    alog('speed.set', 'c_widget_search_show', +new Date);\n    alog.fire(\"mark\");\n}\n</script>\n\n<div id=\"pagelet_search/pagelet/search_logic\"></div><div id=\"pagelet_frs-header/pagelet/head\"></div></div>\n<div class=\"content\" id=\"content\">\n    <div id=\"pagelet_frs-base/pagelet/content\"></div></div>\n<div class=\"foot\">\n    <div id=\"pagelet_frs-footer/pagelet/content_footer\"></div></div>\n<div id=\"fixed_bar\" class=\"\">\n    <img src=\"//tb1.bdstatic.com/tb/cms/PC%E7%AB%AF%E5%BA%95%E9%83%A8%E9%80%9A%E6%A0%8F%E5%BC%B9%E5%B1%821000x120.png\" alt=\"\">\n    <img src=\"//tb2.bdstatic.com/tb/img/icon_close_1683259.png\" alt=\"\" class=\"close\">\n</div>\n\n<a id=\"fixed_daoliu\" href=\"\" target=\"_blank\" data-switch=\"\">\n    <img src=\"\">\n    <span class=\"close\"></span>\n</a>\n<div class='guide-wrapper-pop' id='guidePopWrapper' data-uc='0'>\n    <div class='pub-guide pub-guide-narrow' id='guidePubWrap'>\n        <span class='close-guide'></span>\n        <div class='pub-guide-write'></div>\n    </div>\n    <div class='eidtor-guide' id='guideEidtorWrap'>\n        <span class='close-guide'></span>\n        <div class='plugin-guide-icon'></div>\n    </div>\n</div>\n\n\n\n        </div>\n    </div>\n\n    <script src=\"//tb1.bdstatic.com/??/tb/static-common/js/promise_bff2716.js,/tb/static-common/js/promise_config_91c2822.js,/tb/static-common/lib/uri.js/src/URI.min_412317f.js,/tb/static-common/js/jquery/jquery_d3fcd6c.js,/tb/static-common/js/jquery/jquery-ui-1.10.3.custom_26f79a8.js,/tb/static-common/js/jquery/jquery.ui.droppable_d4ed035.js,/tb/static-common/js/jquery/jquery.lazyload_49a7282.js,/tb/static-common/lib/fis-module/fis_c1e11e0.js,/tb/static-common/js/__aop_af3a579.js,/tb/static-common/js/baiduTemplate_d3643f5.js,/tb/static-common/js/jcarousellite_1.0.1_71ff1f1.js,/tb/static-common/js/page_link_2ec40cf.js,/tb/static-common/js/pageconf_8abbe38.js,/tb/static-common/js/tb_af9e033.js,/tb/static-common/js/tb_extend_000de9f.js,/tb/static-common/js/tb_fis_config_e66b384.js,/tb/static-common/js/tb_stats_7865c3b.js,/tb/static-common/js/underscore_b23cfa6.js,/tb/static-common/js/qrcode_fdc9a64.js,/tb/static-common/lib/fis-module/module_b81bdad.js,/tb/static-common/lib/bigpipe.js/lib/bigpipe_c4181f8.js,/tb/static-common/js/bigpipe_config_9c152a9.js,/tb/static-common/js/lcs/lib/Long_8276e76.js,/tb/static-common/js/lcs/lcsas_a69e077.js,/tb/static-common/js/bsk/dknsaZmLdyKfEeIVbKxn_7b5edbc.js,/tb/static-common/js/bsk/omzVouOACqkNljzDbdOB_4efff96.js,/tb/static-common/js/bsk/jkaEbldlZmvawIuwAdqo_670b771.js,/tb/static-common/js/filter_b38b30b.js\"></script>\n<script src=\"//tb1.bdstatic.com/??/tb/static-common/js/common/MessageSystem_2f3859e.js,/tb/static-common/js/common/CommonManager_main_d3b4283.js,/tb/static-common/js/common/passport/pass_shell_f732796.js,/tb/static-common/js/common/passport/passport_reset_8006599.js,/tb/static-common/js/common/passport/PassportFillName_925655f.js,/tb/static-common/js/common/uiDecorator_125371a.js,/tb/static-common/js/common/passport/PassportLogin_96b5447.js,/tb/static-common/js/common/user/User_8ed5530.js,/tb/static-common/js/common/crosspage_msg_system/utils/LCFManager_f2555be.js,/tb/static-common/js/common/crosspage_msg_system/utils/MessageProxy_25dc8d9.js,/tb/static-common/js/common/crosspage_msg_system/utils/SWFListen_87d118b.js,/tb/static-common/js/common/crosspage_msg_system/utils/SWFRequest_f586836.js,/tb/static-common/js/common/crosspage_msg_system/MsgSystem_9ef7035.js,/tb/static-common/js/common/user_message/UserMessage_3783340.js,/tb/static-common/js/tb_https_2f6042d.js\"></script>\n<div id=\"pagelet_frs-footer/pagelet/extension\"></div><script src=\"//tb1.bdstatic.com/??/tb/_/title_1a42886.js,/tb/_/fixed_bar_e002a0a.js,/tb/_/fixed_daoliu_422cc1d.js,/tb/_/fixed_guide_b04a67b.js\"></script>\n    <script>\n        if (window.radar) {\n            ! function() {\n                \"use strict\";\n                if (window.radar) {\n                    var t = document.createElement(\"script\");\n                    t.src = \"//tb3.bdstatic.com/radar-sdk/prod/js/2.0.0/es3/radar.min.js?t=\" + (new Date).getTime(), document.getElementsByTagName(\"body\")[0].appendChild(t)\n                }\n            }();\n        }\n    </script>\n\n    <!-- 安全部反黑产SDK，采集用户浏览器行为，辅助分析作弊流量 -->\n    <script type=\"text/javascript\" defer src=\"https://xlab.baidu.com/res/bundle.z.php\"></script>\n    <!-- 昆仑SDK,UEG 部门的反作弊系统 -->\n    <script type=\"text/javascript\" defer src=\"https://hectorstatic.baidu.com/1371300bc53d20f8.js\"></script>\n</body>\n    <!-- 适老化js -->\n    <script defer type=\"text/javascript\" src=\"//tb5.bdstatic.com/api/wza/aria.js?appid=c890648bf4dd00d05eb9751dd0548c30\" charset=”utf-8”></script>\n\n<!-- weirwood异常与性能监控 -->\n<script type=\"text/javascript\">\n    if (window.weirwoodParams) {\n        !function(){\"use strict\";function r(o){return function(o){if(Array.isArray(o)){for(var e=0,r=new Array(o.length);e<o.length;e++)r[e]=o[e];return r}}(o)||function(o){if(Symbol.iterator in Object(o)||\"[object Arguments]\"===Object.prototype.toString.call(o))return Array.from(o)}(o)||function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance\")}()}var o;(o=document.createElement(\"script\")).src=\"https://dmpstatic.cdn.bcebos.com/weirwood-sdk/1/1.3.7/bundle.min.js\",o.onload=function(){var e=Weirwood.init(window.spaWeirwoodParams||window.weirwoodParams);__tieba__weirwood__.jsExceptions.forEach(function(o){var e;(e=window).onerror.apply(e,r(o))}),__tieba__weirwood__.resourceExceptions.forEach(function(o){__tieba__weirwood__.weirwoodResourceListener(o)}),__tieba__weirwood__.apiExceptions.forEach(function(o){window.onunhandledrejection(o)}),__tieba__weirwood__.customExceptions.forEach(function(o){e.error.captureException(o)}),window.addEventListener=__tieba__weirwood__.windowAddEventListener,__tieba__weirwood__.reportException=e.error.captureException.bind(e.error)},document.body.appendChild(o)}();\n    }\n</script>\n\n<!-- 接入ACS 加载paris并进行初始化 Paris作用域frs有效，发帖前在post_service.js进行签名获取 -->\n<script>\n    var parisUrl = '//tb3.bdstatic.com/api/acs/paris-v2.min.js';\n    $.stats.importScript(parisUrl, {\n        retryCount: 3,\n        successCallback: function() {\n            if (!ParisFactory) {\n                return;\n            }\n            ParisFactory.create({\n                sid: 2027,\n                timeout: 5000,\n                acsUrl: 'https://dlswbr.baidu.com/heicha/mm/2027/acs-2027.js',\n                disasterConfig: {\n                    acsUrl: 'https://miaowu.baidu.com/sdk/heicha/mm/2027/acs-2027.js',\n                }\n            });\n        },\n        failureCallback: function() {\n            // 仅记录失败即可\n            $.stats.track('acs_paris', 'acs_paris_load_fail', 'frs_common', 'view');\n        }\n    })\n</script>\n<script>\n    (() => {\n        if(window.PerformanceObserver && window.performance) {\n            /** 打点未添加图片防盗链的图片请求 */\n            function trackLostAntiTheftChain(resources) {\n                var antiTheftUrlRegexp = /^https?:\\/\\/tiebapic.baidu.com/;\n                for(var resource of resources) {\n                    /** 图片防盗链例子：http://tiebapic.baidu.com/tieba/pic/item/2934349b033b5bb5d15bec2473d3d539b700bc58.jpg?tbpicau=2022-07-15-17_a2216276f09dcac2ede6c16a81d97751 */\n                    if(antiTheftUrlRegexp.test(resource.name)) {\n                        if(resource.name.indexOf('tbpicau') === -1) {\n                            /* locate: 模版名称; task：anti_theft; page：模块名称; type: view */\n                            $.stats.track('index/index.php', 'anti_theft', 'frs', 'view', {resourceURL: resource.name});\n                        }\n                    }\n                }\n            }\n            /** DOMContentLoaded -> load */\n            var observer = new PerformanceObserver((loadedResources) => {\n                trackLostAntiTheftChain(loadedResources.getEntries());\n            });\n            observer.observe({entryTypes: ['resource']});\n            /** navigationStart -> DOMContentLoaded */\n            var DOMContentLoadedResources = window.performance.getEntriesByType('resource');\n            trackLostAntiTheftChain(DOMContentLoadedResources);\n        }\n    })()\n</script>\n</html>\n<code class=\"pagelet_html\" id=\"pagelet_html_search/pagelet/search_logic\" style=\"display:none;\"><!----></code><script>Bigpipe.register(\"search/pagelet/search_logic\", {\"parent\":\"\",\"scripts\":[\"\\/tb\\/_\\/http_transform_d9b1cbd.js\",\"\\/tb\\/_\\/login_dialog_8cc35e4.js\",\"\\/tb\\/_\\/suggestion_01982b0.js\",\"\\/tb\\/_\\/search_handler_aa6a3d6.js\",\"\\/tb\\/_\\/search_dialog_b4dc63b.js\",\"\\/tb\\/_\\/search_logic_a568b5b.js\"],\"styles\":[\"\\/tb\\/_\\/http_transform_d41d8cd.css\",\"\\/tb\\/_\\/login_dialog_8bacf9a.css\",\"\\/tb\\/_\\/suggestion_097d72b.css\"]}).then(function(pagelet){    _.Module.use('search/widget/suggestion', [], function () {\n    });\n    _.Module.use('search/widget/search_logic', [\n        $('#head'),\n        {\n            product: 'frs',\n            forumName: '盗墓笔记',\n            searchFixed: '1',\n            sugOn: '1'\n        }\n    ]);\n});</script><code class=\"pagelet_html\" id=\"pagelet_html_frs-footer/pagelet/content_footer\" style=\"display:none;\"><!--\n<div class=\"frs_content_footer_pagelet\">\n\n\n\n\t\t<div class=\"editor_wrap_bright \">\n\t<div id=\"pagelet_poster/pagelet/rich_poster\"></div>\t</div>\n\n\n\n<div id=\"footer\" class=\"footer\">\n\n\t<span>&copy;2024 Baidu</span>\n\t<a pv_code=\"0\" href=\"/tb/eula.html\" target=\"_blank\">贴吧协议</a>\t<span>|</span>\n\t<a pv_code=\"0\" href=\"https://tieba.baidu.com/tb/cms/tieba-fe/tieba_promise.html\" target=\"_blank\">隐私政策</a>\t<span>|</span>\n\t<a pv_code=\"0\" href=\"http://tieba.baidu.com/tb/system.html\" target=\"_blank\">吧主制度</a>\t<span>|</span>\n\t<a class=\"ueg_feedback-link\" data-site=\"feedbackLink\"  pv_code=\"0\" href=\"http://tieba.baidu.com/hermes/feedback\" target=\"_blank\">意见反馈</a>\t<span>|</span>\n\t<a pv_code=\"0\" href=\"/tb/zt/declare/\" target=\"_blank\">网络谣言警示</a>\t</div>\n\n</div>\n\n--></code><script>Bigpipe.register(\"frs-footer/pagelet/content_footer\", {\"parent\":\"\",\"scripts\":[\"\\/tb\\/_\\/frs-footer\\/content_footer_bc94b74.js\",\"\\/tb\\/_\\/tbcopy_f4f2e14.js\",\"\\/tb\\/_\\/duoku_servers_dialog_af8b0f3.js\",\"\\/tb\\/_\\/duoku_servers_list_046cdf2.js\",\"\\/tb\\/_\\/footer_8d5b425.js\"],\"styles\":[\"\\/tb\\/_\\/frs-footer\\/content_footer_e1ac3c2.css\",\"\\/tb\\/_\\/duoku_servers_dialog_4139e32.css\",\"\\/tb\\/_\\/duoku_servers_list_ad77ca3.css\",\"\\/tb\\/_\\/footer_fd940ae.css\"]}).then(function(pagelet){_.Module.use('common/widget/footer', [], function(){});\n_.Module.use('frs-footer/pagelet/content_footer', [pagelet]);\n});</script><code class=\"pagelet_html\" id=\"pagelet_html_common/pagelet/userbar\" style=\"display:none;\"><!--<div class=\"common-pagelet-userbar\">\n\n<div id=\"local_flash_cnt\"></div>\n\n</div>\n--></code><script>Bigpipe.register(\"common/pagelet/userbar\", {\"parent\":\"\",\"scripts\":[\"\\/tb\\/_\\/login_dialog_8cc35e4.js\",\"\\/tb\\/_\\/global_switch_6dfeb89.js\",\"\\/tb\\/_\\/http_transform_d9b1cbd.js\",\"\\/tb\\/_\\/tdou_open_type_a72e1ed.js\",\"\\/tb\\/_\\/user_api_10e048c.js\",\"\\/tb\\/_\\/icons_983b4c0.js\",\"\\/tb\\/_\\/base_user_data_ff57bd7.js\",\"\\/tb\\/_\\/base_dialog_user_bar_6dc620e.js\",\"\\/tb\\/_\\/qianbao_cashier_dialog_aa111c7.js\",\"\\/tb\\/_\\/qianbao_purchase_member_fad1d66.js\",\"\\/tb\\/_\\/messenger_e5c0696.js\",\"\\/tb\\/_\\/cashier_dialog_d52cf7c.js\",\"\\/tb\\/_\\/pay_member_c57f92d.js\",\"\\/tb\\/_\\/business_agent_def1caf.js\",\"\\/tb\\/_\\/official_bar_cb993a5.js\",\"\\/tb\\/_\\/creative_bar_f4b161a.js\",\"\\/tb\\/_\\/event_center_08fbacd.js\",\"\\/tb\\/_\\/new_message_system_aecbc3c.js\",\"\\/tb\\/_\\/join_vip_dialog_9242ef7.js\",\"\\/tb\\/_\\/user_head_aa4a317.js\",\"\\/tb\\/_\\/js_pager_753507e.js\",\"\\/tb\\/_\\/wallet_dialog_a203f24.js\",\"\\/tb\\/_\\/card_d6007e6.js\",\"\\/tb\\/_\\/userbar_b7d779b.js\"],\"styles\":[\"\\/tb\\/_\\/login_dialog_8bacf9a.css\",\"\\/tb\\/_\\/http_transform_d41d8cd.css\",\"\\/tb\\/_\\/icons_fba8214.css\",\"\\/tb\\/_\\/base_user_data_f665ab7.css\",\"\\/tb\\/_\\/base_dialog_user_bar_69fdf18.css\",\"\\/tb\\/_\\/qianbao_cashier_dialog_179e56e.css\",\"\\/tb\\/_\\/qianbao_purchase_member_264deea.css\",\"\\/tb\\/_\\/cashier_dialog_0d74ed0.css\",\"\\/tb\\/_\\/pay_member_d41d8cd.css\",\"\\/tb\\/_\\/official_bar_4e3b6b6.css\",\"\\/tb\\/_\\/creative_bar_1ee3d67.css\",\"\\/tb\\/_\\/new_message_system_bea7f16.css\",\"\\/tb\\/_\\/user_head_35f26e0.css\",\"\\/tb\\/_\\/js_pager_5be1e39.css\",\"\\/tb\\/_\\/wallet_dialog_7491aa5.css\",\"\\/tb\\/_\\/card_1f33a7b.css\",\"\\/tb\\/_\\/userbar_3e449c3.css\"]}).then(function(pagelet){    // PageData.product = frs TODO\n    var yyConfig = {\"yy_pay_open\":1,\"yy_is_convert\":1,\"yy_scores\":0};\n    PageData.user.open_switch = yyConfig.yy_pay_open;\n    PageData.user.open_convert = yyConfig.yy_is_convert;\n    PageData.user.yy_scores = yyConfig.yy_scores;\n    if (yyConfig.yy_pay_open === 1 && yyConfig.yy_is_convert === 1) {\n        var user = PageData.user;\n        var parr_scores = user.Parr_scores;\n        if (parr_scores) {\n            parr_scores.scores_money = user.yy_scores;\n            parr_scores.scores_other = 0;\n            parr_scores.scores_total = parr_scores.scores_money + parr_scores.scores_other;\n        }\n    }\n    // 冻结逻辑挪到设置完开关之后\n    if (Object.freeze) {\n        (function deepFreeze(o) {\n            var prop, propKey;\n            Object.freeze(o);\n            for (propKey in o) {\n                prop = o[propKey];\n                if (!o.hasOwnProperty(propKey) ||\n                    typeof prop !== 'object' ||\n                    !prop ||\n                    Object.isFrozen(prop)) {\n                    continue;\n                }\n                deepFreeze(prop);\n            }\n        })(PageData);\n    }\n    _.Module.use(\"common/widget/Userbar\", {\n        page: 'frs',\n        userLevel:null,\n        userScore:null,\n        vipInfo:null,\n        isVideoPGCUser: 0,\n        lcsKey: '', // flash_lcs.js 中使用\n        bluePush: {\n            unit: {\"url\":[\"http:\\/\\/push.dui1dui.com\\/tieba\\/awaken\"],\"button\":[\"\\u9a6c\\u4e0a\\u62a2\"],\"text\":[\"\\u4eb2\\u7231\\u7684\\uff0c\\u4f60\\u4e0d\\u77e5\\u9053\\u5417\\uff1f\\u4f60\\u8d26\\u6237\\u4e2d\\u7684\\u84dd\\u94bb\\u53ef\\u4ee5\\u7528\\u6765\\u5151\\u6362\\u8d34\\u5427\\u4f1a\\u5458\\uff01\\u540d\\u989d\\u6709\\u9650\\uff0c\\u901f\\u6765\\u62a2\\uff01\"]},\n            handle: null,\n            diamond: null        },\n        userBarConfigData: {\"switch\":\"0\",\"word\":\"hao123\",\"url\":\"https:\\/\\/www.hao123.com\\/?tn=50000076_hao_pg\"},\n        userIdentity: {\"is_business_agent\":0,\"is_tiebaplus_agent\":0}    });\n});</script><code class=\"pagelet_html\" id=\"pagelet_html_frs-base/pagelet/content\" style=\"display:none;\"><!--    <div class=\"forum_content clearfix\">\n        <div class=\"main\" id=\"content_wrap\">\n            <div id=\"pagelet_frs-list/pagelet/content\"></div>        </div>\n        <div class=\"aside\" id=\"aside\">\n            <div id=\"pagelet_frs-aside/pagelet/aside\"></div>        </div>\n    </div>\n--></code><script>Bigpipe.register(\"frs-base/pagelet/content\", {\"parent\":\"\",\"scripts\":[\"\\/tb\\/_\\/login_dialog_8cc35e4.js\",\"\\/tb\\/_\\/content_c24f08a.js\",\"\\/tb\\/_\\/page_router_9f0f230.js\"],\"styles\":[\"\\/tb\\/_\\/login_dialog_8bacf9a.css\",\"\\/tb\\/_\\/page_router_6d81cff.css\"]}).then(function(pagelet){    _.Module.use('tbui/widget/page_router', [pagelet]);\n    _.Module.use('frs-base/pagelet/content', [pagelet], function (instance) {\n\n    });\n});</script><code class=\"pagelet_html\" id=\"pagelet_html_search/pagelet/search_ad\" style=\"display:none;\"><!----></code><script>Bigpipe.register(\"search/pagelet/search_ad\", {\"parent\":\"\",\"scripts\":[],\"styles\":[]}).then(function(pagelet){});</script><code class=\"pagelet_html\" id=\"pagelet_html_frs-header/pagelet/head\" style=\"display:none;\"><!--\n\n<div class=\"head_main\">\n        <div class=\"head_top\">\n\n\n<div id=\"pagelet_platform-activity/pagelet/full_width_head\"></div>    </div>\n    <div class=\"head_middle\">\n\n\n\n    </div>\n    <div class=\"head_content\">\n\n\n\n\n<div class=\"card_banner card_banner_link\" >\n      <img src='https://imgsa.baidu.com/forum/pic/item/d100baa1cd11728bca738e01cbfcc3cec3fd2cb2.jpg' id=\"forum-card-banner\" />\n\n  <div class='gift-goin'>\n    <div class=\"gift-goin-left\">\n        <div class=\"gift-goin-con\">\n            <div class=\"gift-goin-con-start\">\n                <p class=\"gift-goin-con-title\">本吧礼赞</p>\n                <div class=\"gift-goin-con-title thanks\"><em>感谢你与</em><span class=\"forum-name-sub\">本吧</span><em>的一同成长</em></div>\n            </div>\n            <div class=\"gift-goin-con-list\">\n                <div class=\"gift-goin-con-title\"><em>感谢你与</em><span class=\"forum-name-sub\">本吧</span><em>的一同成长</em></div>\n                <div class=\"gift-goin-con-check\">\n                    <ul class=\"gift-goin-con-check-list\"></ul>\n                    <a href=\"javascript:;\" class=\"j-check-gift\" j-check-gift>查看榜单 ></a>\n                </div>\n            </div>\n        </div>\n        <img src=\"//tb2.bdstatic.com/tb/img/ihome_batou_icon_1334d8e.png\" height=\"50\" width=\"50\" alt=\"\" class=\"gift-goin-img j-goin-gift\"/>\n    </div>\n</div>\n\n\n\n</div>\n\n<div class=\"card_top_wrap clearfix card_top_theme \">\n   <div class=\"card_top_right\">\n       <div id=\"pagelet_forum/pagelet/sign_mod\"></div>   </div>\n   <div class=\"card_top clearfix\">\n              <div class=\"card_head\">\n           <a rel=\"noreferrer\" href=\"/f?kw=%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&ie=utf-8\">\n               <img class=\"card_head_img\" id=\"forum-card-head\" src=\"https://imgsa.baidu.com/forum/pic/item/342ac65c1038534352bc04309013b07eca8088b4.jpg\"/>\n           </a>\n       </div>\n\n       <div class=\"card_title\">\n           <a rel=\"noreferrer\" class=\" card_title_fname\" title=\"\"\n              href=\"/f?kw=%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&ie=utf-8\">\n               盗墓笔记吧\n           </a>\n                                 <div class=\"focus_btn_wrap\">\n               <div id=\"pagelet_forum/pagelet/focus_btn\"></div>           </div>\n           <div class=\"card_num\">\n               <div id=\"pagelet_forum/pagelet/forum_card_number\"></div>           </div>\n       </div>\n\n       <p class=\"card_slogan\">喜爱盗墓笔记的有爱稻米聚集地</p>\n\n       <div class=\"card_info\">\n           <ul class=\"forum_dir_info bottom_list clearfix\">\n                                  <li>\n                                          </li>\n                   <li>\n                       <span class=\"dir_text\">目录：</span>\n                   </li>\n                   <li>\n                                                  <span>奇幻·玄幻小说</span>\n                                          </li>\n                          </ul>\n       </div>\n   </div>\n</div>\n<div id=\"pagelet_frs-header/pagelet/head_content_middle\"></div><div id=\"pagelet_navigation/pagelet/navigation\"></div><div id=\"pagelet_frs-header/pagelet/head_content_bottom\"></div>    </div>\n</div>\n--></code><script>Bigpipe.register(\"frs-header/pagelet/head\", {\"parent\":\"\",\"scripts\":[\"\\/tb\\/_\\/head_main_c294af5.js\",\"\\/tb\\/_\\/login_dialog_8cc35e4.js\",\"\\/tb\\/_\\/messenger_e5c0696.js\",\"\\/tb\\/_\\/loader_334189d.js\",\"\\/tb\\/_\\/game_head_info_2bba44c.js\",\"\\/tb\\/_\\/http_transform_d9b1cbd.js\",\"\\/tb\\/_\\/preview_e43ce97.js\",\"\\/tb\\/_\\/rsa_safe_ffe2fa7.js\",\"\\/tb\\/_\\/paykey_safe_payment_f7a973d.js\",\"\\/tb\\/_\\/captcha_d99d16f.js\",\"\\/tb\\/_\\/captcha_dialog_ceaacd2.js\",\"\\/tb\\/_\\/captcha_safe_payment_7f700b4.js\",\"\\/tb\\/_\\/mobile_safe_payment_b2a273c.js\",\"\\/tb\\/_\\/tbean_safe_3668241.js\",\"\\/tb\\/_\\/tbean_safe_ajax_5dbae2e.js\",\"\\/tb\\/_\\/tdou_data_747c462.js\",\"\\/tb\\/_\\/umoney_1379f71.js\",\"\\/tb\\/_\\/global_switch_6dfeb89.js\",\"\\/tb\\/_\\/tdou_template_8d6b3f6.js\",\"\\/tb\\/_\\/tdou_builder_05260c9.js\",\"\\/tb\\/_\\/tdou_view_operation_bootstrap_4a983b5.js\",\"\\/tb\\/_\\/tdou_view_cashier_6afe462.js\",\"\\/tb\\/_\\/user_api_10e048c.js\",\"\\/tb\\/_\\/icons_983b4c0.js\",\"\\/tb\\/_\\/base_user_data_ff57bd7.js\",\"\\/tb\\/_\\/base_dialog_user_bar_6dc620e.js\",\"\\/tb\\/_\\/qianbao_cashier_dialog_aa111c7.js\",\"\\/tb\\/_\\/qianbao_purchase_tdou_f4c69c0.js\",\"\\/tb\\/_\\/tdou_open_type_a72e1ed.js\",\"\\/tb\\/_\\/tdou_view_util_d282db0.js\",\"\\/tb\\/_\\/tdou_view_auto_redirect_a353d12.js\",\"\\/tb\\/_\\/umoney_query_e6ef23a.js\",\"\\/tb\\/_\\/tdou_view_check_f11908d.js\",\"\\/tb\\/_\\/tdou_counter_cbe5c8a.js\",\"\\/tb\\/_\\/tdou_view_fec0b7b.js\",\"\\/tb\\/_\\/tdou_3289666.js\",\"\\/tb\\/_\\/show_dialog_d46d0a5.js\",\"\\/tb\\/_\\/payment_dialog_title_3e773b9.js\",\"\\/tb\\/_\\/tdou_get_38af9fd.js\",\"\\/tb\\/_\\/tcharge_dialog_5da22d7.js\",\"\\/tb\\/_\\/qianbao_purchase_member_fad1d66.js\",\"\\/tb\\/_\\/cashier_dialog_d52cf7c.js\",\"\\/tb\\/_\\/pay_member_c57f92d.js\",\"\\/tb\\/_\\/tdou_view_pay_46c8c05.js\",\"\\/tb\\/_\\/send_gift_success_42f520e.js\",\"\\/tb\\/_\\/gift_page_ctrl_244e959.js\",\"\\/tb\\/_\\/gift_loading_css_1eb1d70.js\",\"\\/tb\\/_\\/send_gift_dialog_0328457.js\",\"\\/tb\\/_\\/raking_gift_dialog_b2e4ac6.js\",\"\\/tb\\/_\\/gift_batou_goin_71900f5.js\"],\"styles\":[\"\\/tb\\/_\\/head_main_6892579.css\",\"\\/tb\\/_\\/login_dialog_8bacf9a.css\",\"\\/tb\\/_\\/game_head_info_765f80b.css\",\"\\/tb\\/_\\/forum_card_62fcc00.css\",\"\\/tb\\/_\\/http_transform_d41d8cd.css\",\"\\/tb\\/_\\/paykey_safe_payment_8f2a8db.css\",\"\\/tb\\/_\\/captcha_30e4d3c.css\",\"\\/tb\\/_\\/captcha_safe_payment_d41d8cd.css\",\"\\/tb\\/_\\/mobile_safe_payment_77949bb.css\",\"\\/tb\\/_\\/tbean_safe_3c779a3.css\",\"\\/tb\\/_\\/tbean_safe_ajax_d41d8cd.css\",\"\\/tb\\/_\\/umoney_f12b09a.css\",\"\\/tb\\/_\\/tdou_template_781e4d0.css\",\"\\/tb\\/_\\/icons_fba8214.css\",\"\\/tb\\/_\\/base_user_data_f665ab7.css\",\"\\/tb\\/_\\/base_dialog_user_bar_69fdf18.css\",\"\\/tb\\/_\\/qianbao_cashier_dialog_179e56e.css\",\"\\/tb\\/_\\/qianbao_purchase_tdou_4b31f54.css\",\"\\/tb\\/_\\/umoney_query_d15a716.css\",\"\\/tb\\/_\\/tdou_d41d8cd.css\",\"\\/tb\\/_\\/payment_dialog_title_5433211.css\",\"\\/tb\\/_\\/tdou_get_4b2272d.css\",\"\\/tb\\/_\\/tcharge_dialog_a6fd677.css\",\"\\/tb\\/_\\/qianbao_purchase_member_264deea.css\",\"\\/tb\\/_\\/cashier_dialog_0d74ed0.css\",\"\\/tb\\/_\\/pay_member_d41d8cd.css\",\"\\/tb\\/_\\/send_gift_success_9d313ae.css\",\"\\/tb\\/_\\/gift_page_ctrl_38efa21.css\",\"\\/tb\\/_\\/gift_loading_css_e2c23e9.css\",\"\\/tb\\/_\\/send_gift_dialog_a806bb5.css\",\"\\/tb\\/_\\/raking_gift_dialog_b3b03f8.css\",\"\\/tb\\/_\\/gift_batou_goin_6216cc5.css\"]}).then(function(pagelet){    // TODO 多次加载白名单，需要优化\n    _.Module.use('adsense-base/widget/loader', [{\n        'whiteList':[[\"http:\\/\\/fedev.baidu.com\"],[\"http:\\/\\/jiaoyu.baidu.com\"],[\"http:\\/\\/caifu.baidu.com\"],[\"http:\\/\\/jiankang.baidu.com\"],[\"http:\\/\\/tieba.dre8.com\"],[\"http:\\/\\/tdsp.nuomi.com\"],[\"http:\\/\\/baiju.baidu.com\"],[\"http:\\/\\/temai.baidu.com\"],[\"http:\\/\\/tieba.baidu.com\"],[\"http:\\/\\/zt.chuanke.com\"],[\"http:\\/\\/window.sturgeon.mopaas.com\"],[\"http:\\/\\/api.union.vip.com\"],[\"http:\\/\\/api.dongqiudi.com\"],[\"http:\\/\\/www.chuanke.com\"],[\"http:\\/\\/dcp.kuaizitech.com\\/\"]],\n        'adValue':\"\"    }]);\n    _.Module.use('tbui/widget/httpTransform', [], function () {\n    });\n_.Module.use('tbui/widget/preview', [], function(){});\n    _.Module.use('encourage-blue/widget/gift_batou_goin', {\n        $container: '.gift-goin',\n    });\n    _.Module.use('frs-header/widget/head_main', [{\n        kw: \"盗墓笔记\",\n        source: \"\"\n    }], function () {\n    });\n});</script><code class=\"pagelet_html\" id=\"pagelet_html_frs-footer/pagelet/extension\" style=\"display:none;\"><!--\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<div id=\"pagelet_platform-official/pagelet/official_extension\"></div>\n--></code><script>Bigpipe.register(\"frs-footer/pagelet/extension\", {\"parent\":\"\",\"scripts\":[\"\\/tb\\/_\\/preview_e43ce97.js\",\"\\/tb\\/_\\/tb_skin_1cfab79.js\",\"\\/tb\\/_\\/frs-footer\\/frs_from_guide_55b4caa.js\",\"\\/tb\\/_\\/bubble_tip_d34e792.js\",\"\\/tb\\/_\\/tbcopy_f4f2e14.js\",\"\\/tb\\/_\\/tbshare_share_61f1525.js\",\"\\/tb\\/_\\/tbshare_popup_1c599af.js\",\"\\/tb\\/_\\/aside_float_bar_6733c4a.js\",\"\\/tb\\/_\\/frs-footer\\/aside_float_btns_7b8d2dc.js\",\"\\/tb\\/_\\/verify_manager_phone_cba5a4d.js\",\"\\/tb\\/_\\/inform_manager_verify_phone_f5289a5.js\",\"\\/tb\\/_\\/detect_manager_block_3e52a76.js\",\"\\/tb\\/_\\/bawu_add_section_e27c6f2.js\",\"\\/tb\\/_\\/card_d6007e6.js\",\"\\/tb\\/_\\/icon_tip_0107777.js\",\"\\/tb\\/_\\/umoney_promotion_dialog_0174dae.js\",\"\\/tb\\/_\\/snowflow_15135cd.js\",\"\\/tb\\/_\\/login_dialog_8cc35e4.js\",\"\\/tb\\/_\\/tdou_open_type_a72e1ed.js\",\"\\/tb\\/_\\/global_switch_6dfeb89.js\",\"\\/tb\\/_\\/user_api_10e048c.js\",\"\\/tb\\/_\\/icons_983b4c0.js\",\"\\/tb\\/_\\/base_user_data_ff57bd7.js\",\"\\/tb\\/_\\/base_dialog_user_bar_6dc620e.js\",\"\\/tb\\/_\\/qianbao_cashier_dialog_aa111c7.js\",\"\\/tb\\/_\\/qianbao_purchase_member_fad1d66.js\",\"\\/tb\\/_\\/messenger_e5c0696.js\",\"\\/tb\\/_\\/cashier_dialog_d52cf7c.js\",\"\\/tb\\/_\\/pay_member_c57f92d.js\",\"\\/tb\\/_\\/join_vip_dialog_9242ef7.js\",\"\\/tb\\/_\\/dialog_d31c70c.js\",\"\\/tb\\/_\\/util_fdb7481.js\",\"\\/tb\\/_\\/cont_sign_card_518234f.js\",\"\\/tb\\/_\\/rsa_safe_ffe2fa7.js\",\"\\/tb\\/_\\/paykey_safe_payment_f7a973d.js\",\"\\/tb\\/_\\/captcha_d99d16f.js\",\"\\/tb\\/_\\/captcha_dialog_ceaacd2.js\",\"\\/tb\\/_\\/captcha_safe_payment_7f700b4.js\",\"\\/tb\\/_\\/mobile_safe_payment_b2a273c.js\",\"\\/tb\\/_\\/tbean_safe_3668241.js\",\"\\/tb\\/_\\/tbean_safe_ajax_5dbae2e.js\",\"\\/tb\\/_\\/net_proxy_f5ecab7.js\",\"\\/tb\\/_\\/use_controller_e92bca8.js\",\"\\/tb\\/_\\/buy_controller_cc40438.js\",\"\\/tb\\/_\\/tieba_sign_card_f938fb7.js\",\"\\/tb\\/_\\/loader_334189d.js\",\"\\/tb\\/_\\/tpl_9_8b5cf97.js\"],\"styles\":[\"\\/tb\\/_\\/frs-footer\\/extension_d41d8cd.css\",\"\\/tb\\/_\\/bubble_tip_17a9ec9.css\",\"\\/tb\\/_\\/tbshare_share_4a2fcf9.css\",\"\\/tb\\/_\\/tbshare_popup_d41d8cd.css\",\"\\/tb\\/_\\/aside_float_bar_0e6cd94.css\",\"\\/tb\\/_\\/verify_manager_phone_7d1435e.css\",\"\\/tb\\/_\\/bawu_add_section_cb95883.css\",\"\\/tb\\/_\\/card_1f33a7b.css\",\"\\/tb\\/_\\/icon_tip_db299f2.css\",\"\\/tb\\/_\\/umoney_promotion_dialog_d0d023b.css\",\"\\/tb\\/_\\/snowflow_45a89bb.css\",\"\\/tb\\/_\\/login_dialog_8bacf9a.css\",\"\\/tb\\/_\\/icons_fba8214.css\",\"\\/tb\\/_\\/base_user_data_f665ab7.css\",\"\\/tb\\/_\\/base_dialog_user_bar_69fdf18.css\",\"\\/tb\\/_\\/qianbao_cashier_dialog_179e56e.css\",\"\\/tb\\/_\\/qianbao_purchase_member_264deea.css\",\"\\/tb\\/_\\/cashier_dialog_0d74ed0.css\",\"\\/tb\\/_\\/pay_member_d41d8cd.css\",\"\\/tb\\/_\\/dialog_6ed86bb.css\",\"\\/tb\\/_\\/cont_sign_card_6369333.css\",\"\\/tb\\/_\\/paykey_safe_payment_8f2a8db.css\",\"\\/tb\\/_\\/captcha_30e4d3c.css\",\"\\/tb\\/_\\/captcha_safe_payment_d41d8cd.css\",\"\\/tb\\/_\\/mobile_safe_payment_77949bb.css\",\"\\/tb\\/_\\/tbean_safe_3c779a3.css\",\"\\/tb\\/_\\/tbean_safe_ajax_d41d8cd.css\",\"\\/tb\\/_\\/buy_controller_9c17778.css\",\"\\/tb\\/_\\/tieba_sign_card_2928c29.css\"]}).then(function(pagelet){_.Module.use('tbui/widget/preview', [], function(){});\n_.Module.use('tbui/widget/tb_skin', [\n\t\"normal\",\n\t'20130803'\n]);\n\t_.Module.use(\"frs-footer/widget/frs_from_guide\");\n\t_.Module.use('frs-footer/widget/aside_float_btns', [{\n        isBottle: 0,\n        isNewBottle: null,\n        bottleTid: \"\",\n        showAuxiliaryCareFlag: 2    }]);\n    _.Module.use('ueglib/widget/inform_manager_verifyPhone', [\n        false,\n        false,\n        false    ]);\n    _.Module.use('ueglib/widget/detect_manager_block', [], function (moduleInstance) {\n        moduleInstance.setBlockState(false);\n    });\n\t_.Module.use('bawu/widget/bawuAddSection',{\n\t\t\"fname_u\": \"%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&ie=utf-8\" ,\n\t\t\"fname\": \"\\u76d7\\u5893\\u7b14\\u8bb0\" ,\n\t\t\"tbs\": \"d1af71cf9c8bc1a21723088812\"\t});\n    _.Module.use('user/widget/icon_tip',{\n        myIcons:[] ,\n        pagelet: pagelet\n        });\n    _.Module.use('yunying/widget/snowflow', [{\n            content: '盗墓笔记',\n            page: 'frs',\n            snowflowImg: '',\n            snowflowUrl: ''\n        }]\n    );\n    _.Module.use('encourage-props/widget/tieba_sign_card',[{\n        superboy: []    }]);\n    _.Module.use('adsense-base/widget/tpl_9', [{\n        'adData': {\"id\":\"37444\",\"name\":\"\\u6e38\\u620f\\u5408\\u4f5c-\\u51e1\\u4eba\\u795e\\u5c06\\u4f203-\\u65b01-\\u7c7b\\u76ee\",\"adv_type\":\"0\",\"typeid\":\"0200\",\"pos_name\":\"LEFT\",\"loc_code\":\"p0015\",\"client_type\":\"PC\",\"page_name\":\"FRS\",\"app_type\":\"13\",\"tpl_name\":\"9\",\"locator\":\"body\",\"load_type\":\"append\",\"first_screen\":false,\"url_type\":1,\"throw_type\":\"0\",\"url\":\"http:\\/\\/tieba.baidu.com\\/link?tbjump=lid%3D2812103809_37444_13_1525417__0%26url%3D6fecRF3k7lo7nHs1jNyDj9rUm_grCD2fnd5bEXIXuDwC1GrYQ5tGj7ugRvfKgim3KFPY_C7AlUPWkAZW1eV4jQf9zU4BlFot1FNk3EWOP6u1mM1CICRtUusA0rWIpem5uI2breIFVWAIIGeEUj8fY5s2YNOfcvG5q3FgU9PeAwgJt660PmSzYUVsNYqZmDi1iqH4JTyHlJM6o4rrPXtr9MqNWuU8Z_hqc3QD4-yzn5vJjedV_1TzDjb29lAAqsWRZ09trXqtrD0ca7QRpkkQGS6qPwZ9JvV6AXNTjR8qVHLYctDvXXxufW2S97F30puSjRDbEsVlbqsiapsPPEqNOxQyPiLzryqetnt0IhIw34ihmPtPcymRw3ymJ8ERA1an9g8xJV0crsPfrISvYXLKwhrKsH_UPQuhZyJNP0MC8UJjbV5IsGXLcahR8Dge3cBYshkHGD4gUPplf-0ryuNPYH_LzrudjKFlZ_UiEXzyvKwneti2M9xBgPF4l-QCypN6Rj2mC_WKo8xyeZIMPsqUUDEj6gnnaK08D4g1NhflhNCoa4CHIp7RE0fNkOS9TGUZkeUSeSwPeN_4gRWn4K2e9CmzZ4QVG3i_WOoeHvPtKm0AdNKh0ftTtIxtTxeTcMwi2KquK1cj7l_sHDOso-Ry2X8MOL0RAa68Ix87Ev7ASp4o9BtiuG2g0YJQvOFjb2u6jbpywAL2_tZwFTfzVDXMOmJk9C43vB15wV5C5vD79HS3wzZaqZvYeCN2_QfWYD7G_5lS_ZOovE3-KPiB5ACay4riez6KnQhP4Zo7IHnWEtxtHlgdpPS1FJUfKnX8RWctGCgy3VpMd0vt1furXKqo_CjWav-GQhCJ8b58KFTYaT1CYAHI5BSu9P0LLlkimeaUGPaFWBPCHXGOuRXeZNdBbvPq-M4kSGdTSGW9bE-jYMp-kWgga0rbgSRvwijGyTZJBQr_ruliBcyM2WOF1BkKl-NN6_TmskpWxzcAu1tKjix3qIT-7D3p6oS3Iw75eEhu0nUJMzpEzW0HuK9gqMzaSxlfiIwRSVV34joOCDVeCTfk3_HbA4Hjoa7Jwd9rGQ8WGqBPcn9NEJm2E_Eh1HZGa8-im3GL1UWuNqv5S1R7Yocp-VW58lhFxL_XtOV62grWdYShNs0D5vnVvJvt4e3NwP1hGeu3kyaxTFyzgxbg684b_DHpM0V7k0LbT5NElOGhEaLrWtvByf0jHGyWQpIHMch5gCnUqUFNCHeW2y2lamnGPDLXrk2_z0swHYpANyTBbH5A-X93DKjkw7x50tXYZZFuPOm8LBBLVdSnewfc1i17TwF4FtJMa9ET6Q8sgZdFwRnb5Ji5PEGN8nNXPKJDBGW2fnfw1Vephf1LSeIWyhU35MlpDLvappqws66i5bNeo0f1illHAgYyTd9JNhdr7NwStdZ9nC1iCnJA7QTSlPSUHGa4t2_omAJHbUcboHNpEwXOr67_5Z7ITEtMRxpu6voIJ0DLmkS1F6YYyudyLnWR6bxDxWFKmmn5ZBvuF8VdXzsMeMM8-ZE_lmIcfgmXSGAVtR4JfNbIhwP7AEzL9iCMb8kRn9JfGE3vDM0pl4jqTPaR3zlSOTokrI5N-62PA71kZZmfKwyORXJaOC6mRwl0QbhDCaYq-mIKv6wTBhAs8js5FFZWRj6oDM4GTz16bRM\",\"ios_url\":\"\",\"apk_url\":\"\",\"apk_name\":\"\",\"first_name\":\"\\u5185\\u5bb9\",\"second_name\":\"\\u5185\\u5bb9\",\"goods_info\":[{\"close_pic\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/ngmis\\/adsense\\/file_1420437480279.jpg\",\"content_pic\":\"https:\\/\\/tieba-ares.cdn.bcebos.com\\/mis\\/2024-7\\/1722218982882\\/be18352601b5.gif\",\"hover_pic\":\"https:\\/\\/tieba-ares.cdn.bcebos.com\\/mis\\/2024-7\\/1722218982882\\/be18352601b5.gif\",\"video_info\":[],\"id\":\"57920\",\"ad_source\":\"\",\"ad_source_name\":\"\\u8d34\\u5427\\u5206\\u53d1\",\"width\":0,\"height\":0,\"label_measure\":1}],\"cpid\":\"13\",\"abtest\":\"\",\"price\":10,\"plan_id\":1,\"user_id\":\"37676788\",\"ext_info\":\"1_0_0_0_GD_0_0_0_p0015_\\u6587\\u5b66_\\u5947\\u5e7b\\u00b7\\u7384\\u5e7b\\u5c0f\\u8bf4_\\u6e38\\u620f\\u5408\\u4f5c-\\u51e1\\u4eba\\u795e\\u5c06\\u4f203-\\u65b01-\\u7c7b\\u76ee_\\u5185\\u5bb9_\\u5185\\u5bb9_3764917512791838720_0_0_0_0_CPM_GD__2_0_G_eyJwbCI6IjM3NDQ0IiwidW4iOiI1NzkyMCIsInNlYXJjaF90aW1lIjoxNzIzMDg4ODEyLCJzZWFyY2hfaWQiOjM3NjQ5MTc1MTI3OTE4Mzg3MjAsInNpcCI6IjExMy44NC4xNjkuNDciLCJ1aWQiOm51bGwsImZvcnVtX2lkIjoxNTI1NDE3LCJmb3J1bV9kaXIiOiJcdTY1ODdcdTViNjYiLCJmb3J1bV9zZWNvbmRfZGlyIjoiXHU1OTQ3XHU1ZTdiXHUwMGI3XHU3Mzg0XHU1ZTdiXHU1YzBmXHU4YmY0IiwidHlwZWlkIjoiMDIwMCIsInBhZ2UiOiJGUlMiLCJleHQxIjpudWxsfQ==_0_\",\"search_id\":3764917512791838720,\"imTimeSign\":null,\"ad_tags\":[],\"verify\":\"54a98427fae982832e5de6216be14797\",\"raw_adurl\":\"http:\\/\\/gamein.baidu.com\\/game\\/link\\/jump?number=28\",\"pb_log\":{\"forum_id\":1525417,\"forum_name\":\"\\u76d7\\u5893\\u7b14\\u8bb0\",\"forum_dir\":\"\\u6587\\u5b66\",\"forum_second_dir\":\"\\u5947\\u5e7b\\u00b7\\u7384\\u5e7b\\u5c0f\\u8bf4\",\"click_url\":\"http:\\/\\/gamein.baidu.com\\/game\\/link\\/jump?number=28\",\"action_type\":2,\"client_type\":1,\"task\":\"tbda\",\"loc_param\":1,\"page\":2,\"location\":\"p0015\"},\"click_url_params\":\"lid%3D2812103809_37444_13_1525417__0%26url%3D6fecRF3k7lo7nHs1jNyDj9rUm_grCD2fnd5bEXIXuDwC1GrYQ5tGj7ugRvfKgim3KFPY_C7AlUPWkAZW1eV4jQf9zU4BlFot1FNk3EWOP6u1mM1CICRtUusA0rWIpem5uI2breIFVWAIIGeEUj8fY5s2YNOfcvG5q3FgU9PeAwgJt660PmSzYUVsNYqZmDi1iqH4JTyHlJM6o4rrPXtr9MqNWuU8Z_hqc3QD4-yzn5vJjedV_1TzDjb29lAAqsWRZ09trXqtrD0ca7QRpkkQGS6qPwZ9JvV6AXNTjR8qVHLYctDvXXxufW2S97F30puSjRDbEsVlbqsiapsPPEqNOxQyPiLzryqetnt0IhIw34ihmPtPcymRw3ymJ8ERA1an9g8xJV0crsPfrISvYXLKwhrKsH_UPQuhZyJNP0MC8UJjbV5IsGXLcahR8Dge3cBYshkHGD4gUPplf-0ryuNPYH_LzrudjKFlZ_UiEXzyvKwneti2M9xBgPF4l-QCypN6Rj2mC_WKo8xyeZIMPsqUUDEj6gnnaK08D4g1NhflhNCoa4CHIp7RE0fNkOS9TGUZkeUSeSwPeN_4gRWn4K2e9CmzZ4QVG3i_WOoeHvPtKm0AdNKh0ftTtIxtTxeTcMwi2KquK1cj7l_sHDOso-Ry2X8MOL0RAa68Ix87Ev7ASp4o9BtiuG2g0YJQvOFjb2u6jbpywAL2_tZwFTfzVDXMOmJk9C43vB15wV5C5vD79HS3wzZaqZvYeCN2_QfWYD7G_5lS_ZOovE3-KPiB5ACay4riez6KnQhP4Zo7IHnWEtxtHlgdpPS1FJUfKnX8RWctGCgy3VpMd0vt1furXKqo_CjWav-GQhCJ8b58KFTYaT1CYAHI5BSu9P0LLlkimeaUGPaFWBPCHXGOuRXeZNdBbvPq-M4kSGdTSGW9bE-jYMp-kWgga0rbgSRvwijGyTZJBQr_ruliBcyM2WOF1BkKl-NN6_TmskpWxzcAu1tKjix3qIT-7D3p6oS3Iw75eEhu0nUJMzpEzW0HuK9gqMzaSxlfiIwRSVV34joOCDVeCTfk3_HbA4Hjoa7Jwd9rGQ8WGqBPcn9NEJm2E_Eh1HZGa8-im3GL1UWuNqv5S1R7Yocp-VW58lhFxL_XtOV62grWdYShNs0D5vnVvJvt4e3NwP1hGeu3kyaxTFyzgxbg684b_DHpM0V7k0LbT5NElOGhEaLrWtvByf0jHGyWQpIHMch5gCnUqUFNCHeW2y2lamnGPDLXrk2_z0swHYpANyTBbH5A-X93DKjkw7x50tXYZZFuPOm8LBBLVdSnewfc1i17TwF4FtJMa9ET6Q8sgZdFwRnb5Ji5PEGN8nNXPKJDBGW2fnfw1Vephf1LSeIWyhU35MlpDLvappqws66i5bNeo0f1illHAgYyTd9JNhdr7NwStdZ9nC1iCnJA7QTSlPSUHGa4t2_omAJHbUcboHNpEwXOr67_5Z7ITEtMRxpu6voIJ0DLmkS1F6YYyudyLnWR6bxDxWFKmmn5ZBvuF8VdXzsMeMM8-ZE_lmIcfgmXSGAVtR4JfNbIhwP7AEzL9iCMb8kRn9JfGE3vDM0pl4jqTPaR3zlSOTokrI5N-62PA71kZZmfKwyORXJaOC6mRwl0QbhDCaYq-mIKv6wTBhAs8js5FFZWRj6oDM4GTz16bRM\",\"loc_index\":1},           /* 广告数据 */\n        'className': 'q540c81c36',     /* 广告定位器 */\n        'asyncHTML': '<div class=\\\"q540c81c36  clearfix\\\">\\n    <span class=\\\"label_text\\\">广告<\\/span>\\n    <img class=\\\"close_btn j_click_close\\\" src=\\\"https:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/ngmis\\/adsense\\/file_1420437480279.jpg\\\" data-locate=\\\"点击关闭\\\"\\/>\\n    <div>\\n        <a class=\\\"j_click_stats\\\" href=\\\"\\/link?client_type=pc_web&tbjump=lid%253D2812103809_37444_13_1525417__0%2526url%253D6fecRF3k7lo7nHs1jNyDj9rUm_grCD2fnd5bEXIXuDwC1GrYQ5tGj7ugRvfKgim3KFPY_C7AlUPWkAZW1eV4jQf9zU4BlFot1FNk3EWOP6u1mM1CICRtUusA0rWIpem5uI2breIFVWAIIGeEUj8fY5s2YNOfcvG5q3FgU9PeAwgJt660PmSzYUVsNYqZmDi1iqH4JTyHlJM6o4rrPXtr9MqNWuU8Z_hqc3QD4-yzn5vJjedV_1TzDjb29lAAqsWRZ09trXqtrD0ca7QRpkkQGS6qPwZ9JvV6AXNTjR8qVHLYctDvXXxufW2S97F30puSjRDbEsVlbqsiapsPPEqNOxQyPiLzryqetnt0IhIw34ihmPtPcymRw3ymJ8ERA1an9g8xJV0crsPfrISvYXLKwhrKsH_UPQuhZyJNP0MC8UJjbV5IsGXLcahR8Dge3cBYshkHGD4gUPplf-0ryuNPYH_LzrudjKFlZ_UiEXzyvKwneti2M9xBgPF4l-QCypN6Rj2mC_WKo8xyeZIMPsqUUDEj6gnnaK08D4g1NhflhNCoa4CHIp7RE0fNkOS9TGUZkeUSeSwPeN_4gRWn4K2e9CmzZ4QVG3i_WOoeHvPtKm0AdNKh0ftTtIxtTxeTcMwi2KquK1cj7l_sHDOso-Ry2X8MOL0RAa68Ix87Ev7ASp4o9BtiuG2g0YJQvOFjb2u6jbpywAL2_tZwFTfzVDXMOmJk9C43vB15wV5C5vD79HS3wzZaqZvYeCN2_QfWYD7G_5lS_ZOovE3-KPiB5ACay4riez6KnQhP4Zo7IHnWEtxtHlgdpPS1FJUfKnX8RWctGCgy3VpMd0vt1furXKqo_CjWav-GQhCJ8b58KFTYaT1CYAHI5BSu9P0LLlkimeaUGPaFWBPCHXGOuRXeZNdBbvPq-M4kSGdTSGW9bE-jYMp-kWgga0rbgSRvwijGyTZJBQr_ruliBcyM2WOF1BkKl-NN6_TmskpWxzcAu1tKjix3qIT-7D3p6oS3Iw75eEhu0nUJMzpEzW0HuK9gqMzaSxlfiIwRSVV34joOCDVeCTfk3_HbA4Hjoa7Jwd9rGQ8WGqBPcn9NEJm2E_Eh1HZGa8-im3GL1UWuNqv5S1R7Yocp-VW58lhFxL_XtOV62grWdYShNs0D5vnVvJvt4e3NwP1hGeu3kyaxTFyzgxbg684b_DHpM0V7k0LbT5NElOGhEaLrWtvByf0jHGyWQpIHMch5gCnUqUFNCHeW2y2lamnGPDLXrk2_z0swHYpANyTBbH5A-X93DKjkw7x50tXYZZFuPOm8LBBLVdSnewfc1i17TwF4FtJMa9ET6Q8sgZdFwRnb5Ji5PEGN8nNXPKJDBGW2fnfw1Vephf1LSeIWyhU35MlpDLvappqws66i5bNeo0f1illHAgYyTd9JNhdr7NwStdZ9nC1iCnJA7QTSlPSUHGa4t2_omAJHbUcboHNpEwXOr67_5Z7ITEtMRxpu6voIJ0DLmkS1F6YYyudyLnWR6bxDxWFKmmn5ZBvuF8VdXzsMeMM8-ZE_lmIcfgmXSGAVtR4JfNbIhwP7AEzL9iCMb8kRn9JfGE3vDM0pl4jqTPaR3zlSOTokrI5N-62PA71kZZmfKwyORXJaOC6mRwl0QbhDCaYq-mIKv6wTBhAs8js5FFZWRj6oDM4GTz16bRM&ie=utf-8&task=&locate=&page=&type=click&url=http%3A%2F%2Ftieba.baidu.com%2Ff%3Fkw%3D%25E7%259B%2597%25E5%25A2%2593%25E7%25AC%2594%25E8%25AE%25B0%26pn%3D0%3Fkw%3D%25E7%259B%2597%25E5%25A2%2593%25E7%25AC%2594%25E8%25AE%25B0%26pn%3D0&ie=utf-8&refer=&ie=utf-8&fid=&fname=&uid=&uname=&is_new_user=&tid=&_t=1723088812&obj_id=37444\\\" target=\\\"_blank\\\"  data-locate=\\\"点击跳转\\\" >\\n            <img class=\\\"hover_btn\\\" src=\\\"https:\\/\\/tieba-ares.cdn.bcebos.com\\/mis\\/2024-7\\/1722218982882\\/be18352601b5.gif\\\" data-hover=\\\"https:\\/\\/tieba-ares.cdn.bcebos.com\\/mis\\/2024-7\\/1722218982882\\/be18352601b5.gif\\\"\\/>\\n        <\\/a>\\n    <\\/div>\\n<\\/div>\\n\\n<style>\\n    div.q540c81c36 {\\n        position: fixed;\\n        right: 50%;\\n        top: 325px;\\n        width: 116px;\\n        overflow: hidden;\\n        margin-right: 508px;\\n        z-index: 1005;\\n        _position: absolute;\\n        _top: expression(documentElement.scrollTop+200);\\n    }\\n\\n    div.q540c81c36 div {\\n        vertical-align: top;\\n        width: 100%;\\n        height: 100%;\\n    }\\n\\n    div.q540c81c36 a {\\n        text-decoration: none;\\n    }\\n\\n    div.q540c81c36 .close_btn {\\n        position: relative;\\n        width: 17px;\\n        height: 18px;\\n        cursor: pointer;\\n        display: block;\\n        z-index: 300;\\n        left: 99px;\\n    }\\n\\n    div.q540c81c36 .label_text {\\n        position: absolute;\\n        height: 18px;\\n        right: 16px;\\n        line-height: 18px;\\n        background:#666;\\n        opacity:0.75;\\n        padding:0 3px;\\n        color:#fff;\\n    }\\n\\n    div.q540c81c36 .hover_btn {\\n        max-width: 116px;\\n        max-height: 225px;\\n        border: 0px;\\n    }\\n\\n<\\/style>\\n',     /* 异步加载的广告字符串 */\n        'isAsync': '1',         /* 是否为异步加载 */\n        'needStats': true                       /* 是否需要点击统计 */\n    }]);\n    // TODO 多次加载白名单，需要优化\n    _.Module.use('adsense-base/widget/loader', [{\n        'whiteList':[[\"http:\\/\\/fedev.baidu.com\"],[\"http:\\/\\/jiaoyu.baidu.com\"],[\"http:\\/\\/caifu.baidu.com\"],[\"http:\\/\\/jiankang.baidu.com\"],[\"http:\\/\\/tieba.dre8.com\"],[\"http:\\/\\/tdsp.nuomi.com\"],[\"http:\\/\\/baiju.baidu.com\"],[\"http:\\/\\/temai.baidu.com\"],[\"http:\\/\\/tieba.baidu.com\"],[\"http:\\/\\/zt.chuanke.com\"],[\"http:\\/\\/window.sturgeon.mopaas.com\"],[\"http:\\/\\/api.union.vip.com\"],[\"http:\\/\\/api.dongqiudi.com\"],[\"http:\\/\\/www.chuanke.com\"],[\"http:\\/\\/dcp.kuaizitech.com\\/\"]],\n        'adValue':{\"id\":\"37444\",\"name\":\"\\u6e38\\u620f\\u5408\\u4f5c-\\u51e1\\u4eba\\u795e\\u5c06\\u4f203-\\u65b01-\\u7c7b\\u76ee\",\"adv_type\":\"0\",\"typeid\":\"0200\",\"pos_name\":\"LEFT\",\"loc_code\":\"p0015\",\"client_type\":\"PC\",\"page_name\":\"FRS\",\"app_type\":\"13\",\"tpl_name\":\"9\",\"locator\":\"body\",\"load_type\":\"append\",\"first_screen\":false,\"url_type\":1,\"throw_type\":\"0\",\"url\":\"http:\\/\\/tieba.baidu.com\\/link?tbjump=lid%3D2812103809_37444_13_1525417__0%26url%3D6fecRF3k7lo7nHs1jNyDj9rUm_grCD2fnd5bEXIXuDwC1GrYQ5tGj7ugRvfKgim3KFPY_C7AlUPWkAZW1eV4jQf9zU4BlFot1FNk3EWOP6u1mM1CICRtUusA0rWIpem5uI2breIFVWAIIGeEUj8fY5s2YNOfcvG5q3FgU9PeAwgJt660PmSzYUVsNYqZmDi1iqH4JTyHlJM6o4rrPXtr9MqNWuU8Z_hqc3QD4-yzn5vJjedV_1TzDjb29lAAqsWRZ09trXqtrD0ca7QRpkkQGS6qPwZ9JvV6AXNTjR8qVHLYctDvXXxufW2S97F30puSjRDbEsVlbqsiapsPPEqNOxQyPiLzryqetnt0IhIw34ihmPtPcymRw3ymJ8ERA1an9g8xJV0crsPfrISvYXLKwhrKsH_UPQuhZyJNP0MC8UJjbV5IsGXLcahR8Dge3cBYshkHGD4gUPplf-0ryuNPYH_LzrudjKFlZ_UiEXzyvKwneti2M9xBgPF4l-QCypN6Rj2mC_WKo8xyeZIMPsqUUDEj6gnnaK08D4g1NhflhNCoa4CHIp7RE0fNkOS9TGUZkeUSeSwPeN_4gRWn4K2e9CmzZ4QVG3i_WOoeHvPtKm0AdNKh0ftTtIxtTxeTcMwi2KquK1cj7l_sHDOso-Ry2X8MOL0RAa68Ix87Ev7ASp4o9BtiuG2g0YJQvOFjb2u6jbpywAL2_tZwFTfzVDXMOmJk9C43vB15wV5C5vD79HS3wzZaqZvYeCN2_QfWYD7G_5lS_ZOovE3-KPiB5ACay4riez6KnQhP4Zo7IHnWEtxtHlgdpPS1FJUfKnX8RWctGCgy3VpMd0vt1furXKqo_CjWav-GQhCJ8b58KFTYaT1CYAHI5BSu9P0LLlkimeaUGPaFWBPCHXGOuRXeZNdBbvPq-M4kSGdTSGW9bE-jYMp-kWgga0rbgSRvwijGyTZJBQr_ruliBcyM2WOF1BkKl-NN6_TmskpWxzcAu1tKjix3qIT-7D3p6oS3Iw75eEhu0nUJMzpEzW0HuK9gqMzaSxlfiIwRSVV34joOCDVeCTfk3_HbA4Hjoa7Jwd9rGQ8WGqBPcn9NEJm2E_Eh1HZGa8-im3GL1UWuNqv5S1R7Yocp-VW58lhFxL_XtOV62grWdYShNs0D5vnVvJvt4e3NwP1hGeu3kyaxTFyzgxbg684b_DHpM0V7k0LbT5NElOGhEaLrWtvByf0jHGyWQpIHMch5gCnUqUFNCHeW2y2lamnGPDLXrk2_z0swHYpANyTBbH5A-X93DKjkw7x50tXYZZFuPOm8LBBLVdSnewfc1i17TwF4FtJMa9ET6Q8sgZdFwRnb5Ji5PEGN8nNXPKJDBGW2fnfw1Vephf1LSeIWyhU35MlpDLvappqws66i5bNeo0f1illHAgYyTd9JNhdr7NwStdZ9nC1iCnJA7QTSlPSUHGa4t2_omAJHbUcboHNpEwXOr67_5Z7ITEtMRxpu6voIJ0DLmkS1F6YYyudyLnWR6bxDxWFKmmn5ZBvuF8VdXzsMeMM8-ZE_lmIcfgmXSGAVtR4JfNbIhwP7AEzL9iCMb8kRn9JfGE3vDM0pl4jqTPaR3zlSOTokrI5N-62PA71kZZmfKwyORXJaOC6mRwl0QbhDCaYq-mIKv6wTBhAs8js5FFZWRj6oDM4GTz16bRM\",\"ios_url\":\"\",\"apk_url\":\"\",\"apk_name\":\"\",\"first_name\":\"\\u5185\\u5bb9\",\"second_name\":\"\\u5185\\u5bb9\",\"goods_info\":[{\"close_pic\":\"http:\\/\\/tb1.bdstatic.com\\/tb\\/cms\\/ngmis\\/adsense\\/file_1420437480279.jpg\",\"content_pic\":\"https:\\/\\/tieba-ares.cdn.bcebos.com\\/mis\\/2024-7\\/1722218982882\\/be18352601b5.gif\",\"hover_pic\":\"https:\\/\\/tieba-ares.cdn.bcebos.com\\/mis\\/2024-7\\/1722218982882\\/be18352601b5.gif\",\"video_info\":[],\"id\":\"57920\",\"ad_source\":\"\",\"ad_source_name\":\"\\u8d34\\u5427\\u5206\\u53d1\",\"width\":0,\"height\":0,\"label_measure\":1}],\"cpid\":\"13\",\"abtest\":\"\",\"price\":10,\"plan_id\":1,\"user_id\":\"37676788\",\"ext_info\":\"1_0_0_0_GD_0_0_0_p0015_\\u6587\\u5b66_\\u5947\\u5e7b\\u00b7\\u7384\\u5e7b\\u5c0f\\u8bf4_\\u6e38\\u620f\\u5408\\u4f5c-\\u51e1\\u4eba\\u795e\\u5c06\\u4f203-\\u65b01-\\u7c7b\\u76ee_\\u5185\\u5bb9_\\u5185\\u5bb9_3764917512791838720_0_0_0_0_CPM_GD__2_0_G_eyJwbCI6IjM3NDQ0IiwidW4iOiI1NzkyMCIsInNlYXJjaF90aW1lIjoxNzIzMDg4ODEyLCJzZWFyY2hfaWQiOjM3NjQ5MTc1MTI3OTE4Mzg3MjAsInNpcCI6IjExMy44NC4xNjkuNDciLCJ1aWQiOm51bGwsImZvcnVtX2lkIjoxNTI1NDE3LCJmb3J1bV9kaXIiOiJcdTY1ODdcdTViNjYiLCJmb3J1bV9zZWNvbmRfZGlyIjoiXHU1OTQ3XHU1ZTdiXHUwMGI3XHU3Mzg0XHU1ZTdiXHU1YzBmXHU4YmY0IiwidHlwZWlkIjoiMDIwMCIsInBhZ2UiOiJGUlMiLCJleHQxIjpudWxsfQ==_0_\",\"search_id\":3764917512791838720,\"imTimeSign\":null,\"ad_tags\":[],\"verify\":\"54a98427fae982832e5de6216be14797\",\"raw_adurl\":\"http:\\/\\/gamein.baidu.com\\/game\\/link\\/jump?number=28\",\"pb_log\":{\"forum_id\":1525417,\"forum_name\":\"\\u76d7\\u5893\\u7b14\\u8bb0\",\"forum_dir\":\"\\u6587\\u5b66\",\"forum_second_dir\":\"\\u5947\\u5e7b\\u00b7\\u7384\\u5e7b\\u5c0f\\u8bf4\",\"click_url\":\"http:\\/\\/gamein.baidu.com\\/game\\/link\\/jump?number=28\",\"action_type\":2,\"client_type\":1,\"task\":\"tbda\",\"loc_param\":1,\"page\":2,\"location\":\"p0015\"},\"click_url_params\":\"lid%3D2812103809_37444_13_1525417__0%26url%3D6fecRF3k7lo7nHs1jNyDj9rUm_grCD2fnd5bEXIXuDwC1GrYQ5tGj7ugRvfKgim3KFPY_C7AlUPWkAZW1eV4jQf9zU4BlFot1FNk3EWOP6u1mM1CICRtUusA0rWIpem5uI2breIFVWAIIGeEUj8fY5s2YNOfcvG5q3FgU9PeAwgJt660PmSzYUVsNYqZmDi1iqH4JTyHlJM6o4rrPXtr9MqNWuU8Z_hqc3QD4-yzn5vJjedV_1TzDjb29lAAqsWRZ09trXqtrD0ca7QRpkkQGS6qPwZ9JvV6AXNTjR8qVHLYctDvXXxufW2S97F30puSjRDbEsVlbqsiapsPPEqNOxQyPiLzryqetnt0IhIw34ihmPtPcymRw3ymJ8ERA1an9g8xJV0crsPfrISvYXLKwhrKsH_UPQuhZyJNP0MC8UJjbV5IsGXLcahR8Dge3cBYshkHGD4gUPplf-0ryuNPYH_LzrudjKFlZ_UiEXzyvKwneti2M9xBgPF4l-QCypN6Rj2mC_WKo8xyeZIMPsqUUDEj6gnnaK08D4g1NhflhNCoa4CHIp7RE0fNkOS9TGUZkeUSeSwPeN_4gRWn4K2e9CmzZ4QVG3i_WOoeHvPtKm0AdNKh0ftTtIxtTxeTcMwi2KquK1cj7l_sHDOso-Ry2X8MOL0RAa68Ix87Ev7ASp4o9BtiuG2g0YJQvOFjb2u6jbpywAL2_tZwFTfzVDXMOmJk9C43vB15wV5C5vD79HS3wzZaqZvYeCN2_QfWYD7G_5lS_ZOovE3-KPiB5ACay4riez6KnQhP4Zo7IHnWEtxtHlgdpPS1FJUfKnX8RWctGCgy3VpMd0vt1furXKqo_CjWav-GQhCJ8b58KFTYaT1CYAHI5BSu9P0LLlkimeaUGPaFWBPCHXGOuRXeZNdBbvPq-M4kSGdTSGW9bE-jYMp-kWgga0rbgSRvwijGyTZJBQr_ruliBcyM2WOF1BkKl-NN6_TmskpWxzcAu1tKjix3qIT-7D3p6oS3Iw75eEhu0nUJMzpEzW0HuK9gqMzaSxlfiIwRSVV34joOCDVeCTfk3_HbA4Hjoa7Jwd9rGQ8WGqBPcn9NEJm2E_Eh1HZGa8-im3GL1UWuNqv5S1R7Yocp-VW58lhFxL_XtOV62grWdYShNs0D5vnVvJvt4e3NwP1hGeu3kyaxTFyzgxbg684b_DHpM0V7k0LbT5NElOGhEaLrWtvByf0jHGyWQpIHMch5gCnUqUFNCHeW2y2lamnGPDLXrk2_z0swHYpANyTBbH5A-X93DKjkw7x50tXYZZFuPOm8LBBLVdSnewfc1i17TwF4FtJMa9ET6Q8sgZdFwRnb5Ji5PEGN8nNXPKJDBGW2fnfw1Vephf1LSeIWyhU35MlpDLvappqws66i5bNeo0f1illHAgYyTd9JNhdr7NwStdZ9nC1iCnJA7QTSlPSUHGa4t2_omAJHbUcboHNpEwXOr67_5Z7ITEtMRxpu6voIJ0DLmkS1F6YYyudyLnWR6bxDxWFKmmn5ZBvuF8VdXzsMeMM8-ZE_lmIcfgmXSGAVtR4JfNbIhwP7AEzL9iCMb8kRn9JfGE3vDM0pl4jqTPaR3zlSOTokrI5N-62PA71kZZmfKwyORXJaOC6mRwl0QbhDCaYq-mIKv6wTBhAs8js5FFZWRj6oDM4GTz16bRM\",\"loc_index\":1}    }]);\n});</script><code class=\"pagelet_html\" id=\"pagelet_html_common/pagelet/temptrack\" style=\"display:none;\"><!--\n--></code><script>Bigpipe.register(\"common/pagelet/temptrack\", {\"parent\":\"\",\"scripts\":[],\"styles\":[]}).then(function(pagelet){    // TODO: 临时打点统计\n    function trackTemp(locate, task, page, type, extra) {\n        if (page && typeof page == 'object') {\n            extra = page;\n            page = '';\n        }\n        if (type && typeof type == 'object') {\n            extra = type;\n            type = '';\n        }\n        if (document.images) { //document.images永远为true，判断对img或者js的支持吗\n            var img = new Image();\n            window[\"bd_pv_\" + (new Date().getTime())] = img;\n            var trackUrl = \"https://gsp0.\" + \"baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/img/track.gif?\"; //统计发送URL\n            var paramArr = [\n                \"client_type=pc_web\", //普通PC版本\n                \"task=\" + (task && encodeURIComponent(task) || \"\"), //不同的icafe项目\n                \"locate=\" + (locate && encodeURIComponent(locate) || \"\"), //标示参数名称\n                \"type=\" + (type && encodeURIComponent(type) || \"click\"), //如果type为空，则type=click\n                \"url=\" + encodeURIComponent(document.location.href), //当前页面URL\n                \"refer=\" + encodeURIComponent(document.referrer) //当前页面refer\n            ];\n            if (PageData) { //页面数据全局变量\n                paramArr.push(\"page=\" + (page || PageData.page || \"\")); //页面标示 frs|pb\n                if (PageData.forum) { //判断吧信息是否存在\n                    paramArr.push(\"fid=\" + (PageData.forum.id || \"\")); //吧ID\n                    paramArr.push(\"fname=\" + encodeURIComponent(PageData.forum.name || \"\")); //吧名\n                }\n                if (PageData.user) { //用户信息是否存在\n                    paramArr.push(\"uid=\" + (PageData.user.id || \"\")); // 用户ID\n                    paramArr.push(\"uname=\" + encodeURIComponent(PageData.user.name || \"\")); //用户名\n                    paramArr.push(\"is_new_user=\" + (PageData.user.is_new_user || \"\")); //是否新用户\n                }\n                if (PageData.thread) { //主题信息是否存在 一般在pb页才会有此变量\n                    paramArr.push(\"tid=\" + ((PageData.thread && PageData.thread.thread_id) || \"\")); //贴子ID\n                }\n            }\n\n            // 添加扩展属性\n            for (var i in extra) {\n                if (extra.hasOwnProperty(i)) {\n                    paramArr.push(i + \"=\" + encodeURIComponent(extra[i]));\n                }\n            }\n\n            //发送统计参数\n            trackUrl += paramArr.join(\"&\");\n            //发送统计\n            img.src = trackUrl + \"&t=\" + new Date().getTime();\n            img = null;\n        }\n    }\n    var isLu = 1;\n    if (isLu) {\n        trackTemp('lu_frs_' + 'default', 'lu广告', 'frs', 'show');\n    }\n});</script><code class=\"pagelet_html\" id=\"pagelet_html_poster/pagelet/rich_poster\" style=\"display:none;\"><!--\n\n\n\n\n<a name=\"sub\"></a>\n<div id=\"tb_rich_poster_container\" class=\"tb_rich_poster_container\">\n    <div id=\"rich_ueditor_tpl\">\n        <div id=\"tb_rich_poster\" class=\"tb_rich_poster\">\n            <div class=\"j_bubble_container\"></div>\n\n\n                        <div class=\"poster_head clearfix\">\n                <div class=\"poster_head_text\">\n                                            <a class=\"add_thread_btn post_head_btn cur\" title=\"发表新贴\" href=\"javascript:;\"><span class=\"post_head_btn_icon post_head_btn_icon_post\"></span>发表新贴</a>\n\n\n\n\n                                                <a class=\"add_vote_btn post_head_btn\" title=\"发起投票\" target=\"_blank\" href=\"/newvote/createvote?kw=%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&ie=utf-8\"><span  class=\"post_head_btn_icon post_head_btn_icon_vote\"></span>发起投票</a>\n\n                </div>\n\n                                <div class=\"poster_head_surveillance j_surveillance\">\n                    发贴请遵守 <a href=\"/tb/eula.html\" target=\"_blank\" onclick=\"$.stats.track('post_agreement', 'poster')\">贴吧协议及“七条底线”</a>\n\t\t\t\t\t<a href=\"javascript:;\" id=\"frs_footer_tieba_report\" class=\"btn_tousu fr post_head_tousu\" data-checkun=\"un\">贴吧投诉</a>                    <button type=\"button\" class=\"poster_disable_float j_disable_float\" title=\"停止浮动\">停止浮动</button>\n                </div>\n            </div>\n\n\n\n\n\n\n\n\n\t\t\t<div class=\"poster_body editor_wrapper\">\n                                <div class=\"poster_component title_container\">\n                    <div class=\"poster_title\">标&nbsp;&nbsp;题:</div>\n                    <div class=\"j_title_wrap\">\n                        <input type=\"text\" class=\"editor_textfield editor_title ui_textfield j_title j_topic_sug_input\" name=\"title\" autocomplete=\"off\" />\n                        <span class=\"topic_add_btn j_topic_add_btn\"></span>\n                        <p class=\"fullscreen-word-limit\"><span class=\"fullscreen-limit j-fullscreen-wl\">0</span>/30</p>\n                    </div>\n                    <div class=\"poster_error j_error\"></div>\n                </div>\n\n\n                                <div class=\"poster_component editor_content_wrapper ueditor_container\">\n                    <div class=\"poster_reply\">内&nbsp;&nbsp;容:</div>\n                    <div class=\"old_style_wrapper\">\n                        <div id=\"ueditor_replace\" style=\"width: 700px; height: 220px;\"></div>\n                    </div>\n                    <div class=\"poster_error j_error\"></div>\n                </div>\n\n                                <div class=\"j_poster_share poster_share\">\n                                <label><input type=\"checkbox\" class=\"j_use_share\"/> 发表后自动分享本贴</label>\n\n                </div>\n\n                                <div class=\"j_poster_signature poster_signature\">\n                    <label><input type=\"checkbox\" class=\"j_use_signature\"/> 使用签名档</label>&nbsp;\n                    <span class=\"j_signature_wrapper signature_wrapper\">\n                        <select name=\"sign_id\" class='j_sign_id'>\n\n                        </select>\n                        &nbsp;<a style=\"color:#0449BE\" target=\"_blank\" href=\"/i/sys/jump?type=signsetting\">查看全部</a>\n                    </span>\n                </div>\n\n\n\n                                <div class=\"poster_component editor_bottom_panel clearfix\">\n                    <div class=\"j_floating\">\n                        <button class=\"btn_default btn_middle j_submit poster_submit\" title=\"Ctrl+Enter快捷发表\">\n                            发 表\n                        </button>\n                        <span class=\"poster_posting_status j_posting_status\"></span>\n\n                        <div class=\"poster_draft_status j_draft\" style=\"display: none;\">\n                            <span class=\"j_content\"></span>\n                            <span title=\"清空草稿\" class=\"poster_draft_delete j_clear\"></span>\n                        </div>\n                        <button class=\"btn_sub btn_middle j_clear_fullscreen poster_clear_fullscreen\" title=\"\">\n                            退 出\n                        </button>\n                    </div>\n                </div>\n\n            </div>\n\n\n\n                                </div>\n    </div>\n</div>\n<div class=\"homeworks_guide\">\n        <div class=\"homeworks_guide_wrapper\">\n            <div class=\"homeworks_guide_header\">\n                <span class=\"homeworks_guide_delete\"></span>\n            </div>\n            <div class=\"homeworks_guide_content\">\n                <div class=\"homeworks-declare-list\">\n                    <div class=\"declare-item\">\n                        全新创作体验，视频号专属发布器最高可支持2G视频上传\n                    </div>\n                    <div class=\"declare-item\">\n                        尊享创作权益，开通即享创作中心全部服务\n                    </div>\n                    <div class=\"declare-item\">\n                        专属流量扶持，优质视频内容可获得更多曝光机会\n                    </div>\n                    <div class=\"declare-item\">\n                        现金收益机会，可参与丰富视频激励活动，优质原创更有机会加入分润计划\n                    </div>\n                </div>\n                <div class=\"account-status\"> </div>\n            </div>\n            <div class=\"homeworks_guide_bottom\">\n                <div class=\"btn-goAhead\"> </div>\n            </div>\n        </div>\n</div>\n--></code><script>Bigpipe.register(\"poster/pagelet/rich_poster\", {\"parent\":\"frs-footer\\/pagelet\\/content_footer\",\"scripts\":[\"\\/tb\\/_\\/poster\\/rich_poster_af27300.js\",\"\\/tb\\/_\\/placeholder_fd56d8e.js\",\"\\/tb\\/_\\/login_dialog_8cc35e4.js\",\"\\/tb\\/_\\/show_dialog_d46d0a5.js\",\"\\/tb\\/_\\/sms_verify_dialog_dda5cb3.js\",\"\\/tb\\/_\\/forbidden_ea6d3fd.js\",\"\\/tb\\/_\\/poster\\/poster_context_f5d84a8.js\",\"\\/tb\\/_\\/snowflow_15135cd.js\",\"\\/tb\\/_\\/verify_dialog_99c29ad.js\",\"\\/tb\\/_\\/login_verify_check_b14011e.js\",\"\\/tb\\/_\\/tdou_open_type_a72e1ed.js\",\"\\/tb\\/_\\/global_switch_6dfeb89.js\",\"\\/tb\\/_\\/user_api_10e048c.js\",\"\\/tb\\/_\\/icons_983b4c0.js\",\"\\/tb\\/_\\/base_user_data_ff57bd7.js\",\"\\/tb\\/_\\/base_dialog_user_bar_6dc620e.js\",\"\\/tb\\/_\\/qianbao_cashier_dialog_aa111c7.js\",\"\\/tb\\/_\\/qianbao_purchase_member_fad1d66.js\",\"\\/tb\\/_\\/messenger_e5c0696.js\",\"\\/tb\\/_\\/cashier_dialog_d52cf7c.js\",\"\\/tb\\/_\\/pay_member_c57f92d.js\",\"\\/tb\\/_\\/poster\\/post_signature_1e1cc52.js\",\"\\/tb\\/_\\/poster\\/mouse_pwd_355b0e7.js\",\"\\/tb\\/_\\/tbcopy_f4f2e14.js\",\"\\/tb\\/_\\/tbshare_share_61f1525.js\",\"\\/tb\\/_\\/poster\\/share_thread_c8aa28c.js\",\"\\/tb\\/_\\/vip_dialog_4757845.js\",\"\\/tb\\/_\\/poster\\/jiyan_service_e407177.js\",\"\\/tb\\/_\\/poster\\/acs_sdk_2c411c0.js\",\"\\/tb\\/_\\/poster\\/bsk_service_c6680a4.js\",\"\\/tb\\/_\\/poster\\/params_xss_handler_2083372.js\",\"\\/tb\\/_\\/rsa_safe_ffe2fa7.js\",\"\\/tb\\/_\\/paykey_safe_payment_f7a973d.js\",\"\\/tb\\/_\\/captcha_d99d16f.js\",\"\\/tb\\/_\\/captcha_dialog_ceaacd2.js\",\"\\/tb\\/_\\/captcha_safe_payment_7f700b4.js\",\"\\/tb\\/_\\/mobile_safe_payment_b2a273c.js\",\"\\/tb\\/_\\/tbean_safe_3668241.js\",\"\\/tb\\/_\\/tbean_safe_ajax_5dbae2e.js\",\"\\/tb\\/_\\/tdou_data_747c462.js\",\"\\/tb\\/_\\/umoney_1379f71.js\",\"\\/tb\\/_\\/tdou_template_8d6b3f6.js\",\"\\/tb\\/_\\/tdou_builder_05260c9.js\",\"\\/tb\\/_\\/tdou_view_operation_bootstrap_4a983b5.js\",\"\\/tb\\/_\\/tdou_view_cashier_6afe462.js\",\"\\/tb\\/_\\/qianbao_purchase_tdou_f4c69c0.js\",\"\\/tb\\/_\\/tdou_view_util_d282db0.js\",\"\\/tb\\/_\\/tdou_view_auto_redirect_a353d12.js\",\"\\/tb\\/_\\/umoney_query_e6ef23a.js\",\"\\/tb\\/_\\/tdou_view_check_f11908d.js\",\"\\/tb\\/_\\/tdou_counter_cbe5c8a.js\",\"\\/tb\\/_\\/tdou_view_fec0b7b.js\",\"\\/tb\\/_\\/tdou_3289666.js\",\"\\/tb\\/_\\/payment_dialog_title_3e773b9.js\",\"\\/tb\\/_\\/tdou_get_38af9fd.js\",\"\\/tb\\/_\\/tcharge_dialog_5da22d7.js\",\"\\/tb\\/_\\/tool_696c6e8.js\",\"\\/tb\\/_\\/loader_334189d.js\",\"\\/tb\\/_\\/tpl_async_15_395293f.js\",\"\\/tb\\/_\\/loader_630632a.js\",\"\\/tb\\/_\\/like_tip_30c30f5.js\",\"\\/tb\\/_\\/poster\\/post_service_7e89b7f.js\",\"\\/tb\\/_\\/poster\\/topic_suggestion_4827396.js\",\"\\/tb\\/_\\/poster\\/post_prefix_3837331.js\",\"\\/tb\\/_\\/word_limit_c30df3b.js\",\"\\/tb\\/_\\/poster\\/post_manager_968b3bd.js\",\"\\/tb\\/_\\/complaint_bar_owner_4d7fe74.js\",\"\\/tb\\/_\\/bubble_tip_d34e792.js\",\"\\/tb\\/_\\/poster\\/rich_poster_3b91269.js\",\"\\/tb\\/_\\/ueditor_base_0429a62.js\",\"\\/tb\\/_\\/ueditor_extend_base_29960fa.js\",\"\\/tb\\/_\\/background_3047546.js\",\"\\/tb\\/_\\/auto_link_e48bd2b.js\",\"\\/tb\\/_\\/tb_gram_a17c017.js\",\"\\/tb\\/_\\/slide_select_d3198f9.js\",\"\\/tb\\/_\\/image_flash_editor_96f9f79.js\",\"\\/tb\\/_\\/scroll_panel_0150f9a.js\",\"\\/tb\\/_\\/image_exif_c652bbe.js\",\"\\/tb\\/_\\/image_uploader_e55f86f.js\",\"\\/tb\\/_\\/image_uploader_manager_87db6b6.js\",\"\\/tb\\/_\\/picture_uploader_015fc91.js\",\"\\/tb\\/_\\/picture_selector_a7a74fa.js\",\"\\/tb\\/_\\/picture_web_selector_fb3ca86.js\",\"\\/tb\\/_\\/picture_9b797b7.js\",\"\\/tb\\/_\\/custom_emotion_24326d5.js\",\"\\/tb\\/_\\/ueditor_emotion_f766931.js\",\"\\/tb\\/_\\/emotion_4add196.js\",\"\\/tb\\/_\\/ueditor_video_ee19152.js\",\"\\/tb\\/_\\/video_ae09aec.js\",\"\\/tb\\/_\\/sketchpad_09fb038.js\",\"\\/tb\\/_\\/scrawl_c272503.js\",\"\\/tb\\/_\\/conversion_c45e2c6.js\",\"\\/tb\\/_\\/ueditor_plugin_8a98cb9.js\",\"\\/tb\\/_\\/createplugin_2b644b7.js\",\"\\/tb\\/_\\/jquery_caret_2d51110.js\",\"\\/tb\\/_\\/ueditor_topic_e81e6a5.js\",\"\\/tb\\/_\\/topic_09c6508.js\",\"\\/tb\\/_\\/topic_suggestion_9bb3805.js\",\"\\/tb\\/_\\/fullscreen_9b3dd34.js\",\"\\/tb\\/_\\/height_limit_e4b1ffa.js\",\"\\/tb\\/_\\/draft_91a3223.js\",\"\\/tb\\/_\\/at_68fdde7.js\",\"\\/tb\\/_\\/counter_d482e1c.js\",\"\\/tb\\/_\\/word_limit_0f6ca1b.js\",\"\\/tb\\/_\\/join_vip_dialog_9242ef7.js\",\"\\/tb\\/_\\/props_data_2514f70.js\",\"\\/tb\\/_\\/bubble_factory_7dfcd8d.js\",\"\\/tb\\/_\\/post_setting_0ce6f36.js\",\"\\/tb\\/_\\/setting_399fe30.js\",\"\\/tb\\/_\\/pay_util_e0a3684.js\",\"\\/tb\\/_\\/medal_564d2e8.js\",\"\\/tb\\/_\\/paypost_data_70c1ba1.js\",\"\\/tb\\/_\\/paypost_agree_dialog_a4c48b3.js\",\"\\/tb\\/_\\/paypost_editor_0f1bdd5.js\",\"\\/tb\\/_\\/paypost_867d76a.js\",\"\\/tb\\/_\\/poster\\/homeworks_guide_2fc1a96.js\"],\"styles\":[\"\\/tb\\/_\\/poster\\/rich_poster_bdf4ace.css\",\"\\/tb\\/_\\/placeholder_7eb7ce6.css\",\"\\/tb\\/_\\/login_dialog_8bacf9a.css\",\"\\/tb\\/_\\/sms_verify_dialog_fd6ce50.css\",\"\\/tb\\/_\\/forbidden_752e552.css\",\"\\/tb\\/_\\/snowflow_45a89bb.css\",\"\\/tb\\/_\\/verify_dialog_c5dd6ff.css\",\"\\/tb\\/_\\/icons_fba8214.css\",\"\\/tb\\/_\\/base_user_data_f665ab7.css\",\"\\/tb\\/_\\/base_dialog_user_bar_69fdf18.css\",\"\\/tb\\/_\\/qianbao_cashier_dialog_179e56e.css\",\"\\/tb\\/_\\/qianbao_purchase_member_264deea.css\",\"\\/tb\\/_\\/cashier_dialog_0d74ed0.css\",\"\\/tb\\/_\\/pay_member_d41d8cd.css\",\"\\/tb\\/_\\/tbshare_share_4a2fcf9.css\",\"\\/tb\\/_\\/poster\\/share_thread_cbacfa9.css\",\"\\/tb\\/_\\/vip_dialog_1fbc601.css\",\"\\/tb\\/_\\/paykey_safe_payment_8f2a8db.css\",\"\\/tb\\/_\\/captcha_30e4d3c.css\",\"\\/tb\\/_\\/captcha_safe_payment_d41d8cd.css\",\"\\/tb\\/_\\/mobile_safe_payment_77949bb.css\",\"\\/tb\\/_\\/tbean_safe_3c779a3.css\",\"\\/tb\\/_\\/tbean_safe_ajax_d41d8cd.css\",\"\\/tb\\/_\\/umoney_f12b09a.css\",\"\\/tb\\/_\\/tdou_template_781e4d0.css\",\"\\/tb\\/_\\/qianbao_purchase_tdou_4b31f54.css\",\"\\/tb\\/_\\/umoney_query_d15a716.css\",\"\\/tb\\/_\\/tdou_d41d8cd.css\",\"\\/tb\\/_\\/payment_dialog_title_5433211.css\",\"\\/tb\\/_\\/tdou_get_4b2272d.css\",\"\\/tb\\/_\\/tcharge_dialog_a6fd677.css\",\"\\/tb\\/_\\/like_tip_212132e.css\",\"\\/tb\\/_\\/poster\\/topic_suggestion_c9a8071.css\",\"\\/tb\\/_\\/word_limit_3c5481d.css\",\"\\/tb\\/_\\/complaint_bar_owner_3dd0d03.css\",\"\\/tb\\/_\\/bubble_tip_17a9ec9.css\",\"\\/tb\\/_\\/poster\\/rich_poster_e538a98.css\",\"\\/tb\\/_\\/ueditor_base_05cf71f.css\",\"\\/tb\\/_\\/ueditor_extend_base_d41d8cd.css\",\"\\/tb\\/_\\/background_c5ba91f.css\",\"\\/tb\\/_\\/tb_gram_d41d8cd.css\",\"\\/tb\\/_\\/slide_select_51d60fb.css\",\"\\/tb\\/_\\/image_flash_editor_8f43e09.css\",\"\\/tb\\/_\\/scroll_panel_eb74727.css\",\"\\/tb\\/_\\/picture_uploader_7e6cefb.css\",\"\\/tb\\/_\\/picture_web_selector_0a5ad73.css\",\"\\/tb\\/_\\/picture_59387e8.css\",\"\\/tb\\/_\\/custom_emotion_2d0490a.css\",\"\\/tb\\/_\\/ueditor_emotion_a5eeac8.css\",\"\\/tb\\/_\\/ueditor_video_8a30209.css\",\"\\/tb\\/_\\/sketchpad_cf60180.css\",\"\\/tb\\/_\\/scrawl_5840a35.css\",\"\\/tb\\/_\\/ueditor_plugin_4746834.css\",\"\\/tb\\/_\\/ueditor_topic_bb19767.css\",\"\\/tb\\/_\\/topic_suggestion_3234253.css\",\"\\/tb\\/_\\/fullscreen_f64a424.css\",\"\\/tb\\/_\\/at_d03b8c9.css\",\"\\/tb\\/_\\/post_setting_f022292.css\",\"\\/tb\\/_\\/setting_e918b32.css\",\"\\/tb\\/_\\/medal_456b3c6.css\",\"\\/tb\\/_\\/paypost_agree_dialog_fd57709.css\",\"\\/tb\\/_\\/paypost_editor_6f603a5.css\",\"\\/tb\\/_\\/poster\\/homeworks_guide_ab48ea2.css\"]}).then(function(pagelet){if (!window.PosterContext) {\n_.Module.use('poster/widget/poster_context', [{\n    blockInfo: {\n        is_block : 0,\n        block_reason:'',\n        opgroup : '',\n        days_tofree:0,\n        block_errno: '0'\n    }\n}], function() {\n    PosterContext.loadContextFromPageData($.extend({},PageData,{\n        user:{\n                        id: PageData.user.id,\n            name: PageData.user.name,\n            level: 1,\n            isFavorForum: 0,\n            isLogin: !!PageData.user.is_login,\n            isBlocked: 0,\n            isBlack: 0,\n            noUsername: !!PageData.user.no_un,\n            canPost: 0,\n            canVote: 0,\n            forbidFlag: 0,\n            signNumber: 0,\n            superboy: \"\",\n            memberLevel: 0        },\n        is_zone_forum: \"0\",\n        is_user_has_zone_right: \"0\",\n    }));\n    PosterContext.loadAuthorities({\"img_num\":50,\"video_num\":1,\"smiley_num\":50,\"white_list\":[\"http:\\/\\/www.tudou.com\\/\",\"http:\\/\\/v.blog.sohu.com\\/\",\"http:\\/\\/tv.sohu.com\\/\",\"http:\\/\\/share.vrs.sohu.com\\/\",\"http:\\/\\/my.tv.sohu.com\\/\",\"http:\\/\\/player.56.com\\/\",\"http:\\/\\/www.56.com\\/\",\"http:\\/\\/kankanews.com\\/\",\"http:\\/\\/video6.smgbb.cn\\/\",\"http:\\/\\/www.youku.com\\/\",\"http:\\/\\/player.youku.com\\/\",\"http:\\/\\/static.youku.com\\/\",\"http:\\/\\/www.ku6.com\\/\",\"http:\\/\\/player.ku6.com\\/\",\"http:\\/\\/video.sina.com.cn\\/\",\"http:\\/\\/vhead.blog.sina.com.cn\\/\",\"http:\\/\\/you.video.sina.com.cn\\/\",\"http:\\/\\/video.qq.com\\/\",\"http:\\/\\/www.baidu.com\\/\",\"http:\\/\\/box.baidu.com\\/\",\"http:\\/\\/hi.baidu.com\\/\",\"http:\\/\\/mv.baidu.com\\/\",\"http:\\/\\/mvimg.baidu.com\\/\",\"http:\\/\\/mvideo.baidu.com\\/\",\"http:\\/\\/player.cntv.cn\\/\",\"http:\\/\\/player.xiyou.cntv.cn\\/\",\"http:\\/\\/www.yinyuetai.com\\/\",\"http:\\/\\/player.yinyuetai.com\\/\",\"http:\\/\\/www.aipai.com\\/\",\"http:\\/\\/www.cutv.com\\/\",\"http:\\/\\/player.cutv.com\\/\",\"http:\\/\\/www.pptv.com\\/\",\"http:\\/\\/v.pptv.com\\/\",\"http:\\/\\/www.letv.com\\/\",\"http:\\/\\/www.iqiyi.com\\/\",\"http:\\/\\/yule.iqiyi.com\\/\",\"http:\\/\\/player.video.qiyi.com\\/\",\"http:\\/\\/www.ifeng.com\\/\",\"http:\\/\\/s.v.ifeng.com\\/\",\"http:\\/\\/v.ifeng.com\\/\",\"http:\\/\\/www.m1905.com\\/\",\"http:\\/\\/www.joy.cn\\/\",\"http:\\/\\/client.joy.cn\\/\",\"http:\\/\\/www.molihe.com\\/\",\"http:\\/\\/mv.molihe.com\\/\",\"http:\\/\\/swf.molihe.com\\/\",\"http:\\/\\/www.baomihua.com\\/\",\"http:\\/\\/video.baomihua.com\\/\",\"http:\\/\\/www.ouou.com\\/\",\"http:\\/\\/flash.ouou.com\\/\",\"http:\\/\\/dv.ouou.com\\/\",\"http:\\/\\/misc.home.news.cn\\/\",\"http:\\/\\/www.news.cn\\/\",\"http:\\/\\/www.wasu.cn\\/\",\"http:\\/\\/play1.wasu.cn\\/\",\"http:\\/\\/play.wasu.cn\\/\",\"http:\\/\\/v.iask.com\\/\",\"http:\\/\\/i7.imgs.letv.com\\/\",\"http:\\/\\/static.video.qq.com\\/\",\"http:\\/\\/player.pptv.com\\/\",\"http:\\/\\/v.pps.tv\\/\",\"http:\\/\\/ipd.pps.tv\\/\",\"http:\\/\\/www.funshion.com\\/\",\"http:\\/\\/player.pps.tv\\/\",\"http:\\/\\/api.funshion.com\\/\",\"http:\\/\\/www.hunantv.com\\/\",\"http:\\/\\/video.brtn.cn\",\"http:\\/\\/news.brtn.cn\\/\",\"http:\\/\\/life.brtn.cn\\/\",\"http:\\/\\/mil.brtn.cn\\/\",\"http:\\/\\/finance.brtn.cn\\/\",\"http:\\/\\/btv.brtn.cn\\/\",\"http:\\/\\/host.brtn.cn\\/\",\"http:\\/\\/zmbj.brtn.cn\\/\",\"http:\\/\\/www.brtn.cn\\/\",\"http:\\/\\/ent.brtn.cn\\/\",\"http:\\/\\/sports.brtn.cn\\/\",\"http:\\/\\/legal.brtn.cn\\/\",\"http:\\/\\/tv.brtn.cn\\/\",\"http:\\/\\/iptv.brtn.cn\\/\",\"http:\\/\\/yst.brtn.cn\\/\",\"http:\\/\\/pxgw.brtn.cn\\/\",\"http:\\/\\/zcmx.brtn.cn\\/\",\"http:\\/\\/zhanbo.brtn.cn\\/\",\"http:\\/\\/app.brtn.cn\\/\",\"http:\\/\\/search.brtn.cn\\/\",\"http:\\/\\/itv.brtn.cn\\/\",\"http:\\/\\/www.meipai.com\\/\",\"http:\\/\\/www.acfun.tv\\/\",\"https:\\/\\/ssl.acfun.tv\\/\",\"http:\\/\\/m.acfun.tv\\/\",\"http:\\/\\/www.bilibili.com\\/\",\"http:\\/\\/share.acg.tv\\/\",\"http:\\/\\/static.hdslb.com\\/\",\"http:\\/\\/bangumi.bilibili.com\"],\"is_readonly\":0,\"can_local_upload\":null,\"paypost\":\"1\",\"music_num\":10,\"attachment_num\":5,\"attachment_size\":209715200,\"long_editor\":false,\"float_editor\":\"\",\"custom_emotion\":false,\"emotion_transform\":false,\"tb_gram\":false,\"formula_editor\":\"\"});\n});\n}\n\t_.Module.use('ueditor/widget/ueditor_base', [{userInfo: {\"is_login\":false,\"user_id\":0,\"user_name\":\"\",\"no_un\":false,\"mobile\":\"\",\"email\":\"\",\"ipv6\":\"\",\"is_new_user\":1,\"portrait\":\"00000000\",\"start_time\":1723088812,\"frs_login_switch\":false,\"interaction_switch\":false,\"login_day\":5,\"creator_perm\":0,\"is_videocreator\":false,\"pop_up_info\":null,\"is_business_account\":0,\"is_uc_account\":0,\"login_popup_phone_switch\":0,\"no_login_user_browse_switch\":0}}]);\n_.Module.use('ueditor/widget/ueditor_extend_base');\n_.Module.use('ueditor/widget/background', [UE, EditorUI]);\n_.Module.use('ueditor/widget/auto_link', [UE, EditorUI]);\n_.Module.use('ueditor/widget/picture', [UE, EditorUI, {\n\tprops: {\n\t\t'103':[]\t}\n}]);\n_.Module.use('ueditor/widget/emotion', [UE, EditorUI]);\n_.Module.use('ueditor/widget/video', [UE, EditorUI, {\n\tis_video_pgc_user: 0}]);\n_.Module.use('ueditor/widget/scrawl', [UE, EditorUI]);\n\n_.Module.use('ueditor/widget/conversion', [UE, EditorUI]);\n\n\n_.Module.use('ueditor/widget/createplugin', [UE, EditorUI]);\n\n        _.Module.use('ueditor/widget/jquery_caret');\n    _.Module.use('ueditor/widget/topic', [UE, EditorUI]);\n_.Module.use('ueditor/widget/topic_suggestion', [UE, EditorUI]);\n    _.Module.use('ueditor/widget/fullscreen', [UE, EditorUI]);\n_.Module.use('ueditor/widget/height_limit', [UE, EditorUI]);\n_.Module.use('ueditor/widget/draft', [UE, EditorUI]);\n_.Module.use('ueditor/widget/at', [UE, EditorUI]);\n_.Module.use('ueditor/widget/counter', [UE, EditorUI]);\n_.Module.use('ueditor/widget/word_limit', [UE, EditorUI]);\n\n_.Module.use('encourage-thread/widget/setting', [UE, EditorUI, {\n\tscores: [],\n\tlevel : []}]);\n_.Module.use('encourage-thread/widget/medal', [UE, EditorUI, {\n\tdefaultBubble: [],\n\tlevel: 0}]);\n_.Module.use('encourage-thread/widget/paypost', [UE, EditorUI, {\n    isPaypost\t\t: 0,\n    needPaypostAgree: !0}]);\n_.Module.use(\"poster/widget/rich_poster\", {\n    prefix: undefined,\n    hotTopic: '',//传递后台抓取话题\n    // placeholder: '',\n    feedback:'<p>温馨提示：反馈bug、帐号异常或删贴问题时，请提供文字形式的问题帐号（非截图）、问题发生的时间，并尽可能上传截图，以上信息有助于贴吧更好的解决您的问题。<\\/p>',\n    QinglangData: {\"qingLangExtType\":\"\",\"title\":\"\",\"content\":\"\"},\n    ImgNum: 50,\n    user: {\n        memberLevel : 0,\n        user_nickname: '',\n        works_creator: ''\n    },\n    blockInfo: {\n        is_block : 0,\n        block_reason:'',\n        opgroup : '',\n        days_tofree:0,\n    },\n    snowflow: {\n        img : '',\n        url : ''\n    },\n    pagelet: pagelet,\n    initPage: 'frs'\n});\n    _.Module.use(\"poster/widget/homeworks_guide\", {\"is_videocreator\":false,\"pop_up_info\":1});\n});</script><code class=\"pagelet_html\" id=\"pagelet_html_frs-list/pagelet/content\" style=\"display:none;\"><!--<div id=\"pagelet_frs-list/pagelet/thread\"></div>--></code><script>Bigpipe.register(\"frs-list/pagelet/content\", {\"parent\":\"frs-base\\/pagelet\\/content\",\"scripts\":[],\"styles\":[]}).then(function(pagelet){});</script><code class=\"pagelet_html\" id=\"pagelet_html_frs-aside/pagelet/aside\" style=\"display:none;\"><!--<div id=\"pagelet_frs-aside/pagelet/novel_aside\"></div>--></code><script>Bigpipe.register(\"frs-aside/pagelet/aside\", {\"parent\":\"frs-base\\/pagelet\\/content\",\"scripts\":[\"\\/tb\\/_\\/frs-aside\\/aside_5bc7a1a.js\"],\"styles\":[]}).then(function(pagelet){    _.Module.use('frs-aside/pagelet/aside', {\n        fcFlag: null,\n        isShowFengChao: false,\n        isShowLU: true,\n        luType: \"default\",\n        showAd: true    });\n});</script><code class=\"pagelet_html\" id=\"pagelet_html_forum/pagelet/focus_btn\" style=\"display:none;\"><!--\n<a rel=\"noopener\" href=\"#\" onclick=\"return false\"\n   class=\"focus_btn islike_focus\" id=\"j_head_focus_btn\"\n   style=\"margin-top:2px;\"></a>\n--></code><script>Bigpipe.register(\"forum/pagelet/focus_btn\", {\"parent\":\"frs-header\\/pagelet\\/head\",\"scripts\":[\"\\/tb\\/_\\/focus_btn_9db672d.js\",\"\\/tb\\/_\\/tool_696c6e8.js\",\"\\/tb\\/_\\/login_dialog_8cc35e4.js\",\"\\/tb\\/_\\/messenger_e5c0696.js\",\"\\/tb\\/_\\/loader_334189d.js\",\"\\/tb\\/_\\/tpl_async_15_395293f.js\",\"\\/tb\\/_\\/loader_630632a.js\",\"\\/tb\\/_\\/like_tip_30c30f5.js\",\"\\/tb\\/_\\/attention_category_game_5e8a9fe.js\",\"\\/tb\\/_\\/focus_btn_9f13126.js\"],\"styles\":[\"\\/tb\\/_\\/login_dialog_8bacf9a.css\",\"\\/tb\\/_\\/like_tip_212132e.css\",\"\\/tb\\/_\\/attention_category_game_b16d4bc.css\",\"\\/tb\\/_\\/focus_btn_905978e.css\"]}).then(function(pagelet){    _.Module.use('forum/widget/focus_btn', [{\n        'islike': '0',\n        'levelId': '1',\n        'levelName': '',\n        'userLevel': null,\n        'isCategoryOfGame': true,\n        'firstClass': '文学',\n        'forumVdir': null,\n        'isBawu': null    }]);\n    _.Module.use('forum/pagelet/focus_btn', [pagelet], function () {});\n});</script><code class=\"pagelet_html\" id=\"pagelet_html_frs-header/pagelet/head_content_middle\" style=\"display:none;\"><!--\n\n\n<div class=\"game_frs_in_head\">\n    </div>\n<div id=\"pagelet_platform-official/pagelet/official_head_block\"></div><div id=\"pagelet_entertainment-liveshow/pagelet/lecai_head\"></div><div id=\"pagelet_entertainment-liveshow/pagelet/video_head\"></div>--></code><script>Bigpipe.register(\"frs-header/pagelet/head_content_middle\", {\"parent\":\"frs-header\\/pagelet\\/head\",\"scripts\":[\"\\/tb\\/_\\/login_dialog_8cc35e4.js\",\"\\/tb\\/_\\/messenger_e5c0696.js\",\"\\/tb\\/_\\/loader_334189d.js\",\"\\/tb\\/_\\/scroll_panel_0150f9a.js\",\"\\/tb\\/_\\/game_rank_in_head_a46e35a.js\",\"\\/tb\\/_\\/game_frs_head_0d71b8d.js\"],\"styles\":[\"\\/tb\\/_\\/login_dialog_8bacf9a.css\",\"\\/tb\\/_\\/game_frs_in_head_8026069.css\",\"\\/tb\\/_\\/scroll_panel_eb74727.css\",\"\\/tb\\/_\\/game_rank_in_head_8e1be2b.css\",\"\\/tb\\/_\\/game_frs_head_57d3857.css\"]}).then(function(pagelet){    // TODO 多次加载白名单，需要优化\n    _.Module.use('adsense-base/widget/loader', [{\n        'whiteList':[[\"http:\\/\\/fedev.baidu.com\"],[\"http:\\/\\/jiaoyu.baidu.com\"],[\"http:\\/\\/caifu.baidu.com\"],[\"http:\\/\\/jiankang.baidu.com\"],[\"http:\\/\\/tieba.dre8.com\"],[\"http:\\/\\/tdsp.nuomi.com\"],[\"http:\\/\\/baiju.baidu.com\"],[\"http:\\/\\/temai.baidu.com\"],[\"http:\\/\\/tieba.baidu.com\"],[\"http:\\/\\/zt.chuanke.com\"],[\"http:\\/\\/window.sturgeon.mopaas.com\"],[\"http:\\/\\/api.union.vip.com\"],[\"http:\\/\\/api.dongqiudi.com\"],[\"http:\\/\\/www.chuanke.com\"],[\"http:\\/\\/dcp.kuaizitech.com\\/\"]],\n        'adValue':\"\"    }]);\n});</script><code class=\"pagelet_html\" id=\"pagelet_html_navigation/pagelet/navigation\" style=\"display:none;\"><!--\n<div class=\"nav_wrap \" id=\"tb_nav\">\n        <ul class=\"nav_list j_nav_list\">\n                                <li class=\" focus j_tbnav_tab \" data-tab-main>\n    <a href=\"/f?kw=%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&ie=utf-8&tab=main\" class=\"j_nav_local_tab_link j_tbnav_tab_a\" id=\"tab_forumname\" stats-data=\"fr=tb0_forum&st_mod=frs&st_value=tabmain\">看贴</a>\n</li>                                <li class=\" j_tbnav_tab \" data-tab-album>\n    <a href=\"/f?kw=%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&ie=utf-8&tab=album\" class=\"j_nav_local_tab_link j_tbnav_tab_a\" stats-data=\"fr=tb0_forum&st_mod=frs&st_value=tabfrsphotogood\" frs-page=\"main\" id=\"tab_picture\">图片</a>\n</li>                                <li class=\" j_tbnav_tab \" data-tab-good>\n    <a href=\"/f?kw=%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&ie=utf-8&tab=good\" class=\"j_nav_local_tab_link j_tbnav_tab_a\" stats-data=\"fr=tb0_forum&st_mod=frs&st_value=tabgood\">吧主推荐</a>\n</li>                                <li class=\" j_tbnav_tab \" data-tab-video>\n    <a href=\"/f?kw=%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&ie=utf-8&tab=video\" class=\"j_nav_local_tab_link j_tbnav_tab_a\" stats-data=\"fr=tb0_forum&st_mod=frs&st_value=tabvideo\">视频</a>\n</li>                                <li class=\"more-config-navtab j_tbnav_tab \" data-tab->\n    <a href=\"http://gamein.baidu.com/game/link/jump?number=34\" class=\" j_tbnav_tab_a\" id=\"moreConfigNavtab\" target=\"_blank\">我的游戏</a>\n</li>            </ul>\n                            <form class=\"search_internal_wrap pull_right j_search_internal_forum\">\n                <input class=\"search_internal_input j_search_internal_input\" value=\"\" placeholder=\"吧内搜索\" type=\"text\"/>\n                <button class=\"search_internal_btn\" type=\"submit\"/>\n                <i></i></button>\n            </form>\n            </div>\n--></code><script>Bigpipe.register(\"navigation/pagelet/navigation\", {\"parent\":\"frs-header\\/pagelet\\/head\",\"scripts\":[\"\\/tb\\/_\\/navigator_b701689.js\",\"\\/tb\\/_\\/search_handler_2ff14b8.js\",\"\\/tb\\/_\\/tbnav_bright_5de042b.js\"],\"styles\":[\"\\/tb\\/_\\/tbnav_bright_482502e.css\"]}).then(function(pagelet){    _.Module.use('navigation/widget/tbnav_bright', [\n        $('#tb_nav'),\n        {\n            jq_search: $('#tb_nav').find('.j_search_internal_forum'),\n            forumName: '盗墓笔记',\n            forumId: '1525417'\n        },\n        {\n            promotion_setting: [[]]        }\n    ]);\n    var closeTip = document.getElementById('corezoneX');\n    if(closeTip) {\n\t\tcloseTip.onclick = function (){\n           document.getElementById('corezone').style.display='none';\n\t\t}\n\t}\n    _.Module.use('navigation/widget/navigator', [pagelet, true], function (instance) {\n\n    });\n});</script><code class=\"pagelet_html\" id=\"pagelet_html_frs-header/pagelet/head_content_bottom\" style=\"display:none;\"><!----></code><script>Bigpipe.register(\"frs-header/pagelet/head_content_bottom\", {\"parent\":\"frs-header\\/pagelet\\/head\",\"scripts\":[],\"styles\":[]}).then(function(pagelet){});</script>\n<code class=\"pagelet_html\" id=\"pagelet_html_platform-activity/pagelet/full_width_head\" style=\"display:none;\"><!--<div class=\"top_iframe\" style=\"position:relative;z-index:9999;\">\n    </div>\n\n\n--></code><script>Bigpipe.register(\"platform-activity/pagelet/full_width_head\", {\"parent\":\"frs-header\\/pagelet\\/head\",\"scripts\":[\"\\/tb\\/_\\/full_width_head_6874452.js\",\"\\/tb\\/_\\/preview_e43ce97.js\",\"\\/tb\\/_\\/login_dialog_8cc35e4.js\",\"\\/tb\\/_\\/vip_dialog_4757845.js\",\"\\/tb\\/_\\/poster\\/jiyan_service_e407177.js\",\"\\/tb\\/_\\/poster\\/acs_sdk_2c411c0.js\",\"\\/tb\\/_\\/poster\\/bsk_service_c6680a4.js\",\"\\/tb\\/_\\/poster\\/params_xss_handler_2083372.js\",\"\\/tb\\/_\\/forbidden_ea6d3fd.js\",\"\\/tb\\/_\\/rsa_safe_ffe2fa7.js\",\"\\/tb\\/_\\/paykey_safe_payment_f7a973d.js\",\"\\/tb\\/_\\/captcha_d99d16f.js\",\"\\/tb\\/_\\/captcha_dialog_ceaacd2.js\",\"\\/tb\\/_\\/captcha_safe_payment_7f700b4.js\",\"\\/tb\\/_\\/mobile_safe_payment_b2a273c.js\",\"\\/tb\\/_\\/tbean_safe_3668241.js\",\"\\/tb\\/_\\/tbean_safe_ajax_5dbae2e.js\",\"\\/tb\\/_\\/tdou_data_747c462.js\",\"\\/tb\\/_\\/umoney_1379f71.js\",\"\\/tb\\/_\\/global_switch_6dfeb89.js\",\"\\/tb\\/_\\/tdou_template_8d6b3f6.js\",\"\\/tb\\/_\\/tdou_builder_05260c9.js\",\"\\/tb\\/_\\/tdou_view_operation_bootstrap_4a983b5.js\",\"\\/tb\\/_\\/messenger_e5c0696.js\",\"\\/tb\\/_\\/tdou_view_cashier_6afe462.js\",\"\\/tb\\/_\\/user_api_10e048c.js\",\"\\/tb\\/_\\/icons_983b4c0.js\",\"\\/tb\\/_\\/base_user_data_ff57bd7.js\",\"\\/tb\\/_\\/base_dialog_user_bar_6dc620e.js\",\"\\/tb\\/_\\/qianbao_cashier_dialog_aa111c7.js\",\"\\/tb\\/_\\/qianbao_purchase_tdou_f4c69c0.js\",\"\\/tb\\/_\\/tdou_open_type_a72e1ed.js\",\"\\/tb\\/_\\/tdou_view_util_d282db0.js\",\"\\/tb\\/_\\/tdou_view_auto_redirect_a353d12.js\",\"\\/tb\\/_\\/umoney_query_e6ef23a.js\",\"\\/tb\\/_\\/tdou_view_check_f11908d.js\",\"\\/tb\\/_\\/tdou_counter_cbe5c8a.js\",\"\\/tb\\/_\\/tdou_view_fec0b7b.js\",\"\\/tb\\/_\\/tdou_3289666.js\",\"\\/tb\\/_\\/show_dialog_d46d0a5.js\",\"\\/tb\\/_\\/payment_dialog_title_3e773b9.js\",\"\\/tb\\/_\\/tdou_get_38af9fd.js\",\"\\/tb\\/_\\/tcharge_dialog_5da22d7.js\",\"\\/tb\\/_\\/tool_696c6e8.js\",\"\\/tb\\/_\\/loader_334189d.js\",\"\\/tb\\/_\\/tpl_async_15_395293f.js\",\"\\/tb\\/_\\/loader_630632a.js\",\"\\/tb\\/_\\/like_tip_30c30f5.js\",\"\\/tb\\/_\\/poster\\/post_service_7e89b7f.js\",\"\\/tb\\/_\\/conf_repost_b8046ac.js\",\"\\/tb\\/_\\/iframe_head_f52cc7a.js\",\"\\/tb\\/_\\/activity_btv_3cd04b8.js\"],\"styles\":[\"\\/tb\\/_\\/full_width_head_ca1a4d5.css\",\"\\/tb\\/_\\/login_dialog_8bacf9a.css\",\"\\/tb\\/_\\/vip_dialog_1fbc601.css\",\"\\/tb\\/_\\/forbidden_752e552.css\",\"\\/tb\\/_\\/paykey_safe_payment_8f2a8db.css\",\"\\/tb\\/_\\/captcha_30e4d3c.css\",\"\\/tb\\/_\\/captcha_safe_payment_d41d8cd.css\",\"\\/tb\\/_\\/mobile_safe_payment_77949bb.css\",\"\\/tb\\/_\\/tbean_safe_3c779a3.css\",\"\\/tb\\/_\\/tbean_safe_ajax_d41d8cd.css\",\"\\/tb\\/_\\/umoney_f12b09a.css\",\"\\/tb\\/_\\/tdou_template_781e4d0.css\",\"\\/tb\\/_\\/icons_fba8214.css\",\"\\/tb\\/_\\/base_user_data_f665ab7.css\",\"\\/tb\\/_\\/base_dialog_user_bar_69fdf18.css\",\"\\/tb\\/_\\/qianbao_cashier_dialog_179e56e.css\",\"\\/tb\\/_\\/qianbao_purchase_tdou_4b31f54.css\",\"\\/tb\\/_\\/umoney_query_d15a716.css\",\"\\/tb\\/_\\/tdou_d41d8cd.css\",\"\\/tb\\/_\\/payment_dialog_title_5433211.css\",\"\\/tb\\/_\\/tdou_get_4b2272d.css\",\"\\/tb\\/_\\/tcharge_dialog_a6fd677.css\",\"\\/tb\\/_\\/like_tip_212132e.css\",\"\\/tb\\/_\\/conf_repost_2d678d2.css\",\"\\/tb\\/_\\/iframe_head_b5db402.css\",\"\\/tb\\/_\\/activity_btv_5b32c41.css\"]}).then(function(pagelet){_.Module.use('tbui/widget/preview', [], function(){});\n    _.Module.use('platform-activity/widget/fullWidthHead', [], function(){});\n});</script><code class=\"pagelet_html\" id=\"pagelet_html_forum/pagelet/sign_mod\" style=\"display:none;\"><!--\n    <div class=\"sign_mod_bright\" id=\"sign_mod\">\n\n<div class=\"sign_tip_container\">\n    <div class=\"j_succ_info sign_succ1\" style=\"display:none\">\n        <div class=\"sign_tip_bdwrap clearfix\">\n            <div class=\"sign_tip_bd_arr\"></div>\n            <div class=\"sign_tip_main\">\n                <div class=\"sign_succ_calendar\">\n                    <div class=\"sign_succ_calendar_title\">\n                        <div class=\"calendar_title_month clearfix\">\n                            <div class=\"calendar_month_next j_calendar_month_next\">&nbsp;</div>\n                            <div class=\"calendar_month_prev j_calendar_month_prev\">&nbsp;</div>\n                            <div class=\"calendar_month_span j_calendar_month\">&nbsp;</div>\n                        </div>\n                    </div>\n                    <table class=\"sign_succ_table \"\n                            >\n                        <thead align=\"center\">\n                        <tr class=\"sign_succ_canlerdar_head\">\n                            <td>日</td>\n                            <td>一</td>\n                            <td>二</td>\n                            <td>三</td>\n                            <td>四</td>\n                            <td>五</td>\n                            <td>六</td>\n                        </tr>\n                        </thead>\n                        <tbody align=\"center\" class=\"sign_succ_canlerdar_days j_canlerdar_days\">\n                        <tr>\n                            <td class=\"j_1_0\">&nbsp;</td>\n                            <td class=\"j_1_1\">&nbsp;</td>\n                            <td class=\"j_1_2\">&nbsp;</td>\n                            <td class=\"j_1_3\">&nbsp;</td>\n                            <td class=\"j_1_4\">&nbsp;</td>\n                            <td class=\"j_1_5\">&nbsp;</td>\n                            <td class=\"j_1_6\">&nbsp;</td>\n                        </tr>\n                        <tr>\n                            <td class=\"j_2_0\">&nbsp;</td>\n                            <td class=\"j_2_1\">&nbsp;</td>\n                            <td class=\"j_2_2\">&nbsp;</td>\n                            <td class=\"j_2_3\">&nbsp;</td>\n                            <td class=\"j_2_4\">&nbsp;</td>\n                            <td class=\"j_2_5\">&nbsp;</td>\n                            <td class=\"j_2_6\">&nbsp;</td>\n                        </tr>\n                        <tr>\n                            <td class=\"j_3_0\">&nbsp;</td>\n                            <td class=\"j_3_1\">&nbsp;</td>\n                            <td class=\"j_3_2\">&nbsp;</td>\n                            <td class=\"j_3_3\">&nbsp;</td>\n                            <td class=\"j_3_4\">&nbsp;</td>\n                            <td class=\"j_3_5\">&nbsp;</td>\n                            <td class=\"j_3_6\">&nbsp;</td>\n                        </tr>\n                        <tr>\n                            <td class=\"j_4_0\">&nbsp;</td>\n                            <td class=\"j_4_1\">&nbsp;</td>\n                            <td class=\"j_4_2\">&nbsp;</td>\n                            <td class=\"j_4_3\">&nbsp;</td>\n                            <td class=\"j_4_4\">&nbsp;</td>\n                            <td class=\"j_4_5\">&nbsp;</td>\n                            <td class=\"j_4_6\">&nbsp;</td>\n                        </tr>\n                        <tr class=\"j_5\" style=\"display:none\">\n                            <td class=\"j_5_0\">&nbsp;</td>\n                            <td class=\"j_5_1\">&nbsp;</td>\n                            <td class=\"j_5_2\">&nbsp;</td>\n                            <td class=\"j_5_3\">&nbsp;</td>\n                            <td class=\"j_5_4\">&nbsp;</td>\n                            <td class=\"j_5_5\">&nbsp;</td>\n                            <td class=\"j_5_6\">&nbsp;</td>\n                        </tr>\n                        <tr class=\"j_6\" style=\"display:none\">\n                            <td class=\"j_6_0\">&nbsp;</td>\n                            <td class=\"j_6_1\">&nbsp;</td>\n                            <td class=\"j_6_2\">&nbsp;</td>\n                            <td class=\"j_6_3\">&nbsp;</td>\n                            <td class=\"j_6_4\">&nbsp;</td>\n                            <td class=\"j_6_5\">&nbsp;</td>\n                            <td class=\"j_6_6\">&nbsp;</td>\n                        </tr>\n                        </tbody>\n                    </table>\n                </div>\n\n                <div class=\"sign_tip_boards\">\n                    <div class=\"sign_tip_board sign_tip_board_urank j_sign_ad_mobi\">\n                        <div class=\"sign_tip_board_ico\"></div>\n                        <p>签到排名：今日本吧第<span class=\"sign_index_num j_signin_index\"></span>个签到，</p>\n\n                        <p><span class=\"j_succ_text\">本吧因你更精彩，明天继续来努力！</span></p>\n                    </div>\n                    <div class=\"sign_tip_board sign_tip_board_barrank\">\n                        <div class=\"sign_tip_board_ico\"></div>\n                                                    <p>本吧排名：<a rel=\"noopener\" target=\"_blank\"\n                                       href=\"/sign/index?kw=%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&ie=utf-8\">1</a>\n                            </p>\n                                                <p>本吧签到人数：6741</p>\n                    </div>\n                </div>\n\n            </div>\n\n            <div class=\"sign_tip_aside\">\n\n                                                        <div class=\"sign_tip_sbox sign_tip_sbox_first sign_tip_sbox_1key\">\n                        <div class=\"sign_tip_sbox_hd\">一键签到</div>\n                        <div class=\"sign_tip_sbox_bd\">\n                            <div class=\"sign_tip_sbox_cnt\">\n                                <a rel=\"noopener\" class=\"sign_tip_sbox_card j_sign_tip_1key_icon sign_tip_sbox_card_pencil\"\n                                   href=\"/tbmall/tshow?tab=detail\" target=\"_blank\"></a>\n\n                                <div class=\"sign_tip_sbox_txt\">可签<span class=\"orange_text\">7</span>级以上的吧<span\n                                        class=\"orange_text\">50</span>个\n                                </div>\n                                <div class=\"sign_tip_sbox_btn\">\n                                    <a rel=\"noopener\" href=\"/home/main?id=00000000#stipsign\" target=\"_blank\"\n                                       class=\"btn-sub btn-small\">\n                                        <b class=\"sign_crown sign_crown_pencil\" title=\"无瑕的T秀勋章\"></b> 一键签到\n                                    </a>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n\n                <div class=\"sign_tip_sbox sign_tip_sbox_fixsign\">\n                    <div class=\"sign_tip_sbox_hd sign_tip_sbox_hd_inf j_need_rpln_wrap\">本月漏签<span\n                            class=\"j_lack_sign_monthly_count sign_num\">0</span>次！\n                    </div>\n                    <div class=\"sign_tip_sbox_bd\">\n                        <div class=\"sign_tip_sbox_cnt\">\n                            <a rel=\"noopener\" href=\"/tbmall/propslist?category=108\" class=\"sign_tip_sbox_card\" target=\"_blank\"><span\n                                    class=\"sign_num\"><span class=\"j_rpln_card_count\">0</span></span></a>\n\n                            <div class=\"sign_tip_sbox_txt\">成为超级会员，赠送8张补签卡</div>\n                            <div class=\"sign_tip_sbox_btn\">\n                                <a rel=\"noopener\" href=\"#\" class=\"btn-sub btn-small j_lack_sign_monthly_help\"\n                                   target=\"_blank\">如何使用？</a>\n\n                                <div class=\"lack_sign_monthly_tip_wrap\">\n                                    <div class=\"ui_card_wrap lack_sign_monthly_tip_card j_lack_sign_monthly_tip_card\"\n                                         style=\"display:none;\">\n                                        <div class=\"ui_card_content \">\n                                            <div class=\"time_gift_tip\">点击日历上漏签日期，即可进行<span\n                                                    class=\"strongerText\">补签</span>。\n                                            </div>\n                                        </div>\n                                        <span class=\"arrow ui_white_down\" style=\"left:48%;\"></span>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n\n                <div class=\"sign_tip_sbox sign_tip_sbox_chainsign\">\n                    <div class=\"sign_tip_sbox_hd sign_tip_sbox_hd_inf\">\n                        连续签到：<span class=\"sign_num j_sign_succ_keep\"></span>天&nbsp;&nbsp;累计签到：<span\n                            class=\"sign_num j_sign_succ_count\"></span>天\n                    </div>\n                    <div class=\"sign_tip_sbox_bd\">\n                        <div class=\"sign_tip_sbox_cnt\">\n                            <a rel=\"noopener\" href=\"/tbmall/propslist?category=108\" class=\"sign_tip_sbox_card\" target=\"_blank\"><span\n                                    class=\"sign_num\"><span\n                                        class=\"j_sign_chainsign_num\">0</span></span></a>\n\n                            <div class=\"sign_tip_sbox_txt\">超级会员单次开通12个月以上，赠送连续签到卡3张</div>\n                            <div class=\"sign_tip_sbox_btn\"><a rel=\"noopener\" href=\"#\" class=\"btn-sub btn-small j_cont_sign_card\"\n                                                              target=\"_blank\">使用连续签到卡</a></div>\n                        </div>\n                    </div>\n                </div>\n\n                <div class=\"sign_tip_sbox sign_tip_sbox_last sign_tip_sbox_rights\">\n                    <div class=\"sign_tip_sbox_bd j_sign_rights\">\n                        <div class=\"sign_rights_display clearfix\">\n                            <div class=\"sign_rights_icon j_sign_rights_icon rights_1\"></div>\n                            <div class=\"sign_rights_icon j_sign_rights_icon rights_2\"></div>\n                            <div class=\"sign_rights_icon j_sign_rights_icon rights_3\"></div>\n                            <div class=\"sign_rights_icon j_sign_rights_icon rights_4\"></div>\n                            <div class=\"sign_rights_icon j_sign_rights_icon rights_5\"></div>\n                            <span class=\"split_line\"></span>\n                            <a rel=\"noopener\" href=\"/f/like/level?kw=%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&ie=utf-8&lv_t=lv_nav_who\" class=\"balv_help\"\n                               title=\"签到规则\" target=\"_blank\"></a>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n\n        <div id=\"signstar_wrapper\" class=\"j_sign_box sign_box_bright\">\n            <a rel=\"noopener\" href=\"#\" onclick=\"return false\" data-dw=\"4\" tabindex=\"3\"\n               title=\"签到\"\n               class=\"j_signbtn sign_btn_bright\">\n                                <span class=\"sign_today_date\">08月08日</span>\n                <span class=\"sign_month_lack_days\">漏签<span class=\"j_sign_month_lack_days\">0</span>天</span>\n            </a>\n        </div>\n\n\n            </div>\n--></code><script>Bigpipe.register(\"forum/pagelet/sign_mod\", {\"parent\":\"frs-header\\/pagelet\\/head\",\"scripts\":[\"\\/tb\\/_\\/sign100_c123624.js\",\"\\/tb\\/_\\/sign_shai_0d657eb.js\",\"\\/tb\\/_\\/captcha_d99d16f.js\",\"\\/tb\\/_\\/captcha_dialog_ceaacd2.js\",\"\\/tb\\/_\\/card_d6007e6.js\",\"\\/tb\\/_\\/bubble_tip_d34e792.js\",\"\\/tb\\/_\\/verify_dialog_99c29ad.js\",\"\\/tb\\/_\\/login_verify_check_b14011e.js\",\"\\/tb\\/_\\/tdou_open_type_a72e1ed.js\",\"\\/tb\\/_\\/global_switch_6dfeb89.js\",\"\\/tb\\/_\\/user_api_10e048c.js\",\"\\/tb\\/_\\/icons_983b4c0.js\",\"\\/tb\\/_\\/base_user_data_ff57bd7.js\",\"\\/tb\\/_\\/base_dialog_user_bar_6dc620e.js\",\"\\/tb\\/_\\/qianbao_cashier_dialog_aa111c7.js\",\"\\/tb\\/_\\/qianbao_purchase_member_fad1d66.js\",\"\\/tb\\/_\\/login_dialog_8cc35e4.js\",\"\\/tb\\/_\\/messenger_e5c0696.js\",\"\\/tb\\/_\\/cashier_dialog_d52cf7c.js\",\"\\/tb\\/_\\/pay_member_c57f92d.js\",\"\\/tb\\/_\\/join_vip_dialog_9242ef7.js\",\"\\/tb\\/_\\/dialog_d31c70c.js\",\"\\/tb\\/_\\/util_fdb7481.js\",\"\\/tb\\/_\\/cont_sign_card_518234f.js\",\"\\/tb\\/_\\/sign_mod_d842b6f.js\"],\"styles\":[\"\\/tb\\/_\\/captcha_30e4d3c.css\",\"\\/tb\\/_\\/card_1f33a7b.css\",\"\\/tb\\/_\\/bubble_tip_17a9ec9.css\",\"\\/tb\\/_\\/verify_dialog_c5dd6ff.css\",\"\\/tb\\/_\\/icons_fba8214.css\",\"\\/tb\\/_\\/base_user_data_f665ab7.css\",\"\\/tb\\/_\\/base_dialog_user_bar_69fdf18.css\",\"\\/tb\\/_\\/qianbao_cashier_dialog_179e56e.css\",\"\\/tb\\/_\\/qianbao_purchase_member_264deea.css\",\"\\/tb\\/_\\/login_dialog_8bacf9a.css\",\"\\/tb\\/_\\/cashier_dialog_0d74ed0.css\",\"\\/tb\\/_\\/pay_member_d41d8cd.css\",\"\\/tb\\/_\\/dialog_6ed86bb.css\",\"\\/tb\\/_\\/cont_sign_card_6369333.css\",\"\\/tb\\/_\\/sign_mod_7d023f1.css\",\"\\/tb\\/_\\/sign_tip_cbb9da7.css\"]}).then(function(pagelet){    _.Module.use('forum/widget/sign_mod', [$('#sign_mod'), {\n        'hasClass': 1,\n        'page': '',\n        'isLike':0, // 是否已like本吧\n        'isBlock':0, // 是否已封禁\n        'isSignIn':0, // 今日是否已经签到\n        'signForumInfo':{\"is_on\":true,\"is_filter\":false,\"forum_info\":{\"forum_id\":1525417,\"level_1_dir_name\":\"\\u6587\\u5b66\"},\"current_rank_info\":{\"sign_count\":6741,\"member_count\":4626298,\"sign_rank\":1,\"dir_rate\":\"0.1\"},\"yesterday_rank_info\":{\"sign_count\":10134,\"member_count\":4625551,\"sign_rank\":1,\"dir_rate\":\"0.1\"},\"weekly_rank_info\":{\"sign_count\":10048,\"member_count\":4619097,\"sign_rank\":1},\"monthly_rank_info\":{\"sign_count\":10234,\"member_count\":4599615,\"sign_rank\":1},\"level_1_dir_name\":\"\\u6587\\u5b66\",\"level_2_dir_name\":\"\\u5947\\u5e7b\\u00b7\\u7384\\u5e7b\\u5c0f\\u8bf4\"},\n        'memberTitle': '',\n        'memberNumber': '4626568',\n        'isActivitySign': '',\n        'userProp': null    },\n    {\n        'sign_mod_tiptitle1': '签到经验奖励',\n        'sign_mod_tiptitle2': '连续签到双倍经验',\n        'sign_mod_tiptitle3': '加粗字体使用特权',\n        'sign_mod_tiptitle4': '红色字体使用特权',\n        'sign_mod_tiptitle5': '一举橙名',\n        'sign_mod_tiptext1': '签到即奖励2个经验值。<br \\/>手机签到额外奖励2个经验值。',\n        'sign_mod_tiptext2': '连续签到奖励经验值双倍。',\n        'sign_mod_tiptext3': '在本吧发贴时可以使用加粗字体。',\n        'sign_mod_tiptext4': '在本吧发贴时可以使用红色字体。',\n        'sign_mod_tiptext5': '在本吧用户ID橙名高亮显示。',\n        'sign_mod_tipcondition1': '条件：每天点击签到后即可获得。',\n        'sign_mod_tipcondition2': '条件：保持连续签到2天及以上。',\n        'sign_mod_tipcondition3': '条件：连续签到10天及以上，不能中断哦',\n        'sign_mod_tipcondition4': '条件：连续签到20天及以上，不能中断哦',\n        'sign_mod_tipcondition5': '条件：连续签到30天及以上，不能中断哦',\n        'sign_mod_card_title': '一键签到，最高<span>6倍经验！<\\/span>',\n        'sign_mod_card_detail': '',\n        'sign_mod_card_positive_btn': '<i class=\\\"icon\\\"><\\/i>客户端免费体验',\n        'sign_mod_card_no_txt': '<i class=\\\"icon\\\"><\\/i>会员一键签到',\n    }]);\n});</script><code class=\"pagelet_html\" id=\"pagelet_html_forum/pagelet/forum_card_number\" style=\"display:none;\"><!--<span class=\"\">\n  <span class=\"card_numLabel\">关注：</span>\n  <span class=\"card_menNum\">4,626,568</span>\n  <span class=\"card_numLabel\">贴子：</span>\n  <span class=\"card_infoNum\">101,877,845</span>\n</span>\n--></code><script>Bigpipe.register(\"forum/pagelet/forum_card_number\", {\"parent\":\"frs-header\\/pagelet\\/head\",\"scripts\":[],\"styles\":[]}).then(function(pagelet){});</script><code class=\"pagelet_html\" id=\"pagelet_html_platform-official/pagelet/official_extension\" style=\"display:none;\"><!--\n\n--></code><script>Bigpipe.register(\"platform-official/pagelet/official_extension\", {\"parent\":\"frs-footer\\/pagelet\\/extension\",\"scripts\":[\"\\/tb\\/_\\/js_redirect_ed0cfa9.js\",\"\\/tb\\/_\\/platform_spread_layer_6e2b6ed.js\",\"\\/tb\\/_\\/platform_spread_video_c26eda2.js\"],\"styles\":[\"\\/tb\\/_\\/platform_spread_layer_b5ef871.css\",\"\\/tb\\/_\\/platform_spread_video_070115e.css\"]}).then(function(pagelet){});</script><code class=\"pagelet_html\" id=\"pagelet_html_frs-aside/pagelet/novel_aside\" style=\"display:none;\"><!--\n\n<div id=\"novel-ranking\">\n    <div class=\"novel-ranking-last-area\"></div>\n\n    <div class=\"novel-ranking-frs-body\">\n        <div class=\"novel-ranking-frs-title\">\n            百度小说人气榜\n        </div>\n        <div class=\"j-novel-rank-area\"></div>\n    </div>\n\n</div>\n\n<div class=\"novel-award-aside-area\"></div>\n\n\n\n\n<div id=\"pagelet_entertainment-liveshow/pagelet/promoter_privilege_preview\"></div><div id=\"pagelet_encourage-celebrity/pagelet/celebrity\"></div><div id=\"pagelet_frs-aside/pagelet/aside_ad\"></div><div class=\"aside_region app_download_box\" id=\"\">\n    <h4 class=\"region_header clearfix\">\n        扫二维码下载贴吧客户端        <span class=\"pull_right j_op\"> </span>\n    </h4>\n    <div class=\"region_cnt clearfix\">\n\n<div class=\"clearfix app_download_wrap\">\n\t<div class=\"app_download_icon\">\n\n\t</div>\n\t<div class=\"app_download_info\">\n\t\t下载贴吧APP<br />看高清直播、视频！\n\t</div>\n</div>\n    </div>\n    <div class=\"region_footer\"></div>\n</div>\n<div id=\"pagelet_encourage-tbguess/pagelet/sidebar\"></div><div id=\"pagelet_frs-aside/pagelet/star\"></div><div id=\"pagelet_frs-aside/pagelet/forum_info\"></div><div id=\"pagelet_frs-aside/pagelet/zyq\"></div><div id=\"pagelet_frs-aside/pagelet/search_back\"></div><div id=\"pagelet_frs-aside/pagelet/hottopic\"></div><div id=\"pagelet_frs-aside/pagelet/ad\"></div>        <div id=\"branding_ads\">\n        </div>\n--></code><script>Bigpipe.register(\"frs-aside/pagelet/novel_aside\", {\"parent\":\"frs-aside\\/pagelet\\/aside\",\"scripts\":[\"\\/tb\\/_\\/frs-aside\\/base_aside_43591cb.js\",\"\\/tb\\/_\\/image_exif_c652bbe.js\",\"\\/tb\\/_\\/image_uploader_e55f86f.js\",\"\\/tb\\/_\\/image_uploader_manager_87db6b6.js\",\"\\/tb\\/_\\/animate_base_78c0a21.js\",\"\\/tb\\/_\\/animate_keyframes_zoomout_d7bd9d7.js\",\"\\/tb\\/_\\/animate_keyframes_zoomin_f6fd4a8.js\",\"\\/tb\\/_\\/animate_keyframes_special_6ed07e2.js\",\"\\/tb\\/_\\/animate_keyframes_slideout_33dde45.js\",\"\\/tb\\/_\\/animate_keyframes_slidein_51f6be4.js\",\"\\/tb\\/_\\/animate_keyframes_rotateout_b2cec69.js\",\"\\/tb\\/_\\/animate_keyframes_rotatein_3d55c16.js\",\"\\/tb\\/_\\/animate_keyframes_lightspeed_61de60c.js\",\"\\/tb\\/_\\/animate_keyframes_focus_1d3bb64.js\",\"\\/tb\\/_\\/animate_keyframes_flip_b21b2c7.js\",\"\\/tb\\/_\\/animate_keyframes_fadeout_ded4510.js\",\"\\/tb\\/_\\/animate_keyframes_fadein_a23e571.js\",\"\\/tb\\/_\\/animate_keyframes_bounceout_9d72756.js\",\"\\/tb\\/_\\/animate_keyframes_bouncein_ab1d974.js\",\"\\/tb\\/_\\/animate_d4d4d86.js\",\"\\/tb\\/_\\/user_api_10e048c.js\",\"\\/tb\\/_\\/icons_983b4c0.js\",\"\\/tb\\/_\\/member_api_c29c369.js\",\"\\/tb\\/_\\/login_dialog_8cc35e4.js\",\"\\/tb\\/_\\/messenger_e5c0696.js\",\"\\/tb\\/_\\/umoney_query_e6ef23a.js\",\"\\/tb\\/_\\/global_switch_6dfeb89.js\",\"\\/tb\\/_\\/base_user_data_ff57bd7.js\",\"\\/tb\\/_\\/base_dialog_user_bar_6dc620e.js\",\"\\/tb\\/_\\/qianbao_cashier_dialog_aa111c7.js\",\"\\/tb\\/_\\/qianbao_purchase_tdou_f4c69c0.js\",\"\\/tb\\/_\\/tdou_open_type_a72e1ed.js\",\"\\/tb\\/_\\/tdou_template_8d6b3f6.js\",\"\\/tb\\/_\\/tdou_builder_05260c9.js\",\"\\/tb\\/_\\/tdou_view_util_d282db0.js\",\"\\/tb\\/_\\/rsa_safe_ffe2fa7.js\",\"\\/tb\\/_\\/paykey_safe_payment_f7a973d.js\",\"\\/tb\\/_\\/captcha_d99d16f.js\",\"\\/tb\\/_\\/captcha_dialog_ceaacd2.js\",\"\\/tb\\/_\\/captcha_safe_payment_7f700b4.js\",\"\\/tb\\/_\\/mobile_safe_payment_b2a273c.js\",\"\\/tb\\/_\\/tbean_safe_3668241.js\",\"\\/tb\\/_\\/tbean_safe_ajax_5dbae2e.js\",\"\\/tb\\/_\\/tdou_data_747c462.js\",\"\\/tb\\/_\\/tdou_view_check_f11908d.js\",\"\\/tb\\/_\\/tdou_counter_cbe5c8a.js\",\"\\/tb\\/_\\/tdou_view_fec0b7b.js\",\"\\/tb\\/_\\/qianbao_purchase_member_fad1d66.js\",\"\\/tb\\/_\\/cashier_dialog_d52cf7c.js\",\"\\/tb\\/_\\/pay_member_c57f92d.js\",\"\\/tb\\/_\\/umoney_1379f71.js\",\"\\/tb\\/_\\/tdou_view_operation_bootstrap_4a983b5.js\",\"\\/tb\\/_\\/tdou_view_cashier_6afe462.js\",\"\\/tb\\/_\\/tdou_view_auto_redirect_a353d12.js\",\"\\/tb\\/_\\/tdou_view_pay_46c8c05.js\",\"\\/tb\\/_\\/tdou_3289666.js\",\"\\/tb\\/_\\/show_dialog_d46d0a5.js\",\"\\/tb\\/_\\/payment_dialog_title_3e773b9.js\",\"\\/tb\\/_\\/tdou_get_38af9fd.js\",\"\\/tb\\/_\\/tcharge_dialog_5da22d7.js\",\"\\/tb\\/_\\/novel_icons_5f06004.js\",\"\\/tb\\/_\\/novel_award_dialog_214f5d3.js\",\"\\/tb\\/_\\/novel_ranking_9a6c549.js\"],\"styles\":[\"\\/tb\\/_\\/icons_fba8214.css\",\"\\/tb\\/_\\/login_dialog_8bacf9a.css\",\"\\/tb\\/_\\/umoney_query_d15a716.css\",\"\\/tb\\/_\\/base_user_data_f665ab7.css\",\"\\/tb\\/_\\/base_dialog_user_bar_69fdf18.css\",\"\\/tb\\/_\\/qianbao_cashier_dialog_179e56e.css\",\"\\/tb\\/_\\/qianbao_purchase_tdou_4b31f54.css\",\"\\/tb\\/_\\/tdou_template_781e4d0.css\",\"\\/tb\\/_\\/paykey_safe_payment_8f2a8db.css\",\"\\/tb\\/_\\/captcha_30e4d3c.css\",\"\\/tb\\/_\\/captcha_safe_payment_d41d8cd.css\",\"\\/tb\\/_\\/mobile_safe_payment_77949bb.css\",\"\\/tb\\/_\\/tbean_safe_3c779a3.css\",\"\\/tb\\/_\\/tbean_safe_ajax_d41d8cd.css\",\"\\/tb\\/_\\/qianbao_purchase_member_264deea.css\",\"\\/tb\\/_\\/cashier_dialog_0d74ed0.css\",\"\\/tb\\/_\\/pay_member_d41d8cd.css\",\"\\/tb\\/_\\/umoney_f12b09a.css\",\"\\/tb\\/_\\/tdou_d41d8cd.css\",\"\\/tb\\/_\\/payment_dialog_title_5433211.css\",\"\\/tb\\/_\\/tdou_get_4b2272d.css\",\"\\/tb\\/_\\/tcharge_dialog_a6fd677.css\",\"\\/tb\\/_\\/novel_icons_701d51a.css\",\"\\/tb\\/_\\/novel_award_dialog_d419bba.css\",\"\\/tb\\/_\\/novel_ranking_11bfc77.css\",\"\\/tb\\/_\\/aside_region_6df4cfc.css\",\"\\/tb\\/_\\/frs-aside\\/app_download_6fe765a.css\"]}).then(function(pagelet){\n_.Module.use('encourage-appforum/widget/novel_ranking', {\"curMonth\":8,\"curYear\":2024,\"isLogin\":false,\"forumId\":1525417,\"tbs\":\"d1af71cf9c8bc1a21723088812\"});\n\n    _.Module.use('frs-aside/pagelet/base_aside', {\n        forumName: \"\\u76d7\\u5893\\u7b14\\u8bb0\",\n        forumSecLvName: \"\\u5947\\u5e7b\\u00b7\\u7384\\u5e7b\\u5c0f\\u8bf4\",\n        brandAdsenseSwitch: 1    });\n});</script><code class=\"pagelet_html\" id=\"pagelet_html_frs-list/pagelet/thread\" style=\"display:none;\"><!--<div id=\"content_leftList\" class=\"content_leftList j-content-leftList clearfix\">\n    <div id=\"pagelet_platform-base/pagelet/professional_manager\"></div><div id=\"pagelet_platform-thread/pagelet/platform_thread_header\"></div><div id=\"pagelet_live/pagelet/live\"></div><div id=\"pagelet_frs-list/pagelet/thread_list\"></div><div id=\"pagelet_frs-list/pagelet/thread_footer\"></div></div>\n--></code><script>Bigpipe.register(\"frs-list/pagelet/thread\", {\"parent\":\"frs-list\\/pagelet\\/content\",\"scripts\":[\"\\/tb\\/_\\/thread_631d0b6.js\",\"\\/tb\\/_\\/popup_zhang_8e0fca3.js\"],\"styles\":[\"\\/tb\\/_\\/top_activity_e12a4fe.css\",\"\\/tb\\/_\\/popup_zhang_8b74e36.css\"]}).then(function(pagelet){    _.Module.use('frs-list/widget/popup_zhang', [], function () {\n    });\n    _.Module.use('frs-list/pagelet/thread', [pagelet], function (instance) {\n\n    });\nwindow['__abbaidu_2027_subidgetf'] = function () {\n    var subid = 'tb_pc_frs';\n    return subid;\n};\nwindow['__abbaidu_2027_cb'] = function (responseData) {\n    Object.keys(JSON.parse(responseData)).forEach(function (key) {\n        document.cookie = 'st_' + key + '=' + JSON.parse(responseData)[key];\n    });\n};\n;(function() {\n  var hm = document.createElement(\"script\");\n  hm.src = \"https://dlswbr.baidu.com/heicha/mw/abclite-2027-s.js\";\n  var s = document.getElementsByTagName(\"script\")[0];\n  s.parentNode.insertBefore(hm, s);\n})()\n});</script><code class=\"pagelet_html\" id=\"pagelet_html_platform-official/pagelet/official_head_block\" style=\"display:none;\"><!--\n--></code><script>Bigpipe.register(\"platform-official/pagelet/official_head_block\", {\"parent\":\"frs-header\\/pagelet\\/head_content_middle\",\"scripts\":[\"\\/tb\\/_\\/preview_e43ce97.js\"],\"styles\":[]}).then(function(pagelet){_.Module.use('tbui/widget/preview', [], function(){});\n});</script><code class=\"pagelet_html\" id=\"pagelet_html_entertainment-liveshow/pagelet/lecai_head\" style=\"display:none;\"><!----></code><script>Bigpipe.register(\"entertainment-liveshow/pagelet/lecai_head\", {\"parent\":\"frs-header\\/pagelet\\/head_content_middle\",\"scripts\":[],\"styles\":[\"\\/tb\\/_\\/lecai_iframe_a48aee4.css\"]}).then(function(pagelet){});</script><code class=\"pagelet_html\" id=\"pagelet_html_entertainment-liveshow/pagelet/video_head\" style=\"display:none;\"><!----></code><script>Bigpipe.register(\"entertainment-liveshow/pagelet/video_head\", {\"parent\":\"frs-header\\/pagelet\\/head_content_middle\",\"scripts\":[],\"styles\":[]}).then(function(pagelet){});</script><code class=\"pagelet_html\" id=\"pagelet_html_entertainment-liveshow/pagelet/promoter_privilege_preview\" style=\"display:none;\"><!----></code><script>Bigpipe.register(\"entertainment-liveshow/pagelet/promoter_privilege_preview\", {\"parent\":\"frs-aside\\/pagelet\\/novel_aside\",\"scripts\":[],\"styles\":[]}).then(function(pagelet){});</script><code class=\"pagelet_html\" id=\"pagelet_html_encourage-celebrity/pagelet/celebrity\" style=\"display:none;\"><!--<div class=\"aside_region celebrity\" id=\"\">\n    <h4 class=\"region_header clearfix\">\n                <span class=\"pull_right j_op\"> </span>\n    </h4>\n    <div class=\"region_cnt clearfix\">\n        <div class=\"intro\">\n    <div class=\"col2-left\">\n        <a class=\"gift-wrapper j-gift-buy\" href=\"javascript:;\">\n            <span class=\"gift\">\n                <img src=\"//tb2.bdstatic.com/tb/img/single_member_100_8a10f9f.png\">\n            </span>\n            皇冠身份\n        </a>\n    </div>\n    <div class=\"col2-right\">\n        <ul class=\"privilege-list\">\n            <li>\n                <i class=\"icon icon-red-thread-title\"></i>\n                发贴红色标题\n            </li>\n            <li>\n                <i class=\"icon icon-red-name\"></i>\n                显示红名\n            </li>\n            <li>\n                <i class=\"icon icon-sign-exp\"></i>\n                签到六倍经验\n            </li>\n        </ul>\n    </div>\n</div>\n    <div class=\"more-privilege-container\">\n        <div class=\"first-show-container\">\n            <div class=\"open-btn gray-text-btn\">更多定制特权<i class=\"down-icon\"></i></div>\n            <button class=\"purchase-member-btn j-gift-buy\">兑换本吧会员</button>\n        </div>\n        <div class=\"second-show-container\">\n                        <ul class=\"privilege-unactivated-list\">\n                <li>\n                    <i class=\"privilege-mark privilege-unactivated-icon\"></i>\n                    本吧专属印记\n                </li>\n                <li>\n                    <i class=\"privilege-card-bg privilege-unactivated-icon\"></i>\n                    定制名片背景\n                </li>\n                <li>\n                    <i class=\"privilege-top-thread privilege-unactivated-icon\"></i>\n                    名人自动顶贴\n                </li>\n                <li>\n                    <i class=\"privilege-head-border privilege-unactivated-icon\"></i>\n                    定制头像边框\n                </li>\n            </ul>\n            <div class=\"close-btn gray-text-btn\">收起特权<i class=\"up-icon\"></i></div>\n            <button class=\"purchase-member-btn j-gift-buy\">兑换本吧会员</button>\n        </div>\n    </div>\n    <p class=\"gray-text\">赠送补签卡1张，获得<a href=\"#\" class=\"celebrity-purchase-exp\" onclick=\"return false\" target=\"_blank\">[经验书购买权]</a>\n    </p>\n\n\n    </div>\n    <div class=\"region_footer\">        <div class=\"celebrity-cut-off\"></div>\n        <h4 class=\"celebrity-title\">本吧名人\n            <a href=\"#\" target=\"_blank\" style=\"display:none;\">[本吧全部名人]</a>\n        </h4>\n        <div class=\"celebrity-content\">\n            <div class=\"col2-left\">\n                <a href=\"/celebrity/rankHome\" target=\"_blank\">\n                    <img src=\"https://gss0.baidu.com/7Ls0a8Sm2Q5IlBGlnYG/sys/portrait/item/tb.1.4c9ca83.SHKh84lbMr4VzyBLxli1WQ\" width=\"80\"\n                         height=\"80\"/>\n                </a>\n            </div>\n            <div class=\"col2-right\">\n                <p class=\"name\">张起灵<i class=\"icon-red\"></i></p>\n\n                <div class=\"user_level clearfix\">\n                    <a href=\"/celebrity/rankHome\" target=\"_blank\" class=\"celebrity-level\">\n    <span class=\"label\">等级: </span>\n    <span class=\"level\">\n        <span class=\"level-text\">68</span>\n    </span>\n</a>                </div>\n                <p>\n                    <a href=\"/celebrity/rankHome\" target=\"_blank\">贴吧名人榜：</a>\n                    <b class=\"red-text\">19</b>\n                </p>\n            </div>\n        </div>\n        <a href=\"javascript:\" class=\"btn btn-celebrity j-btn-celebrity\">助攻名人，领特权</a>\n                    <p class=\"tip\">\n                <i class=\"icon-horn\"></i>盗墓笔记专属张起灵发贴气泡            </p>\n            </div>\n</div>\n--></code><script>Bigpipe.register(\"encourage-celebrity/pagelet/celebrity\", {\"parent\":\"frs-aside\\/pagelet\\/novel_aside\",\"scripts\":[\"\\/tb\\/_\\/celebrity_widget_a676416.js\",\"\\/tb\\/_\\/celebrity_forum_dialog_53e0e6b.js\",\"\\/tb\\/_\\/user_api_10e048c.js\",\"\\/tb\\/_\\/umoney_query_e6ef23a.js\",\"\\/tb\\/_\\/global_switch_6dfeb89.js\",\"\\/tb\\/_\\/icons_983b4c0.js\",\"\\/tb\\/_\\/base_user_data_ff57bd7.js\",\"\\/tb\\/_\\/base_dialog_user_bar_6dc620e.js\",\"\\/tb\\/_\\/qianbao_cashier_dialog_aa111c7.js\",\"\\/tb\\/_\\/qianbao_purchase_tdou_f4c69c0.js\",\"\\/tb\\/_\\/tdou_open_type_a72e1ed.js\",\"\\/tb\\/_\\/login_dialog_8cc35e4.js\",\"\\/tb\\/_\\/tdou_template_8d6b3f6.js\",\"\\/tb\\/_\\/tdou_builder_05260c9.js\",\"\\/tb\\/_\\/tdou_view_util_d282db0.js\",\"\\/tb\\/_\\/rsa_safe_ffe2fa7.js\",\"\\/tb\\/_\\/paykey_safe_payment_f7a973d.js\",\"\\/tb\\/_\\/captcha_d99d16f.js\",\"\\/tb\\/_\\/captcha_dialog_ceaacd2.js\",\"\\/tb\\/_\\/captcha_safe_payment_7f700b4.js\",\"\\/tb\\/_\\/mobile_safe_payment_b2a273c.js\",\"\\/tb\\/_\\/tbean_safe_3668241.js\",\"\\/tb\\/_\\/tbean_safe_ajax_5dbae2e.js\",\"\\/tb\\/_\\/tdou_data_747c462.js\",\"\\/tb\\/_\\/tdou_view_check_f11908d.js\",\"\\/tb\\/_\\/tdou_counter_cbe5c8a.js\",\"\\/tb\\/_\\/tdou_view_fec0b7b.js\",\"\\/tb\\/_\\/qianbao_purchase_member_fad1d66.js\",\"\\/tb\\/_\\/messenger_e5c0696.js\",\"\\/tb\\/_\\/cashier_dialog_d52cf7c.js\",\"\\/tb\\/_\\/pay_member_c57f92d.js\",\"\\/tb\\/_\\/umoney_1379f71.js\",\"\\/tb\\/_\\/tdou_view_operation_bootstrap_4a983b5.js\",\"\\/tb\\/_\\/tdou_view_cashier_6afe462.js\",\"\\/tb\\/_\\/tdou_view_auto_redirect_a353d12.js\",\"\\/tb\\/_\\/tdou_view_pay_46c8c05.js\",\"\\/tb\\/_\\/tdou_3289666.js\",\"\\/tb\\/_\\/show_dialog_d46d0a5.js\",\"\\/tb\\/_\\/payment_dialog_title_3e773b9.js\",\"\\/tb\\/_\\/tdou_get_38af9fd.js\",\"\\/tb\\/_\\/tcharge_dialog_5da22d7.js\",\"\\/tb\\/_\\/join_vip_dialog_9242ef7.js\",\"\\/tb\\/_\\/forum_member_dialog_70f37b2.js\",\"\\/tb\\/_\\/exp_package_dialog_8f11fec.js\",\"\\/tb\\/_\\/npc_vote_action_7e4135b.js\",\"\\/tb\\/_\\/celebrity_617ff5d.js\",\"\\/tb\\/_\\/dialog_d31c70c.js\",\"\\/tb\\/_\\/util_fdb7481.js\",\"\\/tb\\/_\\/cont_sign_card_518234f.js\",\"\\/tb\\/_\\/net_proxy_f5ecab7.js\",\"\\/tb\\/_\\/use_controller_e92bca8.js\",\"\\/tb\\/_\\/buy_controller_cc40438.js\",\"\\/tb\\/_\\/celebrity_expball_6f45af5.js\"],\"styles\":[\"\\/tb\\/_\\/aside_region_6df4cfc.css\",\"\\/tb\\/_\\/celebrity_widget_9e5b727.css\",\"\\/tb\\/_\\/celebrity_forum_dialog_e9301fc.css\",\"\\/tb\\/_\\/umoney_query_d15a716.css\",\"\\/tb\\/_\\/icons_fba8214.css\",\"\\/tb\\/_\\/base_user_data_f665ab7.css\",\"\\/tb\\/_\\/base_dialog_user_bar_69fdf18.css\",\"\\/tb\\/_\\/qianbao_cashier_dialog_179e56e.css\",\"\\/tb\\/_\\/qianbao_purchase_tdou_4b31f54.css\",\"\\/tb\\/_\\/login_dialog_8bacf9a.css\",\"\\/tb\\/_\\/tdou_template_781e4d0.css\",\"\\/tb\\/_\\/paykey_safe_payment_8f2a8db.css\",\"\\/tb\\/_\\/captcha_30e4d3c.css\",\"\\/tb\\/_\\/captcha_safe_payment_d41d8cd.css\",\"\\/tb\\/_\\/mobile_safe_payment_77949bb.css\",\"\\/tb\\/_\\/tbean_safe_3c779a3.css\",\"\\/tb\\/_\\/tbean_safe_ajax_d41d8cd.css\",\"\\/tb\\/_\\/qianbao_purchase_member_264deea.css\",\"\\/tb\\/_\\/cashier_dialog_0d74ed0.css\",\"\\/tb\\/_\\/pay_member_d41d8cd.css\",\"\\/tb\\/_\\/umoney_f12b09a.css\",\"\\/tb\\/_\\/tdou_d41d8cd.css\",\"\\/tb\\/_\\/payment_dialog_title_5433211.css\",\"\\/tb\\/_\\/tdou_get_4b2272d.css\",\"\\/tb\\/_\\/tcharge_dialog_a6fd677.css\",\"\\/tb\\/_\\/forum_member_dialog_3f40ec8.css\",\"\\/tb\\/_\\/exp_package_dialog_f0ccd89.css\",\"\\/tb\\/_\\/npc_vote_action_5b250b1.css\",\"\\/tb\\/_\\/celebrity_1ee9ced.css\",\"\\/tb\\/_\\/dialog_6ed86bb.css\",\"\\/tb\\/_\\/cont_sign_card_6369333.css\",\"\\/tb\\/_\\/buy_controller_9c17778.css\",\"\\/tb\\/_\\/celebrity_expball_cf1e81d.css\"]}).then(function(pagelet){    _.Module.use('encourage-celebrity/widget/celebrity', {\n        celebrity: {\"celebrity_status\":\"2\",\"fans_head_pic\":\"1428567399079.png\",\"fans_name\":\"\\u76d7\\u5893\\u7b14\\u8bb0\",\"fans_tail_pic\":\"1428567399079.png\",\"npc_info\":[{\"cur_level\":68,\"level_id\":16,\"level_name\":\"\\u5929\\u5bab\\u91cd\\u73b0\",\"npc_avatar\":\"tb.1.4c9ca83.SHKh84lbMr4VzyBLxli1WQ\",\"npc_fans_name\":\"\\u76d7\\u5893\\u7b14\\u8bb0\",\"npc_id\":1337623679,\"npc_name\":\"\\u5f20\\u8d77\\u7075\",\"npc_rank\":19,\"npc_vip_level\":0,\"props_id\":\"1010106\",\"props_title\":\"\\u5f20\\u8d77\\u7075\\u53d1\\u8d34\\u6c14\\u6ce1\"}]},\n        isCelebrityForum: true,\n        user: {\"is_login\":false,\"Parr_scores\":{\"scores_money\":0,\"scores_other\":0},\"mParr_props\":null},\n        forum: {\"forum_id\":1525417,\"forum_name\":null},\n        isCurForumMember: false,\n        memberLastDays: 0    });\n    _.Module.use('encourage-celebrity/widget/celebrity_expball', {\"pageData\":{\"Parr_scores\":null,\"Parr_props\":null,\"forum\":{\"forum_id\":1525417,\"forum_name\":\"\\u76d7\\u5893\\u7b14\\u8bb0\",\"dir_info\":{\"level_1_name\":\"\\u6587\\u5b66\",\"level_2_name\":\"\\u5947\\u5e7b\\u00b7\\u7384\\u5e7b\\u5c0f\\u8bf4\"},\"kw\":\"\\u76d7\\u5893\\u7b14\\u8bb0\",\"title\":\"\\u76d7\\u5893\\u7b14\\u8bb0\\u5427-\\u767e\\u5ea6\\u8d34\\u5427--\\u559c\\u7231\\u76d7\\u5893\\u7b14\\u8bb0\\u7684\\u6709\\u7231\\u7a3b\\u7c73\\u805a\\u96c6\\u5730--\\u76d7\\u5893\\u7b14\\u8bb0\\u5427\\u81f4\\u529b\\u4e8e\\u4e3a\\u5e7f\\u5927\\u559c\\u7231\\u300a\\u76d7\\u5893\\u7b14\\u8bb0\\u300b\\u7684\\u5427\\u53cb\\u670d\\u52a1\\uff0c\\u4f20\\u9012\\u5b98\\u65b9\\u6700\\u65b0\\u8d44\\u8baf\\uff0c\\u5c0f\\u8bf4\\u76f8\\u5173\\u540c\\u4eba\\u4f5c\\u54c1\\uff0c\\u9f13\\u52b1\\u5427\\u53cb\\u539f\\u521b\\u7cbe\\u54c1\\uff0c\\u89e3\\u5bc6\\u5206\\u6790\\u3001\\u56fe\\u7247\\u3001\\u6587\\u7ae0\\u7b49\\u3002\",\"description\":\"\\u672c\\u5427\\u70ed\\u5e16: 1-\\u5347\\u7ea7\\u5347\\u7ea7\\u5347\\u7ea7\\u5347\\u7ea7 2-\\u4e0d\\u662f\\uff0c\\u548b\\u76d7\\u5893\\u7b14\\u8bb0\\u90fd\\u80fd\\u78d5cp\\u554a 3-\\u4e0d\\u662f\\u5427\\uff0c\\u8fd9\\u7bc7\\u4e0d\\u4f1a\\u548c\\u738b\\u6bcd\\u9b3c\\u5bb4\\u6545\\u4e8b\\u6709\\u5173\\u5427\\uff1f 4-\\u8fd9\\u5e74\\u5934\\u4ec0\\u4e48\\u4eba\\u90fd\\u80fd\\u81ea\\u79f0\\u7a3b\\u7c73\\u5417 5-\\u660e\\u5e74\\u5c31\\u662f2025\\u5e74\\u4e86\\uff0c\\u5b9e\\u6253\\u5b9e\\u8ffd\\u4e8610\\u5e74\\uff0c\\u611f\\u89c9\\u8ffd\\u4e86\\u4e2a\\u5bc2\\u5bde 6-\\u76d7\\u5893\\u7b14\\u8bb0\\u5168\\u96c6 txt\\u5c0f\\u8bf4\\uff0c\\u5df2\\u6574\\u7406 7-\\u5f20\\u8d77\\u7075\\u751f\\u5b69\\u5b50\\uff1f\\u2026.. 8-\\u559c\\u6b22\\u76d7\\u5893\\u7b14\\u8bb0\\u7684\\u5973\\u751f\\u8fc7\\u751f\\u65e5\\u9001\\u4ec0\\u4e48\\u597d 9-\\u3010\\u5f20\\u8d77\\u7075\\u5bb6\\u65cf\\u3011\\u4e13\\u5c5e\\u6c34\\u697c 10-\\u6709\\u6ca1\\u6709\\u660e\\u5e74817\\u53ef\\u4ee5\\u53bb\\u957f\\u767d\\u5c71\\u7684\\u5986\\u5a18\\u554a 11-\\u6709\\u7591\\u95ee\\uff0c\\u6c42\\u89e3\\u7b54\",\"keywords\":\"\\u76d7\\u5893\\u7b14\\u8bb0,\\u5947\\u5e7b\\u00b7\\u7384\\u5e7b\\u5c0f\\u8bf4,\\u6587\\u5b66\",\"is_private_forum\":0},\"user\":{\"is_login\":false,\"user_id\":0,\"user_name\":\"\",\"no_un\":false,\"mobile\":\"\",\"email\":\"\",\"ipv6\":\"\",\"is_new_user\":1,\"portrait\":\"00000000\",\"start_time\":1723088812,\"frs_login_switch\":false,\"interaction_switch\":false,\"login_day\":5,\"creator_perm\":0,\"is_videocreator\":false,\"pop_up_info\":null,\"is_business_account\":0,\"is_uc_account\":0,\"login_popup_phone_switch\":0,\"no_login_user_browse_switch\":0}}}, function (expball) {\n        var $voteNum = $('.j_vote_num');\n        expball.setCallback(function (data) {\n            $voteNum.html(+$voteNum.html() + (data['add_vote_num'] || 0));\n        });\n    });\n});</script><code class=\"pagelet_html\" id=\"pagelet_html_frs-aside/pagelet/aside_ad\" style=\"display:none;\"><!--\n--></code><script>Bigpipe.register(\"frs-aside/pagelet/aside_ad\", {\"parent\":\"frs-aside\\/pagelet\\/novel_aside\",\"scripts\":[\"\\/tb\\/_\\/frs-aside\\/aside_ad_5b0ddf0.js\"],\"styles\":[\"\\/tb\\/_\\/frs-aside\\/aside_ad_d427605.css\"]}).then(function(pagelet){    _.Module.use('frs-aside/pagelet/aside_ad', {\n        flowType: \"default\",\n        showFC: false,\n        showMediago: false    });\n});</script><code class=\"pagelet_html\" id=\"pagelet_html_encourage-tbguess/pagelet/sidebar\" style=\"display:none;\"><!----></code><script>Bigpipe.register(\"encourage-tbguess/pagelet/sidebar\", {\"parent\":\"frs-aside\\/pagelet\\/novel_aside\",\"scripts\":[\"\\/tb\\/_\\/rsa_safe_ffe2fa7.js\",\"\\/tb\\/_\\/paykey_safe_payment_f7a973d.js\",\"\\/tb\\/_\\/captcha_d99d16f.js\",\"\\/tb\\/_\\/captcha_dialog_ceaacd2.js\",\"\\/tb\\/_\\/captcha_safe_payment_7f700b4.js\",\"\\/tb\\/_\\/mobile_safe_payment_b2a273c.js\",\"\\/tb\\/_\\/tbean_safe_3668241.js\",\"\\/tb\\/_\\/tbean_safe_ajax_5dbae2e.js\",\"\\/tb\\/_\\/user_api_10e048c.js\",\"\\/tb\\/_\\/icons_983b4c0.js\",\"\\/tb\\/_\\/login_dialog_8cc35e4.js\",\"\\/tb\\/_\\/base_user_data_ff57bd7.js\",\"\\/tb\\/_\\/mixin_1bbd23e.js\",\"\\/tb\\/_\\/bean_02aa086.js\",\"\\/tb\\/_\\/guess_d6b19f8.js\",\"\\/tb\\/_\\/sidebar_0325eab.js\"],\"styles\":[\"\\/tb\\/_\\/paykey_safe_payment_8f2a8db.css\",\"\\/tb\\/_\\/captcha_30e4d3c.css\",\"\\/tb\\/_\\/captcha_safe_payment_d41d8cd.css\",\"\\/tb\\/_\\/mobile_safe_payment_77949bb.css\",\"\\/tb\\/_\\/tbean_safe_3c779a3.css\",\"\\/tb\\/_\\/tbean_safe_ajax_d41d8cd.css\",\"\\/tb\\/_\\/icons_fba8214.css\",\"\\/tb\\/_\\/login_dialog_8bacf9a.css\",\"\\/tb\\/_\\/base_user_data_f665ab7.css\",\"\\/tb\\/_\\/mixin_d228409.css\",\"\\/tb\\/_\\/bean_d41d8cd.css\",\"\\/tb\\/_\\/guess_3c31a66.css\",\"\\/tb\\/_\\/sidebar_2541a8b.css\"]}).then(function(pagelet){    _.Module.getInstance('encourage-tbguess/widget/mixin', function (mixin) {\n        mixin.bindData({\"mineGuessInfo\":{\"count\":0,\"bean\":0,\"scores\":{\"total\":0,\"money\":0,\"other\":0}},\"homeForum\":\"\\u7ade\\u6280\\u4f53\\u80b2\",\"mineAwardMap\":[]});\n    });\n});</script><code class=\"pagelet_html\" id=\"pagelet_html_frs-aside/pagelet/star\" style=\"display:none;\"><!----></code><script>Bigpipe.register(\"frs-aside/pagelet/star\", {\"parent\":\"frs-aside\\/pagelet\\/novel_aside\",\"scripts\":[],\"styles\":[]}).then(function(pagelet){});</script><code class=\"pagelet_html\" id=\"pagelet_html_frs-aside/pagelet/forum_info\" style=\"display:none;\"><!--<div class=\"aside_region forum_info j_forum_info\" id=\"\">\n    <h4 class=\"region_header clearfix\">\n        本吧信息        <span class=\"pull_right j_op\"><a rel=\"noopener\"  target=\"_blank\" href=\"/bawu2/platform/detailsInfo?word=%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&amp;ie=utf-8\">查看详情&gt;&gt;</a>\n </span>\n    </h4>\n    <div class=\"region_cnt clearfix\">\n\n\n\n\n    <div class=\"author-manager media_horizontal clearfix\">\n      <a rel=\"noopener\"  href=\"//tieba.baidu.com/tbvip/literary/index\" target=\"_blank\"\n         class=\"interface2\">百度贴吧作者认证</a>\n    </div>\n\n      <ul class=\"manager_groups aside_media_horizontal clearfix\">\n                                <li class=\"media_vertical \">\n                                <a rel=\"noopener\"  class=\"media_top manager_media\" href=\"/home/main/?id=tb.1.24154427.YTwoIQo7gBj5OQLyYzweOA&amp;fr=frs\"\n                   target=\"_blank\" title=\"稻米小黄鸡\">\n                    <img src=\"https://gss0.bdstatic.com/6LZ1dD3d1sgCo2Kml5_Y_D3/sys/portrait/item/tb.1.24154427.YTwoIQo7gBj5OQLyYzweOA\" alt=\"\">\n                                            <span class=\"media_caption\">吧主</span>\n                                    </a>\n\n                <div class=\"text_overflow media_bottom\">\n                    <a rel=\"noopener\"  href=\"/home/main/?id=tb.1.24154427.YTwoIQo7gBj5OQLyYzweOA&amp;fr=frs\" target=\"_blank\"\n                       title=\"稻米小黄鸡\">稻米小黄鸡 </a>\n                                    </div>\n            </li>\n            </ul>\n<div id=\"tbManagerCandidatesNum\" style=\"display:none\">\n    </div>\n\n\n    <p class=\"forum_info_desc\">\n        <span>小吧：</span>小吧主共<em>11</em>人\n    </p>\n<p class=\"forum_info_desc\">\n    <span>会员：</span>\n    <a rel=\"noopener\"  id=\"member_name_link\" href=\"/bawu2/platform/listMemberInfo?word=%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&ie=utf-8\"\n       target=\"_blank\">盗墓党</a>\n        </p>\n<p class=\"forum_info_desc\">\n    <span>目录：</span>\n            <a rel=\"noopener\"  href=\"/f/fdir?fd=%E6%96%87%E5%AD%A6&ie=utf-8&amp;sd=%E5%A5%87%E5%B9%BB%C2%B7%E7%8E%84%E5%B9%BB%E5%B0%8F%E8%AF%B4&ie=utf-8\"\n           target=\"_blank\">奇幻·玄幻小说</a>\n    </p>\n\n<div class=\"apply_groups\">\n            <span id=\"tbManagerApply\"></span>\n                <ins>|</ins>\n        <span id=\"tbManagerAssistApply\"><a rel=\"noopener\"  class=\"frs_apply_assist j_btn_apply_assist\"\n                                           href=\"/bawu2/platform/listCandidateInfo?word=%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&ie=utf-8\">申请小吧主</a></span>\n    </div>\n\n\n    </div>\n    <div class=\"region_footer\"></div>\n</div>\n--></code><script>Bigpipe.register(\"frs-aside/pagelet/forum_info\", {\"parent\":\"frs-aside\\/pagelet\\/novel_aside\",\"scripts\":[\"\\/tb\\/_\\/login_dialog_8cc35e4.js\",\"\\/tb\\/_\\/word_limit_c30df3b.js\",\"\\/tb\\/_\\/forbidden_ea6d3fd.js\",\"\\/tb\\/_\\/frs-aside\\/forum_info_51f8c44.js\"],\"styles\":[\"\\/tb\\/_\\/aside_region_6df4cfc.css\",\"\\/tb\\/_\\/login_dialog_8bacf9a.css\",\"\\/tb\\/_\\/word_limit_3c5481d.css\",\"\\/tb\\/_\\/forbidden_752e552.css\",\"\\/tb\\/_\\/frs-aside\\/forum_info_6bd1ba5.css\"]}).then(function(pagelet){    _.Module.use('frs-aside/widget/forum_info', [\n        1,\n        0,\n        PageData.forum,\n        {\n            is_block: 0,\n            block_reason: '',\n            opgroup: '',\n            days_tofree:0,\n        },\n        false    ]);\n});</script><code class=\"pagelet_html\" id=\"pagelet_html_frs-aside/pagelet/zyq\" style=\"display:none;\"><!--<div class=\"aside_region zyq_mod_link j_zyq_mod_link\" id=\"\">\n    <h4 class=\"region_header clearfix\">\n        金缕玉衣        <span class=\"pull_right j_op\"> </span>\n    </h4>\n    <div class=\"region_cnt clearfix\">\n            <ul class=\"unordered_list_dot\">\n                    <li><a rel=\"noopener\"  href=\"http://weibo.com/npss\" target=\"_blank\" class=\"j_mod_item\">【南派三叔 新浪微博】</a></li>\n                    <li><a rel=\"noopener\"  href=\"http://tieba.baidu.com/home/main?id=b5ecc4cfc5c9b5c4c8fdcae5f200&amp;fr=itb\" target=\"_blank\" class=\"j_mod_item\">【南派三叔 贴吧账号】</a></li>\n                    <li><a rel=\"noopener\"  href=\"http://weibo.com/daomubijiba\" target=\"_blank\" class=\"j_mod_item\">【盗吧官方 新浪微博】</a></li>\n                    <li><a rel=\"noopener\"  href=\"https://tieba.baidu.com/p/6388875091\" target=\"_blank\" class=\"j_mod_item\">【盗墓笔记 入吧导航】</a></li>\n            </ul>\n    </div>\n    <div class=\"region_footer\"></div>\n</div>\n<div class=\"aside_region zyq_mod_friend j_zyq_mod_friend\" id=\"\">\n    <h4 class=\"region_header clearfix\">\n        友情贴吧        <span class=\"pull_right j_op\"> </span>\n    </h4>\n    <div class=\"region_cnt clearfix\">\n            <ul class=\"aside_media_horizontal clearfix\">\n                    <li class=\"media_vetical \">\n                <a rel=\"noopener\"  class=\"media_top\" href=\"/f?kw=藏海花&frs=yqtb\" target=\"_blank\" title=\"藏海花\">\n                <img src=\"https://tiebapic.baidu.com/forum/wh%3D60%2C60%3B/sign=f59cf4d5f0fd5266a77e34129b34a11b/9a504fc2d5628535918a2a1fd6ef76c6a7ef63a2.jpg?tbpicau=2024-08-19-05_a0e06f9f9cf4088f386134d37724e73d\" alt=\"\"></a>\n                <div class=\"text_overflow media_bottom\">\n                    <a rel=\"noopener\"  href=\"/f?kw=藏海花&frs=yqtb\" target=\"_blank\" class=\"j_mod_item\" title=\"藏海花\">藏海花</a>\n                </div>\n            </li>\n                    <li class=\"media_vetical \">\n                <a rel=\"noopener\"  class=\"media_top\" href=\"/f?kw=沙海&frs=yqtb\" target=\"_blank\" title=\"沙海\">\n                <img src=\"https://tiebapic.baidu.com/forum/wh%3D60%2C60%3B/sign=dfcb41e9970a19d8cb568c0303d6b4bb/359b033b5bb5c9ea06ba1bbbc239b6003af3b318.jpg?tbpicau=2024-08-19-05_c50674c6bd177be3ac152fea260b4eac\" alt=\"\"></a>\n                <div class=\"text_overflow media_bottom\">\n                    <a rel=\"noopener\"  href=\"/f?kw=沙海&frs=yqtb\" target=\"_blank\" class=\"j_mod_item\" title=\"沙海\">沙海</a>\n                </div>\n            </li>\n                    <li class=\"media_vetical media_last\">\n                <a rel=\"noopener\"  class=\"media_top\" href=\"/f?kw=老九门&frs=yqtb\" target=\"_blank\" title=\"老九门\">\n                <img src=\"https://tiebapic.baidu.com/forum/wh%3D60%2C60%3B/sign=7ae6876916e93901565785384bc062d7/0bd162d9f2d3572c17e0a3959d13632762d0c37c.jpg?tbpicau=2024-08-19-05_76ebda79f8d45971ec393f681a0b9413\" alt=\"\"></a>\n                <div class=\"text_overflow media_bottom\">\n                    <a rel=\"noopener\"  href=\"/f?kw=老九门&frs=yqtb\" target=\"_blank\" class=\"j_mod_item\" title=\"老九门\">老九门</a>\n                </div>\n            </li>\n            </ul>\n    </div>\n    <div class=\"region_footer\"></div>\n</div>\n--></code><script>Bigpipe.register(\"frs-aside/pagelet/zyq\", {\"parent\":\"frs-aside\\/pagelet\\/novel_aside\",\"scripts\":[\"\\/tb\\/_\\/frs-aside\\/zyq_3a18750.js\",\"\\/tb\\/_\\/frs-aside\\/define_link_20c468f.js\",\"\\/tb\\/_\\/frs-aside\\/friend_b2f77b0.js\"],\"styles\":[\"\\/tb\\/_\\/aside_region_6df4cfc.css\"]}).then(function(pagelet){    _.Module.use('frs-aside/widget/zyq');\n});</script><code class=\"pagelet_html\" id=\"pagelet_html_frs-aside/pagelet/search_back\" style=\"display:none;\"><!----></code><script>Bigpipe.register(\"frs-aside/pagelet/search_back\", {\"parent\":\"frs-aside\\/pagelet\\/novel_aside\",\"scripts\":[],\"styles\":[]}).then(function(pagelet){});</script><code class=\"pagelet_html\" id=\"pagelet_html_frs-aside/pagelet/hottopic\" style=\"display:none;\"><!----></code><script>Bigpipe.register(\"frs-aside/pagelet/hottopic\", {\"parent\":\"frs-aside\\/pagelet\\/novel_aside\",\"scripts\":[],\"styles\":[]}).then(function(pagelet){});</script><code class=\"pagelet_html\" id=\"pagelet_html_frs-aside/pagelet/ad\" style=\"display:none;\"><!--\n\n\n--></code><script>Bigpipe.register(\"frs-aside/pagelet/ad\", {\"parent\":\"frs-aside\\/pagelet\\/novel_aside\",\"scripts\":[\"\\/tb\\/_\\/login_dialog_8cc35e4.js\",\"\\/tb\\/_\\/messenger_e5c0696.js\",\"\\/tb\\/_\\/loader_334189d.js\"],\"styles\":[\"\\/tb\\/_\\/login_dialog_8bacf9a.css\"]}).then(function(pagelet){    // TODO 多次加载白名单，需要优化\n    _.Module.use('adsense-base/widget/loader', [{\n        'whiteList':[[\"http:\\/\\/fedev.baidu.com\"],[\"http:\\/\\/jiaoyu.baidu.com\"],[\"http:\\/\\/caifu.baidu.com\"],[\"http:\\/\\/jiankang.baidu.com\"],[\"http:\\/\\/tieba.dre8.com\"],[\"http:\\/\\/tdsp.nuomi.com\"],[\"http:\\/\\/baiju.baidu.com\"],[\"http:\\/\\/temai.baidu.com\"],[\"http:\\/\\/tieba.baidu.com\"],[\"http:\\/\\/zt.chuanke.com\"],[\"http:\\/\\/window.sturgeon.mopaas.com\"],[\"http:\\/\\/api.union.vip.com\"],[\"http:\\/\\/api.dongqiudi.com\"],[\"http:\\/\\/www.chuanke.com\"],[\"http:\\/\\/dcp.kuaizitech.com\\/\"]],\n        'adValue':\"\"    }]);\n});</script><code class=\"pagelet_html\" id=\"pagelet_html_platform-base/pagelet/professional_manager\" style=\"display:none;\"><!--\n\n\n--></code><script>Bigpipe.register(\"platform-base/pagelet/professional_manager\", {\"parent\":\"frs-list\\/pagelet\\/thread\",\"scripts\":[\"\\/tb\\/_\\/professional_manager_tips_41b690e.js\"],\"styles\":[\"\\/tb\\/_\\/professional_manager_tips_4fcc4dd.css\",\"\\/tb\\/_\\/by_forum_db9c68b.css\"]}).then(function(pagelet){});</script><code class=\"pagelet_html\" id=\"pagelet_html_platform-thread/pagelet/platform_thread_header\" style=\"display:none;\"><!--\n--></code><script>Bigpipe.register(\"platform-thread/pagelet/platform_thread_header\", {\"parent\":\"frs-list\\/pagelet\\/thread\",\"scripts\":[],\"styles\":[]}).then(function(pagelet){});</script><code class=\"pagelet_html\" id=\"pagelet_html_live/pagelet/live\" style=\"display:none;\"><!--<div id=\"pagelet_live/pagelet/live_thread\"></div>--></code><script>Bigpipe.register(\"live/pagelet/live\", {\"parent\":\"frs-list\\/pagelet\\/thread\",\"scripts\":[],\"styles\":[]}).then(function(pagelet){});</script><code class=\"pagelet_html\" id=\"pagelet_html_frs-list/pagelet/thread_footer\" style=\"display:none;\"><!--\n--></code><script>Bigpipe.register(\"frs-list/pagelet/thread_footer\", {\"parent\":\"frs-list\\/pagelet\\/thread\",\"scripts\":[],\"styles\":[]}).then(function(pagelet){});</script><code class=\"pagelet_html\" id=\"pagelet_html_frs-list/pagelet/thread_list\" style=\"display:none;\"><!--\n\n<ul id=\"thread_list\" class=\"threadlist_bright j_threadlist_bright\">\n    <li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9079949995,&quot;author_name&quot;:&quot;\\u516c\\u5b50\\u4f2f\\u4ef2&quot;,&quot;author_nickname&quot;:null,&quot;author_portrait&quot;:&quot;tb.1.9115cccc.su4IfywmJ43rT4i5q38OeQ&quot;,&quot;first_post_id&quot;:150544122828,&quot;reply_num&quot;:18,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9079949995' data-thread-type=\"0\" data-floor='1''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">18</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit\n\">\n\n\n    <a rel=\"noopener\" href=\"/p/9079949995\" title=\"盗墓笔记全集+txt小说，已整理\" target=\"_blank\" class=\"j_th_tit \">盗墓笔记全集+txt小说，已整理</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 公子伯仲\"\n          data-field='{&quot;user_id&quot;:2121563791}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u516c\\u5b50\\u4f2f\\u4ef2&quot;,&quot;id&quot;:&quot;tb.1.9115cccc.su4IfywmJ43rT4i5q38OeQ&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.9115cccc.su4IfywmJ43rT4i5q38OeQ&fr=frs\" target=\"_blank\">公子伯仲</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">7-6</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n\n        </div>\n\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm9079949995\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"36338\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D160%2C90/sign=74876ad0efec8a13144f5fe1c133bdb6/e0121e23dd54564eb1f3aa06f5de9c82d0584fc5.jpg?tbpicau=2024-08-10-05_679a47d5ce95ef7db7c18577ee088667\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/e0121e23dd54564eb1f3aa06f5de9c82d0584fc5.jpg?tbpicau=2024-08-10-05_3087b2f983905b3b5e1adc0eb39a263a\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"88338\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C160%3Bcrop%3D0%2C0%2C90%2C90/sign=6746557ccdd4b31cf0699cb2b7fa1649/c5c7970a19d8bc3e9c9e48f5c48ba61ea9d345c5.jpg?tbpicau=2024-08-10-05_2a1f8dd5673b39c62ccc6a5b0a8301f0\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/c5c7970a19d8bc3e9c9e48f5c48ba61ea9d345c5.jpg?tbpicau=2024-08-10-05_5ee42f784cc1d0486457d2711760c6ee\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"50097\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C139%3Bcrop%3D0%2C0%2C90%2C90/sign=d8b2fd17707adab43d85134abbf8822f/f7999ab1cb1349542988a65b104e9258d0094ac5.jpg?tbpicau=2024-08-10-05_f0e8317a5226b7297fd5991bad64f72f\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/f7999ab1cb1349542988a65b104e9258d0094ac5.jpg?tbpicau=2024-08-10-05_7edb039ec4798b24c1d38fe7ce1b2c9a\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n\n                    </div>\n                </div>\n            </div>                    </div>\n\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 蓬莱剖状甲\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u84ec\\u83b1\\u5256\\u72b6\\u7532&quot;,&quot;id&quot;:&quot;tb.1.c6454516.E3l-f8FpSHLg7cziTJ2-Mg&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.c6454516.E3l-f8FpSHLg7cziTJ2-Mg&fr=frs\" target=\"_blank\">蓬莱剖状甲</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            11:24        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:6710984997,&quot;author_name&quot;:&quot;\\u6d77\\u697cot&quot;,&quot;author_nickname&quot;:&quot;\\u5f20\\u6d77\\u697c\\ud83c\\udf40&quot;,&quot;author_portrait&quot;:&quot;tb.1.439adf71.LJfJEp0YesoW1B1OGqBxYQ&quot;,&quot;first_post_id&quot;:132463382189,&quot;reply_num&quot;:36,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='6710984997' data-thread-type=\"0\" data-floor='2''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">36</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/6710984997\" title=\"有人知道张海琪后来怎么样了吗南部档案最后写到张海琪中了神经毒\" target=\"_blank\" class=\"j_th_tit \">有人知道张海琪后来怎么样了吗南部档案最后写到张海琪中了神经毒</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 张海楼🍀\"\n          data-field='{&quot;user_id&quot;:1074855261}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u6d77\\u697cot&quot;,&quot;id&quot;:&quot;tb.1.439adf71.LJfJEp0YesoW1B1OGqBxYQ&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.439adf71.LJfJEp0YesoW1B1OGqBxYQ&fr=frs\" target=\"_blank\">张海楼<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/3-2.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"/></a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">2020-05</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            有人知道张海琪后来怎么样了吗 南部档案最后写到张海琪中了神经毒 张家血统的能力被破坏 仅剩两个月寿命 然后在齐铁嘴的建议下和小张哥一起到了南疆寻找小哥 结识了千军万马 也就是百乐京案 但是挖了一个大坑 后来的幻境可知小张哥找到了小哥 但张海琪没有出场啊 到了盲塚也只剩下小张哥和千军万马了\n        </div>\n\n                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 降谷悠里\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u964d\\u8c37\\u60a0\\u91cc&quot;,&quot;id&quot;:&quot;tb.1.e09fe87d.PEelObaQq9QxKrJm8KTUJQ&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.e09fe87d.PEelObaQq9QxKrJm8KTUJQ&fr=frs\" target=\"_blank\">降谷悠里</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            11:20        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><div id=\"mediago-tb-frs-list-2\" data-po=\"2\"></div><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9017590509,&quot;author_name&quot;:&quot;\\u91d1\\u82f9\\u679c336633&quot;,&quot;author_nickname&quot;:&quot;\\u9ad8\\u9526\\ud83d\\udca5&quot;,&quot;author_portrait&quot;:&quot;tb.1.3218aa12.gWsrhmnepEEjNKDVXZdjMg&quot;,&quot;first_post_id&quot;:150280689996,&quot;reply_num&quot;:82,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9017590509' data-thread-type=\"71\" data-floor='3''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">82</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9017590509\" title=\"盗墓笔记吧，如何成为盟主\" target=\"_blank\" class=\"j_th_tit \">盗墓笔记吧，如何成为盟主</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author no_icon_author\"\n          title=\"主题作者: 高锦💥\"\n          data-field='{&quot;user_id&quot;:1279881667}' ><i class=\"icon_author\"></i><span class=\"pre_icon_wrap pre_icon_wrap_theme1 frs_bright_preicon\"><a class=\"icon_tbworld icon-crown-vip\" href=\"/tbmall/tshow\" data-field='{&quot;user_id&quot;:1279881667}' target=\"_blank\" title=\"贴吧会员\"></a></span><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u91d1\\u82f9\\u679c336633&quot;,&quot;id&quot;:&quot;tb.1.3218aa12.gWsrhmnepEEjNKDVXZdjMg&quot;,&quot;target_scheme&quot;:null}' title=\"该用户已经连续签到309天了，连续30天一举“橙”名\" class=\"frs-author-name sign_highlight j_user_card  vip_red \" href=\" /home/main/?id=tb.1.3218aa12.gWsrhmnepEEjNKDVXZdjMg&fr=frs\" target=\"_blank\">封尊已踏天</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/102_14.png?stamp=1723012493) no-repeat -700px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"tianxie\" data-field='{&quot;name&quot;:&quot;tianxie&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:102,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u5929\\u874e\\u5ea7\\u5370\\u8bb0&quot;,&quot;intro&quot;:&quot;\\u83b7\\u53d6\\u89c4\\u5219\\uff1a\\u5728\\u661f\\u5ea7\\u52cb\\u7ae0\\u9986\\u4e2d\\u83b7\\u5f97\\u3002&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,14&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search\"  class=\"j_icon_slot\"  title=\"天蝎座印记\"  locate=\"tianxie_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">5-15</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            盗墓笔记吧，我的盟主之路 学徒 弟子 堂主 护法 长老 掌门 下一步，盟主<span class=\"topic-tag\" data-flag=\"0\" data-name=\"%E5%90%B4%E9%82%AA\">#吴邪#</span><span class=\"topic-tag\" data-flag=\"0\" data-name=\"%E5%BC%A0%E8%B5%B7%E7%81%B5\">#张起灵#</span><span class=\"topic-tag\" data-flag=\"0\" data-name=\"%E7%8E%8B%E8%83%96%E5%AD%90\">#王胖子#</span> 。。。\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm9017590509\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"83061\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C102%3Bcrop%3D0%2C0%2C90%2C90/sign=3cd772f95dd5ad6eaaac6ce3b1e708eb/0802ba345982b2b73e6e70f977adcbef77099be5.jpg?tbpicau=2024-08-10-05_90559a01e02684268eac9fd365816ff9\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/0802ba345982b2b73e6e70f977adcbef77099be5.jpg?tbpicau=2024-08-10-05_b8492b1808d0200d14b2c2951b8ec8b0\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"47137\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C104%3Bcrop%3D0%2C0%2C90%2C90/sign=42a2a1c917da81cb4eb38bc4624ae126/04724e82b2b7d0a2e3384da08def76094a369ae5.jpg?tbpicau=2024-08-10-05_878f139b717d2aa91b6f6bbd6fc7c032\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/04724e82b2b7d0a2e3384da08def76094a369ae5.jpg?tbpicau=2024-08-10-05_1ebb406a51ab6487db42f7e68f329db7\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"44808\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C99%3Bcrop%3D0%2C0%2C90%2C90/sign=34ffb4989743ad4ba67b4ec9b22e6396/3e9bb644ad3459825f7bacaf4af431adcaef84e5.jpg?tbpicau=2024-08-10-05_d79b12aebd6cb64a91b75e95a7127e65\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/3e9bb644ad3459825f7bacaf4af431adcaef84e5.jpg?tbpicau=2024-08-10-05_0d361be821ce4ae669a19ae9953dac70\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n                        <div class=\"small_pic_num center_text\">共&nbsp;23&nbsp;张</div>\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 高锦💥\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u91d1\\u82f9\\u679c336633&quot;,&quot;id&quot;:&quot;tb.1.3218aa12.gWsrhmnepEEjNKDVXZdjMg&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card  vip_red \" href=\"/home/main/?id=tb.1.3218aa12.gWsrhmnepEEjNKDVXZdjMg&fr=frs\" target=\"_blank\">封尊已踏天</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            11:18        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9119398016,&quot;author_name&quot;:&quot;y2607254515&quot;,&quot;author_nickname&quot;:null,&quot;author_portrait&quot;:&quot;tb.1.e57ac5bc.sNKumy78SvfzNa5EguJi4A&quot;,&quot;first_post_id&quot;:150725193626,&quot;reply_num&quot;:11,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9119398016' data-thread-type=\"0\" data-floor='4''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">11</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9119398016\" title=\"有疑问，求解答\" target=\"_blank\" class=\"j_th_tit \">有疑问，求解答</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: y2607254515\"\n          data-field='{&quot;user_id&quot;:5874850283}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;y2607254515&quot;,&quot;id&quot;:&quot;tb.1.e57ac5bc.sNKumy78SvfzNa5EguJi4A&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.e57ac5bc.sNKumy78SvfzNa5EguJi4A&fr=frs\" target=\"_blank\">y2607254515</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">8-6</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            吴三省和解连环互换身份不就是为了消灭汪家人吗？那为什么在吴邪消灭汪家人之后，吴三省还不出来呢？<span class=\"topic-tag\" data-flag=\"0\" data-name=\"%E5%90%B4%E9%82%AA\">#吴邪#</span>\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm9119398016\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"27169\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D115%2C90/sign=e3edc4396bf5e0feee4d81006d551891/2e47b68b87d6277f8dddf9186e381f30e824fc8e.jpg?tbpicau=2024-08-10-05_765313c33891a6d4073c7973d143df69\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/2e47b68b87d6277f8dddf9186e381f30e824fc8e.jpg?tbpicau=2024-08-10-05_d65b23eafc085cb179bf12e9b5d8caa4\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 入-夜微凉ლ\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u538c\\u9152\\u5ba2&quot;,&quot;id&quot;:&quot;tb.1.7c3946af.BeqjpCJmOtEaF46R5ViWJg&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.7c3946af.BeqjpCJmOtEaF46R5ViWJg&fr=frs\" target=\"_blank\">入<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/1-3.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"/>夜微...</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            10:51        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9112665546,&quot;author_name&quot;:&quot;\\u95fb\\u63d0\\u6653&quot;,&quot;author_nickname&quot;:&quot;\\u27285x70\\u2728&quot;,&quot;author_portrait&quot;:&quot;tb.1.3ad0ec8d.HJT3uiaJFSFbxDY1Pm6TLg&quot;,&quot;first_post_id&quot;:150695732319,&quot;reply_num&quot;:47,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9112665546' data-thread-type=\"0\" data-floor='5''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">47</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9112665546\" title=\"明年就是2025年了，实打实追了10年，感觉追了个寂寞\" target=\"_blank\" class=\"j_th_tit \">明年就是2025年了，实打实追了10年，感觉追了个寂寞</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: ✨5x70✨\"\n          data-field='{&quot;user_id&quot;:233672503}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u95fb\\u63d0\\u6653&quot;,&quot;id&quot;:&quot;tb.1.3ad0ec8d.HJT3uiaJFSFbxDY1Pm6TLg&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.3ad0ec8d.HJT3uiaJFSFbxDY1Pm6TLg&fr=frs\" target=\"_blank\"><img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/3-27.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"/>5x70<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/3-27.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"/></a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/102_14.png?stamp=1723012493) no-repeat -1100px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"chunv\" data-field='{&quot;name&quot;:&quot;chunv&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:102,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u5904\\u5973\\u5ea7\\u5370\\u8bb0&quot;,&quot;intro&quot;:&quot;\\u83b7\\u53d6\\u89c4\\u5219\\uff1a\\u5728\\u661f\\u5ea7\\u52cb\\u7ae0\\u9986\\u4e2d\\u83b7\\u5f97\\u3002&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,22&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search\"  class=\"j_icon_slot\"  title=\"处女座印记\"  locate=\"chunv_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1723012493) no-repeat -4000px  0;top:0px;left:28px\" data-slot=\"2\"  data-name=\"starmaster\" data-field='{&quot;name&quot;:&quot;starmaster&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;2&quot;,&quot;title&quot;:&quot;\\u624b\\u6e380\\u661f\\u8fbe\\u4eba&quot;,&quot;intro&quot;:&quot;\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;5&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,76&quot;,&quot;2&quot;:&quot;1723012493,77&quot;,&quot;3&quot;:&quot;1723012493,78&quot;,&quot;4&quot;:&quot;1723012493,79&quot;,&quot;5&quot;:&quot;1723012493,80&quot;,&quot;6&quot;:&quot;1723012493,81&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/f?kw=玩家认证&amp;ie=utf-8\"  class=\"j_icon_slot\"  title=\"手游0星达人\"  locate=\"starmaster_5#icon\"  style=\"top: 0px; left:28px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">8-1</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            这10年三叔藏海花没填，沙海没填，重启没修完 这10年三叔干了啥 拍了盗墓笔记季播剧 拍了盗墓笔记大电影 拍了沙海 拍了老九门 拍了云顶天宫 拍了重启之极海听雷 拍了怒海潜沙&amp;秦岭神树 拍了重启之蛇谷佛蜕变 卖了版权，拍了藏海传 后面还有个没上的藏海花 除了藏海花因为还没上，沙海秦昊出演的部分，重启前10集，剩下的就跟屎一样，甚至藏海传连屎都不如。 然后，这十年写了三本雨村笔记+半本花夜前行 以前周边还是个铁三角或者嫩牛五\n        </div>\n\n                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 听阴天说什么º\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u776c\\u4f76\\u7a0b\\u572auGi&quot;,&quot;id&quot;:&quot;tb.1.b55e2cbd.ukrbGB62kejRZP34nDx3Zw&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.b55e2cbd.ukrbGB62kejRZP34nDx3Zw&fr=frs\" target=\"_blank\">听阴天说...</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            10:21        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9050769019,&quot;author_name&quot;:&quot;bb2yjm&quot;,&quot;author_nickname&quot;:null,&quot;author_portrait&quot;:&quot;tb.1.ff7f490e.qRdtR_Go1fhCMDl7nxRsUQ&quot;,&quot;first_post_id&quot;:150423778400,&quot;reply_num&quot;:6,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9050769019' data-thread-type=\"0\" data-floor='6''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">6</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9050769019\" title=\"盗墓笔记中，在吴邪去探墓之前，小哥是怎么下墓的？\" target=\"_blank\" class=\"j_th_tit \">盗墓笔记中，在吴邪去探墓之前，小哥是怎么下墓的？</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: bb2yjm\"\n          data-field='{&quot;user_id&quot;:18007602}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;bb2yjm&quot;,&quot;id&quot;:&quot;tb.1.ff7f490e.qRdtR_Go1fhCMDl7nxRsUQ&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.ff7f490e.qRdtR_Go1fhCMDl7nxRsUQ&fr=frs\" target=\"_blank\">bb2yjm</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">6-13</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            ，我看小说他们下墓的过程惊险万分，有很多地方都是有一次性的，每次进墓都是九死一生，而且很多地方不是一两个人就能打穿的，所以小哥以前是怎么下墓的。为什么以前小哥下墓感觉没啥事，好些地方估计都不止去过一次，和吴邪一起下墓要经历这么多生死一线天的时刻呢？而且小哥以前下墓都没有对墓进行破坏，和吴邪他们下墓该塔的塌，该炸的炸，墓基本都被破坏了\n        </div>\n\n                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 沧海遗尘🍀\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u9526\\u9633\\u5fae\\u6674&quot;,&quot;id&quot;:&quot;tb.1.4eac188d.cSgZ_6sfHBjjhJnoN4JtzQ&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.4eac188d.cSgZ_6sfHBjjhJnoN4JtzQ&fr=frs\" target=\"_blank\">沧海遗尘<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/3-2.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"/></a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            09:54        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9121294238,&quot;author_name&quot;:&quot;ABC15670305968&quot;,&quot;author_nickname&quot;:&quot;\\u98ce\\u62c2\\u5bd2\\u5ddd-&quot;,&quot;author_portrait&quot;:&quot;tb.1.76faa572.F_OpUFCxqx2BBQGRcQhwOA&quot;,&quot;first_post_id&quot;:150733493049,&quot;reply_num&quot;:4,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9121294238' data-thread-type=\"0\" data-floor='7''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">4</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9121294238\" title=\"人间风起，四季同书\" target=\"_blank\" class=\"j_th_tit \">人间风起，四季同书</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 风拂寒川-\"\n          data-field='{&quot;user_id&quot;:835724441}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;ABC15670305968&quot;,&quot;id&quot;:&quot;tb.1.76faa572.F_OpUFCxqx2BBQGRcQhwOA&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.76faa572.F_OpUFCxqx2BBQGRcQhwOA&fr=frs\" target=\"_blank\">君身三重雪_</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/102_14.png?stamp=1723012493) no-repeat -0px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"shuiping\" data-field='{&quot;name&quot;:&quot;shuiping&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:102,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u6c34\\u74f6\\u5ea7\\u5370\\u8bb0&quot;,&quot;intro&quot;:&quot;\\u83b7\\u53d6\\u89c4\\u5219\\uff1a\\u5728\\u661f\\u5ea7\\u52cb\\u7ae0\\u9986\\u4e2d\\u83b7\\u5f97\\u3002&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,0&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search\"  class=\"j_icon_slot\"  title=\"水瓶座印记\"  locate=\"shuiping_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1723012493) no-repeat -1550px  0;top:0px;left:28px\" data-slot=\"2\"  data-name=\"wxxian\" data-field='{&quot;name&quot;:&quot;wxxian&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;2&quot;,&quot;title&quot;:&quot;\\u8427\\u5e2e&quot;,&quot;intro&quot;:&quot;\\u5343\\u53e4\\u8bdb\\u4ed9\\u5341\\u5e74\\u68a6\\uff0c\\u4eca\\u671d\\u622e\\u4ed9\\u6d85\\u69c3\\u751f\\u3002&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/p\\/3178643627&quot;,&quot;price&quot;:10000,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,31&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/p/3178643627\"  class=\"j_icon_slot\"  title=\"萧帮\"  locate=\"wxxian_1#icon\"  style=\"top: 0px; left:28px\">  <div class=\" j_icon_slot_refresh\"></div></a><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1723012493) no-repeat -2150px  0;top:0px;left:56px\" data-slot=\"3\"  data-name=\"is_lottery\" data-field='{&quot;name&quot;:&quot;is_lottery&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;3&quot;,&quot;title&quot;:&quot;\\u94c1\\u724c\\u4e16\\u754c\\u676f\\u8fbe\\u4eba&quot;,&quot;intro&quot;:&quot;&amp;nbsp;\\u62a2\\u5ea7\\u5e2d\\uff0c\\u8d62\\u597d\\u793c\\u3002&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/game\\/worldcup\\/index&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,43&quot;,&quot;2&quot;:&quot;1723012493,42&quot;,&quot;3&quot;:&quot;1723012493,40&quot;,&quot;4&quot;:&quot;1723012493,41&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/game/worldcup/index\"  class=\"j_icon_slot\"  title=\"铁牌世界杯达人\"  locate=\"is_lottery_1#icon\"  style=\"top: 0px; left:56px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">02:38</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            今儿逛b站，老吧发了今年新曲，忽觉一晃已是2024了，盗笔也伴随我从小学到步入社会，匆匆十数载。对于我而言，书里的人物故事并不那么重要了，但这也潜移默化的影响了我人生的选择，考研转专业去考古，并且结识了文物学会的一些大咖，从音乐领域跨到了喜爱的文博圈。作为一枚老稻米，每当看到联名产品都不由得去买，说起长白内心依然澎湃。但是近些年总觉角色腐化的程度（如逆天的生子情节）让人瞠目，各种歌曲、视频下疯狂刷一些…\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm9121294238\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"6273\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C90%3Bcrop%3D0%2C0%2C90%2C90/sign=94f05927eaaf2eddd4a441e0bd3c38d9/d1b6e036afc37931e8aca108adc4b74542a91195.jpg?tbpicau=2024-08-10-05_aebf7f2d7d823df6df4b9dfce4da5769\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/d1b6e036afc37931e8aca108adc4b74542a91195.jpg?tbpicau=2024-08-10-05_2dd4ad1f7f0c8f51524708898f425a6d\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"33159\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C117%3Bcrop%3D0%2C0%2C90%2C90/sign=56e88102f67eca80125031eea10fa6ec/06856e310a55b3190f3da55405a98226cefc1795.jpg?tbpicau=2024-08-10-05_aefacc5993683de271a78e0d05d737ab\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/06856e310a55b3190f3da55405a98226cefc1795.jpg?tbpicau=2024-08-10-05_e43d155edb1ef8e5902c09f66ed0a2a4\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: Kylin張💤\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;Ciel\\u9b54\\u989c&quot;,&quot;id&quot;:&quot;tb.1.a16e513e.KUN9rwPuy5zDnH9wxNWDTA&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.a16e513e.KUN9rwPuy5zDnH9wxNWDTA&fr=frs\" target=\"_blank\">Kylin張<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/3-34.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"/></a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            08:55        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9121416885,&quot;author_name&quot;:&quot;&quot;,&quot;author_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_79AAM8A&quot;,&quot;author_portrait&quot;:&quot;tb.1.4cedaa8e.LRBI1QXp3DeJJjzUgL0KcQ&quot;,&quot;first_post_id&quot;:150733932045,&quot;reply_num&quot;:0,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9121416885' data-thread-type=\"0\" data-floor='8''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">0</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9121416885\" title=\"古茗×盗墓笔记\" target=\"_blank\" class=\"j_th_tit \">古茗×盗墓笔记</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 贴吧用户_79AAM8A\"\n          data-field='{&quot;user_id&quot;:2625919816}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;&quot;,&quot;id&quot;:&quot;tb.1.4cedaa8e.LRBI1QXp3DeJJjzUgL0KcQ&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.4cedaa8e.LRBI1QXp3DeJJjzUgL0KcQ&fr=frs\" target=\"_blank\">贴吧用户_...</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/107_14.png?stamp=1723012493) no-repeat -5450px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"shoucihuitie\" data-field='{&quot;name&quot;:&quot;shoucihuitie&quot;,&quot;end_time&quot;:&quot;1727415286&quot;,&quot;category_id&quot;:107,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u9996\\u6b21\\u56de\\u8d34&quot;,&quot;intro&quot;:&quot;\\u9996\\u6b21\\u56de\\u8d34&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/wxf\\/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,109&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/wxf/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare\"  class=\"j_icon_slot\"  title=\"首次回贴\"  locate=\"shoucihuitie_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">07:38</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            有没有知道这次古茗和盗墓联名啥时候结束的啊😭<span class=\"topic-tag\" data-flag=\"0\" data-name=\"%E5%8F%A4%E8%8C%97\">#古茗#</span><span class=\"topic-tag\" data-flag=\"0\" data-name=\"%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0\">#盗墓笔记#</span>\n        </div>\n\n                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 贴吧用户_79AAM8A\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;&quot;,&quot;id&quot;:&quot;tb.1.4cedaa8e.LRBI1QXp3DeJJjzUgL0KcQ&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.4cedaa8e.LRBI1QXp3DeJJjzUgL0KcQ&fr=frs\" target=\"_blank\">贴吧用户_...</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            07:38        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><div id=\"mediago-tb-frs-list-8\" data-po=\"8\"></div><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9116131787,&quot;author_name&quot;:&quot;\\u65a4\\u4e0d\\u662f\\u4f60\\u5c0f\\u5496&quot;,&quot;author_nickname&quot;:&quot;\\u767d\\u8317\\u54b8\\u9c7c\\u4e00\\u6761\\u25c6&quot;,&quot;author_portrait&quot;:&quot;tb.1.d0a961f4.5NqHIvFTHbQgKyMfIeSifQ&quot;,&quot;first_post_id&quot;:150711279568,&quot;reply_num&quot;:37,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9116131787' data-thread-type=\"0\" data-floor='9''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">37</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9116131787\" title=\"不是，咋盗墓笔记都能磕cp啊\" target=\"_blank\" class=\"j_th_tit \">不是，咋盗墓笔记都能磕cp啊</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 白茗咸鱼一条◆\"\n          data-field='{&quot;user_id&quot;:2580207639}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u65a4\\u4e0d\\u662f\\u4f60\\u5c0f\\u5496&quot;,&quot;id&quot;:&quot;tb.1.d0a961f4.5NqHIvFTHbQgKyMfIeSifQ&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.d0a961f4.5NqHIvFTHbQgKyMfIeSifQ&fr=frs\" target=\"_blank\">白茗咸鱼...</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">8-4</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            兄弟们，来个大肘子说一下，盗墓笔记不是南派三叔写的那个男频探险悬疑解密生存小说吗，咋现在出了那么黑花啥的cp啊，这到底是个啥。今天跟一个朋友聊到了，她很有兴致的跟我聊这些东西，我全程疯狂扣问号？什么东西啊。不理解但尊重。来个肘子解释一下吧。\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm9116131787\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"7673\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C102%3Bcrop%3D0%2C0%2C90%2C90/sign=093db4704a3387449c9027756123e8c9/3e6dc30735fae6cd8490414149b30f2442a70fb5.jpg?tbpicau=2024-08-10-05_3e6ba43bbdaf3477372132ae583a17dd\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/3e6dc30735fae6cd8490414149b30f2442a70fb5.jpg?tbpicau=2024-08-10-05_b7eb504dae4e9d19bc6ea641cfe0c74d\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 无情歌▫\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;Amako_\\u4ea1\\u5f92&quot;,&quot;id&quot;:&quot;tb.1.96eac1a2.ABzfvNJYRHDiFPLtlCXgcA&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.96eac1a2.ABzfvNJYRHDiFPLtlCXgcA&fr=frs\" target=\"_blank\">柳窈窈</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            06:56        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9121200532,&quot;author_name&quot;:&quot;\\u5b66\\u4e60\\u4e13\\u7528\\u53f704&quot;,&quot;author_nickname&quot;:null,&quot;author_portrait&quot;:&quot;tb.1.a3434c3b.ig406vyTsTmuT0v5iqIHkA&quot;,&quot;first_post_id&quot;:150732974319,&quot;reply_num&quot;:0,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9121200532' data-thread-type=\"71\" data-floor='10''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">0</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9121200532\" title=\"喜欢盗墓笔记的女生过生日送什么好\" target=\"_blank\" class=\"j_th_tit \">喜欢盗墓笔记的女生过生日送什么好</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 学习专用号04\"\n          data-field='{&quot;user_id&quot;:3442072136}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u5b66\\u4e60\\u4e13\\u7528\\u53f704&quot;,&quot;id&quot;:&quot;tb.1.a3434c3b.ig406vyTsTmuT0v5iqIHkA&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.a3434c3b.ig406vyTsTmuT0v5iqIHkA&fr=frs\" target=\"_blank\">Arknights0</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/107_14.png?stamp=1723012493) no-repeat -5400px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"shoucifaite\" data-field='{&quot;name&quot;:&quot;shoucifaite&quot;,&quot;end_time&quot;:&quot;1728231037&quot;,&quot;category_id&quot;:107,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u9996\\u6b21\\u53d1\\u8d34&quot;,&quot;intro&quot;:&quot;\\u9996\\u6b21\\u53d1\\u8d34&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/wxf\\/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,108&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/wxf/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare\"  class=\"j_icon_slot\"  title=\"首次发贴\"  locate=\"shoucifaite_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">00:10</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            如题\n        </div>\n\n                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 学习专用号04\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u5b66\\u4e60\\u4e13\\u7528\\u53f704&quot;,&quot;id&quot;:&quot;tb.1.a3434c3b.ig406vyTsTmuT0v5iqIHkA&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.a3434c3b.ig406vyTsTmuT0v5iqIHkA&fr=frs\" target=\"_blank\">Arknights0</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            00:10        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9121277588,&quot;author_name&quot;:&quot;\\u6211\\u7684\\u4e16\\u754c\\u72c2\\u4eba2&quot;,&quot;author_nickname&quot;:null,&quot;author_portrait&quot;:&quot;tb.1.89ab86.qBGvfC0xf33CmDluhHeYuQ&quot;,&quot;first_post_id&quot;:150733410212,&quot;reply_num&quot;:0,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9121277588' data-thread-type=\"0\" data-floor='11''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">0</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9121277588\" title=\"歪屁股挺多啊\" target=\"_blank\" class=\"j_th_tit \">歪屁股挺多啊</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 我的世界狂人2\"\n          data-field='{&quot;user_id&quot;:2007971886}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u6211\\u7684\\u4e16\\u754c\\u72c2\\u4eba2&quot;,&quot;id&quot;:&quot;tb.1.89ab86.qBGvfC0xf33CmDluhHeYuQ&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.89ab86.qBGvfC0xf33CmDluhHeYuQ&fr=frs\" target=\"_blank\">我的世界...</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/107_14.png?stamp=1723012493) no-repeat -5450px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"shoucihuitie\" data-field='{&quot;name&quot;:&quot;shoucihuitie&quot;,&quot;end_time&quot;:&quot;1725645773&quot;,&quot;category_id&quot;:107,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u9996\\u6b21\\u56de\\u8d34&quot;,&quot;intro&quot;:&quot;\\u9996\\u6b21\\u56de\\u8d34&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/wxf\\/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,109&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/wxf/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare\"  class=\"j_icon_slot\"  title=\"首次回贴\"  locate=\"shoucihuitie_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">02:03</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            盗墓笔记粉丝这么歪屁股？ 没脑子就读读书\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm9121277588\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"20108\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C200%3Bcrop%3D0%2C0%2C90%2C90/sign=0e5051072b224f4a57cc7b1a39dba262/2ed2b3c27d1ed21bb25f09c4eb6eddc450da3fc7.jpg?tbpicau=2024-08-10-05_ded3bf13bdb1f3ad2cb98904589a7431\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/2ed2b3c27d1ed21bb25f09c4eb6eddc450da3fc7.jpg?tbpicau=2024-08-10-05_3b72ee63c45f2e9f42d9a67afef98210\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"50174\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C200%3Bcrop%3D0%2C0%2C90%2C90/sign=87c647eaf4fb43161a4a727310887413/7fcec33f8794a4c2c7b5c00a48f41bd5ac6e39c7.jpg?tbpicau=2024-08-10-05_54c79a1f8088cc85d0d4b59989cf052f\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/7fcec33f8794a4c2c7b5c00a48f41bd5ac6e39c7.jpg?tbpicau=2024-08-10-05_70aa05db58af5e6e804517206fa48c30\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 我的世界狂人2\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u6211\\u7684\\u4e16\\u754c\\u72c2\\u4eba2&quot;,&quot;id&quot;:&quot;tb.1.89ab86.qBGvfC0xf33CmDluhHeYuQ&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.89ab86.qBGvfC0xf33CmDluhHeYuQ&fr=frs\" target=\"_blank\">我的世界...</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            02:03        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:2540926878,&quot;author_name&quot;:&quot;\\u5357\\u6d3e\\u7684\\u4e09\\u53d4&quot;,&quot;author_nickname&quot;:&quot;\\u5357\\u6d3e\\u4e09\\u53d4&quot;,&quot;author_portrait&quot;:&quot;tb.1.42021397.4omif4RlENDbRwDfXcBDKQ&quot;,&quot;first_post_id&quot;:37528821697,&quot;reply_num&quot;:17067,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:true,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='2540926878' data-thread-type=\"0\" data-floor='12''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">17067</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n    <i class=\"icon-good\" alt=\"精品\" title=\"精品\" ></i>\n\n    <a rel=\"noopener\" href=\"/p/2540926878\" title=\"大家好，我是南派三叔，现在举行微访谈。请大家提问。\" target=\"_blank\" class=\"j_th_tit \">大家好，我是南派三叔，现在举行微访谈。请大家提问。</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 南派三叔\"\n          data-field='{&quot;user_id&quot;:15920309}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u5357\\u6d3e\\u7684\\u4e09\\u53d4&quot;,&quot;id&quot;:&quot;tb.1.42021397.4omif4RlENDbRwDfXcBDKQ&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.42021397.4omif4RlENDbRwDfXcBDKQ&fr=frs\" target=\"_blank\">南派三叔</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1723012493) no-repeat -1250px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"user_type\" data-field='{&quot;name&quot;:&quot;user_type&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u8d34\\u5427\\u660e\\u661f\\u540d\\u4eba\\u5b9e\\u540d\\u8ba4\\u8bc1&quot;,&quot;intro&quot;:&quot;\\u8d34\\u5427\\u660e\\u661f\\u540d\\u4eba\\u5b9e\\u540d\\u8ba4\\u8bc1&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/p\\/6789075177&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,25&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/p/6789075177\"  class=\"j_icon_slot\"  title=\"贴吧明星名人实名认证\"  locate=\"user_type_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">2014-03</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            如题，机不可失，失不再来，大家来做微访谈吧。\n        </div>\n\n                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 我的世界狂人2\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u6211\\u7684\\u4e16\\u754c\\u72c2\\u4eba2&quot;,&quot;id&quot;:&quot;tb.1.89ab86.qBGvfC0xf33CmDluhHeYuQ&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.89ab86.qBGvfC0xf33CmDluhHeYuQ&fr=frs\" target=\"_blank\">我的世界...</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            02:02        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9089638991,&quot;author_name&quot;:&quot;&quot;,&quot;author_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_JQKZQ5e&quot;,&quot;author_portrait&quot;:&quot;tb.1.8be13f31.jDLFNDvOGGHeR_AzsXKs1g&quot;,&quot;first_post_id&quot;:150588622067,&quot;reply_num&quot;:28,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9089638991' data-thread-type=\"0\" data-floor='13''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">28</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit  member_thread_title_frs \">\n\n\n    <a rel=\"noopener\" href=\"/p/9089638991\" title=\"张起灵生孩子？…..\" target=\"_blank\" class=\"j_th_tit \">张起灵生孩子？…..</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author no_icon_author\"\n          title=\"主题作者: 贴吧用户_JQKZQ5e\"\n          data-field='{&quot;user_id&quot;:6502712439}' ><i class=\"icon_author\"></i><span class=\"pre_icon_wrap pre_icon_wrap_theme1 frs_bright_preicon\"><a class=\"icon_tbworld icon-crown-super-v1\" href=\"/tbmall/tshow\" data-field='{&quot;user_id&quot;:6502712439}' target=\"_blank\" title=\"贴吧超级会员\"></a></span><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;&quot;,&quot;id&quot;:&quot;tb.1.8be13f31.jDLFNDvOGGHeR_AzsXKs1g&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card  vip_red \" href=\"/home/main/?id=tb.1.8be13f31.jDLFNDvOGGHeR_AzsXKs1g&fr=frs\" target=\"_blank\">藏海不逝花</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/107_14.png?stamp=1723012493) no-repeat -5400px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"shoucifaite\" data-field='{&quot;name&quot;:&quot;shoucifaite&quot;,&quot;end_time&quot;:&quot;1725694850&quot;,&quot;category_id&quot;:107,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u9996\\u6b21\\u53d1\\u8d34&quot;,&quot;intro&quot;:&quot;\\u9996\\u6b21\\u53d1\\u8d34&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/wxf\\/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,108&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/wxf/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare\"  class=\"j_icon_slot\"  title=\"首次发贴\"  locate=\"shoucifaite_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">7-14</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            啥bi同人文 我澡称冯了个笔\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm9089638991\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"5552\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C119%3Bcrop%3D0%2C0%2C90%2C90/sign=f82734e2ed64034f0f98ca0f9fef4800/321658c2d56285355601281ed6ef76c6a6ef63f7.jpg?tbpicau=2024-08-10-05_28f3423d2b93d27ecf058f78baafa1ce\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/321658c2d56285355601281ed6ef76c6a6ef63f7.jpg?tbpicau=2024-08-10-05_63057223ae7b12bbde4d6e446c0b1212\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"7405\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C106%3Bcrop%3D0%2C0%2C90%2C90/sign=ee736b000dfbfbeddc0c3e7648dcc606/e684c2628535e5dd53cd5fe030c6a7efcf1b62f7.jpg?tbpicau=2024-08-10-05_f241fa386b8a60de9f19c07a09ebb768\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/e684c2628535e5dd53cd5fe030c6a7efcf1b62f7.jpg?tbpicau=2024-08-10-05_dfb6b7e1718d39a4bdd3765ebbbc89d2\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"65257\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C195%3Bcrop%3D0%2C0%2C90%2C90/sign=ef736b000dfbfbeddc0c3e7648dcc60f/7c249235e5dde7112533b9c9e1efce1b9c1661f7.jpg?tbpicau=2024-08-10-05_bcc05f5b8fd24ef66c769e518203c0af\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/7c249235e5dde7112533b9c9e1efce1b9c1661f7.jpg?tbpicau=2024-08-10-05_3644563cb09cdcdb5c0deec9937584f8\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 风拂寒川-\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;ABC15670305968&quot;,&quot;id&quot;:&quot;tb.1.76faa572.F_OpUFCxqx2BBQGRcQhwOA&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.76faa572.F_OpUFCxqx2BBQGRcQhwOA&fr=frs\" target=\"_blank\">君身三重雪_</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            01:56        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:4833253699,&quot;author_name&quot;:&quot;\\u5377\\u800c\\u96c6&quot;,&quot;author_nickname&quot;:null,&quot;author_portrait&quot;:&quot;tb.1.a4c9cb91.M5T2deNm2T27TiawGPKvGA&quot;,&quot;first_post_id&quot;:99451737676,&quot;reply_num&quot;:28146,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='4833253699' data-thread-type=\"0\" data-floor='14''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">28146</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/4833253699\" title=\"【张起灵家族】专属水楼\" target=\"_blank\" class=\"j_th_tit \">【张起灵家族】专属水楼</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 卷而集\"\n          data-field='{&quot;user_id&quot;:1741131997}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u5377\\u800c\\u96c6&quot;,&quot;id&quot;:&quot;tb.1.a4c9cb91.M5T2deNm2T27TiawGPKvGA&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.a4c9cb91.M5T2deNm2T27TiawGPKvGA&fr=frs\" target=\"_blank\">卷而集</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/102_14.png?stamp=1723012493) no-repeat -600px  0;top:0px;left:0px\" data-slot=\"2\"  data-name=\"gold_chunv\" data-field='{&quot;name&quot;:&quot;gold_chunv&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:102,&quot;slot_no&quot;:&quot;2&quot;,&quot;title&quot;:&quot;\\u5904\\u5973\\u5ea7\\u9ec4\\u91d1\\u7248\\u5370\\u8bb0&quot;,&quot;intro&quot;:&quot;\\u96c6\\u9f5012\\u4e2a\\u661f\\u5ea7\\u5370\\u8bb0\\u53ef\\u4ee5\\u83b7\\u5f9712\\u4e2a\\u9ec4\\u91d1\\u7248\\u661f\\u5ea7\\u5370\\u8bb0\\u3002&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,12&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search\"  class=\"j_icon_slot\"  title=\"处女座黄金版印记\"  locate=\"gold_chunv_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">2016-10</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm4833253699\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"87250\" data-original=\"https://imgsa.baidu.com/forum/wh%3D90%2C135%3Bcrop%3D0%2C0%2C90%2C90/sign=d8dceafc32292df59796a41c8c1d6d53/2355742762d0f703ddbdba0f00fa513d2797c598.jpg\"  bpic=\"https://imgsa.baidu.com/forum/pic/item/2355742762d0f703ddbdba0f00fa513d2797c598.jpg\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"93866\" data-original=\"https://imgsa.baidu.com/forum/wh%3D311%2C90/sign=461468ed04f3d7ca0ca33775c32e9230/d6787009c93d70cfe5f185def0dcd100bba12ba4.jpg\"  bpic=\"https://imgsa.baidu.com/forum/pic/item/d6787009c93d70cfe5f185def0dcd100bba12ba4.jpg\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n                        <div class=\"small_pic_num center_text\">共&nbsp;5&nbsp;张</div>\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 静候灵归▫▫\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;jing588520&quot;,&quot;id&quot;:&quot;tb.1.5b363bea.7tJYRBKt-Z4larLDMNW4Ww&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card  vip_red \" href=\"/home/main/?id=tb.1.5b363bea.7tJYRBKt-Z4larLDMNW4Ww&fr=frs\" target=\"_blank\">静候灵归...</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            00:07        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><div id=\"mediago-tb-frs-list-14\" data-po=\"14\"></div><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9116167791,&quot;author_name&quot;:&quot;\\u7075\\u6c85Kylin&quot;,&quot;author_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_JJQ7K6a600&quot;,&quot;author_portrait&quot;:&quot;tb.1.d20d3f.FqabFk63w_20WofKb9MIzA&quot;,&quot;first_post_id&quot;:150711409553,&quot;reply_num&quot;:4,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9116167791' data-thread-type=\"71\" data-floor='15''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">4</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9116167791\" title=\"有没有明年817可以去长白山的妆娘啊\" target=\"_blank\" class=\"j_th_tit \">有没有明年817可以去长白山的妆娘啊</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 贴吧用户_JJQ7K6a600\"\n          data-field='{&quot;user_id&quot;:6644917764}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u7075\\u6c85Kylin&quot;,&quot;id&quot;:&quot;tb.1.d20d3f.FqabFk63w_20WofKb9MIzA&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.d20d3f.FqabFk63w_20WofKb9MIzA&fr=frs\" target=\"_blank\">灵沅kylin</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/107_14.png?stamp=1723012493) no-repeat -5400px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"shoucifaite\" data-field='{&quot;name&quot;:&quot;shoucifaite&quot;,&quot;end_time&quot;:&quot;1725330306&quot;,&quot;category_id&quot;:107,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u9996\\u6b21\\u53d1\\u8d34&quot;,&quot;intro&quot;:&quot;\\u9996\\u6b21\\u53d1\\u8d34&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/wxf\\/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,108&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/wxf/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare\"  class=\"j_icon_slot\"  title=\"首次发贴\"  locate=\"shoucifaite_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">8-4</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            好不容易软磨硬泡让我妈允许我明年去长白山但是悲哀的发现第一次出cos的我根本找不到合适的妆娘呜呜呜(┯_┯)有没有谁可以来拯救我，本人身高178，是瓜子脸，打算明年出吴邪<span class=\"topic-tag\" data-flag=\"0\" data-name=\"%E9%95%BF%E7%99%BD%E5%B1%B1\">#长白山#</span><span class=\"topic-tag\" data-flag=\"0\" data-name=\"cos\">#cos#</span><span class=\"topic-tag\" data-flag=\"0\" data-name=\"%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0\">#盗墓笔记#</span><span class=\"topic-tag\" data-flag=\"0\" data-name=\"%E5%90%B4%E9%82%AA\">#吴邪#</span><span class=\"topic-tag\" data-flag=\"0\" data-name=\"%E5%A6%86%E5%A8%98\">#妆娘#</span>\n        </div>\n\n                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 斩影随心\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u65a9\\u5f71\\u968f\\u5fc3&quot;,&quot;id&quot;:&quot;tb.1.68a6b7ef.CcsGauJb0hTzOVJixgV6YQ&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.68a6b7ef.CcsGauJb0hTzOVJixgV6YQ&fr=frs\" target=\"_blank\">斩影随心</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:3395666646,&quot;author_name&quot;:&quot;\\u5357\\u6d3e\\u7684\\u4e09\\u53d4&quot;,&quot;author_nickname&quot;:&quot;\\u5357\\u6d3e\\u4e09\\u53d4&quot;,&quot;author_portrait&quot;:&quot;tb.1.42021397.4omif4RlENDbRwDfXcBDKQ&quot;,&quot;first_post_id&quot;:59945700308,&quot;reply_num&quot;:7676,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:true,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='3395666646' data-thread-type=\"0\" data-floor='16''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">7676</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n    <i class=\"icon-good\" alt=\"精品\" title=\"精品\" ></i>\n\n    <a rel=\"noopener\" href=\"/p/3395666646\" title=\"来聊聊吧。\" target=\"_blank\" class=\"j_th_tit \">来聊聊吧。</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 南派三叔\"\n          data-field='{&quot;user_id&quot;:15920309}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u5357\\u6d3e\\u7684\\u4e09\\u53d4&quot;,&quot;id&quot;:&quot;tb.1.42021397.4omif4RlENDbRwDfXcBDKQ&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.42021397.4omif4RlENDbRwDfXcBDKQ&fr=frs\" target=\"_blank\">南派三叔</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1723012493) no-repeat -1250px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"user_type\" data-field='{&quot;name&quot;:&quot;user_type&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u8d34\\u5427\\u660e\\u661f\\u540d\\u4eba\\u5b9e\\u540d\\u8ba4\\u8bc1&quot;,&quot;intro&quot;:&quot;\\u8d34\\u5427\\u660e\\u661f\\u540d\\u4eba\\u5b9e\\u540d\\u8ba4\\u8bc1&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/p\\/6789075177&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,25&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/p/6789075177\"  class=\"j_icon_slot\"  title=\"贴吧明星名人实名认证\"  locate=\"user_type_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">2014-11</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            有什么想问的。\n        </div>\n\n                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 贴吧用户_a1ZtyUD\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;&quot;,&quot;id&quot;:&quot;tb.1.b813e33e.kMrplfVcznwoic6Dsyybew&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.b813e33e.kMrplfVcznwoic6Dsyybew&fr=frs\" target=\"_blank\">jumini</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9121034139,&quot;author_name&quot;:&quot;\\u56db\\u70b9\\u4e09\\u4e8c&quot;,&quot;author_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_JJ9R7QR&quot;,&quot;author_portrait&quot;:&quot;tb.1.2c867939.FZW-1pNDVcjPWeEyOM_50w&quot;,&quot;first_post_id&quot;:150732109954,&quot;reply_num&quot;:0,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9121034139' data-thread-type=\"0\" data-floor='17''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">0</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9121034139\" title=\"我想进盗墓笔记v群，有没有人拉一下，非常感谢\" target=\"_blank\" class=\"j_th_tit \">我想进盗墓笔记v群，有没有人拉一下，非常感谢</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 贴吧用户_JJ9R7QR\"\n          data-field='{&quot;user_id&quot;:6658689063}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u56db\\u70b9\\u4e09\\u4e8c&quot;,&quot;id&quot;:&quot;tb.1.2c867939.FZW-1pNDVcjPWeEyOM_50w&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.2c867939.FZW-1pNDVcjPWeEyOM_50w&fr=frs\" target=\"_blank\">四点三二</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/107_14.png?stamp=1723012493) no-repeat -5400px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"shoucifaite\" data-field='{&quot;name&quot;:&quot;shoucifaite&quot;,&quot;end_time&quot;:&quot;1725629117&quot;,&quot;category_id&quot;:107,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u9996\\u6b21\\u53d1\\u8d34&quot;,&quot;intro&quot;:&quot;\\u9996\\u6b21\\u53d1\\u8d34&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/wxf\\/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,108&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/wxf/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare\"  class=\"j_icon_slot\"  title=\"首次发贴\"  locate=\"shoucifaite_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">8-7</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            我想进盗墓笔记微信群，讨论内容，求拉一下\n        </div>\n\n                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 贴吧用户_JJ9R7QR\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u56db\\u70b9\\u4e09\\u4e8c&quot;,&quot;id&quot;:&quot;tb.1.2c867939.FZW-1pNDVcjPWeEyOM_50w&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.2c867939.FZW-1pNDVcjPWeEyOM_50w&fr=frs\" target=\"_blank\">四点三二</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:8751516306,&quot;author_name&quot;:&quot;1157209410&quot;,&quot;author_nickname&quot;:&quot;\\u5c0f\\u6674\\u9c9c\\u679c\\u56ed\\ud83c\\udf52&quot;,&quot;author_portrait&quot;:&quot;tb.1.84e1eec9.SO1aNgNVJIsHp3d61iw9ug&quot;,&quot;first_post_id&quot;:149144218040,&quot;reply_num&quot;:193,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:true,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='8751516306' data-thread-type=\"0\" data-floor='18''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">193</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n    <i class=\"icon-good\" alt=\"精品\" title=\"精品\" ></i>\n\n    <a rel=\"noopener\" href=\"/p/8751516306\" title=\"【整理】阅读顺序➕短篇合集整理\" target=\"_blank\" class=\"j_th_tit \">【整理】阅读顺序➕短篇合集整理</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author no_icon_author\"\n          title=\"主题作者: 小晴鲜果园🍒\"\n          data-field='{&quot;user_id&quot;:400421845}' ><i class=\"icon_author\"></i><span class=\"pre_icon_wrap pre_icon_wrap_theme1 frs_bright_preicon\"><a class=\"icon_tbworld icon-crown-vip\" href=\"/tbmall/tshow\" data-field='{&quot;user_id&quot;:400421845}' target=\"_blank\" title=\"贴吧会员\"></a></span><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;1157209410&quot;,&quot;id&quot;:&quot;tb.1.84e1eec9.SO1aNgNVJIsHp3d61iw9ug&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card  vip_red \" href=\"/home/main/?id=tb.1.84e1eec9.SO1aNgNVJIsHp3d61iw9ug&fr=frs\" target=\"_blank\">小肥晴子</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/102_14.png?stamp=1723012493) no-repeat -700px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"tianxie\" data-field='{&quot;name&quot;:&quot;tianxie&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:102,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u5929\\u874e\\u5ea7\\u5370\\u8bb0&quot;,&quot;intro&quot;:&quot;\\u83b7\\u53d6\\u89c4\\u5219\\uff1a\\u5728\\u661f\\u5ea7\\u52cb\\u7ae0\\u9986\\u4e2d\\u83b7\\u5f97\\u3002&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,14&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search\"  class=\"j_icon_slot\"  title=\"天蝎座印记\"  locate=\"tianxie_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">2023-11</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            盗墓笔记是我喜欢很多年的小说，每隔一段时间就要再刷一遍，很多三叔写过的短篇都找不到了，最近我整理了一些短篇发在这里，希望新入坑的宝宝们可以看到\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm8751516306\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"12819\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D142%2C90/sign=001debfd05166d2238221d95721125ce/2bcdb11ea8d3fd1f14d2ce0c764e251f94ca5ff7.jpg?tbpicau=2024-08-10-05_21762bb4bbfd6ea52bdbd91dbe89090b\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/2bcdb11ea8d3fd1f14d2ce0c764e251f94ca5ff7.jpg?tbpicau=2024-08-10-05_5fc9bcfd009aa3ae9f94872b92112681\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"53708\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C116%3Bcrop%3D0%2C0%2C90%2C90/sign=782857f277adcbef0161760f9c831fec/5f45648da97739121b91eb57be198618367ae21c.jpg?tbpicau=2024-08-10-05_26fda146086f3a8a8b93721e0871f432\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/5f45648da97739121b91eb57be198618367ae21c.jpg?tbpicau=2024-08-10-05_a458bac71c0211d4403afabd0707aee8\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"55878\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D93%2C90/sign=632857f277adcbef0161760f9f8317ed/87359cd4b31c87011201dcd0617f9e2f0708ff1c.jpg?tbpicau=2024-08-10-05_7bcc8a765b03de0717e18c90976403fc\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/87359cd4b31c87011201dcd0617f9e2f0708ff1c.jpg?tbpicau=2024-08-10-05_aa84a77bdf0e8ee757bdeab89ac3f7d5\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n                        <div class=\"small_pic_num center_text\">共&nbsp;24&nbsp;张</div>\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 贴吧用户_aVeMatC\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;isfionaa&quot;,&quot;id&quot;:&quot;tb.1.950a145d.ru6xs_vctH19Tx4u5VnjYg&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.950a145d.ru6xs_vctH19Tx4u5VnjYg&fr=frs\" target=\"_blank\">贴吧用户_...</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:8766482694,&quot;author_name&quot;:&quot;1157209410&quot;,&quot;author_nickname&quot;:&quot;\\u5c0f\\u6674\\u9c9c\\u679c\\u56ed\\ud83c\\udf52&quot;,&quot;author_portrait&quot;:&quot;tb.1.84e1eec9.SO1aNgNVJIsHp3d61iw9ug&quot;,&quot;first_post_id&quot;:149194014388,&quot;reply_num&quot;:996,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='8766482694' data-thread-type=\"0\" data-floor='19''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">996</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/8766482694\" title=\"【全文】这几天整理下盗笔全文TXT\" target=\"_blank\" class=\"j_th_tit \">【全文】这几天整理下盗笔全文TXT</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author no_icon_author\"\n          title=\"主题作者: 小晴鲜果园🍒\"\n          data-field='{&quot;user_id&quot;:400421845}' ><i class=\"icon_author\"></i><span class=\"pre_icon_wrap pre_icon_wrap_theme1 frs_bright_preicon\"><a class=\"icon_tbworld icon-crown-vip\" href=\"/tbmall/tshow\" data-field='{&quot;user_id&quot;:400421845}' target=\"_blank\" title=\"贴吧会员\"></a></span><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;1157209410&quot;,&quot;id&quot;:&quot;tb.1.84e1eec9.SO1aNgNVJIsHp3d61iw9ug&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card  vip_red \" href=\"/home/main/?id=tb.1.84e1eec9.SO1aNgNVJIsHp3d61iw9ug&fr=frs\" target=\"_blank\">小肥晴子</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/102_14.png?stamp=1723012493) no-repeat -700px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"tianxie\" data-field='{&quot;name&quot;:&quot;tianxie&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:102,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u5929\\u874e\\u5ea7\\u5370\\u8bb0&quot;,&quot;intro&quot;:&quot;\\u83b7\\u53d6\\u89c4\\u5219\\uff1a\\u5728\\u661f\\u5ea7\\u52cb\\u7ae0\\u9986\\u4e2d\\u83b7\\u5f97\\u3002&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,14&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search\"  class=\"j_icon_slot\"  title=\"天蝎座印记\"  locate=\"tianxie_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">2023-12</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            我自己整理了一个TXT版的盗墓笔记全系列文章合集 前传：《老九门》 《盗墓笔记1七星鲁宫》 《盗墓笔记2.秦岭神树》 《盗墓笔记3.云顶天宫》 《盗墓笔记4.蛇沼鬼城》 《盗墓笔记5.谜海归巢》 《盗墓笔记6.阴山古楼》 《盗墓笔记7邛笼石影》 《盗墓笔记8.大结局》 (上) (下) 《吴邪的私家笔记》 《藏海花1》 《藏海花2》 《沙海1荒沙诡影》 《沙海2沙莽蛇巢》 《沙海3》 《沙海4》 《十年》 《重启之极海听雷》 《灯海寻尸》 《万山极夜》 《王母鬼宴\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm8766482694\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"13510\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C186%3Bcrop%3D0%2C0%2C90%2C90/sign=e6cbb27d44087bf47db95fe0c2ff6614/3e4c274e251f95ca2a961f808f177f3e67095268.jpg?tbpicau=2024-08-10-05_a6106c44bbfa4dddbfc7a5093bd885a9\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/3e4c274e251f95ca2a961f808f177f3e67095268.jpg?tbpicau=2024-08-10-05_558470f25630fbbf195d4846b08c7e79\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"1764\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C186%3Bcrop%3D0%2C0%2C90%2C90/sign=8f4cdb2124d0f703e6e79dd538d66005/d9892cc79f3df8dcd45f02a78b11728b47102868.jpg?tbpicau=2024-08-10-05_a5fcb5e8197a7d5d33fbf277f0cebc81\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/d9892cc79f3df8dcd45f02a78b11728b47102868.jpg?tbpicau=2024-08-10-05_66456189ab7504c4fb142d7af9e6bfc1\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"89094\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C195%3Bcrop%3D0%2C0%2C90%2C90/sign=77d07e8af4b7d0a27b9c0c94fbc34730/10475d90f603738d73931e1af51bb051f919ecf0.jpg?tbpicau=2024-08-10-05_007ba2d41e65c100c396da26b929b21f\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/10475d90f603738d73931e1af51bb051f919ecf0.jpg?tbpicau=2024-08-10-05_9fee3d6019f2a4402d847a7d70849260\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 贴吧用户_aVeMatC\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;isfionaa&quot;,&quot;id&quot;:&quot;tb.1.950a145d.ru6xs_vctH19Tx4u5VnjYg&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.950a145d.ru6xs_vctH19Tx4u5VnjYg&fr=frs\" target=\"_blank\">贴吧用户_...</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:8016586939,&quot;author_name&quot;:&quot;X\\u4e03\\u4e03\\u4e03Q&quot;,&quot;author_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_7bNN8U4&quot;,&quot;author_portrait&quot;:&quot;tb.1.37222b3e.p4yK-V0n5sBTctaCdJrALw&quot;,&quot;first_post_id&quot;:145457423596,&quot;reply_num&quot;:270,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='8016586939' data-thread-type=\"0\" data-floor='20''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">270</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/8016586939\" title=\"大家都看到哪里了，心态爆炸\" target=\"_blank\" class=\"j_th_tit \">大家都看到哪里了，心态爆炸</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 贴吧用户_7bNN8U4\"\n          data-field='{&quot;user_id&quot;:2814241161}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;X\\u4e03\\u4e03\\u4e03Q&quot;,&quot;id&quot;:&quot;tb.1.37222b3e.p4yK-V0n5sBTctaCdJrALw&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.37222b3e.p4yK-V0n5sBTctaCdJrALw&fr=frs\" target=\"_blank\">贴吧用户_...</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">2022-09</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            最近看完了盗墓笔记结局，想看看有没有后续了发现还真有，心情本来很好，结果往下一看，整个人非常难受，想来吐槽一下，对盗墓笔记的热情一下就没了 我先是搜索了（藏海花）发现藏海花没写完想着不是主线故事就往下搜了，一看（黑瞎子师傅）和（铁衣寒）也没写完！（沙海）也不写了！当时一脸懵，因为听说出了重启，是身体原因不写了，想着没啥，可能和后面剧情关系不大。看完（十年）发现与沙海和藏海花还有点关系！但你前面没写\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm8016586939\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"70622\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C200%3Bcrop%3D0%2C0%2C90%2C90/sign=07483adb76fa828bd17695eacd337304/5f627c600c338744508e91a2140fd9f9d62aa068.jpg?tbpicau=2024-08-10-05_98f585a84a5aa84c25cf28727cf57977\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/5f627c600c338744508e91a2140fd9f9d62aa068.jpg?tbpicau=2024-08-10-05_19499470eb63edb1c97166384ef09d20\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 🍒晴天娃娃\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u5e78\\u8fd0\\u56db\\u53f6\\u8349HY&quot;,&quot;id&quot;:&quot;tb.1.c41962aa.3QpezMCunQXexfqNNM-bnw&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.c41962aa.3QpezMCunQXexfqNNM-bnw&fr=frs\" target=\"_blank\"><img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/2-16.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"/>晴天娃娃</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><div id=\"mediago-tb-frs-list-20\" data-po=\"20\"></div><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:8734157962,&quot;author_name&quot;:&quot;603712046&quot;,&quot;author_nickname&quot;:null,&quot;author_portrait&quot;:&quot;tb.1.daa55c93._MX74Q5_56miRcTxXuzbfw&quot;,&quot;first_post_id&quot;:149087359055,&quot;reply_num&quot;:33,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='8734157962' data-thread-type=\"0\" data-floor='21''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">33</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/8734157962\" title=\"盗墓笔记系列39部有声小说合集无套路免费分享\" target=\"_blank\" class=\"j_th_tit \">盗墓笔记系列39部有声小说合集无套路免费分享</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 603712046\"\n          data-field='{&quot;user_id&quot;:161728575}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;603712046&quot;,&quot;id&quot;:&quot;tb.1.daa55c93._MX74Q5_56miRcTxXuzbfw&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.daa55c93._MX74Q5_56miRcTxXuzbfw&fr=frs\" target=\"_blank\">603712046</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">2023-11</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            包括我找到的一共39部盗墓笔记系列和番外的有声书，有周建龙、青雪、方片K、骆驼、声遥九月等多人演播的版本，内含整理的收听顺序，还有一些其他的有声书。 无套路，不卖资源，不加微信，单纯分享给大家，一楼放链接。\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm8734157962\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"95664\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C1190%3Bcrop%3D0%2C0%2C90%2C90/sign=7a31a3eacc13632715b8ca3aa1a391dd/879bb4cc7cd98d106a073307673fb80e7aec90ff.jpg?tbpicau=2024-08-10-05_2285c3987864b21a199f71c471cee70e\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/879bb4cc7cd98d106a073307673fb80e7aec90ff.jpg?tbpicau=2024-08-10-05_78cca2007c4e35907b7222f26e775462\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 贴吧用户_JRPWCQS\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;&quot;,&quot;id&quot;:&quot;tb.1.f11c4d64.pLQcDgNv4Bn0S2AMyiyaQw&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.f11c4d64.pLQcDgNv4Bn0S2AMyiyaQw&fr=frs\" target=\"_blank\">贴吧用户_...</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9120833418,&quot;author_name&quot;:&quot;\\u5723\\u9f99\\u541b\\u91cd\\u540d\\u4e86&quot;,&quot;author_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_aD8X3Da&quot;,&quot;author_portrait&quot;:&quot;tb.1.97a7547f.43QFyKEwCK2D4G9vOq0V9A&quot;,&quot;first_post_id&quot;:150731226483,&quot;reply_num&quot;:5,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9120833418' data-thread-type=\"0\" data-floor='22''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">5</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9120833418\" title=\"盗墓笔记语文试卷1.0！！！！！\" target=\"_blank\" class=\"j_th_tit \">盗墓笔记语文试卷1.0！！！！！</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 贴吧用户_aD8X3Da\"\n          data-field='{&quot;user_id&quot;:5295993764}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u5723\\u9f99\\u541b\\u91cd\\u540d\\u4e86&quot;,&quot;id&quot;:&quot;tb.1.97a7547f.43QFyKEwCK2D4G9vOq0V9A&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.97a7547f.43QFyKEwCK2D4G9vOq0V9A&fr=frs\" target=\"_blank\">贴吧用户_...</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1723012493) no-repeat -3800px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"starmaster\" data-field='{&quot;name&quot;:&quot;starmaster&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u624b\\u6e380\\u661f\\u8fbe\\u4eba&quot;,&quot;intro&quot;:&quot;\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,76&quot;,&quot;2&quot;:&quot;1723012493,77&quot;,&quot;3&quot;:&quot;1723012493,78&quot;,&quot;4&quot;:&quot;1723012493,79&quot;,&quot;5&quot;:&quot;1723012493,80&quot;,&quot;6&quot;:&quot;1723012493,81&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/f?kw=玩家认证&amp;ie=utf-8\"  class=\"j_icon_slot\"  title=\"手游0星达人\"  locate=\"starmaster_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">8-7</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            第一章 一、阅读理解（每题10分，共40分）1. 理解题：请根据文本内容，描述四个土夫子在长沙镖子岭发现的异常情况是什么，并解释“血尸”一词在文中的含义。提示：注意文中对土丘和洛阳铲的描述，以及人物对话中对“血尸”的提及。2. 分析题：分析老烟头在团队中的角色和作用，以及他在面对危险时的态度和决策。提示：关注老烟头的语言和行为，以及他与团队其他成员的互动。3. 细节题：文中提到的“土耗子”是什么？在这次探险中它起到\n        </div>\n\n                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 贴吧用户_aD8X3Da\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u5723\\u9f99\\u541b\\u91cd\\u540d\\u4e86&quot;,&quot;id&quot;:&quot;tb.1.97a7547f.43QFyKEwCK2D4G9vOq0V9A&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.97a7547f.43QFyKEwCK2D4G9vOq0V9A&fr=frs\" target=\"_blank\">贴吧用户_...</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9097272613,&quot;author_name&quot;:&quot;\\u4ec5\\u4f9b\\u53c2\\u8003115414&quot;,&quot;author_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_5G9UG6P&quot;,&quot;author_portrait&quot;:&quot;tb.1.20f918d.XjgaDo5ufPjSR3Z4xs6HVg&quot;,&quot;first_post_id&quot;:150624159648,&quot;reply_num&quot;:12,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9097272613' data-thread-type=\"0\" data-floor='23''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">12</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9097272613\" title=\"朋友餵給我的史\" target=\"_blank\" class=\"j_th_tit \">朋友餵給我的史</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 贴吧用户_5G9UG6P\"\n          data-field='{&quot;user_id&quot;:3404076557}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u4ec5\\u4f9b\\u53c2\\u8003115414&quot;,&quot;id&quot;:&quot;tb.1.20f918d.XjgaDo5ufPjSR3Z4xs6HVg&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.20f918d.XjgaDo5ufPjSR3Z4xs6HVg&fr=frs\" target=\"_blank\">仅供参考_...</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/107_14.png?stamp=1723012493) no-repeat -5450px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"shoucihuitie\" data-field='{&quot;name&quot;:&quot;shoucihuitie&quot;,&quot;end_time&quot;:&quot;1725534244&quot;,&quot;category_id&quot;:107,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u9996\\u6b21\\u56de\\u8d34&quot;,&quot;intro&quot;:&quot;\\u9996\\u6b21\\u56de\\u8d34&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/wxf\\/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,109&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/wxf/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare\"  class=\"j_icon_slot\"  title=\"首次回贴\"  locate=\"shoucihuitie_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">7-20</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            必須要餵給8u們看看 究竟是誰在寫\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm9097272613\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"57309\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C200%3Bcrop%3D0%2C0%2C90%2C90/sign=ae33bb3f410828386858d41d88b59b31/2bcdb11ea8d3fd1fc878b21a764e251f95ca5f67.jpg?tbpicau=2024-08-10-05_bf495d8f121079c7d1ab756e39c2d25f\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/2bcdb11ea8d3fd1fc878b21a764e251f95ca5f67.jpg?tbpicau=2024-08-10-05_122948cb72247d238e1c3bf6a9076378\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"20132\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D106%2C90/sign=e69cd213d78fa0ec7f926c0c16a175d7/294c0ed8bc3eb135b7b6a79be01ea8d3fd1f4467.jpg?tbpicau=2024-08-10-05_45ac9a80fd9cc9789df0196f9f562c0d\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/294c0ed8bc3eb135b7b6a79be01ea8d3fd1f4467.jpg?tbpicau=2024-08-10-05_a9fbabf799de21e2a19837dfb1de1579\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 强扭的瓜蘸糖🎃\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u7ae5\\u7b52\\u5b50&quot;,&quot;id&quot;:&quot;tb.1.bb816158.dmJz0oOxZjw8iveZOyp_wg&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.bb816158.dmJz0oOxZjw8iveZOyp_wg&fr=frs\" target=\"_blank\">小纸纸</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:8810735332,&quot;author_name&quot;:&quot;1157209410&quot;,&quot;author_nickname&quot;:&quot;\\u5c0f\\u6674\\u9c9c\\u679c\\u56ed\\ud83c\\udf52&quot;,&quot;author_portrait&quot;:&quot;tb.1.84e1eec9.SO1aNgNVJIsHp3d61iw9ug&quot;,&quot;first_post_id&quot;:149396878433,&quot;reply_num&quot;:274,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='8810735332' data-thread-type=\"0\" data-floor='24''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">274</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/8810735332\" title=\"盗墓笔记系列小说全集\" target=\"_blank\" class=\"j_th_tit \">盗墓笔记系列小说全集</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author no_icon_author\"\n          title=\"主题作者: 小晴鲜果园🍒\"\n          data-field='{&quot;user_id&quot;:400421845}' ><i class=\"icon_author\"></i><span class=\"pre_icon_wrap pre_icon_wrap_theme1 frs_bright_preicon\"><a class=\"icon_tbworld icon-crown-vip\" href=\"/tbmall/tshow\" data-field='{&quot;user_id&quot;:400421845}' target=\"_blank\" title=\"贴吧会员\"></a></span><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;1157209410&quot;,&quot;id&quot;:&quot;tb.1.84e1eec9.SO1aNgNVJIsHp3d61iw9ug&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card  vip_red \" href=\"/home/main/?id=tb.1.84e1eec9.SO1aNgNVJIsHp3d61iw9ug&fr=frs\" target=\"_blank\">小肥晴子</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/102_14.png?stamp=1723012493) no-repeat -700px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"tianxie\" data-field='{&quot;name&quot;:&quot;tianxie&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:102,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u5929\\u874e\\u5ea7\\u5370\\u8bb0&quot;,&quot;intro&quot;:&quot;\\u83b7\\u53d6\\u89c4\\u5219\\uff1a\\u5728\\u661f\\u5ea7\\u52cb\\u7ae0\\u9986\\u4e2d\\u83b7\\u5f97\\u3002&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,14&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search\"  class=\"j_icon_slot\"  title=\"天蝎座印记\"  locate=\"tianxie_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">2023-12</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            有需要全集阅读顺序及全集TXT资源可以私信我\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm8810735332\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"45390\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C195%3Bcrop%3D0%2C0%2C90%2C90/sign=cff3cf93e2c27d1ea57333cd2bf99c57/3a55a77eca806538171bd924d1dda144ac3482de.jpg?tbpicau=2024-08-10-05_5fa047fff211a43c2af672e239608048\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/3a55a77eca806538171bd924d1dda144ac3482de.jpg?tbpicau=2024-08-10-05_5ebec94a7725221463396495127dc67a\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"90725\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C195%3Bcrop%3D0%2C0%2C90%2C90/sign=80d4df2c920735fa91a546b0ae7d3e8a/e270bbaf2edda3cc5715c51747e93901203f92de.jpg?tbpicau=2024-08-10-05_6ff0b5deffe85d1512948fbdb1310385\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/e270bbaf2edda3cc5715c51747e93901203f92de.jpg?tbpicau=2024-08-10-05_32aab4fc1983310209085dc50a2311cf\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 永远的1♂\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u5c01\\u6deeA&quot;,&quot;id&quot;:&quot;tb.1.1d5f312d.1JHM_wKKGdLheKbasxIDaQ&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.1d5f312d.1JHM_wKKGdLheKbasxIDaQ&fr=frs\" target=\"_blank\">PIICRL</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9103765807,&quot;author_name&quot;:&quot;\\u5723\\u9f99\\u541b\\u91cd\\u540d\\u4e86&quot;,&quot;author_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_aD8X3Da&quot;,&quot;author_portrait&quot;:&quot;tb.1.97a7547f.43QFyKEwCK2D4G9vOq0V9A&quot;,&quot;first_post_id&quot;:150654597124,&quot;reply_num&quot;:13,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9103765807' data-thread-type=\"0\" data-floor='25''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">13</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9103765807\" title=\"盗墓笔记数学题！2.0\" target=\"_blank\" class=\"j_th_tit \">盗墓笔记数学题！2.0</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 贴吧用户_aD8X3Da\"\n          data-field='{&quot;user_id&quot;:5295993764}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u5723\\u9f99\\u541b\\u91cd\\u540d\\u4e86&quot;,&quot;id&quot;:&quot;tb.1.97a7547f.43QFyKEwCK2D4G9vOq0V9A&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.97a7547f.43QFyKEwCK2D4G9vOq0V9A&fr=frs\" target=\"_blank\">贴吧用户_...</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1723012493) no-repeat -3800px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"starmaster\" data-field='{&quot;name&quot;:&quot;starmaster&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u624b\\u6e380\\u661f\\u8fbe\\u4eba&quot;,&quot;intro&quot;:&quot;\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,76&quot;,&quot;2&quot;:&quot;1723012493,77&quot;,&quot;3&quot;:&quot;1723012493,78&quot;,&quot;4&quot;:&quot;1723012493,79&quot;,&quot;5&quot;:&quot;1723012493,80&quot;,&quot;6&quot;:&quot;1723012493,81&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/f?kw=玩家认证&amp;ie=utf-8\"  class=\"j_icon_slot\"  title=\"手游0星达人\"  locate=\"starmaster_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">7-25</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            我之前那个难度太变态了，我于心不忍，再搞个简单的，小学就能答出来！ 试卷名称： 血尸 考试时间： 60分钟 总分： 100分 一、选择题（每题2分，共10分） 1.故事中提到了四个土夫子，如果每个土夫子挖洞时需要用到2把洛阳铲，那么一共需要多少把洛阳铲？ A. 6把 B. 8把 C. 10把 D. 12把 2.老三在逃跑时，他一口七跑出了二里多地，如果我们假设“一口七”是1000米，那么他跑出了多少米？ A. 1000米 B. 2000米 C. 3000米 D. 4000米 二、填空题（每题3分，共15分）\n        </div>\n\n                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 贴吧用户_aD8X3Da\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u5723\\u9f99\\u541b\\u91cd\\u540d\\u4e86&quot;,&quot;id&quot;:&quot;tb.1.97a7547f.43QFyKEwCK2D4G9vOq0V9A&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.97a7547f.43QFyKEwCK2D4G9vOq0V9A&fr=frs\" target=\"_blank\">贴吧用户_...</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9101009835,&quot;author_name&quot;:&quot;\\u5723\\u9f99\\u541b\\u91cd\\u540d\\u4e86&quot;,&quot;author_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_aD8X3Da&quot;,&quot;author_portrait&quot;:&quot;tb.1.97a7547f.43QFyKEwCK2D4G9vOq0V9A&quot;,&quot;first_post_id&quot;:150642006721,&quot;reply_num&quot;:10,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9101009835' data-thread-type=\"0\" data-floor='26''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">10</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9101009835\" title=\"一章一高等数学题的盗墓笔记！\" target=\"_blank\" class=\"j_th_tit \">一章一高等数学题的盗墓笔记！</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 贴吧用户_aD8X3Da\"\n          data-field='{&quot;user_id&quot;:5295993764}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u5723\\u9f99\\u541b\\u91cd\\u540d\\u4e86&quot;,&quot;id&quot;:&quot;tb.1.97a7547f.43QFyKEwCK2D4G9vOq0V9A&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.97a7547f.43QFyKEwCK2D4G9vOq0V9A&fr=frs\" target=\"_blank\">贴吧用户_...</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1723012493) no-repeat -3800px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"starmaster\" data-field='{&quot;name&quot;:&quot;starmaster&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u624b\\u6e380\\u661f\\u8fbe\\u4eba&quot;,&quot;intro&quot;:&quot;\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,76&quot;,&quot;2&quot;:&quot;1723012493,77&quot;,&quot;3&quot;:&quot;1723012493,78&quot;,&quot;4&quot;:&quot;1723012493,79&quot;,&quot;5&quot;:&quot;1723012493,80&quot;,&quot;6&quot;:&quot;1723012493,81&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/f?kw=玩家认证&amp;ie=utf-8\"  class=\"j_icon_slot\"  title=\"手游0星达人\"  locate=\"starmaster_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">7-23</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            第一卷 第一章 问题背景： 在故事中，老三在与血尸搏斗时，使用了一种策略，即在拔河时利用自己体重的优势。假设老三的体重为 W，他与血尸之间的拉力对抗形成了一个力学平衡问题。问题描述：1. 老三在拔河时，他的体重 W 与地面形成了一个30度角的倾斜，求老三对地面的压力 P。2. 假设老三与血尸之间的拉力 F 是恒定的，且老三能够通过调整自己与地面的角度 \\theta 来改变对抗血尸的拉力。如果老三想要增加对抗血尸的拉力，他应该增加还是减\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm9101009835\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"30622\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C116%3Bcrop%3D0%2C0%2C90%2C90/sign=289125e0b136afc30e59376c8335daf5/39a961c6a7efce1bb6c8a0eae951f3deb58f65f1.jpg?tbpicau=2024-08-10-05_99766cb92c82f9aa11f9944d4566eb2e\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/39a961c6a7efce1bb6c8a0eae951f3deb58f65f1.jpg?tbpicau=2024-08-10-05_6059e23ac91db8f1ed1cfd67fb786abf\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"13395\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C142%3Bcrop%3D0%2C0%2C90%2C90/sign=76148ada3dcb0a46857783305b4fc710/288d2edbb6fd5266aaf15434ed18972bd50736fa.jpg?tbpicau=2024-08-10-05_2b28a21671e5b8d1ba3c8ac2c3ad6fbf\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/288d2edbb6fd5266aaf15434ed18972bd50736fa.jpg?tbpicau=2024-08-10-05_eb5422099a9d7ebd85de395a5eb01925\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"27062\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C129%3Bcrop%3D0%2C0%2C90%2C90/sign=87ecdf1e3dec54e741b912178914aa62/e3ab39738bd4b31c21d2c69bc1d6277f9f2ff8ef.jpg?tbpicau=2024-08-10-05_5d75fe51efe11d4eff88c3ff1826ff99\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/e3ab39738bd4b31c21d2c69bc1d6277f9f2ff8ef.jpg?tbpicau=2024-08-10-05_e162c935a05974f19b6975590d72cc39\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n                        <div class=\"small_pic_num center_text\">共&nbsp;4&nbsp;张</div>\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 贴吧用户_aD8X3Da\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u5723\\u9f99\\u541b\\u91cd\\u540d\\u4e86&quot;,&quot;id&quot;:&quot;tb.1.97a7547f.43QFyKEwCK2D4G9vOq0V9A&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.97a7547f.43QFyKEwCK2D4G9vOq0V9A&fr=frs\" target=\"_blank\">贴吧用户_...</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><div id=\"mediago-tb-frs-list-26\" data-po=\"26\"></div><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:6005162365,&quot;author_name&quot;:&quot;\\u96ea\\u82e5_&quot;,&quot;author_nickname&quot;:&quot;\\u5929\\u5149\\u4e4b\\u5916\\u00ba&quot;,&quot;author_portrait&quot;:&quot;tb.1.c76eaeef.JCRhR_K2G2LMjb1DO12GRg&quot;,&quot;first_post_id&quot;:123621073841,&quot;reply_num&quot;:18,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='6005162365' data-thread-type=\"0\" data-floor='27''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">18</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/6005162365\" title=\"盗墓笔记是不是修改过了\" target=\"_blank\" class=\"j_th_tit \">盗墓笔记是不是修改过了</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 天光之外º\"\n          data-field='{&quot;user_id&quot;:870700713}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u96ea\\u82e5_&quot;,&quot;id&quot;:&quot;tb.1.c76eaeef.JCRhR_K2G2LMjb1DO12GRg&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.c76eaeef.JCRhR_K2G2LMjb1DO12GRg&fr=frs\" target=\"_blank\">天光之外<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/1-1.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"/></a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/102_14.png?stamp=1723012493) no-repeat -950px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"sheshou\" data-field='{&quot;name&quot;:&quot;sheshou&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:102,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u5c04\\u624b\\u5ea7\\u5370\\u8bb0&quot;,&quot;intro&quot;:&quot;\\u83b7\\u53d6\\u89c4\\u5219\\uff1a\\u5728\\u661f\\u5ea7\\u52cb\\u7ae0\\u9986\\u4e2d\\u83b7\\u5f97\\u3002&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,19&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search\"  class=\"j_icon_slot\"  title=\"射手座印记\"  locate=\"sheshou_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">2019-01</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            2011年看到，前几天重温了一遍，发现好几处细节和记忆里的都不一样\n        </div>\n\n                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 知竹zº\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u6211\\u7231\\u4f5c\\u4e1alove&quot;,&quot;id&quot;:&quot;tb.1.3340d927.wWK49QpR0kxCIk3dQJ5qcg&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.3340d927.wWK49QpR0kxCIk3dQJ5qcg&fr=frs\" target=\"_blank\">知竹z<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/1-1.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"/></a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9118578092,&quot;author_name&quot;:&quot;\\u5c0f\\u57cb\\u6709\\u8bdd\\u8981\\u8bf4&quot;,&quot;author_nickname&quot;:null,&quot;author_portrait&quot;:&quot;tb.1.add7a223.EnOTX9jxIz6LpXDW9upxZQ&quot;,&quot;first_post_id&quot;:150722196429,&quot;reply_num&quot;:0,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9118578092' data-thread-type=\"71\" data-floor='28''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">0</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9118578092\" title=\"提问：微信读书版盗笔改的多吗？\" target=\"_blank\" class=\"j_th_tit \">提问：微信读书版盗笔改的多吗？</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 小埋有话要说\"\n          data-field='{&quot;user_id&quot;:3335805164}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u5c0f\\u57cb\\u6709\\u8bdd\\u8981\\u8bf4&quot;,&quot;id&quot;:&quot;tb.1.add7a223.EnOTX9jxIz6LpXDW9upxZQ&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.add7a223.EnOTX9jxIz6LpXDW9upxZQ&fr=frs\" target=\"_blank\">小埋有话...</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/107_14.png?stamp=1723012493) no-repeat -5400px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"shoucifaite\" data-field='{&quot;name&quot;:&quot;shoucifaite&quot;,&quot;end_time&quot;:&quot;1725492676&quot;,&quot;category_id&quot;:107,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u9996\\u6b21\\u53d1\\u8d34&quot;,&quot;intro&quot;:&quot;\\u9996\\u6b21\\u53d1\\u8d34&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/wxf\\/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,108&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/wxf/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare\"  class=\"j_icon_slot\"  title=\"首次发贴\"  locate=\"shoucifaite_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">8-6</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            最近想重看盗笔，然后发现微信读书版和记忆中的有些出入。如图所示，这一段我记得是吴邪先出门看了大金牙往回走，然后回屋拍了照，再把复印件给大金牙来着。\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm9118578092\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"18960\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D97%2C90/sign=94154509adc4b74534c1bf1ff8d02727/936f3af5e0fe99252271aa7072a85edf8db1715c.jpg?tbpicau=2024-08-10-05_93079e55cb3d3778d93aae9390facf97\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/936f3af5e0fe99252271aa7072a85edf8db1715c.jpg?tbpicau=2024-08-10-05_d0c64a5db9d7fd6dfe9a7c0b8b6c3f51\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 小埋有话要说\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u5c0f\\u57cb\\u6709\\u8bdd\\u8981\\u8bf4&quot;,&quot;id&quot;:&quot;tb.1.add7a223.EnOTX9jxIz6LpXDW9upxZQ&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.add7a223.EnOTX9jxIz6LpXDW9upxZQ&fr=frs\" target=\"_blank\">小埋有话...</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-6        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9114067333,&quot;author_name&quot;:&quot;\\u85cf\\u9752\\u82e6\\u59dc&quot;,&quot;author_nickname&quot;:null,&quot;author_portrait&quot;:&quot;tb.1.e6de616e.AuhP0HOs8WLmcMFA-GhnDg&quot;,&quot;first_post_id&quot;:150701879855,&quot;reply_num&quot;:4,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9114067333' data-thread-type=\"71\" data-floor='29''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">4</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9114067333\" title=\"老大们，新人刚看完盗墓笔记本传，问问阅读顺序🥹🙏🏻\" target=\"_blank\" class=\"j_th_tit \">老大们，新人刚看完盗墓笔记本传，问问阅读顺序🥹🙏🏻</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 藏青苦姜\"\n          data-field='{&quot;user_id&quot;:6376734340}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u85cf\\u9752\\u82e6\\u59dc&quot;,&quot;id&quot;:&quot;tb.1.e6de616e.AuhP0HOs8WLmcMFA-GhnDg&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.e6de616e.AuhP0HOs8WLmcMFA-GhnDg&fr=frs\" target=\"_blank\">藏青苦姜</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/107_14.png?stamp=1723012493) no-repeat -5400px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"shoucifaite\" data-field='{&quot;name&quot;:&quot;shoucifaite&quot;,&quot;end_time&quot;:&quot;1725180869&quot;,&quot;category_id&quot;:107,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u9996\\u6b21\\u53d1\\u8d34&quot;,&quot;intro&quot;:&quot;\\u9996\\u6b21\\u53d1\\u8d34&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/wxf\\/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,108&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/wxf/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare\"  class=\"j_icon_slot\"  title=\"首次发贴\"  locate=\"shoucifaite_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">8-2</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n\n        </div>\n\n                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 冷冻罗非鱼1\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u51b7\\u51bb\\u7f57\\u975e\\u9c7c1&quot;,&quot;id&quot;:&quot;tb.1.9afe63da.uluYy5aHzoyUYXJQo38gBQ&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.9afe63da.uluYy5aHzoyUYXJQo38gBQ&fr=frs\" target=\"_blank\">冷冻罗非...</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-2        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9115496257,&quot;author_name&quot;:&quot;&quot;,&quot;author_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_GU6PaC1&quot;,&quot;author_portrait&quot;:&quot;tb.1.ba84e613.Lz_lc-EmnaEJzRh0PJ5-iQ&quot;,&quot;first_post_id&quot;:150708104292,&quot;reply_num&quot;:4,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9115496257' data-thread-type=\"71\" data-floor='30''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">4</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9115496257\" title=\"想问问哪里说吴邪拜师黑瞎子\" target=\"_blank\" class=\"j_th_tit \">想问问哪里说吴邪拜师黑瞎子</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 贴吧用户_GU6PaC1\"\n          data-field='{&quot;user_id&quot;:5788570603}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;&quot;,&quot;id&quot;:&quot;tb.1.ba84e613.Lz_lc-EmnaEJzRh0PJ5-iQ&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.ba84e613.Lz_lc-EmnaEJzRh0PJ5-iQ&fr=frs\" target=\"_blank\">好困阿oO</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">8-3</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            看了短篇的黑瞎子师傅，说是花爷介绍的。 为什么要拜师黑瞎子 我只看了盗墓笔记和藏海花\n        </div>\n\n                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 贴吧用户_JQKZQ5e\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;&quot;,&quot;id&quot;:&quot;tb.1.8be13f31.jDLFNDvOGGHeR_AzsXKs1g&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card  vip_red \" href=\"/home/main/?id=tb.1.8be13f31.jDLFNDvOGGHeR_AzsXKs1g&fr=frs\" target=\"_blank\">藏海不逝花</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-5        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9118079471,&quot;author_name&quot;:&quot;Joe\\u6a04&quot;,&quot;author_nickname&quot;:null,&quot;author_portrait&quot;:&quot;tb.1.f6a2093d.4WPFc9wWwV9jWzNYCNpKiQ&quot;,&quot;first_post_id&quot;:150719729974,&quot;reply_num&quot;:2,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9118079471' data-thread-type=\"71\" data-floor='31''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">2</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9118079471\" title=\"盗墓笔记的走向咋被变成了这样\" target=\"_blank\" class=\"j_th_tit \">盗墓笔记的走向咋被变成了这样</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: Joe樄\"\n          data-field='{&quot;user_id&quot;:5980167038}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;Joe\\u6a04&quot;,&quot;id&quot;:&quot;tb.1.f6a2093d.4WPFc9wWwV9jWzNYCNpKiQ&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.f6a2093d.4WPFc9wWwV9jWzNYCNpKiQ&fr=frs\" target=\"_blank\">Joe樄</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/107_14.png?stamp=1723012493) no-repeat -5400px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"shoucifaite\" data-field='{&quot;name&quot;:&quot;shoucifaite&quot;,&quot;end_time&quot;:&quot;1728039727&quot;,&quot;category_id&quot;:107,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u9996\\u6b21\\u53d1\\u8d34&quot;,&quot;intro&quot;:&quot;\\u9996\\u6b21\\u53d1\\u8d34&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/wxf\\/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,108&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/wxf/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare\"  class=\"j_icon_slot\"  title=\"首次发贴\"  locate=\"shoucifaite_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">8-5</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            我一直记得三叔写《盗墓笔记》的主打方向和初衷不是爱情呐，为啥现在磕的人越来越多了，还一个劲的问我不磕cp我就是梦女。\n        </div>\n\n                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 贴吧用户_a45D378\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u76d7\\u7b14\\u62ef\\u6551\\u4e16\\u754c&quot;,&quot;id&quot;:&quot;tb.1.89a1a2c7.7q1yCihvZLpIx3HyfEO_Ww&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.89a1a2c7.7q1yCihvZLpIx3HyfEO_Ww&fr=frs\" target=\"_blank\">贴吧用户_...</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-6        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9052096050,&quot;author_name&quot;:&quot;\\u51b7\\u79cb\\u97f5\\u9521&quot;,&quot;author_nickname&quot;:&quot;\\u79cb\\u7fceqiul\\ud83d\\udca6&quot;,&quot;author_portrait&quot;:&quot;tb.1.8b65438d.QNEqqT5YsmMFnZL0h4PN8w&quot;,&quot;first_post_id&quot;:150429368978,&quot;reply_num&quot;:37,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9052096050' data-thread-type=\"0\" data-floor='32''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">37</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9052096050\" title=\"感觉贵圈越来越诡异了\" target=\"_blank\" class=\"j_th_tit \">感觉贵圈越来越诡异了</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 秋翎qiul💦\"\n          data-field='{&quot;user_id&quot;:848244058}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u51b7\\u79cb\\u97f5\\u9521&quot;,&quot;id&quot;:&quot;tb.1.8b65438d.QNEqqT5YsmMFnZL0h4PN8w&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.8b65438d.QNEqqT5YsmMFnZL0h4PN8w&fr=frs\" target=\"_blank\">思无邪的...</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/107_14.png?stamp=1723012493) no-repeat -5500px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"zanlu\" data-field='{&quot;name&quot;:&quot;zanlu&quot;,&quot;end_time&quot;:&quot;1728225596&quot;,&quot;category_id&quot;:107,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u5d2d\\u9732\\u5934\\u89d2&quot;,&quot;intro&quot;:&quot;\\u6ce8\\u518c\\u540e\\u53d1\\u8d34\\u8fbe7\\u6b21\\uff08\\u6bcf\\u65e5\\u6700\\u591a\\u8ba1\\u65701\\u6b21\\uff09&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/wxf\\/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,110&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/wxf/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare\"  class=\"j_icon_slot\"  title=\"崭露头角\"  locate=\"zanlu_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">6-14</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            梦女人人喊打，洁癖无处不在。。有没有古早妹一起兴复盗笔（哭哭\n        </div>\n\n                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 秋翎qiul💦\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u51b7\\u79cb\\u97f5\\u9521&quot;,&quot;id&quot;:&quot;tb.1.8b65438d.QNEqqT5YsmMFnZL0h4PN8w&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.8b65438d.QNEqqT5YsmMFnZL0h4PN8w&fr=frs\" target=\"_blank\">思无邪的...</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><div id=\"mediago-tb-frs-list-32\" data-po=\"32\"></div><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9081189831,&quot;author_name&quot;:&quot;\\u975e\\u77e5\\u540d\\u5403\\u74dc\\u9009\\u624b&quot;,&quot;author_nickname&quot;:null,&quot;author_portrait&quot;:&quot;tb.1.9e9b0ac6.uuTOBrVUF0BLE-t22vUhpw&quot;,&quot;first_post_id&quot;:150550084782,&quot;reply_num&quot;:47,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9081189831' data-thread-type=\"0\" data-floor='33''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">47</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9081189831\" title=\"南派三叔合集盗墓笔记TXT＋有声书百度云免费分享\" target=\"_blank\" class=\"j_th_tit \">南派三叔合集盗墓笔记TXT＋有声书百度云免费分享</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 非知名吃瓜选手\"\n          data-field='{&quot;user_id&quot;:1386634760}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u975e\\u77e5\\u540d\\u5403\\u74dc\\u9009\\u624b&quot;,&quot;id&quot;:&quot;tb.1.9e9b0ac6.uuTOBrVUF0BLE-t22vUhpw&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.9e9b0ac6.uuTOBrVUF0BLE-t22vUhpw&fr=frs\" target=\"_blank\">非知名吃...</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/107_14.png?stamp=1723012493) no-repeat -11200px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"July24_icon\" data-field='{&quot;name&quot;:&quot;July24_icon&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:107,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;7\\u6708\\u6d3b\\u8dc3\\u6311\\u6218\\u8d5b&quot;,&quot;intro&quot;:&quot;7\\u6708\\u7d2f\\u8ba1\\u6d3b\\u8dc315\\u5929&quot;,&quot;intro_url&quot;:&quot;https:\\/\\/tieba.baidu.com\\/mo\\/q\\/hybrid-main-user\\/taskCenter?customfullscreen=1&amp;nonavigationbar=1&amp;fr=icon&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,224&quot;}}' target=\"_blank\"   href=\"https://tieba.baidu.com/mo/q/hybrid-main-user/taskCenter?customfullscreen=1&amp;nonavigationbar=1&amp;fr=icon\"  class=\"j_icon_slot\"  title=\"7月活跃挑战赛\"  locate=\"July24_icon_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">7-8</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            通过百度网盘分享的文件：南派三叔链接：网页链接提取码:1gp1 复制这段内容打开「百度网盘APP 即可获取」\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm9081189831\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"63491\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C195%3Bcrop%3D0%2C0%2C90%2C90/sign=b3f09d43170fd9f9a0425d601501e513/7d4122fae6cd7b89c65988bc492442a7d9330e9a.jpg?tbpicau=2024-08-10-05_058526c929bffb4062344008e437b946\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/7d4122fae6cd7b89c65988bc492442a7d9330e9a.jpg?tbpicau=2024-08-10-05_2d7b9c7e0c8fc28246a32709349609fd\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"10123\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C195%3Bcrop%3D0%2C0%2C90%2C90/sign=4344d6009ff9d72a17311814e406190d/9cbcf1cd7b899e5156bb882b04a7d933c8950d9a.jpg?tbpicau=2024-08-10-05_d1fc585aa86dce9aa704626f827ef327\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/9cbcf1cd7b899e5156bb882b04a7d933c8950d9a.jpg?tbpicau=2024-08-10-05_7e1fe64a2153b05fce4149dbc00a910e\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: _报木以琼\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;_\\u62a5\\u6728\\u4ee5\\u743c&quot;,&quot;id&quot;:&quot;tb.1.91e2a50.gv_J6z_evarvLfAFEsoghw&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.91e2a50.gv_J6z_evarvLfAFEsoghw&fr=frs\" target=\"_blank\">_报木以琼</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:8502802251,&quot;author_name&quot;:&quot;\\u4e3f\\u5ff5\\u4e00\\u4efd_\\u671f\\u5f85&quot;,&quot;author_nickname&quot;:&quot;\\u542c\\u6d77\\ud83d\\udca6&quot;,&quot;author_portrait&quot;:&quot;tb.1.da02c84b.qU7KWGDiIXpISCwiy1Ltug&quot;,&quot;first_post_id&quot;:148062019681,&quot;reply_num&quot;:28,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='8502802251' data-thread-type=\"0\" data-floor='34''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">28</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/8502802251\" title=\"盗墓笔记的35个问题，能全答对的绝对是骨灰级的稻米\" target=\"_blank\" class=\"j_th_tit \">盗墓笔记的35个问题，能全答对的绝对是骨灰级的稻米</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 听海💦\"\n          data-field='{&quot;user_id&quot;:1462274928}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u4e3f\\u5ff5\\u4e00\\u4efd_\\u671f\\u5f85&quot;,&quot;id&quot;:&quot;tb.1.da02c84b.qU7KWGDiIXpISCwiy1Ltug&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.da02c84b.qU7KWGDiIXpISCwiy1Ltug&fr=frs\" target=\"_blank\">听海<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/3-32.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"/></a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1723012493) no-repeat -3950px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"starmaster\" data-field='{&quot;name&quot;:&quot;starmaster&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u624b\\u6e380\\u661f\\u8fbe\\u4eba&quot;,&quot;intro&quot;:&quot;\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;4&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,76&quot;,&quot;2&quot;:&quot;1723012493,77&quot;,&quot;3&quot;:&quot;1723012493,78&quot;,&quot;4&quot;:&quot;1723012493,79&quot;,&quot;5&quot;:&quot;1723012493,80&quot;,&quot;6&quot;:&quot;1723012493,81&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/f?kw=玩家认证&amp;ie=utf-8\"  class=\"j_icon_slot\"  title=\"手游0星达人\"  locate=\"starmaster_4#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a><a style=\"background: url(https://tb3.bdstatic.com/public/icon/102_14.png?stamp=1723012493) no-repeat -850px  0;top:0px;left:28px\" data-slot=\"2\"  data-name=\"shuangyu\" data-field='{&quot;name&quot;:&quot;shuangyu&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:102,&quot;slot_no&quot;:&quot;2&quot;,&quot;title&quot;:&quot;\\u53cc\\u9c7c\\u5ea7\\u5370\\u8bb0&quot;,&quot;intro&quot;:&quot;\\u83b7\\u53d6\\u89c4\\u5219\\uff1a\\u5728\\u661f\\u5ea7\\u52cb\\u7ae0\\u9986\\u4e2d\\u83b7\\u5f97\\u3002&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,17&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search\"  class=\"j_icon_slot\"  title=\"双鱼座印记\"  locate=\"shuangyu_1#icon\"  style=\"top: 0px; left:28px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">2023-07</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            1、Q:陈文锦笔记中将记录汪藏海的功绩的壁画称为什么？ 2、Q:在蛇沼鬼城里，三叔燃放了哪种颜色的烟雾，禁止吴邪他们靠近？ 3、Q:吴邪收到的录像带是从哪个地方寄出来的？ 4、Q:“做事情要主动”这句话是谁说的？ 5、Q:在塔木陀，文锦方面的向导叫什么 先放五道题目出来，不会有人答不上来吧是谁我不说\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm8502802251\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"66097\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C90%3Bcrop%3D0%2C0%2C90%2C90/sign=6089f1dc9854564ee530ec3083f2a5b2/ab4e6cf40ad162d9db0eafd354dfa9ec8813cde0.jpg?tbpicau=2024-08-10-05_9ac386b5ceba1b19a6b29a533e8ad3d5\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/ab4e6cf40ad162d9db0eafd354dfa9ec8813cde0.jpg?tbpicau=2024-08-10-05_c05673ea2c9910db3c5cce7e33f18058\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 贴吧用户_GyaNX6U\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;&quot;,&quot;id&quot;:&quot;tb.1.3462c26b.nb9t4CttVUCnA4Sua6grKw&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.3462c26b.nb9t4CttVUCnA4Sua6grKw&fr=frs\" target=\"_blank\">玖（）</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:8858244344,&quot;author_name&quot;:&quot;1157209410&quot;,&quot;author_nickname&quot;:&quot;\\u5c0f\\u6674\\u9c9c\\u679c\\u56ed\\ud83c\\udf52&quot;,&quot;author_portrait&quot;:&quot;tb.1.84e1eec9.SO1aNgNVJIsHp3d61iw9ug&quot;,&quot;first_post_id&quot;:149605831480,&quot;reply_num&quot;:332,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='8858244344' data-thread-type=\"0\" data-floor='35''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">332</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/8858244344\" title=\"【福利】盗墓笔记小说全家福分享\" target=\"_blank\" class=\"j_th_tit \">【福利】盗墓笔记小说全家福分享</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author no_icon_author\"\n          title=\"主题作者: 小晴鲜果园🍒\"\n          data-field='{&quot;user_id&quot;:400421845}' ><i class=\"icon_author\"></i><span class=\"pre_icon_wrap pre_icon_wrap_theme1 frs_bright_preicon\"><a class=\"icon_tbworld icon-crown-vip\" href=\"/tbmall/tshow\" data-field='{&quot;user_id&quot;:400421845}' target=\"_blank\" title=\"贴吧会员\"></a></span><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;1157209410&quot;,&quot;id&quot;:&quot;tb.1.84e1eec9.SO1aNgNVJIsHp3d61iw9ug&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card  vip_red \" href=\"/home/main/?id=tb.1.84e1eec9.SO1aNgNVJIsHp3d61iw9ug&fr=frs\" target=\"_blank\">小肥晴子</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/102_14.png?stamp=1723012493) no-repeat -700px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"tianxie\" data-field='{&quot;name&quot;:&quot;tianxie&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:102,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u5929\\u874e\\u5ea7\\u5370\\u8bb0&quot;,&quot;intro&quot;:&quot;\\u83b7\\u53d6\\u89c4\\u5219\\uff1a\\u5728\\u661f\\u5ea7\\u52cb\\u7ae0\\u9986\\u4e2d\\u83b7\\u5f97\\u3002&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,14&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search\"  class=\"j_icon_slot\"  title=\"天蝎座印记\"  locate=\"tianxie_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">1-12</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            老九门，湘西往事，老九门番外，四屠黄葵，铁衣寒，盗墓笔记1-8，藏海花，吴邪私家笔记，沙海1-4，十年，重启听雷，东南亚篇灯海万山王母，七指，钓王，幻境，盲塚，千面，南部档案，张二舟，他们在干什么集，藏海戏麟，花夜，雨村笔记，王胖子番外，所有短篇。 以上所有文章我都整理到一个TXT里了 有新入坑的宝宝可以找我要，本人老稻米无偿分享给新稻米，新稻米们再也不用担心找的资源不齐了。 有不懂的也可以问我，我会耐心解答 希\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm8858244344\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"8298\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C195%3Bcrop%3D0%2C0%2C90%2C90/sign=77d07e8af4b7d0a27b9c0c94fbc34730/10475d90f603738d73931e1af51bb051f919ecf0.jpg?tbpicau=2024-08-10-05_007ba2d41e65c100c396da26b929b21f\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/10475d90f603738d73931e1af51bb051f919ecf0.jpg?tbpicau=2024-08-10-05_9fee3d6019f2a4402d847a7d70849260\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: Eternal夜凝\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;Eternal\\u591c\\u51dd&quot;,&quot;id&quot;:&quot;tb.1.5175d024.TMuYQMEludUbD_DeciJhRg&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.5175d024.TMuYQMEludUbD_DeciJhRg&fr=frs\" target=\"_blank\">不要芹菜...</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9081021244,&quot;author_name&quot;:&quot;\\u5e74\\u5c11\\u65f6\\u4e00\\u89c1\\u751f\\u60c5&quot;,&quot;author_nickname&quot;:null,&quot;author_portrait&quot;:&quot;tb.1.cf3265a0.ASKVFLHpZvHEFQMD5ko5YA&quot;,&quot;first_post_id&quot;:150549077505,&quot;reply_num&quot;:63,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9081021244' data-thread-type=\"0\" data-floor='36''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">63</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9081021244\" title=\"盗墓笔记电子版\" target=\"_blank\" class=\"j_th_tit \">盗墓笔记电子版</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 年少时一见生情\"\n          data-field='{&quot;user_id&quot;:3539574484}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u5e74\\u5c11\\u65f6\\u4e00\\u89c1\\u751f\\u60c5&quot;,&quot;id&quot;:&quot;tb.1.cf3265a0.ASKVFLHpZvHEFQMD5ko5YA&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.cf3265a0.ASKVFLHpZvHEFQMD5ko5YA&fr=frs\" target=\"_blank\">年少时一...</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">7-7</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            盗墓笔记 69部 电子版 有偿1r\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm9081021244\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"37291\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C90%3Bcrop%3D0%2C0%2C90%2C90/sign=d0ecf9d6cb1001e94e691c06882242dc/a313a419ebc4b7453089072989fc1e178a8215b2.jpg?tbpicau=2024-08-10-05_854fe0eaeb9f9905be273b79fa52d995\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/a313a419ebc4b7453089072989fc1e178a8215b2.jpg?tbpicau=2024-08-10-05_72a5735d2cbeda7942c9836c5df00738\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: Eternal夜凝\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;Eternal\\u591c\\u51dd&quot;,&quot;id&quot;:&quot;tb.1.5175d024.TMuYQMEludUbD_DeciJhRg&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.5175d024.TMuYQMEludUbD_DeciJhRg&fr=frs\" target=\"_blank\">不要芹菜...</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9120322838,&quot;author_name&quot;:&quot;\\u5076\\u5c14\\u4f1a\\u62c9\\u95f8\\u4e36&quot;,&quot;author_nickname&quot;:&quot;\\u6279\\u51c6\\u8d77\\u98de-&quot;,&quot;author_portrait&quot;:&quot;tb.1.edfaf8aa.B1OgH0zHY0AKGu_CzWtZlA&quot;,&quot;first_post_id&quot;:150729327591,&quot;reply_num&quot;:3,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9120322838' data-thread-type=\"0\" data-floor='37''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">3</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9120322838\" title=\"极海听雷这本书到底有几个版本？\" target=\"_blank\" class=\"j_th_tit \">极海听雷这本书到底有几个版本？</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 批准起飞-\"\n          data-field='{&quot;user_id&quot;:2787846289}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u5076\\u5c14\\u4f1a\\u62c9\\u95f8\\u4e36&quot;,&quot;id&quot;:&quot;tb.1.edfaf8aa.B1OgH0zHY0AKGu_CzWtZlA&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.edfaf8aa.B1OgH0zHY0AKGu_CzWtZlA&fr=frs\" target=\"_blank\">批准起飞</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">8-7</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            网上找到的电子书是三人组➕金万堂一起下目的，某站找了个有声书，听了一段又是伍警又是什么教授。两个都叫极海听雷，到底哪个是正版啊？\n        </div>\n\n                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 枼小五\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u67bc\\u5c0f\\u4e94&quot;,&quot;id&quot;:&quot;tb.1.31c826d3.SGD5XVjW4uC24-7TfYhYRg&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.31c826d3.SGD5XVjW4uC24-7TfYhYRg&fr=frs\" target=\"_blank\">枼小五</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9089776596,&quot;author_name&quot;:&quot;&quot;,&quot;author_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_atSDXDU&quot;,&quot;author_portrait&quot;:&quot;tb.1.facb6a8c.Neeyqv89D-v0FMp1KGMJtg&quot;,&quot;first_post_id&quot;:150589564060,&quot;reply_num&quot;:21,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9089776596' data-thread-type=\"71\" data-floor='38''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">21</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9089776596\" title=\"盗墓笔记剧情询问\" target=\"_blank\" class=\"j_th_tit \">盗墓笔记剧情询问</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 贴吧用户_atSDXDU\"\n          data-field='{&quot;user_id&quot;:4631483308}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;&quot;,&quot;id&quot;:&quot;tb.1.facb6a8c.Neeyqv89D-v0FMp1KGMJtg&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.facb6a8c.Neeyqv89D-v0FMp1KGMJtg&fr=frs\" target=\"_blank\">贴吧用户_...</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">7-15</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            那个，问一下各位，我刚把本传看完，但感觉很多东西都接不上是什么情况啊，就比如，齐羽到底是是谁啊，我怎么只在结尾的时候看到了他，还有在后记里铁三角说的话我怎么一点印象都没有，是我看漏了很多东西吗？而且我还太没搞懂“它”到底是怎么个情况，拜托有大佬给讲一下到底是什么情况，谢谢🙏🏻🙏🏻🙏🏻\n        </div>\n\n                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 启蒙大蕃鸭\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u542f\\u8499\\u5927\\u8543\\u9e2d&quot;,&quot;id&quot;:&quot;tb.1.99f2578e.CaPx1hOXv0IIsOeG5J-N5w&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.99f2578e.CaPx1hOXv0IIsOeG5J-N5w&fr=frs\" target=\"_blank\">启蒙大蕃鸭</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><div id=\"mediago-tb-frs-list-38\" data-po=\"38\"></div><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9052030873,&quot;author_name&quot;:&quot;&quot;,&quot;author_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_JSUX8G6&quot;,&quot;author_portrait&quot;:&quot;tb.1.5cca3b21.59d_f5A3yq-omdXd1hzmKA&quot;,&quot;first_post_id&quot;:150429118635,&quot;reply_num&quot;:37,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9052030873' data-thread-type=\"0\" data-floor='39''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">37</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9052030873\" title=\"求大佬解答，这段到底是不是原著？\" target=\"_blank\" class=\"j_th_tit \">求大佬解答，这段到底是不是原著？</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 贴吧用户_JSUX8G6\"\n          data-field='{&quot;user_id&quot;:6455716016}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;&quot;,&quot;id&quot;:&quot;tb.1.5cca3b21.59d_f5A3yq-omdXd1hzmKA&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.5cca3b21.59d_f5A3yq-omdXd1hzmKA&fr=frs\" target=\"_blank\">贴吧用户_...</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/107_14.png?stamp=1723012493) no-repeat -5450px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"shoucihuitie\" data-field='{&quot;name&quot;:&quot;shoucihuitie&quot;,&quot;end_time&quot;:&quot;1723515587&quot;,&quot;category_id&quot;:107,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u9996\\u6b21\\u56de\\u8d34&quot;,&quot;intro&quot;:&quot;\\u9996\\u6b21\\u56de\\u8d34&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/wxf\\/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,109&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/wxf/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare\"  class=\"j_icon_slot\"  title=\"首次回贴\"  locate=\"shoucihuitie_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">6-14</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            <span class=\"topic-tag\" data-flag=\"0\" data-name=\"%E8%A7%A3%E9%9B%A8%E8%87%A3\">#解雨臣#</span>\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm9052030873\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"72370\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C110%3Bcrop%3D0%2C0%2C90%2C90/sign=2cf63c8c9758ccbf1be9bd3329f48d0f/7e8c6ccb0a46f21f2121cb6db0246b600c33aeba.jpg?tbpicau=2024-08-10-05_c0867a87e80ba11ca45b81405853ae3a\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/7e8c6ccb0a46f21f2121cb6db0246b600c33aeba.jpg?tbpicau=2024-08-10-05_95e98cf9236065cb6ce54a4bce394298\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 贴吧用户_at628R6\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;&quot;,&quot;id&quot;:&quot;tb.1.c617b490.pjbQhS6YlrF24CMh4_S8pQ&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.c617b490.pjbQhS6YlrF24CMh4_S8pQ&fr=frs\" target=\"_blank\">科比来肘...</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:8925166310,&quot;author_name&quot;:&quot;&quot;,&quot;author_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_GbUe12D&quot;,&quot;author_portrait&quot;:&quot;tb.1.ca8cea2c.eI-7sqIp2hGbj_XEfljfjg&quot;,&quot;first_post_id&quot;:149900757243,&quot;reply_num&quot;:55,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='8925166310' data-thread-type=\"71\" data-floor='40''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">55</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/8925166310\" title=\"吴邪是处吗\" target=\"_blank\" class=\"j_th_tit \">吴邪是处吗</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 贴吧用户_GbUe12D\"\n          data-field='{&quot;user_id&quot;:6019591741}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;&quot;,&quot;id&quot;:&quot;tb.1.ca8cea2c.eI-7sqIp2hGbj_XEfljfjg&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.ca8cea2c.eI-7sqIp2hGbj_XEfljfjg&fr=frs\" target=\"_blank\">悠悠长白雪</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">3-7</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            这个问题困扰我多年，求解答\n        </div>\n\n                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 🍒晴天娃娃\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u5e78\\u8fd0\\u56db\\u53f6\\u8349HY&quot;,&quot;id&quot;:&quot;tb.1.c41962aa.3QpezMCunQXexfqNNM-bnw&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.c41962aa.3QpezMCunQXexfqNNM-bnw&fr=frs\" target=\"_blank\"><img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/2-16.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"/>晴天娃娃</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-3        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:3884414593,&quot;author_name&quot;:&quot;\\u5922\\u91cc\\u9047\\u5979&quot;,&quot;author_nickname&quot;:null,&quot;author_portrait&quot;:&quot;tb.1.a95e2ca3.ybZoVX3nFEQ2MifSJeIZlA&quot;,&quot;first_post_id&quot;:71276700050,&quot;reply_num&quot;:310264,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:true,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='3884414593' data-thread-type=\"0\" data-floor='41''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">310264</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n    <i class=\"icon-good\" alt=\"精品\" title=\"精品\" ></i>\n\n    <a rel=\"noopener\" href=\"/p/3884414593\" title=\"【吧务】张起灵召唤功能固定使用楼，大家来玩吧！\" target=\"_blank\" class=\"j_th_tit \">【吧务】张起灵召唤功能固定使用楼，大家来玩吧！</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 夢里遇她\"\n          data-field='{&quot;user_id&quot;:602581625}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u5922\\u91cc\\u9047\\u5979&quot;,&quot;id&quot;:&quot;tb.1.a95e2ca3.ybZoVX3nFEQ2MifSJeIZlA&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.a95e2ca3.ybZoVX3nFEQ2MifSJeIZlA&fr=frs\" target=\"_blank\">夢里遇她</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">2015-07</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            名人堂活动后，本吧成功获得特权功能包，为此感到非常开心，但却带来了一个问题——张起灵自动顶贴功能贴在吧内刷版。 在此，吧务组讨论后特定以下规定： （1） 请尽量到吧内保留的几个高楼里或者本帖使用功能，禁止开大量新贴。 （2） 召唤张起灵相关贴首页超过3贴即构成刷版，将会进行清理。 （3） 提问特权包功能相关使用信息者，其中包括如何获得印记“盗”、小黄鸡动态头像等，吧务解答后会和谐。 （4）吧务不提倡在所有帖子里都\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm3884414593\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"41457\" data-original=\"https://imgsa.baidu.com/forum/wh%3D111%2C90/sign=2ef5590db7119313c716f7b1540920ee/3e6dc30735fae6cd063f3cae0ab30f2443a70f38.jpg\"  bpic=\"https://imgsa.baidu.com/forum/pic/item/3e6dc30735fae6cd063f3cae0ab30f2443a70f38.jpg\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"44963\" data-original=\"https://imgsa.baidu.com/forum/wh%3D200%2C90%3B/sign=854410ee9613b07ebde8580a3ce7bd1a/7d4122fae6cd7b89e0e7ad4c0a2442a7d8330e38.jpg\"  bpic=\"https://imgsa.baidu.com/forum/pic/item/7d4122fae6cd7b89e0e7ad4c0a2442a7d8330e38.jpg\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 张起灵\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u9f99\\u732b6929&quot;,&quot;id&quot;:&quot;tb.1.4c9ca83.SHKh84lbMr4VzyBLxli1WQ&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.4c9ca83.SHKh84lbMr4VzyBLxli1WQ&fr=frs\" target=\"_blank\">张起灵</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:6852484660,&quot;author_name&quot;:&quot;\\u9e92\\u9e9f\\u4e00\\u7b1160&quot;,&quot;author_nickname&quot;:&quot;\\u957f\\u767d\\u10da\\u521d\\u6696&quot;,&quot;author_portrait&quot;:&quot;tb.1.d166fa12.4ZaqDzBQHTPoXUeyXLMbOw&quot;,&quot;first_post_id&quot;:133769544849,&quot;reply_num&quot;:75,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='6852484660' data-thread-type=\"0\" data-floor='42''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">75</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/6852484660\" title=\"避坑!盘点正版《十年》与盗版十年的区别\" target=\"_blank\" class=\"j_th_tit \">避坑!盘点正版《十年》与盗版十年的区别</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 长白ლ初暖\"\n          data-field='{&quot;user_id&quot;:2045782671}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u9e92\\u9e9f\\u4e00\\u7b1160&quot;,&quot;id&quot;:&quot;tb.1.d166fa12.4ZaqDzBQHTPoXUeyXLMbOw&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.d166fa12.4ZaqDzBQHTPoXUeyXLMbOw&fr=frs\" target=\"_blank\">长白<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/1-9.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"/>初暖</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/104_14.png?stamp=1723012493) no-repeat -3800px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"starmaster\" data-field='{&quot;name&quot;:&quot;starmaster&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:104,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u624b\\u6e380\\u661f\\u8fbe\\u4eba&quot;,&quot;intro&quot;:&quot;\\u5728\\u624b\\u6e38\\u73a9\\u5bb6\\u5427\\u6210\\u4e3a\\u624b\\u6e380\\u661f\\u8fbe\\u4eba\\u8ba4\\u8bc1\\u7528\\u6237\\uff0c\\u5373\\u53ef\\u83b7\\u53d6\\u54e6~&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/f?kw=\\u73a9\\u5bb6\\u8ba4\\u8bc1&amp;ie=utf-8&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,76&quot;,&quot;2&quot;:&quot;1723012493,77&quot;,&quot;3&quot;:&quot;1723012493,78&quot;,&quot;4&quot;:&quot;1723012493,79&quot;,&quot;5&quot;:&quot;1723012493,80&quot;,&quot;6&quot;:&quot;1723012493,81&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/f?kw=玩家认证&amp;ie=utf-8\"  class=\"j_icon_slot\"  title=\"手游0星达人\"  locate=\"starmaster_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">2020-07</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            避坑!盘点正版《十年》与盗版十年的区别\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm6852484660\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"92477\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C123%3Bcrop%3D0%2C0%2C90%2C90/sign=5f83842f37a446237e9fad6ba80e433c/2ed2b3c27d1ed21b3c55d0b0ba6eddc450da3f89.jpg?tbpicau=2024-08-10-05_01d74cfa7e4798f76eb7624dc4320993\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/2ed2b3c27d1ed21b3c55d0b0ba6eddc450da3f89.jpg?tbpicau=2024-08-10-05_e34f20aad76d7394b1aaeff6146315cd\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"91630\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C120%3Bcrop%3D0%2C0%2C90%2C90/sign=4ad54c21fcf81a4c2667e4c0e706516b/d2cf89510fb30f2404411256df95d143ac4b0356.jpg?tbpicau=2024-08-10-05_72a19e92bb2a7f8ce891a0b07ac908d4\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/d2cf89510fb30f2404411256df95d143ac4b0356.jpg?tbpicau=2024-08-10-05_7ab8481bce2ee1bed363bb80794cecc2\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"50515\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C120%3Bcrop%3D0%2C0%2C90%2C90/sign=21c91dadb086c91708565a30f91141fd/8172239b033b5bb57de9d9ab21d3d539b600bc74.jpg?tbpicau=2024-08-10-05_a011268c78eeeaaeadb2eab4c5641a1b\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/8172239b033b5bb57de9d9ab21d3d539b600bc74.jpg?tbpicau=2024-08-10-05_ddf362a6b06774f24b1ea215cf36fb89\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n                        <div class=\"small_pic_num center_text\">共&nbsp;20&nbsp;张</div>\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 🍒晴天娃娃\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u5e78\\u8fd0\\u56db\\u53f6\\u8349HY&quot;,&quot;id&quot;:&quot;tb.1.c41962aa.3QpezMCunQXexfqNNM-bnw&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.c41962aa.3QpezMCunQXexfqNNM-bnw&fr=frs\" target=\"_blank\"><img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/2-16.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"/>晴天娃娃</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9005330391,&quot;author_name&quot;:&quot;\\u967b\\u5f73\\u4e8d\\u4ebb&quot;,&quot;author_nickname&quot;:&quot;\\ud83d\\ude08\\u76d6\\u5854\\ud83d\\ude07&quot;,&quot;author_portrait&quot;:&quot;tb.1.d2e5ade0.cfU6M_L7WoaOWcN5a86G4g&quot;,&quot;first_post_id&quot;:150227173448,&quot;reply_num&quot;:59,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9005330391' data-thread-type=\"0\" data-floor='43''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">59</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9005330391\" title=\"盘点重启中出现的贵物\" target=\"_blank\" class=\"j_th_tit \">盘点重启中出现的贵物</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 😈盖塔😇\"\n          data-field='{&quot;user_id&quot;:4559800616}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u967b\\u5f73\\u4e8d\\u4ebb&quot;,&quot;id&quot;:&quot;tb.1.d2e5ade0.cfU6M_L7WoaOWcN5a86G4g&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.d2e5ade0.cfU6M_L7WoaOWcN5a86G4g&fr=frs\" target=\"_blank\"><img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/1-35.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"/>盖塔<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/2-19.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"/></a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">5-5</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n             玛姆血垛之类的是物品不是贵物，所以此贴不讨论\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm9005330391\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"99882\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D95%2C90/sign=c86fdee230094b36dbc713e496e045e9/6059252dd42a2834cd5916361db5c9ea15cebf14.jpg?tbpicau=2024-08-10-05_5f3f1db434486955815c5775c03fa9bd\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/6059252dd42a2834cd5916361db5c9ea15cebf14.jpg?tbpicau=2024-08-10-05_154a831d60b9d4c5e8b52c98b67d39a0\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"56887\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D159%2C90/sign=41c1568b453b5bb5be8228ff03eaf900/367adab44aed2e73e221d10cc101a18b86d6fac2.jpg?tbpicau=2024-08-10-05_1333f5868e6436706889f3846609ff87\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/367adab44aed2e73e221d10cc101a18b86d6fac2.jpg?tbpicau=2024-08-10-05_4b0a4541eca4e41bdf7d288fc4068e00\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 嘎啦鸭◎\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u5f20\\u6c0f\\u5c0f\\u53ef&quot;,&quot;id&quot;:&quot;tb.1.7745d20d.meFYS3zFLch61wXVEZ1tiA&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.7745d20d.meFYS3zFLch61wXVEZ1tiA&fr=frs\" target=\"_blank\">嘎啦鸭<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/1-2.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"/></a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9081875540,&quot;author_name&quot;:&quot;\\u967b\\u5f73\\u4e8d\\u4ebb&quot;,&quot;author_nickname&quot;:&quot;\\ud83d\\ude08\\u76d6\\u5854\\ud83d\\ude07&quot;,&quot;author_portrait&quot;:&quot;tb.1.d2e5ade0.cfU6M_L7WoaOWcN5a86G4g&quot;,&quot;first_post_id&quot;:150552971552,&quot;reply_num&quot;:44,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9081875540' data-thread-type=\"0\" data-floor='44''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">44</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9081875540\" title=\"盘点系列出现的”神“以及个人对它们的势力排名\" target=\"_blank\" class=\"j_th_tit \">盘点系列出现的”神“以及个人对它们的势力排名</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 😈盖塔😇\"\n          data-field='{&quot;user_id&quot;:4559800616}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u967b\\u5f73\\u4e8d\\u4ebb&quot;,&quot;id&quot;:&quot;tb.1.d2e5ade0.cfU6M_L7WoaOWcN5a86G4g&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.d2e5ade0.cfU6M_L7WoaOWcN5a86G4g&fr=frs\" target=\"_blank\"><img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/1-35.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"/>盖塔<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/2-19.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"/></a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">7-8</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n             论地位，每一个都是全系列贵物中的贵物，属于贵物之亡中亡 但论实力，有些连烛九阴、万奴王、蛇柏之流都不一定打得过，属于牛马中的牛马\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm9081875540\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"37765\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C90%3Bcrop%3D0%2C0%2C90%2C90/sign=8e903f13c101a18bf0be1a46ae033e38/251283eef01f3a2928b16cf1df25bc315c607c5e.jpg?tbpicau=2024-08-10-05_922f5c82848993da93890c99217f0d5e\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/251283eef01f3a2928b16cf1df25bc315c607c5e.jpg?tbpicau=2024-08-10-05_f720a5e721943108dbfbb8db580d542d\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 嘎啦鸭◎\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u5f20\\u6c0f\\u5c0f\\u53ef&quot;,&quot;id&quot;:&quot;tb.1.7745d20d.meFYS3zFLch61wXVEZ1tiA&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.7745d20d.meFYS3zFLch61wXVEZ1tiA&fr=frs\" target=\"_blank\">嘎啦鸭<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/1-2.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"/></a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><div id=\"mediago-tb-frs-list-44\" data-po=\"44\"></div><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:8529905350,&quot;author_name&quot;:&quot;&quot;,&quot;author_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_JS2aWtt&quot;,&quot;author_portrait&quot;:&quot;tb.1.ee11114e.UIZJdpPM5V2C1atG-ZXQsg&quot;,&quot;first_post_id&quot;:148219360557,&quot;reply_num&quot;:235,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='8529905350' data-thread-type=\"0\" data-floor='45''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">235</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/8529905350\" title=\"新人有一些疑惑要被憋死了请大佬解答😭😭\" target=\"_blank\" class=\"j_th_tit \">新人有一些疑惑要被憋死了请大佬解答😭😭</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 贴吧用户_JS2aWtt\"\n          data-field='{&quot;user_id&quot;:6460426570}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;&quot;,&quot;id&quot;:&quot;tb.1.ee11114e.UIZJdpPM5V2C1atG-ZXQsg&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.ee11114e.UIZJdpPM5V2C1atG-ZXQsg&fr=frs\" target=\"_blank\">一支兰舟</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">2023-07</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            原著原著的，刚看完1-8 1.真正的三叔去哪儿了 2.假扮吴邪的脸把吴邪打晕的那个人到底是谁，为什么让吴邪在去阴曹地府的地上好好想想他是谁。 3.最后住在地下室的人是谁 4.最后那人说要告诉吴邪的结果是什么 5.拿走那封信的长得和吴邪一模一样的人是谁 6.他们为什么要守青铜门 7.为什么一直在说没有时间了 8.胖子不是老九门的后代为什么也一直在这里面 9.张起灵为什么一直不老 10.终极到底是什么为什么他们都不告诉吴邪 拜托了拜托了谢谢各位，\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm8529905350\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"93748\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C90%3Bcrop%3D0%2C0%2C90%2C90/sign=eee72d1ff8096b63814c56593c1fbe74/6457658b4710b9122c5d1cce85fdfc039245222d.jpg?tbpicau=2024-08-10-05_d228b0e7f80ba825c094ab73c6e53246\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/6457658b4710b9122c5d1cce85fdfc039245222d.jpg?tbpicau=2024-08-10-05_3b6772402039914e796034ab070e456a\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 嘎啦鸭◎\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u5f20\\u6c0f\\u5c0f\\u53ef&quot;,&quot;id&quot;:&quot;tb.1.7745d20d.meFYS3zFLch61wXVEZ1tiA&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.7745d20d.meFYS3zFLch61wXVEZ1tiA&fr=frs\" target=\"_blank\">嘎啦鸭<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/1-2.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"/></a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:8931967398,&quot;author_name&quot;:&quot;1157209410&quot;,&quot;author_nickname&quot;:&quot;\\u5c0f\\u6674\\u9c9c\\u679c\\u56ed\\ud83c\\udf52&quot;,&quot;author_portrait&quot;:&quot;tb.1.84e1eec9.SO1aNgNVJIsHp3d61iw9ug&quot;,&quot;first_post_id&quot;:149927452544,&quot;reply_num&quot;:51,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='8931967398' data-thread-type=\"0\" data-floor='46''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">51</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/8931967398\" title=\"关于资源分享的问题\" target=\"_blank\" class=\"j_th_tit \">关于资源分享的问题</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author no_icon_author\"\n          title=\"主题作者: 小晴鲜果园🍒\"\n          data-field='{&quot;user_id&quot;:400421845}' ><i class=\"icon_author\"></i><span class=\"pre_icon_wrap pre_icon_wrap_theme1 frs_bright_preicon\"><a class=\"icon_tbworld icon-crown-vip\" href=\"/tbmall/tshow\" data-field='{&quot;user_id&quot;:400421845}' target=\"_blank\" title=\"贴吧会员\"></a></span><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;1157209410&quot;,&quot;id&quot;:&quot;tb.1.84e1eec9.SO1aNgNVJIsHp3d61iw9ug&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card  vip_red \" href=\"/home/main/?id=tb.1.84e1eec9.SO1aNgNVJIsHp3d61iw9ug&fr=frs\" target=\"_blank\">小肥晴子</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/102_14.png?stamp=1723012493) no-repeat -700px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"tianxie\" data-field='{&quot;name&quot;:&quot;tianxie&quot;,&quot;end_time&quot;:&quot;1735660800&quot;,&quot;category_id&quot;:102,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u5929\\u874e\\u5ea7\\u5370\\u8bb0&quot;,&quot;intro&quot;:&quot;\\u83b7\\u53d6\\u89c4\\u5219\\uff1a\\u5728\\u661f\\u5ea7\\u52cb\\u7ae0\\u9986\\u4e2d\\u83b7\\u5f97\\u3002&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,14&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/f?ie=utf-8&amp;kw=%E8%9B%87%E5%A4%AB%E5%BA%A7&amp;fr=search\"  class=\"j_icon_slot\"  title=\"天蝎座印记\"  locate=\"tianxie_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">3-12</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            一开始我整理的资源我是免费分享的，不想收费，现在改收费了，为啥这么多人觉得免费是理所应当的伸手要呢？我改收费后也在我每个帖子下面说了，每一个私信我的我也回复了联系方式还有价格，咋你不看价格就加我，我一说收费了又破防？不是吧，所有的长篇短篇都整理到一起了，自己去拼嘟嘟还是🍑上搜下，哪有资源是这么全的，5r很贵吗，我也没强制收费啊，你不想花钱你可以不加我的可以别私信我 图1兄弟说我强人所难，拜托🙏🏻我没\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm8931967398\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"69706\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C195%3Bcrop%3D0%2C0%2C90%2C90/sign=77a10be530094b36dbc713e493e04de0/9054a41bb051f819c014f6709cb44aed2e73e79a.jpg?tbpicau=2024-08-10-05_4b479ac420f9a3d5a58331d6c748d1d4\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/9054a41bb051f819c014f6709cb44aed2e73e79a.jpg?tbpicau=2024-08-10-05_9e25d8faa4671cd326a589aabcc44360\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"91472\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C195%3Bcrop%3D0%2C0%2C90%2C90/sign=f18ca5324ad79123e0b59c7d9d1868bb/1e0354a98226cffc251b4a88ff014a90f603ea9a.jpg?tbpicau=2024-08-10-05_16964b149c7d35852ef7dbfef459af94\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/1e0354a98226cffc251b4a88ff014a90f603ea9a.jpg?tbpicau=2024-08-10-05_8f02e761d800f36d33b9c965d3608cf6\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"49625\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C195%3Bcrop%3D0%2C0%2C90%2C90/sign=49f8f1a78def76093c5e91961ef192f5/00312e12b31bb051bd154612707adab44aede09a.jpg?tbpicau=2024-08-10-05_f5855533c1f5bf16eb4738ea2b2031ba\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/00312e12b31bb051bd154612707adab44aede09a.jpg?tbpicau=2024-08-10-05_b13587c4187ff798b6b06f0fb697ec47\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n                        <div class=\"small_pic_num center_text\">共&nbsp;7&nbsp;张</div>\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: Ya啊🍒\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u65e7\\u68a6\\u5bd2\\u51acs&quot;,&quot;id&quot;:&quot;tb.1.4a12f806.2vgtfbryT-Axgc9kBL_H6Q&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.4a12f806.2vgtfbryT-Axgc9kBL_H6Q&fr=frs\" target=\"_blank\">Ya啊<img src=\"//tb1.bdstatic.com/tb/cms/nickemoji/2-16.png\" class=\"nicknameEmoji\" style=\"width:13px;height:13px\"/></a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:9119823576,&quot;author_name&quot;:&quot;&quot;,&quot;author_nickname&quot;:&quot;\\u8d34\\u5427\\u7528\\u6237_74XM1Zb&quot;,&quot;author_portrait&quot;:&quot;tb.1.2b71f654.9MhbQdqvbA4FKAf0gCiw3Q&quot;,&quot;first_post_id&quot;:150727195905,&quot;reply_num&quot;:0,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='9119823576' data-thread-type=\"0\" data-floor='47''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">0</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/9119823576\" title=\"盗墓笔记未删减版txt电子版\" target=\"_blank\" class=\"j_th_tit \">盗墓笔记未删减版txt电子版</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 贴吧用户_74XM1Zb\"\n          data-field='{&quot;user_id&quot;:2471177715}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;&quot;,&quot;id&quot;:&quot;tb.1.2b71f654.9MhbQdqvbA4FKAf0gCiw3Q&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.2b71f654.9MhbQdqvbA4FKAf0gCiw3Q&fr=frs\" target=\"_blank\">繁花拥椰</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"><a style=\"background: url(https://tb3.bdstatic.com/public/icon/107_14.png?stamp=1723012493) no-repeat -5450px  0;top:0px;left:0px\" data-slot=\"1\"  data-name=\"shoucihuitie\" data-field='{&quot;name&quot;:&quot;shoucihuitie&quot;,&quot;end_time&quot;:&quot;1725515778&quot;,&quot;category_id&quot;:107,&quot;slot_no&quot;:&quot;1&quot;,&quot;title&quot;:&quot;\\u9996\\u6b21\\u56de\\u8d34&quot;,&quot;intro&quot;:&quot;\\u9996\\u6b21\\u56de\\u8d34&quot;,&quot;intro_url&quot;:&quot;http:\\/\\/tieba.baidu.com\\/wxf\\/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare&quot;,&quot;price&quot;:0,&quot;value&quot;:&quot;1&quot;,&quot;sprite&quot;:{&quot;1&quot;:&quot;1723012493,109&quot;}}' target=\"_blank\"   href=\"http://tieba.baidu.com/wxf/324179?kw=%E5%8D%B0%E8%AE%B0&amp;fr=frsshare\"  class=\"j_icon_slot\"  title=\"首次回贴\"  locate=\"shoucihuitie_1#icon\"  style=\"top: 0px; left:0px\">  <div class=\" j_icon_slot_refresh\"></div></a></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">8-7</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            盗墓笔记电子未删减，有偿2r\n        </div>\n\n            <div class=\"small_wrap j_small_wrap\">\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_pre j_small_pic_pre\" style=\"display:none\"></a>\n                <a rel=\"noopener\"  href=\"#\" onclick=\"return false;\" class=\"small_btn_next j_small_pic_next\" style=\"display:none\"></a>\n                <div class=\"small_list j_small_list cleafix\">\n                    <div class=\"small_list_gallery\">\n                        <ul class=\"threadlist_media j_threadlist_media clearfix\" id=\"fm9119823576\"><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"83216\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C200%3Bcrop%3D0%2C0%2C90%2C90/sign=59ba8409707adab43d85134abbf8812c/784fa4de9c82d1586d1c6e90c60a19d8bc3e423f.jpg?tbpicau=2024-08-10-05_48fbda186521a807cf6e5dae154c8e3b\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/784fa4de9c82d1586d1c6e90c60a19d8bc3e423f.jpg?tbpicau=2024-08-10-05_246978f8f09b26823971062d604f8ed3\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li><li><a rel=\"noopener\"  class=\"thumbnail vpic_wrap\"><img src=\"https://tb3.bdstatic.com/public/img/icon_pc_picheader_n.432946a7.png\" attr=\"93235\" data-original=\"https://tiebapic.baidu.com/forum/wh%3D90%2C200%3Bcrop%3D0%2C0%2C90%2C90/sign=10f2fa08c018367aaddc77d41e5fb9e4/3b1ec609b3de9c8271fbceae2a81800a19d8433f.jpg?tbpicau=2024-08-10-05_d3983101668f8303f3010ddeaab6d8eb\"  bpic=\"https://tiebapic.baidu.com/forum/pic/item/3b1ec609b3de9c8271fbceae2a81800a19d8433f.jpg?tbpicau=2024-08-10-05_788ccaa465264a2d1e42487ecd75e46f\" class=\"threadlist_pic j_m_pic \"  /></a><div class=\"threadlist_pic_highlight j_m_pic_light\"></div></li></ul>\n\n                    </div>\n                </div>\n            </div>                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 贴吧用户_74XM1Zb\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;&quot;,&quot;id&quot;:&quot;tb.1.2b71f654.9MhbQdqvbA4FKAf0gCiw3Q&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.2b71f654.9MhbQdqvbA4FKAf0gCiw3Q&fr=frs\" target=\"_blank\">繁花拥椰</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li><li class=\" j_thread_list clearfix thread_item_box\" data-field='{&quot;id&quot;:1138972019,&quot;author_name&quot;:&quot;\\u5c38\\u9999\\u9b54\\u6b32\\u82b1&quot;,&quot;author_nickname&quot;:null,&quot;author_portrait&quot;:&quot;tb.1.925d3cf4.ywnH0nEwleRQL3begcfTYQ&quot;,&quot;first_post_id&quot;:13148731992,&quot;reply_num&quot;:5164241,&quot;is_bakan&quot;:null,&quot;vid&quot;:&quot;&quot;,&quot;is_good&quot;:null,&quot;is_top&quot;:null,&quot;is_protal&quot;:null,&quot;is_membertop&quot;:null,&quot;is_multi_forum&quot;:null,&quot;frs_tpoint&quot;:null,&quot;is_item_score&quot;:null,&quot;is_works_info&quot;:null}'  data-tid='1138972019' data-thread-type=\"0\" data-floor='48''>\n        <div class=\"t_con cleafix\">\n                            <div class=\"col2_left j_threadlist_li_left\">\n                                                                <span class=\"threadlist_rep_num center_text\"\n                                title=\"回复\">5164241</span>\n                                                </div>\n                <div class=\"col2_right j_threadlist_li_right \">\n            <div class=\"threadlist_lz clearfix\">\n                                <div class=\"threadlist_title pull_left j_th_tit \">\n\n\n    <a rel=\"noopener\" href=\"/p/1138972019\" title=\"用我的一生为“盗墓笔记”盖一栋“一亿层的神楼”。\" target=\"_blank\" class=\"j_th_tit \">用我的一生为“盗墓笔记”盖一栋“一亿层的神楼”。</a>\n</div><div class=\"threadlist_author pull_right\">\n    <span class=\"tb_icon_author \"\n          title=\"主题作者: 尸香魔欲花\"\n          data-field='{&quot;user_id&quot;:129869521}' ><i class=\"icon_author\"></i><span class=\"frs-author-name-wrap\"><a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;\\u5c38\\u9999\\u9b54\\u6b32\\u82b1&quot;,&quot;id&quot;:&quot;tb.1.925d3cf4.ywnH0nEwleRQL3begcfTYQ&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.925d3cf4.ywnH0nEwleRQL3begcfTYQ&fr=frs\" target=\"_blank\">尸香魔欲花</a></span><span class=\"icon_wrap  icon_wrap_theme1 frs_bright_icons \"></span>    </span>\n    <span class=\"pull-right is_show_create_time\" title=\"创建时间\">2014-03</span>\n</div>\n            </div>\n                            <div class=\"threadlist_detail clearfix\">\n                    <div class=\"threadlist_text pull_left\">\n                                <div class=\"threadlist_abs threadlist_abs_onlyline \">\n            夜，来临。明天又是新的开始。可一个陪伴我们好多年的朋友既将离去。淡淡的思绪随风飘舞。你们是否也有一分失落？ 多年后，还有多少人会记得？ 盗墓笔记。 我想用我的方式祭奠既将失去的东西，为“盗墓笔记”盖一栋“一亿层的神楼”。当然，我也知道，这是一个无法完成的愿望。但至少，我还有一丝牵挂。 当我思念的时候，当我无奈的时候。我会一个人，默默的来这里，寻找那曾经的欢笑，快乐。 一亿层楼 也许真的可以，虽然我是看不到\n        </div>\n\n                    </div>\n\n<div class=\"threadlist_author pull_right\">\n        <span class=\"tb_icon_author_rely j_replyer \" title=\"最后回复人: 贴吧用户_aMN164a\">\n            <i class=\"icon_replyer\"></i>\n            <a rel=\"noopener\"  data-field='{&quot;un&quot;:&quot;&quot;,&quot;id&quot;:&quot;tb.1.d4ce4934.c2zoPvbc7lNGjKG4Q9qTQQ&quot;,&quot;target_scheme&quot;:null}' class=\"frs-author-name j_user_card \" href=\"/home/main/?id=tb.1.d4ce4934.c2zoPvbc7lNGjKG4Q9qTQQ&fr=frs\" target=\"_blank\">贴吧用户_...</a>        </span>\n        <span class=\"threadlist_reply_date pull_right j_reply_data\" title=\"最后回复时间\">\n            8-7        </span>\n</div>\n                </div>\n                                </div>\n    </div>\n</li>\n\n\n\n\n\n\n\n\n\n</ul>\n\n<div class=\"thread_list_bottom clearfix\">\n\n<div id=\"frs_list_pager\" class=\"pagination-default clearfix\"><span class=\"pagination-current pagination-item \">1</span>\n<a href=\"//tieba.baidu.com/f?kw=%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&ie=utf-8&pn=50\" class=\" pagination-item \" >2</a>\n<a href=\"//tieba.baidu.com/f?kw=%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&ie=utf-8&pn=100\" class=\" pagination-item \" >3</a>\n<a href=\"//tieba.baidu.com/f?kw=%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&ie=utf-8&pn=150\" class=\" pagination-item \" >4</a>\n<a href=\"//tieba.baidu.com/f?kw=%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&ie=utf-8&pn=200\" class=\" pagination-item \" >5</a>\n<a href=\"//tieba.baidu.com/f?kw=%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&ie=utf-8&pn=250\" class=\" pagination-item \" >6</a>\n<a href=\"//tieba.baidu.com/f?kw=%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&ie=utf-8&pn=300\" class=\" pagination-item \" >7</a>\n<a href=\"//tieba.baidu.com/f?kw=%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&ie=utf-8&pn=350\" class=\" pagination-item \" >8</a>\n<a href=\"//tieba.baidu.com/f?kw=%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&ie=utf-8&pn=400\" class=\" pagination-item \" >9</a>\n<a href=\"//tieba.baidu.com/f?kw=%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&ie=utf-8&pn=450\" class=\" pagination-item \" >10</a>\n<a href=\"//tieba.baidu.com/f?kw=%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&ie=utf-8&pn=50\" class=\"next pagination-item \" >下一页&gt;</a>\n<a href=\"//tieba.baidu.com/f?kw=%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&ie=utf-8&pn=673050\" class=\"last pagination-item \" >尾页</a>\n</div>    <div class=\"th_footer_bright\">\n        <div class=\"th_footer_l\">\n                            共有主题数<span class=\"red_text\">673070</span>个，贴子数\n                <span class=\"red_text\">101877845</span>篇\n                <a rel=\"noopener\"  class=\"fans_name\" href=\"/bawu2/platform/listMemberInfo?word=%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0&ie=utf-8\"\n                   target=\"_blank\">盗墓党</a>数<span\n                    class=\"red_text\">4626568</span>\n                    </div>\n    </div>\n</div>\n--></code><script>Bigpipe.register(\"frs-list/pagelet/thread_list\", {\"parent\":\"frs-list\\/pagelet\\/thread\",\"scripts\":[\"\\/tb\\/_\\/verify_manager_phone_cba5a4d.js\",\"\\/tb\\/_\\/detect_manager_block_3e52a76.js\",\"\\/tb\\/_\\/block_user_beee318.js\",\"\\/tb\\/_\\/util_top_cookie_b437d61.js\",\"\\/tb\\/_\\/music_player_5f6a3b2.js\",\"\\/tb\\/_\\/util_picture_slide_9a62a0d.js\",\"\\/tb\\/_\\/util_media_init_de70972.js\",\"\\/tb\\/_\\/util_favorite_3dd4905.js\",\"\\/tb\\/_\\/util_picture_rotation_2d0e178.js\",\"\\/tb\\/_\\/login_dialog_8cc35e4.js\",\"\\/tb\\/_\\/util_image_process_cf06fb9.js\",\"\\/tb\\/_\\/util_media_controller_51c5a6c.js\",\"\\/tb\\/_\\/util_https_stat_ce68d9f.js\",\"\\/tb\\/_\\/scroll_event_a9a7916.js\",\"\\/tb\\/_\\/game_code_thread_7141b4c.js\",\"\\/tb\\/_\\/game_thread_90bad35.js\",\"\\/tb\\/_\\/card_d6007e6.js\",\"\\/tb\\/_\\/single_icons_9d843f9.js\",\"\\/tb\\/_\\/poster\\/acs_sdk_2c411c0.js\",\"\\/tb\\/_\\/umoney_query_e6ef23a.js\",\"\\/tb\\/_\\/global_switch_6dfeb89.js\",\"\\/tb\\/_\\/user_api_10e048c.js\",\"\\/tb\\/_\\/icons_983b4c0.js\",\"\\/tb\\/_\\/base_user_data_ff57bd7.js\",\"\\/tb\\/_\\/base_dialog_user_bar_6dc620e.js\",\"\\/tb\\/_\\/qianbao_cashier_dialog_aa111c7.js\",\"\\/tb\\/_\\/qianbao_purchase_tdou_f4c69c0.js\",\"\\/tb\\/_\\/tdou_open_type_a72e1ed.js\",\"\\/tb\\/_\\/tdou_template_8d6b3f6.js\",\"\\/tb\\/_\\/tdou_builder_05260c9.js\",\"\\/tb\\/_\\/tdou_view_util_d282db0.js\",\"\\/tb\\/_\\/rsa_safe_ffe2fa7.js\",\"\\/tb\\/_\\/paykey_safe_payment_f7a973d.js\",\"\\/tb\\/_\\/captcha_d99d16f.js\",\"\\/tb\\/_\\/captcha_dialog_ceaacd2.js\",\"\\/tb\\/_\\/captcha_safe_payment_7f700b4.js\",\"\\/tb\\/_\\/mobile_safe_payment_b2a273c.js\",\"\\/tb\\/_\\/tbean_safe_3668241.js\",\"\\/tb\\/_\\/tbean_safe_ajax_5dbae2e.js\",\"\\/tb\\/_\\/tdou_data_747c462.js\",\"\\/tb\\/_\\/tdou_view_check_f11908d.js\",\"\\/tb\\/_\\/tdou_counter_cbe5c8a.js\",\"\\/tb\\/_\\/tdou_view_fec0b7b.js\",\"\\/tb\\/_\\/qianbao_purchase_member_fad1d66.js\",\"\\/tb\\/_\\/messenger_e5c0696.js\",\"\\/tb\\/_\\/cashier_dialog_d52cf7c.js\",\"\\/tb\\/_\\/pay_member_c57f92d.js\",\"\\/tb\\/_\\/umoney_1379f71.js\",\"\\/tb\\/_\\/tdou_view_operation_bootstrap_4a983b5.js\",\"\\/tb\\/_\\/tdou_view_cashier_6afe462.js\",\"\\/tb\\/_\\/tdou_view_auto_redirect_a353d12.js\",\"\\/tb\\/_\\/tdou_view_pay_46c8c05.js\",\"\\/tb\\/_\\/post_marry_ae86f06.js\",\"\\/tb\\/_\\/interaction_66aaf64.js\",\"\\/tb\\/_\\/member_api_c29c369.js\",\"\\/tb\\/_\\/month_icon_63870d4.js\",\"\\/tb\\/_\\/user_head_aa4a317.js\",\"\\/tb\\/_\\/user_visit_card_4890923.js\",\"\\/tb\\/_\\/util_pop_video_4786ff2.js\",\"\\/tb\\/_\\/audio_player_0e5ab66.js\",\"\\/tb\\/_\\/voice_9f54341.js\",\"\\/tb\\/_\\/thread_list_14af12b.js\",\"\\/tb\\/_\\/member_api_c29c369.js\",\"\\/tb\\/_\\/user_api_10e048c.js\",\"\\/tb\\/_\\/icons_983b4c0.js\",\"\\/tb\\/_\\/login_dialog_8cc35e4.js\",\"\\/tb\\/_\\/messenger_e5c0696.js\",\"\\/tb\\/_\\/loader_334189d.js\",\"\\/tb\\/_\\/tpl_ext_c01a6ba.js\",\"\\/tb\\/_\\/util_pager_36afd93.js\"],\"styles\":[\"\\/tb\\/_\\/verify_manager_phone_7d1435e.css\",\"\\/tb\\/_\\/block_user_1e8ac98.css\",\"\\/tb\\/_\\/music_player_0a327b2.css\",\"\\/tb\\/_\\/login_dialog_8bacf9a.css\",\"\\/tb\\/_\\/game_code_thread_c9a2228.css\",\"\\/tb\\/_\\/game_thread_d41d8cd.css\",\"\\/tb\\/_\\/card_1f33a7b.css\",\"\\/tb\\/_\\/single_icons_3112de2.css\",\"\\/tb\\/_\\/umoney_query_d15a716.css\",\"\\/tb\\/_\\/icons_fba8214.css\",\"\\/tb\\/_\\/base_user_data_f665ab7.css\",\"\\/tb\\/_\\/base_dialog_user_bar_69fdf18.css\",\"\\/tb\\/_\\/qianbao_cashier_dialog_179e56e.css\",\"\\/tb\\/_\\/qianbao_purchase_tdou_4b31f54.css\",\"\\/tb\\/_\\/tdou_template_781e4d0.css\",\"\\/tb\\/_\\/paykey_safe_payment_8f2a8db.css\",\"\\/tb\\/_\\/captcha_30e4d3c.css\",\"\\/tb\\/_\\/captcha_safe_payment_d41d8cd.css\",\"\\/tb\\/_\\/mobile_safe_payment_77949bb.css\",\"\\/tb\\/_\\/tbean_safe_3c779a3.css\",\"\\/tb\\/_\\/tbean_safe_ajax_d41d8cd.css\",\"\\/tb\\/_\\/qianbao_purchase_member_264deea.css\",\"\\/tb\\/_\\/cashier_dialog_0d74ed0.css\",\"\\/tb\\/_\\/pay_member_d41d8cd.css\",\"\\/tb\\/_\\/umoney_f12b09a.css\",\"\\/tb\\/_\\/post_marry_48de144.css\",\"\\/tb\\/_\\/interaction_d4668aa.css\",\"\\/tb\\/_\\/month_icon_240ecc1.css\",\"\\/tb\\/_\\/user_head_35f26e0.css\",\"\\/tb\\/_\\/user_visit_card_7cd5f66.css\",\"\\/tb\\/_\\/util_pop_video_5116377.css\",\"\\/tb\\/_\\/voice_c5bf26e.css\",\"\\/tb\\/_\\/thread_list_c0719c0.css\",\"\\/tb\\/_\\/thread_item_67afca3.css\",\"\\/tb\\/_\\/thread_item_title_88b0c21.css\",\"\\/tb\\/_\\/frs_user_base_e6ee6b4.css\",\"\\/tb\\/_\\/util_pager_fd327a7.css\",\"\\/tb\\/_\\/thread_list_footer_99af8d2.css\"]}).then(function(pagelet){    window.radar && window.radar.mark('fs');\n    // TODO 多次加载白名单，需要优化\n    _.Module.use('adsense-base/widget/loader', [{\n        'whiteList':[[\"http:\\/\\/fedev.baidu.com\"],[\"http:\\/\\/jiaoyu.baidu.com\"],[\"http:\\/\\/caifu.baidu.com\"],[\"http:\\/\\/jiankang.baidu.com\"],[\"http:\\/\\/tieba.dre8.com\"],[\"http:\\/\\/tdsp.nuomi.com\"],[\"http:\\/\\/baiju.baidu.com\"],[\"http:\\/\\/temai.baidu.com\"],[\"http:\\/\\/tieba.baidu.com\"],[\"http:\\/\\/zt.chuanke.com\"],[\"http:\\/\\/window.sturgeon.mopaas.com\"],[\"http:\\/\\/api.union.vip.com\"],[\"http:\\/\\/api.dongqiudi.com\"],[\"http:\\/\\/www.chuanke.com\"],[\"http:\\/\\/dcp.kuaizitech.com\\/\"]],\n        'adValue':\"\"    }]);\n    _.Module.use('adsense-base/widget/tpl_ext', [{\n        'type': 'POST',\n    }]);\n    // TODO 多次加载白名单，需要优化\n    _.Module.use('adsense-base/widget/loader', [{\n        'whiteList':[[\"http:\\/\\/fedev.baidu.com\"],[\"http:\\/\\/jiaoyu.baidu.com\"],[\"http:\\/\\/caifu.baidu.com\"],[\"http:\\/\\/jiankang.baidu.com\"],[\"http:\\/\\/tieba.dre8.com\"],[\"http:\\/\\/tdsp.nuomi.com\"],[\"http:\\/\\/baiju.baidu.com\"],[\"http:\\/\\/temai.baidu.com\"],[\"http:\\/\\/tieba.baidu.com\"],[\"http:\\/\\/zt.chuanke.com\"],[\"http:\\/\\/window.sturgeon.mopaas.com\"],[\"http:\\/\\/api.union.vip.com\"],[\"http:\\/\\/api.dongqiudi.com\"],[\"http:\\/\\/www.chuanke.com\"],[\"http:\\/\\/dcp.kuaizitech.com\\/\"]],\n        'adValue':\"\"    }]);\n    _.Module.use('frs-list/widget/util_pager', [pagelet, true]);\n    _.Module.use('frs-list/pagelet/thread_list', [], function(instance) {\n        instance.init({\n            pagelet: pagelet,\n            ifCheck: null,\n            videoAutoPlay: true,\n            is_zone_forum: 0,\n            is_frs_mask: 0,\n            delReason: [],\n            perm: [],\n            user_base: {\"is_login\":false,\"user_id\":0,\"user_name\":\"\",\"no_un\":false,\"mobile\":\"\",\"email\":\"\",\"ipv6\":\"\",\"is_new_user\":1,\"portrait\":\"00000000\",\"start_time\":1723088812,\"frs_login_switch\":false,\"interaction_switch\":false,\"login_day\":5,\"creator_perm\":0,\"is_videocreator\":false,\"pop_up_info\":null,\"is_business_account\":0,\"is_uc_account\":0,\"login_popup_phone_switch\":0,\"no_login_user_browse_switch\":0},\n            mediago_info: {\"first_floor\":3,\"density\":6},\n            flow_type: \"fake\",\n            forum_name: \"\\u76d7\\u5893\\u7b14\\u8bb0\",\n            user_ip: 799626353,\n            thread_count: 48,\n            user_name: \"\",\n            user_sex: null,\n            user_uid: 0,\n            first_dir: \"\\u6587\\u5b66\",\n            second_dir: \"\\u5947\\u5e7b\\u00b7\\u7384\\u5e7b\\u5c0f\\u8bf4\",\n            fc_ad_number: 0,\n            is_adsense_fc: true        })\n    });\n    function hideWhiteList() {\n        // 白名单帖子，白名单中周围不能出现广告\n        // #thread_list>.j_thread_list 置顶的帖子内部也存在同样类名\n        var whiteList = [\"8167885963\",\"8167878399\",\"8167885065\",\"8167952598\",\"8167970598\",\"8167971732\",\"8167973095\",\"8167974152\",\"8167975287\",\"8167994005\",\"8167999398\"] || [];\n        $(\"#thread_list>.j_thread_list\").each(function() {\n            if (whiteList.indexOf($(this).attr('data-tid')) !== -1) {\n                var targetPrev = $(this).prev();\n                var targetNext = $(this).next();\n                // 广告上不会有帖子tid属性，\n                if (!$(targetPrev).attr('data-tid')) {\n                    // 如果帖子在1楼 置顶🔝的帖子没有data-tid\n                    if ($(this).attr('data-floor') !== '1') {\n                        $(targetPrev).css('display', 'none');\n                    }\n                }\n                if (!$(targetNext).attr('data-tid')) {\n                    // 广告插件那里设置有的这个类fengchao-wrap-feed 用于检测广告插件是否存在\n                    // 所以如果出现这个类不是真的广告\n                    // 见 src/widget/fengchao_ad/fengchao_ad.js\n                    if ($(targetNext).attr('class') === 'fengchao-wrap-feed') {\n                        $(targetNext).next().css('display', 'none');\n                    } else {\n                        $(targetNext).css('display', 'none');\n                    }\n                }\n            }\n        })\n    }\n    hideWhiteList();\n});</script><code class=\"pagelet_html\" id=\"pagelet_html_live/pagelet/live_thread\" style=\"display:none;\"><!----></code><script>Bigpipe.register(\"live/pagelet/live_thread\", {\"parent\":\"live\\/pagelet\\/live\",\"scripts\":[],\"styles\":[]}).then(function(pagelet){});</script><script>Bigpipe.end();</script></body></html>"
  },
  {
    "path": "media_platform/weibo/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/weibo/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2023/12/23 15:40\n# @Desc    :\nfrom .client import WeiboClient\nfrom .core import WeiboCrawler\nfrom .login import WeiboLogin\n"
  },
  {
    "path": "media_platform/weibo/client.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/weibo/client.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2023/12/23 15:40\n# @Desc    : Weibo crawler API request client\n\nimport asyncio\nimport copy\nimport json\nimport re\nfrom typing import TYPE_CHECKING, Callable, Dict, List, Optional, Union\nfrom urllib.parse import parse_qs, unquote, urlencode\n\nimport httpx\nfrom httpx import Response\nfrom playwright.async_api import BrowserContext, Page\nfrom tools.httpx_util import make_async_client\nfrom tenacity import retry, stop_after_attempt, wait_fixed\n\nimport config\nfrom proxy.proxy_mixin import ProxyRefreshMixin\nfrom tools import utils\n\nif TYPE_CHECKING:\n    from proxy.proxy_ip_pool import ProxyIpPool\n\nfrom .exception import DataFetchError\nfrom .field import SearchType\n\n\nclass WeiboClient(ProxyRefreshMixin):\n\n    def __init__(\n        self,\n        timeout=60,  # If media crawling is enabled, Weibo images need a longer timeout\n        proxy=None,\n        *,\n        headers: Dict[str, str],\n        playwright_page: Page,\n        cookie_dict: Dict[str, str],\n        proxy_ip_pool: Optional[\"ProxyIpPool\"] = None,\n    ):\n        self.proxy = proxy\n        self.timeout = timeout\n        self.headers = headers\n        self._host = \"https://m.weibo.cn\"\n        self.playwright_page = playwright_page\n        self.cookie_dict = cookie_dict\n        self._image_agent_host = \"https://i1.wp.com/\"\n        # Initialize proxy pool (from ProxyRefreshMixin)\n        self.init_proxy_pool(proxy_ip_pool)\n\n    @retry(stop=stop_after_attempt(5), wait=wait_fixed(3))\n    async def request(self, method, url, **kwargs) -> Union[Response, Dict]:\n        # Check if proxy is expired before each request\n        await self._refresh_proxy_if_expired()\n\n        enable_return_response = kwargs.pop(\"return_response\", False)\n        async with make_async_client(proxy=self.proxy) as client:\n            response = await client.request(method, url, timeout=self.timeout, **kwargs)\n\n        if enable_return_response:\n            return response\n\n        try:\n            data: Dict = response.json()\n        except json.decoder.JSONDecodeError:\n            # issue: #771 Search API returns error 432, retry multiple times + update h5 cookies\n            utils.logger.error(f\"[WeiboClient.request] request {method}:{url} err code: {response.status_code} res:{response.text}\")\n            await self.playwright_page.goto(self._host)\n            await asyncio.sleep(2)\n            await self.update_cookies(browser_context=self.playwright_page.context)\n            raise DataFetchError(f\"get response code error: {response.status_code}\")\n\n        ok_code = data.get(\"ok\")\n        if ok_code == 0:  # response error\n            utils.logger.error(f\"[WeiboClient.request] request {method}:{url} err, res:{data}\")\n            raise DataFetchError(data.get(\"msg\", \"response error\"))\n        elif ok_code != 1:  # unknown error\n            utils.logger.error(f\"[WeiboClient.request] request {method}:{url} err, res:{data}\")\n            raise DataFetchError(data.get(\"msg\", \"unknown error\"))\n        else:  # response right\n            return data.get(\"data\", {})\n\n    async def get(self, uri: str, params=None, headers=None, **kwargs) -> Union[Response, Dict]:\n        final_uri = uri\n        if isinstance(params, dict):\n            final_uri = (f\"{uri}?\"\n                         f\"{urlencode(params)}\")\n\n        if headers is None:\n            headers = self.headers\n        return await self.request(method=\"GET\", url=f\"{self._host}{final_uri}\", headers=headers, **kwargs)\n\n    async def post(self, uri: str, data: dict) -> Dict:\n        json_str = json.dumps(data, separators=(',', ':'), ensure_ascii=False)\n        return await self.request(method=\"POST\", url=f\"{self._host}{uri}\", data=json_str, headers=self.headers)\n\n    async def pong(self) -> bool:\n        \"\"\"get a note to check if login state is ok\"\"\"\n        utils.logger.info(\"[WeiboClient.pong] Begin pong weibo...\")\n        ping_flag = False\n        try:\n            uri = \"/api/config\"\n            resp_data: Dict = await self.request(method=\"GET\", url=f\"{self._host}{uri}\", headers=self.headers)\n            if resp_data.get(\"login\"):\n                ping_flag = True\n            else:\n                utils.logger.error(f\"[WeiboClient.pong] cookie may be invalid and again login...\")\n        except Exception as e:\n            utils.logger.error(f\"[WeiboClient.pong] Pong weibo failed: {e}, and try to login again...\")\n            ping_flag = False\n        return ping_flag\n\n    async def update_cookies(self, browser_context: BrowserContext, urls: Optional[List[str]] = None):\n        \"\"\"\n        Update cookies from browser context\n        :param browser_context: Browser context\n        :param urls: Optional list of URLs to filter cookies (e.g., [\"https://m.weibo.cn\"])\n                     If provided, only cookies for these URLs will be retrieved\n        \"\"\"\n        if urls:\n            cookies = await browser_context.cookies(urls=urls)\n            utils.logger.info(f\"[WeiboClient.update_cookies] Updating cookies for specific URLs: {urls}\")\n        else:\n            cookies = await browser_context.cookies()\n            utils.logger.info(\"[WeiboClient.update_cookies] Updating all cookies\")\n\n        cookie_str, cookie_dict = utils.convert_cookies(cookies)\n        self.headers[\"Cookie\"] = cookie_str\n        self.cookie_dict = cookie_dict\n        utils.logger.info(f\"[WeiboClient.update_cookies] Cookie updated successfully, total: {len(cookie_dict)} cookies\")\n\n    async def get_note_by_keyword(\n        self,\n        keyword: str,\n        page: int = 1,\n        search_type: SearchType = SearchType.DEFAULT,\n    ) -> Dict:\n        \"\"\"\n        search note by keyword\n        :param keyword: Search keyword for Weibo\n        :param page: Pagination parameter - current page number\n        :param search_type: Search type, see SearchType enum in weibo/field.py\n        :return:\n        \"\"\"\n        uri = \"/api/container/getIndex\"\n        containerid = f\"100103type={search_type.value}&q={keyword}\"\n        params = {\n            \"containerid\": containerid,\n            \"page_type\": \"searchall\",\n            \"page\": page,\n        }\n        return await self.get(uri, params)\n\n    async def get_note_comments(self, mid_id: str, max_id: int, max_id_type: int = 0) -> Dict:\n        \"\"\"get notes comments\n        :param mid_id: Weibo ID\n        :param max_id: Pagination parameter ID\n        :param max_id_type: Pagination parameter ID type\n        :return:\n        \"\"\"\n        uri = \"/comments/hotflow\"\n        params = {\n            \"id\": mid_id,\n            \"mid\": mid_id,\n            \"max_id_type\": max_id_type,\n        }\n        if max_id > 0:\n            params.update({\"max_id\": max_id})\n        referer_url = f\"https://m.weibo.cn/detail/{mid_id}\"\n        headers = copy.copy(self.headers)\n        headers[\"Referer\"] = referer_url\n\n        return await self.get(uri, params, headers=headers)\n\n    async def get_note_all_comments(\n        self,\n        note_id: str,\n        crawl_interval: float = 1.0,\n        callback: Optional[Callable] = None,\n        max_count: int = 10,\n    ):\n        \"\"\"\n        get note all comments include sub comments\n        :param note_id:\n        :param crawl_interval:\n        :param callback:\n        :param max_count:\n        :return:\n        \"\"\"\n        result = []\n        is_end = False\n        max_id = -1\n        max_id_type = 0\n        while not is_end and len(result) < max_count:\n            comments_res = await self.get_note_comments(note_id, max_id, max_id_type)\n            max_id: int = comments_res.get(\"max_id\")\n            max_id_type: int = comments_res.get(\"max_id_type\")\n            comment_list: List[Dict] = comments_res.get(\"data\", [])\n            is_end = max_id == 0\n            if len(result) + len(comment_list) > max_count:\n                comment_list = comment_list[:max_count - len(result)]\n            if callback:  # If callback function exists, execute it\n                await callback(note_id, comment_list)\n            await asyncio.sleep(crawl_interval)\n            result.extend(comment_list)\n            sub_comment_result = await self.get_comments_all_sub_comments(note_id, comment_list, callback)\n            result.extend(sub_comment_result)\n        return result\n\n    @staticmethod\n    async def get_comments_all_sub_comments(\n        note_id: str,\n        comment_list: List[Dict],\n        callback: Optional[Callable] = None,\n    ) -> List[Dict]:\n        \"\"\"\n        Get all sub-comments of comments\n        Args:\n            note_id:\n            comment_list:\n            callback:\n\n        Returns:\n\n        \"\"\"\n        if not config.ENABLE_GET_SUB_COMMENTS:\n            utils.logger.info(f\"[WeiboClient.get_comments_all_sub_comments] Crawling sub_comment mode is not enabled\")\n            return []\n\n        res_sub_comments = []\n        for comment in comment_list:\n            sub_comments = comment.get(\"comments\")\n            if sub_comments and isinstance(sub_comments, list):\n                await callback(note_id, sub_comments)\n                res_sub_comments.extend(sub_comments)\n        return res_sub_comments\n\n    async def get_note_info_by_id(self, note_id: str) -> Dict:\n        \"\"\"\n        Get note details by note ID\n        :param note_id:\n        :return:\n        \"\"\"\n        url = f\"{self._host}/detail/{note_id}\"\n        async with make_async_client(proxy=self.proxy) as client:\n            response = await client.request(\"GET\", url, timeout=self.timeout, headers=self.headers)\n            if response.status_code != 200:\n                raise DataFetchError(f\"get weibo detail err: {response.text}\")\n            match = re.search(r'var \\$render_data = (\\[.*?\\])\\[0\\]', response.text, re.DOTALL)\n            if match:\n                render_data_json = match.group(1)\n                render_data_dict = json.loads(render_data_json)\n                note_detail = render_data_dict[0].get(\"status\")\n                note_item = {\"mblog\": note_detail}\n                return note_item\n            else:\n                utils.logger.info(f\"[WeiboClient.get_note_info_by_id] $render_data value not found\")\n                return dict()\n\n    async def get_note_image(self, image_url: str) -> bytes:\n        image_url = image_url[8:]  # Remove https://\n        sub_url = image_url.split(\"/\")\n        image_url = \"\"\n        for i in range(len(sub_url)):\n            if i == 1:\n                image_url += \"large/\"  # Get high-resolution images\n            elif i == len(sub_url) - 1:\n                image_url += sub_url[i]\n            else:\n                image_url += sub_url[i] + \"/\"\n        # Weibo image hosting has anti-hotlinking, so proxy access is needed\n        # Since Weibo images are accessed through i1.wp.com, we need to concatenate the URL\n        final_uri = (f\"{self._image_agent_host}\"\n                     f\"{image_url}\")\n        async with make_async_client(proxy=self.proxy) as client:\n            try:\n                response = await client.request(\"GET\", final_uri, timeout=self.timeout)\n                response.raise_for_status()\n                if not response.reason_phrase == \"OK\":\n                    utils.logger.error(f\"[WeiboClient.get_note_image] request {final_uri} err, res:{response.text}\")\n                    return None\n                else:\n                    return response.content\n            except httpx.HTTPError as exc:  # some wrong when call httpx.request method, such as connection error, client error, server error or response status code is not 2xx\n                utils.logger.error(f\"[DouYinClient.get_aweme_media] {exc.__class__.__name__} for {exc.request.url} - {exc}\")    # Keep original exception type name for developer debugging\n                return None\n\n    async def get_creator_container_info(self, creator_id: str) -> Dict:\n        \"\"\"\n        Get user's container ID, container information represents the real API request path\n            fid_container_id: Container ID for user's Weibo detail API\n            lfid_container_id: Container ID for user's Weibo list API\n        Args:\n            creator_id: User ID\n\n        Returns: Dictionary with container IDs\n\n        \"\"\"\n        response = await self.get(f\"/u/{creator_id}\", return_response=True)\n        m_weibocn_params = response.cookies.get(\"M_WEIBOCN_PARAMS\")\n        if not m_weibocn_params:\n            raise DataFetchError(\"get containerid failed\")\n        m_weibocn_params_dict = parse_qs(unquote(m_weibocn_params))\n        return {\"fid_container_id\": m_weibocn_params_dict.get(\"fid\", [\"\"])[0], \"lfid_container_id\": m_weibocn_params_dict.get(\"lfid\", [\"\"])[0]}\n\n    async def get_creator_info_by_id(self, creator_id: str) -> Dict:\n        \"\"\"\n        Get user details by user ID\n        Args:\n            creator_id:\n\n        Returns:\n\n        \"\"\"\n        uri = \"/api/container/getIndex\"\n        containerid = f\"100505{creator_id}\"\n        params = {\n            \"jumpfrom\": \"weibocom\",\n            \"type\": \"uid\",\n            \"value\": creator_id,\n            \"containerid\":containerid,\n        }\n        user_res = await self.get(uri, params)\n        return user_res\n\n    async def get_notes_by_creator(\n        self,\n        creator: str,\n        container_id: str,\n        since_id: str = \"0\",\n    ) -> Dict:\n        \"\"\"\n        Get creator's notes\n        Args:\n            creator: Creator ID\n            container_id: Container ID\n            since_id: ID of the last note from previous page\n        Returns:\n\n        \"\"\"\n\n        uri = \"/api/container/getIndex\"\n        params = {\n            \"jumpfrom\": \"weibocom\",\n            \"type\": \"uid\",\n            \"value\": creator,\n            \"containerid\": container_id,\n            \"since_id\": since_id,\n        }\n        return await self.get(uri, params)\n\n    async def get_all_notes_by_creator_id(\n        self,\n        creator_id: str,\n        container_id: str,\n        crawl_interval: float = 1.0,\n        callback: Optional[Callable] = None,\n    ) -> List[Dict]:\n        \"\"\"\n        Get all posts published by a specified user, this method will continuously fetch all posts from a user\n        Args:\n            creator_id: Creator user ID\n            container_id: Container ID for the user\n            crawl_interval: Interval between requests in seconds\n            callback: Optional callback function to process notes\n\n        Returns: List of all notes\n\n        \"\"\"\n        result = []\n        notes_has_more = True\n        since_id = \"\"\n        crawler_total_count = 0\n        while notes_has_more:\n            notes_res = await self.get_notes_by_creator(creator_id, container_id, since_id)\n            if not notes_res:\n                utils.logger.error(f\"[WeiboClient.get_notes_by_creator] The current creator may have been banned by Weibo, so they cannot access the data.\")\n                break\n            since_id = notes_res.get(\"cardlistInfo\", {}).get(\"since_id\", \"0\")\n            if \"cards\" not in notes_res:\n                utils.logger.info(f\"[WeiboClient.get_all_notes_by_creator] No 'notes' key found in response: {notes_res}\")\n                break\n\n            notes = notes_res[\"cards\"]\n            utils.logger.info(f\"[WeiboClient.get_all_notes_by_creator] got user_id:{creator_id} notes len : {len(notes)}\")\n            notes = [note for note in notes if note.get(\"card_type\") == 9]\n            if callback:\n                await callback(notes)\n            await asyncio.sleep(crawl_interval)\n            result.extend(notes)\n            crawler_total_count += 10\n            notes_has_more = notes_res.get(\"cardlistInfo\", {}).get(\"total\", 0) > crawler_total_count\n        return result\n"
  },
  {
    "path": "media_platform/weibo/core.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/weibo/core.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2023/12/23 15:41\n# @Desc    : Weibo crawler main workflow code\n\nimport asyncio\nimport os\n# import random  # Removed as we now use fixed config.CRAWLER_MAX_SLEEP_SEC intervals\nfrom asyncio import Task\nfrom typing import Dict, List, Optional, Tuple\n\nfrom playwright.async_api import (\n    BrowserContext,\n    BrowserType,\n    Page,\n    Playwright,\n    async_playwright,\n)\n\nimport config\nfrom base.base_crawler import AbstractCrawler\nfrom proxy.proxy_ip_pool import IpInfoModel, create_ip_pool\nfrom store import weibo as weibo_store\nfrom tools import utils\nfrom tools.cdp_browser import CDPBrowserManager\nfrom var import crawler_type_var, source_keyword_var\n\nfrom .client import WeiboClient\nfrom .exception import DataFetchError\nfrom .field import SearchType\nfrom .help import filter_search_result_card\nfrom .login import WeiboLogin\n\n\nclass WeiboCrawler(AbstractCrawler):\n    context_page: Page\n    wb_client: WeiboClient\n    browser_context: BrowserContext\n    cdp_manager: Optional[CDPBrowserManager]\n\n    def __init__(self):\n        self.index_url = \"https://www.weibo.com\"\n        self.mobile_index_url = \"https://m.weibo.cn\"\n        self.user_agent = utils.get_user_agent()\n        self.mobile_user_agent = utils.get_mobile_user_agent()\n        self.cdp_manager = None\n        self.ip_proxy_pool = None  # Proxy IP pool for automatic proxy refresh\n\n    async def start(self):\n        playwright_proxy_format, httpx_proxy_format = None, None\n        if config.ENABLE_IP_PROXY:\n            self.ip_proxy_pool = await create_ip_pool(config.IP_PROXY_POOL_COUNT, enable_validate_ip=True)\n            ip_proxy_info: IpInfoModel = await self.ip_proxy_pool.get_proxy()\n            playwright_proxy_format, httpx_proxy_format = utils.format_proxy_info(ip_proxy_info)\n\n        async with async_playwright() as playwright:\n            # Select launch mode based on configuration\n            if config.ENABLE_CDP_MODE:\n                utils.logger.info(\"[WeiboCrawler] Launching browser with CDP mode\")\n                self.browser_context = await self.launch_browser_with_cdp(\n                    playwright,\n                    playwright_proxy_format,\n                    self.mobile_user_agent,\n                    headless=config.CDP_HEADLESS,\n                )\n            else:\n                utils.logger.info(\"[WeiboCrawler] Launching browser with standard mode\")\n                # Launch a browser context.\n                chromium = playwright.chromium\n                self.browser_context = await self.launch_browser(chromium, None, self.mobile_user_agent, headless=config.HEADLESS)\n\n                # stealth.min.js is a js script to prevent the website from detecting the crawler.\n                await self.browser_context.add_init_script(path=\"libs/stealth.min.js\")\n\n\n            self.context_page = await self.browser_context.new_page()\n            await self.context_page.goto(self.index_url)\n            await asyncio.sleep(2)\n\n\n            # Create a client to interact with the xiaohongshu website.\n            self.wb_client = await self.create_weibo_client(httpx_proxy_format)\n            if not await self.wb_client.pong():\n                login_obj = WeiboLogin(\n                    login_type=config.LOGIN_TYPE,\n                    login_phone=\"\",  # your phone number\n                    browser_context=self.browser_context,\n                    context_page=self.context_page,\n                    cookie_str=config.COOKIES,\n                )\n                await login_obj.begin()\n\n                # After successful login, redirect to mobile website and update mobile cookies\n                utils.logger.info(\"[WeiboCrawler.start] redirect weibo mobile homepage and update cookies on mobile platform\")\n                await self.context_page.goto(self.mobile_index_url)\n                await asyncio.sleep(3)\n                # Only get mobile cookies to avoid confusion between PC and mobile cookies\n                await self.wb_client.update_cookies(\n                    browser_context=self.browser_context,\n                    urls=[self.mobile_index_url]\n                )\n\n            crawler_type_var.set(config.CRAWLER_TYPE)\n            if config.CRAWLER_TYPE == \"search\":\n                # Search for video and retrieve their comment information.\n                await self.search()\n            elif config.CRAWLER_TYPE == \"detail\":\n                # Get the information and comments of the specified post\n                await self.get_specified_notes()\n            elif config.CRAWLER_TYPE == \"creator\":\n                # Get creator's information and their notes and comments\n                await self.get_creators_and_notes()\n            else:\n                pass\n            utils.logger.info(\"[WeiboCrawler.start] Weibo Crawler finished ...\")\n\n    async def search(self):\n        \"\"\"\n        search weibo note with keywords\n        :return:\n        \"\"\"\n        utils.logger.info(\"[WeiboCrawler.search] Begin search weibo keywords\")\n        weibo_limit_count = 10  # weibo limit page fixed value\n        if config.CRAWLER_MAX_NOTES_COUNT < weibo_limit_count:\n            config.CRAWLER_MAX_NOTES_COUNT = weibo_limit_count\n        start_page = config.START_PAGE\n\n        # Set the search type based on the configuration for weibo\n        if config.WEIBO_SEARCH_TYPE == \"default\":\n            search_type = SearchType.DEFAULT\n        elif config.WEIBO_SEARCH_TYPE == \"real_time\":\n            search_type = SearchType.REAL_TIME\n        elif config.WEIBO_SEARCH_TYPE == \"popular\":\n            search_type = SearchType.POPULAR\n        elif config.WEIBO_SEARCH_TYPE == \"video\":\n            search_type = SearchType.VIDEO\n        else:\n            utils.logger.error(f\"[WeiboCrawler.search] Invalid WEIBO_SEARCH_TYPE: {config.WEIBO_SEARCH_TYPE}\")\n            return\n\n        for keyword in config.KEYWORDS.split(\",\"):\n            source_keyword_var.set(keyword)\n            utils.logger.info(f\"[WeiboCrawler.search] Current search keyword: {keyword}\")\n            page = 1\n            while (page - start_page + 1) * weibo_limit_count <= config.CRAWLER_MAX_NOTES_COUNT:\n                if page < start_page:\n                    utils.logger.info(f\"[WeiboCrawler.search] Skip page: {page}\")\n                    page += 1\n                    continue\n                utils.logger.info(f\"[WeiboCrawler.search] search weibo keyword: {keyword}, page: {page}\")\n                search_res = await self.wb_client.get_note_by_keyword(keyword=keyword, page=page, search_type=search_type)\n                note_id_list: List[str] = []\n                note_list = filter_search_result_card(search_res.get(\"cards\"))\n                # If full text fetching is enabled, batch get full text of posts\n                note_list = await self.batch_get_notes_full_text(note_list)\n                for note_item in note_list:\n                    if note_item:\n                        mblog: Dict = note_item.get(\"mblog\")\n                        if mblog:\n                            note_id_list.append(mblog.get(\"id\"))\n                            await weibo_store.update_weibo_note(note_item)\n                            await self.get_note_images(mblog)\n\n                page += 1\n\n                # Sleep after page navigation\n                await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n                utils.logger.info(f\"[WeiboCrawler.search] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds after page {page-1}\")\n\n                await self.batch_get_notes_comments(note_id_list)\n\n    async def get_specified_notes(self):\n        \"\"\"\n        get specified notes info\n        :return:\n        \"\"\"\n        semaphore = asyncio.Semaphore(config.MAX_CONCURRENCY_NUM)\n        task_list = [self.get_note_info_task(note_id=note_id, semaphore=semaphore) for note_id in config.WEIBO_SPECIFIED_ID_LIST]\n        video_details = await asyncio.gather(*task_list)\n        for note_item in video_details:\n            if note_item:\n                await weibo_store.update_weibo_note(note_item)\n        await self.batch_get_notes_comments(config.WEIBO_SPECIFIED_ID_LIST)\n\n    async def get_note_info_task(self, note_id: str, semaphore: asyncio.Semaphore) -> Optional[Dict]:\n        \"\"\"\n        Get note detail task\n        :param note_id:\n        :param semaphore:\n        :return:\n        \"\"\"\n        async with semaphore:\n            try:\n                result = await self.wb_client.get_note_info_by_id(note_id)\n\n                # Sleep after fetching note details\n                await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n                utils.logger.info(f\"[WeiboCrawler.get_note_info_task] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds after fetching note details {note_id}\")\n\n                return result\n            except DataFetchError as ex:\n                utils.logger.error(f\"[WeiboCrawler.get_note_info_task] Get note detail error: {ex}\")\n                return None\n            except KeyError as ex:\n                utils.logger.error(f\"[WeiboCrawler.get_note_info_task] have not fund note detail note_id:{note_id}, err: {ex}\")\n                return None\n\n    async def batch_get_notes_comments(self, note_id_list: List[str]):\n        \"\"\"\n        batch get notes comments\n        :param note_id_list:\n        :return:\n        \"\"\"\n        if not config.ENABLE_GET_COMMENTS:\n            utils.logger.info(f\"[WeiboCrawler.batch_get_note_comments] Crawling comment mode is not enabled\")\n            return\n\n        utils.logger.info(f\"[WeiboCrawler.batch_get_notes_comments] note ids:{note_id_list}\")\n        semaphore = asyncio.Semaphore(config.MAX_CONCURRENCY_NUM)\n        task_list: List[Task] = []\n        for note_id in note_id_list:\n            task = asyncio.create_task(self.get_note_comments(note_id, semaphore), name=note_id)\n            task_list.append(task)\n        await asyncio.gather(*task_list)\n\n    async def get_note_comments(self, note_id: str, semaphore: asyncio.Semaphore):\n        \"\"\"\n        get comment for note id\n        :param note_id:\n        :param semaphore:\n        :return:\n        \"\"\"\n        async with semaphore:\n            try:\n                utils.logger.info(f\"[WeiboCrawler.get_note_comments] begin get note_id: {note_id} comments ...\")\n\n                # Sleep before fetching comments\n                await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n                utils.logger.info(f\"[WeiboCrawler.get_note_comments] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds before fetching comments for note {note_id}\")\n\n                await self.wb_client.get_note_all_comments(\n                    note_id=note_id,\n                    crawl_interval=config.CRAWLER_MAX_SLEEP_SEC,  # Use fixed interval instead of random\n                    callback=weibo_store.batch_update_weibo_note_comments,\n                    max_count=config.CRAWLER_MAX_COMMENTS_COUNT_SINGLENOTES,\n                )\n            except DataFetchError as ex:\n                utils.logger.error(f\"[WeiboCrawler.get_note_comments] get note_id: {note_id} comment error: {ex}\")\n            except Exception as e:\n                utils.logger.error(f\"[WeiboCrawler.get_note_comments] may be been blocked, err:{e}\")\n\n    async def get_note_images(self, mblog: Dict):\n        \"\"\"\n        get note images\n        :param mblog:\n        :return:\n        \"\"\"\n        if not config.ENABLE_GET_MEIDAS:\n            utils.logger.info(f\"[WeiboCrawler.get_note_images] Crawling image mode is not enabled\")\n            return\n\n        pics: List = mblog.get(\"pics\")\n        if not pics:\n            return\n        for pic in pics:\n            if isinstance(pic, str):\n                url = pic\n                pid = url.split(\"/\")[-1].split(\".\")[0]\n            elif isinstance(pic, dict):\n                url = pic.get(\"url\")\n                pid = pic.get(\"pid\", \"\")\n            else:\n                continue\n            if not url:\n                continue\n            content = await self.wb_client.get_note_image(url)\n            await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n            utils.logger.info(f\"[WeiboCrawler.get_note_images] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds after fetching image\")\n            if content != None:\n                extension_file_name = url.split(\".\")[-1]\n                await weibo_store.update_weibo_note_image(pid, content, extension_file_name)\n\n    async def get_creators_and_notes(self) -> None:\n        \"\"\"\n        Get creator's information and their notes and comments\n        Returns:\n\n        \"\"\"\n        utils.logger.info(\"[WeiboCrawler.get_creators_and_notes] Begin get weibo creators\")\n        for user_id in config.WEIBO_CREATOR_ID_LIST:\n            createor_info_res: Dict = await self.wb_client.get_creator_info_by_id(creator_id=user_id)\n            if createor_info_res:\n                createor_info: Dict = createor_info_res.get(\"userInfo\", {})\n                utils.logger.info(f\"[WeiboCrawler.get_creators_and_notes] creator info: {createor_info}\")\n                if not createor_info:\n                    raise DataFetchError(\"Get creator info error\")\n                await weibo_store.save_creator(user_id, user_info=createor_info)\n\n                # Create a wrapper callback to get full text before saving data\n                async def save_notes_with_full_text(note_list: List[Dict]):\n                    # If full text fetching is enabled, batch get full text first\n                    updated_note_list = await self.batch_get_notes_full_text(note_list)\n                    await weibo_store.batch_update_weibo_notes(updated_note_list)\n\n                # Get all note information of the creator\n                all_notes_list = await self.wb_client.get_all_notes_by_creator_id(\n                    creator_id=user_id,\n                    container_id=f\"107603{user_id}\",\n                    crawl_interval=0,\n                    callback=save_notes_with_full_text,\n                )\n\n                note_ids = [note_item.get(\"mblog\", {}).get(\"id\") for note_item in all_notes_list if note_item.get(\"mblog\", {}).get(\"id\")]\n                await self.batch_get_notes_comments(note_ids)\n\n            else:\n                utils.logger.error(f\"[WeiboCrawler.get_creators_and_notes] get creator info error, creator_id:{user_id}\")\n\n    async def create_weibo_client(self, httpx_proxy: Optional[str]) -> WeiboClient:\n        \"\"\"Create xhs client\"\"\"\n        utils.logger.info(\"[WeiboCrawler.create_weibo_client] Begin create weibo API client ...\")\n        cookie_str, cookie_dict = utils.convert_cookies(await self.browser_context.cookies(urls=[self.mobile_index_url]))\n        weibo_client_obj = WeiboClient(\n            proxy=httpx_proxy,\n            headers={\n                \"User-Agent\": utils.get_mobile_user_agent(),\n                \"Cookie\": cookie_str,\n                \"Origin\": \"https://m.weibo.cn\",\n                \"Referer\": \"https://m.weibo.cn\",\n                \"Content-Type\": \"application/json;charset=UTF-8\",\n            },\n            playwright_page=self.context_page,\n            cookie_dict=cookie_dict,\n            proxy_ip_pool=self.ip_proxy_pool,  # Pass proxy pool for automatic refresh\n        )\n        return weibo_client_obj\n\n    async def launch_browser(\n        self,\n        chromium: BrowserType,\n        playwright_proxy: Optional[Dict],\n        user_agent: Optional[str],\n        headless: bool = True,\n    ) -> BrowserContext:\n        \"\"\"Launch browser and create browser context\"\"\"\n        utils.logger.info(\"[WeiboCrawler.launch_browser] Begin create browser context ...\")\n        if config.SAVE_LOGIN_STATE:\n            user_data_dir = os.path.join(os.getcwd(), \"browser_data\", config.USER_DATA_DIR % config.PLATFORM)  # type: ignore\n            browser_context = await chromium.launch_persistent_context(\n                user_data_dir=user_data_dir,\n                accept_downloads=True,\n                headless=headless,\n                proxy=playwright_proxy,  # type: ignore\n                viewport={\n                    \"width\": 1920,\n                    \"height\": 1080\n                },\n                user_agent=user_agent,\n                channel=\"chrome\",  # Use system's Chrome stable version\n            )\n            return browser_context\n        else:\n            browser = await chromium.launch(headless=headless, proxy=playwright_proxy, channel=\"chrome\")  # type: ignore\n            browser_context = await browser.new_context(viewport={\"width\": 1920, \"height\": 1080}, user_agent=user_agent)\n            return browser_context\n\n    async def launch_browser_with_cdp(\n        self,\n        playwright: Playwright,\n        playwright_proxy: Optional[Dict],\n        user_agent: Optional[str],\n        headless: bool = True,\n    ) -> BrowserContext:\n        \"\"\"\n        Launch browser with CDP mode\n        \"\"\"\n        try:\n            self.cdp_manager = CDPBrowserManager()\n            browser_context = await self.cdp_manager.launch_and_connect(\n                playwright=playwright,\n                playwright_proxy=playwright_proxy,\n                user_agent=user_agent,\n                headless=headless,\n            )\n\n            # Display browser information\n            browser_info = await self.cdp_manager.get_browser_info()\n            utils.logger.info(f\"[WeiboCrawler] CDP browser info: {browser_info}\")\n\n            return browser_context\n\n        except Exception as e:\n            utils.logger.error(f\"[WeiboCrawler] CDP mode startup failed, falling back to standard mode: {e}\")\n            # Fallback to standard mode\n            chromium = playwright.chromium\n            return await self.launch_browser(chromium, playwright_proxy, user_agent, headless)\n\n    async def get_note_full_text(self, note_item: Dict) -> Dict:\n        \"\"\"\n        Get full text content of a post\n        If the post content is truncated (isLongText=True), request the detail API to get complete content\n        :param note_item: Post data, contains mblog field\n        :return: Updated post data\n        \"\"\"\n        if not config.ENABLE_WEIBO_FULL_TEXT:\n            return note_item\n\n        mblog = note_item.get(\"mblog\", {})\n        if not mblog:\n            return note_item\n\n        # Check if it's a long text\n        is_long_text = mblog.get(\"isLongText\", False)\n        if not is_long_text:\n            return note_item\n\n        note_id = mblog.get(\"id\")\n        if not note_id:\n            return note_item\n\n        try:\n            utils.logger.info(f\"[WeiboCrawler.get_note_full_text] Fetching full text for note: {note_id}\")\n            full_note = await self.wb_client.get_note_info_by_id(note_id)\n            if full_note and full_note.get(\"mblog\"):\n                # Replace original content with complete content\n                note_item[\"mblog\"] = full_note[\"mblog\"]\n                utils.logger.info(f\"[WeiboCrawler.get_note_full_text] Successfully fetched full text for note: {note_id}\")\n\n            # Sleep after request to avoid rate limiting\n            await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n        except DataFetchError as ex:\n            utils.logger.error(f\"[WeiboCrawler.get_note_full_text] Failed to fetch full text for note {note_id}: {ex}\")\n        except Exception as ex:\n            utils.logger.error(f\"[WeiboCrawler.get_note_full_text] Unexpected error for note {note_id}: {ex}\")\n\n        return note_item\n\n    async def batch_get_notes_full_text(self, note_list: List[Dict]) -> List[Dict]:\n        \"\"\"\n        Batch get full text content of posts\n        :param note_list: List of posts\n        :return: Updated list of posts\n        \"\"\"\n        if not config.ENABLE_WEIBO_FULL_TEXT:\n            return note_list\n\n        result = []\n        for note_item in note_list:\n            updated_note = await self.get_note_full_text(note_item)\n            result.append(updated_note)\n        return result\n\n    async def close(self):\n        \"\"\"Close browser context\"\"\"\n        # Special handling if using CDP mode\n        if self.cdp_manager:\n            await self.cdp_manager.cleanup()\n            self.cdp_manager = None\n        else:\n            await self.browser_context.close()\n        utils.logger.info(\"[WeiboCrawler.close] Browser context closed ...\")\n"
  },
  {
    "path": "media_platform/weibo/exception.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/weibo/exception.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2023/12/2 18:44\n# @Desc    :\n\nfrom httpx import RequestError\n\n\nclass DataFetchError(RequestError):\n    \"\"\"something error when fetch\"\"\"\n\n\nclass IPBlockError(RequestError):\n    \"\"\"fetch so fast that the server block us ip\"\"\"\n"
  },
  {
    "path": "media_platform/weibo/field.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/weibo/field.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2023/12/23 15:41\n# @Desc    :\nfrom enum import Enum\n\n\nclass SearchType(Enum):\n    # Comprehensive\n    DEFAULT = \"1\"\n\n    # Real-time\n    REAL_TIME = \"61\"\n\n    # Popular\n    POPULAR = \"60\"\n\n    # Video\n    VIDEO = \"64\"\n"
  },
  {
    "path": "media_platform/weibo/help.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/weibo/help.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2023/12/24 17:37\n# @Desc    :\n\nfrom typing import Dict, List\n\n\ndef filter_search_result_card(card_list: List[Dict]) -> List[Dict]:\n    \"\"\"\n    Filter Weibo search results, only keep data with card_type of 9\n    :param card_list: List of card items from search results\n    :return: Filtered list of note items\n    \"\"\"\n    note_list: List[Dict] = []\n    for card_item in card_list:\n        if card_item.get(\"card_type\") == 9:\n            note_list.append(card_item)\n        if len(card_item.get(\"card_group\", [])) > 0:\n            card_group = card_item.get(\"card_group\")\n            for card_group_item in card_group:\n                if card_group_item.get(\"card_type\") == 9:\n                    note_list.append(card_group_item)\n\n    return note_list\n"
  },
  {
    "path": "media_platform/weibo/login.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/weibo/login.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2023/12/23 15:42\n# @Desc    : Weibo login implementation\n\nimport asyncio\nimport functools\nimport sys\nfrom typing import Optional\n\nfrom playwright.async_api import BrowserContext, Page\nfrom tenacity import (RetryError, retry, retry_if_result, stop_after_attempt,\n                      wait_fixed)\n\nimport config\nfrom base.base_crawler import AbstractLogin\nfrom tools import utils\n\n\nclass WeiboLogin(AbstractLogin):\n    def __init__(self,\n                 login_type: str,\n                 browser_context: BrowserContext,\n                 context_page: Page,\n                 login_phone: Optional[str] = \"\",\n                 cookie_str: str = \"\"\n                 ):\n        config.LOGIN_TYPE = login_type\n        self.browser_context = browser_context\n        self.context_page = context_page\n        self.login_phone = login_phone\n        self.cookie_str = cookie_str\n        self.weibo_sso_login_url = \"https://passport.weibo.com/sso/signin?entry=miniblog&source=miniblog\"\n\n    async def begin(self):\n        \"\"\"Start login weibo\"\"\"\n        utils.logger.info(\"[WeiboLogin.begin] Begin login weibo ...\")\n        if config.LOGIN_TYPE == \"qrcode\":\n            await self.login_by_qrcode()\n        elif config.LOGIN_TYPE == \"phone\":\n            await self.login_by_mobile()\n        elif config.LOGIN_TYPE == \"cookie\":\n            await self.login_by_cookies()\n        else:\n            raise ValueError(\n                \"[WeiboLogin.begin] Invalid Login Type Currently only supported qrcode or phone or cookie ...\")\n\n\n    @retry(stop=stop_after_attempt(600), wait=wait_fixed(1), retry=retry_if_result(lambda value: value is False))\n    async def check_login_state(self, no_logged_in_session: str) -> bool:\n        \"\"\"\n            Check if the current login status is successful and return True otherwise return False\n            retry decorator will retry 20 times if the return value is False, and the retry interval is 1 second\n            if max retry times reached, raise RetryError\n        \"\"\"\n        current_cookie = await self.browser_context.cookies()\n        _, cookie_dict = utils.convert_cookies(current_cookie)\n        if cookie_dict.get(\"SSOLoginState\"):\n            return True\n        current_web_session = cookie_dict.get(\"WBPSESS\")\n        if current_web_session != no_logged_in_session:\n            return True\n        return False\n\n    async def login_by_qrcode(self):\n        \"\"\"login weibo website and keep webdriver login state\"\"\"\n        utils.logger.info(\"[WeiboLogin.login_by_qrcode] Begin login weibo by qrcode ...\")\n        await self.context_page.goto(self.weibo_sso_login_url)\n        # find login qrcode\n        qrcode_img_selector = \"xpath=//img[@class='w-full h-full']\"\n        base64_qrcode_img = await utils.find_login_qrcode(\n            self.context_page,\n            selector=qrcode_img_selector\n        )\n        if not base64_qrcode_img:\n            utils.logger.info(\"[WeiboLogin.login_by_qrcode] login failed , have not found qrcode please check ....\")\n            sys.exit()\n\n        # show login qrcode\n        partial_show_qrcode = functools.partial(utils.show_qrcode, base64_qrcode_img)\n        asyncio.get_running_loop().run_in_executor(executor=None, func=partial_show_qrcode)\n\n        utils.logger.info(f\"[WeiboLogin.login_by_qrcode] Waiting for scan code login, remaining time is 20s\")\n\n        # get not logged session\n        current_cookie = await self.browser_context.cookies()\n        _, cookie_dict = utils.convert_cookies(current_cookie)\n        no_logged_in_session = cookie_dict.get(\"WBPSESS\")\n\n        try:\n            await self.check_login_state(no_logged_in_session)\n        except RetryError:\n            utils.logger.info(\"[WeiboLogin.login_by_qrcode] Login weibo failed by qrcode login method ...\")\n            sys.exit()\n\n        wait_redirect_seconds = 5\n        utils.logger.info(\n            f\"[WeiboLogin.login_by_qrcode] Login successful then wait for {wait_redirect_seconds} seconds redirect ...\")\n        await asyncio.sleep(wait_redirect_seconds)\n\n    async def login_by_mobile(self):\n        pass\n\n    async def login_by_cookies(self):\n        utils.logger.info(\"[WeiboLogin.login_by_qrcode] Begin login weibo by cookie ...\")\n        for key, value in utils.convert_str_cookie_to_dict(self.cookie_str).items():\n            await self.browser_context.add_cookies([{\n                'name': key,\n                'value': value,\n                'domain': \".weibo.cn\",\n                'path': \"/\"\n            }])\n"
  },
  {
    "path": "media_platform/xhs/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/xhs/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nfrom .core import XiaoHongShuCrawler\nfrom .field import *\n"
  },
  {
    "path": "media_platform/xhs/client.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/xhs/client.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\nimport asyncio\nimport json\nfrom typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Union\nfrom urllib.parse import urlencode\n\nimport httpx\nfrom playwright.async_api import BrowserContext, Page\nfrom tenacity import retry, stop_after_attempt, wait_fixed, retry_if_not_exception_type\nfrom tools.httpx_util import make_async_client\n\nimport config\nfrom base.base_crawler import AbstractApiClient\nfrom proxy.proxy_mixin import ProxyRefreshMixin\nfrom tools import utils\n\nif TYPE_CHECKING:\n    from proxy.proxy_ip_pool import ProxyIpPool\n\nfrom .exception import DataFetchError, IPBlockError, NoteNotFoundError\nfrom .field import SearchNoteType, SearchSortType\nfrom .help import get_search_id\nfrom .extractor import XiaoHongShuExtractor\nfrom .playwright_sign import sign_with_playwright\n\n\nclass XiaoHongShuClient(AbstractApiClient, ProxyRefreshMixin):\n\n    def __init__(\n        self,\n        timeout=60,  # If media crawling is enabled, Xiaohongshu long videos need longer timeout\n        proxy=None,\n        *,\n        headers: Dict[str, str],\n        playwright_page: Page,\n        cookie_dict: Dict[str, str],\n        proxy_ip_pool: Optional[\"ProxyIpPool\"] = None,\n    ):\n        self.proxy = proxy\n        self.timeout = timeout\n        self.headers = headers\n        self._host = \"https://edith.xiaohongshu.com\"\n        self._domain = \"https://www.xiaohongshu.com\"\n        self.IP_ERROR_STR = \"Network connection error, please check network settings or restart\"\n        self.IP_ERROR_CODE = 300012\n        self.NOTE_NOT_FOUND_CODE = -510000\n        self.NOTE_ABNORMAL_STR = \"Note status abnormal, please check later\"\n        self.NOTE_ABNORMAL_CODE = -510001\n        self.playwright_page = playwright_page\n        self.cookie_dict = cookie_dict\n        self._extractor = XiaoHongShuExtractor()\n        # Initialize proxy pool (from ProxyRefreshMixin)\n        self.init_proxy_pool(proxy_ip_pool)\n\n    async def _pre_headers(self, url: str, params: Optional[Dict] = None, payload: Optional[Dict] = None) -> Dict:\n        \"\"\"Request header parameter signing (using playwright injection method)\n\n        Args:\n            url: Request URL\n            params: GET request parameters\n            payload: POST request parameters\n\n        Returns:\n            Dict: Signed request header parameters\n        \"\"\"\n        a1_value = self.cookie_dict.get(\"a1\", \"\")\n\n        # Determine request data, method and URI\n        if params is not None:\n            data = params\n            method = \"GET\"\n        elif payload is not None:\n            data = payload\n            method = \"POST\"\n        else:\n            raise ValueError(\"params or payload is required\")\n\n        # Generate signature using playwright injection method\n        signs = await sign_with_playwright(\n            page=self.playwright_page,\n            uri=url,\n            data=data,\n            a1=a1_value,\n            method=method,\n        )\n\n        headers = {\n            \"X-S\": signs[\"x-s\"],\n            \"X-T\": signs[\"x-t\"],\n            \"x-S-Common\": signs[\"x-s-common\"],\n            \"X-B3-Traceid\": signs[\"x-b3-traceid\"],\n        }\n        self.headers.update(headers)\n        return self.headers\n\n    @retry(stop=stop_after_attempt(3), wait=wait_fixed(1), retry=retry_if_not_exception_type(NoteNotFoundError))\n    async def request(self, method, url, **kwargs) -> Union[str, Any]:\n        \"\"\"\n        Wrapper for httpx common request method, processes request response\n        Args:\n            method: Request method\n            url: Request URL\n            **kwargs: Other request parameters, such as headers, body, etc.\n\n        Returns:\n\n        \"\"\"\n        # Check if proxy is expired before each request\n        await self._refresh_proxy_if_expired()\n\n        # return response.text\n        return_response = kwargs.pop(\"return_response\", False)\n        async with make_async_client(proxy=self.proxy) as client:\n            response = await client.request(method, url, timeout=self.timeout, **kwargs)\n\n        if response.status_code == 471 or response.status_code == 461:\n            # someday someone maybe will bypass captcha\n            verify_type = response.headers[\"Verifytype\"]\n            verify_uuid = response.headers[\"Verifyuuid\"]\n            msg = f\"CAPTCHA appeared, request failed, Verifytype: {verify_type}, Verifyuuid: {verify_uuid}, Response: {response}\"\n            utils.logger.error(msg)\n            raise Exception(msg)\n\n        if return_response:\n            return response.text\n        data: Dict = response.json()\n        if data[\"success\"]:\n            return data.get(\"data\", data.get(\"success\", {}))\n        elif data[\"code\"] == self.IP_ERROR_CODE:\n            raise IPBlockError(self.IP_ERROR_STR)\n        elif data[\"code\"] in (self.NOTE_NOT_FOUND_CODE, self.NOTE_ABNORMAL_CODE):\n            raise NoteNotFoundError(f\"Note not found or abnormal, code: {data['code']}\")\n        else:\n            err_msg = data.get(\"msg\", None) or f\"{response.text}\"\n            raise DataFetchError(err_msg)\n\n    async def get(self, uri: str, params: Optional[Dict] = None) -> Dict:\n        \"\"\"\n        GET request, signs request headers\n        Args:\n            uri: Request route\n            params: Request parameters\n\n        Returns:\n\n        \"\"\"\n        headers = await self._pre_headers(uri, params)\n        full_url = f\"{self._host}{uri}\"\n\n        return await self.request(\n            method=\"GET\", url=full_url, headers=headers, params=params\n        )\n\n    async def post(self, uri: str, data: dict, **kwargs) -> Dict:\n        \"\"\"\n        POST request, signs request headers\n        Args:\n            uri: Request route\n            data: Request body parameters\n\n        Returns:\n\n        \"\"\"\n        headers = await self._pre_headers(uri, payload=data)\n        json_str = json.dumps(data, separators=(\",\", \":\"), ensure_ascii=False)\n        return await self.request(\n            method=\"POST\",\n            url=f\"{self._host}{uri}\",\n            data=json_str,\n            headers=headers,\n            **kwargs,\n        )\n\n    async def get_note_media(self, url: str) -> Union[bytes, None]:\n        # Check if proxy is expired before request\n        await self._refresh_proxy_if_expired()\n\n        async with make_async_client(proxy=self.proxy) as client:\n            try:\n                response = await client.request(\"GET\", url, timeout=self.timeout)\n                response.raise_for_status()\n                if not response.reason_phrase == \"OK\":\n                    utils.logger.error(\n                        f\"[XiaoHongShuClient.get_note_media] request {url} err, res:{response.text}\"\n                    )\n                    return None\n                else:\n                    return response.content\n            except (\n                httpx.HTTPError\n            ) as exc:  # some wrong when call httpx.request method, such as connection error, client error, server error or response status code is not 2xx\n                utils.logger.error(\n                    f\"[XiaoHongShuClient.get_aweme_media] {exc.__class__.__name__} for {exc.request.url} - {exc}\"\n                )  # Keep original exception type name for developer debugging\n                return None\n\n    async def query_self(self) -> Optional[Dict]:\n        \"\"\"\n        Query self user info to check login state\n        Returns:\n            Dict: User info if logged in, None otherwise\n        \"\"\"\n        uri = \"/api/sns/web/v1/user/selfinfo\"\n        headers = await self._pre_headers(uri, params={})\n        async with make_async_client(proxy=self.proxy) as client:\n            response = await client.get(f\"{self._host}{uri}\", headers=headers)\n            if response.status_code == 200:\n                return response.json()\n        return None\n\n    async def pong(self) -> bool:\n        \"\"\"\n        Check if login state is still valid by querying self user info\n        Returns:\n            bool: True if logged in, False otherwise\n        \"\"\"\n        utils.logger.info(\"[XiaoHongShuClient.pong] Begin to check login state...\")\n        ping_flag = False\n        try:\n            self_info: Dict = await self.query_self()\n            if self_info and self_info.get(\"data\", {}).get(\"result\", {}).get(\"success\"):\n                ping_flag = True\n        except Exception as e:\n            utils.logger.error(\n                f\"[XiaoHongShuClient.pong] Check login state failed: {e}, and try to login again...\"\n            )\n            ping_flag = False\n        utils.logger.info(f\"[XiaoHongShuClient.pong] Login state result: {ping_flag}\")\n        return ping_flag\n\n    async def update_cookies(self, browser_context: BrowserContext):\n        \"\"\"\n        Update cookies method provided by API client, usually called after successful login\n        Args:\n            browser_context: Browser context object\n\n        Returns:\n\n        \"\"\"\n        cookie_str, cookie_dict = utils.convert_cookies(await browser_context.cookies())\n        self.headers[\"Cookie\"] = cookie_str\n        self.cookie_dict = cookie_dict\n\n    async def get_note_by_keyword(\n        self,\n        keyword: str,\n        search_id: str = get_search_id(),\n        page: int = 1,\n        page_size: int = 20,\n        sort: SearchSortType = SearchSortType.GENERAL,\n        note_type: SearchNoteType = SearchNoteType.ALL,\n    ) -> Dict:\n        \"\"\"\n        Search notes by keyword\n        Args:\n            keyword: Keyword parameter\n            page: Page number\n            page_size: Page data length\n            sort: Search result sorting specification\n            note_type: Type of note to search\n\n        Returns:\n\n        \"\"\"\n        uri = \"/api/sns/web/v1/search/notes\"\n        data = {\n            \"keyword\": keyword,\n            \"page\": page,\n            \"page_size\": page_size,\n            \"search_id\": search_id,\n            \"sort\": sort.value,\n            \"note_type\": note_type.value,\n        }\n        return await self.post(uri, data)\n\n    async def get_note_by_id(\n        self,\n        note_id: str,\n        xsec_source: str,\n        xsec_token: str,\n    ) -> Dict:\n        \"\"\"\n        Get note detail API\n        Args:\n            note_id: Note ID\n            xsec_source: Channel source\n            xsec_token: Token returned from search keyword result list\n\n        Returns:\n\n        \"\"\"\n        if xsec_source == \"\":\n            xsec_source = \"pc_search\"\n\n        data = {\n            \"source_note_id\": note_id,\n            \"image_formats\": [\"jpg\", \"webp\", \"avif\"],\n            \"extra\": {\"need_body_topic\": 1},\n            \"xsec_source\": xsec_source,\n            \"xsec_token\": xsec_token,\n        }\n        uri = \"/api/sns/web/v1/feed\"\n        res = await self.post(uri, data)\n        if res and res.get(\"items\"):\n            res_dict: Dict = res[\"items\"][0][\"note_card\"]\n            return res_dict\n        # When crawling frequently, some notes may have results while others don't\n        utils.logger.error(\n            f\"[XiaoHongShuClient.get_note_by_id] get note id:{note_id} empty and res:{res}\"\n        )\n        return dict()\n\n    async def get_note_comments(\n        self,\n        note_id: str,\n        xsec_token: str,\n        cursor: str = \"\",\n    ) -> Dict:\n        \"\"\"\n        Get first-level comments API\n        Args:\n            note_id: Note ID\n            xsec_token: Verification token\n            cursor: Pagination cursor\n\n        Returns:\n\n        \"\"\"\n        uri = \"/api/sns/web/v2/comment/page\"\n        params = {\n            \"note_id\": note_id,\n            \"cursor\": cursor,\n            \"top_comment_id\": \"\",\n            \"image_formats\": \"jpg,webp,avif\",\n            \"xsec_token\": xsec_token,\n        }\n        return await self.get(uri, params)\n\n    async def get_note_sub_comments(\n        self,\n        note_id: str,\n        root_comment_id: str,\n        xsec_token: str,\n        num: int = 10,\n        cursor: str = \"\",\n    ):\n        \"\"\"\n        Get sub-comments under specified parent comment API\n        Args:\n            note_id: Post ID of sub-comments\n            root_comment_id: Root comment ID\n            xsec_token: Verification token\n            num: Pagination quantity\n            cursor: Pagination cursor\n\n        Returns:\n\n        \"\"\"\n        uri = \"/api/sns/web/v2/comment/sub/page\"\n        params = {\n            \"note_id\": note_id,\n            \"root_comment_id\": root_comment_id,\n            \"num\": str(num),\n            \"cursor\": cursor,\n            \"image_formats\": \"jpg,webp,avif\",\n            \"top_comment_id\": \"\",\n            \"xsec_token\": xsec_token,\n        }\n        return await self.get(uri, params)\n\n    async def get_note_all_comments(\n        self,\n        note_id: str,\n        xsec_token: str,\n        crawl_interval: float = 1.0,\n        callback: Optional[Callable] = None,\n        max_count: int = 10,\n    ) -> List[Dict]:\n        \"\"\"\n        Get all first-level comments under specified note, this method will continuously find all comment information under a post\n        Args:\n            note_id: Note ID\n            xsec_token: Verification token\n            crawl_interval: Crawl delay per note (seconds)\n            callback: Callback after one note crawl ends\n            max_count: Maximum number of comments to crawl per note\n        Returns:\n\n        \"\"\"\n        result = []\n        comments_has_more = True\n        comments_cursor = \"\"\n        while comments_has_more and len(result) < max_count:\n            comments_res = await self.get_note_comments(\n                note_id=note_id, xsec_token=xsec_token, cursor=comments_cursor\n            )\n            comments_has_more = comments_res.get(\"has_more\", False)\n            comments_cursor = comments_res.get(\"cursor\", \"\")\n            if \"comments\" not in comments_res:\n                utils.logger.info(\n                    f\"[XiaoHongShuClient.get_note_all_comments] No 'comments' key found in response: {comments_res}\"\n                )\n                break\n            comments = comments_res[\"comments\"]\n            if len(result) + len(comments) > max_count:\n                comments = comments[: max_count - len(result)]\n            if callback:\n                await callback(note_id, comments)\n            await asyncio.sleep(crawl_interval)\n            result.extend(comments)\n            sub_comments = await self.get_comments_all_sub_comments(\n                comments=comments,\n                xsec_token=xsec_token,\n                crawl_interval=crawl_interval,\n                callback=callback,\n            )\n            result.extend(sub_comments)\n        return result\n\n    async def get_comments_all_sub_comments(\n        self,\n        comments: List[Dict],\n        xsec_token: str,\n        crawl_interval: float = 1.0,\n        callback: Optional[Callable] = None,\n    ) -> List[Dict]:\n        \"\"\"\n        Get all second-level comments under specified first-level comments, this method will continuously find all second-level comment information under first-level comments\n        Args:\n            comments: Comment list\n            xsec_token: Verification token\n            crawl_interval: Crawl delay per comment (seconds)\n            callback: Callback after one comment crawl ends\n\n        Returns:\n\n        \"\"\"\n        if not config.ENABLE_GET_SUB_COMMENTS:\n            utils.logger.info(\n                f\"[XiaoHongShuCrawler.get_comments_all_sub_comments] Crawling sub_comment mode is not enabled\"\n            )\n            return []\n\n        result = []\n        for comment in comments:\n            try:\n                note_id = comment.get(\"note_id\")\n                sub_comments = comment.get(\"sub_comments\")\n                if sub_comments and callback:\n                    await callback(note_id, sub_comments)\n\n                sub_comment_has_more = comment.get(\"sub_comment_has_more\")\n                if not sub_comment_has_more:\n                    continue\n\n                root_comment_id = comment.get(\"id\")\n                sub_comment_cursor = comment.get(\"sub_comment_cursor\")\n\n                while sub_comment_has_more:\n                    try:\n                        comments_res = await self.get_note_sub_comments(\n                            note_id=note_id,\n                            root_comment_id=root_comment_id,\n                            xsec_token=xsec_token,\n                            num=10,\n                            cursor=sub_comment_cursor,\n                        )\n\n                        if comments_res is None:\n                            utils.logger.info(\n                                f\"[XiaoHongShuClient.get_comments_all_sub_comments] No response found for note_id: {note_id}\"\n                            )\n                            break\n                        sub_comment_has_more = comments_res.get(\"has_more\", False)\n                        sub_comment_cursor = comments_res.get(\"cursor\", \"\")\n                        if \"comments\" not in comments_res:\n                            utils.logger.info(\n                                f\"[XiaoHongShuClient.get_comments_all_sub_comments] No 'comments' key found in response: {comments_res}\"\n                            )\n                            break\n                        comments = comments_res[\"comments\"]\n                        if callback:\n                            await callback(note_id, comments)\n                        await asyncio.sleep(crawl_interval)\n                        result.extend(comments)\n                    except DataFetchError as e:\n                        utils.logger.warning(\n                            f\"[XiaoHongShuClient.get_comments_all_sub_comments] Failed to get sub-comments for note_id: {note_id}, root_comment_id: {root_comment_id}, error: {e}. Skipping this comment's sub-comments.\"\n                        )\n                        break  # Break out of the sub-comment acquisition loop of the current comment and continue processing the next comment\n                    except Exception as e:\n                        utils.logger.error(\n                            f\"[XiaoHongShuClient.get_comments_all_sub_comments] Unexpected error when getting sub-comments for note_id: {note_id}, root_comment_id: {root_comment_id}, error: {e}\"\n                        )\n                        break\n            except Exception as e:\n                utils.logger.error(\n                    f\"[XiaoHongShuClient.get_comments_all_sub_comments] Error processing comment: {comment.get('id', 'unknown')}, error: {e}. Continuing with next comment.\"\n                )\n                continue  # Continue to next comment\n        return result\n\n    async def get_creator_info(\n        self, user_id: str, xsec_token: str = \"\", xsec_source: str = \"\"\n    ) -> Dict:\n        \"\"\"\n        Get user profile brief information by parsing user homepage HTML\n        The PC user homepage has window.__INITIAL_STATE__ variable, just parse it\n\n        Args:\n            user_id: User ID\n            xsec_token: Verification token (optional, pass if included in URL)\n            xsec_source: Channel source (optional, pass if included in URL)\n\n        Returns:\n            Dict: Creator information\n        \"\"\"\n        # Build URI, add xsec parameters to URL if available\n        uri = f\"/user/profile/{user_id}\"\n        if xsec_token and xsec_source:\n            uri = f\"{uri}?xsec_token={xsec_token}&xsec_source={xsec_source}\"\n\n        html_content = await self.request(\n            \"GET\", self._domain + uri, return_response=True, headers=self.headers\n        )\n        return self._extractor.extract_creator_info_from_html(html_content)\n\n    async def get_notes_by_creator(\n        self,\n        creator: str,\n        cursor: str,\n        page_size: int = 30,\n        xsec_token: str = \"\",\n        xsec_source: str = \"pc_feed\",\n    ) -> Dict:\n        \"\"\"\n        Get creator's notes\n        Args:\n            creator: Creator ID\n            cursor: Last note ID from previous page\n            page_size: Page data length\n            xsec_token: Verification token\n            xsec_source: Channel source\n\n        Returns:\n\n        \"\"\"\n        uri = f\"/api/sns/web/v1/user_posted\"\n        params = {\n            \"num\": page_size,\n            \"cursor\": cursor,\n            \"user_id\": creator,\n            \"xsec_token\": xsec_token,\n            \"xsec_source\": xsec_source,\n        }\n        return await self.get(uri, params)\n\n    async def get_all_notes_by_creator(\n        self,\n        user_id: str,\n        crawl_interval: float = 1.0,\n        callback: Optional[Callable] = None,\n        xsec_token: str = \"\",\n        xsec_source: str = \"pc_feed\",\n    ) -> List[Dict]:\n        \"\"\"\n        Get all posts published by specified user, this method will continuously find all post information under a user\n        Args:\n            user_id: User ID\n            crawl_interval: Crawl delay (seconds)\n            callback: Update callback function after one pagination crawl ends\n            xsec_token: Verification token\n            xsec_source: Channel source\n\n        Returns:\n\n        \"\"\"\n        result = []\n        notes_has_more = True\n        notes_cursor = \"\"\n        while notes_has_more and len(result) < config.CRAWLER_MAX_NOTES_COUNT:\n            notes_res = await self.get_notes_by_creator(\n                user_id, notes_cursor, xsec_token=xsec_token, xsec_source=xsec_source\n            )\n            if not notes_res:\n                utils.logger.error(\n                    f\"[XiaoHongShuClient.get_notes_by_creator] The current creator may have been banned by xhs, so they cannot access the data.\"\n                )\n                break\n\n            notes_has_more = notes_res.get(\"has_more\", False)\n            notes_cursor = notes_res.get(\"cursor\", \"\")\n            if \"notes\" not in notes_res:\n                utils.logger.info(\n                    f\"[XiaoHongShuClient.get_all_notes_by_creator] No 'notes' key found in response: {notes_res}\"\n                )\n                break\n\n            notes = notes_res[\"notes\"]\n            utils.logger.info(\n                f\"[XiaoHongShuClient.get_all_notes_by_creator] got user_id:{user_id} notes len : {len(notes)}\"\n            )\n\n            remaining = config.CRAWLER_MAX_NOTES_COUNT - len(result)\n            if remaining <= 0:\n                break\n\n            notes_to_add = notes[:remaining]\n            if callback:\n                await callback(notes_to_add)\n\n            result.extend(notes_to_add)\n            await asyncio.sleep(crawl_interval)\n\n        utils.logger.info(\n            f\"[XiaoHongShuClient.get_all_notes_by_creator] Finished getting notes for user {user_id}, total: {len(result)}\"\n        )\n        return result\n\n    async def get_note_short_url(self, note_id: str) -> Dict:\n        \"\"\"\n        Get note short URL\n        Args:\n            note_id: Note ID\n\n        Returns:\n\n        \"\"\"\n        uri = f\"/api/sns/web/short_url\"\n        data = {\"original_url\": f\"{self._domain}/discovery/item/{note_id}\"}\n        return await self.post(uri, data=data, return_response=True)\n\n    @retry(stop=stop_after_attempt(3), wait=wait_fixed(1))\n    async def get_note_by_id_from_html(\n        self,\n        note_id: str,\n        xsec_source: str,\n        xsec_token: str,\n        enable_cookie: bool = False,\n    ) -> Optional[Dict]:\n        \"\"\"\n        Get note details by parsing note detail page HTML, this interface may fail, retry 3 times here\n        copy from https://github.com/ReaJason/xhs/blob/eb1c5a0213f6fbb592f0a2897ee552847c69ea2d/xhs/core.py#L217-L259\n        thanks for ReaJason\n        Args:\n            note_id:\n            xsec_source:\n            xsec_token:\n            enable_cookie:\n\n        Returns:\n\n        \"\"\"\n        url = (\n            \"https://www.xiaohongshu.com/explore/\"\n            + note_id\n            + f\"?xsec_token={xsec_token}&xsec_source={xsec_source}\"\n        )\n        copy_headers = self.headers.copy()\n        if not enable_cookie:\n            del copy_headers[\"Cookie\"]\n\n        html = await self.request(\n            method=\"GET\", url=url, return_response=True, headers=copy_headers\n        )\n\n        return self._extractor.extract_note_detail_from_html(note_id, html)\n"
  },
  {
    "path": "media_platform/xhs/core.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/xhs/core.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\nimport asyncio\nimport os\nimport random\nfrom asyncio import Task\nfrom typing import Dict, List, Optional\n\nfrom playwright.async_api import (\n    BrowserContext,\n    BrowserType,\n    Page,\n    Playwright,\n    async_playwright,\n)\nfrom tenacity import RetryError\n\nimport config\nfrom base.base_crawler import AbstractCrawler\nfrom model.m_xiaohongshu import NoteUrlInfo, CreatorUrlInfo\nfrom proxy.proxy_ip_pool import IpInfoModel, create_ip_pool\nfrom store import xhs as xhs_store\nfrom tools import utils\nfrom tools.cdp_browser import CDPBrowserManager\nfrom var import crawler_type_var, source_keyword_var\n\nfrom .client import XiaoHongShuClient\nfrom .exception import DataFetchError, NoteNotFoundError\nfrom .field import SearchSortType\nfrom .help import parse_note_info_from_note_url, parse_creator_info_from_url, get_search_id\nfrom .login import XiaoHongShuLogin\n\n\nclass XiaoHongShuCrawler(AbstractCrawler):\n    context_page: Page\n    xhs_client: XiaoHongShuClient\n    browser_context: BrowserContext\n    cdp_manager: Optional[CDPBrowserManager]\n\n    def __init__(self) -> None:\n        self.index_url = \"https://www.xiaohongshu.com\"\n        # self.user_agent = utils.get_user_agent()\n        self.user_agent = \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36\"\n        self.cdp_manager = None\n        self.ip_proxy_pool = None  # Proxy IP pool for automatic proxy refresh\n\n    async def start(self) -> None:\n        playwright_proxy_format, httpx_proxy_format = None, None\n        if config.ENABLE_IP_PROXY:\n            self.ip_proxy_pool = await create_ip_pool(config.IP_PROXY_POOL_COUNT, enable_validate_ip=True)\n            ip_proxy_info: IpInfoModel = await self.ip_proxy_pool.get_proxy()\n            playwright_proxy_format, httpx_proxy_format = utils.format_proxy_info(ip_proxy_info)\n\n        async with async_playwright() as playwright:\n            # Choose launch mode based on configuration\n            if config.ENABLE_CDP_MODE:\n                utils.logger.info(\"[XiaoHongShuCrawler] Launching browser using CDP mode\")\n                self.browser_context = await self.launch_browser_with_cdp(\n                    playwright,\n                    playwright_proxy_format,\n                    self.user_agent,\n                    headless=config.CDP_HEADLESS,\n                )\n            else:\n                utils.logger.info(\"[XiaoHongShuCrawler] Launching browser using standard mode\")\n                # Launch a browser context.\n                chromium = playwright.chromium\n                self.browser_context = await self.launch_browser(\n                    chromium,\n                    playwright_proxy_format,\n                    self.user_agent,\n                    headless=config.HEADLESS,\n                )\n                # stealth.min.js is a js script to prevent the website from detecting the crawler.\n                await self.browser_context.add_init_script(path=\"libs/stealth.min.js\")\n\n            self.context_page = await self.browser_context.new_page()\n            await self.context_page.goto(self.index_url)\n\n            # Create a client to interact with the Xiaohongshu website.\n            self.xhs_client = await self.create_xhs_client(httpx_proxy_format)\n            if not await self.xhs_client.pong():\n                login_obj = XiaoHongShuLogin(\n                    login_type=config.LOGIN_TYPE,\n                    login_phone=\"\",  # input your phone number\n                    browser_context=self.browser_context,\n                    context_page=self.context_page,\n                    cookie_str=config.COOKIES,\n                )\n                await login_obj.begin()\n                await self.xhs_client.update_cookies(browser_context=self.browser_context)\n\n            crawler_type_var.set(config.CRAWLER_TYPE)\n            if config.CRAWLER_TYPE == \"search\":\n                # Search for notes and retrieve their comment information.\n                await self.search()\n            elif config.CRAWLER_TYPE == \"detail\":\n                # Get the information and comments of the specified post\n                await self.get_specified_notes()\n            elif config.CRAWLER_TYPE == \"creator\":\n                # Get creator's information and their notes and comments\n                await self.get_creators_and_notes()\n            else:\n                pass\n\n            utils.logger.info(\"[XiaoHongShuCrawler.start] Xhs Crawler finished ...\")\n\n    async def search(self) -> None:\n        \"\"\"Search for notes and retrieve their comment information.\"\"\"\n        utils.logger.info(\"[XiaoHongShuCrawler.search] Begin search Xiaohongshu keywords\")\n        xhs_limit_count = 20  # Xiaohongshu limit page fixed value\n        if config.CRAWLER_MAX_NOTES_COUNT < xhs_limit_count:\n            config.CRAWLER_MAX_NOTES_COUNT = xhs_limit_count\n        start_page = config.START_PAGE\n        for keyword in config.KEYWORDS.split(\",\"):\n            source_keyword_var.set(keyword)\n            utils.logger.info(f\"[XiaoHongShuCrawler.search] Current search keyword: {keyword}\")\n            page = 1\n            search_id = get_search_id()\n            while (page - start_page + 1) * xhs_limit_count <= config.CRAWLER_MAX_NOTES_COUNT:\n                if page < start_page:\n                    utils.logger.info(f\"[XiaoHongShuCrawler.search] Skip page {page}\")\n                    page += 1\n                    continue\n\n                try:\n                    utils.logger.info(f\"[XiaoHongShuCrawler.search] search Xiaohongshu keyword: {keyword}, page: {page}\")\n                    note_ids: List[str] = []\n                    xsec_tokens: List[str] = []\n                    notes_res = await self.xhs_client.get_note_by_keyword(\n                        keyword=keyword,\n                        search_id=search_id,\n                        page=page,\n                        sort=(SearchSortType(config.SORT_TYPE) if config.SORT_TYPE != \"\" else SearchSortType.GENERAL),\n                    )\n                    utils.logger.info(f\"[XiaoHongShuCrawler.search] Search notes response: {notes_res}\")\n                    if not notes_res or not notes_res.get(\"has_more\", False):\n                        utils.logger.info(\"[XiaoHongShuCrawler.search] No more content!\")\n                        break\n                    semaphore = asyncio.Semaphore(config.MAX_CONCURRENCY_NUM)\n                    task_list = [\n                        self.get_note_detail_async_task(\n                            note_id=post_item.get(\"id\"),\n                            xsec_source=post_item.get(\"xsec_source\"),\n                            xsec_token=post_item.get(\"xsec_token\"),\n                            semaphore=semaphore,\n                        ) for post_item in notes_res.get(\"items\", {}) if post_item.get(\"model_type\") not in (\"rec_query\", \"hot_query\")\n                    ]\n                    note_details = await asyncio.gather(*task_list)\n                    for note_detail in note_details:\n                        if note_detail:\n                            await xhs_store.update_xhs_note(note_detail)\n                            await self.get_notice_media(note_detail)\n                            note_ids.append(note_detail.get(\"note_id\"))\n                            xsec_tokens.append(note_detail.get(\"xsec_token\"))\n                    page += 1\n                    utils.logger.info(f\"[XiaoHongShuCrawler.search] Note details: {note_details}\")\n                    await self.batch_get_note_comments(note_ids, xsec_tokens)\n\n                    # Sleep after each page navigation\n                    await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n                    utils.logger.info(f\"[XiaoHongShuCrawler.search] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds after page {page-1}\")\n                except DataFetchError:\n                    utils.logger.error(\"[XiaoHongShuCrawler.search] Get note detail error\")\n                    break\n\n    async def get_creators_and_notes(self) -> None:\n        \"\"\"Get creator's notes and retrieve their comment information.\"\"\"\n        utils.logger.info(\"[XiaoHongShuCrawler.get_creators_and_notes] Begin get Xiaohongshu creators\")\n        for creator_url in config.XHS_CREATOR_ID_LIST:\n            try:\n                # Parse creator URL to get user_id and security tokens\n                creator_info: CreatorUrlInfo = parse_creator_info_from_url(creator_url)\n                utils.logger.info(f\"[XiaoHongShuCrawler.get_creators_and_notes] Parse creator URL info: {creator_info}\")\n                user_id = creator_info.user_id\n\n                # get creator detail info from web html content\n                createor_info: Dict = await self.xhs_client.get_creator_info(\n                    user_id=user_id,\n                    xsec_token=creator_info.xsec_token,\n                    xsec_source=creator_info.xsec_source\n                )\n                if createor_info:\n                    await xhs_store.save_creator(user_id, creator=createor_info)\n            except ValueError as e:\n                utils.logger.error(f\"[XiaoHongShuCrawler.get_creators_and_notes] Failed to parse creator URL: {e}\")\n                continue\n\n            # Use fixed crawling interval\n            crawl_interval = config.CRAWLER_MAX_SLEEP_SEC\n            # Get all note information of the creator\n            all_notes_list = await self.xhs_client.get_all_notes_by_creator(\n                user_id=user_id,\n                crawl_interval=crawl_interval,\n                callback=self.fetch_creator_notes_detail,\n                xsec_token=creator_info.xsec_token,\n                xsec_source=creator_info.xsec_source,\n            )\n\n            note_ids = []\n            xsec_tokens = []\n            for note_item in all_notes_list:\n                note_ids.append(note_item.get(\"note_id\"))\n                xsec_tokens.append(note_item.get(\"xsec_token\"))\n            await self.batch_get_note_comments(note_ids, xsec_tokens)\n\n    async def fetch_creator_notes_detail(self, note_list: List[Dict]):\n        \"\"\"Concurrently obtain the specified post list and save the data\"\"\"\n        semaphore = asyncio.Semaphore(config.MAX_CONCURRENCY_NUM)\n        task_list = [\n            self.get_note_detail_async_task(\n                note_id=post_item.get(\"note_id\"),\n                xsec_source=post_item.get(\"xsec_source\"),\n                xsec_token=post_item.get(\"xsec_token\"),\n                semaphore=semaphore,\n            ) for post_item in note_list\n        ]\n\n        note_details = await asyncio.gather(*task_list)\n        for note_detail in note_details:\n            if note_detail:\n                await xhs_store.update_xhs_note(note_detail)\n                await self.get_notice_media(note_detail)\n\n    async def get_specified_notes(self):\n        \"\"\"Get the information and comments of the specified post\n\n        Note: Must specify note_id, xsec_source, xsec_token\n        \"\"\"\n        get_note_detail_task_list = []\n        for full_note_url in config.XHS_SPECIFIED_NOTE_URL_LIST:\n            note_url_info: NoteUrlInfo = parse_note_info_from_note_url(full_note_url)\n            utils.logger.info(f\"[XiaoHongShuCrawler.get_specified_notes] Parse note url info: {note_url_info}\")\n            crawler_task = self.get_note_detail_async_task(\n                note_id=note_url_info.note_id,\n                xsec_source=note_url_info.xsec_source,\n                xsec_token=note_url_info.xsec_token,\n                semaphore=asyncio.Semaphore(config.MAX_CONCURRENCY_NUM),\n            )\n            get_note_detail_task_list.append(crawler_task)\n\n        need_get_comment_note_ids = []\n        xsec_tokens = []\n        note_details = await asyncio.gather(*get_note_detail_task_list)\n        for note_detail in note_details:\n            if note_detail:\n                need_get_comment_note_ids.append(note_detail.get(\"note_id\", \"\"))\n                xsec_tokens.append(note_detail.get(\"xsec_token\", \"\"))\n                await xhs_store.update_xhs_note(note_detail)\n                await self.get_notice_media(note_detail)\n        await self.batch_get_note_comments(need_get_comment_note_ids, xsec_tokens)\n\n    async def get_note_detail_async_task(\n        self,\n        note_id: str,\n        xsec_source: str,\n        xsec_token: str,\n        semaphore: asyncio.Semaphore,\n    ) -> Optional[Dict]:\n        \"\"\"Get note detail\n\n        Args:\n            note_id:\n            xsec_source:\n            xsec_token:\n            semaphore:\n\n        Returns:\n            Dict: note detail\n        \"\"\"\n        note_detail = None\n        utils.logger.info(f\"[get_note_detail_async_task] Begin get note detail, note_id: {note_id}\")\n        async with semaphore:\n            try:\n                try:\n                    note_detail = await self.xhs_client.get_note_by_id(note_id, xsec_source, xsec_token)\n                except RetryError:\n                    pass\n\n                if not note_detail:\n                    note_detail = await self.xhs_client.get_note_by_id_from_html(note_id, xsec_source, xsec_token,\n                                                                                 enable_cookie=True)\n                    if not note_detail:\n                        raise Exception(f\"[get_note_detail_async_task] Failed to get note detail, Id: {note_id}\")\n\n                note_detail.update({\"xsec_token\": xsec_token, \"xsec_source\": xsec_source})\n\n                # Sleep after fetching note detail\n                await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n                utils.logger.info(f\"[get_note_detail_async_task] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds after fetching note {note_id}\")\n\n                return note_detail\n\n            except NoteNotFoundError as ex:\n                utils.logger.warning(f\"[XiaoHongShuCrawler.get_note_detail_async_task] Note not found: {note_id}, {ex}\")\n                return None\n            except DataFetchError as ex:\n                utils.logger.error(f\"[XiaoHongShuCrawler.get_note_detail_async_task] Get note detail error: {ex}\")\n                return None\n            except KeyError as ex:\n                utils.logger.error(f\"[XiaoHongShuCrawler.get_note_detail_async_task] have not fund note detail note_id:{note_id}, err: {ex}\")\n                return None\n\n    async def batch_get_note_comments(self, note_list: List[str], xsec_tokens: List[str]):\n        \"\"\"Batch get note comments\"\"\"\n        if not config.ENABLE_GET_COMMENTS:\n            utils.logger.info(f\"[XiaoHongShuCrawler.batch_get_note_comments] Crawling comment mode is not enabled\")\n            return\n\n        utils.logger.info(f\"[XiaoHongShuCrawler.batch_get_note_comments] Begin batch get note comments, note list: {note_list}\")\n        semaphore = asyncio.Semaphore(config.MAX_CONCURRENCY_NUM)\n        task_list: List[Task] = []\n        for index, note_id in enumerate(note_list):\n            task = asyncio.create_task(\n                self.get_comments(note_id=note_id, xsec_token=xsec_tokens[index], semaphore=semaphore),\n                name=note_id,\n            )\n            task_list.append(task)\n        await asyncio.gather(*task_list)\n\n    async def get_comments(self, note_id: str, xsec_token: str, semaphore: asyncio.Semaphore):\n        \"\"\"Get note comments with keyword filtering and quantity limitation\"\"\"\n        async with semaphore:\n            utils.logger.info(f\"[XiaoHongShuCrawler.get_comments] Begin get note id comments {note_id}\")\n            # Use fixed crawling interval\n            crawl_interval = config.CRAWLER_MAX_SLEEP_SEC\n            await self.xhs_client.get_note_all_comments(\n                note_id=note_id,\n                xsec_token=xsec_token,\n                crawl_interval=crawl_interval,\n                callback=xhs_store.batch_update_xhs_note_comments,\n                max_count=config.CRAWLER_MAX_COMMENTS_COUNT_SINGLENOTES,\n            )\n\n            # Sleep after fetching comments\n            await asyncio.sleep(crawl_interval)\n            utils.logger.info(f\"[XiaoHongShuCrawler.get_comments] Sleeping for {crawl_interval} seconds after fetching comments for note {note_id}\")\n\n    async def create_xhs_client(self, httpx_proxy: Optional[str]) -> XiaoHongShuClient:\n        \"\"\"Create Xiaohongshu client\"\"\"\n        utils.logger.info(\"[XiaoHongShuCrawler.create_xhs_client] Begin create Xiaohongshu API client ...\")\n        cookie_str, cookie_dict = utils.convert_cookies(await self.browser_context.cookies())\n        xhs_client_obj = XiaoHongShuClient(\n            proxy=httpx_proxy,\n            headers={\n                \"accept\": \"application/json, text/plain, */*\",\n                \"accept-language\": \"zh-CN,zh;q=0.9\",\n                \"cache-control\": \"no-cache\",\n                \"content-type\": \"application/json;charset=UTF-8\",\n                \"origin\": \"https://www.xiaohongshu.com\",\n                \"pragma\": \"no-cache\",\n                \"priority\": \"u=1, i\",\n                \"referer\": \"https://www.xiaohongshu.com/\",\n                \"sec-ch-ua\": '\"Chromium\";v=\"136\", \"Google Chrome\";v=\"136\", \"Not.A/Brand\";v=\"99\"',\n                \"sec-ch-ua-mobile\": \"?0\",\n                \"sec-ch-ua-platform\": '\"Windows\"',\n                \"sec-fetch-dest\": \"empty\",\n                \"sec-fetch-mode\": \"cors\",\n                \"sec-fetch-site\": \"same-site\",\n                \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36\",\n                \"Cookie\": cookie_str,\n            },\n            playwright_page=self.context_page,\n            cookie_dict=cookie_dict,\n            proxy_ip_pool=self.ip_proxy_pool,  # Pass proxy pool for automatic refresh\n        )\n        return xhs_client_obj\n\n    async def launch_browser(\n        self,\n        chromium: BrowserType,\n        playwright_proxy: Optional[Dict],\n        user_agent: Optional[str],\n        headless: bool = True,\n    ) -> BrowserContext:\n        \"\"\"Launch browser and create browser context\"\"\"\n        utils.logger.info(\"[XiaoHongShuCrawler.launch_browser] Begin create browser context ...\")\n        if config.SAVE_LOGIN_STATE:\n            # feat issue #14\n            # we will save login state to avoid login every time\n            user_data_dir = os.path.join(os.getcwd(), \"browser_data\", config.USER_DATA_DIR % config.PLATFORM)  # type: ignore\n            browser_context = await chromium.launch_persistent_context(\n                user_data_dir=user_data_dir,\n                accept_downloads=True,\n                headless=headless,\n                proxy=playwright_proxy,  # type: ignore\n                viewport={\n                    \"width\": 1920,\n                    \"height\": 1080\n                },\n                user_agent=user_agent,\n            )\n            return browser_context\n        else:\n            browser = await chromium.launch(headless=headless, proxy=playwright_proxy)  # type: ignore\n            browser_context = await browser.new_context(viewport={\"width\": 1920, \"height\": 1080}, user_agent=user_agent)\n            return browser_context\n\n    async def launch_browser_with_cdp(\n        self,\n        playwright: Playwright,\n        playwright_proxy: Optional[Dict],\n        user_agent: Optional[str],\n        headless: bool = True,\n    ) -> BrowserContext:\n        \"\"\"Launch browser using CDP mode\"\"\"\n        try:\n            self.cdp_manager = CDPBrowserManager()\n            browser_context = await self.cdp_manager.launch_and_connect(\n                playwright=playwright,\n                playwright_proxy=playwright_proxy,\n                user_agent=user_agent,\n                headless=headless,\n            )\n\n            # Display browser information\n            browser_info = await self.cdp_manager.get_browser_info()\n            utils.logger.info(f\"[XiaoHongShuCrawler] CDP browser info: {browser_info}\")\n\n            return browser_context\n\n        except Exception as e:\n            utils.logger.error(f\"[XiaoHongShuCrawler] CDP mode launch failed, falling back to standard mode: {e}\")\n            # Fall back to standard mode\n            chromium = playwright.chromium\n            return await self.launch_browser(chromium, playwright_proxy, user_agent, headless)\n\n    async def close(self):\n        \"\"\"Close browser context\"\"\"\n        # Special handling if using CDP mode\n        if self.cdp_manager:\n            await self.cdp_manager.cleanup()\n            self.cdp_manager = None\n        else:\n            await self.browser_context.close()\n        utils.logger.info(\"[XiaoHongShuCrawler.close] Browser context closed ...\")\n\n    async def get_notice_media(self, note_detail: Dict):\n        if not config.ENABLE_GET_MEIDAS:\n            utils.logger.info(f\"[XiaoHongShuCrawler.get_notice_media] Crawling image mode is not enabled\")\n            return\n        await self.get_note_images(note_detail)\n        await self.get_notice_video(note_detail)\n\n    async def get_note_images(self, note_item: Dict):\n        \"\"\"Get note images. Please use get_notice_media\n\n        Args:\n            note_item: Note item dictionary\n        \"\"\"\n        if not config.ENABLE_GET_MEIDAS:\n            return\n        note_id = note_item.get(\"note_id\")\n        image_list: List[Dict] = note_item.get(\"image_list\", [])\n\n        for img in image_list:\n            if img.get(\"url_default\") != \"\":\n                img.update({\"url\": img.get(\"url_default\")})\n\n        if not image_list:\n            return\n        picNum = 0\n        for pic in image_list:\n            url = pic.get(\"url\")\n            if not url:\n                continue\n            content = await self.xhs_client.get_note_media(url)\n            await asyncio.sleep(random.random())\n            if content is None:\n                continue\n            extension_file_name = f\"{picNum}.jpg\"\n            picNum += 1\n            await xhs_store.update_xhs_note_image(note_id, content, extension_file_name)\n\n    async def get_notice_video(self, note_item: Dict):\n        \"\"\"Get note videos. Please use get_notice_media\n\n        Args:\n            note_item: Note item dictionary\n        \"\"\"\n        if not config.ENABLE_GET_MEIDAS:\n            return\n        note_id = note_item.get(\"note_id\")\n\n        videos = xhs_store.get_video_url_arr(note_item)\n\n        if not videos:\n            return\n        videoNum = 0\n        for url in videos:\n            content = await self.xhs_client.get_note_media(url)\n            await asyncio.sleep(random.random())\n            if content is None:\n                continue\n            extension_file_name = f\"{videoNum}.mp4\"\n            videoNum += 1\n            await xhs_store.update_xhs_note_video(note_id, content, extension_file_name)\n"
  },
  {
    "path": "media_platform/xhs/exception.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/xhs/exception.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nfrom httpx import RequestError\n\n\nclass DataFetchError(RequestError):\n    \"\"\"something error when fetch\"\"\"\n\n\nclass IPBlockError(RequestError):\n    \"\"\"fetch so fast that the server block us ip\"\"\"\n\n\nclass NoteNotFoundError(RequestError):\n    \"\"\"Note does not exist or is abnormal\"\"\"\n"
  },
  {
    "path": "media_platform/xhs/extractor.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/xhs/extractor.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\nimport json\nimport re\nfrom typing import Dict, Optional\n\nimport humps\n\n\nclass XiaoHongShuExtractor:\n    def __init__(self):\n        pass\n\n    def extract_note_detail_from_html(self, note_id: str, html: str) -> Optional[Dict]:\n        \"\"\"Extract note details from HTML\n\n        Args:\n            html (str): HTML string\n\n        Returns:\n            Dict: Note details dictionary\n        \"\"\"\n        if \"noteDetailMap\" not in html:\n            # Either a CAPTCHA appeared or the note doesn't exist\n            return None\n\n        state = re.findall(r\"window.__INITIAL_STATE__=({.*})</script>\", html)[\n            0\n        ].replace(\"undefined\", '\"\"')\n        if state != \"{}\":\n            note_dict = humps.decamelize(json.loads(state))\n            return note_dict[\"note\"][\"note_detail_map\"][note_id][\"note\"]\n        return None\n\n    def extract_creator_info_from_html(self, html: str) -> Optional[Dict]:\n        \"\"\"Extract user information from HTML\n\n        Args:\n            html (str): HTML string\n\n        Returns:\n            Dict: User information dictionary\n        \"\"\"\n        match = re.search(\n            r\"<script>window.__INITIAL_STATE__=(.+)<\\/script>\", html, re.M\n        )\n        if match is None:\n            return None\n        info = json.loads(match.group(1).replace(\":undefined\", \":null\"), strict=False)\n        if info is None:\n            return None\n        return info.get(\"user\").get(\"userPageData\")\n"
  },
  {
    "path": "media_platform/xhs/field.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/xhs/field.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nfrom enum import Enum\nfrom typing import NamedTuple\n\n\nclass FeedType(Enum):\n    # Recommend\n    RECOMMEND = \"homefeed_recommend\"\n    # Fashion\n    FASION = \"homefeed.fashion_v3\"\n    # Food\n    FOOD = \"homefeed.food_v3\"\n    # Cosmetics\n    COSMETICS = \"homefeed.cosmetics_v3\"\n    # Movie and TV\n    MOVIE = \"homefeed.movie_and_tv_v3\"\n    # Career\n    CAREER = \"homefeed.career_v3\"\n    # Emotion\n    EMOTION = \"homefeed.love_v3\"\n    # Home\n    HOURSE = \"homefeed.household_product_v3\"\n    # Gaming\n    GAME = \"homefeed.gaming_v3\"\n    # Travel\n    TRAVEL = \"homefeed.travel_v3\"\n    # Fitness\n    FITNESS = \"homefeed.fitness_v3\"\n\n\nclass NoteType(Enum):\n    NORMAL = \"normal\"\n    VIDEO = \"video\"\n\n\nclass SearchSortType(Enum):\n    \"\"\"Search sort type\"\"\"\n    # Default\n    GENERAL = \"general\"\n    # Most popular\n    MOST_POPULAR = \"popularity_descending\"\n    # Latest\n    LATEST = \"time_descending\"\n\n\nclass SearchNoteType(Enum):\n    \"\"\"Search note type\"\"\"\n    # Default\n    ALL = 0\n    # Only video\n    VIDEO = 1\n    # Only image\n    IMAGE = 2\n\n\nclass Note(NamedTuple):\n    \"\"\"Note tuple\"\"\"\n    note_id: str\n    title: str\n    desc: str\n    type: str\n    user: dict\n    img_urls: list\n    video_url: str\n    tag_list: list\n    at_user_list: list\n    collected_count: str\n    comment_count: str\n    liked_count: str\n    share_count: str\n    time: int\n    last_update_time: int\n"
  },
  {
    "path": "media_platform/xhs/help.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/xhs/help.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nimport ctypes\nimport json\nimport random\nimport time\nimport urllib.parse\n\nfrom model.m_xiaohongshu import NoteUrlInfo, CreatorUrlInfo\nfrom tools.crawler_util import extract_url_params_to_dict\n\n\ndef sign(a1=\"\", b1=\"\", x_s=\"\", x_t=\"\"):\n    \"\"\"\n    takes in a URI (uniform resource identifier), an optional data dictionary, and an optional ctime parameter. It returns a dictionary containing two keys: \"x-s\" and \"x-t\".\n    \"\"\"\n    common = {\n        \"s0\": 3,  # getPlatformCode\n        \"s1\": \"\",\n        \"x0\": \"1\",  # localStorage.getItem(\"b1b1\")\n        \"x1\": \"4.2.2\",  # version\n        \"x2\": \"Mac OS\",\n        \"x3\": \"xhs-pc-web\",\n        \"x4\": \"4.74.0\",\n        \"x5\": a1,  # cookie of a1\n        \"x6\": x_t,\n        \"x7\": x_s,\n        \"x8\": b1,  # localStorage.getItem(\"b1\")\n        \"x9\": mrc(x_t + x_s + b1),\n        \"x10\": 154,  # getSigCount\n        \"x11\": \"normal\"\n    }\n    encode_str = encodeUtf8(json.dumps(common, separators=(',', ':')))\n    x_s_common = b64Encode(encode_str)\n    x_b3_traceid = get_b3_trace_id()\n    return {\n        \"x-s\": x_s,\n        \"x-t\": x_t,\n        \"x-s-common\": x_s_common,\n        \"x-b3-traceid\": x_b3_traceid\n    }\n\n\ndef get_b3_trace_id():\n    re = \"abcdef0123456789\"\n    je = 16\n    e = \"\"\n    for t in range(16):\n        e += re[random.randint(0, je - 1)]\n    return e\n\n\ndef mrc(e):\n    ie = [\n        0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, 3915621685,\n        2657392035, 249268274, 2044508324, 3772115230, 2547177864, 162941995,\n        2125561021, 3887607047, 2428444049, 498536548, 1789927666, 4089016648,\n        2227061214, 450548861, 1843258603, 4107580753, 2211677639, 325883990,\n        1684777152, 4251122042, 2321926636, 335633487, 1661365465, 4195302755,\n        2366115317, 997073096, 1281953886, 3579855332, 2724688242, 1006888145,\n        1258607687, 3524101629, 2768942443, 901097722, 1119000684, 3686517206,\n        2898065728, 853044451, 1172266101, 3705015759, 2882616665, 651767980,\n        1373503546, 3369554304, 3218104598, 565507253, 1454621731, 3485111705,\n        3099436303, 671266974, 1594198024, 3322730930, 2970347812, 795835527,\n        1483230225, 3244367275, 3060149565, 1994146192, 31158534, 2563907772,\n        4023717930, 1907459465, 112637215, 2680153253, 3904427059, 2013776290,\n        251722036, 2517215374, 3775830040, 2137656763, 141376813, 2439277719,\n        3865271297, 1802195444, 476864866, 2238001368, 4066508878, 1812370925,\n        453092731, 2181625025, 4111451223, 1706088902, 314042704, 2344532202,\n        4240017532, 1658658271, 366619977, 2362670323, 4224994405, 1303535960,\n        984961486, 2747007092, 3569037538, 1256170817, 1037604311, 2765210733,\n        3554079995, 1131014506, 879679996, 2909243462, 3663771856, 1141124467,\n        855842277, 2852801631, 3708648649, 1342533948, 654459306, 3188396048,\n        3373015174, 1466479909, 544179635, 3110523913, 3462522015, 1591671054,\n        702138776, 2966460450, 3352799412, 1504918807, 783551873, 3082640443,\n        3233442989, 3988292384, 2596254646, 62317068, 1957810842, 3939845945,\n        2647816111, 81470997, 1943803523, 3814918930, 2489596804, 225274430,\n        2053790376, 3826175755, 2466906013, 167816743, 2097651377, 4027552580,\n        2265490386, 503444072, 1762050814, 4150417245, 2154129355, 426522225,\n        1852507879, 4275313526, 2312317920, 282753626, 1742555852, 4189708143,\n        2394877945, 397917763, 1622183637, 3604390888, 2714866558, 953729732,\n        1340076626, 3518719985, 2797360999, 1068828381, 1219638859, 3624741850,\n        2936675148, 906185462, 1090812512, 3747672003, 2825379669, 829329135,\n        1181335161, 3412177804, 3160834842, 628085408, 1382605366, 3423369109,\n        3138078467, 570562233, 1426400815, 3317316542, 2998733608, 733239954,\n        1555261956, 3268935591, 3050360625, 752459403, 1541320221, 2607071920,\n        3965973030, 1969922972, 40735498, 2617837225, 3943577151, 1913087877,\n        83908371, 2512341634, 3803740692, 2075208622, 213261112, 2463272603,\n        3855990285, 2094854071, 198958881, 2262029012, 4057260610, 1759359992,\n        534414190, 2176718541, 4139329115, 1873836001, 414664567, 2282248934,\n        4279200368, 1711684554, 285281116, 2405801727, 4167216745, 1634467795,\n        376229701, 2685067896, 3608007406, 1308918612, 956543938, 2808555105,\n        3495958263, 1231636301, 1047427035, 2932959818, 3654703836, 1088359270,\n        936918000, 2847714899, 3736837829, 1202900863, 817233897, 3183342108,\n        3401237130, 1404277552, 615818150, 3134207493, 3453421203, 1423857449,\n        601450431, 3009837614, 3294710456, 1567103746, 711928724, 3020668471,\n        3272380065, 1510334235, 755167117,\n    ]\n    o = -1\n\n    def right_without_sign(num: int, bit: int=0) -> int:\n        val = ctypes.c_uint32(num).value >> bit\n        MAX32INT = 4294967295\n        return (val + (MAX32INT + 1)) % (2 * (MAX32INT + 1)) - MAX32INT - 1\n\n    for n in range(57):\n        o = ie[(o & 255) ^ ord(e[n])] ^ right_without_sign(o, 8)\n    return o ^ -1 ^ 3988292384\n\n\nlookup = [\n    \"Z\",\n    \"m\",\n    \"s\",\n    \"e\",\n    \"r\",\n    \"b\",\n    \"B\",\n    \"o\",\n    \"H\",\n    \"Q\",\n    \"t\",\n    \"N\",\n    \"P\",\n    \"+\",\n    \"w\",\n    \"O\",\n    \"c\",\n    \"z\",\n    \"a\",\n    \"/\",\n    \"L\",\n    \"p\",\n    \"n\",\n    \"g\",\n    \"G\",\n    \"8\",\n    \"y\",\n    \"J\",\n    \"q\",\n    \"4\",\n    \"2\",\n    \"K\",\n    \"W\",\n    \"Y\",\n    \"j\",\n    \"0\",\n    \"D\",\n    \"S\",\n    \"f\",\n    \"d\",\n    \"i\",\n    \"k\",\n    \"x\",\n    \"3\",\n    \"V\",\n    \"T\",\n    \"1\",\n    \"6\",\n    \"I\",\n    \"l\",\n    \"U\",\n    \"A\",\n    \"F\",\n    \"M\",\n    \"9\",\n    \"7\",\n    \"h\",\n    \"E\",\n    \"C\",\n    \"v\",\n    \"u\",\n    \"R\",\n    \"X\",\n    \"5\",\n]\n\n\ndef tripletToBase64(e):\n    return (\n            lookup[63 & (e >> 18)] +\n            lookup[63 & (e >> 12)] +\n            lookup[(e >> 6) & 63] +\n            lookup[e & 63]\n    )\n\n\ndef encodeChunk(e, t, r):\n    m = []\n    for b in range(t, r, 3):\n        n = (16711680 & (e[b] << 16)) + \\\n            ((e[b + 1] << 8) & 65280) + (e[b + 2] & 255)\n        m.append(tripletToBase64(n))\n    return ''.join(m)\n\n\ndef b64Encode(e):\n    P = len(e)\n    W = P % 3\n    U = []\n    z = 16383\n    H = 0\n    Z = P - W\n    while H < Z:\n        U.append(encodeChunk(e, H, Z if H + z > Z else H + z))\n        H += z\n    if 1 == W:\n        F = e[P - 1]\n        U.append(lookup[F >> 2] + lookup[(F << 4) & 63] + \"==\")\n    elif 2 == W:\n        F = (e[P - 2] << 8) + e[P - 1]\n        U.append(lookup[F >> 10] + lookup[63 & (F >> 4)] +\n                 lookup[(F << 2) & 63] + \"=\")\n    return \"\".join(U)\n\n\ndef encodeUtf8(e):\n    b = []\n    m = urllib.parse.quote(e, safe='~()*!.\\'')\n    w = 0\n    while w < len(m):\n        T = m[w]\n        if T == \"%\":\n            E = m[w + 1] + m[w + 2]\n            S = int(E, 16)\n            b.append(S)\n            w += 2\n        else:\n            b.append(ord(T[0]))\n        w += 1\n    return b\n\n\ndef base36encode(number, alphabet='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'):\n    \"\"\"Converts an integer to a base36 string.\"\"\"\n    if not isinstance(number, int):\n        raise TypeError('number must be an integer')\n\n    base36 = ''\n    sign = ''\n\n    if number < 0:\n        sign = '-'\n        number = -number\n\n    if 0 <= number < len(alphabet):\n        return sign + alphabet[number]\n\n    while number != 0:\n        number, i = divmod(number, len(alphabet))\n        base36 = alphabet[i] + base36\n\n    return sign + base36\n\n\ndef base36decode(number):\n    return int(number, 36)\n\n\ndef get_search_id():\n    e = int(time.time() * 1000) << 64\n    t = int(random.uniform(0, 2147483646))\n    return base36encode((e + t))\n\n\nimg_cdns = [\n    \"https://sns-img-qc.xhscdn.com\",\n    \"https://sns-img-hw.xhscdn.com\",\n    \"https://sns-img-bd.xhscdn.com\",\n    \"https://sns-img-qn.xhscdn.com\",\n]\n\ndef get_img_url_by_trace_id(trace_id: str, format_type: str = \"png\"):\n    return f\"{random.choice(img_cdns)}/{trace_id}?imageView2/format/{format_type}\"\n\n\ndef get_img_urls_by_trace_id(trace_id: str, format_type: str = \"png\"):\n    return [f\"{cdn}/{trace_id}?imageView2/format/{format_type}\" for cdn in img_cdns]\n\n\ndef get_trace_id(img_url: str):\n    # Browser-uploaded images have an additional /spectrum/ path\n    return f\"spectrum/{img_url.split('/')[-1]}\" if img_url.find(\"spectrum\") != -1 else img_url.split(\"/\")[-1]\n\n\ndef parse_note_info_from_note_url(url: str) -> NoteUrlInfo:\n    \"\"\"\n    Parse note information from Xiaohongshu note URL\n    Args:\n        url: \"https://www.xiaohongshu.com/explore/66fad51c000000001b0224b8?xsec_token=AB3rO-QopW5sgrJ41GwN01WCXh6yWPxjSoFI9D5JIMgKw=&xsec_source=pc_search\"\n    Returns:\n\n    \"\"\"\n    note_id = url.split(\"/\")[-1].split(\"?\")[0]\n    params = extract_url_params_to_dict(url)\n    xsec_token = params.get(\"xsec_token\", \"\")\n    xsec_source = params.get(\"xsec_source\", \"\")\n    return NoteUrlInfo(note_id=note_id, xsec_token=xsec_token, xsec_source=xsec_source)\n\n\ndef parse_creator_info_from_url(url: str) -> CreatorUrlInfo:\n    \"\"\"\n    Parse creator information from Xiaohongshu creator homepage URL\n    Supports the following formats:\n    1. Full URL: \"https://www.xiaohongshu.com/user/profile/5eb8e1d400000000010075ae?xsec_token=AB1nWBKCo1vE2HEkfoJUOi5B6BE5n7wVrbdpHoWIj5xHw=&xsec_source=pc_feed\"\n    2. Pure ID: \"5eb8e1d400000000010075ae\"\n\n    Args:\n        url: Creator homepage URL or user_id\n    Returns:\n        CreatorUrlInfo: Object containing user_id, xsec_token, xsec_source\n    \"\"\"\n    # If it's a pure ID format (24 hexadecimal characters), return directly\n    if len(url) == 24 and all(c in \"0123456789abcdef\" for c in url):\n        return CreatorUrlInfo(user_id=url, xsec_token=\"\", xsec_source=\"\")\n\n    # Extract user_id from URL: /user/profile/xxx\n    import re\n    user_pattern = r'/user/profile/([^/?]+)'\n    match = re.search(user_pattern, url)\n    if match:\n        user_id = match.group(1)\n        # Extract xsec_token and xsec_source parameters\n        params = extract_url_params_to_dict(url)\n        xsec_token = params.get(\"xsec_token\", \"\")\n        xsec_source = params.get(\"xsec_source\", \"\")\n        return CreatorUrlInfo(user_id=user_id, xsec_token=xsec_token, xsec_source=xsec_source)\n\n    raise ValueError(f\"Unable to parse creator info from URL: {url}\")\n\n\nif __name__ == '__main__':\n    _img_url = \"https://sns-img-bd.xhscdn.com/7a3abfaf-90c1-a828-5de7-022c80b92aa3\"\n    # Get image URL addresses under multiple CDNs for a single image\n    # final_img_urls = get_img_urls_by_trace_id(get_trace_id(_img_url))\n    final_img_url = get_img_url_by_trace_id(get_trace_id(_img_url))\n    print(final_img_url)\n\n    # Test creator URL parsing\n    print(\"\\n=== Creator URL Parsing Test ===\")\n    test_creator_urls = [\n        \"https://www.xiaohongshu.com/user/profile/5eb8e1d400000000010075ae?xsec_token=AB1nWBKCo1vE2HEkfoJUOi5B6BE5n7wVrbdpHoWIj5xHw=&xsec_source=pc_feed\",\n        \"5eb8e1d400000000010075ae\",\n    ]\n    for url in test_creator_urls:\n        try:\n            result = parse_creator_info_from_url(url)\n            print(f\"✓ URL: {url[:80]}...\")\n            print(f\"  Result: {result}\\n\")\n        except Exception as e:\n            print(f\"✗ URL: {url}\")\n            print(f\"  Error: {e}\\n\")\n"
  },
  {
    "path": "media_platform/xhs/login.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/xhs/login.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nimport asyncio\nimport functools\nimport sys\nfrom typing import Optional\n\nfrom playwright.async_api import BrowserContext, Page\nfrom tenacity import (RetryError, retry, retry_if_result, stop_after_attempt,\n                      wait_fixed)\n\nimport config\nfrom base.base_crawler import AbstractLogin\nfrom cache.cache_factory import CacheFactory\nfrom tools import utils\n\n\nclass XiaoHongShuLogin(AbstractLogin):\n\n    def __init__(self,\n                 login_type: str,\n                 browser_context: BrowserContext,\n                 context_page: Page,\n                 login_phone: Optional[str] = \"\",\n                 cookie_str: str = \"\"\n                 ):\n        config.LOGIN_TYPE = login_type\n        self.browser_context = browser_context\n        self.context_page = context_page\n        self.login_phone = login_phone\n        self.cookie_str = cookie_str\n\n    @retry(stop=stop_after_attempt(600), wait=wait_fixed(1), retry=retry_if_result(lambda value: value is False))\n    async def check_login_state(self, no_logged_in_session: str) -> bool:\n        \"\"\"\n        Verify login status using dual-check: UI elements and Cookies.\n        \"\"\"\n        # 1. Priority check: Check if the \"Me\" (Profile) node appears in the sidebar\n        try:\n            # Selector for elements containing \"Me\" text with a link pointing to the profile\n            # XPath Explanation: Find a span with text \"Me\" inside an anchor tag (<a>) \n            # whose href attribute contains \"/user/profile/\"\n            user_profile_selector = \"xpath=//a[contains(@href, '/user/profile/')]//span[text()='我']\"\n            \n            # Set a short timeout since this is called within a retry loop\n            is_visible = await self.context_page.is_visible(user_profile_selector, timeout=500)\n            if is_visible:\n                utils.logger.info(\"[XiaoHongShuLogin.check_login_state] Login status confirmed by UI element ('Me' button).\")\n                return True\n        except Exception:\n            pass\n\n        # 2. Alternative: Check for CAPTCHA prompt\n        if \"请通过验证\" in await self.context_page.content():\n            utils.logger.info(\"[XiaoHongShuLogin.check_login_state] CAPTCHA appeared, please verify manually.\")\n\n        # 3. Compatibility fallback: Original Cookie-based change detection\n        current_cookie = await self.browser_context.cookies()\n        _, cookie_dict = utils.convert_cookies(current_cookie)\n        current_web_session = cookie_dict.get(\"web_session\")\n        \n        # If web_session has changed, consider the login successful\n        if current_web_session and current_web_session != no_logged_in_session:\n            utils.logger.info(\"[XiaoHongShuLogin.check_login_state] Login status confirmed by Cookie (web_session changed).\")\n            return True\n\n        return False\n\n    async def begin(self):\n        \"\"\"Start login xiaohongshu\"\"\"\n        utils.logger.info(\"[XiaoHongShuLogin.begin] Begin login xiaohongshu ...\")\n        if config.LOGIN_TYPE == \"qrcode\":\n            await self.login_by_qrcode()\n        elif config.LOGIN_TYPE == \"phone\":\n            await self.login_by_mobile()\n        elif config.LOGIN_TYPE == \"cookie\":\n            await self.login_by_cookies()\n        else:\n            raise ValueError(\"[XiaoHongShuLogin.begin]I nvalid Login Type Currently only supported qrcode or phone or cookies ...\")\n\n    async def login_by_mobile(self):\n        \"\"\"Login xiaohongshu by mobile\"\"\"\n        utils.logger.info(\"[XiaoHongShuLogin.login_by_mobile] Begin login xiaohongshu by mobile ...\")\n        await asyncio.sleep(1)\n        try:\n            # After entering Xiaohongshu homepage, the login dialog may not pop up automatically, need to manually click login button\n            login_button_ele = await self.context_page.wait_for_selector(\n                selector=\"xpath=//*[@id='app']/div[1]/div[2]/div[1]/ul/div[1]/button\",\n                timeout=5000\n            )\n            await login_button_ele.click()\n            # The login dialog has two forms: one shows phone number and verification code directly\n            # The other requires clicking to switch to phone login\n            element = await self.context_page.wait_for_selector(\n                selector='xpath=//div[@class=\"login-container\"]//div[@class=\"other-method\"]/div[1]',\n                timeout=5000\n            )\n            await element.click()\n        except Exception as e:\n            utils.logger.info(\"[XiaoHongShuLogin.login_by_mobile] have not found mobile button icon and keep going ...\")\n\n        await asyncio.sleep(1)\n        login_container_ele = await self.context_page.wait_for_selector(\"div.login-container\")\n        input_ele = await login_container_ele.query_selector(\"label.phone > input\")\n        await input_ele.fill(self.login_phone)\n        await asyncio.sleep(0.5)\n\n        send_btn_ele = await login_container_ele.query_selector(\"label.auth-code > span\")\n        await send_btn_ele.click()  # Click to send verification code\n        sms_code_input_ele = await login_container_ele.query_selector(\"label.auth-code > input\")\n        submit_btn_ele = await login_container_ele.query_selector(\"div.input-container > button\")\n        cache_client = CacheFactory.create_cache(config.CACHE_TYPE_MEMORY)\n        max_get_sms_code_time = 60 * 2  # Maximum time to get verification code is 2 minutes\n        no_logged_in_session = \"\"\n        while max_get_sms_code_time > 0:\n            utils.logger.info(f\"[XiaoHongShuLogin.login_by_mobile] get sms code from redis remaining time {max_get_sms_code_time}s ...\")\n            await asyncio.sleep(1)\n            sms_code_key = f\"xhs_{self.login_phone}\"\n            sms_code_value = cache_client.get(sms_code_key)\n            if not sms_code_value:\n                max_get_sms_code_time -= 1\n                continue\n\n            current_cookie = await self.browser_context.cookies()\n            _, cookie_dict = utils.convert_cookies(current_cookie)\n            no_logged_in_session = cookie_dict.get(\"web_session\")\n\n            await sms_code_input_ele.fill(value=sms_code_value.decode())  # Enter SMS verification code\n            await asyncio.sleep(0.5)\n            agree_privacy_ele = self.context_page.locator(\"xpath=//div[@class='agreements']//*[local-name()='svg']\")\n            await agree_privacy_ele.click()  # Click to agree to privacy policy\n            await asyncio.sleep(0.5)\n\n            await submit_btn_ele.click()  # Click login\n\n            # TODO: Should also check if the verification code is correct, as it may be incorrect\n            break\n\n        try:\n            await self.check_login_state(no_logged_in_session)\n        except RetryError:\n            utils.logger.info(\"[XiaoHongShuLogin.login_by_mobile] Login xiaohongshu failed by mobile login method ...\")\n            sys.exit()\n\n        wait_redirect_seconds = 5\n        utils.logger.info(f\"[XiaoHongShuLogin.login_by_mobile] Login successful then wait for {wait_redirect_seconds} seconds redirect ...\")\n        await asyncio.sleep(wait_redirect_seconds)\n\n    async def login_by_qrcode(self):\n        \"\"\"login xiaohongshu website and keep webdriver login state\"\"\"\n        utils.logger.info(\"[XiaoHongShuLogin.login_by_qrcode] Begin login xiaohongshu by qrcode ...\")\n        # login_selector = \"div.login-container > div.left > div.qrcode > img\"\n        qrcode_img_selector = \"xpath=//img[@class='qrcode-img']\"\n        # find login qrcode\n        base64_qrcode_img = await utils.find_login_qrcode(\n            self.context_page,\n            selector=qrcode_img_selector\n        )\n        if not base64_qrcode_img:\n            utils.logger.info(\"[XiaoHongShuLogin.login_by_qrcode] login failed , have not found qrcode please check ....\")\n            # if this website does not automatically popup login dialog box, we will manual click login button\n            await asyncio.sleep(0.5)\n            login_button_ele = self.context_page.locator(\"xpath=//*[@id='app']/div[1]/div[2]/div[1]/ul/div[1]/button\")\n            await login_button_ele.click()\n            base64_qrcode_img = await utils.find_login_qrcode(\n                self.context_page,\n                selector=qrcode_img_selector\n            )\n            if not base64_qrcode_img:\n                sys.exit()\n\n        # get not logged session\n        current_cookie = await self.browser_context.cookies()\n        _, cookie_dict = utils.convert_cookies(current_cookie)\n        no_logged_in_session = cookie_dict.get(\"web_session\")\n\n        # show login qrcode\n        # fix issue #12\n        # we need to use partial function to call show_qrcode function and run in executor\n        # then current asyncio event loop will not be blocked\n        partial_show_qrcode = functools.partial(utils.show_qrcode, base64_qrcode_img)\n        asyncio.get_running_loop().run_in_executor(executor=None, func=partial_show_qrcode)\n\n        utils.logger.info(f\"[XiaoHongShuLogin.login_by_qrcode] waiting for scan code login, remaining time is 120s\")\n        try:\n            await self.check_login_state(no_logged_in_session)\n        except RetryError:\n            utils.logger.info(\"[XiaoHongShuLogin.login_by_qrcode] Login xiaohongshu failed by qrcode login method ...\")\n            sys.exit()\n\n        wait_redirect_seconds = 5\n        utils.logger.info(f\"[XiaoHongShuLogin.login_by_qrcode] Login successful then wait for {wait_redirect_seconds} seconds redirect ...\")\n        await asyncio.sleep(wait_redirect_seconds)\n\n    async def login_by_cookies(self):\n        \"\"\"login xiaohongshu website by cookies\"\"\"\n        utils.logger.info(\"[XiaoHongShuLogin.login_by_cookies] Begin login xiaohongshu by cookie ...\")\n        for key, value in utils.convert_str_cookie_to_dict(self.cookie_str).items():\n            if key != \"web_session\":  # Only set web_session cookie attribute\n                continue\n            await self.browser_context.add_cookies([{\n                'name': key,\n                'value': value,\n                'domain': \".xiaohongshu.com\",\n                'path': \"/\"\n            }])\n"
  },
  {
    "path": "media_platform/xhs/playwright_sign.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/xhs/playwright_sign.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# Generate Xiaohongshu signature by calling window.mnsv2 via Playwright injection\n\nimport hashlib\nimport json\nimport time\nfrom typing import Any, Dict, Optional, Union\nfrom urllib.parse import urlparse, quote\n\nfrom playwright.async_api import Page\n\nfrom .xhs_sign import b64_encode, encode_utf8, get_trace_id, mrc\n\n\ndef _build_sign_string(uri: str, data: Optional[Union[Dict, str]] = None, method: str = \"POST\") -> str:\n    \"\"\"Build string to be signed\n\n    Args:\n        uri: API path\n        data: Request data\n        method: Request method (GET or POST)\n\n    Returns:\n        String to be signed\n    \"\"\"\n    if method.upper() == \"POST\":\n        # POST request uses JSON format\n        c = uri\n        if data is not None:\n            if isinstance(data, dict):\n                c += json.dumps(data, separators=(\",\", \":\"), ensure_ascii=False)\n            elif isinstance(data, str):\n                c += data\n        return c\n    else:\n        # GET request uses query string format\n        if not data or (isinstance(data, dict) and len(data) == 0):\n            return uri\n\n        if isinstance(data, dict):\n            params = []\n            for key in data.keys():\n                value = data[key]\n                if isinstance(value, list):\n                    value_str = \",\".join(str(v) for v in value)\n                elif value is not None:\n                    value_str = str(value)\n                else:\n                    value_str = \"\"\n                # Use URL encoding (safe parameter preserves certain characters from encoding)\n                # Note: httpx will encode commas, equals signs, etc., we need to handle the same way\n                value_str = quote(value_str, safe='')\n                params.append(f\"{key}={value_str}\")\n            return f\"{uri}?{'&'.join(params)}\"\n        elif isinstance(data, str):\n            return f\"{uri}?{data}\"\n        return uri\n\n\ndef _md5_hex(s: str) -> str:\n    \"\"\"Calculate MD5 hash value\"\"\"\n    return hashlib.md5(s.encode(\"utf-8\")).hexdigest()\n\n\ndef _build_xs_payload(x3_value: str, data_type: str = \"object\") -> str:\n    \"\"\"Build x-s signature\"\"\"\n    s = {\n        \"x0\": \"4.2.1\",\n        \"x1\": \"xhs-pc-web\",\n        \"x2\": \"Mac OS\",\n        \"x3\": x3_value,\n        \"x4\": data_type,\n    }\n    return \"XYS_\" + b64_encode(encode_utf8(json.dumps(s, separators=(\",\", \":\"))))\n\n\ndef _build_xs_common(a1: str, b1: str, x_s: str, x_t: str) -> str:\n    \"\"\"Build x-s-common request header\"\"\"\n    payload = {\n        \"s0\": 3,\n        \"s1\": \"\",\n        \"x0\": \"1\",\n        \"x1\": \"4.2.2\",\n        \"x2\": \"Mac OS\",\n        \"x3\": \"xhs-pc-web\",\n        \"x4\": \"4.74.0\",\n        \"x5\": a1,\n        \"x6\": x_t,\n        \"x7\": x_s,\n        \"x8\": b1,\n        \"x9\": mrc(x_t + x_s + b1),\n        \"x10\": 154,\n        \"x11\": \"normal\",\n    }\n    return b64_encode(encode_utf8(json.dumps(payload, separators=(\",\", \":\"))))\n\n\nasync def get_b1_from_localstorage(page: Page) -> str:\n    \"\"\"Get b1 value from localStorage\"\"\"\n    try:\n        local_storage = await page.evaluate(\"() => window.localStorage\")\n        return local_storage.get(\"b1\", \"\")\n    except Exception:\n        return \"\"\n\n\nasync def call_mnsv2(page: Page, sign_str: str, md5_str: str) -> str:\n    \"\"\"\n    Call window.mnsv2 function via playwright\n\n    Args:\n        page: playwright Page object\n        sign_str: String to be signed (uri + JSON.stringify(data))\n        md5_str: MD5 hash value of sign_str\n\n    Returns:\n        Signature string returned by mnsv2\n    \"\"\"\n    sign_str_escaped = sign_str.replace(\"\\\\\", \"\\\\\\\\\").replace(\"'\", \"\\\\'\").replace(\"\\n\", \"\\\\n\")\n    md5_str_escaped = md5_str.replace(\"\\\\\", \"\\\\\\\\\").replace(\"'\", \"\\\\'\")\n\n    try:\n        result = await page.evaluate(f\"window.mnsv2('{sign_str_escaped}', '{md5_str_escaped}')\")\n        return result if result else \"\"\n    except Exception:\n        return \"\"\n\n\nasync def sign_xs_with_playwright(\n    page: Page,\n    uri: str,\n    data: Optional[Union[Dict, str]] = None,\n    method: str = \"POST\",\n) -> str:\n    \"\"\"\n    Generate x-s signature via playwright injection\n\n    Args:\n        page: playwright Page object (must have Xiaohongshu page open)\n        uri: API path, e.g., \"/api/sns/web/v1/search/notes\"\n        data: Request data (GET params or POST payload)\n        method: Request method (GET or POST)\n\n    Returns:\n        x-s signature string\n    \"\"\"\n    sign_str = _build_sign_string(uri, data, method)\n    md5_str = _md5_hex(sign_str)\n    x3_value = await call_mnsv2(page, sign_str, md5_str)\n    data_type = \"object\" if isinstance(data, (dict, list)) else \"string\"\n    return _build_xs_payload(x3_value, data_type)\n\n\nasync def sign_with_playwright(\n    page: Page,\n    uri: str,\n    data: Optional[Union[Dict, str]] = None,\n    a1: str = \"\",\n    method: str = \"POST\",\n) -> Dict[str, Any]:\n    \"\"\"\n    Generate complete signature request headers via playwright\n\n    Args:\n        page: playwright Page object (must have Xiaohongshu page open)\n        uri: API path\n        data: Request data\n        a1: a1 value from cookie\n        method: Request method (GET or POST)\n\n    Returns:\n        Dictionary containing x-s, x-t, x-s-common, x-b3-traceid\n    \"\"\"\n    b1 = await get_b1_from_localstorage(page)\n    x_s = await sign_xs_with_playwright(page, uri, data, method)\n    x_t = str(int(time.time() * 1000))\n\n    return {\n        \"x-s\": x_s,\n        \"x-t\": x_t,\n        \"x-s-common\": _build_xs_common(a1, b1, x_s, x_t),\n        \"x-b3-traceid\": get_trace_id(),\n    }\n\n\nasync def pre_headers_with_playwright(\n    page: Page,\n    url: str,\n    cookie_dict: Dict[str, str],\n    params: Optional[Dict] = None,\n    payload: Optional[Dict] = None,\n) -> Dict[str, str]:\n    \"\"\"\n    Generate request header signature using playwright injection method\n    Can directly replace _pre_headers method in client.py\n\n    Args:\n        page: playwright Page object\n        url: Request URL\n        cookie_dict: Cookie dictionary\n        params: GET request parameters\n        payload: POST request parameters\n\n    Returns:\n        Signed request header dictionary\n    \"\"\"\n    a1_value = cookie_dict.get(\"a1\", \"\")\n    uri = urlparse(url).path\n\n    # Determine request data and method\n    if params is not None:\n        data = params\n        method = \"GET\"\n    elif payload is not None:\n        data = payload\n        method = \"POST\"\n    else:\n        raise ValueError(\"params or payload is required\")\n\n    signs = await sign_with_playwright(page, uri, data, a1_value, method)\n\n    return {\n        \"X-S\": signs[\"x-s\"],\n        \"X-T\": signs[\"x-t\"],\n        \"x-S-Common\": signs[\"x-s-common\"],\n        \"X-B3-Traceid\": signs[\"x-b3-traceid\"],\n    }\n"
  },
  {
    "path": "media_platform/xhs/xhs_sign.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/xhs/xhs_sign.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# Xiaohongshu signature algorithm core functions\n# Used for generating signatures via playwright injection\n\nimport ctypes\nimport random\nfrom urllib.parse import quote\n\n# Custom Base64 character table\n# Standard Base64: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\n# Xiaohongshu shuffled order for obfuscation\nBASE64_CHARS = list(\"ZmserbBoHQtNP+wOcza/LpngG8yJq42KWYj0DSfdikx3VT16IlUAFM97hECvuRX5\")\n\n# CRC32 lookup table\nCRC32_TABLE = [\n    0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, 3915621685,\n    2657392035, 249268274, 2044508324, 3772115230, 2547177864, 162941995,\n    2125561021, 3887607047, 2428444049, 498536548, 1789927666, 4089016648,\n    2227061214, 450548861, 1843258603, 4107580753, 2211677639, 325883990,\n    1684777152, 4251122042, 2321926636, 335633487, 1661365465, 4195302755,\n    2366115317, 997073096, 1281953886, 3579855332, 2724688242, 1006888145,\n    1258607687, 3524101629, 2768942443, 901097722, 1119000684, 3686517206,\n    2898065728, 853044451, 1172266101, 3705015759, 2882616665, 651767980,\n    1373503546, 3369554304, 3218104598, 565507253, 1454621731, 3485111705,\n    3099436303, 671266974, 1594198024, 3322730930, 2970347812, 795835527,\n    1483230225, 3244367275, 3060149565, 1994146192, 31158534, 2563907772,\n    4023717930, 1907459465, 112637215, 2680153253, 3904427059, 2013776290,\n    251722036, 2517215374, 3775830040, 2137656763, 141376813, 2439277719,\n    3865271297, 1802195444, 476864866, 2238001368, 4066508878, 1812370925,\n    453092731, 2181625025, 4111451223, 1706088902, 314042704, 2344532202,\n    4240017532, 1658658271, 366619977, 2362670323, 4224994405, 1303535960,\n    984961486, 2747007092, 3569037538, 1256170817, 1037604311, 2765210733,\n    3554079995, 1131014506, 879679996, 2909243462, 3663771856, 1141124467,\n    855842277, 2852801631, 3708648649, 1342533948, 654459306, 3188396048,\n    3373015174, 1466479909, 544179635, 3110523913, 3462522015, 1591671054,\n    702138776, 2966460450, 3352799412, 1504918807, 783551873, 3082640443,\n    3233442989, 3988292384, 2596254646, 62317068, 1957810842, 3939845945,\n    2647816111, 81470997, 1943803523, 3814918930, 2489596804, 225274430,\n    2053790376, 3826175755, 2466906013, 167816743, 2097651377, 4027552580,\n    2265490386, 503444072, 1762050814, 4150417245, 2154129355, 426522225,\n    1852507879, 4275313526, 2312317920, 282753626, 1742555852, 4189708143,\n    2394877945, 397917763, 1622183637, 3604390888, 2714866558, 953729732,\n    1340076626, 3518719985, 2797360999, 1068828381, 1219638859, 3624741850,\n    2936675148, 906185462, 1090812512, 3747672003, 2825379669, 829329135,\n    1181335161, 3412177804, 3160834842, 628085408, 1382605366, 3423369109,\n    3138078467, 570562233, 1426400815, 3317316542, 2998733608, 733239954,\n    1555261956, 3268935591, 3050360625, 752459403, 1541320221, 2607071920,\n    3965973030, 1969922972, 40735498, 2617837225, 3943577151, 1913087877,\n    83908371, 2512341634, 3803740692, 2075208622, 213261112, 2463272603,\n    3855990285, 2094854071, 198958881, 2262029012, 4057260610, 1759359992,\n    534414190, 2176718541, 4139329115, 1873836001, 414664567, 2282248934,\n    4279200368, 1711684554, 285281116, 2405801727, 4167216745, 1634467795,\n    376229701, 2685067896, 3608007406, 1308918612, 956543938, 2808555105,\n    3495958263, 1231636301, 1047427035, 2932959818, 3654703836, 1088359270,\n    936918000, 2847714899, 3736837829, 1202900863, 817233897, 3183342108,\n    3401237130, 1404277552, 615818150, 3134207493, 3453421203, 1423857449,\n    601450431, 3009837614, 3294710456, 1567103746, 711928724, 3020668471,\n    3272380065, 1510334235, 755167117,\n]\n\n\ndef _right_shift_unsigned(num: int, bit: int = 0) -> int:\n    \"\"\"Python implementation of JavaScript unsigned right shift (>>>)\"\"\"\n    val = ctypes.c_uint32(num).value >> bit\n    MAX32INT = 4294967295\n    return (val + (MAX32INT + 1)) % (2 * (MAX32INT + 1)) - MAX32INT - 1\n\n\ndef mrc(e: str) -> int:\n    \"\"\"CRC32 variant, used for x9 field in x-s-common\"\"\"\n    o = -1\n    for n in range(min(57, len(e))):\n        o = CRC32_TABLE[(o & 255) ^ ord(e[n])] ^ _right_shift_unsigned(o, 8)\n    return o ^ -1 ^ 3988292384\n\n\ndef _triplet_to_base64(e: int) -> str:\n    \"\"\"Convert 24-bit integer to 4 Base64 characters\"\"\"\n    return (\n        BASE64_CHARS[(e >> 18) & 63]\n        + BASE64_CHARS[(e >> 12) & 63]\n        + BASE64_CHARS[(e >> 6) & 63]\n        + BASE64_CHARS[e & 63]\n    )\n\n\ndef _encode_chunk(data: list, start: int, end: int) -> str:\n    \"\"\"Encode data chunk\"\"\"\n    result = []\n    for i in range(start, end, 3):\n        c = ((data[i] << 16) & 0xFF0000) + ((data[i + 1] << 8) & 0xFF00) + (data[i + 2] & 0xFF)\n        result.append(_triplet_to_base64(c))\n    return \"\".join(result)\n\n\ndef encode_utf8(s: str) -> list:\n    \"\"\"Encode string to UTF-8 byte list\"\"\"\n    encoded = quote(s, safe=\"~()*!.'\")\n    result = []\n    i = 0\n    while i < len(encoded):\n        if encoded[i] == \"%\":\n            result.append(int(encoded[i + 1: i + 3], 16))\n            i += 3\n        else:\n            result.append(ord(encoded[i]))\n            i += 1\n    return result\n\n\ndef b64_encode(data: list) -> str:\n    \"\"\"Custom Base64 encoding\"\"\"\n    length = len(data)\n    remainder = length % 3\n    chunks = []\n\n    main_length = length - remainder\n    for i in range(0, main_length, 16383):\n        chunks.append(_encode_chunk(data, i, min(i + 16383, main_length)))\n\n    if remainder == 1:\n        a = data[length - 1]\n        chunks.append(BASE64_CHARS[a >> 2] + BASE64_CHARS[(a << 4) & 63] + \"==\")\n    elif remainder == 2:\n        a = (data[length - 2] << 8) + data[length - 1]\n        chunks.append(\n            BASE64_CHARS[a >> 10] + BASE64_CHARS[(a >> 4) & 63] + BASE64_CHARS[(a << 2) & 63] + \"=\"\n        )\n\n    return \"\".join(chunks)\n\n\ndef get_trace_id() -> str:\n    \"\"\"Generate trace id for link tracing\"\"\"\n    return \"\".join(random.choice(\"abcdef0123456789\") for _ in range(16))\n"
  },
  {
    "path": "media_platform/zhihu/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/zhihu/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\nfrom .core import ZhihuCrawler\n"
  },
  {
    "path": "media_platform/zhihu/client.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/zhihu/client.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# -*- coding: utf-8 -*-\nimport asyncio\nimport json\nfrom typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Union\nfrom urllib.parse import urlencode\n\nimport httpx\nfrom httpx import Response\nfrom playwright.async_api import BrowserContext, Page\nfrom tools.httpx_util import make_async_client\nfrom tenacity import retry, stop_after_attempt, wait_fixed\n\nimport config\nfrom base.base_crawler import AbstractApiClient\nfrom constant import zhihu as zhihu_constant\nfrom model.m_zhihu import ZhihuComment, ZhihuContent, ZhihuCreator\nfrom proxy.proxy_mixin import ProxyRefreshMixin\nfrom tools import utils\n\nif TYPE_CHECKING:\n    from proxy.proxy_ip_pool import ProxyIpPool\n\nfrom .exception import DataFetchError, ForbiddenError\nfrom .field import SearchSort, SearchTime, SearchType\nfrom .help import ZhihuExtractor, sign\n\n\nclass ZhiHuClient(AbstractApiClient, ProxyRefreshMixin):\n\n    def __init__(\n        self,\n        timeout=10,\n        proxy=None,\n        *,\n        headers: Dict[str, str],\n        playwright_page: Page,\n        cookie_dict: Dict[str, str],\n        proxy_ip_pool: Optional[\"ProxyIpPool\"] = None,\n    ):\n        self.proxy = proxy\n        self.timeout = timeout\n        self.default_headers = headers\n        self.cookie_dict = cookie_dict\n        self._extractor = ZhihuExtractor()\n        # Initialize proxy pool (from ProxyRefreshMixin)\n        self.init_proxy_pool(proxy_ip_pool)\n\n    async def _pre_headers(self, url: str) -> Dict:\n        \"\"\"\n        Sign request headers\n        Args:\n            url: Request URL with query parameters\n        Returns:\n\n        \"\"\"\n        d_c0 = self.cookie_dict.get(\"d_c0\")\n        if not d_c0:\n            raise Exception(\"d_c0 not found in cookies\")\n        sign_res = sign(url, self.default_headers[\"cookie\"])\n        headers = self.default_headers.copy()\n        headers['x-zst-81'] = sign_res[\"x-zst-81\"]\n        headers['x-zse-96'] = sign_res[\"x-zse-96\"]\n        return headers\n\n    @retry(stop=stop_after_attempt(3), wait=wait_fixed(1))\n    async def request(self, method, url, **kwargs) -> Union[str, Any]:\n        \"\"\"\n        Wrapper for httpx common request method with response handling\n        Args:\n            method: Request method\n            url: Request URL\n            **kwargs: Other request parameters such as headers, body, etc.\n\n        Returns:\n\n        \"\"\"\n        # Check if proxy is expired before each request\n        await self._refresh_proxy_if_expired()\n\n        # return response.text\n        return_response = kwargs.pop('return_response', False)\n\n        async with make_async_client(proxy=self.proxy) as client:\n            response = await client.request(method, url, timeout=self.timeout, **kwargs)\n\n        if response.status_code != 200:\n            utils.logger.error(f\"[ZhiHuClient.request] Requset Url: {url}, Request error: {response.text}\")\n            if response.status_code == 403:\n                raise ForbiddenError(response.text)\n            elif response.status_code == 404:  # Content without comments also returns 404\n                return {}\n\n            raise DataFetchError(response.text)\n\n        if return_response:\n            return response.text\n        try:\n            data: Dict = response.json()\n            if data.get(\"error\"):\n                utils.logger.error(f\"[ZhiHuClient.request] Request error: {data}\")\n                raise DataFetchError(data.get(\"error\", {}).get(\"message\"))\n            return data\n        except json.JSONDecodeError:\n            utils.logger.error(f\"[ZhiHuClient.request] Request error: {response.text}\")\n            raise DataFetchError(response.text)\n\n    async def get(self, uri: str, params=None, **kwargs) -> Union[Response, Dict, str]:\n        \"\"\"\n        GET request with header signing\n        Args:\n            uri: Request URI\n            params: Request parameters\n\n        Returns:\n\n        \"\"\"\n        final_uri = uri\n        if isinstance(params, dict):\n            final_uri += '?' + urlencode(params)\n        headers = await self._pre_headers(final_uri)\n        base_url = (zhihu_constant.ZHIHU_URL if \"/p/\" not in uri else zhihu_constant.ZHIHU_ZHUANLAN_URL)\n        return await self.request(method=\"GET\", url=base_url + final_uri, headers=headers, **kwargs)\n\n    async def pong(self) -> bool:\n        \"\"\"\n        Check if login status is still valid\n        Returns:\n\n        \"\"\"\n        utils.logger.info(\"[ZhiHuClient.pong] Begin to pong zhihu...\")\n        ping_flag = False\n        try:\n            res = await self.get_current_user_info()\n            if res.get(\"uid\") and res.get(\"name\"):\n                ping_flag = True\n                utils.logger.info(\"[ZhiHuClient.pong] Ping zhihu successfully\")\n            else:\n                utils.logger.error(f\"[ZhiHuClient.pong] Ping zhihu failed, response data: {res}\")\n        except Exception as e:\n            utils.logger.error(f\"[ZhiHuClient.pong] Ping zhihu failed: {e}, and try to login again...\")\n            ping_flag = False\n        return ping_flag\n\n    async def update_cookies(self, browser_context: BrowserContext):\n        \"\"\"\n        Update cookies method provided by API client, typically called after successful login\n        Args:\n            browser_context: Browser context object\n\n        Returns:\n\n        \"\"\"\n        cookie_str, cookie_dict = utils.convert_cookies(await browser_context.cookies())\n        self.default_headers[\"cookie\"] = cookie_str\n        self.cookie_dict = cookie_dict\n\n    async def get_current_user_info(self) -> Dict:\n        \"\"\"\n        Get current logged-in user information\n        Returns:\n\n        \"\"\"\n        params = {\"include\": \"email,is_active,is_bind_phone\"}\n        return await self.get(\"/api/v4/me\", params)\n\n    async def get_note_by_keyword(\n        self,\n        keyword: str,\n        page: int = 1,\n        page_size: int = 20,\n        sort: SearchSort = SearchSort.DEFAULT,\n        note_type: SearchType = SearchType.DEFAULT,\n        search_time: SearchTime = SearchTime.DEFAULT,\n    ) -> List[ZhihuContent]:\n        \"\"\"\n        Search by keyword\n        Args:\n            keyword: Search keyword\n            page: Page number\n            page_size: Page size\n            sort: Sorting method\n            note_type: Search result type\n            search_time: Time range for search results\n\n        Returns:\n\n        \"\"\"\n        uri = \"/api/v4/search_v3\"\n        params = {\n            \"gk_version\": \"gz-gaokao\",\n            \"t\": \"general\",\n            \"q\": keyword,\n            \"correction\": 1,\n            \"offset\": (page - 1) * page_size,\n            \"limit\": page_size,\n            \"filter_fields\": \"\",\n            \"lc_idx\": (page - 1) * page_size,\n            \"show_all_topics\": 0,\n            \"search_source\": \"Filter\",\n            \"time_interval\": search_time.value,\n            \"sort\": sort.value,\n            \"vertical\": note_type.value,\n        }\n        search_res = await self.get(uri, params)\n        utils.logger.info(f\"[ZhiHuClient.get_note_by_keyword] Search result: {search_res}\")\n        return self._extractor.extract_contents_from_search(search_res)\n\n    async def get_root_comments(\n        self,\n        content_id: str,\n        content_type: str,\n        offset: str = \"\",\n        limit: int = 10,\n        order_by: str = \"score\",\n    ) -> Dict:\n        \"\"\"\n        Get root-level comments for content\n        Args:\n            content_id: Content ID\n            content_type: Content type (answer, article, zvideo)\n            offset:\n            limit:\n            order_by:\n\n        Returns:\n\n        \"\"\"\n        uri = f\"/api/v4/comment_v5/{content_type}s/{content_id}/root_comment\"\n        params = {\"order\": order_by, \"offset\": offset, \"limit\": limit}\n        return await self.get(uri, params)\n        # uri = f\"/api/v4/{content_type}s/{content_id}/root_comments\"\n        # params = {\n        #     \"order\": order_by,\n        #     \"offset\": offset,\n        #     \"limit\": limit\n        # }\n        # return await self.get(uri, params)\n\n    async def get_child_comments(\n        self,\n        root_comment_id: str,\n        offset: str = \"\",\n        limit: int = 10,\n        order_by: str = \"sort\",\n    ) -> Dict:\n        \"\"\"\n        Get child comments under a root comment\n        Args:\n            root_comment_id:\n            offset:\n            limit:\n            order_by:\n\n        Returns:\n\n        \"\"\"\n        uri = f\"/api/v4/comment_v5/comment/{root_comment_id}/child_comment\"\n        params = {\n            \"order\": order_by,\n            \"offset\": offset,\n            \"limit\": limit,\n        }\n        return await self.get(uri, params)\n\n    async def get_note_all_comments(\n        self,\n        content: ZhihuContent,\n        crawl_interval: float = 1.0,\n        callback: Optional[Callable] = None,\n    ) -> List[ZhihuComment]:\n        \"\"\"\n        Get all root-level comments for a specified post, this method will retrieve all comment information under a post\n        Args:\n            content: Content detail object (question|article|video)\n            crawl_interval: Crawl delay interval in seconds\n            callback: Callback after completing one crawl\n\n        Returns:\n\n        \"\"\"\n        result: List[ZhihuComment] = []\n        is_end: bool = False\n        offset: str = \"\"\n        prev_offset: str = \"\"\n        limit: int = 10\n        while not is_end:\n            prev_offset = offset\n            root_comment_res = await self.get_root_comments(content.content_id, content.content_type, offset, limit)\n            if not root_comment_res:\n                break\n            paging_info = root_comment_res.get(\"paging\", {})\n            is_end = paging_info.get(\"is_end\")\n            offset = self._extractor.extract_offset(paging_info)\n            comments = self._extractor.extract_comments(content, root_comment_res.get(\"data\"))\n\n            if not comments:\n                break\n\n            if prev_offset == offset:\n                break\n\n            if callback:\n                await callback(comments)\n\n            result.extend(comments)\n            await self.get_comments_all_sub_comments(content, comments, crawl_interval=crawl_interval, callback=callback)\n            await asyncio.sleep(crawl_interval)\n        return result\n\n    async def get_comments_all_sub_comments(\n        self,\n        content: ZhihuContent,\n        comments: List[ZhihuComment],\n        crawl_interval: float = 1.0,\n        callback: Optional[Callable] = None,\n    ) -> List[ZhihuComment]:\n        \"\"\"\n        Get all sub-comments under specified comments\n        Args:\n            content: Content detail object (question|article|video)\n            comments: Comment list\n            crawl_interval: Crawl delay interval in seconds\n            callback: Callback after completing one crawl\n\n        Returns:\n\n        \"\"\"\n        if not config.ENABLE_GET_SUB_COMMENTS:\n            return []\n\n        all_sub_comments: List[ZhihuComment] = []\n        for parment_comment in comments:\n            if parment_comment.sub_comment_count == 0:\n                continue\n\n            is_end: bool = False\n            offset: str = \"\"\n            prev_offset: str = \"\"\n            limit: int = 10\n            while not is_end:\n                prev_offset = offset\n                child_comment_res = await self.get_child_comments(parment_comment.comment_id, offset, limit)\n                if not child_comment_res:\n                    break\n                paging_info = child_comment_res.get(\"paging\", {})\n                is_end = paging_info.get(\"is_end\")\n                offset = self._extractor.extract_offset(paging_info)\n                sub_comments = self._extractor.extract_comments(content, child_comment_res.get(\"data\"))\n\n                if not sub_comments:\n                    break\n\n                if prev_offset == offset:\n                    break\n\n                if callback:\n                    await callback(sub_comments)\n\n                all_sub_comments.extend(sub_comments)\n                await asyncio.sleep(crawl_interval)\n        return all_sub_comments\n\n    async def get_creator_info(self, url_token: str) -> Optional[ZhihuCreator]:\n        \"\"\"\n        Get creator information\n        Args:\n            url_token:\n\n        Returns:\n\n        \"\"\"\n        uri = f\"/people/{url_token}\"\n        html_content: str = await self.get(uri, return_response=True)\n        return self._extractor.extract_creator(url_token, html_content)\n\n    async def get_creator_answers(self, url_token: str, offset: int = 0, limit: int = 20) -> Dict:\n        \"\"\"\n        Get creator's answers\n        Args:\n            url_token:\n            offset:\n            limit:\n\n        Returns:\n\n\n        \"\"\"\n        uri = f\"/api/v4/members/{url_token}/answers\"\n        params = {\n            \"include\":\n            \"data[*].is_normal,admin_closed_comment,reward_info,is_collapsed,annotation_action,annotation_detail,collapse_reason,collapsed_by,suggest_edit,comment_count,can_comment,content,editable_content,attachment,voteup_count,reshipment_settings,comment_permission,created_time,updated_time,review_info,excerpt,paid_info,reaction_instruction,is_labeled,label_info,relationship.is_authorized,voting,is_author,is_thanked,is_nothelp;data[*].vessay_info;data[*].author.badge[?(type=best_answerer)].topics;data[*].author.vip_info;data[*].question.has_publishing_draft,relationship\",\n            \"offset\": offset,\n            \"limit\": limit,\n            \"order_by\": \"created\"\n        }\n        return await self.get(uri, params)\n\n    async def get_creator_articles(self, url_token: str, offset: int = 0, limit: int = 20) -> Dict:\n        \"\"\"\n        Get creator's articles\n        Args:\n            url_token:\n            offset:\n            limit:\n\n        Returns:\n\n        \"\"\"\n        uri = f\"/api/v4/members/{url_token}/articles\"\n        params = {\n            \"include\":\n            \"data[*].comment_count,suggest_edit,is_normal,thumbnail_extra_info,thumbnail,can_comment,comment_permission,admin_closed_comment,content,voteup_count,created,updated,upvoted_followees,voting,review_info,reaction_instruction,is_labeled,label_info;data[*].vessay_info;data[*].author.badge[?(type=best_answerer)].topics;data[*].author.vip_info;\",\n            \"offset\": offset,\n            \"limit\": limit,\n            \"order_by\": \"created\"\n        }\n        return await self.get(uri, params)\n\n    async def get_creator_videos(self, url_token: str, offset: int = 0, limit: int = 20) -> Dict:\n        \"\"\"\n        Get creator's videos\n        Args:\n            url_token:\n            offset:\n            limit:\n\n        Returns:\n\n        \"\"\"\n        uri = f\"/api/v4/members/{url_token}/zvideos\"\n        params = {\n            \"include\": \"similar_zvideo,creation_relationship,reaction_instruction\",\n            \"offset\": offset,\n            \"limit\": limit,\n            \"similar_aggregation\": \"true\",\n        }\n        return await self.get(uri, params)\n\n    async def get_all_anwser_by_creator(self, creator: ZhihuCreator, crawl_interval: float = 1.0, callback: Optional[Callable] = None) -> List[ZhihuContent]:\n        \"\"\"\n        Get all answers by creator\n        Args:\n            creator: Creator information\n            crawl_interval: Crawl delay interval in seconds\n            callback: Callback after completing one crawl\n\n        Returns:\n\n        \"\"\"\n        all_contents: List[ZhihuContent] = []\n        is_end: bool = False\n        offset: int = 0\n        limit: int = 20\n        while not is_end:\n            res = await self.get_creator_answers(creator.url_token, offset, limit)\n            if not res:\n                break\n            utils.logger.info(f\"[ZhiHuClient.get_all_anwser_by_creator] Get creator {creator.url_token} answers: {res}\")\n            paging_info = res.get(\"paging\", {})\n            is_end = paging_info.get(\"is_end\")\n            contents = self._extractor.extract_content_list_from_creator(res.get(\"data\"))\n            if callback:\n                await callback(contents)\n            all_contents.extend(contents)\n            offset += limit\n            await asyncio.sleep(crawl_interval)\n        return all_contents\n\n    async def get_all_articles_by_creator(\n        self,\n        creator: ZhihuCreator,\n        crawl_interval: float = 1.0,\n        callback: Optional[Callable] = None,\n    ) -> List[ZhihuContent]:\n        \"\"\"\n        Get all articles by creator\n        Args:\n            creator:\n            crawl_interval:\n            callback:\n\n        Returns:\n\n        \"\"\"\n        all_contents: List[ZhihuContent] = []\n        is_end: bool = False\n        offset: int = 0\n        limit: int = 20\n        while not is_end:\n            res = await self.get_creator_articles(creator.url_token, offset, limit)\n            if not res:\n                break\n            paging_info = res.get(\"paging\", {})\n            is_end = paging_info.get(\"is_end\")\n            contents = self._extractor.extract_content_list_from_creator(res.get(\"data\"))\n            if callback:\n                await callback(contents)\n            all_contents.extend(contents)\n            offset += limit\n            await asyncio.sleep(crawl_interval)\n        return all_contents\n\n    async def get_all_videos_by_creator(\n        self,\n        creator: ZhihuCreator,\n        crawl_interval: float = 1.0,\n        callback: Optional[Callable] = None,\n    ) -> List[ZhihuContent]:\n        \"\"\"\n        Get all videos by creator\n        Args:\n            creator:\n            crawl_interval:\n            callback:\n\n        Returns:\n\n        \"\"\"\n        all_contents: List[ZhihuContent] = []\n        is_end: bool = False\n        offset: int = 0\n        limit: int = 20\n        while not is_end:\n            res = await self.get_creator_videos(creator.url_token, offset, limit)\n            if not res:\n                break\n            paging_info = res.get(\"paging\", {})\n            is_end = paging_info.get(\"is_end\")\n            contents = self._extractor.extract_content_list_from_creator(res.get(\"data\"))\n            if callback:\n                await callback(contents)\n            all_contents.extend(contents)\n            offset += limit\n            await asyncio.sleep(crawl_interval)\n        return all_contents\n\n    async def get_answer_info(\n        self,\n        question_id: str,\n        answer_id: str,\n    ) -> Optional[ZhihuContent]:\n        \"\"\"\n        Get answer information\n        Args:\n            question_id:\n            answer_id:\n\n        Returns:\n\n        \"\"\"\n        uri = f\"/question/{question_id}/answer/{answer_id}\"\n        response_html = await self.get(uri, return_response=True)\n        return self._extractor.extract_answer_content_from_html(response_html)\n\n    async def get_article_info(self, article_id: str) -> Optional[ZhihuContent]:\n        \"\"\"\n        Get article information\n        Args:\n            article_id:\n\n        Returns:\n\n        \"\"\"\n        uri = f\"/p/{article_id}\"\n        response_html = await self.get(uri, return_response=True)\n        return self._extractor.extract_article_content_from_html(response_html)\n\n    async def get_video_info(self, video_id: str) -> Optional[ZhihuContent]:\n        \"\"\"\n        Get video information\n        Args:\n            video_id:\n\n        Returns:\n\n        \"\"\"\n        uri = f\"/zvideo/{video_id}\"\n        response_html = await self.get(uri, return_response=True)\n        return self._extractor.extract_zvideo_content_from_html(response_html)\n"
  },
  {
    "path": "media_platform/zhihu/core.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/zhihu/core.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\nimport asyncio\nimport os\n# import random  # Removed as we now use fixed config.CRAWLER_MAX_SLEEP_SEC intervals\nfrom asyncio import Task\nfrom typing import Dict, List, Optional, Tuple, cast\n\nfrom playwright.async_api import (\n    BrowserContext,\n    BrowserType,\n    Page,\n    Playwright,\n    async_playwright,\n)\n\nimport config\nfrom constant import zhihu as constant\nfrom base.base_crawler import AbstractCrawler\nfrom model.m_zhihu import ZhihuContent, ZhihuCreator\nfrom proxy.proxy_ip_pool import IpInfoModel, create_ip_pool\nfrom store import zhihu as zhihu_store\nfrom tools import utils\nfrom tools.cdp_browser import CDPBrowserManager\nfrom var import crawler_type_var, source_keyword_var\n\nfrom .client import ZhiHuClient\nfrom .exception import DataFetchError\nfrom .help import ZhihuExtractor, judge_zhihu_url\nfrom .login import ZhiHuLogin\n\n\nclass ZhihuCrawler(AbstractCrawler):\n    context_page: Page\n    zhihu_client: ZhiHuClient\n    browser_context: BrowserContext\n    cdp_manager: Optional[CDPBrowserManager]\n\n    def __init__(self) -> None:\n        self.index_url = \"https://www.zhihu.com\"\n        # self.user_agent = utils.get_user_agent()\n        self.user_agent = \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36\"\n        self._extractor = ZhihuExtractor()\n        self.cdp_manager = None\n        self.ip_proxy_pool = None  # Proxy IP pool for automatic proxy refresh\n\n    async def start(self) -> None:\n        \"\"\"\n        Start the crawler\n        Returns:\n\n        \"\"\"\n        playwright_proxy_format, httpx_proxy_format = None, None\n        if config.ENABLE_IP_PROXY:\n            self.ip_proxy_pool = await create_ip_pool(\n                config.IP_PROXY_POOL_COUNT, enable_validate_ip=True\n            )\n            ip_proxy_info: IpInfoModel = await self.ip_proxy_pool.get_proxy()\n            playwright_proxy_format, httpx_proxy_format = utils.format_proxy_info(\n                ip_proxy_info\n            )\n\n        async with async_playwright() as playwright:\n            # Choose launch mode based on configuration\n            if config.ENABLE_CDP_MODE:\n                utils.logger.info(\"[ZhihuCrawler] Launching browser in CDP mode\")\n                self.browser_context = await self.launch_browser_with_cdp(\n                    playwright,\n                    playwright_proxy_format,\n                    self.user_agent,\n                    headless=config.CDP_HEADLESS,\n                )\n            else:\n                utils.logger.info(\"[ZhihuCrawler] Launching browser in standard mode\")\n                # Launch a browser context.\n                chromium = playwright.chromium\n                self.browser_context = await self.launch_browser(\n                    chromium, None, self.user_agent, headless=config.HEADLESS\n                )\n                # stealth.min.js is a js script to prevent the website from detecting the crawler.\n                await self.browser_context.add_init_script(path=\"libs/stealth.min.js\")\n\n            self.context_page = await self.browser_context.new_page()\n            await self.context_page.goto(self.index_url, wait_until=\"domcontentloaded\")\n\n            # Create a client to interact with the zhihu website.\n            self.zhihu_client = await self.create_zhihu_client(httpx_proxy_format)\n            if not await self.zhihu_client.pong():\n                login_obj = ZhiHuLogin(\n                    login_type=config.LOGIN_TYPE,\n                    login_phone=\"\",  # input your phone number\n                    browser_context=self.browser_context,\n                    context_page=self.context_page,\n                    cookie_str=config.COOKIES,\n                )\n                await login_obj.begin()\n                await self.zhihu_client.update_cookies(\n                    browser_context=self.browser_context\n                )\n\n            # Zhihu's search API requires opening the search page first to access cookies, homepage alone won't work\n            utils.logger.info(\n                \"[ZhihuCrawler.start] Zhihu navigating to search page to get search page cookies, this process takes about 5 seconds\"\n            )\n            await self.context_page.goto(\n                f\"{self.index_url}/search?q=python&search_source=Guess&utm_content=search_hot&type=content\"\n            )\n            await asyncio.sleep(5)\n            await self.zhihu_client.update_cookies(browser_context=self.browser_context)\n\n            crawler_type_var.set(config.CRAWLER_TYPE)\n            if config.CRAWLER_TYPE == \"search\":\n                # Search for notes and retrieve their comment information.\n                await self.search()\n            elif config.CRAWLER_TYPE == \"detail\":\n                # Get the information and comments of the specified post\n                await self.get_specified_notes()\n            elif config.CRAWLER_TYPE == \"creator\":\n                # Get creator's information and their notes and comments\n                await self.get_creators_and_notes()\n            else:\n                pass\n\n            utils.logger.info(\"[ZhihuCrawler.start] Zhihu Crawler finished ...\")\n\n    async def search(self) -> None:\n        \"\"\"Search for notes and retrieve their comment information.\"\"\"\n        utils.logger.info(\"[ZhihuCrawler.search] Begin search zhihu keywords\")\n        zhihu_limit_count = 20  # zhihu limit page fixed value\n        if config.CRAWLER_MAX_NOTES_COUNT < zhihu_limit_count:\n            config.CRAWLER_MAX_NOTES_COUNT = zhihu_limit_count\n        start_page = config.START_PAGE\n        for keyword in config.KEYWORDS.split(\",\"):\n            source_keyword_var.set(keyword)\n            utils.logger.info(\n                f\"[ZhihuCrawler.search] Current search keyword: {keyword}\"\n            )\n            page = 1\n            while (\n                page - start_page + 1\n            ) * zhihu_limit_count <= config.CRAWLER_MAX_NOTES_COUNT:\n                if page < start_page:\n                    utils.logger.info(f\"[ZhihuCrawler.search] Skip page {page}\")\n                    page += 1\n                    continue\n\n                try:\n                    utils.logger.info(\n                        f\"[ZhihuCrawler.search] search zhihu keyword: {keyword}, page: {page}\"\n                    )\n                    content_list: List[ZhihuContent] = (\n                        await self.zhihu_client.get_note_by_keyword(\n                            keyword=keyword,\n                            page=page,\n                        )\n                    )\n                    utils.logger.info(\n                        f\"[ZhihuCrawler.search] Search contents :{content_list}\"\n                    )\n                    if not content_list:\n                        utils.logger.info(\"No more content!\")\n                        break\n\n                    # Sleep after page navigation\n                    await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n                    utils.logger.info(f\"[ZhihuCrawler.search] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds after page {page-1}\")\n\n                    page += 1\n                    for content in content_list:\n                        await zhihu_store.update_zhihu_content(content)\n\n                    await self.batch_get_content_comments(content_list)\n                except DataFetchError:\n                    utils.logger.error(\"[ZhihuCrawler.search] Search content error\")\n                    return\n\n    async def batch_get_content_comments(self, content_list: List[ZhihuContent]):\n        \"\"\"\n        Batch get content comments\n        Args:\n            content_list:\n\n        Returns:\n\n        \"\"\"\n        if not config.ENABLE_GET_COMMENTS:\n            utils.logger.info(\n                f\"[ZhihuCrawler.batch_get_content_comments] Crawling comment mode is not enabled\"\n            )\n            return\n\n        semaphore = asyncio.Semaphore(config.MAX_CONCURRENCY_NUM)\n        task_list: List[Task] = []\n        for content_item in content_list:\n            task = asyncio.create_task(\n                self.get_comments(content_item, semaphore), name=content_item.content_id\n            )\n            task_list.append(task)\n        await asyncio.gather(*task_list)\n\n    async def get_comments(\n        self, content_item: ZhihuContent, semaphore: asyncio.Semaphore\n    ):\n        \"\"\"\n        Get note comments with keyword filtering and quantity limitation\n        Args:\n            content_item:\n            semaphore:\n\n        Returns:\n\n        \"\"\"\n        async with semaphore:\n            utils.logger.info(\n                f\"[ZhihuCrawler.get_comments] Begin get note id comments {content_item.content_id}\"\n            )\n\n            # Sleep before fetching comments\n            await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n            utils.logger.info(f\"[ZhihuCrawler.get_comments] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds before fetching comments for content {content_item.content_id}\")\n\n            await self.zhihu_client.get_note_all_comments(\n                content=content_item,\n                crawl_interval=config.CRAWLER_MAX_SLEEP_SEC,\n                callback=zhihu_store.batch_update_zhihu_note_comments,\n            )\n\n    async def get_creators_and_notes(self) -> None:\n        \"\"\"\n        Get creator's information and their notes and comments\n        Returns:\n\n        \"\"\"\n        utils.logger.info(\n            \"[ZhihuCrawler.get_creators_and_notes] Begin get xiaohongshu creators\"\n        )\n        for user_link in config.ZHIHU_CREATOR_URL_LIST:\n            utils.logger.info(\n                f\"[ZhihuCrawler.get_creators_and_notes] Begin get creator {user_link}\"\n            )\n            user_url_token = user_link.split(\"/\")[-1]\n            # get creator detail info from web html content\n            createor_info: ZhihuCreator = await self.zhihu_client.get_creator_info(\n                url_token=user_url_token\n            )\n            if not createor_info:\n                utils.logger.info(\n                    f\"[ZhihuCrawler.get_creators_and_notes] Creator {user_url_token} not found\"\n                )\n                continue\n\n            utils.logger.info(\n                f\"[ZhihuCrawler.get_creators_and_notes] Creator info: {createor_info}\"\n            )\n            await zhihu_store.save_creator(creator=createor_info)\n\n            # By default, only answer information is extracted, uncomment below if articles and videos are needed\n\n            # Get all anwser information of the creator\n            all_content_list = await self.zhihu_client.get_all_anwser_by_creator(\n                creator=createor_info,\n                crawl_interval=config.CRAWLER_MAX_SLEEP_SEC,\n                callback=zhihu_store.batch_update_zhihu_contents,\n            )\n\n            # Get all articles of the creator's contents\n            # all_content_list = await self.zhihu_client.get_all_articles_by_creator(\n            #     creator=createor_info,\n            #     crawl_interval=config.CRAWLER_MAX_SLEEP_SEC,\n            #     callback=zhihu_store.batch_update_zhihu_contents\n            # )\n\n            # Get all videos of the creator's contents\n            # all_content_list = await self.zhihu_client.get_all_videos_by_creator(\n            #     creator=createor_info,\n            #     crawl_interval=config.CRAWLER_MAX_SLEEP_SEC,\n            #     callback=zhihu_store.batch_update_zhihu_contents\n            # )\n\n            # Get all comments of the creator's contents\n            await self.batch_get_content_comments(all_content_list)\n\n    async def get_note_detail(\n        self, full_note_url: str, semaphore: asyncio.Semaphore\n    ) -> Optional[ZhihuContent]:\n        \"\"\"\n        Get note detail\n        Args:\n            full_note_url: str\n            semaphore:\n\n        Returns:\n\n        \"\"\"\n        async with semaphore:\n            utils.logger.info(\n                f\"[ZhihuCrawler.get_specified_notes] Begin get specified note {full_note_url}\"\n            )\n            # Judge note type\n            note_type: str = judge_zhihu_url(full_note_url)\n            if note_type == constant.ANSWER_NAME:\n                question_id = full_note_url.split(\"/\")[-3]\n                answer_id = full_note_url.split(\"/\")[-1]\n                utils.logger.info(\n                    f\"[ZhihuCrawler.get_specified_notes] Get answer info, question_id: {question_id}, answer_id: {answer_id}\"\n                )\n                result = await self.zhihu_client.get_answer_info(question_id, answer_id)\n\n                # Sleep after fetching answer details\n                await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n                utils.logger.info(f\"[ZhihuCrawler.get_note_detail] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds after fetching answer details {answer_id}\")\n\n                return result\n\n            elif note_type == constant.ARTICLE_NAME:\n                article_id = full_note_url.split(\"/\")[-1]\n                utils.logger.info(\n                    f\"[ZhihuCrawler.get_specified_notes] Get article info, article_id: {article_id}\"\n                )\n                result = await self.zhihu_client.get_article_info(article_id)\n\n                # Sleep after fetching article details\n                await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n                utils.logger.info(f\"[ZhihuCrawler.get_note_detail] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds after fetching article details {article_id}\")\n\n                return result\n\n            elif note_type == constant.VIDEO_NAME:\n                video_id = full_note_url.split(\"/\")[-1]\n                utils.logger.info(\n                    f\"[ZhihuCrawler.get_specified_notes] Get video info, video_id: {video_id}\"\n                )\n                result = await self.zhihu_client.get_video_info(video_id)\n\n                # Sleep after fetching video details\n                await asyncio.sleep(config.CRAWLER_MAX_SLEEP_SEC)\n                utils.logger.info(f\"[ZhihuCrawler.get_note_detail] Sleeping for {config.CRAWLER_MAX_SLEEP_SEC} seconds after fetching video details {video_id}\")\n\n                return result\n\n    async def get_specified_notes(self):\n        \"\"\"\n        Get the information and comments of the specified post\n        Returns:\n\n        \"\"\"\n        get_note_detail_task_list = []\n        for full_note_url in config.ZHIHU_SPECIFIED_ID_LIST:\n            # remove query params\n            full_note_url = full_note_url.split(\"?\")[0]\n            crawler_task = self.get_note_detail(\n                full_note_url=full_note_url,\n                semaphore=asyncio.Semaphore(config.MAX_CONCURRENCY_NUM),\n            )\n            get_note_detail_task_list.append(crawler_task)\n\n        need_get_comment_notes: List[ZhihuContent] = []\n        note_details = await asyncio.gather(*get_note_detail_task_list)\n        for index, note_detail in enumerate(note_details):\n            if not note_detail:\n                utils.logger.info(\n                    f\"[ZhihuCrawler.get_specified_notes] Note {config.ZHIHU_SPECIFIED_ID_LIST[index]} not found\"\n                )\n                continue\n\n            note_detail = cast(ZhihuContent, note_detail)  # only for type check\n            need_get_comment_notes.append(note_detail)\n            await zhihu_store.update_zhihu_content(note_detail)\n\n        await self.batch_get_content_comments(need_get_comment_notes)\n\n    async def create_zhihu_client(self, httpx_proxy: Optional[str]) -> ZhiHuClient:\n        \"\"\"Create zhihu client\"\"\"\n        utils.logger.info(\n            \"[ZhihuCrawler.create_zhihu_client] Begin create zhihu API client ...\"\n        )\n        cookie_str, cookie_dict = utils.convert_cookies(\n            await self.browser_context.cookies()\n        )\n        zhihu_client_obj = ZhiHuClient(\n            proxy=httpx_proxy,\n            headers={\n                \"accept\": \"*/*\",\n                \"accept-language\": \"zh-CN,zh;q=0.9\",\n                \"cookie\": cookie_str,\n                \"priority\": \"u=1, i\",\n                \"referer\": \"https://www.zhihu.com/search?q=python&time_interval=a_year&type=content\",\n                \"user-agent\": self.user_agent,\n                \"x-api-version\": \"3.0.91\",\n                \"x-app-za\": \"OS=Web\",\n                \"x-requested-with\": \"fetch\",\n                \"x-zse-93\": \"101_3_3.0\",\n            },\n            playwright_page=self.context_page,\n            cookie_dict=cookie_dict,\n            proxy_ip_pool=self.ip_proxy_pool,  # Pass proxy pool for automatic refresh\n        )\n        return zhihu_client_obj\n\n    async def launch_browser(\n        self,\n        chromium: BrowserType,\n        playwright_proxy: Optional[Dict],\n        user_agent: Optional[str],\n        headless: bool = True,\n    ) -> BrowserContext:\n        \"\"\"Launch browser and create browser context\"\"\"\n        utils.logger.info(\n            \"[ZhihuCrawler.launch_browser] Begin create browser context ...\"\n        )\n        if config.SAVE_LOGIN_STATE:\n            # feat issue #14\n            # we will save login state to avoid login every time\n            user_data_dir = os.path.join(\n                os.getcwd(), \"browser_data\", config.USER_DATA_DIR % config.PLATFORM\n            )  # type: ignore\n            browser_context = await chromium.launch_persistent_context(\n                user_data_dir=user_data_dir,\n                accept_downloads=True,\n                headless=headless,\n                proxy=playwright_proxy,  # type: ignore\n                viewport={\"width\": 1920, \"height\": 1080},\n                user_agent=user_agent,\n                channel=\"chrome\",  # Use system Chrome stable version\n            )\n            return browser_context\n        else:\n            browser = await chromium.launch(headless=headless, proxy=playwright_proxy, channel=\"chrome\")  # type: ignore\n            browser_context = await browser.new_context(\n                viewport={\"width\": 1920, \"height\": 1080}, user_agent=user_agent\n            )\n            return browser_context\n\n    async def launch_browser_with_cdp(\n        self,\n        playwright: Playwright,\n        playwright_proxy: Optional[Dict],\n        user_agent: Optional[str],\n        headless: bool = True,\n    ) -> BrowserContext:\n        \"\"\"\n        Launch browser using CDP mode\n        \"\"\"\n        try:\n            self.cdp_manager = CDPBrowserManager()\n            browser_context = await self.cdp_manager.launch_and_connect(\n                playwright=playwright,\n                playwright_proxy=playwright_proxy,\n                user_agent=user_agent,\n                headless=headless,\n            )\n\n            # Display browser information\n            browser_info = await self.cdp_manager.get_browser_info()\n            utils.logger.info(f\"[ZhihuCrawler] CDP browser info: {browser_info}\")\n\n            return browser_context\n\n        except Exception as e:\n            utils.logger.error(f\"[ZhihuCrawler] CDP mode launch failed, falling back to standard mode: {e}\")\n            # Fall back to standard mode\n            chromium = playwright.chromium\n            return await self.launch_browser(\n                chromium, playwright_proxy, user_agent, headless\n            )\n\n    async def close(self):\n        \"\"\"Close browser context\"\"\"\n        # Special handling if using CDP mode\n        if self.cdp_manager:\n            await self.cdp_manager.cleanup()\n            self.cdp_manager = None\n        else:\n            await self.browser_context.close()\n        utils.logger.info(\"[ZhihuCrawler.close] Browser context closed ...\")\n"
  },
  {
    "path": "media_platform/zhihu/exception.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/zhihu/exception.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nfrom httpx import RequestError\n\n\nclass DataFetchError(RequestError):\n    \"\"\"something error when fetch\"\"\"\n\n\nclass IPBlockError(RequestError):\n    \"\"\"fetch so fast that the server block us ip\"\"\"\n\nclass ForbiddenError(RequestError):\n    \"\"\"Forbidden\"\"\"\n"
  },
  {
    "path": "media_platform/zhihu/field.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/zhihu/field.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nfrom enum import Enum\nfrom typing import NamedTuple\n\nfrom constant import zhihu as zhihu_constant\n\n\nclass SearchTime(Enum):\n    \"\"\"\n    Search time range\n    \"\"\"\n    DEFAULT = \"\"  # No time limit\n    ONE_DAY = \"a_day\"  # Within one day\n    ONE_WEEK = \"a_week\"  # Within one week\n    ONE_MONTH = \"a_month\"  # Within one month\n    THREE_MONTH = \"three_months\"  # Within three months\n    HALF_YEAR = \"half_a_year\"  # Within half a year\n    ONE_YEAR = \"a_year\"  # Within one year\n\n\nclass SearchType(Enum):\n    \"\"\"\n    Search result type\n    \"\"\"\n    DEFAULT = \"\"  # No type limit\n    ANSWER = zhihu_constant.ANSWER_NAME  # Answers only\n    ARTICLE = zhihu_constant.ARTICLE_NAME  # Articles only\n    VIDEO = zhihu_constant.VIDEO_NAME  # Videos only\n\n\nclass SearchSort(Enum):\n    \"\"\"\n    Search result sorting\n    \"\"\"\n    DEFAULT = \"\"  # Default sorting\n    UPVOTED_COUNT = \"upvoted_count\"  # Most upvoted\n    CREATE_TIME = \"created_time\"  # Latest published\n"
  },
  {
    "path": "media_platform/zhihu/help.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/zhihu/help.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\nimport json\nfrom typing import Dict, List, Optional\nfrom urllib.parse import parse_qs, urlparse\n\nimport execjs\nfrom parsel import Selector\n\nfrom constant import zhihu as zhihu_constant\nfrom model.m_zhihu import ZhihuComment, ZhihuContent, ZhihuCreator\nfrom tools import utils\nfrom tools.crawler_util import extract_text_from_html\n\nZHIHU_SGIN_JS = None\n\n\ndef sign(url: str, cookies: str) -> Dict:\n    \"\"\"\n    zhihu sign algorithm\n    Args:\n        url: request url with query string\n        cookies: request cookies with d_c0 key\n\n    Returns:\n\n    \"\"\"\n    global ZHIHU_SGIN_JS\n    if not ZHIHU_SGIN_JS:\n        with open(\"libs/zhihu.js\", mode=\"r\", encoding=\"utf-8-sig\") as f:\n            ZHIHU_SGIN_JS = execjs.compile(f.read())\n\n    return ZHIHU_SGIN_JS.call(\"get_sign\", url, cookies)\n\n\nclass ZhihuExtractor:\n    def __init__(self):\n        pass\n\n    def extract_contents_from_search(self, json_data: Dict) -> List[ZhihuContent]:\n        \"\"\"\n        extract zhihu contents\n        Args:\n            json_data: zhihu json data\n\n        Returns:\n\n        \"\"\"\n        if not json_data:\n            return []\n\n        search_result: List[Dict] = json_data.get(\"data\", [])\n        search_result = [s_item for s_item in search_result if s_item.get(\"type\") in ['search_result', 'zvideo']]\n        return self._extract_content_list([sr_item.get(\"object\") for sr_item in search_result if sr_item.get(\"object\")])\n\n\n    def _extract_content_list(self, content_list: List[Dict]) -> List[ZhihuContent]:\n        \"\"\"\n        extract zhihu content list\n        Args:\n            content_list:\n\n        Returns:\n\n        \"\"\"\n        if not content_list:\n            return []\n\n        res: List[ZhihuContent] = []\n        for content in content_list:\n            if content.get(\"type\") == zhihu_constant.ANSWER_NAME:\n                res.append(self._extract_answer_content(content))\n            elif content.get(\"type\") == zhihu_constant.ARTICLE_NAME:\n                res.append(self._extract_article_content(content))\n            elif content.get(\"type\") == zhihu_constant.VIDEO_NAME:\n                res.append(self._extract_zvideo_content(content))\n            else:\n                continue\n        return res\n\n    def _extract_answer_content(self, answer: Dict) -> ZhihuContent:\n        \"\"\"\n        extract zhihu answer content\n        Args:\n            answer: zhihu answer\n\n        Returns:\n        \"\"\"\n        res = ZhihuContent()\n        res.content_id = answer.get(\"id\")\n        res.content_type = answer.get(\"type\")\n        res.content_text = extract_text_from_html(answer.get(\"content\", \"\"))\n        res.question_id = answer.get(\"question\").get(\"id\")\n        res.content_url = f\"{zhihu_constant.ZHIHU_URL}/question/{res.question_id}/answer/{res.content_id}\"\n        res.title = extract_text_from_html(answer.get(\"title\", \"\"))\n        res.desc = extract_text_from_html(answer.get(\"description\", \"\") or answer.get(\"excerpt\", \"\"))\n        res.created_time = answer.get(\"created_time\")\n        res.updated_time = answer.get(\"updated_time\")\n        res.voteup_count = answer.get(\"voteup_count\", 0)\n        res.comment_count = answer.get(\"comment_count\", 0)\n\n        # extract author info\n        author_info = self._extract_content_or_comment_author(answer.get(\"author\"))\n        res.user_id = author_info.user_id\n        res.user_link = author_info.user_link\n        res.user_nickname = author_info.user_nickname\n        res.user_avatar = author_info.user_avatar\n        res.user_url_token = author_info.url_token\n        return res\n\n    def _extract_article_content(self, article: Dict) -> ZhihuContent:\n        \"\"\"\n        extract zhihu article content\n        Args:\n            article: zhihu article\n\n        Returns:\n\n        \"\"\"\n        res = ZhihuContent()\n        res.content_id = article.get(\"id\")\n        res.content_type = article.get(\"type\")\n        res.content_text = extract_text_from_html(article.get(\"content\"))\n        res.content_url = f\"{zhihu_constant.ZHIHU_ZHUANLAN_URL}/p/{res.content_id}\"\n        res.title = extract_text_from_html(article.get(\"title\"))\n        res.desc = extract_text_from_html(article.get(\"excerpt\"))\n        res.created_time = article.get(\"created_time\", 0) or article.get(\"created\", 0)\n        res.updated_time = article.get(\"updated_time\", 0) or article.get(\"updated\", 0)\n        res.voteup_count = article.get(\"voteup_count\", 0)\n        res.comment_count = article.get(\"comment_count\", 0)\n\n        # extract author info\n        author_info = self._extract_content_or_comment_author(article.get(\"author\"))\n        res.user_id = author_info.user_id\n        res.user_link = author_info.user_link\n        res.user_nickname = author_info.user_nickname\n        res.user_avatar = author_info.user_avatar\n        res.user_url_token = author_info.url_token\n        return res\n\n    def _extract_zvideo_content(self, zvideo: Dict) -> ZhihuContent:\n        \"\"\"\n        extract zhihu zvideo content\n        Args:\n            zvideo:\n\n        Returns:\n\n        \"\"\"\n        res = ZhihuContent()\n\n        if \"video\" in zvideo and isinstance(zvideo.get(\"video\"), dict): # This indicates data from the creator's homepage video list API\n            res.content_url = f\"{zhihu_constant.ZHIHU_URL}/zvideo/{res.content_id}\"\n            res.created_time = zvideo.get(\"published_at\")\n            res.updated_time = zvideo.get(\"updated_at\")\n        else:\n            res.content_url = zvideo.get(\"video_url\")\n            res.created_time = zvideo.get(\"created_at\")\n        res.content_id = zvideo.get(\"id\")\n        res.content_type = zvideo.get(\"type\")\n        res.title = extract_text_from_html(zvideo.get(\"title\"))\n        res.desc = extract_text_from_html(zvideo.get(\"description\"))\n        res.voteup_count = zvideo.get(\"voteup_count\")\n        res.comment_count = zvideo.get(\"comment_count\")\n\n        # extract author info\n        author_info = self._extract_content_or_comment_author(zvideo.get(\"author\"))\n        res.user_id = author_info.user_id\n        res.user_link = author_info.user_link\n        res.user_nickname = author_info.user_nickname\n        res.user_avatar = author_info.user_avatar\n        res.user_url_token = author_info.url_token\n        return res\n\n    @staticmethod\n    def _extract_content_or_comment_author(author: Dict) -> ZhihuCreator:\n        \"\"\"\n        extract zhihu author\n        Args:\n            author:\n\n        Returns:\n\n        \"\"\"\n        res = ZhihuCreator()\n        try:\n            if not author:\n                return res\n            if not author.get(\"id\"):\n                author = author.get(\"member\")\n            res.user_id = author.get(\"id\")\n            res.user_link = f\"{zhihu_constant.ZHIHU_URL}/people/{author.get('url_token')}\"\n            res.user_nickname = author.get(\"name\")\n            res.user_avatar = author.get(\"avatar_url\")\n            res.url_token = author.get(\"url_token\")\n\n        except Exception as e :\n            utils.logger.warning(\n                f\"[ZhihuExtractor._extract_content_or_comment_author] User Maybe Blocked. {e}\"\n            )\n        return res\n\n    def extract_comments(self, page_content: ZhihuContent, comments: List[Dict]) -> List[ZhihuComment]:\n        \"\"\"\n        extract zhihu comments\n        Args:\n            page_content: zhihu content object\n            comments: zhihu comments\n\n        Returns:\n\n        \"\"\"\n        if not comments:\n            return []\n        res: List[ZhihuComment] = []\n        for comment in comments:\n            if comment.get(\"type\") != \"comment\":\n                continue\n            res.append(self._extract_comment(page_content, comment))\n        return res\n\n    def _extract_comment(self, page_content: ZhihuContent, comment: Dict) -> ZhihuComment:\n        \"\"\"\n        extract zhihu comment\n        Args:\n            page_content: comment with content object\n            comment: zhihu comment\n\n        Returns:\n\n        \"\"\"\n        res = ZhihuComment()\n        res.comment_id = str(comment.get(\"id\", \"\"))\n        res.parent_comment_id = comment.get(\"reply_comment_id\")\n        res.content = extract_text_from_html(comment.get(\"content\"))\n        res.publish_time = comment.get(\"created_time\")\n        res.ip_location = self._extract_comment_ip_location(comment.get(\"comment_tag\", []))\n        res.sub_comment_count = comment.get(\"child_comment_count\")\n        res.like_count = comment.get(\"like_count\") if comment.get(\"like_count\") else 0\n        res.dislike_count = comment.get(\"dislike_count\") if comment.get(\"dislike_count\") else 0\n        res.content_id = page_content.content_id\n        res.content_type = page_content.content_type\n\n        # extract author info\n        author_info = self._extract_content_or_comment_author(comment.get(\"author\"))\n        res.user_id = author_info.user_id\n        res.user_link = author_info.user_link\n        res.user_nickname = author_info.user_nickname\n        res.user_avatar = author_info.user_avatar\n        return res\n\n    @staticmethod\n    def _extract_comment_ip_location(comment_tags: List[Dict]) -> str:\n        \"\"\"\n        extract comment ip location\n        Args:\n            comment_tags:\n\n        Returns:\n\n        \"\"\"\n        if not comment_tags:\n            return \"\"\n\n        for ct in comment_tags:\n            if ct.get(\"type\") == \"ip_info\":\n                return ct.get(\"text\")\n\n        return \"\"\n\n    @staticmethod\n    def extract_offset(paging_info: Dict) -> str:\n        \"\"\"\n        extract offset\n        Args:\n            paging_info:\n\n        Returns:\n\n        \"\"\"\n        # https://www.zhihu.com/api/v4/comment_v5/zvideos/1424368906836807681/root_comment?limit=10&offset=456770961_10125996085_0&order_by=score\n        next_url = paging_info.get(\"next\")\n        if not next_url:\n            return \"\"\n\n        parsed_url = urlparse(next_url)\n        query_params = parse_qs(parsed_url.query)\n        offset = query_params.get('offset', [\"\"])[0]\n        return offset\n\n    @staticmethod\n    def _foramt_gender_text(gender: int) -> str:\n        \"\"\"\n        format gender text\n        Args:\n            gender:\n\n        Returns:\n\n        \"\"\"\n        if gender == 1:\n            return \"Male\"\n        elif gender == 0:\n            return \"Female\"\n        else:\n            return \"Unknown\"\n\n\n    def extract_creator(self, user_url_token: str, html_content: str) -> Optional[ZhihuCreator]:\n        \"\"\"\n        extract zhihu creator\n        Args:\n            user_url_token : zhihu creator url token\n            html_content: zhihu creator html content\n\n        Returns:\n\n        \"\"\"\n        if not html_content:\n            return None\n\n        js_init_data = Selector(text=html_content).xpath(\"//script[@id='js-initialData']/text()\").get(default=\"\").strip()\n        if not js_init_data:\n            return None\n\n        js_init_data_dict: Dict = json.loads(js_init_data)\n        users_info: Dict = js_init_data_dict.get(\"initialState\", {}).get(\"entities\", {}).get(\"users\", {})\n        if not users_info:\n            return None\n\n        creator_info: Dict = users_info.get(user_url_token)\n        if not creator_info:\n            return None\n\n        res = ZhihuCreator()\n        res.user_id = creator_info.get(\"id\")\n        res.user_link = f\"{zhihu_constant.ZHIHU_URL}/people/{user_url_token}\"\n        res.user_nickname = creator_info.get(\"name\")\n        res.user_avatar = creator_info.get(\"avatarUrl\")\n        res.url_token = creator_info.get(\"urlToken\") or user_url_token\n        res.gender = self._foramt_gender_text(creator_info.get(\"gender\"))\n        res.ip_location = creator_info.get(\"ipInfo\")\n        res.follows = creator_info.get(\"followingCount\")\n        res.fans = creator_info.get(\"followerCount\")\n        res.anwser_count = creator_info.get(\"answerCount\")\n        res.video_count = creator_info.get(\"zvideoCount\")\n        res.question_count = creator_info.get(\"questionCount\")\n        res.article_count = creator_info.get(\"articlesCount\")\n        res.column_count = creator_info.get(\"columnsCount\")\n        res.get_voteup_count = creator_info.get(\"voteupCount\")\n        return res\n\n\n    def extract_content_list_from_creator(self, anwser_list: List[Dict]) -> List[ZhihuContent]:\n        \"\"\"\n        extract content list from creator\n        Args:\n            anwser_list:\n\n        Returns:\n\n        \"\"\"\n        if not anwser_list:\n            return []\n\n        return self._extract_content_list(anwser_list)\n\n\n\n\n    def extract_answer_content_from_html(self, html_content: str) -> Optional[ZhihuContent]:\n        \"\"\"\n        extract zhihu answer content from html\n        Args:\n            html_content:\n\n        Returns:\n\n        \"\"\"\n        js_init_data: str = Selector(text=html_content).xpath(\"//script[@id='js-initialData']/text()\").get(default=\"\")\n        if not js_init_data:\n            return None\n        json_data: Dict = json.loads(js_init_data)\n        answer_info: Dict = json_data.get(\"initialState\", {}).get(\"entities\", {}).get(\"answers\", {})\n        if not answer_info:\n            return None\n\n        return self._extract_answer_content(answer_info.get(list(answer_info.keys())[0]))\n\n    def extract_article_content_from_html(self, html_content: str) -> Optional[ZhihuContent]:\n        \"\"\"\n        extract zhihu article content from html\n        Args:\n            html_content:\n\n        Returns:\n\n        \"\"\"\n        js_init_data: str = Selector(text=html_content).xpath(\"//script[@id='js-initialData']/text()\").get(default=\"\")\n        if not js_init_data:\n            return None\n        json_data: Dict = json.loads(js_init_data)\n        article_info: Dict = json_data.get(\"initialState\", {}).get(\"entities\", {}).get(\"articles\", {})\n        if not article_info:\n            return None\n\n        return self._extract_article_content(article_info.get(list(article_info.keys())[0]))\n\n    def extract_zvideo_content_from_html(self, html_content: str) -> Optional[ZhihuContent]:\n        \"\"\"\n        extract zhihu zvideo content from html\n        Args:\n            html_content:\n\n        Returns:\n\n        \"\"\"\n        js_init_data: str = Selector(text=html_content).xpath(\"//script[@id='js-initialData']/text()\").get(default=\"\")\n        if not js_init_data:\n            return None\n        json_data: Dict = json.loads(js_init_data)\n        zvideo_info: Dict = json_data.get(\"initialState\", {}).get(\"entities\", {}).get(\"zvideos\", {})\n        users: Dict = json_data.get(\"initialState\", {}).get(\"entities\", {}).get(\"users\", {})\n        if not zvideo_info:\n            return None\n\n        # handler user info and video info\n        video_detail_info: Dict = zvideo_info.get(list(zvideo_info.keys())[0])\n        if not video_detail_info:\n            return None\n        if isinstance(video_detail_info.get(\"author\"), str):\n            author_name: str = video_detail_info.get(\"author\")\n            video_detail_info[\"author\"] = users.get(author_name)\n\n        return self._extract_zvideo_content(video_detail_info)\n\n\ndef judge_zhihu_url(note_detail_url: str) -> str:\n    \"\"\"\n    judge zhihu url type\n    Args:\n        note_detail_url:\n            eg1: https://www.zhihu.com/question/123456789/answer/123456789 # answer\n            eg2: https://www.zhihu.com/p/123456789 # article\n            eg3: https://www.zhihu.com/zvideo/123456789 # zvideo\n\n    Returns:\n\n    \"\"\"\n    if \"/answer/\" in note_detail_url:\n        return zhihu_constant.ANSWER_NAME\n    elif \"/p/\" in note_detail_url:\n        return zhihu_constant.ARTICLE_NAME\n    elif \"/zvideo/\" in note_detail_url:\n        return zhihu_constant.VIDEO_NAME\n    else:\n        return \"\"\n"
  },
  {
    "path": "media_platform/zhihu/login.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/media_platform/zhihu/login.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\nimport asyncio\nimport functools\nimport sys\nfrom typing import Optional\n\nfrom playwright.async_api import BrowserContext, Page\nfrom tenacity import (RetryError, retry, retry_if_result, stop_after_attempt,\n                      wait_fixed)\n\nimport config\nfrom base.base_crawler import AbstractLogin\nfrom tools import utils\n\n\nclass ZhiHuLogin(AbstractLogin):\n\n    def __init__(self,\n                 login_type: str,\n                 browser_context: BrowserContext,\n                 context_page: Page,\n                 login_phone: Optional[str] = \"\",\n                 cookie_str: str = \"\"\n                 ):\n        config.LOGIN_TYPE = login_type\n        self.browser_context = browser_context\n        self.context_page = context_page\n        self.login_phone = login_phone\n        self.cookie_str = cookie_str\n\n    @retry(stop=stop_after_attempt(600), wait=wait_fixed(1), retry=retry_if_result(lambda value: value is False))\n    async def check_login_state(self) -> bool:\n        \"\"\"\n        Check if the current login status is successful and return True otherwise return False\n        Returns:\n\n        \"\"\"\n        current_cookie = await self.browser_context.cookies()\n        _, cookie_dict = utils.convert_cookies(current_cookie)\n        current_web_session = cookie_dict.get(\"z_c0\")\n        if current_web_session:\n            return True\n        return False\n\n    async def begin(self):\n        \"\"\"Start login zhihu\"\"\"\n        utils.logger.info(\"[ZhiHu.begin] Begin login zhihu ...\")\n        if config.LOGIN_TYPE == \"qrcode\":\n            await self.login_by_qrcode()\n        elif config.LOGIN_TYPE == \"phone\":\n            await self.login_by_mobile()\n        elif config.LOGIN_TYPE == \"cookie\":\n            await self.login_by_cookies()\n        else:\n            raise ValueError(\"[ZhiHu.begin]I nvalid Login Type Currently only supported qrcode or phone or cookies ...\")\n\n    async def login_by_mobile(self):\n        \"\"\"Login zhihu by mobile\"\"\"\n        # todo implement login by mobile\n\n    async def login_by_qrcode(self):\n        \"\"\"login zhihu website and keep webdriver login state\"\"\"\n        utils.logger.info(\"[ZhiHu.login_by_qrcode] Begin login zhihu by qrcode ...\")\n        qrcode_img_selector = \"canvas.Qrcode-qrcode\"\n        # find login qrcode\n        base64_qrcode_img = await utils.find_qrcode_img_from_canvas(\n            self.context_page,\n            canvas_selector=qrcode_img_selector\n        )\n        if not base64_qrcode_img:\n            utils.logger.info(\"[ZhiHu.login_by_qrcode] login failed , have not found qrcode please check ....\")\n            if not base64_qrcode_img:\n                sys.exit()\n\n        # show login qrcode\n        # fix issue #12\n        # we need to use partial function to call show_qrcode function and run in executor\n        # then current asyncio event loop will not be blocked\n        partial_show_qrcode = functools.partial(utils.show_qrcode, base64_qrcode_img)\n        asyncio.get_running_loop().run_in_executor(executor=None, func=partial_show_qrcode)\n\n        utils.logger.info(f\"[ZhiHu.login_by_qrcode] waiting for scan code login, remaining time is 120s\")\n        try:\n            await self.check_login_state()\n\n        except RetryError:\n            utils.logger.info(\"[ZhiHu.login_by_qrcode] Login zhihu failed by qrcode login method ...\")\n            sys.exit()\n\n        wait_redirect_seconds = 5\n        utils.logger.info(\n            f\"[ZhiHu.login_by_qrcode] Login successful then wait for {wait_redirect_seconds} seconds redirect ...\")\n        await asyncio.sleep(wait_redirect_seconds)\n\n    async def login_by_cookies(self):\n        \"\"\"login zhihu website by cookies\"\"\"\n        utils.logger.info(\"[ZhiHu.login_by_cookies] Begin login zhihu by cookie ...\")\n        for key, value in utils.convert_str_cookie_to_dict(self.cookie_str).items():\n            await self.browser_context.add_cookies([{\n                'name': key,\n                'value': value,\n                'domain': \".zhihu.com\",\n                'path': \"/\"\n            }])\n"
  },
  {
    "path": "model/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/model/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n"
  },
  {
    "path": "model/m_baidu_tieba.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/model/m_baidu_tieba.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\nfrom typing import Optional\n\nfrom pydantic import BaseModel, Field\n\n\nclass TiebaNote(BaseModel):\n    \"\"\"\n    Baidu Tieba post\n    \"\"\"\n    note_id: str = Field(..., description=\"Post ID\")\n    title: str = Field(..., description=\"Post title\")\n    desc: str = Field(default=\"\", description=\"Post description\")\n    note_url: str = Field(..., description=\"Post link\")\n    publish_time: str = Field(default=\"\", description=\"Publish time\")\n    user_link: str = Field(default=\"\", description=\"User homepage link\")\n    user_nickname: str = Field(default=\"\", description=\"User nickname\")\n    user_avatar: str = Field(default=\"\", description=\"User avatar URL\")\n    tieba_name: str = Field(..., description=\"Tieba name\")\n    tieba_link: str = Field(..., description=\"Tieba link\")\n    total_replay_num: int = Field(default=0, description=\"Total reply count\")\n    total_replay_page: int = Field(default=0, description=\"Total reply pages\")\n    ip_location: Optional[str] = Field(default=\"\", description=\"IP location\")\n    source_keyword: str = Field(default=\"\", description=\"Source keyword\")\n\n\nclass TiebaComment(BaseModel):\n    \"\"\"\n    Baidu Tieba comment\n    \"\"\"\n\n    comment_id: str = Field(..., description=\"Comment ID\")\n    parent_comment_id: str = Field(default=\"\", description=\"Parent comment ID\")\n    content: str = Field(..., description=\"Comment content\")\n    user_link: str = Field(default=\"\", description=\"User homepage link\")\n    user_nickname: str = Field(default=\"\", description=\"User nickname\")\n    user_avatar: str = Field(default=\"\", description=\"User avatar URL\")\n    publish_time: str = Field(default=\"\", description=\"Publish time\")\n    ip_location: Optional[str] = Field(default=\"\", description=\"IP location\")\n    sub_comment_count: int = Field(default=0, description=\"Sub-comment count\")\n    note_id: str = Field(..., description=\"Post ID\")\n    note_url: str = Field(..., description=\"Post link\")\n    tieba_id: str = Field(..., description=\"Tieba ID\")\n    tieba_name: str = Field(..., description=\"Tieba name\")\n    tieba_link: str = Field(..., description=\"Tieba link\")\n\n\nclass TiebaCreator(BaseModel):\n    \"\"\"\n    Baidu Tieba creator\n    \"\"\"\n    user_id: str = Field(..., description=\"User ID\")\n    user_name: str = Field(..., description=\"Username\")\n    nickname: str = Field(..., description=\"User nickname\")\n    gender: str = Field(default=\"\", description=\"User gender\")\n    avatar: str = Field(..., description=\"User avatar URL\")\n    ip_location: Optional[str] = Field(default=\"\", description=\"IP location\")\n    follows: int = Field(default=0, description=\"Follows count\")\n    fans: int = Field(default=0, description=\"Fans count\")\n    registration_duration: str = Field(default=\"\", description=\"Registration duration\")\n"
  },
  {
    "path": "model/m_bilibili.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/model/m_bilibili.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# 声明:本代码仅供学习和研究目的使用。使用者应遵守以下原则:\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率,避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n\nfrom pydantic import BaseModel, Field\n\n\nclass VideoUrlInfo(BaseModel):\n    \"\"\"Bilibili video URL information\"\"\"\n    video_id: str = Field(title=\"video id (BV id)\")\n    video_type: str = Field(default=\"video\", title=\"video type\")\n\n\nclass CreatorUrlInfo(BaseModel):\n    \"\"\"Bilibili creator URL information\"\"\"\n    creator_id: str = Field(title=\"creator id (UID)\")\n"
  },
  {
    "path": "model/m_douyin.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/model/m_douyin.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n\nfrom pydantic import BaseModel, Field\n\n\nclass VideoUrlInfo(BaseModel):\n    \"\"\"Douyin video URL information\"\"\"\n    aweme_id: str = Field(title=\"aweme id (video id)\")\n    url_type: str = Field(default=\"normal\", title=\"url type: normal, short, modal\")\n\n\nclass CreatorUrlInfo(BaseModel):\n    \"\"\"Douyin creator URL information\"\"\"\n    sec_user_id: str = Field(title=\"sec_user_id (creator id)\")\n"
  },
  {
    "path": "model/m_kuaishou.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/model/m_kuaishou.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n\nfrom pydantic import BaseModel, Field\n\n\nclass VideoUrlInfo(BaseModel):\n    \"\"\"Kuaishou video URL information\"\"\"\n    video_id: str = Field(title=\"video id (photo id)\")\n    url_type: str = Field(default=\"normal\", title=\"url type: normal\")\n\n\nclass CreatorUrlInfo(BaseModel):\n    \"\"\"Kuaishou creator URL information\"\"\"\n    user_id: str = Field(title=\"user id (creator id)\")\n"
  },
  {
    "path": "model/m_weibo.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/model/m_weibo.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n"
  },
  {
    "path": "model/m_xiaohongshu.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/model/m_xiaohongshu.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n\n\nfrom pydantic import BaseModel, Field\n\n\nclass NoteUrlInfo(BaseModel):\n    note_id: str = Field(title=\"note id\")\n    xsec_token: str = Field(title=\"xsec token\")\n    xsec_source: str = Field(title=\"xsec source\")\n\n\nclass CreatorUrlInfo(BaseModel):\n    \"\"\"Xiaohongshu creator URL information\"\"\"\n    user_id: str = Field(title=\"user id (creator id)\")\n    xsec_token: str = Field(default=\"\", title=\"xsec token\")\n    xsec_source: str = Field(default=\"\", title=\"xsec source\")\n"
  },
  {
    "path": "model/m_zhihu.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/model/m_zhihu.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\nfrom typing import Optional\n\nfrom pydantic import BaseModel, Field\n\n\nclass ZhihuContent(BaseModel):\n    \"\"\"\n    Zhihu content (answer, article, video)\n    \"\"\"\n    content_id: str = Field(default=\"\", description=\"Content ID\")\n    content_type: str = Field(default=\"\", description=\"Content type (article | answer | zvideo)\")\n    content_text: str = Field(default=\"\", description=\"Content text, empty for video type\")\n    content_url: str = Field(default=\"\", description=\"Content landing page URL\")\n    question_id: str = Field(default=\"\", description=\"Question ID, has value when type is answer\")\n    title: str = Field(default=\"\", description=\"Content title\")\n    desc: str = Field(default=\"\", description=\"Content description\")\n    created_time: int = Field(default=0, description=\"Create time\")\n    updated_time: int = Field(default=0, description=\"Update time\")\n    voteup_count: int = Field(default=0, description=\"Upvote count\")\n    comment_count: int = Field(default=0, description=\"Comment count\")\n    source_keyword: str = Field(default=\"\", description=\"Source keyword\")\n\n    user_id: str = Field(default=\"\", description=\"User ID\")\n    user_link: str = Field(default=\"\", description=\"User homepage link\")\n    user_nickname: str = Field(default=\"\", description=\"User nickname\")\n    user_avatar: str = Field(default=\"\", description=\"User avatar URL\")\n    user_url_token: str = Field(default=\"\", description=\"User url_token\")\n\n\nclass ZhihuComment(BaseModel):\n    \"\"\"\n    Zhihu comment\n    \"\"\"\n\n    comment_id: str = Field(default=\"\", description=\"Comment ID\")\n    parent_comment_id: str = Field(default=\"\", description=\"Parent comment ID\")\n    content: str = Field(default=\"\", description=\"Comment content\")\n    publish_time: int = Field(default=0, description=\"Publish time\")\n    ip_location: Optional[str] = Field(default=\"\", description=\"IP location\")\n    sub_comment_count: int = Field(default=0, description=\"Sub-comment count\")\n    like_count: int = Field(default=0, description=\"Like count\")\n    dislike_count: int = Field(default=0, description=\"Dislike count\")\n    content_id: str = Field(default=\"\", description=\"Content ID\")\n    content_type: str = Field(default=\"\", description=\"Content type (article | answer | zvideo)\")\n\n    user_id: str = Field(default=\"\", description=\"User ID\")\n    user_link: str = Field(default=\"\", description=\"User homepage link\")\n    user_nickname: str = Field(default=\"\", description=\"User nickname\")\n    user_avatar: str = Field(default=\"\", description=\"User avatar URL\")\n\n\nclass ZhihuCreator(BaseModel):\n    \"\"\"\n    Zhihu creator\n    \"\"\"\n    user_id: str = Field(default=\"\", description=\"User ID\")\n    user_link: str = Field(default=\"\", description=\"User homepage link\")\n    user_nickname: str = Field(default=\"\", description=\"User nickname\")\n    user_avatar: str = Field(default=\"\", description=\"User avatar URL\")\n    url_token: str = Field(default=\"\", description=\"User url_token\")\n    gender: str = Field(default=\"\", description=\"User gender\")\n    ip_location: Optional[str] = Field(default=\"\", description=\"IP location\")\n    follows: int = Field(default=0, description=\"Follows count\")\n    fans: int = Field(default=0, description=\"Fans count\")\n    anwser_count: int = Field(default=0, description=\"Answer count\")\n    video_count: int = Field(default=0, description=\"Video count\")\n    question_count: int = Field(default=0, description=\"Question count\")\n    article_count: int = Field(default=0, description=\"Article count\")\n    column_count: int = Field(default=0, description=\"Column count\")\n    get_voteup_count: int = Field(default=0, description=\"Total upvotes received\")\n"
  },
  {
    "path": "mypy.ini",
    "content": "[mypy]\nwarn_return_any = True\nwarn_unused_configs = True\n\n[mypy-cv2]\nignore_missing_imports = True\n\n[mypy-execjs]\nignore_missing_imports = True"
  },
  {
    "path": "package.json",
    "content": "{\n  \"scripts\": {\n    \"docs:dev\": \"vitepress dev docs\",\n    \"docs:build\": \"vitepress build docs\",\n    \"docs:preview\": \"vitepress preview docs\"\n  },\n  \"devDependencies\": {\n    \"mermaid\": \"^11.12.2\",\n    \"vitepress\": \"^1.3.4\",\n    \"vitepress-plugin-mermaid\": \"^2.0.17\"\n  }\n}\n"
  },
  {
    "path": "proxy/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/proxy/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2023/12/2 14:37\n# @Desc    : IP proxy pool entry point\nfrom .base_proxy import *\n"
  },
  {
    "path": "proxy/base_proxy.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/proxy/base_proxy.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2023/12/2 11:18\n# @Desc    : Crawler IP acquisition implementation\n# @Url     : KuaiDaili HTTP implementation, official documentation: https://www.kuaidaili.com/?ref=ldwkjqipvz6c\nimport json\nfrom abc import ABC, abstractmethod\nfrom typing import List\n\nimport config\nfrom cache.abs_cache import AbstractCache\nfrom cache.cache_factory import CacheFactory\nfrom tools.utils import utils\n\nfrom .types import IpInfoModel\n\n\nclass IpGetError(Exception):\n    \"\"\" ip get error\"\"\"\n\n\nclass ProxyProvider(ABC):\n    @abstractmethod\n    async def get_proxy(self, num: int) -> List[IpInfoModel]:\n        \"\"\"\n        Abstract method to get IP, different HTTP proxy providers need to implement this method\n        :param num: Number of IPs to extract\n        :return:\n        \"\"\"\n        raise NotImplementedError\n\n\n\nclass IpCache:\n    def __init__(self):\n        self.cache_client: AbstractCache = CacheFactory.create_cache(cache_type=config.CACHE_TYPE_REDIS)\n\n    def set_ip(self, ip_key: str, ip_value_info: str, ex: int):\n        \"\"\"\n        Set IP with expiration time, Redis is responsible for deletion after expiration\n        :param ip_key:\n        :param ip_value_info:\n        :param ex:\n        :return:\n        \"\"\"\n        self.cache_client.set(key=ip_key, value=ip_value_info, expire_time=ex)\n\n    def load_all_ip(self, proxy_brand_name: str) -> List[IpInfoModel]:\n        \"\"\"\n        Load all unexpired IP information from Redis\n        :param proxy_brand_name: Proxy provider name\n        :return:\n        \"\"\"\n        all_ip_list: List[IpInfoModel] = []\n        all_ip_keys: List[str] = self.cache_client.keys(pattern=f\"{proxy_brand_name}_*\")\n        try:\n            for ip_key in all_ip_keys:\n                ip_value = self.cache_client.get(ip_key)\n                if not ip_value:\n                    continue\n                all_ip_list.append(IpInfoModel(**json.loads(ip_value)))\n        except Exception as e:\n            utils.logger.error(\"[IpCache.load_all_ip] get ip err from redis db\", e)\n        return all_ip_list\n"
  },
  {
    "path": "proxy/providers/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/proxy/providers/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2024/4/5 10:13\n# @Desc    :\nfrom .jishu_http_proxy import new_jisu_http_proxy\nfrom .kuaidl_proxy import new_kuai_daili_proxy\nfrom .wandou_http_proxy import new_wandou_http_proxy\n"
  },
  {
    "path": "proxy/providers/jishu_http_proxy.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/proxy/providers/jishu_http_proxy.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2024/4/5 09:32\n# @Desc    : Deprecated!!!!! Shut down!!! JiSu HTTP proxy IP implementation. Please use KuaiDaili implementation (proxy/providers/kuaidl_proxy.py)\nimport os\nfrom typing import Dict, List\nfrom urllib.parse import urlencode\n\nimport httpx\n\nfrom proxy import IpCache, IpGetError, ProxyProvider\nfrom proxy.types import IpInfoModel\nfrom tools import utils\nfrom tools.httpx_util import make_async_client\n\n\nclass JiSuHttpProxy(ProxyProvider):\n\n    def __init__(self, key: str, crypto: str, time_validity_period: int):\n        \"\"\"\n        JiSu HTTP proxy IP implementation\n        :param key: Extraction key value (obtain after registering on the official website)\n        :param crypto: Encryption signature (obtain after registering on the official website)\n        \"\"\"\n        self.proxy_brand_name = \"JISUHTTP\"\n        self.api_path = \"https://api.jisuhttp.com\"\n        self.params = {\n            \"key\": key,\n            \"crypto\": crypto,\n            \"time\": time_validity_period,  # IP usage duration, supports 3, 5, 10, 15, 30 minute validity\n            \"type\": \"json\",  # Data result is json\n            \"port\": \"2\",  # IP protocol: 1:HTTP, 2:HTTPS, 3:SOCKS5\n            \"pw\": \"1\",  # Whether to use account password authentication, 1: yes, 0: no, no means whitelist authentication; default is 0\n            \"se\": \"1\",  # Whether to show IP expiration time when returning JSON format, 1: show, 0: don't show; default is 0\n        }\n        self.ip_cache = IpCache()\n\n    async def get_proxy(self, num: int) -> List[IpInfoModel]:\n        \"\"\"\n        :param num:\n        :return:\n        \"\"\"\n\n        # Prioritize getting IP from cache\n        ip_cache_list = self.ip_cache.load_all_ip(proxy_brand_name=self.proxy_brand_name)\n        if len(ip_cache_list) >= num:\n            return ip_cache_list[:num]\n\n        # If the quantity in cache is insufficient, get from IP provider to supplement, then store in cache\n        need_get_count = num - len(ip_cache_list)\n        self.params.update({\"num\": need_get_count})\n        ip_infos = []\n        async with make_async_client() as client:\n            url = self.api_path + \"/fetchips\" + '?' + urlencode(self.params)\n            utils.logger.info(f\"[JiSuHttpProxy.get_proxy] get ip proxy url:{url}\")\n            response = await client.get(url, headers={\n                \"User-Agent\": \"MediaCrawler https://github.com/NanmiCoder/MediaCrawler\",\n            })\n            res_dict: Dict = response.json()\n            if res_dict.get(\"code\") == 0:\n                data: List[Dict] = res_dict.get(\"data\")\n                current_ts = utils.get_unix_timestamp()\n                for ip_item in data:\n                    ip_info_model = IpInfoModel(\n                        ip=ip_item.get(\"ip\"),\n                        port=ip_item.get(\"port\"),\n                        user=ip_item.get(\"user\"),\n                        password=ip_item.get(\"pass\"),\n                        expired_time_ts=utils.get_unix_time_from_time_str(ip_item.get(\"expire\")),\n                    )\n                    ip_key = f\"JISUHTTP_{ip_info_model.ip}_{ip_info_model.port}_{ip_info_model.user}_{ip_info_model.password}\"\n                    ip_value = ip_info_model.json()\n                    ip_infos.append(ip_info_model)\n                    self.ip_cache.set_ip(ip_key, ip_value, ex=ip_info_model.expired_time_ts - current_ts)\n            else:\n                raise IpGetError(res_dict.get(\"msg\", \"unkown err\"))\n        return ip_cache_list + ip_infos\n\n\ndef new_jisu_http_proxy() -> JiSuHttpProxy:\n    \"\"\"\n    Construct JiSu HTTP instance\n    Returns:\n\n    \"\"\"\n    return JiSuHttpProxy(\n        key=os.getenv(\"jisu_key\", \"\"),  # Get JiSu HTTP IP extraction key value through environment variable\n        crypto=os.getenv(\"jisu_crypto\", \"\"),  # Get JiSu HTTP IP extraction encryption signature through environment variable\n        time_validity_period=30  # 30 minutes (maximum validity)\n    )\n"
  },
  {
    "path": "proxy/providers/kuaidl_proxy.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/proxy/providers/kuaidl_proxy.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2024/4/5 09:43\n# @Desc    : KuaiDaili HTTP implementation, official documentation: https://www.kuaidaili.com/?ref=ldwkjqipvz6c\nimport os\nimport re\nfrom typing import Dict, List\n\nimport httpx\nfrom pydantic import BaseModel, Field\nfrom tools.httpx_util import make_async_client\n\nfrom proxy import IpCache, IpInfoModel, ProxyProvider\nfrom proxy.types import ProviderNameEnum\nfrom tools import utils\n\n# KuaiDaili IP proxy expiration time is moved forward by 5 seconds to avoid critical time usage failure\nDELTA_EXPIRED_SECOND = 5\n\n\nclass KuaidailiProxyModel(BaseModel):\n    ip: str = Field(\"ip\")\n    port: int = Field(\"port\")\n    expire_ts: int = Field(\"Expiration time, in seconds, how many seconds until expiration\")\n\n\ndef parse_kuaidaili_proxy(proxy_info: str) -> KuaidailiProxyModel:\n    \"\"\"\n    Parse KuaiDaili IP information\n    Args:\n        proxy_info:\n\n    Returns:\n\n    \"\"\"\n    proxies: List[str] = proxy_info.split(\":\")\n    if len(proxies) != 2:\n        raise Exception(\"not invalid kuaidaili proxy info\")\n\n    pattern = r'(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}):(\\d{1,5}),(\\d+)'\n    match = re.search(pattern, proxy_info)\n    if not match.groups():\n        raise Exception(\"not match kuaidaili proxy info\")\n\n    return KuaidailiProxyModel(\n        ip=match.groups()[0],\n        port=int(match.groups()[1]),\n        expire_ts=int(match.groups()[2])\n    )\n\n\nclass KuaiDaiLiProxy(ProxyProvider):\n    def __init__(self, kdl_user_name: str, kdl_user_pwd: str, kdl_secret_id: str, kdl_signature: str):\n        \"\"\"\n\n        Args:\n            kdl_user_name:\n            kdl_user_pwd:\n        \"\"\"\n        self.kdl_user_name = kdl_user_name\n        self.kdl_user_pwd = kdl_user_pwd\n        self.api_base = \"https://dps.kdlapi.com/\"\n        self.secret_id = kdl_secret_id\n        self.signature = kdl_signature\n        self.ip_cache = IpCache()\n        self.proxy_brand_name = ProviderNameEnum.KUAI_DAILI_PROVIDER.value\n        self.params = {\n            \"secret_id\": self.secret_id,\n            \"signature\": self.signature,\n            \"pt\": 1,\n            \"format\": \"json\",\n            \"sep\": 1,\n            \"f_et\": 1,\n        }\n\n    async def get_proxy(self, num: int) -> List[IpInfoModel]:\n        \"\"\"\n        KuaiDaili implementation\n        Args:\n            num:\n\n        Returns:\n\n        \"\"\"\n        uri = \"/api/getdps/\"\n\n        # Prioritize getting IP from cache\n        ip_cache_list = self.ip_cache.load_all_ip(proxy_brand_name=self.proxy_brand_name)\n        if len(ip_cache_list) >= num:\n            return ip_cache_list[:num]\n\n        # If the quantity in cache is insufficient, get from IP provider to supplement, then store in cache\n        need_get_count = num - len(ip_cache_list)\n        self.params.update({\"num\": need_get_count})\n\n        ip_infos: List[IpInfoModel] = []\n        async with make_async_client() as client:\n            response = await client.get(self.api_base + uri, params=self.params)\n\n            if response.status_code != 200:\n                utils.logger.error(f\"[KuaiDaiLiProxy.get_proxies] statuc code not 200 and response.txt:{response.text}, status code: {response.status_code}\")\n                raise Exception(\"get ip error from proxy provider and status code not 200 ...\")\n\n            ip_response: Dict = response.json()\n            if ip_response.get(\"code\") != 0:\n                utils.logger.error(f\"[KuaiDaiLiProxy.get_proxies]  code not 0 and msg:{ip_response.get('msg')}\")\n                raise Exception(\"get ip error from proxy provider and  code not 0 ...\")\n\n            proxy_list: List[str] = ip_response.get(\"data\", {}).get(\"proxy_list\")\n            for proxy in proxy_list:\n                proxy_model = parse_kuaidaili_proxy(proxy)\n                # expire_ts is relative time (seconds), needs to be converted to absolute timestamp\n                # Consider expired DELTA_EXPIRED_SECOND seconds in advance to avoid critical time usage failure\n                ip_info_model = IpInfoModel(\n                    ip=proxy_model.ip,\n                    port=proxy_model.port,\n                    user=self.kdl_user_name,\n                    password=self.kdl_user_pwd,\n                    expired_time_ts=proxy_model.expire_ts + utils.get_unix_timestamp() - DELTA_EXPIRED_SECOND,\n\n                )\n                ip_key = f\"{self.proxy_brand_name}_{ip_info_model.ip}_{ip_info_model.port}\"\n                # Cache expiration time uses relative time (seconds), also needs to subtract buffer time\n                self.ip_cache.set_ip(ip_key, ip_info_model.model_dump_json(), ex=proxy_model.expire_ts - DELTA_EXPIRED_SECOND)\n                ip_infos.append(ip_info_model)\n\n        return ip_cache_list + ip_infos\n\n\ndef new_kuai_daili_proxy() -> KuaiDaiLiProxy:\n    \"\"\"\n    Construct KuaiDaili HTTP instance\n    Supports two environment variable naming formats:\n    1. Uppercase format: KDL_SECERT_ID, KDL_SIGNATURE, KDL_USER_NAME, KDL_USER_PWD\n    2. Lowercase format: kdl_secret_id, kdl_signature, kdl_user_name, kdl_user_pwd\n    Prioritize uppercase format, use lowercase format if not exists\n    Returns:\n\n    \"\"\"\n    # Support both uppercase and lowercase environment variable formats, prioritize uppercase\n    kdl_secret_id = os.getenv(\"KDL_SECERT_ID\") or os.getenv(\"kdl_secret_id\", \"your_kuaidaili_secret_id\")\n    kdl_signature = os.getenv(\"KDL_SIGNATURE\") or os.getenv(\"kdl_signature\", \"your_kuaidaili_signature\")\n    kdl_user_name = os.getenv(\"KDL_USER_NAME\") or os.getenv(\"kdl_user_name\", \"your_kuaidaili_username\")\n    kdl_user_pwd = os.getenv(\"KDL_USER_PWD\") or os.getenv(\"kdl_user_pwd\", \"your_kuaidaili_password\")\n\n    return KuaiDaiLiProxy(\n        kdl_secret_id=kdl_secret_id,\n        kdl_signature=kdl_signature,\n        kdl_user_name=kdl_user_name,\n        kdl_user_pwd=kdl_user_pwd,\n    )\n"
  },
  {
    "path": "proxy/providers/wandou_http_proxy.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/proxy/providers/wandou_http_proxy.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2025/7/31\n# @Desc    : WanDou HTTP proxy IP implementation\nimport os\nfrom typing import Dict, List\nfrom urllib.parse import urlencode\n\nimport httpx\n\nfrom proxy import IpCache, IpGetError, ProxyProvider\nfrom proxy.types import IpInfoModel\nfrom tools import utils\nfrom tools.httpx_util import make_async_client\n\n\nclass WanDouHttpProxy(ProxyProvider):\n\n    def __init__(self, app_key: str, num: int = 100):\n        \"\"\"\n        WanDou HTTP proxy IP implementation\n        :param app_key: Open app_key, can be obtained through user center\n        :param num: Number of IPs extracted at once, maximum 100\n        \"\"\"\n        self.proxy_brand_name = \"WANDOUHTTP\"\n        self.api_path = \"https://api.wandouapp.com/\"\n        self.params = {\n            \"app_key\": app_key,\n            \"num\": num,\n        }\n        self.ip_cache = IpCache()\n\n    async def get_proxy(self, num: int) -> List[IpInfoModel]:\n        \"\"\"\n        :param num:\n        :return:\n        \"\"\"\n\n        # Prioritize getting IP from cache\n        ip_cache_list = self.ip_cache.load_all_ip(\n            proxy_brand_name=self.proxy_brand_name\n        )\n        if len(ip_cache_list) >= num:\n            return ip_cache_list[:num]\n\n        # If the quantity in cache is insufficient, get from IP provider to supplement, then store in cache\n        need_get_count = num - len(ip_cache_list)\n        self.params.update({\"num\": min(need_get_count, 100)})  # Maximum 100\n        ip_infos = []\n        async with make_async_client() as client:\n            url = self.api_path + \"?\" + urlencode(self.params)\n            utils.logger.info(f\"[WanDouHttpProxy.get_proxy] get ip proxy url:{url}\")\n            response = await client.get(\n                url,\n                headers={\n                    \"User-Agent\": \"MediaCrawler https://github.com/NanmiCoder/MediaCrawler\",\n                },\n            )\n            res_dict: Dict = response.json()\n            if res_dict.get(\"code\") == 200:\n                data: List[Dict] = res_dict.get(\"data\", [])\n                current_ts = utils.get_unix_timestamp()\n                for ip_item in data:\n                    ip_info_model = IpInfoModel(\n                        ip=ip_item.get(\"ip\"),\n                        port=ip_item.get(\"port\"),\n                        user=\"\",  # WanDou HTTP does not require username password authentication\n                        password=\"\",\n                        expired_time_ts=utils.get_unix_time_from_time_str(\n                            ip_item.get(\"expire_time\")\n                        ),\n                    )\n                    ip_key = f\"WANDOUHTTP_{ip_info_model.ip}_{ip_info_model.port}\"\n                    ip_value = ip_info_model.model_dump_json()\n                    ip_infos.append(ip_info_model)\n                    self.ip_cache.set_ip(\n                        ip_key, ip_value, ex=ip_info_model.expired_time_ts - current_ts\n                    )\n            else:\n                error_msg = res_dict.get(\"msg\", \"unknown error\")\n                # Handle specific error codes\n                error_code = res_dict.get(\"code\")\n                if error_code == 10001:\n                    error_msg = \"General error, check msg content for specific error information\"\n                elif error_code == 10048:\n                    error_msg = \"No available package\"\n                raise IpGetError(f\"{error_msg} (code: {error_code})\")\n        return ip_cache_list + ip_infos\n\n\ndef new_wandou_http_proxy() -> WanDouHttpProxy:\n    \"\"\"\n    Construct WanDou HTTP instance\n    Supports two environment variable naming formats:\n    1. Uppercase format: WANDOU_APP_KEY\n    2. Lowercase format: wandou_app_key\n    Prioritize uppercase format, use lowercase format if not exists\n    Returns:\n\n    \"\"\"\n    # Support both uppercase and lowercase environment variable formats, prioritize uppercase\n    app_key = os.getenv(\"WANDOU_APP_KEY\") or os.getenv(\"wandou_app_key\", \"your_wandou_http_app_key\")\n\n    return WanDouHttpProxy(app_key=app_key)\n"
  },
  {
    "path": "proxy/proxy_ip_pool.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/proxy/proxy_ip_pool.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2023/12/2 13:45\n# @Desc    : IP proxy pool implementation\nimport random\nfrom typing import Dict, List\n\nimport httpx\nfrom tenacity import retry, stop_after_attempt, wait_fixed\nfrom tools.httpx_util import make_async_client\n\nimport config\nfrom proxy.providers import (\n    new_kuai_daili_proxy,\n    new_wandou_http_proxy,\n)\nfrom tools import utils\n\nfrom .base_proxy import ProxyProvider\nfrom .types import IpInfoModel, ProviderNameEnum\n\n\nclass ProxyIpPool:\n\n    def __init__(\n        self, ip_pool_count: int, enable_validate_ip: bool, ip_provider: ProxyProvider\n    ) -> None:\n        \"\"\"\n\n        Args:\n            ip_pool_count:\n            enable_validate_ip:\n            ip_provider:\n        \"\"\"\n        self.valid_ip_url = \"https://echo.apifox.cn/\"  # URL to validate if IP is valid\n        self.ip_pool_count = ip_pool_count\n        self.enable_validate_ip = enable_validate_ip\n        self.proxy_list: List[IpInfoModel] = []\n        self.ip_provider: ProxyProvider = ip_provider\n        self.current_proxy: IpInfoModel | None = None  # Currently used proxy\n\n    async def load_proxies(self) -> None:\n        \"\"\"\n        Load IP proxies\n        Returns:\n\n        \"\"\"\n        self.proxy_list = await self.ip_provider.get_proxy(self.ip_pool_count)\n\n    async def _is_valid_proxy(self, proxy: IpInfoModel) -> bool:\n        \"\"\"\n        Validate if proxy IP is valid\n        :param proxy:\n        :return:\n        \"\"\"\n        utils.logger.info(\n            f\"[ProxyIpPool._is_valid_proxy] testing {proxy.ip} is it valid \"\n        )\n        try:\n            # httpx 0.28.1 requires passing proxy URL string directly, not a dictionary\n            if proxy.user and proxy.password:\n                proxy_url = f\"http://{proxy.user}:{proxy.password}@{proxy.ip}:{proxy.port}\"\n            else:\n                proxy_url = f\"http://{proxy.ip}:{proxy.port}\"\n\n            async with make_async_client(proxy=proxy_url) as client:\n                response = await client.get(self.valid_ip_url)\n            if response.status_code == 200:\n                return True\n            else:\n                return False\n        except Exception as e:\n            utils.logger.info(\n                f\"[ProxyIpPool._is_valid_proxy] testing {proxy.ip} err: {e}\"\n            )\n            raise e\n\n    @retry(stop=stop_after_attempt(3), wait=wait_fixed(1))\n    async def get_proxy(self) -> IpInfoModel:\n        \"\"\"\n        Randomly extract a proxy IP from the proxy pool\n        :return:\n        \"\"\"\n        if len(self.proxy_list) == 0:\n            await self._reload_proxies()\n\n        proxy = random.choice(self.proxy_list)\n        self.proxy_list.remove(proxy)  # Remove an IP once extracted\n        if self.enable_validate_ip:\n            if not await self._is_valid_proxy(proxy):\n                raise Exception(\n                    \"[ProxyIpPool.get_proxy] current ip invalid and again get it\"\n                )\n        self.current_proxy = proxy  # Save currently used proxy\n        return proxy\n\n    def is_current_proxy_expired(self, buffer_seconds: int = 30) -> bool:\n        \"\"\"\n        Check if current proxy has expired\n        Args:\n            buffer_seconds: Buffer time (seconds), how many seconds ahead to consider expired\n        Returns:\n            bool: True means expired or no current proxy, False means still valid\n        \"\"\"\n        if self.current_proxy is None:\n            return True\n        return self.current_proxy.is_expired(buffer_seconds)\n\n    async def get_or_refresh_proxy(self, buffer_seconds: int = 30) -> IpInfoModel:\n        \"\"\"\n        Get current proxy, automatically refresh if expired\n        Call this method before each request to ensure proxy is valid\n        Args:\n            buffer_seconds: Buffer time (seconds), how many seconds ahead to consider expired\n        Returns:\n            IpInfoModel: Valid proxy IP information\n        \"\"\"\n        if self.is_current_proxy_expired(buffer_seconds):\n            utils.logger.info(\n                f\"[ProxyIpPool.get_or_refresh_proxy] Current proxy expired or not set, getting new proxy...\"\n            )\n            return await self.get_proxy()\n        return self.current_proxy\n\n    async def _reload_proxies(self):\n        \"\"\"\n        Reload proxy pool\n        :return:\n        \"\"\"\n        self.proxy_list = []\n        await self.load_proxies()\n\n\nIpProxyProvider: Dict[str, ProxyProvider] = {\n    ProviderNameEnum.KUAI_DAILI_PROVIDER.value: new_kuai_daili_proxy(),\n    ProviderNameEnum.WANDOU_HTTP_PROVIDER.value: new_wandou_http_proxy(),\n}\n\n\nasync def create_ip_pool(ip_pool_count: int, enable_validate_ip: bool) -> ProxyIpPool:\n    \"\"\"\n    Create IP proxy pool\n    :param ip_pool_count: Number of IPs in the pool\n    :param enable_validate_ip: Whether to enable IP proxy validation\n    :return:\n    \"\"\"\n    pool = ProxyIpPool(\n        ip_pool_count=ip_pool_count,\n        enable_validate_ip=enable_validate_ip,\n        ip_provider=IpProxyProvider.get(config.IP_PROXY_PROVIDER_NAME),\n    )\n    await pool.load_proxies()\n    return pool\n\n\nif __name__ == \"__main__\":\n    pass\n"
  },
  {
    "path": "proxy/proxy_mixin.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2025/11/25\n# @Desc    : Auto-refresh proxy Mixin class for use by various platform clients\n\nfrom typing import TYPE_CHECKING, Optional\n\nfrom tools import utils\n\nif TYPE_CHECKING:\n    from proxy.proxy_ip_pool import ProxyIpPool\n\n\nclass ProxyRefreshMixin:\n    \"\"\"\n    Auto-refresh proxy Mixin class\n\n    Usage:\n    1. Let client class inherit this Mixin\n    2. Call init_proxy_pool(proxy_ip_pool) in client's __init__\n    3. Call await _refresh_proxy_if_expired() before each request method call\n\n    Requirements:\n    - client class must have self.proxy attribute to store current proxy URL\n    \"\"\"\n\n    _proxy_ip_pool: Optional[\"ProxyIpPool\"] = None\n\n    def init_proxy_pool(self, proxy_ip_pool: Optional[\"ProxyIpPool\"]) -> None:\n        \"\"\"\n        Initialize proxy pool reference\n        Args:\n            proxy_ip_pool: Proxy IP pool instance\n        \"\"\"\n        self._proxy_ip_pool = proxy_ip_pool\n\n    async def _refresh_proxy_if_expired(self) -> None:\n        \"\"\"\n        Check if proxy has expired, automatically refresh if so\n        Call this method before each request to ensure proxy is valid\n        \"\"\"\n        if self._proxy_ip_pool is None:\n            return\n\n        if self._proxy_ip_pool.is_current_proxy_expired():\n            utils.logger.info(\n                f\"[{self.__class__.__name__}._refresh_proxy_if_expired] Proxy expired, refreshing...\"\n            )\n            new_proxy = await self._proxy_ip_pool.get_or_refresh_proxy()\n            # Update httpx proxy URL\n            if new_proxy.user and new_proxy.password:\n                self.proxy = f\"http://{new_proxy.user}:{new_proxy.password}@{new_proxy.ip}:{new_proxy.port}\"\n            else:\n                self.proxy = f\"http://{new_proxy.ip}:{new_proxy.port}\"\n            utils.logger.info(\n                f\"[{self.__class__.__name__}._refresh_proxy_if_expired] New proxy: {new_proxy.ip}:{new_proxy.port}\"\n            )\n"
  },
  {
    "path": "proxy/types.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/proxy/types.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2024/4/5 10:18\n# @Desc    : Basic types\nimport time\nfrom enum import Enum\nfrom typing import Optional\n\nfrom pydantic import BaseModel, Field\n\n\nclass ProviderNameEnum(Enum):\n    KUAI_DAILI_PROVIDER: str = \"kuaidaili\"\n    WANDOU_HTTP_PROVIDER: str = \"wandouhttp\"\n\n\nclass IpInfoModel(BaseModel):\n    \"\"\"Unified IP model\"\"\"\n\n    ip: str = Field(title=\"ip\")\n    port: int = Field(title=\"port\")\n    user: str = Field(title=\"Username for IP proxy authentication\")\n    protocol: str = Field(default=\"https://\", title=\"Protocol for proxy IP\")\n    password: str = Field(title=\"Password for IP proxy authentication user\")\n    expired_time_ts: Optional[int] = Field(default=None, title=\"IP expiration time\")\n\n    def is_expired(self, buffer_seconds: int = 30) -> bool:\n        \"\"\"\n        Check if proxy IP has expired\n        Args:\n            buffer_seconds: Buffer time (seconds), how many seconds ahead to consider expired to avoid critical time request failures\n        Returns:\n            bool: True means expired or about to expire, False means still valid\n        \"\"\"\n        if self.expired_time_ts is None:\n            return False\n        current_ts = int(time.time())\n        return current_ts >= (self.expired_time_ts - buffer_seconds)\n"
  },
  {
    "path": "pyproject.toml",
    "content": "[project]\nname = \"mediacrawler\"\nauthor = \"程序员阿江-Relakkes <relakkes@gmail.com>\"\nversion = \"0.1.0\"\ndescription = \"A social media crawler project, support Xiaohongshu, Weibo, Zhihu, Bilibili, Douyin, BaiduTieBa etc.\"\nreadme = \"README.md\"\nrequires-python = \">=3.11\"\ndependencies = [\n    \"aiofiles~=23.2.1\",\n    \"aiomysql==0.2.0\",\n    \"aiosqlite>=0.21.0\",\n    \"alembic>=1.16.5\",\n    \"asyncmy>=0.2.10\",\n    \"cryptography>=45.0.7\",\n    \"fastapi==0.110.2\",\n    \"httpx==0.28.1\",\n    \"jieba==0.42.1\",\n    \"matplotlib==3.9.0\",\n    \"motor>=3.3.0\",\n    \"opencv-python>=4.11.0.86\",\n    \"pandas==2.2.3\",\n    \"parsel==1.9.1\",\n    \"pillow==9.5.0\",\n    \"playwright==1.45.0\",\n    \"pydantic==2.5.2\",\n    \"pyexecjs==1.5.1\",\n    \"pyhumps>=3.8.0\",\n    \"python-dotenv==1.0.1\",\n    \"redis~=4.6.0\",\n    \"requests==2.32.3\",\n    \"sqlalchemy>=2.0.43\",\n    \"tenacity==8.2.2\",\n    \"typer>=0.12.3\",\n    \"uvicorn==0.29.0\",\n    \"wordcloud==1.9.3\",\n    \"pre-commit>=3.5.0\",\n    \"openpyxl>=3.1.2\",\n    \"pytest>=7.4.0\",\n    \"pytest-asyncio>=0.21.0\",\n    \"websockets>=15.0.1\",\n    \"asyncpg>=0.31.0\",\n]\n\n[[tool.uv.index]]\nurl = \"https://pypi.tuna.tsinghua.edu.cn/simple\"\ndefault = true\n"
  },
  {
    "path": "recv_sms.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/recv_sms.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nimport re\nfrom typing import List\n\nimport uvicorn\nfrom fastapi import FastAPI, HTTPException, status\nfrom pydantic import BaseModel\n\nimport config\nfrom cache.abs_cache import AbstractCache\nfrom cache.cache_factory import CacheFactory\nfrom tools import utils\n\napp = FastAPI()\n\ncache_client : AbstractCache = CacheFactory.create_cache(cache_type=config.CACHE_TYPE_MEMORY)\n\n\nclass SmsNotification(BaseModel):\n    platform: str\n    current_number: str\n    from_number: str\n    sms_content: str\n    timestamp: str\n\n\ndef extract_verification_code(message: str) -> str:\n    \"\"\"\n    Extract verification code of 6 digits from the SMS.\n    \"\"\"\n    pattern = re.compile(r'\\b[0-9]{6}\\b')\n    codes: List[str] = pattern.findall(message)\n    return codes[0] if codes else \"\"\n\n\n@app.post(\"/\")\ndef receive_sms_notification(sms: SmsNotification):\n    \"\"\"\n    Receive SMS notification and send it to Redis.\n    Args:\n        sms:\n            {\n                \"platform\": \"xhs\",\n                \"from_number\": \"1069421xxx134\",\n                \"sms_content\": \"【小红书】您的验证码是: 171959， 3分钟内有效。请勿向他人泄漏。如非本人操作，可忽略本消息。\",\n                \"timestamp\": \"1686720601614\",\n                \"current_number\": \"13152442222\"\n            }\n\n    Returns:\n\n    \"\"\"\n    utils.logger.info(f\"Received SMS notification: {sms.platform}, {sms.current_number}\")\n    sms_code = extract_verification_code(sms.sms_content)\n    if sms_code:\n        # Save the verification code in Redis and set the expiration time to 3 minutes.\n        key = f\"{sms.platform}_{sms.current_number}\"\n        cache_client.set(key, sms_code, expire_time=60 * 3)\n\n    return {\"status\": \"ok\"}\n\n\n@app.get(\"/\", status_code=status.HTTP_404_NOT_FOUND)\nasync def not_found():\n    raise HTTPException(status_code=404, detail=\"Not Found\")\n\n\nif __name__ == '__main__':\n    uvicorn.run(app, port=8000, host='0.0.0.0')\n"
  },
  {
    "path": "requirements.txt",
    "content": "httpx==0.28.1\nPillow==12.1.0\nplaywright==1.45.0\ntenacity==8.2.2\ntyper>=0.12.3\nopencv-python\naiomysql==0.2.0\nredis~=4.6.0\npydantic==2.5.2\naiofiles~=23.2.1\nfastapi==0.110.2\nuvicorn==0.29.0\npython-dotenv==1.0.1\njieba==0.42.1\nwordcloud==1.9.3\nmatplotlib==3.9.0\nrequests==2.32.3\nparsel==1.9.1\npyexecjs==1.5.1\npandas==2.2.3\naiosqlite==0.21.0\npyhumps==3.8.0\ncryptography>=45.0.7\nalembic>=1.16.5\nasyncmy>=0.2.10\nsqlalchemy>=2.0.43\nmotor>=3.3.0\nopenpyxl>=3.1.2\npytest>=7.4.0\npytest-asyncio>=0.21.0"
  },
  {
    "path": "store/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/store/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2024/1/14 17:29\n# @Desc    :\n"
  },
  {
    "path": "store/bilibili/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/store/bilibili/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2024/1/14 19:34\n# @Desc    :\n\nfrom typing import List\n\nimport config\nfrom var import source_keyword_var\n\nfrom ._store_impl import *\nfrom .bilibilli_store_media import *\n\n\nclass BiliStoreFactory:\n    STORES = {\n        \"csv\": BiliCsvStoreImplement,\n        \"db\": BiliDbStoreImplement,\n        \"postgres\": BiliDbStoreImplement,\n        \"json\": BiliJsonStoreImplement,\n        \"jsonl\": BiliJsonlStoreImplement,\n        \"sqlite\": BiliSqliteStoreImplement,\n        \"mongodb\": BiliMongoStoreImplement,\n        \"excel\": BiliExcelStoreImplement,\n    }\n\n    @staticmethod\n    def create_store() -> AbstractStore:\n        store_class = BiliStoreFactory.STORES.get(config.SAVE_DATA_OPTION)\n        if not store_class:\n            raise ValueError(\"[BiliStoreFactory.create_store] Invalid save option only supported csv or db or json or sqlite or mongodb or excel ...\")\n        return store_class()\n\n\nasync def update_bilibili_video(video_item: Dict):\n    video_item_view: Dict = video_item.get(\"View\")\n    video_user_info: Dict = video_item_view.get(\"owner\")\n    video_item_stat: Dict = video_item_view.get(\"stat\")\n    video_id = str(video_item_view.get(\"aid\"))\n    save_content_item = {\n        \"video_id\": video_id,\n        \"video_type\": \"video\",\n        \"title\": video_item_view.get(\"title\", \"\")[:500],\n        \"desc\": video_item_view.get(\"desc\", \"\")[:500],\n        \"create_time\": video_item_view.get(\"pubdate\"),\n        \"user_id\": str(video_user_info.get(\"mid\")),\n        \"nickname\": video_user_info.get(\"name\"),\n        \"avatar\": video_user_info.get(\"face\", \"\"),\n        \"liked_count\": str(video_item_stat.get(\"like\", \"\")),\n        \"disliked_count\": str(video_item_stat.get(\"dislike\", \"\")),\n        \"video_play_count\": str(video_item_stat.get(\"view\", \"\")),\n        \"video_favorite_count\": str(video_item_stat.get(\"favorite\", \"\")),\n        \"video_share_count\": str(video_item_stat.get(\"share\", \"\")),\n        \"video_coin_count\": str(video_item_stat.get(\"coin\", \"\")),\n        \"video_danmaku\": str(video_item_stat.get(\"danmaku\", \"\")),\n        \"video_comment\": str(video_item_stat.get(\"reply\", \"\")),\n        \"last_modify_ts\": utils.get_current_timestamp(),\n        \"video_url\": f\"https://www.bilibili.com/video/av{video_id}\",\n        \"video_cover_url\": video_item_view.get(\"pic\", \"\"),\n        \"source_keyword\": source_keyword_var.get(),\n    }\n    utils.logger.info(f\"[store.bilibili.update_bilibili_video] bilibili video id:{video_id}, title:{save_content_item.get('title')}\")\n    await BiliStoreFactory.create_store().store_content(content_item=save_content_item)\n\n\nasync def update_up_info(video_item: Dict):\n    video_item_card_list: Dict = video_item.get(\"Card\")\n    video_item_card: Dict = video_item_card_list.get(\"card\")\n    saver_up_info = {\n        \"user_id\": str(video_item_card.get(\"mid\")),\n        \"nickname\": video_item_card.get(\"name\"),\n        \"sex\": video_item_card.get(\"sex\"),\n        \"sign\": video_item_card.get(\"sign\"),\n        \"avatar\": video_item_card.get(\"face\"),\n        \"last_modify_ts\": utils.get_current_timestamp(),\n        \"total_fans\": video_item_card.get(\"fans\"),\n        \"total_liked\": video_item_card_list.get(\"like_num\"),\n        \"user_rank\": video_item_card.get(\"level_info\").get(\"current_level\"),\n        \"is_official\": video_item_card.get(\"official_verify\").get(\"type\"),\n    }\n    utils.logger.info(f\"[store.bilibili.update_up_info] bilibili user_id:{video_item_card.get('mid')}\")\n    await BiliStoreFactory.create_store().store_creator(creator=saver_up_info)\n\n\nasync def batch_update_bilibili_video_comments(video_id: str, comments: List[Dict]):\n    if not comments:\n        return\n    for comment_item in comments:\n        await update_bilibili_video_comment(video_id, comment_item)\n\n\nasync def update_bilibili_video_comment(video_id: str, comment_item: Dict):\n    comment_id = str(comment_item.get(\"rpid\"))\n    parent_comment_id = str(comment_item.get(\"parent\", 0))\n    content: Dict = comment_item.get(\"content\")\n    user_info: Dict = comment_item.get(\"member\")\n    like_count: int = comment_item.get(\"like\", 0)\n    save_comment_item = {\n        \"comment_id\": comment_id,\n        \"parent_comment_id\": parent_comment_id,\n        \"create_time\": comment_item.get(\"ctime\"),\n        \"video_id\": str(video_id),\n        \"content\": content.get(\"message\"),\n        \"user_id\": user_info.get(\"mid\"),\n        \"nickname\": user_info.get(\"uname\"),\n        \"sex\": user_info.get(\"sex\"),\n        \"sign\": user_info.get(\"sign\"),\n        \"avatar\": user_info.get(\"avatar\"),\n        \"sub_comment_count\": str(comment_item.get(\"rcount\", 0)),\n        \"like_count\": like_count,\n        \"last_modify_ts\": utils.get_current_timestamp(),\n    }\n    utils.logger.info(f\"[store.bilibili.update_bilibili_video_comment] Bilibili video comment: {comment_id}, content: {save_comment_item.get('content')}\")\n    await BiliStoreFactory.create_store().store_comment(comment_item=save_comment_item)\n\n\nasync def store_video(aid, video_content, extension_file_name):\n    \"\"\"\n    video video storage implementation\n    Args:\n        aid:\n        video_content:\n        extension_file_name:\n    \"\"\"\n    await BilibiliVideo().store_video({\n        \"aid\": aid,\n        \"video_content\": video_content,\n        \"extension_file_name\": extension_file_name,\n    })\n\n\nasync def batch_update_bilibili_creator_fans(creator_info: Dict, fans_list: List[Dict]):\n    if not fans_list:\n        return\n    for fan_item in fans_list:\n        fan_info: Dict = {\n            \"id\": fan_item.get(\"mid\"),\n            \"name\": fan_item.get(\"uname\"),\n            \"sign\": fan_item.get(\"sign\"),\n            \"avatar\": fan_item.get(\"face\"),\n        }\n        await update_bilibili_creator_contact(creator_info=creator_info, fan_info=fan_info)\n\n\nasync def batch_update_bilibili_creator_followings(creator_info: Dict, followings_list: List[Dict]):\n    if not followings_list:\n        return\n    for following_item in followings_list:\n        following_info: Dict = {\n            \"id\": following_item.get(\"mid\"),\n            \"name\": following_item.get(\"uname\"),\n            \"sign\": following_item.get(\"sign\"),\n            \"avatar\": following_item.get(\"face\"),\n        }\n        await update_bilibili_creator_contact(creator_info=following_info, fan_info=creator_info)\n\n\nasync def batch_update_bilibili_creator_dynamics(creator_info: Dict, dynamics_list: List[Dict]):\n    if not dynamics_list:\n        return\n    for dynamic_item in dynamics_list:\n        dynamic_id: str = dynamic_item[\"id_str\"]\n        dynamic_text: str = \"\"\n        if dynamic_item[\"modules\"][\"module_dynamic\"].get(\"desc\"):\n            dynamic_text = dynamic_item[\"modules\"][\"module_dynamic\"][\"desc\"][\"text\"]\n        dynamic_type: str = dynamic_item[\"type\"].split(\"_\")[-1]\n        dynamic_pub_ts: str = dynamic_item[\"modules\"][\"module_author\"][\"pub_ts\"]\n        dynamic_stat: Dict = dynamic_item[\"modules\"][\"module_stat\"]\n        dynamic_comment: int = dynamic_stat[\"comment\"][\"count\"]\n        dynamic_forward: int = dynamic_stat[\"forward\"][\"count\"]\n        dynamic_like: int = dynamic_stat[\"like\"][\"count\"]\n        dynamic_info: Dict = {\n            \"dynamic_id\": dynamic_id,\n            \"text\": dynamic_text,\n            \"type\": dynamic_type,\n            \"pub_ts\": dynamic_pub_ts,\n            \"total_comments\": dynamic_comment,\n            \"total_forwards\": dynamic_forward,\n            \"total_liked\": dynamic_like,\n        }\n        await update_bilibili_creator_dynamic(creator_info=creator_info, dynamic_info=dynamic_info)\n\n\nasync def update_bilibili_creator_contact(creator_info: Dict, fan_info: Dict):\n    save_contact_item = {\n        \"up_id\": creator_info[\"id\"],\n        \"fan_id\": fan_info[\"id\"],\n        \"up_name\": creator_info[\"name\"],\n        \"fan_name\": fan_info[\"name\"],\n        \"up_sign\": creator_info[\"sign\"],\n        \"fan_sign\": fan_info[\"sign\"],\n        \"up_avatar\": creator_info[\"avatar\"],\n        \"fan_avatar\": fan_info[\"avatar\"],\n        \"last_modify_ts\": utils.get_current_timestamp(),\n    }\n\n    await BiliStoreFactory.create_store().store_contact(contact_item=save_contact_item)\n\n\nasync def update_bilibili_creator_dynamic(creator_info: Dict, dynamic_info: Dict):\n    save_dynamic_item = {\n        \"dynamic_id\": dynamic_info[\"dynamic_id\"],\n        \"user_id\": creator_info[\"id\"],\n        \"user_name\": creator_info[\"name\"],\n        \"text\": dynamic_info[\"text\"],\n        \"type\": dynamic_info[\"type\"],\n        \"pub_ts\": dynamic_info[\"pub_ts\"],\n        \"total_comments\": dynamic_info[\"total_comments\"],\n        \"total_forwards\": dynamic_info[\"total_forwards\"],\n        \"total_liked\": dynamic_info[\"total_liked\"],\n        \"last_modify_ts\": utils.get_current_timestamp(),\n    }\n\n    await BiliStoreFactory.create_store().store_dynamic(dynamic_item=save_dynamic_item)\n"
  },
  {
    "path": "store/bilibili/_store_impl.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/store/bilibili/_store_impl.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : persist1@126.com\n# @Time    : 2025/9/5 19:34\n# @Desc    : Bilibili storage implementation class\nimport asyncio\nimport csv\nimport json\nimport os\nimport pathlib\nfrom typing import Dict\n\nimport aiofiles\nfrom sqlalchemy import select\nfrom sqlalchemy.orm import sessionmaker\n\nimport config\nfrom base.base_crawler import AbstractStore\nfrom database.db_session import get_session\nfrom database.models import BilibiliVideoComment, BilibiliVideo, BilibiliUpInfo, BilibiliUpDynamic, BilibiliContactInfo\nfrom tools.async_file_writer import AsyncFileWriter\nfrom tools import utils, words\nfrom var import crawler_type_var\nfrom database.mongodb_store_base import MongoDBStoreBase\n\n\nclass BiliCsvStoreImplement(AbstractStore):\n    def __init__(self):\n        self.file_writer = AsyncFileWriter(\n            crawler_type=crawler_type_var.get(),\n            platform=\"bili\"\n        )\n\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        content CSV storage implementation\n        Args:\n            content_item:\n\n        Returns:\n\n        \"\"\"\n        await self.file_writer.write_to_csv(\n            item=content_item,\n            item_type=\"videos\"\n        )\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        comment CSV storage implementation\n        Args:\n            comment_item:\n\n        Returns:\n\n        \"\"\"\n        await self.file_writer.write_to_csv(\n            item=comment_item,\n            item_type=\"comments\"\n        )\n\n    async def store_creator(self, creator: Dict):\n        \"\"\"\n        creator CSV storage implementation\n        Args:\n            creator:\n\n        Returns:\n\n        \"\"\"\n        await self.file_writer.write_to_csv(\n            item=creator,\n            item_type=\"creators\"\n        )\n\n    async def store_contact(self, contact_item: Dict):\n        \"\"\"\n        creator contact CSV storage implementation\n        Args:\n            contact_item: creator's contact item dict\n\n        Returns:\n\n        \"\"\"\n        await self.file_writer.write_to_csv(\n            item=contact_item,\n            item_type=\"contacts\"\n        )\n\n    async def store_dynamic(self, dynamic_item: Dict):\n        \"\"\"\n        creator dynamic CSV storage implementation\n        Args:\n            dynamic_item: creator's contact item dict\n\n        Returns:\n\n        \"\"\"\n        await self.file_writer.write_to_csv(\n            item=dynamic_item,\n            item_type=\"dynamics\"\n        )\n\n\nclass BiliDbStoreImplement(AbstractStore):\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        Bilibili content DB storage implementation\n        Args:\n            content_item: content item dict\n        \"\"\"\n        video_id = int(content_item.get(\"video_id\"))\n        content_item[\"video_id\"] = video_id\n        content_item[\"user_id\"] = int(content_item.get(\"user_id\", 0) or 0)\n        content_item[\"liked_count\"] = int(content_item.get(\"liked_count\", 0) or 0)\n        content_item[\"create_time\"] = int(content_item.get(\"create_time\", 0) or 0)\n\n        async with get_session() as session:\n            result = await session.execute(select(BilibiliVideo).where(BilibiliVideo.video_id == video_id))\n            video_detail = result.scalar_one_or_none()\n\n            if not video_detail:\n                content_item[\"add_ts\"] = utils.get_current_timestamp()\n                content_item[\"last_modify_ts\"] = utils.get_current_timestamp()\n                new_content = BilibiliVideo(**content_item)\n                session.add(new_content)\n            else:\n                content_item[\"last_modify_ts\"] = utils.get_current_timestamp()\n                for key, value in content_item.items():\n                    setattr(video_detail, key, value)\n            await session.commit()\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        Bilibili comment DB storage implementation\n        Args:\n            comment_item: comment item dict\n        \"\"\"\n        comment_id = int(comment_item.get(\"comment_id\"))\n        comment_item[\"comment_id\"] = comment_id\n        comment_item[\"video_id\"] = int(comment_item.get(\"video_id\", 0) or 0)\n        comment_item[\"create_time\"] = int(comment_item.get(\"create_time\", 0) or 0)\n        comment_item[\"like_count\"] = str(comment_item.get(\"like_count\", \"0\"))\n        comment_item[\"sub_comment_count\"] = str(comment_item.get(\"sub_comment_count\", \"0\"))\n        comment_item[\"parent_comment_id\"] = str(comment_item.get(\"parent_comment_id\", \"0\"))\n\n        async with get_session() as session:\n            result = await session.execute(select(BilibiliVideoComment).where(BilibiliVideoComment.comment_id == comment_id))\n            comment_detail = result.scalar_one_or_none()\n\n            if not comment_detail:\n                comment_item[\"add_ts\"] = utils.get_current_timestamp()\n                comment_item[\"last_modify_ts\"] = utils.get_current_timestamp()\n                new_comment = BilibiliVideoComment(**comment_item)\n                session.add(new_comment)\n            else:\n                comment_item[\"last_modify_ts\"] = utils.get_current_timestamp()\n                for key, value in comment_item.items():\n                    setattr(comment_detail, key, value)\n            await session.commit()\n\n    async def store_creator(self, creator: Dict):\n        \"\"\"\n        Bilibili creator DB storage implementation\n        Args:\n            creator: creator item dict\n        \"\"\"\n        creator_id = int(creator.get(\"user_id\"))\n        creator[\"user_id\"] = creator_id\n        creator[\"total_fans\"] = int(creator.get(\"total_fans\", 0) or 0)\n        creator[\"total_liked\"] = int(creator.get(\"total_liked\", 0) or 0)\n        creator[\"user_rank\"] = int(creator.get(\"user_rank\", 0) or 0)\n        creator[\"is_official\"] = int(creator.get(\"is_official\", 0) or 0)\n\n        async with get_session() as session:\n            result = await session.execute(select(BilibiliUpInfo).where(BilibiliUpInfo.user_id == creator_id))\n            creator_detail = result.scalar_one_or_none()\n\n            if not creator_detail:\n                creator[\"add_ts\"] = utils.get_current_timestamp()\n                creator[\"last_modify_ts\"] = utils.get_current_timestamp()\n                new_creator = BilibiliUpInfo(**creator)\n                session.add(new_creator)\n            else:\n                creator[\"last_modify_ts\"] = utils.get_current_timestamp()\n                for key, value in creator.items():\n                    setattr(creator_detail, key, value)\n            await session.commit()\n\n    async def store_contact(self, contact_item: Dict):\n        \"\"\"\n        Bilibili contact DB storage implementation\n        Args:\n            contact_item: contact item dict\n        \"\"\"\n        up_id = int(contact_item.get(\"up_id\"))\n        fan_id = int(contact_item.get(\"fan_id\"))\n        contact_item[\"up_id\"] = up_id\n        contact_item[\"fan_id\"] = fan_id\n\n        async with get_session() as session:\n            result = await session.execute(\n                select(BilibiliContactInfo).where(BilibiliContactInfo.up_id == up_id, BilibiliContactInfo.fan_id == fan_id)\n            )\n            contact_detail = result.scalar_one_or_none()\n\n            if not contact_detail:\n                contact_item[\"add_ts\"] = utils.get_current_timestamp()\n                contact_item[\"last_modify_ts\"] = utils.get_current_timestamp()\n                new_contact = BilibiliContactInfo(**contact_item)\n                session.add(new_contact)\n            else:\n                contact_item[\"last_modify_ts\"] = utils.get_current_timestamp()\n                for key, value in contact_item.items():\n                    setattr(contact_detail, key, value)\n            await session.commit()\n\n    async def store_dynamic(self, dynamic_item):\n        \"\"\"\n        Bilibili dynamic DB storage implementation\n        Args:\n            dynamic_item: dynamic item dict\n        \"\"\"\n        dynamic_id = int(dynamic_item.get(\"dynamic_id\"))\n        dynamic_item[\"dynamic_id\"] = dynamic_id\n\n        async with get_session() as session:\n            result = await session.execute(select(BilibiliUpDynamic).where(BilibiliUpDynamic.dynamic_id == dynamic_id))\n            dynamic_detail = result.scalar_one_or_none()\n\n            if not dynamic_detail:\n                dynamic_item[\"add_ts\"] = utils.get_current_timestamp()\n                dynamic_item[\"last_modify_ts\"] = utils.get_current_timestamp()\n                new_dynamic = BilibiliUpDynamic(**dynamic_item)\n                session.add(new_dynamic)\n            else:\n                dynamic_item[\"last_modify_ts\"] = utils.get_current_timestamp()\n                for key, value in dynamic_item.items():\n                    setattr(dynamic_detail, key, value)\n            await session.commit()\n\n\nclass BiliJsonStoreImplement(AbstractStore):\n    def __init__(self):\n        self.file_writer = AsyncFileWriter(\n            crawler_type=crawler_type_var.get(),\n            platform=\"bili\"\n        )\n\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        content JSON storage implementation\n        Args:\n            content_item:\n\n        Returns:\n\n        \"\"\"\n        await self.file_writer.write_single_item_to_json(\n            item=content_item,\n            item_type=\"contents\"\n        )\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        comment JSON storage implementation\n        Args:\n            comment_item:\n\n        Returns:\n\n        \"\"\"\n        await self.file_writer.write_single_item_to_json(\n            item=comment_item,\n            item_type=\"comments\"\n        )\n\n    async def store_creator(self, creator: Dict):\n        \"\"\"\n        creator JSON storage implementation\n        Args:\n            creator:\n\n        Returns:\n\n        \"\"\"\n        await self.file_writer.write_single_item_to_json(\n            item=creator,\n            item_type=\"creators\"\n        )\n\n    async def store_contact(self, contact_item: Dict):\n        \"\"\"\n        creator contact JSON storage implementation\n        Args:\n            contact_item: creator's contact item dict\n\n        Returns:\n\n        \"\"\"\n        await self.file_writer.write_single_item_to_json(\n            item=contact_item,\n            item_type=\"contacts\"\n        )\n\n    async def store_dynamic(self, dynamic_item: Dict):\n        \"\"\"\n        creator dynamic JSON storage implementation\n        Args:\n            dynamic_item: creator's contact item dict\n\n        Returns:\n\n        \"\"\"\n        await self.file_writer.write_single_item_to_json(\n            item=dynamic_item,\n            item_type=\"dynamics\"\n        )\n\n\n\nclass BiliJsonlStoreImplement(AbstractStore):\n    def __init__(self):\n        self.file_writer = AsyncFileWriter(\n            crawler_type=crawler_type_var.get(),\n            platform=\"bili\"\n        )\n\n    async def store_content(self, content_item: Dict):\n        await self.file_writer.write_to_jsonl(\n            item=content_item,\n            item_type=\"contents\"\n        )\n\n    async def store_comment(self, comment_item: Dict):\n        await self.file_writer.write_to_jsonl(\n            item=comment_item,\n            item_type=\"comments\"\n        )\n\n    async def store_creator(self, creator: Dict):\n        await self.file_writer.write_to_jsonl(\n            item=creator,\n            item_type=\"creators\"\n        )\n\n    async def store_contact(self, contact_item: Dict):\n        await self.file_writer.write_to_jsonl(\n            item=contact_item,\n            item_type=\"contacts\"\n        )\n\n    async def store_dynamic(self, dynamic_item: Dict):\n        await self.file_writer.write_to_jsonl(\n            item=dynamic_item,\n            item_type=\"dynamics\"\n        )\n\n\nclass BiliSqliteStoreImplement(BiliDbStoreImplement):\n    pass\n\n\nclass BiliMongoStoreImplement(AbstractStore):\n    \"\"\"Bilibili MongoDB storage implementation\"\"\"\n\n    def __init__(self):\n        self.mongo_store = MongoDBStoreBase(collection_prefix=\"bilibili\")\n\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        Store video content to MongoDB\n        Args:\n            content_item: Video content data\n        \"\"\"\n        video_id = content_item.get(\"video_id\")\n        if not video_id:\n            return\n\n        await self.mongo_store.save_or_update(\n            collection_suffix=\"contents\",\n            query={\"video_id\": video_id},\n            data=content_item\n        )\n        utils.logger.info(f\"[BiliMongoStoreImplement.store_content] Saved video {video_id} to MongoDB\")\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        Store comment to MongoDB\n        Args:\n            comment_item: Comment data\n        \"\"\"\n        comment_id = comment_item.get(\"comment_id\")\n        if not comment_id:\n            return\n\n        await self.mongo_store.save_or_update(\n            collection_suffix=\"comments\",\n            query={\"comment_id\": comment_id},\n            data=comment_item\n        )\n        utils.logger.info(f\"[BiliMongoStoreImplement.store_comment] Saved comment {comment_id} to MongoDB\")\n\n    async def store_creator(self, creator_item: Dict):\n        \"\"\"\n        Store UP master information to MongoDB\n        Args:\n            creator_item: UP master data\n        \"\"\"\n        user_id = creator_item.get(\"user_id\")\n        if not user_id:\n            return\n\n        await self.mongo_store.save_or_update(\n            collection_suffix=\"creators\",\n            query={\"user_id\": user_id},\n            data=creator_item\n        )\n        utils.logger.info(f\"[BiliMongoStoreImplement.store_creator] Saved creator {user_id} to MongoDB\")\n\n\nclass BiliExcelStoreImplement:\n    \"\"\"Bilibili Excel storage implementation - Global singleton\"\"\"\n\n    def __new__(cls, *args, **kwargs):\n        from store.excel_store_base import ExcelStoreBase\n        return ExcelStoreBase.get_instance(\n            platform=\"bilibili\",\n            crawler_type=crawler_type_var.get()\n        )\n"
  },
  {
    "path": "store/bilibili/bilibilli_store_media.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/store/bilibili/bilibilli_store_media.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# -*- coding: utf-8 -*-\n# @Author  : helloteemo\n# @Time    : 2024/7/12 20:01\n# @Desc    : Bilibili media storage\nimport pathlib\nfrom typing import Dict\n\nimport aiofiles\n\nfrom base.base_crawler import AbstractStoreImage, AbstractStoreVideo\nfrom tools import utils\nimport config\n\n\nclass BilibiliVideo(AbstractStoreVideo):\n    def __init__(self):\n        if config.SAVE_DATA_PATH:\n            self.video_store_path = f\"{config.SAVE_DATA_PATH}/bili/videos\"\n        else:\n            self.video_store_path = \"data/bili/videos\"\n\n    async def store_video(self, video_content_item: Dict):\n        \"\"\"\n        store content\n\n        Args:\n            video_content_item:\n\n        Returns:\n\n        \"\"\"\n        await self.save_video(video_content_item.get(\"aid\"), video_content_item.get(\"video_content\"), video_content_item.get(\"extension_file_name\"))\n\n    def make_save_file_name(self, aid: str, extension_file_name: str) -> str:\n        \"\"\"\n        make save file name by store type\n\n        Args:\n            aid: aid\n            extension_file_name: video filename with extension\n\n        Returns:\n\n        \"\"\"\n        return f\"{self.video_store_path}/{aid}/{extension_file_name}\"\n\n    async def save_video(self, aid: int, video_content: str, extension_file_name=\"mp4\"):\n        \"\"\"\n        save video to local\n\n        Args:\n            aid: aid\n            video_content: video content\n            extension_file_name: video filename with extension\n\n        Returns:\n\n        \"\"\"\n        pathlib.Path(self.video_store_path + \"/\" + str(aid)).mkdir(parents=True, exist_ok=True)\n        save_file_name = self.make_save_file_name(str(aid), extension_file_name)\n        async with aiofiles.open(save_file_name, 'wb') as f:\n            await f.write(video_content)\n            utils.logger.info(f\"[BilibiliVideoImplement.save_video] save save_video {save_file_name} success ...\")\n"
  },
  {
    "path": "store/douyin/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/store/douyin/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2024/1/14 18:46\n# @Desc    :\nfrom typing import List\n\nimport config\nfrom var import source_keyword_var\n\nfrom ._store_impl import *\nfrom .douyin_store_media import *\n\n\nclass DouyinStoreFactory:\n    STORES = {\n        \"csv\": DouyinCsvStoreImplement,\n        \"db\": DouyinDbStoreImplement,\n        \"postgres\": DouyinDbStoreImplement,\n        \"json\": DouyinJsonStoreImplement,\n        \"jsonl\": DouyinJsonlStoreImplement,\n        \"sqlite\": DouyinSqliteStoreImplement,\n        \"mongodb\": DouyinMongoStoreImplement,\n        \"excel\": DouyinExcelStoreImplement,\n    }\n\n    @staticmethod\n    def create_store() -> AbstractStore:\n        store_class = DouyinStoreFactory.STORES.get(config.SAVE_DATA_OPTION)\n        if not store_class:\n            raise ValueError(\"[DouyinStoreFactory.create_store] Invalid save option only supported csv or db or json or sqlite or mongodb or excel ...\")\n        return store_class()\n\n\ndef _extract_note_image_list(aweme_detail: Dict) -> List[str]:\n    \"\"\"\n    Extract note image list\n\n    Args:\n        aweme_detail (Dict): Douyin content details\n\n    Returns:\n        List[str]: Note image list\n    \"\"\"\n    images_res: List[str] = []\n    images: List[Dict] = aweme_detail.get(\"images\", [])\n\n    if not images:\n        return []\n\n    for image in images:\n        image_url_list = image.get(\"url_list\", [])  # download_url_list has watermarked images, url_list has non-watermarked images\n        if image_url_list:\n            images_res.append(image_url_list[-1])\n\n    return images_res\n\n\ndef _extract_comment_image_list(comment_item: Dict) -> List[str]:\n    \"\"\"\n    Extract comment image list\n\n    Args:\n        comment_item (Dict): Douyin comment\n\n    Returns:\n        List[str]: Comment image list\n    \"\"\"\n    images_res: List[str] = []\n    image_list: List[Dict] = comment_item.get(\"image_list\", [])\n\n    if not image_list:\n        return []\n\n    for image in image_list:\n        image_url_list = image.get(\"origin_url\", {}).get(\"url_list\", [])\n        if image_url_list and len(image_url_list) > 1:\n            images_res.append(image_url_list[1])\n\n    return images_res\n\n\ndef _extract_content_cover_url(aweme_detail: Dict) -> str:\n    \"\"\"\n    Extract video cover URL\n\n    Args:\n        aweme_detail (Dict): Douyin content details\n\n    Returns:\n        str: Video cover URL\n    \"\"\"\n    res_cover_url = \"\"\n\n    video_item = aweme_detail.get(\"video\", {})\n    raw_cover_url_list = (video_item.get(\"raw_cover\", {}) or video_item.get(\"origin_cover\", {})).get(\"url_list\", [])\n    if raw_cover_url_list and len(raw_cover_url_list) > 1:\n        res_cover_url = raw_cover_url_list[1]\n\n    return res_cover_url\n\n\ndef _extract_video_download_url(aweme_detail: Dict) -> str:\n    \"\"\"\n    Extract video download URL\n\n    Args:\n        aweme_detail (Dict): Douyin video\n\n    Returns:\n        str: Video download URL\n    \"\"\"\n    video_item = aweme_detail.get(\"video\", {})\n    url_h264_list = video_item.get(\"play_addr_h264\", {}).get(\"url_list\", [])\n    url_256_list = video_item.get(\"play_addr_256\", {}).get(\"url_list\", [])\n    url_list = video_item.get(\"play_addr\", {}).get(\"url_list\", [])\n    actual_url_list = url_h264_list or url_256_list or url_list\n    if not actual_url_list or len(actual_url_list) < 2:\n        return \"\"\n    return actual_url_list[-1]\n\n\ndef _extract_music_download_url(aweme_detail: Dict) -> str:\n    \"\"\"\n    Extract music download URL\n\n    Args:\n        aweme_detail (Dict): Douyin video\n\n    Returns:\n        str: Music download URL\n    \"\"\"\n    music_item = aweme_detail.get(\"music\", {})\n    play_url = music_item.get(\"play_url\", {})\n    music_url = play_url.get(\"uri\", \"\")\n    return music_url\n\n\nasync def update_douyin_aweme(aweme_item: Dict):\n    aweme_id = aweme_item.get(\"aweme_id\")\n    user_info = aweme_item.get(\"author\", {})\n    interact_info = aweme_item.get(\"statistics\", {})\n    save_content_item = {\n        \"aweme_id\": aweme_id,\n        \"aweme_type\": str(aweme_item.get(\"aweme_type\")),\n        \"title\": aweme_item.get(\"desc\", \"\"),\n        \"desc\": aweme_item.get(\"desc\", \"\"),\n        \"create_time\": aweme_item.get(\"create_time\"),\n        \"user_id\": user_info.get(\"uid\"),\n        \"sec_uid\": user_info.get(\"sec_uid\"),\n        \"short_user_id\": user_info.get(\"short_id\"),\n        \"user_unique_id\": user_info.get(\"unique_id\"),\n        \"user_signature\": user_info.get(\"signature\"),\n        \"nickname\": user_info.get(\"nickname\"),\n        \"avatar\": user_info.get(\"avatar_thumb\", {}).get(\"url_list\", [\"\"])[0],\n        \"liked_count\": str(interact_info.get(\"digg_count\")),\n        \"collected_count\": str(interact_info.get(\"collect_count\")),\n        \"comment_count\": str(interact_info.get(\"comment_count\")),\n        \"share_count\": str(interact_info.get(\"share_count\")),\n        \"ip_location\": aweme_item.get(\"ip_label\", \"\"),\n        \"last_modify_ts\": utils.get_current_timestamp(),\n        \"aweme_url\": f\"https://www.douyin.com/video/{aweme_id}\",\n        \"cover_url\": _extract_content_cover_url(aweme_item),\n        \"video_download_url\": _extract_video_download_url(aweme_item),\n        \"music_download_url\": _extract_music_download_url(aweme_item),\n        \"note_download_url\": \",\".join(_extract_note_image_list(aweme_item)),\n        \"source_keyword\": source_keyword_var.get(),\n    }\n    utils.logger.info(f\"[store.douyin.update_douyin_aweme] douyin aweme id:{aweme_id}, title:{save_content_item.get('title')}\")\n    await DouyinStoreFactory.create_store().store_content(content_item=save_content_item)\n\n\nasync def batch_update_dy_aweme_comments(aweme_id: str, comments: List[Dict]):\n    if not comments:\n        return\n    for comment_item in comments:\n        await update_dy_aweme_comment(aweme_id, comment_item)\n\n\nasync def update_dy_aweme_comment(aweme_id: str, comment_item: Dict):\n    comment_aweme_id = comment_item.get(\"aweme_id\")\n    if aweme_id != comment_aweme_id:\n        utils.logger.error(f\"[store.douyin.update_dy_aweme_comment] comment_aweme_id: {comment_aweme_id} != aweme_id: {aweme_id}\")\n        return\n    user_info = comment_item.get(\"user\", {})\n    comment_id = comment_item.get(\"cid\")\n    parent_comment_id = comment_item.get(\"reply_id\", \"0\")\n    avatar_info = (user_info.get(\"avatar_medium\", {}) or user_info.get(\"avatar_300x300\", {}) or user_info.get(\"avatar_168x168\", {}) or user_info.get(\"avatar_thumb\", {}) or {})\n    save_comment_item = {\n        \"comment_id\": comment_id,\n        \"create_time\": comment_item.get(\"create_time\"),\n        \"ip_location\": comment_item.get(\"ip_label\", \"\"),\n        \"aweme_id\": aweme_id,\n        \"content\": comment_item.get(\"text\"),\n        \"user_id\": user_info.get(\"uid\"),\n        \"sec_uid\": user_info.get(\"sec_uid\"),\n        \"short_user_id\": user_info.get(\"short_id\"),\n        \"user_unique_id\": user_info.get(\"unique_id\"),\n        \"user_signature\": user_info.get(\"signature\"),\n        \"nickname\": user_info.get(\"nickname\"),\n        \"avatar\": avatar_info.get(\"url_list\", [\"\"])[0],\n        \"sub_comment_count\": str(comment_item.get(\"reply_comment_total\", 0)),\n        \"like_count\": (comment_item.get(\"digg_count\") if comment_item.get(\"digg_count\") else 0),\n        \"last_modify_ts\": utils.get_current_timestamp(),\n        \"parent_comment_id\": parent_comment_id,\n        \"pictures\": \",\".join(_extract_comment_image_list(comment_item)),\n    }\n    utils.logger.info(f\"[store.douyin.update_dy_aweme_comment] douyin aweme comment: {comment_id}, content: {save_comment_item.get('content')}\")\n\n    await DouyinStoreFactory.create_store().store_comment(comment_item=save_comment_item)\n\n\nasync def save_creator(user_id: str, creator: Dict):\n    user_info = creator.get(\"user\", {})\n    gender_map = {0: \"Unknown\", 1: \"Male\", 2: \"Female\"}\n    avatar_uri = user_info.get(\"avatar_300x300\", {}).get(\"uri\")\n    local_db_item = {\n        \"user_id\": user_id,\n        \"nickname\": user_info.get(\"nickname\"),\n        \"gender\": gender_map.get(user_info.get(\"gender\"), \"Unknown\"),\n        \"avatar\": f\"https://p3-pc.douyinpic.com/img/{avatar_uri}\" + r\"~c5_300x300.jpeg?from=2956013662\",\n        \"desc\": user_info.get(\"signature\"),\n        \"ip_location\": user_info.get(\"ip_location\"),\n        \"follows\": user_info.get(\"following_count\", 0),\n        \"fans\": user_info.get(\"max_follower_count\", 0),\n        \"interaction\": user_info.get(\"total_favorited\", 0),\n        \"videos_count\": user_info.get(\"aweme_count\", 0),\n        \"last_modify_ts\": utils.get_current_timestamp(),\n    }\n    utils.logger.info(f\"[store.douyin.save_creator] creator:{local_db_item}\")\n    await DouyinStoreFactory.create_store().store_creator(local_db_item)\n\n\nasync def update_dy_aweme_image(aweme_id, pic_content, extension_file_name):\n    \"\"\"\n    Update Douyin note image\n    Args:\n        aweme_id:\n        pic_content:\n        extension_file_name:\n\n    Returns:\n\n    \"\"\"\n\n    await DouYinImage().store_image({\"aweme_id\": aweme_id, \"pic_content\": pic_content, \"extension_file_name\": extension_file_name})\n\n\nasync def update_dy_aweme_video(aweme_id, video_content, extension_file_name):\n    \"\"\"\n    Update Douyin short video\n    Args:\n        aweme_id:\n        video_content:\n        extension_file_name:\n\n    Returns:\n\n    \"\"\"\n\n    await DouYinVideo().store_video({\"aweme_id\": aweme_id, \"video_content\": video_content, \"extension_file_name\": extension_file_name})\n"
  },
  {
    "path": "store/douyin/_store_impl.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/store/douyin/_store_impl.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : persist1@126.com\n# @Time    : 2025/9/5 19:34\n# @Desc    : Douyin storage implementation class\nimport asyncio\nimport json\nimport os\nimport pathlib\nfrom typing import Dict\n\nfrom sqlalchemy import select\n\nimport config\nfrom base.base_crawler import AbstractStore\nfrom database.db_session import get_session\nfrom database.models import DouyinAweme, DouyinAwemeComment, DyCreator\nfrom tools import utils, words\nfrom tools.async_file_writer import AsyncFileWriter\nfrom var import crawler_type_var\nfrom database.mongodb_store_base import MongoDBStoreBase\n\n\nclass DouyinCsvStoreImplement(AbstractStore):\n    def __init__(self):\n        self.file_writer = AsyncFileWriter(\n            crawler_type=crawler_type_var.get(),\n            platform=\"douyin\"\n        )\n\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        Douyin content CSV storage implementation\n        Args:\n            content_item: note item dict\n\n        Returns:\n\n        \"\"\"\n        await self.file_writer.write_to_csv(\n            item=content_item,\n            item_type=\"contents\"\n        )\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        Douyin comment CSV storage implementation\n        Args:\n            comment_item: comment item dict\n\n        Returns:\n\n        \"\"\"\n        await self.file_writer.write_to_csv(\n            item=comment_item,\n            item_type=\"comments\"\n        )\n\n    async def store_creator(self, creator: Dict):\n        \"\"\"\n        Douyin creator CSV storage implementation\n        Args:\n            creator: creator item dict\n\n        Returns:\n\n        \"\"\"\n        await self.file_writer.write_to_csv(\n            item=creator,\n            item_type=\"creators\"\n        )\n\n\nclass DouyinDbStoreImplement(AbstractStore):\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        Douyin content DB storage implementation\n        Args:\n            content_item: content item dict\n        \"\"\"\n        aweme_id = int(content_item.get(\"aweme_id\"))\n        async with get_session() as session:\n            result = await session.execute(select(DouyinAweme).where(DouyinAweme.aweme_id == aweme_id))\n            aweme_detail = result.scalar_one_or_none()\n\n            if not aweme_detail:\n                content_item[\"add_ts\"] = utils.get_current_timestamp()\n                if content_item.get(\"title\"):\n                    new_content = DouyinAweme(**content_item)\n                    session.add(new_content)\n            else:\n                for key, value in content_item.items():\n                    setattr(aweme_detail, key, value)\n            await session.commit()\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        Douyin comment DB storage implementation\n        Args:\n            comment_item: comment item dict\n        \"\"\"\n        comment_id = int(comment_item.get(\"comment_id\"))\n        async with get_session() as session:\n            result = await session.execute(select(DouyinAwemeComment).where(DouyinAwemeComment.comment_id == comment_id))\n            comment_detail = result.scalar_one_or_none()\n\n            if not comment_detail:\n                comment_item[\"add_ts\"] = utils.get_current_timestamp()\n                new_comment = DouyinAwemeComment(**comment_item)\n                session.add(new_comment)\n            else:\n                for key, value in comment_item.items():\n                    setattr(comment_detail, key, value)\n            await session.commit()\n\n    async def store_creator(self, creator: Dict):\n        \"\"\"\n        Douyin creator DB storage implementation\n        Args:\n            creator: creator dict\n        \"\"\"\n        user_id = creator.get(\"user_id\")\n        async with get_session() as session:\n            result = await session.execute(select(DyCreator).where(DyCreator.user_id == user_id))\n            user_detail = result.scalar_one_or_none()\n\n            if not user_detail:\n                creator[\"add_ts\"] = utils.get_current_timestamp()\n                new_creator = DyCreator(**creator)\n                session.add(new_creator)\n            else:\n                for key, value in creator.items():\n                    setattr(user_detail, key, value)\n            await session.commit()\n\n\nclass DouyinJsonStoreImplement(AbstractStore):\n    def __init__(self):\n        self.file_writer = AsyncFileWriter(\n            crawler_type=crawler_type_var.get(),\n            platform=\"douyin\"\n        )\n\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        content JSON storage implementation\n        Args:\n            content_item:\n\n        Returns:\n\n        \"\"\"\n        await self.file_writer.write_single_item_to_json(\n            item=content_item,\n            item_type=\"contents\"\n        )\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        comment JSON storage implementation\n        Args:\n            comment_item:\n\n        Returns:\n\n        \"\"\"\n        await self.file_writer.write_single_item_to_json(\n            item=comment_item,\n            item_type=\"comments\"\n        )\n\n    async def store_creator(self, creator: Dict):\n        \"\"\"\n        creator JSON storage implementation\n        Args:\n            creator:\n\n        Returns:\n\n        \"\"\"\n        await self.file_writer.write_single_item_to_json(\n            item=creator,\n            item_type=\"creators\"\n        )\n\n\n\nclass DouyinJsonlStoreImplement(AbstractStore):\n    def __init__(self):\n        self.file_writer = AsyncFileWriter(\n            crawler_type=crawler_type_var.get(),\n            platform=\"douyin\"\n        )\n\n    async def store_content(self, content_item: Dict):\n        await self.file_writer.write_to_jsonl(\n            item=content_item,\n            item_type=\"contents\"\n        )\n\n    async def store_comment(self, comment_item: Dict):\n        await self.file_writer.write_to_jsonl(\n            item=comment_item,\n            item_type=\"comments\"\n        )\n\n    async def store_creator(self, creator: Dict):\n        await self.file_writer.write_to_jsonl(\n            item=creator,\n            item_type=\"creators\"\n        )\n\n\nclass DouyinSqliteStoreImplement(DouyinDbStoreImplement):\n    pass\n\n\nclass DouyinMongoStoreImplement(AbstractStore):\n    \"\"\"Douyin MongoDB storage implementation\"\"\"\n\n    def __init__(self):\n        self.mongo_store = MongoDBStoreBase(collection_prefix=\"douyin\")\n\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        Store video content to MongoDB\n        Args:\n            content_item: Video content data\n        \"\"\"\n        aweme_id = content_item.get(\"aweme_id\")\n        if not aweme_id:\n            return\n\n        await self.mongo_store.save_or_update(\n            collection_suffix=\"contents\",\n            query={\"aweme_id\": aweme_id},\n            data=content_item\n        )\n        utils.logger.info(f\"[DouyinMongoStoreImplement.store_content] Saved aweme {aweme_id} to MongoDB\")\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        Store comment to MongoDB\n        Args:\n            comment_item: Comment data\n        \"\"\"\n        comment_id = comment_item.get(\"comment_id\")\n        if not comment_id:\n            return\n\n        await self.mongo_store.save_or_update(\n            collection_suffix=\"comments\",\n            query={\"comment_id\": comment_id},\n            data=comment_item\n        )\n        utils.logger.info(f\"[DouyinMongoStoreImplement.store_comment] Saved comment {comment_id} to MongoDB\")\n\n    async def store_creator(self, creator_item: Dict):\n        \"\"\"\n        Store creator information to MongoDB\n        Args:\n            creator_item: Creator data\n        \"\"\"\n        user_id = creator_item.get(\"user_id\")\n        if not user_id:\n            return\n\n        await self.mongo_store.save_or_update(\n            collection_suffix=\"creators\",\n            query={\"user_id\": user_id},\n            data=creator_item\n        )\n        utils.logger.info(f\"[DouyinMongoStoreImplement.store_creator] Saved creator {user_id} to MongoDB\")\n\n\nclass DouyinExcelStoreImplement:\n    \"\"\"Douyin Excel storage implementation - Global singleton\"\"\"\n\n    def __new__(cls, *args, **kwargs):\n        from store.excel_store_base import ExcelStoreBase\n        return ExcelStoreBase.get_instance(\n            platform=\"douyin\",\n            crawler_type=crawler_type_var.get()\n        )\n"
  },
  {
    "path": "store/douyin/douyin_store_media.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/store/douyin/douyin_store_media.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\nimport pathlib\nfrom typing import Dict\n\nimport aiofiles\n\nfrom base.base_crawler import AbstractStoreImage, AbstractStoreVideo\nfrom tools import utils\nimport config\n\n\nclass DouYinImage(AbstractStoreImage):\n    def __init__(self):\n        if config.SAVE_DATA_PATH:\n            self.image_store_path = f\"{config.SAVE_DATA_PATH}/douyin/images\"\n        else:\n            self.image_store_path = \"data/douyin/images\"\n\n    async def store_image(self, image_content_item: Dict):\n        \"\"\"\n        store content\n\n        Args:\n            image_content_item:\n\n        Returns:\n\n        \"\"\"\n        await self.save_image(image_content_item.get(\"aweme_id\"), image_content_item.get(\"pic_content\"), image_content_item.get(\"extension_file_name\"))\n\n    def make_save_file_name(self, aweme_id: str, extension_file_name: str) -> str:\n        \"\"\"\n        make save file name by store type\n\n        Args:\n            aweme_id: aweme id\n            extension_file_name: image filename with extension\n\n        Returns:\n\n        \"\"\"\n        return f\"{self.image_store_path}/{aweme_id}/{extension_file_name}\"\n\n    async def save_image(self, aweme_id: str, pic_content: str, extension_file_name):\n        \"\"\"\n        save image to local\n\n        Args:\n            aweme_id: aweme id\n            pic_content: image content\n            extension_file_name: image filename with extension\n\n        Returns:\n\n        \"\"\"\n        pathlib.Path(self.image_store_path + \"/\" + aweme_id).mkdir(parents=True, exist_ok=True)\n        save_file_name = self.make_save_file_name(aweme_id, extension_file_name)\n        async with aiofiles.open(save_file_name, 'wb') as f:\n            await f.write(pic_content)\n            utils.logger.info(f\"[DouYinImageStoreImplement.save_image] save image {save_file_name} success ...\")\n\n\nclass DouYinVideo(AbstractStoreVideo):\n    def __init__(self):\n        if config.SAVE_DATA_PATH:\n            self.video_store_path = f\"{config.SAVE_DATA_PATH}/douyin/videos\"\n        else:\n            self.video_store_path = \"data/douyin/videos\"\n\n    async def store_video(self, video_content_item: Dict):\n        \"\"\"\n        store content\n\n        Args:\n            video_content_item:\n\n        Returns:\n\n        \"\"\"\n        await self.save_video(video_content_item.get(\"aweme_id\"), video_content_item.get(\"video_content\"), video_content_item.get(\"extension_file_name\"))\n\n    def make_save_file_name(self, aweme_id: str, extension_file_name: str) -> str:\n        \"\"\"\n        make save file name by store type\n\n        Args:\n            aweme_id: aweme id\n            extension_file_name: video filename with extension\n\n        Returns:\n\n        \"\"\"\n        return f\"{self.video_store_path}/{aweme_id}/{extension_file_name}\"\n\n    async def save_video(self, aweme_id: str, video_content: str, extension_file_name):\n        \"\"\"\n        save video to local\n\n        Args:\n            aweme_id: aweme id\n            video_content: video content\n            extension_file_name: video filename with extension\n\n        Returns:\n\n        \"\"\"\n        pathlib.Path(self.video_store_path + \"/\" + aweme_id).mkdir(parents=True, exist_ok=True)\n        save_file_name = self.make_save_file_name(aweme_id, extension_file_name)\n        async with aiofiles.open(save_file_name, 'wb') as f:\n            await f.write(video_content)\n            utils.logger.info(f\"[DouYinVideoStoreImplement.save_video] save video {save_file_name} success ...\")\n"
  },
  {
    "path": "store/excel_store_base.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/store/excel_store_base.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# 声明:本代码仅供学习和研究目的使用。使用者应遵守以下原则:\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率,避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\"\"\"\nExcel Store Base Implementation\nProvides Excel export functionality for crawled data with formatted sheets\n\"\"\"\n\nimport threading\nfrom datetime import datetime\nfrom typing import Dict, List, Any\nfrom pathlib import Path\n\ntry:\n    import openpyxl\n    from openpyxl.styles import Font, PatternFill, Alignment, Border, Side\n    from openpyxl.utils import get_column_letter\n    EXCEL_AVAILABLE = True\nexcept ImportError:\n    EXCEL_AVAILABLE = False\n\nfrom base.base_crawler import AbstractStore\nfrom tools import utils\nimport config\n\n\nclass ExcelStoreBase(AbstractStore):\n    \"\"\"\n    Base class for Excel storage implementation\n    Provides formatted Excel export with multiple sheets for contents, comments, and creators\n    Uses singleton pattern to maintain state across multiple store calls\n    \"\"\"\n\n    # Class-level singleton management\n    _instances: Dict[str, \"ExcelStoreBase\"] = {}\n    _lock = threading.Lock()\n\n    @classmethod\n    def get_instance(cls, platform: str, crawler_type: str) -> \"ExcelStoreBase\":\n        \"\"\"\n        Get or create a singleton instance for the given platform and crawler type\n\n        Args:\n            platform: Platform name (xhs, dy, ks, etc.)\n            crawler_type: Type of crawler (search, detail, creator)\n\n        Returns:\n            ExcelStoreBase instance\n        \"\"\"\n        key = f\"{platform}_{crawler_type}\"\n        with cls._lock:\n            if key not in cls._instances:\n                cls._instances[key] = cls(platform, crawler_type)\n            return cls._instances[key]\n\n    @classmethod\n    def flush_all(cls):\n        \"\"\"\n        Flush all Excel store instances and save to files\n        Should be called at the end of crawler execution\n        \"\"\"\n        with cls._lock:\n            for key, instance in cls._instances.items():\n                try:\n                    instance.flush()\n                    utils.logger.info(f\"[ExcelStoreBase] Flushed instance: {key}\")\n                except Exception as e:\n                    utils.logger.error(f\"[ExcelStoreBase] Error flushing {key}: {e}\")\n            cls._instances.clear()\n\n    def __init__(self, platform: str, crawler_type: str = \"search\"):\n        \"\"\"\n        Initialize Excel store\n\n        Args:\n            platform: Platform name (xhs, dy, ks, etc.)\n            crawler_type: Type of crawler (search, detail, creator)\n        \"\"\"\n        if not EXCEL_AVAILABLE:\n            raise ImportError(\n                \"openpyxl is required for Excel export. \"\n                \"Install it with: pip install openpyxl\"\n            )\n\n        super().__init__()\n        self.platform = platform\n        self.crawler_type = crawler_type\n\n        # Create data directory\n        if config.SAVE_DATA_PATH:\n            self.data_dir = Path(config.SAVE_DATA_PATH) / platform\n        else:\n            self.data_dir = Path(\"data\") / platform\n        self.data_dir.mkdir(parents=True, exist_ok=True)\n\n        # Initialize workbook\n        self.workbook = openpyxl.Workbook()\n        self.workbook.remove(self.workbook.active)  # Remove default sheet\n\n        # Create sheets\n        self.contents_sheet = self.workbook.create_sheet(\"Contents\")\n        self.comments_sheet = self.workbook.create_sheet(\"Comments\")\n        self.creators_sheet = self.workbook.create_sheet(\"Creators\")\n\n        # Track if headers are written\n        self.contents_headers_written = False\n        self.comments_headers_written = False\n        self.creators_headers_written = False\n        self.contacts_headers_written = False\n        self.dynamics_headers_written = False\n\n        # Optional sheets for platforms that need them (e.g., Bilibili)\n        self.contacts_sheet = None\n        self.dynamics_sheet = None\n\n        # Generate filename\n        timestamp = datetime.now().strftime(\"%Y%m%d_%H%M%S\")\n        self.filename = self.data_dir / f\"{platform}_{crawler_type}_{timestamp}.xlsx\"\n\n        utils.logger.info(f\"[ExcelStoreBase] Initialized Excel export to: {self.filename}\")\n\n    def _apply_header_style(self, sheet, row_num: int = 1):\n        \"\"\"\n        Apply formatting to header row\n\n        Args:\n            sheet: Worksheet object\n            row_num: Row number for headers (default: 1)\n        \"\"\"\n        header_fill = PatternFill(start_color=\"366092\", end_color=\"366092\", fill_type=\"solid\")\n        header_font = Font(bold=True, color=\"FFFFFF\", size=11)\n        header_alignment = Alignment(horizontal=\"center\", vertical=\"center\", wrap_text=True)\n        border = Border(\n            left=Side(style='thin'),\n            right=Side(style='thin'),\n            top=Side(style='thin'),\n            bottom=Side(style='thin')\n        )\n\n        for cell in sheet[row_num]:\n            cell.fill = header_fill\n            cell.font = header_font\n            cell.alignment = header_alignment\n            cell.border = border\n\n    def _auto_adjust_column_width(self, sheet):\n        \"\"\"\n        Auto-adjust column widths based on content\n\n        Args:\n            sheet: Worksheet object\n        \"\"\"\n        for column in sheet.columns:\n            max_length = 0\n            column_letter = get_column_letter(column[0].column)\n\n            for cell in column:\n                try:\n                    if cell.value:\n                        max_length = max(max_length, len(str(cell.value)))\n                except (TypeError, AttributeError):\n                    pass\n\n            # Set width with min/max constraints\n            adjusted_width = min(max(max_length + 2, 10), 50)\n            sheet.column_dimensions[column_letter].width = adjusted_width\n\n    def _write_headers(self, sheet, headers: List[str]):\n        \"\"\"\n        Write headers to sheet\n\n        Args:\n            sheet: Worksheet object\n            headers: List of header names\n        \"\"\"\n        for col_num, header in enumerate(headers, 1):\n            sheet.cell(row=1, column=col_num, value=header)\n\n        self._apply_header_style(sheet)\n\n    def _write_row(self, sheet, data: Dict[str, Any], headers: List[str]):\n        \"\"\"\n        Write data row to sheet\n\n        Args:\n            sheet: Worksheet object\n            data: Data dictionary\n            headers: List of header names (defines column order)\n        \"\"\"\n        row_num = sheet.max_row + 1\n\n        for col_num, header in enumerate(headers, 1):\n            value = data.get(header, \"\")\n\n            # Handle different data types\n            if isinstance(value, (list, dict)):\n                value = str(value)\n            elif value is None:\n                value = \"\"\n\n            cell = sheet.cell(row=row_num, column=col_num, value=value)\n\n            # Apply basic formatting\n            cell.alignment = Alignment(vertical=\"top\", wrap_text=True)\n            cell.border = Border(\n                left=Side(style='thin'),\n                right=Side(style='thin'),\n                top=Side(style='thin'),\n                bottom=Side(style='thin')\n            )\n\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        Store content data to Excel\n\n        Args:\n            content_item: Content data dictionary\n        \"\"\"\n        # Define headers (customize based on platform)\n        headers = list(content_item.keys())\n\n        # Write headers if first time\n        if not self.contents_headers_written:\n            self._write_headers(self.contents_sheet, headers)\n            self.contents_headers_written = True\n\n        # Write data row\n        self._write_row(self.contents_sheet, content_item, headers)\n\n        # Get ID from various possible field names\n        content_id = content_item.get('note_id') or content_item.get('aweme_id') or content_item.get('video_id') or content_item.get('content_id') or 'N/A'\n        utils.logger.info(f\"[ExcelStoreBase] Stored content to Excel: {content_id}\")\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        Store comment data to Excel\n\n        Args:\n            comment_item: Comment data dictionary\n        \"\"\"\n        # Define headers\n        headers = list(comment_item.keys())\n\n        # Write headers if first time\n        if not self.comments_headers_written:\n            self._write_headers(self.comments_sheet, headers)\n            self.comments_headers_written = True\n\n        # Write data row\n        self._write_row(self.comments_sheet, comment_item, headers)\n\n        utils.logger.info(f\"[ExcelStoreBase] Stored comment to Excel: {comment_item.get('comment_id', 'N/A')}\")\n\n    async def store_creator(self, creator: Dict):\n        \"\"\"\n        Store creator data to Excel\n\n        Args:\n            creator: Creator data dictionary\n        \"\"\"\n        # Define headers\n        headers = list(creator.keys())\n\n        # Write headers if first time\n        if not self.creators_headers_written:\n            self._write_headers(self.creators_sheet, headers)\n            self.creators_headers_written = True\n\n        # Write data row\n        self._write_row(self.creators_sheet, creator, headers)\n\n        utils.logger.info(f\"[ExcelStoreBase] Stored creator to Excel: {creator.get('user_id', 'N/A')}\")\n\n    async def store_contact(self, contact_item: Dict):\n        \"\"\"\n        Store contact data to Excel (for platforms like Bilibili)\n\n        Args:\n            contact_item: Contact data dictionary\n        \"\"\"\n        # Create contacts sheet if not exists\n        if self.contacts_sheet is None:\n            self.contacts_sheet = self.workbook.create_sheet(\"Contacts\")\n\n        # Define headers\n        headers = list(contact_item.keys())\n\n        # Write headers if first time\n        if not self.contacts_headers_written:\n            self._write_headers(self.contacts_sheet, headers)\n            self.contacts_headers_written = True\n\n        # Write data row\n        self._write_row(self.contacts_sheet, contact_item, headers)\n\n        utils.logger.info(f\"[ExcelStoreBase] Stored contact to Excel: up_id={contact_item.get('up_id', 'N/A')}, fan_id={contact_item.get('fan_id', 'N/A')}\")\n\n    async def store_dynamic(self, dynamic_item: Dict):\n        \"\"\"\n        Store dynamic data to Excel (for platforms like Bilibili)\n\n        Args:\n            dynamic_item: Dynamic data dictionary\n        \"\"\"\n        # Create dynamics sheet if not exists\n        if self.dynamics_sheet is None:\n            self.dynamics_sheet = self.workbook.create_sheet(\"Dynamics\")\n\n        # Define headers\n        headers = list(dynamic_item.keys())\n\n        # Write headers if first time\n        if not self.dynamics_headers_written:\n            self._write_headers(self.dynamics_sheet, headers)\n            self.dynamics_headers_written = True\n\n        # Write data row\n        self._write_row(self.dynamics_sheet, dynamic_item, headers)\n\n        utils.logger.info(f\"[ExcelStoreBase] Stored dynamic to Excel: {dynamic_item.get('dynamic_id', 'N/A')}\")\n\n    def flush(self):\n        \"\"\"\n        Save workbook to file\n        \"\"\"\n        try:\n            # Auto-adjust column widths for all sheets\n            self._auto_adjust_column_width(self.contents_sheet)\n            self._auto_adjust_column_width(self.comments_sheet)\n            self._auto_adjust_column_width(self.creators_sheet)\n            if self.contacts_sheet is not None:\n                self._auto_adjust_column_width(self.contacts_sheet)\n            if self.dynamics_sheet is not None:\n                self._auto_adjust_column_width(self.dynamics_sheet)\n\n            # Remove empty sheets (only header row)\n            if self.contents_sheet.max_row == 1:\n                self.workbook.remove(self.contents_sheet)\n            if self.comments_sheet.max_row == 1:\n                self.workbook.remove(self.comments_sheet)\n            if self.creators_sheet.max_row == 1:\n                self.workbook.remove(self.creators_sheet)\n            if self.contacts_sheet is not None and self.contacts_sheet.max_row == 1:\n                self.workbook.remove(self.contacts_sheet)\n            if self.dynamics_sheet is not None and self.dynamics_sheet.max_row == 1:\n                self.workbook.remove(self.dynamics_sheet)\n\n            # Check if there are any sheets left\n            if len(self.workbook.sheetnames) == 0:\n                utils.logger.info(f\"[ExcelStoreBase] No data to save, skipping file creation: {self.filename}\")\n                return\n\n            # Save workbook\n            self.workbook.save(self.filename)\n            utils.logger.info(f\"[ExcelStoreBase] Excel file saved successfully: {self.filename}\")\n\n        except Exception as e:\n            utils.logger.error(f\"[ExcelStoreBase] Error saving Excel file: {e}\")\n            raise\n"
  },
  {
    "path": "store/kuaishou/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/store/kuaishou/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2024/1/14 20:03\n# @Desc    :\nfrom typing import List\n\nimport config\nfrom var import source_keyword_var\n\nfrom ._store_impl import *\n\n\nclass KuaishouStoreFactory:\n    STORES = {\n        \"csv\": KuaishouCsvStoreImplement,\n        \"db\": KuaishouDbStoreImplement,\n        \"postgres\": KuaishouDbStoreImplement,\n        \"json\": KuaishouJsonStoreImplement,\n        \"jsonl\": KuaishouJsonlStoreImplement,\n        \"sqlite\": KuaishouSqliteStoreImplement,\n        \"mongodb\": KuaishouMongoStoreImplement,\n        \"excel\": KuaishouExcelStoreImplement,\n    }\n\n    @staticmethod\n    def create_store() -> AbstractStore:\n        store_class = KuaishouStoreFactory.STORES.get(config.SAVE_DATA_OPTION)\n        if not store_class:\n            raise ValueError(\n                \"[KuaishouStoreFactory.create_store] Invalid save option only supported csv or db or json or sqlite or mongodb or excel ...\")\n        return store_class()\n\n\nasync def update_kuaishou_video(video_item: Dict):\n    photo_info: Dict = video_item.get(\"photo\", {})\n    video_id = photo_info.get(\"id\")\n    if not video_id:\n        return\n    user_info = video_item.get(\"author\", {})\n    save_content_item = {\n        \"video_id\": video_id,\n        \"video_type\": str(video_item.get(\"type\")),\n        \"title\": photo_info.get(\"caption\", \"\")[:500],\n        \"desc\": photo_info.get(\"caption\", \"\")[:500],\n        \"create_time\": photo_info.get(\"timestamp\"),\n        \"user_id\": user_info.get(\"id\"),\n        \"nickname\": user_info.get(\"name\"),\n        \"avatar\": user_info.get(\"headerUrl\", \"\"),\n        \"liked_count\": str(photo_info.get(\"realLikeCount\")),\n        \"viewd_count\": str(photo_info.get(\"viewCount\")),\n        \"last_modify_ts\": utils.get_current_timestamp(),\n        \"video_url\": f\"https://www.kuaishou.com/short-video/{video_id}\",\n        \"video_cover_url\": photo_info.get(\"coverUrl\", \"\"),\n        \"video_play_url\": photo_info.get(\"photoUrl\", \"\"),\n        \"source_keyword\": source_keyword_var.get(),\n    }\n    utils.logger.info(\n        f\"[store.kuaishou.update_kuaishou_video] Kuaishou video id:{video_id}, title:{save_content_item.get('title')}\")\n    await KuaishouStoreFactory.create_store().store_content(content_item=save_content_item)\n\n\nasync def batch_update_ks_video_comments(video_id: str, comments: List[Dict]):\n    utils.logger.info(f\"[store.kuaishou.batch_update_ks_video_comments] video_id:{video_id}, comments:{comments}\")\n    if not comments:\n        return\n    for comment_item in comments:\n        await update_ks_video_comment(video_id, comment_item)\n\n\nasync def update_ks_video_comment(video_id: str, comment_item: Dict):\n    # V2 API uses snake_case field names and comment_id is int type\n    # Old GraphQL API used camelCase field names\n    # Support both formats for backward compatibility\n    comment_id = comment_item.get(\"comment_id\") or comment_item.get(\"commentId\")\n    save_comment_item = {\n        \"comment_id\": str(comment_id) if comment_id else None,  # Convert to string for storage\n        \"create_time\": comment_item.get(\"timestamp\"),\n        \"video_id\": video_id,\n        \"content\": comment_item.get(\"content\"),\n        # V2: author_id, Old: authorId\n        \"user_id\": comment_item.get(\"author_id\") or comment_item.get(\"authorId\"),\n        # V2: author_name, Old: authorName\n        \"nickname\": comment_item.get(\"author_name\") or comment_item.get(\"authorName\"),\n        \"avatar\": comment_item.get(\"headurl\"),\n        # V2: commentCount, Old: subCommentCount\n        \"sub_comment_count\": str(comment_item.get(\"commentCount\") or comment_item.get(\"subCommentCount\", 0)),\n        \"last_modify_ts\": utils.get_current_timestamp(),\n    }\n    utils.logger.info(\n        f\"[store.kuaishou.update_ks_video_comment] Kuaishou video comment: {comment_id}, content: {save_comment_item.get('content')}\")\n    await KuaishouStoreFactory.create_store().store_comment(comment_item=save_comment_item)\n\nasync def save_creator(user_id: str, creator: Dict):\n    ownerCount = creator.get('ownerCount', {})\n    profile = creator.get('profile', {})\n\n    local_db_item = {\n        'user_id': user_id,\n        'nickname': profile.get('user_name'),\n        'gender': 'Female' if profile.get('gender') == \"F\" else 'Male',\n        'avatar': profile.get('headurl'),\n        'desc': profile.get('user_text'),\n        'ip_location': \"\",\n        'follows': ownerCount.get(\"follow\"),\n        'fans': ownerCount.get(\"fan\"),\n        'interaction': ownerCount.get(\"photo_public\"),\n        \"last_modify_ts\": utils.get_current_timestamp(),\n    }\n    utils.logger.info(f\"[store.kuaishou.save_creator] creator:{local_db_item}\")\n    await KuaishouStoreFactory.create_store().store_creator(local_db_item)\n"
  },
  {
    "path": "store/kuaishou/_store_impl.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/store/kuaishou/_store_impl.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : persist1@126.com\n# @Time    : 2025/9/5 19:34\n# @Desc    : Kuaishou storage implementation class\nimport asyncio\nimport csv\nimport json\nimport os\nimport pathlib\nfrom typing import Dict\nfrom tools.async_file_writer import AsyncFileWriter\n\nimport aiofiles\nfrom sqlalchemy import select\n\nimport config\nfrom base.base_crawler import AbstractStore\nfrom database.db_session import get_session\nfrom database.models import KuaishouVideo, KuaishouVideoComment\nfrom tools import utils, words\nfrom var import crawler_type_var\nfrom database.mongodb_store_base import MongoDBStoreBase\n\n\ndef calculate_number_of_files(file_store_path: str) -> int:\n    \"\"\"Calculate the prefix sorting number for data save files, supporting writing to different files for each run\n    Args:\n        file_store_path;\n    Returns:\n        file nums\n    \"\"\"\n    if not os.path.exists(file_store_path):\n        return 1\n    try:\n        return max([int(file_name.split(\"_\")[0]) for file_name in os.listdir(file_store_path)]) + 1\n    except ValueError:\n        return 1\n\n\nclass KuaishouCsvStoreImplement(AbstractStore):\n    def __init__(self, **kwargs):\n        super().__init__(**kwargs)\n        self.writer = AsyncFileWriter(platform=\"kuaishou\", crawler_type=crawler_type_var.get())\n\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        Kuaishou content CSV storage implementation\n        Args:\n            content_item: note item dict\n\n        Returns:\n\n        \"\"\"\n        await self.writer.write_to_csv(item_type=\"contents\", item=content_item)\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        Kuaishou comment CSV storage implementation\n        Args:\n            comment_item: comment item dict\n\n        Returns:\n\n        \"\"\"\n        await self.writer.write_to_csv(item_type=\"comments\", item=comment_item)\n\n    async def store_creator(self, creator: Dict):\n        pass\n\n\nclass KuaishouDbStoreImplement(AbstractStore):\n    async def store_creator(self, creator: Dict):\n        pass\n\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        Kuaishou content DB storage implementation\n        Args:\n            content_item: content item dict\n        \"\"\"\n        video_id = content_item.get(\"video_id\")\n        async with get_session() as session:\n            result = await session.execute(select(KuaishouVideo).where(KuaishouVideo.video_id == video_id))\n            video_detail = result.scalar_one_or_none()\n\n            if not video_detail:\n                content_item[\"add_ts\"] = utils.get_current_timestamp()\n                new_content = KuaishouVideo(**content_item)\n                session.add(new_content)\n            else:\n                for key, value in content_item.items():\n                    if hasattr(video_detail, key):\n                        setattr(video_detail, key, value)\n            await session.commit()\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        Kuaishou comment DB storage implementation\n        Args:\n            comment_item: comment item dict\n        \"\"\"\n        comment_id = comment_item.get(\"comment_id\")\n        async with get_session() as session:\n            result = await session.execute(\n                select(KuaishouVideoComment).where(KuaishouVideoComment.comment_id == comment_id))\n            comment_detail = result.scalar_one_or_none()\n\n            if not comment_detail:\n                comment_item[\"add_ts\"] = utils.get_current_timestamp()\n                new_comment = KuaishouVideoComment(**comment_item)\n                session.add(new_comment)\n            else:\n                for key, value in comment_item.items():\n                    if hasattr(comment_detail, key):\n                        setattr(comment_detail, key, value)\n            await session.commit()\n\n\nclass KuaishouJsonStoreImplement(AbstractStore):\n    def __init__(self, **kwargs):\n        super().__init__(**kwargs)\n        self.writer = AsyncFileWriter(platform=\"kuaishou\", crawler_type=crawler_type_var.get())\n\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        content JSON storage implementation\n        Args:\n            content_item:\n\n        Returns:\n\n        \"\"\"\n        await self.writer.write_single_item_to_json(item_type=\"contents\", item=content_item)\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        comment JSON storage implementation\n        Args:\n            comment_item:\n\n        Returns:\n\n        \"\"\"\n        await self.writer.write_single_item_to_json(item_type=\"comments\", item=comment_item)\n\n    async def store_creator(self, creator: Dict):\n        pass\n\n\nclass KuaishouJsonlStoreImplement(AbstractStore):\n    def __init__(self, **kwargs):\n        super().__init__(**kwargs)\n        self.writer = AsyncFileWriter(platform=\"kuaishou\", crawler_type=crawler_type_var.get())\n\n    async def store_content(self, content_item: Dict):\n        await self.writer.write_to_jsonl(item_type=\"contents\", item=content_item)\n\n    async def store_comment(self, comment_item: Dict):\n        await self.writer.write_to_jsonl(item_type=\"comments\", item=comment_item)\n\n    async def store_creator(self, creator: Dict):\n        pass\n\n\nclass KuaishouSqliteStoreImplement(KuaishouDbStoreImplement):\n    async def store_creator(self, creator: Dict):\n        pass\n\n\nclass KuaishouMongoStoreImplement(AbstractStore):\n    \"\"\"Kuaishou MongoDB storage implementation\"\"\"\n\n    def __init__(self):\n        self.mongo_store = MongoDBStoreBase(collection_prefix=\"kuaishou\")\n\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        Store video content to MongoDB\n        Args:\n            content_item: Video content data\n        \"\"\"\n        video_id = content_item.get(\"video_id\")\n        if not video_id:\n            return\n\n        await self.mongo_store.save_or_update(\n            collection_suffix=\"contents\",\n            query={\"video_id\": video_id},\n            data=content_item\n        )\n        utils.logger.info(f\"[KuaishouMongoStoreImplement.store_content] Saved video {video_id} to MongoDB\")\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        Store comment to MongoDB\n        Args:\n            comment_item: Comment data\n        \"\"\"\n        comment_id = comment_item.get(\"comment_id\")\n        if not comment_id:\n            return\n\n        await self.mongo_store.save_or_update(\n            collection_suffix=\"comments\",\n            query={\"comment_id\": comment_id},\n            data=comment_item\n        )\n        utils.logger.info(f\"[KuaishouMongoStoreImplement.store_comment] Saved comment {comment_id} to MongoDB\")\n\n    async def store_creator(self, creator_item: Dict):\n        \"\"\"\n        Store creator information to MongoDB\n        Args:\n            creator_item: Creator data\n        \"\"\"\n        user_id = creator_item.get(\"user_id\")\n        if not user_id:\n            return\n\n        await self.mongo_store.save_or_update(\n            collection_suffix=\"creators\",\n            query={\"user_id\": user_id},\n            data=creator_item\n        )\n        utils.logger.info(f\"[KuaishouMongoStoreImplement.store_creator] Saved creator {user_id} to MongoDB\")\n\n\nclass KuaishouExcelStoreImplement:\n    \"\"\"Kuaishou Excel storage implementation - Global singleton\"\"\"\n\n    def __new__(cls, *args, **kwargs):\n        from store.excel_store_base import ExcelStoreBase\n        return ExcelStoreBase.get_instance(\n            platform=\"kuaishou\",\n            crawler_type=crawler_type_var.get()\n        )\n"
  },
  {
    "path": "store/tieba/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/store/tieba/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\nfrom typing import List\n\nfrom model.m_baidu_tieba import TiebaComment, TiebaCreator, TiebaNote\nfrom var import source_keyword_var\n\nfrom ._store_impl import *\n\n\nclass TieBaStoreFactory:\n    STORES = {\n        \"csv\": TieBaCsvStoreImplement,\n        \"db\": TieBaDbStoreImplement,\n        \"postgres\": TieBaDbStoreImplement,\n        \"json\": TieBaJsonStoreImplement,\n        \"jsonl\": TieBaJsonlStoreImplement,\n        \"sqlite\": TieBaSqliteStoreImplement,\n        \"mongodb\": TieBaMongoStoreImplement,\n        \"excel\": TieBaExcelStoreImplement,\n    }\n\n    @staticmethod\n    def create_store() -> AbstractStore:\n        store_class = TieBaStoreFactory.STORES.get(config.SAVE_DATA_OPTION)\n        if not store_class:\n            raise ValueError(\n                \"[TieBaStoreFactory.create_store] Invalid save option only supported csv or db or json or sqlite or mongodb or excel ...\")\n        return store_class()\n\n\nasync def batch_update_tieba_notes(note_list: List[TiebaNote]):\n    \"\"\"\n    Batch update tieba notes\n    Args:\n        note_list:\n\n    Returns:\n\n    \"\"\"\n    if not note_list:\n        return\n    for note_item in note_list:\n        await update_tieba_note(note_item)\n\n\nasync def update_tieba_note(note_item: TiebaNote):\n    \"\"\"\n    Add or Update tieba note\n    Args:\n        note_item:\n\n    Returns:\n\n    \"\"\"\n    note_item.source_keyword = source_keyword_var.get()\n    save_note_item = note_item.model_dump()\n    save_note_item.update({\"last_modify_ts\": utils.get_current_timestamp()})\n    utils.logger.info(f\"[store.tieba.update_tieba_note] tieba note: {save_note_item}\")\n\n    await TieBaStoreFactory.create_store().store_content(save_note_item)\n\n\nasync def batch_update_tieba_note_comments(note_id: str, comments: List[TiebaComment]):\n    \"\"\"\n    Batch update tieba note comments\n    Args:\n        note_id:\n        comments:\n\n    Returns:\n\n    \"\"\"\n    if not comments:\n        return\n    for comment_item in comments:\n        await update_tieba_note_comment(note_id, comment_item)\n\n\nasync def update_tieba_note_comment(note_id: str, comment_item: TiebaComment):\n    \"\"\"\n    Update tieba note comment\n    Args:\n        note_id:\n        comment_item:\n\n    Returns:\n\n    \"\"\"\n    save_comment_item = comment_item.model_dump()\n    save_comment_item.update({\"last_modify_ts\": utils.get_current_timestamp()})\n    utils.logger.info(f\"[store.tieba.update_tieba_note_comment] tieba note id: {note_id} comment:{save_comment_item}\")\n    await TieBaStoreFactory.create_store().store_comment(save_comment_item)\n\n\nasync def save_creator(user_info: TiebaCreator):\n    \"\"\"\n    Save creator information to local\n    Args:\n        user_info:\n\n    Returns:\n\n    \"\"\"\n    local_db_item = user_info.model_dump()\n    local_db_item[\"last_modify_ts\"] = utils.get_current_timestamp()\n    utils.logger.info(f\"[store.tieba.save_creator] creator:{local_db_item}\")\n    await TieBaStoreFactory.create_store().store_creator(local_db_item)\n"
  },
  {
    "path": "store/tieba/_store_impl.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/store/tieba/_store_impl.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : persist1@126.com\n# @Time    : 2025/9/5 19:34\n# @Desc    : Tieba storage implementation class\nimport asyncio\nimport csv\nimport json\nimport os\nimport pathlib\nfrom typing import Dict\n\nimport aiofiles\nfrom sqlalchemy import select\nfrom sqlalchemy.ext.asyncio import AsyncSession\n\nimport config\nfrom base.base_crawler import AbstractStore\nfrom database.models import TiebaNote, TiebaComment, TiebaCreator\nfrom tools import utils, words\nfrom database.db_session import get_session\nfrom var import crawler_type_var\nfrom tools.async_file_writer import AsyncFileWriter\nfrom database.mongodb_store_base import MongoDBStoreBase\n\n\ndef calculate_number_of_files(file_store_path: str) -> int:\n    \"\"\"Calculate the prefix sorting number for data save files, supporting writing to different files for each run\n    Args:\n        file_store_path;\n    Returns:\n        file nums\n    \"\"\"\n    if not os.path.exists(file_store_path):\n        return 1\n    try:\n        return max([int(file_name.split(\"_\")[0]) for file_name in os.listdir(file_store_path)]) + 1\n    except ValueError:\n        return 1\n\n\nclass TieBaCsvStoreImplement(AbstractStore):\n    def __init__(self, **kwargs):\n        super().__init__(**kwargs)\n        self.writer = AsyncFileWriter(platform=\"tieba\", crawler_type=crawler_type_var.get())\n\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        tieba content CSV storage implementation\n        Args:\n            content_item: note item dict\n\n        Returns:\n\n        \"\"\"\n        await self.writer.write_to_csv(item_type=\"contents\", item=content_item)\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        tieba comment CSV storage implementation\n        Args:\n            comment_item: comment item dict\n\n        Returns:\n\n        \"\"\"\n        await self.writer.write_to_csv(item_type=\"comments\", item=comment_item)\n\n    async def store_creator(self, creator: Dict):\n        \"\"\"\n        tieba content CSV storage implementation\n        Args:\n            creator: creator dict\n\n        Returns:\n\n        \"\"\"\n        await self.writer.write_to_csv(item_type=\"creators\", item=creator)\n\n\nclass TieBaDbStoreImplement(AbstractStore):\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        tieba content DB storage implementation\n        Args:\n            content_item: content item dict\n        \"\"\"\n        note_id = content_item.get(\"note_id\")\n        async with get_session() as session:\n            stmt = select(TiebaNote).where(TiebaNote.note_id == note_id)\n            res = await session.execute(stmt)\n            db_note = res.scalar_one_or_none()\n            if db_note:\n                for key, value in content_item.items():\n                    setattr(db_note, key, value)\n            else:\n                db_note = TiebaNote(**content_item)\n                session.add(db_note)\n            await session.commit()\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        tieba content DB storage implementation\n        Args:\n            comment_item: comment item dict\n        \"\"\"\n        comment_id = comment_item.get(\"comment_id\")\n        async with get_session() as session:\n            stmt = select(TiebaComment).where(TiebaComment.comment_id == comment_id)\n            res = await session.execute(stmt)\n            db_comment = res.scalar_one_or_none()\n            if db_comment:\n                for key, value in comment_item.items():\n                    setattr(db_comment, key, value)\n            else:\n                db_comment = TiebaComment(**comment_item)\n                session.add(db_comment)\n            await session.commit()\n\n    async def store_creator(self, creator: Dict):\n        \"\"\"\n        tieba content DB storage implementation\n        Args:\n            creator: creator dict\n        \"\"\"\n        user_id = creator.get(\"user_id\")\n        async with get_session() as session:\n            stmt = select(TiebaCreator).where(TiebaCreator.user_id == user_id)\n            res = await session.execute(stmt)\n            db_creator = res.scalar_one_or_none()\n            if db_creator:\n                for key, value in creator.items():\n                    setattr(db_creator, key, value)\n            else:\n                db_creator = TiebaCreator(**creator)\n                session.add(db_creator)\n            await session.commit()\n\n\nclass TieBaJsonStoreImplement(AbstractStore):\n    def __init__(self, **kwargs):\n        super().__init__(**kwargs)\n        self.writer = AsyncFileWriter(platform=\"tieba\", crawler_type=crawler_type_var.get())\n\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        tieba content JSON storage implementation\n        Args:\n            content_item: note item dict\n\n        Returns:\n\n        \"\"\"\n        await self.writer.write_single_item_to_json(item_type=\"contents\", item=content_item)\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        tieba comment JSON storage implementation\n        Args:\n            comment_item: comment item dict\n\n        Returns:\n\n        \"\"\"\n        await self.writer.write_single_item_to_json(item_type=\"comments\", item=comment_item)\n\n    async def store_creator(self, creator: Dict):\n        \"\"\"\n        tieba content JSON storage implementation\n        Args:\n            creator: creator dict\n\n        Returns:\n\n        \"\"\"\n        await self.writer.write_single_item_to_json(item_type=\"creators\", item=creator)\n\n\nclass TieBaJsonlStoreImplement(AbstractStore):\n    def __init__(self, **kwargs):\n        super().__init__(**kwargs)\n        self.writer = AsyncFileWriter(platform=\"tieba\", crawler_type=crawler_type_var.get())\n\n    async def store_content(self, content_item: Dict):\n        await self.writer.write_to_jsonl(item_type=\"contents\", item=content_item)\n\n    async def store_comment(self, comment_item: Dict):\n        await self.writer.write_to_jsonl(item_type=\"comments\", item=comment_item)\n\n    async def store_creator(self, creator: Dict):\n        await self.writer.write_to_jsonl(item_type=\"creators\", item=creator)\n\n\nclass TieBaSqliteStoreImplement(TieBaDbStoreImplement):\n    \"\"\"\n    Tieba sqlite store implement\n    \"\"\"\n    pass\n\n\nclass TieBaMongoStoreImplement(AbstractStore):\n    \"\"\"Tieba MongoDB storage implementation\"\"\"\n\n    def __init__(self):\n        self.mongo_store = MongoDBStoreBase(collection_prefix=\"tieba\")\n\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        Store post content to MongoDB\n        Args:\n            content_item: Post content data\n        \"\"\"\n        note_id = content_item.get(\"note_id\")\n        if not note_id:\n            return\n\n        await self.mongo_store.save_or_update(\n            collection_suffix=\"contents\",\n            query={\"note_id\": note_id},\n            data=content_item\n        )\n        utils.logger.info(f\"[TieBaMongoStoreImplement.store_content] Saved note {note_id} to MongoDB\")\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        Store comment to MongoDB\n        Args:\n            comment_item: Comment data\n        \"\"\"\n        comment_id = comment_item.get(\"comment_id\")\n        if not comment_id:\n            return\n\n        await self.mongo_store.save_or_update(\n            collection_suffix=\"comments\",\n            query={\"comment_id\": comment_id},\n            data=comment_item\n        )\n        utils.logger.info(f\"[TieBaMongoStoreImplement.store_comment] Saved comment {comment_id} to MongoDB\")\n\n    async def store_creator(self, creator_item: Dict):\n        \"\"\"\n        Store creator information to MongoDB\n        Args:\n            creator_item: Creator data\n        \"\"\"\n        user_id = creator_item.get(\"user_id\")\n        if not user_id:\n            return\n\n        await self.mongo_store.save_or_update(\n            collection_suffix=\"creators\",\n            query={\"user_id\": user_id},\n            data=creator_item\n        )\n        utils.logger.info(f\"[TieBaMongoStoreImplement.store_creator] Saved creator {user_id} to MongoDB\")\n\n\nclass TieBaExcelStoreImplement:\n    \"\"\"Tieba Excel storage implementation - Global singleton\"\"\"\n\n    def __new__(cls, *args, **kwargs):\n        from store.excel_store_base import ExcelStoreBase\n        return ExcelStoreBase.get_instance(\n            platform=\"tieba\",\n            crawler_type=crawler_type_var.get()\n        )\n"
  },
  {
    "path": "store/weibo/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/store/weibo/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2024/1/14 21:34\n# @Desc    :\n\nimport re\nfrom typing import List\n\nfrom var import source_keyword_var\n\nfrom .weibo_store_media import *\nfrom ._store_impl import *\n\n\nclass WeibostoreFactory:\n    STORES = {\n        \"csv\": WeiboCsvStoreImplement,\n        \"db\": WeiboDbStoreImplement,\n        \"postgres\": WeiboDbStoreImplement,\n        \"json\": WeiboJsonStoreImplement,\n        \"jsonl\": WeiboJsonlStoreImplement,\n        \"sqlite\": WeiboSqliteStoreImplement,\n        \"mongodb\": WeiboMongoStoreImplement,\n        \"excel\": WeiboExcelStoreImplement,\n    }\n\n    @staticmethod\n    def create_store() -> AbstractStore:\n        store_class = WeibostoreFactory.STORES.get(config.SAVE_DATA_OPTION)\n        if not store_class:\n            raise ValueError(\"[WeibotoreFactory.create_store] Invalid save option only supported csv or db or json or sqlite or mongodb or excel ...\")\n        return store_class()\n\n\nasync def batch_update_weibo_notes(note_list: List[Dict]):\n    \"\"\"\n    Batch update weibo notes\n    Args:\n        note_list:\n\n    Returns:\n\n    \"\"\"\n    if not note_list:\n        return\n    for note_item in note_list:\n        await update_weibo_note(note_item)\n\n\nasync def update_weibo_note(note_item: Dict):\n    \"\"\"\n    Update weibo note\n    Args:\n        note_item:\n\n    Returns:\n\n    \"\"\"\n    if not note_item:\n        return\n\n    mblog: Dict = note_item.get(\"mblog\")\n    user_info: Dict = mblog.get(\"user\")\n    note_id = mblog.get(\"id\")\n    content_text = mblog.get(\"text\")\n    clean_text = re.sub(r\"<.*?>\", \"\", content_text)\n    save_content_item = {\n        # Weibo information\n        \"note_id\": note_id,\n        \"content\": clean_text,\n        \"create_time\": utils.rfc2822_to_timestamp(mblog.get(\"created_at\")),\n        \"create_date_time\": str(utils.rfc2822_to_china_datetime(mblog.get(\"created_at\"))),\n        \"liked_count\": str(mblog.get(\"attitudes_count\", 0)),\n        \"comments_count\": str(mblog.get(\"comments_count\", 0)),\n        \"shared_count\": str(mblog.get(\"reposts_count\", 0)),\n        \"last_modify_ts\": utils.get_current_timestamp(),\n        \"note_url\": f\"https://m.weibo.cn/detail/{note_id}\",\n        \"ip_location\": mblog.get(\"region_name\", \"\").replace(\"发布于 \", \"\"),\n\n        # User information\n        \"user_id\": str(user_info.get(\"id\")),\n        \"nickname\": user_info.get(\"screen_name\", \"\"),\n        \"gender\": user_info.get(\"gender\", \"\"),\n        \"profile_url\": user_info.get(\"profile_url\", \"\"),\n        \"avatar\": user_info.get(\"profile_image_url\", \"\"),\n        \"source_keyword\": source_keyword_var.get(),\n    }\n    utils.logger.info(f\"[store.weibo.update_weibo_note] weibo note id:{note_id}, title:{save_content_item.get('content')[:24]} ...\")\n    await WeibostoreFactory.create_store().store_content(content_item=save_content_item)\n\n\nasync def batch_update_weibo_note_comments(note_id: str, comments: List[Dict]):\n    \"\"\"\n    Batch update weibo note comments\n    Args:\n        note_id:\n        comments:\n\n    Returns:\n\n    \"\"\"\n    if not comments:\n        return\n    for comment_item in comments:\n        await update_weibo_note_comment(note_id, comment_item)\n\n\nasync def update_weibo_note_comment(note_id: str, comment_item: Dict):\n    \"\"\"\n    Update weibo note comment\n    Args:\n        note_id: weibo note id\n        comment_item: weibo comment item\n\n    Returns:\n\n    \"\"\"\n    if not comment_item or not note_id:\n        return\n    comment_id = str(comment_item.get(\"id\"))\n    user_info: Dict = comment_item.get(\"user\")\n    content_text = comment_item.get(\"text\")\n    clean_text = re.sub(r\"<.*?>\", \"\", content_text)\n    save_comment_item = {\n        \"comment_id\": comment_id,\n        \"create_time\": utils.rfc2822_to_timestamp(comment_item.get(\"created_at\")),\n        \"create_date_time\": str(utils.rfc2822_to_china_datetime(comment_item.get(\"created_at\"))),\n        \"note_id\": note_id,\n        \"content\": clean_text,\n        \"sub_comment_count\": str(comment_item.get(\"total_number\", 0)),\n        \"comment_like_count\": str(comment_item.get(\"like_count\", 0)),\n        \"last_modify_ts\": utils.get_current_timestamp(),\n        \"ip_location\": comment_item.get(\"source\", \"\").replace(\"来自\", \"\"),\n        \"parent_comment_id\": comment_item.get(\"rootid\", \"\"),\n\n        # User information\n        \"user_id\": str(user_info.get(\"id\")),\n        \"nickname\": user_info.get(\"screen_name\", \"\"),\n        \"gender\": user_info.get(\"gender\", \"\"),\n        \"profile_url\": user_info.get(\"profile_url\", \"\"),\n        \"avatar\": user_info.get(\"profile_image_url\", \"\"),\n    }\n    utils.logger.info(f\"[store.weibo.update_weibo_note_comment] Weibo note comment: {comment_id}, content: {save_comment_item.get('content', '')[:24]} ...\")\n    await WeibostoreFactory.create_store().store_comment(comment_item=save_comment_item)\n\n\nasync def update_weibo_note_image(picid: str, pic_content, extension_file_name):\n    \"\"\"\n    Save weibo note image to local\n    Args:\n        picid:\n        pic_content:\n        extension_file_name:\n\n    Returns:\n\n    \"\"\"\n    await WeiboStoreImage().store_image({\"pic_id\": picid, \"pic_content\": pic_content, \"extension_file_name\": extension_file_name})\n\n\nasync def save_creator(user_id: str, user_info: Dict):\n    \"\"\"\n    Save creator information to local\n    Args:\n        user_id:\n        user_info:\n\n    Returns:\n\n    \"\"\"\n    local_db_item = {\n        'user_id': user_id,\n        'nickname': user_info.get('screen_name'),\n        'gender': 'Female' if user_info.get('gender') == \"f\" else 'Male',\n        'avatar': user_info.get('avatar_hd'),\n        'desc': user_info.get('description'),\n        'ip_location': user_info.get(\"source\", \"\").replace(\"来自\", \"\"),\n        'follows': user_info.get('follow_count', ''),\n        'fans': user_info.get('followers_count', ''),\n        'tag_list': '',\n        \"last_modify_ts\": utils.get_current_timestamp(),\n    }\n    utils.logger.info(f\"[store.weibo.save_creator] creator:{local_db_item}\")\n    await WeibostoreFactory.create_store().store_creator(local_db_item)\n"
  },
  {
    "path": "store/weibo/_store_impl.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/store/weibo/_store_impl.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : persist1@126.com\n# @Time    : 2025/9/5 19:34\n# @Desc    : Weibo storage implementation class\nimport asyncio\nimport csv\nimport json\nimport os\nimport pathlib\nfrom typing import Dict\n\nimport aiofiles\nfrom sqlalchemy import select\nfrom sqlalchemy.ext.asyncio import AsyncSession\n\nimport config\nfrom base.base_crawler import AbstractStore\nfrom database.models import WeiboCreator, WeiboNote, WeiboNoteComment\nfrom tools import utils, words\nfrom tools.async_file_writer import AsyncFileWriter\nfrom database.db_session import get_session\nfrom var import crawler_type_var\nfrom database.mongodb_store_base import MongoDBStoreBase\n\n\ndef calculate_number_of_files(file_store_path: str) -> int:\n    \"\"\"Calculate the prefix sorting number for data save files, supporting writing to different files for each run\n    Args:\n        file_store_path;\n    Returns:\n        file nums\n    \"\"\"\n    if not os.path.exists(file_store_path):\n        return 1\n    try:\n        return max([int(file_name.split(\"_\")[0]) for file_name in os.listdir(file_store_path)]) + 1\n    except ValueError:\n        return 1\n\n\nclass WeiboCsvStoreImplement(AbstractStore):\n    def __init__(self, **kwargs):\n        super().__init__(**kwargs)\n        self.writer = AsyncFileWriter(platform=\"weibo\", crawler_type=crawler_type_var.get())\n\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        Weibo content CSV storage implementation\n        Args:\n            content_item: note item dict\n\n        Returns:\n\n        \"\"\"\n        await self.writer.write_to_csv(item_type=\"contents\", item=content_item)\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        Weibo comment CSV storage implementation\n        Args:\n            comment_item: comment item dict\n\n        Returns:\n\n        \"\"\"\n        await self.writer.write_to_csv(item_type=\"comments\", item=comment_item)\n\n    async def store_creator(self, creator: Dict):\n        \"\"\"\n        Weibo creator CSV storage implementation\n        Args:\n            creator:\n\n        Returns:\n\n        \"\"\"\n        await self.writer.write_to_csv(item_type=\"creators\", item=creator)\n\n\nclass WeiboDbStoreImplement(AbstractStore):\n\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        Weibo content DB storage implementation\n        Args:\n            content_item: content item dict\n\n        Returns:\n\n        \"\"\"\n        note_id = int(content_item.get(\"note_id\"))\n        content_item[\"note_id\"] = note_id\n        async with get_session() as session:\n            stmt = select(WeiboNote).where(WeiboNote.note_id == note_id)\n            res = await session.execute(stmt)\n            db_note = res.scalar_one_or_none()\n            if db_note:\n                db_note.last_modify_ts = utils.get_current_timestamp()\n                for key, value in content_item.items():\n                    if hasattr(db_note, key):\n                        setattr(db_note, key, value)\n            else:\n                content_item[\"add_ts\"] = utils.get_current_timestamp()\n                content_item[\"last_modify_ts\"] = utils.get_current_timestamp()\n                db_note = WeiboNote(**content_item)\n                session.add(db_note)\n            await session.commit()\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        Weibo content DB storage implementation\n        Args:\n            comment_item: comment item dict\n\n        Returns:\n\n        \"\"\"\n        comment_id = int(comment_item.get(\"comment_id\"))\n        comment_item[\"comment_id\"] = comment_id\n        comment_item[\"note_id\"] = int(comment_item.get(\"note_id\", 0) or 0)\n        comment_item[\"create_time\"] = int(comment_item.get(\"create_time\", 0) or 0)\n        comment_item[\"comment_like_count\"] = str(comment_item.get(\"comment_like_count\", \"0\"))\n        comment_item[\"sub_comment_count\"] = str(comment_item.get(\"sub_comment_count\", \"0\"))\n        comment_item[\"parent_comment_id\"] = str(comment_item.get(\"parent_comment_id\", \"0\"))\n\n        async with get_session() as session:\n            stmt = select(WeiboNoteComment).where(WeiboNoteComment.comment_id == comment_id)\n            res = await session.execute(stmt)\n            db_comment = res.scalar_one_or_none()\n            if db_comment:\n                db_comment.last_modify_ts = utils.get_current_timestamp()\n                for key, value in comment_item.items():\n                    if hasattr(db_comment, key):\n                        setattr(db_comment, key, value)\n            else:\n                comment_item[\"add_ts\"] = utils.get_current_timestamp()\n                comment_item[\"last_modify_ts\"] = utils.get_current_timestamp()\n                db_comment = WeiboNoteComment(**comment_item)\n                session.add(db_comment)\n            await session.commit()\n\n    async def store_creator(self, creator: Dict):\n        \"\"\"\n        Weibo creator DB storage implementation\n        Args:\n            creator:\n\n        Returns:\n\n        \"\"\"\n        user_id = int(creator.get(\"user_id\"))\n        creator[\"user_id\"] = user_id\n        async with get_session() as session:\n            stmt = select(WeiboCreator).where(WeiboCreator.user_id == user_id)\n            res = await session.execute(stmt)\n            db_creator = res.scalar_one_or_none()\n            if db_creator:\n                db_creator.last_modify_ts = utils.get_current_timestamp()\n                for key, value in creator.items():\n                    if hasattr(db_creator, key):\n                        setattr(db_creator, key, value)\n            else:\n                creator[\"add_ts\"] = utils.get_current_timestamp()\n                creator[\"last_modify_ts\"] = utils.get_current_timestamp()\n                db_creator = WeiboCreator(**creator)\n                session.add(db_creator)\n            await session.commit()\n\n\nclass WeiboJsonStoreImplement(AbstractStore):\n    def __init__(self, **kwargs):\n        super().__init__(**kwargs)\n        self.writer = AsyncFileWriter(platform=\"weibo\", crawler_type=crawler_type_var.get())\n\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        content JSON storage implementation\n        Args:\n            content_item:\n\n        Returns:\n\n        \"\"\"\n        await self.writer.write_single_item_to_json(item_type=\"contents\", item=content_item)\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        comment JSON storage implementation\n        Args:\n            comment_item:\n\n        Returns:\n\n        \"\"\"\n        await self.writer.write_single_item_to_json(item_type=\"comments\", item=comment_item)\n\n    async def store_creator(self, creator: Dict):\n        \"\"\"\n        creator JSON storage implementation\n        Args:\n            creator:\n\n        Returns:\n\n        \"\"\"\n        await self.writer.write_single_item_to_json(item_type=\"creators\", item=creator)\n\n\nclass WeiboJsonlStoreImplement(AbstractStore):\n    def __init__(self, **kwargs):\n        super().__init__(**kwargs)\n        self.writer = AsyncFileWriter(platform=\"weibo\", crawler_type=crawler_type_var.get())\n\n    async def store_content(self, content_item: Dict):\n        await self.writer.write_to_jsonl(item_type=\"contents\", item=content_item)\n\n    async def store_comment(self, comment_item: Dict):\n        await self.writer.write_to_jsonl(item_type=\"comments\", item=comment_item)\n\n    async def store_creator(self, creator: Dict):\n        await self.writer.write_to_jsonl(item_type=\"creators\", item=creator)\n\n\nclass WeiboSqliteStoreImplement(WeiboDbStoreImplement):\n    \"\"\"\n    Weibo content SQLite storage implementation\n    \"\"\"\n    pass\n\n\nclass WeiboMongoStoreImplement(AbstractStore):\n    \"\"\"Weibo MongoDB storage implementation\"\"\"\n\n    def __init__(self):\n        self.mongo_store = MongoDBStoreBase(collection_prefix=\"weibo\")\n\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        Store Weibo content to MongoDB\n        Args:\n            content_item: Weibo content data\n        \"\"\"\n        note_id = content_item.get(\"note_id\")\n        if not note_id:\n            return\n\n        await self.mongo_store.save_or_update(\n            collection_suffix=\"contents\",\n            query={\"note_id\": note_id},\n            data=content_item\n        )\n        utils.logger.info(f\"[WeiboMongoStoreImplement.store_content] Saved note {note_id} to MongoDB\")\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        Store comment to MongoDB\n        Args:\n            comment_item: Comment data\n        \"\"\"\n        comment_id = comment_item.get(\"comment_id\")\n        if not comment_id:\n            return\n\n        await self.mongo_store.save_or_update(\n            collection_suffix=\"comments\",\n            query={\"comment_id\": comment_id},\n            data=comment_item\n        )\n        utils.logger.info(f\"[WeiboMongoStoreImplement.store_comment] Saved comment {comment_id} to MongoDB\")\n\n    async def store_creator(self, creator_item: Dict):\n        \"\"\"\n        Store creator information to MongoDB\n        Args:\n            creator_item: Creator data\n        \"\"\"\n        user_id = creator_item.get(\"user_id\")\n        if not user_id:\n            return\n\n        await self.mongo_store.save_or_update(\n            collection_suffix=\"creators\",\n            query={\"user_id\": user_id},\n            data=creator_item\n        )\n        utils.logger.info(f\"[WeiboMongoStoreImplement.store_creator] Saved creator {user_id} to MongoDB\")\n\n\nclass WeiboExcelStoreImplement:\n    \"\"\"Weibo Excel storage implementation - Global singleton\"\"\"\n\n    def __new__(cls, *args, **kwargs):\n        from store.excel_store_base import ExcelStoreBase\n        return ExcelStoreBase.get_instance(\n            platform=\"weibo\",\n            crawler_type=crawler_type_var.get()\n        )\n"
  },
  {
    "path": "store/weibo/weibo_store_media.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/store/weibo/weibo_store_media.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# -*- coding: utf-8 -*-\n# @Author  : Erm\n# @Time    : 2024/4/9 17:35\n# @Desc    : Weibo media storage\nimport pathlib\nfrom typing import Dict\n\nimport aiofiles\n\nfrom base.base_crawler import AbstractStoreImage, AbstractStoreVideo\nfrom tools import utils\nimport config\n\n\nclass WeiboStoreImage(AbstractStoreImage):\n    def __init__(self):\n        if config.SAVE_DATA_PATH:\n            self.image_store_path = f\"{config.SAVE_DATA_PATH}/weibo/images\"\n        else:\n            self.image_store_path = \"data/weibo/images\"\n\n    async def store_image(self, image_content_item: Dict):\n        \"\"\"\n        store content\n\n        Args:\n            image_content_item:\n\n        Returns:\n\n        \"\"\"\n        await self.save_image(image_content_item.get(\"pic_id\"), image_content_item.get(\"pic_content\"), image_content_item.get(\"extension_file_name\"))\n\n    def make_save_file_name(self, picid: str, extension_file_name: str) -> str:\n        \"\"\"\n        make save file name by store type\n\n        Args:\n            picid: image id\n            extension_file_name: video filename with extension\n\n        Returns:\n\n        \"\"\"\n        return f\"{self.image_store_path}/{picid}.{extension_file_name}\"\n\n    async def save_image(self, picid: str, pic_content: str, extension_file_name=\"jpg\"):\n        \"\"\"\n        save image to local\n\n        Args:\n            picid: image id\n            pic_content: image content\n            extension_file_name: image filename with extension\n\n        Returns:\n\n        \"\"\"\n        pathlib.Path(self.image_store_path).mkdir(parents=True, exist_ok=True)\n        save_file_name = self.make_save_file_name(picid, extension_file_name)\n        async with aiofiles.open(save_file_name, 'wb') as f:\n            await f.write(pic_content)\n            utils.logger.info(f\"[WeiboImageStoreImplement.save_image] save image {save_file_name} success ...\")\n"
  },
  {
    "path": "store/xhs/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/store/xhs/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2024/1/14 17:34\n# @Desc    :\nfrom typing import List\n\nimport config\nfrom var import source_keyword_var\n\nfrom .xhs_store_media import *\nfrom ._store_impl import *\n\n\nclass XhsStoreFactory:\n    STORES = {\n        \"csv\": XhsCsvStoreImplement,\n        \"db\": XhsDbStoreImplement,\n        \"postgres\": XhsDbStoreImplement,\n        \"json\": XhsJsonStoreImplement,\n        \"jsonl\": XhsJsonlStoreImplement,\n        \"sqlite\": XhsSqliteStoreImplement,\n        \"mongodb\": XhsMongoStoreImplement,\n        \"excel\": XhsExcelStoreImplement,\n    }\n\n    @staticmethod\n    def create_store() -> AbstractStore:\n        store_class = XhsStoreFactory.STORES.get(config.SAVE_DATA_OPTION)\n        if not store_class:\n            raise ValueError(\"[XhsStoreFactory.create_store] Invalid save option only supported csv or db or json or sqlite or mongodb or excel ...\")\n        return store_class()\n\n\ndef get_video_url_arr(note_item: Dict) -> List:\n    \"\"\"\n    Get video url array\n    Args:\n        note_item:\n\n    Returns:\n\n    \"\"\"\n    if note_item.get('type') != 'video':\n        return []\n\n    video_dict = note_item.get('video')\n    if not video_dict:\n        return []\n\n    videoArr = []\n    consumer = video_dict.get('consumer', {})\n    originVideoKey = consumer.get('origin_video_key', '')\n    if originVideoKey == '':\n        originVideoKey = consumer.get('originVideoKey', '')\n    # Fallback with watermark\n    if originVideoKey == '':\n        media = video_dict.get('media', {})\n        stream = media.get('stream', {})\n        videos = stream.get('h264')\n        if type(videos).__name__ == 'list':\n            videoArr = [v.get('master_url') for v in videos]\n    else:\n        videoArr = [f\"http://sns-video-bd.xhscdn.com/{originVideoKey}\"]\n\n    return videoArr\n\n\nasync def update_xhs_note(note_item: Dict):\n    \"\"\"\n    Update Xiaohongshu note\n    Args:\n        note_item:\n\n    Returns:\n\n    \"\"\"\n    note_id = note_item.get(\"note_id\")\n    user_info = note_item.get(\"user\", {})\n    interact_info = note_item.get(\"interact_info\", {})\n    image_list: List[Dict] = note_item.get(\"image_list\", [])\n    tag_list: List[Dict] = note_item.get(\"tag_list\", [])\n\n    for img in image_list:\n        if img.get('url_default') != '':\n            img.update({'url': img.get('url_default')})\n\n    video_url = ','.join(get_video_url_arr(note_item))\n\n    local_db_item = {\n        \"note_id\": note_item.get(\"note_id\"),  # Note ID\n        \"type\": note_item.get(\"type\"),  # Note type\n        \"title\": note_item.get(\"title\") or note_item.get(\"desc\", \"\")[:255],  # Note title\n        \"desc\": note_item.get(\"desc\", \"\"),  # Note description\n        \"video_url\": video_url,  # Note video url\n        \"time\": note_item.get(\"time\"),  # Note publish time\n        \"last_update_time\": note_item.get(\"last_update_time\", 0),  # Note last update time\n        \"user_id\": user_info.get(\"user_id\"),  # User ID\n        \"nickname\": user_info.get(\"nickname\"),  # User nickname\n        \"avatar\": user_info.get(\"avatar\"),  # User avatar\n        \"liked_count\": interact_info.get(\"liked_count\"),  # Like count\n        \"collected_count\": interact_info.get(\"collected_count\"),  # Collection count\n        \"comment_count\": interact_info.get(\"comment_count\"),  # Comment count\n        \"share_count\": interact_info.get(\"share_count\"),  # Share count\n        \"ip_location\": note_item.get(\"ip_location\", \"\"),  # IP location\n        \"image_list\": ','.join([img.get('url', '') for img in image_list]),  # Image URLs\n        \"tag_list\": ','.join([tag.get('name', '') for tag in tag_list if tag.get('type') == 'topic']),  # Tags\n        \"last_modify_ts\": utils.get_current_timestamp(),  # Last modification timestamp (Generated by MediaCrawler, mainly used to record the latest update time of a record in DB storage)\n        \"note_url\": f\"https://www.xiaohongshu.com/explore/{note_id}?xsec_token={note_item.get('xsec_token')}&xsec_source=pc_search\",  # Note URL\n        \"source_keyword\": source_keyword_var.get(),  # Search keyword\n        \"xsec_token\": note_item.get(\"xsec_token\"),  # xsec_token\n    }\n    utils.logger.info(f\"[store.xhs.update_xhs_note] xhs note: {local_db_item}\")\n    await XhsStoreFactory.create_store().store_content(local_db_item)\n\n\nasync def batch_update_xhs_note_comments(note_id: str, comments: List[Dict]):\n    \"\"\"\n    Batch update Xiaohongshu note comments\n    Args:\n        note_id:\n        comments:\n\n    Returns:\n\n    \"\"\"\n    if not comments:\n        return\n    for comment_item in comments:\n        await update_xhs_note_comment(note_id, comment_item)\n\n\nasync def update_xhs_note_comment(note_id: str, comment_item: Dict):\n    \"\"\"\n    Update Xiaohongshu note comment\n    Args:\n        note_id:\n        comment_item:\n\n    Returns:\n\n    \"\"\"\n    user_info = comment_item.get(\"user_info\", {})\n    comment_id = comment_item.get(\"id\")\n    comment_pictures = [item.get(\"url_default\", \"\") for item in comment_item.get(\"pictures\", [])]\n    target_comment = comment_item.get(\"target_comment\", {})\n    local_db_item = {\n        \"comment_id\": comment_id,  # Comment ID\n        \"create_time\": comment_item.get(\"create_time\"),  # Comment time\n        \"ip_location\": comment_item.get(\"ip_location\"),  # IP location\n        \"note_id\": note_id,  # Note ID\n        \"content\": comment_item.get(\"content\"),  # Comment content\n        \"user_id\": user_info.get(\"user_id\"),  # User ID\n        \"nickname\": user_info.get(\"nickname\"),  # User nickname\n        \"avatar\": user_info.get(\"image\"),  # User avatar\n        \"sub_comment_count\": comment_item.get(\"sub_comment_count\", 0),  # Sub-comment count\n        \"pictures\": \",\".join(comment_pictures),  # Comment pictures\n        \"parent_comment_id\": target_comment.get(\"id\", 0),  # Parent comment ID\n        \"last_modify_ts\": utils.get_current_timestamp(),  # Last modification timestamp (Generated by MediaCrawler, mainly used to record the latest update time of a record in DB storage)\n        \"like_count\": comment_item.get(\"like_count\", 0),\n    }\n    utils.logger.info(f\"[store.xhs.update_xhs_note_comment] xhs note comment:{local_db_item}\")\n    await XhsStoreFactory.create_store().store_comment(local_db_item)\n\n\nasync def save_creator(user_id: str, creator: Dict):\n    \"\"\"\n    Save Xiaohongshu creator\n    Args:\n        user_id:\n        creator:\n\n    Returns:\n\n    \"\"\"\n    user_info = creator.get('basicInfo', {})\n\n    follows = 0\n    fans = 0\n    interaction = 0\n    for i in creator.get('interactions'):\n        if i.get('type') == 'follows':\n            follows = i.get('count')\n        elif i.get('type') == 'fans':\n            fans = i.get('count')\n        elif i.get('type') == 'interaction':\n            interaction = i.get('count')\n\n    def get_gender(gender):\n        if gender == 1:\n            return 'Female'\n        elif gender == 0:\n            return 'Male'\n        else:\n            return None\n\n    local_db_item = {\n        'user_id': user_id,  # User ID\n        'nickname': user_info.get('nickname'),  # Nickname\n        'gender': get_gender(user_info.get('gender')),  # Gender\n        'avatar': user_info.get('images'),  # Avatar\n        'desc': user_info.get('desc'),  # Personal description\n        'ip_location': user_info.get('ipLocation'),  # IP location\n        'follows': follows,  # Following count\n        'fans': fans,  # Fans count\n        'interaction': interaction,  # Interaction count\n        'tag_list': json.dumps({tag.get('tagType'): tag.get('name')\n                                for tag in creator.get('tags')}, ensure_ascii=False),  # Tags\n        \"last_modify_ts\": utils.get_current_timestamp(),  # Last modification timestamp (Generated by MediaCrawler, mainly used to record the latest update time of a record in DB storage)\n    }\n    utils.logger.info(f\"[store.xhs.save_creator] creator:{local_db_item}\")\n    await XhsStoreFactory.create_store().store_creator(local_db_item)\n\n\nasync def update_xhs_note_image(note_id, pic_content, extension_file_name):\n    \"\"\"\n    Update Xiaohongshu note image\n    Args:\n        note_id:\n        pic_content:\n        extension_file_name:\n\n    Returns:\n\n    \"\"\"\n\n    await XiaoHongShuImage().store_image({\"notice_id\": note_id, \"pic_content\": pic_content, \"extension_file_name\": extension_file_name})\n\n\nasync def update_xhs_note_video(note_id, video_content, extension_file_name):\n    \"\"\"\n    Update Xiaohongshu note video\n    Args:\n        note_id:\n        video_content:\n        extension_file_name:\n\n    Returns:\n\n    \"\"\"\n\n    await XiaoHongShuVideo().store_video({\"notice_id\": note_id, \"video_content\": video_content, \"extension_file_name\": extension_file_name})\n"
  },
  {
    "path": "store/xhs/_store_impl.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/store/xhs/_store_impl.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# @Author  : persist1@126.com\n# @Time    : 2025/9/5 19:34\n# @Desc    : Xiaohongshu storage implementation class\nimport json\nimport os\nfrom datetime import datetime\nfrom typing import List, Dict, Any\n\nfrom sqlalchemy import select, update, delete\nfrom sqlalchemy.ext.asyncio import AsyncSession\nfrom sqlalchemy.orm import Session\n\nfrom base.base_crawler import AbstractStore\nfrom database.db_session import get_session\nfrom database.models import XhsNote, XhsNoteComment, XhsCreator\n\nfrom tools.async_file_writer import AsyncFileWriter\nfrom tools.time_util import get_current_timestamp\nfrom var import crawler_type_var\nfrom database.mongodb_store_base import MongoDBStoreBase\nfrom tools import utils\nfrom store.excel_store_base import ExcelStoreBase\n\nclass XhsCsvStoreImplement(AbstractStore):\n    def __init__(self, **kwargs):\n        super().__init__(**kwargs)\n        self.writer = AsyncFileWriter(platform=\"xhs\", crawler_type=crawler_type_var.get())\n\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        store content data to csv file\n        :param content_item:\n        :return:\n        \"\"\"\n        await self.writer.write_to_csv(item_type=\"contents\", item=content_item)\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        store comment data to csv file\n        :param comment_item:\n        :return:\n        \"\"\"\n        await self.writer.write_to_csv(item_type=\"comments\", item=comment_item)\n\n\n    async def store_creator(self, creator_item: Dict):\n        pass\n\n    def flush(self):\n        pass\n\n\nclass XhsJsonStoreImplement(AbstractStore):\n    def __init__(self, **kwargs):\n        super().__init__(**kwargs)\n        self.writer = AsyncFileWriter(platform=\"xhs\", crawler_type=crawler_type_var.get())\n\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        store content data to json file\n        :param content_item:\n        :return:\n        \"\"\"\n        await self.writer.write_single_item_to_json(item_type=\"contents\", item=content_item)\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        store comment data to json file\n        :param comment_item:\n        :return:\n        \"\"\"\n        await self.writer.write_single_item_to_json(item_type=\"comments\", item=comment_item)\n\n    async def store_creator(self, creator_item: Dict):\n        pass\n\n    def flush(self):\n        \"\"\"\n        flush data to json file\n        :return:\n        \"\"\"\n        pass\n\n\n\nclass XhsJsonlStoreImplement(AbstractStore):\n    def __init__(self, **kwargs):\n        super().__init__(**kwargs)\n        self.writer = AsyncFileWriter(platform=\"xhs\", crawler_type=crawler_type_var.get())\n\n    async def store_content(self, content_item: Dict):\n        await self.writer.write_to_jsonl(item_type=\"contents\", item=content_item)\n\n    async def store_comment(self, comment_item: Dict):\n        await self.writer.write_to_jsonl(item_type=\"comments\", item=comment_item)\n\n    async def store_creator(self, creator_item: Dict):\n        pass\n\n    def flush(self):\n        pass\n\n\nclass XhsDbStoreImplement(AbstractStore):\n    def __init__(self, **kwargs):\n        super().__init__(**kwargs)\n\n    async def store_content(self, content_item: Dict):\n        note_id = content_item.get(\"note_id\")\n        if not note_id:\n            return\n        async with get_session() as session:\n            if await self.content_is_exist(session, note_id):\n                await self.update_content(session, content_item)\n            else:\n                await self.add_content(session, content_item)\n\n    async def add_content(self, session: AsyncSession, content_item: Dict):\n        add_ts = int(get_current_timestamp())\n        last_modify_ts = int(get_current_timestamp())\n        note = XhsNote(\n            user_id=content_item.get(\"user_id\"),\n            nickname=content_item.get(\"nickname\"),\n            avatar=content_item.get(\"avatar\"),\n            ip_location=content_item.get(\"ip_location\"),\n            add_ts=add_ts,\n            last_modify_ts=last_modify_ts,\n            note_id=content_item.get(\"note_id\"),\n            type=content_item.get(\"type\"),\n            title=content_item.get(\"title\"),\n            desc=content_item.get(\"desc\"),\n            video_url=content_item.get(\"video_url\"),\n            time=content_item.get(\"time\"),\n            last_update_time=content_item.get(\"last_update_time\"),\n            liked_count=str(content_item.get(\"liked_count\")),\n            collected_count=str(content_item.get(\"collected_count\")),\n            comment_count=str(content_item.get(\"comment_count\")),\n            share_count=str(content_item.get(\"share_count\")),\n            image_list=json.dumps(content_item.get(\"image_list\")),\n            tag_list=json.dumps(content_item.get(\"tag_list\")),\n            note_url=content_item.get(\"note_url\"),\n            source_keyword=content_item.get(\"source_keyword\", \"\"),\n            xsec_token=content_item.get(\"xsec_token\", \"\")\n        )\n        session.add(note)\n\n    async def update_content(self, session: AsyncSession, content_item: Dict):\n        note_id = content_item.get(\"note_id\")\n        last_modify_ts = int(get_current_timestamp())\n        update_data = {\n            \"last_modify_ts\": last_modify_ts,\n            \"liked_count\": str(content_item.get(\"liked_count\")),\n            \"collected_count\": str(content_item.get(\"collected_count\")),\n            \"comment_count\": str(content_item.get(\"comment_count\")),\n            \"share_count\": str(content_item.get(\"share_count\")),\n            \"last_update_time\": content_item.get(\"last_update_time\"),\n        }\n        stmt = update(XhsNote).where(XhsNote.note_id == note_id).values(**update_data)\n        await session.execute(stmt)\n\n    async def content_is_exist(self, session: AsyncSession, note_id: str) -> bool:\n        stmt = select(XhsNote).where(XhsNote.note_id == note_id)\n        result = await session.execute(stmt)\n        return result.first() is not None\n\n    async def store_comment(self, comment_item: Dict):\n        if not comment_item:\n            return\n        async with get_session() as session:\n            comment_id = comment_item.get(\"comment_id\")\n            if not comment_id:\n                return\n            if await self.comment_is_exist(session, comment_id):\n                await self.update_comment(session, comment_item)\n            else:\n                await self.add_comment(session, comment_item)\n\n    async def add_comment(self, session: AsyncSession, comment_item: Dict):\n        add_ts = int(get_current_timestamp())\n        last_modify_ts = int(get_current_timestamp())\n        comment = XhsNoteComment(\n            user_id=comment_item.get(\"user_id\"),\n            nickname=comment_item.get(\"nickname\"),\n            avatar=comment_item.get(\"avatar\"),\n            ip_location=comment_item.get(\"ip_location\"),\n            add_ts=add_ts,\n            last_modify_ts=last_modify_ts,\n            comment_id=comment_item.get(\"comment_id\"),\n            create_time=comment_item.get(\"create_time\"),\n            note_id=comment_item.get(\"note_id\"),\n            content=comment_item.get(\"content\"),\n            sub_comment_count=int(comment_item.get(\"sub_comment_count\", 0) or 0),\n            pictures=json.dumps(comment_item.get(\"pictures\")),\n            parent_comment_id=str(comment_item.get(\"parent_comment_id\", \"\")),\n            like_count=str(comment_item.get(\"like_count\"))\n        )\n        session.add(comment)\n\n    async def update_comment(self, session: AsyncSession, comment_item: Dict):\n        comment_id = comment_item.get(\"comment_id\")\n        last_modify_ts = int(get_current_timestamp())\n        update_data = {\n            \"last_modify_ts\": last_modify_ts,\n            \"like_count\": str(comment_item.get(\"like_count\")),\n            \"sub_comment_count\": int(comment_item.get(\"sub_comment_count\", 0) or 0),\n        }\n        stmt = update(XhsNoteComment).where(XhsNoteComment.comment_id == comment_id).values(**update_data)\n        await session.execute(stmt)\n\n    async def comment_is_exist(self, session: AsyncSession, comment_id: str) -> bool:\n        stmt = select(XhsNoteComment).where(XhsNoteComment.comment_id == comment_id)\n        result = await session.execute(stmt)\n        return result.first() is not None\n\n    async def store_creator(self, creator_item: Dict):\n        user_id = creator_item.get(\"user_id\")\n        if not user_id:\n            return\n        async with get_session() as session:\n            if await self.creator_is_exist(session, user_id):\n                await self.update_creator(session, creator_item)\n            else:\n                await self.add_creator(session, creator_item)\n\n    async def add_creator(self, session: AsyncSession, creator_item: Dict):\n        add_ts = int(get_current_timestamp())\n        last_modify_ts = int(get_current_timestamp())\n        creator = XhsCreator(\n            user_id=creator_item.get(\"user_id\"),\n            nickname=creator_item.get(\"nickname\"),\n            avatar=creator_item.get(\"avatar\"),\n            ip_location=creator_item.get(\"ip_location\"),\n            add_ts=add_ts,\n            last_modify_ts=last_modify_ts,\n            desc=creator_item.get(\"desc\"),\n            gender=creator_item.get(\"gender\"),\n            follows=str(creator_item.get(\"follows\")),\n            fans=str(creator_item.get(\"fans\")),\n            interaction=str(creator_item.get(\"interaction\")),\n            tag_list=json.dumps(creator_item.get(\"tag_list\"))\n        )\n        session.add(creator)\n\n    async def update_creator(self, session: AsyncSession, creator_item: Dict):\n        user_id = creator_item.get(\"user_id\")\n        last_modify_ts = int(get_current_timestamp())\n        update_data = {\n            \"last_modify_ts\": last_modify_ts,\n            \"nickname\": creator_item.get(\"nickname\"),\n            \"avatar\": creator_item.get(\"avatar\"),\n            \"desc\": creator_item.get(\"desc\"),\n            \"follows\": str(creator_item.get(\"follows\")),\n            \"fans\": str(creator_item.get(\"fans\")),\n            \"interaction\": str(creator_item.get(\"interaction\")),\n            \"tag_list\": json.dumps(creator_item.get(\"tag_list\"))\n        }\n        stmt = update(XhsCreator).where(XhsCreator.user_id == user_id).values(**update_data)\n        await session.execute(stmt)\n\n    async def creator_is_exist(self, session: AsyncSession, user_id: str) -> bool:\n        stmt = select(XhsCreator).where(XhsCreator.user_id == user_id)\n        result = await session.execute(stmt)\n        return result.first() is not None\n\n    async def get_all_content(self) -> List[Dict]:\n        async with get_session() as session:\n            stmt = select(XhsNote)\n            result = await session.execute(stmt)\n            return [item.__dict__ for item in result.scalars().all()]\n\n    async def get_all_comments(self) -> List[Dict]:\n        async with get_session() as session:\n            stmt = select(XhsNoteComment)\n            result = await session.execute(stmt)\n            return [item.__dict__ for item in result.scalars().all()]\n\n\nclass XhsSqliteStoreImplement(XhsDbStoreImplement):\n    def __init__(self, **kwargs):\n        super().__init__(**kwargs)\n\n\nclass XhsMongoStoreImplement(AbstractStore):\n    \"\"\"Xiaohongshu MongoDB storage implementation\"\"\"\n\n    def __init__(self, **kwargs):\n        super().__init__(**kwargs)\n        self.mongo_store = MongoDBStoreBase(collection_prefix=\"xhs\")\n\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        Store note content to MongoDB\n        Args:\n            content_item: Note content data\n        \"\"\"\n        note_id = content_item.get(\"note_id\")\n        if not note_id:\n            return\n\n        await self.mongo_store.save_or_update(\n            collection_suffix=\"contents\",\n            query={\"note_id\": note_id},\n            data=content_item\n        )\n        utils.logger.info(f\"[XhsMongoStoreImplement.store_content] Saved note {note_id} to MongoDB\")\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        Store comment to MongoDB\n        Args:\n            comment_item: Comment data\n        \"\"\"\n        comment_id = comment_item.get(\"comment_id\")\n        if not comment_id:\n            return\n\n        await self.mongo_store.save_or_update(\n            collection_suffix=\"comments\",\n            query={\"comment_id\": comment_id},\n            data=comment_item\n        )\n        utils.logger.info(f\"[XhsMongoStoreImplement.store_comment] Saved comment {comment_id} to MongoDB\")\n\n    async def store_creator(self, creator_item: Dict):\n        \"\"\"\n        Store creator information to MongoDB\n        Args:\n            creator_item: Creator data\n        \"\"\"\n        user_id = creator_item.get(\"user_id\")\n        if not user_id:\n            return\n\n        await self.mongo_store.save_or_update(\n            collection_suffix=\"creators\",\n            query={\"user_id\": user_id},\n            data=creator_item\n        )\n        utils.logger.info(f\"[XhsMongoStoreImplement.store_creator] Saved creator {user_id} to MongoDB\")\n\n\nclass XhsExcelStoreImplement:\n    \"\"\"Xiaohongshu Excel storage implementation - Global singleton\"\"\"\n\n    def __new__(cls, *args, **kwargs):\n        from store.excel_store_base import ExcelStoreBase\n        return ExcelStoreBase.get_instance(\n            platform=\"xhs\",\n            crawler_type=crawler_type_var.get()\n        )\n"
  },
  {
    "path": "store/xhs/xhs_store_media.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/store/xhs/xhs_store_media.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# -*- coding: utf-8 -*-\n# @Author  : helloteemo\n# @Time    : 2024/7/11 22:35\n# @Desc    : Xiaohongshu media storage\nimport pathlib\nfrom typing import Dict\n\nimport aiofiles\n\nfrom base.base_crawler import AbstractStoreImage, AbstractStoreVideo\nfrom tools import utils\nimport config\n\n\nclass XiaoHongShuImage(AbstractStoreImage):\n    def __init__(self):\n        if config.SAVE_DATA_PATH:\n            self.image_store_path = f\"{config.SAVE_DATA_PATH}/xhs/images\"\n        else:\n            self.image_store_path = \"data/xhs/images\"\n\n    async def store_image(self, image_content_item: Dict):\n        \"\"\"\n        store content\n\n        Args:\n            image_content_item:\n\n        Returns:\n\n        \"\"\"\n        await self.save_image(image_content_item.get(\"notice_id\"), image_content_item.get(\"pic_content\"), image_content_item.get(\"extension_file_name\"))\n\n    def make_save_file_name(self, notice_id: str, extension_file_name: str) -> str:\n        \"\"\"\n        make save file name by store type\n\n        Args:\n            notice_id: notice id\n            extension_file_name: image filename with extension\n\n        Returns:\n\n        \"\"\"\n        return f\"{self.image_store_path}/{notice_id}/{extension_file_name}\"\n\n    async def save_image(self, notice_id: str, pic_content: str, extension_file_name):\n        \"\"\"\n        save image to local\n\n        Args:\n            notice_id: notice id\n            pic_content: image content\n            extension_file_name: image filename with extension\n\n        Returns:\n\n        \"\"\"\n        pathlib.Path(self.image_store_path + \"/\" + notice_id).mkdir(parents=True, exist_ok=True)\n        save_file_name = self.make_save_file_name(notice_id, extension_file_name)\n        async with aiofiles.open(save_file_name, 'wb') as f:\n            await f.write(pic_content)\n            utils.logger.info(f\"[XiaoHongShuImageStoreImplement.save_image] save image {save_file_name} success ...\")\n\n\nclass XiaoHongShuVideo(AbstractStoreVideo):\n    def __init__(self):\n        if config.SAVE_DATA_PATH:\n            self.video_store_path = f\"{config.SAVE_DATA_PATH}/xhs/videos\"\n        else:\n            self.video_store_path = \"data/xhs/videos\"\n\n    async def store_video(self, video_content_item: Dict):\n        \"\"\"\n        store content\n\n        Args:\n            video_content_item:\n\n        Returns:\n\n        \"\"\"\n        await self.save_video(video_content_item.get(\"notice_id\"), video_content_item.get(\"video_content\"), video_content_item.get(\"extension_file_name\"))\n\n    def make_save_file_name(self, notice_id: str, extension_file_name: str) -> str:\n        \"\"\"\n        make save file name by store type\n\n        Args:\n            notice_id: notice id\n            extension_file_name: video filename with extension\n\n        Returns:\n\n        \"\"\"\n        return f\"{self.video_store_path}/{notice_id}/{extension_file_name}\"\n\n    async def save_video(self, notice_id: str, video_content: str, extension_file_name):\n        \"\"\"\n        save video to local\n\n        Args:\n            notice_id: notice id\n            video_content: video content\n            extension_file_name: video filename with extension\n\n        Returns:\n\n        \"\"\"\n        pathlib.Path(self.video_store_path + \"/\" + notice_id).mkdir(parents=True, exist_ok=True)\n        save_file_name = self.make_save_file_name(notice_id, extension_file_name)\n        async with aiofiles.open(save_file_name, 'wb') as f:\n            await f.write(video_content)\n            utils.logger.info(f\"[XiaoHongShuVideoStoreImplement.save_video] save video {save_file_name} success ...\")\n"
  },
  {
    "path": "store/zhihu/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/store/zhihu/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\nfrom typing import List\n\nimport config\nfrom base.base_crawler import AbstractStore\nfrom model.m_zhihu import ZhihuComment, ZhihuContent, ZhihuCreator\nfrom ._store_impl import (ZhihuCsvStoreImplement,\n                                          ZhihuDbStoreImplement,\n                                          ZhihuJsonStoreImplement,\n                                          ZhihuJsonlStoreImplement,\n                                          ZhihuSqliteStoreImplement,\n                                          ZhihuMongoStoreImplement,\n                                          ZhihuExcelStoreImplement)\nfrom tools import utils\nfrom var import source_keyword_var\n\n\nclass ZhihuStoreFactory:\n    STORES = {\n        \"csv\": ZhihuCsvStoreImplement,\n        \"db\": ZhihuDbStoreImplement,\n        \"postgres\": ZhihuDbStoreImplement,\n        \"json\": ZhihuJsonStoreImplement,\n        \"jsonl\": ZhihuJsonlStoreImplement,\n        \"sqlite\": ZhihuSqliteStoreImplement,\n        \"mongodb\": ZhihuMongoStoreImplement,\n        \"excel\": ZhihuExcelStoreImplement,\n    }\n\n    @staticmethod\n    def create_store() -> AbstractStore:\n        store_class = ZhihuStoreFactory.STORES.get(config.SAVE_DATA_OPTION)\n        if not store_class:\n            raise ValueError(\"[ZhihuStoreFactory.create_store] Invalid save option only supported csv or db or json or sqlite or mongodb or excel ...\")\n        return store_class()\n\nasync def batch_update_zhihu_contents(contents: List[ZhihuContent]):\n    \"\"\"\n    Batch update Zhihu contents\n    Args:\n        contents:\n\n    Returns:\n\n    \"\"\"\n    if not contents:\n        return\n\n    for content_item in contents:\n        await update_zhihu_content(content_item)\n\nasync def update_zhihu_content(content_item: ZhihuContent):\n    \"\"\"\n    Update Zhihu content\n    Args:\n        content_item:\n\n    Returns:\n\n    \"\"\"\n    content_item.source_keyword = source_keyword_var.get()\n    local_db_item = content_item.model_dump()\n    local_db_item.update({\"last_modify_ts\": utils.get_current_timestamp()})\n    utils.logger.info(f\"[store.zhihu.update_zhihu_content] zhihu content: {local_db_item}\")\n    await ZhihuStoreFactory.create_store().store_content(local_db_item)\n\n\n\nasync def batch_update_zhihu_note_comments(comments: List[ZhihuComment]):\n    \"\"\"\n    Batch update Zhihu content comments\n    Args:\n        comments:\n\n    Returns:\n\n    \"\"\"\n    if not comments:\n        return\n\n    for comment_item in comments:\n        await update_zhihu_content_comment(comment_item)\n\n\nasync def update_zhihu_content_comment(comment_item: ZhihuComment):\n    \"\"\"\n    Update Zhihu content comment\n    Args:\n        comment_item:\n\n    Returns:\n\n    \"\"\"\n    local_db_item = comment_item.model_dump()\n    local_db_item.update({\"last_modify_ts\": utils.get_current_timestamp()})\n    utils.logger.info(f\"[store.zhihu.update_zhihu_note_comment] zhihu content comment:{local_db_item}\")\n    await ZhihuStoreFactory.create_store().store_comment(local_db_item)\n\n\nasync def save_creator(creator: ZhihuCreator):\n    \"\"\"\n    Save Zhihu creator information\n    Args:\n        creator:\n\n    Returns:\n\n    \"\"\"\n    if not creator:\n        return\n    local_db_item = creator.model_dump()\n    local_db_item.update({\"last_modify_ts\": utils.get_current_timestamp()})\n    await ZhihuStoreFactory.create_store().store_creator(local_db_item)\n"
  },
  {
    "path": "store/zhihu/_store_impl.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/store/zhihu/_store_impl.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : persist1@126.com\n# @Time    : 2025/9/5 19:34\n# @Desc    : Zhihu storage implementation class\nimport asyncio\nimport csv\nimport json\nimport os\nimport pathlib\nfrom typing import Dict\n\nimport aiofiles\nfrom sqlalchemy import select\nfrom sqlalchemy.ext.asyncio import AsyncSession\n\nimport config\nfrom base.base_crawler import AbstractStore\nfrom database.db_session import get_session\nfrom database.models import ZhihuContent, ZhihuComment, ZhihuCreator\nfrom tools import utils, words\nfrom var import crawler_type_var\nfrom tools.async_file_writer import AsyncFileWriter\nfrom database.mongodb_store_base import MongoDBStoreBase\n\ndef calculate_number_of_files(file_store_path: str) -> int:\n    \"\"\"Calculate the prefix sorting number for data save files, supporting writing to different files for each run\n    Args:\n        file_store_path;\n    Returns:\n        file nums\n    \"\"\"\n    if not os.path.exists(file_store_path):\n        return 1\n    try:\n        return max([int(file_name.split(\"_\")[0]) for file_name in os.listdir(file_store_path)]) + 1\n    except ValueError:\n        return 1\n\n\nclass ZhihuCsvStoreImplement(AbstractStore):\n    def __init__(self, **kwargs):\n        super().__init__(**kwargs)\n        self.writer = AsyncFileWriter(platform=\"zhihu\", crawler_type=crawler_type_var.get())\n\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        Zhihu content CSV storage implementation\n        Args:\n            content_item: note item dict\n\n        Returns:\n\n        \"\"\"\n        await self.writer.write_to_csv(item_type=\"contents\", item=content_item)\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        Zhihu comment CSV storage implementation\n        Args:\n            comment_item: comment item dict\n\n        Returns:\n\n        \"\"\"\n        await self.writer.write_to_csv(item_type=\"comments\", item=comment_item)\n\n    async def store_creator(self, creator: Dict):\n        \"\"\"\n        Zhihu content CSV storage implementation\n        Args:\n            creator: creator dict\n\n        Returns:\n\n        \"\"\"\n        await self.writer.write_to_csv(item_type=\"creators\", item=creator)\n\n\nclass ZhihuDbStoreImplement(AbstractStore):\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        Zhihu content DB storage implementation\n        Args:\n            content_item: content item dict\n        \"\"\"\n        content_id = content_item.get(\"content_id\")\n        async with get_session() as session:\n            stmt = select(ZhihuContent).where(ZhihuContent.content_id == content_id)\n            result = await session.execute(stmt)\n            existing_content = result.scalars().first()\n            if existing_content:\n                for key, value in content_item.items():\n                    if hasattr(existing_content, key):\n                        setattr(existing_content, key, value)\n            else:\n                if \"add_ts\" not in content_item:\n                    content_item[\"add_ts\"] = utils.get_current_timestamp()\n                new_content = ZhihuContent(**content_item)\n                session.add(new_content)\n            await session.commit()\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        Zhihu content DB storage implementation\n        Args:\n            comment_item: comment item dict\n        \"\"\"\n        comment_id = comment_item.get(\"comment_id\")\n        async with get_session() as session:\n            stmt = select(ZhihuComment).where(ZhihuComment.comment_id == comment_id)\n            result = await session.execute(stmt)\n            existing_comment = result.scalars().first()\n            if existing_comment:\n                for key, value in comment_item.items():\n                    if hasattr(existing_comment, key):\n                        setattr(existing_comment, key, value)\n            else:\n                if \"add_ts\" not in comment_item:\n                    comment_item[\"add_ts\"] = utils.get_current_timestamp()\n                new_comment = ZhihuComment(**comment_item)\n                session.add(new_comment)\n            await session.commit()\n\n    async def store_creator(self, creator: Dict):\n        \"\"\"\n        Zhihu content DB storage implementation\n        Args:\n            creator: creator dict\n        \"\"\"\n        user_id = creator.get(\"user_id\")\n        async with get_session() as session:\n            stmt = select(ZhihuCreator).where(ZhihuCreator.user_id == user_id)\n            result = await session.execute(stmt)\n            existing_creator = result.scalars().first()\n            if existing_creator:\n                for key, value in creator.items():\n                    if hasattr(existing_creator, key):\n                        setattr(existing_creator, key, value)\n            else:\n                if \"add_ts\" not in creator:\n                    creator[\"add_ts\"] = utils.get_current_timestamp()\n                new_creator = ZhihuCreator(**creator)\n                session.add(new_creator)\n            await session.commit()\n\n\nclass ZhihuJsonStoreImplement(AbstractStore):\n    def __init__(self, **kwargs):\n        super().__init__(**kwargs)\n        self.writer = AsyncFileWriter(platform=\"zhihu\", crawler_type=crawler_type_var.get())\n\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        content JSON storage implementation\n        Args:\n            content_item:\n\n        Returns:\n\n        \"\"\"\n        await self.writer.write_single_item_to_json(item_type=\"contents\", item=content_item)\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        comment JSON storage implementation\n        Args:\n            comment_item:\n\n        Returns:\n\n        \"\"\"\n        await self.writer.write_single_item_to_json(item_type=\"comments\", item=comment_item)\n\n    async def store_creator(self, creator: Dict):\n        \"\"\"\n        Zhihu content JSON storage implementation\n        Args:\n            creator: creator dict\n\n        Returns:\n\n        \"\"\"\n        await self.writer.write_single_item_to_json(item_type=\"creators\", item=creator)\n\n\nclass ZhihuJsonlStoreImplement(AbstractStore):\n    def __init__(self, **kwargs):\n        super().__init__(**kwargs)\n        self.writer = AsyncFileWriter(platform=\"zhihu\", crawler_type=crawler_type_var.get())\n\n    async def store_content(self, content_item: Dict):\n        await self.writer.write_to_jsonl(item_type=\"contents\", item=content_item)\n\n    async def store_comment(self, comment_item: Dict):\n        await self.writer.write_to_jsonl(item_type=\"comments\", item=comment_item)\n\n    async def store_creator(self, creator: Dict):\n        await self.writer.write_to_jsonl(item_type=\"creators\", item=creator)\n\n\nclass ZhihuSqliteStoreImplement(ZhihuDbStoreImplement):\n    \"\"\"\n    Zhihu content SQLite storage implementation\n    \"\"\"\n    pass\n\n\nclass ZhihuMongoStoreImplement(AbstractStore):\n    \"\"\"Zhihu MongoDB storage implementation\"\"\"\n\n    def __init__(self):\n        self.mongo_store = MongoDBStoreBase(collection_prefix=\"zhihu\")\n\n    async def store_content(self, content_item: Dict):\n        \"\"\"\n        Store content to MongoDB\n        Args:\n            content_item: Content data\n        \"\"\"\n        note_id = content_item.get(\"note_id\")\n        if not note_id:\n            return\n\n        await self.mongo_store.save_or_update(\n            collection_suffix=\"contents\",\n            query={\"note_id\": note_id},\n            data=content_item\n        )\n        utils.logger.info(f\"[ZhihuMongoStoreImplement.store_content] Saved note {note_id} to MongoDB\")\n\n    async def store_comment(self, comment_item: Dict):\n        \"\"\"\n        Store comment to MongoDB\n        Args:\n            comment_item: Comment data\n        \"\"\"\n        comment_id = comment_item.get(\"comment_id\")\n        if not comment_id:\n            return\n\n        await self.mongo_store.save_or_update(\n            collection_suffix=\"comments\",\n            query={\"comment_id\": comment_id},\n            data=comment_item\n        )\n        utils.logger.info(f\"[ZhihuMongoStoreImplement.store_comment] Saved comment {comment_id} to MongoDB\")\n\n    async def store_creator(self, creator_item: Dict):\n        \"\"\"\n        Store creator information to MongoDB\n        Args:\n            creator_item: Creator data\n        \"\"\"\n        user_id = creator_item.get(\"user_id\")\n        if not user_id:\n            return\n\n        await self.mongo_store.save_or_update(\n            collection_suffix=\"creators\",\n            query={\"user_id\": user_id},\n            data=creator_item\n        )\n        utils.logger.info(f\"[ZhihuMongoStoreImplement.store_creator] Saved creator {user_id} to MongoDB\")\n\n\nclass ZhihuExcelStoreImplement:\n    \"\"\"Zhihu Excel storage implementation - Global singleton\"\"\"\n\n    def __new__(cls, *args, **kwargs):\n        from store.excel_store_base import ExcelStoreBase\n        return ExcelStoreBase.get_instance(\n            platform=\"zhihu\",\n            crawler_type=crawler_type_var.get()\n        )\n"
  },
  {
    "path": "test/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/test/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n"
  },
  {
    "path": "test/test_db_sync.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/test/test_db_sync.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n# @Author  : persist-1<persist1@126.com>\n# @Time    : 2025/9/8 00:02\n# @Desc    : Used to compare ORM mapping model (database/models.py) with actual database structure and perform update operations (connect database -> structure comparison -> difference report -> interactive synchronization)\n# @Tips    : This script requires dependency 'pymysql==1.1.0'\n\nimport os\nimport sys\nfrom sqlalchemy import create_engine, inspect as sqlalchemy_inspect\nfrom sqlalchemy.schema import MetaData\n\n# Add project root directory to sys.path\nsys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))\n\nfrom config.db_config import mysql_db_config, sqlite_db_config\nfrom database.models import Base\n\ndef get_mysql_engine():\n    \"\"\"Create and return a MySQL database engine\"\"\"\n    conn_str = f\"mysql+pymysql://{mysql_db_config['user']}:{mysql_db_config['password']}@{mysql_db_config['host']}:{mysql_db_config['port']}/{mysql_db_config['db_name']}\"\n    return create_engine(conn_str)\n\ndef get_sqlite_engine():\n    \"\"\"Create and return a SQLite database engine\"\"\"\n    conn_str = f\"sqlite:///{sqlite_db_config['db_path']}\"\n    return create_engine(conn_str)\n\ndef get_db_schema(engine):\n    \"\"\"Get current table structure of the database\"\"\"\n    inspector = sqlalchemy_inspect(engine)\n    schema = {}\n    for table_name in inspector.get_table_names():\n        columns = {}\n        for column in inspector.get_columns(table_name):\n            columns[column['name']] = str(column['type'])\n        schema[table_name] = columns\n    return schema\n\ndef get_orm_schema():\n    \"\"\"Get table structure of ORM model\"\"\"\n    schema = {}\n    for table_name, table in Base.metadata.tables.items():\n        columns = {}\n        for column in table.columns:\n            columns[column.name] = str(column.type)\n        schema[table_name] = columns\n    return schema\n\ndef compare_schemas(db_schema, orm_schema):\n    \"\"\"Compare database structure with ORM model structure and return differences\"\"\"\n    db_tables = set(db_schema.keys())\n    orm_tables = set(orm_schema.keys())\n\n    added_tables = orm_tables - db_tables\n    deleted_tables = db_tables - orm_tables\n    common_tables = db_tables.intersection(orm_tables)\n\n    changed_tables = {}\n\n    for table in common_tables:\n        db_cols = set(db_schema[table].keys())\n        orm_cols = set(orm_schema[table].keys())\n        added_cols = orm_cols - db_cols\n        deleted_cols = db_cols - orm_cols\n\n        modified_cols = {}\n        for col in db_cols.intersection(orm_cols):\n            if db_schema[table][col] != orm_schema[table][col]:\n                modified_cols[col] = (db_schema[table][col], orm_schema[table][col])\n\n        if added_cols or deleted_cols or modified_cols:\n            changed_tables[table] = {\n                \"added\": list(added_cols),\n                \"deleted\": list(deleted_cols),\n                \"modified\": modified_cols\n            }\n\n    return {\n        \"added_tables\": list(added_tables),\n        \"deleted_tables\": list(deleted_tables),\n        \"changed_tables\": changed_tables\n    }\n\ndef print_diff(db_name, diff):\n    \"\"\"Print difference report\"\"\"\n    print(f\"--- {db_name} Database Structure Difference Report ---\")\n    if not any(diff.values()):\n        print(\"Database structure matches ORM model, no synchronization needed.\")\n        return\n\n    if diff.get(\"added_tables\"):\n        print(\"\\n[+] Added tables:\")\n        for table in diff[\"added_tables\"]:\n            print(f\"  - {table}\")\n\n    if diff.get(\"deleted_tables\"):\n        print(\"\\n[-] Deleted tables:\")\n        for table in diff[\"deleted_tables\"]:\n            print(f\"  - {table}\")\n\n    if diff.get(\"changed_tables\"):\n        print(\"\\n[*] Changed tables:\")\n        for table, changes in diff[\"changed_tables\"].items():\n            print(f\"  - {table}:\")\n            if changes.get(\"added\"):\n                print(\"    [+] Added fields:\", \", \".join(changes[\"added\"]))\n            if changes.get(\"deleted\"):\n                print(\"    [-] Deleted fields:\", \", \".join(changes[\"deleted\"]))\n            if changes.get(\"modified\"):\n                print(\"    [*] Modified fields:\")\n                for col, types in changes[\"modified\"].items():\n                    print(f\"      - {col}: {types[0]} -> {types[1]}\")\n    print(\"--- End of Report ---\")\n\n\ndef sync_database(engine, diff):\n    \"\"\"Synchronize ORM model to database\"\"\"\n    metadata = Base.metadata\n\n    # Alembic context configuration\n    from alembic.migration import MigrationContext\n    from alembic.operations import Operations\n\n    conn = engine.connect()\n    ctx = MigrationContext.configure(conn)\n    op = Operations(ctx)\n\n    # Handle deleted tables\n    for table_name in diff['deleted_tables']:\n        op.drop_table(table_name)\n        print(f\"Deleted table: {table_name}\")\n\n    # Handle added tables\n    for table_name in diff['added_tables']:\n        table = metadata.tables.get(table_name)\n        if table is not None:\n            table.create(engine)\n            print(f\"Created table: {table_name}\")\n\n    # Handle field changes\n    for table_name, changes in diff['changed_tables'].items():\n        # Delete fields\n        for col_name in changes['deleted']:\n            op.drop_column(table_name, col_name)\n            print(f\"Deleted field in table {table_name}: {col_name}\")\n        # Add fields\n        for col_name in changes['added']:\n            table = metadata.tables.get(table_name)\n            column = table.columns.get(col_name)\n            if column is not None:\n                op.add_column(table_name, column)\n                print(f\"Added field in table {table_name}: {col_name}\")\n\n        # Modify fields\n        for col_name, types in changes['modified'].items():\n            table = metadata.tables.get(table_name)\n            if table is not None:\n                column = table.columns.get(col_name)\n                if column is not None:\n                    op.alter_column(table_name, col_name, type_=column.type)\n                    print(f\"Modified field in table {table_name}: {col_name} (type changed to {column.type})\")\n\n\ndef main():\n    \"\"\"Main function\"\"\"\n    orm_schema = get_orm_schema()\n\n    # Handle MySQL\n    try:\n        mysql_engine = get_mysql_engine()\n        mysql_schema = get_db_schema(mysql_engine)\n        mysql_diff = compare_schemas(mysql_schema, orm_schema)\n        print_diff(\"MySQL\", mysql_diff)\n        if any(mysql_diff.values()):\n            choice = input(\">>> Manual confirmation required: Synchronize ORM model to MySQL database? (y/N): \")\n            if choice.lower() == 'y':\n                sync_database(mysql_engine, mysql_diff)\n                print(\"MySQL database synchronization completed.\")\n    except Exception as e:\n        print(f\"Error processing MySQL: {e}\")\n\n\n    # Handle SQLite\n    try:\n        sqlite_engine = get_sqlite_engine()\n        sqlite_schema = get_db_schema(sqlite_engine)\n        sqlite_diff = compare_schemas(sqlite_schema, orm_schema)\n        print_diff(\"SQLite\", sqlite_diff)\n        if any(sqlite_diff.values()):\n            choice = input(\">>> Manual confirmation required: Synchronize ORM model to SQLite database? (y/N): \")\n            if choice.lower() == 'y':\n                # Note: SQLite does not support ALTER COLUMN to modify field types, simplified handling here\n                print(\"Warning: SQLite has limited support for field modifications, this script will not execute field type modification operations.\")\n                sync_database(sqlite_engine, sqlite_diff)\n                print(\"SQLite database synchronization completed.\")\n    except Exception as e:\n        print(f\"Error processing SQLite: {e}\")\n\n\nif __name__ == \"__main__\":\n    main()\n\n######################### Feedback example #########################\n# [*] Changed tables:\n#   - kuaishou_video:\n#     [*] Modified fields:\n#       - user_id: TEXT -> VARCHAR(64)\n#   - xhs_note_comment:\n#     [*] Modified fields:\n#       - comment_id: BIGINT -> VARCHAR(255)\n#   - zhihu_content:\n#     [*] Modified fields:\n#       - created_time: BIGINT -> VARCHAR(32)\n#       - content_id: BIGINT -> VARCHAR(64)\n#   - zhihu_creator:\n#     [*] Modified fields:\n#       - user_id: INTEGER -> VARCHAR(64)\n#   - tieba_note:\n#     [*] Modified fields:\n#       - publish_time: BIGINT -> VARCHAR(255)\n#       - tieba_id: INTEGER -> VARCHAR(255)\n#       - note_id: BIGINT -> VARCHAR(644)\n# --- End of Report ---\n# >>> Manual confirmation required: Synchronize ORM model to MySQL database? (y/N): y\n# Modified field in table kuaishou_video: user_id (type changed to VARCHAR(64))\n# Modified field in table xhs_note_comment: comment_id (type changed to VARCHAR(255))\n# Modified field in table zhihu_content: created_time (type changed to VARCHAR(32))\n# Modified field in table zhihu_content: content_id (type changed to VARCHAR(64))\n# Modified field in table zhihu_creator: user_id (type changed to VARCHAR(64))\n# Modified field in table tieba_note: publish_time (type changed to VARCHAR(255))\n# Modified field in table tieba_note: tieba_id (type changed to VARCHAR(255))\n# Modified field in table tieba_note: note_id (type changed to VARCHAR(644))\n# MySQL database synchronization completed.\n"
  },
  {
    "path": "test/test_expiring_local_cache.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/test/test_expiring_local_cache.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Name: Programmer Ajiang-Relakkes\n# @Time    : 2024/6/2 10:35\n# @Desc    :\n\nimport time\nimport unittest\n\nfrom cache.local_cache import ExpiringLocalCache\n\n\nclass TestExpiringLocalCache(unittest.TestCase):\n\n    def setUp(self):\n        self.cache = ExpiringLocalCache(cron_interval=10)\n\n    def test_set_and_get(self):\n        self.cache.set('key', 'value', 10)\n        self.assertEqual(self.cache.get('key'), 'value')\n\n    def test_expired_key(self):\n        self.cache.set('key', 'value', 1)\n        time.sleep(2)  # wait for the key to expire\n        self.assertIsNone(self.cache.get('key'))\n\n    def test_clear(self):\n        # Set two key-value pairs with expiration time of 11 seconds\n        self.cache.set('key', 'value', 11)\n        # Sleep for 12 seconds to let the cache class's scheduled task execute once\n        time.sleep(12)\n        self.assertIsNone(self.cache.get('key'))\n\n    def tearDown(self):\n        del self.cache\n\n\nif __name__ == '__main__':\n    unittest.main()\n"
  },
  {
    "path": "test/test_mongodb_integration.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/test/test_mongodb_integration.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\nimport asyncio\nimport unittest\nimport sys\nimport os\nfrom datetime import datetime\n\nsys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))\n\nfrom database.mongodb_store_base import MongoDBConnection, MongoDBStoreBase\nfrom store.xhs._store_impl import XhsMongoStoreImplement\nfrom store.douyin._store_impl import DouyinMongoStoreImplement\nfrom config import db_config\n\n\nclass TestMongoDBRealConnection(unittest.TestCase):\n\n    @classmethod\n    def setUpClass(cls):\n        try:\n            conn = MongoDBConnection()\n            asyncio.run(conn._connect())\n            cls.mongodb_available = True\n            print(\"\\n✓ MongoDB connection successful\")\n        except Exception as e:\n            cls.mongodb_available = False\n            print(f\"\\n✗ MongoDB connection failed: {e}\")\n\n    def setUp(self):\n        if not self.mongodb_available:\n            self.skipTest(\"MongoDB not available\")\n\n        MongoDBConnection._instance = None\n        MongoDBConnection._client = None\n        MongoDBConnection._db = None\n\n    def tearDown(self):\n        if self.mongodb_available:\n            conn = MongoDBConnection()\n            asyncio.run(conn.close())\n\n    @classmethod\n    def tearDownClass(cls):\n        if cls.mongodb_available:\n            async def cleanup():\n                conn = MongoDBConnection()\n                db = await conn.get_db()\n\n                test_collections = [\n                    \"test_xhs_contents\",\n                    \"test_xhs_comments\",\n                    \"test_xhs_creators\",\n                    \"test_douyin_contents\",\n                    \"test_douyin_comments\",\n                    \"test_douyin_creators\"\n                ]\n\n                for collection_name in test_collections:\n                    try:\n                        await db[collection_name].drop()\n                    except:\n                        pass\n\n                await conn.close()\n\n            try:\n                asyncio.run(cleanup())\n                print(\"\\n✓ Test data cleanup completed\")\n            except Exception as e:\n                print(f\"\\n✗ Error cleaning up test data: {e}\")\n\n    def test_real_connection(self):\n        async def test():\n            conn = MongoDBConnection()\n            client = await conn.get_client()\n            db = await conn.get_db()\n\n            self.assertIsNotNone(client)\n            self.assertIsNotNone(db)\n\n            result = await db.command(\"ping\")\n            self.assertEqual(result.get(\"ok\"), 1.0)\n\n        asyncio.run(test())\n\n    def test_real_save_and_query(self):\n        async def test():\n            store = MongoDBStoreBase(collection_prefix=\"test_xhs\")\n\n            test_data = {\n                \"note_id\": \"test_note_001\",\n                \"title\": \"Test Note\",\n                \"content\": \"This is a test content\",\n                \"created_at\": datetime.now().isoformat()\n            }\n\n            result = await store.save_or_update(\n                \"contents\",\n                {\"note_id\": \"test_note_001\"},\n                test_data\n            )\n            self.assertTrue(result)\n\n            found = await store.find_one(\n                \"contents\",\n                {\"note_id\": \"test_note_001\"}\n            )\n\n            self.assertIsNotNone(found)\n            self.assertEqual(found[\"note_id\"], \"test_note_001\")\n            self.assertEqual(found[\"title\"], \"Test Note\")\n\n        asyncio.run(test())\n\n    def test_real_update(self):\n        async def test():\n            store = MongoDBStoreBase(collection_prefix=\"test_xhs\")\n\n            initial_data = {\n                \"note_id\": \"test_note_002\",\n                \"title\": \"Initial Title\",\n                \"likes\": 10\n            }\n\n            await store.save_or_update(\n                \"contents\",\n                {\"note_id\": \"test_note_002\"},\n                initial_data\n            )\n\n            updated_data = {\n                \"note_id\": \"test_note_002\",\n                \"title\": \"Updated Title\",\n                \"likes\": 100\n            }\n\n            await store.save_or_update(\n                \"contents\",\n                {\"note_id\": \"test_note_002\"},\n                updated_data\n            )\n\n            found = await store.find_one(\n                \"contents\",\n                {\"note_id\": \"test_note_002\"}\n            )\n\n            self.assertEqual(found[\"title\"], \"Updated Title\")\n            self.assertEqual(found[\"likes\"], 100)\n\n        asyncio.run(test())\n\n    def test_real_find_many(self):\n        async def test():\n            store = MongoDBStoreBase(collection_prefix=\"test_xhs\")\n\n            test_user_id = \"test_user_123\"\n            for i in range(5):\n                data = {\n                    \"note_id\": f\"test_note_{i:03d}\",\n                    \"user_id\": test_user_id,\n                    \"title\": f\"Test Note {i}\",\n                    \"likes\": i * 10\n                }\n                await store.save_or_update(\n                    \"contents\",\n                    {\"note_id\": data[\"note_id\"]},\n                    data\n                )\n\n            results = await store.find_many(\n                \"contents\",\n                {\"user_id\": test_user_id}\n            )\n\n            self.assertGreaterEqual(len(results), 5)\n\n            limited_results = await store.find_many(\n                \"contents\",\n                {\"user_id\": test_user_id},\n                limit=3\n            )\n\n            self.assertEqual(len(limited_results), 3)\n\n        asyncio.run(test())\n\n    def test_real_create_index(self):\n        async def test():\n            store = MongoDBStoreBase(collection_prefix=\"test_xhs\")\n\n            await store.create_index(\n                \"contents\",\n                [(\"note_id\", 1)],\n                unique=True\n            )\n\n            collection = await store.get_collection(\"contents\")\n            indexes = await collection.index_information()\n\n            self.assertIn(\"note_id_1\", indexes)\n\n        asyncio.run(test())\n\n    def test_xhs_store_implementation(self):\n        async def test():\n            store = XhsMongoStoreImplement()\n\n            note_data = {\n                \"note_id\": \"xhs_test_001\",\n                \"user_id\": \"user_001\",\n                \"nickname\": \"Test User\",\n                \"title\": \"Xiaohongshu Test Note\",\n                \"desc\": \"This is a test note\",\n                \"type\": \"normal\",\n                \"liked_count\": \"100\",\n                \"collected_count\": \"50\",\n                \"comment_count\": \"20\"\n            }\n            await store.store_content(note_data)\n\n            comment_data = {\n                \"comment_id\": \"comment_001\",\n                \"note_id\": \"xhs_test_001\",\n                \"user_id\": \"user_002\",\n                \"nickname\": \"Comment User\",\n                \"content\": \"This is a test comment\",\n                \"like_count\": \"10\"\n            }\n            await store.store_comment(comment_data)\n\n            creator_data = {\n                \"user_id\": \"user_001\",\n                \"nickname\": \"Test Creator\",\n                \"desc\": \"This is a test creator\",\n                \"fans\": \"1000\",\n                \"follows\": \"100\"\n            }\n            await store.store_creator(creator_data)\n\n            mongo_store = store.mongo_store\n\n            note = await mongo_store.find_one(\"contents\", {\"note_id\": \"xhs_test_001\"})\n            self.assertIsNotNone(note)\n            self.assertEqual(note[\"title\"], \"Xiaohongshu Test Note\")\n\n            comment = await mongo_store.find_one(\"comments\", {\"comment_id\": \"comment_001\"})\n            self.assertIsNotNone(comment)\n            self.assertEqual(comment[\"content\"], \"This is a test comment\")\n\n            creator = await mongo_store.find_one(\"creators\", {\"user_id\": \"user_001\"})\n            self.assertIsNotNone(creator)\n            self.assertEqual(creator[\"nickname\"], \"Test Creator\")\n\n        asyncio.run(test())\n\n    def test_douyin_store_implementation(self):\n        async def test():\n            store = DouyinMongoStoreImplement()\n\n            video_data = {\n                \"aweme_id\": \"dy_test_001\",\n                \"user_id\": \"user_001\",\n                \"nickname\": \"Test User\",\n                \"title\": \"Douyin Test Video\",\n                \"desc\": \"This is a test video\",\n                \"liked_count\": \"1000\",\n                \"comment_count\": \"100\"\n            }\n            await store.store_content(video_data)\n\n            comment_data = {\n                \"comment_id\": \"dy_comment_001\",\n                \"aweme_id\": \"dy_test_001\",\n                \"user_id\": \"user_002\",\n                \"nickname\": \"Comment User\",\n                \"content\": \"This is a test comment\"\n            }\n            await store.store_comment(comment_data)\n\n            creator_data = {\n                \"user_id\": \"user_001\",\n                \"nickname\": \"Test Creator\",\n                \"desc\": \"This is a test creator\"\n            }\n            await store.store_creator(creator_data)\n\n            mongo_store = store.mongo_store\n\n            video = await mongo_store.find_one(\"contents\", {\"aweme_id\": \"dy_test_001\"})\n            self.assertIsNotNone(video)\n            self.assertEqual(video[\"title\"], \"Douyin Test Video\")\n\n            comment = await mongo_store.find_one(\"comments\", {\"comment_id\": \"dy_comment_001\"})\n            self.assertIsNotNone(comment)\n\n            creator = await mongo_store.find_one(\"creators\", {\"user_id\": \"user_001\"})\n            self.assertIsNotNone(creator)\n\n        asyncio.run(test())\n\n    def test_concurrent_operations(self):\n        async def test():\n            store = MongoDBStoreBase(collection_prefix=\"test_xhs\")\n\n            tasks = []\n            for i in range(10):\n                data = {\n                    \"note_id\": f\"concurrent_note_{i:03d}\",\n                    \"title\": f\"Concurrent Test Note {i}\",\n                    \"content\": f\"Content {i}\"\n                }\n                task = store.save_or_update(\n                    \"contents\",\n                    {\"note_id\": data[\"note_id\"]},\n                    data\n                )\n                tasks.append(task)\n\n            results = await asyncio.gather(*tasks)\n\n            self.assertTrue(all(results))\n\n            for i in range(10):\n                found = await store.find_one(\n                    \"contents\",\n                    {\"note_id\": f\"concurrent_note_{i:03d}\"}\n                )\n                self.assertIsNotNone(found)\n\n        asyncio.run(test())\n\n\ndef run_integration_tests():\n    loader = unittest.TestLoader()\n    suite = unittest.TestSuite()\n\n    suite.addTests(loader.loadTestsFromTestCase(TestMongoDBRealConnection))\n\n    runner = unittest.TextTestRunner(verbosity=2)\n    result = runner.run(suite)\n\n    return result\n\n\nif __name__ == \"__main__\":\n    print(\"=\"*70)\n    print(\"MongoDB Storage Integration Test\")\n    print(\"=\"*70)\n    print(f\"MongoDB Configuration:\")\n    print(f\"  Host: {db_config.MONGODB_HOST}\")\n    print(f\"  Port: {db_config.MONGODB_PORT}\")\n    print(f\"  Database: {db_config.MONGODB_DB_NAME}\")\n    print(\"=\"*70)\n\n    result = run_integration_tests()\n\n    print(\"\\n\" + \"=\"*70)\n    print(\"Test Statistics:\")\n    print(f\"Total tests: {result.testsRun}\")\n    print(f\"Passed: {result.testsRun - len(result.failures) - len(result.errors)}\")\n    print(f\"Failed: {len(result.failures)}\")\n    print(f\"Errors: {len(result.errors)}\")\n    print(f\"Skipped: {len(result.skipped)}\")\n    print(\"=\"*70)\n\n    sys.exit(0 if result.wasSuccessful() else 1)\n"
  },
  {
    "path": "test/test_proxy_ip_pool.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/test/test_proxy_ip_pool.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2023/12/2 14:42\n# @Desc    :\nimport time\nfrom unittest import IsolatedAsyncioTestCase\nfrom unittest.mock import AsyncMock, MagicMock\n\nfrom proxy.proxy_ip_pool import create_ip_pool, ProxyIpPool\nfrom proxy.types import IpInfoModel\n\n\nclass TestIpPool(IsolatedAsyncioTestCase):\n    async def test_ip_pool(self):\n        pool = await create_ip_pool(ip_pool_count=1, enable_validate_ip=True)\n        print(\"\\n\")\n        for _ in range(3):\n            ip_proxy_info: IpInfoModel = await pool.get_proxy()\n            print(ip_proxy_info)\n            self.assertIsNotNone(ip_proxy_info.ip, msg=\"Verify if IP is obtained successfully\")\n\n    async def test_ip_expiration(self):\n        \"\"\"Test IP proxy expiration detection functionality\"\"\"\n        print(\"\\n=== Starting IP proxy expiration detection test ===\")\n\n        # 1. Create IP pool and get a proxy\n        pool = await create_ip_pool(ip_pool_count=2, enable_validate_ip=True)\n        ip_proxy_info: IpInfoModel = await pool.get_proxy()\n        print(f\"Obtained proxy: {ip_proxy_info.ip}:{ip_proxy_info.port}\")\n\n        # 2. Test non-expired case\n        if ip_proxy_info.expired_time_ts:\n            print(f\"Proxy expiration timestamp: {ip_proxy_info.expired_time_ts}\")\n            print(f\"Current timestamp: {int(time.time())}\")\n            print(f\"Remaining valid time: {ip_proxy_info.expired_time_ts - int(time.time())} seconds\")\n\n            is_expired = ip_proxy_info.is_expired(buffer_seconds=30)\n            print(f\"Is proxy expired (30s buffer): {is_expired}\")\n            self.assertFalse(is_expired, msg=\"Newly obtained IP should not be expired\")\n        else:\n            print(\"Current proxy does not have expiration time set, skipping expiration detection\")\n\n        # 3. Test about to expire case (set to expire in 5 minutes)\n        current_ts = int(time.time())\n        five_minutes_later = current_ts + 300  # 5 minutes = 300 seconds\n        ip_proxy_info.expired_time_ts = five_minutes_later\n        print(f\"\\nSet proxy expiration time to 5 minutes later: {five_minutes_later}\")\n\n        # Should not be expired (30s buffer)\n        is_expired_30s = ip_proxy_info.is_expired(buffer_seconds=30)\n        print(f\"Is proxy expired (30s buffer): {is_expired_30s}\")\n        self.assertFalse(is_expired_30s, msg=\"IP expiring in 5 minutes should not be expired with 30s buffer\")\n\n        # 4. Test already expired case (set to already expired)\n        expired_ts = current_ts - 60  # Expired 1 minute ago\n        ip_proxy_info.expired_time_ts = expired_ts\n        print(f\"\\nSet proxy expiration time to 1 minute ago: {expired_ts}\")\n\n        is_expired = ip_proxy_info.is_expired(buffer_seconds=30)\n        print(f\"Is proxy expired (30s buffer): {is_expired}\")\n        self.assertTrue(is_expired, msg=\"Expired IP should be detected as expired\")\n\n        # 5. Test critical expiration case (expires in 29s, should be considered expired with 30s buffer)\n        almost_expired_ts = current_ts + 29\n        ip_proxy_info.expired_time_ts = almost_expired_ts\n        print(f\"\\nSet proxy expiration time to 29 seconds later: {almost_expired_ts}\")\n\n        is_expired_critical = ip_proxy_info.is_expired(buffer_seconds=30)\n        print(f\"Is proxy expired (30s buffer): {is_expired_critical}\")\n        self.assertTrue(is_expired_critical, msg=\"IP expiring in 29s should be considered expired with 30s buffer\")\n\n        print(\"\\n=== IP proxy expiration detection test completed ===\")\n\n    async def test_proxy_pool_auto_refresh(self):\n        \"\"\"Test proxy pool auto-refresh expired proxy functionality\"\"\"\n        print(\"\\n=== Starting proxy pool auto-refresh test ===\")\n\n        # 1. Create IP pool\n        pool = await create_ip_pool(ip_pool_count=2, enable_validate_ip=True)\n\n        # 2. Get a proxy\n        first_proxy = await pool.get_proxy()\n        print(f\"First proxy obtained: {first_proxy.ip}:{first_proxy.port}\")\n\n        # Verify current proxy is not expired\n        is_expired = pool.is_current_proxy_expired(buffer_seconds=30)\n        print(f\"Is current proxy expired: {is_expired}\")\n\n        if first_proxy.expired_time_ts:\n            print(f\"Current proxy expiration timestamp: {first_proxy.expired_time_ts}\")\n\n            # 3. Manually set current proxy as expired\n            current_ts = int(time.time())\n            pool.current_proxy.expired_time_ts = current_ts - 60\n            print(f\"\\nManually set proxy as expired (1 minute ago)\")\n\n            # 4. Check if expired\n            is_expired_after = pool.is_current_proxy_expired(buffer_seconds=30)\n            print(f\"Is proxy expired after setting: {is_expired_after}\")\n            self.assertTrue(is_expired_after, msg=\"Should be detected as expired after manual setting\")\n\n            # 5. Use get_or_refresh_proxy to auto-refresh\n            print(\"\\nCalling get_or_refresh_proxy to auto-refresh expired proxy...\")\n            refreshed_proxy = await pool.get_or_refresh_proxy(buffer_seconds=30)\n            print(f\"Refreshed proxy: {refreshed_proxy.ip}:{refreshed_proxy.port}\")\n\n            # 6. Verify new proxy is not expired\n            is_new_expired = pool.is_current_proxy_expired(buffer_seconds=30)\n            print(f\"Is new proxy expired: {is_new_expired}\")\n            self.assertFalse(is_new_expired, msg=\"Refreshed new proxy should not be expired\")\n\n            print(\"\\n=== Proxy pool auto-refresh test completed ===\")\n        else:\n            print(\"Current proxy does not have expiration time set, skipping auto-refresh test\")\n\n    async def test_ip_expiration_standalone(self):\n        \"\"\"Standalone test for IP expiration detection (does not depend on real proxy provider)\"\"\"\n        print(\"\\n=== Starting standalone IP proxy expiration detection test ===\")\n\n        current_ts = int(time.time())\n\n        # 1. Test IP without expiration time set (never expires)\n        ip_no_expire = IpInfoModel(\n            ip=\"192.168.1.1\",\n            port=8080,\n            user=\"test_user\",\n            password=\"test_pwd\",\n            expired_time_ts=None\n        )\n        print(f\"\\nTest 1: IP without expiration time set\")\n        is_expired = ip_no_expire.is_expired(buffer_seconds=30)\n        print(f\"  Proxy: {ip_no_expire.ip}:{ip_no_expire.port}\")\n        print(f\"  Expiration time: {ip_no_expire.expired_time_ts}\")\n        print(f\"  Is expired: {is_expired}\")\n        self.assertFalse(is_expired, msg=\"IP without expiration time should never expire\")\n\n        # 2. Test IP expiring in 5 minutes (should not be expired)\n        five_minutes_later = current_ts + 300\n        ip_valid = IpInfoModel(\n            ip=\"192.168.1.2\",\n            port=8080,\n            user=\"test_user\",\n            password=\"test_pwd\",\n            expired_time_ts=five_minutes_later\n        )\n        print(f\"\\nTest 2: IP will expire in 5 minutes\")\n        is_expired = ip_valid.is_expired(buffer_seconds=30)\n        print(f\"  Proxy: {ip_valid.ip}:{ip_valid.port}\")\n        print(f\"  Current timestamp: {current_ts}\")\n        print(f\"  Expiration timestamp: {ip_valid.expired_time_ts}\")\n        print(f\"  Remaining time: {ip_valid.expired_time_ts - current_ts} seconds\")\n        print(f\"  Is expired (30s buffer): {is_expired}\")\n        self.assertFalse(is_expired, msg=\"IP expiring in 5 minutes should not be expired with 30s buffer\")\n\n        # 3. Test already expired IP\n        already_expired = current_ts - 60\n        ip_expired = IpInfoModel(\n            ip=\"192.168.1.3\",\n            port=8080,\n            user=\"test_user\",\n            password=\"test_pwd\",\n            expired_time_ts=already_expired\n        )\n        print(f\"\\nTest 3: IP already expired (1 minute ago)\")\n        is_expired = ip_expired.is_expired(buffer_seconds=30)\n        print(f\"  Proxy: {ip_expired.ip}:{ip_expired.port}\")\n        print(f\"  Current timestamp: {current_ts}\")\n        print(f\"  Expiration timestamp: {ip_expired.expired_time_ts}\")\n        print(f\"  Expired for: {current_ts - ip_expired.expired_time_ts} seconds\")\n        print(f\"  Is expired (30s buffer): {is_expired}\")\n        self.assertTrue(is_expired, msg=\"Expired IP should be detected as expired\")\n\n        # 4. Test critical expiration (expires in 29s, should be considered expired with 30s buffer)\n        almost_expired = current_ts + 29\n        ip_critical = IpInfoModel(\n            ip=\"192.168.1.4\",\n            port=8080,\n            user=\"test_user\",\n            password=\"test_pwd\",\n            expired_time_ts=almost_expired\n        )\n        print(f\"\\nTest 4: IP about to expire (in 29 seconds)\")\n        is_expired = ip_critical.is_expired(buffer_seconds=30)\n        print(f\"  Proxy: {ip_critical.ip}:{ip_critical.port}\")\n        print(f\"  Current timestamp: {current_ts}\")\n        print(f\"  Expiration timestamp: {ip_critical.expired_time_ts}\")\n        print(f\"  Remaining time: {ip_critical.expired_time_ts - current_ts} seconds\")\n        print(f\"  Is expired (30s buffer): {is_expired}\")\n        self.assertTrue(is_expired, msg=\"IP expiring in 29s should be considered expired with 30s buffer\")\n\n        # 5. Test expires in 31s (should not be expired with 30s buffer)\n        just_safe = current_ts + 31\n        ip_just_safe = IpInfoModel(\n            ip=\"192.168.1.5\",\n            port=8080,\n            user=\"test_user\",\n            password=\"test_pwd\",\n            expired_time_ts=just_safe\n        )\n        print(f\"\\nTest 5: IP within safe range (expires in 31 seconds)\")\n        is_expired = ip_just_safe.is_expired(buffer_seconds=30)\n        print(f\"  Proxy: {ip_just_safe.ip}:{ip_just_safe.port}\")\n        print(f\"  Current timestamp: {current_ts}\")\n        print(f\"  Expiration timestamp: {ip_just_safe.expired_time_ts}\")\n        print(f\"  Remaining time: {ip_just_safe.expired_time_ts - current_ts} seconds\")\n        print(f\"  Is expired (30s buffer): {is_expired}\")\n        self.assertFalse(is_expired, msg=\"IP expiring in 31s should not be expired with 30s buffer\")\n\n        # 6. Test ProxyIpPool expiration detection\n        print(f\"\\nTest 6: ProxyIpPool expiration detection functionality\")\n        mock_provider = MagicMock()\n        mock_provider.get_proxy = AsyncMock(return_value=[])\n\n        pool = ProxyIpPool(\n            ip_pool_count=1,\n            enable_validate_ip=False,\n            ip_provider=mock_provider\n        )\n\n        # 6.1 Test when there is no current proxy\n        is_expired = pool.is_current_proxy_expired(buffer_seconds=30)\n        print(f\"  Is expired when no current proxy: {is_expired}\")\n        self.assertTrue(is_expired, msg=\"Should return True when there is no current proxy\")\n\n        # 6.2 Set a valid proxy\n        valid_proxy = IpInfoModel(\n            ip=\"192.168.1.6\",\n            port=8080,\n            user=\"test_user\",\n            password=\"test_pwd\",\n            expired_time_ts=current_ts + 300  # Expires in 5 minutes\n        )\n        pool.current_proxy = valid_proxy\n        is_expired = pool.is_current_proxy_expired(buffer_seconds=30)\n        print(f\"  Is expired after setting valid proxy: {is_expired}\")\n        self.assertFalse(is_expired, msg=\"Valid proxy should return False\")\n\n        # 6.3 Set an expired proxy\n        expired_proxy = IpInfoModel(\n            ip=\"192.168.1.7\",\n            port=8080,\n            user=\"test_user\",\n            password=\"test_pwd\",\n            expired_time_ts=current_ts - 60  # Expired 1 minute ago\n        )\n        pool.current_proxy = expired_proxy\n        is_expired = pool.is_current_proxy_expired(buffer_seconds=30)\n        print(f\"  Is expired after setting expired proxy: {is_expired}\")\n        self.assertTrue(is_expired, msg=\"Expired proxy should return True\")\n\n        print(\"\\n=== Standalone IP proxy expiration detection test completed ===\\n\")\n"
  },
  {
    "path": "test/test_redis_cache.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/test/test_redis_cache.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Name: Programmer Ajiang-Relakkes\n# @Time    : 2024/6/2 19:54\n# @Desc    :\n\nimport time\nimport unittest\n\nfrom cache.redis_cache import RedisCache\n\n\nclass TestRedisCache(unittest.TestCase):\n\n    def setUp(self):\n        self.redis_cache = RedisCache()\n\n    def test_set_and_get(self):\n        self.redis_cache.set('key', 'value', 10)\n        self.assertEqual(self.redis_cache.get('key'), 'value')\n\n    def test_expired_key(self):\n        self.redis_cache.set('key', 'value', 1)\n        time.sleep(2)  # wait for the key to expire\n        self.assertIsNone(self.redis_cache.get('key'))\n\n    def test_keys(self):\n        self.redis_cache.set('key1', 'value1', 10)\n        self.redis_cache.set('key2', 'value2', 10)\n        keys = self.redis_cache.keys('*')\n        self.assertIn('key1', keys)\n        self.assertIn('key2', keys)\n\n    def tearDown(self):\n        # self.redis_cache._redis_client.flushdb()  # Clear redis database\n        pass\n\n\nif __name__ == '__main__':\n    unittest.main()\n"
  },
  {
    "path": "test/test_utils.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/test/test_utils.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n\nfrom tools import utils\n\n\ndef test_convert_cookies():\n    xhs_cookies = \"a1=x000101360; webId=1190c4d3cxxxx125xxx; \"\n    cookie_dict = utils.convert_str_cookie_to_dict(xhs_cookies)\n    assert cookie_dict.get(\"webId\") == \"1190c4d3cxxxx125xxx\"\n    assert cookie_dict.get(\"a1\") == \"x000101360\"\n"
  },
  {
    "path": "tests/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# MediaCrawler Test Suite\n"
  },
  {
    "path": "tests/conftest.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/tests/conftest.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\"\"\"\nPytest configuration and shared fixtures\n\"\"\"\n\nimport pytest\nimport sys\nfrom pathlib import Path\n\n# Add project root to Python path\nproject_root = Path(__file__).parent.parent\nsys.path.insert(0, str(project_root))\n\n\n@pytest.fixture(scope=\"session\")\ndef project_root_path():\n    \"\"\"Return project root path\"\"\"\n    return project_root\n\n\n@pytest.fixture\ndef sample_xhs_note():\n    \"\"\"Sample Xiaohongshu note data for testing\"\"\"\n    return {\n        \"note_id\": \"test_note_123\",\n        \"type\": \"normal\",\n        \"title\": \"Test Title\",\n        \"desc\": \"This is a test description\",\n        \"video_url\": \"\",\n        \"time\": 1700000000,\n        \"last_update_time\": 1700000000,\n        \"user_id\": \"user_123\",\n        \"nickname\": \"Test User\",\n        \"avatar\": \"https://example.com/avatar.jpg\",\n        \"liked_count\": 100,\n        \"collected_count\": 50,\n        \"comment_count\": 25,\n        \"share_count\": 10,\n        \"ip_location\": \"Shanghai\",\n        \"image_list\": \"https://example.com/img1.jpg,https://example.com/img2.jpg\",\n        \"tag_list\": \"test,programming,Python\",\n        \"note_url\": \"https://www.xiaohongshu.com/explore/test_note_123\",\n        \"source_keyword\": \"test keyword\",\n        \"xsec_token\": \"test_token_123\"\n    }\n\n\n@pytest.fixture\ndef sample_xhs_comment():\n    \"\"\"Sample Xiaohongshu comment data for testing\"\"\"\n    return {\n        \"comment_id\": \"comment_123\",\n        \"create_time\": 1700000000,\n        \"ip_location\": \"Beijing\",\n        \"note_id\": \"test_note_123\",\n        \"content\": \"This is a test comment\",\n        \"user_id\": \"user_456\",\n        \"nickname\": \"Comment User\",\n        \"avatar\": \"https://example.com/avatar2.jpg\",\n        \"sub_comment_count\": 5,\n        \"pictures\": \"\",\n        \"parent_comment_id\": 0,\n        \"like_count\": 15\n    }\n\n\n@pytest.fixture\ndef sample_xhs_creator():\n    \"\"\"Sample Xiaohongshu creator data for testing\"\"\"\n    return {\n        \"user_id\": \"creator_123\",\n        \"nickname\": \"Creator Name\",\n        \"gender\": \"Female\",\n        \"avatar\": \"https://example.com/creator_avatar.jpg\",\n        \"desc\": \"This is the creator bio\",\n        \"ip_location\": \"Guangzhou\",\n        \"follows\": 500,\n        \"fans\": 10000,\n        \"interaction\": 50000,\n        \"tag_list\": '{\"profession\": \"Designer\", \"interest\": \"Photography\"}'\n    }\n"
  },
  {
    "path": "tests/test_excel_store.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/tests/test_excel_store.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\"\"\"\nUnit tests for Excel export functionality\n\"\"\"\n\nimport pytest\nimport asyncio\nimport os\nfrom pathlib import Path\nimport tempfile\nimport shutil\n\ntry:\n    import openpyxl\n    EXCEL_AVAILABLE = True\nexcept ImportError:\n    EXCEL_AVAILABLE = False\n\nfrom store.excel_store_base import ExcelStoreBase\n\n\n@pytest.mark.skipif(not EXCEL_AVAILABLE, reason=\"openpyxl not installed\")\nclass TestExcelStoreBase:\n    \"\"\"Test cases for ExcelStoreBase\"\"\"\n\n    @pytest.fixture(autouse=True)\n    def clear_singleton_state(self):\n        \"\"\"Clear singleton state before and after each test\"\"\"\n        ExcelStoreBase._instances.clear()\n        yield\n        ExcelStoreBase._instances.clear()\n\n    @pytest.fixture\n    def temp_dir(self):\n        \"\"\"Create temporary directory for test files\"\"\"\n        temp_path = tempfile.mkdtemp()\n        yield temp_path\n        # Cleanup\n        shutil.rmtree(temp_path, ignore_errors=True)\n\n    @pytest.fixture\n    def excel_store(self, temp_dir, monkeypatch):\n        \"\"\"Create ExcelStoreBase instance for testing\"\"\"\n        # Monkey patch data directory\n        monkeypatch.chdir(temp_dir)\n        store = ExcelStoreBase(platform=\"test\", crawler_type=\"search\")\n        yield store\n        # Cleanup is handled by temp_dir fixture\n\n    def test_initialization(self, excel_store):\n        \"\"\"Test Excel store initialization\"\"\"\n        assert excel_store.platform == \"test\"\n        assert excel_store.crawler_type == \"search\"\n        assert excel_store.workbook is not None\n        assert excel_store.contents_sheet is not None\n        assert excel_store.comments_sheet is not None\n        assert excel_store.creators_sheet is not None\n\n    @pytest.mark.asyncio\n    async def test_store_content(self, excel_store):\n        \"\"\"Test storing content data\"\"\"\n        content_item = {\n            \"note_id\": \"test123\",\n            \"title\": \"Test Title\",\n            \"desc\": \"Test Description\",\n            \"user_id\": \"user456\",\n            \"nickname\": \"TestUser\",\n            \"liked_count\": 100,\n            \"comment_count\": 50\n        }\n\n        await excel_store.store_content(content_item)\n\n        # Verify data was written\n        assert excel_store.contents_sheet.max_row == 2  # Header + 1 data row\n        assert excel_store.contents_headers_written is True\n\n    @pytest.mark.asyncio\n    async def test_store_comment(self, excel_store):\n        \"\"\"Test storing comment data\"\"\"\n        comment_item = {\n            \"comment_id\": \"comment123\",\n            \"note_id\": \"note456\",\n            \"content\": \"Great post!\",\n            \"user_id\": \"user789\",\n            \"nickname\": \"Commenter\",\n            \"like_count\": 10\n        }\n\n        await excel_store.store_comment(comment_item)\n\n        # Verify data was written\n        assert excel_store.comments_sheet.max_row == 2  # Header + 1 data row\n        assert excel_store.comments_headers_written is True\n\n    @pytest.mark.asyncio\n    async def test_store_creator(self, excel_store):\n        \"\"\"Test storing creator data\"\"\"\n        creator_item = {\n            \"user_id\": \"creator123\",\n            \"nickname\": \"Creator Name\",\n            \"fans\": 10000,\n            \"follows\": 500,\n            \"interaction\": 50000\n        }\n\n        await excel_store.store_creator(creator_item)\n\n        # Verify data was written\n        assert excel_store.creators_sheet.max_row == 2  # Header + 1 data row\n        assert excel_store.creators_headers_written is True\n\n    @pytest.mark.asyncio\n    async def test_multiple_items(self, excel_store):\n        \"\"\"Test storing multiple items\"\"\"\n        # Store multiple content items\n        for i in range(5):\n            await excel_store.store_content({\n                \"note_id\": f\"note{i}\",\n                \"title\": f\"Title {i}\",\n                \"liked_count\": i * 10\n            })\n\n        # Verify all items were stored\n        assert excel_store.contents_sheet.max_row == 6  # Header + 5 data rows\n\n    def test_flush(self, excel_store):\n        \"\"\"Test flushing data to file\"\"\"\n        # Add some test data\n        asyncio.run(excel_store.store_content({\n            \"note_id\": \"test\",\n            \"title\": \"Test\"\n        }))\n\n        # Flush to file\n        excel_store.flush()\n\n        # Verify file was created\n        assert excel_store.filename.exists()\n\n        # Verify file can be opened\n        wb = openpyxl.load_workbook(excel_store.filename)\n        assert \"Contents\" in wb.sheetnames\n        wb.close()\n\n    def test_header_formatting(self, excel_store):\n        \"\"\"Test header row formatting\"\"\"\n        asyncio.run(excel_store.store_content({\"note_id\": \"test\", \"title\": \"Test\"}))\n\n        # Check header formatting\n        header_cell = excel_store.contents_sheet.cell(row=1, column=1)\n        assert header_cell.font.bold is True\n        # RGB color may have different prefix (00 or FF), check the actual color part\n        assert header_cell.fill.start_color.rgb[-6:] == \"366092\"\n\n    def test_empty_sheets_removed(self, excel_store):\n        \"\"\"Test that empty sheets are removed on flush\"\"\"\n        # Only add content, leave comments and creators empty\n        asyncio.run(excel_store.store_content({\"note_id\": \"test\"}))\n\n        excel_store.flush()\n\n        # Reload workbook\n        wb = openpyxl.load_workbook(excel_store.filename)\n\n        # Only Contents sheet should exist\n        assert \"Contents\" in wb.sheetnames\n        assert \"Comments\" not in wb.sheetnames\n        assert \"Creators\" not in wb.sheetnames\n        wb.close()\n\n\n@pytest.mark.skipif(not EXCEL_AVAILABLE, reason=\"openpyxl not installed\")\ndef test_excel_import_availability():\n    \"\"\"Test that openpyxl is available\"\"\"\n    assert EXCEL_AVAILABLE is True\n    import openpyxl\n    assert openpyxl is not None\n\n\n@pytest.mark.skipif(not EXCEL_AVAILABLE, reason=\"openpyxl not installed\")\nclass TestSingletonPattern:\n    \"\"\"Test singleton pattern for Excel store\"\"\"\n\n    @pytest.fixture(autouse=True)\n    def setup_and_teardown(self, tmp_path, monkeypatch):\n        \"\"\"Setup and teardown for each test\"\"\"\n        # Change to temp directory\n        monkeypatch.chdir(tmp_path)\n        # Clear singleton instances before each test\n        ExcelStoreBase._instances.clear()\n        yield\n        # Cleanup after test\n        ExcelStoreBase._instances.clear()\n\n    def test_get_instance_returns_same_instance(self):\n        \"\"\"Test that get_instance returns the same instance for same parameters\"\"\"\n        instance1 = ExcelStoreBase.get_instance(\"xhs\", \"search\")\n        instance2 = ExcelStoreBase.get_instance(\"xhs\", \"search\")\n\n        assert instance1 is instance2\n\n    def test_get_instance_different_params_returns_different_instances(self):\n        \"\"\"Test that different parameters return different instances\"\"\"\n        instance1 = ExcelStoreBase.get_instance(\"xhs\", \"search\")\n        instance2 = ExcelStoreBase.get_instance(\"xhs\", \"detail\")\n        instance3 = ExcelStoreBase.get_instance(\"douyin\", \"search\")\n\n        assert instance1 is not instance2\n        assert instance1 is not instance3\n        assert instance2 is not instance3\n\n    @pytest.mark.asyncio\n    async def test_singleton_preserves_data(self):\n        \"\"\"Test that singleton pattern preserves data across multiple calls\"\"\"\n        # First call - store some content\n        store1 = ExcelStoreBase.get_instance(\"test\", \"search\")\n        await store1.store_content({\"note_id\": \"note1\", \"title\": \"Title 1\"})\n\n        # Second call - should get same instance with data\n        store2 = ExcelStoreBase.get_instance(\"test\", \"search\")\n        await store2.store_content({\"note_id\": \"note2\", \"title\": \"Title 2\"})\n\n        # Verify both items are in the same workbook\n        assert store1 is store2\n        assert store1.contents_sheet.max_row == 3  # Header + 2 data rows\n\n    def test_flush_all_saves_all_instances(self, tmp_path):\n        \"\"\"Test that flush_all saves all instances\"\"\"\n        # Create multiple instances\n        store1 = ExcelStoreBase.get_instance(\"platform1\", \"search\")\n        store2 = ExcelStoreBase.get_instance(\"platform2\", \"search\")\n\n        # Add data to each\n        asyncio.run(store1.store_content({\"note_id\": \"note1\"}))\n        asyncio.run(store2.store_content({\"note_id\": \"note2\"}))\n\n        # Flush all\n        ExcelStoreBase.flush_all()\n\n        # Verify instances are cleared\n        assert len(ExcelStoreBase._instances) == 0\n\n        # Verify files were created\n        assert store1.filename.exists()\n        assert store2.filename.exists()\n\n    def test_flush_all_clears_instances(self):\n        \"\"\"Test that flush_all clears the instances dictionary\"\"\"\n        # Create an instance\n        ExcelStoreBase.get_instance(\"test\", \"search\")\n        assert len(ExcelStoreBase._instances) == 1\n\n        # Flush all\n        ExcelStoreBase.flush_all()\n\n        # Verify instances are cleared\n        assert len(ExcelStoreBase._instances) == 0\n"
  },
  {
    "path": "tests/test_store_factory.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/tests/test_store_factory.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\"\"\"\nUnit tests for Store Factory functionality\n\"\"\"\n\nimport pytest\nfrom unittest.mock import patch, MagicMock\n\nfrom store.xhs import XhsStoreFactory\nfrom store.xhs._store_impl import (\n    XhsCsvStoreImplement,\n    XhsJsonStoreImplement,\n    XhsJsonlStoreImplement,\n    XhsDbStoreImplement,\n    XhsSqliteStoreImplement,\n    XhsMongoStoreImplement,\n    XhsExcelStoreImplement\n)\n\n\nclass TestXhsStoreFactory:\n    \"\"\"Test cases for XhsStoreFactory\"\"\"\n\n    @patch('config.SAVE_DATA_OPTION', 'csv')\n    def test_create_csv_store(self):\n        \"\"\"Test creating CSV store\"\"\"\n        store = XhsStoreFactory.create_store()\n        assert isinstance(store, XhsCsvStoreImplement)\n\n    @patch('config.SAVE_DATA_OPTION', 'json')\n    def test_create_json_store(self):\n        \"\"\"Test creating JSON store\"\"\"\n        store = XhsStoreFactory.create_store()\n        assert isinstance(store, XhsJsonStoreImplement)\n\n    @patch('config.SAVE_DATA_OPTION', 'db')\n    def test_create_db_store(self):\n        \"\"\"Test creating database store\"\"\"\n        store = XhsStoreFactory.create_store()\n        assert isinstance(store, XhsDbStoreImplement)\n\n    @patch('config.SAVE_DATA_OPTION', 'sqlite')\n    def test_create_sqlite_store(self):\n        \"\"\"Test creating SQLite store\"\"\"\n        store = XhsStoreFactory.create_store()\n        assert isinstance(store, XhsSqliteStoreImplement)\n\n    @patch('config.SAVE_DATA_OPTION', 'mongodb')\n    def test_create_mongodb_store(self):\n        \"\"\"Test creating MongoDB store\"\"\"\n        store = XhsStoreFactory.create_store()\n        assert isinstance(store, XhsMongoStoreImplement)\n\n    @patch('config.SAVE_DATA_OPTION', 'excel')\n    def test_create_excel_store(self):\n        \"\"\"Test creating Excel store\"\"\"\n        # ContextVar cannot be mocked, so we test with actual value\n        store = XhsStoreFactory.create_store()\n        assert isinstance(store, XhsExcelStoreImplement)\n\n    @patch('config.SAVE_DATA_OPTION', 'jsonl')\n    def test_create_jsonl_store(self):\n        \"\"\"Test creating JSONL store\"\"\"\n        store = XhsStoreFactory.create_store()\n        assert isinstance(store, XhsJsonlStoreImplement)\n\n    @patch('config.SAVE_DATA_OPTION', 'invalid')\n    def test_invalid_store_option(self):\n        \"\"\"Test that invalid store option raises ValueError\"\"\"\n        with pytest.raises(ValueError) as exc_info:\n            XhsStoreFactory.create_store()\n\n        assert \"Invalid save option\" in str(exc_info.value)\n\n    def test_all_stores_registered(self):\n        \"\"\"Test that all store types are registered\"\"\"\n        expected_stores = ['csv', 'json', 'jsonl', 'db', 'postgres', 'sqlite', 'mongodb', 'excel']\n\n        for store_type in expected_stores:\n            assert store_type in XhsStoreFactory.STORES\n\n        assert len(XhsStoreFactory.STORES) == len(expected_stores)\n"
  },
  {
    "path": "tools/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/tools/__init__.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n"
  },
  {
    "path": "tools/app_runner.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nfrom __future__ import annotations\n\nimport asyncio\nimport os\nimport signal\nfrom collections.abc import Awaitable, Callable\nfrom typing import Optional\n\nAsyncFn = Callable[[], Awaitable[None]]\n\n\ndef run(\n    app_main: AsyncFn,\n    app_cleanup: AsyncFn,\n    *,\n    cleanup_timeout_seconds: float = 15.0,\n    on_first_interrupt: Optional[Callable[[], None]] = None,\n    force_exit_code: int = 130,\n) -> None:\n    async def _cleanup_with_timeout() -> None:\n        try:\n            await asyncio.wait_for(asyncio.shield(app_cleanup()), timeout=cleanup_timeout_seconds)\n        except asyncio.TimeoutError:\n            print(f\"[Main] Cleanup timeout ({cleanup_timeout_seconds}s), skipping remaining cleanup.\")\n\n    async def _cancel_remaining_tasks(timeout_seconds: float = 2.0) -> None:\n        current = asyncio.current_task()\n        tasks = [t for t in asyncio.all_tasks() if t is not current and not t.done()]\n        if not tasks:\n            return\n        for t in tasks:\n            t.cancel()\n        try:\n            await asyncio.wait_for(\n                asyncio.gather(*tasks, return_exceptions=True),\n                timeout=timeout_seconds,\n            )\n        except asyncio.TimeoutError:\n            pass\n\n    async def _runner() -> None:\n        loop = asyncio.get_running_loop()\n        runner_task = asyncio.current_task()\n        if runner_task is None:\n            raise RuntimeError(\"Runner task not found\")\n\n        shutdown_requested = False\n\n        def _on_signal(signum: int) -> None:\n            nonlocal shutdown_requested\n\n            if shutdown_requested:\n                print(\"[Main] Received interrupt signal again, force exit.\")\n                os._exit(force_exit_code)\n\n            shutdown_requested = True\n            print(f\"\\n[Main] Received interrupt signal {signum}, exiting (cleanup max {cleanup_timeout_seconds}s)...\")\n\n            if on_first_interrupt is not None:\n                try:\n                    on_first_interrupt()\n                except Exception:\n                    pass\n\n            runner_task.cancel()\n\n        try:\n            loop.add_signal_handler(signal.SIGINT, _on_signal, signal.SIGINT)\n            loop.add_signal_handler(signal.SIGTERM, _on_signal, signal.SIGTERM)\n        except NotImplementedError:\n            signal.signal(signal.SIGINT, lambda signum, _frame: _on_signal(signum))\n            signal.signal(signal.SIGTERM, lambda signum, _frame: _on_signal(signum))\n\n        cancelled = False\n        try:\n            await app_main()\n        except asyncio.CancelledError:\n            cancelled = True\n        finally:\n            try:\n                await _cleanup_with_timeout()\n            except Exception as e:\n                print(f\"[Main] Error during cleanup: {e}\")\n            await _cancel_remaining_tasks()\n\n        if cancelled:\n            return\n\n    asyncio.run(_runner())\n"
  },
  {
    "path": "tools/async_file_writer.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/tools/async_file_writer.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\nimport asyncio\nimport csv\nimport json\nimport os\nimport pathlib\nfrom typing import Dict, List\nimport aiofiles\nimport config\nfrom tools.utils import utils\nfrom tools.words import AsyncWordCloudGenerator\n\nclass AsyncFileWriter:\n    def __init__(self, platform: str, crawler_type: str):\n        self.lock = asyncio.Lock()\n        self.platform = platform\n        self.crawler_type = crawler_type\n        self.wordcloud_generator = AsyncWordCloudGenerator() if config.ENABLE_GET_WORDCLOUD else None\n\n    def _get_file_path(self, file_type: str, item_type: str) -> str:\n        if config.SAVE_DATA_PATH:\n            base_path = f\"{config.SAVE_DATA_PATH}/{self.platform}/{file_type}\"\n        else:\n            base_path = f\"data/{self.platform}/{file_type}\"\n        pathlib.Path(base_path).mkdir(parents=True, exist_ok=True)\n        file_name = f\"{self.crawler_type}_{item_type}_{utils.get_current_date()}.{file_type}\"\n        return f\"{base_path}/{file_name}\"\n\n    async def write_to_csv(self, item: Dict, item_type: str):\n        file_path = self._get_file_path('csv', item_type)\n        async with self.lock:\n            file_exists = os.path.exists(file_path)\n            async with aiofiles.open(file_path, 'a', newline='', encoding='utf-8-sig') as f:\n                writer = csv.DictWriter(f, fieldnames=item.keys())\n                if not file_exists or await f.tell() == 0:\n                    await writer.writeheader()\n                await writer.writerow(item)\n\n    async def write_to_jsonl(self, item: Dict, item_type: str):\n        file_path = self._get_file_path('jsonl', item_type)\n        async with self.lock:\n            async with aiofiles.open(file_path, 'a', encoding='utf-8') as f:\n                await f.write(json.dumps(item, ensure_ascii=False) + '\\n')\n\n    async def write_single_item_to_json(self, item: Dict, item_type: str):\n        file_path = self._get_file_path('json', item_type)\n        async with self.lock:\n            existing_data = []\n            if os.path.exists(file_path) and os.path.getsize(file_path) > 0:\n                async with aiofiles.open(file_path, 'r', encoding='utf-8') as f:\n                    try:\n                        content = await f.read()\n                        if content:\n                            existing_data = json.loads(content)\n                        if not isinstance(existing_data, list):\n                            existing_data = [existing_data]\n                    except json.JSONDecodeError:\n                        existing_data = []\n\n            existing_data.append(item)\n\n            async with aiofiles.open(file_path, 'w', encoding='utf-8') as f:\n                await f.write(json.dumps(existing_data, ensure_ascii=False, indent=4))\n\n    async def generate_wordcloud_from_comments(self):\n        \"\"\"\n        Generate wordcloud from comments data\n        Only works when ENABLE_GET_WORDCLOUD and ENABLE_GET_COMMENTS are True\n        \"\"\"\n        if not config.ENABLE_GET_WORDCLOUD or not config.ENABLE_GET_COMMENTS:\n            return\n\n        if not self.wordcloud_generator:\n            return\n\n        try:\n            # Read comments from JSON or JSONL file\n            comments_data = []\n            jsonl_file_path = self._get_file_path('jsonl', 'comments')\n            json_file_path = self._get_file_path('json', 'comments')\n\n            if os.path.exists(jsonl_file_path) and os.path.getsize(jsonl_file_path) > 0:\n                async with aiofiles.open(jsonl_file_path, 'r', encoding='utf-8') as f:\n                    async for line in f:\n                        line = line.strip()\n                        if line:\n                            try:\n                                comments_data.append(json.loads(line))\n                            except json.JSONDecodeError:\n                                continue\n            elif os.path.exists(json_file_path) and os.path.getsize(json_file_path) > 0:\n                async with aiofiles.open(json_file_path, 'r', encoding='utf-8') as f:\n                    content = await f.read()\n                    if content:\n                        comments_data = json.loads(content)\n                        if not isinstance(comments_data, list):\n                            comments_data = [comments_data]\n\n            if not comments_data:\n                utils.logger.info(f\"[AsyncFileWriter.generate_wordcloud_from_comments] No comments data found\")\n                return\n\n            # Filter comments data to only include 'content' field\n            # Handle different comment data structures across platforms\n            filtered_data = []\n            for comment in comments_data:\n                if isinstance(comment, dict):\n                    # Try different possible content field names\n                    content_text = comment.get('content') or comment.get('comment_text') or comment.get('text') or ''\n                    if content_text:\n                        filtered_data.append({'content': content_text})\n\n            if not filtered_data:\n                utils.logger.info(f\"[AsyncFileWriter.generate_wordcloud_from_comments] No valid comment content found\")\n                return\n\n            # Generate wordcloud\n            if config.SAVE_DATA_PATH:\n                words_base_path = f\"{config.SAVE_DATA_PATH}/{self.platform}/words\"\n            else:\n                words_base_path = f\"data/{self.platform}/words\"\n            pathlib.Path(words_base_path).mkdir(parents=True, exist_ok=True)\n            words_file_prefix = f\"{words_base_path}/{self.crawler_type}_comments_{utils.get_current_date()}\"\n\n            utils.logger.info(f\"[AsyncFileWriter.generate_wordcloud_from_comments] Generating wordcloud from {len(filtered_data)} comments\")\n            await self.wordcloud_generator.generate_word_frequency_and_cloud(filtered_data, words_file_prefix)\n            utils.logger.info(f\"[AsyncFileWriter.generate_wordcloud_from_comments] Wordcloud generated successfully at {words_file_prefix}\")\n\n        except Exception as e:\n            utils.logger.error(f\"[AsyncFileWriter.generate_wordcloud_from_comments] Error generating wordcloud: {e}\")\n"
  },
  {
    "path": "tools/browser_launcher.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/tools/browser_launcher.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nimport os\nimport platform\nimport subprocess\nimport time\nimport socket\nimport signal\nfrom typing import Optional, List, Tuple\nimport asyncio\nfrom pathlib import Path\n\nfrom tools import utils\n\n\nclass BrowserLauncher:\n    \"\"\"\n    Browser launcher for detecting and launching user's Chrome/Edge browser\n    Supports Windows and macOS systems\n    \"\"\"\n\n    def __init__(self):\n        self.system = platform.system()\n        self.browser_process = None\n        self.debug_port = None\n\n    def detect_browser_paths(self) -> List[str]:\n        \"\"\"\n        Detect available browser paths in system\n        Returns list of browser paths sorted by priority\n        \"\"\"\n        paths = []\n\n        if self.system == \"Windows\":\n            # Common Chrome/Edge installation paths on Windows\n            possible_paths = [\n                # Chrome paths\n                os.path.expandvars(r\"%PROGRAMFILES%\\Google\\Chrome\\Application\\chrome.exe\"),\n                os.path.expandvars(r\"%PROGRAMFILES(X86)%\\Google\\Chrome\\Application\\chrome.exe\"),\n                os.path.expandvars(r\"%LOCALAPPDATA%\\Google\\Chrome\\Application\\chrome.exe\"),\n                # Edge paths\n                os.path.expandvars(r\"%PROGRAMFILES%\\Microsoft\\Edge\\Application\\msedge.exe\"),\n                os.path.expandvars(r\"%PROGRAMFILES(X86)%\\Microsoft\\Edge\\Application\\msedge.exe\"),\n                # Chrome Beta/Dev/Canary\n                os.path.expandvars(r\"%LOCALAPPDATA%\\Google\\Chrome Beta\\Application\\chrome.exe\"),\n                os.path.expandvars(r\"%LOCALAPPDATA%\\Google\\Chrome Dev\\Application\\chrome.exe\"),\n                os.path.expandvars(r\"%LOCALAPPDATA%\\Google\\Chrome SxS\\Application\\chrome.exe\"),\n            ]\n        elif self.system == \"Darwin\":  # macOS\n            # Common Chrome/Edge installation paths on macOS\n            possible_paths = [\n                # Chrome paths\n                \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\",\n                \"/Applications/Google Chrome Beta.app/Contents/MacOS/Google Chrome Beta\",\n                \"/Applications/Google Chrome Dev.app/Contents/MacOS/Google Chrome Dev\",\n                \"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary\",\n                # Edge paths\n                \"/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge\",\n                \"/Applications/Microsoft Edge Beta.app/Contents/MacOS/Microsoft Edge Beta\",\n                \"/Applications/Microsoft Edge Dev.app/Contents/MacOS/Microsoft Edge Dev\",\n                \"/Applications/Microsoft Edge Canary.app/Contents/MacOS/Microsoft Edge Canary\",\n            ]\n        else:\n            # Linux and other systems\n            possible_paths = [\n                \"/usr/bin/google-chrome\",\n                \"/usr/bin/google-chrome-stable\",\n                \"/usr/bin/google-chrome-beta\",\n                \"/usr/bin/google-chrome-unstable\",\n                \"/usr/bin/chromium-browser\",\n                \"/usr/bin/chromium\",\n                \"/snap/bin/chromium\",\n                \"/usr/bin/microsoft-edge\",\n                \"/usr/bin/microsoft-edge-stable\",\n                \"/usr/bin/microsoft-edge-beta\",\n                \"/usr/bin/microsoft-edge-dev\",\n            ]\n\n        # Check if path exists and is executable\n        for path in possible_paths:\n            if os.path.isfile(path) and os.access(path, os.X_OK):\n                paths.append(path)\n\n        return paths\n\n    def find_available_port(self, start_port: int = 9222) -> int:\n        \"\"\"\n        Find available port\n        \"\"\"\n        port = start_port\n        while port < start_port + 100:  # Try up to 100 ports\n            try:\n                with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:\n                    s.bind(('localhost', port))\n                    return port\n            except OSError:\n                port += 1\n\n        raise RuntimeError(f\"Cannot find available port, tried {start_port} to {port-1}\")\n\n    def launch_browser(self, browser_path: str, debug_port: int, headless: bool = False,\n                      user_data_dir: Optional[str] = None) -> subprocess.Popen:\n        \"\"\"\n        Launch browser process\n        \"\"\"\n        # Basic launch arguments\n        args = [\n            browser_path,\n            f\"--remote-debugging-port={debug_port}\",\n            \"--remote-debugging-address=0.0.0.0\",  # Allow remote access\n            \"--no-first-run\",\n            \"--no-default-browser-check\",\n            \"--disable-background-timer-throttling\",\n            \"--disable-backgrounding-occluded-windows\",\n            \"--disable-renderer-backgrounding\",\n            \"--disable-features=TranslateUI\",\n            \"--disable-ipc-flooding-protection\",\n            \"--disable-hang-monitor\",\n            \"--disable-prompt-on-repost\",\n            \"--disable-sync\",\n            \"--disable-dev-shm-usage\",  # Avoid shared memory issues\n            \"--no-sandbox\",  # Disable sandbox in CDP mode\n            # Key anti-detection arguments\n            \"--disable-blink-features=AutomationControlled\",  # Disable automation control flag\n            \"--exclude-switches=enable-automation\",  # Exclude automation switch\n            \"--disable-infobars\",  # Disable info bars\n        ]\n\n        # Headless mode\n        if headless:\n            args.extend([\n                \"--headless=new\",  # Use new headless mode\n                \"--disable-gpu\",\n            ])\n        else:\n            # Extra arguments for non-headless mode\n            args.extend([\n                \"--start-maximized\",  # Maximize window, more like real user\n            ])\n\n        # User data directory\n        if user_data_dir:\n            args.append(f\"--user-data-dir={user_data_dir}\")\n\n        utils.logger.info(f\"[BrowserLauncher] Launching browser: {browser_path}\")\n        utils.logger.info(f\"[BrowserLauncher] Debug port: {debug_port}\")\n        utils.logger.info(f\"[BrowserLauncher] Headless mode: {headless}\")\n\n        try:\n            # On Windows, use CREATE_NEW_PROCESS_GROUP to prevent Ctrl+C from affecting subprocess\n            if self.system == \"Windows\":\n                process = subprocess.Popen(\n                    args,\n                    stdout=subprocess.DEVNULL,\n                    stderr=subprocess.DEVNULL,\n                    creationflags=subprocess.CREATE_NEW_PROCESS_GROUP\n                )\n            else:\n                process = subprocess.Popen(\n                    args,\n                    stdout=subprocess.DEVNULL,\n                    stderr=subprocess.DEVNULL,\n                    preexec_fn=os.setsid  # Create new process group\n                )\n\n            self.browser_process = process\n            return process\n\n        except Exception as e:\n            utils.logger.error(f\"[BrowserLauncher] Failed to launch browser: {e}\")\n            raise\n\n    def wait_for_browser_ready(self, debug_port: int, timeout: int = 30) -> bool:\n        \"\"\"\n        Wait for browser to be ready\n        \"\"\"\n        utils.logger.info(f\"[BrowserLauncher] Waiting for browser to be ready on port {debug_port}...\")\n\n        start_time = time.time()\n        while time.time() - start_time < timeout:\n            try:\n                with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:\n                    s.settimeout(1)\n                    result = s.connect_ex(('localhost', debug_port))\n                    if result == 0:\n                        utils.logger.info(f\"[BrowserLauncher] Browser is ready on port {debug_port}\")\n                        return True\n            except Exception:\n                pass\n\n            time.sleep(0.5)\n\n        utils.logger.error(f\"[BrowserLauncher] Browser failed to be ready within {timeout} seconds\")\n        return False\n\n    def get_browser_info(self, browser_path: str) -> Tuple[str, str]:\n        \"\"\"\n        Get browser info (name and version)\n        \"\"\"\n        try:\n            if \"chrome\" in browser_path.lower():\n                name = \"Google Chrome\"\n            elif \"edge\" in browser_path.lower() or \"msedge\" in browser_path.lower():\n                name = \"Microsoft Edge\"\n            elif \"chromium\" in browser_path.lower():\n                name = \"Chromium\"\n            else:\n                name = \"Unknown Browser\"\n\n            # Try to get version info\n            try:\n                result = subprocess.run([browser_path, \"--version\"],\n                                      capture_output=True, text=True, encoding='utf-8', errors='ignore', timeout=5)\n                version = result.stdout.strip() if result.stdout else \"Unknown Version\"\n            except:\n                version = \"Unknown Version\"\n\n            return name, version\n\n        except Exception:\n            return \"Unknown Browser\", \"Unknown Version\"\n\n    def cleanup(self):\n        \"\"\"\n        Cleanup resources, close browser process\n        \"\"\"\n        if not self.browser_process:\n            return\n\n        process = self.browser_process\n\n        if process.poll() is not None:\n            utils.logger.info(\"[BrowserLauncher] Browser process already exited, no cleanup needed\")\n            self.browser_process = None\n            return\n\n        utils.logger.info(\"[BrowserLauncher] Closing browser process...\")\n\n        try:\n            if self.system == \"Windows\":\n                # First try normal termination\n                process.terminate()\n                try:\n                    process.wait(timeout=5)\n                except subprocess.TimeoutExpired:\n                    utils.logger.warning(\"[BrowserLauncher] Normal termination timeout, using taskkill to force kill\")\n                    subprocess.run(\n                        [\"taskkill\", \"/F\", \"/T\", \"/PID\", str(process.pid)],\n                        capture_output=True,\n                        check=False,\n                        encoding='utf-8',\n                        errors='ignore'\n                    )\n                    process.wait(timeout=5)\n            else:\n                pgid = os.getpgid(process.pid)\n                try:\n                    os.killpg(pgid, signal.SIGTERM)\n                except ProcessLookupError:\n                    utils.logger.info(\"[BrowserLauncher] Browser process group does not exist, may have exited\")\n                else:\n                    try:\n                        process.wait(timeout=5)\n                    except subprocess.TimeoutExpired:\n                        utils.logger.warning(\"[BrowserLauncher] Graceful shutdown timeout, sending SIGKILL\")\n                        os.killpg(pgid, signal.SIGKILL)\n                        process.wait(timeout=5)\n\n            utils.logger.info(\"[BrowserLauncher] Browser process closed\")\n        except Exception as e:\n            utils.logger.warning(f\"[BrowserLauncher] Error closing browser process: {e}\")\n        finally:\n            self.browser_process = None\n"
  },
  {
    "path": "tools/cdp_browser.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/tools/cdp_browser.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nimport os\nimport asyncio\nimport socket\nimport httpx\nimport signal\nimport atexit\nfrom typing import Optional, Dict, Any\nfrom playwright.async_api import Browser, BrowserContext, Playwright\n\nimport config\nfrom tools.browser_launcher import BrowserLauncher\nfrom tools import utils\n\n\nclass CDPBrowserManager:\n    \"\"\"\n    CDP browser manager, responsible for launching and managing browsers connected via CDP\n    \"\"\"\n\n    def __init__(self):\n        self.launcher = BrowserLauncher()\n        self.browser: Optional[Browser] = None\n        self.browser_context: Optional[BrowserContext] = None\n        self.debug_port: Optional[int] = None\n        self._cleanup_registered = False\n\n    def _register_cleanup_handlers(self):\n        \"\"\"\n        Register cleanup handlers to ensure browser process cleanup on program exit\n        \"\"\"\n        if self._cleanup_registered:\n            return\n\n        def sync_cleanup():\n            \"\"\"Synchronous cleanup function for atexit\"\"\"\n            if self.launcher and self.launcher.browser_process:\n                utils.logger.info(\"[CDPBrowserManager] atexit: Cleaning up browser process\")\n                self.launcher.cleanup()\n\n        # Register atexit cleanup\n        atexit.register(sync_cleanup)\n\n        # Register signal handlers (only when no custom handlers exist, to avoid overriding main entry signal handling logic)\n        prev_sigint = signal.getsignal(signal.SIGINT)\n        prev_sigterm = signal.getsignal(signal.SIGTERM)\n\n        def signal_handler(signum, frame):\n            \"\"\"Signal handler\"\"\"\n            utils.logger.info(f\"[CDPBrowserManager] Received signal {signum}, cleaning up browser process\")\n            if self.launcher and self.launcher.browser_process:\n                self.launcher.cleanup()\n\n            if signum == signal.SIGINT:\n                if prev_sigint == signal.default_int_handler:\n                    return prev_sigint(signum, frame)\n                raise KeyboardInterrupt\n\n            raise SystemExit(0)\n\n        install_sigint = prev_sigint in (signal.default_int_handler, signal.SIG_DFL)\n        install_sigterm = prev_sigterm == signal.SIG_DFL\n\n        # Register SIGINT (Ctrl+C) and SIGTERM\n        if install_sigint:\n            signal.signal(signal.SIGINT, signal_handler)\n        else:\n            utils.logger.info(\"[CDPBrowserManager] SIGINT handler already exists, skipping registration to avoid override\")\n\n        if install_sigterm:\n            signal.signal(signal.SIGTERM, signal_handler)\n        else:\n            utils.logger.info(\"[CDPBrowserManager] SIGTERM handler already exists, skipping registration to avoid override\")\n\n        self._cleanup_registered = True\n        utils.logger.info(\"[CDPBrowserManager] Cleanup handlers registered\")\n\n    async def launch_and_connect(\n        self,\n        playwright: Playwright,\n        playwright_proxy: Optional[Dict] = None,\n        user_agent: Optional[str] = None,\n        headless: bool = False,\n    ) -> BrowserContext:\n        \"\"\"\n        Launch browser and connect via CDP\n        \"\"\"\n        try:\n            # 1. Detect browser path\n            browser_path = await self._get_browser_path()\n\n            # 2. Get available port\n            self.debug_port = self.launcher.find_available_port(config.CDP_DEBUG_PORT)\n\n            # 3. Launch browser\n            await self._launch_browser(browser_path, headless)\n\n            # 4. Register cleanup handlers (ensure cleanup on abnormal exit)\n            self._register_cleanup_handlers()\n\n            # 5. Connect via CDP\n            await self._connect_via_cdp(playwright)\n\n            # 6. Create browser context\n            browser_context = await self._create_browser_context(\n                playwright_proxy, user_agent\n            )\n\n            self.browser_context = browser_context\n            return browser_context\n\n        except Exception as e:\n            utils.logger.error(f\"[CDPBrowserManager] CDP browser launch failed: {e}\")\n            await self.cleanup()\n            raise\n\n    async def _get_browser_path(self) -> str:\n        \"\"\"\n        Get browser path\n        \"\"\"\n        # Prefer user-defined path\n        if config.CUSTOM_BROWSER_PATH and os.path.isfile(config.CUSTOM_BROWSER_PATH):\n            utils.logger.info(\n                f\"[CDPBrowserManager] Using custom browser path: {config.CUSTOM_BROWSER_PATH}\"\n            )\n            return config.CUSTOM_BROWSER_PATH\n\n        # Auto-detect browser path\n        browser_paths = self.launcher.detect_browser_paths()\n\n        if not browser_paths:\n            raise RuntimeError(\n                \"No available browser found. Please ensure Chrome or Edge browser is installed, \"\n                \"or set CUSTOM_BROWSER_PATH in config file to specify browser path.\"\n            )\n\n        browser_path = browser_paths[0]  # Use the first browser found\n        browser_name, browser_version = self.launcher.get_browser_info(browser_path)\n\n        utils.logger.info(\n            f\"[CDPBrowserManager] Detected browser: {browser_name} ({browser_version})\"\n        )\n        utils.logger.info(f\"[CDPBrowserManager] Browser path: {browser_path}\")\n\n        return browser_path\n\n    async def _test_cdp_connection(self, debug_port: int) -> bool:\n        \"\"\"\n        Test if CDP connection is available\n        \"\"\"\n        try:\n            # Simple socket connection test\n            with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:\n                s.settimeout(5)\n                result = s.connect_ex((\"localhost\", debug_port))\n                if result == 0:\n                    utils.logger.info(\n                        f\"[CDPBrowserManager] CDP port {debug_port} is accessible\"\n                    )\n                    return True\n                else:\n                    utils.logger.warning(\n                        f\"[CDPBrowserManager] CDP port {debug_port} is not accessible\"\n                    )\n                    return False\n        except Exception as e:\n            utils.logger.warning(f\"[CDPBrowserManager] CDP connection test failed: {e}\")\n            return False\n\n    async def _launch_browser(self, browser_path: str, headless: bool):\n        \"\"\"\n        Launch browser process\n        \"\"\"\n        # Set user data directory (if save login state is enabled)\n        user_data_dir = None\n        if config.SAVE_LOGIN_STATE:\n            user_data_dir = os.path.join(\n                os.getcwd(),\n                \"browser_data\",\n                f\"cdp_{config.USER_DATA_DIR % config.PLATFORM}\",\n            )\n            os.makedirs(user_data_dir, exist_ok=True)\n            utils.logger.info(f\"[CDPBrowserManager] User data directory: {user_data_dir}\")\n\n        # Launch browser\n        self.launcher.browser_process = self.launcher.launch_browser(\n            browser_path=browser_path,\n            debug_port=self.debug_port,\n            headless=headless,\n            user_data_dir=user_data_dir,\n        )\n\n        # Wait for browser to be ready\n        if not self.launcher.wait_for_browser_ready(\n            self.debug_port, config.BROWSER_LAUNCH_TIMEOUT\n        ):\n            raise RuntimeError(f\"Browser failed to start within {config.BROWSER_LAUNCH_TIMEOUT} seconds\")\n\n        # Extra wait for CDP service to fully start\n        await asyncio.sleep(1)\n\n        # Test CDP connection\n        if not await self._test_cdp_connection(self.debug_port):\n            utils.logger.warning(\n                \"[CDPBrowserManager] CDP connection test failed, but will continue to try connecting\"\n            )\n\n    async def _get_browser_websocket_url(self, debug_port: int) -> str:\n        \"\"\"\n        Get browser WebSocket connection URL\n        \"\"\"\n        try:\n            async with httpx.AsyncClient() as client:\n                response = await client.get(\n                    f\"http://localhost:{debug_port}/json/version\", timeout=10\n                )\n                if response.status_code == 200:\n                    data = response.json()\n                    ws_url = data.get(\"webSocketDebuggerUrl\")\n                    if ws_url:\n                        utils.logger.info(\n                            f\"[CDPBrowserManager] Got browser WebSocket URL: {ws_url}\"\n                        )\n                        return ws_url\n                    else:\n                        raise RuntimeError(\"webSocketDebuggerUrl not found\")\n                else:\n                    raise RuntimeError(f\"HTTP {response.status_code}: {response.text}\")\n        except Exception as e:\n            utils.logger.error(f\"[CDPBrowserManager] Failed to get WebSocket URL: {e}\")\n            raise\n\n    async def _connect_via_cdp(self, playwright: Playwright):\n        \"\"\"\n        Connect to browser via CDP\n        \"\"\"\n        try:\n            # Get correct WebSocket URL\n            ws_url = await self._get_browser_websocket_url(self.debug_port)\n            utils.logger.info(f\"[CDPBrowserManager] Connecting to browser via CDP: {ws_url}\")\n\n            # Use Playwright's connectOverCDP method to connect\n            self.browser = await playwright.chromium.connect_over_cdp(ws_url)\n\n            if self.browser.is_connected():\n                utils.logger.info(\"[CDPBrowserManager] Successfully connected to browser\")\n                utils.logger.info(\n                    f\"[CDPBrowserManager] Browser contexts count: {len(self.browser.contexts)}\"\n                )\n            else:\n                raise RuntimeError(\"CDP connection failed\")\n\n        except Exception as e:\n            utils.logger.error(f\"[CDPBrowserManager] CDP connection failed: {e}\")\n            raise\n\n    async def _create_browser_context(\n        self, playwright_proxy: Optional[Dict] = None, user_agent: Optional[str] = None\n    ) -> BrowserContext:\n        \"\"\"\n        Create or get browser context\n        \"\"\"\n        if not self.browser:\n            raise RuntimeError(\"Browser not connected\")\n\n        # Get existing context or create new context\n        contexts = self.browser.contexts\n\n        if contexts:\n            # Use existing first context\n            browser_context = contexts[0]\n            utils.logger.info(\"[CDPBrowserManager] Using existing browser context\")\n        else:\n            # Create new context\n            context_options = {\n                \"viewport\": {\"width\": 1920, \"height\": 1080},\n                \"accept_downloads\": True,\n            }\n\n            # Set user agent\n            if user_agent:\n                context_options[\"user_agent\"] = user_agent\n                utils.logger.info(f\"[CDPBrowserManager] Setting user agent: {user_agent}\")\n\n            # Note: Proxy settings may not work in CDP mode since browser is already launched\n            if playwright_proxy:\n                utils.logger.warning(\n                    \"[CDPBrowserManager] Warning: Proxy settings may not work in CDP mode, \"\n                    \"recommend configuring system proxy or browser proxy extension before launching browser\"\n                )\n\n            browser_context = await self.browser.new_context(**context_options)\n            utils.logger.info(\"[CDPBrowserManager] Created new browser context\")\n\n        return browser_context\n\n    async def add_stealth_script(self, script_path: str = \"libs/stealth.min.js\"):\n        \"\"\"\n        Add anti-detection script\n        \"\"\"\n        if self.browser_context and os.path.exists(script_path):\n            try:\n                await self.browser_context.add_init_script(path=script_path)\n                utils.logger.info(\n                    f\"[CDPBrowserManager] Added anti-detection script: {script_path}\"\n                )\n            except Exception as e:\n                utils.logger.warning(f\"[CDPBrowserManager] Failed to add anti-detection script: {e}\")\n\n    async def add_cookies(self, cookies: list):\n        \"\"\"\n        Add cookies\n        \"\"\"\n        if self.browser_context:\n            try:\n                await self.browser_context.add_cookies(cookies)\n                utils.logger.info(f\"[CDPBrowserManager] Added {len(cookies)} cookies\")\n            except Exception as e:\n                utils.logger.warning(f\"[CDPBrowserManager] Failed to add cookies: {e}\")\n\n    async def get_cookies(self) -> list:\n        \"\"\"\n        Get current cookies\n        \"\"\"\n        if self.browser_context:\n            try:\n                cookies = await self.browser_context.cookies()\n                return cookies\n            except Exception as e:\n                utils.logger.warning(f\"[CDPBrowserManager] Failed to get cookies: {e}\")\n                return []\n        return []\n\n    async def cleanup(self, force: bool = False):\n        \"\"\"\n        Cleanup resources\n\n        Args:\n            force: Whether to force cleanup browser process (ignoring AUTO_CLOSE_BROWSER config)\n        \"\"\"\n        try:\n            # Close browser context\n            if self.browser_context:\n                try:\n                    # Check if context is already closed\n                    # Try to get page list, if fails means already closed\n                    try:\n                        pages = self.browser_context.pages\n                        if pages is not None:\n                            await self.browser_context.close()\n                            utils.logger.info(\"[CDPBrowserManager] Browser context closed\")\n                    except:\n                        utils.logger.debug(\"[CDPBrowserManager] Browser context already closed\")\n                except Exception as context_error:\n                    # Only log warning if error is not due to already being closed\n                    error_msg = str(context_error).lower()\n                    if \"closed\" not in error_msg and \"disconnected\" not in error_msg:\n                        utils.logger.warning(\n                            f\"[CDPBrowserManager] Failed to close browser context: {context_error}\"\n                        )\n                    else:\n                        utils.logger.debug(f\"[CDPBrowserManager] Browser context already closed: {context_error}\")\n                finally:\n                    self.browser_context = None\n\n            # Disconnect browser\n            if self.browser:\n                try:\n                    # Check if browser is still connected\n                    if self.browser.is_connected():\n                        await self.browser.close()\n                        utils.logger.info(\"[CDPBrowserManager] Browser connection disconnected\")\n                    else:\n                        utils.logger.debug(\"[CDPBrowserManager] Browser connection already disconnected\")\n                except Exception as browser_error:\n                    # Only log warning if error is not due to already being closed\n                    error_msg = str(browser_error).lower()\n                    if \"closed\" not in error_msg and \"disconnected\" not in error_msg:\n                        utils.logger.warning(\n                            f\"[CDPBrowserManager] Failed to close browser connection: {browser_error}\"\n                        )\n                    else:\n                        utils.logger.debug(f\"[CDPBrowserManager] Browser connection already closed: {browser_error}\")\n                finally:\n                    self.browser = None\n\n            # Close browser process\n            # force=True means force close, ignoring AUTO_CLOSE_BROWSER config\n            # Used for handling abnormal exit or manual cleanup\n            if force or config.AUTO_CLOSE_BROWSER:\n                if self.launcher and self.launcher.browser_process:\n                    self.launcher.cleanup()\n                else:\n                    utils.logger.debug(\"[CDPBrowserManager] No browser process to cleanup\")\n            else:\n                utils.logger.info(\n                    \"[CDPBrowserManager] Browser process kept running (AUTO_CLOSE_BROWSER=False)\"\n                )\n\n        except Exception as e:\n            utils.logger.error(f\"[CDPBrowserManager] Error during resource cleanup: {e}\")\n\n    def is_connected(self) -> bool:\n        \"\"\"\n        Check if connected to browser\n        \"\"\"\n        return self.browser is not None and self.browser.is_connected()\n\n    async def get_browser_info(self) -> Dict[str, Any]:\n        \"\"\"\n        Get browser info\n        \"\"\"\n        if not self.browser:\n            return {}\n\n        try:\n            version = self.browser.version\n            contexts_count = len(self.browser.contexts)\n\n            return {\n                \"version\": version,\n                \"contexts_count\": contexts_count,\n                \"debug_port\": self.debug_port,\n                \"is_connected\": self.is_connected(),\n            }\n        except Exception as e:\n            utils.logger.warning(f\"[CDPBrowserManager] Failed to get browser info: {e}\")\n            return {}\n"
  },
  {
    "path": "tools/crawler_util.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/tools/crawler_util.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2023/12/2 12:53\n# @Desc    : Crawler utility functions\n\nimport base64\nimport json\nimport random\nimport re\nimport urllib\nimport urllib.parse\nfrom io import BytesIO\nfrom typing import Dict, List, Optional, Tuple, cast\n\nimport httpx\nfrom PIL import Image, ImageDraw, ImageShow\nfrom playwright.async_api import Cookie, Page\n\nfrom . import utils\nfrom .httpx_util import make_async_client\n\n\nasync def find_login_qrcode(page: Page, selector: str) -> str:\n    \"\"\"find login qrcode image from target selector\"\"\"\n    try:\n        elements = await page.wait_for_selector(\n            selector=selector,\n        )\n        login_qrcode_img = str(await elements.get_property(\"src\"))  # type: ignore\n        if \"http://\" in login_qrcode_img or \"https://\" in login_qrcode_img:\n            async with make_async_client(follow_redirects=True) as client:\n                utils.logger.info(f\"[find_login_qrcode] get qrcode by url:{login_qrcode_img}\")\n                resp = await client.get(login_qrcode_img, headers={\"User-Agent\": get_user_agent()})\n                if resp.status_code == 200:\n                    image_data = resp.content\n                    base64_image = base64.b64encode(image_data).decode('utf-8')\n                    return base64_image\n                raise Exception(f\"fetch login image url failed, response message:{resp.text}\")\n        return login_qrcode_img\n\n    except Exception as e:\n        print(e)\n        return \"\"\n\n\nasync def find_qrcode_img_from_canvas(page: Page, canvas_selector: str) -> str:\n    \"\"\"\n    find qrcode image from canvas element\n    Args:\n        page:\n        canvas_selector:\n\n    Returns:\n\n    \"\"\"\n\n    # Wait for Canvas element to load\n    canvas = await page.wait_for_selector(canvas_selector)\n\n    # Take screenshot of Canvas element\n    screenshot = await canvas.screenshot()\n\n    # Convert screenshot to base64 format\n    base64_image = base64.b64encode(screenshot).decode('utf-8')\n    return base64_image\n\n\ndef show_qrcode(qr_code) -> None:  # type: ignore\n    \"\"\"parse base64 encode qrcode image and show it\"\"\"\n    if \",\" in qr_code:\n        qr_code = qr_code.split(\",\")[1]\n    qr_code = base64.b64decode(qr_code)\n    image = Image.open(BytesIO(qr_code))\n\n    # Add a square border around the QR code and display it within the border to improve scanning accuracy.\n    width, height = image.size\n    new_image = Image.new('RGB', (width + 20, height + 20), color=(255, 255, 255))\n    new_image.paste(image, (10, 10))\n    draw = ImageDraw.Draw(new_image)\n    draw.rectangle((0, 0, width + 19, height + 19), outline=(0, 0, 0), width=1)\n    del ImageShow.UnixViewer.options[\"save_all\"]\n    new_image.show()\n\n\ndef get_user_agent() -> str:\n    ua_list = [\n        \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36\",\n        \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.79 Safari/537.36\",\n        \"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36\",\n        \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36\",\n        \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36\",\n        \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36\",\n        \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36\",\n        \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.5112.79 Safari/537.36\",\n        \"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36\",\n        \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\",\n        \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.5060.53 Safari/537.36\",\n        \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.4844.84 Safari/537.36\",\n        \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\",\n        \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5112.79 Safari/537.36\",\n        \"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36\",\n        \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36\",\n        \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.5060.53 Safari/537.36\",\n        \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.4844.84 Safari/537.36\",\n        \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36\",\n        \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5112.79 Safari/537.36\"\n    ]\n    return random.choice(ua_list)\n\n\ndef get_mobile_user_agent() -> str:\n    ua_list = [\n        \"Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1\"\n    ]\n    return random.choice(ua_list)\n\n\ndef convert_cookies(cookies: Optional[List[Cookie]]) -> Tuple[str, Dict]:\n    if not cookies:\n        return \"\", {}\n    cookies_str = \";\".join([f\"{cookie.get('name')}={cookie.get('value')}\" for cookie in cookies])\n    cookie_dict = dict()\n    for cookie in cookies:\n        cookie_dict[cookie.get('name')] = cookie.get('value')\n    return cookies_str, cookie_dict\n\n\ndef convert_str_cookie_to_dict(cookie_str: str) -> Dict:\n    cookie_dict: Dict[str, str] = dict()\n    if not cookie_str:\n        return cookie_dict\n    for cookie in cookie_str.split(\";\"):\n        cookie = cookie.strip()\n        if not cookie:\n            continue\n        cookie_list = cookie.split(\"=\")\n        if len(cookie_list) != 2:\n            continue\n        cookie_value = cookie_list[1]\n        if isinstance(cookie_value, list):\n            cookie_value = \"\".join(cookie_value)\n        cookie_dict[cookie_list[0]] = cookie_value\n    return cookie_dict\n\n\ndef match_interact_info_count(count_str: str) -> int:\n    if not count_str:\n        return 0\n\n    match = re.search(r'\\d+', count_str)\n    if match:\n        number = match.group()\n        return int(number)\n    else:\n        return 0\n\n\ndef format_proxy_info(ip_proxy_info) -> Tuple[Optional[Dict], Optional[str]]:\n    \"\"\"format proxy info for playwright and httpx\"\"\"\n    # fix circular import issue\n    from proxy.proxy_ip_pool import IpInfoModel\n    ip_proxy_info = cast(IpInfoModel, ip_proxy_info)\n\n    # Playwright proxy server should be in format \"host:port\" without protocol prefix\n    server = f\"{ip_proxy_info.ip}:{ip_proxy_info.port}\"\n    \n    playwright_proxy = {\n        \"server\": server,\n    }\n    \n    # Only add username and password if they are not empty\n    if ip_proxy_info.user and ip_proxy_info.password:\n        playwright_proxy[\"username\"] = ip_proxy_info.user\n        playwright_proxy[\"password\"] = ip_proxy_info.password\n    \n    # httpx 0.28.1 requires passing proxy URL string directly, not a dictionary\n    if ip_proxy_info.user and ip_proxy_info.password:\n        httpx_proxy = f\"http://{ip_proxy_info.user}:{ip_proxy_info.password}@{ip_proxy_info.ip}:{ip_proxy_info.port}\"\n    else:\n        httpx_proxy = f\"http://{ip_proxy_info.ip}:{ip_proxy_info.port}\"\n    return playwright_proxy, httpx_proxy\n\n\ndef extract_text_from_html(html: str) -> str:\n    \"\"\"Extract text from HTML, removing all tags.\"\"\"\n    if not html:\n        return \"\"\n\n    # Remove script and style elements\n    clean_html = re.sub(r'<(script|style)[^>]*>.*?</\\1>', '', html, flags=re.DOTALL)\n    # Remove all other tags\n    clean_text = re.sub(r'<[^>]+>', '', clean_html).strip()\n    return clean_text\n\ndef extract_url_params_to_dict(url: str) -> Dict:\n    \"\"\"Extract URL parameters to dict\"\"\"\n    url_params_dict = dict()\n    if not url:\n        return url_params_dict\n    parsed_url = urllib.parse.urlparse(url)\n    url_params_dict = dict(urllib.parse.parse_qsl(parsed_url.query))\n    return url_params_dict\n"
  },
  {
    "path": "tools/easing.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/tools/easing.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# copy from https://github.com/aneasystone/selenium-test/blob/master/12-slider-captcha.py\n# thanks to aneasystone for his great work\nimport math\nfrom typing import List, Tuple\n\nimport numpy as np\n\n\n# https://github.com/gdsmith/jquery.easing/blob/master/jquery.easing.js\ndef ease_in_quad(x):\n    return x * x\n\n\ndef ease_out_quad(x):\n    return 1 - (1 - x) * (1 - x)\n\n\ndef ease_out_quart(x):\n    return 1 - pow(1 - x, 4)\n\n\ndef ease_out_expo(x):\n    if x == 1:\n        return 1\n    else:\n        return 1 - pow(2, -10 * x)\n\n\ndef ease_out_bounce(x):\n    n1 = 7.5625\n    d1 = 2.75\n    if x < 1 / d1:\n        return n1 * x * x\n    elif x < 2 / d1:\n        x -= 1.5 / d1\n        return n1 * x * x + 0.75\n    elif x < 2.5 / d1:\n        x -= 2.25 / d1\n        return n1 * x * x + 0.9375\n    else:\n        x -= 2.625 / d1\n        return n1 * x * x + 0.984375\n\n\ndef ease_out_elastic(x):\n    if x == 0:\n        return 0\n    elif x == 1:\n        return 1\n    else:\n        c4 = (2 * math.pi) / 3\n        return pow(2, -10 * x) * math.sin((x * 10 - 0.75) * c4) + 1\n\n\ndef get_tracks(distance, seconds, ease_func) -> Tuple[List[int], List[int]]:\n    tracks = [0]\n    offsets = [0]\n    for t in np.arange(0.0, seconds, 0.1):\n        ease = globals()[ease_func]\n        offset = round(ease(t / seconds) * distance)\n        tracks.append(offset - offsets[-1])\n        offsets.append(offset)\n    return offsets, tracks\n\n\nif __name__ == '__main__':\n    o, tl = get_tracks(129, 3, \"ease_out_expo\")\n    print(tl)\n"
  },
  {
    "path": "tools/file_header_manager.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/tools/file_header_manager.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\"\"\"\nFile header copyright declaration management tool\n\nFeatures:\n- Automatically add standardized copyright declaration and disclaimer to Python files\n- Intelligently detect existing file headers (encoding declaration, author info, disclaimer, etc.)\n- Insert copyright info at appropriate position without breaking existing content\n- Support batch processing and single file check mode\n\"\"\"\n\nimport os\nimport re\nimport sys\nfrom typing import List, Tuple\n\n# Project configuration\nREPO_URL = \"https://github.com/NanmiCoder/MediaCrawler\"\nGITHUB_PROFILE = \"https://github.com/NanmiCoder\"\nEMAIL = \"relakkes@gmail.com\"\nCOPYRIGHT_YEAR = \"2025\"\nLICENSE_TYPE = \"NON-COMMERCIAL LEARNING LICENSE 1.1\"\n\n# Disclaimer standard text\nDISCLAIMER = \"\"\"# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\"\"\"\n\n\ndef get_file_relative_path(file_path: str, project_root: str) -> str:\n    \"\"\"\n    Get file path relative to project root\n\n    Args:\n        file_path: File absolute path\n        project_root: Project root directory\n\n    Returns:\n        Relative path string\n    \"\"\"\n    return os.path.relpath(file_path, project_root)\n\n\ndef generate_copyright_header(relative_path: str) -> str:\n    \"\"\"\n    Generate copyright declaration header\n\n    Args:\n        relative_path: File path relative to project root\n\n    Returns:\n        Formatted copyright declaration string\n    \"\"\"\n    file_url = f\"{REPO_URL}/blob/main/{relative_path}\"\n\n    header = f\"\"\"# Copyright (c) {COPYRIGHT_YEAR} {EMAIL}\n#\n# This file is part of MediaCrawler project.\n# Repository: {file_url}\n# GitHub: {GITHUB_PROFILE}\n# Licensed under {LICENSE_TYPE}\n#\"\"\"\n\n    return header\n\n\ndef has_copyright_header(content: str) -> bool:\n    \"\"\"\n    Check if file already contains copyright declaration\n\n    Args:\n        content: File content\n\n    Returns:\n        True if already contains copyright declaration\n    \"\"\"\n    # Check if contains Copyright keyword\n    return \"Copyright (c)\" in content and \"MediaCrawler project\" in content\n\n\ndef has_disclaimer(content: str) -> bool:\n    \"\"\"\n    Check if file already contains disclaimer\n\n    Args:\n        content: File content\n\n    Returns:\n        True if already contains disclaimer\n    \"\"\"\n    return \"声明：本代码仅供学习和研究目的使用\" in content\n\n\ndef find_insert_position(lines: List[str]) -> Tuple[int, bool]:\n    \"\"\"\n    Find position to insert copyright declaration\n\n    Args:\n        lines: List of file content lines\n\n    Returns:\n        (insert line number, whether encoding declaration needs to be added)\n    \"\"\"\n    insert_pos = 0\n    has_encoding = False\n\n    # Check if first line is shebang\n    if lines and lines[0].startswith('#!'):\n        insert_pos = 1\n\n    # Check encoding declaration (usually on line 1 or 2)\n    for i in range(insert_pos, min(insert_pos + 2, len(lines))):\n        if i < len(lines):\n            line = lines[i].strip()\n            # Match # -*- coding: utf-8 -*- or # coding: utf-8 etc.\n            if re.match(r'#.*coding[:=]\\s*([-\\w.]+)', line):\n                has_encoding = True\n                insert_pos = i + 1\n                break\n\n    return insert_pos, has_encoding\n\n\ndef process_file(file_path: str, project_root: str, dry_run: bool = False) -> Tuple[bool, str]:\n    \"\"\"\n    Process single Python file\n\n    Args:\n        file_path: File path\n        project_root: Project root directory\n        dry_run: Check only without modification\n\n    Returns:\n        (whether modification needed, status message)\n    \"\"\"\n    try:\n        with open(file_path, 'r', encoding='utf-8') as f:\n            content = f.read()\n            lines = content.splitlines(keepends=True)\n\n        # Skip if already has copyright header\n        if has_copyright_header(content):\n            return False, f\"✓ Already has copyright header: {file_path}\"\n\n        # Get relative path\n        relative_path = get_file_relative_path(file_path, project_root)\n\n        # Generate copyright header\n        copyright_header = generate_copyright_header(relative_path)\n\n        # Find insert position\n        insert_pos, has_encoding = find_insert_position(lines)\n\n        # Build new file content\n        new_lines = []\n\n        # Add encoding declaration if not present\n        if not has_encoding:\n            new_lines.append(\"# -*- coding: utf-8 -*-\\n\")\n\n        # Add front part (shebang and encoding declaration)\n        new_lines.extend(lines[:insert_pos])\n\n        # Add copyright header\n        new_lines.append(copyright_header + \"\\n\")\n\n        # Add disclaimer if file doesn't have one\n        if not has_disclaimer(content):\n            new_lines.append(DISCLAIMER + \"\\n\")\n\n        # Add empty line (if next line is not empty)\n        if insert_pos < len(lines) and lines[insert_pos].strip():\n            new_lines.append(\"\\n\")\n\n        # Add remaining content\n        new_lines.extend(lines[insert_pos:])\n\n        # Write to file if not dry run\n        if not dry_run:\n            with open(file_path, 'w', encoding='utf-8') as f:\n                f.writelines(new_lines)\n            return True, f\"✓ Updated: {file_path}\"\n        else:\n            return True, f\"→ Would update: {file_path}\"\n\n    except Exception as e:\n        return False, f\"✗ Error processing {file_path}: {str(e)}\"\n\n\ndef find_python_files(root_dir: str, exclude_patterns: List[str] = None) -> List[str]:\n    \"\"\"\n    Find all Python files\n\n    Args:\n        root_dir: Root directory\n        exclude_patterns: Directory patterns to exclude\n\n    Returns:\n        List of Python file paths\n    \"\"\"\n    if exclude_patterns is None:\n        exclude_patterns = ['venv', '.venv', 'node_modules', '__pycache__', '.git', 'build', 'dist', '.eggs']\n\n    python_files = []\n\n    for root, dirs, files in os.walk(root_dir):\n        # Exclude specific directories\n        dirs[:] = [d for d in dirs if d not in exclude_patterns and not d.startswith('.')]\n\n        for file in files:\n            if file.endswith('.py'):\n                python_files.append(os.path.join(root, file))\n\n    return sorted(python_files)\n\n\ndef main():\n    \"\"\"Main function\"\"\"\n    import argparse\n\n    parser = argparse.ArgumentParser(description='Python file header copyright declaration management tool')\n    parser.add_argument('files', nargs='*', help='File paths to process (optional, defaults to all .py files)')\n    parser.add_argument('--dry-run', action='store_true', help='Check only without modifying files')\n    parser.add_argument('--project-root', default=None, help='Project root directory (defaults to current directory)')\n    parser.add_argument('--check', action='store_true', help='Check mode, return non-zero exit code if files missing copyright declaration')\n\n    args = parser.parse_args()\n\n    # Determine project root directory\n    if args.project_root:\n        project_root = os.path.abspath(args.project_root)\n    else:\n        # Assume this script is in tools/ directory\n        project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\n\n    print(f\"Project root: {project_root}\")\n    print(f\"Mode: {'DRY RUN' if args.dry_run else 'UPDATE'}\")\n    print(\"-\" * 60)\n\n    # Get list of files to process\n    if args.files:\n        # Process specified files\n        files_to_process = [os.path.abspath(f) for f in args.files if f.endswith('.py')]\n    else:\n        # Process all Python files\n        files_to_process = find_python_files(project_root)\n\n    print(f\"Found {len(files_to_process)} Python files to process\\n\")\n\n    # Process files\n    updated_count = 0\n    skipped_count = 0\n    error_count = 0\n\n    for file_path in files_to_process:\n        modified, message = process_file(file_path, project_root, args.dry_run or args.check)\n        print(message)\n\n        if \"Error\" in message:\n            error_count += 1\n        elif modified:\n            updated_count += 1\n        else:\n            skipped_count += 1\n\n    # Print summary\n    print(\"\\n\" + \"=\" * 60)\n    print(f\"Summary:\")\n    print(f\"  Total files: {len(files_to_process)}\")\n    print(f\"  Updated/Need update: {updated_count}\")\n    print(f\"  Already compliant: {skipped_count}\")\n    print(f\"  Errors: {error_count}\")\n    print(\"=\" * 60)\n\n    # Return non-zero exit code in check mode if files need update\n    if args.check and updated_count > 0:\n        sys.exit(1)\n    elif error_count > 0:\n        sys.exit(1)\n    else:\n        sys.exit(0)\n\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "tools/httpx_util.py",
    "content": "# -*- coding: utf-8 -*-\nimport httpx\nimport config\n\n\ndef make_async_client(**kwargs) -> httpx.AsyncClient:\n    \"\"\"创建统一配置的 httpx.AsyncClient。\n\n    从配置文件读取 DISABLE_SSL_VERIFY（默认 False，即开启 SSL 验证）。\n    仅在使用企业代理、Burp、mitmproxy 等中间人代理时才需将其设为 True。\n    \"\"\"\n    kwargs.setdefault(\"verify\", not getattr(config, \"DISABLE_SSL_VERIFY\", False))\n    return httpx.AsyncClient(**kwargs)\n"
  },
  {
    "path": "tools/slider_util.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/tools/slider_util.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2023/12/2 12:55\n# @Desc    : Slider verification utility package\nimport os\nfrom typing import List\nfrom urllib.parse import urlparse\n\nimport cv2\nimport httpx\nimport numpy as np\n\n\nclass Slide:\n    \"\"\"\n    copy from https://blog.csdn.net/weixin_43582101 thanks for author\n    update: relakkes\n    \"\"\"\n    def __init__(self, gap, bg, gap_size=None, bg_size=None, out=None):\n        \"\"\"\n        :param gap: Gap image path or url\n        :param bg: Background image with gap path or url\n        \"\"\"\n        self.img_dir = os.path.join(os.getcwd(), 'temp_image')\n        if not os.path.exists(self.img_dir):\n            os.makedirs(self.img_dir)\n\n        bg_resize = bg_size if bg_size else (340, 212)\n        gap_size = gap_size if gap_size else (68, 68)\n        self.bg = self.check_is_img_path(bg, 'bg', resize=bg_resize)\n        self.gap = self.check_is_img_path(gap, 'gap', resize=gap_size)\n        self.out = out if out else os.path.join(self.img_dir, 'out.jpg')\n\n    @staticmethod\n    def check_is_img_path(img, img_type, resize):\n        if img.startswith('http'):\n            headers = {\n                \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;\"\n                          \"q=0.8,application/signed-exchange;v=b3;q=0.9\",\n                \"Accept-Encoding\": \"gzip, deflate, br\",\n                \"Accept-Language\": \"zh-CN,zh;q=0.9,en-GB;q=0.8,en;q=0.7,ja;q=0.6\",\n                \"AbstractCache-Control\": \"max-age=0\",\n                \"Connection\": \"keep-alive\",\n                \"Host\": urlparse(img).hostname,\n                \"Upgrade-Insecure-Requests\": \"1\",\n                \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \"\n                              \"Chrome/91.0.4472.164 Safari/537.36\",\n            }\n            img_res = httpx.get(img, headers=headers)\n            if img_res.status_code == 200:\n                img_path = f'./temp_image/{img_type}.jpg'\n                image = np.asarray(bytearray(img_res.content), dtype=\"uint8\")\n                image = cv2.imdecode(image, cv2.IMREAD_COLOR)\n                if resize:\n                    image = cv2.resize(image, dsize=resize)\n                cv2.imwrite(img_path, image)\n                return img_path\n            else:\n                raise Exception(f\"Failed to save {img_type} image\")\n        else:\n            return img\n\n    @staticmethod\n    def clear_white(img):\n        \"\"\"Clear whitespace from image, mainly clearing slider whitespace\"\"\"\n        img = cv2.imread(img)\n        rows, cols, channel = img.shape\n        min_x = 255\n        min_y = 255\n        max_x = 0\n        max_y = 0\n        for x in range(1, rows):\n            for y in range(1, cols):\n                t = set(img[x, y])\n                if len(t) >= 2:\n                    if x <= min_x:\n                        min_x = x\n                    elif x >= max_x:\n                        max_x = x\n\n                    if y <= min_y:\n                        min_y = y\n                    elif y >= max_y:\n                        max_y = y\n        img1 = img[min_x:max_x, min_y: max_y]\n        return img1\n\n    def template_match(self, tpl, target):\n        th, tw = tpl.shape[:2]\n        result = cv2.matchTemplate(target, tpl, cv2.TM_CCOEFF_NORMED)\n        # Find min and max value positions in matrix\n        min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)\n        tl = max_loc\n        br = (tl[0] + tw, tl[1] + th)\n        # Draw rectangle border to mark the matched area\n        # target: target image\n        # tl: rectangle top-left corner\n        # br: rectangle width and height\n        # (0,0,255): rectangle border color\n        # 1: rectangle border size\n        cv2.rectangle(target, tl, br, (0, 0, 255), 2)\n        cv2.imwrite(self.out, target)\n        return tl[0]\n\n    @staticmethod\n    def image_edge_detection(img):\n        edges = cv2.Canny(img, 100, 200)\n        return edges\n\n    def discern(self):\n        img1 = self.clear_white(self.gap)\n        img1 = cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY)\n        slide = self.image_edge_detection(img1)\n\n        back = cv2.imread(self.bg, cv2.COLOR_RGB2GRAY)\n        back = self.image_edge_detection(back)\n\n        slide_pic = cv2.cvtColor(slide, cv2.COLOR_GRAY2RGB)\n        back_pic = cv2.cvtColor(back, cv2.COLOR_GRAY2RGB)\n        x = self.template_match(slide_pic, back_pic)\n        # Output x-coordinate, i.e., slider position on image\n        return x\n\n\ndef get_track_simple(distance) -> List[int]:\n    # Some detection checks movement speed - constant speed will be detected, so use gradual acceleration\n    # distance is the total distance to move\n    # Movement track\n    track: List[int] = []\n    # Current displacement\n    current = 0\n    # Deceleration threshold\n    mid = distance * 4 / 5\n    # Time interval\n    t = 0.2\n    # Initial velocity\n    v = 1\n\n    while current < distance:\n        if current < mid:\n            # Acceleration = 4\n            a = 4\n        else:\n            # Acceleration = -3\n            a = -3\n        v0 = v\n        # Current velocity\n        v = v0 + a * t  # type: ignore\n        # Movement distance\n        move = v0 * t + 1 / 2 * a * t * t\n        # Current displacement\n        current += move  # type: ignore\n        # Add to track\n        track.append(round(move))\n    return track\n\n\ndef get_tracks(distance: int, level: str = \"easy\") -> List[int]:\n    if level == \"easy\":\n        return get_track_simple(distance)\n    else:\n        from . import easing\n        _, tricks = easing.get_tracks(distance, seconds=2, ease_func=\"ease_out_expo\")\n        return tricks\n"
  },
  {
    "path": "tools/time_util.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/tools/time_util.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\n# -*- coding: utf-8 -*-\n# @Author  : relakkes@gmail.com\n# @Time    : 2023/12/2 12:52\n# @Desc    : Time utility functions\n\nimport time\nfrom datetime import datetime, timedelta, timezone\n\n\ndef get_current_timestamp() -> int:\n    \"\"\"\n    Get current timestamp (13 digits): 1701493264496\n    :return:\n    \"\"\"\n    return int(time.time() * 1000)\n\n\ndef get_current_time() -> str:\n    \"\"\"\n    Get current time: '2023-12-02 13:01:23'\n    :return:\n    \"\"\"\n    return time.strftime('%Y-%m-%d %X', time.localtime())\n\ndef get_current_time_hour() -> str:\n    \"\"\"\n    Get current time with hour: '2023-12-02-13'\n    :return:\n    \"\"\"\n    return time.strftime('%Y-%m-%d-%H', time.localtime())\n\ndef get_current_date() -> str:\n    \"\"\"\n    Get current date: '2023-12-02'\n    :return:\n    \"\"\"\n    return time.strftime('%Y-%m-%d', time.localtime())\n\n\ndef get_time_str_from_unix_time(unixtime):\n    \"\"\"\n    Unix integer timestamp ==> datetime string\n    :param unixtime:\n    :return:\n    \"\"\"\n    if int(unixtime) > 1000000000000:\n        unixtime = int(unixtime) / 1000\n    return time.strftime('%Y-%m-%d %X', time.localtime(unixtime))\n\n\ndef get_date_str_from_unix_time(unixtime):\n    \"\"\"\n    Unix integer timestamp ==> date string\n    :param unixtime:\n    :return:\n    \"\"\"\n    if int(unixtime) > 1000000000000:\n        unixtime = int(unixtime) / 1000\n    return time.strftime('%Y-%m-%d', time.localtime(unixtime))\n\n\ndef get_unix_time_from_time_str(time_str):\n    \"\"\"\n    Time string ==> Unix integer timestamp, precise to seconds\n    :param time_str:\n    :return:\n    \"\"\"\n    try:\n        format_str = \"%Y-%m-%d %H:%M:%S\"\n        tm_object = time.strptime(str(time_str), format_str)\n        return int(time.mktime(tm_object))\n    except Exception as e:\n        return 0\n    pass\n\n\ndef get_unix_timestamp():\n    return int(time.time())\n\n\ndef rfc2822_to_china_datetime(rfc2822_time):\n    # Define RFC 2822 format\n    rfc2822_format = \"%a %b %d %H:%M:%S %z %Y\"\n\n    # Convert RFC 2822 time string to datetime object\n    dt_object = datetime.strptime(rfc2822_time, rfc2822_format)\n\n    # Convert datetime object timezone to China timezone\n    dt_object_china = dt_object.astimezone(timezone(timedelta(hours=8)))\n    return dt_object_china\n\n\ndef rfc2822_to_timestamp(rfc2822_time):\n    # Define RFC 2822 format\n    rfc2822_format = \"%a %b %d %H:%M:%S %z %Y\"\n\n    # Convert RFC 2822 time string to datetime object\n    dt_object = datetime.strptime(rfc2822_time, rfc2822_format)\n\n    # Convert datetime object to UTC time\n    dt_utc = dt_object.replace(tzinfo=timezone.utc)\n\n    # Calculate Unix timestamp from UTC time\n    timestamp = int(dt_utc.timestamp())\n\n    return timestamp\n\n\nif __name__ == '__main__':\n    # Example usage\n    _rfc2822_time = \"Sat Dec 23 17:12:54 +0800 2023\"\n    print(rfc2822_to_china_datetime(_rfc2822_time))\n"
  },
  {
    "path": "tools/utils.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/tools/utils.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nimport argparse\nimport logging\n\nfrom .crawler_util import *\nfrom .slider_util import *\nfrom .time_util import *\n\n\ndef init_loging_config():\n    level = logging.INFO\n    logging.basicConfig(\n        level=level,\n        format=\"%(asctime)s %(name)s %(levelname)s (%(filename)s:%(lineno)d) - %(message)s\",\n        datefmt='%Y-%m-%d %H:%M:%S'\n    )\n    _logger = logging.getLogger(\"MediaCrawler\")\n    _logger.setLevel(level)\n\n    # Disable httpx INFO level logs\n    logging.getLogger(\"httpx\").setLevel(logging.WARNING)\n\n    return _logger\n\n\nlogger = init_loging_config()\n\ndef str2bool(v):\n    if isinstance(v, bool):\n        return v\n    if v.lower() in ('yes', 'true', 't', 'y', '1'):\n        return True\n    elif v.lower() in ('no', 'false', 'f', 'n', '0'):\n        return False\n    else:\n        raise argparse.ArgumentTypeError('Boolean value expected.')\n"
  },
  {
    "path": "tools/words.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/tools/words.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nimport asyncio\nimport json\nimport logging\nfrom collections import Counter\n\nimport aiofiles\nimport jieba\nimport matplotlib.pyplot as plt\nfrom wordcloud import WordCloud\n\nimport config\nfrom tools import utils\n\nplot_lock = asyncio.Lock()\n\nclass AsyncWordCloudGenerator:\n    def __init__(self):\n        logging.getLogger('jieba').setLevel(logging.WARNING)\n        self.stop_words_file = config.STOP_WORDS_FILE\n        self.lock = asyncio.Lock()\n        self.stop_words = self.load_stop_words()\n        self.custom_words = config.CUSTOM_WORDS\n        for word, group in self.custom_words.items():\n            jieba.add_word(word)\n\n    def load_stop_words(self):\n        with open(self.stop_words_file, 'r', encoding='utf-8') as f:\n            return set(f.read().strip().split('\\n'))\n\n    async def generate_word_frequency_and_cloud(self, data, save_words_prefix):\n        all_text = ' '.join(item['content'] for item in data)\n        words = [word for word in jieba.lcut(all_text) if word not in self.stop_words and len(word.strip()) > 0]\n        word_freq = Counter(words)\n\n        # Save word frequency to file\n        freq_file = f\"{save_words_prefix}_word_freq.json\"\n        async with aiofiles.open(freq_file, 'w', encoding='utf-8') as file:\n            await file.write(json.dumps(word_freq, ensure_ascii=False, indent=4))\n\n        # Try to acquire the plot lock without waiting\n        if plot_lock.locked():\n            utils.logger.info(\"Skipping word cloud generation as the lock is held.\")\n            return\n\n        await self.generate_word_cloud(word_freq, save_words_prefix)\n\n    async def generate_word_cloud(self, word_freq, save_words_prefix):\n        await plot_lock.acquire()\n        top_20_word_freq = {word: freq for word, freq in\n                            sorted(word_freq.items(), key=lambda item: item[1], reverse=True)[:20]}\n        wordcloud = WordCloud(\n            font_path=config.FONT_PATH,\n            width=800,\n            height=400,\n            background_color='white',\n            max_words=200,\n            stopwords=self.stop_words,\n            colormap='viridis',\n            contour_color='steelblue',\n            contour_width=1\n        ).generate_from_frequencies(top_20_word_freq)\n\n        # Save word cloud image\n        plt.figure(figsize=(10, 5), facecolor='white')\n        plt.imshow(wordcloud, interpolation='bilinear')\n\n        plt.axis('off')\n        plt.tight_layout(pad=0)\n        plt.savefig(f\"{save_words_prefix}_word_cloud.png\", format='png', dpi=300)\n        plt.close()\n\n        plot_lock.release()\n"
  },
  {
    "path": "var.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright (c) 2025 relakkes@gmail.com\n#\n# This file is part of MediaCrawler project.\n# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/var.py\n# GitHub: https://github.com/NanmiCoder\n# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1\n#\n\n# 声明：本代码仅供学习和研究目的使用。使用者应遵守以下原则：\n# 1. 不得用于任何商业用途。\n# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。\n# 3. 不得进行大规模爬取或对平台造成运营干扰。\n# 4. 应合理控制请求频率，避免给目标平台带来不必要的负担。\n# 5. 不得用于任何非法或不当的用途。\n#\n# 详细许可条款请参阅项目根目录下的LICENSE文件。\n# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。\n\n\nfrom asyncio.tasks import Task\nfrom contextvars import ContextVar\nfrom typing import List\n\nimport aiomysql\n\nrequest_keyword_var: ContextVar[str] = ContextVar(\"request_keyword\", default=\"\")\ncrawler_type_var: ContextVar[str] = ContextVar(\"crawler_type\", default=\"\")\ncomment_tasks_var: ContextVar[List[Task]] = ContextVar(\"comment_tasks\", default=[])\ndb_conn_pool_var: ContextVar[aiomysql.Pool] = ContextVar(\"db_conn_pool_var\")\nsource_keyword_var: ContextVar[str] = ContextVar(\"source_keyword\", default=\"\")\n"
  }
]