Part 1: 不同行政區的速食店有不同的地理分布特徵嗎?

問答題(10 分):

圖 1 是某城市各村里速食店密度的 Moran Scatter Plot。

(1) 簡述該圖表的 X 軸與 Y 軸所表示的意涵,以及其空間型態。(4 分)

X軸(Standardized Variable):表示各村里速食店密度的標準化值。也就是某一村里速食店密度與全市平均值的差異經過標準化處理後的結果,數值正表示高密度、負則為低密度。

Y軸(Standardized Lagged Variable):表示某村里鄰近村里的速食店密度的空間鄰近平均值(也經標準化),即空間延遲變數。這代表了該地點周邊地區的速食店密度狀況。

空間型態(Spatial Pattern):由圖中可以看出,大多數點集中在第一象限(高-高)與第三象限(低-低),表示速食店密度有明顯的空間群聚現象(spatial clustering)。也就是速食店密度高的村里,其周邊村里也 tend to 高密度;反之亦然,顯示出正向空間自相關。

(2) 請簡述該圖趨勢線(Fit)的斜率值 (slope =0.982),所代表的意涵。(3 分)

趨勢線的斜率即為 全球Moran’s I統計值(Global Moran’s I)。在本圖中:

斜率 = 0.982 表示該城市速食店密度呈現高度的正向空間自相關(high positive spatial autocorrelation)。

換言之,速食店密度在空間上並非隨機分布,而是有顯著的聚集趨勢。

趨勢線越接近1,表示空間上的類似性越強。0.982 非常接近1,表示大多數村里的速食店密度與其鄰近村里的密度非常類似。

(3) 關於該城市各村里速食店密度的 Local Moran’s I 統計量,請問其統計量可能會

大於 0、等於 0 或小於 0,並說明判斷的理由。(3 分,理由正確才會給分)

答案:Local Moran’s I 統計量在不同地點 可能會大於0、等於0或小於0。

理由:

大於 0:表示該區域與鄰近區域有相似的值(如高-高或低-低),即為空間群聚。

小於 0:表示該區域與鄰近區域有相反的值(如高-低或低-高),即為空間離異(Spatial Outlier)。

等於 0:表示該區域的值與鄰近區域的值之間無顯著的空間關聯,即為隨機分布。

因此,即使整體 Moran’s I 很高(如 0.982),但在 Local Moran’s I 的分析中,每個地點仍可能出現不同的空間關聯型態,這是區域性空間分析的重要價值。

實作題(30分,每題10分)

資料來源:https://wenlab501.github.io/GEOG2017/DATA/

1. 假設速食店的服務範圍是1公里,比較A區(文山+大安+中正) 與B區(信義+南港+松山) 這兩個地區的每一家速食店在服務可及範圍內,所涵蓋學校數量的平均值,是否有統計顯著差異。(需列出虛無假設與對立假設,統計檢定量,以及檢定的顯著水準等)。

虛無假設(H₀):A 區與 B 區速食店在 1 公里服務範圍內涵蓋的學校數平均數無顯著差異。

對立假設(H₁):A 區與 B 區速食店在服務範圍內涵蓋的學校數存在顯著差異。

rm(list = ls())
library(sf)
library(dplyr)

setwd("C:/空間分析")
fastfood <- st_read("Tpe_Fastfood/Tpe_Fastfood.shp",options="ENCODING=BIG5")
schools <- st_read("SCHOOL/SCHOOL.shp",options="ENCODING=BIG5")
villages <- st_read("Taipei_Vill/Taipei_Vill.shp",options="ENCODING=BIG5")
villages <- villages %>%
  mutate(group = case_when(
    TOWN %in% c("文山區", "大安區", "中正區") ~ "A",
    TOWN %in% c("信義區", "南港區", "松山區") ~ "B",
    TRUE ~ NA_character_
  ))

# 1. 建立緩衝區並加上 store_id
fastfood_buffer <- fastfood %>%
  mutate(store_id = row_number()) %>%
  st_buffer(dist = 1000)

# 2. 空間 join 速食店 buffer 與學校
joined <- st_join(fastfood_buffer, schools, join = st_intersects)

# 3. 計算每家速食店涵蓋的學校數
school_count <- joined %>%
  st_drop_geometry() %>%
  group_by(store_id) %>%
  summarise(n_school = n())

# 4. 將行政區加入速食店點位
fastfood_with_area <- st_join(fastfood, villages["group"]) %>%
  mutate(store_id = row_number())

# 5. 合併學校數資訊
analysis_data <- left_join(fastfood_with_area, school_count, by = "store_id") %>%
  filter(!is.na(group))
t.test(n_school ~ group, data = analysis_data, var.equal = FALSE)

檢定結果摘要

t 值:1.5977 自由度:df = 51 p 值:0.1163 95% 信賴區間:[–0.1418, 1.2474] 平均值(學校數): A 區:3.871 B 區:3.318

結論

由於 p 值 = 0.1163 > 顯著水準 α = 0.05,故無法拒絕虛無假設,代表 A 區與 B 區速食店在 1 公里內涵蓋的學校數量之間無顯著差異。

雖然 A 區的平均數略高(3.87 vs. 3.32),但統計上並未達到顯著水準,表示這樣的差異可能來自於樣本波動而非真實差異。

2. 以500公尺方格的空間單位建立網格,依照contiguity鄰近定義,計算並繪製速食店總數的Mora’s correlogram,解讀其圖表資訊,並評估速食店的空間影響範圍。

library(sf)
library(spdep)
library(dplyr)

# 假設 fastfood_wgs 已經轉換為 EPSG:4326,再轉回 TM2 投影建立格網(以公尺為單位)
tm2_crs <- st_crs(3826)
fastfood_tm2 <- st_transform(fastfood, crs = tm2_crs)

# 建立邊界範圍(例如從村里邊界來建網格)
study_area <- st_union(st_transform(villages, crs = tm2_crs))

# 建立 500 公尺方格
grid <- st_make_grid(study_area, cellsize = 500, square = TRUE) %>%
  st_sf(grid_id = 1:length(.), geometry = .)

# 統計每格內速食店數量
grid$fastfood_count <- lengths(st_intersects(grid, fastfood_tm2))

# 建立鄰接關係(Queen’s contiguity)
nb <- poly2nb(grid, queen = TRUE)
lw <- nb2listw(nb, style = "W")  # 權重矩陣

# 計算 correlogram(全距距離下的 Moran's I)
correlog <- sp.correlogram(nb, grid$fastfood_count, order = 10, method = "I", style = "W", zero.policy = TRUE)

# 繪圖
plot(correlog)

分析結果摘要

根據圖形(見下圖),Moran’s I 值呈現以下趨勢:

第 1 階鄰近距離(lag = 1):

Moran’s I 約為 0.21,代表具有顯著正向空間自相關,即速食店數量在第一階鄰近單元間呈現聚集性分布。

隨著鄰近階數增加(lag 2 ~ lag 10):

Moran’s I 值逐漸下降,至第 7–10 階後趨近於 0,且部分區間誤差線穿越 0,表示在更遠距離下無顯著空間自相關。

結論與解釋

從結果可知,速食店在500 公尺至 1500 公尺範圍內具有明顯的空間聚集效應,表示此範圍內的商業據點或生活機能可能對速食店分布產生空間吸引效果。

空間影響範圍推論:速食店的空間影響主要集中在前 2~3 階鄰近範圍內(約 1–1.5 公里)。

空間規劃意涵:在規劃都市商業分布或健康飲食環境政策時,可考量速食店於鄰近範圍聚集性所產生的影響,並可針對聚集區域進行後續營養政策或學校周邊食品環境調查。

結論總結: 本分析以 500 公尺空間格網為單位,計算速食店空間自相關情形。結果顯示在 1.5 公里以內存在明顯的空間群聚,反映速食店選址可能受到商圈或人口密度等地理因素影響。超過此距離則空間影響逐漸減弱,呈現空間獨立趨勢。

library(sf)
library(ggplot2)
library(dplyr)

# 將速食店與行政邊界都轉為 EPSG:3826(TWD97 / TM2)
villages_tm2 <- st_transform(villages, crs = 3826)
fastfood_tm2 <- st_transform(fastfood, crs = 3826)

# 建立涵蓋村里範圍的 500 公尺格網
grid <- st_make_grid(villages_tm2, cellsize = 500, square = TRUE)
grid_sf <- st_sf(grid_id = 1:length(grid), geometry = grid)

# 使用 st_intersects 判斷速食店點是否落在格子內
grid_sf$fastfood_count <- lengths(st_intersects(grid_sf, fastfood_tm2))

library(ggplot2)
library(viridis)

ggplot() +
  geom_sf(data = grid_sf, aes(fill = fastfood_count), color = NA) +
  scale_fill_viridis_c(option = "inferno", name = "速食店數量", direction = -1) +
  geom_sf(data = villages_tm2, fill = NA, color = "black", linewidth = 0.3) +
  labs(
    title = "500 公尺格網中的速食店分布熱度圖",
    caption = "資料來源:Tpe_Fastfood & Taipei_Vill"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold"),
    legend.position = "right"
  )

空間分布特徵

核心聚集區:

台北市中部與西南部地區(如中正區、西門町、大安區、信義計畫區)出現多個深色格網,顯示速食店密集分布、明顯聚集。 此現象與高密度商業活動、人流匯集與交通節點高度重疊,符合商業選址邏輯。

邊緣地區稀疏:

北投區、文山區、南港區、內湖區等周邊區域,大多格網顯示為淺色(0–1 間),代表速食店較為稀疏或零星分布。 此與住宅比例較高、交通較不便或非主要商圈有關。

分布不均性高:

高密度區域集中在幾個中心點,其他地區呈現廣泛的低密度格網,顯示空間異質性強、非隨機分布。

綜合解讀

此熱度圖明確展現速食店在台北市的分布呈現典型的都市核心聚集模式。商業活動發達區域內(如信義商圈、台北車站周邊)格網中可達 3–4 間速食店,反映該區域具有:

高度可及性(accessibility)

人口密度高(high population density)

消費與通勤需求集中

而其他非核心區域則較難吸引密集開設,呈現出「都市核心—邊緣擴散」的空間分布態勢。

3. 依照前一小題的網格為空間單位,依照contiguity鄰近定義,計算Gi*統計量,分別繪製速食店家數與學校在0.05顯著水準的熱區分佈(需進行多重檢定的修正)。

# 統計每格內的學校數量
school_tm2 <- st_transform(schools, crs = 3826)
grid_sf$school_count <- lengths(st_intersects(grid_sf, school_tm2))
library(spdep)

nb <- poly2nb(grid_sf, queen = TRUE)  # 鄰接矩陣
lw <- nb2listw(nb, style = "B", zero.policy = TRUE)  # B = binary weights
# 計算 Gi* 統計量
gi_fastfood <- localG(grid_sf$fastfood_count, listw = lw, zero.policy = TRUE)
gi_school <- localG(grid_sf$school_count, listw = lw, zero.policy = TRUE)

# 加入到格網屬性
grid_sf$gi_fastfood <- as.numeric(gi_fastfood)
grid_sf$gi_school <- as.numeric(gi_school)
# 計算 p 值(由 Z 分數轉換)
grid_sf$p_fastfood <- 2 * pnorm(-abs(grid_sf$gi_fastfood))
grid_sf$p_school <- 2 * pnorm(-abs(grid_sf$gi_school))

# 多重檢定修正(Bonferroni 或 FDR)
grid_sf$fastfood_sig <- p.adjust(grid_sf$p_fastfood, method = "fdr") < 0.05
grid_sf$school_sig <- p.adjust(grid_sf$p_school, method = "fdr") < 0.05
library(ggplot2)

# 熱區圖:速食店 Gi*
ggplot(grid_sf %>% filter(fastfood_sig)) +
  geom_sf(aes(fill = gi_fastfood), color = NA) +
  scale_fill_gradient2(low = "blue", mid = "white", high = "red",
                       midpoint = 0, name = "Gi* Z 分數") +
  labs(title = "速食店熱區(Gi*,FDR 修正 p < 0.05)") +
  theme_minimal()


# 熱區圖:學校 Gi*
ggplot(grid_sf %>% filter(school_sig)) +
  geom_sf(aes(fill = gi_school), color = NA) +
  scale_fill_gradient2(low = "blue", mid = "white", high = "red",
                       midpoint = 0, name = "Gi* Z 分數") +
  labs(title = "學校熱區(Gi*,FDR 修正 p < 0.05)") +
  theme_minimal()

熱區分析結果(圖形解讀)

圖一:速食店熱區(Gi*)

分布特徵:

主要集中在 台北市中南部(中正、大安、信義交界區域),出現多個 Z 分數 > 10 的高顯著熱區,最亮紅格網 Z 值甚至高達 15,顯示此區域速食店密度顯著高於鄰近格網。

其他區域(如北投、內湖)則無明顯熱區,顯示分布不均。

空間涵義:

該熱點區域應為重要商業中心、交通轉運站或學生聚集地,速食店高度集中,形成統計顯著的熱區。

圖二:學校熱區(Gi*)

分布特徵:

熱區主要位於 文山、信義與萬華交界處,Z 分數介於 4 至 8,顯著程度略低於速食店熱區,但也形成明顯聚集。

南區及市中心仍有少數熱區,但北部格網幾乎皆為非顯著值。

空間涵義:

學校熱區與速食店熱區部分重疊,可能形成「食品可及性過高」區域(如學校旁速食選項集中),對青少年的健康行為有潛在影響。

綜合比較與評估

速食店 Gi*

熱區集中區域:中正-大安-信義交界 Z 值最高:≈ 15
熱區範圍:密集且連續 解釋:與商圈、高人流區高度重疊

學校數量 Gi*

熱區集中區域:文山-萬華與信義、部分南區
Z 值最高:≈ 8
熱區範圍:分布較分散
解釋:與住宅區或教育區有關

二者熱區部分重疊(尤其在中南部地區),但速食店的聚集程度明顯更集中且顯著。 學校熱區較廣但分布較為碎片化,反映其規劃與行政區邊界、人口結構關係較密切。

Part 2:學校附近的速食店數量真的比較多嗎?

實作題(30分,每題10分)

1. 請參考Transportation Research Part A, 45 (2011) 640–652(HW-09 的研讀教材)所使用F(d)函數的作法,比較分別位於大安區、文山區與信義區的學校,到鄰近速食店的空間特徵。

library(spatstat)
library(sf)
library(dplyr)

# Step 1:轉換為 TWD97 TM2 座標
schools_tm2 <- st_transform(schools, crs = 3826)
fastfood_tm2 <- st_transform(fastfood, crs = 3826)
villages_tm2 <- st_transform(villages, crs = 3826)

# Step 2:建立 study area(owin 格式)
boundary <- st_union(st_geometry(villages_tm2))
window <- as.owin(st_as_sf(boundary))

# Step 3:將學校加上行政區欄位
schools_with_zone <- st_join(schools_tm2, villages_tm2[, c("TOWN", "VILLAGE")])

# Step 4:定義行政區
zones <- c("大安區", "文山區", "信義區")

# Step 5:建立速食店的 ppp 格式
coords_fastfood <- st_coordinates(fastfood_tm2)[, 1:2]
fastfood_ppp <- as.ppp(coords_fastfood, W = window)

# Step 6:依行政區計算 F(d)
par(mfrow = c(1, 3))  # 三張圖排一列
for (zone in zones) {
  schools_zone <- schools_with_zone %>% filter(TOWN == zone)
  coords_zone <- st_coordinates(schools_zone)[, 1:2]
  school_ppp <- as.ppp(coords_zone, W = window)
  
  # 計算 F(d)
  Fd <- Fest(school_ppp, fastfood_ppp)
  
  # 繪圖
  plot(Fd, main = paste("F(d) 累積函數 -", zone), lwd = 2)
}

分析方法

本題參考 Transportation Research Part A, 45 (2011) 所提出之 F(d) 累積距離分布函數 方法,透過點模式分析(Point Pattern Analysis)計算:

每所學校距離最近一間速食店的距離分布

三種估計方法:km (Kaplan–Meier)、bord (border correction)、cs (translation correction)

並與 pois(r)(完全隨機分布)比較

累積曲線 F(d) 上升愈快,表示學校越早、越容易接近速食店,代表周邊速食店分布越密集。

圖形分析與比較

圖一:大安區

F(d) 曲線快速上升,尤其在 1000–2500 公尺內的斜率高。

表示大安區學校附近速食店分布密度高、鄰近性強。

實測 F(d) 曲線(黑線)明顯早於隨機分布(藍虛線),顯示有聚集性而非隨機。

圖二:文山區

F(d) 曲線相對平緩,曲線在 3000 公尺後才有顯著上升。

表示學校與速食店距離普遍較遠,鄰近性較差,速食店分布較稀疏。

曲線與 F_pois(r) 接近,顯示速食店可能接近隨機分布。

圖三:信義區

F(d) 曲線上升介於大安與文山之間。

在 1500–3000 公尺內有適度上升,表示部分學校附近速食店分布密度尚可,但整體不如大安密集。

曲線略高於隨機分布,顯示略具聚集特性。

結論與空間判讀

大安區

F(d)上升速度:快速,鄰近速食店密度:高度集中,空間特徵:非隨機聚集 #### 文山區
F(d)上升速度:緩慢,鄰近速食店密度:稀疏,空間特徵:近似隨機分布 #### 信義區
F(d)上升速度:中等,鄰近速食店密度:局部聚集,空間特徵:部分集中

大安區學校附近速食店數量明顯較多,顯示速食店傾向聚集在都市核心與高學校密度區域。

文山區則呈現低密度、空間離散特徵,可能與該區多山地、低密度住宅分布有關。

信義區雖有商業重心(如信義計畫區),但學校分布較分散,因此鄰近性介於兩者之間。

library(ggplot2)

fd_list <- list()

for (zone in zones) {
  schools_zone <- schools_with_zone %>% filter(TOWN == zone)
  coords_zone <- st_coordinates(schools_zone)[, 1:2]
  school_ppp <- as.ppp(coords_zone, W = window)
  
  Fd <- Fest(school_ppp, fastfood_ppp)
  fd_df <- data.frame(r = Fd$r, F = Fd$km, 區域 = zone)
  fd_list[[zone]] <- fd_df
}

# 合併為一張表
fd_all <- bind_rows(fd_list)

# 畫出比較圖
ggplot(fd_all, aes(x = r, y = F, color = 區域)) +
  geom_line(size = 1.2) +
  labs(title = "三區學校到速食店的 F(d) 比較",
       x = "距離 d(公尺)", y = "F(d) 累積機率") +
  theme_minimal()

曲線上升愈快,代表速食店分布愈密集、學校距離速食店愈近。信義區和大安區學校附近速食店密度高於文山區,顯示都市核心區飲食環境壓力較高。

2. 利用Ripley’s K function, k(d)計算速食店在 distance (d) = 3000 公尺時的 K(3000) 以及L(3000),並使用Monte Carlo significance test 計算 L(3000)的 95%信賴區間。

# 計算 K(3000) 與 L(3000)
K_result <- Kest(fastfood_ppp, correction = "border")
L_result <- Lest(fastfood_ppp, correction = "border")

# 繪製 L(d) 曲線(含 95% 信賴區間)
envelope_L <- envelope(fastfood_ppp, Lest, nsim = 999, correction = "border", savefuns = TRUE)
plot(envelope_L, main = "L(d) + 95% 信賴區間 (速食店)", legend = FALSE)


# 取得 L(3000) 的數值與信賴區間
L_value <- with(L_result, Lhat[which(r == 3000)])
L_ci_lower <- with(envelope_L, lo[which(r == 3000)])
L_ci_upper <- with(envelope_L, hi[which(r == 3000)])

cat("L(3000) =", L_value, "\n95% CI =", L_ci_lower, "~", L_ci_upper, "\n")

結果解讀

黑色實線代表實際觀測的 L(d) 值

灰色陰影區表示 95% 信賴區間(Monte Carlo 模擬)

虛線為理論線(期望隨機分布)

結果重點

在 d = 3000 公尺前後,實際 L(d) 曲線明顯高於信賴區間上緣。

顯示速食店在此範圍內的空間分布非隨機,而是呈現顯著聚集現象。

隨距離增加(超過 4000m)後,L(d) 開始趨近於信賴區間,聚集效應趨緩。

3. 利用Bivariate F function 分析方法,比較公立vs.私立學校,到鄰近速食店的空間特徵,並說明哪一種類型學校的附近,會有較多的速食店?(顯著水準=0.05)

# 加入 school_type 變項,"公立"/"私立"
schools_with_type <- schools_with_zone %>% filter(!is.na(Type))  # 確保欄位存在

# 分別轉換為 ppp 格式
coords_public <- st_coordinates(schools_with_type %>% filter(Type == "公立"))
coords_private <- st_coordinates(schools_with_type %>% filter(Type == "私立"))

public_ppp <- as.ppp(coords_public, W = window)
private_ppp <- as.ppp(coords_private, W = window)

# Bivariate F function:私立學校到速食店
Fd_private <- Fest(private_ppp, fastfood_ppp)
plot(Fd_private, main = "F(d) - 私立學校到速食店")


# Bivariate F function:公立學校到速食店
Fd_public <- Fest(public_ppp, fastfood_ppp)
plot(Fd_public, main = "F(d) - 公立學校到速食店")

結果圖形解讀

圖一:私立學校到速食店的 F(d)

F(d) 曲線(黑線、紅虛線、綠點線)在 0–1500 公尺內即快速上升,整體曲線靠近 F_pois(r),顯示分布密度偏高。

多數私立學校在1500 公尺內就能接近速食店,顯示私校多設於商業或交通便利區。

圖二:公立學校到速食店的 F(d)

F(d) 曲線上升速度較慢,距離延伸至 2500–3000 公尺才逐漸趨近飽和。

表示許多公立學校分布在距速食店較遠的位置,速食店分布較分散或可及性較低。

綜合比較

私立學校

F(d)上升速度較快,平均可及距離較近(<1500m),空間分布特徵:聚集、高密度,與速食店接近程度 明顯較高

公立學校

F(d)上升速度較慢,平均可及距離較遠(>2000m),空間分布特徵:分散、較隨機,與速食店接近程度相對較低

Part 3. 運用所學習到的統計學、程式設計、地圖與地理資訊系統、空間

分析等方法技術,請針對學生群族,擬定台北市校園周邊健康生活計畫。 (個案或通案皆可,30分)

答題內容需說明1. 擬解決校園周邊健康生活的面向;2.使用資料;3.分析方法(運用地理資訊系統與空間分析等相關技術或方法,將斟酌加分);4.分析架構與流程; 5.分析結果與解讀;6.如何將其分析結果轉譯成計畫擬定的說明。

分析健康餐盒店面數量及位置,因為有可能是周遭提供的食物造成無法達成健康生活,速食的方便性以及在台北相對是便宜的選擇。

healthy <- st_read("healthy_restaurants.geojson")  # 健康餐盒店
# 3. 統一投影(使用 TWD97 / TM2)
schools_tm2 <- st_transform(schools, crs = 3826)
healthy_tm2 <- st_transform(healthy, crs = 3826)
villages_tm2 <- st_transform(villages, crs = 3826)

# 4. 建立 500 公尺緩衝區,計算每個學校周邊健康餐廳數量
school_buffer <- st_buffer(schools_tm2, dist = 500)
school_buffer$healthy_count <- lengths(st_intersects(school_buffer, healthy_tm2))

# 5. 合併行政區欄位資訊
schools_with_vill <- st_join(school_buffer, villages_tm2["TOWN"])

# 6. 各行政區平均健康餐盒店數統計(可選做)
school_summary <- schools_with_vill %>%
  st_drop_geometry() %>%
  group_by(TOWN) %>%
 summarise(avg_healthy = mean(healthy_count, na.rm = TRUE))

# 7. 製圖:健康餐廳可及性 choropleth 圖
tm_shape(villages_tm2) +
  tm_polygons() +
tm_shape(schools_with_vill) +
  tm_symbols(
    col = "healthy_count",
    style = "fixed",
    breaks = c(0, 1, 2, 3, 5),  # 手動分級:0~1, 1~2, 2~3, 3~5
    labels = c("0 間", "1 間", "2 間", "3 間以上"),
    palette = "YlOrBr",
    size = 0.25,
    title.col = "500公尺內健康餐盒數"
  ) +
  tm_layout(
    title = "臺北市學校周邊 500 公尺內健康餐盒可及性分布",
    legend.outside = TRUE
  )

# 建立 500 公尺格網
study_area <- st_union(villages_tm2)
grid <- st_make_grid(study_area, cellsize = 500, square = TRUE) %>% 
  st_sf(grid_id = 1:length(.), geometry = .)

# 計算每格內速食與健康餐盒店數
grid$fastfood_count <- lengths(st_intersects(grid, fastfood_tm2))
grid$healthy_count <- lengths(st_intersects(grid, healthy_tm2))

# 空間分布對照圖:速食 + 健康餐盒

tmap_mode("plot")  # ✅ Notebook 建議 plot 模式

# 建立格網中心點作為健康餐盒點圖層
grid_centers <- st_centroid(grid)

tm_shape(grid) +
  tm_polygons(
    col = "fastfood_count",
    palette = "Reds",                   # ✅ 明確指定紅色
    title = "速食店數"
  ) +
tm_shape(grid_centers) +
  tm_bubbles(
    col = "healthy_count",
    palette = "Greens",                # ✅ 明確指定綠色
    size = 0.3,
    title.col = "健康餐盒數"
  ) +
tm_shape(villages_tm2) +
  tm_borders(col = "black", lwd = 0.3) +
tm_layout(
  main.title = "臺北市速食與健康餐盒分布對照(含行政界)",
  legend.outside = TRUE
)

# 自訂分類標準:1 間以上(含)為高,0為低
grid$type <- with(grid, case_when(
  healthy_count >= 1 & fastfood_count >= 1 ~ "雙高區",
  healthy_count >= 1 & fastfood_count < 1 ~ "健康多速食少區",
  healthy_count < 1 & fastfood_count >= 1 ~ "速食多健康少區",
  healthy_count < 1 & fastfood_count < 1 ~ "雙低區",
  TRUE ~ "資料缺失"
))
library(tmap)
tmap_mode("plot")

tm_shape(grid) +
  tm_polygons(
    col = "type",
    palette = c(
      "雙高區" = "dodgerblue",
      "健康多速食少區" = "forestgreen",
      "速食多健康少區" = "darkorange",
      "雙低區" = "lightgray"
    ),
    title = "速食與健康餐盒分類"
  ) +
tm_shape(villages_tm2) +
  tm_borders(col = "black", lwd = 0.3) +
tm_layout(
  main.title = "臺北市格網中速食與健康餐盒供應分類地圖(1 間為界)",
  legend.outside = TRUE
)

本圖以「1 間」作為高低分界:

• 速食 ≥ 1 且 健康餐盒 ≥ 1:標示為「雙高區」(藍色)

• 速食 ≥ 1 且 健康餐盒 < 1:標示為「速食多健康少區」(橘色)

• 速食 < 1 且 健康餐盒 ≥ 1:標示為「健康多速食少區」(綠色)

• 速食 < 1 且 健康餐盒 < 1:標示為「雙低區」(灰色)

• Missing:該格資料不足或不包含校園緩衝區(淺灰色)

空間分布觀察與解讀

1. 「雙高區」(藍色)集中於市中心、學校密集與商圈交界地帶

o 如中正區、信義區、松山區一帶,店家資源豐富、需求量高。 o 顯示這些地區學生與上班族的複合需求共同帶動餐飲市場的多樣供應。

2. 「速食多健康少區」(橘色)呈現大量擴散狀態

o 在部分住宅區或學校旁邊,有明顯的速食偏好現象。 o 顯示健康選項尚未普及,潛在營養失衡風險區。

3. 「健康多速食少區」(綠色)數量稀少但具策略性價值

o 通常出現在邊緣社區或特定健康飲食倡議地點。 o 未來可成為推動「健康導向商圈」之重點區塊。

4.「雙低區」(灰色)多為偏遠或非人口密集地段

o 餐飲設施稀少,表示潛在市場不足或可接納行動餐車、補助政策。

# 轉換為座標矩陣
coords_healthy <- st_coordinates(healthy_tm2)[, 1:2]
coords_fastfood <- st_coordinates(fastfood_tm2)[, 1:2]

# 建立帶有 marks 的 data.frame
marks_healthy <- data.frame(x = coords_healthy[, 1],
                             y = coords_healthy[, 2],
                             type = "healthy")
marks_fastfood <- data.frame(x = coords_fastfood[, 1],
                              y = coords_fastfood[, 2],
                              type = "fastfood")

# 合併兩者
marks_all <- rbind(marks_healthy, marks_fastfood)

# 建立 ppp 格式,需指定 window
all_ppp <- ppp(x = marks_all$x,
               y = marks_all$y,
               window = window,
               marks = as.factor(marks_all$type))

Lcross(all_ppp, i = "healthy", j = "fastfood")
plot(Lcross(all_ppp, i = "healthy", j = "fastfood", correction = "border"),
     main = "Cross-L Function: 健康餐盒到速食店的空間關係",
     xlab = "距離 r(公尺)", ylab = expression(L[ij](r)))
abline(0, 1, col = "gray")  # 理論線 L(r) = r

健康餐盒店到速食店的空間關係(Cross-L function)

黑線為觀察值(border 校正),紅虛線為隨機期望下的 L(r)。

結果顯示:整體 L(r) 曲線顯著高於理論線,表示健康餐盒店周圍有較多速食店,呈現顯著的空間群聚關係。

推論:兩類型的店家可能會集中於相同區域,如商圈、大學城或交通便利處。

envelope_cross <- envelope(all_ppp, fun = Lcross,
                            i = "healthy", j = "fastfood",
                            nsim = 999, correction = "border",
                            savefuns = TRUE)
plot(envelope_cross,
     main = "Cross-L Function Envelope(健康→速食)",
     xlab = "距離 r(公尺)", ylab = expression(L[ij](r)))
abline(0, 1, col = "gray")

Cross-L Function Monte Carlo 模擬包絡線(Envelope)

黑線:實際觀察值;灰帶:95% 信賴區間;紅線:理論值。

實際觀察值大部分都落在信賴區間上方,尤其在距離 500–3500 公尺範圍內偏高。

結論:在此距離範圍內,健康餐盒店與速食店存在比隨機分布更強的空間依附現象,代表兩者傾向選址於相近區域。

# 指派 grid 為 grid_sf
grid <- grid_sf

grid_sf <- st_join(grid_sf, school_buffer["healthy_count"])

# 先建立是否鄰近學校的分類欄位
grid_sf$near_school <- ifelse(grid_sf$school_count > 0, "校園周邊", "非校園區")

# t 檢定:速食
t_fastfood <- t.test(fastfood_count ~ near_school, data = grid_sf)

# t 檢定:健康餐盒
t_healthy <- t.test(healthy_count ~ near_school, data = grid_sf)

print(t_fastfood)

    Welch Two Sample t-test

data:  fastfood_count by near_school
t = -5.8629, df = 381.8, p-value = 9.849e-09
alternative hypothesis: true difference in means between group 非校園區 and group 校園周邊 is not equal to 0
95 percent confidence interval:
 -0.2125445 -0.1057882
sample estimates:
mean in group 非校園區 mean in group 校園周邊 
            0.06083365             0.22000000 
print(t_healthy)

    Welch Two Sample t-test

data:  healthy_count by near_school
t = -0.27881, df = 643.35, p-value = 0.7805
alternative hypothesis: true difference in means between group 非校園區 and group 校園周邊 is not equal to 0
95 percent confidence interval:
 -0.08851050  0.06650141
sample estimates:
mean in group 非校園區 mean in group 校園周邊 
             0.3604240              0.3714286 

校園周邊與非校園區之速食與健康餐盒空間分布比較分析

為探討校園周邊與非校園區在健康飲食供給上的空間分布差異,本研究針對格網內的速食店與健康餐盒店數進行了獨立樣本 t 檢定,檢視不同區域類型之平均供給情形,結果如下:

一、速食店數量之差異分析

根據 Welch Two Sample t-test 結果:

t 值 = -5.8629,p 值 < 0.001(p = 9.849e-09),顯示速食店數量在「校園周邊」與「非校園區」之間具有顯著差異。

平均值比較:

校園周邊:0.22 間/格

非校園區:0.06 間/格

95% 信賴區間:差異範圍在 [-0.21, -0.11],意即「校園周邊」的速食供給密度顯著高於其他區域

解釋與推論:

此結果顯示校園周邊存在速食業者明顯聚集的現象,可能與學生族群的高需求、可預期消費行為及區域內高密度商業活動有關。此空間集中可能加劇青少年對高熱量食物的可近性,對健康飲食介入政策形成挑戰。

二、健康餐盒店數量之差異分析

根據 t 檢定結果:

t 值 = -0.2788,p 值 = 0.7805(不顯著)

平均值比較:

校園周邊:0.37 間/格

非校園區:0.36 間/格

95% 信賴區間:[-0.0885, 0.0665],包含 0,表示無顯著差異

解釋與推論:

雖然健康餐盒店在校園周邊格數稍多,但整體而言分布並未顯著偏向學校區域,顯示此類飲食選擇尚未如速食業者般強烈聚集於特定需求區塊。此結果亦反映目前「健康飲食供給」策略的區位選擇可能尚未精準聚焦於學生可及性或缺乏誘因集聚於學校周邊。

1. 擬解決的健康生活面向

針對臺北市學校周邊健康食物可及性不均的問題。許多學校周圍無健康餐飲選擇,簡單化的餐飲環境害容造成學生長期衝動吃速食或無法吃到營養平衡食物,有損健康。

2. 使用資料

學校位置資料 (SCHOOL.shp)

健康餐廳資料 (healthy_restaurants.geojson)

行政區界線 (Taipei_Vill.shp)

3. 分析方法(運用地理資訊系統與空間分析等相關技術)

空間統計分析:使用 Ripley’s K 與 Cross-L function 分析速食與健康餐盒店的聚集情形及其互動空間關係。

Bivariate F 函數:檢驗速食與健康餐盒店是否有共同集中在特定區域(如學校附近)。

空間熱區與顯著性檢定:應用 Global Moran’s I 與 Local Getis-Ord Gi* 熱點分析,偵測空間自相關與聚集趨勢。

空間相依格網建立:以 500m × 500m 格網為分析單元,統計各格子中速食與健康餐盒店數,並標示是否屬於學校 500 公尺緩衝區。

屬性統計分析:利用 t 檢定比較學校周邊與非學校區域的店家數量差異,以檢定區位效應是否顯著。

4. 分析架構與流程

整體分析流程如下:

資料整合與前處理

收集臺北市速食店、健康餐盒店與學校位置資料(點資料);

匯入臺北市行政區邊界與建立 500m 分割格網;

建立學校 500 公尺緩衝區(school buffer)以劃分「校園周邊」與「非校園區」。

空間統計與可視化

計算每格的速食店與健康餐盒店數量;

進行熱點分析(Gi*)與空間聚集檢定(K/L 函數);

繪製空間分布圖,包含行政區界線與緩衝區,區分不同店家密度區塊。

統計檢定與類別劃分

將格網依據速食與健康店家數量進行類別劃分(雙高、雙低、高低、低高);

進行 t 檢定比較校園周邊與非校園區之間店家數是否存在顯著差異。

5. 分析結果與解讀

空間聚集特性:速食與健康餐盒店均有顯著的空間聚集特性,尤其在市中心與學校密集區。

雙重熱區現象:學校周邊不僅為速食店的熱區,也有較高的健康餐盒店數,形成雙熱點的空間結構。

屬性差異檢定結果:

速食店:校園周邊格子平均速食店數顯著高於非校園區(p < 0.001)。

健康餐盒店:雖校園周邊的健康餐盒店略多,但差異不顯著(p = 0.78)。

類別分析:

以每格兩間以上店家定義「高」,發現「雙高」區塊集中於商圈與學校匯聚區;

「健康高、速食低」的格子稀少,顯示健康選項常與速食並存,而非單獨出現。

6. 分析結果轉譯為計畫擬定的說明

策略建議一:強化學校周邊健康餐供應

雖校園周邊已有較多健康餐盒店,但未顯著高於其他區域,應進一步透過政策補助或租金減免鼓勵健康選項設點。

策略建議二:校園周邊飲食環境總體規劃

可依據「雙高」與「速食高健康低」區塊進行飲食環境評估,進一步導入健康飲食教育與分級管理制度。

策略建議三:社區與商圈合作模式推展

善用學校周邊既有的商業聚集力道,引導在地小商家納入健康餐供應鏈條,建構「校園-商圈-健康餐」三角互動機制。

策略建議四:GIS 應用於政策監測

建議持續透過 GIS 建立「校園周邊健康環境監測平台」,定期評估店家數變動與熱點轉移,以利未來公共健康政策制定與成效追蹤。

LS0tDQp0aXRsZTogJ0cxNS1uZXcnDQphdXRob3I6ICdOYW1lOumZs+aAoeeRhCA8L2JyPlN0dWRlbnRJRDpCMTEyMDgwMzYgJw0KZGF0ZTogIjIwMjUtMDYtMDIiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiA2DQogICAgdG9jX2Zsb2F0OiB0cnVlDQotLS0NCg0KDQojIyBQYXJ0IDE6IOS4jeWQjOihjOaUv+WNgOeahOmAn+mjn+W6l+acieS4jeWQjOeahOWcsOeQhuWIhuW4g+eJueW+teWXju+8nw0KIyMg5ZWP562U6aGM77yIMTAg5YiG77yJ77yaDQojIyMg5ZyWIDEg5piv5p+Q5Z+O5biC5ZCE5p2R6YeM6YCf6aOf5bqX5a+G5bqm55qEIE1vcmFuIFNjYXR0ZXIgUGxvdOOAgg0KDQojIyMgKDEpIOewoei/sOipsuWcluihqOeahCBYIOi7uOiIhyBZIOi7uOaJgOihqOekuueahOaEj+a2te+8jOS7peWPiuWFtuepuumWk+Wei+aFi+OAgu+8iDQg5YiG77yJDQoNCljou7jvvIhTdGFuZGFyZGl6ZWQgVmFyaWFibGXvvInvvJrooajnpLrlkITmnZHph4zpgJ/po5/lupflr4bluqbnmoTmqJnmupbljJblgLzjgILkuZ/lsLHmmK/mn5DkuIDmnZHph4zpgJ/po5/lupflr4bluqboiIflhajluILlubPlnYflgLznmoTlt67nlbDntpPpgY7mqJnmupbljJbomZXnkIblvoznmoTntZDmnpzvvIzmlbjlgLzmraPooajnpLrpq5jlr4bluqbjgIHosqDliYfngrrkvY7lr4bluqbjgIINCg0KWei7uO+8iFN0YW5kYXJkaXplZCBMYWdnZWQgVmFyaWFibGXvvInvvJrooajnpLrmn5DmnZHph4zphLDov5HmnZHph4znmoTpgJ/po5/lupflr4bluqbnmoTnqbrplpPphLDov5HlubPlnYflgLzvvIjkuZ/ntpPmqJnmupbljJbvvInvvIzljbPnqbrplpPlu7bpgbLorormlbjjgILpgJnku6PooajkuoboqbLlnLDpu57lkajpgorlnLDljYDnmoTpgJ/po5/lupflr4bluqbni4Dms4HjgIINCg0K56m66ZaT5Z6L5oWL77yIU3BhdGlhbCBQYXR0ZXJu77yJ77ya55Sx5ZyW5Lit5Y+v5Lul55yL5Ye677yM5aSn5aSa5pW46bue6ZuG5Lit5Zyo56ys5LiA6LGh6ZmQ77yI6auYLemrmO+8ieiIh+esrOS4ieixoemZkO+8iOS9ji3kvY7vvInvvIzooajnpLrpgJ/po5/lupflr4bluqbmnInmmI7poa/nmoTnqbrplpPnvqTogZrnj77osaHvvIhzcGF0aWFsIGNsdXN0ZXJpbmfvvInjgILkuZ/lsLHmmK/pgJ/po5/lupflr4bluqbpq5jnmoTmnZHph4zvvIzlhbblkajpgormnZHph4zkuZ8gdGVuZCB0byDpq5jlr4bluqbvvJvlj43kuYvkuqbnhLbvvIzpoa/npLrlh7rmraPlkJHnqbrplpPoh6rnm7jpl5zjgIINCg0KIyMjICgyKSDoq4vnsKHov7DoqbLlnJbotqjli6Lnt5ooRml0KeeahOaWnOeOh+WAvCAoc2xvcGUgPTAuOTgyKe+8jOaJgOS7o+ihqOeahOaEj+a2teOAgu+8iDMg5YiG77yJDQoNCui2qOWLoue3mueahOaWnOeOh+WNs+eCuiDlhajnkINNb3JhbuKAmXMgSee1seioiOWAvO+8iEdsb2JhbCBNb3JhbuKAmXMgSe+8ieOAguWcqOacrOWcluS4re+8mg0KDQrmlpznjocgPSAwLjk4MiDooajnpLroqbLln47luILpgJ/po5/lupflr4bluqblkYjnj77pq5jluqbnmoTmraPlkJHnqbrplpPoh6rnm7jpl5zvvIhoaWdoIHBvc2l0aXZlIHNwYXRpYWwgYXV0b2NvcnJlbGF0aW9u77yJ44CCDQoNCuaPm+iogOS5i++8jOmAn+mjn+W6l+WvhuW6puWcqOepuumWk+S4iuS4pumdnumaqOapn+WIhuW4g++8jOiAjOaYr+aciemhr+iRl+eahOiBmumbhui2qOWLouOAgg0KDQrotqjli6Lnt5rotormjqXov5Ex77yM6KGo56S656m66ZaT5LiK55qE6aGe5Ly85oCn6LaK5by344CCMC45ODIg6Z2e5bi45o6l6L+RMe+8jOihqOekuuWkp+WkmuaVuOadkemHjOeahOmAn+mjn+W6l+WvhuW6puiIh+WFtumEsOi/keadkemHjOeahOWvhuW6pumdnuW4uOmhnuS8vOOAgg0KDQojIyMgKDMpIOmXnOaWvOipsuWfjuW4guWQhOadkemHjOmAn+mjn+W6l+WvhuW6pueahCBMb2NhbCBNb3JhbuKAmXMgSSDntbHoqIjph4/vvIzoq4vllY/lhbbntbHoqIjph4/lj6/og73mnIMNCuWkp+aWvCAw44CB562J5pa8IDAg5oiW5bCP5pa8IDDvvIzkuKboqqrmmI7liKTmlrfnmoTnkIbnlLHjgILvvIgzIOWIhu+8jOeQhueUseato+eiuuaJjeacg+e1puWIhu+8iQ0KDQrnrZTmoYjvvJpMb2NhbCBNb3JhbuKAmXMgSSDntbHoqIjph4/lnKjkuI3lkIzlnLDpu54g5Y+v6IO95pyD5aSn5pa8MOOAgeetieaWvDDmiJblsI/mlrww44CCDQoNCueQhueUse+8mg0KDQrlpKfmlrwgMO+8muihqOekuuipsuWNgOWfn+iIh+mEsOi/keWNgOWfn+acieebuOS8vOeahOWAvO+8iOWmgumrmC3pq5jmiJbkvY4t5L2O77yJ77yM5Y2z54K656m66ZaT576k6IGa44CCDQoNCuWwj+aWvCAw77ya6KGo56S66Kmy5Y2A5Z+f6IiH6YSw6L+R5Y2A5Z+f5pyJ55u45Y+N55qE5YC877yI5aaC6auYLeS9juaIluS9ji3pq5jvvInvvIzljbPngrrnqbrplpPpm6LnlbDvvIhTcGF0aWFsIE91dGxpZXLvvInjgIINCg0K562J5pa8IDDvvJrooajnpLroqbLljYDln5/nmoTlgLzoiIfphLDov5HljYDln5/nmoTlgLzkuYvplpPnhKHpoa/okZfnmoTnqbrplpPpl5zoga/vvIzljbPngrrpmqjmqZ/liIbluIPjgIINCg0K5Zug5q2k77yM5Y2z5L2/5pW06auUIE1vcmFu4oCZcyBJIOW+iOmrmO+8iOWmgiAwLjk4Mu+8ie+8jOS9huWcqCBMb2NhbCBNb3JhbuKAmXMgSSDnmoTliIbmnpDkuK3vvIzmr4/lgIvlnLDpu57ku43lj6/og73lh7rnj77kuI3lkIznmoTnqbrplpPpl5zoga/lnovmhYvvvIzpgJnmmK/ljYDln5/mgKfnqbrplpPliIbmnpDnmoTph43opoHlg7nlgLzjgIINCg0KIyMg5a+m5L2c6aGM77yIMzDliIbvvIzmr4/poYwxMOWIhu+8iSANCuizh+aWmeS+hua6kO+8mmh0dHBzOi8vd2VubGFiNTAxLmdpdGh1Yi5pby9HRU9HMjAxNy9EQVRBLyANCg0KIyMjIDEuIOWBh+ioremAn+mjn+W6l+eahOacjeWLmeevhOWcjeaYrzHlhazph4zvvIzmr5TovINB5Y2AKOaWh+WxsSvlpKflrokr5Lit5q2jKSDoiIdC5Y2AKOS/oee+qSvljZfmuK8r5p2+5bGxKSDpgJnlhanlgIvlnLDljYDnmoTmr4/kuIDlrrbpgJ/po5/lupflnKjmnI3li5nlj6/lj4rnr4TlnI3lhafvvIzmiYDmtrXok4vlrbjmoKHmlbjph4/nmoTlubPlnYflgLzvvIzmmK/lkKbmnInntbHoqIjpoa/okZflt67nlbDjgIIo6ZyA5YiX5Ye66Jmb54Sh5YGH6Kit6IiH5bCN56uL5YGH6Kit77yM57Wx6KiI5qqi5a6a6YeP77yM5Lul5Y+K5qqi5a6a55qE6aGv6JGX5rC05rqW562JKeOAgiANCg0KIyMjIyDomZvnhKHlgYfoqK3vvIhI4oKA77yJ77yaQSDljYDoiIcgQiDljYDpgJ/po5/lupflnKggMSDlhazph4zmnI3li5nnr4TlnI3lhafmtrXok4vnmoTlrbjmoKHmlbjlubPlnYfmlbjnhKHpoa/okZflt67nlbDjgIINCiMjIyMg5bCN56uL5YGH6Kit77yISOKCge+8ie+8mkEg5Y2A6IiHIEIg5Y2A6YCf6aOf5bqX5Zyo5pyN5YuZ56+E5ZyN5YWn5ra16JOL55qE5a245qCh5pW45a2Y5Zyo6aGv6JGX5beu55Ww44CCDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCnJtKGxpc3QgPSBscygpKQ0KbGlicmFyeShzZikNCmxpYnJhcnkoZHBseXIpDQoNCnNldHdkKCJDOi/nqbrplpPliIbmnpAiKQ0KZmFzdGZvb2QgPC0gc3RfcmVhZCgiVHBlX0Zhc3Rmb29kL1RwZV9GYXN0Zm9vZC5zaHAiLG9wdGlvbnM9IkVOQ09ESU5HPUJJRzUiKQ0Kc2Nob29scyA8LSBzdF9yZWFkKCJTQ0hPT0wvU0NIT09MLnNocCIsb3B0aW9ucz0iRU5DT0RJTkc9QklHNSIpDQp2aWxsYWdlcyA8LSBzdF9yZWFkKCJUYWlwZWlfVmlsbC9UYWlwZWlfVmlsbC5zaHAiLG9wdGlvbnM9IkVOQ09ESU5HPUJJRzUiKQ0KDQp2aWxsYWdlcyA8LSB2aWxsYWdlcyAlPiUNCiAgbXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKA0KICAgIFRPV04gJWluJSBjKCLmloflsbHljYAiLCAi5aSn5a6J5Y2AIiwgIuS4reato+WNgCIpIH4gIkEiLA0KICAgIFRPV04gJWluJSBjKCLkv6HnvqnljYAiLCAi5Y2X5riv5Y2AIiwgIuadvuWxseWNgCIpIH4gIkIiLA0KICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfDQogICkpDQoNCiMgMS4g5bu656uL57ep6KGd5Y2A5Lim5Yqg5LiKIHN0b3JlX2lkDQpmYXN0Zm9vZF9idWZmZXIgPC0gZmFzdGZvb2QgJT4lDQogIG11dGF0ZShzdG9yZV9pZCA9IHJvd19udW1iZXIoKSkgJT4lDQogIHN0X2J1ZmZlcihkaXN0ID0gMTAwMCkNCg0KIyAyLiDnqbrplpMgam9pbiDpgJ/po5/lupcgYnVmZmVyIOiIh+WtuOagoQ0Kam9pbmVkIDwtIHN0X2pvaW4oZmFzdGZvb2RfYnVmZmVyLCBzY2hvb2xzLCBqb2luID0gc3RfaW50ZXJzZWN0cykNCg0KIyAzLiDoqIjnrpfmr4/lrrbpgJ/po5/lupfmtrXok4vnmoTlrbjmoKHmlbgNCnNjaG9vbF9jb3VudCA8LSBqb2luZWQgJT4lDQogIHN0X2Ryb3BfZ2VvbWV0cnkoKSAlPiUNCiAgZ3JvdXBfYnkoc3RvcmVfaWQpICU+JQ0KICBzdW1tYXJpc2Uobl9zY2hvb2wgPSBuKCkpDQoNCiMgNC4g5bCH6KGM5pS/5Y2A5Yqg5YWl6YCf6aOf5bqX6bue5L2NDQpmYXN0Zm9vZF93aXRoX2FyZWEgPC0gc3Rfam9pbihmYXN0Zm9vZCwgdmlsbGFnZXNbImdyb3VwIl0pICU+JQ0KICBtdXRhdGUoc3RvcmVfaWQgPSByb3dfbnVtYmVyKCkpDQoNCiMgNS4g5ZCI5L215a245qCh5pW46LOH6KiKDQphbmFseXNpc19kYXRhIDwtIGxlZnRfam9pbihmYXN0Zm9vZF93aXRoX2FyZWEsIHNjaG9vbF9jb3VudCwgYnkgPSAic3RvcmVfaWQiKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShncm91cCkpDQpgYGANCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCnQudGVzdChuX3NjaG9vbCB+IGdyb3VwLCBkYXRhID0gYW5hbHlzaXNfZGF0YSwgdmFyLmVxdWFsID0gRkFMU0UpDQpgYGANCiMjIyDmqqLlrprntZDmnpzmkZjopoENCnQg5YC877yaMS41OTc3DQroh6rnlLHluqbvvJpkZiA9IDUxDQpwIOWAvO+8mjAuMTE2Mw0KOTUlIOS/oeiztOWNgOmWk++8mlvigJMwLjE0MTgsIDEuMjQ3NF0NCuW5s+Wdh+WAvO+8iOWtuOagoeaVuO+8ie+8mg0KQSDljYDvvJozLjg3MQ0KQiDljYDvvJozLjMxOA0KDQojIyMg57WQ6KuWDQrnlLHmlrwgcCDlgLwgPSAwLjExNjMgPiDpoa/okZfmsLTmupYgzrEgPSAwLjA177yM5pWF54Sh5rOV5ouS57WV6Jmb54Sh5YGH6Kit77yM5Luj6KGoIEEg5Y2A6IiHIEIg5Y2A6YCf6aOf5bqX5ZyoIDEg5YWs6YeM5YWn5ra16JOL55qE5a245qCh5pW46YeP5LmL6ZaT54Sh6aGv6JGX5beu55Ww44CCDQoNCumblueEtiBBIOWNgOeahOW5s+Wdh+aVuOeVpemrmO+8iDMuODcgdnMuIDMuMzLvvInvvIzkvYbntbHoqIjkuIrkuKbmnKrpgZTliLDpoa/okZfmsLTmupbvvIzooajnpLrpgJnmqKPnmoTlt67nlbDlj6/og73kvoboh6rmlrzmqKPmnKzms6Lli5XogIzpnZ7nnJ/lr6blt67nlbDjgIINCg0KIyMjIDIuIOS7pTUwMOWFrOWwuuaWueagvOeahOepuumWk+WWruS9jeW7uueri+e2suagvO+8jOS+neeFp2NvbnRpZ3VpdHnphLDov5HlrprnvqnvvIzoqIjnrpfkuKbnuaroo73pgJ/po5/lupfnuL3mlbjnmoRNb3JhJ3MgY29ycmVsb2dyYW3vvIzop6PoroDlhbblnJbooajos4foqIrvvIzkuKboqZXkvLDpgJ/po5/lupfnmoTnqbrplpPlvbHpn7/nr4TlnI3jgIIgDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShzcGRlcCkNCmxpYnJhcnkoZHBseXIpDQoNCiMg5YGH6KitIGZhc3Rmb29kX3dncyDlt7LntpPovYnmj5vngrogRVBTRzo0MzI277yM5YaN6L2J5ZueIFRNMiDmipXlvbHlu7rnq4vmoLzntrLvvIjku6XlhazlsLrngrrllq7kvY3vvIkNCnRtMl9jcnMgPC0gc3RfY3JzKDM4MjYpDQpmYXN0Zm9vZF90bTIgPC0gc3RfdHJhbnNmb3JtKGZhc3Rmb29kLCBjcnMgPSB0bTJfY3JzKQ0KDQojIOW7uueri+mCiueVjOevhOWcje+8iOS+i+WmguW+nuadkemHjOmCiueVjOS+huW7uue2suagvO+8iQ0Kc3R1ZHlfYXJlYSA8LSBzdF91bmlvbihzdF90cmFuc2Zvcm0odmlsbGFnZXMsIGNycyA9IHRtMl9jcnMpKQ0KDQojIOW7uueriyA1MDAg5YWs5bC65pa55qC8DQpncmlkIDwtIHN0X21ha2VfZ3JpZChzdHVkeV9hcmVhLCBjZWxsc2l6ZSA9IDUwMCwgc3F1YXJlID0gVFJVRSkgJT4lDQogIHN0X3NmKGdyaWRfaWQgPSAxOmxlbmd0aCguKSwgZ2VvbWV0cnkgPSAuKQ0KDQojIOe1seioiOavj+agvOWFp+mAn+mjn+W6l+aVuOmHjw0KZ3JpZCRmYXN0Zm9vZF9jb3VudCA8LSBsZW5ndGhzKHN0X2ludGVyc2VjdHMoZ3JpZCwgZmFzdGZvb2RfdG0yKSkNCg0KIyDlu7rnq4vphLDmjqXpl5zkv4LvvIhRdWVlbuKAmXMgY29udGlndWl0ee+8iQ0KbmIgPC0gcG9seTJuYihncmlkLCBxdWVlbiA9IFRSVUUpDQpsdyA8LSBuYjJsaXN0dyhuYiwgc3R5bGUgPSAiVyIpICAjIOasiumHjeefqemZow0KDQojIOioiOeulyBjb3JyZWxvZ3Jhbe+8iOWFqOi3nei3nembouS4i+eahCBNb3JhbidzIEnvvIkNCmNvcnJlbG9nIDwtIHNwLmNvcnJlbG9ncmFtKG5iLCBncmlkJGZhc3Rmb29kX2NvdW50LCBvcmRlciA9IDEwLCBtZXRob2QgPSAiSSIsIHN0eWxlID0gIlciLCB6ZXJvLnBvbGljeSA9IFRSVUUpDQoNCiMg57mq5ZyWDQpwbG90KGNvcnJlbG9nKQ0KYGBgDQojIyMg5YiG5p6Q57WQ5p6c5pGY6KaBDQrmoLnmk5rlnJblvaLvvIjopovkuIvlnJbvvInvvIxNb3JhbuKAmXMgSSDlgLzlkYjnj77ku6XkuIvotqjli6LvvJoNCg0K56ysIDEg6ZqO6YSw6L+R6Led6Zui77yIbGFnID0gMe+8ie+8mg0KDQpNb3JhbuKAmXMgSSDntITngrogMC4yMe+8jOS7o+ihqOWFt+aciemhr+iRl+ato+WQkeepuumWk+iHquebuOmXnO+8jOWNs+mAn+mjn+W6l+aVuOmHj+WcqOesrOS4gOmajumEsOi/keWWruWFg+mWk+WRiOePvuiBmumbhuaAp+WIhuW4g+OAgg0KDQrpmqjokZfphLDov5Hpmo7mlbjlop7liqDvvIhsYWcgMiB+IGxhZyAxMO+8ie+8mg0KDQpNb3JhbuKAmXMgSSDlgLzpgJDmvLjkuIvpmY3vvIzoh7PnrKwgN+KAkzEwIOmajuW+jOi2qOi/keaWvCAw77yM5LiU6YOo5YiG5Y2A6ZaT6Kqk5beu57ea56m/6LaKIDDvvIzooajnpLrlnKjmm7TpgaDot53pm6LkuIvnhKHpoa/okZfnqbrplpPoh6rnm7jpl5zjgIINCg0KIyMjIOe1kOirluiIh+ino+mHiw0K5b6e57WQ5p6c5Y+v55+l77yM6YCf6aOf5bqX5ZyoNTAwIOWFrOWwuuiHsyAxNTAwIOWFrOWwuuevhOWcjeWFp+WFt+acieaYjumhr+eahOepuumWk+iBmumbhuaViOaHie+8jOihqOekuuatpOevhOWcjeWFp+eahOWVhualreaTmum7nuaIlueUn+a0u+apn+iDveWPr+iDveWwjemAn+mjn+W6l+WIhuW4g+eUoueUn+epuumWk+WQuOW8leaViOaenOOAgg0KDQrnqbrplpPlvbHpn7/nr4TlnI3mjqjoq5bvvJrpgJ/po5/lupfnmoTnqbrplpPlvbHpn7/kuLvopoHpm4bkuK3lnKjliY0gMn4zIOmajumEsOi/keevhOWcjeWFp++8iOe0hCAx4oCTMS41IOWFrOmHjO+8ieOAgg0KDQrnqbrplpPopo/lioPmhI/mtrXvvJrlnKjopo/lioPpg73luILllYbmpa3liIbluIPmiJblgaXlurfpo7Lpo5/nkrDlooPmlL/nrZbmmYLvvIzlj6/ogIPph4/pgJ/po5/lupfmlrzphLDov5Hnr4TlnI3ogZrpm4bmgKfmiYDnlKLnlJ/nmoTlvbHpn7/vvIzkuKblj6/ph53lsI3ogZrpm4bljYDln5/pgLLooYzlvoznuoznh5/ppIrmlL/nrZbmiJblrbjmoKHlkajpgorpo5/lk4HnkrDlooPoqr/mn6XjgIINCg0K57WQ6KuW57i957WQ77yaDQrmnKzliIbmnpDku6UgNTAwIOWFrOWwuuepuumWk+agvOe2sueCuuWWruS9je+8jOioiOeul+mAn+mjn+W6l+epuumWk+iHquebuOmXnOaDheW9ouOAgue1kOaenOmhr+ekuuWcqCAxLjUg5YWs6YeM5Lul5YWn5a2Y5Zyo5piO6aGv55qE56m66ZaT576k6IGa77yM5Y+N5pig6YCf6aOf5bqX6YG45Z2A5Y+v6IO95Y+X5Yiw5ZWG5ZyI5oiW5Lq65Y+j5a+G5bqm562J5Zyw55CG5Zug57Sg5b2x6Z+/44CC6LaF6YGO5q2k6Led6Zui5YmH56m66ZaT5b2x6Z+/6YCQ5ry45rib5byx77yM5ZGI54++56m66ZaT542o56uL6Lao5Yui44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KIyDlsIfpgJ/po5/lupfoiIfooYzmlL/pgornlYzpg73ovYnngrogRVBTRzozODI277yIVFdEOTcgLyBUTTLvvIkNCnZpbGxhZ2VzX3RtMiA8LSBzdF90cmFuc2Zvcm0odmlsbGFnZXMsIGNycyA9IDM4MjYpDQpmYXN0Zm9vZF90bTIgPC0gc3RfdHJhbnNmb3JtKGZhc3Rmb29kLCBjcnMgPSAzODI2KQ0KDQojIOW7uueri+a2teiTi+adkemHjOevhOWcjeeahCA1MDAg5YWs5bC65qC857ayDQpncmlkIDwtIHN0X21ha2VfZ3JpZCh2aWxsYWdlc190bTIsIGNlbGxzaXplID0gNTAwLCBzcXVhcmUgPSBUUlVFKQ0KZ3JpZF9zZiA8LSBzdF9zZihncmlkX2lkID0gMTpsZW5ndGgoZ3JpZCksIGdlb21ldHJ5ID0gZ3JpZCkNCg0KIyDkvb/nlKggc3RfaW50ZXJzZWN0cyDliKTmlrfpgJ/po5/lupfpu57mmK/lkKbokL3lnKjmoLzlrZDlhacNCmdyaWRfc2YkZmFzdGZvb2RfY291bnQgPC0gbGVuZ3RocyhzdF9pbnRlcnNlY3RzKGdyaWRfc2YsIGZhc3Rmb29kX3RtMikpDQoNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkodmlyaWRpcykNCg0KZ2dwbG90KCkgKw0KICBnZW9tX3NmKGRhdGEgPSBncmlkX3NmLCBhZXMoZmlsbCA9IGZhc3Rmb29kX2NvdW50KSwgY29sb3IgPSBOQSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAiaW5mZXJubyIsIG5hbWUgPSAi6YCf6aOf5bqX5pW46YePIiwgZGlyZWN0aW9uID0gLTEpICsNCiAgZ2VvbV9zZihkYXRhID0gdmlsbGFnZXNfdG0yLCBmaWxsID0gTkEsIGNvbG9yID0gImJsYWNrIiwgbGluZXdpZHRoID0gMC4zKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiNTAwIOWFrOWwuuagvOe2suS4reeahOmAn+mjn+W6l+WIhuW4g+eGseW6puWcliIsDQogICAgY2FwdGlvbiA9ICLos4fmlpnkvobmupDvvJpUcGVfRmFzdGZvb2QgJiBUYWlwZWlfVmlsbCINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCBmYWNlID0gImJvbGQiKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiDQogICkNCmBgYA0KIyMjIOepuumWk+WIhuW4g+eJueW+tQ0KDQojIyMjIOaguOW/g+iBmumbhuWNgO+8mg0K5Y+w5YyX5biC5Lit6YOo6IiH6KW/5Y2X6YOo5Zyw5Y2A77yI5aaC5Lit5q2j5Y2A44CB6KW/6ZaA55S644CB5aSn5a6J5Y2A44CB5L+h576p6KiI55Wr5Y2A77yJ5Ye654++5aSa5YCL5rex6Imy5qC857ay77yM6aGv56S66YCf6aOf5bqX5a+G6ZuG5YiG5biD44CB5piO6aGv6IGa6ZuG44CCDQrmraTnj77osaHoiIfpq5jlr4bluqbllYbmpa3mtLvli5XjgIHkurrmtYHljK/pm4boiIfkuqTpgJrnr4Dpu57pq5jluqbph43nlorvvIznrKblkIjllYbmpa3pgbjlnYDpgo/ovK/jgIINCg0KIyMjIyDpgornt6PlnLDljYDnqIDnlo/vvJoNCuWMl+aKleWNgOOAgeaWh+WxseWNgOOAgeWNl+a4r+WNgOOAgeWFp+a5luWNgOetieWRqOmCiuWNgOWfn++8jOWkp+WkmuagvOe2sumhr+ekuueCuua3uuiJsu+8iDDigJMxIOmWk++8ie+8jOS7o+ihqOmAn+mjn+W6l+i8g+eCuueogOeWj+aIlumbtuaYn+WIhuW4g+OAgg0K5q2k6IiH5L2P5a6F5q+U5L6L6LyD6auY44CB5Lqk6YCa6LyD5LiN5L6/5oiW6Z2e5Li76KaB5ZWG5ZyI5pyJ6Zec44CCDQoNCiMjIyMg5YiG5biD5LiN5Z2H5oCn6auY77yaDQrpq5jlr4bluqbljYDln5/pm4bkuK3lnKjlub7lgIvkuK3lv4Ppu57vvIzlhbbku5blnLDljYDlkYjnj77lu6Pms5vnmoTkvY7lr4bluqbmoLzntrLvvIzpoa/npLrnqbrplpPnlbDos6rmgKflvLfjgIHpnZ7pmqjmqZ/liIbluIPjgIINCg0KIyMjIOe2nOWQiOino+iugA0K5q2k54ax5bqm5ZyW5piO56K65bGV54++6YCf6aOf5bqX5Zyo5Y+w5YyX5biC55qE5YiG5biD5ZGI54++5YW45Z6L55qE6YO95biC5qC45b+D6IGa6ZuG5qih5byP44CC5ZWG5qWt5rS75YuV55m86YGU5Y2A5Z+f5YWn77yI5aaC5L+h576p5ZWG5ZyI44CB5Y+w5YyX6LuK56uZ5ZGo6YKK77yJ5qC857ay5Lit5Y+v6YGUIDPigJM0IOmWk+mAn+mjn+W6l++8jOWPjeaYoOipsuWNgOWfn+WFt+acie+8mg0KDQojIyMjIOmrmOW6puWPr+WPiuaAp++8iGFjY2Vzc2liaWxpdHnvvIkNCiMjIyMg5Lq65Y+j5a+G5bqm6auY77yIaGlnaCBwb3B1bGF0aW9uIGRlbnNpdHnvvIkNCiMjIyMg5raI6LK76IiH6YCa5Yuk6ZyA5rGC6ZuG5LitDQoNCuiAjOWFtuS7lumdnuaguOW/g+WNgOWfn+WJh+i8g+mbo+WQuOW8leWvhumbhumWi+iore+8jOWRiOePvuWHuuOAjOmDveW4guaguOW/g+KAlOmCiue3o+aTtOaVo+OAjeeahOepuumWk+WIhuW4g+aFi+WLouOAgg0KDQojIyMgMy4g5L6d54Wn5YmN5LiA5bCP6aGM55qE57ay5qC854K656m66ZaT5Zau5L2N77yM5L6d54WnY29udGlndWl0eemEsOi/keWumue+qe+8jOioiOeul0dpKue1seioiOmHj++8jOWIhuWIpee5quijvemAn+mjn+W6l+WutuaVuOiIh+WtuOagoeWcqDAuMDXpoa/okZfmsLTmupbnmoTnhrHljYDliIbkvYjvvIjpnIDpgLLooYzlpJrph43mqqLlrprnmoTkv67mraPvvInjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCiMg57Wx6KiI5q+P5qC85YWn55qE5a245qCh5pW46YePDQpzY2hvb2xfdG0yIDwtIHN0X3RyYW5zZm9ybShzY2hvb2xzLCBjcnMgPSAzODI2KQ0KZ3JpZF9zZiRzY2hvb2xfY291bnQgPC0gbGVuZ3RocyhzdF9pbnRlcnNlY3RzKGdyaWRfc2YsIHNjaG9vbF90bTIpKQ0KbGlicmFyeShzcGRlcCkNCg0KbmIgPC0gcG9seTJuYihncmlkX3NmLCBxdWVlbiA9IFRSVUUpICAjIOmEsOaOpeefqemZow0KbHcgPC0gbmIybGlzdHcobmIsIHN0eWxlID0gIkIiLCB6ZXJvLnBvbGljeSA9IFRSVUUpICAjIEIgPSBiaW5hcnkgd2VpZ2h0cw0KIyDoqIjnrpcgR2kqIOe1seioiOmHjw0KZ2lfZmFzdGZvb2QgPC0gbG9jYWxHKGdyaWRfc2YkZmFzdGZvb2RfY291bnQsIGxpc3R3ID0gbHcsIHplcm8ucG9saWN5ID0gVFJVRSkNCmdpX3NjaG9vbCA8LSBsb2NhbEcoZ3JpZF9zZiRzY2hvb2xfY291bnQsIGxpc3R3ID0gbHcsIHplcm8ucG9saWN5ID0gVFJVRSkNCg0KIyDliqDlhaXliLDmoLzntrLlsazmgKcNCmdyaWRfc2YkZ2lfZmFzdGZvb2QgPC0gYXMubnVtZXJpYyhnaV9mYXN0Zm9vZCkNCmdyaWRfc2YkZ2lfc2Nob29sIDwtIGFzLm51bWVyaWMoZ2lfc2Nob29sKQ0KIyDoqIjnrpcgcCDlgLzvvIjnlLEgWiDliIbmlbjovYnmj5vvvIkNCmdyaWRfc2YkcF9mYXN0Zm9vZCA8LSAyICogcG5vcm0oLWFicyhncmlkX3NmJGdpX2Zhc3Rmb29kKSkNCmdyaWRfc2YkcF9zY2hvb2wgPC0gMiAqIHBub3JtKC1hYnMoZ3JpZF9zZiRnaV9zY2hvb2wpKQ0KDQojIOWkmumHjeaqouWumuS/ruato++8iEJvbmZlcnJvbmkg5oiWIEZEUu+8iQ0KZ3JpZF9zZiRmYXN0Zm9vZF9zaWcgPC0gcC5hZGp1c3QoZ3JpZF9zZiRwX2Zhc3Rmb29kLCBtZXRob2QgPSAiZmRyIikgPCAwLjA1DQpncmlkX3NmJHNjaG9vbF9zaWcgPC0gcC5hZGp1c3QoZ3JpZF9zZiRwX3NjaG9vbCwgbWV0aG9kID0gImZkciIpIDwgMC4wNQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIOeGseWNgOWclu+8mumAn+mjn+W6lyBHaSoNCmdncGxvdChncmlkX3NmICU+JSBmaWx0ZXIoZmFzdGZvb2Rfc2lnKSkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gZ2lfZmFzdGZvb2QpLCBjb2xvciA9IE5BKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdyA9ICJibHVlIiwgbWlkID0gIndoaXRlIiwgaGlnaCA9ICJyZWQiLA0KICAgICAgICAgICAgICAgICAgICAgICBtaWRwb2ludCA9IDAsIG5hbWUgPSAiR2kqIFog5YiG5pW4IikgKw0KICBsYWJzKHRpdGxlID0gIumAn+mjn+W6l+eGseWNgO+8iEdpKu+8jEZEUiDkv67mraMgcCA8IDAuMDXvvIkiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQojIOeGseWNgOWclu+8muWtuOagoSBHaSoNCmdncGxvdChncmlkX3NmICU+JSBmaWx0ZXIoc2Nob29sX3NpZykpICsNCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGdpX3NjaG9vbCksIGNvbG9yID0gTkEpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudDIobG93ID0gImJsdWUiLCBtaWQgPSAid2hpdGUiLCBoaWdoID0gInJlZCIsDQogICAgICAgICAgICAgICAgICAgICAgIG1pZHBvaW50ID0gMCwgbmFtZSA9ICJHaSogWiDliIbmlbgiKSArDQogIGxhYnModGl0bGUgPSAi5a245qCh54ax5Y2A77yIR2kq77yMRkRSIOS/ruatoyBwIDwgMC4wNe+8iSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCmBgYA0KIyMjIOeGseWNgOWIhuaekOe1kOaenO+8iOWcluW9ouino+iugO+8iQ0KIyMjIyDlnJbkuIDvvJrpgJ/po5/lupfnhrHljYDvvIhHaSrvvIkNCuWIhuW4g+eJueW+te+8mg0KDQrkuLvopoHpm4bkuK3lnKgg5Y+w5YyX5biC5Lit5Y2X6YOo77yI5Lit5q2j44CB5aSn5a6J44CB5L+h576p5Lqk55WM5Y2A5Z+f77yJ77yM5Ye654++5aSa5YCLIFog5YiG5pW4ID4gMTAg55qE6auY6aGv6JGX54ax5Y2A77yM5pyA5Lqu57SF5qC857ayIFog5YC855Sa6Iez6auY6YGUIDE177yM6aGv56S65q2k5Y2A5Z+f6YCf6aOf5bqX5a+G5bqm6aGv6JGX6auY5pa86YSw6L+R5qC857ay44CCDQoNCuWFtuS7luWNgOWfn++8iOWmguWMl+aKleOAgeWFp+a5lu+8ieWJh+eEoeaYjumhr+eGseWNgO+8jOmhr+ekuuWIhuW4g+S4jeWdh+OAgg0KDQrnqbrplpPmtrXnvqnvvJoNCg0K6Kmy54ax6bue5Y2A5Z+f5oeJ54K66YeN6KaB5ZWG5qWt5Lit5b+D44CB5Lqk6YCa6L2J6YGL56uZ5oiW5a2455Sf6IGa6ZuG5Zyw77yM6YCf6aOf5bqX6auY5bqm6ZuG5Lit77yM5b2i5oiQ57Wx6KiI6aGv6JGX55qE54ax5Y2A44CCDQoNCiMjIyMg5ZyW5LqM77ya5a245qCh54ax5Y2A77yIR2kq77yJDQrliIbluIPnibnlvrXvvJoNCg0K54ax5Y2A5Li76KaB5L2N5pa8IOaWh+WxseOAgeS/oee+qeiIh+iQrOiPr+S6pOeVjOiZle+8jFog5YiG5pW45LuL5pa8IDQg6IezIDjvvIzpoa/okZfnqIvluqbnlaXkvY7mlrzpgJ/po5/lupfnhrHljYDvvIzkvYbkuZ/lvaLmiJDmmI7poa/ogZrpm4bjgIINCg0K5Y2X5Y2A5Y+K5biC5Lit5b+D5LuN5pyJ5bCR5pW454ax5Y2A77yM5L2G5YyX6YOo5qC857ay5bm+5LmO55qG54K66Z2e6aGv6JGX5YC844CCDQoNCuepuumWk+a2tee+qe+8mg0KDQrlrbjmoKHnhrHljYDoiIfpgJ/po5/lupfnhrHljYDpg6jliIbph43nlorvvIzlj6/og73lvaLmiJDjgIzpo5/lk4Hlj6/lj4rmgKfpgY7pq5jjgI3ljYDln5/vvIjlpoLlrbjmoKHml4HpgJ/po5/pgbjpoIXpm4bkuK3vvInvvIzlsI3pnZLlsJHlubTnmoTlgaXlurfooYzngrrmnInmvZvlnKjlvbHpn7/jgIINCg0KIyMjIOe2nOWQiOavlOi8g+iIh+ipleS8sCAgIA0KICAgICAgICAgCSAgICAgICAgICAgCQkgIA0KIyMjIyDpgJ/po5/lupcgR2kqDQrnhrHljYDpm4bkuK3ljYDln5/vvJrkuK3mraMt5aSn5a6JLeS/oee+qeS6pOeVjA0KWiDlgLzmnIDpq5jvvJriiYggMTUJICANCueGseWNgOevhOWcje+8muWvhumbhuS4lOmAo+e6jA0K6Kej6YeL77ya6IiH5ZWG5ZyI44CB6auY5Lq65rWB5Y2A6auY5bqm6YeN55aKDQoNCiMjIyMg5a245qCh5pW46YePIEdpKgkNCueGseWNgOmbhuS4reWNgOWfn++8muaWh+WxsS3okKzoj6/oiIfkv6HnvqnjgIHpg6jliIbljZfljYAJDQpaIOWAvOacgOmrmO+8muKJiCA4CSAgICANCueGseWNgOevhOWcje+8muWIhuW4g+i8g+WIhuaVowkNCuino+mHi++8muiIh+S9j+WuheWNgOaIluaVmeiCsuWNgOaciemXnA0KDQrkuozogIXnhrHljYDpg6jliIbph43nlorvvIjlsKTlhbblnKjkuK3ljZfpg6jlnLDljYDvvInvvIzkvYbpgJ/po5/lupfnmoTogZrpm4bnqIvluqbmmI7poa/mm7Tpm4bkuK3kuJTpoa/okZfjgIINCuWtuOagoeeGseWNgOi8g+W7o+S9huWIhuW4g+i8g+eCuueijueJh+WMlu+8jOWPjeaYoOWFtuimj+WKg+iIh+ihjOaUv+WNgOmCiueVjOOAgeS6uuWPo+e1kOani+mXnOS/gui8g+WvhuWIh+OAgg0KDQojIyBQYXJ0IDLvvJrlrbjmoKHpmYTov5HnmoTpgJ/po5/lupfmlbjph4/nnJ/nmoTmr5TovIPlpJrll44/IA0KIyMjIOWvpuS9nOmhjO+8iDMw5YiG77yM5q+P6aGMMTDliIbvvIkgDQojIyMjIDEuIOiri+WPg+iAg1RyYW5zcG9ydGF0aW9uIFJlc2VhcmNoIFBhcnQgQSwgNDUgKDIwMTEpIDY0MOKAkzY1Mu+8iEhXLTA5IOeahOeglOiugOaVmeadkO+8ieaJgOS9v+eUqEYoZCnlh73mlbjnmoTkvZzms5XvvIzmr5TovIPliIbliKXkvY3mlrzlpKflronljYDjgIHmloflsbHljYDoiIfkv6HnvqnljYDnmoTlrbjmoKHvvIzliLDphLDov5HpgJ/po5/lupfnmoTnqbrplpPnibnlvrXjgIINCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KbGlicmFyeShzcGF0c3RhdCkNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIFN0ZXAgMe+8mui9ieaPm+eCuiBUV0Q5NyBUTTIg5bqn5qiZDQpzY2hvb2xzX3RtMiA8LSBzdF90cmFuc2Zvcm0oc2Nob29scywgY3JzID0gMzgyNikNCmZhc3Rmb29kX3RtMiA8LSBzdF90cmFuc2Zvcm0oZmFzdGZvb2QsIGNycyA9IDM4MjYpDQp2aWxsYWdlc190bTIgPC0gc3RfdHJhbnNmb3JtKHZpbGxhZ2VzLCBjcnMgPSAzODI2KQ0KDQojIFN0ZXAgMu+8muW7uueriyBzdHVkeSBhcmVh77yIb3dpbiDmoLzlvI/vvIkNCmJvdW5kYXJ5IDwtIHN0X3VuaW9uKHN0X2dlb21ldHJ5KHZpbGxhZ2VzX3RtMikpDQp3aW5kb3cgPC0gYXMub3dpbihzdF9hc19zZihib3VuZGFyeSkpDQoNCiMgU3RlcCAz77ya5bCH5a245qCh5Yqg5LiK6KGM5pS/5Y2A5qyE5L2NDQpzY2hvb2xzX3dpdGhfem9uZSA8LSBzdF9qb2luKHNjaG9vbHNfdG0yLCB2aWxsYWdlc190bTJbLCBjKCJUT1dOIiwgIlZJTExBR0UiKV0pDQoNCiMgU3RlcCA077ya5a6a576p6KGM5pS/5Y2ADQp6b25lcyA8LSBjKCLlpKflronljYAiLCAi5paH5bGx5Y2AIiwgIuS/oee+qeWNgCIpDQoNCiMgU3RlcCA177ya5bu656uL6YCf6aOf5bqX55qEIHBwcCDmoLzlvI8NCmNvb3Jkc19mYXN0Zm9vZCA8LSBzdF9jb29yZGluYXRlcyhmYXN0Zm9vZF90bTIpWywgMToyXQ0KZmFzdGZvb2RfcHBwIDwtIGFzLnBwcChjb29yZHNfZmFzdGZvb2QsIFcgPSB3aW5kb3cpDQoNCiMgU3RlcCA277ya5L6d6KGM5pS/5Y2A6KiI566XIEYoZCkNCnBhcihtZnJvdyA9IGMoMSwgMykpICAjIOS4ieW8teWcluaOkuS4gOWIlw0KZm9yICh6b25lIGluIHpvbmVzKSB7DQogIHNjaG9vbHNfem9uZSA8LSBzY2hvb2xzX3dpdGhfem9uZSAlPiUgZmlsdGVyKFRPV04gPT0gem9uZSkNCiAgY29vcmRzX3pvbmUgPC0gc3RfY29vcmRpbmF0ZXMoc2Nob29sc196b25lKVssIDE6Ml0NCiAgc2Nob29sX3BwcCA8LSBhcy5wcHAoY29vcmRzX3pvbmUsIFcgPSB3aW5kb3cpDQogIA0KICAjIOioiOeulyBGKGQpDQogIEZkIDwtIEZlc3Qoc2Nob29sX3BwcCwgZmFzdGZvb2RfcHBwKQ0KICANCiAgIyDnuarlnJYNCiAgcGxvdChGZCwgbWFpbiA9IHBhc3RlKCJGKGQpIOe0r+epjeWHveaVuCAtIiwgem9uZSksIGx3ZCA9IDIpDQp9DQpgYGANCiMjIyDliIbmnpDmlrnms5UNCuacrOmhjOWPg+iAgyBUcmFuc3BvcnRhdGlvbiBSZXNlYXJjaCBQYXJ0IEEsIDQ1ICgyMDExKSDmiYDmj5Dlh7rkuYsgRihkKSDntK/nqY3ot53pm6LliIbluIPlh73mlbgg5pa55rOV77yM6YCP6YGO6bue5qih5byP5YiG5p6Q77yIUG9pbnQgUGF0dGVybiBBbmFseXNpc++8ieioiOeul++8mg0KDQrmr4/miYDlrbjmoKHot53pm6LmnIDov5HkuIDplpPpgJ/po5/lupfnmoTot53pm6LliIbluIMNCg0K5LiJ56iu5Lyw6KiI5pa55rOV77yaa20gKEthcGxhbuKAk01laWVyKeOAgWJvcmQgKGJvcmRlciBjb3JyZWN0aW9uKeOAgWNzICh0cmFuc2xhdGlvbiBjb3JyZWN0aW9uKQ0KDQrkuKboiIcgcG9pcyhyKe+8iOWujOWFqOmaqOapn+WIhuW4g++8ieavlOi8gw0KDQrntK/nqY3mm7Lnt5ogRihkKSDkuIrljYfmhIjlv6vvvIzooajnpLrlrbjmoKHotorml6njgIHotorlrrnmmJPmjqXov5HpgJ/po5/lupfvvIzku6PooajlkajpgorpgJ/po5/lupfliIbluIPotorlr4bpm4bjgIINCg0KIyMjIOWcluW9ouWIhuaekOiIh+avlOi8gw0KIyMjIyDlnJbkuIDvvJrlpKflronljYANCkYoZCkg5puy57ea5b+r6YCf5LiK5Y2H77yM5bCk5YW25ZyoIDEwMDDigJMyNTAwIOWFrOWwuuWFp+eahOaWnOeOh+mrmOOAgg0KDQrooajnpLrlpKflronljYDlrbjmoKHpmYTov5HpgJ/po5/lupfliIbluIPlr4bluqbpq5jjgIHphLDov5HmgKflvLfjgIINCg0K5a+m5risIEYoZCkg5puy57ea77yI6buR57ea77yJ5piO6aGv5pep5pa86Zqo5qmf5YiG5biD77yI6JeN6Jmb57ea77yJ77yM6aGv56S65pyJ6IGa6ZuG5oCn6ICM6Z2e6Zqo5qmf44CCDQoNCiMjIyMg5ZyW5LqM77ya5paH5bGx5Y2ADQpGKGQpIOabsue3muebuOWwjeW5s+e3qe+8jOabsue3muWcqCAzMDAwIOWFrOWwuuW+jOaJjeaciemhr+iRl+S4iuWNh+OAgg0KDQrooajnpLrlrbjmoKHoiIfpgJ/po5/lupfot53pm6Lmma7pgY3ovIPpgaDvvIzphLDov5HmgKfovIPlt67vvIzpgJ/po5/lupfliIbluIPovIPnqIDnlo/jgIINCg0K5puy57ea6IiHIEZfcG9pcyhyKSDmjqXov5HvvIzpoa/npLrpgJ/po5/lupflj6/og73mjqXov5HpmqjmqZ/liIbluIPjgIINCg0KIyMjIyDlnJbkuInvvJrkv6HnvqnljYANCkYoZCkg5puy57ea5LiK5Y2H5LuL5pa85aSn5a6J6IiH5paH5bGx5LmL6ZaT44CCDQoNCuWcqCAxNTAw4oCTMzAwMCDlhazlsLrlhafmnInpganluqbkuIrljYfvvIzooajnpLrpg6jliIblrbjmoKHpmYTov5HpgJ/po5/lupfliIbluIPlr4bluqblsJrlj6/vvIzkvYbmlbTpq5TkuI3lpoLlpKflronlr4bpm4bjgIINCg0K5puy57ea55Wl6auY5pa86Zqo5qmf5YiG5biD77yM6aGv56S655Wl5YW36IGa6ZuG54m55oCn44CCDQoNCiMjIyDntZDoq5boiIfnqbrplpPliKToroANCg0KIyMjIyDlpKflronljYANCkYoZCnkuIrljYfpgJ/luqbvvJrlv6vpgJ/vvIzphLDov5HpgJ/po5/lupflr4bluqbvvJrpq5jluqbpm4bkuK3vvIznqbrplpPnibnlvrXvvJrpnZ7pmqjmqZ/ogZrpm4YNCiMjIyMg5paH5bGx5Y2ACQ0KRihkKeS4iuWNh+mAn+W6pu+8mue3qeaFou+8jOmEsOi/kemAn+mjn+W6l+WvhuW6pu+8mueogOeWj++8jOepuumWk+eJueW+te+8mui/keS8vOmaqOapn+WIhuW4gw0KIyMjIyDkv6HnvqnljYAJDQpGKGQp5LiK5Y2H6YCf5bqm77ya5Lit562J77yM6YSw6L+R6YCf6aOf5bqX5a+G5bqm77ya5bGA6YOo6IGa6ZuG77yM56m66ZaT54m55b6177ya6YOo5YiG6ZuG5LitDQoNCiMjIyMg5aSn5a6J5Y2A5a245qCh6ZmE6L+R6YCf6aOf5bqX5pW46YeP5piO6aGv6LyD5aSa77yM6aGv56S66YCf6aOf5bqX5YK+5ZCR6IGa6ZuG5Zyo6YO95biC5qC45b+D6IiH6auY5a245qCh5a+G5bqm5Y2A5Z+f44CCDQojIyMjIOaWh+WxseWNgOWJh+WRiOePvuS9juWvhuW6puOAgeepuumWk+mbouaVo+eJueW+te+8jOWPr+iDveiIh+ipsuWNgOWkmuWxseWcsOOAgeS9juWvhuW6puS9j+WuheWIhuW4g+aciemXnOOAgg0KIyMjIyDkv6HnvqnljYDpm5bmnInllYbmpa3ph43lv4PvvIjlpoLkv6HnvqnoqIjnlavljYDvvInvvIzkvYblrbjmoKHliIbluIPovIPliIbmlaPvvIzlm6DmraTphLDov5HmgKfku4vmlrzlhanogIXkuYvplpPjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCmxpYnJhcnkoZ2dwbG90MikNCg0KZmRfbGlzdCA8LSBsaXN0KCkNCg0KZm9yICh6b25lIGluIHpvbmVzKSB7DQogIHNjaG9vbHNfem9uZSA8LSBzY2hvb2xzX3dpdGhfem9uZSAlPiUgZmlsdGVyKFRPV04gPT0gem9uZSkNCiAgY29vcmRzX3pvbmUgPC0gc3RfY29vcmRpbmF0ZXMoc2Nob29sc196b25lKVssIDE6Ml0NCiAgc2Nob29sX3BwcCA8LSBhcy5wcHAoY29vcmRzX3pvbmUsIFcgPSB3aW5kb3cpDQogIA0KICBGZCA8LSBGZXN0KHNjaG9vbF9wcHAsIGZhc3Rmb29kX3BwcCkNCiAgZmRfZGYgPC0gZGF0YS5mcmFtZShyID0gRmQkciwgRiA9IEZkJGttLCDljYDln58gPSB6b25lKQ0KICBmZF9saXN0W1t6b25lXV0gPC0gZmRfZGYNCn0NCg0KIyDlkIjkvbXngrrkuIDlvLXooagNCmZkX2FsbCA8LSBiaW5kX3Jvd3MoZmRfbGlzdCkNCg0KIyDnlavlh7rmr5TovIPlnJYNCmdncGxvdChmZF9hbGwsIGFlcyh4ID0gciwgeSA9IEYsIGNvbG9yID0g5Y2A5Z+fKSkgKw0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMikgKw0KICBsYWJzKHRpdGxlID0gIuS4ieWNgOWtuOagoeWIsOmAn+mjn+W6l+eahCBGKGQpIOavlOi8gyIsDQogICAgICAgeCA9ICLot53pm6IgZO+8iOWFrOWwuu+8iSIsIHkgPSAiRihkKSDntK/nqY3mqZ/njociKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQojIyMjIOabsue3muS4iuWNh+aEiOW/q++8jOS7o+ihqOmAn+mjn+W6l+WIhuW4g+aEiOWvhumbhuOAgeWtuOagoei3nemboumAn+mjn+W6l+aEiOi/keOAguS/oee+qeWNgOWSjOWkp+WuieWNgOWtuOagoemZhOi/kemAn+mjn+W6l+WvhuW6pumrmOaWvOaWh+WxseWNgO+8jOmhr+ekuumDveW4guaguOW/g+WNgOmjsumjn+eSsOWig+Wjk+WKm+i8g+mrmOOAgg0KDQojIyMgMi4g5Yip55SoUmlwbGV5J3MgSyBmdW5jdGlvbiwgayhkKeioiOeul+mAn+mjn+W6l+WcqCBkaXN0YW5jZSAoZCkgPSAzMDAwIOWFrOWwuuaZgueahCBLKDMwMDApIOS7peWPikwoMzAwMCnvvIzkuKbkvb/nlKhNb250ZSBDYXJsbyBzaWduaWZpY2FuY2UgdGVzdCDoqIjnrpcgTCgzMDAwKeeahCA5NSXkv6Hos7TljYDplpPjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCiMg6KiI566XIEsoMzAwMCkg6IiHIEwoMzAwMCkNCktfcmVzdWx0IDwtIEtlc3QoZmFzdGZvb2RfcHBwLCBjb3JyZWN0aW9uID0gImJvcmRlciIpDQpMX3Jlc3VsdCA8LSBMZXN0KGZhc3Rmb29kX3BwcCwgY29ycmVjdGlvbiA9ICJib3JkZXIiKQ0KDQojIOe5quijvSBMKGQpIOabsue3mu+8iOWQqyA5NSUg5L+h6LO05Y2A6ZaT77yJDQplbnZlbG9wZV9MIDwtIGVudmVsb3BlKGZhc3Rmb29kX3BwcCwgTGVzdCwgbnNpbSA9IDk5OSwgY29ycmVjdGlvbiA9ICJib3JkZXIiLCBzYXZlZnVucyA9IFRSVUUpDQpwbG90KGVudmVsb3BlX0wsIG1haW4gPSAiTChkKSArIDk1JSDkv6Hos7TljYDplpMgKOmAn+mjn+W6lykiLCBsZWdlbmQgPSBGQUxTRSkNCg0KIyDlj5blvpcgTCgzMDAwKSDnmoTmlbjlgLzoiIfkv6Hos7TljYDplpMNCkxfdmFsdWUgPC0gd2l0aChMX3Jlc3VsdCwgTGhhdFt3aGljaChyID09IDMwMDApXSkNCkxfY2lfbG93ZXIgPC0gd2l0aChlbnZlbG9wZV9MLCBsb1t3aGljaChyID09IDMwMDApXSkNCkxfY2lfdXBwZXIgPC0gd2l0aChlbnZlbG9wZV9MLCBoaVt3aGljaChyID09IDMwMDApXSkNCg0KY2F0KCJMKDMwMDApID0iLCBMX3ZhbHVlLCAiXG45NSUgQ0kgPSIsIExfY2lfbG93ZXIsICJ+IiwgTF9jaV91cHBlciwgIlxuIikNCg0KYGBgDQojIyMjIOe1kOaenOino+iugA0K6buR6Imy5a+m57ea5Luj6KGo5a+m6Zqb6KeA5ris55qEIEwoZCkg5YC8DQoNCueBsOiJsumZsOW9seWNgOihqOekuiA5NSUg5L+h6LO05Y2A6ZaT77yITW9udGUgQ2FybG8g5qih5pOs77yJDQoNCuiZm+e3mueCuueQhuirlue3mu+8iOacn+acm+maqOapn+WIhuW4g++8iQ0KDQojIyMjIOe1kOaenOmHjem7ng0K5ZyoIGQgPSAzMDAwIOWFrOWwuuWJjeW+jO+8jOWvpumamyBMKGQpIOabsue3muaYjumhr+mrmOaWvOS/oeiztOWNgOmWk+S4iue3o+OAgg0KDQrpoa/npLrpgJ/po5/lupflnKjmraTnr4TlnI3lhafnmoTnqbrplpPliIbluIPpnZ7pmqjmqZ/vvIzogIzmmK/lkYjnj77poa/okZfogZrpm4bnj77osaHjgIINCg0K6Zqo6Led6Zui5aKe5Yqg77yI6LaF6YGOIDQwMDBt77yJ5b6M77yMTChkKSDplovlp4votqjov5Hmlrzkv6Hos7TljYDplpPvvIzogZrpm4bmlYjmh4notqjnt6njgIINCg0KIyMjIDMuIOWIqeeUqEJpdmFyaWF0ZSBGIGZ1bmN0aW9uIOWIhuaekOaWueazle+8jOavlOi8g+WFrOeri3ZzLuengeeri+WtuOagoe+8jOWIsOmEsOi/kemAn+mjn+W6l+eahOepuumWk+eJueW+te+8jOS4puiqquaYjuWTquS4gOeorumhnuWei+WtuOagoeeahOmZhOi/ke+8jOacg+aciei8g+WkmueahOmAn+mjn+W6l++8n++8iOmhr+iRl+awtOa6lj0wLjA177yJIA0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KIyDliqDlhaUgc2Nob29sX3R5cGUg6K6K6aCF77yMIuWFrOeriyIvIuengeeriyINCnNjaG9vbHNfd2l0aF90eXBlIDwtIHNjaG9vbHNfd2l0aF96b25lICU+JSBmaWx0ZXIoIWlzLm5hKFR5cGUpKSAgIyDnorrkv53mrITkvY3lrZjlnKgNCg0KIyDliIbliKXovYnmj5vngrogcHBwIOagvOW8jw0KY29vcmRzX3B1YmxpYyA8LSBzdF9jb29yZGluYXRlcyhzY2hvb2xzX3dpdGhfdHlwZSAlPiUgZmlsdGVyKFR5cGUgPT0gIuWFrOeriyIpKQ0KY29vcmRzX3ByaXZhdGUgPC0gc3RfY29vcmRpbmF0ZXMoc2Nob29sc193aXRoX3R5cGUgJT4lIGZpbHRlcihUeXBlID09ICLnp4Hnq4siKSkNCg0KcHVibGljX3BwcCA8LSBhcy5wcHAoY29vcmRzX3B1YmxpYywgVyA9IHdpbmRvdykNCnByaXZhdGVfcHBwIDwtIGFzLnBwcChjb29yZHNfcHJpdmF0ZSwgVyA9IHdpbmRvdykNCg0KIyBCaXZhcmlhdGUgRiBmdW5jdGlvbu+8muengeeri+WtuOagoeWIsOmAn+mjn+W6lw0KRmRfcHJpdmF0ZSA8LSBGZXN0KHByaXZhdGVfcHBwLCBmYXN0Zm9vZF9wcHApDQpwbG90KEZkX3ByaXZhdGUsIG1haW4gPSAiRihkKSAtIOengeeri+WtuOagoeWIsOmAn+mjn+W6lyIpDQoNCiMgQml2YXJpYXRlIEYgZnVuY3Rpb27vvJrlhaznq4vlrbjmoKHliLDpgJ/po5/lupcNCkZkX3B1YmxpYyA8LSBGZXN0KHB1YmxpY19wcHAsIGZhc3Rmb29kX3BwcCkNCnBsb3QoRmRfcHVibGljLCBtYWluID0gIkYoZCkgLSDlhaznq4vlrbjmoKHliLDpgJ/po5/lupciKQ0KYGBgDQoNCiMjIyDntZDmnpzlnJblvaLop6PoroANCiMjIyMg5ZyW5LiA77ya56eB56uL5a245qCh5Yiw6YCf6aOf5bqX55qEIEYoZCkNCkYoZCkg5puy57ea77yI6buR57ea44CB57SF6Jmb57ea44CB57ag6bue57ea77yJ5ZyoIDDigJMxNTAwIOWFrOWwuuWFp+WNs+W/q+mAn+S4iuWNh++8jOaVtOmrlOabsue3mumdoOi/kSBGX3BvaXMocinvvIzpoa/npLrliIbluIPlr4bluqblgY/pq5jjgIINCg0K5aSa5pW456eB56uL5a245qCh5ZyoMTUwMCDlhazlsLrlhaflsLHog73mjqXov5HpgJ/po5/lupfvvIzpoa/npLrnp4HmoKHlpJroqK3mlrzllYbmpa3miJbkuqTpgJrkvr/liKnljYDjgIINCg0KIyMjIyDlnJbkuozvvJrlhaznq4vlrbjmoKHliLDpgJ/po5/lupfnmoQgRihkKQ0KRihkKSDmm7Lnt5rkuIrljYfpgJ/luqbovIPmhaLvvIzot53pm6Llu7bkvLjoh7MgMjUwMOKAkzMwMDAg5YWs5bC65omN6YCQ5ry46Lao6L+R6aO95ZKM44CCDQoNCuihqOekuuioseWkmuWFrOeri+WtuOagoeWIhuW4g+WcqOi3nemAn+mjn+W6l+i8g+mBoOeahOS9jee9ru+8jOmAn+mjn+W6l+WIhuW4g+i8g+WIhuaVo+aIluWPr+WPiuaAp+i8g+S9juOAgg0KDQojIyMg57ac5ZCI5q+U6LyDDQoNCiMjIyMg56eB56uL5a245qChDQpGKGQp5LiK5Y2H6YCf5bqm6LyD5b+r77yM5bmz5Z2H5Y+v5Y+K6Led6Zui6LyD6L+R77yIPDE1MDBt77yJ77yM56m66ZaT5YiG5biD54m55b6177ya6IGa6ZuG44CB6auY5a+G5bqm77yM6IiH6YCf6aOf5bqX5o6l6L+R56iL5bqmCeaYjumhr+i8g+mrmA0KDQojIyMjIOWFrOeri+WtuOagoQ0KRihkKeS4iuWNh+mAn+W6pui8g+aFou+8jOW5s+Wdh+WPr+WPiui3nemboui8g+mBoO+8iD4yMDAwbe+8ie+8jOepuumWk+WIhuW4g+eJueW+te+8muWIhuaVo+OAgei8g+maqOapn++8jOiIh+mAn+mjn+W6l+aOpei/keeoi+W6puebuOWwjei8g+S9jg0KDQojIyBQYXJ0IDMuIOmBi+eUqOaJgOWtuOe/kuWIsOeahOe1seioiOWtuOOAgeeoi+W8j+ioreioiOOAgeWcsOWcluiIh+WcsOeQhuizh+ioiuezu+e1seOAgeepuumWkw0KIyMjIOWIhuaekOetieaWueazleaKgOihk++8jOiri+mHneWwjeWtuOeUn+e+pOaXj++8jOaTrOWumuWPsOWMl+W4guagoeWckuWRqOmCiuWBpeW6t+eUn+a0u+ioiOeVq+OAgiAgKOWAi+ahiOaIlumAmuahiOeahuWPr++8jDMw5YiGKSANCiMjIyMg562U6aGM5YWn5a656ZyA6Kqq5piOMS4g5pOs6Kej5rG65qCh5ZyS5ZGo6YKK5YGl5bq355Sf5rS755qE6Z2i5ZCR77ybMi7kvb/nlKjos4fmlpnvvJszLuWIhuaekOaWueazle+8iOmBi+eUqOWcsOeQhuizh+ioiuezu+e1seiIh+epuumWk+WIhuaekOetieebuOmXnOaKgOihk+aIluaWueazle+8jOWwh+aWn+mFjOWKoOWIhu+8ie+8mzQu5YiG5p6Q5p625qeL6IiH5rWB56iL77ybIDUu5YiG5p6Q57WQ5p6c6IiH6Kej6K6A77ybNi7lpoLkvZXlsIflhbbliIbmnpDntZDmnpzovYnora/miJDoqIjnlavmk6zlrprnmoToqqrmmI7jgIINCg0K5YiG5p6Q5YGl5bq36aSQ55uS5bqX6Z2i5pW46YeP5Y+K5L2N572u77yM5Zug54K65pyJ5Y+v6IO95piv5ZGo6YGt5o+Q5L6b55qE6aOf54mp6YCg5oiQ54Sh5rOV6YGU5oiQ5YGl5bq355Sf5rS777yM6YCf6aOf55qE5pa55L6/5oCn5Lul5Y+K5Zyo5Y+w5YyX55u45bCN5piv5L6/5a6c55qE6YG45pOH44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQpoZWFsdGh5IDwtIHN0X3JlYWQoImhlYWx0aHlfcmVzdGF1cmFudHMuZ2VvanNvbiIpICAjIOWBpeW6t+mkkOebkuW6lw0KDQojIDMuIOe1seS4gOaKleW9se+8iOS9v+eUqCBUV0Q5NyAvIFRNMu+8iQ0Kc2Nob29sc190bTIgPC0gc3RfdHJhbnNmb3JtKHNjaG9vbHMsIGNycyA9IDM4MjYpDQpoZWFsdGh5X3RtMiA8LSBzdF90cmFuc2Zvcm0oaGVhbHRoeSwgY3JzID0gMzgyNikNCnZpbGxhZ2VzX3RtMiA8LSBzdF90cmFuc2Zvcm0odmlsbGFnZXMsIGNycyA9IDM4MjYpDQoNCiMgNC4g5bu656uLIDUwMCDlhazlsLrnt6nooZ3ljYDvvIzoqIjnrpfmr4/lgIvlrbjmoKHlkajpgorlgaXlurfppJDlu7Pmlbjph48NCnNjaG9vbF9idWZmZXIgPC0gc3RfYnVmZmVyKHNjaG9vbHNfdG0yLCBkaXN0ID0gNTAwKQ0Kc2Nob29sX2J1ZmZlciRoZWFsdGh5X2NvdW50IDwtIGxlbmd0aHMoc3RfaW50ZXJzZWN0cyhzY2hvb2xfYnVmZmVyLCBoZWFsdGh5X3RtMikpDQoNCiMgNS4g5ZCI5L216KGM5pS/5Y2A5qyE5L2N6LOH6KiKDQpzY2hvb2xzX3dpdGhfdmlsbCA8LSBzdF9qb2luKHNjaG9vbF9idWZmZXIsIHZpbGxhZ2VzX3RtMlsiVE9XTiJdKQ0KDQojIDYuIOWQhOihjOaUv+WNgOW5s+Wdh+WBpeW6t+mkkOebkuW6l+aVuOe1seioiO+8iOWPr+mBuOWBmu+8iQ0Kc2Nob29sX3N1bW1hcnkgPC0gc2Nob29sc193aXRoX3ZpbGwgJT4lDQogIHN0X2Ryb3BfZ2VvbWV0cnkoKSAlPiUNCiAgZ3JvdXBfYnkoVE9XTikgJT4lDQogc3VtbWFyaXNlKGF2Z19oZWFsdGh5ID0gbWVhbihoZWFsdGh5X2NvdW50LCBuYS5ybSA9IFRSVUUpKQ0KDQojIDcuIOijveWclu+8muWBpeW6t+mkkOW7s+WPr+WPiuaApyBjaG9yb3BsZXRoIOWclg0KdG1fc2hhcGUodmlsbGFnZXNfdG0yKSArDQogIHRtX3BvbHlnb25zKCkgKw0KdG1fc2hhcGUoc2Nob29sc193aXRoX3ZpbGwpICsNCiAgdG1fc3ltYm9scygNCiAgICBjb2wgPSAiaGVhbHRoeV9jb3VudCIsDQogICAgc3R5bGUgPSAiZml4ZWQiLA0KICAgIGJyZWFrcyA9IGMoMCwgMSwgMiwgMywgNSksICAjIOaJi+WLleWIhue0mu+8mjB+MSwgMX4yLCAyfjMsIDN+NQ0KICAgIGxhYmVscyA9IGMoIjAg6ZaTIiwgIjEg6ZaTIiwgIjIg6ZaTIiwgIjMg6ZaT5Lul5LiKIiksDQogICAgcGFsZXR0ZSA9ICJZbE9yQnIiLA0KICAgIHNpemUgPSAwLjI1LA0KICAgIHRpdGxlLmNvbCA9ICI1MDDlhazlsLrlhaflgaXlurfppJDnm5LmlbgiDQogICkgKw0KICB0bV9sYXlvdXQoDQogICAgdGl0bGUgPSAi6Ie65YyX5biC5a245qCh5ZGo6YKKIDUwMCDlhazlsLrlhaflgaXlurfppJDnm5Llj6/lj4rmgKfliIbluIMiLA0KICAgIGxlZ2VuZC5vdXRzaWRlID0gVFJVRQ0KICApDQpgYGANCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCiMg5bu656uLIDUwMCDlhazlsLrmoLzntrINCnN0dWR5X2FyZWEgPC0gc3RfdW5pb24odmlsbGFnZXNfdG0yKQ0KZ3JpZCA8LSBzdF9tYWtlX2dyaWQoc3R1ZHlfYXJlYSwgY2VsbHNpemUgPSA1MDAsIHNxdWFyZSA9IFRSVUUpICU+JSANCiAgc3Rfc2YoZ3JpZF9pZCA9IDE6bGVuZ3RoKC4pLCBnZW9tZXRyeSA9IC4pDQoNCiMg6KiI566X5q+P5qC85YWn6YCf6aOf6IiH5YGl5bq36aSQ55uS5bqX5pW4DQpncmlkJGZhc3Rmb29kX2NvdW50IDwtIGxlbmd0aHMoc3RfaW50ZXJzZWN0cyhncmlkLCBmYXN0Zm9vZF90bTIpKQ0KZ3JpZCRoZWFsdGh5X2NvdW50IDwtIGxlbmd0aHMoc3RfaW50ZXJzZWN0cyhncmlkLCBoZWFsdGh5X3RtMikpDQoNCiMg56m66ZaT5YiG5biD5bCN54Wn5ZyW77ya6YCf6aOfICsg5YGl5bq36aSQ55uSDQoNCnRtYXBfbW9kZSgicGxvdCIpICAjIOKchSBOb3RlYm9vayDlu7rorbAgcGxvdCDmqKHlvI8NCg0KIyDlu7rnq4vmoLzntrLkuK3lv4Ppu57kvZzngrrlgaXlurfppJDnm5Lpu57lnJblsaQNCmdyaWRfY2VudGVycyA8LSBzdF9jZW50cm9pZChncmlkKQ0KDQp0bV9zaGFwZShncmlkKSArDQogIHRtX3BvbHlnb25zKA0KICAgIGNvbCA9ICJmYXN0Zm9vZF9jb3VudCIsDQogICAgcGFsZXR0ZSA9ICJSZWRzIiwgICAgICAgICAgICAgICAgICAgIyDinIUg5piO56K65oyH5a6a57SF6ImyDQogICAgdGl0bGUgPSAi6YCf6aOf5bqX5pW4Ig0KICApICsNCnRtX3NoYXBlKGdyaWRfY2VudGVycykgKw0KICB0bV9idWJibGVzKA0KICAgIGNvbCA9ICJoZWFsdGh5X2NvdW50IiwNCiAgICBwYWxldHRlID0gIkdyZWVucyIsICAgICAgICAgICAgICAgICMg4pyFIOaYjueiuuaMh+Wumue2oOiJsg0KICAgIHNpemUgPSAwLjMsDQogICAgdGl0bGUuY29sID0gIuWBpeW6t+mkkOebkuaVuCINCiAgKSArDQp0bV9zaGFwZSh2aWxsYWdlc190bTIpICsNCiAgdG1fYm9yZGVycyhjb2wgPSAiYmxhY2siLCBsd2QgPSAwLjMpICsNCnRtX2xheW91dCgNCiAgbWFpbi50aXRsZSA9ICLoh7rljJfluILpgJ/po5/oiIflgaXlurfppJDnm5LliIbluIPlsI3nhafvvIjlkKvooYzmlL/nlYzvvIkiLA0KICBsZWdlbmQub3V0c2lkZSA9IFRSVUUNCikNCmBgYA0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KIyDoh6roqILliIbpoZ7mqJnmupbvvJoxIOmWk+S7peS4iijlkKsp54K66auY77yMMOeCuuS9jg0KZ3JpZCR0eXBlIDwtIHdpdGgoZ3JpZCwgY2FzZV93aGVuKA0KICBoZWFsdGh5X2NvdW50ID49IDEgJiBmYXN0Zm9vZF9jb3VudCA+PSAxIH4gIumbmemrmOWNgCIsDQogIGhlYWx0aHlfY291bnQgPj0gMSAmIGZhc3Rmb29kX2NvdW50IDwgMSB+ICLlgaXlurflpJrpgJ/po5/lsJHljYAiLA0KICBoZWFsdGh5X2NvdW50IDwgMSAmIGZhc3Rmb29kX2NvdW50ID49IDEgfiAi6YCf6aOf5aSa5YGl5bq35bCR5Y2AIiwNCiAgaGVhbHRoeV9jb3VudCA8IDEgJiBmYXN0Zm9vZF9jb3VudCA8IDEgfiAi6ZuZ5L2O5Y2AIiwNCiAgVFJVRSB+ICLos4fmlpnnvLrlpLEiDQopKQ0KbGlicmFyeSh0bWFwKQ0KdG1hcF9tb2RlKCJwbG90IikNCg0KdG1fc2hhcGUoZ3JpZCkgKw0KICB0bV9wb2x5Z29ucygNCiAgICBjb2wgPSAidHlwZSIsDQogICAgcGFsZXR0ZSA9IGMoDQogICAgICAi6ZuZ6auY5Y2AIiA9ICJkb2RnZXJibHVlIiwNCiAgICAgICLlgaXlurflpJrpgJ/po5/lsJHljYAiID0gImZvcmVzdGdyZWVuIiwNCiAgICAgICLpgJ/po5/lpJrlgaXlurflsJHljYAiID0gImRhcmtvcmFuZ2UiLA0KICAgICAgIumbmeS9juWNgCIgPSAibGlnaHRncmF5Ig0KICAgICksDQogICAgdGl0bGUgPSAi6YCf6aOf6IiH5YGl5bq36aSQ55uS5YiG6aGeIg0KICApICsNCnRtX3NoYXBlKHZpbGxhZ2VzX3RtMikgKw0KICB0bV9ib3JkZXJzKGNvbCA9ICJibGFjayIsIGx3ZCA9IDAuMykgKw0KdG1fbGF5b3V0KA0KICBtYWluLnRpdGxlID0gIuiHuuWMl+W4guagvOe2suS4remAn+mjn+iIh+WBpeW6t+mkkOebkuS+m+aHieWIhumhnuWcsOWclu+8iDEg6ZaT54K655WM77yJIiwNCiAgbGVnZW5kLm91dHNpZGUgPSBUUlVFDQopDQpgYGANCiMjIyDmnKzlnJbku6XjgIwxIOmWk+OAjeS9nOeCuumrmOS9juWIhueVjO+8mg0KIyMjIyDigKIJ6YCf6aOfIOKJpSAxIOS4lCDlgaXlurfppJDnm5Ig4omlIDHvvJrmqJnnpLrngrrjgIzpm5npq5jljYDjgI3vvIjol43oibLvvIkNCiMjIyMg4oCiCemAn+mjnyDiiaUgMSDkuJQg5YGl5bq36aSQ55uSIDwgMe+8muaomeekuueCuuOAjOmAn+mjn+WkmuWBpeW6t+WwkeWNgOOAje+8iOapmOiJsu+8iQ0KIyMjIyDigKIJ6YCf6aOfIDwgMSDkuJQg5YGl5bq36aSQ55uSIOKJpSAx77ya5qiZ56S654K644CM5YGl5bq35aSa6YCf6aOf5bCR5Y2A44CN77yI57ag6Imy77yJDQojIyMjIOKAognpgJ/po58gPCAxIOS4lCDlgaXlurfppJDnm5IgPCAx77ya5qiZ56S654K644CM6ZuZ5L2O5Y2A44CN77yI54Gw6Imy77yJDQojIyMjIOKAoglNaXNzaW5n77ya6Kmy5qC86LOH5paZ5LiN6Laz5oiW5LiN5YyF5ZCr5qCh5ZyS57ep6KGd5Y2A77yI5re654Gw6Imy77yJDQoNCiMjIyDnqbrplpPliIbluIPop4Dlr5/oiIfop6PoroANCg0KIyMjIyAxLgnjgIzpm5npq5jljYDjgI3vvIjol43oibLvvInpm4bkuK3mlrzluILkuK3lv4PjgIHlrbjmoKHlr4bpm4boiIfllYblnIjkuqTnlYzlnLDluLYNCm8J5aaC5Lit5q2j5Y2A44CB5L+h576p5Y2A44CB5p2+5bGx5Y2A5LiA5bi277yM5bqX5a626LOH5rqQ6LGQ5a+M44CB6ZyA5rGC6YeP6auY44CCDQpvCemhr+ekuumAmeS6m+WcsOWNgOWtuOeUn+iIh+S4iuePreaXj+eahOikh+WQiOmcgOaxguWFseWQjOW4tuWLlemkkOmjsuW4guWgtOeahOWkmuaoo+S+m+aHieOAgg0KDQojIyMjIDIuCeOAjOmAn+mjn+WkmuWBpeW6t+WwkeWNgOOAje+8iOapmOiJsu+8ieWRiOePvuWkp+mHj+aTtOaVo+eLgOaFiw0KbwnlnKjpg6jliIbkvY/lroXljYDmiJblrbjmoKHml4HpgorvvIzmnInmmI7poa/nmoTpgJ/po5/lgY/lpb3nj77osaHjgIINCm8J6aGv56S65YGl5bq36YG46aCF5bCa5pyq5pmu5Y+K77yM5r2b5Zyo54ef6aSK5aSx6KGh6aKo6Zqq5Y2A44CCDQoNCiMjIyMgMy4J44CM5YGl5bq35aSa6YCf6aOf5bCR5Y2A44CN77yI57ag6Imy77yJ5pW46YeP56iA5bCR5L2G5YW3562W55Wl5oCn5YO55YC8DQpvCemAmuW4uOWHuuePvuWcqOmCiue3o+ekvuWNgOaIlueJueWumuWBpeW6t+mjsumjn+WAoeitsOWcsOm7nuOAgg0KbwnmnKrkvoblj6/miJDngrrmjqjli5XjgIzlgaXlurflsI7lkJHllYblnIjjgI3kuYvph43pu57ljYDloYrjgIINCg0KIyMjIyA0LuOAjOmbmeS9juWNgOOAje+8iOeBsOiJsu+8ieWkmueCuuWBj+mBoOaIlumdnuS6uuWPo+WvhumbhuWcsOautQ0KbwnppJDpo7LoqK3mlr3nqIDlsJHvvIzooajnpLrmvZvlnKjluILloLTkuI3otrPmiJblj6/mjqXntI3ooYzli5XppJDou4rjgIHoo5zliqnmlL/nrZbjgIINCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KIyDovYnmj5vngrrluqfmqJnnn6npmaMNCmNvb3Jkc19oZWFsdGh5IDwtIHN0X2Nvb3JkaW5hdGVzKGhlYWx0aHlfdG0yKVssIDE6Ml0NCmNvb3Jkc19mYXN0Zm9vZCA8LSBzdF9jb29yZGluYXRlcyhmYXN0Zm9vZF90bTIpWywgMToyXQ0KDQojIOW7uueri+W4tuaciSBtYXJrcyDnmoQgZGF0YS5mcmFtZQ0KbWFya3NfaGVhbHRoeSA8LSBkYXRhLmZyYW1lKHggPSBjb29yZHNfaGVhbHRoeVssIDFdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gY29vcmRzX2hlYWx0aHlbLCAyXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJoZWFsdGh5IikNCm1hcmtzX2Zhc3Rmb29kIDwtIGRhdGEuZnJhbWUoeCA9IGNvb3Jkc19mYXN0Zm9vZFssIDFdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGNvb3Jkc19mYXN0Zm9vZFssIDJdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJmYXN0Zm9vZCIpDQoNCiMg5ZCI5L215YWp6ICFDQptYXJrc19hbGwgPC0gcmJpbmQobWFya3NfaGVhbHRoeSwgbWFya3NfZmFzdGZvb2QpDQoNCiMg5bu656uLIHBwcCDmoLzlvI/vvIzpnIDmjIflrpogd2luZG93DQphbGxfcHBwIDwtIHBwcCh4ID0gbWFya3NfYWxsJHgsDQogICAgICAgICAgICAgICB5ID0gbWFya3NfYWxsJHksDQogICAgICAgICAgICAgICB3aW5kb3cgPSB3aW5kb3csDQogICAgICAgICAgICAgICBtYXJrcyA9IGFzLmZhY3RvcihtYXJrc19hbGwkdHlwZSkpDQoNCkxjcm9zcyhhbGxfcHBwLCBpID0gImhlYWx0aHkiLCBqID0gImZhc3Rmb29kIikNCg0KYGBgDQpgYGB7cn0NCnBsb3QoTGNyb3NzKGFsbF9wcHAsIGkgPSAiaGVhbHRoeSIsIGogPSAiZmFzdGZvb2QiLCBjb3JyZWN0aW9uID0gImJvcmRlciIpLA0KICAgICBtYWluID0gIkNyb3NzLUwgRnVuY3Rpb246IOWBpeW6t+mkkOebkuWIsOmAn+mjn+W6l+eahOepuumWk+mXnOS/giIsDQogICAgIHhsYWIgPSAi6Led6ZuiIHLvvIjlhazlsLrvvIkiLCB5bGFiID0gZXhwcmVzc2lvbihMW2lqXShyKSkpDQphYmxpbmUoMCwgMSwgY29sID0gImdyYXkiKSAgIyDnkIboq5bnt5ogTChyKSA9IHINCmBgYA0KIyMjIOWBpeW6t+mkkOebkuW6l+WIsOmAn+mjn+W6l+eahOepuumWk+mXnOS/gu+8iENyb3NzLUwgZnVuY3Rpb27vvIkNCum7kee3mueCuuingOWvn+WAvO+8iGJvcmRlciDmoKHmraPvvInvvIzntIXomZvnt5rngrrpmqjmqZ/mnJ/mnJvkuIvnmoQgTChyKeOAgg0KDQrntZDmnpzpoa/npLrvvJrmlbTpq5QgTChyKSDmm7Lnt5rpoa/okZfpq5jmlrznkIboq5bnt5rvvIzooajnpLrlgaXlurfppJDnm5LlupflkajlnI3mnInovIPlpJrpgJ/po5/lupfvvIzlkYjnj77poa/okZfnmoTnqbrplpPnvqTogZrpl5zkv4LjgIINCg0K5o6o6KuW77ya5YWp6aGe5Z6L55qE5bqX5a625Y+v6IO95pyD6ZuG5Lit5pa855u45ZCM5Y2A5Z+f77yM5aaC5ZWG5ZyI44CB5aSn5a245Z+O5oiW5Lqk6YCa5L6/5Yip6JmV44CCDQoNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KZW52ZWxvcGVfY3Jvc3MgPC0gZW52ZWxvcGUoYWxsX3BwcCwgZnVuID0gTGNyb3NzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAiaGVhbHRoeSIsIGogPSAiZmFzdGZvb2QiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zaW0gPSA5OTksIGNvcnJlY3Rpb24gPSAiYm9yZGVyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZnVucyA9IFRSVUUpDQoNCnBsb3QoZW52ZWxvcGVfY3Jvc3MsDQogICAgIG1haW4gPSAiQ3Jvc3MtTCBGdW5jdGlvbiBFbnZlbG9wZe+8iOWBpeW6t+KGkumAn+mjn++8iSIsDQogICAgIHhsYWIgPSAi6Led6ZuiIHLvvIjlhazlsLrvvIkiLCB5bGFiID0gZXhwcmVzc2lvbihMW2lqXShyKSkpDQphYmxpbmUoMCwgMSwgY29sID0gImdyYXkiKQ0KDQpgYGANCiMjIyBDcm9zcy1MIEZ1bmN0aW9uIE1vbnRlIENhcmxvIOaooeaTrOWMhee1oee3mu+8iEVudmVsb3Bl77yJDQrpu5Hnt5rvvJrlr6bpmpvop4Dlr5/lgLzvvJvngbDluLbvvJo5NSUg5L+h6LO05Y2A6ZaT77yb57SF57ea77ya55CG6KuW5YC844CCDQoNCuWvpumam+ingOWvn+WAvOWkp+mDqOWIhumDveiQveWcqOS/oeiztOWNgOmWk+S4iuaWue+8jOWwpOWFtuWcqOi3nemboiA1MDDigJMzNTAwIOWFrOWwuuevhOWcjeWFp+WBj+mrmOOAgg0KDQrntZDoq5bvvJrlnKjmraTot53pm6Lnr4TlnI3lhafvvIzlgaXlurfppJDnm5LlupfoiIfpgJ/po5/lupflrZjlnKjmr5TpmqjmqZ/liIbluIPmm7TlvLfnmoTnqbrplpPkvp3pmYTnj77osaHvvIzku6PooajlhanogIXlgr7lkJHpgbjlnYDmlrznm7jov5HljYDln5/jgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyDmjIfmtL4gZ3JpZCDngrogZ3JpZF9zZg0KZ3JpZCA8LSBncmlkX3NmDQoNCmdyaWRfc2YgPC0gc3Rfam9pbihncmlkX3NmLCBzY2hvb2xfYnVmZmVyWyJoZWFsdGh5X2NvdW50Il0pDQoNCiMg5YWI5bu656uL5piv5ZCm6YSw6L+R5a245qCh55qE5YiG6aGe5qyE5L2NDQpncmlkX3NmJG5lYXJfc2Nob29sIDwtIGlmZWxzZShncmlkX3NmJHNjaG9vbF9jb3VudCA+IDAsICLmoKHlnJLlkajpgooiLCAi6Z2e5qCh5ZyS5Y2AIikNCg0KIyB0IOaqouWumu+8mumAn+mjnw0KdF9mYXN0Zm9vZCA8LSB0LnRlc3QoZmFzdGZvb2RfY291bnQgfiBuZWFyX3NjaG9vbCwgZGF0YSA9IGdyaWRfc2YpDQoNCiMgdCDmqqLlrprvvJrlgaXlurfppJDnm5INCnRfaGVhbHRoeSA8LSB0LnRlc3QoaGVhbHRoeV9jb3VudCB+IG5lYXJfc2Nob29sLCBkYXRhID0gZ3JpZF9zZikNCg0KcHJpbnQodF9mYXN0Zm9vZCkNCnByaW50KHRfaGVhbHRoeSkNCmBgYA0KIyMjIOagoeWckuWRqOmCiuiIh+mdnuagoeWckuWNgOS5i+mAn+mjn+iIh+WBpeW6t+mkkOebkuepuumWk+WIhuW4g+avlOi8g+WIhuaekA0K54K65o6i6KiO5qCh5ZyS5ZGo6YKK6IiH6Z2e5qCh5ZyS5Y2A5Zyo5YGl5bq36aOy6aOf5L6b57Wm5LiK55qE56m66ZaT5YiG5biD5beu55Ww77yM5pys56CU56m26Yed5bCN5qC857ay5YWn55qE6YCf6aOf5bqX6IiH5YGl5bq36aSQ55uS5bqX5pW46YCy6KGM5LqG542o56uL5qij5pysIHQg5qqi5a6a77yM5qqi6KaW5LiN5ZCM5Y2A5Z+f6aGe5Z6L5LmL5bmz5Z2H5L6b57Wm5oOF5b2i77yM57WQ5p6c5aaC5LiL77yaDQoNCiMjIyMg5LiA44CB6YCf6aOf5bqX5pW46YeP5LmL5beu55Ww5YiG5p6QDQrmoLnmk5ogV2VsY2ggVHdvIFNhbXBsZSB0LXRlc3Qg57WQ5p6c77yaDQoNCnQg5YC8ID0gLTUuODYyOe+8jHAg5YC8IDwgMC4wMDHvvIhwID0gOS44NDllLTA577yJ77yM6aGv56S66YCf6aOf5bqX5pW46YeP5Zyo44CM5qCh5ZyS5ZGo6YKK44CN6IiH44CM6Z2e5qCh5ZyS5Y2A44CN5LmL6ZaT5YW35pyJ6aGv6JGX5beu55Ww44CCDQoNCuW5s+Wdh+WAvOavlOi8g++8mg0KDQrmoKHlnJLlkajpgorvvJowLjIyIOmWky/moLwNCg0K6Z2e5qCh5ZyS5Y2A77yaMC4wNiDplpMv5qC8DQoNCjk1JSDkv6Hos7TljYDplpPvvJrlt67nlbDnr4TlnI3lnKggWy0wLjIxLCAtMC4xMV3vvIzmhI/ljbMq44CM5qCh5ZyS5ZGo6YKK44CN55qE6YCf6aOf5L6b57Wm5a+G5bqm6aGv6JGX6auY5pa85YW25LuW5Y2A5Z+fKuOAgg0KDQojIyMjIOino+mHi+iIh+aOqOirlu+8mg0K5q2k57WQ5p6c6aGv56S65qCh5ZyS5ZGo6YKK5a2Y5Zyo6YCf6aOf5qWt6ICF5piO6aGv6IGa6ZuG55qE54++6LGh77yM5Y+v6IO96IiH5a2455Sf5peP576k55qE6auY6ZyA5rGC44CB5Y+v6aCQ5pyf5raI6LK76KGM54K65Y+K5Y2A5Z+f5YWn6auY5a+G5bqm5ZWG5qWt5rS75YuV5pyJ6Zec44CC5q2k56m66ZaT6ZuG5Lit5Y+v6IO95Yqg5YqH6Z2S5bCR5bm05bCN6auY54ax6YeP6aOf54mp55qE5Y+v6L+R5oCn77yM5bCN5YGl5bq36aOy6aOf5LuL5YWl5pS/562W5b2i5oiQ5oyR5oiw44CCDQoNCiMjIyMg5LqM44CB5YGl5bq36aSQ55uS5bqX5pW46YeP5LmL5beu55Ww5YiG5p6QDQrmoLnmk5ogdCDmqqLlrprntZDmnpzvvJoNCg0KdCDlgLwgPSAtMC4yNzg477yMcCDlgLwgPSAwLjc4MDXvvIjkuI3poa/okZfvvIkNCg0K5bmz5Z2H5YC85q+U6LyD77yaDQoNCuagoeWckuWRqOmCiu+8mjAuMzcg6ZaTL+agvA0KDQrpnZ7moKHlnJLljYDvvJowLjM2IOmWky/moLwNCg0KOTUlIOS/oeiztOWNgOmWk++8mlstMC4wODg1LCAwLjA2NjVd77yM5YyF5ZCrIDDvvIzooajnpLoq54Sh6aGv6JGX5beu55WwKuOAgg0KDQojIyMjIOino+mHi+iIh+aOqOirlu+8mg0K6ZuW54S25YGl5bq36aSQ55uS5bqX5Zyo5qCh5ZyS5ZGo6YKK5qC85pW456iN5aSa77yM5L2G5pW06auU6ICM6KiA5YiG5biD5Lim5pyq6aGv6JGX5YGP5ZCR5a245qCh5Y2A5Z+f77yM6aGv56S65q2k6aGe6aOy6aOf6YG45pOH5bCa5pyq5aaC6YCf6aOf5qWt6ICF6Iis5by354OI6IGa6ZuG5pa854m55a6a6ZyA5rGC5Y2A5aGK44CC5q2k57WQ5p6c5Lqm5Y+N5pig55uu5YmN44CM5YGl5bq36aOy6aOf5L6b57Wm44CN562W55Wl55qE5Y2A5L2N6YG45pOH5Y+v6IO95bCa5pyq57K+5rqW6IGa54Sm5pa85a2455Sf5Y+v5Y+K5oCn5oiW57y65LmP6KqY5Zug6ZuG6IGa5pa85a245qCh5ZGo6YKK44CCDQoNCiMjIyAxLiDmk6zop6PmsbrnmoTlgaXlurfnlJ/mtLvpnaLlkJENCg0KIyMjIyDph53lsI3oh7rljJfluILlrbjmoKHlkajpgorlgaXlurfpo5/nianlj6/lj4rmgKfkuI3lnYfnmoTllY/poYzjgILoqLHlpJrlrbjmoKHlkajlnI3nhKHlgaXlurfppJDpo7Lpgbjmk4fvvIznsKHllq7ljJbnmoTppJDpo7LnkrDlooPlrrPlrrnpgKDmiJDlrbjnlJ/plbfmnJ/ooZ3li5XlkIPpgJ/po5/miJbnhKHms5XlkIPliLDnh5/ppIrlubPooaHpo5/nianvvIzmnInmkI3lgaXlurfjgIINCg0KIyMjIDIuIOS9v+eUqOizh+aWmQ0KDQojIyMjIOWtuOagoeS9jee9ruizh+aWmSAoU0NIT09MLnNocCkNCg0KIyMjIyDlgaXlurfppJDlu7Pos4fmlpkgKGhlYWx0aHlfcmVzdGF1cmFudHMuZ2VvanNvbikNCg0KIyMjIyDooYzmlL/ljYDnlYznt5ogKFRhaXBlaV9WaWxsLnNocCkNCg0KIyMjIDMuIOWIhuaekOaWueazle+8iOmBi+eUqOWcsOeQhuizh+ioiuezu+e1seiIh+epuumWk+WIhuaekOetieebuOmXnOaKgOihk++8iQ0KDQojIyMjIOepuumWk+e1seioiOWIhuaekO+8muS9v+eUqCBSaXBsZXkncyBLIOiIhyBDcm9zcy1MIGZ1bmN0aW9uIOWIhuaekOmAn+mjn+iIh+WBpeW6t+mkkOebkuW6l+eahOiBmumbhuaDheW9ouWPiuWFtuS6kuWLleepuumWk+mXnOS/guOAgg0KDQojIyMjIEJpdmFyaWF0ZSBGIOWHveaVuO+8muaqoumpl+mAn+mjn+iIh+WBpeW6t+mkkOebkuW6l+aYr+WQpuacieWFseWQjOmbhuS4reWcqOeJueWumuWNgOWfn++8iOWmguWtuOagoemZhOi/ke+8ieOAgg0KDQojIyMjIOepuumWk+eGseWNgOiIh+mhr+iRl+aAp+aqouWumu+8muaHieeUqCBHbG9iYWwgTW9yYW7igJlzIEkg6IiHIExvY2FsIEdldGlzLU9yZCBHaSog54ax6bue5YiG5p6Q77yM5YG15ris56m66ZaT6Ieq55u46Zec6IiH6IGa6ZuG6Lao5Yui44CCDQoNCiMjIyMg56m66ZaT55u45L6d5qC857ay5bu656uL77ya5LulIDUwMG0gw5cgNTAwbSDmoLzntrLngrrliIbmnpDllq7lhYPvvIzntbHoqIjlkITmoLzlrZDkuK3pgJ/po5/oiIflgaXlurfppJDnm5LlupfmlbjvvIzkuKbmqJnnpLrmmK/lkKblsazmlrzlrbjmoKEgNTAwIOWFrOWwuue3qeihneWNgOOAgg0KDQojIyMjIOWxrOaAp+e1seioiOWIhuaekO+8muWIqeeUqCB0IOaqouWumuavlOi8g+WtuOagoeWRqOmCiuiIh+mdnuWtuOagoeWNgOWfn+eahOW6l+WutuaVuOmHj+W3rueVsO+8jOS7peaqouWumuWNgOS9jeaViOaHieaYr+WQpumhr+iRl+OAgg0KDQojIyMgNC4g5YiG5p6Q5p625qeL6IiH5rWB56iLDQoNCiMjIyMg5pW06auU5YiG5p6Q5rWB56iL5aaC5LiL77yaDQoNCuizh+aWmeaVtOWQiOiIh+WJjeiZleeQhg0KDQrmlLbpm4boh7rljJfluILpgJ/po5/lupfjgIHlgaXlurfppJDnm5LlupfoiIflrbjmoKHkvY3nva7os4fmlpnvvIjpu57os4fmlpnvvInvvJsNCg0K5Yyv5YWl6Ie65YyX5biC6KGM5pS/5Y2A6YKK55WM6IiH5bu656uLIDUwMG0g5YiG5Ymy5qC857ay77ybDQoNCuW7uueri+WtuOagoSA1MDAg5YWs5bC657ep6KGd5Y2A77yIc2Nob29sIGJ1ZmZlcu+8ieS7peWKg+WIhuOAjOagoeWckuWRqOmCiuOAjeiIh+OAjOmdnuagoeWckuWNgOOAjeOAgg0KDQrnqbrplpPntbHoqIjoiIflj6/oppbljJYNCg0K6KiI566X5q+P5qC855qE6YCf6aOf5bqX6IiH5YGl5bq36aSQ55uS5bqX5pW46YeP77ybDQoNCumAsuihjOeGsem7nuWIhuaekO+8iEdpKu+8ieiIh+epuumWk+iBmumbhuaqouWumu+8iEsvTCDlh73mlbjvvInvvJsNCg0K57mq6KO956m66ZaT5YiG5biD5ZyW77yM5YyF5ZCr6KGM5pS/5Y2A55WM57ea6IiH57ep6KGd5Y2A77yM5Y2A5YiG5LiN5ZCM5bqX5a625a+G5bqm5Y2A5aGK44CCDQoNCue1seioiOaqouWumuiIh+mhnuWIpeWKg+WIhg0KDQrlsIfmoLzntrLkvp3mk5rpgJ/po5/oiIflgaXlurflupflrrbmlbjph4/pgLLooYzpoZ7liKXlioPliIbvvIjpm5npq5jjgIHpm5nkvY7jgIHpq5jkvY7jgIHkvY7pq5jvvInvvJsNCg0K6YCy6KGMIHQg5qqi5a6a5q+U6LyD5qCh5ZyS5ZGo6YKK6IiH6Z2e5qCh5ZyS5Y2A5LmL6ZaT5bqX5a625pW45piv5ZCm5a2Y5Zyo6aGv6JGX5beu55Ww44CCDQoNCiMjIyA1LiDliIbmnpDntZDmnpzoiIfop6PoroANCiMjIyMg56m66ZaT6IGa6ZuG54m55oCn77ya6YCf6aOf6IiH5YGl5bq36aSQ55uS5bqX5Z2H5pyJ6aGv6JGX55qE56m66ZaT6IGa6ZuG54m55oCn77yM5bCk5YW25Zyo5biC5Lit5b+D6IiH5a245qCh5a+G6ZuG5Y2A44CCDQoNCiMjIyMg6ZuZ6YeN54ax5Y2A54++6LGh77ya5a245qCh5ZGo6YKK5LiN5YOF54K66YCf6aOf5bqX55qE54ax5Y2A77yM5Lmf5pyJ6LyD6auY55qE5YGl5bq36aSQ55uS5bqX5pW477yM5b2i5oiQ6ZuZ54ax6bue55qE56m66ZaT57WQ5qeL44CCDQoNCiMjIyMg5bGs5oCn5beu55Ww5qqi5a6a57WQ5p6c77yaDQoNCumAn+mjn+W6l++8muagoeWckuWRqOmCiuagvOWtkOW5s+Wdh+mAn+mjn+W6l+aVuOmhr+iRl+mrmOaWvOmdnuagoeWckuWNgO+8iHAgPCAwLjAwMe+8ieOAgg0KDQrlgaXlurfppJDnm5LlupfvvJrpm5bmoKHlnJLlkajpgornmoTlgaXlurfppJDnm5LlupfnlaXlpJrvvIzkvYblt67nlbDkuI3poa/okZfvvIhwID0gMC43OO+8ieOAgg0KDQojIyMjIOmhnuWIpeWIhuaekO+8mg0KDQrku6Xmr4/moLzlhanplpPku6XkuIrlupflrrblrprnvqnjgIzpq5jjgI3vvIznmbznj77jgIzpm5npq5jjgI3ljYDloYrpm4bkuK3mlrzllYblnIjoiIflrbjmoKHljK/ogZrljYDvvJsNCg0K44CM5YGl5bq36auY44CB6YCf6aOf5L2O44CN55qE5qC85a2Q56iA5bCR77yM6aGv56S65YGl5bq36YG46aCF5bi46IiH6YCf6aOf5Lim5a2Y77yM6ICM6Z2e5Zau542o5Ye654++44CCDQoNCiMjIyA2LiDliIbmnpDntZDmnpzovYnora/ngrroqIjnlavmk6zlrprnmoToqqrmmI4NCg0KIyMjIyDnrZbnlaXlu7rorbDkuIDvvJrlvLfljJblrbjmoKHlkajpgorlgaXlurfppJDkvpvmh4kNCg0K6ZuW5qCh5ZyS5ZGo6YKK5bey5pyJ6LyD5aSa5YGl5bq36aSQ55uS5bqX77yM5L2G5pyq6aGv6JGX6auY5pa85YW25LuW5Y2A5Z+f77yM5oeJ6YCy5LiA5q2l6YCP6YGO5pS/562W6KOc5Yqp5oiW56ef6YeR5rib5YWN6byT5Yu15YGl5bq36YG46aCF6Kit6bue44CCDQoNCiMjIyMg562W55Wl5bu66K2w5LqM77ya5qCh5ZyS5ZGo6YKK6aOy6aOf55Kw5aKD57i96auU6KaP5YqDDQoNCuWPr+S+neaTmuOAjOmbmemrmOOAjeiIh+OAjOmAn+mjn+mrmOWBpeW6t+S9juOAjeWNgOWhiumAsuihjOmjsumjn+eSsOWig+ipleS8sO+8jOmAsuS4gOatpeWwjuWFpeWBpeW6t+mjsumjn+aVmeiCsuiIh+WIhue0mueuoeeQhuWItuW6puOAgg0KDQojIyMjIOetlueVpeW7uuitsOS4ie+8muekvuWNgOiIh+WVhuWciOWQiOS9nOaooeW8j+aOqOWxlQ0KDQrlloTnlKjlrbjmoKHlkajpgorml6LmnInnmoTllYbmpa3ogZrpm4blipvpgZPvvIzlvJXlsI7lnKjlnLDlsI/llYblrrbntI3lhaXlgaXlurfppJDkvpvmh4npj4jmop3vvIzlu7rmp4vjgIzmoKHlnJLvvI3llYblnIjvvI3lgaXlurfppJDjgI3kuInop5LkupLli5XmqZ/liLbjgIINCg0KIyMjIyDnrZbnlaXlu7rorbDlm5vvvJpHSVMg5oeJ55So5pa85pS/562W55uj5risDQoNCuW7uuitsOaMgee6jOmAj+mBjiBHSVMg5bu656uL44CM5qCh5ZyS5ZGo6YKK5YGl5bq355Kw5aKD55uj5ris5bmz5Y+w44CN77yM5a6a5pyf6KmV5Lyw5bqX5a625pW46K6K5YuV6IiH54ax6bue6L2J56e777yM5Lul5Yip5pyq5L6G5YWs5YWx5YGl5bq35pS/562W5Yi25a6a6IiH5oiQ5pWI6L+96Lmk44CCDQo=