外观
时序、天气与季节
天空不是一成不变的背景板——它会下雨、起雾、打雷,四季会让白昼变长或缩短,温度会让水面结冰又融化。理解这套动态天气与季节系统,你将能预判危险、规划农耕周期、在暴风雪中提前找到庇护所。
整理来源
本页参考根目录英文 Wiki 归档中的 Weather.md、Seasons.md,并用当前源码的 SubsystemWeather、SubsystemSeasons、WorldSettings 和中文语言文件复核。英文 Wiki 中无法由源码确认的旧版本数值与存档修改技巧没有搬入正文。
时间基础
在讨论天气和季节之前,你需要先理解游戏内的时间单位——这是所有周期性现象的基础节拍器。
游戏内时间换算
游戏引擎将一天定义为 1200 个游戏时间单位。在默认时间倍率下,1 游戏时间单位 ≈ 1 现实秒,因此:
| 概念 | 游戏内时长 | 现实时长 |
|---|---|---|
| 一天 | 1200 时间单位 | 20 分钟 |
| 一年 | 24 天 | 8 小时 |
| 一个季节 | 6 天 | 2 小时 |
| 一季节内阶段 | 2 天 | 40 分钟 |
注意:1200 是引擎内部的"一天的周期总量",它是一个周期数值而非游戏内显示的秒数。引擎通过
TimeOfDay = Day mod 1(即当前天数的余数部分)来计算一天中的时刻(0~1),再根据该数值划分黎明、白天、黄昏、黑夜四个区间。游戏内时钟界面的"16小时制"是面向玩家的显示换算,与引擎底层的 1200 周期数值是两套系统,不应混用。
其中:年天数是玩家在创建世界时可调的参数(默认24),数值越大则季节更替越缓慢。
昼夜阶段
一天被划分为四个阶段:
| 阶段 | 含义 |
|---|---|
| 黎明 Dawn | 天刚亮,光线逐渐变强 |
| 白天 Day | 完全天亮,太阳高照 |
| 黄昏 Dusk | 太阳下山,光线逐渐变暗 |
| 黑夜 Night | 完全天黑,需光源照明 |
季节系统
四季不仅改变景色,更深刻影响着温度、降水频率、昼夜长短和生存难度。掌握季节规律是中长期生存规划的必修课。
四季划分
季节机制将一年( T 0~1)均分为四等份:
其中:T为当前年份进度(0=年初夏开始,0.5=初冬,1=回到年初夏)。默认情况下每个季节持续6游戏天。
季节温度修正
季节对温度的修正机制将一年中的时间点映射为温度修正值,呈对称的"V"形:
其中:曲线为分段线性插值曲线;T为当前年份进度。关键节点如下:
| 季节阶段 | 温度修正 | 通俗解释 |
|---|---|---|
| 盛夏 | 0 | 无修正,最温暖 |
| 初秋 | 0 | 气温尚未明显下降 |
| 中秋 | -4 | 开始变冷 |
| 初冬 | -12 | 明显寒冷 |
| 隆冬 | -24 | 全年最冷,温度暴跌 |
| 初春 | -12 | 仍较寒冷 |
| 仲春 | -4 | 开始回暖 |
隆冬时节温度修正为-24,这意味着一个原本温度10的温带区域,在冬季会变成10-24=-14,远低于冰点,整片区域会被冰雪覆盖。而同一区域在夏季温度是10,完全不会结冰。季节让世界的面貌在一年内发生剧变。
季节对昼夜长短的影响
昼长不是固定的——夏季白天长,冬季白天短。以下是计算昼长的公式:
lerp(a, b, t):线性插值。t=0 时结果=a,t=1 时结果=b,t=0.5 时取中间值。相当于"按比例混合两个数"。
cos(x):余弦函数,使昼长随季节呈平滑的波浪形变化,夏季最大、冬季最小。
其中:距夏至偏移为当前时间与夏至中点的差距(0=夏至,0.5=冬至)。默认一天20分钟,各阶段时长如下:
| 季节 | 昼长占比 | 白天时长 | 黑夜时长 |
|---|---|---|---|
| 夏季 | ~40% | ~8 分钟 | ~4 分钟 |
| 春秋 | ~30% | ~6 分钟 | ~6 分钟 |
| 冬季 | ~20% | ~4 分钟 | ~8 分钟 |
冬季黑夜长达8分钟,意味着你在黑暗中活动的时间翻倍,光源和庇护所的重要性急剧上升。夏季则有更多时间进行户外采集和建造。
降水系统
雨和雪不只是视觉效果——它们会改变方块状态、影响能见度、触发闪电。理解降水规律,你就能在暴雨来临前回到屋内。
降水类型判定
每个位置的降水类型根据当地有效温度和湿度决定:
其中:有效温度 = 基础温度 + 季节修正 + 海拔修正;温度和湿度为当地季节温湿度值(0~15)。
注意:即使在热带,只要海拔足够高(有效温度≤0),降水就会变成雪。反之,地下深处永远温暖,不会下雪。
季节对降水的影响
UpdatePrecipitation 方法按季节设定不同的降水频率和闪电概率:
| 季节 | 降水间隔倍率 | 闪电强度倍率 | 闪电出现概率 |
|---|---|---|---|
| 夏季 | 1.0 | 1.0 | 50% |
| 秋季 | 1.5 | 1.0 | 50% |
| 冬季 | 1.0 | 0 | 0% |
| 春季 | 1.5 | 2.0 | 100% |
其中:降水间隔倍率越大则两次降水之间等待越久;闪电强度倍率决定闪电的频繁程度;闪电出现概率表示一场降水是否伴随闪电。
春季是全年雷雨最频繁的季节——闪电强度倍率高达2,且100%出现。冬季从不下闪电(强度倍率为0),因为暴雪不具备闪电条件。
降水周期
每次降水事件持续约3~6游戏分钟,间隔因季节而异:
random(a, b):游戏引擎中的随机数函数(对应源码
m_random.Float(a, b)),返回 a 到 b 之间的随机浮点数,每次调用结果不同。本文后续所有random均指此类随机数函数
random.Float(a,b)返回区间内随机浮点数。random.Int(a,b)返回区间内随机整数。random.Bool(p)以概率 p(0~1)返回 true/false。
其中:季节倍率见上表(夏季/冬季为1.0,春/秋为1.5)。
| 参数 | 值 |
|---|---|
| 单次降水时长 | 3~6 分钟 |
| 两次降水间隔(夏/冬) | 5~45 分钟 |
| 两次降水间隔(春/秋) | 3.3~30 分钟 |
| 降水淡入/淡出 | 10~30 秒 |
困难模式下,首次降水来得更快(出生0~2分钟后),且闪电更强。
闪电系统
春季的雷暴不只是吓人——闪电真的会劈中地面,引发火灾。了解闪电触发条件,你就能评估在户外活动的风险。
闪电触发条件
UpdateLightning 方法控制闪电生成:
闪电触发需同时满足两个条件:
其中:降水强度为当前降水的最大强度(0~1,满强度为1);m_闪电为闪电强度参数,由季节和难度决定(春季可达2.0,夏季/秋季约0.33~0.66,冬季为0)。每秒对每个已加载区块执行一次判定。
闪电只在降水达到满强度时才会触发。每秒每个已加载区块有约 0.02%~0.04% 的概率被闪电击中,春季翻倍。闪电会劈向该区域内最高的方块。
人工触发
玩家可以通过某些模组或编辑器功能手动召唤闪电,会在前方32格范围内的最高点生成。
雾系统
浓雾会大幅降低能见度,让导航和寻路变得困难。雾在秋冬更常见,且往往持续更久。
雾的周期
UpdateFog 方法控制雾的生成:
其中:雾间隔倍率秋冬更高意味着雾更频繁;random为范围内的随机值。默认参数下:
| 季节 | 雾间隔 | 雾持续时间 |
|---|---|---|
| 夏/春 | 10~40 分钟 | 4~7 分钟 |
| 秋/冬 | 6~23 分钟 | 7~12 分钟 |
秋冬季节不仅雾更频繁,单次持续时间也更长。雾的淡入/淡出需要20~40秒,不会突然出现。
冰雪与地形互动
天气不只是天空中的景象——它会真实地改变你脚下的方块。水会结冰,地面会积雪,温度回升后它们又会消失。
冰冻与融化
FreezeThawAndDepositSnow 方法在每个区块加载和扫描时执行:
random.Bool(p) 以概率 p 返回 true(即"掷骰子",p 越大越容易触发);冻结概率和融化概率由调用时机决定(区块首次加载时为1.0即必定触发,后续周期扫描时为0.66即约三分之二概率触发)。
下雪时的地形变化
| 条件 | 变化 |
|---|---|
| 水面(距海岸>35格) | 结冰 → 冰块(62) |
| 可支撑雪的方块上方 | 覆盖一层雪(61) |
| 可被雪替换的方块 | 替换为雪(61) |
融化时的地形变化
| 条件 | 变化 |
|---|---|
| 雪方块(61) | 消失(DestroyCell) |
| 冰块(62) | 消失(DestroyCell,不触发掉落) |
冰雪变化只在"生态环境行为模式"为 Living 时生效。如果关闭了天气效果,新生成的区块不会积雪,但已有冰雪不会自动融化。
世界设置参数
在创建世界时,你可以调整以下参数来定制天气与季节体验。
| 参数 | 默认值 | 作用 |
|---|---|---|
| 季节变化 | 开启 | 关闭后季节永远停留在当前状态 |
| 年天数 | 24 | 一年有多少游戏天,越大则季节更替越慢 |
| 天气效果 | 开启 | 关闭后无降水、无雾、无闪电、无冰雪变化 |
| 时间流逝 | 变化 | 可选固定白天/黑夜/日出/日落,或正常循环 |
| 出生点难度 | 简单 | 困难模式下首次降水来得更快、闪电更强 |
其中:年天数直接控制季节更替速度。设为48则一个季节持续12天(现实4小时),节奏更舒缓;设为12则一个季节仅3天(现实1小时),节奏更紧凑。
写给开发者
如果你计划开发天气模组或自定义环境行为,以下技术细节将帮助你快速理解系统架构。
资料暂存
本小节内容暂时存放于此,后续会移动至"MOD开发"章节。
开发者指南
核心文件索引
| 文件 | 职责 |
|---|---|
SubsystemWeather.cs | 天气系统主类:降水、闪电、雾、雨雪粒子、地形冰冻/融化 |
SubsystemSeasons.cs | 季节划分与 TimeOfYear → Season 转换 |
SubsystemTimeOfDay.cs | 昼夜循环与季节对昼长的影响 |
SubsystemTime.cs | 游戏时间流逝、睡眠加速、暂停菜单减速 |
WorldSettings.cs | 世界参数定义(年天数、天气开关、季节开关) |
TerrainUpdater.cs | 季节温度曲线(TemperatureCurve)定义 |
降水系统完整逻辑
csharp
// UpdatePrecipitation 核心逻辑(简化)
if (当前时间 > 降水结束时间) {
switch (季节) {
case 夏季: num=1f; num2=1f; probability=0.5f; break;
case 秋季: num=1.5f; num2=1f; probability=0.5f; break;
case 冬季: num=1f; num2=0f; probability=0f; break;
case 春季: num=1.5f; num2=2f; probability=1f; break;
}
// 首次降水(endTime==0)与后续降水的间隔不同
// 困难模式首次等待更短
m_precipitationStartTime = 当前时间 + 60f * random(5f, 45f) / num;
m_precipitationEndTime = m_precipitationStartTime + 60f * random(3f, 6f);
m_lightningIntensity = random.Bool(probability)
? Saturate(random.Float(0.33f, 1f) * num2) : 0f;
}
// 降水强度淡入淡出
if (IsPrecipitationStarted) {
PrecipitationIntensity += dt / m_precipitationRampTime;
} else {
PrecipitationIntensity -= dt / m_precipitationRampTime;
}
PrecipitationIntensity = Saturate(PrecipitationIntensity);闪电触发完整逻辑
csharp
// UpdateLightning 核心逻辑
if (PrecipitationIntensity != 1f) return;
if (!PeriodicGameTimeEvent(1.0, 0.0)) return; // 每秒检查一次
TerrainChunk chunk = 随机选择一个已加载区块;
if (!random.Bool(m_lightningIntensity * 0.0002f)) return;
// 在 16x16 区域内找最高点
Vector3? target = null;
for (int x = num-8; x < num+8; x++) {
for (int z = num2-8; z < num2+8; z++) {
int top = terrain.GetTopHeight(x, z);
if (!target.HasValue || top > target.Value.Y) {
target = new Vector3(x, top, z);
}
}
}
if (target.HasValue) {
SubsystemSky.MakeLightningStrike(target.Value, false);
}昼夜阶段计算
csharp
// UpdateStarts 核心逻辑
float num = Midpoint(SummerStart, AutumnStart); // 夏至中点
float num2 = Remainder(TimeOfYear - num, 1f); // 距夏至偏移
float dayLength = Lerp(0.2f, 0.4f, 0.5f + 0.5f * Cos(2π * num2));
float duskDawnTotal = 0.4f;
float nightLength = (1f - (dayLength + duskDawnTotal)) / 2f;
DayStart = 0.3f;
DawnStart = Add(DayStart, -nightLength); // 黎明开始
DuskStart = Add(DayStart, dayLength); // 黄昏开始
NightStart = Add(DuskStart, nightLength); // 黑夜开始温度传递链
csharp
// 从季节到冰冻判定的完整链路
WorldSettings.TimeOfYear (0~1)
→ SubsystemSeasons.TimeOfYearToSeason() → Season + TimeOfSeason
→ TerrainUpdater.TemperatureCurve.Sample(TimeOfYear) → SeasonTemperature
→ Terrain.SeasonTemperature = value
→ Terrain.GetSeasonalTemperature(x, z) = GetTemperature(x, z) + SeasonTemperature
→ SubsystemWeather.GetPrecipitationShaftInfo(x, z)
→ IsPlaceFrozen(seasonalTemp, topHeight)
→ temperature + GetTemperatureAdjustmentAtHeight(y) <= 0
→ 决定降水类型(雪/雨/无)降水类型判定完整逻辑
csharp
// GetPrecipitationShaftInfo
int seasonalTemp = terrain.GetSeasonalTemperature(shaftValue);
int topHeight = Terrain.ExtractTopHeight(shaftValue);
if (IsPlaceFrozen(seasonalTemp, topHeight)) {
return { Type=Snow, Intensity=PrecipitationIntensity };
}
int seasonalHumidity = terrain.GetSeasonalHumidity(shaftValue);
if (seasonalTemp <= 8 || seasonalHumidity >= 8) {
return { Type=Rain, Intensity=PrecipitationIntensity };
}
return { Type=Rain, Intensity=0f }; // 无降水英文 Wiki 原条目
IyDml7bluo/jgIHlpKnmsJTkuI7lraPoioIKCj4g5aSp56m65LiN5piv5LiA5oiQ5LiN5Y+Y55qE6IOM5pmv5p2/4oCU4oCU5a6D5Lya5LiL6Zuo44CB6LW36Zu+44CB5omT6Zu377yM5Zub5a2j5Lya6K6p55m95pi85Y+Y6ZW/5oiW57yp55+t77yM5rip5bqm5Lya6K6p5rC06Z2i57uT5Yaw5Y+I6J6N5YyW44CC55CG6Kej6L+Z5aWX5Yqo5oCB5aSp5rCU5LiO5a2j6IqC57O757uf77yM5L2g5bCG6IO96aKE5Yik5Y2x6Zmp44CB6KeE5YiS5Yac6ICV5ZGo5pyf44CB5Zyo5pq06aOO6Zuq5Lit5o+Q5YmN5om+5Yiw5bqH5oqk5omA44CCCgo6OjogaW5mbyDmlbTnkIbmnaXmupAK5pys6aG15Y+C6ICD5qC555uu5b2V6Iux5paHIFdpa2kg5b2S5qGj5Lit55qEIGBXZWF0aGVyLm1kYOOAgWBTZWFzb25zLm1kYO+8jOW5tueUqOW9k+WJjea6kOeggeeahCBgU3Vic3lzdGVtV2VhdGhlcmDjgIFgU3Vic3lzdGVtU2Vhc29uc2DjgIFgV29ybGRTZXR0aW5nc2Ag5ZKM5Lit5paH6K+t6KiA5paH5Lu25aSN5qC444CC6Iux5paHIFdpa2kg5Lit5peg5rOV55Sx5rqQ56CB56Gu6K6k55qE5pen54mI5pys5pWw5YC85LiO5a2Y5qGj5L+u5pS55oqA5ben5rKh5pyJ5pCs5YWl5q2j5paH44CCCjo6OgoKIyMg5pe26Ze05Z+656GACgo+IOWcqOiuqOiuuuWkqeawlOWSjOWto+iKguS5i+WJje+8jOS9oOmcgOimgeWFiOeQhuino+a4uOaIj+WGheeahOaXtumXtOWNleS9jeKAlOKAlOi/meaYr+aJgOacieWRqOacn+aAp+eOsOixoeeahOWfuuehgOiKguaLjeWZqOOAggoKIyMjIOa4uOaIj+WGheaXtumXtOaNoueulwoK5ri45oiP5byV5pOO5bCG5LiA5aSp5a6a5LmJ5Li6ICoqMTIwMCDkuKrmuLjmiI/ml7bpl7TljZXkvY0qKuOAguWcqOm7mOiupOaXtumXtOWAjeeOh+S4i++8jDEg5ri45oiP5pe26Ze05Y2V5L2NIOKJiCAxIOeOsOWunuenku+8jOWboOatpO+8mgoKJCQKXHRleHR75LiA5aSpfSA9IDEyMDBcIFx0ZXh0e+a4uOaIj+aXtumXtOWNleS9jX0gXGFwcHJveCAyMFwgXHRleHR7546w5a6e5YiG6ZKffQokJAoKJCQKXHRleHR75LiA5bm0fSA9IFx0ZXh0e+W5tOWkqeaVsH0gXHRpbWVzIDEyMDBcIFx0ZXh0e+a4uOaIj+aXtumXtOWNleS9jX3vvIxccXVhZCBcdGV4dHvpu5jorqTlubTlpKnmlbB9PTI0CiQkCgokJApcdGV4dHvkuIDkuKrlraPoioJ9ID0gXGZyYWN7XHRleHR75LiA5bm0fX17NH0gPSA2XCBcdGV4dHvlpKl9CiQkCgp8IOamguW/tSB8IOa4uOaIj+WGheaXtumVvyB8IOeOsOWunuaXtumVvyB8CnwtLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwKfCAqKuS4gOWkqSoqIHwgMTIwMCDml7bpl7TljZXkvY0gfCAyMCDliIbpkp8gfAp8ICoq5LiA5bm0KiogfCAyNCDlpKkgfCA4IOWwj+aXtiB8CnwgKirkuIDkuKrlraPoioIqKiB8IDYg5aSpIHwgMiDlsI/ml7YgfAp8ICoq5LiA5a2j6IqC5YaF6Zi25q61KiogfCAyIOWkqSB8IDQwIOWIhumSnyB8Cgo+ICoq5rOo5oSPKirvvJoxMjAwIOaYr+W8leaTjuWGhemDqOeahCLkuIDlpKnnmoTlkajmnJ/mgLvph48i77yM5a6D5piv5LiA5Liq5ZGo5pyf5pWw5YC86ICM6Z2e5ri45oiP5YaF5pi+56S655qE56eS5pWw44CC5byV5pOO6YCa6L+HIGBUaW1lT2ZEYXkgPSBEYXkgbW9kIDFg77yI5Y2z5b2T5YmN5aSp5pWw55qE5L2Z5pWw6YOo5YiG77yJ5p2l6K6h566X5LiA5aSp5Lit55qE5pe25Yi777yIMH4x77yJ77yM5YaN5qC55o2u6K+l5pWw5YC85YiS5YiG6buO5piO44CB55m95aSp44CB6buE5piP44CB6buR5aSc5Zub5Liq5Yy66Ze044CC5ri45oiP5YaF5pe26ZKf55WM6Z2i55qEIjE25bCP5pe25Yi2IuaYr+mdouWQkeeOqeWutueahOaYvuekuuaNoueul++8jOS4juW8leaTjuW6leWxgueahCAxMjAwIOWRqOacn+aVsOWAvOaYr+S4pOWll+ezu+e7n++8jOS4jeW6lOa3t+eUqOOAggoK5YW25Lit77yaKirlubTlpKnmlbAqKuaYr+eOqeWutuWcqOWIm+W7uuS4lueVjOaXtuWPr+iwg+eahOWPguaVsO+8iOm7mOiupDI077yJ77yM5pWw5YC86LaK5aSn5YiZ5a2j6IqC5pu05pu/6LaK57yT5oWi44CCCgojIyMg5pi85aSc6Zi25q61CgrkuIDlpKnooqvliJLliIbkuLrlm5vkuKrpmLbmrrXvvJoKCnwg6Zi25q61IHwg5ZCr5LmJIHwKfC0tLS0tLXwtLS0tLS18CnwgKirpu47mmI4qKiBEYXduIHwg5aSp5Yia5Lqu77yM5YWJ57q/6YCQ5riQ5Y+Y5by6IHwKfCAqKueZveWkqSoqIERheSB8IOWujOWFqOWkqeS6ru+8jOWkqumYs+mrmOeFpyB8CnwgKirpu4TmmI8qKiBEdXNrIHwg5aSq6Ziz5LiL5bGx77yM5YWJ57q/6YCQ5riQ5Y+Y5pqXIHwKfCAqKum7keWknCoqIE5pZ2h0IHwg5a6M5YWo5aSp6buR77yM6ZyA5YWJ5rqQ54Wn5piOIHwKCiMjIOWto+iKguezu+e7nwoKPiDlm5vlraPkuI3ku4XmlLnlj5jmma/oibLvvIzmm7Tmt7HliLvlvbHlk43nnYDmuKnluqbjgIHpmY3msLTpopHnjofjgIHmmLzlpJzplb/nn63lkoznlJ/lrZjpmr7luqbjgILmjozmj6HlraPoioLop4TlvovmmK/kuK3plb/mnJ/nlJ/lrZjop4TliJLnmoTlv4Xkv67or77jgIIKCiMjIyDlm5vlraPliJLliIYKCuWto+iKguacuuWItuWwhuS4gOW5tO+8iCBUIDBcfjHvvInlnYfliIbkuLrlm5vnrYnku73vvJoKCiQkClx0ZXh0e+Wto+iKgn0gPSBcYmVnaW57Y2FzZXN9IFx0ZXh0e+Wkj+Wto30gJiBcdGV4dHvoi6V9XCBcdGV4dHtUfSBcaW4gWzAuMDAsXCAwLjI1XSBcXCBcdGV4dHvnp4vlraN9ICYgXHRleHR76IulfVwgXHRleHR7VH0gXGluIFswLjI1LFwgMC41MF0gXFwgXHRleHR75Yas5a2jfSAmIFx0ZXh0e+iLpX1cIFx0ZXh0e1R9IFxpbiBbMC41MCxcIDAuNzVdIFxcIFx0ZXh0e+aYpeWto30gJiBcdGV4dHvoi6V9XCBcdGV4dHtUfSBcaW4gWzAuNzUsXCAxLjAwXSBcZW5ke2Nhc2VzfQokJAoK5YW25Lit77yaKipUKirkuLrlvZPliY3lubTku73ov5vluqbvvIgwPeW5tOWIneWkj+W8gOWni++8jDAuNT3liJ3lhqzvvIwxPeWbnuWIsOW5tOWIneWkj++8ieOAgum7mOiupOaDheWGteS4i+avj+S4quWto+iKguaMgee7rTbmuLjmiI/lpKnjgIIKCiMjIyDlraPoioLmuKnluqbkv67mraMKCuWto+iKguWvuea4qeW6pueahOS/ruato+acuuWItuWwhuS4gOW5tOS4reeahOaXtumXtOeCueaYoOWwhOS4uua4qeW6puS/ruato+WAvO+8jOWRiOWvueensOeahCJWIuW9ou+8mgoKJCQKXHRleHR75a2j6IqC5L+u5q2jfSA9IFx0ZXh0e+absue6v31cYmlnKFx0ZXh0e1R9XGJpZynvvIxccXVhZCBcdGV4dHtUfSBcaW4gWzAsXCAxXQokJAoK5YW25Lit77yaKirmm7Lnur8qKuS4uuWIhuautee6v+aAp+aPkuWAvOabsue6v++8myoqVCoq5Li65b2T5YmN5bm05Lu96L+b5bqm44CC5YWz6ZSu6IqC54K55aaC5LiL77yaCgp8IOWto+iKgumYtuautSB8IOa4qeW6puS/ruatoyB8IOmAmuS/l+ino+mHiiB8CnwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwKfCDnm5vlpI8gfCAwIHwg5peg5L+u5q2j77yM5pyA5rip5pqWIHwKfCDliJ3np4sgfCAwIHwg5rCU5rip5bCa5pyq5piO5pi+5LiL6ZmNIHwKfCDkuK3np4sgfCAtNCB8IOW8gOWni+WPmOWGtyB8Cnwg5Yid5YasIHwgLTEyIHwg5piO5pi+5a+S5Ya3IHwKfCAqKumahuWGrCoqIHwgKiotMjQqKiB8IOWFqOW5tOacgOWGt++8jOa4qeW6puaatOi3jCB8Cnwg5Yid5pilIHwgLTEyIHwg5LuN6L6D5a+S5Ya3IHwKfCDku7LmmKUgfCAtNCB8IOW8gOWni+WbnuaaliB8Cgo+IOmahuWGrOaXtuiKgua4qeW6puS/ruato+S4ui0yNO+8jOi/meaEj+WRs+edgOS4gOS4quWOn+acrOa4qeW6pjEw55qE5rip5bim5Yy65Z+f77yM5Zyo5Yas5a2j5Lya5Y+Y5oiQMTAtMjQ9LTE077yM6L+c5L2O5LqO5Yaw54K577yM5pW054mH5Yy65Z+f5Lya6KKr5Yaw6Zuq6KaG55uW44CC6ICM5ZCM5LiA5Yy65Z+f5Zyo5aSP5a2j5rip5bqm5pivMTDvvIzlrozlhajkuI3kvJrnu5PlhrDjgILlraPoioLorqnkuJbnlYznmoTpnaLosozlnKjkuIDlubTlhoXlj5HnlJ/liaflj5jjgIIKCiMjIyDlraPoioLlr7nmmLzlpJzplb/nn63nmoTlvbHlk40KCuaYvOmVv+S4jeaYr+WbuuWumueahOKAlOKAlOWkj+Wto+eZveWkqemVv++8jOWGrOWto+eZveWkqeefreOAguS7peS4i+aYr+iuoeeul+aYvOmVv+eahOWFrOW8j++8mgoKJCQKXHRleHR75pi86ZW/fSA9IFxtYXRocm17bGVycH1cYmlnKDAuMixcIDAuNCxcIDAuNSArIDAuNSBcdGltZXMgXGNvcygyXHBpIFx0aW1lcyBcdGV4dHvot53lpI/oh7PlgY/np7t9KVxiaWcpCiQkCgokJApcdGV4dHvpu47mmI4r6buE5piPfSA9IDAuNFwgXHRleHR777yI5Zu65a6a77yJfQokJAoKJCQKXHRleHR76buR5aScfSA9IFxmcmFjezEgLSBcdGV4dHvmmLzplb99IC0gMC40fXsyfQokJAoKPiAqKmxlcnAoYSwgYiwgdCkqKu+8mue6v+aAp+aPkuWAvOOAgnQ9MCDml7bnu5Pmnpw9Ye+8jHQ9MSDml7bnu5Pmnpw9Yu+8jHQ9MC41IOaXtuWPluS4remXtOWAvOOAguebuOW9k+S6jiLmjInmr5Tkvovmt7flkIjkuKTkuKrmlbAi44CCCj4KPiAqKmNvcyh4KSoq77ya5L2Z5bym5Ye95pWw77yM5L2/5pi86ZW/6ZqP5a2j6IqC5ZGI5bmz5ruR55qE5rOi5rWq5b2i5Y+Y5YyW77yM5aSP5a2j5pyA5aSn44CB5Yas5a2j5pyA5bCP44CCCgrlhbbkuK3vvJoqKui3neWkj+iHs+WBj+enuyoq5Li65b2T5YmN5pe26Ze05LiO5aSP6Iez5Lit54K555qE5beu6Led77yIMD3lpI/oh7PvvIwwLjU95Yas6Iez77yJ44CC6buY6K6k5LiA5aSpMjDliIbpkp/vvIzlkITpmLbmrrXml7bplb/lpoLkuIvvvJoKCnwg5a2j6IqCIHwg5pi86ZW/5Y2g5q+UIHwg55m95aSp5pe26ZW/IHwg6buR5aSc5pe26ZW/IHwKfC0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwKfCAqKuWkj+WtoyoqIHwgfjQwJSB8IH44IOWIhumSnyB8IH40IOWIhumSnyB8CnwgKirmmKXnp4sqKiB8IH4zMCUgfCB+NiDliIbpkp8gfCB+NiDliIbpkp8gfAp8ICoq5Yas5a2jKiogfCB+MjAlIHwgfjQg5YiG6ZKfIHwgfjgg5YiG6ZKfIHwKCj4g5Yas5a2j6buR5aSc6ZW/6L6+OOWIhumSn++8jOaEj+WRs+edgOS9oOWcqOm7keaal+S4rea0u+WKqOeahOaXtumXtOe/u+WAje+8jOWFiea6kOWSjOW6h+aKpOaJgOeahOmHjeimgeaAp+aApeWJp+S4iuWNh+OAguWkj+Wto+WImeacieabtOWkmuaXtumXtOi/m+ihjOaIt+WklumHh+mbhuWSjOW7uumAoOOAggoKIyMg6ZmN5rC057O757ufCgo+IOmbqOWSjOmbquS4jeWPquaYr+inhuinieaViOaenOKAlOKAlOWug+S7rOS8muaUueWPmOaWueWdl+eKtuaAgeOAgeW9seWTjeiDveingeW6puOAgeinpuWPkemXqueUteOAgueQhuino+mZjeawtOinhOW+i++8jOS9oOWwseiDveWcqOaatOmbqOadpeS4tOWJjeWbnuWIsOWxi+WGheOAggoKIyMjIOmZjeawtOexu+Wei+WIpOWumgoK5q+P5Liq5L2N572u55qE6ZmN5rC057G75Z6L5qC55o2u5b2T5Zyw5pyJ5pWI5rip5bqm5ZKM5rm/5bqm5Yaz5a6a77yaCgokJApcdGV4dHvpmY3msLTnsbvlnot9ID0gXGJlZ2lue2Nhc2VzfSBcdGV4dHvpm6p9ICYgXHRleHR76Iul6K+l5aSE5Ya757uT77yI5pyJ5pWI5rip5bqmfSBcbGUgMFx0ZXh0e++8iX0gXFwgXHRleHR76ZuofSAmIFx0ZXh0e+iLpea4qeW6pn0gXGxlIDhcIFx0ZXh0e+aIlua5v+W6pn0gXGdlIDggXFwgXHRleHR75pegfSAmIFx0ZXh0e+WFtuS7luaDheWGtX0gXGVuZHtjYXNlc30KJCQKCuWFtuS4re+8mioq5pyJ5pWI5rip5bqmKiogPSDln7rnoYDmuKnluqYgKyDlraPoioLkv67mraMgKyDmtbfmi5Tkv67mraPvvJsqKua4qeW6pioq5ZKMKirmub/luqYqKuS4uuW9k+WcsOWto+iKgua4qea5v+W6puWAvO+8iDBcfjE177yJ44CCCgo+IOazqOaEj++8muWNs+S9v+WcqOeDreW4pu+8jOWPquimgea1t+aLlOi2s+Wkn+mrmO+8iOacieaViOa4qeW6puKJpDDvvInvvIzpmY3msLTlsLHkvJrlj5jmiJDpm6rjgILlj43kuYvvvIzlnLDkuIvmt7HlpITmsLjov5zmuKnmmpbvvIzkuI3kvJrkuIvpm6rjgIIKCiMjIyDlraPoioLlr7npmY3msLTnmoTlvbHlk40KCmBVcGRhdGVQcmVjaXBpdGF0aW9uYCDmlrnms5XmjInlraPoioLorr7lrprkuI3lkIznmoTpmY3msLTpopHnjoflkozpl6rnlLXmpoLnjofvvJoKCnwg5a2j6IqCIHwg6ZmN5rC06Ze06ZqU5YCN546HIHwg6Zeq55S15by65bqm5YCN546HIHwg6Zeq55S15Ye6546w5qaC546HIHwKfC0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwKfCAqKuWkj+WtoyoqIHwgMS4wIHwgMS4wIHwgNTAlIHwKfCAqKueni+WtoyoqIHwgMS41IHwgMS4wIHwgNTAlIHwKfCAqKuWGrOWtoyoqIHwgMS4wIHwgMCB8IDAlIHwKfCAqKuaYpeWtoyoqIHwgMS41IHwgMi4wIHwgMTAwJSB8CgrlhbbkuK3vvJoqKumZjeawtOmXtOmalOWAjeeOhyoq6LaK5aSn5YiZ5Lik5qyh6ZmN5rC05LmL6Ze0562J5b6F6LaK5LmF77ybKirpl6rnlLXlvLrluqblgI3njocqKuWGs+WumumXqueUteeahOmikee5geeoi+W6pu+8myoq6Zeq55S15Ye6546w5qaC546HKirooajnpLrkuIDlnLrpmY3msLTmmK/lkKbkvLTpmo/pl6rnlLXjgIIKCj4g5pil5a2j5piv5YWo5bm06Zu36Zuo5pyA6aKR57mB55qE5a2j6IqC4oCU4oCU6Zeq55S15by65bqm5YCN546H6auY6L6+Mu+8jOS4lDEwMCXlh7rnjrDjgILlhqzlraPku47kuI3kuIvpl6rnlLXvvIjlvLrluqblgI3njofkuLow77yJ77yM5Zug5Li65pq06Zuq5LiN5YW35aSH6Zeq55S15p2h5Lu244CCCgojIyMg6ZmN5rC05ZGo5pyfCgrmr4/mrKHpmY3msLTkuovku7bmjIHnu63nuqYzXH425ri45oiP5YiG6ZKf77yM6Ze06ZqU5Zug5a2j6IqC6ICM5byC77yaCgokJApcdGV4dHvpmY3msLTmjIHnu63ml7bpl7R9ID0gNjAgXHRpbWVzIFxtYXRocm17cmFuZG9tfSgzLFwgNilcIFx0ZXh0e+enkn0KJCQKCiQkClx0ZXh0e+mZjeawtOmXtOmalH0gPSBcZnJhY3s2MCBcdGltZXMgXG1hdGhybXtyYW5kb219KDUsXCA0NSl9e1x0ZXh0e+Wto+iKguWAjeeOh319XCBcdGV4dHvnp5J9CiQkCgo+ICoqcmFuZG9tKGEsIGIpKirvvJrmuLjmiI/lvJXmk47kuK3nmoTpmo/mnLrmlbDlh73mlbDvvIjlr7nlupTmupDnoIEgYG1fcmFuZG9tLkZsb2F0KGEsIGIpYO+8ie+8jOi/lOWbniBhIOWIsCBiIOS5i+mXtOeahOmaj+acuua1rueCueaVsO+8jOavj+asoeiwg+eUqOe7k+aenOS4jeWQjOOAguacrOaWh+WQjue7reaJgOaciSBgcmFuZG9tYCDlnYfmjIfmraTnsbvpmo/mnLrmlbDlh73mlbAKPiAtIGByYW5kb20uRmxvYXQoYSxiKWAg6L+U5Zue5Yy66Ze05YaF6ZqP5py65rWu54K55pWw44CCCj4gLSBgcmFuZG9tLkludChhLGIpYCDov5Tlm57ljLrpl7TlhoXpmo/mnLrmlbTmlbDjgIIKPiAtIGByYW5kb20uQm9vbChwKWAg5Lul5qaC546HIHDvvIgwXH4x77yJ6L+U5ZueIHRydWUvZmFsc2XjgIIKCuWFtuS4re+8mioq5a2j6IqC5YCN546HKirop4HkuIrooajvvIjlpI/lraMv5Yas5a2j5Li6MS4w77yM5pilL+eni+S4ujEuNe+8ieOAggoKfCDlj4LmlbAgfCDlgLwgfAp8LS0tLS0tfC0tLS0tfAp8ICoq5Y2V5qyh6ZmN5rC05pe26ZW/KiogfCAzXH42IOWIhumSnyB8CnwgKirkuKTmrKHpmY3msLTpl7TpmpTvvIjlpI8v5Yas77yJKiogfCA1XH40NSDliIbpkp8gfAp8ICoq5Lik5qyh6ZmN5rC06Ze06ZqU77yI5pilL+eni++8iSoqIHwgMy4zXH4zMCDliIbpkp8gfAp8ICoq6ZmN5rC05reh5YWlL+a3oeWHuioqIHwgMTBcfjMwIOenkiB8Cgo+IOWbsOmavuaooeW8j+S4i++8jOmmluasoemZjeawtOadpeW+l+abtOW/q++8iOWHuueUnzBcfjLliIbpkp/lkI7vvInvvIzkuJTpl6rnlLXmm7TlvLrjgIIKCiMjIOmXqueUteezu+e7nwoKPiDmmKXlraPnmoTpm7fmmrTkuI3lj6rmmK/lkJPkurrigJTigJTpl6rnlLXnnJ/nmoTkvJrliojkuK3lnLDpnaLvvIzlvJXlj5Hngavngb7jgILkuobop6Ppl6rnlLXop6blj5HmnaHku7bvvIzkvaDlsLHog73or4TkvLDlnKjmiLflpJbmtLvliqjnmoTpo47pmanjgIIKCiMjIyDpl6rnlLXop6blj5HmnaHku7YKCmBVcGRhdGVMaWdodG5pbmdgIOaWueazleaOp+WItumXqueUteeUn+aIkO+8mgoK6Zeq55S16Kem5Y+R6ZyA5ZCM5pe25ruh6Laz5Lik5Liq5p2h5Lu277yaCgokJApcdGV4dHvpmY3msLTlvLrluqZ9ID0gMQokJAoKJCQKXHRleHR75q+P56eS5Yik5a6a77yafVxtYXRocm17cmFuZG9tLkJvb2x9KG1fe1x0ZXh0e+mXqueUtX19IFx0aW1lcyAwLjAwMDIpID0gXHRleHR7dHJ1ZX0KJCQKCuWFtuS4re+8mioq6ZmN5rC05by65bqmKirkuLrlvZPliY3pmY3msLTnmoTmnIDlpKflvLrluqbvvIgwXH4x77yM5ruh5by65bqm5Li6Me+8ie+8myoqbV/pl6rnlLUqKuS4uumXqueUteW8uuW6puWPguaVsO+8jOeUseWto+iKguWSjOmavuW6puWGs+Wumu+8iOaYpeWto+WPr+i+vjIuMO+8jOWkj+Wtoy/np4vlraPnuqYwLjMzXH4wLjY277yM5Yas5a2j5Li6MO+8ieOAguavj+enkuWvueavj+S4quW3suWKoOi9veWMuuWdl+aJp+ihjOS4gOasoeWIpOWumuOAggoKPiDpl6rnlLXlj6rlnKjpmY3msLTovr7liLDmu6HlvLrluqbml7bmiY3kvJrop6blj5HjgILmr4/np5Lmr4/kuKrlt7LliqDovb3ljLrlnZfmnInnuqYgMC4wMiVcfjAuMDQlIOeahOamgueOh+iiq+mXqueUteWHu+S4re+8jOaYpeWto+e/u+WAjeOAgumXqueUteS8muWKiOWQkeivpeWMuuWfn+WGheacgOmrmOeahOaWueWdl+OAggoKCiMjIyDkurrlt6Xop6blj5EKCueOqeWutuWPr+S7pemAmui/h+afkOS6m+aooee7hOaIlue8lui+keWZqOWKn+iDveaJi+WKqOWPrOWUpOmXqueUte+8jOS8muWcqOWJjeaWuTMy5qC86IyD5Zu05YaF55qE5pyA6auY54K555Sf5oiQ44CCCgojIyDpm77ns7vnu58KCj4g5rWT6Zu+5Lya5aSn5bmF6ZmN5L2O6IO96KeB5bqm77yM6K6p5a+86Iiq5ZKM5a+76Lev5Y+Y5b6X5Zuw6Zq+44CC6Zu+5Zyo56eL5Yas5pu05bi46KeB77yM5LiU5b6A5b6A5oyB57ut5pu05LmF44CCCgojIyMg6Zu+55qE5ZGo5pyfCgpgVXBkYXRlRm9nYCDmlrnms5XmjqfliLbpm77nmoTnlJ/miJDvvJoKCiQkClx0ZXh0e+mbvumXtOmalOWAjeeOh30gPSBcYmVnaW57Y2FzZXN9IDEuNzUgJiBcdGV4dHvoi6Xnp4vlraPmiJblhqzlraN9IFxcIDEuMCAmIFx0ZXh0e+iLpeWkj+Wto+aIluaYpeWto30gXGVuZHtjYXNlc30KJCQKCiQkClx0ZXh0e+mbvuW8gOWni+aXtumXtH0gPSBcZnJhY3s2MCBcdGltZXMgXG1hdGhybXtyYW5kb219KDEwLFwgNDApfXtcdGV4dHvpm77pl7TpmpTlgI3njod9fQokJAoKJCQKXHRleHR76Zu+5oyB57ut5pe26Ze0fSA9IDYwIFx0aW1lcyBcbWF0aHJte3JhbmRvbX0oNCxcIDcpIFx0aW1lcyBcdGV4dHvpm77pl7TpmpTlgI3njod9CiQkCgrlhbbkuK3vvJoqKumbvumXtOmalOWAjeeOhyoq56eL5Yas5pu06auY5oSP5ZGz552A6Zu+5pu06aKR57mB77ybKipyYW5kb20qKuS4uuiMg+WbtOWGheeahOmaj+acuuWAvOOAgum7mOiupOWPguaVsOS4i++8mgoKfCDlraPoioIgfCDpm77pl7TpmpQgfCDpm77mjIHnu63ml7bpl7QgfAp8LS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tLS0tfAp8ICoq5aSPL+aYpSoqIHwgMTBcfjQwIOWIhumSnyB8IDRcfjcg5YiG6ZKfIHwKfCAqKueniy/lhqwqKiB8IDZcfjIzIOWIhumSnyB8IDdcfjEyIOWIhumSnyB8Cgo+IOeni+WGrOWto+iKguS4jeS7hembvuabtOmikee5ge+8jOWNleasoeaMgee7reaXtumXtOS5n+abtOmVv+OAgumbvueahOa3oeWFpS/mt6Hlh7rpnIDopoEyMFx+NDDnp5LvvIzkuI3kvJrnqoHnhLblh7rnjrDjgIIKCiMjIOWGsOmbquS4juWcsOW9ouS6kuWKqAoKPiDlpKnmsJTkuI3lj6rmmK/lpKnnqbrkuK3nmoTmma/osaHigJTigJTlroPkvJrnnJ/lrp7lnLDmlLnlj5jkvaDohJrkuIvnmoTmlrnlnZfjgILmsLTkvJrnu5PlhrDvvIzlnLDpnaLkvJrnp6/pm6rvvIzmuKnluqblm57ljYflkI7lroPku6zlj4jkvJrmtojlpLHjgIIKCiMjIyDlhrDlhrvkuI7ono3ljJYKCmBGcmVlemVUaGF3QW5kRGVwb3NpdFNub3dgIOaWueazleWcqOavj+S4quWMuuWdl+WKoOi9veWSjOaJq+aPj+aXtuaJp+ihjO+8mgoKJCQKXHRleHR75Ya757uT5Yik5a6afSBcaWZmIFx0ZXh0e+ivpeS9jee9ruW9k+WJjeS4i+mbqn1cIFx0ZXh0e+S4lH1cIFxtYXRocm17cmFuZG9tLkJvb2x9KFx0ZXh0e+WGu+e7k+amgueOh30pID0gXHRleHR7dHJ1ZX0KJCQKCiQkClx0ZXh0e+iejeWMluWIpOWumn0gXGlmZiBcdGV4dHvor6XkvY3nva7lvZPliY3kuI3kuIvpm6p9XCBcdGV4dHvkuJR9XCBcbWF0aHJte3JhbmRvbS5Cb29sfShcdGV4dHvono3ljJbmpoLnjod9KSA9IFx0ZXh0e3RydWV9CiQkCgo+ICoqcmFuZG9tLkJvb2wocCkqKiDku6XmpoLnjocgcCDov5Tlm54gdHJ1Ze+8iOWNsyLmjrfpqrDlrZAi77yMcCDotorlpKfotorlrrnmmJPop6blj5HvvInvvJsqKuWGu+e7k+amgueOhyoq5ZKMKirono3ljJbmpoLnjocqKueUseiwg+eUqOaXtuacuuWGs+Wumu+8iOWMuuWdl+mmluasoeWKoOi9veaXtuS4ujEuMOWNs+W/heWumuinpuWPke+8jOWQjue7reWRqOacn+aJq+aPj+aXtuS4ujAuNjbljbPnuqbkuInliIbkuYvkuozmpoLnjofop6blj5HvvInjgIIKCiMjIyDkuIvpm6rml7bnmoTlnLDlvaLlj5jljJYKCnwg5p2h5Lu2IHwg5Y+Y5YyWIHwKfC0tLS0tLXwtLS0tLS18Cnwg5rC06Z2i77yI6Led5rW35bK4PjM15qC877yJIHwg57uT5YawIOKGkiDlhrDlnZfvvIg2Mu+8iSB8Cnwg5Y+v5pSv5pKR6Zuq55qE5pa55Z2X5LiK5pa5IHwg6KaG55uW5LiA5bGC6Zuq77yINjHvvIkgfAp8IOWPr+iiq+mbquabv+aNoueahOaWueWdlyB8IOabv+aNouS4uumbqu+8iDYx77yJIHwKCiMjIyDono3ljJbml7bnmoTlnLDlvaLlj5jljJYKCnwg5p2h5Lu2IHwg5Y+Y5YyWIHwKfC0tLS0tLXwtLS0tLS18Cnwg6Zuq5pa55Z2X77yINjHvvIkgfCDmtojlpLHvvIhEZXN0cm95Q2VsbO+8iSB8Cnwg5Yaw5Z2X77yINjLvvIkgfCDmtojlpLHvvIhEZXN0cm95Q2VsbO+8jOS4jeinpuWPkeaOieiQve+8iSB8Cgo+IOWGsOmbquWPmOWMluWPquWcqCLnlJ/mgIHnjq/looPooYzkuLrmqKHlvI8i5Li6IExpdmluZyDml7bnlJ/mlYjjgILlpoLmnpzlhbPpl63kuoblpKnmsJTmlYjmnpzvvIzmlrDnlJ/miJDnmoTljLrlnZfkuI3kvJrnp6/pm6rvvIzkvYblt7LmnInlhrDpm6rkuI3kvJroh6rliqjono3ljJbjgIIKCiMjIOS4lueVjOiuvue9ruWPguaVsAoKPiDlnKjliJvlu7rkuJbnlYzml7bvvIzkvaDlj6/ku6XosIPmlbTku6XkuIvlj4LmlbDmnaXlrprliLblpKnmsJTkuI7lraPoioLkvZPpqozjgIIKCnwg5Y+C5pWwIHwg6buY6K6k5YC8IHwg5L2c55SoIHwKfC0tLS0tLXwtLS0tLS0tLXwtLS0tLS18CnwgKirlraPoioLlj5jljJYqKiB8IOW8gOWQryB8IOWFs+mXreWQjuWto+iKguawuOi/nOWBnOeVmeWcqOW9k+WJjeeKtuaAgSB8CnwgKirlubTlpKnmlbAqKiB8IDI0IHwg5LiA5bm05pyJ5aSa5bCR5ri45oiP5aSp77yM6LaK5aSn5YiZ5a2j6IqC5pu05pu/6LaK5oWiIHwKfCAqKuWkqeawlOaViOaenCoqIHwg5byA5ZCvIHwg5YWz6Zet5ZCO5peg6ZmN5rC044CB5peg6Zu+44CB5peg6Zeq55S144CB5peg5Yaw6Zuq5Y+Y5YyWIHwKfCAqKuaXtumXtOa1gemAnSoqIHwg5Y+Y5YyWIHwg5Y+v6YCJ5Zu65a6a55m95aSpL+m7keWknC/ml6Xlh7ov5pel6JC977yM5oiW5q2j5bi45b6q546vIHwKfCAqKuWHuueUn+eCuemavuW6pioqIHwg566A5Y2VIHwg5Zuw6Zq+5qih5byP5LiL6aaW5qyh6ZmN5rC05p2l5b6X5pu05b+r44CB6Zeq55S15pu05by6IHwKCuWFtuS4re+8mioq5bm05aSp5pWwKirnm7TmjqXmjqfliLblraPoioLmm7Tmm7/pgJ/luqbjgILorr7kuLo0OOWImeS4gOS4quWto+iKguaMgee7rTEy5aSp77yI546w5a6eNOWwj+aXtu+8ie+8jOiKguWlj+abtOiIkue8k++8m+iuvuS4ujEy5YiZ5LiA5Liq5a2j6IqC5LuFM+Wkqe+8iOeOsOWunjHlsI/ml7bvvInvvIzoioLlpY/mm7TntKflh5HjgIIKCiMjIOWGmee7meW8gOWPkeiAhQoKPiDlpoLmnpzkvaDorqHliJLlvIDlj5HlpKnmsJTmqKHnu4TmiJboh6rlrprkuYnnjq/looPooYzkuLrvvIzku6XkuIvmioDmnK/nu4boioLlsIbluK7liqnkvaDlv6vpgJ/nkIbop6Pns7vnu5/mnrbmnoTjgIIKCjo6OiBpbmZvIOi1hOaWmeaaguWtmArmnKzlsI/oioLlhoXlrrnmmoLml7blrZjmlL7kuo7mraTvvIzlkI7nu63kvJrnp7vliqjoh7MiTU9E5byA5Y+RIueroOiKguOAggo6OjoKCjxkZXRhaWxzPgo8c3VtbWFyeT7lvIDlj5HogIXmjIfljZc8L3N1bW1hcnk+CgojIyMg5qC45b+D5paH5Lu257Si5byVCgp8IOaWh+S7tiB8IOiBjOi0oyB8CnwtLS0tLS18LS0tLS0tfAp8IGBTdWJzeXN0ZW1XZWF0aGVyLmNzYCB8IOWkqeawlOezu+e7n+S4u+exu++8mumZjeawtOOAgemXqueUteOAgembvuOAgembqOmbqueykuWtkOOAgeWcsOW9ouWGsOWGuy/ono3ljJYgfAp8IGBTdWJzeXN0ZW1TZWFzb25zLmNzYCB8IOWto+iKguWIkuWIhuS4jiBUaW1lT2ZZZWFyIOKGkiBTZWFzb24g6L2s5o2iIHwKfCBgU3Vic3lzdGVtVGltZU9mRGF5LmNzYCB8IOaYvOWknOW+queOr+S4juWto+iKguWvueaYvOmVv+eahOW9seWTjSB8CnwgYFN1YnN5c3RlbVRpbWUuY3NgIHwg5ri45oiP5pe26Ze05rWB6YCd44CB552h55yg5Yqg6YCf44CB5pqC5YGc6I+c5Y2V5YeP6YCfIHwKfCBgV29ybGRTZXR0aW5ncy5jc2AgfCDkuJbnlYzlj4LmlbDlrprkuYnvvIjlubTlpKnmlbDjgIHlpKnmsJTlvIDlhbPjgIHlraPoioLlvIDlhbPvvIkgfAp8IGBUZXJyYWluVXBkYXRlci5jc2AgfCDlraPoioLmuKnluqbmm7Lnur/vvIhUZW1wZXJhdHVyZUN1cnZl77yJ5a6a5LmJIHwKCiMjIyDpmY3msLTns7vnu5/lrozmlbTpgLvovpEKCmBgYGNzaGFycAovLyBVcGRhdGVQcmVjaXBpdGF0aW9uIOaguOW/g+mAu+i+ke+8iOeugOWMlu+8iQppZiAo5b2T5YmN5pe26Ze0ID4g6ZmN5rC057uT5p2f5pe26Ze0KSB7CiAgICBzd2l0Y2ggKOWto+iKgikgewogICAgICAgIGNhc2Ug5aSP5a2jOiBudW09MWY7ICAgbnVtMj0xZjsgcHJvYmFiaWxpdHk9MC41ZjsgYnJlYWs7CiAgICAgICAgY2FzZSDnp4vlraM6IG51bT0xLjVmOyBudW0yPTFmOyBwcm9iYWJpbGl0eT0wLjVmOyBicmVhazsKICAgICAgICBjYXNlIOWGrOWtozogbnVtPTFmOyAgIG51bTI9MGY7IHByb2JhYmlsaXR5PTBmOyAgIGJyZWFrOwogICAgICAgIGNhc2Ug5pil5a2jOiBudW09MS41ZjsgbnVtMj0yZjsgcHJvYmFiaWxpdHk9MWY7ICAgYnJlYWs7CiAgICB9CiAgICAvLyDpppbmrKHpmY3msLTvvIhlbmRUaW1lPT0w77yJ5LiO5ZCO57ut6ZmN5rC055qE6Ze06ZqU5LiN5ZCMCiAgICAvLyDlm7Dpmr7mqKHlvI/pppbmrKHnrYnlvoXmm7Tnn60KICAgIG1fcHJlY2lwaXRhdGlvblN0YXJ0VGltZSA9IOW9k+WJjeaXtumXtCArIDYwZiAqIHJhbmRvbSg1ZiwgNDVmKSAvIG51bTsKICAgIG1fcHJlY2lwaXRhdGlvbkVuZFRpbWUgPSBtX3ByZWNpcGl0YXRpb25TdGFydFRpbWUgKyA2MGYgKiByYW5kb20oM2YsIDZmKTsKICAgIG1fbGlnaHRuaW5nSW50ZW5zaXR5ID0gcmFuZG9tLkJvb2wocHJvYmFiaWxpdHkpIAogICAgICAgID8gU2F0dXJhdGUocmFuZG9tLkZsb2F0KDAuMzNmLCAxZikgKiBudW0yKSA6IDBmOwp9Ci8vIOmZjeawtOW8uuW6pua3oeWFpea3oeWHugppZiAoSXNQcmVjaXBpdGF0aW9uU3RhcnRlZCkgewogICAgUHJlY2lwaXRhdGlvbkludGVuc2l0eSArPSBkdCAvIG1fcHJlY2lwaXRhdGlvblJhbXBUaW1lOwp9IGVsc2UgewogICAgUHJlY2lwaXRhdGlvbkludGVuc2l0eSAtPSBkdCAvIG1fcHJlY2lwaXRhdGlvblJhbXBUaW1lOwp9ClByZWNpcGl0YXRpb25JbnRlbnNpdHkgPSBTYXR1cmF0ZShQcmVjaXBpdGF0aW9uSW50ZW5zaXR5KTsKYGBgCgojIyMg6Zeq55S16Kem5Y+R5a6M5pW06YC76L6RCgpgYGBjc2hhcnAKLy8gVXBkYXRlTGlnaHRuaW5nIOaguOW/g+mAu+i+kQppZiAoUHJlY2lwaXRhdGlvbkludGVuc2l0eSAhPSAxZikgcmV0dXJuOwppZiAoIVBlcmlvZGljR2FtZVRpbWVFdmVudCgxLjAsIDAuMCkpIHJldHVybjsgIC8vIOavj+enkuajgOafpeS4gOasoQpUZXJyYWluQ2h1bmsgY2h1bmsgPSDpmo/mnLrpgInmi6nkuIDkuKrlt7LliqDovb3ljLrlnZc7CmlmICghcmFuZG9tLkJvb2wobV9saWdodG5pbmdJbnRlbnNpdHkgKiAwLjAwMDJmKSkgcmV0dXJuOwovLyDlnKggMTZ4MTYg5Yy65Z+f5YaF5om+5pyA6auY54K5ClZlY3RvcjM/IHRhcmdldCA9IG51bGw7CmZvciAoaW50IHggPSBudW0tODsgeCA8IG51bSs4OyB4KyspIHsKICAgIGZvciAoaW50IHogPSBudW0yLTg7IHogPCBudW0yKzg7IHorKykgewogICAgICAgIGludCB0b3AgPSB0ZXJyYWluLkdldFRvcEhlaWdodCh4LCB6KTsKICAgICAgICBpZiAoIXRhcmdldC5IYXNWYWx1ZSB8fCB0b3AgPiB0YXJnZXQuVmFsdWUuWSkgewogICAgICAgICAgICB0YXJnZXQgPSBuZXcgVmVjdG9yMyh4LCB0b3AsIHopOwogICAgICAgIH0KICAgIH0KfQppZiAodGFyZ2V0Lkhhc1ZhbHVlKSB7CiAgICBTdWJzeXN0ZW1Ta3kuTWFrZUxpZ2h0bmluZ1N0cmlrZSh0YXJnZXQuVmFsdWUsIGZhbHNlKTsKfQpgYGAKCiMjIyDmmLzlpJzpmLbmrrXorqHnrpcKCmBgYGNzaGFycAovLyBVcGRhdGVTdGFydHMg5qC45b+D6YC76L6RCmZsb2F0IG51bSA9IE1pZHBvaW50KFN1bW1lclN0YXJ0LCBBdXR1bW5TdGFydCk7ICAvLyDlpI/oh7PkuK3ngrkKZmxvYXQgbnVtMiA9IFJlbWFpbmRlcihUaW1lT2ZZZWFyIC0gbnVtLCAxZik7ICAgIC8vIOi3neWkj+iHs+WBj+enuwpmbG9hdCBkYXlMZW5ndGggPSBMZXJwKDAuMmYsIDAuNGYsIDAuNWYgKyAwLjVmICogQ29zKDLPgCAqIG51bTIpKTsKZmxvYXQgZHVza0Rhd25Ub3RhbCA9IDAuNGY7CmZsb2F0IG5pZ2h0TGVuZ3RoID0gKDFmIC0gKGRheUxlbmd0aCArIGR1c2tEYXduVG90YWwpKSAvIDJmOwpEYXlTdGFydCA9IDAuM2Y7CkRhd25TdGFydCA9IEFkZChEYXlTdGFydCwgLW5pZ2h0TGVuZ3RoKTsgICAvLyDpu47mmI7lvIDlp4sKRHVza1N0YXJ0ID0gQWRkKERheVN0YXJ0LCBkYXlMZW5ndGgpOyAgICAgICAvLyDpu4TmmI/lvIDlp4sKTmlnaHRTdGFydCA9IEFkZChEdXNrU3RhcnQsIG5pZ2h0TGVuZ3RoKTsgICAvLyDpu5HlpJzlvIDlp4sKYGBgCgojIyMg5rip5bqm5Lyg6YCS6ZO+CgpgYGBjc2hhcnAKLy8g5LuO5a2j6IqC5Yiw5Yaw5Ya75Yik5a6a55qE5a6M5pW06ZO+6LevCldvcmxkU2V0dGluZ3MuVGltZU9mWWVhciAoMH4xKQogICAg4oaSIFN1YnN5c3RlbVNlYXNvbnMuVGltZU9mWWVhclRvU2Vhc29uKCkg4oaSIFNlYXNvbiArIFRpbWVPZlNlYXNvbgogICAg4oaSIFRlcnJhaW5VcGRhdGVyLlRlbXBlcmF0dXJlQ3VydmUuU2FtcGxlKFRpbWVPZlllYXIpIOKGkiBTZWFzb25UZW1wZXJhdHVyZQogICAg4oaSIFRlcnJhaW4uU2Vhc29uVGVtcGVyYXR1cmUgPSB2YWx1ZQogICAg4oaSIFRlcnJhaW4uR2V0U2Vhc29uYWxUZW1wZXJhdHVyZSh4LCB6KSA9IEdldFRlbXBlcmF0dXJlKHgsIHopICsgU2Vhc29uVGVtcGVyYXR1cmUKICAgIOKGkiBTdWJzeXN0ZW1XZWF0aGVyLkdldFByZWNpcGl0YXRpb25TaGFmdEluZm8oeCwgeikKICAgICAgICDihpIgSXNQbGFjZUZyb3plbihzZWFzb25hbFRlbXAsIHRvcEhlaWdodCkKICAgICAgICAgICAg4oaSIHRlbXBlcmF0dXJlICsgR2V0VGVtcGVyYXR1cmVBZGp1c3RtZW50QXRIZWlnaHQoeSkgPD0gMAogICAg4oaSIOWGs+WumumZjeawtOexu+Wei++8iOmbqi/pm6gv5peg77yJCmBgYAoKIyMjIOmZjeawtOexu+Wei+WIpOWumuWujOaVtOmAu+i+kQoKYGBgY3NoYXJwCi8vIEdldFByZWNpcGl0YXRpb25TaGFmdEluZm8KaW50IHNlYXNvbmFsVGVtcCA9IHRlcnJhaW4uR2V0U2Vhc29uYWxUZW1wZXJhdHVyZShzaGFmdFZhbHVlKTsKaW50IHRvcEhlaWdodCA9IFRlcnJhaW4uRXh0cmFjdFRvcEhlaWdodChzaGFmdFZhbHVlKTsKaWYgKElzUGxhY2VGcm96ZW4oc2Vhc29uYWxUZW1wLCB0b3BIZWlnaHQpKSB7CiAgICByZXR1cm4geyBUeXBlPVNub3csIEludGVuc2l0eT1QcmVjaXBpdGF0aW9uSW50ZW5zaXR5IH07Cn0KaW50IHNlYXNvbmFsSHVtaWRpdHkgPSB0ZXJyYWluLkdldFNlYXNvbmFsSHVtaWRpdHkoc2hhZnRWYWx1ZSk7CmlmIChzZWFzb25hbFRlbXAgPD0gOCB8fCBzZWFzb25hbEh1bWlkaXR5ID49IDgpIHsKICAgIHJldHVybiB7IFR5cGU9UmFpbiwgSW50ZW5zaXR5PVByZWNpcGl0YXRpb25JbnRlbnNpdHkgfTsKfQpyZXR1cm4geyBUeXBlPVJhaW4sIEludGVuc2l0eT0wZiB9OyAgLy8g5peg6ZmN5rC0CmBgYAo8L2RldGFpbHM+Cgrnu6fnu63pmIXor7tb5Zyw5b2i5LiO5rCU5YCZXSgvdGhlb3J5L2Jpb21lcynjgIFb5bu6562R5LiO5Y+W5pqWXSgvZ3VpZGUvYnVpbGRpbmcp5ZKMW+iho+eJqeS4jueblOeUsuWbvumJtF0oL2RhdGFiYXNlL2Nsb3RoaW5nKeOAggoKIyMg6Iux5paHIFdpa2kg5Y6f5p2h55uuCgotIFtXZWF0aGVyXShodHRwczovL3N1cnZpdmFsY3JhZnRnYW1lLmZhbmRvbS5jb20vd2lraS9XZWF0aGVyKQotIFtTZWFzb25zXShodHRwczovL3N1cnZpdmFsY3JhZnRnYW1lLmZhbmRvbS5jb20vd2lraS9TZWFzb25zKQo=
