背景与问题引入

1. 线性模型的数据结构

在心理学研究中,经常使用混合线性模型(Mixed-Effects Models)或类似的思想。假设我们研究 “年龄 (Age, IV)”“外向性 (Extraversion, DV)” 的影响。

我们需要区分两个层面的变异:

1.1 被试层面 (Participant Level)

  • 被试截距 (Participant Intercept):不同人的基础外向性分数不同(有人天生社牛,有人社恐)。
  • 被试斜率 (Participant Slope):年龄增长对不同人的影响可能不同(论文主要讨论被试间设计,不讨论此层面的随机斜率)

1.2 题目层面 (Item Level) —— 本次报告的核心

题目也有其独特的属性,但往往被我们忽略。

  • 题目截距 (Item Intercept = 难度/通俗度)
    • 有些题容易得分(例如:“我喜欢和人说话”)。
    • 有些题难得分(例如:“我喜欢演讲”)。
    • 现状: 这一点传统方法(IRT 或 SEM)处理得很好(通过题目参数或载荷截距)。
  • 题目斜率 (Item Slope = 对 IV 的敏感度)
    • 核心问题:IV 对不同题目的预测力是一样的吗?
    • 举例:随着年龄增长,“喜欢和人说话”这种温和的社交可能变化不大(Slope \(\approx\) 0);但“喜欢演讲”这种追求刺激的社交可能会急剧下降(Slope < 0)。
    • 现状:这是传统方法假设为固定的地方。

2. 未被建模的交互作用方差 (Unmodeled Interaction Variance)

如果存在上述的题目斜率差异(即 IV 与 Items 存在交互作用),但我们在分析时强行忽略它,会发生什么?

set.seed(123)
n_subj <- 50
age <- rnorm(n_subj, mean = 20, sd = 10) # IV

# 假设构念由2个题目测量
# Item 1: 随年龄增长稍微增加 (Slope = 0.05)
# Item 2: 随年龄增长显著减少 (Slope = -0.05)
# 平均效应 (True Effect): 0 (Items 相互抵消)

item1_scores <- 0.05 * age + rnorm(n_subj)
item2_scores <- -0.05 * age + rnorm(n_subj)

demo_data <- data.frame(
  ID = rep(1:n_subj, 2),
  Age = rep(age, 2),
  Score = c(item1_scores, item2_scores),
  Item = rep(c("Item 1 (温和社交)", "Item 2 (刺激社交)"), each = n_subj)
)

# 计算聚合分数 (Aggregation)
agg_data <- demo_data %>%
  group_by(ID, Age) %>%
  summarise(Mean_Score = mean(Score))

# --- 绘图 ---
p1 <- ggplot(demo_data, aes(x = Age, y = Score, color = Item, group = Item)) +
  geom_point(alpha = 0.3) +
  geom_smooth(method = "lm", se = FALSE, size = 1.5) +
  theme_minimal() +
  labs(title = "真实情况:题目斜率异质性", subtitle = "不同题目对 Age 的反应截然不同") +
  theme(legend.position = "bottom")

p2 <- ggplot(agg_data, aes(x = Age, y = Mean_Score)) +
  geom_point(alpha = 0.3) +
  geom_smooth(method = "lm", color = "black", size = 1.5) +
  theme_minimal() +
  labs(title = "聚合分析 (Aggregation)", subtitle = "强行平均后,斜率相互抵消,掩盖了真实机制")

p1 + p2

如图所示: 左图中,IV 与 Items 存在明显的交互作用(斜率一正一负)。 右图中,使用聚合(求平均)方法时,这种丰富的交互信息丢失了。这部分未被建模的交互作用方差,在后续统计检验中会被错误地处理。


3. 概化理论 (Generalizability Theory) 的悖论

概化理论认为:为了让结论具有推广性,统计上应假设我们使用的题目是从一个无限题库 (infinite pool of items) 中随机抽取的。这意味着题目应当被视为随机效应 (Random Effect)

在实际数据分析中陷入了一个悖论:

  1. 理论上:承认题目是随机采样的,即应该视作随机效应。

  2. 建模时:未考虑题目的随机效应,变相假定这些Items对 IV 的反应是固定效应(Fixed Effect)。

异质性(Heterogeneity)要求与同质性 (Homogeneity) 的误解

有的研究在设计题目表达概念/构念时,为了高外部效度,会从不同角度设计题目,这些题目本身存在异质性

退一步讲,就算题目是同质的,也只代表它们“长得像”(内部相关高),不代表它们对外部变量(IV)的反应(Slope)也是一样的


4. 问题出现:现有模型的视而不见

无论是简单的回归(Aggregation)还是复杂的结构方程模型(SEM),都在不同程度上抹杀了这种题目层面的斜率不一致。

4.1 两种忽视的方式

  1. 聚合模型 (Aggregation Regression)
    • 做法:求平均分。
    • 假设:所有题目对构念的贡献相等(权重=1),且对 IV 的反应斜率完全相同。
    • 结果:丢失所有题目特异性信息。
  2. 结构方程模型 (Common Factor / SEM)
    • 做法:潜变量建模。
    • 假设:题目对 IV 的反应必须通过“潜变量”传导。这意味着,如果 Item A 的载荷是 Item B 的2倍,那么 Item A 对 IV 的斜率也必须严格是 Item B 的2倍。
    • 局限:IV 无法直接与单个 Item 产生独特的交互作用。模型会把这部分本该属于“Random Slope”的变异,错误地当作了单纯的残差。

4.2 模型假设对比

# ==========================================
# 1. 进阶数据生成:构造“矛盾”情境
# ==========================================
set.seed(999) # 换一个种子确保效果明显
N <- 300
J <- 5
IV <- rnorm(N, 0, 1)

# A. 生成潜变量 (Factor)
# 假设 IV 对潜变量有强正向影响 (Beta = 0.6)
Latent_F <- 0.6 * IV + rnorm(N, 0, 0.8)

# B. 生成题目 (Items)
# 关键点:所有题目在测量模型上都是“好题”(正向载荷),内部一致性高
# y = 1.0 * F + unique_effect + error
sim_data_wide <- data.frame(ID = 1:N, IV = IV)
sim_data_long <- data.frame()

# 题目 1-4:完全听从潜变量指挥
for(j in 1:4){
  y <- 1.0 * Latent_F + rnorm(N, 0, 1) 
  sim_data_wide[[paste0("y", j)]] <- y
  sim_data_long <- rbind(sim_data_long, data.frame(ID=1:N, IV=IV, Item=paste0("Item", j), Score=y))
}

# 题目 5:叛逆者 (Item Specific Effect)
# 它虽然测量同一个潜变量(有 +1.0 * F),但 IV 对它有额外的直接负面打击 (-1.5 * IV)
# 净效应(Net Slope) ≈ 0.6 (from F) - 1.5 (Direct) = -0.9
y5 <- 1.0 * Latent_F - 1.5 * IV + rnorm(N, 0, 1)
sim_data_wide$y5 <- y5
sim_data_long <- rbind(sim_data_long, data.frame(ID=1:N, IV=IV, Item="Item5", Score=y5))


# ==========================================
# 2. 模型拟合
# ==========================================
library(lavaan)

# --- A. 聚合回归 ---
sim_data_wide$Mean_Score <- rowMeans(sim_data_wide[, paste0("y", 1:5)])
agg_model <- lm(Mean_Score ~ IV, data = sim_data_wide)
agg_intercept <- coef(agg_model)[1]
agg_slope     <- coef(agg_model)[2]

# --- B. SEM (Common Factor) ---
sem_syntax <- '
  F1 =~ y1 + y2 + y3 + y4 + y5
  F1 ~ IV
'
sem_fit <- sem(sem_syntax, data = sim_data_wide, std.lv = TRUE)

# 提取 SEM 隐含的回归线
est <- parameterEstimates(sem_fit)
gamma <- est[est$op == "~" & est$lhs == "F1" & est$rhs == "IV", "est"] # 潜变量斜率
sem_lines <- data.frame()

for(j in 1:5){
  item_name <- paste0("y", j)
  # 截距
  nu <- est[est$op == "~1" & est$lhs == item_name, "est"]
  if(length(nu)==0) nu <- mean(sim_data_wide[[item_name]])
  # 载荷
  lam <- est[est$op == "=~" & est$rhs == item_name, "est"]
  
  # 这里的关键:SEM 强行认为 斜率 = 载荷 * Gamma
  # 因为 y1-y4 都是正相关,Gamma 是正的,且所有题目内部正相关,
  # SEM 会估计出 y5 的载荷也是正的(因为 y5 也受 Latent_F 影响)
  # 于是 SEM 会错误地预测 y5 随着 IV 增加而增加
  implied_slope <- lam * gamma
  
  temp <- data.frame(IV = seq(min(IV), max(IV), length.out=100), Item=paste0("Item", j))
  temp$Score <- nu + implied_slope * temp$IV
  sem_lines <- rbind(sem_lines, temp)
}

# ==========================================
# 3. 绘图对比
# ==========================================
library(ggplot2)
library(patchwork)

common_theme <- theme_bw() + 
  theme(legend.position = "none", plot.title = element_text(face="bold"))

# Plot 1: Aggregation
p_agg <- ggplot(sim_data_long, aes(x = IV, y = Score)) +
  geom_point(color="grey", alpha=0.3) +
  geom_abline(intercept = agg_intercept, slope = agg_slope, color = "#D55E00", size = 2) +
  labs(title = "1. Aggregation", subtitle = "简单平均,彻底掩盖 Item 5") + 
  ylim(-4, 4) + common_theme

# Plot 2: SEM
# 注意看紫色线 (Item 5)
p_sem <- ggplot() +
  geom_point(data = sim_data_long, aes(x = IV, y = Score, color = Item), alpha = 0.1) +
  geom_line(data = sem_lines, aes(x = IV, y = Score, color = Item), size = 1.2) +
  labs(title = "2. SEM (Common Factor)", 
       subtitle = "强制一致性:\n由于 Item 5 属于该构念,SEM 强行预测它\n随 IV 增加而增加 (紫色线向上)。\n这与数据事实(散点向下)完全相反!") +
  ylim(-4, 4) + common_theme

# Plot 3: Real Data / RIS
p_ris <- ggplot(sim_data_long, aes(x = IV, y = Score, color = Item)) +
  geom_point(alpha = 0.2) +
  geom_smooth(method = "lm", se = FALSE, size = 1.2) +
  labs(title = "3. Real Data (RIS)", 
       subtitle = "真相:\nItem 5 (紫色) 实际上是负相关的。\n这是 SEM 无法捕捉的特异性斜率。") +
  ylim(-4, 4) + common_theme

p_agg + p_sem + p_ris

my_labels <- c("Item 1", "Item 2", "Item 3", "Item 4", "Item 5", "IV", "Factor")

semPaths(object = sem_fit,
         what = "std",
         whatLabels = "std",
         layout = "tree2",  
         edge.label.cex = 1, 
         rotation = 2,
         nodeLabels = my_labels,
)

title("Common Factor Model (SEM) 路径图", adj = 0.5, line = 2)
mtext("IV 到 Item 5 没有直接路径,必须经过 F1", side = 1, line = 0, cex = 1.2)


第二部分:理论模型——Random Item Slope Regression (RISR)

1. 模型的数学表达

针对第一部分提出的问题,文章正式提出了 Random Item Slope Regression (RISR) 模型。这是理解一切推断谬误的基石。

1.1 传统模型 vs. RISR模型

传统聚合回归 (Aggregation Model): 假设题目对 IV 的反应是固定的、一致的。 \[ y_i = \beta_0 + \beta_1 x_i + \epsilon_i \]

随机题目斜率回归 (RISR, Equation 4): 假设题目是从题库中随机抽取的,对 IV 的敏感度各不相同。 \[ y_{ij} = \beta_0 + u_{0i} + u_{0j} + (\beta_1 + \mathbf{u_{1j}})x_i + \epsilon_{ij} \]

其中核心差异在于 \(\mathbf{u_{1j}}\): * \(u_{1j}\) 代表第 \(j\) 个题目独有的斜率偏离(Random Item Slope)。 * 服从正态分布 \(u_{1j} \sim N(0, \tau_{11})\)。 * \(\tau_{11}\) 衡量了题目间对 IV 反应的异质性程度。

  • \(u_{1j}\) (Random Item Slope), \(u_{1j} \sim N(0, \tau_{11})\)
    • 题目对 IV 反应的特异性
    • 它代表了题目 \(j\)\(x\) 的敏感程度偏离平均斜率 \(\beta_1\) 多少
    • 实际斜率:对于题目 \(j\) 来说,它真实的斜率是 \((\beta_1 + u_{1j})\)
    • Aggregation/SEM 隐含假设\(u_{1j} = 0\) (即方差 \(\tau_{11} = 0\))
    • RISR 核心假设\(\tau_{11} > 0\)
  • \(u_{0i}\) (Random Participant Intercept), \(u_{0i} \sim N(0, \tau_{00}^{(subj)})\)
    • 被试的特异性
    • 比如:张三本身就倾向于打高分,他的 \(u_{0i}\) 就是正的
  • \(u_{0j}\) (Random Item Intercept), \(u_{0j} \sim N(0, \tau_{00}^{(item)})\)
    • 题目的难易度/通俗度
    • 比如:题目 1 措辞很诱人,大家都容易得分,它的 \(u_{0j}\) 就是正的
  • \(\epsilon_{ij}\) (Residual), \(\epsilon_{ij} \sim N(0, \sigma^2)\)

2. 致命的统计后果:SE 低估与 t 值膨胀

为什么忽略 \(u_{1j}\) 会导致严重的假阳性(Type I Error)?根本原因在于\(t\) 检验的机制失效。

2.1 t 值的计算逻辑

在线性回归中,判断显著性的 \(t\) 值计算公式为: \[ t = \frac{\text{Estimate}}{\text{Standard Error}} = \frac{\hat{\beta}_1}{SE(\hat{\beta}_1)} \]

2.2 SE 的数学推导对比

根据论文附录证明,两种模型对 SE 的估计截然不同:

  • 传统模型 (Naive SE): 认为只要增加被试量 \(N\),误差就能无限缩小。 \[ SE_{naive} \approx \sqrt{\frac{\sigma^2_{residual}}{N \times J \times \sigma^2_x}} \] > 当 \(N \to \infty\)\(SE \to 0\)

  • RISR 模型 (True SE): 引入了题目采样的不确定性(Generalization Error)。 \[ SE_{true}(A10变形) \approx \sqrt{\frac{\sigma^2_{residual}}{N \times J \times \sigma^2_x} + \mathbf{\frac{\tau_{11}}{J}}} \] > 当 \(N \to \infty\), 第一项趋近于0,但第二项 \(\frac{\tau_{11}}{J}\) 依然存在!

2.3 低估SE的因素

比较 真实模型 SE (RISR) 和 错误模型 SE (Aggregation/Naive) 的比率,比率越大,说明错误模型低估得越严重(即错得越离谱)。

由附录 A 的推导可以构造比率 \(K\)

\[ \text{Ratio } K = \frac{SE_{True}}{SE_{Naive}} = \sqrt{1 + \frac{I \cdot \tau_{11} \cdot s_x^2}{\sigma^2 + J \cdot \omega_{00}}} \]

  • 分子\(I\) (被试数), \(\tau_{11}\) (斜率变异), \(s_x^2\) (IV方差)
  • 分母\(\sigma^2\) (残差), \(J\) (题目数), \(\omega_{00}\) (被试截距变异)
  1. 被试数量 (\(I\)) 越多,低估越严重
  2. 题目数量 (\(J\)) 越少,低估越严重
  3. 被试截距变异 (\(\omega_{00}\)) 越小,低估越严重
  4. 应该是残差越小 (\(\sigma^2\) smaller),低估才越严重?

残差方差 (\(\sigma^2\)) 越大,低估越严重(❌?) larger underestimation when there is larger residual error variance❌


3. 模拟验证:大样本悖论 (The Big N Paradox)

这意味着,如果题目本身存在斜率变异(\(\tau_{11} > 0\)),而我们使用了传统模型(忽略它),我们会得到一个被严重低估的 SE

后果:分母变小 \(\rightarrow\) t 值虚高 \(\rightarrow\) 假阳性(Type I Error)。

而且,样本量 \(N\) 越大,错得越离谱。

图解: 只要看蓝色线(传统做法),当 \(N=3000\) 时,SE 几乎为 0。此时哪怕 \(\hat{\beta}\) 只有微小的 0.01,算出来的 \(t\) 值也会巨大无比,导致必然的显著。这解释了为什么大数据集特别容易出现 Random Item Slope 导致的假阳性。


4. 为什么常用指标无法诊断?

既然问题这么严重,为什么我们在做 Cronbach’s \(\alpha\) 或 SEM 模型拟合(CFI/RMSEA)时没有发现?

4.1 Cronbach’s \(\alpha\) 的盲区

\(\alpha\) 系数反映的是题目分数的内部一致性。 \[ Var(y_{ij}) = \underbrace{\omega_{00}}_{\text{人与人的巨大差异}} + \tau_{00} + \underbrace{\tau_{11}x_i^2}_{\text{微小的斜率差异}} + \sigma^2 \]

  • 现状:被试间的截距差异(\(\omega_{00}\),即有些人总是分高)通常占据了绝大部分方差。
  • 盲区\(\tau_{11}\)(对 IV 的反应差异)占比很小。\(\alpha\) 主要反映截距的一致性(\(\omega_{00}\)),对斜率层面的异质性(\(\tau_{11}\))不敏感 (Insensitive),Random Item Slope 的存在实际上会增加观察到的总编译,可能微弱地增加 \(\alpha\)

4.2 SEM 拟合指数的欺骗性

Common Factor Regression虽然比聚合回归严谨,它本质上是一个Constrained Model,它强迫所有题目通过潜变量产生联系:

  1. 残差吸收:SEM 将 Random Slope 的变异(\(u_{1j}x_i\))视为随机误差(Residuals, \(\epsilon\))。
  2. 拟合指标假阳性:只要这些变异没有破坏整体的协方差结构(通常确实没有,因为它们是关于斜率的,而不是关于截距的),SEM 的拟合指数(Global Fit Indices)就会出现假阴性,即明明模型设定错了,但 CFI 依然 > 0.95。

实证证据 (Real Data): 论文使用了 \(N=564\) 的真实数据发现,即使 CFI = 0.956, RMSEA = 0.087 这样被认为“可接受”的模型,在使用 RISR 检验后,依然发现了显著的 Random Item Slopes,且推翻了之前的显著性结论。

结论:高信度 (\(\alpha\)) 和高拟合度 (CFI) 不能 作为不存在 Random Item Slope 的证据。


第三部分:实证证据——模拟与真实数据

在建立了理论模型后,Donnellan 等人通过两步验证了 RISR 的必要性:首先在受控环境下(模拟)证明传统模型会犯错,然后在真实环境(实测数据)中证明这种情况确实存在。

1. 模拟研究 (Simulation Study)

研究者构建了 72 种不同的参数组合,系统改变了样本量 (\(N\))、题目数量 (\(J\)) 和随机斜率的方差大小 (\(\tau_{11}\))。

1.1 核心发现:Type I 错误率膨胀

在模拟中,设定 IV 和 DV 的真实平均关系为 0 (\(\beta_1 = 0\))。因此,任何“显著”的结果都是假阳性(Type I Error)。

图表解读: 1. 红色柱子 (Aggregation)蓝色柱子 (Common Factor): - 当存在随机题目斜率(\(\tau_{11} > 0\))时,随着样本量 (\(N\)) 的增加,错误率飙升,甚至接近 100%。 - 警示:这就是前文提到的“大样本悖论”。样本越大,传统模型越“确信”一个错误的结论。 2. 绿色柱子 (RISR): - 无论样本量多大,错误率始终控制在名义水平(0.05)左右。 - 证明了 RISR 模型能有效校正标准误(SE)。

1.2 只要有一点点变异就够了

模拟显示,即使随机题目斜率的方差非常小(仅占相关误差方差的 0.549%),在大样本下(\(N=1000\))也足以导致传统模型的统计推断失效。这说明这不是一个边缘问题,而是一个普遍的隐患。


2. 真实数据分析 (Real World Data)

为了证明这不仅仅是数学游戏,作者收集了 \(N=564\) 的数据,使用了心理学常用的量表(如大五人格、自我实现量表等)和反应时任务。

2.1 案例:年龄与自我实现 (Age & Self-Actualization)

这是一个最具戏剧性的例子。研究者探究“年龄”是否预测“自我实现”得分。

[图片占位符 2] 请在此处插入论文中的 Figure 5 (Self-Actualization Scores Predicted by Age)

结果对比: * 传统聚合回归:发现显著的负相关 (\(p < .001\))。结论:年龄越大,自我实现感越低。 * RISR 模型:结果不显著 (\(p = .066\))。 * 发生了什么? 观察 Figure 5 底部的小图可以发现,题目之间存在巨大的异质性: * Item 8 (“I fear failure”) 和 Item 14 对年龄非常敏感(强负相关)。 * 其他题目对年龄几乎没有反应,甚至呈正相关。 * 结论:所谓的“显著负相关”完全是由少数几个对年龄敏感的题目(主要关于“恐惧”)驱动的,不能推广到整个“自我实现”构念。

2.2 普遍性

在测试的所有 IV-DV 组合中,随机题目斜率普遍存在。在某些情况下,RISR 估计出的随机斜率方差甚至远大于模拟中设定的水平。这表明我们过去文献中许多“小而显著”的大样本效应,可能只是由于量表中混入了几个对 IV 特别敏感的题目。


第四部分:总结建议与实战应用

1. 总结讨论 (General Discussion)

1.1 另一种测量哲学

RISR 不仅仅是一个统计修正,它代表了一种不同的测量观 (Measurement Model): - Common Factor (SEM):认为题目是潜变量的“纯净”反映,题目特异性是“误差”。 - RISR:认为题目是构念的“样本”。题目本身具有因果力,允许题目与外部变量有独特的交互。我们应该把结论推广到“题库”,而不仅仅是“人”。

1.2 实践建议

  1. 警惕大样本中的微小显著效应:当 \(N\) 很大且效应量很小时,必须考虑题目斜率异质性的影响。
  2. 作为敏感性分析 (Sensitivity Check):不一定要完全抛弃传统方法,但应使用 RISR 验证核心结论是否稳健。
  3. 不要迷信 Fit Indices:CFI 和 Alpha 系数无法诊断这个问题。

2. R 语言实战教程 (How to fit RISR)

如何在自己的研究中实现这个模型?其实非常简单,只需要使用 lme4 包即可。

2.1 数据准备

关键在于数据必须是 长数据格式 (Long Format)。每一行是一个观察值(某人回答某题的分数)。

2.2 代码示范

我们将生成一个模拟数据集,并手把手演示如何由“聚合回归”转向“RISR”。

library(lme4)
library(dplyr)
library(ggplot2)

# --- 第一步:生成模拟数据 (Long Format) ---
set.seed(2025)
n_subj <- 200  # 200名被试
n_item <- 10   # 10个题目
ids <- rep(1:n_subj, each = n_item)
items <- rep(paste0("Item_", 1:n_item), times = n_subj)

# IV: 连续变量 (如 Age)
# 注意:IV 必须是 Participant-Level 的 (每人只有一个值)
IV_data <- data.frame(ID = 1:n_subj, IV = rnorm(n_subj))
data_long <- data.frame(ID = factor(ids), Item = factor(items)) %>%
  left_join(IV_data, by = "ID")

# 设定真实模型:
# Fixed Slope (Beta) = 0.1 (微弱正相关)
# Random Item Slope (Tau_11) = 存在显著异质性
item_slopes <- rnorm(n_item, mean = 0.1, sd = 0.3) # 每个题目有不同的真实斜率
names(item_slopes) <- unique(data_long$Item)

# 生成分数 Y
data_long$Slope_j <- item_slopes[data_long$Item]
data_long$Y <- 0 +  # Intercept
               (0.5 * rnorm(n_subj)[data_long$ID]) + # Random Subj Intercept
               (0.5 * rnorm(n_item)[as.numeric(data_long$Item)]) + # Random Item Intercept
               data_long$Slope_j * data_long$IV +    # Slope effect
               rnorm(nrow(data_long), 0, 1)          # Residual

# --- 第二步:传统做法 (Aggregation) ---
data_agg <- data_long %>%
  group_by(ID, IV) %>%
  summarise(Mean_Y = mean(Y), .groups="drop")

model_agg <- lm(Mean_Y ~ IV, data = data_agg)
print(summary(model_agg)$coefficients)

# --- 第三步:RISR 建模 (Using lme4) ---
# 语法解析:
# Y ~ IV : 固定效应 (Fixed Effect)
# (1 | ID) : 随机被试截距 (每个人基础分不同)
# (1 + IV | Item) : 随机题目效应 (核心!)
#      -> "1" 代表题目难度不同 (Random Item Intercept)
#      -> "IV" 代表题目对IV敏感度不同 (Random Item Slope)

model_risr <- lmer(Y ~ IV + (1 | ID) + (1 + IV | Item), 
                   data = data_long,
                   control = lmerControl(optimizer = "bobyqa")) # 优化器防报错

# --- 第四步:结果对比 ---
cat("\n=== 结果对比 ===\n")
cat("1. 聚合回归 t-value:", summary(model_agg)$coefficients["IV", "t value"], "\n")
cat("2. RISR 模型 t-value:", summary(model_risr)$coefficients["IV", "t value"], "\n")
cat("注意:RISR 的 t 值通常会变小(绝对值),因为 SE 变大了。\n")

# 提取并画出题目斜率 (可选)
# ranef(model_risr)$Item 包含了每个题目的截距和斜率
item_effects <- ranef(model_risr)$Item
item_effects$Item <- rownames(item_effects)
colnames(item_effects)[1:2] <- c("Intercept", "Slope_Deviation")

# 加上固定效应才是总斜率
fixed_slope <- fixef(model_risr)["IV"]
item_effects$Total_Slope <- item_effects$Slope_Deviation + fixed_slope

print(head(item_effects[, c("Item", "Total_Slope")]))

2.3 建模注意事项

  1. 收敛问题 (Convergence):如果模型不收敛,通常是因为模型太复杂而数据不足。可以尝试移除随机项之间的协方差,例如使用 (1 | Item) + (0 + IV | Item),或者换用 brms (贝叶斯方法)。
  2. 标准化:建议对 IV 和 DV 进行标准化(Standardization),有助于模型收敛和系数解释。
  3. 自由度问题lme4 默认不提供 p 值(因为自由度计算有争议)。可以使用 lmerTest 包自动加载 p 值,或者像论文一样关注 t 值(t > 1.96 视为显著)。

3. 结语

“Treat items as random samples, not fixed indicators.”

RISR 并不是要否定过去的所有研究,而是提醒我们在处理异质性题目大样本数据时,需要更加谦卑地对待统计推断的不确定性。当我们声称发现了一个关于“构念”的真理时,请确保这个真理不是仅由其中一两个题目驱动的。

LS0tDQp0aXRsZTogJ1JhbmRvbSBJdGVtIFNsb3BlIFJlZ3Jlc3Npb24nDQphdXRob3I6ICLmu5XmmZciDQpkYXRlOiAiMjAyNS0xMi0wMyINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0aGVtZTogZmxhdGx5DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICBkZl9wcmludDogcGFnZWQNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkocGF0Y2h3b3JrKQ0KbGlicmFyeShsYXZhYW4pDQpsaWJyYXJ5KHNlbVBsb3QpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmBgYA0KDQojIOiDjOaZr+S4jumXrumimOW8leWFpQ0KDQojIyAxLiDnur/mgKfmqKHlnovnmoTmlbDmja7nu5PmnoQNCg0K5Zyo5b+D55CG5a2m56CU56m25Lit77yM57uP5bi45L2/55So5re35ZCI57q/5oCn5qih5Z6L77yITWl4ZWQtRWZmZWN0cyBNb2RlbHPvvInmiJbnsbvkvLznmoTmgJ3mg7PjgILlgYforr7miJHku6znoJTnqbYgKirigJzlubTpvoQgKEFnZSwgSVYp4oCdKiog5a+5ICoq4oCc5aSW5ZCR5oCnIChFeHRyYXZlcnNpb24sIERWKeKAnSoqIOeahOW9seWTjeOAgg0KDQrmiJHku6zpnIDopoHljLrliIbkuKTkuKrlsYLpnaLnmoTlj5jlvILvvJoNCg0KIyMjIDEuMSDooqvor5XlsYLpnaIgKFBhcnRpY2lwYW50IExldmVsKQ0KDQotICAgKirooqvor5XmiKrot50gKFBhcnRpY2lwYW50IEludGVyY2VwdCkqKu+8muS4jeWQjOS6uueahOWfuuehgOWkluWQkeaAp+WIhuaVsOS4jeWQjO+8iOacieS6uuWkqeeUn+ekvueJm++8jOacieS6uuekvuaBkO+8ieOAgg0KLSAgICoq6KKr6K+V5pac546HIChQYXJ0aWNpcGFudCBTbG9wZSkqKu+8muW5tOm+hOWinumVv+WvueS4jeWQjOS6uueahOW9seWTjeWPr+iDveS4jeWQjO+8iOiuuuaWh+S4u+imgeiuqOiuuuiiq+ivlemXtOiuvuiuoe+8jOS4jeiuqOiuuuatpOWxgumdoueahOmaj+acuuaWnOeOh++8iQ0KDQojIyMgMS4yIOmimOebruWxgumdoiAoSXRlbSBMZXZlbCkg4oCU4oCUIOacrOasoeaKpeWRiueahOaguOW/gw0KDQrpopjnm67kuZ/mnInlhbbni6znibnnmoTlsZ7mgKfvvIzkvYblvoDlvoDooqvmiJHku6zlv73nlaXjgIINCg0KLSAgICoq6aKY55uu5oiq6LedIChJdGVtIEludGVyY2VwdCA9IOmavuW6pi/pgJrkv5fluqYpKirvvJoNCiAgICAtICAg5pyJ5Lqb6aKY5a655piT5b6X5YiG77yI5L6L5aaC77ya4oCc5oiR5Zac5qyi5ZKM5Lq66K+06K+d4oCd77yJ44CCDQogICAgLSAgIOacieS6m+mimOmavuW+l+WIhu+8iOS+i+Wmgu+8muKAnOaIkeWWnOasoua8lOiusuKAne+8ieOAgg0KICAgIC0gICAq546w54q277yaKiDov5nkuIDngrnkvKDnu5/mlrnms5XvvIhJUlQg5oiWIFNFTe+8ieWkhOeQhuW+l+W+iOWlve+8iOmAmui/h+mimOebruWPguaVsOaIlui9veiNt+aIqui3ne+8ieOAgg0KLSAgICoq6aKY55uu5pac546HIChJdGVtIFNsb3BlID0g5a+5IElWIOeahOaVj+aEn+W6pikqKu+8mg0KICAgIC0gICAqKuaguOW/g+mXrumimCoq77yaSVYg5a+55LiN5ZCM6aKY55uu55qE6aKE5rWL5Yqb5piv5LiA5qC355qE5ZCX77yfDQogICAgLSAgICrkuL7kvosq77ya6ZqP552A5bm06b6E5aKe6ZW/77yM4oCc5Zac5qyi5ZKM5Lq66K+06K+d4oCd6L+Z56eN5rip5ZKM55qE56S+5Lqk5Y+v6IO95Y+Y5YyW5LiN5aSn77yIU2xvcGUgJFxhcHByb3gkIDDvvInvvJvkvYbigJzllpzmrKLmvJTorrLigJ3ov5nnp43ov73msYLliLrmv4DnmoTnpL7kuqTlj6/og73kvJrmgKXliafkuIvpmY3vvIhTbG9wZSBcPCAw77yJ44CCDQogICAgLSAgICrnjrDnirYq77ya6L+Z5piv5Lyg57uf5pa55rOV5YGH6K6+5Li6Kirlm7rlrpoqKueahOWcsOaWueOAgg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMgMi4g5pyq6KKr5bu65qih55qE5Lqk5LqS5L2c55So5pa55beuIChVbm1vZGVsZWQgSW50ZXJhY3Rpb24gVmFyaWFuY2UpDQoNCuWmguaenOWtmOWcqOS4iui/sOeahOmimOebruaWnOeOh+W3ruW8gu+8iOWNsyBJViDkuI4gSXRlbXMg5a2Y5Zyo5Lqk5LqS5L2c55So77yJ77yM5L2G5oiR5Lus5Zyo5YiG5p6Q5pe25by66KGM5b+955Wl5a6D77yM5Lya5Y+R55Sf5LuA5LmI77yfDQoNCmBgYHtyIGludGVyYWN0aW9uLWRlbW8sIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTh9DQpzZXQuc2VlZCgxMjMpDQpuX3N1YmogPC0gNTANCmFnZSA8LSBybm9ybShuX3N1YmosIG1lYW4gPSAyMCwgc2QgPSAxMCkgIyBJVg0KDQojIOWBh+iuvuaehOW/teeUsTLkuKrpopjnm67mtYvph48NCiMgSXRlbSAxOiDpmo/lubTpvoTlop7plb/nqI3lvq7lop7liqAgKFNsb3BlID0gMC4wNSkNCiMgSXRlbSAyOiDpmo/lubTpvoTlop7plb/mmL7okZflh4/lsJEgKFNsb3BlID0gLTAuMDUpDQojIOW5s+Wdh+aViOW6lCAoVHJ1ZSBFZmZlY3QpOiAwIChJdGVtcyDnm7jkupLmirXmtogpDQoNCml0ZW0xX3Njb3JlcyA8LSAwLjA1ICogYWdlICsgcm5vcm0obl9zdWJqKQ0KaXRlbTJfc2NvcmVzIDwtIC0wLjA1ICogYWdlICsgcm5vcm0obl9zdWJqKQ0KDQpkZW1vX2RhdGEgPC0gZGF0YS5mcmFtZSgNCiAgSUQgPSByZXAoMTpuX3N1YmosIDIpLA0KICBBZ2UgPSByZXAoYWdlLCAyKSwNCiAgU2NvcmUgPSBjKGl0ZW0xX3Njb3JlcywgaXRlbTJfc2NvcmVzKSwNCiAgSXRlbSA9IHJlcChjKCJJdGVtIDEgKOa4qeWSjOekvuS6pCkiLCAiSXRlbSAyICjliLrmv4DnpL7kuqQpIiksIGVhY2ggPSBuX3N1YmopDQopDQoNCiMg6K6h566X6IGa5ZCI5YiG5pWwIChBZ2dyZWdhdGlvbikNCmFnZ19kYXRhIDwtIGRlbW9fZGF0YSAlPiUNCiAgZ3JvdXBfYnkoSUQsIEFnZSkgJT4lDQogIHN1bW1hcmlzZShNZWFuX1Njb3JlID0gbWVhbihTY29yZSkpDQoNCiMgLS0tIOe7mOWbviAtLS0NCnAxIDwtIGdncGxvdChkZW1vX2RhdGEsIGFlcyh4ID0gQWdlLCB5ID0gU2NvcmUsIGNvbG9yID0gSXRlbSwgZ3JvdXAgPSBJdGVtKSkgKw0KICBnZW9tX3BvaW50KGFscGhhID0gMC4zKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIHNpemUgPSAxLjUpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh0aXRsZSA9ICLnnJ/lrp7mg4XlhrXvvJrpopjnm67mlpznjoflvILotKjmgKciLCBzdWJ0aXRsZSA9ICLkuI3lkIzpopjnm67lr7kgQWdlIOeahOWPjeW6lOaIqueEtuS4jeWQjCIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpDQoNCnAyIDwtIGdncGxvdChhZ2dfZGF0YSwgYWVzKHggPSBBZ2UsIHkgPSBNZWFuX1Njb3JlKSkgKw0KICBnZW9tX3BvaW50KGFscGhhID0gMC4zKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEuNSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHRpdGxlID0gIuiBmuWQiOWIhuaekCAoQWdncmVnYXRpb24pIiwgc3VidGl0bGUgPSAi5by66KGM5bmz5Z2H5ZCO77yM5pac546H55u45LqS5oq15raI77yM5o6p55uW5LqG55yf5a6e5py65Yi2IikNCg0KcDEgKyBwMg0KYGBgDQogIA0KPiAqKuWmguWbvuaJgOekuioq77yaIOW3puWbvuS4re+8jElWIOS4jiBJdGVtcyDlrZjlnKjmmI7mmL7nmoTkuqTkupLkvZznlKjvvIjmlpznjofkuIDmraPkuIDotJ/vvInjgIIg5Y+z5Zu+5Lit77yM5L2/55So6IGa5ZCI77yI5rGC5bmz5Z2H77yJ5pa55rOV5pe277yM6L+Z56eN5Liw5a+M55qE5Lqk5LqS5L+h5oGv5Lii5aSx5LqG44CC6L+Z6YOo5YiGKirmnKrooqvlu7rmqKHnmoTkuqTkupLkvZznlKjmlrnlt64qKu+8jOWcqOWQjue7ree7n+iuoeajgOmqjOS4reS8muiiq+mUmeivr+WcsOWkhOeQhuOAgg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMgMy4g5qaC5YyW55CG6K66IChHZW5lcmFsaXphYmlsaXR5IFRoZW9yeSkg55qE5oKW6K66DQoNCioq5qaC5YyW55CG6K66KirorqTkuLrvvJrkuLrkuoborqnnu5PorrrlhbfmnInmjqjlub/mgKfvvIznu5/orqHkuIrlupTlgYforr7miJHku6zkvb/nlKjnmoTpopjnm67mmK/ku47kuIDkuKoqKuaXoOmZkOmimOW6kyAoaW5maW5pdGUgcG9vbCBvZiBpdGVtcykqKiDkuK3pmo/mnLrmir3lj5bnmoTjgILov5nmhI/lkbPnnYDpopjnm67lupTlvZPooqvop4bkuLoqKumaj+acuuaViOW6lCAoUmFuZG9tIEVmZmVjdCkqKuOAgg0KDQrlnKjlrp7pmYXmlbDmja7liIbmnpDkuK3pmbflhaXkuobkuIDkuKrmgpborrrvvJoNCg0KMS4gICoq55CG6K665LiKKirvvJrmib/orqTpopjnm67mmK/pmo/mnLrph4fmoLfnmoTvvIzljbPlupTor6Xop4bkvZzpmo/mnLrmlYjlupTjgIINCg0KMi4gICoq5bu65qih5pe2KirvvJrmnKrogIPomZHpopjnm67nmoTpmo/mnLrmlYjlupTvvIzlj5jnm7jlgYflrprov5nkuptJdGVtc+WvuSBJViDnmoTlj43lupTmmK/lm7rlrprmlYjlupTvvIhGaXhlZCBFZmZlY3TvvInjgIINCg0KPiAqKuW8gui0qOaApyhIZXRlcm9nZW5laXR5KeimgeaxguS4juWQjOi0qOaApyAoSG9tb2dlbmVpdHkpIOeahOivr+inoyoq77yaDQo+DQo+IOacieeahOeglOeptuWcqOiuvuiuoemimOebruihqOi+vuamguW/tS/mnoTlv7Xml7bvvIzkuLrkuobpq5jlpJbpg6jmlYjluqbvvIzkvJrku47kuI3lkIzop5Lluqborr7orqHpopjnm67vvIzov5nkupvpopjnm67mnKzouqvlrZjlnKjlvILotKjmgKcNCj4NCj4g6YCA5LiA5q2l6K6y77yM5bCx566X6aKY55uu5piv5ZCM6LSo55qE77yM5Lmf5Y+q5Luj6KGo5a6D5Lus4oCc6ZW/5b6X5YOP4oCd77yI5YaF6YOo55u45YWz6auY77yJ77yM5LiN5Luj6KGo5a6D5Lus5a+55aSW6YOo5Y+Y6YeP77yISVbvvInnmoTlj43lupTvvIhTbG9wZe+8ieS5n+aYr+S4gOagt+eahA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMgNC4g6Zeu6aKY5Ye6546w77ya546w5pyJ5qih5Z6L55qE6KeG6ICM5LiN6KeBDQoNCuaXoOiuuuaYr+eugOWNleeahOWbnuW9ku+8iEFnZ3JlZ2F0aW9u77yJ6L+Y5piv5aSN5p2C55qE57uT5p6E5pa556iL5qih5Z6L77yIU0VN77yJ77yM6YO95Zyo5LiN5ZCM56iL5bqm5LiK5oq55p2A5LqG6L+Z56eN6aKY55uu5bGC6Z2i55qE5pac546H5LiN5LiA6Ie044CCDQoNCiMjIyA0LjEg5Lik56eN5b+96KeG55qE5pa55byPDQoNCjEuICAqKuiBmuWQiOaooeWeiyAoQWdncmVnYXRpb24gUmVncmVzc2lvbikqKu+8mg0KICAgIC0gICDlgZrms5XvvJrmsYLlubPlnYfliIbjgIINCiAgICAtICAg5YGH6K6+77ya5omA5pyJ6aKY55uu5a+55p6E5b+155qE6LSh54yu55u4562J77yI5p2D6YeNPTHvvInvvIzkuJTlr7kgSVYg55qE5Y+N5bqU5pac546H5a6M5YWo55u45ZCM44CCDQogICAgLSAgIOe7k+aenO+8muS4ouWkseaJgOaciemimOebrueJueW8guaAp+S/oeaBr+OAgg0KMi4gICoq57uT5p6E5pa556iL5qih5Z6LIChDb21tb24gRmFjdG9yIC8gU0VNKSoq77yaDQogICAgLSAgIOWBmuazle+8mua9nOWPmOmHj+W7uuaooeOAgg0KICAgIC0gICDlgYforr7vvJrpopjnm67lr7kgSVYg55qE5Y+N5bqU5b+F6aG76YCa6L+H4oCc5r2c5Y+Y6YeP4oCd5Lyg5a+844CC6L+Z5oSP5ZGz552A77yM5aaC5p6cIEl0ZW0gQSDnmoTovb3ojbfmmK8gSXRlbSBCIOeahDLlgI3vvIzpgqPkuYggSXRlbSBBIOWvuSBJViDnmoTmlpznjofkuZ/lv4XpobvkuKXmoLzmmK8gSXRlbSBCIOeahDLlgI3jgIINCiAgICAtICAg5bGA6ZmQ77yaSVYg5peg5rOVKirnm7TmjqUqKuS4juWNleS4qiBJdGVtIOS6p+eUn+eLrOeJueeahOS6pOS6kuS9nOeUqOOAguaooeWei+S8muaKiui/memDqOWIhuacrOivpeWxnuS6juKAnFJhbmRvbSBTbG9wZeKAneeahOWPmOW8gu+8jOmUmeivr+WcsOW9k+S9nOS6huWNlee6r+eahOaui+W3ruOAgg0KDQojIyMgNC4yIOaooeWei+WBh+iuvuWvueavlA0KDQpgYGB7ciBzaW11bGF0aW9uLXBsb3QsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTEyfQ0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgMS4g6L+b6Zi25pWw5o2u55Sf5oiQ77ya5p6E6YCg4oCc55+b55u+4oCd5oOF5aKDDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0Kc2V0LnNlZWQoOTk5KSAjIOaNouS4gOS4quenjeWtkOehruS/neaViOaenOaYjuaYvg0KTiA8LSAzMDANCkogPC0gNQ0KSVYgPC0gcm5vcm0oTiwgMCwgMSkNCg0KIyBBLiDnlJ/miJDmvZzlj5jph48gKEZhY3RvcikNCiMg5YGH6K6+IElWIOWvuea9nOWPmOmHj+acieW8uuato+WQkeW9seWTjSAoQmV0YSA9IDAuNikNCkxhdGVudF9GIDwtIDAuNiAqIElWICsgcm5vcm0oTiwgMCwgMC44KQ0KDQojIEIuIOeUn+aIkOmimOebriAoSXRlbXMpDQojIOWFs+mUrueCue+8muaJgOaciemimOebruWcqOa1i+mHj+aooeWei+S4iumDveaYr+KAnOWlvemimOKAne+8iOato+WQkei9veiNt++8ie+8jOWGhemDqOS4gOiHtOaAp+mrmA0KIyB5ID0gMS4wICogRiArIHVuaXF1ZV9lZmZlY3QgKyBlcnJvcg0Kc2ltX2RhdGFfd2lkZSA8LSBkYXRhLmZyYW1lKElEID0gMTpOLCBJViA9IElWKQ0Kc2ltX2RhdGFfbG9uZyA8LSBkYXRhLmZyYW1lKCkNCg0KIyDpopjnm64gMS0077ya5a6M5YWo5ZCs5LuO5r2c5Y+Y6YeP5oyH5oylDQpmb3IoaiBpbiAxOjQpew0KICB5IDwtIDEuMCAqIExhdGVudF9GICsgcm5vcm0oTiwgMCwgMSkgDQogIHNpbV9kYXRhX3dpZGVbW3Bhc3RlMCgieSIsIGopXV0gPC0geQ0KICBzaW1fZGF0YV9sb25nIDwtIHJiaW5kKHNpbV9kYXRhX2xvbmcsIGRhdGEuZnJhbWUoSUQ9MTpOLCBJVj1JViwgSXRlbT1wYXN0ZTAoIkl0ZW0iLCBqKSwgU2NvcmU9eSkpDQp9DQoNCiMg6aKY55uuIDXvvJrlj5vpgIbogIUgKEl0ZW0gU3BlY2lmaWMgRWZmZWN0KQ0KIyDlroPomb3nhLbmtYvph4/lkIzkuIDkuKrmvZzlj5jph4/vvIjmnIkgKzEuMCAqIEbvvInvvIzkvYYgSVYg5a+55a6D5pyJ6aKd5aSW55qE55u05o6l6LSf6Z2i5omT5Ye7ICgtMS41ICogSVYpDQojIOWHgOaViOW6lChOZXQgU2xvcGUpIOKJiCAwLjYgKGZyb20gRikgLSAxLjUgKERpcmVjdCkgPSAtMC45DQp5NSA8LSAxLjAgKiBMYXRlbnRfRiAtIDEuNSAqIElWICsgcm5vcm0oTiwgMCwgMSkNCnNpbV9kYXRhX3dpZGUkeTUgPC0geTUNCnNpbV9kYXRhX2xvbmcgPC0gcmJpbmQoc2ltX2RhdGFfbG9uZywgZGF0YS5mcmFtZShJRD0xOk4sIElWPUlWLCBJdGVtPSJJdGVtNSIsIFNjb3JlPXk1KSkNCg0KDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyAyLiDmqKHlnovmi5/lkIgNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpsaWJyYXJ5KGxhdmFhbikNCg0KIyAtLS0gQS4g6IGa5ZCI5Zue5b2SIC0tLQ0Kc2ltX2RhdGFfd2lkZSRNZWFuX1Njb3JlIDwtIHJvd01lYW5zKHNpbV9kYXRhX3dpZGVbLCBwYXN0ZTAoInkiLCAxOjUpXSkNCmFnZ19tb2RlbCA8LSBsbShNZWFuX1Njb3JlIH4gSVYsIGRhdGEgPSBzaW1fZGF0YV93aWRlKQ0KYWdnX2ludGVyY2VwdCA8LSBjb2VmKGFnZ19tb2RlbClbMV0NCmFnZ19zbG9wZSAgICAgPC0gY29lZihhZ2dfbW9kZWwpWzJdDQoNCiMgLS0tIEIuIFNFTSAoQ29tbW9uIEZhY3RvcikgLS0tDQpzZW1fc3ludGF4IDwtICcNCiAgRjEgPX4geTEgKyB5MiArIHkzICsgeTQgKyB5NQ0KICBGMSB+IElWDQonDQpzZW1fZml0IDwtIHNlbShzZW1fc3ludGF4LCBkYXRhID0gc2ltX2RhdGFfd2lkZSwgc3RkLmx2ID0gVFJVRSkNCg0KIyDmj5Dlj5YgU0VNIOmakOWQq+eahOWbnuW9kue6vw0KZXN0IDwtIHBhcmFtZXRlckVzdGltYXRlcyhzZW1fZml0KQ0KZ2FtbWEgPC0gZXN0W2VzdCRvcCA9PSAifiIgJiBlc3QkbGhzID09ICJGMSIgJiBlc3QkcmhzID09ICJJViIsICJlc3QiXSAjIOa9nOWPmOmHj+aWnOeOhw0Kc2VtX2xpbmVzIDwtIGRhdGEuZnJhbWUoKQ0KDQpmb3IoaiBpbiAxOjUpew0KICBpdGVtX25hbWUgPC0gcGFzdGUwKCJ5IiwgaikNCiAgIyDmiKrot50NCiAgbnUgPC0gZXN0W2VzdCRvcCA9PSAifjEiICYgZXN0JGxocyA9PSBpdGVtX25hbWUsICJlc3QiXQ0KICBpZihsZW5ndGgobnUpPT0wKSBudSA8LSBtZWFuKHNpbV9kYXRhX3dpZGVbW2l0ZW1fbmFtZV1dKQ0KICAjIOi9veiNtw0KICBsYW0gPC0gZXN0W2VzdCRvcCA9PSAiPX4iICYgZXN0JHJocyA9PSBpdGVtX25hbWUsICJlc3QiXQ0KICANCiAgIyDov5nph4znmoTlhbPplK7vvJpTRU0g5by66KGM6K6k5Li6IOaWnOeOhyA9IOi9veiNtyAqIEdhbW1hDQogICMg5Zug5Li6IHkxLXk0IOmDveaYr+ato+ebuOWFs++8jEdhbW1hIOaYr+ato+eahO+8jOS4lOaJgOaciemimOebruWGhemDqOato+ebuOWFs++8jA0KICAjIFNFTSDkvJrkvLDorqHlh7ogeTUg55qE6L296I235Lmf5piv5q2j55qE77yI5Zug5Li6IHk1IOS5n+WPlyBMYXRlbnRfRiDlvbHlk43vvIkNCiAgIyDkuo7mmK8gU0VNIOS8mumUmeivr+WcsOmihOa1iyB5NSDpmo/nnYAgSVYg5aKe5Yqg6ICM5aKe5YqgDQogIGltcGxpZWRfc2xvcGUgPC0gbGFtICogZ2FtbWENCiAgDQogIHRlbXAgPC0gZGF0YS5mcmFtZShJViA9IHNlcShtaW4oSVYpLCBtYXgoSVYpLCBsZW5ndGgub3V0PTEwMCksIEl0ZW09cGFzdGUwKCJJdGVtIiwgaikpDQogIHRlbXAkU2NvcmUgPC0gbnUgKyBpbXBsaWVkX3Nsb3BlICogdGVtcCRJVg0KICBzZW1fbGluZXMgPC0gcmJpbmQoc2VtX2xpbmVzLCB0ZW1wKQ0KfQ0KDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyAzLiDnu5jlm77lr7nmr5QNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBhdGNod29yaykNCg0KY29tbW9uX3RoZW1lIDwtIHRoZW1lX2J3KCkgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKSkNCg0KIyBQbG90IDE6IEFnZ3JlZ2F0aW9uDQpwX2FnZyA8LSBnZ3Bsb3Qoc2ltX2RhdGFfbG9uZywgYWVzKHggPSBJViwgeSA9IFNjb3JlKSkgKw0KICBnZW9tX3BvaW50KGNvbG9yPSJncmV5IiwgYWxwaGE9MC4zKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IGFnZ19pbnRlcmNlcHQsIHNsb3BlID0gYWdnX3Nsb3BlLCBjb2xvciA9ICIjRDU1RTAwIiwgc2l6ZSA9IDIpICsNCiAgbGFicyh0aXRsZSA9ICIxLiBBZ2dyZWdhdGlvbiIsIHN1YnRpdGxlID0gIueugOWNleW5s+Wdh++8jOW9u+W6leaOqeebliBJdGVtIDUiKSArIA0KICB5bGltKC00LCA0KSArIGNvbW1vbl90aGVtZQ0KDQojIFBsb3QgMjogU0VNDQojIOazqOaEj+eci+e0q+iJsue6vyAoSXRlbSA1KQ0KcF9zZW0gPC0gZ2dwbG90KCkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBzaW1fZGF0YV9sb25nLCBhZXMoeCA9IElWLCB5ID0gU2NvcmUsIGNvbG9yID0gSXRlbSksIGFscGhhID0gMC4xKSArDQogIGdlb21fbGluZShkYXRhID0gc2VtX2xpbmVzLCBhZXMoeCA9IElWLCB5ID0gU2NvcmUsIGNvbG9yID0gSXRlbSksIHNpemUgPSAxLjIpICsNCiAgbGFicyh0aXRsZSA9ICIyLiBTRU0gKENvbW1vbiBGYWN0b3IpIiwgDQogICAgICAgc3VidGl0bGUgPSAi5by65Yi25LiA6Ie05oCn77yaXG7nlLHkuo4gSXRlbSA1IOWxnuS6juivpeaehOW/te+8jFNFTSDlvLrooYzpooTmtYvlroNcbumajyBJViDlop7liqDogIzlop7liqAgKOe0q+iJsue6v+WQkeS4iinjgIJcbui/meS4juaVsOaNruS6i+WunijmlaPngrnlkJHkuIsp5a6M5YWo55u45Y+N77yBIikgKw0KICB5bGltKC00LCA0KSArIGNvbW1vbl90aGVtZQ0KDQojIFBsb3QgMzogUmVhbCBEYXRhIC8gUklTDQpwX3JpcyA8LSBnZ3Bsb3Qoc2ltX2RhdGFfbG9uZywgYWVzKHggPSBJViwgeSA9IFNjb3JlLCBjb2xvciA9IEl0ZW0pKSArDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgc2l6ZSA9IDEuMikgKw0KICBsYWJzKHRpdGxlID0gIjMuIFJlYWwgRGF0YSAoUklTKSIsIA0KICAgICAgIHN1YnRpdGxlID0gIuecn+ebuO+8mlxuSXRlbSA1ICjntKvoibIpIOWunumZheS4iuaYr+i0n+ebuOWFs+eahOOAglxu6L+Z5pivIFNFTSDml6Dms5XmjZXmjYnnmoTnibnlvILmgKfmlpznjofjgIIiKSArDQogIHlsaW0oLTQsIDQpICsgY29tbW9uX3RoZW1lDQoNCnBfYWdnICsgcF9zZW0gKyBwX3Jpcw0KYGBgDQoNCmBgYHtyIHNlbS1wYXRoLWRpYWdyYW0sIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpteV9sYWJlbHMgPC0gYygiSXRlbSAxIiwgIkl0ZW0gMiIsICJJdGVtIDMiLCAiSXRlbSA0IiwgIkl0ZW0gNSIsICJJViIsICJGYWN0b3IiKQ0KDQpzZW1QYXRocyhvYmplY3QgPSBzZW1fZml0LA0KICAgICAgICAgd2hhdCA9ICJzdGQiLA0KICAgICAgICAgd2hhdExhYmVscyA9ICJzdGQiLA0KICAgICAgICAgbGF5b3V0ID0gInRyZWUyIiwgIA0KICAgICAgICAgZWRnZS5sYWJlbC5jZXggPSAxLCANCiAgICAgICAgIHJvdGF0aW9uID0gMiwNCiAgICAgICAgIG5vZGVMYWJlbHMgPSBteV9sYWJlbHMsDQopDQoNCnRpdGxlKCJDb21tb24gRmFjdG9yIE1vZGVsIChTRU0pIOi3r+W+hOWbviIsIGFkaiA9IDAuNSwgbGluZSA9IDIpDQptdGV4dCgiSVYg5YiwIEl0ZW0gNSDmsqHmnInnm7TmjqXot6/lvoTvvIzlv4Xpobvnu4/ov4cgRjEiLCBzaWRlID0gMSwgbGluZSA9IDAsIGNleCA9IDEuMikNCmBgYA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KDQoNCg0KDQoNCg0KIyDnrKzkuozpg6jliIbvvJrnkIborrrmqKHlnovigJTigJRSYW5kb20gSXRlbSBTbG9wZSBSZWdyZXNzaW9uIChSSVNSKQ0KDQojIyAxLiDmqKHlnovnmoTmlbDlrabooajovr4NCg0K6ZKI5a+556ys5LiA6YOo5YiG5o+Q5Ye655qE6Zeu6aKY77yM5paH56ug5q2j5byP5o+Q5Ye65LqGICoqUmFuZG9tIEl0ZW0gU2xvcGUgUmVncmVzc2lvbiAoUklTUikqKiDmqKHlnovjgILov5nmmK/nkIbop6PkuIDliIfmjqjmlq3osKzor6/nmoTln7rnn7PjgIINCg0KIyMjIDEuMSDkvKDnu5/mqKHlnosgdnMuIFJJU1LmqKHlnosNCg0KKirkvKDnu5/ogZrlkIjlm57lvZIgKEFnZ3JlZ2F0aW9uIE1vZGVsKSoq77yaIOWBh+iuvumimOebruWvuSBJViDnmoTlj43lupTmmK/lm7rlrprnmoTjgIHkuIDoh7TnmoTjgIIgJCQgeV9pID0gXGJldGFfMCArIFxiZXRhXzEgeF9pICsgXGVwc2lsb25faSAkJA0KDQoqKumaj+acuumimOebruaWnOeOh+WbnuW9kiAoUklTUiwgRXF1YXRpb24gNCkqKu+8miDlgYforr7popjnm67mmK/ku47popjlupPkuK3pmo/mnLrmir3lj5bnmoTvvIzlr7kgSVYg55qE5pWP5oSf5bqm5ZCE5LiN55u45ZCM44CCICQkIHlfe2lqfSA9IFxiZXRhXzAgKyB1X3swaX0gKyB1X3swan0gKyAoXGJldGFfMSArIFxtYXRoYmZ7dV97MWp9fSl4X2kgKyBcZXBzaWxvbl97aWp9ICQkDQoNCg0K5YW25Lit5qC45b+D5beu5byC5Zyo5LqOICRcbWF0aGJme3VfezFqfX0k77yaIFwqICR1X3sxan0kIOS7o+ihqOesrCAkaiQg5Liq6aKY55uu54us5pyJ55qE5pac546H5YGP56a777yIUmFuZG9tIEl0ZW0gU2xvcGXvvInjgIIgXCog5pyN5LuO5q2j5oCB5YiG5biDICR1X3sxan0gXHNpbSBOKDAsIFx0YXVfezExfSkk44CCIFwqICRcdGF1X3sxMX0kIOihoemHj+S6humimOebrumXtOWvuSBJViDlj43lupTnmoTlvILotKjmgKfnqIvluqbjgIINCg0KLSAgICoqJHVfezFqfSQgKFJhbmRvbSBJdGVtIFNsb3BlKSoqLCAkdV97MWp9IFxzaW0gTigwLCBcdGF1X3sxMX0pJO+8mg0KICAgICogICAqKumimOebruWvuSBJViDlj43lupTnmoTnibnlvILmgKcqKg0KICAgICogICDlroPku6Pooajkuobpopjnm64gJGokIOWvuSAkeCQg55qE5pWP5oSf56iL5bqm5YGP56a75bmz5Z2H5pac546HICRcYmV0YV8xJCDlpJrlsJENCiAgICAqICAgKirlrp7pmYXmlpznjocqKu+8muWvueS6jumimOebriAkaiQg5p2l6K+077yM5a6D55yf5a6e55qE5pac546H5pivICQoXGJldGFfMSArIHVfezFqfSkkDQogICAgKiAgICoqQWdncmVnYXRpb24vU0VNIOmakOWQq+WBh+iuvioq77yaJHVfezFqfSA9IDAkICjljbPmlrnlt64gJFx0YXVfezExfSA9IDAkKQ0KICAgICogICAqKlJJU1Ig5qC45b+D5YGH6K6+KirvvJokXHRhdV97MTF9ID4gMCQNCg0KLSAgICoqJHVfezBpfSQgKFJhbmRvbSBQYXJ0aWNpcGFudCBJbnRlcmNlcHQpKiosICR1X3swaX0gXHNpbSBOKDAsIFx0YXVfezAwfV57KHN1YmopfSkk77yaDQogICAgKiAgICoq6KKr6K+V55qE54m55byC5oCnKioNCiAgICAqICAg5q+U5aaC77ya5byg5LiJ5pys6Lqr5bCx5YC+5ZCR5LqO5omT6auY5YiG77yM5LuW55qEICR1X3swaX0kIOWwseaYr+ato+eahA0KDQotICAgKiokdV97MGp9JCAoUmFuZG9tIEl0ZW0gSW50ZXJjZXB0KSoqLCAkdV97MGp9IFxzaW0gTigwLCBcdGF1X3swMH1eeyhpdGVtKX0pJO+8mg0KICAgICogICAqKumimOebrueahOmavuaYk+W6pi/pgJrkv5fluqYqKg0KICAgICogICDmr5TlpoLvvJrpopjnm64gMSDmjqrovp7lvojor7HkurrvvIzlpKflrrbpg73lrrnmmJPlvpfliIbvvIzlroPnmoQgJHVfezBqfSQg5bCx5piv5q2j55qEDQoNCi0gICAqKiRcZXBzaWxvbl97aWp9JCAoUmVzaWR1YWwpKiosICRcZXBzaWxvbl97aWp9IFxzaW0gTigwLCBcc2lnbWFeMikk77yaDQoNCg0KLS0tLS0tLS0tLS0tLQ0KDQojIyAyLiDoh7Tlkb3nmoTnu5/orqHlkI7mnpzvvJpTRSDkvY7kvLDkuI4gdCDlgLzohqjog4ANCg0K5Li65LuA5LmI5b+955WlICR1X3sxan0kIOS8muWvvOiHtOS4pemHjeeahOWBh+mYs+aAp++8iFR5cGUgSSBFcnJvcu+8ie+8n+agueacrOWOn+WboOWcqOS6jiR0JCDmo4DpqoznmoTmnLrliLblpLHmlYjjgIINCg0KIyMjIDIuMSB0IOWAvOeahOiuoeeul+mAu+i+kQ0KDQrlnKjnur/mgKflm57lvZLkuK3vvIzliKTmlq3mmL7okZfmgKfnmoQgJHQkIOWAvOiuoeeul+WFrOW8j+S4uu+8miAkJCB0ID0gXGZyYWN7XHRleHR7RXN0aW1hdGV9fXtcdGV4dHtTdGFuZGFyZCBFcnJvcn19ID0gXGZyYWN7XGhhdHtcYmV0YX1fMX17U0UoXGhhdHtcYmV0YX1fMSl9ICQkDQoNCiMjIyAyLjIgU0Ug55qE5pWw5a2m5o6o5a+85a+55q+UDQoNCuagueaNruiuuuaWh+mZhOW9leivgeaYju+8jOS4pOenjeaooeWei+WvuSBTRSDnmoTkvLDorqHmiKrnhLbkuI3lkIzvvJoNCg0KLSAgICoq5Lyg57uf5qih5Z6LIChOYWl2ZSBTRSkqKu+8miDorqTkuLrlj6ropoHlop7liqDooqvor5Xph48gJE4k77yM6K+v5beu5bCx6IO95peg6ZmQ57yp5bCP44CCICQkIFNFX3tuYWl2ZX0gXGFwcHJveCBcc3FydHtcZnJhY3tcc2lnbWFeMl97cmVzaWR1YWx9fXtOIFx0aW1lcyBKIFx0aW1lcyBcc2lnbWFeMl94fX0gJCQgXD4g5b2TICROIFx0byBcaW5mdHkk77yMICRTRSBcdG8gMCTjgIINCg0KLSAgICoqUklTUiDmqKHlnosgKFRydWUgU0UpKirvvJog5byV5YWl5LqG6aKY55uu6YeH5qC355qE5LiN56Gu5a6a5oCn77yIR2VuZXJhbGl6YXRpb24gRXJyb3LvvInjgIIgJCQgU0Vfe3RydWV9KEExMOWPmOW9oikgXGFwcHJveCBcc3FydHtcZnJhY3tcc2lnbWFeMl97cmVzaWR1YWx9fXtOIFx0aW1lcyBKIFx0aW1lcyBcc2lnbWFeMl94fSArIFxtYXRoYmZ7XGZyYWN7XHRhdV97MTF9fXtKfX19ICQkIFw+IOW9kyAkTiBcdG8gXGluZnR5JO+8jCDnrKzkuIDpobnotovov5Hkuo4w77yM5L2G56ys5LqM6aG5ICRcZnJhY3tcdGF1X3sxMX19e0p9JCDkvp3nhLblrZjlnKjvvIENCg0KDQojIyMgMi4zIOS9juS8sFNF55qE5Zug57SgDQoNCuavlOi+gyAqKuecn+WunuaooeWeiyBTRSoqIChSSVNSKSDlkowgKirplJnor6/mqKHlnosgU0UqKiAoQWdncmVnYXRpb24vTmFpdmUpIOeahOavlOeOh++8jOavlOeOh+i2iuWkp++8jOivtOaYjumUmeivr+aooeWei+S9juS8sOW+l+i2iuS4pemHje+8iOWNs+mUmeW+l+i2iuemu+iwse+8ieOAgg0KDQrnlLHpmYTlvZUgQSDnmoTmjqjlr7zlj6/ku6XmnoTpgKDmr5TnjocgJEsk77yaDQoNCiQkDQpcdGV4dHtSYXRpbyB9IEsgPSBcZnJhY3tTRV97VHJ1ZX19e1NFX3tOYWl2ZX19ID0gXHNxcnR7MSArIFxmcmFje0kgXGNkb3QgXHRhdV97MTF9IFxjZG90IHNfeF4yfXtcc2lnbWFeMiArIEogXGNkb3QgXG9tZWdhX3swMH19fQ0KJCQNCg0KKiAgICoq5YiG5a2QKirvvJokSSQgKOiiq+ivleaVsCksICRcdGF1X3sxMX0kICjmlpznjoflj5jlvIIpLCAkc194XjIkIChJVuaWueW3rikNCiogICAqKuWIhuavjSoq77yaJFxzaWdtYV4yJCAo5q6L5beuKSwgJEokICjpopjnm67mlbApLCAkXG9tZWdhX3swMH0kICjooqvor5XmiKrot53lj5jlvIIpDQoNCjEuIOiiq+ivleaVsOmHjyAoJEkkKSDotorlpJrvvIzkvY7kvLDotorkuKXph40NCjIuIOmimOebruaVsOmHjyAoJEokKSDotorlsJHvvIzkvY7kvLDotorkuKXph40gDQozLiDooqvor5XmiKrot53lj5jlvIIgKCRcb21lZ2FfezAwfSQpIOi2iuWwj++8jOS9juS8sOi2iuS4pemHjQ0KNC4g5bqU6K+l5piv5q6L5beu6LaK5bCPICgkXHNpZ21hXjIkIHNtYWxsZXIp77yM5L2O5Lyw5omN6LaK5Lil6YeN77yfDQoNCj4g5q6L5beu5pa55beuICgkXHNpZ21hXjIkKSDotorlpKfvvIzkvY7kvLDotorkuKXph40o4p2M77yfKQ0KPiBsYXJnZXIgdW5kZXJlc3RpbWF0aW9uIHdoZW4gdGhlcmUgaXMgbGFyZ2VyIHJlc2lkdWFsIGVycm9yIHZhcmlhbmNl4p2MDQoNCi0tLS0tLS0NCg0KIyMgMy4g5qih5ouf6aqM6K+B77ya5aSn5qC35pys5oKW6K66IChUaGUgQmlnIE4gUGFyYWRveCkNCg0K6L+Z5oSP5ZGz552A77yM5aaC5p6c6aKY55uu5pys6Lqr5a2Y5Zyo5pac546H5Y+Y5byC77yIJFx0YXVfezExfSA+IDAk77yJ77yM6ICM5oiR5Lus5L2/55So5LqG5Lyg57uf5qih5Z6L77yI5b+955Wl5a6D77yJ77yM5oiR5Lus5Lya5b6X5Yiw5LiA5LiqKirooqvkuKXph43kvY7kvLDnmoQgU0UqKuOAgg0KDQoqKuWQjuaenCoq77ya5YiG5q+N5Y+Y5bCPICRccmlnaHRhcnJvdyQgdCDlgLzomZrpq5ggJFxyaWdodGFycm93JCDlgYfpmLPmgKfvvIhUeXBlIEkgRXJyb3LvvInjgIINCg0K6ICM5LiU77yMKirmoLfmnKzph48qKiAkTiQg6LaK5aSn77yM6ZSZ5b6X6LaK56a76LCx44CCDQoNCmBgYHtyIGVycm9yLWluZmxhdGlvbi1wbG90LCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD05fQ0KIyAtLS0g5qih5ouf5Y+C5pWw6K6+572uIC0tLQ0KTl9zZXEgPC0gc2VxKDUwLCAzMDAwLCBieSA9IDUwKQ0KSiA8LSAxMCAgICAgICAgIyDpopjnm67mlbDph4/lm7rlrprkuLoxMA0KdGF1XzExIDwtIDAuMDUgIyDpopjnm67mlpznjoflj5jlvIIgKOecn+WunuWtmOWcqCkNCnNpZ21hX2VyciA8LSAxICMg5q6L5beuDQoNCiMgLS0tIOiuoeeul+eQhuiuuiBTRSAtLS0NCiMgMS4gTmFpdmUgU0UgKOS8oOe7n+aooeWeiyk6IOmajyBOIOWinuWKoOi2i+i/keS6jiAwDQpzZV9uYWl2ZSA8LSBzcXJ0KHNpZ21hX2VyciAvIChOX3NlcSAqIEopKQ0KDQojIDIuIFRydWUgU0UgKFJJU1IpOiDpmo8gTiDlop7liqDotovov5Hkuo4gc3FydCh0YXVfMTEvSikNCiMg6K665paH5YWs5byPIEExMCDnmoTnroDljJbniYjpgLvovpENCnNlX3RydWUgIDwtIHNxcnQoc2lnbWFfZXJyIC8gKE5fc2VxICogSikgKyB0YXVfMTEgLyBKKQ0KDQojIC0tLSDmnoTpgKDnu5jlm77mlbDmja4gLS0tDQpwbG90X2RhdGEgPC0gZGF0YS5mcmFtZSgNCiAgTiA9IHJlcChOX3NlcSwgMiksDQogIFNFID0gYyhzZV9uYWl2ZSwgc2VfdHJ1ZSksDQogIFR5cGUgPSByZXAoYygi5Lyg57uf5qih5Z6LIChBZ2dyZWdhdGlvbi9TRU0pIiwgIlJJU1Ig5qih5Z6LIChQcm9wb3NlZCkiKSwgZWFjaCA9IGxlbmd0aChOX3NlcSkpDQopDQoNCiMg44CQ5YWz6ZSu5L+u5pS544CR77ya5pi+5byP5oyH5a6a5Zug5a2Q5rC05bmz6aG65bqP77yM56Gu5L+d6aKc6Imy5pig5bCE5q2j56GuDQojIOmhuuW6j++8mjEuIOS8oOe7n+aooeWeiyAo5a+55bqU56ys5LiA5Liq6aKc6ImyIEJsdWUpLCAyLiBSSVNSICjlr7nlupTnrKzkuozkuKrpopzoibIgUmVkKQ0KcGxvdF9kYXRhJFR5cGUgPC0gZmFjdG9yKHBsb3RfZGF0YSRUeXBlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCLkvKDnu5/mqKHlnosgKEFnZ3JlZ2F0aW9uL1NFTSkiLCAiUklTUiDmqKHlnosgKFByb3Bvc2VkKSIpKQ0KDQojIC0tLSDnu5jlm74gLS0tDQpnZ3Bsb3QocGxvdF9kYXRhLCBhZXMoeCA9IE4sIHkgPSBTRSwgY29sb3IgPSBUeXBlKSkgKw0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMikgKw0KICAjIOe7mOWItiBSSVNSIOeahOaegemZkOS4i+mZkCAoQXN5bXB0b3RpYyBTdGFuZGFyZCBFcnJvcikNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gc3FydCh0YXVfMTEvSiksIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvcj0iI0Q1NUUwMCIsIGFscGhhPTAuNSkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAyMDAwLCB5ID0gc3FydCh0YXVfMTEvSikgKyAwLjAwMiwgDQogICAgICAgICAgIGxhYmVsID0gIuaXoOazlea2iOmZpOeahOaOqOW5v+ivr+W3riAoR2VuZXJhbGl6YXRpb24gRXJyb3IpIiwgDQogICAgICAgICAgIGNvbG9yID0gIiNENTVFMDAiLCBmb250ZmFjZSA9ICJib2xkIiwgdmp1c3QgPSAtMC41KSArDQogICMg5qCH5rOo5beu5byC5Yy65Z+fDQogIGdlb21fcmliYm9uKGFlcyh5bWluID0gMCwgeW1heCA9IFNFLCBmaWxsID0gVHlwZSksIGFscGhhID0gMC4xLCBjb2xvciA9IE5BKSArDQogIGxhYnModGl0bGUgPSAi5aSn5qC35pys5oKW6K66IChUaGUgQmlnIE4gUGFyYWRveCkiLA0KICAgICAgIHN1YnRpdGxlID0gIuiTneiJsue6vyAo5Lyg57uf5qih5Z6LKSDplJnor6/lnLDorqTkuLrlop7liqDmoLfmnKzph4/lj6/ku6XlsIbor6/lt67pmY3kuLowXG7nuqLoibLnur8gKFJJU1IpIOaJv+iupOmimOebruaYr+aciemZkOmHh+agt+eahO+8jFNFIOS8muaUtuaVm+WIsOS4gOS4qumdnumbtueahOS4i+mZkCIsDQogICAgICAgeSA9IGV4cHJlc3Npb24ocGFzdGUoIlN0YW5kYXJkIEVycm9yIG9mICIsIGhhdChiZXRhKVsxXSkpLCANCiAgICAgICB4ID0gIuagt+acrOmHjyAoU2FtcGxlIFNpemUsIE4pIikgKw0KICAjIOW8uuWItuaMh+WumuminOiJsu+8mkxldmVsIDEgKOS8oOe7nykgLT4gQmx1ZSwgTGV2ZWwgMiAoUklTUikgLT4gUmVkDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDA3MkIyIiwgIiNENTVFMDAiKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDA3MkIyIiwgIiNENTVFMDAiKSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIHNpemU9MTQpKQ0KYGBgDQoNCj4gKirlm77op6MqKu+8miDlj6ropoHnnIvok53oibLnur/vvIjkvKDnu5/lgZrms5XvvInvvIzlvZMgJE49MzAwMCQg5pe277yMU0Ug5Yeg5LmO5Li6IDDjgILmraTml7blk6rmgJUgJFxoYXR7XGJldGF9JCDlj6rmnInlvq7lsI/nmoQgMC4wMe+8jOeul+WHuuadpeeahCAkdCQg5YC85Lmf5Lya5beo5aSn5peg5q+U77yM5a+86Ie05b+F54S255qE5pi+6JGX44CC6L+Z6Kej6YeK5LqG5Li65LuA5LmI5aSn5pWw5o2u6ZuG54m55Yir5a655piT5Ye6546wIFJhbmRvbSBJdGVtIFNsb3BlIOWvvOiHtOeahOWBh+mYs+aAp+OAgg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMgNC4g5Li65LuA5LmI5bi455So5oyH5qCH5peg5rOV6K+K5pat77yfDQoNCuaXoueEtumXrumimOi/meS5iOS4pemHje+8jOS4uuS7gOS5iOaIkeS7rOWcqOWBmiBDcm9uYmFjaCdzICRcYWxwaGEkIOaIliBTRU0g5qih5Z6L5ouf5ZCI77yIQ0ZJL1JNU0VB77yJ5pe25rKh5pyJ5Y+R546w77yfDQoNCiMjIyA0LjEgQ3JvbmJhY2gncyAkXGFscGhhJCDnmoTnm7LljLoNCg0KJFxhbHBoYSQg57O75pWw5Y+N5pig55qE5piv6aKY55uu5YiG5pWw55qE5YaF6YOo5LiA6Ie05oCn44CCICQkIFZhcih5X3tpan0pID0gXHVuZGVyYnJhY2V7XG9tZWdhX3swMH19X3tcdGV4dHvkurrkuI7kurrnmoTlt6jlpKflt67lvIJ9fSArIFx0YXVfezAwfSArIFx1bmRlcmJyYWNle1x0YXVfezExfXhfaV4yfV97XHRleHR75b6u5bCP55qE5pac546H5beu5byCfX0gKyBcc2lnbWFeMiAkJA0KDQotICAgKirnjrDnirYqKu+8muiiq+ivlemXtOeahOaIqui3neW3ruW8gu+8iCRcb21lZ2FfezAwfSTvvIzljbPmnInkupvkurrmgLvmmK/liIbpq5jvvInpgJrluLjljaDmja7kuobnu53lpKfpg6jliIbmlrnlt67jgIINCi0gICAqKuebsuWMuioq77yaJFx0YXVfezExfSTvvIjlr7kgSVYg55qE5Y+N5bqU5beu5byC77yJ5Y2g5q+U5b6I5bCP44CCJFxhbHBoYSQg5Li76KaB5Y+N5pig5oiq6Led55qE5LiA6Ie05oCn77yIJFxvbWVnYV97MDB9JO+8ie+8jOWvueaWnOeOh+WxgumdoueahOW8gui0qOaAp++8iCRcdGF1X3sxMX0k77yJ5LiN5pWP5oSfIChJbnNlbnNpdGl2ZSnvvIxSYW5kb20gSXRlbSBTbG9wZSDnmoTlrZjlnKjlrp7pmYXkuIrkvJrlop7liqDop4Llr5/liLDnmoTmgLvnvJbor5HvvIzlj6/og70q5b6u5byx5ZywKuWinuWKoCAkXGFscGhhJA0KDQojIyMgNC4yIFNFTSDmi5/lkIjmjIfmlbDnmoTmrLrpqpfmgKcNCg0KICoqQ29tbW9uIEZhY3RvciBSZWdyZXNzaW9uKiromb3nhLbmr5TogZrlkIjlm57lvZLkuKXosKjvvIzlroPmnKzotKjkuIrmmK/kuIDkuKoqKkNvbnN0cmFpbmVkKiogTW9kZWzvvIzlroPlvLrov6vmiYDmnInpopjnm67pgJrov4fmvZzlj5jph4/kuqfnlJ/ogZTns7vvvJoNCg0KMS4gICoq5q6L5beu5ZC45pS2KirvvJpTRU0g5bCGIFJhbmRvbSBTbG9wZSDnmoTlj5jlvILvvIgkdV97MWp9eF9pJO+8ieinhuS4uumaj+acuuivr+W3ru+8iFJlc2lkdWFscywgJFxlcHNpbG9uJO+8ieOAgg0KMi4gICoq5ouf5ZCI5oyH5qCH5YGH6Ziz5oCnKirvvJrlj6ropoHov5nkupvlj5jlvILmsqHmnInnoLTlnY/mlbTkvZPnmoTljY/mlrnlt67nu5PmnoTvvIjpgJrluLjnoa7lrp7msqHmnInvvIzlm6DkuLrlroPku6zmmK/lhbPkuo7mlpznjofnmoTvvIzogIzkuI3mmK/lhbPkuo7miKrot53nmoTvvInvvIxTRU0g55qE5ouf5ZCI5oyH5pWw77yIR2xvYmFsIEZpdCBJbmRpY2Vz77yJ5bCx5Lya5Ye6546wKirlgYfpmLTmgKcqKu+8jOWNs+aYjuaYjuaooeWei+iuvuWumumUmeS6hu+8jOS9hiBDRkkg5L6d54S2ID4gMC45NeOAgg0KDQoqKuWunuivgeivgeaNriAoUmVhbCBEYXRhKSoq77yaIOiuuuaWh+S9v+eUqOS6hiAkTj01NjQkIOeahOecn+WunuaVsOaNruWPkeeOsO+8jOWNs+S9vyAqKkNGSSA9IDAuOTU2LCBSTVNFQSA9IDAuMDg3Kiog6L+Z5qC36KKr6K6k5Li64oCc5Y+v5o6l5Y+X4oCd55qE5qih5Z6L77yM5Zyo5L2/55SoIFJJU1Ig5qOA6aqM5ZCO77yM5L6d54S25Y+R546w5LqG5pi+6JGX55qEIFJhbmRvbSBJdGVtIFNsb3Blc++8jOS4lOaOqOe/u+S6huS5i+WJjeeahOaYvuiRl+aAp+e7k+iuuuOAgg0KDQo+ICoq57uT6K66KirvvJrpq5jkv6HluqYgKCRcYWxwaGEkKSDlkozpq5jmi5/lkIjluqYgKENGSSkgKirkuI3og70qKiDkvZzkuLrkuI3lrZjlnKggUmFuZG9tIEl0ZW0gU2xvcGUg55qE6K+B5o2u44CCDQoNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCg0KDQoNCg0KIyDnrKzkuInpg6jliIbvvJrlrp7or4Hor4Hmja7igJTigJTmqKHmi5/kuI7nnJ/lrp7mlbDmja4NCg0K5Zyo5bu656uL5LqG55CG6K665qih5Z6L5ZCO77yMRG9ubmVsbGFuIOetieS6uumAmui/h+S4pOatpemqjOivgeS6hiBSSVNSIOeahOW/heimgeaAp++8mummluWFiOWcqOWPl+aOp+eOr+Wig+S4i++8iOaooeaLn++8ieivgeaYjuS8oOe7n+aooeWei+S8mueKr+mUme+8jOeEtuWQjuWcqOecn+WunueOr+Wig++8iOWunua1i+aVsOaNru+8ieS4reivgeaYjui/meenjeaDheWGteehruWunuWtmOWcqOOAgg0KDQojIyAxLiDmqKHmi5/noJTnqbYgKFNpbXVsYXRpb24gU3R1ZHkpDQoNCueglOeptuiAheaehOW7uuS6hiA3MiDnp43kuI3lkIznmoTlj4LmlbDnu4TlkIjvvIzns7vnu5/mlLnlj5jkuobmoLfmnKzph48gKCROJCnjgIHpopjnm67mlbDph48gKCRKJCkg5ZKM6ZqP5py65pac546H55qE5pa55beu5aSn5bCPICgkXHRhdV97MTF9JCnjgIINCg0KIyMjIDEuMSDmoLjlv4Plj5HnjrDvvJpUeXBlIEkg6ZSZ6K+v546H6Iao6IOADQoNCuWcqOaooeaLn+S4re+8jOiuvuWumiBJViDlkowgRFYg55qEKirnnJ/lrp7lubPlnYflhbPns7vkuLogMCoqICgkXGJldGFfMSA9IDAkKeOAguWboOatpO+8jOS7u+S9leKAnOaYvuiRl+KAneeahOe7k+aenOmDveaYr+WBh+mYs+aAp++8iFR5cGUgSSBFcnJvcu+8ieOAgg0KDQo8aW1nIHNyYz0iZmlncy9maWczLnBuZyIvPg0KDQoNCioq5Zu+6KGo6Kej6K+7KirvvJoNCjEuICAqKue6ouiJsuafseWtkCAoQWdncmVnYXRpb24pKiog5ZKMICoq6JOd6Imy5p+x5a2QIChDb21tb24gRmFjdG9yKSoq77yaDQogICAgLSDlvZPlrZjlnKjpmo/mnLrpopjnm67mlpznjofvvIgkXHRhdV97MTF9ID4gMCTvvInml7bvvIzpmo/nnYDmoLfmnKzph48gKCROJCkg55qE5aKe5Yqg77yM6ZSZ6K+v546H6aOZ5Y2H77yM55Sa6Iez5o6l6L+RIDEwMCXjgIINCiAgICAtICoq6K2m56S6KirvvJrov5nlsLHmmK/liY3mlofmj5DliLDnmoTigJzlpKfmoLfmnKzmgpborrrigJ3jgILmoLfmnKzotorlpKfvvIzkvKDnu5/mqKHlnovotorigJznoa7kv6HigJ3kuIDkuKrplJnor6/nmoTnu5PorrrjgIINCjIuICAqKue7v+iJsuafseWtkCAoUklTUikqKu+8mg0KICAgIC0g5peg6K665qC35pys6YeP5aSa5aSn77yM6ZSZ6K+v546H5aeL57uI5o6n5Yi25Zyo5ZCN5LmJ5rC05bmz77yIMC4wNe+8ieW3puWPs+OAgg0KICAgIC0g6K+B5piO5LqGIFJJU1Ig5qih5Z6L6IO95pyJ5pWI5qCh5q2j5qCH5YeG6K+v77yIU0XvvInjgIINCg0KIyMjIDEuMiDlj6ropoHmnInkuIDngrnngrnlj5jlvILlsLHlpJ/kuoYNCuaooeaLn+aYvuekuu+8jOWNs+S9v+maj+acuumimOebruaWnOeOh+eahOaWueW3rumdnuW4uOWwj++8iOS7heWNoOebuOWFs+ivr+W3ruaWueW3rueahCAqKjAuNTQ5JSoq77yJ77yM5Zyo5aSn5qC35pys5LiL77yIJE49MTAwMCTvvInkuZ/otrPku6Xlr7zoh7TkvKDnu5/mqKHlnovnmoTnu5/orqHmjqjmlq3lpLHmlYjjgILov5nor7TmmI7ov5nkuI3mmK/kuIDkuKrovrnnvJjpl67popjvvIzogIzmmK/kuIDkuKrmma7pgY3nmoTpmpDmgqPjgIINCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIDIuIOecn+WunuaVsOaNruWIhuaekCAoUmVhbCBXb3JsZCBEYXRhKQ0KDQrkuLrkuobor4HmmI7ov5nkuI3ku4Xku4XmmK/mlbDlrabmuLjmiI/vvIzkvZzogIXmlLbpm4bkuoYgJE49NTY0JCDnmoTmlbDmja7vvIzkvb/nlKjkuoblv4PnkIblrabluLjnlKjnmoTph4/ooajvvIjlpoLlpKfkupTkurrmoLzjgIHoh6rmiJHlrp7njrDph4/ooajnrYnvvInlkozlj43lupTml7bku7vliqHjgIINCg0KIyMjIDIuMSDmoYjkvovvvJrlubTpvoTkuI7oh6rmiJHlrp7njrAgKEFnZSAmIFNlbGYtQWN0dWFsaXphdGlvbikNCg0K6L+Z5piv5LiA5Liq5pyA5YW35oiP5Ymn5oCn55qE5L6L5a2Q44CC56CU56m26ICF5o6i56m24oCc5bm06b6E4oCd5piv5ZCm6aKE5rWL4oCc6Ieq5oiR5a6e546w4oCd5b6X5YiG44CCDQoNCj4gKipb5Zu+54mH5Y2g5L2N56ymIDJdKioNCj4gKuivt+WcqOatpOWkhOaPkuWFpeiuuuaWh+S4reeahCAqKkZpZ3VyZSA1KiogKFNlbGYtQWN0dWFsaXphdGlvbiBTY29yZXMgUHJlZGljdGVkIGJ5IEFnZSkqDQoNCioq57uT5p6c5a+55q+UKirvvJoNCiogICAqKuS8oOe7n+iBmuWQiOWbnuW9kioq77ya5Y+R546w5pi+6JGX55qE6LSf55u45YWzICgkcCA8IC4wMDEkKeOAgue7k+iuuu+8muW5tOm+hOi2iuWkp++8jOiHquaIkeWunueOsOaEn+i2iuS9juOAgg0KKiAgICoqUklTUiDmqKHlnosqKu+8mue7k+aenCoq5LiN5pi+6JGXKiogKCRwID0gLjA2NiQp44CCDQoqICAgKirlj5HnlJ/kuobku4DkuYjvvJ8qKiDop4Llr58gRmlndXJlIDUg5bqV6YOo55qE5bCP5Zu+5Y+v5Lul5Y+R546w77yM6aKY55uu5LmL6Ze05a2Y5Zyo5beo5aSn55qEKirlvILotKjmgKcqKu+8mg0KICAgICogICBJdGVtIDggKCJJIGZlYXIgZmFpbHVyZSIpIOWSjCBJdGVtIDE0IOWvueW5tOm+hOmdnuW4uOaVj+aEn++8iOW8uui0n+ebuOWFs++8ieOAgg0KICAgICogICDlhbbku5bpopjnm67lr7nlubTpvoTlh6DkuY7msqHmnInlj43lupTvvIznlJroh7PlkYjmraPnm7jlhbPjgIINCiAgICAqICAgKirnu5PorroqKu+8muaJgOiwk+eahOKAnOaYvuiRl+i0n+ebuOWFs+KAneWujOWFqOaYr+eUseWwkeaVsOWHoOS4quWvueW5tOm+hOaVj+aEn+eahOmimOebru+8iOS4u+imgeWFs+S6juKAnOaBkOaDp+KAne+8iempseWKqOeahO+8jOS4jeiDveaOqOW5v+WIsOaVtOS4quKAnOiHquaIkeWunueOsOKAneaehOW/teOAgg0KDQojIyMgMi4yIOaZrumBjeaApw0K5Zyo5rWL6K+V55qE5omA5pyJIElWLURWIOe7hOWQiOS4re+8jCoq6ZqP5py66aKY55uu5pac546H5pmu6YGN5a2Y5ZyoKirjgILlnKjmn5Dkupvmg4XlhrXkuIvvvIxSSVNSIOS8sOiuoeWHuueahOmaj+acuuaWnOeOh+aWueW3rueUmuiHs+i/nOWkp+S6juaooeaLn+S4reiuvuWumueahOawtOW5s+OAgui/meihqOaYjuaIkeS7rOi/h+WOu+aWh+eMruS4reiuuOWkmuKAnOWwj+iAjOaYvuiRl+KAneeahOWkp+agt+acrOaViOW6lO+8jOWPr+iDveWPquaYr+eUseS6jumHj+ihqOS4rea3t+WFpeS6huWHoOS4quWvuSBJViDnibnliKvmlY/mhJ/nmoTpopjnm67jgIINCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCg0KDQoNCg0KDQoNCg0KIyDnrKzlm5vpg6jliIbvvJrmgLvnu5Plu7rorq7kuI7lrp7miJjlupTnlKgNCg0KIyMgMS4g5oC757uT6K6o6K66IChHZW5lcmFsIERpc2N1c3Npb24pDQoNCiMjIyAxLjEg5Y+m5LiA56eN5rWL6YeP5ZOy5a2mDQpSSVNSIOS4jeS7heS7heaYr+S4gOS4que7n+iuoeS/ruato++8jOWug+S7o+ihqOS6huS4gOenjeS4jeWQjOeahCoq5rWL6YeP6KeCIChNZWFzdXJlbWVudCBNb2RlbCkqKu+8mg0KLSAgICoqQ29tbW9uIEZhY3RvciAoU0VNKSoq77ya6K6k5Li66aKY55uu5piv5r2c5Y+Y6YeP55qE4oCc57qv5YeA4oCd5Y+N5pig77yM6aKY55uu54m55byC5oCn5piv4oCc6K+v5beu4oCd44CCDQotICAgKipSSVNSKirvvJrorqTkuLrpopjnm67mmK/mnoTlv7XnmoTigJzmoLfmnKzigJ3jgILpopjnm67mnKzouqvlhbfmnInlm6DmnpzlipvvvIzlhYHorrjpopjnm67kuI7lpJbpg6jlj5jph4/mnInni6znibnnmoTkuqTkupLjgILmiJHku6zlupTor6Xmiornu5Porrrmjqjlub/liLDigJzpopjlupPigJ3vvIzogIzkuI3ku4Xku4XmmK/igJzkurrigJ3jgIINCg0KIyMjIDEuMiDlrp7ot7Xlu7rorq4NCjEuICAqKuitpuaDleWkp+agt+acrOS4reeahOW+ruWwj+aYvuiRl+aViOW6lCoq77ya5b2TICROJCDlvojlpKfkuJTmlYjlupTph4/lvojlsI/ml7bvvIzlv4XpobvogIPomZHpopjnm67mlpznjoflvILotKjmgKfnmoTlvbHlk43jgIINCjIuICAqKuS9nOS4uuaVj+aEn+aAp+WIhuaekCAoU2Vuc2l0aXZpdHkgQ2hlY2spKirvvJrkuI3kuIDlrpropoHlrozlhajmipvlvIPkvKDnu5/mlrnms5XvvIzkvYblupTkvb/nlKggUklTUiDpqozor4HmoLjlv4Pnu5PorrrmmK/lkKbnqLPlgaXjgIINCjMuICAqKuS4jeimgei/t+S/oSBGaXQgSW5kaWNlcyoq77yaQ0ZJIOWSjCBBbHBoYSDns7vmlbDml6Dms5Xor4rmlq3ov5nkuKrpl67popjjgIINCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIDIuIFIg6K+t6KiA5a6e5oiY5pWZ56iLIChIb3cgdG8gZml0IFJJU1IpDQoNCuWmguS9leWcqOiHquW3seeahOeglOeptuS4reWunueOsOi/meS4quaooeWei++8n+WFtuWunumdnuW4uOeugOWNle+8jOWPqumcgOimgeS9v+eUqCBgbG1lNGAg5YyF5Y2z5Y+v44CCDQoNCiMjIyAyLjEg5pWw5o2u5YeG5aSHDQrlhbPplK7lnKjkuo7mlbDmja7lv4XpobvmmK8gKirplb/mlbDmja7moLzlvI8gKExvbmcgRm9ybWF0KSoq44CC5q+P5LiA6KGM5piv5LiA5Liq6KeC5a+f5YC877yI5p+Q5Lq65Zue562U5p+Q6aKY55qE5YiG5pWw77yJ44CCDQoNCiMjIyAyLjIg5Luj56CB56S66IyDDQrmiJHku6zlsIbnlJ/miJDkuIDkuKrmqKHmi5/mlbDmja7pm4bvvIzlubbmiYvmiormiYvmvJTnpLrlpoLkvZXnlLHigJzogZrlkIjlm57lvZLigJ3ovazlkJHigJxSSVNS4oCd44CCDQoNCmBgYHtyIHJpc3ItdHV0b3JpYWwsIGVjaG89VFJVRX0NCmxpYnJhcnkobG1lNCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgLS0tIOesrOS4gOatpe+8mueUn+aIkOaooeaLn+aVsOaNriAoTG9uZyBGb3JtYXQpIC0tLQ0Kc2V0LnNlZWQoMjAyNSkNCm5fc3ViaiA8LSAyMDAgICMgMjAw5ZCN6KKr6K+VDQpuX2l0ZW0gPC0gMTAgICAjIDEw5Liq6aKY55uuDQppZHMgPC0gcmVwKDE6bl9zdWJqLCBlYWNoID0gbl9pdGVtKQ0KaXRlbXMgPC0gcmVwKHBhc3RlMCgiSXRlbV8iLCAxOm5faXRlbSksIHRpbWVzID0gbl9zdWJqKQ0KDQojIElWOiDov57nu63lj5jph48gKOWmgiBBZ2UpDQojIOazqOaEj++8mklWIOW/hemhu+aYryBQYXJ0aWNpcGFudC1MZXZlbCDnmoQgKOavj+S6uuWPquacieS4gOS4quWAvCkNCklWX2RhdGEgPC0gZGF0YS5mcmFtZShJRCA9IDE6bl9zdWJqLCBJViA9IHJub3JtKG5fc3ViaikpDQpkYXRhX2xvbmcgPC0gZGF0YS5mcmFtZShJRCA9IGZhY3RvcihpZHMpLCBJdGVtID0gZmFjdG9yKGl0ZW1zKSkgJT4lDQogIGxlZnRfam9pbihJVl9kYXRhLCBieSA9ICJJRCIpDQoNCiMg6K6+5a6a55yf5a6e5qih5Z6L77yaDQojIEZpeGVkIFNsb3BlIChCZXRhKSA9IDAuMSAo5b6u5byx5q2j55u45YWzKQ0KIyBSYW5kb20gSXRlbSBTbG9wZSAoVGF1XzExKSA9IOWtmOWcqOaYvuiRl+W8gui0qOaApw0KaXRlbV9zbG9wZXMgPC0gcm5vcm0obl9pdGVtLCBtZWFuID0gMC4xLCBzZCA9IDAuMykgIyDmr4/kuKrpopjnm67mnInkuI3lkIznmoTnnJ/lrp7mlpznjocNCm5hbWVzKGl0ZW1fc2xvcGVzKSA8LSB1bmlxdWUoZGF0YV9sb25nJEl0ZW0pDQoNCiMg55Sf5oiQ5YiG5pWwIFkNCmRhdGFfbG9uZyRTbG9wZV9qIDwtIGl0ZW1fc2xvcGVzW2RhdGFfbG9uZyRJdGVtXQ0KZGF0YV9sb25nJFkgPC0gMCArICAjIEludGVyY2VwdA0KICAgICAgICAgICAgICAgKDAuNSAqIHJub3JtKG5fc3ViailbZGF0YV9sb25nJElEXSkgKyAjIFJhbmRvbSBTdWJqIEludGVyY2VwdA0KICAgICAgICAgICAgICAgKDAuNSAqIHJub3JtKG5faXRlbSlbYXMubnVtZXJpYyhkYXRhX2xvbmckSXRlbSldKSArICMgUmFuZG9tIEl0ZW0gSW50ZXJjZXB0DQogICAgICAgICAgICAgICBkYXRhX2xvbmckU2xvcGVfaiAqIGRhdGFfbG9uZyRJViArICAgICMgU2xvcGUgZWZmZWN0DQogICAgICAgICAgICAgICBybm9ybShucm93KGRhdGFfbG9uZyksIDAsIDEpICAgICAgICAgICMgUmVzaWR1YWwNCg0KIyAtLS0g56ys5LqM5q2l77ya5Lyg57uf5YGa5rOVIChBZ2dyZWdhdGlvbikgLS0tDQpkYXRhX2FnZyA8LSBkYXRhX2xvbmcgJT4lDQogIGdyb3VwX2J5KElELCBJVikgJT4lDQogIHN1bW1hcmlzZShNZWFuX1kgPSBtZWFuKFkpLCAuZ3JvdXBzPSJkcm9wIikNCg0KbW9kZWxfYWdnIDwtIGxtKE1lYW5fWSB+IElWLCBkYXRhID0gZGF0YV9hZ2cpDQpwcmludChzdW1tYXJ5KG1vZGVsX2FnZykkY29lZmZpY2llbnRzKQ0KDQojIC0tLSDnrKzkuInmraXvvJpSSVNSIOW7uuaooSAoVXNpbmcgbG1lNCkgLS0tDQojIOivreazleino+aekO+8mg0KIyBZIH4gSVYgOiDlm7rlrprmlYjlupQgKEZpeGVkIEVmZmVjdCkNCiMgKDEgfCBJRCkgOiDpmo/mnLrooqvor5XmiKrot50gKOavj+S4quS6uuWfuuehgOWIhuS4jeWQjCkNCiMgKDEgKyBJViB8IEl0ZW0pIDog6ZqP5py66aKY55uu5pWI5bqUICjmoLjlv4PvvIEpDQojICAgICAgLT4gIjEiIOS7o+ihqOmimOebrumavuW6puS4jeWQjCAoUmFuZG9tIEl0ZW0gSW50ZXJjZXB0KQ0KIyAgICAgIC0+ICJJViIg5Luj6KGo6aKY55uu5a+5SVbmlY/mhJ/luqbkuI3lkIwgKFJhbmRvbSBJdGVtIFNsb3BlKQ0KDQptb2RlbF9yaXNyIDwtIGxtZXIoWSB+IElWICsgKDEgfCBJRCkgKyAoMSArIElWIHwgSXRlbSksIA0KICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhX2xvbmcsDQogICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiKSkgIyDkvJjljJblmajpmLLmiqXplJkNCg0KIyAtLS0g56ys5Zub5q2l77ya57uT5p6c5a+55q+UIC0tLQ0KY2F0KCJcbj09PSDnu5Pmnpzlr7nmr5QgPT09XG4iKQ0KY2F0KCIxLiDogZrlkIjlm57lvZIgdC12YWx1ZToiLCBzdW1tYXJ5KG1vZGVsX2FnZykkY29lZmZpY2llbnRzWyJJViIsICJ0IHZhbHVlIl0sICJcbiIpDQpjYXQoIjIuIFJJU1Ig5qih5Z6LIHQtdmFsdWU6Iiwgc3VtbWFyeShtb2RlbF9yaXNyKSRjb2VmZmljaWVudHNbIklWIiwgInQgdmFsdWUiXSwgIlxuIikNCmNhdCgi5rOo5oSP77yaUklTUiDnmoQgdCDlgLzpgJrluLjkvJrlj5jlsI/vvIjnu53lr7nlgLzvvInvvIzlm6DkuLogU0Ug5Y+Y5aSn5LqG44CCXG4iKQ0KDQojIOaPkOWPluW5tueUu+WHuumimOebruaWnOeOhyAo5Y+v6YCJKQ0KIyByYW5lZihtb2RlbF9yaXNyKSRJdGVtIOWMheWQq+S6huavj+S4qumimOebrueahOaIqui3neWSjOaWnOeOhw0KaXRlbV9lZmZlY3RzIDwtIHJhbmVmKG1vZGVsX3Jpc3IpJEl0ZW0NCml0ZW1fZWZmZWN0cyRJdGVtIDwtIHJvd25hbWVzKGl0ZW1fZWZmZWN0cykNCmNvbG5hbWVzKGl0ZW1fZWZmZWN0cylbMToyXSA8LSBjKCJJbnRlcmNlcHQiLCAiU2xvcGVfRGV2aWF0aW9uIikNCg0KIyDliqDkuIrlm7rlrprmlYjlupTmiY3mmK/mgLvmlpznjocNCmZpeGVkX3Nsb3BlIDwtIGZpeGVmKG1vZGVsX3Jpc3IpWyJJViJdDQppdGVtX2VmZmVjdHMkVG90YWxfU2xvcGUgPC0gaXRlbV9lZmZlY3RzJFNsb3BlX0RldmlhdGlvbiArIGZpeGVkX3Nsb3BlDQoNCnByaW50KGhlYWQoaXRlbV9lZmZlY3RzWywgYygiSXRlbSIsICJUb3RhbF9TbG9wZSIpXSkpDQpgYGANCg0KIyMjIDIuMyDlu7rmqKHms6jmhI/kuovpobkNCjEuICAqKuaUtuaVm+mXrumimCAoQ29udmVyZ2VuY2UpKirvvJrlpoLmnpzmqKHlnovkuI3mlLbmlZvvvIzpgJrluLjmmK/lm6DkuLrmqKHlnovlpKrlpI3mnYLogIzmlbDmja7kuI3otrPjgILlj6/ku6XlsJ3or5Xnp7vpmaTpmo/mnLrpobnkuYvpl7TnmoTljY/mlrnlt67vvIzkvovlpoLkvb/nlKggYCgxIHwgSXRlbSkgKyAoMCArIElWIHwgSXRlbSlg77yM5oiW6ICF5o2i55SoIGBicm1zYCAo6LSd5Y+25pav5pa55rOVKeOAgg0KMi4gICoq5qCH5YeG5YyWKirvvJrlu7rorq7lr7kgSVYg5ZKMIERWIOi/m+ihjOagh+WHhuWMlu+8iFN0YW5kYXJkaXphdGlvbu+8ie+8jOacieWKqeS6juaooeWei+aUtuaVm+WSjOezu+aVsOino+mHiuOAgg0KMy4gICoq6Ieq55Sx5bqm6Zeu6aKYKirvvJpgbG1lNGAg6buY6K6k5LiN5o+Q5L6bIHAg5YC877yI5Zug5Li66Ieq55Sx5bqm6K6h566X5pyJ5LqJ6K6u77yJ44CC5Y+v5Lul5L2/55SoIGBsbWVyVGVzdGAg5YyF6Ieq5Yqo5Yqg6L29IHAg5YC877yM5oiW6ICF5YOP6K665paH5LiA5qC35YWz5rOoIHQg5YC877yIdCA+IDEuOTYg6KeG5Li65pi+6JGX77yJ44CCDQoNCiMjIDMuIOe7k+ivrQ0KDQo+ICJUcmVhdCBpdGVtcyBhcyByYW5kb20gc2FtcGxlcywgbm90IGZpeGVkIGluZGljYXRvcnMuIg0KDQpSSVNSIOW5tuS4jeaYr+imgeWQpuWumui/h+WOu+eahOaJgOacieeglOeptu+8jOiAjOaYr+aPkOmGkuaIkeS7rOWcqOWkhOeQhioq5byC6LSo5oCn6aKY55uuKirlkowqKuWkp+agt+acrOaVsOaNrioq5pe277yM6ZyA6KaB5pu05Yqg6LCm5Y2R5Zyw5a+55b6F57uf6K6h5o6o5pat55qE5LiN56Gu5a6a5oCn44CC5b2T5oiR5Lus5aOw56ew5Y+R546w5LqG5LiA5Liq5YWz5LqO4oCc5p6E5b+14oCd55qE55yf55CG5pe277yM6K+356Gu5L+d6L+Z5Liq55yf55CG5LiN5piv5LuF55Sx5YW25Lit5LiA5Lik5Liq6aKY55uu6amx5Yqo55qE44CCDQo=