Posted in

Go日志系统降维打击:从Zap到自研无锁RingBuffer Logger,吞吐提升5.8倍

第一章:Go日志系统演进与性能瓶颈全景洞察

Go 语言自诞生以来,其日志生态经历了从标准库 log 包的极简主义,到第三方库(如 logruszapzerolog)驱动的高性能专业化演进。这一过程并非线性优化,而是由真实生产场景中暴露的吞吐量下降、内存抖动、结构化缺失与上下文传递断裂等痛点持续牵引。

标准库 log 的隐式开销

log.Printf 等接口在每次调用时均执行完整格式化(fmt.Sprintf)、锁竞争(全局 std.mu)、以及无缓冲的同步写入。高并发下,锁争用可导致 P99 延迟飙升数毫秒。以下代码直观体现其同步阻塞特性:

// 示例:标准库 log 在 goroutine 密集场景下的性能陷阱
for i := 0; i < 10000; i++ {
    go func(id int) {
        log.Printf("request_id=%d, status=ok", id) // 每次调用均持锁 + 格式化 + 写入 os.Stderr
    }(i)
}

结构化日志的范式迁移

早期 logrus 引入 WithFields() 实现键值对记录,但反射序列化与 map 分配带来显著 GC 压力;zap 则通过预分配 []interface{} 缓冲池、零分配 JSON encoder 和 unsafe 字符串拼接,将结构化日志吞吐提升 3–5 倍。关键差异如下表所示:

特性 log (std) logrus zap (sugared)
每秒写入条数(16核) ~80k ~220k ~1.2M
分配内存/条 240B 180B
上下文透传支持 ✅(需手动) ✅(With 链式)

同步写入与异步模型的根本矛盾

多数高性能库默认启用异步模式(如 zap.NewAsync),但若未配置合理缓冲区(BufferPool)或消费者 goroutine 阻塞,日志队列将堆积并触发 panic。正确初始化示例:

// 推荐:带容量限制与超时丢弃的异步 zap 实例
core := zapcore.NewCore(
    zapcore.NewJSONEncoder(zapcore.EncoderConfig{...}),
    zapcore.Lock(os.Stderr),
    zapcore.InfoLevel,
)
logger := zap.New(zapcore.NewTee(
    core,
    zapcore.NewCore(
        zapcore.NewConsoleEncoder(zapcore.EncoderConfig{...}),
        zapcore.Lock(os.Stdout),
        zapcore.DebugLevel,
    ),
)).WithOptions(zap.AddCaller(), zap.WithClock(zapcore.SystemClock))

第二章:Zap日志库深度解构与高阶定制实践

2.1 Zap核心架构与零分配设计原理剖析

Zap 的核心由 LoggerCoreEncoder 三者构成,其中 Core 是日志处理的中枢,负责同步/异步写入与采样决策;Encoder(如 jsonEncoder)则完全避免字符串拼接与临时对象分配。

零分配关键实践

  • 复用 []byte 缓冲池(sync.Pool)管理编码输出
  • 字段(Field)以结构体值传递,非指针或 interface{}
  • 日志等级、时间戳等元数据直接写入预分配缓冲区

核心编码逻辑示例

func (e *jsonEncoder) AddString(key, val string) {
    e.addKey(key)                    // 直接追加到 e.buf,无 new()
    e.buf = append(e.buf, '"')       // 字符写入已有切片
    e.buf = append(e.buf, val...)    // 利用 ... 展开,避免 copy() 分配
    e.buf = append(e.buf, '"')
}

e.buf*[]byte 类型字段,全程复用底层数组;append 在容量充足时不触发扩容,规避堆分配。

组件 是否分配堆内存 说明
Field 构造 栈上结构体,含 key/val/type
Logger.Info 否(默认) 跳过 fmt.Sprintf 与 map
EncodeEntry 否(缓冲充足时) 依赖 buf 容量预估机制
graph TD
    A[Logger.Info] --> B{Level Enabled?}
    B -->|Yes| C[Build Entry struct on stack]
    C --> D[EncodeEntry → jsonEncoder.AddString]
    D --> E[Write to e.buf via append]
    E --> F[Flush to Writer]

2.2 结构化日志编码器的内存布局与序列化优化

结构化日志编码器需在低延迟与高密度间取得平衡。核心挑战在于避免重复字段名开销与运行时反射。

内存布局设计原则

  • 字段名索引表(只读静态区)统一管理 level, timestamp, trace_id 等键;
  • 值区采用紧凑变长编码:int64 直接存储,string 引用全局字符串池偏移;
  • 日志事件结构体对齐至 8 字节,消除 padding 浪费。

序列化优化策略

// 预分配缓冲区 + 零拷贝写入
func (e *Encoder) Encode(event *LogEvent, dst []byte) []byte {
    dst = binary.AppendUvarint(dst, uint64(event.Level)) // level: 1~2 byte
    dst = appendTimestamp(dst, event.Timestamp)           // timestamp: fixed 8B
    dst = appendStringRef(dst, event.TraceID)             // ref: 4B offset
    return dst
}

逻辑分析:binary.AppendUvarint 将日志等级压缩为 1–2 字节(DEBUG=0, ERROR=3);appendTimestamp 直接写入纳秒级 int64,省去格式化;appendStringRef 不复制字符串内容,仅写入其在共享池中的 uint32 偏移量,降低 GC 压力。

组件 传统 JSON 本编码器 节省率
字段名冗余 每条重复 静态索引 ~40%
字符串存储 复制副本 池化引用 ~65%
序列化耗时 12.3μs 2.1μs 83%↓
graph TD
    A[LogEvent struct] --> B[字段名→索引查表]
    B --> C[值→紧凑编码/池引用]
    C --> D[线性写入预分配buf]
    D --> E[零拷贝交付IO]

2.3 同步/异步写入模式的锁竞争实测与Goroutine泄漏规避

数据同步机制

同步写入直连 sync.Mutex,高并发下锁等待显著;异步写入通过带缓冲 channel 解耦生产与消费,降低临界区持有时间。

Goroutine 泄漏陷阱

未关闭通知 channel 或忘记 range 退出条件,将导致 goroutine 永驻:

// ❌ 危险:无退出机制,goroutine 永不终止
go func() {
    for range ch { // ch 永不关闭 → 泄漏
        process()
    }
}()

逻辑分析:range 在 channel 关闭前阻塞,若上游未调用 close(ch) 且无超时/信号控制,该 goroutine 将持续占用栈内存与调度资源。建议配合 context.WithCancel 显式管理生命周期。

性能对比(10K 并发写入,单位:ms)

模式 平均延迟 P99 延迟 Goroutine 数
同步写入 42.3 118.7 1
异步写入 8.1 22.4 3(含 worker)
graph TD
    A[写入请求] --> B{同步?}
    B -->|是| C[Acquire Mutex → Write → Release]
    B -->|否| D[Send to buffered chan]
    D --> E[Worker goroutine: Range + Process]
    E --> F[Close on shutdown]

2.4 自定义Core扩展:支持动态采样与条件过滤的实战封装

为应对高吞吐场景下的可观测性开销,我们基于 OpenTelemetry .NET SDK 构建轻量级 SamplingProcessor 扩展。

核心处理器实现

public class DynamicSamplingProcessor : BaseProcessor<Activity>
{
    private readonly Func<Activity, bool> _filter;
    private readonly Func<Activity, double> _samplingRatio;

    public DynamicSamplingProcessor(
        Func<Activity, bool> filter, 
        Func<Activity, double> samplingRatio) // 动态采样率:0.0~1.0
    {
        _filter = filter ?? throw new ArgumentNullException(nameof(filter));
        _samplingRatio = samplingRatio;
    }

    public override void OnStart(Activity activity)
    {
        if (_filter(activity) && Random.Shared.NextDouble() <= _samplingRatio(activity))
            activity.ActivityTraceFlags |= ActivityTraceFlags.Recorded;
    }
}

逻辑分析:OnStart 阶段对每个 Span 实时执行双校验——先通过 _filter 判断是否进入采样候选集(如 activity.OperationName == "api.order.submit"),再按 _samplingRatio 返回的动态值(可基于 QPS、错误率等上下文计算)决定是否标记为 Recorded。避免后期丢弃,降低运行时开销。

配置策略对比

场景 过滤条件示例 采样率函数逻辑
故障诊断期 activity.Tags.Any(t => t.Key == "error") 恒为 1.0
流量高峰降载 activity.Duration > TimeSpan.FromMilliseconds(500) (1 - loadFactor) * 0.3

数据同步机制

graph TD
    A[Activity.Start] --> B{满足过滤条件?}
    B -->|否| C[跳过]
    B -->|是| D[计算实时采样率]
    D --> E{随机数 ≤ 采样率?}
    E -->|否| C
    E -->|是| F[设置 Recorded 标志]

2.5 生产环境Zap配置模板与可观测性对齐(OpenTelemetry集成)

为实现日志语义与分布式追踪上下文一致,Zap需通过opentelemetry-go-contrib/instrumentation/go.uber.org/zap/otelzap桥接器注入trace ID与span ID。

日志字段标准化映射

  • trace_idspan_id 自动注入(需启用WithCaller(true)增强可追溯性)
  • service.nameenv 作为静态字段注入,对齐OpenTelemetry资源语义

OpenTelemetry上下文注入示例

import (
  "go.uber.org/zap"
  "go.opentelemetry.io/otel"
  "go.opentelemetry.io/otel/trace"
  otelzap "go.opentelemetry.io/otel/instrumentation/go.uber.org/zap"
)

func newProductionLogger() *zap.Logger {
  tracer := otel.Tracer("app")
  return zap.New(
    otelzap.NewCore(zap.NewJSONEncoder(zap.WithTimeFormat(time.RFC3339)), 
      zapcore.Lock(os.Stdout), 
      zapcore.InfoLevel),
    zap.AddCaller(),
    zap.WrapCore(func(core zapcore.Core) zapcore.Core {
      return otelzap.NewCore(core, tracer, otelzap.WithTraceID(), otelzap.WithSpanID())
    }),
  )
}

该配置确保每条日志自动携带当前context.Context中的trace.SpanContextWithTraceID()启用trace_id字段注入,WithSpanID()注入span_id,避免手动logger.With(zap.String("trace_id", ...))导致的语义割裂。

关键字段对齐表

Zap 字段 OTel 资源属性 说明
service.name service.name 必须与OTel SDK中设置一致
env deployment.environment 支持prod/staging分级
graph TD
  A[HTTP Handler] --> B[Start Span]
  B --> C[Zap Logger with Context]
  C --> D[Log Entry with trace_id/span_id]
  D --> E[OTel Collector]
  E --> F[Jaeger/Tempo/Loki]

第三章:无锁RingBuffer设计哲学与内存安全实现

3.1 原子CAS+内存序语义在环形缓冲区中的精准应用

环形缓冲区(Ring Buffer)在高并发生产者-消费者场景中依赖无锁设计,其核心在于生产者/消费者指针的原子更新内存可见性保障

数据同步机制

使用 std::atomic<int> 管理 head(消费者位)和 tail(生产者位),配合 memory_order_acquire / memory_order_release 构建同步点:

// 生产者提交:先写数据,再更新 tail
buffer[tail.load(std::memory_order_relaxed) & mask] = item;
int prev = tail.fetch_add(1, std::memory_order_acq_rel); // acq_rel 保证写入对消费者可见

逻辑分析fetch_addacq_rel 语义确保:① 此前所有数据写入不被重排到该操作之后(release);② 此后读取 head 时能观察到最新值(acquire)。relaxed 加载 tail 仅用于计算索引,无同步需求。

内存序选择对照表

操作位置 推荐 memory_order 原因说明
生产者写数据后 acq_rel 同步数据写入与 tail 更新
消费者读 head acquire 确保看到最新 tail 及对应数据

关键约束

  • 环大小必须为 2 的幂(支持位掩码快速取模)
  • headtail 差值 ≤ 缓冲区容量(需 CAS 循环校验)
graph TD
    A[生产者写入数据] --> B[acq_rel 更新 tail]
    B --> C[消费者 acquire 读 head]
    C --> D[acquire 读数据]

3.2 Go内存模型约束下的无锁队列边界处理与ABA问题防御

数据同步机制

Go的sync/atomic包提供Load, Store, CompareAndSwap等原子操作,但其语义受内存模型限制:非顺序一致性——仅保证单个原子操作的可见性,不隐式建立happens-before关系。需显式使用atomic.LoadAcq/atomic.StoreRelunsafe.Pointer配合runtime.KeepAlive防止编译器重排序。

ABA问题本质

当节点A被弹出→回收→重新入队为新节点(地址复用),CAS误判“值未变”而成功,破坏逻辑正确性。典型于链表型无锁队列:

// 伪代码:危险的CAS判等
if atomic.CompareAndSwapPointer(&head, old, new) {
    // old可能已被释放并复用,new指向旧地址的新实例
}

逻辑分析CompareAndSwapPointer仅比较指针值,不校验版本或生命周期。参数old是裸地址,无引用计数或epoch信息,无法区分“同一地址的不同生命周期实例”。

防御方案对比

方案 原理 Go适配性
带版本号指针 uintptr高位存版本号 ✅ 需unsafe手动拆包
Hazard Pointer 线程注册临界指针避免回收 ⚠️ 运行时开销大
RCU(读多写少) 延迟回收+宽限期等待 ❌ Go GC不支持显式宽限期

实践建议

  • 优先采用带版本号的uintptr封装(如atomic.Value嵌套struct{ptr *Node; ver uint64});
  • 边界处理时,对nil头尾指针做atomic.LoadAcq确保读取最新状态;
  • 禁用free()调用,改用对象池(sync.Pool)规避地址复用。

3.3 预分配内存池与对象复用:避免GC抖动的生命周期管理

高频短生命周期对象(如网络请求上下文、日志事件)频繁创建/销毁会触发Young GC频次激增,引发STW抖动。预分配内存池通过对象复用切断GC压力源。

池化核心逻辑

public class ByteBufferPool {
    private final Queue<ByteBuffer> pool = new ConcurrentLinkedQueue<>();
    private final int capacity = 4096;

    public ByteBuffer acquire() {
        ByteBuffer buf = pool.poll(); // 复用已有缓冲区
        return buf != null ? buf.clear() : ByteBuffer.allocateDirect(capacity); // 避免堆内碎片
    }

    public void release(ByteBuffer buf) {
        if (buf.capacity() == capacity && pool.size() < 128) {
            pool.offer(buf.clear()); // 仅归还合规且未满的缓冲区
        }
    }
}

acquire()优先复用已清空的ByteBuffer,避免allocateDirect()调用;release()带容量与数量双校验,防止内存泄漏或池膨胀。

对比效果(10k次分配/释放)

方式 平均耗时 Young GC次数 内存分配量
原生new 8.2μs 14 41MB
预分配池复用 0.35μs 0 0.5MB
graph TD
    A[请求到达] --> B{池中是否有可用对象?}
    B -->|是| C[取出并reset]
    B -->|否| D[新建对象]
    C --> E[业务处理]
    D --> E
    E --> F[归还至池]
    F --> B

第四章:自研Logger工程落地与全链路压测验证

4.1 RingBuffer Logger接口契约设计与zap兼容层实现

RingBuffer Logger 的核心契约聚焦于无锁写入容量感知结构化日志语义保全。接口需抽象 Log(level, msg string, fields ...Field)Sync() error,同时暴露 Remaining() 供调用方实施背压。

接口契约关键约束

  • 所有字段必须序列化为 map[string]interface{} 或 zap’s zapcore.Field
  • Log() 调用不可阻塞,超容时返回 ErrRingFull(非 panic)
  • Sync() 仅刷出已提交条目,不保证全局持久化顺序

zap 兼容层实现要点

type RingLogger struct {
    rb *ringbuffer.Buffer // 自定义无锁环形缓冲区
    enc *zapcore.JSONEncoder // 复用 zap 编码器,避免重复序列化逻辑
}

func (l *RingLogger) Info(msg string, fields ...zap.Field) {
    l.Log(zapcore.InfoLevel, msg, fields...)
}

此桥接将 zap.Field 直接转为内部 Field 结构体,复用 zap 的 MarshalLogObject 能力;rb.Write() 封装原子提交,失败时降级为 sync.Once 触发告警日志。

能力 RingBuffer 实现 zap.Core 原生
并发安全写入 ✅(CAS + tail 指针)
字段延迟求值 ❌(预编码) ✅(Field 闭包)
Sync() 可控粒度 ✅(按 batch 刷盘) ✅(WriteSyncer
graph TD
    A[App Log Call] --> B{RingBuffer Full?}
    B -->|Yes| C[Return ErrRingFull]
    B -->|No| D[Encode → Buffer Slot]
    D --> E[Advance Tail]
    E --> F[Sync: Flush Committed]

4.2 多生产者单消费者(MPSC)场景下的批处理与背压控制

在高吞吐MPSC队列中,批处理可显著降低CAS竞争开销,而背压机制防止消费者被淹没。

批处理策略设计

生产者将多个元素攒成批次写入环形缓冲区,减少原子操作频次:

// 批量提交:尝试获取连续n个空槽位
let batch_size = self.claim_slots(8); // 返回实际可用槽数(0~8)
if batch_size > 0 {
    for i in 0..batch_size {
        buffer[(head + i) % CAPACITY].store(data[i], Relaxed);
    }
    self.publish_batch(head, batch_size); // 原子更新tail
}

claim_slots()采用乐观重试+指数退避,publish_batch()通过单次fetch_add提交偏移,避免每元素一次CAS。

背压控制机制

消费者通过水位线动态反馈压力:

水位阈值 行为
生产者全速写入
30%–70% 启用微延迟(100ns抖动)
>70% 拒绝新批次,返回Backpressure
graph TD
    A[生产者写入] --> B{缓冲区水位}
    B -->|≤70%| C[接受批次]
    B -->|>70%| D[返回Backpressure]
    D --> E[生产者暂停并轮询]

4.3 基于pprof+trace的吞吐归因分析:从12k→70k QPS的关键路径优化

发现瓶颈:火焰图揭示锁竞争热点

通过 go tool pprof -http=:8080 cpu.pprof 分析,发现 sync.RWMutex.RLock 占用 68% CPU 时间,集中于用户会话缓存读取路径。

深度追踪:HTTP trace 定位序列化开销

启用 net/http/httptest + runtime/trace 后,发现 json.Marshal 平均耗时 1.2ms/请求(占端到端延迟 41%),且存在重复序列化。

优化方案:零拷贝响应与读写分离

// 优化前:每次请求都全量序列化
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(user)

// 优化后:预序列化 + sync.Pool 复用 encoder
var jsonBuf = sync.Pool{New: func() any { return new(bytes.Buffer) }}
buf := jsonBuf.Get().(*bytes.Buffer)
buf.Reset()
enc := json.NewEncoder(buf)
enc.Encode(user) // 避免 interface{} 反射开销
w.Write(buf.Bytes())
jsonBuf.Put(buf)

逻辑说明:sync.Pool 复用 bytes.Buffer 减少 GC 压力;json.Encoder 复用避免 reflect.Value 初始化开销;w.Write() 直接输出字节流,绕过 http.ResponseWriter 的额外包装。实测单请求序列化耗时降至 0.13ms。

效果对比

指标 优化前 优化后 提升
P99 延迟 86ms 12ms 7.2×
QPS 12,000 70,000 5.8×
graph TD
    A[HTTP 请求] --> B[路由分发]
    B --> C[缓存读取 RLock]
    C --> D[JSON 序列化]
    D --> E[WriteHeader+Write]
    C -.-> F[改用 RWMutex + 读写分离]
    D -.-> G[预序列化 + Pool 复用]
    F --> H[QPS ↑ 3.2×]
    G --> I[QPS ↑ 2.6×]

4.4 混沌工程验证:OOM、CPU打满、磁盘满载下的日志保活策略

面对资源极端耗尽场景,日志系统必须“断而不亡”——在OOM、CPU 100%、磁盘100%满载时仍保障关键日志不丢失、可回溯。

日志分级熔断机制

  • P0(核心链路):同步刷盘 + 内存环形缓冲区(512KB)
  • P1(业务指标):异步批量压缩写入,失败降级为本地内存暂存
  • P2(调试日志):自动禁用,触发LogRateLimiter动态关闭

磁盘满载自保护代码示例

// 基于可用inode与block双阈值的硬性拦截
public boolean canWrite() {
    FileStore store = Files.getFileStore(Paths.get(logDir));
    long usable = store.getUsableSpace();     // 实际可用字节
    long total = store.getTotalSpace();
    long inodesUsable = store.getAvailableByteCount(); // inode余量
    return usable > 100 * MB && inodesUsable > 10_000;
}

逻辑分析:避免仅依赖df -h易受缓存影响的Available字段;100MB + 10k inode为最小安全水位,防止小文件写入导致inode耗尽却仍有空间的假象。

关键参数对照表

场景 触发阈值 行为 恢复条件
OOM JVM heap > 95% 切换至/dev/shm内存日志 GC后heap
CPU 100% loadavg > 8×CPU 限流采样率降至1% loadavg
磁盘满载 可用空间 启用只读模式+告警上报 空间释放 > 500MB
graph TD
    A[混沌注入] --> B{资源状态检测}
    B -->|OOM| C[启用shm日志缓冲]
    B -->|CPU过载| D[动态采样降频]
    B -->|磁盘满| E[冻结写入+告警]
    C & D & E --> F[日志保活完成]

第五章:未来日志基础设施的演进思考

多模态日志融合架构的生产实践

在某头部电商中台系统中,团队将 OpenTelemetry Collector 作为统一采集层,同时接入结构化业务日志(JSON over HTTP)、指标型日志(Prometheus Exporter 模式)、链路追踪 Span 日志(Jaeger Thrift 协议)及容器运行时审计日志(CRI-O log stream)。通过自定义 Processor 插件实现字段对齐:将 trace_idservice_namehttp.status_code 等关键维度标准化注入所有日志流。该架构上线后,跨组件故障定位平均耗时从 17 分钟压缩至 2.3 分钟。

边缘侧轻量日志自治能力

某智能工厂部署超 8000 台边缘网关设备(ARM64 + OpenWrt),传统中心化日志方案因网络抖动导致日志丢失率达 34%。团队采用 Loki 的 promtail-static 裁剪版(二进制仅 4.2MB),配合本地 WAL(Write-Ahead Log)持久化与断网续传机制。每个网关内置日志缓存策略:内存队列 ≤ 512KB,磁盘缓存 ≤ 200MB,按时间窗口滚动压缩(zstd 算法)。实测在 48 小时离线场景下,日志完整率达 99.98%。

基于 eBPF 的零侵入内核日志增强

# 在 Kubernetes Node 上启用 socket trace 日志增强
kubectl apply -f - <<'EOF'
apiVersion: cilium.io/v2
kind: CiliumClusterwideNetworkPolicy
metadata:
  name: log-socket-events
spec:
  endpointSelector: {}
  ingress:
  - fromEndpoints:
    - matchLabels: {k8s:io.kubernetes.pod.namespace: "production"}
    toPorts:
    - ports:
      - port: "8080"
        protocol: TCP
      rules:
        l7:
        - http:
            method: "POST"
            path: "/api/v1/order"
EOF

该策略在不修改任何应用代码前提下,捕获到 3 类异常模式:HTTP 请求体超限(>16MB)、TLS 握手失败前的 SYN Flood 特征、以及 gRPC 流复用异常中断。日志自动关联至对应 Pod 的 /var/log/app.log,形成上下文闭环。

日志语义压缩与向量化检索

压缩技术 原始日志体积 压缩后体积 检索延迟(P99) 支持字段类型
LZ4 100 TB 32 TB 850 ms 全字段
Delta Encoding + Dictionary 100 TB 11 TB 210 ms 数值/枚举/状态码
BERT 微调向量索引 100 TB 4.7 TB 142 ms 错误描述、堆栈摘要

某金融风控平台基于 HuggingFace Transformers 微调 bert-base-chinese,将 error_message 编码为 768 维向量,使用 FAISS 构建 IVF-PQ 索引。当运维输入“交易重复提交但幂等校验未触发”,系统 137ms 内召回 12 条匹配日志,准确率较关键词检索提升 6.2 倍。

隐私合规驱动的日志动态脱敏流水线

某医疗 SaaS 平台需满足 HIPAA 与 GDPR 双合规。日志管道集成 Apache NiFi 的 EncryptContentReplaceText 处理器,依据日志中的 pii_type 标签(如 patient_id, diagnosis_code)实时执行差异化策略:身份证号采用 AES-GCM 加密并替换为哈希索引;诊断文本经医学本体映射(UMLS SNOMED CT)泛化为三级分类编码;IP 地址执行 GeoHash 模糊化(精度控制在城市级)。该流水线日均处理 2.4TB 日志,脱敏延迟稳定在 89ms 内。

异构存储分层的生命周期治理

![日志生命周期治理流程图](https://mermaid.ink/svg/pako:eNqNkk1v2zAMhv-K0NMhDZw0aLc99bCHHrYdSgEjyI6T2KpsRZJXbQf576MkO02GYYe92Xz48UuS7xN7l9mKtVJqV6p1nX2u8135Wt5X5Uv5Wm7LbfnxvVzVH9vq6_3j7evb5u3t9vXl9eXl7fX99e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e397f3t_e

记录分布式系统搭建过程,从零到一,步步为营。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注