第一章:Go开发环境配置「最后一公里」难题:VS Code成功识别go但无法运行go run .——真相是shell PATH与VS Code继承PATH不一致(跨终端验证法)
当 VS Code 的集成终端能执行 go version,但点击“运行”或终端中执行 go run . 却报错 command not found: go 或 no Go files in current directory(实则因 go 命令根本未被解析),问题往往不在 Go 安装本身,而在于VS Code 启动时读取的环境变量 PATH 与你的 Shell(如 zsh/bash)中配置的 PATH 不一致。
验证 PATH 差异的跨终端方法
在系统终端(iTerm2 / Terminal.app / Windows Terminal)中执行:
# 查看当前 shell 的 PATH(含 Go bin 路径,如 ~/go/bin 或 /usr/local/go/bin)
echo $PATH | tr ':' '\n' | grep -E "(go|local)"
# 启动一个干净的 VS Code 实例(绕过桌面快捷方式缓存)
code --no-sandbox --disable-gpu --new-window .
然后在 VS Code 集成终端中执行相同命令。若输出路径列表明显缺失 Go 相关目录,即确认 PATH 继承断裂。
根本原因与修复路径
VS Code 桌面应用通常由图形会话启动,不自动加载 shell 的 ~/.zshrc/~/.bash_profile,因此无法继承 export PATH=$PATH:~/go/bin 等配置。
✅ 正确修复方式(macOS/Linux):
✅ Windows 用户需检查:
- Go 安装时是否勾选 “Add Go to PATH”;
- 若使用 WSL,确保 VS Code 连接的是 WSL 环境(左下角显示
WSL: Ubuntu),且 ~/.bashrc 中已导出 PATH。
| 环境 |
推荐配置文件 |
是否需重启 VS Code |
| macOS GUI |
~/.zprofile |
是(完全退出) |
| Linux GNOME |
~/.profile |
是 |
| Windows (native) |
系统环境变量 |
是 |
完成修复后,在 VS Code 集成终端执行 which go 应返回有效路径,go run . 即可正常工作。
第二章:Visual Studio Code核心环境适配机制剖析
2.1 VS Code启动方式对进程环境变量的继承差异(GUI vs CLI)
启动方式决定环境变量源头
- GUI 启动(双击图标):继承自桌面会话环境(如 GNOME/KDE 的
dbus 会话),不包含 shell 初始化文件(.bashrc/.zshrc)中导出的变量
- CLI 启动(
code .):继承自当前终端进程,完整加载 shell 配置链中的 export 变量
环境变量对比示例
# 在终端执行后启动 VS Code
export MY_API_KEY="dev-token-123"
export PATH="/opt/mytools:$PATH"
code .
此时 VS Code 内置终端与调试器均可访问 MY_API_KEY 和扩展的 PATH;而 GUI 启动的同实例将缺失这些变量。
关键差异表
| 启动方式 |
父进程 |
加载 .bashrc? |
继承 systemd --user 环境? |
| GUI |
gnome-shell |
❌ |
✅(仅限 dbus 注册变量) |
| CLI |
bash/zsh |
✅ |
❌(除非显式 systemctl --user import-environment) |
进程继承关系(mermaid)
graph TD
A[GUI Launch] --> B[Desktop Environment]
B --> C[dbus session bus]
C --> D[VS Code main process]
E[CLI Launch] --> F[Shell Process]
F --> G[.bashrc → export]
G --> H[VS Code main process]
2.2 $PATH在不同会话上下文中的动态加载链路追踪(bash/zsh/profile/launchd)
启动上下文决定加载路径
终端登录会话(login shell)与非登录会话(non-login shell)触发不同的初始化文件链:
- Login shell:
/etc/profile → ~/.profile → ~/.bash_profile(bash)或 ~/.zprofile(zsh)
- Non-login shell:通常仅读取
~/.bashrc 或 ~/.zshrc
- macOS GUI 应用:绕过 shell 配置,由
launchd 通过 ~/.MacOSX/environment.plist(已弃用)或 launchctl setenv PATH ... 注入环境
launchd 的 PATH 注入机制
# 永久设置 GUI 应用的 PATH(需重启 Dock)
launchctl setenv PATH "/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin"
# 验证是否生效
launchctl getenv PATH
此命令将 PATH 注入 launchd 的全局环境,但仅对后续启动的 GUI 进程生效;已运行应用需重启。setenv 不持久化,需配合 launchd plist 或 shell 配置双重保障。
加载优先级对比
| 上下文类型 |
触发文件 |
是否影响 GUI 应用 |
| Login shell |
~/.zprofile, /etc/zprofile |
❌ |
| Non-login shell |
~/.zshrc |
❌ |
| launchd session |
launchctl getenv PATH |
✅ |
graph TD
A[Terminal App Launch] --> B{Login Shell?}
B -->|Yes| C[/etc/profile → ~/.zprofile]
B -->|No| D[~/.zshrc]
E[GUI App e.g. VS Code] --> F[launchd root context]
F --> G[launchctl getenv PATH]
2.3 通过ps -E与/proc/[pid]/environ实证分析VS Code子进程真实PATH
环境变量捕获差异
ps -E 显示的是内核记录的初始 argv[0] 及其环境快照,而 /proc/[pid]/environ 是实时内存映射的二进制环境块(\0 分隔),二者可能因 execve() 后 putenv() 动态修改而不同。
实操验证步骤
- 启动 VS Code 并打开集成终端(确保已执行
source ~/.zshrc)
- 在终端中运行
code --status,获取其子进程 PID
- 执行对比命令:
# 获取 VS Code 渲染器进程(如 extension host)的 PID
pgrep -f "Code Helper.*extension" | head -n1 | xargs -I{} sh -c '
echo "=== ps -E for PID {} ===";
ps -E -o pid,comm,args {} 2>/dev/null | tail -n +2;
echo -e "\n=== /proc/{}/environ (decoded) ===";
tr "\0" "\n" < /proc/{}/environ | grep "^PATH=";
'
逻辑说明:ps -E 的 -o 指定输出字段,args 包含完整命令行及环境(仅限 exec 时继承的初始环境);而 /proc/pid/environ 是进程当前实际持有的环境副本,经 tr "\0" "\n" 解码后可读。VS Code 子进程常因沙箱机制重置 PATH,导致二者不一致。
关键差异对照表
| 来源 |
是否反映动态修改 |
是否包含 Unicode 路径 |
实时性 |
ps -E |
❌ 否(只存 exec 时刻) |
✅ 是 |
低 |
/proc/[pid]/environ |
✅ 是 |
✅ 是 |
高 |
PATH 同步机制示意
graph TD
A[VS Code 主进程] -->|fork+exec| B[Extension Host]
B --> C[调用 setenv\(\"PATH\", ..., 1\)]
C --> D[/proc/B/environ 更新]
A -->|未同步| E[ps -E 仍显示旧 PATH]
2.4 Remote-WSL/SSH场景下PATH传递断点定位与修复策略
在 Remote-WSL 或 SSH 连接中,PATH 环境变量常因登录 shell 类型(非交互式 vs 交互式)而被截断或重置。
常见断点位置
- SSH 默认启动非登录非交互式 shell,跳过
~/.bashrc 和 /etc/profile
- WSL2 的
wsl.exe -u 启动未加载用户 profile
- VS Code Remote-WSL 的
remoteEnv 配置未覆盖子进程环境
诊断命令
# 在远程终端执行,对比差异
echo $PATH # 当前会话 PATH
ssh user@wsl "echo \$PATH" # SSH 子shell PATH(注意转义)
此命令揭示:SSH 子shell 仅继承 minimal PATH(如 /usr/bin:/bin),未加载用户自定义路径(如 ~/miniconda3/bin)。关键在于 $ 转义确保远程求值,而非本地展开。
修复策略对比
| 方案 |
适用场景 |
持久性 |
风险 |
修改 ~/.bashrc + export PATH=... |
WSL 本地 & VS Code Remote |
✅ |
可能污染非交互式脚本 |
SSH ForceCommand + env PATH=... |
企业 SSH 服务器 |
⚠️(需服务端配置) |
权限提升风险 |
VS Code remoteEnv + settings.json |
开发者本地调试 |
✅(客户端生效) |
不影响终端直连 |
自动化修复流程
graph TD
A[连接建立] --> B{Shell 类型检测}
B -->|login shell| C[加载 /etc/profile → ~/.bash_profile]
B -->|non-login| D[仅加载 ~/.bashrc?需显式 source]
D --> E[注入 PATH 补丁逻辑]
E --> F[验证 which python3]
2.5 自动化脚本验证:一键比对终端vs VS Code内嵌终端的PATH一致性
核心验证逻辑
通过并行采集两个环境的 PATH 变量,标准化分隔后逐段比对,定位差异路径。
验证脚本(Bash)
#!/bin/bash
# 获取系统终端PATH(脱离VS Code上下文)
TERM_PATH=$(env -i PATH="$PATH" bash -c 'echo $PATH')
# 获取VS Code内嵌终端PATH(需在VS Code中运行)
VSCODE_PATH=$(echo "$PATH")
# 标准化分割并排序比较
diff <(echo "$TERM_PATH" | tr ':' '\n' | sort) \
<(echo "$VSCODE_PATH" | tr ':' '\n' | sort) | grep "^[<>]"
逻辑说明:env -i 清空环境变量后仅保留原始 PATH,确保不受 VS Code 启动参数干扰;tr ':' '\n' 将路径列表转为行序列,sort 消除顺序差异,diff 精准标出独有项。
差异类型速查表
| 类型 |
终端独有 |
VS Code 独有 |
常见原因 |
| ✅ |
/usr/local/bin |
— |
系统级shell配置(如 /etc/profile) |
| ❌ |
— |
~/.vscode/extensions/.../bin |
VS Code 插件注入路径 |
路径同步建议
- 优先检查
~/.zshrc / ~/.bashrc 中 export PATH=... 是否被 VS Code 的 terminal.integrated.env.* 覆盖
- 使用
code --no-sandbox --disable-gpu 启动可复现纯净环境
graph TD
A[执行验证脚本] --> B{是否输出差异行?}
B -->|是| C[标记冲突路径]
B -->|否| D[PATH完全一致]
C --> E[检查shell配置与VS Code env设置]
第三章:Go语言工具链安装与多版本共存治理
3.1 从源码/二进制/包管理器三路径安装Go并校验GOROOT/GOPATH语义
Go 的安装方式直接影响 GOROOT 与 GOPATH 的语义边界:前者指向 Go 工具链根目录(只读),后者定义工作区(模块时代已弱化,但仍影响 go get 行为)。
三种安装路径对比
| 方式 |
典型路径 |
GOROOT 自动设置 |
GOPATH 默认值 |
| 二进制解压 |
/usr/local/go |
✅ 是 |
$HOME/go |
| 源码编译 |
$HOME/go(需 make.bash) |
✅ 是 |
需手动设(否则同上) |
| 包管理器 |
/opt/homebrew/Cellar/go/1.22.5(macOS Homebrew) |
✅ 是 |
不覆盖用户配置 |
校验语义的典型命令
# 查看当前环境语义
go env GOROOT GOPATH GOBIN
# 输出示例:
# /usr/local/go
# /Users/me/go
# /Users/me/go/bin
逻辑分析:go env 读取构建时嵌入的默认值 + 环境变量覆盖。GOROOT 由安装路径硬编码决定,不可被 GOENV=off 绕过;而 GOPATH 可被 export GOPATH=/custom 覆盖,且 go mod 项目中仅影响 vendor 和传统 GOPATH/src 导入解析。
graph TD
A[安装方式] --> B[二进制解压]
A --> C[源码编译]
A --> D[包管理器]
B & C & D --> E[GOROOT = 工具链根]
E --> F[GOPATH = 用户工作区]
F --> G[模块模式下仅影响 legacy 行为]
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000