. TÓM TẮT TÀI LIỆU
Tóm tắt tài liệu: Các mô hình hồi quy tuyến tính tổng quát với
các ví dụ trong R
Ngày: 26 tháng 10 năm 2023
Nguồn: Các trích đoạn từ “2019_Generalized Linear Models With
Examples in R_9781441901170.pdf”
Mục tiêu:
Tài liệu này tóm tắt các chủ đề chính và các ý tưởng quan trọng được
trình bày trong các chương đầu tiên và các phần được trích dẫn của cuốn
sách “Generalized Linear Models With Examples in R”, tập trung vào các
khái niệm về mô hình thống kê, hồi quy tuyến tính và các mô hình tuyến
tính tổng quát, cũng như các phương pháp chẩn đoán và ước lượng liên
quan.
Các chủ đề chính và ý tưởng quan trọng:
Mô hình Thống kê
(Chương 1):
Giới thiệu: Chương này giới thiệu khái niệm cơ bản
về mô hình thống kê như một cách để mô tả cả các đặc điểm ngẫu nhiên và
có hệ thống của dữ liệu. Nó nhấn mạnh tầm quan trọng của việc sử dụng
các mô hình để phân tích dữ liệu (“Data analysis: The need for models?”
- Reese, 1986).
Mục đích của mô hình thống kê: Mục đích của một mô
hình ảnh hưởng đến cách nó được phát triển (Mục 1.9). Các mục đích có
thể bao gồm mô tả, dự đoán và hiểu mối quan hệ giữa các biến.
“Tất cả các mô hình đều sai, nhưng một số hữu ích”:
Một ý tưởng quan trọng được trích dẫn từ một nguồn khác (không được cung
cấp đầy đủ trong trích đoạn) là các mô hình là sự đơn giản hóa thực tế
và do đó không bao giờ hoàn toàn chính xác, nhưng chúng có thể là công
cụ có giá trị để hiểu dữ liệu (Mục 1.8).
Độ chính xác so với sự đơn giản: Có sự đánh đổi giữa
độ chính xác của một mô hình (khả năng phù hợp chặt chẽ với dữ liệu) và
sự đơn giản của nó (số lượng tham số). Việc lựa chọn mô hình thường liên
quan đến việc cân bằng hai yếu tố này (Mục 1.10).
Thực nghiệm so với nghiên cứu quan sát: Cuốn sách
phân biệt giữa thực nghiệm (nơi có thể suy luận nguyên nhân - kết quả)
và nghiên cứu quan sát (nơi chỉ có thể thiết lập mối liên hệ) (Mục
1.11).
Thu thập dữ liệu và khả năng khái quát hóa: Chất
lượng và phương pháp thu thập dữ liệu ảnh hưởng đến khả năng khái quát
hóa các kết quả từ mô hình (Mục 1.12).
Sử dụng R để mô hình hóa thống kê: Cuốn sách sử dụng ngôn ngữ và môi
trường R (R Development Core Team, 2017) để minh họa các kỹ thuật mô
hình hóa (Mục 1.13).
Mô hình hồi quy tuyến
tính (Chương 2):
Định nghĩa: Chương này định nghĩa các mô hình hồi
quy tuyến tính (Mục 2.2).
Hồi quy tuyến tính đơn giản và bội: Bao gồm cả hồi
quy tuyến tính đơn giản (một biến giải thích) và hồi quy bội (nhiều biến
giải thích) (Mục 2.3, 2.4).
Ước lượng bình phương nhỏ nhất: Phương pháp ước
lượng chính cho các hệ số trong hồi quy tuyến tính là ước lượng bình
phương nhỏ nhất (Least-Squares Estimation) (Mục 2.3.1,
2.4.1).
Công thức ma trận: Các khái niệm hồi quy tuyến tính
được trình bày bằng công thức ma trận, bao gồm ước lượng hệ số và ước
lượng phương sai (Mục 2.5):
Ký hiệu ma trận: “Matrix Notation” (Mục
2.5.1)
Ước lượng hệ số: “Coefficient Estimates” (Mục
2.5.2)
Ước lượng phương sai σ²: “Estimating the Variance
σ²” (Mục 2.5.3)
Ước lượng phương sai của β̂: “Estimating the Variance
of β̂” (Mục 2.5.4)
Suy luận cho các mô hình hồi quy tuyến tính: Thảo
luận về kiểm định t-test và khoảng tin cậy cho các hệ số hồi quy và giá
trị phù hợp (Mục 2.8).
Phân tích phương sai cho các mô hình hồi quy: Sử
dụng ANOVA để so sánh các mô hình lồng nhau (Mục 2.9,
2.10).
Lựa chọn mô hình: Các tiêu chí như AIC và BIC được
giới thiệu để lựa chọn giữa các mô hình không lồng nhau (Mục
2.11). Các phương pháp tự động để lựa chọn mô hình cũng được thảo
luận, cùng với các phản đối việc sử dụng các thủ tục từng bước (Mục
2.12).
Sử dụng R: Cách sử dụng R để phù hợp với các mô hình
hồi quy tuyến tính được cung cấp (Mục 2.14).
Mô hình hồi quy tuyến
tính: Chẩn đoán và xây dựng mô hình (Chương 3):
Các giả định: Chương này tập trung vào các giả định của mô
hình hồi quy tuyến tính từ góc độ thực tế, bao gồm linear predictor,
phương sai không đổi, tính độc lập và tính chuẩn (Mục 3.2).
Phần dư và Leverages: Giới thiệu các loại phần dư
(residuals) và leverages (Mục 3.3, 3.4).
Biểu đồ phần dư: Biểu đồ phần dư là công cụ quan
trọng để kiểm tra các giả định mô hình (Mục 3.5):
Biểu đồ phần dư chống lại xj: Kiểm tra tính tuyến
tính (“Plot Residuals Against xj : Linearity”) (Mục 3.5.1).
Biểu đồ phần dư một phần: “Partial Residual Plots”
(Mục 3.5.2).
Một ví dụ được cung cấp với mã R và kết quả (Fig. 3.3).
Biểu đồ phần dư chống lại μ̂: Kiểm tra phương sai
không đổi (“Plot Residuals Against μ̂: Constant Variance”) (Mục
3.5.3).
Các ví dụ về biểu đồ lý tưởng và các vấn đề như phi tuyến tính và
phương sai không đổi được minh họa (“Some example plots of the
standardized residuals r′ plotted against the fitted values μ̂. The
effects are exaggerated from what is usually seen in practice”) (Fig.
3.4).
Biểu đồ Q–Q: Kiểm tra tính chuẩn (“Q–Q Plots and
Normality”) (Mục 3.5.4).
Biểu đồ Lag: Kiểm tra sự phụ thuộc theo thời gian
(“Lag Plots and Dependence over Time”) (Mục 3.5.5). Các ví dụ
về biểu đồ phần dư độc lập và tương quan âm được hiển thị (Fig.
3.5).
Các điểm ngoại lai và các quan sát có ảnh hưởng: Xác
định các quan sát có vấn đề bằng cách sử dụng phần dư studentized và các
chỉ số ảnh hưởng như Cook’s distance (Mục 3.6).
Khắc phục sự cố: Các phương pháp để giải quyết các
vấn đề đã xác định, bao gồm biến đổi biến phản hồi và biến giải thích
(Mục 3.8, 3.9, 3.10). Biểu đồ phần dư được sử dụng để minh họa
hiệu quả của việc biến đổi (Fig. 3.6).
Đa cộng tuyến: Thảo luận về vấn đề đa cộng tuyến
(collinearity) (Mục 3.14).
Nghiên cứu điển hình: Các ví dụ thực tế được trình
bày để minh họa các khái niệm chẩn đoán (Mục 3.15).
Ý tưởng ước lượng khả
năng xảy ra cực đại (Chương 4):
Khái quát hóa mô hình tuyến tính chuẩn: Chương này
bắt đầu bằng cách khái quát hóa mô hình tuyến tính chuẩn (Mục
4.3).
Ước lượng khả năng xảy ra cực đại (Maximum Likelihood
Estimation - MLE): Giới thiệu nguyên tắc của ước lượng khả năng
xảy ra cực đại (Mục 4.4).
MLE cho một và nhiều tham số: Trình bày cách tính
MLE cho trường hợp một tham số và nhiều tham số (Mục 4.5,
4.6).
Công thức ma trận cho MLE: MLE được trình bày bằng
công thức ma trận, bao gồm phương trình Score, thông tin (quan sát và kỳ
vọng) và sai số chuẩn của các tham số (Mục 4.7):
Ký hiệu: “Notation” (Mục 4.7.1)
Phương trình Score: “Score Equations” (Mục
4.7.2)
Thông tin: Quan sát và Kỳ vọng: “Information:
Observed and Expected” (Mục 4.7.3)
Sai số chuẩn của các tham số: “Standard Errors of
Parameters” (Mục 4.7.4)
Thuật toán Fisher Scoring: Phương pháp lặp để tính
toán MLEs (Mục 4.8).
Các thuộc tính của MLEs: Thảo luận về các thuộc tính
mong muốn của MLEs (Mục 4.9).
Kiểm định giả thuyết: Sử dụng các kết quả tiệm cận
mẫu lớn cho kiểm định giả thuyết, bao gồm Wald tests, Likelihood Ratio
Tests và Score Tests (Mục 4.10).
Sử dụng R: Cung cấp mã R để phù hợp với các mô hình
(Mục 4.14).
Các mô hình tuyến
tính tổng quát (GLMs): Cấu trúc (Chương 5):
Giới thiệu GLMs: Chương này giới thiệu các mô hình
tuyến tính tổng quát (Generalized Linear Models) như một khung linh hoạt
mở rộng mô hình hồi quy tuyến tính chuẩn (Mục 5.1).
Hai thành phần: GLMs bao gồm hai thành phần chính:
thành phần ngẫu nhiên (phân phối xác suất của biến phản hồi) và thành
phần có hệ thống (hàm tuyến tính của các biến giải thích) (Mục
5.2).
Thành phần ngẫu nhiên: Mô hình phân tán hàm mũ
(Exponential Dispersion Models - EDMs) được sử dụng để mô tả thành phần
ngẫu nhiên (Mục 5.3). Các ví dụ về EDMs và định nghĩa toán học
được cung cấp.
Hàm phương sai: Khái niệm hàm phương sai được giới
thiệu (Mục 5.3.6).
Dạng mô hình phân tán: EDMs có thể được biểu diễn
dưới dạng mô hình phân tán, bao gồm deviance đơn vị (unit deviance)
(Mục 5.4).
Thành phần có hệ thống: Bao gồm hàm liên kết (link
function) kết nối giá trị trung bình của biến phản hồi với thành phần có
hệ thống (Mục 5.5.1) và offsets (Mục 5.5.2).
Định nghĩa GLMs: Một định nghĩa chính thức về GLMs
được trình bày (Mục 5.6).
Total Deviance: Khái niệm total deviance được giải
thích (Mục 5.7).
Quan hệ với hồi quy tuyến tính: Thảo luận về cách
biến đổi hồi quy ước tính GLMs (Mục 5.8).
Các mô hình tuyến
tính tổng quát: Ước lượng (Chương 6):
Tính toán khả năng xảy ra: Trình bày cách tính toán
khả năng xảy ra (likelihood) cho các hệ số β trong GLMs (Mục
6.2).
Phương trình Score và Thông tin: Giới thiệu phương
trình Score và thông tin cho β (Mục 6.2.2).
Tính toán ước lượng của β: Trình bày các phương pháp
để tính toán ước lượng của β (Mục 6.3).
Residual Deviance: Khái niệm residual deviance được
giải thích (Mục 6.4).
Sai số chuẩn cho β̂: Cách ước tính sai số chuẩn cho
các ước lượng hệ số (Mục 6.5).
Ước lượng β: Công thức ma trận: Công thức ma trận
cho ước lượng β trong GLMs (Mục 6.6).
Ước lượng GLMs giống hồi quy tuyến tính cục bộ: Ý
tưởng rằng việc ước lượng GLMs cục bộ giống như hồi quy tuyến tính
(Mục 6.7).
Ước lượng φ: Các phương pháp khác nhau để ước lượng
tham số phân tán φ, bao gồm MLE, Modified Profile Log-Likelihood
Estimator, Mean Deviance Estimator và Pearson Estimator (Mục
6.8).
Sử dụng R: Cách sử dụng R để phù hợp với GLMs
(Mục 6.9).
Các mô hình tuyến
tính tổng quát: Suy luận (Chương 7):
Suy luận cho các hệ số khi φ đã biết: Trình bày cách
thực hiện suy luận (kiểm định giả thuyết và khoảng tin cậy) cho các hệ
số khi tham số phân tán φ đã biết (Mục 7.2). Bao gồm Wald
Tests, khoảng tin cậy cho hệ số và giá trị trung bình, Likelihood Ratio
Tests và Analysis of Deviance Tables.
Kiểm định Wald, Score và Likelihood Ratio: So sánh
ba loại kiểm định giả thuyết này (Mục 7.7).
Lựa chọn giữa các GLMs không lồng nhau: Sử dụng AIC
và BIC để lựa chọn mô hình (Mục 7.8).
Phương pháp tự động cho lựa chọn mô hình: (Mục
7.9).
Sử dụng R: Cách sử dụng R để thực hiện các kiểm định
(Mục 7.10).
Các mô hình tuyến
tính tổng quát: Chẩn đoán (Chương 8):
Các giả định của GLMs: Thảo luận về các giả định của
GLMs (Mục 8.2).
Các loại phần dư cho GLMs: Giới thiệu các loại phần
dư khác nhau phù hợp với GLMs, bao gồm Response Residuals (không đủ),
Pearson Residuals, Deviance Residuals và Quantile Residuals (Mục
8.3).
Leverages trong GLMs: Khái niệm leverages và hat
matrix trong bối cảnh GLMs (Mục 8.4).
Leverage Standardized Residuals: Giới thiệu leverage
standardized residuals (Mục 8.5).
Khi nào sử dụng loại phần dư nào: Hướng dẫn về việc
lựa chọn loại phần dư phù hợp (Mục 8.6).
Kiểm tra các giả định mô hình: Sử dụng các biểu đồ
phần dư để kiểm tra các giả định về tính độc lập, thành phần có hệ thống
và thành phần ngẫu nhiên (Mục 8.7). Các biểu đồ điển hình được
minh họa, chẳng hạn như biểu đồ phần dư chống lại các giá trị phù hợp
(Fig. 8.5, top panels).
Các điểm ngoại lai và các quan sát có ảnh hưởng: Xác
định các quan sát có vấn đề trong GLMs (Mục 8.8).
Khắc phục sự cố: Các phương pháp để giải quyết các
vấn đề đã xác định, tương tự như trong hồi quy tuyến tính, nhưng được
điều chỉnh cho GLMs. Các biểu đồ được sử dụng để minh họa sự cải thiện
sau khi áp dụng các biện pháp khắc phục (Fig. 8.9).
Quasi-Likelihood và Extended Quasi-Likelihood: Giới
thiệu các khái niệm này để xử lý trường hợp phương sai không được xác
định hoàn toàn bởi giá trị trung bình (Mục 8.10).
Đa cộng tuyến: Thảo luận về đa cộng tuyến trong GLMs
(Mục 8.11).
Nghiên cứu điển hình: Các ví dụ thực tế minh họa
việc chẩn đoán GLMs (Mục 8.12).
Sử dụng R: Cách sử dụng R để phân tích chẩn đoán của
GLMs (Mục 8.13).
Mô hình cho tỷ lệ:
Binomial GLMs (Chương 9):
Mô hình hóa tỷ lệ: Ứng dụng GLMs cho dữ liệu tỷ lệ,
nơi biến phản hồi là số lần thành công trong một số lần thử cố định
(Mục 9.2). Phân phối Binomial là thành phần ngẫu nhiên điển
hình.
Hàm liên kết: Thảo luận về các hàm liên kết khác
nhau phù hợp với Binomial GLMs, chẳng hạn như probit link (Mục
9.4), logit link (Mục 9.5) và complementary log-log link
(Mục 9.7).
Tỷ lệ Odds và Logit Link: Giải thích khái niệm tỷ lệ
odds và mối quan hệ của nó với logit link (Mục 9.5).
Overdispersion: Xử lý vấn đề overdispersion (khi
phương sai lớn hơn giả định của phân phối Binomial) (Mục
9.8).
Khi Wald Tests thất bại: Thảo luận về các hạn chế
của Wald Tests trong một số trường hợp (Mục 9.9).
Goodness-of-Fit cho binary responses: Lưu ý rằng
goodness-of-fit cho binary responses (dữ liệu nhị phân) không có sẵn
(Mục 9.10).
Sử dụng R: Cách sử dụng R để phù hợp với Binomial
GLMs (Mục 9.12).
Mô hình cho số
lượng: Poisson và Negative Binomial GLMs (Chương 10):
Poisson GLMs: Tóm tắt các đặc điểm của Poisson GLMs,
phù hợp với dữ liệu đếm (count data) (Mục 10.2). Phân phối
Poisson là thành phần ngẫu nhiên.
Mô hình hóa tỷ lệ (Rates): Sử dụng GLMs để mô hình
hóa tỷ lệ (ví dụ: số sự kiện trên một đơn vị thời gian hoặc diện tích)
bằng cách sử dụng offsets (Mục 10.3).
Bảng tương tác: Log-Linear Models: Áp dụng Poisson
GLMs cho bảng tương tác để phân tích dữ liệu phân loại bằng cách sử dụng
log-linear models (Mục 10.4). Bao gồm các bảng hai chiều và ba
chiều.
Nghịch lý Simpson: Minh họa nghịch lý Simpson trong
bối cảnh bảng tương tác (Mục 10.4.5).
Sự tương đương giữa Binomial và Poisson GLMs: Thảo
luận về sự tương đương giữa hai loại mô hình này trong một số trường hợp
(Mục 10.4.6).
Negative Binomial GLMs: Giới thiệu Negative Binomial
GLMs như một cách để xử lý overdispersion trong dữ liệu đếm (Mục
10.5).
Nghiên cứu điển hình: Ví dụ về mô hình hóa số lượng
vệ tinh trên cua móng ngựa cái, sử dụng các biến giải thích như trọng
lượng, màu sắc, chiều rộng và tình trạng gai (Fig. 10.6). Các biểu đồ
chẩn đoán, bao gồm deviance residuals chống lại căn bậc hai của giá trị
phù hợp và Cook’s distance, được hiển thị (Fig. 10.7). So sánh các mô
hình Quasi-poisson và Negative binomial được minh họa (Fig. 10.8).
Sử dụng R: Cách sử dụng R để phù hợp với Poisson và
Negative Binomial GLMs (Mục 10.7).
Dữ liệu liên tục
dương: Gamma và Inverse Gaussian GLMs (Chương 11):
Mô hình hóa dữ liệu liên tục dương: Giới thiệu các
GLMs phù hợp cho dữ liệu liên tục chỉ nhận các giá trị dương (Mục
11.2).
Phân phối Gamma: Thảo luận về phân phối Gamma như
một thành phần ngẫu nhiên phù hợp cho loại dữ liệu này (Mục
11.3).
Phân phối Inverse Gaussian: Thảo luận về phân phối
Inverse Gaussian (Mục 11.4).
Hàm liên kết: Các hàm liên kết phù hợp cho Gamma và
Inverse Gaussian GLMs (Mục 11.5). Các biểu đồ phần dư (quantile
residuals) được sử dụng để đánh giá sự phù hợp của mô hình log-link
(Fig. 11.7).
Ước lượng tham số phân tán: Cách ước lượng tham số
phân tán φ cho phân phối Gamma và Inverse Gaussian (Mục
11.6).
Nghiên cứu điển hình: Các ví dụ thực tế về việc áp
dụng các mô hình này (Mục 11.7).
Sử dụng R: Cách sử dụng R để phù hợp với Gamma và
Inverse Gaussian GLMs (Mục 11.8).
Tweedie GLMs (Chương
12):
Tweedie EDMs: Giới thiệu các phân phối Tweedie, một
lớp con của EDMs, phù hợp cho dữ liệu liên tục dương và dữ liệu với các
giá trị không chính xác (Mục 12.2).
Cấu trúc Tweedie EDMs: Mô tả cấu trúc của Tweedie
EDMs (Mục 12.2.2).
Dữ liệu liên tục dương và dữ liệu có giá trị không chính
xác: Thảo luận về ứng dụng của Tweedie EDMs cho các loại dữ
liệu này (Mục 12.2.3, 12.2.4).
Tweedie GLMs: Định nghĩa và cách ước lượng Tweedie
GLMs (Mục 12.3). Bao gồm ước lượng tham số index ξ (Mục
12.3.2) và cách phù hợp với mô hình (Mục 12.3.3).
Nghiên cứu điển hình: Các ví dụ thực tế về việc áp
dụng Tweedie GLMs (Mục 12.4).
Sử dụng R: Cách sử dụng R để phù hợp với Tweedie
GLMs (Mục 12.5).
Các khía cạnh quan trọng khác:
Sử dụng R: Cuốn sách tích hợp chặt chẽ việc sử dụng R để minh họa
và thực hiện các kỹ thuật mô hình hóa. Có một phần phụ lục dành riêng
cho việc sử dụng R cho phân tích dữ liệu (Appendix A).
Các vấn đề và Tài liệu tham khảo: Mỗi chương đều có các vấn đề bài
tập và tài liệu tham khảo liên quan.
Dữ liệu: Cuốn sách sử dụng gói GLMsData trong R, chứa các bộ dữ liệu
được sử dụng trong các ví dụ (Appendix B).
=> Tóm lại, tài liệu này cung cấp một cái nhìn tổng quan chi tiết
về các mô hình hồi quy tuyến tính và mô hình tuyến tính tổng quát, tập
trung vào các khía cạnh lý thuyết, phương pháp ước lượng (đặc biệt là
bình phương nhỏ nhất và khả năng xảy ra cực đại), suy luận thống kê và
chẩn đoán mô hình. Việc sử dụng R được tích hợp xuyên suốt để hỗ trợ
việc học và áp dụng các kỹ thuật này.
Xin lưu ý rằng bản tóm tắt này dựa trên mục lục và các
đoạn trích được cung cấp. Để có hiểu biết đầy đủ, cần đọc toàn bộ cuốn
sách.
. THỐNG KÊ MÔ TẢ CÁC
BIẾN
Giải thích các biến
variable_explain <- data.frame(
Ten_Bien = c("Unnamed: 0", "PurchaseDate", "CustomerID", "Gender", "MaritalStatus",
"Homeowner", "Children", "AnnualIncome", "City", "StateorProvince",
"Country", "ProductFamily", "ProductDepartment", "ProductCategory",
"UnitsSold", "Revenue"),
Y_Nghia = c("Chỉ số dòng (tự sinh, có thể bỏ qua)",
"Ngày mua hàng",
"Mã khách hàng",
"Giới tính của khách hàng (M = Nam, F = Nữ)",
"Tình trạng hôn nhân (S = Độc thân, M = Đã kết hôn)",
"Có sở hữu nhà không (Y = Có, N = Không)",
"Số lượng con của khách hàng",
"Mức thu nhập hàng năm (ví dụ: $30K - $50K)",
"Thành phố nơi khách hàng sống",
"Bang hoặc tỉnh",
"Quốc gia (trong file là USA)",
"Nhóm sản phẩm chính (ví dụ: Food, Drink)",
"Phòng ban sản phẩm (ví dụ: Snack Foods, Produce)",
"Danh mục chi tiết sản phẩm (ví dụ: Candy, Vegetables)",
"Số lượng sản phẩm đã bán",
"Doanh thu từ đơn hàng (USD)")
)
library(knitr)
## Warning: package 'knitr' was built under R version 4.3.3
kable(variable_explain, caption = " Giải thích các biến trong file dữ liệu")
Giải thích các biến trong file dữ liệu
Unnamed: 0 |
Chỉ số dòng (tự sinh, có thể bỏ qua) |
PurchaseDate |
Ngày mua hàng |
CustomerID |
Mã khách hàng |
Gender |
Giới tính của khách hàng (M = Nam, F = Nữ) |
MaritalStatus |
Tình trạng hôn nhân (S = Độc thân, M = Đã kết hôn) |
Homeowner |
Có sở hữu nhà không (Y = Có, N = Không) |
Children |
Số lượng con của khách hàng |
AnnualIncome |
Mức thu nhập hàng năm (ví dụ: $30K - $50K) |
City |
Thành phố nơi khách hàng sống |
StateorProvince |
Bang hoặc tỉnh |
Country |
Quốc gia (trong file là USA) |
ProductFamily |
Nhóm sản phẩm chính (ví dụ: Food, Drink) |
ProductDepartment |
Phòng ban sản phẩm (ví dụ: Snack Foods, Produce) |
ProductCategory |
Danh mục chi tiết sản phẩm (ví dụ: Candy,
Vegetables) |
UnitsSold |
Số lượng sản phẩm đã bán |
Revenue |
Doanh thu từ đơn hàng (USD) |
Kết quả thống kê mô tả
## Warning: package 'DT' was built under R version 4.3.3
## Warning in instance$preRenderHook(instance): It seems your data is too big for
## client-side DataTables. You may consider server-side processing:
## https://rstudio.github.io/DT/server.html
📊 Tổng quan dữ liệu
Mục
|
Ý_nghĩa
|
Số dòng
|
14059 dòng dữ liệu (giao dịch tại siêu thị)
|
Số cột
|
16 cột biến
|
Biến dạng chuỗi (character)
|
11 biến dạng chuỗi
|
Biến dạng số (numeric)
|
5 biến dạng số
|
🔠 Biến dạng chuỗi (character)
|
Biến
|
Số_giá_trị_khác_nhau
|
Ý_nghĩa
|
PurchaseDate
|
PurchaseDate
|
742
|
Ngày khách hàng thực hiện giao dịch mua
|
Gender
|
Gender
|
2
|
2 giới tính (F, M)
|
MaritalStatus
|
MaritalStatus
|
2
|
Tình trạng hôn nhân: Độc thân (S) hoặc Đã kết hôn (M)
|
Homeowner
|
Homeowner
|
2
|
Có nhà (Y) hoặc không (N)
|
AnnualIncome
|
AnnualIncome
|
8
|
Thu nhập hộ gia đình theo khoảng ($K)
|
City
|
City
|
23
|
Thành phố nơi khách hàng sống (~23 thành phố)
|
StateorProvince
|
StateorProvince
|
10
|
Tỉnh/bang nơi cư trú (~10 bang)
|
Country
|
Country
|
3
|
Quốc gia (USA, Canada, Mexico…)
|
ProductFamily
|
ProductFamily
|
3
|
Nhóm sản phẩm chính (Food, Drink, Non-Consumables)
|
ProductDepartment
|
ProductDepartment
|
22
|
Phòng ban sản phẩm (22 loại: Snacks, Produce…)
|
ProductCategory
|
ProductCategory
|
45
|
Danh mục sản phẩm chi tiết (45 loại: Candy, Vegetables…)
|
## Warning in FUN(X[[i]], ...): NAs introduced by coercion
## Warning in FUN(X[[i]], ...): NAs introduced by coercion
## Warning in FUN(X[[i]], ...): NAs introduced by coercion
## Warning in FUN(X[[i]], ...): NAs introduced by coercion
🔢 Biến dạng số (numeric - đầy đủ, sạch sẽ)
|
Biến
|
Mean
|
SD
|
Giải_thích
|
CustomerID
|
CustomerID
|
5116.90
|
2920.76
|
Mã khách hàng duy nhất
|
Gender
|
Gender
|
NaN
|
NA
|
Giới tính đã mã hoá (F = 0, M = 1)
|
MaritalStatus
|
MaritalStatus
|
NaN
|
NA
|
Tình trạng hôn nhân đã mã hoá (S = 0, M = 1)
|
Homeowner
|
Homeowner
|
NaN
|
NA
|
Sở hữu nhà đã mã hoá (N = 0, Y = 1)
|
Children
|
Children
|
2.53
|
1.49
|
Trung bình mỗi khách có 2–3 con
|
AnnualIncome
|
AnnualIncome
|
NaN
|
NA
|
Thu nhập hộ gia đình (đã chuyển từ khoảng sang số trung bình)
|
UnitsSold
|
UnitsSold
|
4.08
|
1.17
|
Mỗi giao dịch bán ~4 đơn vị sản phẩm
|
Revenue
|
Revenue
|
13.00
|
8.22
|
Mỗi giao dịch tạo ra trung bình ~13 USD
|
Thống kê mô tả
Thực hiện tính toán các thống kê mô tả (bao gồm giá trị trung
bình, độ lệch chuẩn, giá trị nhỏ nhất, lớn nhất và các phân vị) cho các
biến định lượng trong tập dữ liệu.
Các biến cần phân tích bao gồm: CustomerID, Gender,
MaritalStatus, Homeowner, Children, AnnualIncome, UnitsSold, Revenue,
PurchaseDateDays, cùng với các biến phản ánh tần suất mua hàng.
## Warning: There were 8 warnings in `summarise()`.
## The first warning was:
## ℹ In argument: `across(...)`.
## Caused by warning in `min()`:
## ! no non-missing arguments to min; returning Inf
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 7 remaining warnings.
📊 Bảng thống kê mô tả các biến định lượng
Biến
|
Mean
|
StdDev
|
Min
|
Q1
|
Median
|
Q3
|
Max
|
CustomerID
|
5116.902127
|
2920.755202
|
3.00
|
2549.00
|
5060.00
|
7633.00
|
10280.0
|
Children
|
2.530336
|
1.491852
|
0.00
|
1.00
|
3.00
|
4.00
|
5.0
|
UnitsSold
|
4.080589
|
1.174421
|
1.00
|
3.00
|
4.00
|
5.00
|
8.0
|
Revenue
|
13.004512
|
8.215543
|
0.53
|
6.84
|
11.25
|
17.37
|
56.7
|
LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSAxIg0KYXV0aG9yOiAiTmd1eeG7hW4gRGnhu4VtIFF14buzbmgiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclSDolTTolUywgJWQgLSAlbSAtICVZJylgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6ICJkZWZhdWx0Ig0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMg0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICB3b3JkX2RvY3VtZW50OiANCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDINCiAgcGRmX2RvY3VtZW50OiANCiAgICBsYXRleF9lbmdpbmU6IHhlbGF0ZXgNCi0tLQ0KDQoNCg0KIyAuIFTDk00gVOG6rlQgVMOASSBMSeG7hlUgDQoNCipUw7NtIHThuq90IHTDoGkgbGnhu4d1OiBDw6FjIG3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCB04buVbmcgcXXDoXQgduG7m2kgY8OhYyB2w60gZOG7pSB0cm9uZyBSKg0KDQoNCipOZ8OgeTogMjYgdGjDoW5nIDEwIG7Eg20gMjAyMyoNCg0KDQoqTmd14buTbjogQ8OhYyB0csOtY2ggxJFv4bqhbiB04burICIyMDE5X0dlbmVyYWxpemVkIExpbmVhciBNb2RlbHMgV2l0aCBFeGFtcGxlcyBpbiBSXzk3ODE0NDE5MDExNzAucGRmIioNCg0KDQoqKk3hu6VjIHRpw6p1Kio6IA0KDQpUw6BpIGxp4buHdSBuw6B5IHTDs20gdOG6r3QgY8OhYyBjaOG7pyDEkeG7gSBjaMOtbmggdsOgIGPDoWMgw70gdMaw4bufbmcgcXVhbiB0cuG7jW5nIMSRxrDhu6NjIHRyw6xuaCBiw6B5IHRyb25nIGPDoWMgY2jGsMahbmcgxJHhuqd1IHRpw6puIHbDoCBjw6FjIHBo4bqnbiDEkcaw4bujYyB0csOtY2ggZOG6q24gY+G7p2EgY3Xhu5FuIHPDoWNoICJHZW5lcmFsaXplZCBMaW5lYXIgTW9kZWxzIFdpdGggRXhhbXBsZXMgaW4gUiIsIHThuq1wIHRydW5nIHbDoG8gY8OhYyBraMOhaSBuaeG7h20gduG7gSBtw7QgaMOsbmggdGjhu5FuZyBrw6osIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIHbDoCBjw6FjIG3DtCBow6xuaCB0dXnhur9uIHTDrW5oIHThu5VuZyBxdcOhdCwgY8WpbmcgbmjGsCBjw6FjIHBoxrDGoW5nIHBow6FwIGNo4bqpbiDEkW/DoW4gdsOgIMaw4bubYyBsxrDhu6NuZyBsacOqbiBxdWFuLg0KDQoNCkPDoWMgY2jhu6cgxJHhu4EgY2jDrW5oIHbDoCDDvSB0xrDhu59uZyBxdWFuIHRy4buNbmc6DQoNCiMjIE3DtCBow6xuaCBUaOG7kW5nIGvDqiAoQ2jGsMahbmcgMSk6DQoNCioqR2nhu5tpIHRoaeG7h3UqKjogQ2jGsMahbmcgbsOgeSBnaeG7m2kgdGhp4buHdSBraMOhaSBuaeG7h20gY8ahIGLhuqNuIHbhu4EgbcO0IGjDrG5oIHRo4buRbmcga8OqIG5oxrAgbeG7mXQgY8OhY2ggxJHhu4MgbcO0IHThuqMgY+G6oyBjw6FjIMSR4bq3YyDEkWnhu4NtIG5n4bqrdSBuaGnDqm4gdsOgIGPDsyBo4buHIHRo4buRbmcgY+G7p2EgZOG7ryBsaeG7h3UuIE7DsyBuaOG6pW4gbeG6oW5oIHThuqdtIHF1YW4gdHLhu41uZyBj4bunYSB2aeG7h2Mgc+G7rSBk4bulbmcgY8OhYyBtw7QgaMOsbmggxJHhu4MgcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgKCJEYXRhIGFuYWx5c2lzOiBUaGUgbmVlZCBmb3IgbW9kZWxzPyIgLSBSZWVzZSwgMTk4NikuDQoNCioqTeG7pWMgxJHDrWNoIGPhu6dhIG3DtCBow6xuaCB0aOG7kW5nIGvDqioqOiBN4bulYyDEkcOtY2ggY+G7p2EgbeG7mXQgbcO0IGjDrG5oIOG6o25oIGjGsOG7n25nIMSR4bq/biBjw6FjaCBuw7MgxJHGsOG7o2MgcGjDoXQgdHJp4buDbiAoTeG7pWMgMS45KS4gQ8OhYyBt4bulYyDEkcOtY2ggY8OzIHRo4buDIGJhbyBn4buTbSBtw7QgdOG6oywgZOG7sSDEkW/DoW4gdsOgIGhp4buDdSBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGPDoWMgYmnhur9uLg0KDQoqKiJU4bqldCBj4bqjIGPDoWMgbcO0IGjDrG5oIMSR4buBdSBzYWksIG5oxrBuZyBt4buZdCBz4buRIGjhu691IMOtY2giKio6IE3hu5l0IMO9IHTGsOG7n25nIHF1YW4gdHLhu41uZyDEkcaw4bujYyB0csOtY2ggZOG6q24gdOG7qyBt4buZdCBuZ3Xhu5NuIGtow6FjIChraMO0bmcgxJHGsOG7o2MgY3VuZyBj4bqlcCDEkeG6p3kgxJHhu6cgdHJvbmcgdHLDrWNoIMSRb+G6oW4pIGzDoCBjw6FjIG3DtCBow6xuaCBsw6Agc+G7sSDEkcahbiBnaeG6o24gaMOzYSB0aOG7sWMgdOG6vyB2w6AgZG8gxJHDsyBraMO0bmcgYmFvIGdp4budIGhvw6BuIHRvw6BuIGNow61uaCB4w6FjLCBuaMawbmcgY2jDum5nIGPDsyB0aOG7gyBsw6AgY8O0bmcgY+G7pSBjw7MgZ2nDoSB0cuG7iyDEkeG7gyBoaeG7g3UgZOG7ryBsaeG7h3UgKihN4bulYyAxLjgpKi4NCg0KKirEkOG7mSBjaMOtbmggeMOhYyBzbyB24bubaSBz4buxIMSRxqFuIGdp4bqjbioqOiBDw7Mgc+G7sSDEkcOhbmggxJHhu5VpIGdp4buvYSDEkeG7mSBjaMOtbmggeMOhYyBj4bunYSBt4buZdCBtw7QgaMOsbmggKGto4bqjIG7Eg25nIHBow7kgaOG7o3AgY2jhurd0IGNo4bq9IHbhu5tpIGThu68gbGnhu4d1KSB2w6Agc+G7sSDEkcahbiBnaeG6o24gY+G7p2EgbsOzIChz4buRIGzGsOG7o25nIHRoYW0gc+G7kSkuIFZp4buHYyBs4buxYSBjaOG7jW4gbcO0IGjDrG5oIHRoxrDhu51uZyBsacOqbiBxdWFuIMSR4bq/biB2aeG7h2MgY8OibiBi4bqxbmcgaGFpIHnhur91IHThu5EgbsOgeSAqKE3hu6VjIDEuMTApKi4NCg0KKipUaOG7sWMgbmdoaeG7h20gc28gduG7m2kgbmdoacOqbiBj4bupdSBxdWFuIHPDoXQqKjogQ3Xhu5FuIHPDoWNoIHBow6JuIGJp4buHdCBnaeG7r2EgdGjhu7FjIG5naGnhu4dtIChuxqFpIGPDsyB0aOG7gyBzdXkgbHXhuq1uIG5ndXnDqm4gbmjDom4gLSBr4bq/dCBxdeG6oykgdsOgIG5naGnDqm4gY+G7qXUgcXVhbiBzw6F0IChuxqFpIGNo4buJIGPDsyB0aOG7gyB0aGnhur90IGzhuq1wIG3hu5FpIGxpw6puIGjhu4cpICooTeG7pWMgMS4xMSkqLg0KDQoqKlRodSB0aOG6rXAgZOG7ryBsaeG7h3UgdsOgIGto4bqjIG7Eg25nIGtow6FpIHF1w6F0IGjDs2EqKjogQ2jhuqV0IGzGsOG7o25nIHbDoCBwaMawxqFuZyBwaMOhcCB0aHUgdGjhuq1wIGThu68gbGnhu4d1IOG6o25oIGjGsOG7n25nIMSR4bq/biBraOG6oyBuxINuZyBraMOhaSBxdcOhdCBow7NhIGPDoWMga+G6v3QgcXXhuqMgdOG7qyBtw7QgaMOsbmggKihN4bulYyAxLjEyKSouDQoNClPhu60gZOG7pW5nIFIgxJHhu4MgbcO0IGjDrG5oIGjDs2EgdGjhu5FuZyBrw6o6IEN14buRbiBzw6FjaCBz4butIGThu6VuZyBuZ8O0biBuZ+G7ryB2w6AgbcO0aSB0csaw4budbmcgUiAoUiBEZXZlbG9wbWVudCBDb3JlIFRlYW0sIDIwMTcpIMSR4buDIG1pbmggaOG7jWEgY8OhYyBr4bu5IHRodeG6rXQgbcO0IGjDrG5oIGjDs2EgKihN4bulYyAxLjEzKSouDQoNCiMjIE3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCAoQ2jGsMahbmcgMik6DQoNCioqxJDhu4tuaCBuZ2jEqWEqKjogQ2jGsMahbmcgbsOgeSDEkeG7i25oIG5naMSpYSBjw6FjIG3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCAqKE3hu6VjIDIuMikqLg0KDQoqKkjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIMSRxqFuIGdp4bqjbiB2w6AgYuG7mWkqKjogQmFvIGfhu5NtIGPhuqMgaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggxJHGoW4gZ2nhuqNuICht4buZdCBiaeG6v24gZ2nhuqNpIHRow61jaCkgdsOgIGjhu5NpIHF1eSBi4buZaSAobmhp4buBdSBiaeG6v24gZ2nhuqNpIHRow61jaCkgKihN4bulYyAyLjMsIDIuNCkqLg0KDQoqKsav4bubYyBsxrDhu6NuZyBiw6xuaCBwaMawxqFuZyBuaOG7jyBuaOG6pXQqKjogUGjGsMahbmcgcGjDoXAgxrDhu5tjIGzGsOG7o25nIGNow61uaCBjaG8gY8OhYyBo4buHIHPhu5EgdHJvbmcgaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggbMOgIMaw4bubYyBsxrDhu6NuZyBiw6xuaCBwaMawxqFuZyBuaOG7jyBuaOG6pXQgKExlYXN0LVNxdWFyZXMgRXN0aW1hdGlvbikgKihN4bulYyAyLjMuMSwgMi40LjEpKi4NCg0KKipDw7RuZyB0aOG7qWMgbWEgdHLhuq1uKio6IEPDoWMga2jDoWkgbmnhu4dtIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIMSRxrDhu6NjIHRyw6xuaCBiw6B5IGLhurFuZyBjw7RuZyB0aOG7qWMgbWEgdHLhuq1uLCBiYW8gZ+G7k20gxrDhu5tjIGzGsOG7o25nIGjhu4cgc+G7kSB2w6AgxrDhu5tjIGzGsOG7o25nIHBoxrDGoW5nIHNhaSAqKE3hu6VjIDIuNSkqOg0KDQoqKkvDvSBoaeG7h3UgbWEgdHLhuq1uKio6ICJNYXRyaXggTm90YXRpb24iICooTeG7pWMgMi41LjEpKg0KDQoqKsav4bubYyBsxrDhu6NuZyBo4buHIHPhu5EqKjogIkNvZWZmaWNpZW50IEVzdGltYXRlcyIgKihN4bulYyAyLjUuMikqDQoNCioqxq/hu5tjIGzGsOG7o25nIHBoxrDGoW5nIHNhaSDPg8KyKio6ICJFc3RpbWF0aW5nIHRoZSBWYXJpYW5jZSDPg8KyIiAqKE3hu6VjIDIuNS4zKSoNCg0KKirGr+G7m2MgbMaw4bujbmcgcGjGsMahbmcgc2FpIGPhu6dhIM6yzIIqKjogIkVzdGltYXRpbmcgdGhlIFZhcmlhbmNlIG9mIM6yzIIiICooTeG7pWMgMi41LjQpKg0KDQoqKlN1eSBsdeG6rW4gY2hvIGPDoWMgbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oKio6IFRo4bqjbyBsdeG6rW4gduG7gSBraeG7g20gxJHhu4tuaCB0LXRlc3QgdsOgIGtob+G6o25nIHRpbiBj4bqteSBjaG8gY8OhYyBo4buHIHPhu5EgaOG7k2kgcXV5IHbDoCBnacOhIHRy4buLIHBow7kgaOG7o3AgKihN4bulYyAyLjgpKi4NCg0KKipQaMOibiB0w61jaCBwaMawxqFuZyBzYWkgY2hvIGPDoWMgbcO0IGjDrG5oIGjhu5NpIHF1eSoqOiBT4butIGThu6VuZyBBTk9WQSDEkeG7gyBzbyBzw6FuaCBjw6FjIG3DtCBow6xuaCBs4buTbmcgbmhhdSAqKE3hu6VjIDIuOSwgMi4xMCkqLg0KDQoqKkzhu7FhIGNo4buNbiBtw7QgaMOsbmgqKjogQ8OhYyB0acOqdSBjaMOtIG5oxrAgQUlDIHbDoCBCSUMgxJHGsOG7o2MgZ2nhu5tpIHRoaeG7h3UgxJHhu4MgbOG7sWEgY2jhu41uIGdp4buvYSBjw6FjIG3DtCBow6xuaCBraMO0bmcgbOG7k25nIG5oYXUgKihN4bulYyAyLjExKSouIEPDoWMgcGjGsMahbmcgcGjDoXAgdOG7sSDEkeG7mW5nIMSR4buDIGzhu7FhIGNo4buNbiBtw7QgaMOsbmggY8WpbmcgxJHGsOG7o2MgdGjhuqNvIGx14bqtbiwgY8O5bmcgduG7m2kgY8OhYyBwaOG6o24gxJHhu5FpIHZp4buHYyBz4butIGThu6VuZyBjw6FjIHRo4bunIHThu6VjIHThu6tuZyBixrDhu5tjICooTeG7pWMgMi4xMikqLg0KDQoqKlPhu60gZOG7pW5nIFIqKjogQ8OhY2ggc+G7rSBk4bulbmcgUiDEkeG7gyBwaMO5IGjhu6NwIHbhu5tpIGPDoWMgbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIMSRxrDhu6NjIGN1bmcgY+G6pXAgKihN4bulYyAyLjE0KSouDQoNCiMjIE3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaDogQ2jhuqluIMSRb8OhbiB2w6AgeMOieSBk4buxbmcgbcO0IGjDrG5oIChDaMawxqFuZyAzKToNCg0KKkPDoWMgZ2nhuqMgxJHhu4tuaCo6IENoxrDGoW5nIG7DoHkgdOG6rXAgdHJ1bmcgdsOgbyBjw6FjIGdp4bqjIMSR4buLbmggY+G7p2EgbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIHThu6sgZ8OzYyDEkeG7mSB0aOG7sWMgdOG6vywgYmFvIGfhu5NtIGxpbmVhciBwcmVkaWN0b3IsIHBoxrDGoW5nIHNhaSBraMO0bmcgxJHhu5VpLCB0w61uaCDEkeG7mWMgbOG6rXAgdsOgIHTDrW5oIGNodeG6qW4gKihN4bulYyAzLjIpKi4NCg0KKipQaOG6p24gZMawIHbDoCBMZXZlcmFnZXMqKjogR2nhu5tpIHRoaeG7h3UgY8OhYyBsb+G6oWkgcGjhuqduIGTGsCAocmVzaWR1YWxzKSB2w6AgbGV2ZXJhZ2VzICooTeG7pWMgMy4zLCAzLjQpKi4NCg0KKipCaeG7g3UgxJHhu5MgcGjhuqduIGTGsCoqOiBCaeG7g3UgxJHhu5MgcGjhuqduIGTGsCBsw6AgY8O0bmcgY+G7pSBxdWFuIHRy4buNbmcgxJHhu4Mga2nhu4NtIHRyYSBjw6FjIGdp4bqjIMSR4buLbmggbcO0IGjDrG5oICooTeG7pWMgMy41KSo6DQoNCioqQmnhu4N1IMSR4buTIHBo4bqnbiBkxrAgY2jhu5FuZyBs4bqhaSB4aioqOiBLaeG7g20gdHJhIHTDrW5oIHR1eeG6v24gdMOtbmggKCJQbG90IFJlc2lkdWFscyBBZ2FpbnN0IHhqIDogTGluZWFyaXR5IikgKihN4bulYyAzLjUuMSkqLg0KDQoqKkJp4buDdSDEkeG7kyBwaOG6p24gZMawIG3hu5l0IHBo4bqnbioqOiAiUGFydGlhbCBSZXNpZHVhbCBQbG90cyIgKihN4bulYyAzLjUuMikqLg0KDQpN4buZdCB2w60gZOG7pSDEkcaw4bujYyBjdW5nIGPhuqVwIHbhu5tpIG3DoyBSIHbDoCBr4bq/dCBxdeG6oyAoRmlnLiAzLjMpLg0KDQoqKkJp4buDdSDEkeG7kyBwaOG6p24gZMawIGNo4buRbmcgbOG6oWkgzrzMgioqOiBLaeG7g20gdHJhIHBoxrDGoW5nIHNhaSBraMO0bmcgxJHhu5VpICgiUGxvdCBSZXNpZHVhbHMgQWdhaW5zdCDOvMyCOiBDb25zdGFudCBWYXJpYW5jZSIpICooTeG7pWMgMy41LjMpKi4gDQoNCkPDoWMgdsOtIGThu6UgduG7gSBiaeG7g3UgxJHhu5MgbMO9IHTGsOG7n25nIHbDoCBjw6FjIHbhuqVuIMSR4buBIG5oxrAgcGhpIHR1eeG6v24gdMOtbmggdsOgIHBoxrDGoW5nIHNhaSBraMO0bmcgxJHhu5VpIMSRxrDhu6NjIG1pbmggaOG7jWEgKCJTb21lIGV4YW1wbGUgcGxvdHMgb2YgdGhlIHN0YW5kYXJkaXplZCByZXNpZHVhbHMgcuKAsiBwbG90dGVkIGFnYWluc3QgdGhlIGZpdHRlZCB2YWx1ZXMgzrzMgi4gVGhlIGVmZmVjdHMgYXJlIGV4YWdnZXJhdGVkIGZyb20gd2hhdCBpcyB1c3VhbGx5IHNlZW4gaW4gcHJhY3RpY2UiKSAoRmlnLiAzLjQpLg0KDQoqKkJp4buDdSDEkeG7kyBR4oCTUSoqOiBLaeG7g20gdHJhIHTDrW5oIGNodeG6qW4gKCJR4oCTUSBQbG90cyBhbmQgTm9ybWFsaXR5IikgKihN4bulYyAzLjUuNCkqLg0KDQoqKkJp4buDdSDEkeG7kyBMYWcqKjogS2nhu4NtIHRyYSBz4buxIHBo4bulIHRodeG7mWMgdGhlbyB0aOG7nWkgZ2lhbiAoIkxhZyBQbG90cyBhbmQgRGVwZW5kZW5jZSBvdmVyIFRpbWUiKSAqKE3hu6VjIDMuNS41KSouIEPDoWMgdsOtIGThu6UgduG7gSBiaeG7g3UgxJHhu5MgcGjhuqduIGTGsCDEkeG7mWMgbOG6rXAgdsOgIHTGsMahbmcgcXVhbiDDom0gxJHGsOG7o2MgaGnhu4NuIHRo4buLIChGaWcuIDMuNSkuDQoNCioqQ8OhYyDEkWnhu4NtIG5nb+G6oWkgbGFpIHbDoCBjw6FjIHF1YW4gc8OhdCBjw7Mg4bqjbmggaMaw4bufbmcqKjogWMOhYyDEkeG7i25oIGPDoWMgcXVhbiBzw6F0IGPDsyB24bqlbiDEkeG7gSBi4bqxbmcgY8OhY2ggc+G7rSBk4bulbmcgcGjhuqduIGTGsCBzdHVkZW50aXplZCB2w6AgY8OhYyBjaOG7iSBz4buRIOG6o25oIGjGsOG7n25nIG5oxrAgQ29vaydzIGRpc3RhbmNlICooTeG7pWMgMy42KSouDQoNCioqS2jhuq9jIHBo4bulYyBz4buxIGPhu5EqKjogQ8OhYyBwaMawxqFuZyBwaMOhcCDEkeG7gyBnaeG6o2kgcXV54bq/dCBjw6FjIHbhuqVuIMSR4buBIMSRw6MgeMOhYyDEkeG7i25oLCBiYW8gZ+G7k20gYmnhur9uIMSR4buVaSBiaeG6v24gcGjhuqNuIGjhu5NpIHbDoCBiaeG6v24gZ2nhuqNpIHRow61jaCAqKE3hu6VjIDMuOCwgMy45LCAzLjEwKSouIEJp4buDdSDEkeG7kyBwaOG6p24gZMawIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIG1pbmggaOG7jWEgaGnhu4d1IHF14bqjIGPhu6dhIHZp4buHYyBiaeG6v24gxJHhu5VpIChGaWcuIDMuNikuDQoNCioqxJBhIGPhu5luZyB0dXnhur9uKio6IFRo4bqjbyBsdeG6rW4gduG7gSB24bqlbiDEkeG7gSDEkWEgY+G7mW5nIHR1eeG6v24gKGNvbGxpbmVhcml0eSkgKihN4bulYyAzLjE0KSouDQoNCioqTmdoacOqbiBj4bupdSDEkWnhu4NuIGjDrG5oKio6IEPDoWMgdsOtIGThu6UgdGjhu7FjIHThur8gxJHGsOG7o2MgdHLDrG5oIGLDoHkgxJHhu4MgbWluaCBo4buNYSBjw6FjIGtow6FpIG5p4buHbSBjaOG6qW4gxJFvw6FuICooTeG7pWMgMy4xNSkqLg0KDQojIyDDnSB0xrDhu59uZyDGsOG7m2MgbMaw4bujbmcga2jhuqMgbsSDbmcgeOG6o3kgcmEgY+G7sWMgxJHhuqFpIChDaMawxqFuZyA0KToNCg0KKipLaMOhaSBxdcOhdCBow7NhIG3DtCBow6xuaCB0dXnhur9uIHTDrW5oIGNodeG6qW4qKjogQ2jGsMahbmcgbsOgeSBi4bqvdCDEkeG6p3UgYuG6sW5nIGPDoWNoIGtow6FpIHF1w6F0IGjDs2EgbcO0IGjDrG5oIHR1eeG6v24gdMOtbmggY2h14bqpbiAqKE3hu6VjIDQuMykqLg0KDQoqKsav4bubYyBsxrDhu6NuZyBraOG6oyBuxINuZyB44bqjeSByYSBj4buxYyDEkeG6oWkgKE1heGltdW0gTGlrZWxpaG9vZCBFc3RpbWF0aW9uIC0gTUxFKSoqOiBHaeG7m2kgdGhp4buHdSBuZ3V5w6puIHThuq9jIGPhu6dhIMaw4bubYyBsxrDhu6NuZyBraOG6oyBuxINuZyB44bqjeSByYSBj4buxYyDEkeG6oWkgKE3hu6VjIDQuNCkuDQoNCioqTUxFIGNobyBt4buZdCB2w6Agbmhp4buBdSB0aGFtIHPhu5EqKjogVHLDrG5oIGLDoHkgY8OhY2ggdMOtbmggTUxFIGNobyB0csaw4budbmcgaOG7o3AgbeG7mXQgdGhhbSBz4buRIHbDoCBuaGnhu4F1IHRoYW0gc+G7kSAqKE3hu6VjIDQuNSwgNC42KSouDQoNCioqQ8O0bmcgdGjhu6ljIG1hIHRy4bqtbiBjaG8gTUxFKio6IE1MRSDEkcaw4bujYyB0csOsbmggYsOgeSBi4bqxbmcgY8O0bmcgdGjhu6ljIG1hIHRy4bqtbiwgYmFvIGfhu5NtIHBoxrDGoW5nIHRyw6xuaCBTY29yZSwgdGjDtG5nIHRpbiAocXVhbiBzw6F0IHbDoCBr4buzIHbhu41uZykgdsOgIHNhaSBz4buRIGNodeG6qW4gY+G7p2EgY8OhYyB0aGFtIHPhu5EgKihN4bulYyA0LjcpKjoNCg0KKipLw70gaGnhu4d1Kio6ICJOb3RhdGlvbiIgKihN4bulYyA0LjcuMSkqDQoNCioqUGjGsMahbmcgdHLDrG5oIFNjb3JlKio6ICJTY29yZSBFcXVhdGlvbnMiICooTeG7pWMgNC43LjIpKg0KDQoqKlRow7RuZyB0aW4qKjogUXVhbiBzw6F0IHbDoCBL4buzIHbhu41uZzogIkluZm9ybWF0aW9uOiBPYnNlcnZlZCBhbmQgRXhwZWN0ZWQiICooTeG7pWMgNC43LjMpKg0KDQoqKlNhaSBz4buRIGNodeG6qW4gY+G7p2EgY8OhYyB0aGFtIHPhu5EqKjogIlN0YW5kYXJkIEVycm9ycyBvZiBQYXJhbWV0ZXJzIiAqKE3hu6VjIDQuNy40KSoNCg0KKipUaHXhuq10IHRvw6FuIEZpc2hlciBTY29yaW5nKio6IFBoxrDGoW5nIHBow6FwIGzhurdwIMSR4buDIHTDrW5oIHRvw6FuIE1MRXMgKihN4bulYyA0LjgpKi4NCg0KKipDw6FjIHRodeG7mWMgdMOtbmggY+G7p2EgTUxFcyoqOiBUaOG6o28gbHXhuq1uIHbhu4EgY8OhYyB0aHXhu5ljIHTDrW5oIG1vbmcgbXXhu5FuIGPhu6dhIE1MRXMgKiooTeG7pWMgNC45KSoqLg0KDQoqKktp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90Kio6IFPhu60gZOG7pW5nIGPDoWMga+G6v3QgcXXhuqMgdGnhu4dtIGPhuq1uIG3huqt1IGzhu5tuIGNobyBraeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dCwgYmFvIGfhu5NtIFdhbGQgdGVzdHMsIExpa2VsaWhvb2QgUmF0aW8gVGVzdHMgdsOgIFNjb3JlIFRlc3RzICooTeG7pWMgNC4xMCkqLg0KDQoqKlPhu60gZOG7pW5nIFIqKjogQ3VuZyBj4bqlcCBtw6MgUiDEkeG7gyBwaMO5IGjhu6NwIHbhu5tpIGPDoWMgbcO0IGjDrG5oICooTeG7pWMgNC4xNCkqLg0KDQojIyBDw6FjIG3DtCBow6xuaCB0dXnhur9uIHTDrW5oIHThu5VuZyBxdcOhdCAoR0xNcyk6IEPhuqV1IHRyw7pjIChDaMawxqFuZyA1KToNCg0KKipHaeG7m2kgdGhp4buHdSBHTE1zKio6IENoxrDGoW5nIG7DoHkgZ2nhu5tpIHRoaeG7h3UgY8OhYyBtw7QgaMOsbmggdHV54bq/biB0w61uaCB04buVbmcgcXXDoXQgKEdlbmVyYWxpemVkIExpbmVhciBNb2RlbHMpIG5oxrAgbeG7mXQga2h1bmcgbGluaCBob+G6oXQgbeG7nyBy4buZbmcgbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIGNodeG6qW4gKihN4bulYyA1LjEpKi4NCg0KKipIYWkgdGjDoG5oIHBo4bqnbioqOiBHTE1zIGJhbyBn4buTbSBoYWkgdGjDoG5oIHBo4bqnbiBjaMOtbmg6IHRow6BuaCBwaOG6p24gbmfhuqt1IG5oacOqbiAocGjDom4gcGjhu5FpIHjDoWMgc3XhuqV0IGPhu6dhIGJp4bq/biBwaOG6o24gaOG7k2kpIHbDoCB0aMOgbmggcGjhuqduIGPDsyBo4buHIHRo4buRbmcgKGjDoG0gdHV54bq/biB0w61uaCBj4bunYSBjw6FjIGJp4bq/biBnaeG6o2kgdGjDrWNoKSAqKihN4bulYyA1LjIpKiouDQoNCioqVGjDoG5oIHBo4bqnbiBuZ+G6q3Ugbmhpw6puKio6IE3DtCBow6xuaCBwaMOibiB0w6FuIGjDoG0gbcWpIChFeHBvbmVudGlhbCBEaXNwZXJzaW9uIE1vZGVscyAtIEVETXMpIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIG3DtCB04bqjIHRow6BuaCBwaOG6p24gbmfhuqt1IG5oacOqbiAqKE3hu6VjIDUuMykqLiBDw6FjIHbDrSBk4bulIHbhu4EgRURNcyB2w6AgxJHhu4tuaCBuZ2jEqWEgdG/DoW4gaOG7jWMgxJHGsOG7o2MgY3VuZyBj4bqlcC4NCg0KKipIw6BtIHBoxrDGoW5nIHNhaSoqOiBLaMOhaSBuaeG7h20gaMOgbSBwaMawxqFuZyBzYWkgxJHGsOG7o2MgZ2nhu5tpIHRoaeG7h3UgKihN4bulYyA1LjMuNikqLg0KDQoqKkThuqFuZyBtw7QgaMOsbmggcGjDom4gdMOhbioqOiBFRE1zIGPDsyB0aOG7gyDEkcaw4bujYyBiaeG7g3UgZGnhu4VuIGTGsOG7m2kgZOG6oW5nIG3DtCBow6xuaCBwaMOibiB0w6FuLCBiYW8gZ+G7k20gZGV2aWFuY2UgxJHGoW4gduG7iyAodW5pdCBkZXZpYW5jZSkgKihN4bulYyA1LjQpKi4NCg0KKipUaMOgbmggcGjhuqduIGPDsyBo4buHIHRo4buRbmcqKjogQmFvIGfhu5NtIGjDoG0gbGnDqm4ga+G6v3QgKGxpbmsgZnVuY3Rpb24pIGvhur90IG7hu5FpIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2EgYmnhur9uIHBo4bqjbiBo4buTaSB24bubaSB0aMOgbmggcGjhuqduIGPDsyBo4buHIHRo4buRbmcgKihN4bulYyA1LjUuMSkqIHbDoCBvZmZzZXRzICooTeG7pWMgNS41LjIpKi4NCg0KKirEkOG7i25oIG5naMSpYSBHTE1zKio6IE3hu5l0IMSR4buLbmggbmdoxKlhIGNow61uaCB0aOG7qWMgduG7gSBHTE1zIMSRxrDhu6NjIHRyw6xuaCBiw6B5ICooTeG7pWMgNS42KSouDQoNCioqVG90YWwgRGV2aWFuY2UqKjogS2jDoWkgbmnhu4dtIHRvdGFsIGRldmlhbmNlIMSRxrDhu6NjIGdp4bqjaSB0aMOtY2ggKihN4bulYyA1LjcpKi4NCg0KKipRdWFuIGjhu4cgduG7m2kgaOG7k2kgcXV5IHR1eeG6v24gdMOtbmgqKjogVGjhuqNvIGx14bqtbiB24buBIGPDoWNoIGJp4bq/biDEkeG7lWkgaOG7k2kgcXV5IMaw4bubYyB0w61uaCBHTE1zICooTeG7pWMgNS44KSouDQoNCiMjIEPDoWMgbcO0IGjDrG5oIHR1eeG6v24gdMOtbmggdOG7lW5nIHF1w6F0OiDGr+G7m2MgbMaw4bujbmcgKENoxrDGoW5nIDYpOg0KDQoqKlTDrW5oIHRvw6FuIGto4bqjIG7Eg25nIHjhuqN5IHJhKio6IFRyw6xuaCBiw6B5IGPDoWNoIHTDrW5oIHRvw6FuIGto4bqjIG7Eg25nIHjhuqN5IHJhIChsaWtlbGlob29kKSBjaG8gY8OhYyBo4buHIHPhu5EgzrIgdHJvbmcgR0xNcyAqKE3hu6VjIDYuMikqLg0KDQoqKlBoxrDGoW5nIHRyw6xuaCBTY29yZSB2w6AgVGjDtG5nIHRpbioqOiBHaeG7m2kgdGhp4buHdSBwaMawxqFuZyB0csOsbmggU2NvcmUgdsOgIHRow7RuZyB0aW4gY2hvIM6yICooTeG7pWMgNi4yLjIpKi4NCg0KKipUw61uaCB0b8OhbiDGsOG7m2MgbMaw4bujbmcgY+G7p2EgzrIqKjogVHLDrG5oIGLDoHkgY8OhYyBwaMawxqFuZyBwaMOhcCDEkeG7gyB0w61uaCB0b8OhbiDGsOG7m2MgbMaw4bujbmcgY+G7p2EgzrIgKihN4bulYyA2LjMpKi4NCg0KKipSZXNpZHVhbCBEZXZpYW5jZSoqOiBLaMOhaSBuaeG7h20gcmVzaWR1YWwgZGV2aWFuY2UgxJHGsOG7o2MgZ2nhuqNpIHRow61jaCAqKE3hu6VjIDYuNCkqLg0KDQoqKlNhaSBz4buRIGNodeG6qW4gY2hvIM6yzIIqKjogQ8OhY2ggxrDhu5tjIHTDrW5oIHNhaSBz4buRIGNodeG6qW4gY2hvIGPDoWMgxrDhu5tjIGzGsOG7o25nIGjhu4cgc+G7kSAqKE3hu6VjIDYuNSkqLg0KDQoqKsav4bubYyBsxrDhu6NuZyDOsioqOiBDw7RuZyB0aOG7qWMgbWEgdHLhuq1uOiBDw7RuZyB0aOG7qWMgbWEgdHLhuq1uIGNobyDGsOG7m2MgbMaw4bujbmcgzrIgdHJvbmcgR0xNcyAqKE3hu6VjIDYuNikqLg0KDQoqKsav4bubYyBsxrDhu6NuZyBHTE1zIGdp4buRbmcgaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggY+G7pWMgYuG7mSoqOiDDnSB0xrDhu59uZyBy4bqxbmcgdmnhu4djIMaw4bubYyBsxrDhu6NuZyBHTE1zIGPhu6VjIGLhu5kgZ2nhu5FuZyBuaMawIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oICooTeG7pWMgNi43KSouDQoNCioqxq/hu5tjIGzGsOG7o25nIM+GKio6IEPDoWMgcGjGsMahbmcgcGjDoXAga2jDoWMgbmhhdSDEkeG7gyDGsOG7m2MgbMaw4bujbmcgdGhhbSBz4buRIHBow6JuIHTDoW4gz4YsIGJhbyBn4buTbSBNTEUsIE1vZGlmaWVkIFByb2ZpbGUgTG9nLUxpa2VsaWhvb2QgRXN0aW1hdG9yLCBNZWFuIERldmlhbmNlIEVzdGltYXRvciB2w6AgUGVhcnNvbiBFc3RpbWF0b3IgKihN4bulYyA2LjgpKi4NCg0KKipT4butIGThu6VuZyBSKio6IEPDoWNoIHPhu60gZOG7pW5nIFIgxJHhu4MgcGjDuSBo4bujcCB24bubaSBHTE1zICooTeG7pWMgNi45KSouDQoNCiMjIEPDoWMgbcO0IGjDrG5oIHR1eeG6v24gdMOtbmggdOG7lW5nIHF1w6F0OiBTdXkgbHXhuq1uIChDaMawxqFuZyA3KToNCg0KKipTdXkgbHXhuq1uIGNobyBjw6FjIGjhu4cgc+G7kSBraGkgz4YgxJHDoyBiaeG6v3QqKjogVHLDrG5oIGLDoHkgY8OhY2ggdGjhu7FjIGhp4buHbiBzdXkgbHXhuq1uIChraeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dCB2w6Aga2hv4bqjbmcgdGluIGPhuq15KSBjaG8gY8OhYyBo4buHIHPhu5Ega2hpIHRoYW0gc+G7kSBwaMOibiB0w6FuIM+GIMSRw6MgYmnhur90ICooTeG7pWMgNy4yKSouIEJhbyBn4buTbSBXYWxkIFRlc3RzLCBraG/huqNuZyB0aW4gY+G6rXkgY2hvIGjhu4cgc+G7kSB2w6AgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCwgTGlrZWxpaG9vZCBSYXRpbyBUZXN0cyB2w6AgQW5hbHlzaXMgb2YgRGV2aWFuY2UgVGFibGVzLg0KDQoqKktp4buDbSDEkeG7i25oIFdhbGQsIFNjb3JlIHbDoCBMaWtlbGlob29kIFJhdGlvKio6IFNvIHPDoW5oIGJhIGxv4bqhaSBraeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dCBuw6B5ICooTeG7pWMgNy43KSouDQoNCioqTOG7sWEgY2jhu41uIGdp4buvYSBjw6FjIEdMTXMga2jDtG5nIGzhu5NuZyBuaGF1Kio6IFPhu60gZOG7pW5nIEFJQyB2w6AgQklDIMSR4buDIGzhu7FhIGNo4buNbiBtw7QgaMOsbmggKihN4bulYyA3LjgpKi4NCg0KKipQaMawxqFuZyBwaMOhcCB04buxIMSR4buZbmcgY2hvIGzhu7FhIGNo4buNbiBtw7QgaMOsbmgqKjogKihN4bulYyA3LjkpKi4NCg0KKipT4butIGThu6VuZyBSKio6IEPDoWNoIHPhu60gZOG7pW5nIFIgxJHhu4MgdGjhu7FjIGhp4buHbiBjw6FjIGtp4buDbSDEkeG7i25oICooTeG7pWMgNy4xMCkqLg0KDQojIyBDw6FjIG3DtCBow6xuaCB0dXnhur9uIHTDrW5oIHThu5VuZyBxdcOhdDogQ2jhuqluIMSRb8OhbiAoQ2jGsMahbmcgOCk6DQoNCioqQ8OhYyBnaeG6oyDEkeG7i25oIGPhu6dhIEdMTXMqKjogVGjhuqNvIGx14bqtbiB24buBIGPDoWMgZ2nhuqMgxJHhu4tuaCBj4bunYSBHTE1zICooTeG7pWMgOC4yKSouDQoNCioqQ8OhYyBsb+G6oWkgcGjhuqduIGTGsCBjaG8gR0xNcyoqOiBHaeG7m2kgdGhp4buHdSBjw6FjIGxv4bqhaSBwaOG6p24gZMawIGtow6FjIG5oYXUgcGjDuSBo4bujcCB24bubaSBHTE1zLCBiYW8gZ+G7k20gUmVzcG9uc2UgUmVzaWR1YWxzIChraMO0bmcgxJHhu6cpLCBQZWFyc29uIFJlc2lkdWFscywgRGV2aWFuY2UgUmVzaWR1YWxzIHbDoCBRdWFudGlsZSBSZXNpZHVhbHMgKihN4bulYyA4LjMpKi4NCg0KKipMZXZlcmFnZXMgdHJvbmcgR0xNcyoqOiBLaMOhaSBuaeG7h20gbGV2ZXJhZ2VzIHbDoCBoYXQgbWF0cml4IHRyb25nIGLhu5FpIGPhuqNuaCBHTE1zICooTeG7pWMgOC40KSouDQoNCioqTGV2ZXJhZ2UgU3RhbmRhcmRpemVkIFJlc2lkdWFscyoqOiBHaeG7m2kgdGhp4buHdSBsZXZlcmFnZSBzdGFuZGFyZGl6ZWQgcmVzaWR1YWxzICooTeG7pWMgOC41KSouDQoNCioqS2hpIG7DoG8gc+G7rSBk4bulbmcgbG/huqFpIHBo4bqnbiBkxrAgbsOgbyoqOiBIxrDhu5tuZyBk4bqrbiB24buBIHZp4buHYyBs4buxYSBjaOG7jW4gbG/huqFpIHBo4bqnbiBkxrAgcGjDuSBo4bujcCAqKE3hu6VjIDguNikqLg0KDQoqKktp4buDbSB0cmEgY8OhYyBnaeG6oyDEkeG7i25oIG3DtCBow6xuaCoqOiBT4butIGThu6VuZyBjw6FjIGJp4buDdSDEkeG7kyBwaOG6p24gZMawIMSR4buDIGtp4buDbSB0cmEgY8OhYyBnaeG6oyDEkeG7i25oIHbhu4EgdMOtbmggxJHhu5ljIGzhuq1wLCB0aMOgbmggcGjhuqduIGPDsyBo4buHIHRo4buRbmcgdsOgIHRow6BuaCBwaOG6p24gbmfhuqt1IG5oacOqbiAqKE3hu6VjIDguNykqLiBDw6FjIGJp4buDdSDEkeG7kyDEkWnhu4NuIGjDrG5oIMSRxrDhu6NjIG1pbmggaOG7jWEsIGNo4bqzbmcgaOG6oW4gbmjGsCBiaeG7g3UgxJHhu5MgcGjhuqduIGTGsCBjaOG7kW5nIGzhuqFpIGPDoWMgZ2nDoSB0cuG7iyBwaMO5IGjhu6NwIChGaWcuIDguNSwgdG9wIHBhbmVscykuDQoNCioqQ8OhYyDEkWnhu4NtIG5nb+G6oWkgbGFpIHbDoCBjw6FjIHF1YW4gc8OhdCBjw7Mg4bqjbmggaMaw4bufbmcqKjogWMOhYyDEkeG7i25oIGPDoWMgcXVhbiBzw6F0IGPDsyB24bqlbiDEkeG7gSB0cm9uZyBHTE1zICooTeG7pWMgOC44KSouDQoNCioqS2jhuq9jIHBo4bulYyBz4buxIGPhu5EqKjogQ8OhYyBwaMawxqFuZyBwaMOhcCDEkeG7gyBnaeG6o2kgcXV54bq/dCBjw6FjIHbhuqVuIMSR4buBIMSRw6MgeMOhYyDEkeG7i25oLCB0xrDGoW5nIHThu7EgbmjGsCB0cm9uZyBo4buTaSBxdXkgdHV54bq/biB0w61uaCwgbmjGsG5nIMSRxrDhu6NjIMSRaeG7gXUgY2jhu4luaCBjaG8gR0xNcy4gQ8OhYyBiaeG7g3UgxJHhu5MgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgbWluaCBo4buNYSBz4buxIGPhuqNpIHRoaeG7h24gc2F1IGtoaSDDoXAgZOG7pW5nIGPDoWMgYmnhu4duIHBow6FwIGto4bqvYyBwaOG7pWMgKEZpZy4gOC45KS4NCg0KKipRdWFzaS1MaWtlbGlob29kIHbDoCBFeHRlbmRlZCBRdWFzaS1MaWtlbGlob29kKio6IEdp4bubaSB0aGnhu4d1IGPDoWMga2jDoWkgbmnhu4dtIG7DoHkgxJHhu4MgeOG7rSBsw70gdHLGsOG7nW5nIGjhu6NwIHBoxrDGoW5nIHNhaSBraMO0bmcgxJHGsOG7o2MgeMOhYyDEkeG7i25oIGhvw6BuIHRvw6BuIGLhu59pIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggKihN4bulYyA4LjEwKSouDQoNCioqxJBhIGPhu5luZyB0dXnhur9uKio6IFRo4bqjbyBsdeG6rW4gduG7gSDEkWEgY+G7mW5nIHR1eeG6v24gdHJvbmcgR0xNcyAqKE3hu6VjIDguMTEpKi4NCg0KKipOZ2hpw6puIGPhu6l1IMSRaeG7g24gaMOsbmgqKjogQ8OhYyB2w60gZOG7pSB0aOG7sWMgdOG6vyBtaW5oIGjhu41hIHZp4buHYyBjaOG6qW4gxJFvw6FuIEdMTXMgKihN4bulYyA4LjEyKSouDQoNCioqU+G7rSBk4bulbmcgUioqOiBDw6FjaCBz4butIGThu6VuZyBSIMSR4buDIHBow6JuIHTDrWNoIGNo4bqpbiDEkW/DoW4gY+G7p2EgR0xNcyAqKE3hu6VjIDguMTMpKi4NCg0KIyMgTcO0IGjDrG5oIGNobyB04bu3IGzhu4c6IEJpbm9taWFsIEdMTXMgKENoxrDGoW5nIDkpOg0KDQoqKk3DtCBow6xuaCBow7NhIHThu7cgbOG7hyoqOiDhu6huZyBk4bulbmcgR0xNcyBjaG8gZOG7ryBsaeG7h3UgdOG7tyBs4buHLCBuxqFpIGJp4bq/biBwaOG6o24gaOG7k2kgbMOgIHPhu5EgbOG6p24gdGjDoG5oIGPDtG5nIHRyb25nIG3hu5l0IHPhu5EgbOG6p24gdGjhu60gY+G7kSDEkeG7i25oICooTeG7pWMgOS4yKSouIFBow6JuIHBo4buRaSBCaW5vbWlhbCBsw6AgdGjDoG5oIHBo4bqnbiBuZ+G6q3Ugbmhpw6puIMSRaeG7g24gaMOsbmguDQoNCioqSMOgbSBsacOqbiBr4bq/dCoqOiBUaOG6o28gbHXhuq1uIHbhu4EgY8OhYyBow6BtIGxpw6puIGvhur90IGtow6FjIG5oYXUgcGjDuSBo4bujcCB24bubaSBCaW5vbWlhbCBHTE1zLCBjaOG6s25nIGjhuqFuIG5oxrAgcHJvYml0IGxpbmsgKihN4bulYyA5LjQpKiwgbG9naXQgbGluayAqKE3hu6VjIDkuNSkqIHbDoCBjb21wbGVtZW50YXJ5IGxvZy1sb2cgbGluayAqKE3hu6VjIDkuNykqLg0KDQoqKlThu7cgbOG7hyBPZGRzIHbDoCBMb2dpdCBMaW5rKio6IEdp4bqjaSB0aMOtY2gga2jDoWkgbmnhu4dtIHThu7cgbOG7hyBvZGRzIHbDoCBt4buRaSBxdWFuIGjhu4cgY+G7p2EgbsOzIHbhu5tpIGxvZ2l0IGxpbmsgKihN4bulYyA5LjUpKi4NCg0KKipPdmVyZGlzcGVyc2lvbioqOiBY4butIGzDvSB24bqlbiDEkeG7gSBvdmVyZGlzcGVyc2lvbiAoa2hpIHBoxrDGoW5nIHNhaSBs4bubbiBoxqFuIGdp4bqjIMSR4buLbmggY+G7p2EgcGjDom4gcGjhu5FpIEJpbm9taWFsKSAqKE3hu6VjIDkuOCkqLg0KDQoqKktoaSBXYWxkIFRlc3RzIHRo4bqldCBi4bqhaSoqOiBUaOG6o28gbHXhuq1uIHbhu4EgY8OhYyBo4bqhbiBjaOG6vyBj4bunYSBXYWxkIFRlc3RzIHRyb25nIG3hu5l0IHPhu5EgdHLGsOG7nW5nIGjhu6NwICooTeG7pWMgOS45KSouDQoNCioqR29vZG5lc3Mtb2YtRml0IGNobyBiaW5hcnkgcmVzcG9uc2VzKio6IEzGsHUgw70gcuG6sW5nIGdvb2RuZXNzLW9mLWZpdCBjaG8gYmluYXJ5IHJlc3BvbnNlcyAoZOG7ryBsaeG7h3Ugbmjhu4sgcGjDom4pIGtow7RuZyBjw7Mgc+G6tW4gKihN4bulYyA5LjEwKSouDQoNCioqU+G7rSBk4bulbmcgUioqOiBDw6FjaCBz4butIGThu6VuZyBSIMSR4buDIHBow7kgaOG7o3AgduG7m2kgQmlub21pYWwgR0xNcyAqKE3hu6VjIDkuMTIpKi4NCg0KIyMgTcO0IGjDrG5oIGNobyBz4buRIGzGsOG7o25nOiBQb2lzc29uIHbDoCBOZWdhdGl2ZSBCaW5vbWlhbCBHTE1zIChDaMawxqFuZyAxMCk6DQoNCioqUG9pc3NvbiBHTE1zKio6IFTDs20gdOG6r3QgY8OhYyDEkeG6t2MgxJFp4buDbSBj4bunYSBQb2lzc29uIEdMTXMsIHBow7kgaOG7o3AgduG7m2kgZOG7ryBsaeG7h3UgxJHhur9tIChjb3VudCBkYXRhKSAqKE3hu6VjIDEwLjIpKi4gUGjDom4gcGjhu5FpIFBvaXNzb24gbMOgIHRow6BuaCBwaOG6p24gbmfhuqt1IG5oacOqbi4NCg0KKipNw7QgaMOsbmggaMOzYSB04bu3IGzhu4cgKFJhdGVzKSoqOiBT4butIGThu6VuZyBHTE1zIMSR4buDIG3DtCBow6xuaCBow7NhIHThu7cgbOG7hyAodsOtIGThu6U6IHPhu5Egc+G7sSBraeG7h24gdHLDqm4gbeG7mXQgxJHGoW4gduG7iyB0aOG7nWkgZ2lhbiBob+G6t2MgZGnhu4duIHTDrWNoKSBi4bqxbmcgY8OhY2ggc+G7rSBk4bulbmcgb2Zmc2V0cyAqKE3hu6VjIDEwLjMpKi4NCg0KKipC4bqjbmcgdMawxqFuZyB0w6FjKio6IExvZy1MaW5lYXIgTW9kZWxzOiDDgXAgZOG7pW5nIFBvaXNzb24gR0xNcyBjaG8gYuG6o25nIHTGsMahbmcgdMOhYyDEkeG7gyBwaMOibiB0w61jaCBk4buvIGxp4buHdSBwaMOibiBsb+G6oWkgYuG6sW5nIGPDoWNoIHPhu60gZOG7pW5nIGxvZy1saW5lYXIgbW9kZWxzICooTeG7pWMgMTAuNCkqLiBCYW8gZ+G7k20gY8OhYyBi4bqjbmcgaGFpIGNoaeG7gXUgdsOgIGJhIGNoaeG7gXUuDQoNCioqTmdo4buLY2ggbMO9IFNpbXBzb24qKjogTWluaCBo4buNYSBuZ2jhu4tjaCBsw70gU2ltcHNvbiB0cm9uZyBi4buRaSBj4bqjbmggYuG6o25nIHTGsMahbmcgdMOhYyAqKE3hu6VjIDEwLjQuNSkqLg0KDQoqKlPhu7EgdMawxqFuZyDEkcawxqFuZyBnaeG7r2EgQmlub21pYWwgdsOgIFBvaXNzb24gR0xNcyoqOiBUaOG6o28gbHXhuq1uIHbhu4Egc+G7sSB0xrDGoW5nIMSRxrDGoW5nIGdp4buvYSBoYWkgbG/huqFpIG3DtCBow6xuaCBuw6B5IHRyb25nIG3hu5l0IHPhu5EgdHLGsOG7nW5nIGjhu6NwICooTeG7pWMgMTAuNC42KSouDQoNCioqTmVnYXRpdmUgQmlub21pYWwgR0xNcyoqOiBHaeG7m2kgdGhp4buHdSBOZWdhdGl2ZSBCaW5vbWlhbCBHTE1zIG5oxrAgbeG7mXQgY8OhY2ggxJHhu4MgeOG7rSBsw70gb3ZlcmRpc3BlcnNpb24gdHJvbmcgZOG7ryBsaeG7h3UgxJHhur9tICooTeG7pWMgMTAuNSkqLg0KDQoqKk5naGnDqm4gY+G7qXUgxJFp4buDbiBow6xuaCoqOiBWw60gZOG7pSB24buBIG3DtCBow6xuaCBow7NhIHPhu5EgbMaw4bujbmcgduG7hyB0aW5oIHRyw6puIGN1YSBtw7NuZyBuZ+G7sWEgY8OhaSwgc+G7rSBk4bulbmcgY8OhYyBiaeG6v24gZ2nhuqNpIHRow61jaCBuaMawIHRy4buNbmcgbMaw4bujbmcsIG3DoHUgc+G6r2MsIGNoaeG7gXUgcuG7mW5nIHbDoCB0w6xuaCB0cuG6oW5nIGdhaSAoRmlnLiAxMC42KS4gQ8OhYyBiaeG7g3UgxJHhu5MgY2jhuqluIMSRb8OhbiwgYmFvIGfhu5NtIGRldmlhbmNlIHJlc2lkdWFscyBjaOG7kW5nIGzhuqFpIGPEg24gYuG6rWMgaGFpIGPhu6dhIGdpw6EgdHLhu4sgcGjDuSBo4bujcCB2w6AgQ29vaydzIGRpc3RhbmNlLCDEkcaw4bujYyBoaeG7g24gdGjhu4sgKEZpZy4gMTAuNykuIFNvIHPDoW5oIGPDoWMgbcO0IGjDrG5oIFF1YXNpLXBvaXNzb24gdsOgIE5lZ2F0aXZlIGJpbm9taWFsIMSRxrDhu6NjIG1pbmggaOG7jWEgKEZpZy4gMTAuOCkuDQoNCioqU+G7rSBk4bulbmcgUioqOiBDw6FjaCBz4butIGThu6VuZyBSIMSR4buDIHBow7kgaOG7o3AgduG7m2kgUG9pc3NvbiB2w6AgTmVnYXRpdmUgQmlub21pYWwgR0xNcyAqKE3hu6VjIDEwLjcpKi4NCg0KIyMgROG7ryBsaeG7h3UgbGnDqm4gdOG7pWMgZMawxqFuZzogR2FtbWEgdsOgIEludmVyc2UgR2F1c3NpYW4gR0xNcyAoQ2jGsMahbmcgMTEpOg0KDQoqKk3DtCBow6xuaCBow7NhIGThu68gbGnhu4d1IGxpw6puIHThu6VjIGTGsMahbmcqKjogR2nhu5tpIHRoaeG7h3UgY8OhYyBHTE1zIHBow7kgaOG7o3AgY2hvIGThu68gbGnhu4d1IGxpw6puIHThu6VjIGNo4buJIG5o4bqtbiBjw6FjIGdpw6EgdHLhu4sgZMawxqFuZyAqKE3hu6VjIDExLjIpKi4NCg0KKipQaMOibiBwaOG7kWkgR2FtbWEqKjogVGjhuqNvIGx14bqtbiB24buBIHBow6JuIHBo4buRaSBHYW1tYSBuaMawIG3hu5l0IHRow6BuaCBwaOG6p24gbmfhuqt1IG5oacOqbiBwaMO5IGjhu6NwIGNobyBsb+G6oWkgZOG7ryBsaeG7h3UgbsOgeSAqKE3hu6VjIDExLjMpKi4NCg0KKipQaMOibiBwaOG7kWkgSW52ZXJzZSBHYXVzc2lhbioqOiBUaOG6o28gbHXhuq1uIHbhu4EgcGjDom4gcGjhu5FpIEludmVyc2UgR2F1c3NpYW4gKihN4bulYyAxMS40KSouDQoNCioqSMOgbSBsacOqbiBr4bq/dCoqOiBDw6FjIGjDoG0gbGnDqm4ga+G6v3QgcGjDuSBo4bujcCBjaG8gR2FtbWEgdsOgIEludmVyc2UgR2F1c3NpYW4gR0xNcyAqKE3hu6VjIDExLjUpKi4gQ8OhYyBiaeG7g3UgxJHhu5MgcGjhuqduIGTGsCAocXVhbnRpbGUgcmVzaWR1YWxzKSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkcOhbmggZ2nDoSBz4buxIHBow7kgaOG7o3AgY+G7p2EgbcO0IGjDrG5oIGxvZy1saW5rIChGaWcuIDExLjcpLg0KDQoqKsav4bubYyBsxrDhu6NuZyB0aGFtIHPhu5EgcGjDom4gdMOhbioqOiBDw6FjaCDGsOG7m2MgbMaw4bujbmcgdGhhbSBz4buRIHBow6JuIHTDoW4gz4YgY2hvIHBow6JuIHBo4buRaSBHYW1tYSB2w6AgSW52ZXJzZSBHYXVzc2lhbiAqKE3hu6VjIDExLjYpKi4NCg0KKipOZ2hpw6puIGPhu6l1IMSRaeG7g24gaMOsbmgqKjogQ8OhYyB2w60gZOG7pSB0aOG7sWMgdOG6vyB24buBIHZp4buHYyDDoXAgZOG7pW5nIGPDoWMgbcO0IGjDrG5oIG7DoHkgKihN4bulYyAxMS43KSouDQoNCioqU+G7rSBk4bulbmcgUioqOiBDw6FjaCBz4butIGThu6VuZyBSIMSR4buDIHBow7kgaOG7o3AgduG7m2kgR2FtbWEgdsOgIEludmVyc2UgR2F1c3NpYW4gR0xNcyAqKE3hu6VjIDExLjgpKi4NCg0KIyMgVHdlZWRpZSBHTE1zIChDaMawxqFuZyAxMik6DQoNCioqVHdlZWRpZSBFRE1zKio6IEdp4bubaSB0aGnhu4d1IGPDoWMgcGjDom4gcGjhu5FpIFR3ZWVkaWUsIG3hu5l0IGzhu5twIGNvbiBj4bunYSBFRE1zLCBwaMO5IGjhu6NwIGNobyBk4buvIGxp4buHdSBsacOqbiB04bulYyBkxrDGoW5nIHbDoCBk4buvIGxp4buHdSB24bubaSBjw6FjIGdpw6EgdHLhu4sga2jDtG5nIGNow61uaCB4w6FjICooTeG7pWMgMTIuMikqLg0KDQoqKkPhuqV1IHRyw7pjIFR3ZWVkaWUgRURNcyoqOiBNw7QgdOG6oyBj4bqldSB0csO6YyBj4bunYSBUd2VlZGllIEVETXMgKihN4bulYyAxMi4yLjIpKi4NCg0KKipE4buvIGxp4buHdSBsacOqbiB04bulYyBkxrDGoW5nIHbDoCBk4buvIGxp4buHdSBjw7MgZ2nDoSB0cuG7iyBraMO0bmcgY2jDrW5oIHjDoWMqKjogVGjhuqNvIGx14bqtbiB24buBIOG7qW5nIGThu6VuZyBj4bunYSBUd2VlZGllIEVETXMgY2hvIGPDoWMgbG/huqFpIGThu68gbGnhu4d1IG7DoHkgKihN4bulYyAxMi4yLjMsIDEyLjIuNCkqLg0KDQoqKlR3ZWVkaWUgR0xNcyoqOiDEkOG7i25oIG5naMSpYSB2w6AgY8OhY2ggxrDhu5tjIGzGsOG7o25nIFR3ZWVkaWUgR0xNcyAqKE3hu6VjIDEyLjMpKi4gQmFvIGfhu5NtIMaw4bubYyBsxrDhu6NuZyB0aGFtIHPhu5EgaW5kZXggzr4gKihN4bulYyAxMi4zLjIpKiB2w6AgY8OhY2ggcGjDuSBo4bujcCB24bubaSBtw7QgaMOsbmggKihN4bulYyAxMi4zLjMpKi4NCg0KKipOZ2hpw6puIGPhu6l1IMSRaeG7g24gaMOsbmgqKjogQ8OhYyB2w60gZOG7pSB0aOG7sWMgdOG6vyB24buBIHZp4buHYyDDoXAgZOG7pW5nIFR3ZWVkaWUgR0xNcyAqKE3hu6VjIDEyLjQpKi4NCg0KKipT4butIGThu6VuZyBSKio6IEPDoWNoIHPhu60gZOG7pW5nIFIgxJHhu4MgcGjDuSBo4bujcCB24bubaSBUd2VlZGllIEdMTXMgKihN4bulYyAxMi41KSouDQoNCkPDoWMga2jDrWEgY+G6oW5oIHF1YW4gdHLhu41uZyBraMOhYzoNCg0KDQoqU+G7rSBk4bulbmcgUjogQ3Xhu5FuIHPDoWNoIHTDrWNoIGjhu6NwIGNo4bq3dCBjaOG6vSB2aeG7h2Mgc+G7rSBk4bulbmcgUiDEkeG7gyBtaW5oIGjhu41hIHbDoCB0aOG7sWMgaGnhu4duIGPDoWMga+G7uSB0aHXhuq10IG3DtCBow6xuaCBow7NhLiBDw7MgbeG7mXQgcGjhuqduIHBo4bulIGzhu6VjIGTDoG5oIHJpw6puZyBjaG8gdmnhu4djIHPhu60gZOG7pW5nIFIgY2hvIHBow6JuIHTDrWNoIGThu68gbGnhu4d1IChBcHBlbmRpeCBBKS4qDQoNCkPDoWMgduG6pW4gxJHhu4EgdsOgIFTDoGkgbGnhu4d1IHRoYW0ga2jhuqNvOiBN4buXaSBjaMawxqFuZyDEkeG7gXUgY8OzIGPDoWMgduG6pW4gxJHhu4EgYsOgaSB04bqtcCB2w6AgdMOgaSBsaeG7h3UgdGhhbSBraOG6o28gbGnDqm4gcXVhbi4NCg0KROG7ryBsaeG7h3U6IEN14buRbiBzw6FjaCBz4butIGThu6VuZyBnw7NpIEdMTXNEYXRhIHRyb25nIFIsIGNo4bupYSBjw6FjIGLhu5kgZOG7ryBsaeG7h3UgxJHGsOG7o2Mgc+G7rSBk4bulbmcgdHJvbmcgY8OhYyB2w60gZOG7pSAoQXBwZW5kaXggQikuDQoNCj0+IFTDs20gbOG6oWksIHTDoGkgbGnhu4d1IG7DoHkgY3VuZyBj4bqlcCBt4buZdCBjw6FpIG5ow6xuIHThu5VuZyBxdWFuIGNoaSB0aeG6v3QgduG7gSBjw6FjIG3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCB2w6AgbcO0IGjDrG5oIHR1eeG6v24gdMOtbmggdOG7lW5nIHF1w6F0LCB04bqtcCB0cnVuZyB2w6BvIGPDoWMga2jDrWEgY+G6oW5oIGzDvSB0aHV54bq/dCwgcGjGsMahbmcgcGjDoXAgxrDhu5tjIGzGsOG7o25nICjEkeG6t2MgYmnhu4d0IGzDoCBiw6xuaCBwaMawxqFuZyBuaOG7jyBuaOG6pXQgdsOgIGto4bqjIG7Eg25nIHjhuqN5IHJhIGPhu7FjIMSR4bqhaSksIHN1eSBsdeG6rW4gdGjhu5FuZyBrw6ogdsOgIGNo4bqpbiDEkW/DoW4gbcO0IGjDrG5oLiBWaeG7h2Mgc+G7rSBk4bulbmcgUiDEkcaw4bujYyB0w61jaCBo4bujcCB4dXnDqm4gc3Xhu5F0IMSR4buDIGjhu5cgdHLhu6Mgdmnhu4djIGjhu41jIHbDoCDDoXAgZOG7pW5nIGPDoWMga+G7uSB0aHXhuq10IG7DoHkuDQoNCioqX1hpbiBsxrB1IMO9IHLhurFuZyBi4bqjbiB0w7NtIHThuq90IG7DoHkgZOG7sWEgdHLDqm4gbeG7pWMgbOG7pWMgdsOgIGPDoWMgxJFv4bqhbiB0csOtY2ggxJHGsOG7o2MgY3VuZyBj4bqlcC4gxJDhu4MgY8OzIGhp4buDdSBiaeG6v3QgxJHhuqd5IMSR4bunLCBj4bqnbiDEkeG7jWMgdG/DoG4gYuG7mSBjdeG7kW4gc8OhY2guXyoqDQoNCiMgLiBUSOG7kE5HIEvDiiBNw5QgVOG6oiBDw4FDIEJJ4bq+Tg0KDQoqKkdp4bqjaSB0aMOtY2ggY8OhYyBiaeG6v24qKg0KDQpgYGB7cn0NCg0KdmFyaWFibGVfZXhwbGFpbiA8LSBkYXRhLmZyYW1lKA0KICBUZW5fQmllbiA9IGMoIlVubmFtZWQ6IDAiLCAiUHVyY2hhc2VEYXRlIiwgIkN1c3RvbWVySUQiLCAiR2VuZGVyIiwgIk1hcml0YWxTdGF0dXMiLCANCiAgICAgICAgICAgICAgICJIb21lb3duZXIiLCAiQ2hpbGRyZW4iLCAiQW5udWFsSW5jb21lIiwgIkNpdHkiLCAiU3RhdGVvclByb3ZpbmNlIiwgDQogICAgICAgICAgICAgICAiQ291bnRyeSIsICJQcm9kdWN0RmFtaWx5IiwgIlByb2R1Y3REZXBhcnRtZW50IiwgIlByb2R1Y3RDYXRlZ29yeSIsIA0KICAgICAgICAgICAgICAgIlVuaXRzU29sZCIsICJSZXZlbnVlIiksDQogIFlfTmdoaWEgPSBjKCJDaOG7iSBz4buRIGTDsm5nICh04buxIHNpbmgsIGPDsyB0aOG7gyBi4buPIHF1YSkiLA0KICAgICAgICAgICAgICAiTmfDoHkgbXVhIGjDoG5nIiwNCiAgICAgICAgICAgICAgIk3DoyBraMOhY2ggaMOgbmciLA0KICAgICAgICAgICAgICAiR2nhu5tpIHTDrW5oIGPhu6dhIGtow6FjaCBow6BuZyAoTSA9IE5hbSwgRiA9IE7hu68pIiwNCiAgICAgICAgICAgICAgIlTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiAoUyA9IMSQ4buZYyB0aMOibiwgTSA9IMSQw6Mga+G6v3QgaMO0bikiLA0KICAgICAgICAgICAgICAiQ8OzIHPhu58gaOG7r3UgbmjDoCBraMO0bmcgKFkgPSBDw7MsIE4gPSBLaMO0bmcpIiwNCiAgICAgICAgICAgICAgIlPhu5EgbMaw4bujbmcgY29uIGPhu6dhIGtow6FjaCBow6BuZyIsDQogICAgICAgICAgICAgICJN4bupYyB0aHUgbmjhuq1wIGjDoG5nIG7Eg20gKHbDrSBk4bulOiAkMzBLIC0gJDUwSykiLA0KICAgICAgICAgICAgICAiVGjDoG5oIHBo4buRIG7GoWkga2jDoWNoIGjDoG5nIHPhu5FuZyIsDQogICAgICAgICAgICAgICJCYW5nIGhv4bq3YyB04buJbmgiLA0KICAgICAgICAgICAgICAiUXXhu5FjIGdpYSAodHJvbmcgZmlsZSBsw6AgVVNBKSIsDQogICAgICAgICAgICAgICJOaMOzbSBz4bqjbiBwaOG6qW0gY2jDrW5oICh2w60gZOG7pTogRm9vZCwgRHJpbmspIiwNCiAgICAgICAgICAgICAgIlBow7JuZyBiYW4gc+G6o24gcGjhuqltICh2w60gZOG7pTogU25hY2sgRm9vZHMsIFByb2R1Y2UpIiwNCiAgICAgICAgICAgICAgIkRhbmggbeG7pWMgY2hpIHRp4bq/dCBz4bqjbiBwaOG6qW0gKHbDrSBk4bulOiBDYW5keSwgVmVnZXRhYmxlcykiLA0KICAgICAgICAgICAgICAiU+G7kSBsxrDhu6NuZyBz4bqjbiBwaOG6qW0gxJHDoyBiw6FuIiwNCiAgICAgICAgICAgICAgIkRvYW5oIHRodSB04burIMSRxqFuIGjDoG5nIChVU0QpIikNCikNCmxpYnJhcnkoa25pdHIpDQoNCmthYmxlKHZhcmlhYmxlX2V4cGxhaW4sIGNhcHRpb24gPSAiIEdp4bqjaSB0aMOtY2ggY8OhYyBiaeG6v24gdHJvbmcgZmlsZSBk4buvIGxp4buHdSIpDQoNCmBgYA0KDQoqKkvhur90IHF14bqjIHRo4buRbmcga8OqIG3DtCB04bqjKioNCg0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kb3B0aW9ucyhyZXBvcyA9IGMoQ1JBTiA9ICJodHRwczovL2Nsb3VkLnItcHJvamVjdC5vcmciKSkNCg0KaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKQ0KaW5zdGFsbC5wYWNrYWdlcygicmVhZHIiKQ0KaW5zdGFsbC5wYWNrYWdlcygic3RyaW5nciIpDQppbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQppbnN0YWxsLnBhY2thZ2VzKCJrYWJsZUV4dHJhIikNCiMjIyBO4bqhcCB0aMawIHZp4buHbg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHN0cmluZ3IpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQojIyMgxJDhu41jIGZpbGUgQ1NWIHbhu5tpIHTDqm4gJ2QnIChi4bqhbiDEkeG7lWkgxJHGsOG7nW5nIGThuqtuIG7hur91IGPhuqduKQ0KZCA8LSByZWFkLmNzdihmaWxlLmNob29zZSgpLCBoZWFkZXIgPSBUKQ0KcmVhZC5jc3YoZmlsZSA9ICcvVXNlcnMvVHV5ZXQgTmhpL0Rvd25sb2Fkcy9TdXBlcm1hcmtldCBUcmFuc2FjdGlvbnMuY3N2JykNCmBgYA0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShEVCkNCmRhdGF0YWJsZShkLCBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTApKQ0KDQoNCiMjIyDwn5OKIELhuqJORyAxOiBU4buVbmcgcXVhbg0KdG9uZ19xdWFuIDwtIGRhdGEuZnJhbWUoDQogIE3hu6VjID0gYygiU+G7kSBkw7JuZyIsICJT4buRIGPhu5l0IiwgDQogICAgICAgICAgIkJp4bq/biBk4bqhbmcgY2h14buXaSAoY2hhcmFjdGVyKSIsIA0KICAgICAgICAgICJCaeG6v24gZOG6oW5nIHPhu5EgKG51bWVyaWMpIiksDQogIMOdX25naMSpYSA9IGMoDQogICAgcGFzdGUwKG5yb3coZCksICIgZMOybmcgZOG7ryBsaeG7h3UgKGdpYW8gZOG7i2NoIHThuqFpIHNpw6p1IHRo4buLKSIpLA0KICAgIHBhc3RlMChuY29sKGQpLCAiIGPhu5l0IGJp4bq/biIpLA0KICAgIHBhc3RlMChuY29sKHNlbGVjdChkLCB3aGVyZShpcy5jaGFyYWN0ZXIpKSksICIgYmnhur9uIGThuqFuZyBjaHXhu5dpIiksDQogICAgcGFzdGUwKG5jb2woc2VsZWN0KGQsIHdoZXJlKGlzLm51bWVyaWMpKSksICIgYmnhur9uIGThuqFuZyBz4buRIikNCiAgKQ0KKQ0Ka2FibGUodG9uZ19xdWFuLCBjYXB0aW9uID0gIvCfk4ogVOG7lW5nIHF1YW4gZOG7ryBsaeG7h3UiKSAlPiUNCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpKQ0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQoNCiMjIyDwn5SgIELhuqJORyAyOiBCaeG6v24gZOG6oW5nIGNodeG7l2kNCg0KIyMjIELGsOG7m2MgMTogQ2jhu41uIGPDoWMgYmnhur9uIGThuqFuZyBjaHXhu5dpDQpjaGFyX3ZhcnMgPC0gc2VsZWN0KGQsIHdoZXJlKGlzLmNoYXJhY3RlcikpDQoNCiMjIyBCxrDhu5tjIDI6IFThuqFvIGLhuqNuZyBtw7QgdOG6oyB0aGVvIHTDqm4gYmnhur9uIChuYW1lZCB2ZWN0b3IpDQptb190YV9sb29rdXAgPC0gYygNCiAgUHVyY2hhc2VEYXRlID0gIk5nw6B5IGtow6FjaCBow6BuZyB0aOG7sWMgaGnhu4duIGdpYW8gZOG7i2NoIG11YSIsDQogIEdlbmRlciA9ICIyIGdp4bubaSB0w61uaCAoRiwgTSkiLA0KICBNYXJpdGFsU3RhdHVzID0gIlTDrG5oIHRy4bqhbmcgaMO0biBuaMOibjogxJDhu5ljIHRow6JuIChTKSBob+G6t2MgxJDDoyBr4bq/dCBow7RuIChNKSIsDQogIEhvbWVvd25lciA9ICJDw7MgbmjDoCAoWSkgaG/hurdjIGtow7RuZyAoTikiLA0KICBBbm51YWxJbmNvbWUgPSAiVGh1IG5o4bqtcCBo4buZIGdpYSDEkcOsbmggdGhlbyBraG/huqNuZyAoJEspIiwNCiAgQ2l0eSA9ICJUaMOgbmggcGjhu5EgbsahaSBraMOhY2ggaMOgbmcgc+G7kW5nICh+MjMgdGjDoG5oIHBo4buRKSIsDQogIFN0YXRlb3JQcm92aW5jZSA9ICJU4buJbmgvYmFuZyBuxqFpIGPGsCB0csO6ICh+MTAgYmFuZykiLA0KICBDb3VudHJ5ID0gIlF14buRYyBnaWEgKFVTQSwgQ2FuYWRhLCBNZXhpY28uLi4pIiwNCiAgUHJvZHVjdEZhbWlseSA9ICJOaMOzbSBz4bqjbiBwaOG6qW0gY2jDrW5oIChGb29kLCBEcmluaywgTm9uLUNvbnN1bWFibGVzKSIsDQogIFByb2R1Y3REZXBhcnRtZW50ID0gIlBow7JuZyBiYW4gc+G6o24gcGjhuqltICgyMiBsb+G6oWk6IFNuYWNrcywgUHJvZHVjZS4uLikiLA0KICBQcm9kdWN0Q2F0ZWdvcnkgPSAiRGFuaCBt4bulYyBz4bqjbiBwaOG6qW0gY2hpIHRp4bq/dCAoNDUgbG/huqFpOiBDYW5keSwgVmVnZXRhYmxlcy4uLikiDQopDQoNCiMjIyBCxrDhu5tjIDM6IFThuqFvIGLhuqNuZyB0aOG7kW5nIGvDqg0KY2hhcl9zdW1tYXJ5IDwtIGRhdGEuZnJhbWUoDQogIEJp4bq/biA9IG5hbWVzKGNoYXJfdmFycyksDQogIFPhu5FfZ2nDoV90cuG7i19raMOhY19uaGF1ID0gc2FwcGx5KGNoYXJfdmFycywgZnVuY3Rpb24oeCkgbGVuZ3RoKHVuaXF1ZSh4KSkpLA0KICDDnV9uZ2jEqWEgPSBtb190YV9sb29rdXBbbmFtZXMoY2hhcl92YXJzKV0NCikNCg0KIyMjIELGsOG7m2MgNDogR8OhbiBtw7QgdOG6oyBt4bq3YyDEkeG7i25oIG7hur91IHRoaeG6v3UNCmNoYXJfc3VtbWFyeSTDnV9uZ2jEqWFbaXMubmEoY2hhcl9zdW1tYXJ5JMOdX25naMSpYSldIDwtICLEkGFuZyBj4bqtcCBuaOG6rXQgbcO0IHThuqMuLi4iDQoNCiMjIyBCxrDhu5tjIDU6IEhp4buDbiB0aOG7iyBi4bqjbmcNCmthYmxlKGNoYXJfc3VtbWFyeSwgY2FwdGlvbiA9ICLwn5SgIEJp4bq/biBk4bqhbmcgY2h14buXaSAoY2hhcmFjdGVyKSIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkNCg0KDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCg0KIyMjIPCflKIgQuG6ok5HIDM6IEJp4bq/biBk4bqhbmcgc+G7kSAoc+G7rWEgxJHhuqd5IMSR4bunIGtow7RuZyB0aGnhur91IGJp4bq/biBuw6BvKQ0KDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KIyBCMTogRGFuaCBzw6FjaCBjw6FjIGJp4bq/biDEkeG7i25oIGzGsOG7o25nIGPhuqduIGdp4buvDQpxdWFudF92YXJzX2FsbCA8LSBjKA0KICAiQ3VzdG9tZXJJRCIsICJHZW5kZXIiLCAiTWFyaXRhbFN0YXR1cyIsICJIb21lb3duZXIiLCAiQ2hpbGRyZW4iLA0KICAiQW5udWFsSW5jb21lIiwgIlVuaXRzU29sZCIsICJSZXZlbnVlIiwgIlB1cmNoYXNlRGF0ZURheXMiLA0KICAiQ2l0eV9mcmVxIiwgIlN0YXRlb3JQcm92aW5jZV9mcmVxIiwgIkNvdW50cnlfZnJlcSIsDQogICJQcm9kdWN0RmFtaWx5X2ZyZXEiLCAiUHJvZHVjdERlcGFydG1lbnRfZnJlcSIsICJQcm9kdWN0Q2F0ZWdvcnlfZnJlcSINCikNCg0KIyBCMjogR2nhu68gbOG6oWkgbmjhu69uZyBiaeG6v24gY8OzIHRo4buxYyB0cm9uZyBkYXRhc2V0DQpxdWFudF92YXJzIDwtIGludGVyc2VjdChxdWFudF92YXJzX2FsbCwgY29sbmFtZXMoZCkpDQoNCiMgQjM6IMOJcCBs4bqhaSB0b8OgbiBi4buZIGPDoWMgYmnhur9uIHbhu4EgbnVtZXJpYw0KZFtxdWFudF92YXJzXSA8LSBsYXBwbHkoZFtxdWFudF92YXJzXSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoeCkpKQ0KDQojIEI0OiBU4bqhbyBi4bqjbmcgdGjhu5FuZyBrw6oNCm51bV9zdW1tYXJ5IDwtIGRhdGEuZnJhbWUoDQogIEJp4bq/biA9IHF1YW50X3ZhcnMsDQogIE1lYW4gPSByb3VuZChzYXBwbHkoZFtxdWFudF92YXJzXSwgbWVhbiwgbmEucm0gPSBUUlVFKSwgMiksDQogIFNEICAgPSByb3VuZChzYXBwbHkoZFtxdWFudF92YXJzXSwgc2QsIG5hLnJtID0gVFJVRSksIDIpDQopDQoNCiMgQjU6IFRow6ptIG3DtCB04bqjIMO9IG5naMSpYQ0KbW9fdGFfbG9va3VwIDwtIGMoDQogIEN1c3RvbWVySUQgPSAiTcOjIGtow6FjaCBow6BuZyBkdXkgbmjhuqV0IiwNCiAgR2VuZGVyID0gIkdp4bubaSB0w61uaCDEkcOjIG3DoyBob8OhIChGID0gMCwgTSA9IDEpIiwNCiAgTWFyaXRhbFN0YXR1cyA9ICJUw6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gxJHDoyBtw6MgaG/DoSAoUyA9IDAsIE0gPSAxKSIsDQogIEhvbWVvd25lciA9ICJT4bufIGjhu691IG5ow6AgxJHDoyBtw6MgaG/DoSAoTiA9IDAsIFkgPSAxKSIsDQogIENoaWxkcmVuID0gIlRydW5nIGLDrG5oIG3hu5dpIGtow6FjaCBjw7MgMuKAkzMgY29uIiwNCiAgQW5udWFsSW5jb21lID0gIlRodSBuaOG6rXAgaOG7mSBnaWEgxJHDrG5oICjEkcOjIGNodXnhu4NuIHThu6sga2hv4bqjbmcgc2FuZyBz4buRIHRydW5nIGLDrG5oKSIsDQogIFVuaXRzU29sZCA9ICJN4buXaSBnaWFvIGThu4tjaCBiw6FuIH40IMSRxqFuIHbhu4sgc+G6o24gcGjhuqltIiwNCiAgUmV2ZW51ZSA9ICJN4buXaSBnaWFvIGThu4tjaCB04bqhbyByYSB0cnVuZyBiw6xuaCB+MTMgVVNEIiwNCiAgUHVyY2hhc2VEYXRlRGF5cyA9ICJT4buRIG5nw6B5IGvhu4MgdOG7qyBt4buRYyAxOC8xMi8yMDA3IiwNCiAgQ2l0eV9mcmVxID0gIlThuqduIHN14bqldCB0aMOgbmggcGjhu5EgeHXhuqV0IGhp4buHbiIsDQogIFN0YXRlb3JQcm92aW5jZV9mcmVxID0gIlThuqduIHN14bqldCB04buJbmgvYmFuZyB4deG6pXQgaGnhu4duIiwNCiAgQ291bnRyeV9mcmVxID0gIlThuqduIHN14bqldCBxdeG7kWMgZ2lhIHh14bqldCBoaeG7h24iLA0KICBQcm9kdWN0RmFtaWx5X2ZyZXEgPSAiVOG6p24gc3XhuqV0IG5ow7NtIHPhuqNuIHBo4bqpbSIsDQogIFByb2R1Y3REZXBhcnRtZW50X2ZyZXEgPSAiVOG6p24gc3XhuqV0IHBow7JuZyBiYW4gc+G6o24gcGjhuqltIiwNCiAgUHJvZHVjdENhdGVnb3J5X2ZyZXEgPSAiVOG6p24gc3XhuqV0IGxv4bqhaSBz4bqjbiBwaOG6qW0gY2hpIHRp4bq/dCINCikNCg0KIyBCNjogR+G6r24gbcO0IHThuqMNCm51bV9zdW1tYXJ5JEdp4bqjaV90aMOtY2ggPC0gbW9fdGFfbG9va3VwW251bV9zdW1tYXJ5JEJp4bq/bl0NCm51bV9zdW1tYXJ5JEdp4bqjaV90aMOtY2hbaXMubmEobnVtX3N1bW1hcnkkR2nhuqNpX3Row61jaCldIDwtICLEkGFuZyBj4bqtcCBuaOG6rXQgbcO0IHThuqMuLi4iDQoNCiMgQjc6IEhp4buDbiB0aOG7iyBi4bqjbmcgxJHhurlwDQprYWJsZShudW1fc3VtbWFyeSwgY2FwdGlvbiA9ICLwn5SiIEJp4bq/biBk4bqhbmcgc+G7kSAobnVtZXJpYyAtIMSR4bqneSDEkeG7pywgc+G6oWNoIHPhur0pIikgJT4lDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFLCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSkNCg0KYGBgDQoNCg0KDQoqKipUaOG7kW5nIGvDqiBtw7QgdOG6oyAqKioNCg0KLSBUaOG7sWMgaGnhu4duIHTDrW5oIHRvw6FuIGPDoWMgdGjhu5FuZyBrw6ogbcO0IHThuqMgKGJhbyBn4buTbSBnacOhIHRy4buLIHRydW5nIGLDrG5oLCDEkeG7mSBs4buHY2ggY2h14bqpbiwgZ2nDoSB0cuG7iyBuaOG7jyBuaOG6pXQsIGzhu5tuIG5o4bqldCB2w6AgY8OhYyBwaMOibiB24buLKSBjaG8gY8OhYyBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyB0cm9uZyB04bqtcCBk4buvIGxp4buHdS4gDQoNCi0gQ8OhYyBiaeG6v24gY+G6p24gcGjDom4gdMOtY2ggYmFvIGfhu5NtOiBDdXN0b21lcklELCBHZW5kZXIsIE1hcml0YWxTdGF0dXMsIEhvbWVvd25lciwgQ2hpbGRyZW4sIEFubnVhbEluY29tZSwgVW5pdHNTb2xkLCBSZXZlbnVlLCBQdXJjaGFzZURhdGVEYXlzLCBjw7luZyB24bubaSBjw6FjIGJp4bq/biBwaOG6o24gw6FuaCB04bqnbiBzdeG6pXQgbXVhIGjDoG5nLg0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQojIyMgRGFuaCBzw6FjaCBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyAoZMO5IGPDsyB0aOG7gyBjaMawYSDEkeG7pyB0cm9uZyBkKQ0KcXVhbnRfdmFyc19hbGwgPC0gYygiQ3VzdG9tZXJJRCIsICJHZW5kZXIiLCAiTWFyaXRhbFN0YXR1cyIsICJIb21lb3duZXIiLCAiQ2hpbGRyZW4iLA0KICAgICAgICAgICAgICAgICAgICAiQW5udWFsSW5jb21lIiwgIlVuaXRzU29sZCIsICJSZXZlbnVlIiwgIlB1cmNoYXNlRGF0ZURheXMiLA0KICAgICAgICAgICAgICAgICAgICAiQ2l0eV9mcmVxIiwgIlN0YXRlb3JQcm92aW5jZV9mcmVxIiwgIkNvdW50cnlfZnJlcSIsDQogICAgICAgICAgICAgICAgICAgICJQcm9kdWN0RmFtaWx5X2ZyZXEiLCAiUHJvZHVjdERlcGFydG1lbnRfZnJlcSIsICJQcm9kdWN0Q2F0ZWdvcnlfZnJlcSIpDQoNCiMjIyBHaeG7ryBs4bqhaSBiaeG6v24gdGjhu7FjIHPhu7EgdOG7k24gdOG6oWkgdHJvbmcgZA0KcXVhbnRfdmFycyA8LSBpbnRlcnNlY3QocXVhbnRfdmFyc19hbGwsIGNvbG5hbWVzKGQpKQ0KDQojIyMgw4lwIHThuqV0IGPhuqMgY8OhYyBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyB0aMOgbmggbnVtZXJpYw0KZFtxdWFudF92YXJzXSA8LSBsYXBwbHkoZFtxdWFudF92YXJzXSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoeCkpKQ0KDQojIyMgVMOtbmggdGjhu5FuZyBrw6ogbcO0IHThuqMsIHhvYXkgYuG6o25nLCBsb+G6oWkgZMOybmcgdG/DoG4gTkEgLyBOYU4gLyBJbmYNCnN1bW1hcnlfc3RhdHMgPC0gZCAlPiUNCiAgc2VsZWN0KGFsbF9vZihxdWFudF92YXJzKSkgJT4lDQogIHN1bW1hcmlzZShhY3Jvc3MoZXZlcnl0aGluZygpLCBsaXN0KA0KICAgIE1lYW4gICA9IH5tZWFuKC4sIG5hLnJtID0gVFJVRSksDQogICAgU3RkRGV2ID0gfnNkKC4sIG5hLnJtID0gVFJVRSksDQogICAgTWluICAgID0gfm1pbiguLCBuYS5ybSA9IFRSVUUpLA0KICAgIFExICAgICA9IH5xdWFudGlsZSguLCAwLjI1LCBuYS5ybSA9IFRSVUUpLA0KICAgIE1lZGlhbiA9IH5xdWFudGlsZSguLCAwLjUsIG5hLnJtID0gVFJVRSksDQogICAgUTMgICAgID0gfnF1YW50aWxlKC4sIDAuNzUsIG5hLnJtID0gVFJVRSksDQogICAgTWF4ICAgID0gfm1heCguLCBuYS5ybSA9IFRSVUUpDQogICksIC5uYW1lcyA9ICJ7LmNvbH1fey5mbn0iKSkgJT4lDQogIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gYygiQmnhur9uIiwgIi52YWx1ZSIpLCBuYW1lc19zZXAgPSAiXyIpICU+JQ0KICByZWxvY2F0ZShCaeG6v24pICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIGZpbHRlcihhbnkoIWlzLm5hKGNfYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpKSkgJiBpcy5maW5pdGUoY19hY3Jvc3Mod2hlcmUoaXMubnVtZXJpYykpKSkpICU+JQ0KICB1bmdyb3VwKCkNCg0KIyMjIEhp4buDbiB0aOG7iyBi4bqjbmcgc+G6oWNoLCDEkeG6uXAsIGN14buZbiDEkcaw4bujYw0Ka2FibGUoc3VtbWFyeV9zdGF0cywgY2FwdGlvbiA9ICLwn5OKIELhuqNuZyB0aOG7kW5nIGvDqiBtw7QgdOG6oyBjw6FjIGJp4bq/biDEkeG7i25oIGzGsOG7o25nIikgJT4lDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFLCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSkgJT4lDQogIHNjcm9sbF9ib3god2lkdGggPSAiMTAwJSIsIGhlaWdodCA9ICI0MDBweCIpDQoNCg0KYGBgDQoNCg0K