PHẦN 1

CHƯƠNG 1: MÔ HÌNH THỐNG KÊ

1.1 Giới thiệu và tổng quan

Chương đầu tiên mở đầu cho cuốn sách bằng cách giới thiệu tổng quan về mô hình thống kê, trong đó mô hình tuyến tính tổng quát (Generalized Linear Model – GLM) đóng vai trò cốt lõi xuyên suốt nội dung. Chương này đặt nền tảng cho người học thông qua việc giải thích các khái niệm cơ bản, ký hiệu sử dụng trong mô hình và những vấn đề then chốt cần lưu ý khi làm việc với dữ liệu.

Một trong những nội dung quan trọng được đề cập là cách biểu diễn dữ liệu bằng ngôn ngữ toán học – bước đầu tiên để xây dựng mô hình có thể xử lý được. Bên cạnh đó, chương cũng nhấn mạnh vai trò của việc trực quan hóa dữ liệu thông qua biểu đồ nhằm phát hiện các xu hướng, mối quan hệ và đặc điểm nổi bật.

Việc xử lý các biến không định lượng, như biến phân loại hay dạng văn bản, cũng được trình bày thông qua kỹ thuật mã hóa, giúp chuyển chúng về dạng số để đưa vào mô hình. Từ đó, người đọc được làm quen với cấu trúc cơ bản của một mô hình thống kê, bao gồm hai thành phần: hệ thống (đại diện cho quy luật xác định) và ngẫu nhiên (đại diện cho phần biến thiên không giải thích được).

Tiếp theo, chương giới thiệu nhóm mô hình hồi quy – công cụ phân tích chính được sử dụng xuyên suốt cuốn sách – và hướng dẫn cách diễn giải kết quả của mô hình một cách có ý nghĩa. Bên cạnh đó, tác giả đưa ra so sánh giữa mô hình thống kê và mô hình vật lý để giúp người đọc hiểu rõ sự tương đồng và khác biệt giữa hai cách tiếp cận.

Ngoài ra, chương cũng làm rõ mục tiêu của mô hình thống kê trong việc mô tả, giải thích và dự đoán hiện tượng, đồng thời chỉ ra hai tiêu chí quan trọng để đánh giá mô hình: độ chính xác và tính đơn giản. Một số hạn chế của mô hình thống kê cũng được bàn đến, đặc biệt là sự khác biệt giữa dữ liệu quan sát (observational data) và dữ liệu thực nghiệm (experimental data), cùng với những tác động của chúng đến việc suy luận.

Khái niệm về khả năng khái quát hóa của mô hình – tức mức độ mà mô hình có thể áp dụng cho các dữ liệu hoặc tình huống mới – cũng được nhấn mạnh như một yếu tố thiết yếu trong phân tích thống kê. Cuối cùng, chương khép lại bằng phần giới thiệu cơ bản về phần mềm R, công cụ sẽ được sử dụng trong suốt cuốn sách để minh họa và thực hành các mô hình thống kê.

1.2 Các quy ước để mô tả dữ liệu

Dữ liệu toán học: biến phản hồi \(y\), biến giải thích \(x_1, x_2, \ldots, x_p\).

Phân loại biến

  • Covariates: biến định lượng
  • Factors: biến định tính

1.3 Vẽ biểu đồ

Plotting Data - Vẽ biểu đồ - Dùng đồ thị như scatter plots, strip charts, boxplots để phát hiện xu hướng, outlier.

1.4 Mã hóa biến phân loạiloại

Coding for Factors - Mã hóa biến phân loại

  • Biến giả (Dummy variables): dùng \(k-1\) biến giả cho một yếu tố có \(k\) mức.

  • R mặc định sử dụng mã hóa “treatment coding”

1.5 Statistical Models Describe Both Random and Systematic Features of Data

Statistical Models Describe Both Random and Systematic Features of Data - Mô hình thống kê mô tả cả yếu tố ngẫu nhiên và có hệ thống của dữ liệu

  • Thành phần hệ thống: mô tả trung bình của phản hồi \(E(y) = μ = β₀ + β₁x₁ + ... + βₚxₚ\)

  • Thành phần ngẫu nhiên (Random): \(Var(y) = σ²\)

  • Thành phần ngẫu nhiên (random component) mô tả phân phối giá trị phản hồi ứng với mỗi tổ hợp biến giải thích.

  • Thành phần hệ thống (systematic component) mô tả mối quan hệ toán học giữa trung bình phản hồi và các biến giải thích (chiều cao, tuổi, giới tính, hút thuốc).

  • Mô hình thống kê = thành phần ngẫu nhiên + thành phần hệ thống, mô tả cả hai đặc điểm của dữ liệu thực tế.

Phổ biến nhất là khi mô hình tuyến tính trong các tham số:

\[ \mu_i = f(\beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip}) \tag{1.5} \]

Các dạng mô hình hồi quy:

  • Mô hình hồi quy tuyến tính: thành phần hệ thống có dạng:

\[ E[y_i] = \mu_i = \beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip} \tag{1.6} \]

  • Mô hình hồi quy tuyến tính tổng quát (GLM): thành phần hệ thống có dạng:

\[ \mu_i = g^{-1}(\beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip}) \]

hoặc:

\[ g(\mu_i) = \beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip} \]

Trong đó \(g(\cdot)\) là một hàm liên kết đơn điệu (chẳng hạn như hàm logarit).

Một số quy ước:

  • Số lượng biến giải thích: \(x_1, x_2, \ldots, x_p\).
  • Số lượng tham số hồi quy: \(\beta_0, \beta_1, \ldots, \beta_p\).
  • Nếu \(\beta_0\) không đổi và phần còn lại là \(x_j\) thì số lượng biến giải thích là \(p\), số lượng tham số là \(p + 1\).

Các mô hình hồi quy tuyến tính là trường hợp đặc biệt của mô hình hồi quy tuyến tính tổng quát, với hàm liên kết \(g\) là hàm đồng nhất.

CHƯƠNG 2: MÔ HÌNH HỒI QUY TUYẾN TÍNH - LINEAR REGREESSION MODELS

2.1: Introduction and Overview

Tóm tắt nội dung

  • Linear regression model là mô hình hồi quy phổ biến nhất trong thống kê và là trọng tâm mở đầu của chương 2.
  • Chương này thiết lập ngôn ngữ, ký hiệu và giả định cơ bản cho tất cả người đọc trước khi chuyển sang mô hình tổng quát hơn – generalized linear models (GLMs).
  • Linear regression models được xem như một trường hợp đặc biệt của GLMs.

2.2 Linear Regression Models Defined

Cấu trúc cơ bản của mô hình hồi quy tuyến tính

Linear regression model gồm 2 thành phần chính:

  • Thành phần ngẫu nhiên (random component):
    • Giả định phương sai của phản hồi \(y_i\) là không đổi:
      \[ \text{var}[y_i] = \sigma^2 / w_i \]
    • \(w_i\)trọng số ưu tiên đã biết (prior weights). Nếu \(w_i = 1\) với mọi \(i\), mô hình được gọi là hồi quy tuyến tính thường (ordinary linear regression).
  • Thành phần hệ thống (systematic component):
    • Kỳ vọng của \(y_i\) là kết hợp tuyến tính của các biến giải thích: \[ \mu_i = E[y_i] = \beta_0 + \sum_{j=1}^{p} \beta_j x_{ji} \]

Phân loại mô hình

  • Simple linear regression: khi chỉ có 1 biến giải thích \((p = 1)\).
  • Multiple linear regression: khi có nhiều hơn 1 biến giải thích \((p > 1)\).
  • Weighted linear regression: khi các trọng số \(w_i\) khác nhau.
  • Ordinary linear regression: khi mọi trọng số \(w_i = 1\).

Các giả định chính

  • Phù hợp (Suitability): Cùng một mô hình áp dụng cho mọi quan sát.
  • Tuyến tính (Linearity): Quan hệ giữa kỳ vọng \(\mu\) và biến giải thích là tuyến tính.
  • Phương sai không đổi (Constant variance): Phương sai \(\sigma^2\) là không đổi (hoặc tỷ lệ với \(1/w_i\)).
  • Độc lập (Independence): Các phản hồi \(y_i\) là độc lập với nhau.

Ví dụ minh họa

  • Dữ liệu cân nặng sơ sinh theo tuần tuổi thai kỳ từ bệnh viện St George’s (London) được dùng để minh họa mô hình hồi quy tuyến tính giữa cân nặng và tuần tuổi.

2.3 Simple Linear Regression

2.3.1 Least-Squares Estimation

  • Mô hình hồi quy tuyến tính đơn có dạng:

\[ \mu_i = E[y_i] = \beta_0 + \beta_1 x_i,\quad \text{Var}[y_i] = \sigma^2 / w_i \]

  • Tổng sai số bình phương có trọng số cần tối thiểu hóa:

\[ S(\beta_0, \beta_1) = \sum_{i=1}^n w_i (y_i - \beta_0 - \beta_1 x_i)^2 \]

2.3.2 Coefficient Estimates

  • Trung bình có trọng số:

\[ \bar{x}_w = \frac{\sum_{i=1}^{n} w_i x_i}{\sum_{i=1}^{n} w_i},\quad \bar{y}_w = \frac{\sum_{i=1}^{n} w_i y_i}{\sum_{i=1}^{n} w_i} \]

  • Ước lượng hệ số:

\[ \hat{\beta}_1 = \frac{\sum_{i=1}^n w_i (x_i - \bar{x}_w)(y_i)}{\sum_{i=1}^n w_i (x_i - \bar{x}_w)^2} \]

\[ \hat{\beta}_0 = \bar{y}_w - \hat{\beta}_1 \bar{x}_w \]

2.3.3 Estimating the Variance \(\sigma^2\)

  • Phần dư:

\[ e_i = y_i - \hat{\mu}_i = y_i - \hat{\beta}_0 - \hat{\beta}_1 x_i \]

  • Tổng bình phương phần dư (RSS):

\[ \text{RSS} = \sum_{i=1}^n w_i e_i^2 \]

  • Ước lượng không chệch của phương sai:

\[ s^2 = \frac{\text{RSS}}{n - 2} \]

2.3.4 Standard Errors of Coefficients

  • Phương sai và sai số chuẩn của \(\hat{\beta}_1\):

\[ \text{Var}[\hat{\beta}_1] = \frac{\sigma^2}{\sum_{i=1}^n w_i (x_i - \bar{x}_w)^2} \]

\[ \text{SE}[\hat{\beta}_1] = \sqrt{ \frac{s^2}{\sum_{i=1}^n w_i (x_i - \bar{x}_w)^2} } \]

  • Sai số chuẩn của \(\hat{\beta}_0\):

\[ \text{SE}[\hat{\beta}_0] = \sqrt{ s^2 \left( \frac{1}{\sum w_i} + \frac{\bar{x}_w^2}{\sum w_i (x_i - \bar{x}_w)^2} \right) } \]

2.3.5 Standard Errors of Fitted Values

  • Sai số chuẩn của giá trị dự đoán:

\[ \hat{\mu}_i = \hat{\beta}_0 + \hat{\beta}_1 x_i \]

\[ \text{SE}[\hat{\mu}_i] = s \cdot \sqrt{ \frac{1}{\sum w_i} + \frac{(x_i - \bar{x}_w)^2}{\sum w_i (x_i - \bar{x}_w)^2} } \]

Tổng kết

  • Hồi quy tuyến tính đơn là bước đầu cơ bản trong phân tích hồi quy. Việc ước lượng hệ số, phương sai và sai số chuẩn cho phép đánh giá mức độ tin cậy của mô hình. Các công thức trên là nền tảng để mở rộng sang hồi quy tuyến tính bội và generalized linear models.

Ghi nhớ: Kiểm tra các giả định của mô hình là rất quan trọng: tuyến tính, phương sai không đổi, độc lập và mô hình áp dụng phù hợp cho toàn bộ mẫu.

2.4 Ước lượng trong hồi quy bội (nhiều biến)

Dạng ma trận của mô hình:

Mô hình hồi quy tuyến tính có thể được viết dưới dạng ma trận:

\[ y = X\beta + \varepsilon \] Trong đó:

  • \(y\): vector phản hồi (cỡ \(n \times 1\))
  • \(X\): ma trận thiết kế (design matrix) kích thước \(n \times (p+1)\), với cột đầu tiên toàn số 1 (ứng với hệ số chặn \(\beta_0\)), các cột còn lại là giá trị của các biến giải thích \(x_j\)
  • \(\beta\): vector hệ số hồi quy (cỡ \((p+1) \times 1\))
  • \(\varepsilon \sim \mathcal{N}(0, \sigma^2 I)\): vector nhiễu có phân phối chuẩn đa biến với trung bình 0 và phương sai \(\sigma^2 I\)

Ước lượng OLS:

\[ \hat{\beta} = (X^T W X)^{-1} X^T W y \]

Phần dư và phương sai ước lượng:

  • Giá trị dự đoán (fitted values):

\[ \hat{\mu}_i = \hat{y}_i = \hat{\beta}_0 + \sum_{j=1}^{p} \hat{\beta}_j x_{ji} \]

  • Ước lượng phương sai phần dư:

\[ s^2 = \frac{RSS}{n - p'} \]

CHƯƠNG 3: CHẨN ĐOÁN MÔ HÌNH HỒI QUY TUYẾN TÍNH

Linear Regression Models: Diagnostics and Model-Building (Chẩn đoán mô hình hồi quy tuyến tính)

3.1. Giới thiệu và tổng quan

Sau khi xây dựng một mô hình hồi quy tuyến tính, công việc không kết thúc ở việc ước lượng các hệ số hồi quy và kiểm định ý nghĩa thống kê. Một bước quan trọng không thể thiếu là chẩn đoán mô hình – tức là đánh giá xem mô hình đã được xây dựng có thực sự phù hợp với dữ liệu hay không.

Chẩn đoán mô hình hồi quy là một phần thiết yếu trong phân tích dữ liệu vì nó giúp ta:

  • Xác minh các giả định cơ bản của mô hình hồi quy tuyến tính có được thỏa mãn hay không (ví dụ như quan hệ tuyến tính, phương sai không đổi, phân phối chuẩn…).

  • Phát hiện những quan sát bất thường như điểm ngoại lai (outliers) hoặc điểm có ảnh hưởng lớn (influential observations) – những điểm có thể bóp méo kết quả ước lượng hoặc kiểm định.

  • Đánh giá độ tin cậy của các hệ số ước lượng.

Đề xuất cách cải thiện mô hình, ví dụ: biến đổi biến, thêm hoặc bớt biến giải thích, sử dụng mô hình phi tuyến hoặc tổng quát (GLM) thay thế.

Nếu bỏ qua bước này, người phân tích dễ rơi vào bẫy của việc “phù hợp quá mức” (overfitting), hiểu sai mối quan hệ giữa các biến, hoặc dự đoán sai lệch trong thực tế. Do đó, chẩn đoán mô hình không phải là tùy chọn – mà là một phần bắt buộc trong phân tích hồi quy nghiêm túc.

Trong chương này, chúng ta sẽ học cách:

  • Kiểm tra các giả định của mô hình hồi quy.

  • Sử dụng phần dư (residuals) để kiểm tra độ phù hợp.

  • Phát hiện và xử lý các điểm ảnh hưởng lớn.

  • Đo lường hiện tượng đa cộng tuyến và cách giảm thiểu.

3.2 Giả định trong mô hình hồi quy tuyến tính

Một mô hình hồi quy tuyến tính tiêu chuẩn đòi hỏi phải thỏa mãn 4 giả định cơ bản:

1. Giả định 1: Quan hệ tuyến tính

  • Mô hình giả định rằng trung bình của biến phản hồi \(y\) là hàm tuyến tính của các biến giải thích \(x_1, x_2, \ldots, x_p\).

  • Nếu quan hệ thật sự là phi tuyến mà ta vẫn dùng mô hình tuyến tính, kết quả ước lượng có thể bị thiên lệch và dự đoán sai.

\(\Rightarrow\) Cách kiểm tra: vẽ biểu đồ phần dư so với giá trị dự đoán, nếu thấy xu hướng cong (parabola, S-shape…) thì có thể là mô hình sai dạng.

2. Giả định 2: Phương sai không đổi (Homoscedasticity)

  • Phương sai của sai số \(\varepsilon_i\) là như nhau ở mọi mức giá trị của \(x\):

\[ \text{Var}(y_i) = \sigma^2 \]

  • Nếu phương sai thay đổi theo \(x\), ta có hiện tượng phương sai thay đổi (heteroscedasticity), dẫn đến ước lượng không hiệu quả và sai lệch trong kiểm định.

\(\Rightarrow\) Cách kiểm tra: vẽ đồ thị phần dư. Nếu phần dư có dạng hình nón (rộng dần hoặc hẹp lại) thì có thể bị heteroscedasticity.

3. Giả định 3: Độc lập

  • Các quan sát \((x_i, y_i)\) phải độc lập nhau.

  • Nếu dữ liệu có tính chuỗi thời gian, dữ liệu lồng ghép (nested data) hoặc phân nhóm (clustered), thì mô hình tuyến tính cơ bản không còn phù hợp.

\(\Rightarrow\) Cách kiểm tra: nếu dữ liệu theo thời gian, nên kiểm tra phần dư có xu hướng (autocorrelation) hay không.

4. Giả định 4: Phân phối chuẩn của sai số

  • Mặc dù không bắt buộc để ước lượng OLS, giả định này rất quan trọng để kiểm định giả thuyết và tính khoảng tin cậy: \[ \varepsilon_i \sim \mathcal{N}(0, \sigma^2) \]

\(\Rightarrow\) Cách kiểm tra: dùng biểu đồ Q-Q plot (quantile-quantile) để so sánh phần dư với phân phối chuẩn.

3.3 Các loại phần dư (Residuals)

Phần dư là công cụ trung tâm để chẩn đoán mô hình. Có nhiều cách tính phần dư:

1. Raw residual (Phần dư thô):

\[ e_i = y_i - \hat{y}_i \] Đơn giản là hiệu giữa giá trị thực tế và giá trị dự đoán.

2. Standardized residual (Phần dư chuẩn hóa):

\[ r_i = \frac{e_i}{\hat{\sigma} \sqrt{1 - h_{ii}}} \]

  • Giúp so sánh phần dư giữa các điểm có leverage khác nhau.

  • \(h_{ii}\): leverage – mức ảnh hưởng của điểm \(i\) lên dự đoán \(\hat{y}_i\).

3. Studentized residual:

\[ t_i = \frac{e_i}{\hat{\sigma}_{(i)} \sqrt{1 - h_{ii}}} \]

  • Giống standardized residual nhưng dùng \(\hat{\sigma}_{(i)}\) – phương sai ước lượng không dùng quan sát \(i\) \(\rightarrow\) chính xác hơn.

  • Dùng để phát hiện ngoại lai vì nó gần với phân phối t.

3.4 Biểu đồ phần dư (Residual Plots)

Một số biểu đồ quan trọng:

  • Residual vs Fitted Plot: kiểm tra tuyến tính và phương sai không đổi.

  • Normal Q-Q Plot: kiểm tra phân phối chuẩn của phần dư.

  • Scale-Location Plot: chuẩn hóa phần dư để dễ phát hiện heteroscedasticity.

  • Residuals vs Leverage Plot: xác định điểm ảnh hưởng lớn.

3.5 Ngoại lai (Outliers)

Định nghĩa: Là các điểm dữ liệu mà giá trị phản hồi \(y_i\) khác biệt lớn so với dự đoán từ mô hình, dù biến \(x_i\) không bất thường.

Dùng studentized residual để kiểm tra.

Quy tắc ngưỡng:

  • \(|t_i| > 2\): nghi ngờ.

  • \(|t_i| > 3\): có thể là ngoại lai đáng kể.

\(\Rightarrow\) Ngoại lai không nhất thiết có ảnh hưởng lớn, nhưng cần kiểm tra kỹ. ## CHƯƠNG 4: ƯỚC LƯỢNG HỢP LÝ TỐI ĐA Maximum likehood estimation - MLE (ước lượng hợp lý tối đa)

4.1 Giới thiệu

Phương pháp bình phương tối thiểu (OLS) chỉ hoạt động hiệu quả khi dữ liệu thỏa mãn các giả định như phân phối chuẩn, phương sai không đổi, và biến phản hồi liên tục. Tuy nhiên, nhiều loại dữ liệu thực tế không tuân theo những điều kiện đó – ví dụ: dữ liệu nhị phân, đếm, hoặc dương liên tục. Khi đó, Maximum Likelihood Estimation (MLE) là phương pháp mạnh mẽ hơn, dùng để ước lượng các tham số trong mô hình tổng quát.

MLE là nền tảng cho mô hình tuyến tính tổng quát (GLM), vốn là trung tâm của phần còn lại trong sách.

4.2 Hàm hợp lý (Likelihood Function)

Định nghĩa: Hàm hợp lý là một hàm xác suất của toàn bộ dữ liệu đã quan sát, biểu diễn như một hàm của tham số \(\theta\).

Giả sử ta có một mẫu gồm \(n\) quan sát độc lập \(y_1, y_2, \ldots, y_n\), với mỗi \(y_i\) có phân phối xác suất \(f(y_i; \theta)\), thì:

Hàm hợp lý:

\[ L(\theta) = \prod_{i=1}^{n} f(y_i; \theta) \]

  • \(L(\theta)\): hàm hợp lý

  • \(\theta\): vector các tham số cần ước lượng

  • \(f(y_i; \theta)\): mật độ xác suất (hoặc khối xác suất) của \(y_i\)

Log-hợp lý (log-likelihood):

\[ \ell(\theta) = \log L(\theta) = \sum_{i=1}^{n} \log f(y_i; \theta) \]

  • Dễ đạo hàm hơn vì tích thành tổng.

  • Giá trị cực đại của \(\ell(\theta)\) trùng với \(L(\theta)\).

4.3 Ước lượng hợp lý tối đa (Maximum Likelihood Estimation – MLE)

Định nghĩa: MLE là giá trị \(\hat{\theta}\) của tham số \(\theta\) sao cho log-likelihood đạt cực đại.

\[ \hat{\theta} = \arg\max_{\theta} \, \ell(\theta) \] Để tìm \(\hat{\theta}\), ta giải:

\[ \frac{d\ell(\theta)}{d\theta} = 0 \]

\(\Rightarrow\) Đây gọi là phương trình điểm (score equation).

4.4 Ma trận thông tin Fisher và phương sai

1. Hàm điểm (Score Function):

\[ U(\theta) = \frac{d\ell(\theta)}{d\theta} \]

  • \(U(\theta)\): độ dốc của log-likelihood theo \(\theta\)

2. Ma trận thông tin Fisher:

\[ I(\theta) = -\mathbb{E} \left[ \frac{d^2 \ell(\theta)}{d\theta^2} \right] \]

  • \(I(\theta)\): kỳ vọng âm của đạo hàm bậc hai log-likelihood → đo độ cong.

  • Là xấp xỉ ngược lại của phương sai: \[ \mathrm{Var}(\hat{\theta}) \approx \frac{1}{I(\theta)} \]

4.5 Các tính chất của MLE

MLE có nhiều tính chất tốt về mặt lý thuyết, đặc biệt khi kích thước mẫu n lớn:

Tính chất Giải thích
Nhất quán \(\hat{\theta} \to \theta\) khi \(n \to \infty\)
Không chệch tiệm cận Độ lệch giữa \(\hat{\theta}\)\(\theta\) tiến về 0
Hiệu quả MLE đạt giới hạn Cramér–Rao, là ước lượng “tốt nhất”
Tiệm cận chuẩn Khi \(n\) lớn, phân phối của \(\hat{\theta}\) gần chuẩn: \(\hat{\theta} \sim \mathcal{N}(\theta, I(\theta)^{-1})\)

CHƯƠNG 5: CẤU TRÚC CỦA MÔ HÌNH TUYẾN TÍNH TỔNG QUÁT (GLM STRUCTURE)

5.1 Giới thiệu

Mô hình tuyến tính tổng quát (GLM) là một khuôn khổ mạnh mẽ cho việc mô hình hóa các loại dữ liệu khác nhau – không chỉ dữ liệu liên tục có phân phối chuẩn như trong hồi quy tuyến tính. GLM bao gồm hồi quy logistic, hồi quy Poisson, hồi quy Gamma… và mở rộng khả năng phân tích đến dữ liệu nhị phân, đếm, tỷ lệ và dương liên tục.

Mỗi GLM được xây dựng trên cùng một nguyên lý chung gồm ba thành phần chính: phân phối xác suất, hàm liên kết, và thành phần tuyến tính.

5.2 Cấu trúc 3 phần của GLM

1. Thành phần ngẫu nhiên (Random component)

Biến phản hồi \(y_i\) được giả định phân phối theo một phân phối thuộc họ hàm mũ một tham số (One-Parameter Exponential Family):

\[ f(y_i; \theta_i, \phi) = \exp \left\{ \frac{y_i \theta_i - b(\theta_i)}{\phi} + c(y_i, \phi) \right\} \]

  • Ý nghĩa các ký hiệu:

    • \(\theta_i\): tham số tự nhiên (natural parameter)
    • \(\phi\): tham số phân tán (dispersion parameter), không phải lúc nào cũng có (ví dụ Poisson thì \(\phi = 1\))
    • \(b(\theta_i)\): hàm log partition
    • \(c(y_i, \phi)\): hàm chuẩn hóa để bảo toàn tích phân bằng 1

→ Họ hàm mũ bao gồm Normal, Poisson, Binomial, Gamma,…

2. Thành phần hệ thống (Systematic component)

Giống như hồi quy tuyến tính, GLM vẫn dùng một predictor tuyến tính:

\[ \eta_i = x_i^T \beta = \beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip} \]

Ý nghĩa:

  • \(\eta_i\): predictor tuyến tính
  • \(x_i\): vector hàng gồm các biến giải thích của quan sát \(i\)
  • \(\beta\): vector hệ số hồi quy

Đây là thành phần chứa ảnh hưởng của các biến độc lập lên mô hình.

3. Hàm liên kết (Link function)

GLM dùng một hàm liên kết \(g(\cdot)\) để kết nối trung bình \(\mu_i = E[y_i]\) với predictor tuyến tính \(\eta_i\):

\[ g(\mu_i) = \eta_i \quad \text{hay} \quad \mu_i = g^{-1}(\eta_i) \]

→ Cho phép mô hình hóa các biến phản hồi có đặc tính phi tuyến, không âm, giới hạn trong khoảng (0,1),…

Hàm liên kết thường dùng:

Phân phối \(\mu_i = E[y_i]\) Link function \(g(\mu)\) Ghi chú
Normal \(\mu \in \mathbb{R}\) \(g(\mu) = \mu\) (identity) Hồi quy tuyến tính chuẩn
Binomial \(\mu \in (0,1)\) \(g(\mu) = \log \frac{\mu}{1-\mu}\) Logistic regression
Poisson \(\mu > 0\) \(g(\mu) = \log(\mu)\) Hồi quy đếm
Gamma \(\mu > 0\) \(g(\mu) = \log(\mu)\) hoặc \(g(\mu) = \frac{1}{\mu}\) Mô hình dữ liệu dương

5.3 Ví dụ mô hình hóa trong GLM

1. Hồi quy Logistic (nhị phân)

\[ y_i \sim \text{Bernoulli}(\pi_i) \]

\[ g(\pi_i) = \log \left(\frac{\pi_i}{1-\pi_i}\right) = \eta_i \]

\[ \pi_i = P(y_i = 1 \mid x_i) \]

  • Dùng cho dữ liệu như: sống/chết, mua/không mua, đúng/sai…

2. Hồi quy Poisson (đếm)

\[ y_i \sim \text{Poisson}(\mu_i) \]

\[ \log(\mu_i) = x_i^T \beta \]

  • \(\mu_i\): số sự kiện kỳ vọng xảy ra.

  • Dùng cho dữ liệu: số ca bệnh, số lần vi phạm, số giao dịch…

3. Hồi quy Gamma (dương liên tục)

\[ y_i \sim \text{Gamma}(\alpha, \mu_i) \]

Hàm liên kết:

\[ g(\mu_i) = \log(\mu_i) \quad \text{hoặc} \quad g(\mu_i) = \frac{1}{\mu_i} \]

  • Dùng cho dữ liệu chi phí, độ dài, thời gian

5.4 Hàm phương sai (Variance Function)

Trong GLM, phương sai của \(y_i\) không cần bằng nhau mà được mô hình hóa như hàm của \(\mu_i\):

\[ \text{Var}(y_i) = \phi \cdot V(\mu_i) \]

Trong đó:

  • \(\phi\): tham số phân tán (dispersion parameter)
  • \(V(\mu)\): hàm phương sai phụ thuộc vào trung bình \(\mu\)

Hàm \(V(\mu)\) tùy theo phân phối như sau:

Phân phối \(V(\mu)\)
Normal 1
Binomial \(\mu (1 - \mu)\)
Poisson \(\mu\)
Gamma \(\mu^2\)

Việc mô hình hóa phương sai như trên giúp xử lý được hiện tượng phương sai thay đổi (heteroscedasticity), vốn là một giả định bị vi phạm trong phương pháp OLS (Hồi quy tuyến tính thông thường).

5.5 Các khái niệm mở rộng

Canonical Link Function là hàm liên kết sao cho predictor tuyến tính chính là tham số tự nhiên \(\theta\) trong phân phối họ hàm mũ:

\[ \theta_i = \eta_i = x_i^T \beta \]

Ví dụ về hàm liên kết chuẩn (canonical link):

Phân phối Hàm liên kết (Link function)
Binomial logit: \(\log\frac{\mu}{1-\mu}\)
Poisson log: \(\log(\mu)\)
Normal identity: \(\mu\)

Lưu ý: Dù GLM gọi là “tuyến tính”, nhưng mối quan hệ giữa \(y\)\(x\) có thể phi tuyến do sử dụng hàm liên kết (link function).

CHƯƠNG 6: ƯỚC LƯỢNG TRONG MÔ HÌNH TUYẾN TÍNH TỔNG QUÁT (GLMs)

6.1 Giới thiệu

Sau khi xác định được cấu trúc của một GLM (gồm phân phối xác suất, hàm liên kết và thành phần tuyến tính), bước tiếp theo là ước lượng các hệ số hồi quy \(\beta\) trong mô hình.

Khác với hồi quy tuyến tính cổ điển – nơi ta dùng phương pháp bình phương tối thiểu (OLS) – trong GLM, các hệ số được ước lượng bằng phương pháp hợp lý tối đa (Maximum Likelihood Estimation - MLE) thông qua một thuật toán gọi là Iteratively Reweighted Least Squares (IRLS).

Phương pháp IRLS thực hiện việc cập nhật các ước lượng \(\beta\) lặp đi lặp lại, mỗi lần dựa trên trọng số được điều chỉnh sao cho phù hợp với phân phối của dữ liệu và hàm liên kết được chọn.

6.2 Tổng quan về ước lượng hợp lý tối đa (MLE) trong GLM

Cho dữ liệu gồm:

  • Biến phản hồi: \(y_1, y_2, \ldots, y_n\) có thể là biến đếm, nhị phân hoặc liên tục dương…

  • Biến giải thích: \(x_{i1}, \ldots, x_{ip}\) với \(i=1, \ldots, n\).

Mô hình GLM được biểu diễn như sau:

\[ g(\mu_i) = \eta_i = \mathbf{x}_i^T \boldsymbol{\beta} \]

với

\[ \mu_i = E[y_i] = g^{-1}(\mathbf{x}_i^T \boldsymbol{\beta}) \]

Mục tiêu là tìm ước lượng \(\hat{\boldsymbol{\beta}}\) sao cho hàm log-likelihood đạt cực đại:

\[ \ell(\boldsymbol{\beta}) = \sum_{i=1}^n \log f(y_i; \theta_i) \]

Trong đó:

  • \(f(y_i; \theta_i)\) là hàm mật độ xác suất (hoặc hàm khối xác suất) của biến \(y_i\),

  • \(\theta_i\) là tham số tự nhiên trong phân phối thuộc họ hàm mũ,

  • \(\theta_i\) có quan hệ với \(\mu_i\), từ đó liên hệ với \(\boldsymbol{\beta}\).

Việc ước lượng này thường được thực hiện bằng phương pháp hợp lý tối đa (MLE), sử dụng thuật toán Iteratively Reweighted Least Squares (IRLS).

6.3 Phương pháp IRLS (Iteratively Reweighted Least Squares)

1. Thuật toán IRLS (Iteratively Reweighted Least Squares):

GLM sử dụng thuật toán IRLS để tìm ước lượng \(\hat{\boldsymbol{\beta}}\). Thuật toán dựa trên việc lặp lại các bước hồi quy tuyến tính có trọng số.

2. Ý tưởng cơ bản:

  • Ở mỗi vòng lặp, mô hình GLM được xấp xỉ bằng một hồi quy tuyến tính với trọng số.

  • Biến giả (working response) \(\mathbf{z}\)ma trận trọng số \(\mathbf{W}\) được cập nhật liên tục ở mỗi bước.

3. Hệ phương trình IRLS:

\[ \mathbf{X}^T \mathbf{W} \mathbf{X} \hat{\boldsymbol{\beta}} = \mathbf{X}^T \mathbf{W} \mathbf{z} \]

Trong đó:

  • \(\mathbf{X}\) là ma trận thiết kế,

  • \(\mathbf{W}\) là ma trận trọng số kích thước \(n \times n\),

  • \(\mathbf{z}\) là vector biến giả \(n \times 1\), tính theo công thức:

\[ z_i = \eta_i + \frac{y_i - \mu_i}{\frac{d \mu_i}{d \eta_i}} \]

  • Trọng số \(W_i\) được tính theo:

\[ W_i = \left(\frac{d \mu_i}{d \eta_i}\right)^2 \Big/ \mathrm{Var}(y_i) \]

Quá trình này được lặp lại cho đến khi các ước lượng \(\boldsymbol{\beta}\) hội tụ.

6.4 Hàm điểm, ma trận Fisher và phương sai của ước lượng

Hàm điểm (Score Function)

Hàm điểm là đạo hàm của log-likelihood theo vector hệ số \(\boldsymbol{\beta}\):

\[ U(\boldsymbol{\beta}) = \frac{\partial \ell(\boldsymbol{\beta})}{\partial \boldsymbol{\beta}} \]

Đây là hệ phương trình mà khi giải \(U(\boldsymbol{\beta}) = 0\), ta thu được ước lượng cực đại \(\hat{\boldsymbol{\beta}}\).

Ma trận thông tin Fisher

Ma trận thông tin Fisher là kỳ vọng âm của đạo hàm bậc hai của log-likelihood:

\[ \mathcal{I}(\boldsymbol{\beta}) = - \mathbb{E} \left[ \frac{\partial^2 \ell(\boldsymbol{\beta})}{\partial \boldsymbol{\beta} \, \partial \boldsymbol{\beta}^T} \right] \]

Ma trận này đóng vai trò như một thước đo độ “sắc nét” của log-likelihood tại điểm cực đại và được dùng để đánh giá độ chính xác của ước lượng.

Phương sai của \(\hat{\boldsymbol{\beta}}\)

Khi đã có ma trận thông tin Fisher, phương sai hiệp phương sai của vector hệ số ước lượng được tính là:

\[ \mathrm{Var}(\hat{\boldsymbol{\beta}}) = \mathcal{I}(\hat{\boldsymbol{\beta}})^{-1} \]

Nếu sử dụng thuật toán IRLS, ma trận thông tin Fisher được xấp xỉ bởi:

\[ \mathrm{Var}(\hat{\boldsymbol{\beta}}) = (\mathbf{X}^T \mathbf{W} \mathbf{X})^{-1} \]

Trong đó:

  • \(\mathbf{X}\): ma trận thiết kế,

  • \(\mathbf{W}\): ma trận trọng số tại nghiệm hội tụ,

  • Công thức này xuất hiện tự nhiên từ bước giải hệ phương trình IRLS.

Ghi chú

  • Công thức phương sai trên rất quan trọng để tính khoảng tin cậy và kiểm định giả thuyết trong GLM.

  • Với các mô hình lớn, ma trận \((\mathbf{X}^T \mathbf{W} \mathbf{X})^{-1}\) thường được tính thông qua giải hệ phương trình thay vì đảo trực tiếp để tránh sai số số học.

6.5 Sai số chuẩn và khoảng tin cậy

Sai số chuẩn (Standard Error)

Sau khi có được ước lượng \(\hat{\boldsymbol{\beta}}\) và ma trận phương sai hiệp phương sai \(\mathrm{Var}(\hat{\boldsymbol{\beta}})\), ta tính sai số chuẩn cho từng hệ số \(\hat{\beta}_j\) như sau:

\[ \mathrm{SE}(\hat{\beta}_j) = \sqrt{[\mathrm{Var}(\hat{\boldsymbol{\beta}})]_{jj}} \]

Trong đó, \([\cdot]_{jj}\) là phần tử hàng \(j\), cột \(j\) trong ma trận phương sai.

Khoảng tin cậy \(100(1 - \alpha)\%\)

Khoảng tin cậy cho hệ số \(\hat{\beta}_j\) được tính bằng công thức:

\[ \hat{\beta}_j \pm z_{\alpha/2} \cdot \mathrm{SE}(\hat{\beta}_j) \]

Trong đó:

  • \(z_{\alpha/2}\) là bách phân vị \(1 - \alpha/2\) của phân phối chuẩn chuẩn hóa (thường tra từ bảng Z),

  • Ví dụ: với \(\alpha = 0.05\), \(z_{0.025} \approx 1.96\) (tương ứng khoảng tin cậy 95%).

Kiểm định Wald

Kiểm định Wald giúp đánh giá giả thuyết:

\[ H_0: \beta_j = 0 \quad \text{vs} \quad H_1: \beta_j \neq 0 \]

Thống kê kiểm định:

\[ Z = \frac{\hat{\beta}_j}{\mathrm{SE}(\hat{\beta}_j)} \sim \mathcal{N}(0, 1) \]

Dựa vào giá trị \(Z\), ta có thể tính p-value và đưa ra kết luận thống kê.

Ghi chú

  • Kiểm định Wald được dùng phổ biến do tính đơn giản và có thể thực hiện ngay sau khi có ước lượng và phương sai.

  • Nếu \(|Z| > z_{\alpha/2}\), bác bỏ \(H_0\), tức là hệ số \(\beta_j\) có ý nghĩa thống kê.

6.6 Ước lượng tham số phân tán

Trong một số mô hình GLM, đặc biệt là khi phân phối thuộc họ phân phối mũ (exponential family) không chuẩn hóa, ta cần ước lượng tham số phân tán \(\phi\).

Công thức ước lượng:

\[ \hat{\phi} = \frac{1}{n - p} \sum_{i=1}^{n} \frac{(y_i - \hat{\mu}_i)^2}{V(\hat{\mu}_i)} \]

Trong đó:

  • \(n\): số quan sát

  • \(p\): số tham số trong mô hình (bao gồm hệ số chặn nếu có)

  • \(\hat{\mu}_i = \mathbb{E}[y_i] = g^{-1}(\eta_i)\): giá trị kỳ vọng được ước lượng

  • \(V(\hat{\mu}_i)\): hàm phương sai, phụ thuộc vào phân phối:

Phân phối Hàm phương sai \(V(\mu)\)
Gaussian \(1\)
Poisson \(\mu\)
Binomial (logit) \(\mu(1 - \mu)\)

CHƯƠNG 7: GENERALIZED LINEAR MODELS: INFERENCE

ĐÁNH GIÁ MỨC ĐỘ PHÙ HỢP VÀ LỰA CHỌN MÔ HÌNH TRONG GLM

7.1 Giới thiệu

Sau khi ước lượng các tham số \(\beta\) trong GLM, bước tiếp theo là đánh giá xem mô hình có phù hợp với dữ liệu không, và nếu có nhiều mô hình cạnh tranh, thì nên chọn mô hình nào là tốt nhất.

Các công cụ đánh giá bao gồm:

  • Deviance (độ lệch)

  • Kiểm định \(\chi^2\)

  • AIC, BIC

  • So sánh mô hình lồng và không lồng

  • Đồ thị phần dư và điểm ảnh hưởng

7.2 Deviance – đo lường mức độ phù hợp của mô hình

Định nghĩa:

Deviance là đại lượng đo sự khác biệt giữa mô hình hiện tại và mô hình đầy đủ (saturated model) – tức mô hình khớp hoàn toàn với dữ liệu.

\[ D(y; \hat{\mu}) = 2 \left[ \ell(y; y) - \ell(\hat{\mu}; y) \right] \]

Giải thích ký hiệu:

  • \(\ell(y; y)\): log-likelihood của mô hình bão hòa (saturated model)

  • \(\ell(\hat{\mu}; y)\): log-likelihood của mô hình đang xét

\(\Rightarrow\) Deviance càng nhỏ → mô hình càng gần với mô hình bão hòa → phù hợp hơn.

7.3 So sánh mô hình bằng kiểm định deviance

Khi hai mô hình lồng nhau, ta có thể so sánh bằng kiểm định sai biệt deviance:

Công thức kiểm định:

\[ \Delta D = D_{\text{reduced}} - D_{\text{full}} \sim \chi^2_{df} \]

Trong đó:

  • \(df\): số tham số bị ràng buộc trong mô hình nhỏ hơn

\(\Rightarrow\) Nếu \(\Delta D\) lớn và p-value nhỏ → mô hình đầy đủ tốt hơn.

7.4 AIC và BIC – lựa chọn giữa các mô hình không lồng

Khi các mô hình không lồng nhau, ta dùng tiêu chí thông tin để so sánh:

AIC (Akaike Information Criterion):

\[ AIC = -2\ell + 2k \]

  • \(\ell\): log-likelihood

  • \(k\): số tham số trong mô hình

BIC (Bayesian Information Criterion):

\[ BIC = -2\ell + \log(n) \cdot k \]

  • \(n\): số quan sát

\(\Rightarrow\) Chọn mô hình có AIC/BIC thấp hơn.

\(\Rightarrow\) BIC phạt các mô hình phức tạp nhiều hơn so với AIC.

CHƯƠNG 8: HỒI QUY LOGISTIC (LOGISTIC REGRESSION)

8.1 Giới thiệu

Hồi quy logistic là một trong những mô hình phổ biến nhất thuộc họ GLM, được dùng để mô hình hóa dữ liệu nhị phân (binary), tức khi biến phản hồi

\[ y \in \{0,1\} \]

Ví dụ: bệnh/không bệnh, mua/không mua, đạt/không đạt.

Đặc điểm:
\[ \mu_i = E[y_i] = P(y_i=1) \in (0,1) \]

Sử dụng hàm liên kết logit:
\[ g(\mu_i) = \log\left(\frac{\mu_i}{1-\mu_i}\right) = \eta_i = x_i^T \beta \]

8.2 Phân phối Bernoulli và hàm log-likelihood

Biến phản hồi

\[ y_i \in \{0,1\} \]
phân phối theo:

\[ y_i \sim \text{Bernoulli}(\pi_i) \]

Trong đó:

\[ \pi_i = P(y_i=1) \]
và:
\[ \log\left(\frac{\pi_i}{1-\pi_i}\right) = x_i^T \beta \]

Log-likelihood cho toàn bộ mẫu:
\[ \ell(\beta) = \sum_{i=1}^n \left[ y_i \log(\pi_i) + (1 - y_i) \log(1-\pi_i) \right] \]

Không có nghiệm giải tường minh → dùng IRLS để tìm \(\hat{\beta}\).

8.3 Diễn giải hệ số hồi quy trong logistic regression

Khi dùng logit link:
\[ \eta_i = \log\left(\frac{\pi_i}{1-\pi_i}\right) = x_i^T \beta \]

\(\beta_j\) đại diện cho log odds ratio:
\[ \text{Odds ratio} = \exp(\beta_j) \]

  • Nếu \(\beta_j > 0\): biến \(x_j\) làm tăng khả năng \(y=1\)

  • Nếu \(\beta_j < 0\): biến \(x_j\) làm giảm khả năng \(y=1\)

8.4 Khoảng tin cậy và kiểm định

Sau khi ước lượng \(\hat{\beta}\), ta kiểm định từng hệ số:

Kiểm định Wald:
\[ Z_j = \frac{\hat{\beta}_j}{SE(\hat{\beta}_j)} \sim N(0,1) \]

Khoảng tin cậy 95%:
\[ \hat{\beta}_j \pm z_{0.975} \cdot SE(\hat{\beta}_j) \]

Chuyển sang odds ratio bằng
\[ \exp(\hat{\beta}_j) \]

CHƯƠNG 9: HỒI QUY POISSON (POISSON REGRESSION)

9.1 Giới thiệu và ứng dụng thực tế

Hồi quy Poisson là một mô hình thuộc họ GLM, được sử dụng để mô hình hóa các biến phản hồi là số lượng sự kiện đếm được trên một đơn vị quan sát, chẳng hạn như:

  • Số lần nhập viện

  • Số vụ tai nạn giao thông

  • Số lỗi phần mềm phát sinh

Đặc biệt phù hợp khi:

  • Biến phản hồi \(y \in \{0, 1, 2, \ldots \}\)

  • Dữ liệu không âm, rời rạc

  • Mục tiêu là ước lượng số sự kiện trung bình theo các đặc tính \(x\)

9.2 Phân phối Poisson và liên kết log

Hàm xác suất:
\[ P(y_i) = \frac{e^{-\mu_i} \mu_i^{y_i}}{y_i!}, \quad y_i = 0, 1, 2, \ldots \]

Trong đó:

\[ \mu_i = E[y_i] : \text{số sự kiện kỳ vọng của quan sát thứ } i \]

\[ \text{Var}(y_i) = \mu_i \quad : \text{đặc điểm then chốt} \]

Hàm liên kết (canonical):

\[ \eta_i = \log(\mu_i) = x_i^T \beta \implies \mu_i = e^{x_i^T \beta} \]

Hàm log đảm bảo:

\[ \mu_i > 0 \]

Mối quan hệ tuyến tính trên log-scale.

9.3 Hàm log-likelihood và phương trình điểm

Log-likelihood của mô hình:

\[ \ell(\beta) = \sum_{i=1}^n \left[ y_i \log(\mu_i) - \mu_i - \log(y_i!) \right] \]

Thay \(\mu_i = e^{x_i^T \beta}\), ta được:

\[ \ell(\beta) = \sum_{i=1}^n \left[ y_i x_i^T \beta - e^{x_i^T \beta} - \log(y_i!) \right] \]

Score function (đạo hàm log-likelihood):

\[ U(\beta) = \sum_{i=1}^n x_i (y_i - \mu_i) \]

Giải phương trình \(U(\beta) = 0\) → tìm \(\hat{\beta}\) bằng IRLS.

9.4 Diễn giải hệ số hồi quy

Trong hồi quy Poisson:

  • Mỗi \(\beta_j\) là tác động log tuyến tính đến số sự kiện trung bình.

  • \(e^{\beta_j}\) là tỷ lệ thay đổi kỳ vọng \(\mu\) khi \(x_j\) tăng 1 đơn vị, giữ các biến khác không đổi.

Ví dụ:

  • \(\beta_j = 0.693 \Rightarrow e^{0.693} = 2\): số sự kiện kỳ vọng gấp đôi khi \(x_j\) tăng 1 đơn vị.

  • \(\beta_j = -0.223\) → giảm khoảng 20%.

CHƯƠNG 10: HỒI QUY GAMMA (GAMMA REGRESSION)

10.1 Giới thiệu

Hồi quy Gamma là một mô hình thuộc họ GLM dùng để mô hình hóa các biến phản hồi dương liên tục có phương sai tăng theo giá trị trung bình.

Ví dụ ứng dụng:

  • Chi phí y tế

  • Thời gian sống (survival time)

  • Lượng tiêu thụ năng lượng

10.2 Phân phối Gamma

Giả định biến ngẫu nhiên \(y_i\) phân phối Gamma với tham số:

\[ y_i \sim Gamma(\alpha, \mu_i) \]

Trong đó:

  • \(\mu_i = E[y_i]\) là kỳ vọng.

  • Phương sai:
    \[ Var(y_i) = \frac{\mu_i^2}{\alpha} = \phi \mu_i^2 \]

Phương sai tỷ lệ với bình phương kỳ vọng, phù hợp khi biến thiên tỷ lệ không đổi.

10.3 Hàm mật độ xác suất Gamma (dạng GLM)

Hàm mật độ xác suất:

\[ f(y; \mu, \phi) = \frac{1}{\Gamma(1/\phi)} \left(\frac{1}{\phi \mu}\right)^{1/\phi} y^{\frac{1}{\phi}-1} \exp\left(-\frac{y}{\phi \mu}\right) \]

Hàm này thuộc họ hàm mũ (exponential family), với:

\[ \theta = -\frac{1}{\mu} \]

\[ b(\theta) = -\log(-\theta) \]

Hàm phương sai:

\[ V(\mu) = \mu^2 \]

\(\phi\) là tham số phân tán.

CHƯƠNG 11: DỮ LIỆU NHÓM HOẶC TỶ LỆ (GROUPED DATA OR PROPORTIONS)

11.1 Giới thiệu

Dữ liệu nhị phân dạng 0/1 được mô hình hóa bằng hồi quy logistic. Tuy nhiên, nếu dữ liệu có dạng tổng hợp (grouped) hoặc thể hiện dưới dạng tỷ lệ, ví dụ:

20 thành công trong 30 thử nghiệm → \(y = 20, n = 30\)

  • Tỷ lệ mắc bệnh ở mỗi quận

  • Tỷ lệ sinh viên đậu trong từng lớp

→ Cần dùng GLM dạng nhị thức tổng quát (binomial GLM), áp dụng cho số lần thành công trên số lần thử.

11.2 Mô hình hóa số thành công trong nhóm

Với \(y_i \sim \text{Binomial}(n_i, \pi_i)\), ta mô hình hóa:

\[ \log \left(\frac{\pi_i}{1 - \pi_i}\right) = \eta_i = x_i^T \beta \implies \pi_i = \frac{e^{x_i^T \beta}}{1 + e^{x_i^T \beta}} \]

Trong đó:

  • \(y_i\): số thành công trong nhóm \(i\)

  • \(n_i\): tổng số thử nghiệm trong nhóm \(i\)

  • \(\pi_i\): xác suất thành công

  • \(\mu_i = E[y_i] = n_i \pi_i\)

  • \(\text{Var}(y_i) = n_i \pi_i (1 - \pi_i)\)

→ Phù hợp cho dữ liệu dạng “n trials, k successes”.

11.3 Log-likelihood và IRLS

Hàm log-likelihood:

\[ \ell(\beta) = \sum_{i=1}^n \left[ y_i \log(\pi_i) + (n_i - y_i) \log(1 - \pi_i) \right] \]

Tối đa hóa log-likelihood bằng IRLS (như logistic), nhưng có thêm yếu tố \(n_i\).

Biến giả và trọng số:

\[ w_i = n_i \pi_i (1 - \pi_i) \]

\[ z_i = \eta_i + \frac{y_i - n_i \pi_i}{n_i \pi_i (1 - \pi_i)} \]

11.4 Ưu điểm so với mô hình nhị phân

Dạng dữ liệu Mô hình tương ứng Ghi chú
0/1 từng cá nhân Hồi quy logistic \(y_i \sim \text{Bernoulli}(\pi_i)\)
Nhóm nhiều cá nhân Binomial GLM với \(y_i / n_i\) \(y_i \sim \text{Binomial}(n_i, \pi_i)\)

→ Mô hình nhóm cho kết quả ước lượng chính xác hơn vì dùng nhiều thông tin hơn trên mỗi quan sát.

11.5 Dữ liệu tỷ lệ (proportions)

Nếu \(y_i / n_i\) được ghi dưới dạng tỷ lệ (0 < tỷ lệ < 1), ta vẫn dùng mô hình:

\[ \log \left(\frac{y_i / n_i}{1 - y_i / n_i}\right) = x_i^T \beta \]

→ Nhưng phải chỉ rõ số lần thử \(n_i\) để tính đúng phương sai.

CHƯƠNG 12: MÔ HÌNH TUYẾN TÍNH TỔNG QUÁT TWEEDEE (TWEEDIE GLMs)

12.1 Giới thiệu

Mô hình Tweedie GLM mở rộng họ hàm mũ bằng cách cho phép phân phối có đặc điểm trung gian giữa các phân phối quen thuộc như:

  • Gaussian

  • Poisson

  • Gamma

  • Inverse Gaussian

Mô hình Tweedie phù hợp với các loại dữ liệu có đặc điểm:

  • Liên tục dương + rất nhiều giá trị 0
    (ví dụ: dữ liệu chi phí, có người không tiêu dùng)

  • Phân tán quá mức (overdispersion)

  • Có cả phần rời rạc (0, 1, 2, …) lẫn liên tục dương

→ Ứng dụng rộng rãi trong bảo hiểm, tài chính, y tế, và các bài toán zero-inflated data.

12.2 Định nghĩa và tính chất

Tweedie là một lớp phân phối thuộc họ hàm mũ (exponential family), với hàm phương sai có dạng:

\[ \text{Var}(Y) = \phi \mu^p \]

Trong đó:

  • \(\mu = \mathbb{E}[Y]\): kỳ vọng

  • \(\phi > 0\): hệ số phân tán

  • \(p\): chỉ số sức mạnh (power index)

12.3 Giá trị đặc biệt của chỉ số \(p\)

\(p\) Phân phối tương ứng
0 Gaussian (Normal)
1 Poisson
\((1, 2)\) Tweedie hỗn hợp (0 + dương liên tục)
2 Gamma
3 Inverse Gaussian

→ Với \(1 < p < 2\), mô hình Tweedie hỗn hợp có thể:

  • Tái hiện được số lượng lớn giá trị 0

  • Mô hình hóa được giá trị dương liên tục

Rất phù hợp cho các bài toán như chi phí bảo hiểm, tổn thất, dữ liệu có số 0 và giá trị tiền tệ.

PHẦN 2

THỐNG KÊ MÔ TẢ CÁC BIẾN Supermarket Transactions

Gender

a <- read.csv(file = 'C:/Users/ADMIN/Downloads/Tkmt.csv', header = T) # load data
thong_ke_dinh_tinh <- function(data, var_name) {
  # Check if variable exists in data
  if (!var_name %in% names(data)) {
    stop("Variable does not exist in data")
  }
  
  # Convert to factor if needed
  variable <- as.factor(data[[var_name]])
  
  # freq
  freq <- table(variable)
  percent <- prop.table(freq) * 100
  
  # result
  result <- data.frame(
    Gia_tri = names(freq),
    Tan_so = as.vector(freq),
    Tan_suat = round(as.vector(percent), 2)
  )
  return(result)
}
library(ggplot2)
library(dplyr)

# Tạo bảng đếm số lượng theo giới tính
gender_count <- a %>%
  count(Gender) %>%
  mutate(perc = n / sum(n),
         label = paste0(Gender, " (", round(perc * 100), "%)"))

# Vẽ biểu đồ tròn
ggplot(gender_count, aes(x = "", y = n, fill = Gender)) +
  geom_col(width = 1) +
  coord_polar(theta = "y") +
  geom_text(aes(label = label), position = position_stack(vjust = 0.5)) +
  labs(title = "Tỷ lệ giới tính khách hàng") +
  theme_void()

Phân bố giới tính khá cân bằng, chỉ chênh lệch nhẹ giữa nữ (F) và nam (M).

Điều này cho thấy dữ liệu có tính đại diện giới tương đối tốt, tránh được thiên lệch giới tính.

MaritalStatus

thong_ke_dinh_tinh(a,'MaritalStatus')
##   Gia_tri Tan_so Tan_suat
## 1       M   6866    48.84
## 2       S   7193    51.16

Gần một nửa khách hàng là độc thân, còn lại là đã kết hôn.

Tỷ lệ này cũng tương đối cân bằng, giúp so sánh hành vi theo tình trạng hôn nhân mà không lo thiên lệch dữ liệu.

ggplot(data = a, aes(x = "", fill = MaritalStatus)) +
  geom_bar(width = 1) +
  coord_polar("y") +
  labs(title = "Tỷ lệ độc thân") +
  theme_void()

Homeowner

thong_ke_dinh_tinh(a, 'Homeowner')
##   Gia_tri Tan_so Tan_suat
## 1       N   5615    39.94
## 2       Y   8444    60.06

Phần lớn khách hàng là người sở hữu nhà (chiếm ~60%).

Điều này có thể ảnh hưởng đến thói quen chi tiêu hoặc ưu tiên mua sắm, là một đặc điểm quan trọng để phân khúc khách hàng.

ggplot(data = a, aes(x = Homeowner)) +
  geom_bar(fill = "#AEE0AF") +
  geom_text(stat = "count", aes(label = ..count..), vjust = -0.5) +
  labs(title = "Sở hữu nhà",
       x = "Có hoặc không", y = "Tần số") +
  theme_minimal()
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Children

Children chỉ số con mà khách hàng có, biến này là 1 biến định lượng vì các giá trị của nó có thể so sánh với nhau.

library(skimr)
skim(a$Children)
Data summary
Name a$Children
Number of rows 14059
Number of columns 1
_______________________
Column type frequency:
numeric 1
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
data 0 1 2.53 1.49 0 1 3 4 5 ▇▆▆▆▃

Trung bình 2.53 và trung vị 3 cho thấy dữ liệu có xu hướng phân bố đều.

Không có dấu hiệu lệch nghiêm trọng hoặc có giá trị ngoại lệ bất thường.

ggplot(a, aes(x = as.factor(Children))) +
  geom_bar(fill = "lightblue") +
  geom_text(stat = "count", aes(label = ..count..), vjust = -0.5) +
  labs(x = "Số con", y = "Số khách hàng", title = "Phân bố số con của khách hàng")

AnnualIncome

thong_ke_dinh_tinh(a, 'AnnualIncome')
##         Gia_tri Tan_so Tan_suat
## 1   $10K - $30K   3090    21.98
## 2 $110K - $130K    643     4.57
## 3 $130K - $150K    760     5.41
## 4       $150K +    273     1.94
## 5   $30K - $50K   4601    32.73
## 6   $50K - $70K   2370    16.86
## 7   $70K - $90K   1709    12.16
## 8  $90K - $110K    613     4.36

$30K - $50K chiếm hơn 1/3 (32.73%) tổng số quan sát → là nhóm đông nhất. Kết hợp với $10K - $30K, ta có khoảng 55% người thuộc nhóm dưới $50K cho thấy mức thu nhập trung bình hoặc thấp là phổ biến.

Nhóm thu nhập cao (trên $90K) Gồm $90K - $110K, $110K - $130K, $130K - $150K, $150K+. Tổng tần suất chỉ khoảng 16.28% cho thấy nhóm thu nhập cao khá nhỏ.

ggplot(a, aes(x = AnnualIncome)) +
  geom_bar(fill = "lightblue", color = "purple") +
  labs(x = "Khoảng thu nhập", y = "Tần suất", title = "Biểu đồ tần suất thu nhập hàng năm") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

City

thong_ke_dinh_tinh(a,'City')
##          Gia_tri Tan_so Tan_suat
## 1       Acapulco    383     2.72
## 2     Bellingham    143     1.02
## 3  Beverly Hills    811     5.77
## 4      Bremerton    834     5.93
## 5        Camacho    452     3.22
## 6    Guadalajara     75     0.53
## 7        Hidalgo    845     6.01
## 8    Los Angeles    926     6.59
## 9         Merida    654     4.65
## 10   Mexico City    194     1.38
## 11       Orizaba    464     3.30
## 12      Portland    876     6.23
## 13         Salem   1386     9.86
## 14    San Andres    621     4.42
## 15     San Diego    866     6.16
## 16 San Francisco    130     0.92
## 17       Seattle    922     6.56
## 18       Spokane    875     6.22
## 19        Tacoma   1257     8.94
## 20     Vancouver    633     4.50
## 21      Victoria    176     1.25
## 22   Walla Walla    160     1.14
## 23        Yakima    376     2.67

Salem có tần số cao nhất (1386 lần xuất hiện, chiếm 9.86). Tiếp theo là Tacoma (1257 lần, 8.94%).

Guadalajara có tần số thấp nhất (75 lần, chỉ 0.53%).

Nhìn chung, số lượng khách hàng ở các thành phố phân bố khá chênh lệch, điều này có thể dẫn đến những kết quả thiên lệch trong việc phân tích và so sánh giữa các thành phố.

ggplot(a, aes(x = City)) +
  geom_bar(fill = "lightblue", color = "black") +
  labs(x = "Thành phố", y = "Tần số", title = "Biểu đồ tần số khách hàng ở các thành phố") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

StateorProvince

thong_ke_dinh_tinh(a,'StateorProvince')
##      Gia_tri Tan_so Tan_suat
## 1         BC    809     5.75
## 2         CA   2733    19.44
## 3         DF    815     5.80
## 4   Guerrero    383     2.72
## 5    Jalisco     75     0.53
## 6         OR   2262    16.09
## 7   Veracruz    464     3.30
## 8         WA   4567    32.48
## 9    Yucatan    654     4.65
## 10 Zacatecas   1297     9.23

WA (Washington) chiếm tỷ lệ áp đảo (32.48%, 4567 lần xuất hiện), CA (California) đứng thứ hai (19.44%, 2733 lần), OR (Oregon) đứng thứ ba (16.09%, 2262 lần). => Ba bang này thuộc Tây Bắc Thái Bình Dương của Hoa Kỳ chiếm tổng cộng 68.01% dữ liệu

Các tỉnh Mexico (DF, Guerrero, Jalisco, Veracruz, Yucatan, Zacatecas) có tần suất thấp hơn nhiều. Tổng cộng các tỉnh Mexico chỉ chiếm khoảng 26.23% dữ liệu

Kết quả này cho thấy sự tập trung địa lý rõ rệt trong tập dữ liệu, với phần lớn dữ liệu đến từ ba bang phía Tây Bắc Hoa Kỳ.

ggplot(a, aes(x = StateorProvince)) +
  geom_bar(fill = "#FFC", color = "yellow") +
  labs(x = "Bang", y = "Tần số", title = "Biểu đồ tần số khách hàng ở các bang") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Country

thong_ke_dinh_tinh(a,'Country')
##   Gia_tri Tan_so Tan_suat
## 1  Canada    809     5.75
## 2  Mexico   3688    26.23
## 3     USA   9562    68.01

Dữ liệu cho thấy sự phân bố không đồng đều giữa các quốc gia, với Hoa Kỳ (USA) chiếm tỷ lệ áp đảo (68.01%, 9.562 lần xuất hiện), tiếp theo là Mexico (26.23%, 3.688 lần) và Canada (5.75%, 809 lần). Điều này cho thấy tập dữ liệu chủ yếu tập trung vào thị trường Mỹ, có thể do dữ liệu được thu thập từ nguồn ưu tiên các giao dịch hoặc sự kiện tại Hoa Kỳ.

ggplot(a, aes(x = Country)) +
  geom_bar(fill = "#0CC", color = "red") +
  labs(x = "Quốc gia", y = "Tần số", title = "Biểu đồ tần số khách hàng ở các quốc gia") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

ProductFamily

thong_ke_dinh_tinh(a,'ProductFamily')
##          Gia_tri Tan_so Tan_suat
## 1          Drink   1250     8.89
## 2           Food  10153    72.22
## 3 Non-Consumable   2656    18.89

Dữ liệu cho thấy sản phẩm thực phẩm (Food) chiếm tỷ lệ áp đảo (72.22%, 10.153 lần xuất hiện), trong khi nhóm đồ uống (Drink) chỉ chiếm 8.89% và sản phẩm không tiêu dùng (Non-Consumable) chiếm 18.89%. Sự chênh lệch rõ rệt này (Food gấp 8 lần Drink và gần 4 lần Non-Consumable) phản ánh trọng tâm của tập dữ liệu chủ yếu tập trung vào các sản phẩm thực phẩm.

ggplot(a, aes(x = ProductFamily)) +
  geom_bar(fill = "purple", color = "black") +
  labs(x = "Sản phẩm", y = "Tần số", title = "Phân khúc sản phẩm khách hàng mua")

  theme(axis.text.x = element_text(angle = 45, hjust = 1))
## List of 1
##  $ axis.text.x:List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 1
##   ..$ vjust        : NULL
##   ..$ angle        : num 45
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi FALSE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  - attr(*, "class")= chr [1:2] "theme" "gg"
##  - attr(*, "complete")= logi FALSE
##  - attr(*, "validate")= logi TRUE

ProductDepartment

thong_ke_dinh_tinh(a,'ProductDepartment')
##                Gia_tri Tan_so Tan_suat
## 1  Alcoholic Beverages    356     2.53
## 2          Baked Goods    425     3.02
## 3         Baking Goods   1072     7.63
## 4            Beverages    680     4.84
## 5      Breakfast Foods    188     1.34
## 6         Canned Foods    977     6.95
## 7      Canned Products    109     0.78
## 8             Carousel     59     0.42
## 9             Checkout     82     0.58
## 10               Dairy    903     6.42
## 11                Deli    699     4.97
## 12                Eggs    198     1.41
## 13        Frozen Foods   1382     9.83
## 14  Health and Hygiene    893     6.35
## 15           Household   1420    10.10
## 16                Meat     89     0.63
## 17         Periodicals    202     1.44
## 18             Produce   1994    14.18
## 19             Seafood    102     0.73
## 20         Snack Foods   1600    11.38
## 21              Snacks    352     2.50
## 22       Starchy Foods    277     1.97

Tập trung vào thực phẩm tươi và đồ gia dụng: Hai nhóm Produce và Household chiếm tổng cộng gần 25% dữ liệu, cho thấy đây có thể là các mặt hàng chủ lực.

Sự thiếu cân đối rõ rệt: Trong khi một số nhóm như Produce chiếm tới 14.18% thì nhiều nhóm khác như Meat, Seafood lại chiếm chưa tới 1%.

ggplot(a, aes(x = ProductDepartment)) +
  geom_bar(fill = "#11aa77", color = "blue") +
  labs(x = "Sản phẩm", y = "Tần số", title = "Bộ phận sản phẩm khách hàng mua") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

ProductCategory

thong_ke_dinh_tinh(a,'ProductCategory')
##                 Gia_tri Tan_so Tan_suat
## 1          Baking Goods    484     3.44
## 2     Bathroom Products    365     2.60
## 3         Beer and Wine    356     2.53
## 4                 Bread    425     3.02
## 5       Breakfast Foods    417     2.97
## 6               Candles     45     0.32
## 7                 Candy    352     2.50
## 8      Canned Anchovies     44     0.31
## 9          Canned Clams     53     0.38
## 10       Canned Oysters     35     0.25
## 11      Canned Sardines     40     0.28
## 12        Canned Shrimp     38     0.27
## 13          Canned Soup    404     2.87
## 14          Canned Tuna     87     0.62
## 15 Carbonated Beverages    154     1.10
## 16    Cleaning Supplies    189     1.34
## 17        Cold Remedies     93     0.66
## 18                Dairy    903     6.42
## 19        Decongestants     85     0.60
## 20               Drinks    135     0.96
## 21                 Eggs    198     1.41
## 22           Electrical    355     2.53
## 23      Frozen Desserts    323     2.30
## 24       Frozen Entrees    118     0.84
## 25                Fruit    765     5.44
## 26             Hardware    129     0.92
## 27        Hot Beverages    226     1.61
## 28              Hygiene    197     1.40
## 29     Jams and Jellies    588     4.18
## 30     Kitchen Products    217     1.54
## 31            Magazines    202     1.44
## 32                 Meat    761     5.41
## 33        Miscellaneous     42     0.30
## 34  Packaged Vegetables     48     0.34
## 35       Pain Relievers    192     1.37
## 36       Paper Products    345     2.45
## 37                Pizza    194     1.38
## 38     Plastic Products    141     1.00
## 39 Pure Juice Beverages    165     1.17
## 40              Seafood    102     0.73
## 41          Side Dishes    153     1.09
## 42          Snack Foods   1600    11.38
## 43            Specialty    289     2.06
## 44        Starchy Foods    277     1.97
## 45           Vegetables   1728    12.29

Dữ liệu cho thấy Snack Foods (11.38%) và Vegetables (12.29%) là hai danh mục phổ biến nhất, chiếm tổng cộng gần 1/4 dữ liệu. Các danh mục đáng chú ý khác bao gồm Dairy (6.42%), Fruit (5.44%), và Meat (5.41%), trong khi nhiều danh mục như đồ hải sản đóng hộp (Canned Oysters 0.25%, Canned Shrimp 0.27%) hoặc các sản phẩm ít phổ biến (Candles 0.32%, Miscellaneous 0.30%) có tần suất rất thấp. Sự phân bố này phản ánh tập trung chính vào các mặt hàng tiêu dùng nhanh và thực phẩm tươi sống, trong khi các sản phẩm đặc biệt hoặc ít phổ biến chỉ chiếm tỷ lệ nhỏ.

ggplot(a, aes(x = ProductCategory)) +
  geom_bar(fill = "#CC9", color = "black") +
  labs(x = "Sản phẩm", y = "Tần số", title = "Danh mục sản phẩm khách hàng mua") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

UnitsSold

skim(a$UnitsSold)
Data summary
Name a$UnitsSold
Number of rows 14059
Number of columns 1
_______________________
Column type frequency:
numeric 1
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
data 0 1 4.08 1.17 1 3 4 5 8 ▁▃▇▂▁

Kết quả cho thấy trung bình 1 đơn mua sẽ mua khoảng 4.08 đơn vị sản phẩm, giá trị độ lệch chuẩn bằng 1.17 cho thấy mức độ phân tán tương đối thấp xung quanh giá trị trung bình.

Có thể thấy rằng có 50% giao dịch bán từ 3-5 đơn vị (khoảng tứ phân vị) và 75% giao dịch bán ≤5 đơn vị.

barplot(table(a$UnitsSold), 
        col = "blue", 
        main = "Tần suất UnitsSold", 
        xlab = "Số đơn vị", ylab = "Số lần xuất hiện")

skim(a$Revenue)
Data summary
Name a$Revenue
Number of rows 14059
Number of columns 1
_______________________
Column type frequency:
numeric 1
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
data 0 1 13 8.22 0.53 6.84 11.25 17.37 56.7 ▇▅▂▁▁

Biến Revenue (doanh thu) cho thấy một phân phối lệch phải rõ rệt với giá trị trung bình 13.00 và trung vị 11.25, phản ánh sự hiện diện của nhiều giao dịch có doanh thu cao kéo trung bình lên. Độ lệch chuẩn lớn (8.22) cùng khoảng biến thiên rộng (từ 0.53 đến 56.7) cho thấy mức độ chênh lệch đáng kể giữa các giao dịch.

hist(a$Revenue, col = "red", 
     main = "Phân phối Revenue", 
     xlab = "Doanh thu")

1 lần nữa xác nhận rõ ràng phân phối lệch phải mạnh của biến Revenue. Các điểm riêng lẻ xuất hiện ở vùng 30-50, trùng khớp với giá trị tối đa 56.7 trong thống kê. Khoảng cách xa từ p75 (~17) đến các điểm này cho thấy chúng thực sự là các giá trị cực trị

LS0tDQp0aXRsZTogIk5ISeG7hk0gVuG7pCBUVeG6pk4gMSAtIDEgxJBJ4buCTSBRVcOBIFRSw4xOSCINCmF1dGhvcjogIlbDtSBIb8OgbmcgVMOtbmggLSAyMjIxMDAwMzMxIg0KZGF0ZTogIjIwMjUtMDUtMTkiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICB0b2M6IHRydWUNCiAgcGRmX2RvY3VtZW50Og0KICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleA0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQojICoqUEjhuqZOIDEqKg0KIyMgKipDSMavxqBORyAxOiBNw5QgSMOMTkggVEjhu5BORyBLw4oqKg0KDQojIyMgKioxLjEgR2nhu5tpIHRoaeG7h3UgdsOgIHThu5VuZyBxdWFuKiogDQoNCiAgQ2jGsMahbmcgxJHhuqd1IHRpw6puIG3hu58gxJHhuqd1IGNobyBjdeG7kW4gc8OhY2ggYuG6sW5nIGPDoWNoIGdp4bubaSB0aGnhu4d1IHThu5VuZyBxdWFuIHbhu4EgbcO0IGjDrG5oIHRo4buRbmcga8OqLCB0cm9uZyDEkcOzIG3DtCBow6xuaCB0dXnhur9uIHTDrW5oIHThu5VuZyBxdcOhdCAoR2VuZXJhbGl6ZWQgTGluZWFyIE1vZGVsIOKAkyBHTE0pIMSRw7NuZyB2YWkgdHLDsiBj4buRdCBsw7VpIHh1ecOqbiBzdeG7kXQgbuG7mWkgZHVuZy4gQ2jGsMahbmcgbsOgeSDEkeG6t3QgbuG7gW4gdOG6o25nIGNobyBuZ8aw4budaSBo4buNYyB0aMO0bmcgcXVhIHZp4buHYyBnaeG6o2kgdGjDrWNoIGPDoWMga2jDoWkgbmnhu4dtIGPGoSBi4bqjbiwga8O9IGhp4buHdSBz4butIGThu6VuZyB0cm9uZyBtw7QgaMOsbmggdsOgIG5o4buvbmcgduG6pW4gxJHhu4EgdGhlbiBjaOG7kXQgY+G6p24gbMawdSDDvSBraGkgbMOgbSB2aeG7h2MgduG7m2kgZOG7ryBsaeG7h3UuDQoNCiAgTeG7mXQgdHJvbmcgbmjhu69uZyBu4buZaSBkdW5nIHF1YW4gdHLhu41uZyDEkcaw4bujYyDEkeG7gSBj4bqtcCBsw6AgY8OhY2ggYmnhu4N1IGRp4buFbiBk4buvIGxp4buHdSBi4bqxbmcgbmfDtG4gbmfhu68gdG/DoW4gaOG7jWMg4oCTIGLGsOG7m2MgxJHhuqd1IHRpw6puIMSR4buDIHjDonkgZOG7sW5nIG3DtCBow6xuaCBjw7MgdGjhu4MgeOG7rSBsw70gxJHGsOG7o2MuIELDqm4gY+G6oW5oIMSRw7MsIGNoxrDGoW5nIGPFqW5nIG5o4bqlbiBt4bqhbmggdmFpIHRyw7IgY+G7p2Egdmnhu4djIHRy4buxYyBxdWFuIGjDs2EgZOG7ryBsaeG7h3UgdGjDtG5nIHF1YSBiaeG7g3UgxJHhu5MgbmjhurFtIHBow6F0IGhp4buHbiBjw6FjIHh1IGjGsOG7m25nLCBt4buRaSBxdWFuIGjhu4cgdsOgIMSR4bq3YyDEkWnhu4NtIG7hu5VpIGLhuq10Lg0KDQogIFZp4buHYyB44butIGzDvSBjw6FjIGJp4bq/biBraMO0bmcgxJHhu4tuaCBsxrDhu6NuZywgbmjGsCBiaeG6v24gcGjDom4gbG/huqFpIGhheSBk4bqhbmcgdsSDbiBi4bqjbiwgY8WpbmcgxJHGsOG7o2MgdHLDrG5oIGLDoHkgdGjDtG5nIHF1YSBr4bu5IHRodeG6rXQgbcOjIGjDs2EsIGdpw7pwIGNodXnhu4NuIGNow7puZyB24buBIGThuqFuZyBz4buRIMSR4buDIMSRxrBhIHbDoG8gbcO0IGjDrG5oLiBU4burIMSRw7MsIG5nxrDhu51pIMSR4buNYyDEkcaw4bujYyBsw6BtIHF1ZW4gduG7m2kgY+G6pXUgdHLDumMgY8ahIGLhuqNuIGPhu6dhIG3hu5l0IG3DtCBow6xuaCB0aOG7kW5nIGvDqiwgYmFvIGfhu5NtIGhhaSB0aMOgbmggcGjhuqduOiBo4buHIHRo4buRbmcgKMSR4bqhaSBkaeG7h24gY2hvIHF1eSBsdeG6rXQgeMOhYyDEkeG7i25oKSB2w6Agbmfhuqt1IG5oacOqbiAoxJHhuqFpIGRp4buHbiBjaG8gcGjhuqduIGJp4bq/biB0aGnDqm4ga2jDtG5nIGdp4bqjaSB0aMOtY2ggxJHGsOG7o2MpLg0KDQogIFRp4bq/cCB0aGVvLCBjaMawxqFuZyBnaeG7m2kgdGhp4buHdSBuaMOzbSBtw7QgaMOsbmggaOG7k2kgcXV5IOKAkyBjw7RuZyBj4bulIHBow6JuIHTDrWNoIGNow61uaCDEkcaw4bujYyBz4butIGThu6VuZyB4dXnDqm4gc3Xhu5F0IGN14buRbiBzw6FjaCDigJMgdsOgIGjGsOG7m25nIGThuqtuIGPDoWNoIGRp4buFbiBnaeG6o2kga+G6v3QgcXXhuqMgY+G7p2EgbcO0IGjDrG5oIG3hu5l0IGPDoWNoIGPDsyDDvSBuZ2jEqWEuIELDqm4gY+G6oW5oIMSRw7MsIHTDoWMgZ2nhuqMgxJHGsGEgcmEgc28gc8OhbmggZ2nhu69hIG3DtCBow6xuaCB0aOG7kW5nIGvDqiB2w6AgbcO0IGjDrG5oIHbhuq10IGzDvSDEkeG7gyBnacO6cCBuZ8aw4budaSDEkeG7jWMgaGnhu4N1IHLDtSBz4buxIHTGsMahbmcgxJHhu5NuZyB2w6Aga2jDoWMgYmnhu4d0IGdp4buvYSBoYWkgY8OhY2ggdGnhur9wIGPhuq1uLg0KDQogIE5nb8OgaSByYSwgY2jGsMahbmcgY8WpbmcgbMOgbSByw7UgbeG7pWMgdGnDqnUgY+G7p2EgbcO0IGjDrG5oIHRo4buRbmcga8OqIHRyb25nIHZp4buHYyBtw7QgdOG6oywgZ2nhuqNpIHRow61jaCB2w6AgZOG7sSDEkW/DoW4gaGnhu4duIHTGsOG7o25nLCDEkeG7k25nIHRo4budaSBjaOG7iSByYSBoYWkgdGnDqnUgY2jDrSBxdWFuIHRy4buNbmcgxJHhu4MgxJHDoW5oIGdpw6EgbcO0IGjDrG5oOiDEkeG7mSBjaMOtbmggeMOhYyB2w6AgdMOtbmggxJHGoW4gZ2nhuqNuLiBN4buZdCBz4buRIGjhuqFuIGNo4bq/IGPhu6dhIG3DtCBow6xuaCB0aOG7kW5nIGvDqiBjxaluZyDEkcaw4bujYyBiw6BuIMSR4bq/biwgxJHhurdjIGJp4buHdCBsw6Agc+G7sSBraMOhYyBiaeG7h3QgZ2nhu69hIGThu68gbGnhu4d1IHF1YW4gc8OhdCAob2JzZXJ2YXRpb25hbCBkYXRhKSB2w6AgZOG7ryBsaeG7h3UgdGjhu7FjIG5naGnhu4dtIChleHBlcmltZW50YWwgZGF0YSksIGPDuW5nIHbhu5tpIG5o4buvbmcgdMOhYyDEkeG7mW5nIGPhu6dhIGNow7puZyDEkeG6v24gdmnhu4djIHN1eSBsdeG6rW4uDQoNCiAgS2jDoWkgbmnhu4dtIHbhu4Ega2jhuqMgbsSDbmcga2jDoWkgcXXDoXQgaMOzYSBj4bunYSBtw7QgaMOsbmgg4oCTIHThu6ljIG3hu6ljIMSR4buZIG3DoCBtw7QgaMOsbmggY8OzIHRo4buDIMOhcCBk4bulbmcgY2hvIGPDoWMgZOG7ryBsaeG7h3UgaG/hurdjIHTDrG5oIGh14buRbmcgbeG7m2kg4oCTIGPFqW5nIMSRxrDhu6NjIG5o4bqlbiBt4bqhbmggbmjGsCBt4buZdCB54bq/dSB04buRIHRoaeG6v3QgeeG6v3UgdHJvbmcgcGjDom4gdMOtY2ggdGjhu5FuZyBrw6ouIEN14buRaSBjw7luZywgY2jGsMahbmcga2jDqXAgbOG6oWkgYuG6sW5nIHBo4bqnbiBnaeG7m2kgdGhp4buHdSBjxqEgYuG6o24gduG7gSBwaOG6p24gbeG7gW0gUiwgY8O0bmcgY+G7pSBz4bq9IMSRxrDhu6NjIHPhu60gZOG7pW5nIHRyb25nIHN14buRdCBjdeG7kW4gc8OhY2ggxJHhu4MgbWluaCBo4buNYSB2w6AgdGjhu7FjIGjDoG5oIGPDoWMgbcO0IGjDrG5oIHRo4buRbmcga8OqLg0KDQojIyMgKioxLjIgIEPDoWMgcXV5IMaw4bubYyDEkeG7gyBtw7QgdOG6oyBk4buvIGxp4buHdSoqIA0KICBE4buvIGxp4buHdSB0b8OhbiBo4buNYzogYmnhur9uIHBo4bqjbiBo4buTaSAkeSQsIGJp4bq/biBnaeG6o2kgdGjDrWNoICR4XzEsIHhfMiwgXGxkb3RzLCB4X3AkLg0KICANCiAgUGjDom4gbG/huqFpIGJp4bq/biANCiAgDQogIC0gKipDb3ZhcmlhdGVzOioqIGJp4bq/biDEkeG7i25oIGzGsOG7o25nDQogIC0gKipGYWN0b3JzOioqIGJp4bq/biDEkeG7i25oIHTDrW5oDQogIA0KIyMjICoqMS4zIFbhur0gYmnhu4N1IMSR4buTKioNClBsb3R0aW5nIERhdGEgLSBW4bq9IGJp4buDdSDEkeG7kw0KLSBEw7luZyDEkeG7kyB0aOG7iyBuaMawIHNjYXR0ZXIgcGxvdHMsIHN0cmlwIGNoYXJ0cywgYm94cGxvdHMgxJHhu4MgcGjDoXQgaGnhu4duIHh1IGjGsOG7m25nLCBvdXRsaWVyLg0KICANCiMjIyAqKjEuNCBNw6MgaMOzYSBiaeG6v24gcGjDom4gbG/huqFpbG/huqFpKioNCkNvZGluZyBmb3IgRmFjdG9ycyAtIE3DoyBow7NhIGJp4bq/biBwaMOibiBsb+G6oWkNCg0KLSBCaeG6v24gZ2nhuqMgKER1bW15IHZhcmlhYmxlcyk6IGTDuW5nICRrLTEkIGJp4bq/biBnaeG6oyBjaG8gbeG7mXQgeeG6v3UgdOG7kSBjw7MgJGskIG3hu6ljLg0KICANCi0gUiBt4bq3YyDEkeG7i25oIHPhu60gZOG7pW5nIG3DoyBow7NhICJ0cmVhdG1lbnQgY29kaW5nIg0KICANCiMjIyAqKjEuNSAgU3RhdGlzdGljYWwgTW9kZWxzIERlc2NyaWJlIEJvdGggUmFuZG9tIGFuZCBTeXN0ZW1hdGljIEZlYXR1cmVzIG9mIERhdGEqKg0KU3RhdGlzdGljYWwgTW9kZWxzIERlc2NyaWJlIEJvdGggUmFuZG9tIGFuZCBTeXN0ZW1hdGljIEZlYXR1cmVzIG9mIERhdGEgLSBNw7QgaMOsbmggdGjhu5FuZyBrw6ogbcO0IHThuqMgY+G6oyB54bq/dSB04buRIG5n4bqrdSBuaGnDqm4gdsOgIGPDsyBo4buHIHRo4buRbmcgY+G7p2EgZOG7ryBsaeG7h3UNCg0KLSAqKlRow6BuaCBwaOG6p24gaOG7hyB0aOG7kW5nOioqIG3DtCB04bqjIHRydW5nIGLDrG5oIGPhu6dhIHBo4bqjbiBo4buTaSAkRSh5KSA9IM68ID0gzrLigoAgKyDOsuKCgXjigoEgKyAuLi4gKyDOsuKCmnjigpokDQogIA0KLSAqKlRow6BuaCBwaOG6p24gbmfhuqt1IG5oacOqbiAoUmFuZG9tKToqKiAkVmFyKHkpID0gz4PCsiQNCiAgDQotICoqVGjDoG5oIHBo4bqnbiBuZ+G6q3Ugbmhpw6puIChyYW5kb20gY29tcG9uZW50KSoqIG3DtCB04bqjIHBow6JuIHBo4buRaSBnacOhIHRy4buLIHBo4bqjbiBo4buTaSDhu6luZyB24bubaSBt4buXaSB04buVIGjhu6NwIGJp4bq/biBnaeG6o2kgdGjDrWNoLg0KDQotICoqVGjDoG5oIHBo4bqnbiBo4buHIHRo4buRbmcgKHN5c3RlbWF0aWMgY29tcG9uZW50KSoqIG3DtCB04bqjIG3hu5FpIHF1YW4gaOG7hyB0b8OhbiBo4buNYyBnaeG7r2EgdHJ1bmcgYsOsbmggcGjhuqNuIGjhu5NpIHbDoCBjw6FjIGJp4bq/biBnaeG6o2kgdGjDrWNoIChjaGnhu4F1IGNhbywgdHXhu5VpLCBnaeG7m2kgdMOtbmgsIGjDunQgdGh14buRYykuDQoNCi0gKipNw7QgaMOsbmggdGjhu5FuZyBrw6oqKiA9IHRow6BuaCBwaOG6p24gbmfhuqt1IG5oacOqbiArIHRow6BuaCBwaOG6p24gaOG7hyB0aOG7kW5nLCBtw7QgdOG6oyBj4bqjIGhhaSDEkeG6t2MgxJFp4buDbSBj4bunYSBk4buvIGxp4buHdSB0aOG7sWMgdOG6vy4NCg0KDQoNCg0KUGjhu5UgYmnhur9uIG5o4bqldCBsw6Aga2hpIG3DtCBow6xuaCB0dXnhur9uIHTDrW5oIHRyb25nIGPDoWMgdGhhbSBz4buROg0KDQokJA0KXG11X2kgPSBmKFxiZXRhXzAgKyBcYmV0YV8xIHhfe2kxfSArIFxjZG90cyArIFxiZXRhX3AgeF97aXB9KSBcdGFnezEuNX0NCiQkDQoNCiMjIyMgKipDw6FjIGThuqFuZyBtw7QgaMOsbmggaOG7k2kgcXV5OioqDQoNCi0gKipNw7QgaMOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmgqKjogdGjDoG5oIHBo4bqnbiBo4buHIHRo4buRbmcgY8OzIGThuqFuZzoNCg0KJCQNCkVbeV9pXSA9IFxtdV9pID0gXGJldGFfMCArIFxiZXRhXzEgeF97aTF9ICsgXGNkb3RzICsgXGJldGFfcCB4X3tpcH0gXHRhZ3sxLjZ9DQokJA0KDQotICoqTcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIHThu5VuZyBxdcOhdCAoR0xNKSoqOiB0aMOgbmggcGjhuqduIGjhu4cgdGjhu5FuZyBjw7MgZOG6oW5nOg0KDQokJA0KXG11X2kgPSBnXnstMX0oXGJldGFfMCArIFxiZXRhXzEgeF97aTF9ICsgXGNkb3RzICsgXGJldGFfcCB4X3tpcH0pDQokJA0KDQpob+G6t2M6DQoNCiQkDQpnKFxtdV9pKSA9IFxiZXRhXzAgKyBcYmV0YV8xIHhfe2kxfSArIFxjZG90cyArIFxiZXRhX3AgeF97aXB9DQokJA0KDQpUcm9uZyDEkcOzICRnKFxjZG90KSQgbMOgIG3hu5l0IGjDoG0gbGnDqm4ga+G6v3QgxJHGoW4gxJFp4buHdSAoY2jhurNuZyBo4bqhbiBuaMawIGjDoG0gbG9nYXJpdCkuDQoNCg0KIyMjIyAqKk3hu5l0IHPhu5EgcXV5IMaw4bubYzoqKg0KDQotIFPhu5EgbMaw4bujbmcgYmnhur9uIGdp4bqjaSB0aMOtY2g6ICR4XzEsIHhfMiwgXGxkb3RzLCB4X3AkLg0KLSBT4buRIGzGsOG7o25nIHRoYW0gc+G7kSBo4buTaSBxdXk6ICRcYmV0YV8wLCBcYmV0YV8xLCBcbGRvdHMsIFxiZXRhX3AkLg0KLSBO4bq/dSAkXGJldGFfMCQga2jDtG5nIMSR4buVaSB2w6AgcGjhuqduIGPDsm4gbOG6oWkgbMOgICR4X2okIHRow6wgc+G7kSBsxrDhu6NuZyBiaeG6v24gZ2nhuqNpIHRow61jaCBsw6AgJHAkLCBz4buRIGzGsOG7o25nIHRoYW0gc+G7kSBsw6AgJHAgKyAxJC4NCg0KQ8OhYyBtw7QgaMOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggbMOgIHRyxrDhu51uZyBo4bujcCDEkeG6t2MgYmnhu4d0IGPhu6dhIG3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCB04buVbmcgcXXDoXQsIHbhu5tpIGjDoG0gbGnDqm4ga+G6v3QgJGckIGzDoCBow6BtIMSR4buTbmcgbmjhuqV0Lg0KDQojIyAqKkNIxq/GoE5HIDI6IE3DlCBIw4xOSCBI4buSSSBRVVkgVFVZ4bq+TiBUw41OSCAtIExJTkVBUiBSRUdSRUVTU0lPTiBNT0RFTFMqKg0KIyMjICoqMi4xOiBJbnRyb2R1Y3Rpb24gYW5kIE92ZXJ2aWV3KioNCg0KIyMjIyBUw7NtIHThuq90IG7hu5lpIGR1bmcNCg0KLSAqKkxpbmVhciByZWdyZXNzaW9uIG1vZGVsKiogbMOgIG3DtCBow6xuaCBo4buTaSBxdXkgcGjhu5UgYmnhur9uIG5o4bqldCB0cm9uZyB0aOG7kW5nIGvDqiB2w6AgbMOgIHRy4buNbmcgdMOibSBt4bufIMSR4bqndSBj4bunYSBjaMawxqFuZyAyLg0KLSBDaMawxqFuZyBuw6B5IHRoaeG6v3QgbOG6rXAgKipuZ8O0biBuZ+G7rywga8O9IGhp4buHdSB2w6AgZ2nhuqMgxJHhu4tuaCBjxqEgYuG6o24qKiBjaG8gdOG6pXQgY+G6oyBuZ8aw4budaSDEkeG7jWMgdHLGsOG7m2Mga2hpIGNodXnhu4NuIHNhbmcgbcO0IGjDrG5oIHThu5VuZyBxdcOhdCBoxqFuIOKAkyAqKmdlbmVyYWxpemVkIGxpbmVhciBtb2RlbHMgKEdMTXMpKiouDQotICoqTGluZWFyIHJlZ3Jlc3Npb24gbW9kZWxzKiogxJHGsOG7o2MgeGVtIG5oxrAgbeG7mXQgdHLGsOG7nW5nIGjhu6NwIMSR4bq3YyBiaeG7h3QgY+G7p2EgR0xNcy4NCg0KIyMjICoqMi4yIExpbmVhciBSZWdyZXNzaW9uIE1vZGVscyBEZWZpbmVkKioNCg0KIyMjIyAqKkPhuqV1IHRyw7pjIGPGoSBi4bqjbiBj4bunYSBtw7QgaMOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmgqKg0KDQpMaW5lYXIgcmVncmVzc2lvbiBtb2RlbCBn4buTbSAyIHRow6BuaCBwaOG6p24gY2jDrW5oOg0KDQotICoqVGjDoG5oIHBo4bqnbiBuZ+G6q3Ugbmhpw6puIChyYW5kb20gY29tcG9uZW50KSoqOg0KICAtIEdp4bqjIMSR4buLbmggcGjGsMahbmcgc2FpIGPhu6dhIHBo4bqjbiBo4buTaSBcKCB5X2kgXCkgbMOgIGtow7RuZyDEkeG7lWk6ICANCiAgICBcWw0KICAgIFx0ZXh0e3Zhcn1beV9pXSA9IFxzaWdtYV4yIC8gd19pDQogICAgXF0NCiAgLSBcKCB3X2kgXCkgbMOgICoqdHLhu41uZyBz4buRIMawdSB0acOqbioqIMSRw6MgYmnhur90IChwcmlvciB3ZWlnaHRzKS4gTuG6v3UgXCggd19pID0gMSBcKSB24bubaSBt4buNaSBcKCBpIFwpLCBtw7QgaMOsbmggxJHGsOG7o2MgZ+G7jWkgbMOgICoqaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggdGjGsOG7nW5nIChvcmRpbmFyeSBsaW5lYXIgcmVncmVzc2lvbikqKi4NCg0KLSAqKlRow6BuaCBwaOG6p24gaOG7hyB0aOG7kW5nIChzeXN0ZW1hdGljIGNvbXBvbmVudCkqKjoNCiAgLSBL4buzIHbhu41uZyBj4bunYSBcKCB5X2kgXCkgbMOgIGvhur90IGjhu6NwIHR1eeG6v24gdMOtbmggY+G7p2EgY8OhYyBiaeG6v24gZ2nhuqNpIHRow61jaDoNCiAgICBcWw0KICAgIFxtdV9pID0gRVt5X2ldID0gXGJldGFfMCArIFxzdW1fe2o9MX1ee3B9IFxiZXRhX2ogeF97aml9DQogICAgXF0NCg0KIyMjIyAqKlBow6JuIGxv4bqhaSBtw7QgaMOsbmgqKg0KDQotICoqU2ltcGxlIGxpbmVhciByZWdyZXNzaW9uKio6IGtoaSBjaOG7iSBjw7MgMSBiaeG6v24gZ2nhuqNpIHRow61jaCBcKCAocCA9IDEpIFwpLg0KLSAqKk11bHRpcGxlIGxpbmVhciByZWdyZXNzaW9uKio6IGtoaSBjw7Mgbmhp4buBdSBoxqFuIDEgYmnhur9uIGdp4bqjaSB0aMOtY2ggXCggKHAgPiAxKSBcKS4NCi0gKipXZWlnaHRlZCBsaW5lYXIgcmVncmVzc2lvbioqOiBraGkgY8OhYyB0cuG7jW5nIHPhu5EgXCggd19pIFwpIGtow6FjIG5oYXUuDQotICoqT3JkaW5hcnkgbGluZWFyIHJlZ3Jlc3Npb24qKjoga2hpIG3hu41pIHRy4buNbmcgc+G7kSBcKCB3X2kgPSAxIFwpLg0KDQojIyMjICoqQ8OhYyBnaeG6oyDEkeG7i25oIGNow61uaCoqDQoNCi0gKipQaMO5IGjhu6NwIChTdWl0YWJpbGl0eSkqKjogQ8O5bmcgbeG7mXQgbcO0IGjDrG5oIMOhcCBk4bulbmcgY2hvIG3hu41pIHF1YW4gc8OhdC4NCi0gKipUdXnhur9uIHTDrW5oIChMaW5lYXJpdHkpKio6IFF1YW4gaOG7hyBnaeG7r2Ega+G7syB24buNbmcgXCggXG11IFwpIHbDoCBiaeG6v24gZ2nhuqNpIHRow61jaCBsw6AgdHV54bq/biB0w61uaC4NCi0gKipQaMawxqFuZyBzYWkga2jDtG5nIMSR4buVaSAoQ29uc3RhbnQgdmFyaWFuY2UpKio6IFBoxrDGoW5nIHNhaSBcKCBcc2lnbWFeMiBcKSBsw6Aga2jDtG5nIMSR4buVaSAoaG/hurdjIHThu7cgbOG7hyB24bubaSBcKCAxL3dfaSBcKSkuDQotICoqxJDhu5ljIGzhuq1wIChJbmRlcGVuZGVuY2UpKio6IEPDoWMgcGjhuqNuIGjhu5NpIFwoIHlfaSBcKSBsw6AgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUuDQoNCiMjIyMgKipWw60gZOG7pSBtaW5oIGjhu41hKioNCg0KLSBE4buvIGxp4buHdSBjw6JuIG7hurduZyBzxqEgc2luaCB0aGVvIHR14bqnbiB0deG7lWkgdGhhaSBr4buzIHThu6sgYuG7h25oIHZp4buHbiBTdCBHZW9yZ2XigJlzIChMb25kb24pIMSRxrDhu6NjIGTDuW5nIMSR4buDIG1pbmggaOG7jWEgbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIGdp4buvYSBjw6JuIG7hurduZyB2w6AgdHXhuqduIHR14buVaS4NCg0KIyMjICoqMi4zIFNpbXBsZSBMaW5lYXIgUmVncmVzc2lvbioqDQoNCiMjIyMgKioyLjMuMSBMZWFzdC1TcXVhcmVzIEVzdGltYXRpb24qKg0KDQotIE3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCDEkcahbiBjw7MgZOG6oW5nOg0KDQokJA0KXG11X2kgPSBFW3lfaV0gPSBcYmV0YV8wICsgXGJldGFfMSB4X2ksXHF1YWQgXHRleHR7VmFyfVt5X2ldID0gXHNpZ21hXjIgLyB3X2kNCiQkDQoNCi0gVOG7lW5nIHNhaSBz4buRIGLDrG5oIHBoxrDGoW5nIGPDsyB0cuG7jW5nIHPhu5EgY+G6p24gdOG7kWkgdGhp4buDdSBow7NhOg0KDQokJA0KUyhcYmV0YV8wLCBcYmV0YV8xKSA9IFxzdW1fe2k9MX1ebiB3X2kgKHlfaSAtIFxiZXRhXzAgLSBcYmV0YV8xIHhfaSleMg0KJCQNCg0KIyMjIyAqKjIuMy4yIENvZWZmaWNpZW50IEVzdGltYXRlcyoqDQoNCi0gVHJ1bmcgYsOsbmggY8OzIHRy4buNbmcgc+G7kToNCg0KJCQNClxiYXJ7eH1fdyA9IFxmcmFje1xzdW1fe2k9MX1ee259IHdfaSB4X2l9e1xzdW1fe2k9MX1ee259IHdfaX0sXHF1YWQNClxiYXJ7eX1fdyA9IFxmcmFje1xzdW1fe2k9MX1ee259IHdfaSB5X2l9e1xzdW1fe2k9MX1ee259IHdfaX0NCiQkDQoNCi0gxq/hu5tjIGzGsOG7o25nIGjhu4cgc+G7kToNCg0KJCQNClxoYXR7XGJldGF9XzEgPSBcZnJhY3tcc3VtX3tpPTF9Xm4gd19pICh4X2kgLSBcYmFye3h9X3cpKHlfaSl9e1xzdW1fe2k9MX1ebiB3X2kgKHhfaSAtIFxiYXJ7eH1fdyleMn0NCiQkDQoNCiQkDQpcaGF0e1xiZXRhfV8wID0gXGJhcnt5fV93IC0gXGhhdHtcYmV0YX1fMSBcYmFye3h9X3cNCiQkDQoNCiMjIyMgKioyLjMuMyBFc3RpbWF0aW5nIHRoZSBWYXJpYW5jZSBcKCBcc2lnbWFeMiBcKSoqDQoNCi0gUGjhuqduIGTGsDoNCg0KJCQNCmVfaSA9IHlfaSAtIFxoYXR7XG11fV9pID0geV9pIC0gXGhhdHtcYmV0YX1fMCAtIFxoYXR7XGJldGF9XzEgeF9pDQokJA0KDQotIFThu5VuZyBiw6xuaCBwaMawxqFuZyBwaOG6p24gZMawIChSU1MpOg0KDQokJA0KXHRleHR7UlNTfSA9IFxzdW1fe2k9MX1ebiB3X2kgZV9pXjINCiQkDQoNCi0gxq/hu5tjIGzGsOG7o25nIGtow7RuZyBjaOG7h2NoIGPhu6dhIHBoxrDGoW5nIHNhaToNCg0KJCQNCnNeMiA9IFxmcmFje1x0ZXh0e1JTU319e24gLSAyfQ0KJCQNCg0KIyMjIyAqKjIuMy40IFN0YW5kYXJkIEVycm9ycyBvZiBDb2VmZmljaWVudHMqKg0KDQotIFBoxrDGoW5nIHNhaSB2w6Agc2FpIHPhu5EgY2h14bqpbiBj4bunYSBcKCBcaGF0e1xiZXRhfV8xIFwpOg0KDQokJA0KXHRleHR7VmFyfVtcaGF0e1xiZXRhfV8xXSA9IFxmcmFje1xzaWdtYV4yfXtcc3VtX3tpPTF9Xm4gd19pICh4X2kgLSBcYmFye3h9X3cpXjJ9DQokJA0KDQokJA0KXHRleHR7U0V9W1xoYXR7XGJldGF9XzFdID0gXHNxcnR7IFxmcmFje3NeMn17XHN1bV97aT0xfV5uIHdfaSAoeF9pIC0gXGJhcnt4fV93KV4yfSB9DQokJA0KDQotIFNhaSBz4buRIGNodeG6qW4gY+G7p2EgXCggXGhhdHtcYmV0YX1fMCBcKToNCg0KJCQNClx0ZXh0e1NFfVtcaGF0e1xiZXRhfV8wXSA9IFxzcXJ0eyBzXjIgXGxlZnQoIFxmcmFjezF9e1xzdW0gd19pfSArIFxmcmFje1xiYXJ7eH1fd14yfXtcc3VtIHdfaSAoeF9pIC0gXGJhcnt4fV93KV4yfSBccmlnaHQpIH0NCiQkDQoNCiMjIyMgKioyLjMuNSBTdGFuZGFyZCBFcnJvcnMgb2YgRml0dGVkIFZhbHVlcyoqDQoNCi0gU2FpIHPhu5EgY2h14bqpbiBj4bunYSBnacOhIHRy4buLIGThu7EgxJFvw6FuOg0KDQokJA0KXGhhdHtcbXV9X2kgPSBcaGF0e1xiZXRhfV8wICsgXGhhdHtcYmV0YX1fMSB4X2kNCiQkDQoNCiQkDQpcdGV4dHtTRX1bXGhhdHtcbXV9X2ldID0gcyBcY2RvdCBcc3FydHsgXGZyYWN7MX17XHN1bSB3X2l9ICsgXGZyYWN7KHhfaSAtIFxiYXJ7eH1fdyleMn17XHN1bSB3X2kgKHhfaSAtIFxiYXJ7eH1fdyleMn0gfQ0KJCQNCg0KDQojIyMjICoqVOG7lW5nIGvhur90KioNCg0KLSBI4buTaSBxdXkgdHV54bq/biB0w61uaCDEkcahbiBsw6AgYsaw4bubYyDEkeG6p3UgY8ahIGLhuqNuIHRyb25nIHBow6JuIHTDrWNoIGjhu5NpIHF1eS4gVmnhu4djIMaw4bubYyBsxrDhu6NuZyBo4buHIHPhu5EsIHBoxrDGoW5nIHNhaSB2w6Agc2FpIHPhu5EgY2h14bqpbiBjaG8gcGjDqXAgxJHDoW5oIGdpw6EgbeG7qWMgxJHhu5kgdGluIGPhuq15IGPhu6dhIG3DtCBow6xuaC4gQ8OhYyBjw7RuZyB0aOG7qWMgdHLDqm4gbMOgIG7hu4FuIHThuqNuZyDEkeG7gyBt4bufIHLhu5luZyBzYW5nIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIGLhu5lpIHbDoCBnZW5lcmFsaXplZCBsaW5lYXIgbW9kZWxzLg0KDQoqKkdoaSBuaOG7myoqOiBLaeG7g20gdHJhIGPDoWMgZ2nhuqMgxJHhu4tuaCBj4bunYSBtw7QgaMOsbmggbMOgIHLhuqV0IHF1YW4gdHLhu41uZzogdHV54bq/biB0w61uaCwgcGjGsMahbmcgc2FpIGtow7RuZyDEkeG7lWksIMSR4buZYyBs4bqtcCB2w6AgbcO0IGjDrG5oIMOhcCBk4bulbmcgcGjDuSBo4bujcCBjaG8gdG/DoG4gYuG7mSBt4bqrdS4NCg0KIyMjICoqMi40IMav4bubYyBsxrDhu6NuZyB0cm9uZyBo4buTaSBxdXkgYuG7mWkgKG5oaeG7gXUgYmnhur9uKSoqDQoNCioqROG6oW5nIG1hIHRy4bqtbiBj4bunYSBtw7QgaMOsbmg6KioNCg0KTcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIGPDsyB0aOG7gyDEkcaw4bujYyB2aeG6v3QgZMaw4bubaSBk4bqhbmcgbWEgdHLhuq1uOg0KDQokJA0KeSA9IFhcYmV0YSArIFx2YXJlcHNpbG9uDQokJA0KICBUcm9uZyDEkcOzOg0KDQotIFwoeVwpOiB2ZWN0b3IgcGjhuqNuIGjhu5NpIChj4buhIFwobiBcdGltZXMgMVwpKQ0KLSBcKFhcKTogbWEgdHLhuq1uIHRoaeG6v3Qga+G6vyAoZGVzaWduIG1hdHJpeCkga8OtY2ggdGjGsOG7m2MgXChuIFx0aW1lcyAocCsxKVwpLCB24bubaSBj4buZdCDEkeG6p3UgdGnDqm4gdG/DoG4gc+G7kSAxICjhu6luZyB24bubaSBo4buHIHPhu5EgY2jhurduIFwoXGJldGFfMFwpKSwgY8OhYyBj4buZdCBjw7JuIGzhuqFpIGzDoCBnacOhIHRy4buLIGPhu6dhIGPDoWMgYmnhur9uIGdp4bqjaSB0aMOtY2ggXCh4X2pcKQ0KLSBcKFxiZXRhXCk6IHZlY3RvciBo4buHIHPhu5EgaOG7k2kgcXV5IChj4buhIFwoKHArMSkgXHRpbWVzIDFcKSkNCi0gXChcdmFyZXBzaWxvbiBcc2ltIFxtYXRoY2Fse059KDAsIFxzaWdtYV4yIEkpXCk6IHZlY3RvciBuaGnhu4V1IGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbiDEkWEgYmnhur9uIHbhu5tpIHRydW5nIGLDrG5oIDAgdsOgIHBoxrDGoW5nIHNhaSBcKFxzaWdtYV4yIElcKQ0KDQogIA0KKirGr+G7m2MgbMaw4bujbmcgT0xTOioqDQoNCiQkDQpcaGF0e1xiZXRhfSA9IChYXlQgVyBYKV57LTF9IFheVCBXIHkNCiQkDQoNCioqUGjhuqduIGTGsCB2w6AgcGjGsMahbmcgc2FpIMaw4bubYyBsxrDhu6NuZzoqKg0KDQotIEdpw6EgdHLhu4sgZOG7sSDEkW/DoW4gKGZpdHRlZCB2YWx1ZXMpOg0KDQokJA0KXGhhdHtcbXV9X2kgPSBcaGF0e3l9X2kgPSBcaGF0e1xiZXRhfV8wICsgXHN1bV97aj0xfV57cH0gXGhhdHtcYmV0YX1faiB4X3tqaX0NCiQkDQoNCg0KLSDGr+G7m2MgbMaw4bujbmcgcGjGsMahbmcgc2FpIHBo4bqnbiBkxrA6DQoNCiQkDQpzXjIgPSBcZnJhY3tSU1N9e24gLSBwJ30NCiQkDQoNCiMjICoqQ0jGr8agTkcgMzogQ0jhuqhOIMSQT8OBTiBNw5QgSMOMTkggSOG7kkkgUVVZIFRVWeG6vk4gVMONTkggKioNCkxpbmVhciBSZWdyZXNzaW9uIE1vZGVsczogRGlhZ25vc3RpY3MgYW5kIE1vZGVsLUJ1aWxkaW5nIChDaOG6qW4gxJFvw6FuIG3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCkgDQoNCiMjIyAqKjMuMS4gR2nhu5tpIHRoaeG7h3UgdsOgIHThu5VuZyBxdWFuKioNCg0KU2F1IGtoaSB4w6J5IGThu7FuZyBt4buZdCBtw7QgaMOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmgsIGPDtG5nIHZp4buHYyBraMO0bmcga+G6v3QgdGjDumMg4bufIHZp4buHYyDGsOG7m2MgbMaw4bujbmcgY8OhYyBo4buHIHPhu5EgaOG7k2kgcXV5IHbDoCBraeG7g20gxJHhu4tuaCDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouIE3hu5l0IGLGsOG7m2MgcXVhbiB0cuG7jW5nIGtow7RuZyB0aOG7gyB0aGnhur91IGzDoCBjaOG6qW4gxJFvw6FuIG3DtCBow6xuaCDigJMgdOG7qWMgbMOgIMSRw6FuaCBnacOhIHhlbSBtw7QgaMOsbmggxJHDoyDEkcaw4bujYyB4w6J5IGThu7FuZyBjw7MgdGjhu7FjIHPhu7EgcGjDuSBo4bujcCB24bubaSBk4buvIGxp4buHdSBoYXkga2jDtG5nLg0KDQpDaOG6qW4gxJFvw6FuIG3DtCBow6xuaCBo4buTaSBxdXkgbMOgIG3hu5l0IHBo4bqnbiB0aGnhur90IHnhur91IHRyb25nIHBow6JuIHTDrWNoIGThu68gbGnhu4d1IHbDrCBuw7MgZ2nDunAgdGE6DQoNCi0gICBYw6FjIG1pbmggY8OhYyBnaeG6oyDEkeG7i25oIGPGoSBi4bqjbiBj4bunYSBtw7QgaMOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggY8OzIMSRxrDhu6NjIHRo4buPYSBtw6NuIGhheSBraMO0bmcgKHbDrSBk4bulIG5oxrAgcXVhbiBo4buHIHR1eeG6v24gdMOtbmgsIHBoxrDGoW5nIHNhaSBraMO0bmcgxJHhu5VpLCBwaMOibiBwaOG7kWkgY2h14bqpbuKApikuDQoNCi0gICBQaMOhdCBoaeG7h24gbmjhu69uZyBxdWFuIHPDoXQgYuG6pXQgdGjGsOG7nW5nIG5oxrAgxJFp4buDbSBuZ2/huqFpIGxhaSAob3V0bGllcnMpIGhv4bq3YyDEkWnhu4NtIGPDsyDhuqNuaCBoxrDhu59uZyBs4bubbiAoaW5mbHVlbnRpYWwgb2JzZXJ2YXRpb25zKSDigJMgbmjhu69uZyDEkWnhu4NtIGPDsyB0aOG7gyBiw7NwIG3DqW8ga+G6v3QgcXXhuqMgxrDhu5tjIGzGsOG7o25nIGhv4bq3YyBraeG7g20gxJHhu4tuaC4NCg0KLSAgIMSQw6FuaCBnacOhIMSR4buZIHRpbiBj4bqteSBj4bunYSBjw6FjIGjhu4cgc+G7kSDGsOG7m2MgbMaw4bujbmcuDQoNCsSQ4buBIHh14bqldCBjw6FjaCBj4bqjaSB0aGnhu4duIG3DtCBow6xuaCwgdsOtIGThu6U6IGJp4bq/biDEkeG7lWkgYmnhur9uLCB0aMOqbSBob+G6t2MgYuG7m3QgYmnhur9uIGdp4bqjaSB0aMOtY2gsIHPhu60gZOG7pW5nIG3DtCBow6xuaCBwaGkgdHV54bq/biBob+G6t2MgdOG7lW5nIHF1w6F0IChHTE0pIHRoYXkgdGjhur8uDQoNCk7hur91IGLhu48gcXVhIGLGsOG7m2MgbsOgeSwgbmfGsOG7nWkgcGjDom4gdMOtY2ggZOG7hSByxqFpIHbDoG8gYuG6q3kgY+G7p2Egdmnhu4djIOKAnHBow7kgaOG7o3AgcXXDoSBt4bupY+KAnSAob3ZlcmZpdHRpbmcpLCBoaeG7g3Ugc2FpIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgY8OhYyBiaeG6v24sIGhv4bq3YyBk4buxIMSRb8OhbiBzYWkgbOG7h2NoIHRyb25nIHRo4buxYyB04bq/LiBEbyDEkcOzLCBjaOG6qW4gxJFvw6FuIG3DtCBow6xuaCBraMO0bmcgcGjhuqNpIGzDoCB0w7l5IGNo4buNbiDigJMgbcOgIGzDoCBt4buZdCBwaOG6p24gYuG6r3QgYnXhu5ljIHRyb25nIHBow6JuIHTDrWNoIGjhu5NpIHF1eSBuZ2hpw6ptIHTDumMuDQoNClRyb25nIGNoxrDGoW5nIG7DoHksIGNow7puZyB0YSBz4bq9IGjhu41jIGPDoWNoOg0KDQotICAgS2nhu4NtIHRyYSBjw6FjIGdp4bqjIMSR4buLbmggY+G7p2EgbcO0IGjDrG5oIGjhu5NpIHF1eS4NCg0KLSAgIFPhu60gZOG7pW5nIHBo4bqnbiBkxrAgKHJlc2lkdWFscykgxJHhu4Mga2nhu4NtIHRyYSDEkeG7mSBwaMO5IGjhu6NwLg0KDQotICAgUGjDoXQgaGnhu4duIHbDoCB44butIGzDvSBjw6FjIMSRaeG7g20g4bqjbmggaMaw4bufbmcgbOG7m24uDQoNCi0gICDEkG8gbMaw4budbmcgaGnhu4duIHTGsOG7o25nIMSRYSBj4buZbmcgdHV54bq/biB2w6AgY8OhY2ggZ2nhuqNtIHRoaeG7g3UuDQoNCiMjIyAqKjMuMiBHaeG6oyDEkeG7i25oIHRyb25nIG3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCoqDQoNCk3hu5l0IG3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCB0acOqdSBjaHXhuqluIMSRw7JpIGjhu49pIHBo4bqjaSB0aOG7j2EgbcOjbiA0IGdp4bqjIMSR4buLbmggY8ahIGLhuqNuOg0KDQoqKjEuIEdp4bqjIMSR4buLbmggMTogUXVhbiBo4buHIHR1eeG6v24gdMOtbmgqKg0KDQotIE3DtCBow6xuaCBnaeG6oyDEkeG7i25oIHLhurFuZyB0cnVuZyBiw6xuaCBj4bunYSBiaeG6v24gcGjhuqNuIGjhu5NpIFwoeVwpIGzDoCBow6BtIHR1eeG6v24gdMOtbmggY+G7p2EgY8OhYyBiaeG6v24gZ2nhuqNpIHRow61jaCBcKHhfMSwgeF8yLCBcbGRvdHMsIHhfcFwpLg0KDQotIE7hur91IHF1YW4gaOG7hyB0aOG6rXQgc+G7sSBsw6AgcGhpIHR1eeG6v24gbcOgIHRhIHbhuqtuIGTDuW5nIG3DtCBow6xuaCB0dXnhur9uIHTDrW5oLCBr4bq/dCBxdeG6oyDGsOG7m2MgbMaw4bujbmcgY8OzIHRo4buDIGLhu4sgdGhpw6puIGzhu4djaCB2w6AgZOG7sSDEkW/DoW4gc2FpLg0KDQpcKFxSaWdodGFycm93XCkgKipDw6FjaCBraeG7g20gdHJhOioqIHbhur0gYmnhu4N1IMSR4buTIHBo4bqnbiBkxrAgc28gduG7m2kgZ2nDoSB0cuG7iyBk4buxIMSRb8OhbiwgbuG6v3UgdGjhuqV5IHh1IGjGsOG7m25nIGNvbmcgKHBhcmFib2xhLCBTLXNoYXBl4oCmKSB0aMOsIGPDsyB0aOG7gyBsw6AgbcO0IGjDrG5oIHNhaSBk4bqhbmcuDQoNCioqMi4gR2nhuqMgxJHhu4tuaCAyOiAgUGjGsMahbmcgc2FpIGtow7RuZyDEkeG7lWkgKEhvbW9zY2VkYXN0aWNpdHkpKioNCg0KLSBQaMawxqFuZyBzYWkgY+G7p2Egc2FpIHPhu5EgXChcdmFyZXBzaWxvbl9pXCkgbMOgIG5oxrAgbmhhdSDhu58gbeG7jWkgbeG7qWMgZ2nDoSB0cuG7iyBj4bunYSBcKHhcKToNCg0KJCQNClx0ZXh0e1Zhcn0oeV9pKSA9IFxzaWdtYV4yDQokJA0KDQotIE7hur91IHBoxrDGoW5nIHNhaSB0aGF5IMSR4buVaSB0aGVvIFwoeFwpLCB0YSBjw7MgaGnhu4duIHTGsOG7o25nICoqcGjGsMahbmcgc2FpIHRoYXkgxJHhu5VpIChoZXRlcm9zY2VkYXN0aWNpdHkpKiosIGThuqtuIMSR4bq/biDGsOG7m2MgbMaw4bujbmcga2jDtG5nIGhp4buHdSBxdeG6oyB2w6Agc2FpIGzhu4djaCB0cm9uZyBraeG7g20gxJHhu4tuaC4NCg0KXChcUmlnaHRhcnJvd1wpICoqQ8OhY2gga2nhu4NtIHRyYToqKiB24bq9IMSR4buTIHRo4buLIHBo4bqnbiBkxrAuIE7hur91IHBo4bqnbiBkxrAgY8OzIGThuqFuZyBow6xuaCBuw7NuIChy4buZbmcgZOG6p24gaG/hurdjIGjhurlwIGzhuqFpKSB0aMOsIGPDsyB0aOG7gyBi4buLIGhldGVyb3NjZWRhc3RpY2l0eS4NCg0KKiozLiBHaeG6oyDEkeG7i25oIDM6IMSQ4buZYyBs4bqtcCoqDQoNCi0gQ8OhYyBxdWFuIHPDoXQgXCgoeF9pLCB5X2kpXCkgcGjhuqNpIMSR4buZYyBs4bqtcCBuaGF1Lg0KDQotIE7hur91IGThu68gbGnhu4d1IGPDsyB0w61uaCBjaHXhu5dpIHRo4budaSBnaWFuLCBk4buvIGxp4buHdSBs4buTbmcgZ2jDqXAgKG5lc3RlZCBkYXRhKSBob+G6t2MgcGjDom4gbmjDs20gKGNsdXN0ZXJlZCksIHRow6wgbcO0IGjDrG5oIHR1eeG6v24gdMOtbmggY8ahIGLhuqNuIGtow7RuZyBjw7JuIHBow7kgaOG7o3AuDQoNClwoXFJpZ2h0YXJyb3dcKSAqKkPDoWNoIGtp4buDbSB0cmE6KiogbuG6v3UgZOG7ryBsaeG7h3UgdGhlbyB0aOG7nWkgZ2lhbiwgbsOqbiBraeG7g20gdHJhIHBo4bqnbiBkxrAgY8OzIHh1IGjGsOG7m25nIChhdXRvY29ycmVsYXRpb24pIGhheSBraMO0bmcuDQoNCioqNC4gR2nhuqMgxJHhu4tuaCA0OiBQaMOibiBwaOG7kWkgY2h14bqpbiBj4bunYSBzYWkgc+G7kSoqDQoNCi0gTeG6t2MgZMO5IGtow7RuZyBi4bqvdCBideG7mWMgxJHhu4MgxrDhu5tjIGzGsOG7o25nIE9MUywgZ2nhuqMgxJHhu4tuaCBuw6B5IHLhuqV0IHF1YW4gdHLhu41uZyDEkeG7gyBraeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dCB2w6AgdMOtbmgga2hv4bqjbmcgdGluIGPhuq15Og0KJCQNClx2YXJlcHNpbG9uX2kgXHNpbSBcbWF0aGNhbHtOfSgwLCBcc2lnbWFeMikNCiQkDQoNClwoXFJpZ2h0YXJyb3dcKSAqKkPDoWNoIGtp4buDbSB0cmE6KiogZMO5bmcgYmnhu4N1IMSR4buTIFEtUSBwbG90IChxdWFudGlsZS1xdWFudGlsZSkgxJHhu4Mgc28gc8OhbmggcGjhuqduIGTGsCB24bubaSBwaMOibiBwaOG7kWkgY2h14bqpbi4NCg0KIyMjICoqMy4zIEPDoWMgbG/huqFpIHBo4bqnbiBkxrAgKFJlc2lkdWFscykqKg0KDQpQaOG6p24gZMawIGzDoCBjw7RuZyBj4bulIHRydW5nIHTDom0gxJHhu4MgY2jhuqluIMSRb8OhbiBtw7QgaMOsbmguIEPDsyBuaGnhu4F1IGPDoWNoIHTDrW5oIHBo4bqnbiBkxrA6DQoNCioqMS4gUmF3IHJlc2lkdWFsIChQaOG6p24gZMawIHRow7QpOioqDQoNCiQkDQplX2kgPSB5X2kgLSBcaGF0e3l9X2kNCiQkDQrEkMahbiBnaeG6o24gbMOgIGhp4buHdSBnaeG7r2EgZ2nDoSB0cuG7iyB0aOG7sWMgdOG6vyB2w6AgZ2nDoSB0cuG7iyBk4buxIMSRb8Ohbi4NCg0KKioyLiBTdGFuZGFyZGl6ZWQgcmVzaWR1YWwgKFBo4bqnbiBkxrAgY2h14bqpbiBow7NhKToqKg0KDQokJA0Kcl9pID0gXGZyYWN7ZV9pfXtcaGF0e1xzaWdtYX0gXHNxcnR7MSAtIGhfe2lpfX19DQokJA0KDQotIEdpw7pwIHNvIHPDoW5oIHBo4bqnbiBkxrAgZ2nhu69hIGPDoWMgxJFp4buDbSBjw7MgbGV2ZXJhZ2Uga2jDoWMgbmhhdS4NCg0KLSBcKCBoX3tpaX0gXCk6IGxldmVyYWdlIOKAkyBt4bupYyDhuqNuaCBoxrDhu59uZyBj4bunYSDEkWnhu4NtIFwoIGkgXCkgbMOqbiBk4buxIMSRb8OhbiBcKCBcaGF0e3l9X2kgXCkuDQoNCioqMy4gU3R1ZGVudGl6ZWQgcmVzaWR1YWw6KioNCg0KJCQNCnRfaSA9IFxmcmFje2VfaX17XGhhdHtcc2lnbWF9X3soaSl9IFxzcXJ0ezEgLSBoX3tpaX19fQ0KJCQNCg0KLSBHaeG7kW5nIHN0YW5kYXJkaXplZCByZXNpZHVhbCBuaMawbmcgZMO5bmcgXChcaGF0e1xzaWdtYX1feyhpKX1cKSDigJMgcGjGsMahbmcgc2FpIMaw4bubYyBsxrDhu6NuZyBraMO0bmcgZMO5bmcgcXVhbiBzw6F0IFwoaVwpIFwoXHJpZ2h0YXJyb3dcKSBjaMOtbmggeMOhYyBoxqFuLg0KDQotIETDuW5nIMSR4buDIHBow6F0IGhp4buHbiBuZ2/huqFpIGxhaSB2w6wgbsOzIGfhuqduIHbhu5tpIHBow6JuIHBo4buRaSB0Lg0KDQojIyMgKiozLjQgQmnhu4N1IMSR4buTIHBo4bqnbiBkxrAgKFJlc2lkdWFsIFBsb3RzKSoqDQoNCk3hu5l0IHPhu5EgYmnhu4N1IMSR4buTIHF1YW4gdHLhu41uZzoNCg0KLSAqKlJlc2lkdWFsIHZzIEZpdHRlZCBQbG90OioqIGtp4buDbSB0cmEgdHV54bq/biB0w61uaCB2w6AgcGjGsMahbmcgc2FpIGtow7RuZyDEkeG7lWkuDQoNCi0gKipOb3JtYWwgUS1RIFBsb3QqKjoga2nhu4NtIHRyYSBwaMOibiBwaOG7kWkgY2h14bqpbiBj4bunYSBwaOG6p24gZMawLg0KDQotICoqU2NhbGUtTG9jYXRpb24gUGxvdDoqKiBjaHXhuqluIGjDs2EgcGjhuqduIGTGsCDEkeG7gyBk4buFIHBow6F0IGhp4buHbiBoZXRlcm9zY2VkYXN0aWNpdHkuDQoNCi0gKipSZXNpZHVhbHMgdnMgTGV2ZXJhZ2UgUGxvdDoqKiB4w6FjIMSR4buLbmggxJFp4buDbSDhuqNuaCBoxrDhu59uZyBs4bubbi4NCg0KIyMjICoqMy41IE5nb+G6oWkgbGFpIChPdXRsaWVycykqKg0KDQoqKsSQ4buLbmggbmdoxKlhOioqIEzDoCBjw6FjIMSRaeG7g20gZOG7ryBsaeG7h3UgbcOgIGdpw6EgdHLhu4sgcGjhuqNuIGjhu5NpIFwoIHlfaSBcKSBraMOhYyBiaeG7h3QgbOG7m24gc28gduG7m2kgZOG7sSDEkW/DoW4gdOG7qyBtw7QgaMOsbmgsIGTDuSBiaeG6v24gXCggeF9pIFwpIGtow7RuZyBi4bqldCB0aMaw4budbmcuDQoNCkTDuW5nIHN0dWRlbnRpemVkIHJlc2lkdWFsIMSR4buDIGtp4buDbSB0cmEuDQoNClF1eSB04bqvYyBuZ8aw4buhbmc6DQoNCi0gXCh8dF9pfCA+IDJcKTogbmdoaSBuZ+G7nS4NCg0KLSBcKHx0X2l8ID4gM1wpOiBjw7MgdGjhu4MgbMOgIG5nb+G6oWkgbGFpIMSRw6FuZyBr4buDLg0KDQpcKFxSaWdodGFycm93XCkgKipOZ2/huqFpIGxhaSBraMO0bmcgbmjhuqV0IHRoaeG6v3QgY8OzIOG6o25oIGjGsOG7n25nIGzhu5tuKiosIG5oxrBuZyBj4bqnbiBraeG7g20gdHJhIGvhu7kuDQojIyAqKkNIxq/GoE5HIDQ6IMav4buaQyBMxq/hu6JORyBI4buiUCBMw50gVOG7kEkgxJBBKioNCk1heGltdW0gbGlrZWhvb2QgZXN0aW1hdGlvbiAtIE1MRSAoxrDhu5tjIGzGsOG7o25nIGjhu6NwIGzDvSB04buRaSDEkWEpDQoNCiMjIyAqKjQuMSBHaeG7m2kgdGhp4buHdSoqDQoNClBoxrDGoW5nIHBow6FwIGLDrG5oIHBoxrDGoW5nIHThu5FpIHRoaeG7g3UgKE9MUykgY2jhu4kgaG/huqF0IMSR4buZbmcgaGnhu4d1IHF14bqjIGtoaSBk4buvIGxp4buHdSB0aOG7j2EgbcOjbiBjw6FjIGdp4bqjIMSR4buLbmggbmjGsCBwaMOibiBwaOG7kWkgY2h14bqpbiwgcGjGsMahbmcgc2FpIGtow7RuZyDEkeG7lWksIHbDoCBiaeG6v24gcGjhuqNuIGjhu5NpIGxpw6puIHThu6VjLiBUdXkgbmhpw6puLCBuaGnhu4F1IGxv4bqhaSBk4buvIGxp4buHdSB0aOG7sWMgdOG6vyBraMO0bmcgdHXDom4gdGhlbyBuaOG7r25nIMSRaeG7gXUga2nhu4duIMSRw7Mg4oCTIHbDrSBk4bulOiBk4buvIGxp4buHdSBuaOG7iyBwaMOibiwgxJHhur9tLCBob+G6t2MgZMawxqFuZyBsacOqbiB04bulYy4gS2hpIMSRw7MsIE1heGltdW0gTGlrZWxpaG9vZCBFc3RpbWF0aW9uIChNTEUpIGzDoCBwaMawxqFuZyBwaMOhcCBt4bqhbmggbeG6vSBoxqFuLCBkw7luZyDEkeG7gyDGsOG7m2MgbMaw4bujbmcgY8OhYyB0aGFtIHPhu5EgdHJvbmcgbcO0IGjDrG5oIHThu5VuZyBxdcOhdC4NCg0KTUxFIGzDoCBu4buBbiB04bqjbmcgY2hvIG3DtCBow6xuaCB0dXnhur9uIHTDrW5oIHThu5VuZyBxdcOhdCAoR0xNKSwgduG7kW4gbMOgIHRydW5nIHTDom0gY+G7p2EgcGjhuqduIGPDsm4gbOG6oWkgdHJvbmcgc8OhY2guDQoNCiMjIyAqKjQuMiBIw6BtIGjhu6NwIGzDvSAoTGlrZWxpaG9vZCBGdW5jdGlvbikqKg0KDQoqKsSQ4buLbmggbmdoxKlhOioqIEjDoG0gaOG7o3AgbMO9IGzDoCBt4buZdCBow6BtIHjDoWMgc3XhuqV0IGPhu6dhIHRvw6BuIGLhu5kgZOG7ryBsaeG7h3UgxJHDoyBxdWFuIHPDoXQsIGJp4buDdSBkaeG7hW4gbmjGsCBt4buZdCBow6BtIGPhu6dhIHRoYW0gc+G7kSBcKFx0aGV0YVwpLg0KDQpHaeG6oyBz4butIHRhIGPDsyBt4buZdCBt4bqrdSBn4buTbSBcKG5cKSBxdWFuIHPDoXQgxJHhu5ljIGzhuq1wIFwoeV8xLCB5XzIsIFxsZG90cywgeV9uXCksIHbhu5tpIG3hu5dpIFwoeV9pXCkgY8OzIHBow6JuIHBo4buRaSB4w6FjIHN14bqldCBcKGYoeV9pOyBcdGhldGEpXCksIHRow6w6DQoNCioqSMOgbSBo4bujcCBsw706KioNCg0KJCQNCkwoXHRoZXRhKSA9IFxwcm9kX3tpPTF9XntufSBmKHlfaTsgXHRoZXRhKQ0KJCQNCg0KLSBcKEwoXHRoZXRhKVwpOiBow6BtIGjhu6NwIGzDvQ0KDQotIFwoXHRoZXRhXCk6IHZlY3RvciBjw6FjIHRoYW0gc+G7kSBj4bqnbiDGsOG7m2MgbMaw4bujbmcNCg0KLSBcKGYoeV9pOyBcdGhldGEpXCk6IG3huq10IMSR4buZIHjDoWMgc3XhuqV0IChob+G6t2Mga2jhu5FpIHjDoWMgc3XhuqV0KSBj4bunYSBcKHlfaVwpDQoNCioqTG9nLWjhu6NwIGzDvSAobG9nLWxpa2VsaWhvb2QpOioqDQoNCiQkDQpcZWxsKFx0aGV0YSkgPSBcbG9nIEwoXHRoZXRhKSA9IFxzdW1fe2k9MX1ee259IFxsb2cgZih5X2k7IFx0aGV0YSkNCiQkDQoNCi0gROG7hSDEkeG6oW8gaMOgbSBoxqFuIHbDrCB0w61jaCB0aMOgbmggdOG7lW5nLg0KDQotIEdpw6EgdHLhu4sgY+G7sWMgxJHhuqFpIGPhu6dhIFwoXGVsbChcdGhldGEpXCkgdHLDuW5nIHbhu5tpIFwoTChcdGhldGEpXCkuDQoNCiMjIyAqKjQuMyDGr+G7m2MgbMaw4bujbmcgaOG7o3AgbMO9IHThu5FpIMSRYSAoTWF4aW11bSBMaWtlbGlob29kIEVzdGltYXRpb24g4oCTIE1MRSkqKg0KDQoqKsSQ4buLbmggbmdoxKlhOioqIE1MRSBsw6AgZ2nDoSB0cuG7iyBcKFxoYXR7XHRoZXRhfVwpIGPhu6dhIHRoYW0gc+G7kSBcKFx0aGV0YVwpIHNhbyBjaG8gbG9nLWxpa2VsaWhvb2QgxJHhuqF0IGPhu7FjIMSR4bqhaS4NCg0KDQokJA0KXGhhdHtcdGhldGF9ID0gXGFyZ1xtYXhfe1x0aGV0YX0gXCwgXGVsbChcdGhldGEpDQokJA0KxJDhu4MgdMOsbSBcKFxoYXR7XHRoZXRhfVwpLCB0YSBnaeG6o2k6DQoNCiQkDQpcZnJhY3tkXGVsbChcdGhldGEpfXtkXHRoZXRhfSA9IDANCiQkDQoNClwoXFJpZ2h0YXJyb3dcKSDEkMOieSBn4buNaSBsw6AgKnBoxrDGoW5nIHRyw6xuaCDEkWnhu4NtKiAoc2NvcmUgZXF1YXRpb24pLg0KDQojIyMgKio0LjQgTWEgdHLhuq1uIHRow7RuZyB0aW4gRmlzaGVyIHbDoCBwaMawxqFuZyBzYWkqKg0KDQoqKjEuIEjDoG0gxJFp4buDbSAoU2NvcmUgRnVuY3Rpb24pOioqDQoNCiQkDQpVKFx0aGV0YSkgPSBcZnJhY3tkXGVsbChcdGhldGEpfXtkXHRoZXRhfQ0KJCQNCg0KLSBcKFUoXHRoZXRhKVwpOiDEkeG7mSBk4buRYyBj4bunYSBsb2ctbGlrZWxpaG9vZCB0aGVvIFwoXHRoZXRhXCkNCg0KKioyLiBNYSB0cuG6rW4gdGjDtG5nIHRpbiBGaXNoZXI6KioNCg0KJCQNCkkoXHRoZXRhKSA9IC1cbWF0aGJie0V9IFxsZWZ0WyBcZnJhY3tkXjIgXGVsbChcdGhldGEpfXtkXHRoZXRhXjJ9IFxyaWdodF0NCiQkDQoNCi0gXChJKFx0aGV0YSlcKToga+G7syB24buNbmcgw6JtIGPhu6dhIMSR4bqhbyBow6BtIGLhuq1jIGhhaSBsb2ctbGlrZWxpaG9vZCDihpIgxJFvIMSR4buZIGNvbmcuDQoNCi0gTMOgIHjhuqVwIHjhu4kgbmfGsOG7o2MgbOG6oWkgY+G7p2EgcGjGsMahbmcgc2FpOg0KJCQNClxtYXRocm17VmFyfShcaGF0e1x0aGV0YX0pIFxhcHByb3ggXGZyYWN7MX17SShcdGhldGEpfQ0KJCQNCg0KIyMjICoqNC41IEPDoWMgdMOtbmggY2jhuqV0IGPhu6dhIE1MRSoqDQoNCk1MRSBjw7Mgbmhp4buBdSB0w61uaCBjaOG6pXQgdOG7kXQgduG7gSBt4bq3dCBsw70gdGh1eeG6v3QsIMSR4bq3YyBiaeG7h3Qga2hpIGvDrWNoIHRoxrDhu5tjIG3huqt1IG4gbOG7m246DQoNCnwgVMOtbmggY2jhuqV0ICAgICAgICAgICAgICAgIHwgR2nhuqNpIHRow61jaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgKipOaOG6pXQgcXXDoW4qKiAgICAgICAgICAgIHwgJFxoYXR7XHRoZXRhfSBcdG8gXHRoZXRhJCBraGkgJG4gXHRvIFxpbmZ0eSQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKktow7RuZyBjaOG7h2NoIHRp4buHbSBj4bqtbioqIHwgxJDhu5kgbOG7h2NoIGdp4buvYSAkXGhhdHtcdGhldGF9JCB2w6AgJFx0aGV0YSQgdGnhur9uIHbhu4EgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKkhp4buHdSBxdeG6oyoqICAgICAgICAgICAgIHwgTUxFIMSR4bqhdCBnaeG7m2kgaOG6oW4gQ3JhbcOpcuKAk1JhbywgbMOgIMaw4bubYyBsxrDhu6NuZyAidOG7kXQgbmjhuqV0IiAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKlRp4buHbSBj4bqtbiBjaHXhuqluKiogICAgICAgfCBLaGkgJG4kIGzhu5tuLCBwaMOibiBwaOG7kWkgY+G7p2EgJFxoYXR7XHRoZXRhfSQgZ+G6p24gY2h14bqpbjogJFxoYXR7XHRoZXRhfSBcc2ltIFxtYXRoY2Fse059KFx0aGV0YSwgSShcdGhldGEpXnstMX0pJCB8DQoNCiMjICoqQ0jGr8agTkcgNTogQ+G6pFUgVFLDmkMgQ+G7pkEgTcOUIEjDjE5IIFRVWeG6vk4gVMONTkggVOG7lE5HIFFVw4FUIChHTE0gU1RSVUNUVVJFKSoqDQoNCiMjIyAqKjUuMSBHaeG7m2kgdGhp4buHdSoqDQoNCk3DtCBow6xuaCB0dXnhur9uIHTDrW5oIHThu5VuZyBxdcOhdCAoR0xNKSBsw6AgbeG7mXQga2h1w7RuIGto4buVIG3huqFuaCBt4bq9IGNobyB2aeG7h2MgbcO0IGjDrG5oIGjDs2EgY8OhYyBsb+G6oWkgZOG7ryBsaeG7h3Uga2jDoWMgbmhhdSDigJMga2jDtG5nIGNo4buJIGThu68gbGnhu4d1IGxpw6puIHThu6VjIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbiBuaMawIHRyb25nIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oLiBHTE0gYmFvIGfhu5NtIGjhu5NpIHF1eSBsb2dpc3RpYywgaOG7k2kgcXV5IFBvaXNzb24sIGjhu5NpIHF1eSBHYW1tYS4uLiB2w6AgbeG7nyBy4buZbmcga2jhuqMgbsSDbmcgcGjDom4gdMOtY2ggxJHhur9uIGThu68gbGnhu4d1IG5o4buLIHBow6JuLCDEkeG6v20sIHThu7cgbOG7hyB2w6AgZMawxqFuZyBsacOqbiB04bulYy4NCg0KTeG7l2kgR0xNIMSRxrDhu6NjIHjDonkgZOG7sW5nIHRyw6puIGPDuW5nIG3hu5l0IG5ndXnDqm4gbMO9IGNodW5nIGfhu5NtIGJhIHRow6BuaCBwaOG6p24gY2jDrW5oOiBwaMOibiBwaOG7kWkgeMOhYyBzdeG6pXQsIGjDoG0gbGnDqm4ga+G6v3QsIHbDoCB0aMOgbmggcGjhuqduIHR1eeG6v24gdMOtbmguDQoNCiMjIyAqKjUuMiBD4bqldSB0csO6YyAzIHBo4bqnbiBj4bunYSBHTE0qKg0KDQoqKjEuIFRow6BuaCBwaOG6p24gbmfhuqt1IG5oacOqbiAoUmFuZG9tIGNvbXBvbmVudCkqKg0KDQpCaeG6v24gcGjhuqNuIGjhu5NpIFwoIHlfaSBcKSDEkcaw4bujYyBnaeG6oyDEkeG7i25oIHBow6JuIHBo4buRaSB0aGVvIG3hu5l0IHBow6JuIHBo4buRaSB0aHXhu5ljIGjhu40gaMOgbSBtxakgbeG7mXQgdGhhbSBz4buRIChPbmUtUGFyYW1ldGVyIEV4cG9uZW50aWFsIEZhbWlseSk6DQoNCiQkDQpmKHlfaTsgXHRoZXRhX2ksIFxwaGkpID0gXGV4cCBcbGVmdFx7IFxmcmFje3lfaSBcdGhldGFfaSAtIGIoXHRoZXRhX2kpfXtccGhpfSArIGMoeV9pLCBccGhpKSBccmlnaHRcfQ0KJCQNCg0KLSAqKsOdIG5naMSpYSBjw6FjIGvDvSBoaeG7h3U6KioNCg0KICAtIFwoXHRoZXRhX2lcKTogdGhhbSBz4buRIHThu7Egbmhpw6puIChuYXR1cmFsIHBhcmFtZXRlcikNCiAgLSBcKFxwaGlcKTogdGhhbSBz4buRIHBow6JuIHTDoW4gKGRpc3BlcnNpb24gcGFyYW1ldGVyKSwga2jDtG5nIHBo4bqjaSBsw7pjIG7DoG8gY8WpbmcgY8OzICh2w60gZOG7pSBQb2lzc29uIHRow6wgXChccGhpID0gMVwpKQ0KICAtIFwoYihcdGhldGFfaSlcKTogaMOgbSBsb2cgcGFydGl0aW9uDQogIC0gXChjKHlfaSwgXHBoaSlcKTogaMOgbSBjaHXhuqluIGjDs2EgxJHhu4MgYuG6o28gdG/DoG4gdMOtY2ggcGjDom4gYuG6sW5nIDENCg0K4oaSIEjhu40gaMOgbSBtxakgYmFvIGfhu5NtIE5vcm1hbCwgUG9pc3NvbiwgQmlub21pYWwsIEdhbW1hLC4uLg0KDQoNCioqMi4gVGjDoG5oIHBo4bqnbiBo4buHIHRo4buRbmcgKFN5c3RlbWF0aWMgY29tcG9uZW50KSoqDQoNCkdp4buRbmcgbmjGsCBo4buTaSBxdXkgdHV54bq/biB0w61uaCwgR0xNIHbhuqtuIGTDuW5nIG3hu5l0IHByZWRpY3RvciB0dXnhur9uIHTDrW5oOg0KDQokJA0KXGV0YV9pID0geF9pXlQgXGJldGEgPSBcYmV0YV8wICsgXGJldGFfMSB4X3tpMX0gKyBcY2RvdHMgKyBcYmV0YV9wIHhfe2lwfQ0KJCQNCg0Kw50gbmdoxKlhOg0KDQotIFwoXGV0YV9pXCk6IHByZWRpY3RvciB0dXnhur9uIHTDrW5oDQotIFwoeF9pXCk6IHZlY3RvciBow6BuZyBn4buTbSBjw6FjIGJp4bq/biBnaeG6o2kgdGjDrWNoIGPhu6dhIHF1YW4gc8OhdCBcKGlcKQ0KLSBcKFxiZXRhXCk6IHZlY3RvciBo4buHIHPhu5EgaOG7k2kgcXV5DQoNCsSQw6J5IGzDoCB0aMOgbmggcGjhuqduIGNo4bupYSDhuqNuaCBoxrDhu59uZyBj4bunYSBjw6FjIGJp4bq/biDEkeG7mWMgbOG6rXAgbMOqbiBtw7QgaMOsbmguDQoNCg0KKiozLiBIw6BtIGxpw6puIGvhur90IChMaW5rIGZ1bmN0aW9uKSoqDQoNCkdMTSBkw7luZyBt4buZdCBow6BtIGxpw6puIGvhur90IFwoIGcoXGNkb3QpIFwpIMSR4buDIGvhur90IG7hu5FpIHRydW5nIGLDrG5oIFwoXG11X2kgPSBFW3lfaV1cKSB24bubaSBwcmVkaWN0b3IgdHV54bq/biB0w61uaCBcKFxldGFfaVwpOg0KDQokJA0KZyhcbXVfaSkgPSBcZXRhX2kgXHF1YWQgXHRleHR7aGF5fSBccXVhZCBcbXVfaSA9IGdeey0xfShcZXRhX2kpDQokJA0KDQrihpIgQ2hvIHBow6lwIG3DtCBow6xuaCBow7NhIGPDoWMgYmnhur9uIHBo4bqjbiBo4buTaSBjw7MgxJHhurdjIHTDrW5oIHBoaSB0dXnhur9uLCBraMO0bmcgw6JtLCBnaeG7m2kgaOG6oW4gdHJvbmcga2hv4bqjbmcgKDAsMSks4oCmDQoNCioqSMOgbSBsacOqbiBr4bq/dCB0aMaw4budbmcgZMO5bmc6KioNCg0KfCBQaMOibiBwaOG7kWkgIHwgXChcbXVfaSA9IEVbeV9pXVwpICAgIHwgTGluayBmdW5jdGlvbiBcKGcoXG11KVwpICAgICAgICAgICAgICAgICAgIHwgR2hpIGNow7ogICAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBOb3JtYWwgICAgIHwgXChcbXUgXGluIFxtYXRoYmJ7Un1cKSAgfCBcKGcoXG11KSA9IFxtdVwpIChpZGVudGl0eSkgICAgICAgICAgICAgICAgfCBI4buTaSBxdXkgdHV54bq/biB0w61uaCBjaHXhuqluICAgfA0KfCBCaW5vbWlhbCAgIHwgXChcbXUgXGluICgwLDEpXCkgICAgICAgfCBcKGcoXG11KSA9IFxsb2cgXGZyYWN7XG11fXsxLVxtdX1cKSAgICAgICAgfCBMb2dpc3RpYyByZWdyZXNzaW9uICAgICAgICB8DQp8IFBvaXNzb24gICAgfCBcKFxtdSA+IDBcKSAgICAgICAgICAgICB8IFwoZyhcbXUpID0gXGxvZyhcbXUpXCkgICAgICAgICAgICAgICAgICAgICAgfCBI4buTaSBxdXkgxJHhur9tICAgICAgICAgICAgICAgfA0KfCBHYW1tYSAgICAgIHwgXChcbXUgPiAwXCkgICAgICAgICAgICAgfCBcKGcoXG11KSA9IFxsb2coXG11KVwpIGhv4bq3YyBcKGcoXG11KSA9IFxmcmFjezF9e1xtdX1cKSB8IE3DtCBow6xuaCBk4buvIGxp4buHdSBkxrDGoW5nICAgIHwNCg0KIyMjICoqNS4zIFbDrSBk4bulIG3DtCBow6xuaCBow7NhIHRyb25nIEdMTSoqDQoNCioqMS4gSOG7k2kgcXV5IExvZ2lzdGljIChuaOG7iyBwaMOibikqKg0KDQpcWw0KeV9pIFxzaW0gXHRleHR7QmVybm91bGxpfShccGlfaSkNClxdDQoNClxbDQpnKFxwaV9pKSA9IFxsb2cgXGxlZnQoXGZyYWN7XHBpX2l9ezEtXHBpX2l9XHJpZ2h0KSA9IFxldGFfaQ0KXF0NCg0KXFsNClxwaV9pID0gUCh5X2kgPSAxIFxtaWQgeF9pKQ0KXF0NCg0KLSBEw7luZyBjaG8gZOG7ryBsaeG7h3UgbmjGsDogc+G7kW5nL2No4bq/dCwgbXVhL2tow7RuZyBtdWEsIMSRw7puZy9zYWnigKYNCg0KDQoqKjIuIEjhu5NpIHF1eSBQb2lzc29uICjEkeG6v20pKioNCg0KXFsNCnlfaSBcc2ltIFx0ZXh0e1BvaXNzb259KFxtdV9pKQ0KXF0NCg0KXFsNClxsb2coXG11X2kpID0geF9pXlQgXGJldGENClxdDQoNCi0gXChcbXVfaVwpOiBz4buRIHPhu7Ega2nhu4duIGvhu7MgduG7jW5nIHjhuqN5IHJhLg0KDQotIETDuW5nIGNobyBk4buvIGxp4buHdTogc+G7kSBjYSBi4buHbmgsIHPhu5EgbOG6p24gdmkgcGjhuqFtLCBz4buRIGdpYW8gZOG7i2No4oCmDQoNCg0KKiozLiBI4buTaSBxdXkgR2FtbWEgKGTGsMahbmcgbGnDqm4gdOG7pWMpKioNCg0KXFsNCnlfaSBcc2ltIFx0ZXh0e0dhbW1hfShcYWxwaGEsIFxtdV9pKQ0KXF0NCg0KSMOgbSBsacOqbiBr4bq/dDoNCg0KXFsNCmcoXG11X2kpID0gXGxvZyhcbXVfaSkgXHF1YWQgXHRleHR7aG/hurdjfSBccXVhZCBnKFxtdV9pKSA9IFxmcmFjezF9e1xtdV9pfQ0KXF0NCg0KLSBEw7luZyBjaG8gZOG7ryBsaeG7h3UgY2hpIHBow60sIMSR4buZIGTDoGksIHRo4budaSBnaWFuDQoNCiMjIyAqKjUuNCBIw6BtIHBoxrDGoW5nIHNhaSAoVmFyaWFuY2UgRnVuY3Rpb24pKioNCg0KVHJvbmcgR0xNLCBwaMawxqFuZyBzYWkgY+G7p2EgXCggeV9pIFwpIGtow7RuZyBj4bqnbiBi4bqxbmcgbmhhdSBtw6AgxJHGsOG7o2MgbcO0IGjDrG5oIGjDs2EgbmjGsCBow6BtIGPhu6dhIFwoIFxtdV9pIFwpOg0KDQpcWw0KXHRleHR7VmFyfSh5X2kpID0gXHBoaSBcY2RvdCBWKFxtdV9pKQ0KXF0NCg0KVHJvbmcgxJHDszoNCg0KLSBcKCBccGhpIFwpOiB0aGFtIHPhu5EgcGjDom4gdMOhbiAoZGlzcGVyc2lvbiBwYXJhbWV0ZXIpDQotIFwoIFYoXG11KSBcKTogaMOgbSBwaMawxqFuZyBzYWkgcGjhu6UgdGh14buZYyB2w6BvIHRydW5nIGLDrG5oIFwoIFxtdSBcKQ0KDQpIw6BtIFwoIFYoXG11KSBcKSB0w7l5IHRoZW8gcGjDom4gcGjhu5FpIG5oxrAgc2F1Og0KDQp8IFBow6JuIHBo4buRaSAgfCBcKCBWKFxtdSkgXCkgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgTm9ybWFsICAgICB8IDEgICAgICAgICAgICAgICAgICAgICB8DQp8IEJpbm9taWFsICAgfCBcKCBcbXUgKDEgLSBcbXUpIFwpICAgfA0KfCBQb2lzc29uICAgIHwgXCggXG11IFwpICAgICAgICAgICAgIHwNCnwgR2FtbWEgICAgICB8IFwoIFxtdV4yIFwpICAgICAgICAgICB8DQoNClZp4buHYyBtw7QgaMOsbmggaMOzYSBwaMawxqFuZyBzYWkgbmjGsCB0csOqbiBnacO6cCB44butIGzDvSDEkcaw4bujYyBoaeG7h24gdMaw4bujbmcgcGjGsMahbmcgc2FpIHRoYXkgxJHhu5VpIChoZXRlcm9zY2VkYXN0aWNpdHkpLCB24buRbiBsw6AgbeG7mXQgZ2nhuqMgxJHhu4tuaCBi4buLIHZpIHBo4bqhbSB0cm9uZyBwaMawxqFuZyBwaMOhcCBPTFMgKEjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIHRow7RuZyB0aMaw4budbmcpLg0KDQojIyMgKio1LjUgQ8OhYyBraMOhaSBuaeG7h20gbeG7nyBy4buZbmcqKg0KDQoqKkNhbm9uaWNhbCBMaW5rIEZ1bmN0aW9uKiogbMOgIGjDoG0gbGnDqm4ga+G6v3Qgc2FvIGNobyBwcmVkaWN0b3IgdHV54bq/biB0w61uaCBjaMOtbmggbMOgIHRoYW0gc+G7kSB04buxIG5oacOqbiBcKFx0aGV0YVwpIHRyb25nIHBow6JuIHBo4buRaSBo4buNIGjDoG0gbcWpOg0KDQpcWw0KXHRoZXRhX2kgPSBcZXRhX2kgPSB4X2leVCBcYmV0YQ0KXF0NCg0KVsOtIGThu6UgduG7gSBow6BtIGxpw6puIGvhur90IGNodeG6qW4gKGNhbm9uaWNhbCBsaW5rKToNCg0KfCBQaMOibiBwaOG7kWkgfCBIw6BtIGxpw6puIGvhur90IChMaW5rIGZ1bmN0aW9uKSAgICB8DQp8LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgfA0KfCBCaW5vbWlhbCAgfCBsb2dpdDogXChcbG9nXGZyYWN7XG11fXsxLVxtdX1cKXwNCnwgUG9pc3NvbiAgIHwgbG9nOiBcKFxsb2coXG11KVwpICAgICAgICAgICAgICB8DQp8IE5vcm1hbCAgICB8IGlkZW50aXR5OiBcKFxtdVwpICAgICAgICAgICAgICAgfA0KDQo+ICoqTMawdSDDvToqKiBEw7kgR0xNIGfhu41pIGzDoCAidHV54bq/biB0w61uaCIsIG5oxrBuZyBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIFwoIHkgXCkgdsOgIFwoIHggXCkgY8OzIHRo4buDICoqcGhpIHR1eeG6v24qKiBkbyBz4butIGThu6VuZyBow6BtIGxpw6puIGvhur90IChsaW5rIGZ1bmN0aW9uKS4NCg0KIyMgKipDSMavxqBORyA2OiDGr+G7mkMgTMav4buiTkcgVFJPTkcgTcOUIEjDjE5IIFRVWeG6vk4gVMONTkggVOG7lE5HIFFVw4FUIChHTE1zKSoqDQoNCiMjIyAqKjYuMSBHaeG7m2kgdGhp4buHdSoqDQoNClNhdSBraGkgeMOhYyDEkeG7i25oIMSRxrDhu6NjIGPhuqV1IHRyw7pjIGPhu6dhIG3hu5l0IEdMTSAoZ+G7k20gcGjDom4gcGjhu5FpIHjDoWMgc3XhuqV0LCBow6BtIGxpw6puIGvhur90IHbDoCB0aMOgbmggcGjhuqduIHR1eeG6v24gdMOtbmgpLCBixrDhu5tjIHRp4bq/cCB0aGVvIGzDoCDGsOG7m2MgbMaw4bujbmcgY8OhYyBo4buHIHPhu5EgaOG7k2kgcXV5IFwoXGJldGFcKSB0cm9uZyBtw7QgaMOsbmguDQoNCktow6FjIHbhu5tpIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIGPhu5UgxJFp4buDbiDigJMgbsahaSB0YSBkw7luZyBwaMawxqFuZyBwaMOhcCBiw6xuaCBwaMawxqFuZyB04buRaSB0aGnhu4N1IChPTFMpIOKAkyB0cm9uZyBHTE0sIGPDoWMgaOG7hyBz4buRIMSRxrDhu6NjIMaw4bubYyBsxrDhu6NuZyBi4bqxbmcgKipwaMawxqFuZyBwaMOhcCBo4bujcCBsw70gdOG7kWkgxJFhIChNYXhpbXVtIExpa2VsaWhvb2QgRXN0aW1hdGlvbiAtIE1MRSkqKiB0aMO0bmcgcXVhIG3hu5l0IHRodeG6rXQgdG/DoW4gZ+G7jWkgbMOgICoqSXRlcmF0aXZlbHkgUmV3ZWlnaHRlZCBMZWFzdCBTcXVhcmVzIChJUkxTKSoqLg0KDQpQaMawxqFuZyBwaMOhcCBJUkxTIHRo4buxYyBoaeG7h24gdmnhu4djIGPhuq1wIG5o4bqtdCBjw6FjIMaw4bubYyBsxrDhu6NuZyBcKFxiZXRhXCkgbOG6t3AgxJFpIGzhurdwIGzhuqFpLCBt4buXaSBs4bqnbiBk4buxYSB0csOqbiB0cuG7jW5nIHPhu5EgxJHGsOG7o2MgxJFp4buBdSBjaOG7iW5oIHNhbyBjaG8gcGjDuSBo4bujcCB24bubaSBwaMOibiBwaOG7kWkgY+G7p2EgZOG7ryBsaeG7h3UgdsOgIGjDoG0gbGnDqm4ga+G6v3QgxJHGsOG7o2MgY2jhu41uLg0KDQojIyMgKio2LjIgVOG7lW5nIHF1YW4gduG7gSDGsOG7m2MgbMaw4bujbmcgaOG7o3AgbMO9IHThu5FpIMSRYSAoTUxFKSB0cm9uZyBHTE0qKg0KDQoqKkNobyBk4buvIGxp4buHdSBn4buTbToqKg0KDQotIEJp4bq/biBwaOG6o24gaOG7k2k6IFwoIHlfMSwgeV8yLCBcbGRvdHMsIHlfbiBcKSBjw7MgdGjhu4MgbMOgIGJp4bq/biDEkeG6v20sIG5o4buLIHBow6JuIGhv4bq3YyBsacOqbiB04bulYyBkxrDGoW5n4oCmDQoNCi0gQmnhur9uIGdp4bqjaSB0aMOtY2g6IFwoIHhfe2kxfSwgXGxkb3RzLCB4X3tpcH0gXCkgduG7m2kgXChpPTEsIFxsZG90cywgblwpLg0KDQoqKk3DtCBow6xuaCBHTE0gxJHGsOG7o2MgYmnhu4N1IGRp4buFbiBuaMawIHNhdToqKg0KDQpcWw0KZyhcbXVfaSkgPSBcZXRhX2kgPSBcbWF0aGJme3h9X2leVCBcYm9sZHN5bWJvbHtcYmV0YX0NClxdDQoNCnbhu5tpDQoNClxbDQpcbXVfaSA9IEVbeV9pXSA9IGdeey0xfShcbWF0aGJme3h9X2leVCBcYm9sZHN5bWJvbHtcYmV0YX0pDQpcXQ0KDQpN4bulYyB0acOqdSBsw6AgdMOsbSDGsOG7m2MgbMaw4bujbmcgXChcaGF0e1xib2xkc3ltYm9se1xiZXRhfX1cKSBzYW8gY2hvIGjDoG0gbG9nLWxpa2VsaWhvb2QgxJHhuqF0IGPhu7FjIMSR4bqhaToNCg0KXFsNClxlbGwoXGJvbGRzeW1ib2x7XGJldGF9KSA9IFxzdW1fe2k9MX1ebiBcbG9nIGYoeV9pOyBcdGhldGFfaSkNClxdDQoNCioqVHJvbmcgxJHDszoqKg0KDQotIFwoZih5X2k7IFx0aGV0YV9pKVwpIGzDoCBow6BtIG3huq10IMSR4buZIHjDoWMgc3XhuqV0IChob+G6t2MgaMOgbSBraOG7kWkgeMOhYyBzdeG6pXQpIGPhu6dhIGJp4bq/biBcKHlfaVwpLA0KDQotIFwoXHRoZXRhX2lcKSBsw6AgdGhhbSBz4buRIHThu7Egbmhpw6puIHRyb25nIHBow6JuIHBo4buRaSB0aHXhu5ljIGjhu40gaMOgbSBtxaksDQoNCi0gXChcdGhldGFfaVwpIGPDsyBxdWFuIGjhu4cgduG7m2kgXChcbXVfaVwpLCB04burIMSRw7MgbGnDqm4gaOG7hyB24bubaSBcKFxib2xkc3ltYm9se1xiZXRhfVwpLg0KDQpWaeG7h2MgxrDhu5tjIGzGsOG7o25nIG7DoHkgdGjGsOG7nW5nIMSRxrDhu6NjIHRo4buxYyBoaeG7h24gYuG6sW5nIHBoxrDGoW5nIHBow6FwICoqaOG7o3AgbMO9IHThu5FpIMSRYSAoTUxFKSoqLCBz4butIGThu6VuZyB0aHXhuq10IHRvw6FuICoqSXRlcmF0aXZlbHkgUmV3ZWlnaHRlZCBMZWFzdCBTcXVhcmVzIChJUkxTKSoqLg0KDQojIyMgKio2LjMgUGjGsMahbmcgcGjDoXAgSVJMUyAoSXRlcmF0aXZlbHkgUmV3ZWlnaHRlZCBMZWFzdCBTcXVhcmVzKSoqDQoNCioqMS4gVGh14bqtdCB0b8OhbiBJUkxTIChJdGVyYXRpdmVseSBSZXdlaWdodGVkIExlYXN0IFNxdWFyZXMpOioqDQoNCkdMTSBz4butIGThu6VuZyB0aHXhuq10IHRvw6FuIElSTFMgxJHhu4MgdMOsbSDGsOG7m2MgbMaw4bujbmcgXChcaGF0e1xib2xkc3ltYm9se1xiZXRhfX1cKS4gVGh14bqtdCB0b8OhbiBk4buxYSB0csOqbiB2aeG7h2MgbOG6t3AgbOG6oWkgY8OhYyBixrDhu5tjIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIGPDsyB0cuG7jW5nIHPhu5EuDQoNCioqMi4gw50gdMaw4bufbmcgY8ahIGLhuqNuOioqDQoNCi0g4bueIG3hu5dpIHbDsm5nIGzhurdwLCBtw7QgaMOsbmggR0xNIMSRxrDhu6NjIHjhuqVwIHjhu4kgYuG6sW5nIG3hu5l0IGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIHbhu5tpIHRy4buNbmcgc+G7kS4NCg0KLSAqKkJp4bq/biBnaeG6oyAod29ya2luZyByZXNwb25zZSkqKiBcKCBcbWF0aGJme3p9IFwpIHbDoCAqKm1hIHRy4bqtbiB0cuG7jW5nIHPhu5EqKiBcKCBcbWF0aGJme1d9IFwpIMSRxrDhu6NjIGPhuq1wIG5o4bqtdCBsacOqbiB04bulYyDhu58gbeG7l2kgYsaw4bubYy4NCg0KKiozLiBI4buHIHBoxrDGoW5nIHRyw6xuaCBJUkxTOioqDQoNClxbDQpcbWF0aGJme1h9XlQgXG1hdGhiZntXfSBcbWF0aGJme1h9IFxoYXR7XGJvbGRzeW1ib2x7XGJldGF9fSA9IFxtYXRoYmZ7WH1eVCBcbWF0aGJme1d9IFxtYXRoYmZ7en0NClxdDQoNClRyb25nIMSRw7M6DQoNCi0gXChcbWF0aGJme1h9XCkgbMOgIG1hIHRy4bqtbiB0aGnhur90IGvhur8sDQoNCi0gXChcbWF0aGJme1d9XCkgbMOgIG1hIHRy4bqtbiB0cuG7jW5nIHPhu5Ega8OtY2ggdGjGsOG7m2MgXChuIFx0aW1lcyBuXCksDQoNCi0gXChcbWF0aGJme3p9XCkgbMOgIHZlY3RvciBiaeG6v24gZ2nhuqMgXChuIFx0aW1lcyAxXCksIHTDrW5oIHRoZW8gY8O0bmcgdGjhu6ljOg0KDQpcWw0Kel9pID0gXGV0YV9pICsgXGZyYWN7eV9pIC0gXG11X2l9e1xmcmFje2QgXG11X2l9e2QgXGV0YV9pfX0NClxdDQoNCi0gVHLhu41uZyBz4buRIFwoV19pXCkgxJHGsOG7o2MgdMOtbmggdGhlbzoNCg0KXFsNCldfaSA9IFxsZWZ0KFxmcmFje2QgXG11X2l9e2QgXGV0YV9pfVxyaWdodCleMiBcQmlnLyBcbWF0aHJte1Zhcn0oeV9pKQ0KXF0NCg0KUXXDoSB0csOsbmggbsOgeSDEkcaw4bujYyBs4bq3cCBs4bqhaSBjaG8gxJHhur9uIGtoaSBjw6FjIMaw4bubYyBsxrDhu6NuZyBcKFxib2xkc3ltYm9se1xiZXRhfVwpIGjhu5lpIHThu6UuDQoNCiMjIyAqKjYuNCBIw6BtIMSRaeG7g20sIG1hIHRy4bqtbiBGaXNoZXIgdsOgIHBoxrDGoW5nIHNhaSBj4bunYSDGsOG7m2MgbMaw4bujbmcqKg0KDQoqKkjDoG0gxJFp4buDbSAoU2NvcmUgRnVuY3Rpb24pKioNCg0KSMOgbSDEkWnhu4NtIGzDoCDEkeG6oW8gaMOgbSBj4bunYSBsb2ctbGlrZWxpaG9vZCB0aGVvIHZlY3RvciBo4buHIHPhu5EgXChcYm9sZHN5bWJvbHtcYmV0YX1cKToNCg0KXFsNClUoXGJvbGRzeW1ib2x7XGJldGF9KSA9IFxmcmFje1xwYXJ0aWFsIFxlbGwoXGJvbGRzeW1ib2x7XGJldGF9KX17XHBhcnRpYWwgXGJvbGRzeW1ib2x7XGJldGF9fQ0KXF0NCg0KxJDDonkgbMOgIGjhu4cgcGjGsMahbmcgdHLDrG5oIG3DoCBraGkgZ2nhuqNpIFwoVShcYm9sZHN5bWJvbHtcYmV0YX0pID0gMFwpLCB0YSB0aHUgxJHGsOG7o2MgxrDhu5tjIGzGsOG7o25nIGPhu7FjIMSR4bqhaSBcKFxoYXR7XGJvbGRzeW1ib2x7XGJldGF9fVwpLg0KDQoNCioqTWEgdHLhuq1uIHRow7RuZyB0aW4gRmlzaGVyKioNCg0KTWEgdHLhuq1uIHRow7RuZyB0aW4gRmlzaGVyIGzDoCBr4buzIHbhu41uZyDDom0gY+G7p2EgxJHhuqFvIGjDoG0gYuG6rWMgaGFpIGPhu6dhIGxvZy1saWtlbGlob29kOg0KDQpcWw0KXG1hdGhjYWx7SX0oXGJvbGRzeW1ib2x7XGJldGF9KSA9IC0gXG1hdGhiYntFfSBcbGVmdFsgXGZyYWN7XHBhcnRpYWxeMiBcZWxsKFxib2xkc3ltYm9se1xiZXRhfSl9e1xwYXJ0aWFsIFxib2xkc3ltYm9se1xiZXRhfSBcLCBccGFydGlhbCBcYm9sZHN5bWJvbHtcYmV0YX1eVH0gXHJpZ2h0XQ0KXF0NCg0KTWEgdHLhuq1uIG7DoHkgxJHDs25nIHZhaSB0csOyIG5oxrAgbeG7mXQgdGjGsOG7m2MgxJFvIMSR4buZICJz4bqvYyBuw6l0IiBj4bunYSBsb2ctbGlrZWxpaG9vZCB04bqhaSDEkWnhu4NtIGPhu7FjIMSR4bqhaSB2w6AgxJHGsOG7o2MgZMO5bmcgxJHhu4MgxJHDoW5oIGdpw6EgxJHhu5kgY2jDrW5oIHjDoWMgY+G7p2EgxrDhu5tjIGzGsOG7o25nLg0KDQoNCioqUGjGsMahbmcgc2FpIGPhu6dhIFwoXGhhdHtcYm9sZHN5bWJvbHtcYmV0YX19XCkqKg0KDQpLaGkgxJHDoyBjw7MgbWEgdHLhuq1uIHRow7RuZyB0aW4gRmlzaGVyLCBwaMawxqFuZyBzYWkgaGnhu4dwIHBoxrDGoW5nIHNhaSBj4bunYSB2ZWN0b3IgaOG7hyBz4buRIMaw4bubYyBsxrDhu6NuZyDEkcaw4bujYyB0w61uaCBsw6A6DQoNClxbDQpcbWF0aHJte1Zhcn0oXGhhdHtcYm9sZHN5bWJvbHtcYmV0YX19KSA9IFxtYXRoY2Fse0l9KFxoYXR7XGJvbGRzeW1ib2x7XGJldGF9fSleey0xfQ0KXF0NCg0KTuG6v3Ugc+G7rSBk4bulbmcgdGh14bqtdCB0b8OhbiAqKklSTFMqKiwgbWEgdHLhuq1uIHRow7RuZyB0aW4gRmlzaGVyIMSRxrDhu6NjIHjhuqVwIHjhu4kgYuG7n2k6DQoNClxbDQpcbWF0aHJte1Zhcn0oXGhhdHtcYm9sZHN5bWJvbHtcYmV0YX19KSA9IChcbWF0aGJme1h9XlQgXG1hdGhiZntXfSBcbWF0aGJme1h9KV57LTF9DQpcXQ0KDQpUcm9uZyDEkcOzOg0KDQotIFwoXG1hdGhiZntYfVwpOiBtYSB0cuG6rW4gdGhp4bq/dCBr4bq/LA0KDQotIFwoXG1hdGhiZntXfVwpOiBtYSB0cuG6rW4gdHLhu41uZyBz4buRIHThuqFpIG5naGnhu4dtIGjhu5lpIHThu6UsDQoNCi0gQ8O0bmcgdGjhu6ljIG7DoHkgeHXhuqV0IGhp4buHbiB04buxIG5oacOqbiB04burIGLGsOG7m2MgZ2nhuqNpIGjhu4cgcGjGsMahbmcgdHLDrG5oIElSTFMuDQoNCg0KKipHaGkgY2jDuioqDQoNCi0gQ8O0bmcgdGjhu6ljIHBoxrDGoW5nIHNhaSB0csOqbiBy4bqldCBxdWFuIHRy4buNbmcgxJHhu4MgdMOtbmgga2hv4bqjbmcgdGluIGPhuq15IHbDoCBraeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dCB0cm9uZyBHTE0uDQoNCi0gVuG7m2kgY8OhYyBtw7QgaMOsbmggbOG7m24sIG1hIHRy4bqtbiBcKChcbWF0aGJme1h9XlQgXG1hdGhiZntXfSBcbWF0aGJme1h9KV57LTF9XCkgdGjGsOG7nW5nIMSRxrDhu6NjIHTDrW5oIHRow7RuZyBxdWEgZ2nhuqNpIGjhu4cgcGjGsMahbmcgdHLDrG5oIHRoYXkgdsOsIMSR4bqjbyB0cuG7sWMgdGnhur9wIMSR4buDIHRyw6FuaCBzYWkgc+G7kSBz4buRIGjhu41jLg0KDQojIyMgKio2LjUgU2FpIHPhu5EgY2h14bqpbiB2w6Aga2hv4bqjbmcgdGluIGPhuq15KioNCg0KKipTYWkgc+G7kSBjaHXhuqluIChTdGFuZGFyZCBFcnJvcikqKg0KDQpTYXUga2hpIGPDsyDEkcaw4bujYyDGsOG7m2MgbMaw4bujbmcgXChcaGF0e1xib2xkc3ltYm9se1xiZXRhfX1cKSB2w6AgbWEgdHLhuq1uIHBoxrDGoW5nIHNhaSBoaeG7h3AgcGjGsMahbmcgc2FpIFwoXG1hdGhybXtWYXJ9KFxoYXR7XGJvbGRzeW1ib2x7XGJldGF9fSlcKSwgdGEgdMOtbmggKipzYWkgc+G7kSBjaHXhuqluKiogY2hvIHThu6tuZyBo4buHIHPhu5EgXChcaGF0e1xiZXRhfV9qXCkgbmjGsCBzYXU6DQoNClxbDQpcbWF0aHJte1NFfShcaGF0e1xiZXRhfV9qKSA9IFxzcXJ0e1tcbWF0aHJte1Zhcn0oXGhhdHtcYm9sZHN5bWJvbHtcYmV0YX19KV1fe2pqfX0NClxdDQoNClRyb25nIMSRw7MsIFwoW1xjZG90XV97amp9XCkgbMOgIHBo4bqnbiB04butIGjDoG5nIFwoalwpLCBj4buZdCBcKGpcKSB0cm9uZyBtYSB0cuG6rW4gcGjGsMahbmcgc2FpLg0KDQoNCioqS2hv4bqjbmcgdGluIGPhuq15IFwoMTAwKDEgLSBcYWxwaGEpXCVcKSoqDQoNCktob+G6o25nIHRpbiBj4bqteSBjaG8gaOG7hyBz4buRIFwoXGhhdHtcYmV0YX1falwpIMSRxrDhu6NjIHTDrW5oIGLhurFuZyBjw7RuZyB0aOG7qWM6DQoNClxbDQpcaGF0e1xiZXRhfV9qIFxwbSB6X3tcYWxwaGEvMn0gXGNkb3QgXG1hdGhybXtTRX0oXGhhdHtcYmV0YX1faikNClxdDQoNClRyb25nIMSRw7M6DQoNCi0gXCh6X3tcYWxwaGEvMn1cKSBsw6AgYsOhY2ggcGjDom4gduG7iyBcKDEgLSBcYWxwaGEvMlwpIGPhu6dhIHBow6JuIHBo4buRaSBjaHXhuqluIGNodeG6qW4gaMOzYSAodGjGsOG7nW5nIHRyYSB04burIGLhuqNuZyBaKSwNCg0KLSBWw60gZOG7pTogduG7m2kgXChcYWxwaGEgPSAwLjA1XCksIFwoel97MC4wMjV9IFxhcHByb3ggMS45NlwpICh0xrDGoW5nIOG7qW5nIGtob+G6o25nIHRpbiBj4bqteSA5NSUpLg0KDQoNCioqS2nhu4NtIMSR4buLbmggV2FsZCoqDQoNCktp4buDbSDEkeG7i25oIFdhbGQgZ2nDunAgxJHDoW5oIGdpw6EgZ2nhuqMgdGh1eeG6v3Q6DQoNClxbDQpIXzA6IFxiZXRhX2ogPSAwIFxxdWFkIFx0ZXh0e3ZzfSBccXVhZCBIXzE6IFxiZXRhX2ogXG5lcSAwDQpcXQ0KDQpUaOG7kW5nIGvDqiBraeG7g20gxJHhu4tuaDoNCg0KXFsNClogPSBcZnJhY3tcaGF0e1xiZXRhfV9qfXtcbWF0aHJte1NFfShcaGF0e1xiZXRhfV9qKX0gXHNpbSBcbWF0aGNhbHtOfSgwLCAxKQ0KXF0NCg0KROG7sWEgdsOgbyBnacOhIHRy4buLIFwoWlwpLCB0YSBjw7MgdGjhu4MgdMOtbmggcC12YWx1ZSB2w6AgxJHGsGEgcmEga+G6v3QgbHXhuq1uIHRo4buRbmcga8OqLg0KDQoNCioqR2hpIGNow7oqKg0KDQotIEtp4buDbSDEkeG7i25oIFdhbGQgxJHGsOG7o2MgZMO5bmcgcGjhu5UgYmnhur9uIGRvIHTDrW5oIMSRxqFuIGdp4bqjbiB2w6AgY8OzIHRo4buDIHRo4buxYyBoaeG7h24gbmdheSBzYXUga2hpIGPDsyDGsOG7m2MgbMaw4bujbmcgdsOgIHBoxrDGoW5nIHNhaS4NCg0KLSBO4bq/dSBcKCB8WnwgPiB6X3tcYWxwaGEvMn0gXCksIGLDoWMgYuG7jyBcKEhfMFwpLCB04bupYyBsw6AgaOG7hyBz4buRIFwoXGJldGFfalwpIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQoNCiMjIyAqKjYuNiDGr+G7m2MgbMaw4bujbmcgdGhhbSBz4buRIHBow6JuIHTDoW4qKg0KDQpUcm9uZyBt4buZdCBz4buRIG3DtCBow6xuaCBHTE0sIMSR4bq3YyBiaeG7h3QgbMOgIGtoaSBwaMOibiBwaOG7kWkgdGh14buZYyBo4buNIHBow6JuIHBo4buRaSBtxakgKGV4cG9uZW50aWFsIGZhbWlseSkgKipraMO0bmcgY2h14bqpbiBow7NhKiosIHRhIGPhuqduIMaw4bubYyBsxrDhu6NuZyB0aGFtIHPhu5EgcGjDom4gdMOhbiBcKFxwaGlcKS4NCg0KKipDw7RuZyB0aOG7qWMgxrDhu5tjIGzGsOG7o25nOioqDQoNCiQkDQpcaGF0e1xwaGl9ID0gXGZyYWN7MX17biAtIHB9IFxzdW1fe2k9MX1ee259IFxmcmFjeyh5X2kgLSBcaGF0e1xtdX1faSleMn17VihcaGF0e1xtdX1faSl9DQokJA0KDQoqKlRyb25nIMSRw7M6KioNCg0KLSBcKG5cKTogc+G7kSBxdWFuIHPDoXQgIA0KDQotIFwocFwpOiBz4buRIHRoYW0gc+G7kSB0cm9uZyBtw7QgaMOsbmggKGJhbyBn4buTbSBo4buHIHPhu5EgY2jhurduIG7hur91IGPDsykgIA0KDQotIFwoXGhhdHtcbXV9X2kgPSBcbWF0aGJie0V9W3lfaV0gPSBnXnstMX0oXGV0YV9pKVwpOiBnacOhIHRy4buLIGvhu7MgduG7jW5nIMSRxrDhu6NjIMaw4bubYyBsxrDhu6NuZyAgDQoNCi0gXChWKFxoYXR7XG11fV9pKVwpOiBow6BtIHBoxrDGoW5nIHNhaSwgcGjhu6UgdGh14buZYyB2w6BvIHBow6JuIHBo4buRaToNCg0KfCBQaMOibiBwaOG7kWkgICAgICAgIHwgSMOgbSBwaMawxqFuZyBzYWkgXChWKFxtdSlcKSAgICAgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBHYXVzc2lhbiAgICAgICAgIHwgXCgxXCkgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBQb2lzc29uICAgICAgICAgIHwgXChcbXVcKSAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBCaW5vbWlhbCAobG9naXQpIHwgXChcbXUoMSAtIFxtdSlcKSAgICAgICAgICAgICAgfA0KDQoNCiMjICoqQ0jGr8agTkcgNzogR0VORVJBTElaRUQgTElORUFSIE1PREVMUzogSU5GRVJFTkNFICoqDQrEkMOBTkggR0nDgSBN4buoQyDEkOG7mCBQSMOZIEjhu6JQIFbDgCBM4buwQSBDSOG7jE4gTcOUIEjDjE5IIFRST05HIEdMTQ0KDQojIyMgKio3LjEgR2nhu5tpIHRoaeG7h3UqKg0KDQpTYXUga2hpIMaw4bubYyBsxrDhu6NuZyBjw6FjIHRoYW0gc+G7kSAkXGJldGEkIHRyb25nIEdMTSwgYsaw4bubYyB0aeG6v3AgdGhlbyBsw6AgxJHDoW5oIGdpw6EgeGVtIG3DtCBow6xuaCBjw7MgcGjDuSBo4bujcCB24bubaSBk4buvIGxp4buHdSBraMO0bmcsIHbDoCBu4bq/dSBjw7Mgbmhp4buBdSBtw7QgaMOsbmggY+G6oW5oIHRyYW5oLCB0aMOsIG7Dqm4gY2jhu41uIG3DtCBow6xuaCBuw6BvIGzDoCB04buRdCBuaOG6pXQuDQoNCioqQ8OhYyBjw7RuZyBj4bulIMSRw6FuaCBnacOhIGJhbyBn4buTbToqKg0KDQotIERldmlhbmNlICjEkeG7mSBs4buHY2gpDQoNCi0gS2nhu4NtIMSR4buLbmggJFxjaGleMiQNCg0KLSBBSUMsIEJJQw0KDQotIFNvIHPDoW5oIG3DtCBow6xuaCBs4buTbmcgdsOgIGtow7RuZyBs4buTbmcNCg0KLSDEkOG7kyB0aOG7iyBwaOG6p24gZMawIHbDoCDEkWnhu4NtIOG6o25oIGjGsOG7n25nDQoNCiMjIyAqKjcuMiBEZXZpYW5jZSDigJMgxJFvIGzGsOG7nW5nIG3hu6ljIMSR4buZIHBow7kgaOG7o3AgY+G7p2EgbcO0IGjDrG5oKioNCg0KKirEkOG7i25oIG5naMSpYToqKg0KDQpEZXZpYW5jZSBsw6AgxJHhuqFpIGzGsOG7o25nIMSRbyBz4buxIGtow6FjIGJp4buHdCBnaeG7r2EgbcO0IGjDrG5oIGhp4buHbiB04bqhaSB2w6AgbcO0IGjDrG5oIMSR4bqneSDEkeG7pyAoc2F0dXJhdGVkIG1vZGVsKSDigJMgdOG7qWMgbcO0IGjDrG5oIGto4bubcCBob8OgbiB0b8OgbiB24bubaSBk4buvIGxp4buHdS4NCg0KJCQNCkQoeTsgXGhhdHtcbXV9KSA9IDIgXGxlZnRbIFxlbGwoeTsgeSkgLSBcZWxsKFxoYXR7XG11fTsgeSkgXHJpZ2h0XQ0KJCQNCg0KKipHaeG6o2kgdGjDrWNoIGvDvSBoaeG7h3U6KioNCg0KLSAkXGVsbCh5OyB5KSQ6IGxvZy1saWtlbGlob29kIGPhu6dhIG3DtCBow6xuaCBiw6NvIGjDsmEgKHNhdHVyYXRlZCBtb2RlbCkNCg0KLSAkXGVsbChcaGF0e1xtdX07IHkpJDogbG9nLWxpa2VsaWhvb2QgY+G7p2EgbcO0IGjDrG5oIMSRYW5nIHjDqXQNCg0KXChcUmlnaHRhcnJvd1wpIERldmlhbmNlIGPDoG5nIG5o4buPIOKGkiBtw7QgaMOsbmggY8OgbmcgZ+G6p24gduG7m2kgbcO0IGjDrG5oIGLDo28gaMOyYSDihpIgcGjDuSBo4bujcCBoxqFuLg0KDQojIyMgKio3LjMgU28gc8OhbmggbcO0IGjDrG5oIGLhurFuZyBraeG7g20gxJHhu4tuaCBkZXZpYW5jZSoqDQoNCktoaSBoYWkgbcO0IGjDrG5oIGzhu5NuZyBuaGF1LCB0YSBjw7MgdGjhu4Mgc28gc8OhbmggYuG6sW5nIGtp4buDbSDEkeG7i25oIHNhaSBiaeG7h3QgZGV2aWFuY2U6DQoNCioqQ8O0bmcgdGjhu6ljIGtp4buDbSDEkeG7i25oOioqDQoNCiQkDQpcRGVsdGEgRCA9IERfe1x0ZXh0e3JlZHVjZWR9fSAtIERfe1x0ZXh0e2Z1bGx9fSBcc2ltIFxjaGleMl97ZGZ9DQokJA0KDQoqKlRyb25nIMSRw7M6KioNCg0KLSAkZGYkOiBz4buRIHRoYW0gc+G7kSBi4buLIHLDoG5nIGJ14buZYyB0cm9uZyBtw7QgaMOsbmggbmjhu48gaMahbg0KDQpcKFxSaWdodGFycm93XCkgTuG6v3UgJFxEZWx0YSBEJCBs4bubbiB2w6AgcC12YWx1ZSBuaOG7jyDihpIgbcO0IGjDrG5oIMSR4bqneSDEkeG7pyB04buRdCBoxqFuLg0KDQojIyMgKio3LjQgQUlDIHbDoCBCSUMg4oCTIGzhu7FhIGNo4buNbiBnaeG7r2EgY8OhYyBtw7QgaMOsbmgga2jDtG5nIGzhu5NuZyoqDQoNCktoaSBjw6FjIG3DtCBow6xuaCBraMO0bmcgbOG7k25nIG5oYXUsIHRhIGTDuW5nIHRpw6p1IGNow60gdGjDtG5nIHRpbiDEkeG7gyBzbyBzw6FuaDoNCg0KKipBSUMgKEFrYWlrZSBJbmZvcm1hdGlvbiBDcml0ZXJpb24pOioqDQoNCiQkDQpBSUMgPSAtMlxlbGwgKyAyaw0KJCQNCg0KLSAkXGVsbCQ6IGxvZy1saWtlbGlob29kICANCg0KLSAkayQ6IHPhu5EgdGhhbSBz4buRIHRyb25nIG3DtCBow6xuaA0KDQoqKkJJQyAoQmF5ZXNpYW4gSW5mb3JtYXRpb24gQ3JpdGVyaW9uKToqKg0KDQokJA0KQklDID0gLTJcZWxsICsgXGxvZyhuKSBcY2RvdCBrDQokJA0KDQotICRuJDogc+G7kSBxdWFuIHPDoXQNCg0KXChcUmlnaHRhcnJvd1wpIENo4buNbiBtw7QgaMOsbmggY8OzIEFJQy9CSUMgKip0aOG6pXAgaMahbioqLiAgDQogDQpcKFxSaWdodGFycm93XCkgQklDIHBo4bqhdCBjw6FjIG3DtCBow6xuaCBwaOG7qWMgdOG6oXAgKipuaGnhu4F1IGjGoW4qKiBzbyB24bubaSBBSUMuDQoNCg0KIyMgKipDSMavxqBORyA4OiBI4buSSSBRVVkgTE9HSVNUSUMgKExPR0lTVElDIFJFR1JFU1NJT04pKioNCg0KIyMjICoqOC4xIEdp4bubaSB0aGnhu4d1KioNCg0KSOG7k2kgcXV5IGxvZ2lzdGljIGzDoCBt4buZdCB0cm9uZyBuaOG7r25nIG3DtCBow6xuaCBwaOG7lSBiaeG6v24gbmjhuqV0IHRodeG7mWMgaOG7jSBHTE0sIMSRxrDhu6NjIGTDuW5nIMSR4buDIG3DtCBow6xuaCBow7NhIGThu68gbGnhu4d1IG5o4buLIHBow6JuIChiaW5hcnkpLCB04bupYyBraGkgYmnhur9uIHBo4bqjbiBo4buTaQ0KDQpcWw0KeSBcaW4gXHswLDFcfQ0KXF0NCg0KVsOtIGThu6U6IGLhu4duaC9raMO0bmcgYuG7h25oLCBtdWEva2jDtG5nIG11YSwgxJHhuqF0L2tow7RuZyDEkeG6oXQuDQoNCsSQ4bq3YyDEkWnhu4NtOiAgDQpcWw0KXG11X2kgPSBFW3lfaV0gPSBQKHlfaT0xKSBcaW4gKDAsMSkNClxdDQoNClPhu60gZOG7pW5nIGjDoG0gbGnDqm4ga+G6v3QgbG9naXQ6ICANClxbDQpnKFxtdV9pKSA9IFxsb2dcbGVmdChcZnJhY3tcbXVfaX17MS1cbXVfaX1ccmlnaHQpID0gXGV0YV9pID0geF9pXlQgXGJldGENClxdDQoNCg0KDQojIyMgKio4LjIgUGjDom4gcGjhu5FpIEJlcm5vdWxsaSB2w6AgaMOgbSBsb2ctbGlrZWxpaG9vZCoqDQoNCkJp4bq/biBwaOG6o24gaOG7k2kgIA0KDQpcWw0KeV9pIFxpbiBcezAsMVx9DQpcXSAgDQpwaMOibiBwaOG7kWkgdGhlbzogIA0KDQpcWw0KeV9pIFxzaW0gXHRleHR7QmVybm91bGxpfShccGlfaSkNClxdDQoNClRyb25nIMSRw7M6DQoNClxbDQpccGlfaSA9IFAoeV9pPTEpDQpcXSAgDQp2w6A6ICANClxbDQpcbG9nXGxlZnQoXGZyYWN7XHBpX2l9ezEtXHBpX2l9XHJpZ2h0KSA9IHhfaV5UIFxiZXRhDQpcXQ0KDQpMb2ctbGlrZWxpaG9vZCBjaG8gdG/DoG4gYuG7mSBt4bqrdTogIA0KXFsNClxlbGwoXGJldGEpID0gXHN1bV97aT0xfV5uIFxsZWZ0WyB5X2kgXGxvZyhccGlfaSkgKyAoMSAtIHlfaSkgXGxvZygxLVxwaV9pKSBccmlnaHRdDQpcXQ0KDQpLaMO0bmcgY8OzIG5naGnhu4dtIGdp4bqjaSB0xrDhu51uZyBtaW5oIOKGkiBkw7luZyBJUkxTIMSR4buDIHTDrG0gXChcaGF0e1xiZXRhfVwpLg0KDQoNCiMjIyAqKjguMyBEaeG7hW4gZ2nhuqNpIGjhu4cgc+G7kSBo4buTaSBxdXkgdHJvbmcgbG9naXN0aWMgcmVncmVzc2lvbioqDQoNCktoaSBkw7luZyBsb2dpdCBsaW5rOiAgDQpcWw0KXGV0YV9pID0gXGxvZ1xsZWZ0KFxmcmFje1xwaV9pfXsxLVxwaV9pfVxyaWdodCkgPSB4X2leVCBcYmV0YQ0KXF0NCg0K4oaSIFwoXGJldGFfalwpIMSR4bqhaSBkaeG7h24gY2hvIGxvZyBvZGRzIHJhdGlvOiAgDQpcWw0KXHRleHR7T2RkcyByYXRpb30gPSBcZXhwKFxiZXRhX2opDQpcXQ0KDQotIE7hur91IFwoXGJldGFfaiA+IDBcKTogYmnhur9uIFwoeF9qXCkgbMOgbSB0xINuZyBraOG6oyBuxINuZyBcKHk9MVwpDQoNCi0gTuG6v3UgXChcYmV0YV9qIDwgMFwpOiBiaeG6v24gXCh4X2pcKSBsw6BtIGdp4bqjbSBraOG6oyBuxINuZyBcKHk9MVwpDQoNCg0KDQojIyMgKio4LjQgS2hv4bqjbmcgdGluIGPhuq15IHbDoCBraeG7g20gxJHhu4tuaCoqDQoNClNhdSBraGkgxrDhu5tjIGzGsOG7o25nIFwoXGhhdHtcYmV0YX1cKSwgdGEga2nhu4NtIMSR4buLbmggdOG7q25nIGjhu4cgc+G7kToNCg0KS2nhu4NtIMSR4buLbmggV2FsZDogIA0KXFsNClpfaiA9IFxmcmFje1xoYXR7XGJldGF9X2p9e1NFKFxoYXR7XGJldGF9X2opfSBcc2ltIE4oMCwxKQ0KXF0NCg0KS2hv4bqjbmcgdGluIGPhuq15IDk1JTogIA0KXFsNClxoYXR7XGJldGF9X2ogXHBtIHpfezAuOTc1fSBcY2RvdCBTRShcaGF0e1xiZXRhfV9qKQ0KXF0NCg0KQ2h1eeG7g24gc2FuZyBvZGRzIHJhdGlvIGLhurFuZyAgDQpcWw0KXGV4cChcaGF0e1xiZXRhfV9qKQ0KXF0NCg0KIyMgKipDSMavxqBORyA5OiBI4buSSSBRVVkgUE9JU1NPTiAoUE9JU1NPTiBSRUdSRVNTSU9OKSoqDQoNCiMjIyAqKjkuMSBHaeG7m2kgdGhp4buHdSB2w6Ag4bupbmcgZOG7pW5nIHRo4buxYyB04bq/KioNCg0KSOG7k2kgcXV5IFBvaXNzb24gbMOgIG3hu5l0IG3DtCBow6xuaCB0aHXhu5ljIGjhu40gR0xNLCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBtw7QgaMOsbmggaMOzYSBjw6FjIGJp4bq/biBwaOG6o24gaOG7k2kgbMOgIHPhu5EgbMaw4bujbmcgc+G7sSBraeG7h24gxJHhur9tIMSRxrDhu6NjIHRyw6puIG3hu5l0IMSRxqFuIHbhu4sgcXVhbiBzw6F0LCBjaOG6s25nIGjhuqFuIG5oxrA6DQoNCi0gU+G7kSBs4bqnbiBuaOG6rXAgdmnhu4duDQoNCi0gU+G7kSB24bulIHRhaSBu4bqhbiBnaWFvIHRow7RuZw0KDQotIFPhu5EgbOG7l2kgcGjhuqduIG3hu4FtIHBow6F0IHNpbmgNCg0KxJDhurdjIGJp4buHdCBwaMO5IGjhu6NwIGtoaToNCg0KLSBCaeG6v24gcGjhuqNuIGjhu5NpIFwoIHkgXGluIFx7MCwgMSwgMiwgXGxkb3RzIFx9IFwpDQoNCi0gROG7ryBsaeG7h3Uga2jDtG5nIMOibSwgcuG7nWkgcuG6oWMNCg0KLSBN4bulYyB0acOqdSBsw6AgxrDhu5tjIGzGsOG7o25nIHPhu5Egc+G7sSBraeG7h24gdHJ1bmcgYsOsbmggdGhlbyBjw6FjIMSR4bq3YyB0w61uaCBcKCB4IFwpDQoNCg0KIyMjICoqOS4yIFBow6JuIHBo4buRaSBQb2lzc29uIHbDoCBsacOqbiBr4bq/dCBsb2cqKg0KDQoqKkjDoG0geMOhYyBzdeG6pXQ6KiogIA0KXFsNClAoeV9pKSA9IFxmcmFje2Veey1cbXVfaX0gXG11X2lee3lfaX19e3lfaSF9LCBccXVhZCB5X2kgPSAwLCAxLCAyLCBcbGRvdHMNClxdDQoNClRyb25nIMSRw7M6DQoNClxbDQpcbXVfaSA9IEVbeV9pXSA6IFx0ZXh0e3Phu5Egc+G7sSBraeG7h24ga+G7syB24buNbmcgY+G7p2EgcXVhbiBzw6F0IHRo4bupIH0gaQ0KXF0NCg0KXFsNClx0ZXh0e1Zhcn0oeV9pKSA9IFxtdV9pIFxxdWFkIDogXHRleHR7xJHhurdjIMSRaeG7g20gdGhlbiBjaOG7kXR9DQpcXQ0KDQoqKkjDoG0gbGnDqm4ga+G6v3QgKGNhbm9uaWNhbCk6KioNCg0KXFsNClxldGFfaSA9IFxsb2coXG11X2kpID0geF9pXlQgXGJldGEgXGltcGxpZXMgXG11X2kgPSBlXnt4X2leVCBcYmV0YX0NClxdDQoNCioqSMOgbSBsb2cgxJHhuqNtIGLhuqNvOioqDQoNClxbDQpcbXVfaSA+IDANClxdDQoNCk3hu5FpIHF1YW4gaOG7hyB0dXnhur9uIHTDrW5oIHRyw6puIGxvZy1zY2FsZS4NCg0KDQojIyMgKio5LjMgSMOgbSBsb2ctbGlrZWxpaG9vZCB2w6AgcGjGsMahbmcgdHLDrG5oIMSRaeG7g20qKg0KDQoqKkxvZy1saWtlbGlob29kIGPhu6dhIG3DtCBow6xuaDoqKg0KDQpcWw0KXGVsbChcYmV0YSkgPSBcc3VtX3tpPTF9Xm4gXGxlZnRbIHlfaSBcbG9nKFxtdV9pKSAtIFxtdV9pIC0gXGxvZyh5X2khKSBccmlnaHRdDQpcXQ0KDQpUaGF5IFwoXG11X2kgPSBlXnt4X2leVCBcYmV0YX1cKSwgdGEgxJHGsOG7o2M6DQoNClxbDQpcZWxsKFxiZXRhKSA9IFxzdW1fe2k9MX1ebiBcbGVmdFsgeV9pIHhfaV5UIFxiZXRhIC0gZV57eF9pXlQgXGJldGF9IC0gXGxvZyh5X2khKSBccmlnaHRdDQpcXQ0KDQoqKlNjb3JlIGZ1bmN0aW9uICjEkeG6oW8gaMOgbSBsb2ctbGlrZWxpaG9vZCk6KioNCg0KXFsNClUoXGJldGEpID0gXHN1bV97aT0xfV5uIHhfaSAoeV9pIC0gXG11X2kpDQpcXQ0KDQpHaeG6o2kgcGjGsMahbmcgdHLDrG5oIFwoIFUoXGJldGEpID0gMCBcKSDihpIgdMOsbSBcKFxoYXR7XGJldGF9XCkgYuG6sW5nIElSTFMuDQoNCiMjIyAqKjkuNCBEaeG7hW4gZ2nhuqNpIGjhu4cgc+G7kSBo4buTaSBxdXkqKg0KDQpUcm9uZyBo4buTaSBxdXkgUG9pc3NvbjoNCg0KLSBN4buXaSBcKFxiZXRhX2pcKSBsw6AgdMOhYyDEkeG7mW5nIGxvZyB0dXnhur9uIHTDrW5oIMSR4bq/biBz4buRIHPhu7Ega2nhu4duIHRydW5nIGLDrG5oLg0KDQotIFwoZV57XGJldGFfan1cKSBsw6AgdOG7tyBs4buHIHRoYXkgxJHhu5VpIGvhu7MgduG7jW5nIFwoXG11XCkga2hpIFwoeF9qXCkgdMSDbmcgMSDEkcahbiB24buLLCBnaeG7ryBjw6FjIGJp4bq/biBraMOhYyBraMO0bmcgxJHhu5VpLg0KDQpWw60gZOG7pToNCg0KLSBcKFxiZXRhX2ogPSAwLjY5MyBcUmlnaHRhcnJvdyBlXnswLjY5M30gPSAyXCk6IHPhu5Egc+G7sSBraeG7h24ga+G7syB24buNbmcgZ+G6pXAgxJHDtGkga2hpIFwoeF9qXCkgdMSDbmcgMSDEkcahbiB24buLLg0KDQotIFwoXGJldGFfaiA9IC0wLjIyM1wpIOKGkiBnaeG6o20ga2hv4bqjbmcgMjAlLg0KDQojIyAqKkNIxq/GoE5HIDEwOiBI4buSSSBRVVkgR0FNTUEgKEdBTU1BIFJFR1JFU1NJT04pKioNCg0KIyMjICoqMTAuMSBHaeG7m2kgdGhp4buHdSoqDQoNCkjhu5NpIHF1eSBHYW1tYSBsw6AgbeG7mXQgbcO0IGjDrG5oIHRodeG7mWMgaOG7jSBHTE0gZMO5bmcgxJHhu4MgbcO0IGjDrG5oIGjDs2EgY8OhYyBiaeG6v24gcGjhuqNuIGjhu5NpIGTGsMahbmcgbGnDqm4gdOG7pWMgY8OzIHBoxrDGoW5nIHNhaSB0xINuZyB0aGVvIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmguDQoNClbDrSBk4bulIOG7qW5nIGThu6VuZzoNCg0KLSBDaGkgcGjDrSB5IHThur8NCg0KLSBUaOG7nWkgZ2lhbiBz4buRbmcgKHN1cnZpdmFsIHRpbWUpDQoNCi0gTMaw4bujbmcgdGnDqnUgdGjhu6UgbsSDbmcgbMaw4bujbmcNCg0KIyMjICoqMTAuMiBQaMOibiBwaOG7kWkgR2FtbWEqKg0KDQpHaeG6oyDEkeG7i25oIGJp4bq/biBuZ+G6q3Ugbmhpw6puIFwoIHlfaSBcKSBwaMOibiBwaOG7kWkgR2FtbWEgduG7m2kgdGhhbSBz4buROg0KDQpcWw0KeV9pIFxzaW0gR2FtbWEoXGFscGhhLCBcbXVfaSkNClxdDQoNClRyb25nIMSRw7M6DQoNCi0gXCggXG11X2kgPSBFW3lfaV0gXCkgbMOgIGvhu7MgduG7jW5nLg0KDQotIFBoxrDGoW5nIHNhaTogIA0KXFsNClZhcih5X2kpID0gXGZyYWN7XG11X2leMn17XGFscGhhfSA9IFxwaGkgXG11X2leMg0KXF0NCg0KUGjGsMahbmcgc2FpIHThu7cgbOG7hyB24bubaSBiw6xuaCBwaMawxqFuZyBr4buzIHbhu41uZywgcGjDuSBo4bujcCBraGkgYmnhur9uIHRoacOqbiB04bu3IGzhu4cga2jDtG5nIMSR4buVaS4NCg0KIyMjICoqMTAuMyBIw6BtIG3huq10IMSR4buZIHjDoWMgc3XhuqV0IEdhbW1hIChk4bqhbmcgR0xNKSoqDQoNCioqSMOgbSBt4bqtdCDEkeG7mSB4w6FjIHN14bqldDoqKg0KDQpcWw0KZih5OyBcbXUsIFxwaGkpID0gXGZyYWN7MX17XEdhbW1hKDEvXHBoaSl9IFxsZWZ0KFxmcmFjezF9e1xwaGkgXG11fVxyaWdodCleezEvXHBoaX0geV57XGZyYWN7MX17XHBoaX0tMX0gXGV4cFxsZWZ0KC1cZnJhY3t5fXtccGhpIFxtdX1ccmlnaHQpDQpcXQ0KDQpIw6BtIG7DoHkgdGh14buZYyBo4buNIGjDoG0gbcWpIChleHBvbmVudGlhbCBmYW1pbHkpLCB24bubaToNCg0KXFsNClx0aGV0YSA9IC1cZnJhY3sxfXtcbXV9DQpcXQ0KDQpcWw0KYihcdGhldGEpID0gLVxsb2coLVx0aGV0YSkNClxdDQoNCkjDoG0gcGjGsMahbmcgc2FpOg0KDQpcWw0KVihcbXUpID0gXG11XjINClxdDQoNClwoXHBoaVwpIGzDoCB0aGFtIHPhu5EgcGjDom4gdMOhbi4NCg0KIyMjICoqMTAuNCBIw6BtIGxpw6puIGvhur90IChMaW5rIGZ1bmN0aW9uKSoqDQoNCioqTeG6t2MgxJHhu4tuaCB0cm9uZyBHTE06KioNCg0KXFsNCmcoXG11X2kpID0gXGxvZyhcbXVfaSkgPSBcZXRhX2kgPSB4X2leVCBcYmV0YQ0KXF0NCg0KQ8OhYyB0w7l5IGNo4buNbiBraMOhYzoNCg0KLSBJZGVudGl0eTogXCggZyhcbXUpID0gXG11IFwpDQoNCi0gSW52ZXJzZTogXCggZyhcbXUpID0gXGZyYWN7MX17XG11fSBcKQ0KDQpMaW5rIGxvZyDEkcaw4bujYyBkw7luZyBwaOG7lSBiaeG6v24gbmjhuqV0IHbDrCDEkeG6o20gYuG6o28gXCggXG11ID4gMCBcKS4NCg0KIyMgKipDSMavxqBORyAxMTogROG7riBMSeG7hlUgTkjDk00gSE/hurZDIFThu7YgTOG7hiAoR1JPVVBFRCBEQVRBIE9SIFBST1BPUlRJT05TKSoqDQoNCiMjIyAqKjExLjEgR2nhu5tpIHRoaeG7h3UqKg0KDQpE4buvIGxp4buHdSBuaOG7iyBwaMOibiBk4bqhbmcgMC8xIMSRxrDhu6NjIG3DtCBow6xuaCBow7NhIGLhurFuZyBo4buTaSBxdXkgbG9naXN0aWMuIFR1eSBuaGnDqm4sIG7hur91IGThu68gbGnhu4d1IGPDsyBk4bqhbmcgdOG7lW5nIGjhu6NwIChncm91cGVkKSBob+G6t2MgdGjhu4MgaGnhu4duIGTGsOG7m2kgZOG6oW5nIHThu7cgbOG7hywgdsOtIGThu6U6DQoNCjIwIHRow6BuaCBjw7RuZyB0cm9uZyAzMCB0aOG7rSBuZ2hp4buHbSDihpIgXCggeSA9IDIwLCBuID0gMzAgXCkNCg0KLSBU4bu3IGzhu4cgbeG6r2MgYuG7h25oIOG7nyBt4buXaSBxdeG6rW4NCg0KLSBU4bu3IGzhu4cgc2luaCB2acOqbiDEkeG6rXUgdHJvbmcgdOG7q25nIGzhu5twDQoNCuKGkiBD4bqnbiBkw7luZyBHTE0gZOG6oW5nIG5o4buLIHRo4bupYyB04buVbmcgcXXDoXQgKGJpbm9taWFsIEdMTSksIMOhcCBk4bulbmcgY2hvIHPhu5EgbOG6p24gdGjDoG5oIGPDtG5nIHRyw6puIHPhu5EgbOG6p24gdGjhu60uDQoNCiMjIyAqKjExLjIgTcO0IGjDrG5oIGjDs2Egc+G7kSB0aMOgbmggY8O0bmcgdHJvbmcgbmjDs20qKg0KDQpW4bubaSBcKCB5X2kgXHNpbSBcdGV4dHtCaW5vbWlhbH0obl9pLCBccGlfaSkgXCksIHRhIG3DtCBow6xuaCBow7NhOg0KDQpcWw0KXGxvZyBcbGVmdChcZnJhY3tccGlfaX17MSAtIFxwaV9pfVxyaWdodCkgPSBcZXRhX2kgPSB4X2leVCBcYmV0YSBcaW1wbGllcyBccGlfaSA9IFxmcmFje2Vee3hfaV5UIFxiZXRhfX17MSArIGVee3hfaV5UIFxiZXRhfX0NClxdDQoNClRyb25nIMSRw7M6DQoNCi0gXCggeV9pIFwpOiBz4buRIHRow6BuaCBjw7RuZyB0cm9uZyBuaMOzbSBcKGlcKQ0KDQotIFwoIG5faSBcKTogdOG7lW5nIHPhu5EgdGjhu60gbmdoaeG7h20gdHJvbmcgbmjDs20gXChpXCkNCg0KLSBcKCBccGlfaSBcKTogeMOhYyBzdeG6pXQgdGjDoG5oIGPDtG5nDQoNCi0gXCggXG11X2kgPSBFW3lfaV0gPSBuX2kgXHBpX2kgXCkNCg0KLSBcKCBcdGV4dHtWYXJ9KHlfaSkgPSBuX2kgXHBpX2kgKDEgLSBccGlfaSkgXCkNCg0K4oaSIFBow7kgaOG7o3AgY2hvIGThu68gbGnhu4d1IGThuqFuZyAibiB0cmlhbHMsIGsgc3VjY2Vzc2VzIi4NCg0KIyMjICoqMTEuMyBMb2ctbGlrZWxpaG9vZCB2w6AgSVJMUyoqDQoNCioqSMOgbSBsb2ctbGlrZWxpaG9vZDoqKg0KDQpcWw0KXGVsbChcYmV0YSkgPSBcc3VtX3tpPTF9Xm4gXGxlZnRbIHlfaSBcbG9nKFxwaV9pKSArIChuX2kgLSB5X2kpIFxsb2coMSAtIFxwaV9pKSBccmlnaHRdDQpcXQ0KDQpU4buRaSDEkWEgaMOzYSBsb2ctbGlrZWxpaG9vZCBi4bqxbmcgSVJMUyAobmjGsCBsb2dpc3RpYyksIG5oxrBuZyBjw7MgdGjDqm0geeG6v3UgdOG7kSBcKCBuX2kgXCkuDQoNCioqQmnhur9uIGdp4bqjIHbDoCB0cuG7jW5nIHPhu5E6KioNCg0KXFsNCndfaSA9IG5faSBccGlfaSAoMSAtIFxwaV9pKQ0KXF0NCg0KXFsNCnpfaSA9IFxldGFfaSArIFxmcmFje3lfaSAtIG5faSBccGlfaX17bl9pIFxwaV9pICgxIC0gXHBpX2kpfQ0KXF0NCg0KIyMjICoqMTEuNCDGr3UgxJFp4buDbSBzbyB24bubaSBtw7QgaMOsbmggbmjhu4sgcGjDom4qKg0KDQp8IEThuqFuZyBk4buvIGxp4buHdSAgICAgICAgICB8IE3DtCBow6xuaCB0xrDGoW5nIOG7qW5nICAgICAgICAgICAgICAgfCBHaGkgY2jDuiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgMC8xIHThu6tuZyBjw6EgbmjDom4gICAgIHwgSOG7k2kgcXV5IGxvZ2lzdGljICAgICAgICAgICAgICAgfCBcKCB5X2kgXHNpbSBcdGV4dHtCZXJub3VsbGl9KFxwaV9pKSBcKSAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IE5ow7NtIG5oaeG7gXUgY8OhIG5ow6JuICAgIHwgQmlub21pYWwgR0xNIHbhu5tpIFwoIHlfaSAvIG5faSBcKSB8IFwoIHlfaSBcc2ltIFx0ZXh0e0Jpbm9taWFsfShuX2ksIFxwaV9pKSBcKSAgICAgICAgICAgICAgICAgICAgIHwNCg0K4oaSIE3DtCBow6xuaCBuaMOzbSBjaG8ga+G6v3QgcXXhuqMgxrDhu5tjIGzGsOG7o25nIGNow61uaCB4w6FjIGjGoW4gdsOsIGTDuW5nIG5oaeG7gXUgdGjDtG5nIHRpbiBoxqFuIHRyw6puIG3hu5dpIHF1YW4gc8OhdC4NCg0KIyMjICoqMTEuNSBE4buvIGxp4buHdSB04bu3IGzhu4cgKHByb3BvcnRpb25zKSoqDQoNCk7hur91IFwoIHlfaSAvIG5faSBcKSDEkcaw4bujYyBnaGkgZMaw4bubaSBk4bqhbmcgdOG7tyBs4buHICgwIDwgdOG7tyBs4buHIDwgMSksIHRhIHbhuqtuIGTDuW5nIG3DtCBow6xuaDoNCg0KXFsNClxsb2cgXGxlZnQoXGZyYWN7eV9pIC8gbl9pfXsxIC0geV9pIC8gbl9pfVxyaWdodCkgPSB4X2leVCBcYmV0YQ0KXF0NCg0K4oaSIE5oxrBuZyBwaOG6o2kgY2jhu4kgcsO1IHPhu5EgbOG6p24gdGjhu60gXCggbl9pIFwpIMSR4buDIHTDrW5oIMSRw7puZyBwaMawxqFuZyBzYWkuDQoNCiMjICoqQ0jGr8agTkcgMTI6IE3DlCBIw4xOSCBUVVnhur5OIFTDjU5IIFThu5RORyBRVcOBVCBUV0VFREVFIChUV0VFRElFIEdMTXMpKioNCg0KIyMjICoqMTIuMSBHaeG7m2kgdGhp4buHdSoqDQoNCk3DtCBow6xuaCAqKlR3ZWVkaWUgR0xNKiogbeG7nyBy4buZbmcgaOG7jSBow6BtIG3FqSBi4bqxbmcgY8OhY2ggY2hvIHBow6lwIHBow6JuIHBo4buRaSBjw7MgxJHhurdjIMSRaeG7g20gdHJ1bmcgZ2lhbiBnaeG7r2EgY8OhYyBwaMOibiBwaOG7kWkgcXVlbiB0aHXhu5ljIG5oxrA6DQoNCi0gR2F1c3NpYW4NCg0KLSBQb2lzc29uDQoNCi0gR2FtbWENCg0KLSBJbnZlcnNlIEdhdXNzaWFuDQoNCk3DtCBow6xuaCBUd2VlZGllIHBow7kgaOG7o3AgduG7m2kgY8OhYyBsb+G6oWkgZOG7ryBsaeG7h3UgY8OzIMSR4bq3YyDEkWnhu4NtOg0KDQotICoqTGnDqm4gdOG7pWMgZMawxqFuZyArIHLhuqV0IG5oaeG7gXUgZ2nDoSB0cuG7iyAwKiogIA0KICAodsOtIGThu6U6IGThu68gbGnhu4d1IGNoaSBwaMOtLCBjw7MgbmfGsOG7nWkga2jDtG5nIHRpw6p1IGTDuW5nKQ0KICANCi0gKipQaMOibiB0w6FuIHF1w6EgbeG7qWMgKG92ZXJkaXNwZXJzaW9uKSoqDQoNCi0gQ8OzIGPhuqMgcGjhuqduICoqcuG7nWkgcuG6oWMqKiAoMCwgMSwgMiwgLi4uKSAqKmzhuqtuIGxpw6puIHThu6VjIGTGsMahbmcqKg0KDQrihpIg4buobmcgZOG7pW5nIHLhu5luZyByw6NpIHRyb25nICoqYuG6o28gaGnhu4NtKiosICoqdMOgaSBjaMOtbmgqKiwgKip5IHThur8qKiwgdsOgIGPDoWMgYsOgaSB0b8OhbiAqKnplcm8taW5mbGF0ZWQgZGF0YSoqLg0KDQoNCiMjIyAqKjEyLjIgxJDhu4tuaCBuZ2jEqWEgdsOgIHTDrW5oIGNo4bqldCoqDQoNClR3ZWVkaWUgbMOgIG3hu5l0IGzhu5twIHBow6JuIHBo4buRaSB0aHXhu5ljICoqaOG7jSBow6BtIG3FqSAoZXhwb25lbnRpYWwgZmFtaWx5KSoqLCB24bubaSAqKmjDoG0gcGjGsMahbmcgc2FpKiogY8OzIGThuqFuZzoNCg0KXFsNClx0ZXh0e1Zhcn0oWSkgPSBccGhpIFxtdV5wDQpcXQ0KDQpUcm9uZyDEkcOzOg0KDQotIFwoIFxtdSA9IFxtYXRoYmJ7RX1bWV0gXCk6IGvhu7MgduG7jW5nDQoNCi0gXCggXHBoaSA+IDAgXCk6IGjhu4cgc+G7kSBwaMOibiB0w6FuDQoNCi0gXCggcCBcKTogY2jhu4kgc+G7kSBz4bupYyBt4bqhbmggKCoqcG93ZXIgaW5kZXgqKikNCg0KDQojIyMgKioxMi4zIEdpw6EgdHLhu4sgxJHhurdjIGJp4buHdCBj4bunYSBjaOG7iSBz4buRIFwoIHAgXCkqKg0KDQp8IFwoIHAgXCkgICAgICAgIHwgUGjDom4gcGjhu5FpIHTGsMahbmcg4bupbmcgICAgICAgICAgICAgICAgICAgICB8DQp8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IDAgICAgICAgICAgICAgIHwgR2F1c3NpYW4gKE5vcm1hbCkgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDEgICAgICAgICAgICAgIHwgUG9pc3NvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IFwoICgxLCAyKSBcKSAgIHwgVHdlZWRpZSBo4buXbiBo4bujcCAoMCArIGTGsMahbmcgbGnDqm4gdOG7pWMpICAgICB8DQp8IDIgICAgICAgICAgICAgIHwgR2FtbWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDMgICAgICAgICAgICAgIHwgSW52ZXJzZSBHYXVzc2lhbiAgICAgICAgICAgICAgICAgICAgICAgICB8DQoNCuKGkiBW4bubaSBcKCAxIDwgcCA8IDIgXCksIG3DtCBow6xuaCAqKlR3ZWVkaWUgaOG7l24gaOG7o3AqKiBjw7MgdGjhu4M6DQoNCi0gVMOhaSBoaeG7h24gxJHGsOG7o2MgKipz4buRIGzGsOG7o25nIGzhu5tuIGdpw6EgdHLhu4sgMCoqDQoNCi0gTcO0IGjDrG5oIGjDs2EgxJHGsOG7o2MgKipnacOhIHRy4buLIGTGsMahbmcgbGnDqm4gdOG7pWMqKg0KDQoqKlLhuqV0IHBow7kgaOG7o3AqKiBjaG8gY8OhYyBiw6BpIHRvw6FuIG5oxrAgKipjaGkgcGjDrSBi4bqjbyBoaeG7g20qKiwgKip04buVbiB0aOG6pXQqKiwgKipk4buvIGxp4buHdSBjw7Mgc+G7kSAwIHbDoCBnacOhIHRy4buLIHRp4buBbiB04buHKiouDQoNCiMgKipQSOG6pk4gMioqDQojIyAqKlRI4buQTkcgS8OKIE3DlCBU4bqiIEPDgUMgQknhur5OIFN1cGVybWFya2V0IFRyYW5zYWN0aW9ucyoqDQoNCiMjIEdlbmRlcg0KDQpgYGB7cn0NCmEgPC0gcmVhZC5jc3YoZmlsZSA9ICdDOi9Vc2Vycy9BRE1JTi9Eb3dubG9hZHMvVGttdC5jc3YnLCBoZWFkZXIgPSBUKSAjIGxvYWQgZGF0YQ0KYGBgDQoNCmBgYHtyfQ0KdGhvbmdfa2VfZGluaF90aW5oIDwtIGZ1bmN0aW9uKGRhdGEsIHZhcl9uYW1lKSB7DQogICMgQ2hlY2sgaWYgdmFyaWFibGUgZXhpc3RzIGluIGRhdGENCiAgaWYgKCF2YXJfbmFtZSAlaW4lIG5hbWVzKGRhdGEpKSB7DQogICAgc3RvcCgiVmFyaWFibGUgZG9lcyBub3QgZXhpc3QgaW4gZGF0YSIpDQogIH0NCiAgDQogICMgQ29udmVydCB0byBmYWN0b3IgaWYgbmVlZGVkDQogIHZhcmlhYmxlIDwtIGFzLmZhY3RvcihkYXRhW1t2YXJfbmFtZV1dKQ0KICANCiAgIyBmcmVxDQogIGZyZXEgPC0gdGFibGUodmFyaWFibGUpDQogIHBlcmNlbnQgPC0gcHJvcC50YWJsZShmcmVxKSAqIDEwMA0KICANCiAgIyByZXN1bHQNCiAgcmVzdWx0IDwtIGRhdGEuZnJhbWUoDQogICAgR2lhX3RyaSA9IG5hbWVzKGZyZXEpLA0KICAgIFRhbl9zbyA9IGFzLnZlY3RvcihmcmVxKSwNCiAgICBUYW5fc3VhdCA9IHJvdW5kKGFzLnZlY3RvcihwZXJjZW50KSwgMikNCiAgKQ0KICByZXR1cm4ocmVzdWx0KQ0KfQ0KYGBgDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCiMgVOG6oW8gYuG6o25nIMSR4bq/bSBz4buRIGzGsOG7o25nIHRoZW8gZ2nhu5tpIHTDrW5oDQpnZW5kZXJfY291bnQgPC0gYSAlPiUNCiAgY291bnQoR2VuZGVyKSAlPiUNCiAgbXV0YXRlKHBlcmMgPSBuIC8gc3VtKG4pLA0KICAgICAgICAgbGFiZWwgPSBwYXN0ZTAoR2VuZGVyLCAiICgiLCByb3VuZChwZXJjICogMTAwKSwgIiUpIikpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgdHLDsm4NCmdncGxvdChnZW5kZXJfY291bnQsIGFlcyh4ID0gIiIsIHkgPSBuLCBmaWxsID0gR2VuZGVyKSkgKw0KICBnZW9tX2NvbCh3aWR0aCA9IDEpICsNCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGxhYmVsKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSkpICsNCiAgbGFicyh0aXRsZSA9ICJU4bu3IGzhu4cgZ2nhu5tpIHTDrW5oIGtow6FjaCBow6BuZyIpICsNCiAgdGhlbWVfdm9pZCgpDQoNCmBgYA0KUGjDom4gYuG7kSBnaeG7m2kgdMOtbmgga2jDoSBjw6JuIGLhurFuZywgY2jhu4kgY2jDqm5oIGzhu4djaCBuaOG6uSBnaeG7r2EgbuG7ryAoRikgdsOgIG5hbSAoTSkuDQoNCsSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGThu68gbGnhu4d1IGPDsyB0w61uaCDEkeG6oWkgZGnhu4duIGdp4bubaSB0xrDGoW5nIMSR4buRaSB04buRdCwgdHLDoW5oIMSRxrDhu6NjIHRoacOqbiBs4buHY2ggZ2nhu5tpIHTDrW5oLg0KDQojIyBNYXJpdGFsU3RhdHVzDQoNCmBgYHtyfQ0KdGhvbmdfa2VfZGluaF90aW5oKGEsJ01hcml0YWxTdGF0dXMnKQ0KYGBgDQpH4bqnbiBt4buZdCBu4butYSBraMOhY2ggaMOgbmcgbMOgIMSR4buZYyB0aMOibiwgY8OybiBs4bqhaSBsw6AgxJHDoyBr4bq/dCBow7RuLg0KDQpU4bu3IGzhu4cgbsOgeSBjxaluZyB0xrDGoW5nIMSR4buRaSBjw6JuIGLhurFuZywgZ2nDunAgc28gc8OhbmggaMOgbmggdmkgdGhlbyB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gbcOgIGtow7RuZyBsbyB0aGnDqm4gbOG7h2NoIGThu68gbGnhu4d1Lg0KDQpgYGB7cn0NCmdncGxvdChkYXRhID0gYSwgYWVzKHggPSAiIiwgZmlsbCA9IE1hcml0YWxTdGF0dXMpKSArDQogIGdlb21fYmFyKHdpZHRoID0gMSkgKw0KICBjb29yZF9wb2xhcigieSIpICsNCiAgbGFicyh0aXRsZSA9ICJU4bu3IGzhu4cgxJHhu5ljIHRow6JuIikgKw0KICB0aGVtZV92b2lkKCkNCg0KYGBgDQoNCiMjIEhvbWVvd25lcg0KDQpgYGB7cn0NCnRob25nX2tlX2RpbmhfdGluaChhLCAnSG9tZW93bmVyJykNCmBgYA0KUGjhuqduIGzhu5tuIGtow6FjaCBow6BuZyBsw6AgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIChjaGnhur9tIH42MCUpLg0KDQrEkGnhu4F1IG7DoHkgY8OzIHRo4buDIOG6o25oIGjGsOG7n25nIMSR4bq/biB0aMOzaSBxdWVuIGNoaSB0acOqdSBob+G6t2MgxrB1IHRpw6puIG11YSBz4bqvbSwgbMOgIG3hu5l0IMSR4bq3YyDEkWnhu4NtIHF1YW4gdHLhu41uZyDEkeG7gyBwaMOibiBraMO6YyBraMOhY2ggaMOgbmcuDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBhLCBhZXMoeCA9IEhvbWVvd25lcikpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICIjQUVFMEFGIikgKw0KICBnZW9tX3RleHQoc3RhdCA9ICJjb3VudCIsIGFlcyhsYWJlbCA9IC4uY291bnQuLiksIHZqdXN0ID0gLTAuNSkgKw0KICBsYWJzKHRpdGxlID0gIlPhu58gaOG7r3UgbmjDoCIsDQogICAgICAgeCA9ICJDw7MgaG/hurdjIGtow7RuZyIsIHkgPSAiVOG6p24gc+G7kSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KIyMgQ2hpbGRyZW4NCg0KKipDaGlsZHJlbioqIGNo4buJIHPhu5EgY29uIG3DoCBraMOhY2ggaMOgbmcgY8OzLCBiaeG6v24gbsOgeSBsw6AgMSBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyB2w6wgY8OhYyBnacOhIHRy4buLIGPhu6dhIG7DsyBjw7MgdGjhu4Mgc28gc8OhbmggduG7m2kgbmhhdS4NCmBgYHtyfQ0KbGlicmFyeShza2ltcikNCnNraW0oYSRDaGlsZHJlbikNCmBgYA0KVHJ1bmcgYsOsbmggMi41MyB2w6AgdHJ1bmcgduG7iyAzIGNobyB0aOG6pXkgZOG7ryBsaeG7h3UgY8OzIHh1IGjGsOG7m25nIHBow6JuIGLhu5EgxJHhu4F1Lg0KDQpLaMO0bmcgY8OzIGThuqV1IGhp4buHdSBs4buHY2ggbmdoacOqbSB0cuG7jW5nIGhv4bq3YyBjw7MgZ2nDoSB0cuG7iyBuZ2/huqFpIGzhu4cgYuG6pXQgdGjGsOG7nW5nLg0KDQpgYGB7cn0NCg0KZ2dwbG90KGEsIGFlcyh4ID0gYXMuZmFjdG9yKENoaWxkcmVuKSkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJsaWdodGJsdWUiKSArDQogIGdlb21fdGV4dChzdGF0ID0gImNvdW50IiwgYWVzKGxhYmVsID0gLi5jb3VudC4uKSwgdmp1c3QgPSAtMC41KSArDQogIGxhYnMoeCA9ICJT4buRIGNvbiIsIHkgPSAiU+G7kSBraMOhY2ggaMOgbmciLCB0aXRsZSA9ICJQaMOibiBi4buRIHPhu5EgY29uIGPhu6dhIGtow6FjaCBow6BuZyIpDQoNCg0KYGBgDQoNCiMjIEFubnVhbEluY29tZQ0KDQpgYGB7cn0NCnRob25nX2tlX2RpbmhfdGluaChhLCAnQW5udWFsSW5jb21lJykNCmBgYA0KDQokMzBLIC0gJDUwSyBjaGnhur9tIGjGoW4gMS8zICgzMi43MyUpIHThu5VuZyBz4buRIHF1YW4gc8OhdCDihpIgbMOgIG5ow7NtIMSRw7RuZyBuaOG6pXQuIEvhur90IGjhu6NwIHbhu5tpICQxMEsgLSAkMzBLLCB0YSBjw7Mga2hv4bqjbmcgNTUlIG5nxrDhu51pIHRodeG7mWMgbmjDs20gZMaw4bubaSAkNTBLIGNobyB0aOG6pXkgbeG7qWMgdGh1IG5o4bqtcCB0cnVuZyBiw6xuaCBob+G6t2MgdGjhuqVwIGzDoCBwaOG7lSBiaeG6v24uDQoNCk5ow7NtIHRodSBuaOG6rXAgY2FvICh0csOqbiAkOTBLKSBH4buTbSAkOTBLIC0gJDExMEssICQxMTBLIC0gJDEzMEssICQxMzBLIC0gJDE1MEssICQxNTBLKy4gVOG7lW5nIHThuqduIHN14bqldCBjaOG7iSBraG/huqNuZyAxNi4yOCUgY2hvIHRo4bqleSBuaMOzbSB0aHUgbmjhuq1wIGNhbyBraMOhIG5o4buPLg0KDQpgYGB7cn0NCmdncGxvdChhLCBhZXMoeCA9IEFubnVhbEluY29tZSkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJsaWdodGJsdWUiLCBjb2xvciA9ICJwdXJwbGUiKSArDQogIGxhYnMoeCA9ICJLaG/huqNuZyB0aHUgbmjhuq1wIiwgeSA9ICJU4bqnbiBzdeG6pXQiLCB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdOG6p24gc3XhuqV0IHRodSBuaOG6rXAgaMOgbmcgbsSDbSIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCmBgYA0KDQojIyBDaXR5DQoNCmBgYHtyfQ0KdGhvbmdfa2VfZGluaF90aW5oKGEsJ0NpdHknKQ0KYGBgDQoNClNhbGVtIGPDsyB04bqnbiBz4buRIGNhbyBuaOG6pXQgKDEzODYgbOG6p24geHXhuqV0IGhp4buHbiwgY2hp4bq/bSA5Ljg2KS4gVGnhur9wIHRoZW8gbMOgIFRhY29tYSAoMTI1NyBs4bqnbiwgOC45NCUpLg0KDQpHdWFkYWxhamFyYSBjw7MgdOG6p24gc+G7kSB0aOG6pXAgbmjhuqV0ICg3NSBs4bqnbiwgY2jhu4kgMC41MyUpLg0KDQpOaMOsbiBjaHVuZywgc+G7kSBsxrDhu6NuZyBraMOhY2ggaMOgbmcg4bufIGPDoWMgdGjDoG5oIHBo4buRIHBow6JuIGLhu5Ega2jDoSBjaMOqbmggbOG7h2NoLCDEkWnhu4F1IG7DoHkgY8OzIHRo4buDIGThuqtuIMSR4bq/biBuaOG7r25nIGvhur90IHF14bqjIHRoacOqbiBs4buHY2ggdHJvbmcgdmnhu4djIHBow6JuIHTDrWNoIHbDoCBzbyBzw6FuaCBnaeG7r2EgY8OhYyB0aMOgbmggcGjhu5EuDQoNCg0KYGBge3J9DQpnZ3Bsb3QoYSwgYWVzKHggPSBDaXR5KSkgKw0KICBnZW9tX2JhcihmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImJsYWNrIikgKw0KICBsYWJzKHggPSAiVGjDoG5oIHBo4buRIiwgeSA9ICJU4bqnbiBz4buRIiwgdGl0bGUgPSAiQmnhu4N1IMSR4buTIHThuqduIHPhu5Ega2jDoWNoIGjDoG5nIOG7nyBjw6FjIHRow6BuaCBwaOG7kSIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCmBgYA0KDQojIyBTdGF0ZW9yUHJvdmluY2UNCmBgYHtyfQ0KdGhvbmdfa2VfZGluaF90aW5oKGEsJ1N0YXRlb3JQcm92aW5jZScpDQpgYGANCg0KV0EgKFdhc2hpbmd0b24pIGNoaeG6v20gdOG7tyBs4buHIMOhcCDEkeG6o28gKDMyLjQ4JSwgNDU2NyBs4bqnbiB4deG6pXQgaGnhu4duKSwgQ0EgKENhbGlmb3JuaWEpIMSR4bupbmcgdGjhu6kgaGFpICgxOS40NCUsIDI3MzMgbOG6p24pLCBPUiAoT3JlZ29uKSDEkeG7qW5nIHRo4bupIGJhICgxNi4wOSUsIDIyNjIgbOG6p24pLg0KPT4gQmEgYmFuZyBuw6B5IHRodeG7mWMgVMOieSBC4bqvYyBUaMOhaSBCw6xuaCBExrDGoW5nIGPhu6dhIEhvYSBL4buzIGNoaeG6v20gdOG7lW5nIGPhu5luZyA2OC4wMSUgZOG7ryBsaeG7h3UNCg0KQ8OhYyB04buJbmggTWV4aWNvIChERiwgR3VlcnJlcm8sIEphbGlzY28sIFZlcmFjcnV6LCBZdWNhdGFuLCBaYWNhdGVjYXMpIGPDsyB04bqnbiBzdeG6pXQgdGjhuqVwIGjGoW4gbmhp4buBdS4gVOG7lW5nIGPhu5luZyBjw6FjIHThu4luaCBNZXhpY28gY2jhu4kgY2hp4bq/bSBraG/huqNuZyAyNi4yMyUgZOG7ryBsaeG7h3UNCg0KS+G6v3QgcXXhuqMgbsOgeSBjaG8gdGjhuqV5IHPhu7EgdOG6rXAgdHJ1bmcgxJHhu4thIGzDvSByw7UgcuG7h3QgdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UsIHbhu5tpIHBo4bqnbiBs4bubbiBk4buvIGxp4buHdSDEkeG6v24gdOG7qyBiYSBiYW5nIHBow61hIFTDonkgQuG6r2MgSG9hIEvhu7MuDQoNCmBgYHtyfQ0KZ2dwbG90KGEsIGFlcyh4ID0gU3RhdGVvclByb3ZpbmNlKSkgKw0KICBnZW9tX2JhcihmaWxsID0gIiNGRkMiLCBjb2xvciA9ICJ5ZWxsb3ciKSArDQogIGxhYnMoeCA9ICJCYW5nIiwgeSA9ICJU4bqnbiBz4buRIiwgdGl0bGUgPSAiQmnhu4N1IMSR4buTIHThuqduIHPhu5Ega2jDoWNoIGjDoG5nIOG7nyBjw6FjIGJhbmciKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCg0KIyMgQ291bnRyeQ0KDQpgYGB7cn0NCnRob25nX2tlX2RpbmhfdGluaChhLCdDb3VudHJ5JykNCmBgYA0KDQpE4buvIGxp4buHdSBjaG8gdGjhuqV5IHPhu7EgcGjDom4gYuG7kSBraMO0bmcgxJHhu5NuZyDEkeG7gXUgZ2nhu69hIGPDoWMgcXXhu5FjIGdpYSwgduG7m2kgSG9hIEvhu7MgKFVTQSkgY2hp4bq/bSB04bu3IGzhu4cgw6FwIMSR4bqjbyAoNjguMDElLCA5LjU2MiBs4bqnbiB4deG6pXQgaGnhu4duKSwgdGnhur9wIHRoZW8gbMOgIE1leGljbyAoMjYuMjMlLCAzLjY4OCBs4bqnbikgdsOgIENhbmFkYSAoNS43NSUsIDgwOSBs4bqnbikuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHThuq1wIGThu68gbGnhu4d1IGNo4bunIHnhur91IHThuq1wIHRydW5nIHbDoG8gdGjhu4sgdHLGsOG7nW5nIE3hu7ksIGPDsyB0aOG7gyBkbyBk4buvIGxp4buHdSDEkcaw4bujYyB0aHUgdGjhuq1wIHThu6sgbmd14buTbiDGsHUgdGnDqm4gY8OhYyBnaWFvIGThu4tjaCBob+G6t2Mgc+G7sSBraeG7h24gdOG6oWkgSG9hIEvhu7MuDQoNCmBgYHtyfQ0KZ2dwbG90KGEsIGFlcyh4ID0gQ291bnRyeSkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICIjMENDIiwgY29sb3IgPSAicmVkIikgKw0KICBsYWJzKHggPSAiUXXhu5FjIGdpYSIsIHkgPSAiVOG6p24gc+G7kSIsIHRpdGxlID0gIkJp4buDdSDEkeG7kyB04bqnbiBz4buRIGtow6FjaCBow6BuZyDhu58gY8OhYyBxdeG7kWMgZ2lhIikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCiMjIFByb2R1Y3RGYW1pbHkNCmBgYHtyfQ0KdGhvbmdfa2VfZGluaF90aW5oKGEsJ1Byb2R1Y3RGYW1pbHknKQ0KYGBgDQoNCkThu68gbGnhu4d1IGNobyB0aOG6pXkgc+G6o24gcGjhuqltIHRo4buxYyBwaOG6qW0gKEZvb2QpIGNoaeG6v20gdOG7tyBs4buHIMOhcCDEkeG6o28gKDcyLjIyJSwgMTAuMTUzIGzhuqduIHh14bqldCBoaeG7h24pLCB0cm9uZyBraGkgbmjDs20gxJHhu5MgdeG7kW5nIChEcmluaykgY2jhu4kgY2hp4bq/bSA4Ljg5JSB2w6Agc+G6o24gcGjhuqltIGtow7RuZyB0acOqdSBkw7luZyAoTm9uLUNvbnN1bWFibGUpIGNoaeG6v20gMTguODklLiBT4buxIGNow6puaCBs4buHY2ggcsO1IHLhu4d0IG7DoHkgKEZvb2QgZ+G6pXAgOCBs4bqnbiBEcmluayB2w6AgZ+G6p24gNCBs4bqnbiBOb24tQ29uc3VtYWJsZSkgcGjhuqNuIMOhbmggdHLhu41uZyB0w6JtIGPhu6dhIHThuq1wIGThu68gbGnhu4d1IGNo4bunIHnhur91IHThuq1wIHRydW5nIHbDoG8gY8OhYyBz4bqjbiBwaOG6qW0gdGjhu7FjIHBo4bqpbS4NCg0KYGBge3J9DQpnZ3Bsb3QoYSwgYWVzKHggPSBQcm9kdWN0RmFtaWx5KSkgKw0KICBnZW9tX2JhcihmaWxsID0gInB1cnBsZSIsIGNvbG9yID0gImJsYWNrIikgKw0KICBsYWJzKHggPSAiU+G6o24gcGjhuqltIiwgeSA9ICJU4bqnbiBz4buRIiwgdGl0bGUgPSAiUGjDom4ga2jDumMgc+G6o24gcGjhuqltIGtow6FjaCBow6BuZyBtdWEiKQ0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCiMjIFByb2R1Y3REZXBhcnRtZW50DQoNCmBgYHtyfQ0KdGhvbmdfa2VfZGluaF90aW5oKGEsJ1Byb2R1Y3REZXBhcnRtZW50JykNCmBgYA0KDQpU4bqtcCB0cnVuZyB2w6BvIHRo4buxYyBwaOG6qW0gdMawxqFpIHbDoCDEkeG7kyBnaWEgZOG7pW5nOiBIYWkgbmjDs20gUHJvZHVjZSB2w6AgSG91c2Vob2xkIGNoaeG6v20gdOG7lW5nIGPhu5luZyBn4bqnbiAyNSUgZOG7ryBsaeG7h3UsIGNobyB0aOG6pXkgxJHDonkgY8OzIHRo4buDIGzDoCBjw6FjIG3hurd0IGjDoG5nIGNo4bunIGzhu7FjLg0KDQpT4buxIHRoaeG6v3UgY8OibiDEkeG7kWkgcsO1IHLhu4d0OiBUcm9uZyBraGkgbeG7mXQgc+G7kSBuaMOzbSBuaMawIFByb2R1Y2UgY2hp4bq/bSB04bubaSAxNC4xOCUgdGjDrCBuaGnhu4F1IG5ow7NtIGtow6FjIG5oxrAgTWVhdCwgU2VhZm9vZCBs4bqhaSBjaGnhur9tIGNoxrBhIHThu5tpIDElLg0KDQpgYGB7cn0NCmdncGxvdChhLCBhZXMoeCA9IFByb2R1Y3REZXBhcnRtZW50KSkgKw0KICBnZW9tX2JhcihmaWxsID0gIiMxMWFhNzciLCBjb2xvciA9ICJibHVlIikgKw0KICBsYWJzKHggPSAiU+G6o24gcGjhuqltIiwgeSA9ICJU4bqnbiBz4buRIiwgdGl0bGUgPSAiQuG7mSBwaOG6rW4gc+G6o24gcGjhuqltIGtow6FjaCBow6BuZyBtdWEiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCg0KIyMgUHJvZHVjdENhdGVnb3J5DQpgYGB7cn0NCnRob25nX2tlX2RpbmhfdGluaChhLCdQcm9kdWN0Q2F0ZWdvcnknKQ0KYGBgDQoNCkThu68gbGnhu4d1IGNobyB0aOG6pXkgU25hY2sgRm9vZHMgKDExLjM4JSkgdsOgIFZlZ2V0YWJsZXMgKDEyLjI5JSkgbMOgIGhhaSBkYW5oIG3hu6VjIHBo4buVIGJp4bq/biBuaOG6pXQsIGNoaeG6v20gdOG7lW5nIGPhu5luZyBn4bqnbiAxLzQgZOG7ryBsaeG7h3UuIEPDoWMgZGFuaCBt4bulYyDEkcOhbmcgY2jDuiDDvSBraMOhYyBiYW8gZ+G7k20gRGFpcnkgKDYuNDIlKSwgRnJ1aXQgKDUuNDQlKSwgdsOgIE1lYXQgKDUuNDElKSwgdHJvbmcga2hpIG5oaeG7gXUgZGFuaCBt4bulYyBuaMawIMSR4buTIGjhuqNpIHPhuqNuIMSRw7NuZyBo4buZcCAoQ2FubmVkIE95c3RlcnMgMC4yNSUsIENhbm5lZCBTaHJpbXAgMC4yNyUpIGhv4bq3YyBjw6FjIHPhuqNuIHBo4bqpbSDDrXQgcGjhu5UgYmnhur9uIChDYW5kbGVzIDAuMzIlLCBNaXNjZWxsYW5lb3VzIDAuMzAlKSBjw7MgdOG6p24gc3XhuqV0IHLhuqV0IHRo4bqlcC4gU+G7sSBwaMOibiBi4buRIG7DoHkgcGjhuqNuIMOhbmggdOG6rXAgdHJ1bmcgY2jDrW5oIHbDoG8gY8OhYyBt4bq3dCBow6BuZyB0acOqdSBkw7luZyBuaGFuaCB2w6AgdGjhu7FjIHBo4bqpbSB0xrDGoWkgc+G7kW5nLCB0cm9uZyBraGkgY8OhYyBz4bqjbiBwaOG6qW0gxJHhurdjIGJp4buHdCBob+G6t2Mgw610IHBo4buVIGJp4bq/biBjaOG7iSBjaGnhur9tIHThu7cgbOG7hyBuaOG7jy4NCg0KYGBge3J9DQpnZ3Bsb3QoYSwgYWVzKHggPSBQcm9kdWN0Q2F0ZWdvcnkpKSArDQogIGdlb21fYmFyKGZpbGwgPSAiI0NDOSIsIGNvbG9yID0gImJsYWNrIikgKw0KICBsYWJzKHggPSAiU+G6o24gcGjhuqltIiwgeSA9ICJU4bqnbiBz4buRIiwgdGl0bGUgPSAiRGFuaCBt4bulYyBz4bqjbiBwaOG6qW0ga2jDoWNoIGjDoG5nIG11YSIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCmBgYA0KDQojIyBVbml0c1NvbGQNCg0KYGBge3J9DQpza2ltKGEkVW5pdHNTb2xkKQ0KYGBgDQoNCkvhur90IHF14bqjIGNobyB0aOG6pXkgdHJ1bmcgYsOsbmggMSDEkcahbiBtdWEgc+G6vSBtdWEga2hv4bqjbmcgNC4wOCDEkcahbiB24buLIHPhuqNuIHBo4bqpbSwgZ2nDoSB0cuG7iyDEkeG7mSBs4buHY2ggY2h14bqpbiBi4bqxbmcgMS4xNyBjaG8gdGjhuqV5IG3hu6ljIMSR4buZIHBow6JuIHTDoW4gdMawxqFuZyDEkeG7kWkgdGjhuqVwIHh1bmcgcXVhbmggZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaC4NCg0KQ8OzIHRo4buDIHRo4bqleSBy4bqxbmcgY8OzIDUwJSBnaWFvIGThu4tjaCBiw6FuIHThu6sgMy01IMSRxqFuIHbhu4sgKGtob+G6o25nIHThu6kgcGjDom4gduG7iykgdsOgIDc1JSBnaWFvIGThu4tjaCBiw6FuIOKJpDUgxJHGoW4gduG7iy4NCmBgYHtyfQ0KYmFycGxvdCh0YWJsZShhJFVuaXRzU29sZCksIA0KICAgICAgICBjb2wgPSAiYmx1ZSIsIA0KICAgICAgICBtYWluID0gIlThuqduIHN14bqldCBVbml0c1NvbGQiLCANCiAgICAgICAgeGxhYiA9ICJT4buRIMSRxqFuIHbhu4siLCB5bGFiID0gIlPhu5EgbOG6p24geHXhuqV0IGhp4buHbiIpDQoNCmBgYHtyfQ0Kc2tpbShhJFJldmVudWUpDQpgYGANCg0KQmnhur9uIFJldmVudWUgKGRvYW5oIHRodSkgY2hvIHRo4bqleSBt4buZdCBwaMOibiBwaOG7kWkgbOG7h2NoIHBo4bqjaSByw7UgcuG7h3QgduG7m2kgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCAxMy4wMCB2w6AgdHJ1bmcgduG7iyAxMS4yNSwgcGjhuqNuIMOhbmggc+G7sSBoaeG7h24gZGnhu4duIGPhu6dhIG5oaeG7gXUgZ2lhbyBk4buLY2ggY8OzIGRvYW5oIHRodSBjYW8ga8OpbyB0cnVuZyBiw6xuaCBsw6puLiDEkOG7mSBs4buHY2ggY2h14bqpbiBs4bubbiAoOC4yMikgY8O5bmcga2hv4bqjbmcgYmnhur9uIHRoacOqbiBy4buZbmcgKHThu6sgMC41MyDEkeG6v24gNTYuNykgY2hvIHRo4bqleSBt4bupYyDEkeG7mSBjaMOqbmggbOG7h2NoIMSRw6FuZyBr4buDIGdp4buvYSBjw6FjIGdpYW8gZOG7i2NoLg0KDQpgYGB7cn0NCmhpc3QoYSRSZXZlbnVlLCBjb2wgPSAicmVkIiwgDQogICAgIG1haW4gPSAiUGjDom4gcGjhu5FpIFJldmVudWUiLCANCiAgICAgeGxhYiA9ICJEb2FuaCB0aHUiKQ0KYGBgDQoNCjEgbOG6p24gbuG7r2EgeMOhYyBuaOG6rW4gcsO1IHLDoG5nIHBow6JuIHBo4buRaSBs4buHY2ggcGjhuqNpIG3huqFuaCBj4bunYSBiaeG6v24gUmV2ZW51ZS4gQ8OhYyDEkWnhu4NtIHJpw6puZyBs4bq7IHh14bqldCBoaeG7h24g4bufIHbDuW5nIDMwLTUwLCB0csO5bmcga2jhu5twIHbhu5tpIGdpw6EgdHLhu4sgdOG7kWkgxJFhIDU2LjcgdHJvbmcgdGjhu5FuZyBrw6ouIEtob+G6o25nIGPDoWNoIHhhIHThu6sgcDc1ICh+MTcpIMSR4bq/biBjw6FjIMSRaeG7g20gbsOgeSBjaG8gdGjhuqV5IGNow7puZyB0aOG7sWMgc+G7sSBsw6AgY8OhYyBnacOhIHRy4buLIGPhu7FjIHRy4buLDQo=