1 PHẦN MỞ ĐẦU

1.1 Lời nói đầu

   Survival – Phân tích sự tồn tại _ Phân tích sống sót_ Phân tích sống sót_ Phân tích sự kiện

   Phân tích sống sót hoặc Phân tích sự kiện khi nhà nghiên cứu muốn tìm hiểu ảnh hưởng đến các biến kết cục (biến phụ thuộc) mang tính thời gian.

   Khi so sánh 2 phương pháp điều trị cho các bệnh có tần số tử vong cao như bệnh AIDS, các bệnh ung thư. Nếu mô hình phân tích như phân tích hồi qui logistic, chỉ để ý đến biến kết cục (sống/chết hoặc khỏi bệnh/không khỏi bệnh) mà không quan tâm đến yếu tố thời gian thì tôi không tìm thấy sự khác biệt giữa 2 phương pháp điều trị vì tỉ lệ tử vong gần như nhau, nhưng thời gian dẫn đến tử vong ở 2 nhóm có thể khác nhau.

=> Vì vậy chúng ta phải sử dụng mô hình Phân tích sống sót thì mới thấy sự khác biệt này. Như vậy mô hình nghiên cứu mô tả kết cục là biến mang 2 giá trị đối lập (sống/chết) tuy quan trọng nhưng không chính xác.

   Mô hình chính để thể hiện mối liên hệ giữa thời gian dẫn đến sự kiện (sống/chết, …) và các yếu tố nguy cơ (risk factors) là mô hình có tên là “survival analysis – Phân tích sống sót”. Cụm từ survival analysis xuất phát từ nghiên cứu trong bảo hiểm, và giới nghiên cứu y khoa từ đó dùng cụm từ cho bộ môn của mình. Nhưng như nói trên, sống/chết không phải là biến duy nhất, vì trong thực tế chúng ta cũng có những biến cố bệnh hay không bệnh, xảy ra hay không xảy ra. Ngoài ra, trong các bộ môn kĩ thuật, người ta dùng một cụm từ khác “reliability analysis – Phân tích độ tin cậy”, để chỉ cho khái niệm survival analysis. Tuy nhiên trong đề tài này chúng tôi sẽ dùng cụm từ Phân tích sống sót.

1.2 Lý do chọn đề tài

   Mô hình hóa dữ liệu thời gian đến sự kiện là một chủ đề quan trọng với nhiều ứng dụng trong các lĩnh vực khác nhau. Tập hợp các phương pháp để phân tích dữ liệu đó được gọi là phân tích sự tồn tại, phân tích lịch sử sự kiện hoặc phân tích thời gian. Phân tích sống sót được áp dụng rộng rãi vì định nghĩa về một ‘sự kiện’ có thể rất đa dạng và các ví dụ bao gồm chết và sống, thành công và phá sản, tiếp tục hoặc hủy bỏ. Do đó, các lĩnh vực ứng dụng bao gồm từ y học và xã hội học đến tiếp thị và kinh tế. Trong bài tiểu luận này, chúng ta xem xét các vấn đề cơ bản về lý thuyết của phân tích sống sót bao gồm các công cụ ước tính cho các chức năng sinh tồn và rủi ro và cách thực hành trên R dựa trên package survival.

   Đặc biệt, trong thời đại hiện nay vừa trải qua dịch bệnh Covid-19 gây ảnh hưởng rất lớn đến sức khỏe, kinh tế và xã hội của toàn thế giới. Do đó việc áp dụng phân tích sống sót cho dịch bệnh Covid 19 là việc có ý nghĩa rất quan trọng. Cụ thể, phân tích sống sót Covid-19 có thể đưa ra các dự đoán về số ca nhiễm và tử vong trong tương lai dựa trên các mô hình dự đoán, đánh giá khả năng ảnh hưởng của các biện pháp phòng chống dịch bệnh và đưa ra các giải pháp để giảm thiểu tác động của dịch bệnh đến sức khỏe và kinh tế.

   Thấy được tầm quan trọng cũng như tiềm năng khi phân tích sự tồn tại của package survival trong thời điểm hiện tại, chúng tôi mong muốn có thể kết hợp các ngôn ngữ lập trình để giải quyết vấn đề trong kinh tế xã hội hiện và mô hình này sẽ giúp ích cho việc phân tích các nguy cơ, sự sống sót có thể xảy ra từ đó có thể dễ dàng giải quyết được các vấn đề quan trọng.

1.3 Mục đích đề tài

   Một ưu điểm của Phân tích sống sót là xử lý được các trường hợp đối tượng nghiên cứu bỏ cuộc giữa chừng (như mất dấu theo dõi, ngưng điều trị do tác dụng phụ của thuốc hoặc tử vong do bệnh lý khác…).

   Trong mô hình phân tích này các đối tượng còn sống kể cả đối tượng bỏ cuộc được gọi là censored hoặc sự kiện chưa xảy ra. Các đối tượng tử vong hoặc hết sống được gọi là events hoặc sự kiện đã kết thúc. Mục tiêu suy luận đối với phân tích sống sót là khoảng thời gian giữa thời điểm bắt đầu và thời điểm sự kiện xảy ra. Trong nghiên cứu y học hiện nay, phân tích sống sót được sử dụng rộng rãi trong các nghiên cứu lâm sàng để đánh giá hiệu quả của một phương phương điều trị hoặc để đánh giá tình trạng sống sót của một số các biện pháp điều trị ung thư. Trong kinh tế xã hội, phân tích sống sót được dùng để phân tích rủi ro/ nguy cơ để đánh giá sự tồn tại, của một doanh nghiệp nào đó.

1.4 Đối tượng, phạm vi nghiên cứu

Đối tượng nghiên cứu

   Phân tích sống sót tập trung mô tả cho một cá thể hay một nhóm cá thể nhất định. Một điểm xác định của một sự kiện được gọi là failure (như là xuất hiện bệnh, chữa khỏi bệnh, tử vong, tái phát sau khi đáp ứng với điều trị…) mà xảy ra sau một khoảng thời gian được gọi là failure time (thời gian dẫn đến sự kiện) hoặc (follow-up time (thời gian theo dõi) trong nghiên cứu thuần tập/nghiên cứu dựa vào dân số) trong suốt thời gian các cá thể được quan sát. Để xác định thời gian dẫn đến sự kiện, chúng ta cần xác định thời điểm bắt đầu (có thể là ngày nhận vào, ngày chẩn đoán…).

   Phạm vi nghiên cứu

   Trong bài báo này, chúng ta sẽ xem xét các vấn đề cơ bản về lý thuyết của phân tích tỷ lệ sống sót bao gồm các công cụ ước tính cho các chức năng sinh tồn và rủi ro.

   Sau đó chúng ta sẽ sử dụng ngôn ngữ lập trình thống kê R để cho phép ứng dụng thực tế của phương pháp này. Phép ước tính thường được dùng để Phân tích sống sót được gọi là ước tính KaplanMeier. Phép ước tính này giúp ta tính được xác suất sống sót tích lũy tại các mốc thời gian khác nhau . Nếu muốn so sánh sự khác biệt giữa 2 nhóm điều trị, dùng kiểm định log-rank bằng cách so sánh 2 hàm xác suất tích lũy của 2 nhóm.

   Nội dung chính của bài tiểu luận này là tìm hiểu về package survival và thực hành trên R với package survival, vì vậy phần lý thuyết về phân tích sống sót sẽ không được giải thích sâu.

2 TỔNG QUAN VỀ PACKAGE SURVIVAL

2.1 Thông tin package survival

   Package survival chứa các quy trình phân tích sự sống sót cốt lõi, bao gồm định nghĩa về các đối tượng Surv, đường cong Kaplan-MeierAalen-Johansen (đa trạng thái), mô hình Cox và mô hình thời gian thất bại tăng tốc theo tham số.

Phiên bản mới nhất: 3.5-5

Phiên bản R hỗ trợ: R(>3.5.0)

Nhóm tác giá: Terry M Therneau, Thomas Lumley, Atkinson Elizabeth, Crowson Cynthia

Người phụ trách chính: Terry M Therneau

Tài liệu hướng dẫn: https://cran.r-project.org/web/packages/survival/survival.pdf

2.2 Giới thiệu package survival

   Phân tích sống sót được sử dụng phổ biến trong sinh học, y học, kỹ thuật, tiếp thị, khoa học xã hội hoặc khoa học.

   Có hai phương pháp đóng góp quan trọng cho sự phát triển của lĩnh vực này. Đầu tiên là phương pháp của Kaplan và Meier, người đã giới thiệu một công cụ “Ước tính xác suất sống sót”. Thứ hai là từ Cox, người đã giới thiệu một mô hình được gọi là “Mô hình rủi ro theo tỷ lệ Cox” (CPHM), là một mô hình hồi quy. Thật đặc biệt khi cả hai mô hình này đều được sử dụng nhiều cho đến nay và luôn là lực chọn của mọi nhà khoa học khi phân tích về dữ liệu sống sót (survival data).

   Trong những năm qua, nhiều báo cáo đã được viết về khảo sát phân tích tỷ lệ sống sót. Tuy nhiên, do sự phức tạp của các phương pháp, đặc biệt là đối với dữ liệu đa biến, các cuộc thảo luận dễ dẫn đến nhầm lẫn. Ngoài ra, ở cấp độ giới thiệu có sẵn các đánh giá, đây hoàn toàn là lý thuyết hoặc sử dụng các ngôn ngữ lập trình (như stata hoặc SAS) được sử dụng chủ yếu trong các thống kê sinh học.

   Ngược lại, đánh giá của một số người đã kết hợp trình bày lý thuyết với thực tế sử dụng ngôn ngữ lập trình thống kê R. R là ngôn ngữ được sử dụng rộng rãi cho các vấn đề chung trong khoa học dữ liệu vì nó kết hợp các tính năng từ các mô hình lập trình khác nhau. Chúng ta hướng tới một cách trình bày toàn diện và đủ rộng để bao gồm tất cả các chủ đề cần thiết cho phân tích sống sót đa biến nhưng đồng thời cũng dễ hiểu.

   Để thực hiện tất cả điều này, cần bổ sung cho việc trình bày các phương pháp với đầy đủ thông tin cơ bản. Giải thích chi tiết việc kiểm chứng và xử lý dữ liệu về các sự kiện thời gian, bởi vì về cơ bản tất cả các phương pháp đều sử dụng kiểm chứng để rút ra các ước tính hiệu quả. Cuối cùng, chúng ta thêm một ví dụ đã hoạt động cho thấy cách thực hiện phân tích khả năng sống sót thực tế với R.

   Trong phần tiếp theo, chúng ta cung cấp một dữ liệu để phân tích sự sống sót và ý nghĩa của việc phân tích chúng. Tiếp theo, chúng ta mô tả các đặc điểm chung của các hàm sinh tồn, ước lượng cho các hàm sinh tồn và so sánh hai đường cong sinh tồn. Sau đó, chúng ta giới thiệu Mô hình nguy cơ theo tỷ lệ Cox. Nếu giả định rủi ro theo tỷ lệ không đúng, người ta cần sử dụng mô hình Cox phân tầng. Cuối cùng, chúng ta trình bày một phần về phân tích tỷ lệ sống thực tế bằng R. Bài báo kết thúc với phần tóm tắt ngắn gọn và kết luận.

2.3 Các hàm cơ bản trong R

   Dưới đây là một số hàm cơ bản trong package survival:

  • Surv(time, event): Được sử dụng để tạo ra đối tượng Surv trong R. Đối tượng này được sử dụng để định nghĩa và lưu trữ dữ liệu sống sót và thời gian theo dõi tương ứng.

  • Survfit(formula, data): Được sử dụng để tính toán tỷ lệ sống sót hoặc phân tích thời gian đến sự kiện cho các nhóm dữ liệu khác nhau.

  • Coxph(Surv (time, event) ~ I, data) : Mô hình cox tiêu chuẩn, mô hình Cox được sử dụng để xác định yếu tố ảnh hưởng đến thời gian sống sót hoặc thời gian đến sự kiện.

  • Survreg(formula, data): Hàm này được sử dụng để phân tích các yếu tố ảnh hưởng đến thời gian sống sót hoặc thời gian đến sự kiện trong mô hình hồi quy.

  • Survexp(): Hàm này được sử dụng để tính toán tỷ lệ sống sót hoặc phân tích thời gian đến sự kiện cho các nhóm dữ liệu khác nhau trong mô hình phân phối mũ.

3 LÝ THUYẾT PHÂN TÍCH SỐNG SÓT - SURVIVAL ANALYSIS

3.1 Phân tích sống sót là gì?

   Phân tích sống sót (survival analysis)một phương pháp thống kê để đánh giá và dự đoán khả năng sống sót hoặc thời gian đến sự kiện trong một tập dữ liệu.

   Phân tích sống sót được sử dụng rộng rãi trong nhiều lĩnh vực, bao gồm y học, y tế công cộng, kinh tế học, khoa học xã hội, khoa học môi trường, khoa học dữ liệu và nghiên cứu thị trường. Nó cung cấp một cách tiếp cận thống kê để đánh giá khả năng sống sót hoặc thời gian đến sự kiện trong một tập dữ liệu, và đưa ra các dự đoán về khả năng sống sót hoặc thời gian sống của một nhóm bệnh nhân hoặc cá nhân trong tương lai.

   Vậy, phân tích sống sót (Survival Analysis) liên quan đến biến thời gian. Biến này ghi nhận thời gian từ lúc bắt đầu theo dõi cho đến khi xảy ra sự kiện (time-to-failure/ time-to-event).

   Các thuật ngữ cơ bản của phân tích sống sót bao gồm:

• Dữ liệu thời gian và biến cố (time-to-event)

• Nhóm kiểm chứng (censoring)

• Hàm sinh tồn và hàm nguy cơ

Dữ liệu thời gian và biến cố

   Trong nghiên cứu y học, rất hay gặp những trường hợp xảy ra sự kiện liên quan đến thời gian. Ví dụ: thời gian chết, thời gian khỏi bệnh sau khi điều trị, thời gian tái phát v.v… Tất cả các số liệu liên quan đến những biến số như vậy gọi là số liệu sống sót (survival data), mặc dù thuật ngữ này có vẻ mô tả không chính xác bản chất của số liệu.

   Ví dụ về các dữ liệu thời gian -sự kiện (time-to-event)

Buld: Thời gian sống sót của bóng đèn (từ lúc sản xuất đến khi bị hỏng)

Deat: Tử vong ( thời gian từ lúc bệnh nhân được chuẩn đoán một loại bệnh nào đó đến khi họ tử vong) Những vấn đề gặp phải khi sử dụng SA

Data censoring and truncation: Số liệu bị cắt xén.

Conditional probability: Xác suất có điều kiện.

   Nhóm kiểm chứng

   Để thực hiện phân tích sống sót, người ta cần ghi lại thời gian diễn ra sự kiện 𝑡i cho các đối tượng 𝑖∈{1,…,𝑁} của một nhóm. Tuy nhiên, điều này không phải lúc nào cũng khả thi và chúng ta chỉ có một phần thông tin về thời gian diễn ra sự kiện. Trong trường hợp như vậy, người ta nói về kiểm chứng. Cụ thể, một bệnh nhân có thời gian sống sót được kiểm chứng nếu sự kiện chưa xảy ra đối với bệnh nhân này. Điều này có thể xảy ra khi:

• Bệnh nhân bỏ nghiên cứu, ví dụ: ngừng đến phòng khám để tái khám.

• Nghiên cứu các mốc thời gian cố định và sự kiện xảy ra sau thời hạn.

   Những ví dụ trên được gọi là right-censoring .Trong hình bên dưới, chúng ta hình dung ý nghĩa của việc kiểm chứng:

   Bản tóm tắt về các loại kiểm chứng:

Kiểm chứng loại I: Tất cả các đối tượng bắt đầu và kết thúc nghiên cứu cùng một lúc (thời lượng nghiên cứu cố định). Ví dụ là các thí nghiệm trong phòng thí nghiệm.

Kiểm chứng loại II: Tất cả các đối tượng bắt đầu nghiên cứu cùng một lúc nhưng nghiên cứu kết thúc thì một số lượng đối tượng cố định được xác định trước đã trải qua sự kiện (thời lượng nghiên cứu linh hoạt). Ví dụ là các thí nghiệm trong phòng thí nghiệm.

Kiểm chứng loại III: Các đối tượng tham gia nghiên cứu vào các thời điểm khác nhau, nhưng thời lượng của nghiên cứu là cố định. Ví dụ là các thử nghiệm lâm sàng.

3.2 Các hàm được sử dụng trong phân tích sống sót

   Hàm sinh tồn

   Đường cong tỷ lệ sống sót 𝑆(𝑡) biểu thị tỷ lệ sống sót là một hàm của thời gian (t):

𝑆(𝑡)=𝑃𝑟(𝑇>𝑡)

   Giá trị của hàm S(t) là tỷ lệ sống sót của một nhóm vào thời điểm (t) so với thời điểm bắt đầu quan sát.

   Hàm sinh tồn có các thuộc tính sau:

  • Khoảng xác định của thời gian là 𝑡 ∈ [ 0 , ∞ ) .

  • 𝑆(𝑡) luôn giảm, nghĩa là 𝑆(𝑡1)≥𝑆(𝑡2) với 𝑡1≤𝑡2

  • Tại thời điểm 𝑡=0, 𝑆(𝑡=0)=1, tức là xác suất sống sót qua thời điểm 0 là 1.

   Công cụ ước tính cho hàm sinh tồn

  • Kaplan–Meier

   Công thức ước lượng Kaplan–Meier (KM) của hàm sinh tồn 𝑆𝐾𝑀(𝑡) được xác định bởi

   Ước lượng này đúng với mọi 𝑡>0 và nó chỉ phụ thuộc vào hai biến, 𝑛𝑖𝑑𝑖 là:

  • 𝑛𝑖 : số rủi ro tại thời điểm 𝑡𝑖,

  • 𝑑𝑖: số sự kiện tại thời điểm 𝑡𝑖

   Hàm nguy cơ

   Hàm nguy cơ (hazard function) là một khái niệm quan trọng trong phân tích sống sót (survival analysis), được sử dụng để mô tả tốc độ xảy ra sự kiện trong một nhóm dân số theo thời gian.

   Công thức của hàm nguy cơ thường được biểu diễn dưới dạng:

h(t) = lim Δt → 0 [P(t ≤ T < t + Δt | T ≥ t) / Δt]

   Trong đó:

  • t là thời gian quan sát, T là thời gian xảy ra sự kiện, Δt là một khoảng thời gian rất nhỏ, tiến tới 0.

  • P(t ≤ T < t + Δt | T ≥ t) là xác suất xảy ra sự kiện trong khoảng thời gian từ t đến t + Δt, biết rằng sự kiện đã không xảy ra trước thời điểm t

   Giá trị của hàm h(t) là tốc độ xảy ra sự kiện (event rate) tại thời điểm t. Ví dụ, nếu h(10) = 0.05 nghĩa là tại thời điểm 10 đơn vị thời gian sau khi bắt đầu quan sát, tốc độ xảy ra sự kiện là 0.05 sự kiện trên một đơn vị thời gian.

   Có nhiều phương pháp để ước tính hàm nguy cơ, nhưng phương pháp phổ biến nhất là mô hình Cox Proportional Hazards (mô hình tỷ lệ nguy cơ đồng nhất)

  • Mô hình Cox Proportional Hazards:

   Đây là một phương pháp để tính toán hàm nguy cơ. Mô hình Cox Proportional Hazards được sử dụng để đánh giá tác động của các yếu tố đến xác suất sống sót của một đối tượng hoặc một nhóm đối tượng. Để tính toán hàm nguy cơ bằng mô hình Cox Proportional Hazards, trước tiên ta phải xác định các yếu tố ảnh hưởng đến xác suất sống sót và thu thập các dữ liệu liên quan đến các yếu tố đó. Sau đó, ta sử dụng các phương pháp ước tính hợp lý để tính toán các tham số của mô hình Cox Proportional Hazards.

4 THỰC HÀNH VỚI PACKAGE SURVIVAL - PHÂN TÍCH SỐNG SÓT

4.1 Cài đặt và sử dụng package survival

   Để sử dụng package survival trên RStudio, ta thực hiện các bước sau:

Bước 1: Cài đặt package survival

   Bạn có thể cài đặt package survival bằng cách chạy lệnh sau trong RStudio:

install.packages("survival")

   Nếu package đã được cài đặt trước đó, bạn có thể bỏ qua bước này.

Bước 2: Tải package survival

   Sau khi cài đặt, bạn cần gọi package survival bằng lệnh sau:

# Gọi package survival từ thư viện
library(survival)

Bước 3: Sử dụng các hàm của package survival

   Sau khi đã tải package survival, bạn có thể sử dụng các hàm của package này để phân tích dữ liệu thời gian đến sự kiện. Các hàm này bao gồm:

  • survfit(): Tính toán các ước lượng sống sót bằng phương pháp Kaplan-Meier hoặc phương pháp Nelson-Aalen.

  • coxph(): Phân tích mô hình hồi quy Cox để tìm các yếu tố ảnh hưởng đến thời gian đến sự kiện.

  • survreg(): Phân tích mô hình hồi quy Cox để tìm các yếu tố ảnh hưởng đến thang đo thời gian đến sự kiện không phải là dạng số nguyên (ví dụ: thời gian sống sót được đo bằng giờ, ngày, tháng,…).

  • cox.zph(): Kiểm định giả thuyết về sự đồng nhất của các hệ số hồi quy Cox theo thời gian.

4.2 Dataset lung - dữ liệu về ung thư phổi

   Trong suốt phần này, chúng tôi sẽ sử dụng dataset lung từ package survival làm dữ liệu phân tích.

   Dataset lung là một trong những tập dữ liệu tiêu biểu của package survival được sử dụng trong nhiều ví dụ và hướng dẫn về phân tích dữ liệu. Dataset này được tạo ra từ nghiên cứu lâm sàng về ung thư phổi và bao gồm thông tin về 228 bệnh nhân ung thư phổi với các biến như tuổi, giới tính, mức độ suy giảm chức năng phổi,…

   Dataset lung được sử dụng để minh họa cho nhiều khía cạnh khác nhau của phân tích dữ liệu, bao gồm mô hình hồi quy tuyến tính, mô hình hồi quy logistic, phân tích phân nhóm và đặc biệt là phân tích sống sót.

   Để truy cập dataset lung từ package survival trong R, ta sử dụng lệnh sau:

# Gọi dataset về dữ liệu bệnh nhân của cách bệnh ung thư -> chọn dataset lung
data(cancer)

   Dữ liệu ung thư phổi - lung có cấu trúc như sau:

# Hiển thị các thành phần của dữ liệu
str(lung)
## 'data.frame':    228 obs. of  10 variables:
##  $ inst     : num  3 3 3 5 1 12 7 11 1 7 ...
##  $ time     : num  306 455 1010 210 883 ...
##  $ status   : num  2 2 1 2 2 1 2 2 2 2 ...
##  $ age      : num  74 68 56 57 60 74 68 71 53 61 ...
##  $ sex      : num  1 1 1 1 1 1 2 2 1 1 ...
##  $ ph.ecog  : num  1 0 0 1 0 1 2 2 1 2 ...
##  $ ph.karno : num  90 90 90 90 100 50 70 60 70 70 ...
##  $ pat.karno: num  100 90 90 60 90 80 60 80 80 70 ...
##  $ meal.cal : num  1175 1225 NA 1150 NA ...
##  $ wt.loss  : num  NA 15 15 11 0 0 10 1 16 34 ...

   Mô tả các biến của dữ liệu ung thư phổi - lung

  1. inst: Mã số của bệnh nhân.

  2. time: Thời gian sống sót hoặc thời gian theo dõi (ngày).

  3. status: Tình trạng sống sau thời gian theo dõi (1 = Sống sót, 2 = Qua đời).

  4. age: Tuổi của bệnh nhân.

  5. sex: Giới tính của bệnh nhân (1 = Nam, 2 = Nữ).

  6. ph.ecog: Mức độ suy giảm phổi của bệnh nhân (0 = Tốt, 1 = Tàn phế nhẹ, 2 = Tàn phế trung bình, 3 = Tàn phế nặng).

  7. ph.karno: Điểm Karnofsky của bệnh nhân, đo lường sức khỏe tổng thể (100 điểm là sức khỏe tốt nhất, 0 điểm là bệnh nhân đã qua đời)

  8. pat.karno: Điểm Karnofsky của bệnh nhân dựa trên người chăm sóc (nếu có).

  9. meal.cal: Lượng calo tiêu thụ hàng ngày của bệnh nhân.

  10. wt.loss: Mức độ giảm cân của bệnh nhân trong 6 tháng trước đó.

   Các biến timestatus được sử dụng trong phân tích sống sót, trong khi các biến còn lại được sử dụng để đánh giá các yếu tố ảnh hưởng đến sống sót của bệnh nhân. Các biến ph.ecogph.karno cung cấp thông tin về sức khỏe tổng thể của bệnh nhân, trong khi các biến meal.calwt.loss cung cấp thông tin về chế độ ăn uống và mức độ giảm cân của bệnh nhân.

4.3 Xử lý dữ liệu ung thư phổi - lung

   Lưu ý rằng trạng thái (status) được mã hóa theo cách không chuẩn trong bộ dữ liệu này. Thông thường, dữ liệu của biến status gồm 2 giá trị: 0= còn sống, 1= đã chết.

   Để thay đổi giá trị dữ liệu của biến về giá trị 01, chúng ta sẽ dùng hàm mutate() trong package dplyr. Hàm mutate() trong package dplyr được sử dụng để thay đổi giá trị của các biến trong một tập dữ liệu. Để thay đổi giá trị của một biến bằng mutate(), bạn cần xác định tên biến và cung cấp cho nó một biểu thức hoặc hàm để tính toán giá trị mới. Quá trình thay đổi giá trị dữ liệu của biến được thực hiện như sau:

# Gọi package dplyr từ thư viện
library(dplyr)
# Chuyển đổi giá trị của biến status 1 => 0 và 2 => 1 
lung <- lung %>% mutate(status = recode(status, '1' = 0, '2' = 1))
# Hiển thị 6 quan sát đầu tiên của 3 biến quan tâm
head(lung[c("time","status","sex")])
##   time status sex
## 1  306      1   1
## 2  455      1   1
## 3 1010      0   1
## 4  210      1   1
## 5  883      1   1
## 6 1022      0   1

   Ngoài ra, chúng ta sẽ chia tuổi của bệnh nhân thành 3 nhóm cho tiện quá trình phân tích:

# Chia tuổi thành 3 nhóm tuổi 
lung <- lung %>%mutate(age_group = case_when(
    age < 50 ~ "dưới 50 tuổi",
    age >= 50 & age <= 65 ~ "50 đến 65 tuổi",
    age > 65 ~ "trên 65 tuổi",
    TRUE ~ "không rõ"))
# Hiển thị 6 quan sát đầu tiên của 4 biến quan tâm
head(lung[c("time","status","sex", "age_group")])
##   time status sex      age_group
## 1  306      1   1   trên 65 tuổi
## 2  455      1   1   trên 65 tuổi
## 3 1010      0   1 50 đến 65 tuổi
## 4  210      1   1 50 đến 65 tuổi
## 5  883      1   1 50 đến 65 tuổi
## 6 1022      0   1   trên 65 tuổi

   Bây giờ chúng ta một bộ dữ liệu mới với:

  • time: Thời gian sống sót hoặc thời gian theo dõi (ngày)

  • status: Tình trạng sống sau thời gian theo dõi (0 = Sống sót, 1 = Đã chết)

  • age_group: Tuổi của bệnh nhân theo nhóm tuổi (dưới 50 tuổi, 50 đến 65 tuổi, trên 65 tuổi)

   Lưu ý: hàm Surv() trong package survival mặc định chấp nhận TRUE/FALSE, trong đó TRUE là sự kiện và FALSE là kiểm duyệt; 1/0 trong đó 1 là sự kiện và 0 là kiểm duyệt; hoặc 2/1 trong đó 2 là sự kiện và 1 là kiểm duyệt. Hãy cẩn thận để đảm bảo dữ liệu được định dạng đúng.

4.4 Tạo đối tượng sinh tồn

   Trong phân tích sống sót, để thực hiện các phương pháp phân tích dữ liệu sống sót, ta cần tạo đối tượng sống sót (survival object) dựa trên các thông tin về thời gian sống sóttrạng thái sự kiện của các đối tượng trong một nghiên cứu. Sau đó, ta có thể sử dụng các hàm để vẽ đường sống sót và ước lượng các mô hình sống sót.

   Trong R, ta có thể tạo đối tượng sống sót bằng hàm Surv(). Cú pháp của hàm này như sau:

Surv(time, event, type = "right")

   Trong đó:

  • time: Là vector chứa thông tin về thời gian sống sót hoặc thời gian theo dõi của các đối tượng. Đây có thể là thời gian từ lần khám đầu tiên đến lần khám cuối cùng, thời gian từ điều trị đến sự kiện xảy ra, hoặc thời gian từ lần phát hiện căn bệnh đến sự kiện xảy ra.

  • event: Là vector chứa thông tin về trạng thái sự kiện của các đối tượng. Giá trị của event có thể là 0 (còn sống) hoặc 1 (chết hoặc xảy ra sự kiện quan tâm).

  • type: Là tham số xác định cách tính toán thời gian sống sót. Giá trị mặc định của type là “right”, có nghĩa là thời gian sống sót được tính từ thời điểm khám cuối cùng trừ đi thời điểm xảy ra sự kiện. Nếu giá trị của type là “left”, thời gian sống sót sẽ được tính từ thời điểm khám đầu tiên trừ đi thời điểm xảy ra sự kiện.

   Ví dụ, ta có dữ liệu về thời gian sống sót và trạng thái sự kiện của 10 bệnh nhân đầu tiên như sau:

# Lấy biến time và status từ dataset lung và tạo đối tượng sinh tồn mới
Surv(lung$time, lung$status)[1:10]
##  [1]  306   455  1010+  210   883  1022+  310   361   218   166

   Ta thấy đối tượng 1 có sự kiện tại thời điểm 306 ngày, đối tượng 2 có sự kiện tại thời điểm 455 ngày, đối tượng 3 bị kiểm duyệt tại thời điểm 1010 ngày, …

4.5 Tính toán đường cong sống sót

   Hàm survfit() là một hàm dùng để tính toán và vẽ đường sống sót ước tính (survival curves) dựa trên dữ liệu về thời gian sống sót và trạng thái sự kiện của các đối tượng trong một nghiên cứu. Hàm survfit() là một trong những hàm cơ bản của package survival được dùng để phân tích sống sót trên R.

   Cú pháp của hàm survfit() như sau:

survfit(formula, data, weights, ...)

   Trong đó:

  • formula: là công thức mô tả mối quan hệ giữa đối tượng sống sót và các biến giải thích. Công thức này có dạng Surv(time, event) ~ x1 + x2 + …

  • data: là data frame chứa các biến trong công thức.

  • weights: là vector chứa các trọng số cho mỗi quan sát trong mô hình.

   Tôi sẽ dùng lại đối tượng sống sót Surv(lung$time, lung$status) để tạo các đường cong sống sót bằng phương pháp Kaplan-Meier. Tôi tạo đường cong sinh tồn tổng thể với tham số “~1” chỉ định rằng không có biến độc lập nào được sử dụng để phân nhóm, gán nó cho đối tượng survfit_lung và xem xét cấu trúc bằng hàm str():

# Tính toán đường cong sống sót của tất cả bệnh nhân
survfit_lung <- survfit(Surv(time, status) ~ 1, data = lung)
# Hiển thị các thành phần của dữ liệu lung
str(survfit_lung)
## List of 16
##  $ n        : int 228
##  $ time     : num [1:186] 5 11 12 13 15 26 30 31 53 54 ...
##  $ n.risk   : num [1:186] 228 227 224 223 221 220 219 218 217 215 ...
##  $ n.event  : num [1:186] 1 3 1 2 1 1 1 1 2 1 ...
##  $ n.censor : num [1:186] 0 0 0 0 0 0 0 0 0 0 ...
##  $ surv     : num [1:186] 0.996 0.982 0.978 0.969 0.965 ...
##  $ std.err  : num [1:186] 0.0044 0.00885 0.00992 0.01179 0.01263 ...
##  $ cumhaz   : num [1:186] 0.00439 0.0176 0.02207 0.03103 0.03556 ...
##  $ std.chaz : num [1:186] 0.00439 0.0088 0.00987 0.01173 0.01257 ...
##  $ type     : chr "right"
##  $ logse    : logi TRUE
##  $ conf.int : num 0.95
##  $ conf.type: chr "log"
##  $ lower    : num [1:186] 0.987 0.966 0.959 0.947 0.941 ...
##  $ upper    : num [1:186] 1 1 0.997 0.992 0.989 ...
##  $ call     : language survfit(formula = Surv(time, status) ~ 1, data = lung)
##  - attr(*, "class")= chr "survfit"

   Một số thành phần chính của đối tượng survfit này sẽ được sử dụng để tạo các đường cong sống sót bao gồm:

  • time: Các mốc thời gian mà tại đó đường cong có một bước, tức là ít nhất một sự kiện đã xảy ra.

  • surv: Uớc tính tỷ lệ sống sót tại thời điểm tương ứng.

   Tuy nhiên, để so sánh tỉ lệ sống sót giữa hai giới tính nam và nữ, tôi sẽ thêm yếu tố giới tính “~sex” vào hàm survfit() phân nhóm thành các đường cong sống sót theo giới tính, gán nó cho đối tượng survfit_lung_bysex và xem cấu trúc bằng hàm str():

# Tính toán đường cong sống sót theo giới tính
survfit_lung_bysex <- survfit(Surv(time, status) ~ sex, data = lung)
# Hiển thị các thành phần của dữ liệu lung
str(survfit_lung_bysex)
## List of 17
##  $ n        : int [1:2] 138 90
##  $ time     : num [1:206] 11 12 13 15 26 30 31 53 54 59 ...
##  $ n.risk   : num [1:206] 138 135 134 132 131 130 129 128 126 125 ...
##  $ n.event  : num [1:206] 3 1 2 1 1 1 1 2 1 1 ...
##  $ n.censor : num [1:206] 0 0 0 0 0 0 0 0 0 0 ...
##  $ surv     : num [1:206] 0.978 0.971 0.957 0.949 0.942 ...
##  $ std.err  : num [1:206] 0.0127 0.0147 0.0181 0.0197 0.0211 ...
##  $ cumhaz   : num [1:206] 0.0217 0.0291 0.0441 0.0516 0.0593 ...
##  $ std.chaz : num [1:206] 0.0126 0.0146 0.018 0.0195 0.021 ...
##  $ strata   : Named int [1:2] 119 87
##   ..- attr(*, "names")= chr [1:2] "sex=1" "sex=2"
##  $ type     : chr "right"
##  $ logse    : logi TRUE
##  $ conf.int : num 0.95
##  $ conf.type: chr "log"
##  $ lower    : num [1:206] 0.954 0.943 0.923 0.913 0.904 ...
##  $ upper    : num [1:206] 1 0.999 0.991 0.987 0.982 ...
##  $ call     : language survfit(formula = Surv(time, status) ~ sex, data = lung)
##  - attr(*, "class")= chr "survfit"

   Ngoài ra, tôi sẽ đưa vào 2 yếu tố khác vào hàm survfit() để phân nhóm thành các đường cong sống sót theo suy giảm chức năng phổi (ph.ecog)nhóm tuổi (age_group):

survfit_lung_byph <- survfit(Surv(time, status) ~ ph.ecog, data = lung)
survfit_lung_byage <- survfit(Surv(time, status) ~ age_group, data = lung)

4.6 Đường cong sống sót Kaplan-Meier

   Để vẽ đường cong sống sót Kaplan-Meier đơn giản trên R, tôi dùng hàm cơ bản là hàm plot() để vẽ đồ thị như sau:

plot(surv_fit, main = "Đường cong sinh tồn Kaplan Meier", xlab = "Thời gian", ylab = "Xác suất sống sót")

Trong đó:

  • surv_fit: là biến được gán bởi hàm survfit() dùng để tính toán đường cong sinh tồn (xem phần 4.4)

   Đường cong sống sót Kaplan Meier đơn giản

   Tiếp tục bộ dữ liệu ung thư phổi - lung. chúng ta có đồ thị về đường cong sống sót Kaplan-Meier đơn giản như sau:

plot(survfit_lung, xlab = "Thời gian (ngày)", ylab = "Xác suất sống sót", main = "Đường cong sinh tồn Kaplan Meier", col = c("blue"), lwd = 2)

=> Nhận xét đồ thị: đường cong sống sót của dữ liệu ung thư phổi - lung là một đường cong với xu hướng giảm liên tục.

   Ngoài hàm plot() cơ bản trong R, ta có thể sử dụng package survminer và sử dụng hàm ggsurvplot() để vẽ đồ thị:

ggsurvplot(survfit_lung, data = lung, risk.table = TRUE, pval = TRUE, legend.title = "Giới Tính", xlab = "Thời gian (ngày)", ylab = "Xác suất sống sót",)

   Đường cong sống sót Kaplan Meier theo yếu tố giới tính

   Nâng cao hơn, ta có thể vẽ đường cong sống sót Kaplan-Meier cho từng nhóm được phân loại theo yếu tố. Trong ví dụ này, đường cong sống sót Kaplan-Meier được vẽ mỗi nhóm giới tính khác nhau trong dữ liệu ung thư phổi:

ggsurvplot(survfit_lung_bysex, data = lung, risk.table = TRUE, pval = TRUE, legend.title = "Giới Tính", xlab = "Thời gian (ngày)", ylab = "Xác suất sóng sót")

=> Nhận xét đồ thị: có sự khác biệt về xác suất sống sót giữa 2 nhóm nhớm tính (p=0.0013 < 0.05) và giới tính nam (sex=1) có xác suất sóng sót qua thời gian thấp hơn giới tính nữ (sex=1)

   Đường cong sinh tồn Kaplan Meier theo yếu tố mức độ suy giảm chức năng phổi

   Đường cong sinh tồn Kaplan-Meier được vẽ mỗi nhóm suy giảm chức năng phổi khác nhau trong dữ liệu ung thư phổi-lung:

ggsurvplot(survfit_lung_byph, data = lung, risk.table = TRUE, pval = TRUE, legend.title = "Mức độ suy giảm chức năng phổi", xlab = "Thời gian (ngày)", ylab = "Xác suất sóng sót")

=> Nhận xét đồ thị: có sự khác biệt đáng kể giữa các mức độ suy giảm chức năng phổi (p~0.0001 < 0.05) và mức độ suy giảm chức năng phổi càng càng cao thì xuất suất sóng sốt qua thời gian càng thấp.

   Đường cong sinh tồn Kaplan Meier theo từng nhóm tuổi

   Đường cong sinh tồn Kaplan-Meier được vẽ mỗi nhóm nhóm tuổi khác nhau trong dữ liệu ung thư phổi:

ggsurvplot(survfit_lung_byage, data = lung, risk.table = TRUE, pval = TRUE, legend.title = "Nhóm tuổi", xlab = "Thời gian (ngày)", ylab = "Xác suất sóng sót")

=> Nhận xét đồ thị: không có sự khác nhau đáng kể giữa các nhóm tuổi (p= 0.18 > 0.05) khi xác suất sống sót giữa các độ tuổi trong 500 ngày đầu gần như không có sự khác biệt.

4.7 So sánh các đường cong sinh tồn

   Để so sánh các đường cong sinh tồn trên R bằng log-rank, bạn có thể sử dụng hàm survdiff() trong gói survival. Hàm này cho phép bạn tính toán giá trị thống kê log-rankgiá trị p để so sánh đường cong sinh tồn giữa hai hoặc nhiều nhóm. Sau đây là một ví dụ cụ thể về cách thực hiện so sánh các đường cong sinh tồn bằng log-rank trên R:

survdiff(surv_obj ~ x1, data)

Trong đó:

  • surv_obj: là đối tượng sống sót được tạo bởi hàm surv() (xem mục 4.4)

  • x1: là yếu tố được đưa vào để phân nhóm và so sánh

   Kết quả của kiểm định log-rank bao gồm giá trị chi-squaredgiá trị p. Nếu giá trị p nhỏ hơn mức ý nghĩa được chọn trước (thường là 0,05), bạn có thể kết luận rằng có sự khác biệt đáng kể về tỷ lệ sống sót giữa các nhóm được so sánh.

   Trong ví dụ này, đường cong sinh tồn Kaplan-Meier được tính toán cho mỗi nhóm giới tính và mức độ suy giảm chức năng phổi và mỗi nhóm tuổi khác nhau trong dữ liệu ung thư phổi như sau:

# So sánh 2 nhóm giới tính của dữ liệu lung
logrank_test1 <- survdiff(with(lung, Surv(time, status)) ~ sex, data = lung)
# So sánh 4 nhóm mức độ suy giảm chức năng phổi 
logrank_test2 <- survdiff(with(lung, Surv(time, status)) ~ ph.ecog, data = lung)
# So sánh 3 nhóm độ tuổi 
logrank_test3 <- survdiff(with(lung, Surv(time, status)) ~ age_group, data = lung)
print(logrank_test1)
## Call:
## survdiff(formula = with(lung, Surv(time, status)) ~ sex, data = lung)
## 
##         N Observed Expected (O-E)^2/E (O-E)^2/V
## sex=1 138      112     91.6      4.55      10.3
## sex=2  90       53     73.4      5.68      10.3
## 
##  Chisq= 10.3  on 1 degrees of freedom, p= 0.001
print(logrank_test2)
## Call:
## survdiff(formula = with(lung, Surv(time, status)) ~ ph.ecog, 
##     data = lung)
## 
## n=227, 1 observation deleted due to missingness.
## 
##             N Observed Expected (O-E)^2/E (O-E)^2/V
## ph.ecog=0  63       37   54.153    5.4331    8.2119
## ph.ecog=1 113       82   83.528    0.0279    0.0573
## ph.ecog=2  50       44   26.147   12.1893   14.6491
## ph.ecog=3   1        1    0.172    3.9733    4.0040
## 
##  Chisq= 22  on 3 degrees of freedom, p= 7e-05
print(logrank_test3)
## Call:
## survdiff(formula = with(lung, Surv(time, status)) ~ age_group, 
##     data = lung)
## 
##                            N Observed Expected (O-E)^2/E (O-E)^2/V
## age_group=50 đến 65 tuổi 116       81     87.1     0.428     0.916
## age_group=dưới 50 tuổi    20       11     15.4     1.238     1.373
## age_group=trên 65 tuổi    92       73     62.5     1.753     2.855
## 
##  Chisq= 3.5  on 2 degrees of freedom, p= 0.2

   Kết quả kiểm định:

  • Nhóm giới tính (male-female): giá trị p= 0.001 < 0.05 nên có thể kết luận rằng có sự khác biệt đáng kể giữa nhóm giới tính nam và nữ về tỉ lệ sống sót.

  • Nhóm Mức độ suy giảm phổi của bệnh nhân (0 = Tốt, 1 = Tàn phế nhẹ, 2 = Tàn phế trung bình, 3 = Tàn phế nặng): giá trị p= 7e-05 < 0.05 nên có thể kết luận rằng có sự khác biệt đáng kể giữa các nhóm mức độ về tỉ lệ sống sót.

  • Nhóm Độ tuổi ( dưới 50, 50 đến 65, trên 65): giá trị p= 0.2 > 0.05 nên có thể kết luận rằng không có sự khác biệt đáng kể giữa 3 nhóm tuổi được xét.

4.8 Mô hình hồi quy Cox

   Mô hình Cox (Cox proportional hazards model)một phương pháp hồi quy theo tỉ lệ nguy cơ, được sử dụng trong phân tích sống sót để đánh giá tác động của các biến độc lập đến tỉ lệ sống sót. Trong R, chúng ta có thể sử dụng hàm coxph() trong package survival để tạo một mô hình Cox. Để tạo một mô hình Cox trên R, tôi dùng hàm sau:

coxph(surv_obj ~ x1 + x2 + ..., data = mydata)

Trong đó:

  • surv_obj: là đối tượng sinh tồn được tạo từ hàm surv() (phần 4.4)

  • x: là các yếu tố được đưa vào mô hình để phân nhóm các đường cong sinh tồn khác nhau.

   Tiếp tục với dữ liệu ung thư phổi - lung theo biến giới tính, chúng ta có mô hình Cox như sau:

# Tạo mô hình cox theo giới tính
coxfit <- coxph(Surv(time, status) ~ sex, data = lung)
coxfit
## Call:
## coxph(formula = Surv(time, status) ~ sex, data = lung)
## 
##        coef exp(coef) se(coef)      z       p
## sex -0.5310    0.5880   0.1672 -3.176 0.00149
## 
## Likelihood ratio test=10.63  on 1 df, p=0.001111
## n= 228, number of events= 165

4.9 Kiểm định sự phù hợp của mô hình Cox

   Trong R, để kiểm tra tính phù hợp của mô hình Cox với giả định độc lập về thời gian (proportional hazards assumption), chúng ta có thể sử dụng hàm cox.zph() trong package survival.

Cú pháp sử dụng hàm cox.zph() như sau:

cox.zph(model, transform = "km")

Trong đó:

  • model: Là đối tượng mô hình Cox đã được ước lượng bằng hàm coxph() trong gói survival.

  • transform: Là phương pháp biến đổi thời gian (time transformation) được sử dụng để tính toán các thống kê kiểm định. Giá trị mặc định là “km” tương ứng với phương pháp đường chéo Kaplan-Meier.

   Các biến độc lập được kiểm tra bằng cách tính toán hệ số tương quan giữa các giá trị dự đoán của hàm Coxcác hàm đường chéo Kaplan-Meier tương ứng với từng nhóm giá trị của biến độc lập đó. Nếu giá trị p của kiểm định nhỏ hơn một ngưỡng xác định (thường là 0.05), ta có thể bác bỏ giả định độc lập về thời gian và cần phải tìm cách điều chỉnh mô hình Cox để phù hợp hơn với dữ liệu.

Ví dụ với mô hình Cox đã được tạo từ hàm coxph() (xem phần 4.8), ta kiểm định như sau:

# Kiểm định mô hình cox
cox.zph(coxfit, transform = "km")
##        chisq df     p
## sex     2.86  1 0.091
## GLOBAL  2.86  1 0.091

   Kết quả cho thấy: giá trị p= 0.091 > 0.05 nên mô hình Cox được tạo trên là phù hợp.

4.10 So sánh tỉ lệ tử vong giữa hai nhóm bằng mô hình Cox

   Từ mô hình Cox, tôi có thể thu được các bảng kết quả kiểm định giữa hai nhóm giới tính bằng cách sử dụng hàm tbl_regression() từ package gtsummary, với tùy chọn exp = TRUE để trả về tỷ lệ rủi ro:

# Gọi package gtsummary từ thư viện
library("gtsummary")
# Tạo mô hình cox theo giới tính và trả về tỷ lệ rủi ro HR
coxph(Surv(time, status) ~ sex, data = lung) %>% tbl_regression(exp = TRUE) 
Characteristic HR1 95% CI1 p-value
sex 0.59 0.42, 0.82 0.001
1 HR = Hazard Ratio, CI = Confidence Interval

   HR biểu thị tỷ lệ nguy cơ giữa hai nhóm tại bất kỳ thời điểm cụ thể nào. HR < 1 cho thấy nguy cơ tử vong giảm trong khi HR > 1 cho thấy nguy cơ tử vong tăng lên.

  • Kết quả từ hàm tbl_regression() cho thấy: Giá trị p=0.001<0.05 nên kết quả trên là có ý nghĩa thống kê. HR = 0,59 ngụ ý rằng số nam giới sắp chết nhiều gấp 0,59 lần so với nữ giới, tại bất kỳ thời điểm nào. Nói cách khác, phụ nữ có nguy cơ tử vong thấp hơn đáng kể so với nam giới trong các dữ liệu này.

   Áp dụng với yếu tố mức độ suy giảm chức năng phổi ph.ecog:

# Tạo mô hình cox theo mức độ suy giảm chức năng phổi và trả về tỷ lệ rủi ro HR
coxph(Surv(time, status) ~ ph.ecog, data = lung) %>% tbl_regression(exp = TRUE) 
Characteristic HR1 95% CI1 p-value
ph.ecog 1.61 1.29, 2.01 <0.001
1 HR = Hazard Ratio, CI = Confidence Interval
  • Kết quả từ hàm tbl_regression() cho thấy: Giá trị p=0.001<0.05 nên kết quả trên là có ý nghĩa thống kê. HR = 1.61 ngụ ý cho thấy nguy cơ tử vong tăng lên theo mức độ suy giảm chức năng phổi và với mỗi mức suy giảm chức năng phổi tăng lên thì xuất sắc bệnh nhân sắp chết có thể tăng theo 1,61 lần.

4.11 Dự đoán tỉ lệ sống sót trong tương lai

Đ   ể dự đoán tỉ lệ sống sót của một cá nhân dựa trên mô hình Cox đã được ước lượng trên R, chúng ta có thể sử dụng hàm predict() trong package survival.

Cú pháp sử dụng hàm predict() để dự đoán tỉ lệ sống sót của một cá nhân như sau:

predict(object, newdata, type = "survival")

Trong đó:

  • object: Là đối tượng mô hình Cox đã được ước lượng bằng hàm coxph() trong package survival.

  • newdata: Là bộ dữ liệu chứa thông tin về các biến độc lập của biến cần dự đoán. Bộ dữ liệu này phải có cùng tên và định dạng với bộ dữ liệu được sử dụng để ước lượng mô hình.

  • type: Là loại dự đoán cần thực hiện. Trong trường hợp này, ta sử dụng type = "survival" để dự đoán tỉ lệ sống sót.

   Ví dụ: tôi muốn sự báo tỉ lệ sống sót của nhóm giới tính Nam vào ngày thứ 1050, tôi thực hiện các bước dự báo như sau:

# Tạo mô hình cox để dự báo
mod <- coxph(Surv(time,status) ~+ sex, data = cancer)
# Tạo 1 dòng quan sát mới để dự báo
pred_dat <- data.frame(time = c(1050), status = c(0), sex = c(0))
# Tiến hành dự báo bằng hàm predict
preds <- predict(mod, newdata = pred_dat,
                 type = "survival", se.fit = TRUE)
# Lọc xác suất sống sót từ biến preds
pred_dat$prob <- preds$fit
pred_dat
##   time status sex        prob
## 1 1050      0   0 0.002573077

Kết quả: vào ngày 1050, với trạng thái sóng sốt (0)giới tính Nam (0) ta có tỉ lệ sống sót là 0.00257

4.12 Kết quả phân tích dữ liệu ung thư phổi - lung

   Thông qua các bước thực hành phân tích sống sót trên R với dữ liệu ung thư phổi - lung, chúng ta có bản tóm tắt các kết quả:

  1. Dataset lung là một trong những tập dữ liệu tiêu biểu của package survival được sử dụng trong nhiều ví dụ và hướng dẫn về phân tích dữ liệu. Dataset này được tạo ra từ nghiên cứu lâm sàng về ung thư phổi và bao gồm thông tin về 228 bệnh nhân ung thư phổi với các biến như tuổi, giới tính, mức độ suy giảm chức năng phổi,…
  2. Biến time, status là tổ hợp biến time-to-event (dữ liệu thời gian - sự kiện) được dùng để phân tích sống sót trong R. Bên cạnh đó, biến age, sex, ph.ecog3 biến yếu tố dùng để phân nhóm và đánh giá ảnh hưởng của chúng lên tỉ lệ sống sót.
  3. Đồ thị sống sót tổng thể của bệnh nhân ung thư phổi:

  • Đồ thị đường cong sóng sót là đồ thị liên tục giảm, không có xu hướng tăng ở bất kỳ thời điểm nào vì bệnh nhân chết đi không thể sống lại.
  1. Yếu tố giới tính có ảnh hưởng đến tỉ lệ sóng sót của bệnh nhân, trong đó bệnh nhanh mang giới tính nam có tỉ lệ sóng sót qua thời gian thấp hơn so với bệnh nhân mang giới tính nữ.

  2. Yếu tố mức độ suy giảm chức năng phổi có ảnh hưởng đến tỉ lệ sống sót của bệnh nhân, trong đó bệnh nhân có mức độ suy giảm phổi càng lớn thì tỉ lệ sống sót qua thời gian càng thấp.

  3. Yếu tố độ tuổi gần như không có ảnh hưởng đến tỉ lệ sống sót của bệnh nhân.

5 THỰC HÀNH NÂNG CAO VỚI PACKAGE SURVIVAL

5.1 Nguy cơ cạnh tranh - competing risks

   Competing risks (nguy cơ cạnh tranh) là một khái niệm trong phân tích sống sót, đề cập đến việc có nhiều hơn một sự kiện có thể xảy ra đối với các cá nhân trong quá trình theo dõi. Trong phân tích sống sót, sự kiện quan tâm thường là sự kiện sớm nhất xảy ra trong quá trình theo dõi, nhưng trong trường hợp có nhiều sự kiện có thể xảy ra, ví dụ như:

  • Tái phát.

  • Chết do bệnh.

  • Chết vì yếu tố khác.

   Như vậy, phân tích nguy cơ cạnh tranh được sử dụng để tính toán tỷ lệ nguy cơ của các sự kiện cạnh tranh và đo lường ảnh hưởng của chúng đến sự kiện quan tâm.

5.1.1 Dataset melanoma - ung thư da

   Để phân tích nguy cơ cạnh tranh, chúng ta sẽ sử dụng dữ liệu về ung thu da - melanoma trong package MASS bằng cách thực hiện như sau:

# Sử dụng dataset melanoma từ package MASS
data(Melanoma, package = "MASS")
# Hiển thị 6 quan sát đầu tiên
head(Melanoma)
##   time status sex age year thickness ulcer
## 1   10      3   1  76 1972      6.76     1
## 2   30      3   1  56 1968      0.65     0
## 3   35      2   1  41 1977      1.34     0
## 4   99      3   0  71 1968      2.90     0
## 5  185      1   1  52 1965     12.08     1
## 6  204      1   1  28 1971      4.84     1

   Bộ dữ liệu gồm 205 quan sát7 biến sau:

  • time: Thời gian (ngày) từ lúc chẩn đoán ung thư đến sự kiện quan tâm (tái phát ung thư hoặc tử vong) hoặc kết thúc theo dõi.

  • status: tình trạng: 1= chết vì ung thư da, 2= còn sống, 3= chết vì nguyên nhân khác.

  • sex: Giới tính của bệnh nhân.

  • age: Tuổi của bệnh nhân.

  • thíckness: độ dày khối u ban đầu (tính bằng mm).

  • ulcer: Có hay không vết loét trên da ban đầu.

Mã hóa lại dữ liệu của biến status

   Vì bộ dữ liệu về ung thư da- melanoma có biến status với giá trị chưa được mã hóa chuẩn, chúng ta sẽ chuyển đổi giá trị trong biến thành các giá trị mới để tránh nhầm lẫn:

# Chuyển đổi dữ liệu của biến status 2=>0, 3=>2
Melanoma <- 
  Melanoma %>% 
  mutate(status = as.factor(recode(status, `2` = 0, `1` = 1, `3` = 2)))
# Hiển thị 6 quan sát đầu tiên
head(Melanoma)
##   time status sex age year thickness ulcer
## 1   10      2   1  76 1972      6.76     1
## 2   30      2   1  56 1968      0.65     0
## 3   35      0   1  41 1977      1.34     0
## 4   99      2   0  71 1968      2.90     0
## 5  185      1   1  52 1965     12.08     1
## 6  204      1   1  28 1971      4.84     1

Bây giờ chúng ta có:

  • status: 0= còn sống, 1= chết vì ung thư da, 2= chết vì các nguyên nhân khác.

5.1.2 Tỷ lệ tích lũy - Cumulative incidence

   Tỷ lệ tích lũy - Cumulative incidence là một khái niệm trong phân tích nguy cơ cạnh tranh, được sử dụng để tính toán tỷ lệ xảy ra của nhiều sự kiện quan tâm (ví dụ: tái phát ung thư và chết) trong một nhóm cụ thể tại một thời điểm nhất định trong quá trình theo dõi.

Công thức tính Tỷ lệ tích lũy được cho bởi: Cumulative incidence = tổng số sự kiện/số nguy cơ.

Để uớc tính tỷ lệ tích lũy trong rủi ro cạnh tranh, chúng ta thực hiện bằng cách sử dụng hàm cuminc() từ package tidycmprsk:

# Gọi package tydycmprsk từ thư viện
library("tidycmprsk")
# Ước tính tỷ lệ tích lũy
cuminc(Surv(time, status) ~ 1, data = Melanoma)
## 
## time    n.risk   estimate   std.error   95% CI          
## 1,000   171      0.127      0.023       0.086, 0.177    
## 2,000   103      0.230      0.030       0.174, 0.291    
## 3,000   54       0.310      0.037       0.239, 0.383    
## 4,000   13       0.339      0.041       0.260, 0.419    
## 5,000   1        0.339      0.041       0.260, 0.419    
## 
## time    n.risk   estimate   std.error   95% CI          
## 1,000   171      0.034      0.013       0.015, 0.066    
## 2,000   103      0.050      0.016       0.026, 0.087    
## 3,000   54       0.058      0.017       0.030, 0.099    
## 4,000   13       0.106      0.032       0.053, 0.179    
## 5,000   1        0.106      0.032       0.053, 0.179

   Chúng ta có thể sử dụng hàm ggcuminc() từ package ggsurvfit để vẽ biểu đồ tỷ lệ tích lũy. Theo mặc định, nó chỉ vẽ sơ đồ loại sự kiện đầu tiên. Vì vậy, biểu đồ sau đây cho thấy tỷ lệ tử vong tích lũy do ung thư da:

# Gọi package ggsurvfit từ thư viện
library("ggsurvfit")
# Vẽ đồ thị với bảng at rick và khoảng tin cậy 
cuminc(Surv(time, status) ~ 1, data = Melanoma) %>% 
  ggcuminc() + 
  labs(
    x = "Days"
  ) + 
  add_confidence_interval() +
  add_risktable()

   Ngoài ra, chúng ta có thể thể hiện cả hai loại sự kiện là chết vì ung thư da và chết vì nguyên nhân khác, ta thực hiện như sau:

# tỷ lệ tích lũy nguy cơ của chết vì ung thư da và chết vì nguyên nhân khác
cuminc(Surv(time, status) ~ 1, data = Melanoma) %>% 
  ggcuminc(outcome = c("1", "2")) +
  ylim(c(0, 1)) + labs(x = "Days")

   Bây giờ, giả sử chúng ta muốn kiểm tra cái chết do ung thư da hoặc các nguyên nhân khác trong dữ liệu theo biến ulcer: Có hay không vết loét trên da ban đầu (0=không, 1=có). Chúng ta có thể ước tính tỷ lệ tích lũy tại các thời điểm khác nhau theo nhóm và hiển thị tỷ lệ đó trong bảng cách sử dụng hàm tbl_cuminc() từ gói package tidycmprsk để kiểm tra sự khác biệt giữa các nhóm trong toàn bộ thời gian theo dõi bằng cách sử dụng hàm add_p():

# tỷ lệ tích lũy nguy cơ của chết vì ung thư da và chết vì nguyên nhân khác nhưng có yếu tố vết loét
cuminc(Surv(time, status) ~ ulcer, data = Melanoma) %>% 
  tbl_cuminc(
    times = 1826.25, 
    label_header = "**{time/365.25}-year cuminc**") %>% 
  add_p()
Characteristic 5-year cuminc p-value1
ulcer <0.001
    0 9.1% (4.6%, 15%)
    1 39% (29%, 49%)
1 Gray’s Test

   Sau đó, chúng ta có thể thấy đồ thị về cái chết do ung thư da, theo tình trạng vết loét, chúng ta sử dụng ggcuminc() từ package ggsurvfit:

cuminc(Surv(time, status) ~ ulcer, data = Melanoma) %>% 
  ggcuminc() + 
  labs(
    x = "Days"
  ) + 
  add_confidence_interval() +
  add_risktable()
## Plotting outcome "1".

5.1.3 Hồi quy Cox trong nguy cơ cạnh tranh

   Giả sử chúng ta quan tâm đến việc xem xét ảnh hưởng của tuổi tác và giới tính đối với cái chết do ung thư da, với cái chết do các nguyên nhân khác là một sự kiện cạnh tranh.

Hàm crr() từ package tidycmprsk sẽ ước tính các nguy cơ phân phối phụ:

# tạo mô hình cox với 2 yếu tố là giới tính và tuổi
crr(Surv(time, status) ~ sex + age, data = Melanoma)
## 
## Variable   Coef    SE      HR     95% CI       p-value    
## sex        0.588   0.272   1.80   1.06, 3.07   0.030      
## age        0.013   0.009   1.01   0.99, 1.03   0.18

Và chúng ta có thể tạo các bảng kết quả được định dạng bằng cách sử dụng hàm tbl_regression() từ package gtsummary, với tùy chọn exp = TRUE để có được ước tính tỷ lệ rủi ro:

# + trả về tỷ lệ nguy cơ tích lũy
crr(Surv(time, status) ~ sex + age, data = Melanoma) %>% 
  tbl_regression(exp = TRUE)
Characteristic HR1 95% CI1 p-value
sex 1.80 1.06, 3.07 0.030
age 1.01 0.99, 1.03 0.2
1 HR = Hazard Ratio, CI = Confidence Interval

   Kết quả cho thấy: Giới tính nam (1=nam, 0=nữ) có liên quan đáng kể đến việc tăng nguy cơ tử vong do khối u ác tính (vì p-value=0.03<0.05), trong khi tuổi tác không liên quan đáng kể đến tử vong do khối u ác tính (vì p-value=0.2>0.05).

5.2 Trực quan hóa đường cong tỉ lệ tử vong - Fit complex survival curves

   “Fit complex survival curves” có thể được dịch sang tiếng Việt là “Đường cong tỉ lệ tử vong”. Đây là một thuật ngữ trong phân tích sống còn (survival analysis) để mô hình hóa dữ liệu thời gian sự kiện phức tạp, trong đó sự kiện có thể xảy ra ở nhiều lần khác nhau hoặc có nhiều nguyên nhân khác nhau dẫn đến sự kiện xảy ra.

   Chúng ta vẫn sẽ sử dụng dữ liệu ung thư phổi - lung cho việc trực quan hóa đường tỉ lệ tử vong. Chúng ta sẽ tạo một bảng các đường cong sống sót theo giới tính được phân chia theo 2 yếu tố. Bảng các đồ thị trực quan được thực hiện như sau:

fitx <- survfit( Surv(time, status) ~ sex + age_group + ph.ecog,
                data = lung )
ggsurv <- ggsurvplot(fitx, fun = "event", conf.int = TRUE,
                     ggtheme = theme_bw())
   
ggsurv$plot +theme_bw() + 
  theme (legend.position = "right")+
  facet_grid(age_group ~ ph.ecog)

   Từ bảng các đồ thị, ta thấy đồ thị 1 thuộc nhóm 50 đến 60 tuổi và có mức độ suy giảm chức năng phổi = 0 và có 2 đường cong tỉ lệ tử vong là giới tính nam và nữ.

6 ÁP DỤNG PHÂN TÍCH SỐNG SÓT VỚI PACKAGE SURVIVAL

6.1 Định phí bảo hiểm

Chúng ta sẽ sử dụng dữ liệu về xác suất sống sót của dữ liệu ung thư phổi (xem phần 4.1) để áp dụng vào định giá bảo hiểm điều trị ung thư phổi.

Bằng cách xem xét các đồ thị đường cong sống sót trong R và phân tích các chỉ số liên quan, tôi đã xây dựng một mô hình định giá bảo hiểm hỗ trợ điều trị ung thư phổi một cách chính xác.

Mô hình này cho phép tính toán mức độ rủi ro và xác định các khoản bồi thường phù hợp dựa trên xác suất sống sót của người được bảo hiểm. Việc áp dụng dữ liệu xác suất sống sót vào định giá bảo hiểm giúp tăng tính công bằng và chính xác trong việc định giá các chính sách bảo hiểm điều trị ung thư.

Như vậy, công thức định phí bảo hiểm hỗ trợ điều trị ung thư phổi có thể sử dụng một phương trình đơn giản:

Phí bảo hiểm = Phí điều trị mỗi ngày x Thời gian sống sót trung bình

Chúng ta sẽ đặt giả thiết như sau:

  • Không có tình trạng lạm phát xảy ra.

  • Phí điều trị như nhau ( ví dụ 500k/ngày)

  • Đối tượng mua bảo hiểm: bệnh nhân bị ung thư - hỗ trợ chi phí điều trị cho tới khi chết.

Như vậy, để định phí bảo hiểm hỗ trợ ung thư phổi, ta cần tính thời gian sống sót trung bình:

fit <- coxph(Surv(time, status) ~ 1, data = lung)
print(median(survfit(fit)$time))
## [1] 274

Kết quả: Phí bảo hiểm = 500.000*274= 137.000.000

Như vậy, chúng ta cần bán bảo hiểm hỗ trợ điều trị ung thơ với mức giá trên 137 triệu

Ngoài ra, bằng cách sử dụng package survival và phân tích sống sót, chúng ta có thể đưa ra phí bảo hiểm khác nhau cho từng nhóm khách hàng.

6.2 Ngành sản xuất sản phẩm

Trong sản xuất sản phẩm, phân tích sống sót có thể được áp dụng để xác định chất lượng của sản phẩm dựa trên việc kiểm tra một số lượng sản phẩm mẫu.

Để thực hiện phân tích sống sót cho ngành sản xuất sản phẩm, tôi sẽ dùng dữ liệu lightbulb về 2 nhóm bóng đèn: huỳnh quang và sợi đốt

library(readxl)
lightbulb <- read_excel("lightbulb.xlsx")

Lightbulb là dữ liệu được tôi lấy từ dữ liệu mẫu của phần mềm MATLAB (phần mềm cung cấp môi trường tính toán số và lập trình, do công ty MathWorks thiết kế) và đã được tôi lưu vào excel

lightbulb <- lightbulb %>% mutate(status = recode(status, '1' = 0, '0' = 1))
head(lightbulb)
## # A tibble: 6 × 4
##      id  time status  type
##   <dbl> <dbl>  <dbl> <dbl>
## 1     1  8148      1     0
## 2     2  8503      1     0
## 3     3  5184      1     0
## 4     4 10994      1     0
## 5     5 10463      0     0
## 6     6 12860      1     0

Trong đó:

  • Time: Dữ liệu tuổi thọ (tính bằng giờ) của hai loại bóng đèn
  • Status: Thông tin kiểm duyệt với 0= chưa xuất hiện lỗi và 1= đã xuất hiện lỗi
  • Type: loại bóng đèn với 0= đèn huỳnh quang, 1= đèn sợi đốt

Ta có đồ thị đường cong sống sót của 2 loại bóng đèn như sau:

bongden <- survfit(Surv(time, status) ~ type, data = lightbulb)
plot(bongden, main = "Đường cong không gặp lỗi của bóng đèn ", xlab = "Thời gian (giờ)", ylab = "Xác suất không gặp lỗi")

Chúng ta có thể thấy rằng xác suất gặp lỗi của bóng đèn sợi đốt cao hơn nhiều so với bóng đèn huỳnh quang.

7 PHẦN KẾT LUẬN

7.1 Ưu điểm của package survival

  • Phù hợp với nhiều loại dữ liệu: Package “survival” có thể được sử dụng cho nhiều loại dữ liệu phân tích sống còn, bao gồm dữ liệu censored, dữ liệu sự kiện rời rạc và dữ liệu không censored.

  • Độ tin cậy cao: Các mô hình survival phân tích dữ liệu thời gian đến sự kiện thường được sử dụng trong các nghiên cứu y tế và kinh tế học, và package “survival” cung cấp các công cụ và hàm để phân tích các mô hình này với độ tin cậy cao.

  • Cung cấp các công cụ để đánh giá mối quan hệ giữa các biến và thời gian cho đến sự kiện: Package “survival” cung cấp các công cụ để đánh giá mối quan hệ giữa các biến và thời gian cho đến sự kiện, bao gồm phân tích Cox proportional hazards và tính toán survival function.

  • Tích hợp tốt với các package khác trong R: Package “survival” tích hợp tốt với các package khác trong R, cho phép phân tích dữ liệu phân tích sống còn và đánh giá mối quan hệ giữa các biến và thời gian cho đến sự kiện trong nhiều ngữ cảnh khác nhau.

7.2 Nhược điểm của package survival

  • Khó sử dụng cho người mới bắt đầu: Package “survival” có nhiều hàm và tham số phức tạp, do đó có thể khó sử dụng cho người mới bắt đầu sử dụng R hoặc phân tích dữ liệu thời gian đến sự kiện.

  • Đòi hỏi kiến thức về phân tích sống sót: Package “survival” đòi hỏi kiến thức chuyên sâu về phân tích dữ liệu phân tích sống sót và các mô hình survival, do đó không phù hợp cho những người không có nền tảng kiến thức đầy đủ.

  • Có thể gặp vấn đề với dữ liệu thiếu: Package “survival” có thể gặp vấn đề khi phân tích dữ liệu thời gian đến sự kiện có dữ liệu thiếu hoặc dữ liệu censored nhiều, do đó cần phải xử lý kỹ trước khi phân tích.

  • Không phù hợp cho các nghiên cứu quan sát ngắn hạn: Package “survival” thường được sử dụng để phân tích dữ liệu thời gian đến sự kiện trong các nghiên cứu quan sát dài hạn, do đó không phù hợp cho các nghiên cứu quan sát ngắn hạn.

7.3 Ý nghĩa của phân tích sống còn

  • Trong y học: Phân tích sống sót được sử dụng trong nghiên cứu y học để đánh giá tác động của các yếu tố khác nhau đến sự kiện quan trọng như tử vong, bệnh lý, tái phát bệnh, và thời gian sống sót. Nó có thể giúp các nhà nghiên cứu phân tích và đưa ra dự báo về nguy cơ mắc bệnh, tốc độ tiến triển bệnh và dự báo thời gian sống sót.

  • Trong kinh tế học: Phân tích sống sót cũng được sử dụng trong kinh tế học để đánh giá tác động của các chính sách và các yếu tố khác đến sự kiện quan trọng như thời gian thất nghiệp, thời gian nghỉ hưu, và thời gian kinh doanh của một doanh nghiệp.

  • Trong nghiên cứu xã hội: Phân tích sống sót cũng có giá trị trong nghiên cứu xã hội, giúp các nhà nghiên cứu đánh giá tác động của các yếu tố khác đến sự kiện quan trọng như thời gian chuyển đổi việc làm, thời gian kết hôn hoặc ly hôn, và thời gian sống sót của một nhóm người.

    Tuy nhiên, bài tiểu luận này chỉ thực hành phân tích survival analysis với dữ liệu thuộc về y học.

8 TÀI LIỆU THAM KHẢO

  1. Phân tích sống còn - Cẩm nang dịch tễ học với R (Applied Epi)

  2. A package for survival analysis in R - Terry Therneau

  3. Survival Analysis in R - Emily C.Zabor

LS0tDQp0aXRsZTogIsSQ4buAIFTDgEk6IFBIw4JOIFTDjUNIIFPhu5BORyBDw5JOIC0gUEFDS0FHRSBTVVJWSVZBTCINCmF1dGhvcjoNCiAgLSBuYW1lOiAiTMOqIFBo4bqhbSBUaOG7iyBQaMawxqFuZyBUaeG7gW4gLSAyMTIxMDA2NTczIg0KICAtIG5hbWU6ICJOZ3V54buFbiBLaMOhbmggQW4gLSAyMTIxMDEyNTQ0Ig0KZGF0ZTogIjIwMjMtMDctMDEiDQpvdXRwdXQ6IA0KIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiA1DQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdGhlbWU6IGx1bWVuDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KLS0tDQoNCmBgYHs9aHRtbH0NCjxzdHlsZT4NCmJvZHkge3RleHQtYWxpZ246IGp1c3RpZnkgfQ0KPC9zdHlsZT4NCmBgYA0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIVtdKGJpYXRsLnBuZykNCg0KIyAxIFBI4bqmTiBN4bueIMSQ4bqmVQ0KDQojIyAxLjEgTOG7nWkgbsOzaSDEkeG6p3UNCg0KwqDCoMKgYFN1cnZpdmFsYCAqKi0tIFBow6JuIHTDrWNoIHPhu7EgdOG7k24gdOG6oWkqKiAqKlxfIFBow6JuIHTDrWNoIHPhu5FuZyBzw7N0XF8gUGjDom4gdMOtY2ggc+G7kW5nIHPDs3RcXyBQaMOibiB0w61jaCBz4buxIGtp4buHbioqDQoNCsKgwqDCoCoqUGjDom4gdMOtY2ggc+G7kW5nIHPDs3QqKiBob+G6t2MgKipQaMOibiB0w61jaCBz4buxIGtp4buHbioqIGtoaSBuaMOgIG5naGnDqm4gY+G7qXUgbXXhu5FuIHTDrG0gaGnhu4N1IOG6o25oIGjGsOG7n25nIMSR4bq/biBjw6FjIGJp4bq/biBr4bq/dCBj4bulYyAoKipiaeG6v24gcGjhu6UgdGh14buZYyoqKSBtYW5nIHTDrW5oICp0aOG7nWkgZ2lhbiouDQoNCsKgwqDCoEtoaSBzbyBzw6FuaCAyIHBoxrDGoW5nIHBow6FwIMSRaeG7gXUgdHLhu4sgY2hvIGPDoWMgYuG7h25oIGPDsyB04bqnbiBz4buRIHThu60gdm9uZyBjYW8gbmjGsCAqYuG7h25oIEFJRFMsIGPDoWMgYuG7h25oIHVuZyB0aMawKi4gTuG6v3UgbcO0IGjDrG5oIHBow6JuIHTDrWNoIG5oxrAgcGjDom4gdMOtY2ggaOG7k2kgcXVpIGxvZ2lzdGljLCBjaOG7iSDEkeG7gyDDvSDEkeG6v24gYmnhur9uIGvhur90IGPhu6VjICgqc+G7kW5nL2No4bq/dCogaG/hurdjICpraOG7j2kgYuG7h25oL2tow7RuZyBraOG7j2kgYuG7h25oKikgbcOgICpraMO0bmcgcXVhbiB0w6JtIMSR4bq/biB54bq/dSB04buRIHRo4budaSBnaWFuKiB0aMOsIHTDtGkga2jDtG5nIHTDrG0gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IGdp4buvYSAyIHBoxrDGoW5nIHBow6FwIMSRaeG7gXUgdHLhu4sgdsOsIHThu4kgbOG7hyB04butIHZvbmcgZ+G6p24gbmjGsCBuaGF1LCBuaMawbmcgdGjhu51pIGdpYW4gZOG6q24gxJHhur9uIHThu60gdm9uZyDhu58gMiBuaMOzbSBjw7MgdGjhu4Mga2jDoWMgbmhhdS4NCg0KPVw+IFbDrCB24bqteSBjaMO6bmcgdGEgcGjhuqNpIHPhu60gZOG7pW5nIG3DtCBow6xuaCAqKlBow6JuIHTDrWNoIHPhu5FuZyBzw7N0KiogdGjDrCBt4bubaSB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgbsOgeS4gTmjGsCB24bqteSBtw7QgaMOsbmggbmdoacOqbiBj4bupdSBtw7QgdOG6oyBr4bq/dCBj4bulYyBsw6AgYmnhur9uIG1hbmcgMiBnacOhIHRy4buLIMSR4buRaSBs4bqtcCAoKnPhu5FuZy9jaOG6v3QqKSB0dXkgcXVhbiB0cuG7jW5nIG5oxrBuZyBraMO0bmcgY2jDrW5oIHjDoWMuDQoNCsKgwqDCoE3DtCBow6xuaCBjaMOtbmggxJHhu4MgdGjhu4MgaGnhu4duIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIHRo4budaSBnaWFuIGThuqtuIMSR4bq/biBz4buxIGtp4buHbiAoKnPhu5FuZy9jaOG6v3QsIC4uLiopIHbDoCBjw6FjIHnhur91IHThu5Egbmd1eSBjxqEgKihyaXNrIGZhY3RvcnMpKiBsw6AgbcO0IGjDrG5oIGPDsyB0w6puIGzDoCAiKipzdXJ2aXZhbCBhbmFseXNpcyAtLSBQaMOibiB0w61jaCBz4buRbmcgc8OzdCoqIi4gQ+G7pW0gdOG7qyBgc3Vydml2YWwgYW5hbHlzaXNgIHh14bqldCBwaMOhdCB04burIG5naGnDqm4gY+G7qXUgdHJvbmcgYuG6o28gaGnhu4NtLCB2w6AgZ2nhu5tpIG5naGnDqm4gY+G7qXUgeSBraG9hIHThu6sgxJHDsyBkw7luZyBj4bulbSB04burIGNobyBi4buZIG3DtG4gY+G7p2EgbcOsbmguIE5oxrBuZyBuaMawIG7Ds2kgdHLDqm4sICpz4buRbmcvY2jhur90KiBraMO0bmcgcGjhuqNpIGzDoCBiaeG6v24gZHV5IG5o4bqldCwgdsOsIHRyb25nIHRo4buxYyB04bq/IGNow7puZyB0YSBjxaluZyBjw7Mgbmjhu69uZyBiaeG6v24gY+G7kSAqY8OzKiBi4buHbmggaGF5IGtow7RuZyBi4buHbmgsIHjhuqN5IHJhIGhheSBraMO0bmcgeOG6o3kgcmEuIE5nb8OgaSByYSwgdHJvbmcgY8OhYyBi4buZIG3DtG4ga8SpIHRodeG6rXQsIG5nxrDhu51pIHRhIGTDuW5nIG3hu5l0IGPhu6VtIHThu6sga2jDoWMgIioqcmVsaWFiaWxpdHkgYW5hbHlzaXMgLS0gUGjDom4gdMOtY2ggxJHhu5kgdGluIGPhuq15KioiLCDEkeG7gyBjaOG7iSBjaG8ga2jDoWkgbmnhu4dtIGBzdXJ2aXZhbCBhbmFseXNpc2AuIFR1eSBuaGnDqm4gdHJvbmcgxJHhu4EgdMOgaSBuw6B5IGNow7puZyB0w7RpIHPhur0gZMO5bmcgY+G7pW0gdOG7qyAqKlBow6JuIHTDrWNoIHPhu5FuZyBzw7N0KiouDQoNCiMjIDEuMiBMw70gZG8gY2jhu41uIMSR4buBIHTDoGkNCg0KwqDCoMKgKipNw7QgaMOsbmggaMOzYSBk4buvIGxp4buHdSB0aOG7nWkgZ2lhbiDEkeG6v24gc+G7sSBraeG7h24qKiBsw6AgbeG7mXQgY2jhu6cgxJHhu4EgcXVhbiB0cuG7jW5nIHbhu5tpIG5oaeG7gXUg4bupbmcgZOG7pW5nIHRyb25nIGPDoWMgbMSpbmggduG7sWMga2jDoWMgbmhhdS4gVOG6rXAgaOG7o3AgY8OhYyBwaMawxqFuZyBwaMOhcCDEkeG7gyBwaMOibiB0w61jaCBk4buvIGxp4buHdSDEkcOzIMSRxrDhu6NjIGfhu41pIGzDoCBwaMOibiB0w61jaCBz4buxIHThu5NuIHThuqFpLCBwaMOibiB0w61jaCBs4buLY2ggc+G7rSBz4buxIGtp4buHbiBob+G6t2MgcGjDom4gdMOtY2ggdGjhu51pIGdpYW4uICoqUGjDom4gdMOtY2ggc+G7kW5nIHPDs3QqKiDEkcaw4bujYyDDoXAgZOG7pW5nIHLhu5luZyByw6NpIHbDrCDEkeG7i25oIG5naMSpYSB24buBIG3hu5l0IConc+G7sSBraeG7h24nKiBjw7MgdGjhu4MgcuG6pXQgxJFhIGThuqFuZyB2w6AgY8OhYyB2w60gZOG7pSBiYW8gZ+G7k20gKmNo4bq/dCB2w6Agc+G7kW5nKiwgKnRow6BuaCBjw7RuZyB2w6AgcGjDoSBz4bqjbiosICp0aeG6v3AgdOG7pWMgaG/hurdjIGjhu6d5IGLhu48qLiBEbyDEkcOzLCBjw6FjIGzEqW5oIHbhu7FjIOG7qW5nIGThu6VuZyBiYW8gZ+G7k20gdOG7qyB5IGjhu41jIHbDoCB4w6MgaOG7mWkgaOG7jWMgxJHhur9uIHRp4bq/cCB0aOG7iyB2w6Aga2luaCB04bq/LiBUcm9uZyBiw6BpIHRp4buDdSBsdeG6rW4gbsOgeSwgY2jDum5nIHRhICp4ZW0geMOpdCBjw6FjIHbhuqVuIMSR4buBIGPGoSBi4bqjbiB24buBIGzDvSB0aHV54bq/dCogY+G7p2EgKipwaMOibiB0w61jaCBz4buRbmcgc8OzdCoqIGJhbyBn4buTbSBjw6FjIGPDtG5nIGPhu6UgxrDhu5tjIHTDrW5oIGNobyBjw6FjIGNo4bupYyBuxINuZyBzaW5oIHThu5NuIHbDoCBy4bunaSBybyB2w6AgY8OhY2ggKnRo4buxYyBow6BuaCB0csOqbiBSKiBk4buxYSB0csOqbiBwYWNrYWdlIGBzdXJ2aXZhbGAuDQoNCsKgwqDCoMSQ4bq3YyBiaeG7h3QsIHRyb25nIHRo4budaSDEkeG6oWkgaGnhu4duIG5heSB24burYSB0cuG6o2kgcXVhIGThu4tjaCBi4buHbmggKioqQ292aWQtMTkqKiogZ8OieSDhuqNuaCBoxrDhu59uZyBy4bqldCBs4bubbiDEkeG6v24gc+G7qWMga2jhu49lLCBraW5oIHThur8gdsOgIHjDoyBo4buZaSBj4bunYSB0b8OgbiB0aOG6vyBnaeG7m2kuIERvIMSRw7MgKnZp4buHYyDDoXAgZOG7pW5nIHBow6JuIHTDrWNoIHPhu5FuZyBzw7N0KiBjaG8gZOG7i2NoIGLhu4duaCAqQ292aWQgMTkqIGzDoCB2aeG7h2MgY8OzIMO9IG5naMSpYSBy4bqldCBxdWFuIHRy4buNbmcuIEPhu6UgdGjhu4MsICpwaMOibiB0w61jaCBz4buRbmcgc8OzdCBDb3ZpZC0xOSogY8OzIHRo4buDIMSRxrBhIHJhIGPDoWMgZOG7sSDEkW/DoW4gduG7gSBz4buRIGNhIG5oaeG7hW0gdsOgIHThu60gdm9uZyB0cm9uZyB0xrDGoW5nIGxhaSBk4buxYSB0csOqbiBjw6FjIG3DtCBow6xuaCBk4buxIMSRb8OhbiwgxJHDoW5oIGdpw6Ega2jhuqMgbsSDbmcg4bqjbmggaMaw4bufbmcgY+G7p2EgY8OhYyBiaeG7h24gcGjDoXAgcGjDsm5nIGNo4buRbmcgZOG7i2NoIGLhu4duaCB2w6AgxJHGsGEgcmEgY8OhYyBnaeG6o2kgcGjDoXAgxJHhu4MgZ2nhuqNtIHRoaeG7g3UgdMOhYyDEkeG7mW5nIGPhu6dhIGThu4tjaCBi4buHbmggxJHhur9uIHPhu6ljIGto4buPZSB2w6Aga2luaCB04bq/Lg0KDQrCoMKgwqBUaOG6pXkgxJHGsOG7o2MgdOG6p20gcXVhbiB0cuG7jW5nIGPFqW5nIG5oxrAgdGnhu4FtIG7Eg25nIGtoaSBwaMOibiB0w61jaCBz4buxIHThu5NuIHThuqFpIGPhu6dhIHBhY2thZ2UgYHN1cnZpdmFsYCB0cm9uZyB0aOG7nWkgxJFp4buDbSBoaeG7h24gdOG6oWksIGNow7puZyB0w7RpIG1vbmcgbXXhu5FuIGPDsyB0aOG7gyAqKmvhur90IGjhu6NwIGPDoWMgbmfDtG4gbmfhu68gbOG6rXAgdHLDrG5oKiogxJHhu4MgZ2nhuqNpIHF1eeG6v3QgduG6pW4gxJHhu4EgdHJvbmcga2luaCB04bq/IHjDoyBo4buZaSBoaeG7h24gdsOgIG3DtCBow6xuaCBuw6B5IHPhur0gZ2nDunAgw61jaCBjaG8gdmnhu4djICpwaMOibiB0w61jaCBjw6FjIG5ndXkgY8ahLCBz4buxIHPhu5FuZyBzw7N0KiBjw7MgdGjhu4MgeOG6o3kgcmEgdOG7qyDEkcOzIGPDsyB0aOG7gyBk4buFIGTDoG5nIGdp4bqjaSBxdXnhur90IMSRxrDhu6NjIGPDoWMgduG6pW4gxJHhu4EgcXVhbiB0cuG7jW5nLg0KDQojIyAxLjMgTeG7pWMgxJHDrWNoIMSR4buBIHTDoGkNCg0KwqDCoMKgTeG7mXQgxrB1IMSRaeG7g20gY+G7p2EgKipQaMOibiB0w61jaCBz4buRbmcgc8OzdCoqIGzDoCB44butIGzDvSDEkcaw4bujYyBjw6FjIHRyxrDhu51uZyBo4bujcCDEkeG7kWkgdMaw4bujbmcgbmdoacOqbiBj4bupdSBi4buPIGN14buZYyBnaeG7r2EgY2jhu6tuZyAqKCpuaMawIG3huqV0IGThuqV1IHRoZW8gZMO1aSwgbmfGsG5nIMSRaeG7gXUgdHLhu4sgZG8gdMOhYyBk4bulbmcgcGjhu6UgY+G7p2EgdGh14buRYyBob+G6t2MgdOG7rSB2b25nIGRvIGLhu4duaCBsw70ga2jDoWMuLi4pLg0KDQrCoMKgwqBUcm9uZyBtw7QgaMOsbmggcGjDom4gdMOtY2ggbsOgeSBjw6FjIMSR4buRaSB0xrDhu6NuZyBjw7JuIHPhu5FuZyBr4buDIGPhuqMgxJHhu5FpIHTGsOG7o25nIGLhu48gY3Xhu5ljIMSRxrDhu6NjIGfhu41pIGzDoCAqYGNlbnNvcmVkYCogaG/hurdjIHPhu7Ega2nhu4duIGNoxrBhIHjhuqN5IHJhLiBDw6FjIMSR4buRaSB0xrDhu6NuZyB04butIHZvbmcgaG/hurdjIGjhur90IHPhu5FuZyDEkcaw4bujYyBn4buNaSBsw6AgKmBldmVudHNgKiBob+G6t2Mgc+G7sSBraeG7h24gxJHDoyBr4bq/dCB0aMO6Yy4gTeG7pWMgdGnDqnUgc3V5IGx14bqtbiDEkeG7kWkgduG7m2kgcGjDom4gdMOtY2ggc+G7kW5nIHPDs3QgbMOgIGtob+G6o25nIHRo4budaSBnaWFuIGdp4buvYSB0aOG7nWkgxJFp4buDbSBi4bqvdCDEkeG6p3UgdsOgIHRo4budaSDEkWnhu4NtIHPhu7Ega2nhu4duIHjhuqN5IHJhLiBUcm9uZyBuZ2hpw6puIGPhu6l1IHkgaOG7jWMgaGnhu4duIG5heSwgcGjDom4gdMOtY2ggc+G7kW5nIHPDs3QgxJHGsOG7o2Mgc+G7rSBk4bulbmcgcuG7mW5nIHLDo2kgdHJvbmcgY8OhYyBuZ2hpw6puIGPhu6l1IGzDom0gc8OgbmcgxJHhu4MgxJHDoW5oIGdpw6EgaGnhu4d1IHF14bqjIGPhu6dhIG3hu5l0IHBoxrDGoW5nIHBoxrDGoW5nIMSRaeG7gXUgdHLhu4sgaG/hurdjIMSR4buDIMSRw6FuaCBnacOhIHTDrG5oIHRy4bqhbmcgc+G7kW5nIHPDs3QgY+G7p2EgbeG7mXQgc+G7kSBjw6FjIGJp4buHbiBwaMOhcCDEkWnhu4F1IHRy4buLIHVuZyB0aMawLiBUcm9uZyBraW5oIHThur8geMOjIGjhu5lpLCBwaMOibiB0w61jaCBz4buRbmcgc8OzdCDEkcaw4bujYyBkw7luZyDEkeG7gyBwaMOibiB0w61jaCAqKnLhu6dpIHJvLyBuZ3V5IGPGoSoqIMSR4buDIMSRw6FuaCBnacOhIHPhu7EgdOG7k24gdOG6oWksIGPhu6dhIG3hu5l0IGRvYW5oIG5naGnhu4dwIG7DoG8gxJHDsy4NCg0KIyMgMS40IMSQ4buRaSB0xrDhu6NuZywgcGjhuqFtIHZpIG5naGnDqm4gY+G7qXUNCg0KKirEkOG7kWkgdMaw4bujbmcgbmdoacOqbiBj4bupdSoqDQoNCsKgwqDCoFBow6JuIHTDrWNoIHPhu5FuZyBzw7N0IHThuq1wIHRydW5nIG3DtCB04bqjIGNobyBt4buZdCBjw6EgdGjhu4MgaGF5IG3hu5l0IG5ow7NtIGPDoSB0aOG7gyBuaOG6pXQgxJHhu4tuaC4gTeG7mXQgxJFp4buDbSB4w6FjIMSR4buLbmggY+G7p2EgbeG7mXQgc+G7sSBraeG7h24gxJHGsOG7o2MgZ+G7jWkgbMOgIGBmYWlsdXJlYCAobmjGsCBsw6AgKnh14bqldCBoaeG7h24gYuG7h25oLCBjaOG7r2Ega2jhu49pIGLhu4duaCwgdOG7rSB2b25nLCB0w6FpIHBow6F0IHNhdSBraGkgxJHDoXAg4bupbmcgduG7m2kgxJFp4buBdSB0cuG7iyouLi4pIG3DoCB44bqjeSByYSBzYXUgbeG7mXQga2hv4bqjbmcgdGjhu51pIGdpYW4gxJHGsOG7o2MgZ+G7jWkgbMOgIGBmYWlsdXJlIHRpbWVgICgqdGjhu51pIGdpYW4gZOG6q24gxJHhur9uIHPhu7Ega2nhu4duKikgaG/hurdjIChgZm9sbG93LXVwIHRpbWVgICgqdGjhu51pIGdpYW4gdGhlbyBkw7VpKikgdHJvbmcgbmdoacOqbiBj4bupdSB0aHXhuqduIHThuq1wL25naGnDqm4gY+G7qXUgZOG7sWEgdsOgbyBkw6JuIHPhu5EpIHRyb25nIHN14buRdCB0aOG7nWkgZ2lhbiBjw6FjIGPDoSB0aOG7gyDEkcaw4bujYyBxdWFuIHPDoXQuIMSQ4buDIHjDoWMgxJHhu4tuaCB0aOG7nWkgZ2lhbiBk4bqrbiDEkeG6v24gc+G7sSBraeG7h24sIGNow7puZyB0YSBj4bqnbiB4w6FjIMSR4buLbmggdGjhu51pIMSRaeG7g20gYuG6r3QgxJHhuqd1IChjw7MgdGjhu4MgbMOgICpuZ8OgeSBuaOG6rW4gdsOgbywgbmfDoHkgY2jhuqluIMSRb8OhbiouLi4pLg0KDQrCoMKgwqAqKlBo4bqhbSB2aSBuZ2hpw6puIGPhu6l1KioNCg0KwqDCoMKgVHJvbmcgYsOgaSBiw6FvIG7DoHksIGNow7puZyB0YSBz4bq9IHhlbSB4w6l0IGPDoWMgduG6pW4gxJHhu4EgY8ahIGLhuqNuIHbhu4EgbMO9IHRodXnhur90IGPhu6dhIHBow6JuIHTDrWNoIHThu7cgbOG7hyBz4buRbmcgc8OzdCBiYW8gZ+G7k20gY8OhYyBjw7RuZyBj4bulIMaw4bubYyB0w61uaCBjaG8gY8OhYyBjaOG7qWMgbsSDbmcgc2luaCB04buTbiB2w6AgcuG7p2kgcm8uDQoNCsKgwqDCoFNhdSDEkcOzIGNow7puZyB0YSBz4bq9IHPhu60gZOG7pW5nIG5nw7RuIG5n4buvIGzhuq1wIHRyw6xuaCB0aOG7kW5nIGvDqiBSIMSR4buDIGNobyBwaMOpcCDhu6luZyBk4bulbmcgdGjhu7FjIHThur8gY+G7p2EgcGjGsMahbmcgcGjDoXAgbsOgeS4gUGjDqXAgxrDhu5tjIHTDrW5oIHRoxrDhu51uZyDEkcaw4bujYyBkw7luZyDEkeG7gyBQaMOibiB0w61jaCBz4buRbmcgc8OzdCDEkcaw4bujYyBn4buNaSBsw6AgxrDhu5tjIHTDrW5oICoqKkthcGxhbk1laWVyKioqLiBQaMOpcCDGsOG7m2MgdMOtbmggbsOgeSBnacO6cCB0YSB0w61uaCDEkcaw4bujYyB4w6FjIHN14bqldCBz4buRbmcgc8OzdCB0w61jaCBsxal5IHThuqFpIGPDoWMgbeG7kWMgdGjhu51pIGdpYW4ga2jDoWMgbmhhdSAuIE7hur91IG114buRbiBzbyBzw6FuaCBz4buxIGtow6FjIGJp4buHdCBnaeG7r2EgMiBuaMOzbSDEkWnhu4F1IHRy4buLLCBkw7luZyBraeG7g20gxJHhu4tuaCBsb2ctcmFuayBi4bqxbmcgY8OhY2ggc28gc8OhbmggMiBow6BtIHjDoWMgc3XhuqV0IHTDrWNoIGzFqXkgY+G7p2EgMiBuaMOzbS4NCg0KwqDCoMKgTuG7mWkgZHVuZyBjaMOtbmggY+G7p2EgYsOgaSB0aeG7g3UgbHXhuq1uIG7DoHkgbMOgIHTDrG0gaGnhu4N1IHbhu4EgcGFja2FnZSBzdXJ2aXZhbCB2w6AgdGjhu7FjIGjDoG5oIHRyw6puIFIgduG7m2kgcGFja2FnZSBzdXJ2aXZhbCwgdsOsIHbhuq15IHBo4bqnbiBsw70gdGh1eeG6v3QgduG7gSBwaMOibiB0w61jaCBz4buRbmcgc8OzdCBz4bq9IGtow7RuZyDEkcaw4bujYyBnaeG6o2kgdGjDrWNoIHPDonUuDQoNCiMgMiBU4buUTkcgUVVBTiBW4buAIFBBQ0tBR0UgU1VSVklWQUwNCg0KIyMgMi4xIFRow7RuZyB0aW4gcGFja2FnZSBzdXJ2aXZhbA0KDQrCoMKgwqBQYWNrYWdlIGBzdXJ2aXZhbGAgY2jhu6lhIGPDoWMgcXV5IHRyw6xuaCBwaMOibiB0w61jaCBz4buxIHPhu5FuZyBzw7N0IGPhu5F0IGzDtWksIGJhbyBn4buTbSDEkeG7i25oIG5naMSpYSB24buBIGPDoWMgxJHhu5FpIHTGsOG7o25nICpTdXJ2KiwgxJHGsOG7nW5nIGNvbmcgKkthcGxhbi1NZWllciogdsOgICpBYWxlbi1Kb2hhbnNlbiogKMSRYSB0cuG6oW5nIHRow6FpKSwgbcO0IGjDrG5oICpDb3gqIHbDoCBtw7QgaMOsbmggdGjhu51pIGdpYW4gdGjhuqV0IGLhuqFpIHTEg25nIHThu5FjIHRoZW8gdGhhbSBz4buRLg0KDQoqKlBoacOqbiBi4bqjbiBt4bubaSBuaOG6pXQqKjogMy41LTUNCg0KKipQaGnDqm4gYuG6o24gUiBo4buXIHRy4bujKio6IFIoXD4zLjUuMCkNCg0KKipOaMOzbSB0w6FjIGdpw6EqKjogKlRlcnJ5IE0gVGhlcm5lYXUsIFRob21hcyBMdW1sZXksIEF0a2luc29uIEVsaXphYmV0aCwgQ3Jvd3NvbiBDeW50aGlhKg0KDQoqKk5nxrDhu51pIHBo4bulIHRyw6FjaCBjaMOtbmgqKjogKlRlcnJ5IE0gVGhlcm5lYXUqDQoNCioqVMOgaSBsaeG7h3UgaMaw4bubbmcgZOG6q24qKjogPGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9zdXJ2aXZhbC9zdXJ2aXZhbC5wZGY+DQoNCiMjIDIuMiBHaeG7m2kgdGhp4buHdSBwYWNrYWdlIHN1cnZpdmFsDQoNCsKgwqDCoCoqUGjDom4gdMOtY2ggc+G7kW5nIHPDs3QqKiDEkcaw4bujYyBz4butIGThu6VuZyBwaOG7lSBiaeG6v24gdHJvbmcgc2luaCBo4buNYywgeSBo4buNYywga+G7uSB0aHXhuq10LCB0aeG6v3AgdGjhu4ssIGtob2EgaOG7jWMgeMOjIGjhu5lpIGhv4bq3YyBraG9hIGjhu41jLg0KDQrCoMKgwqBDw7MgaGFpIHBoxrDGoW5nIHBow6FwIMSRw7NuZyBnw7NwIHF1YW4gdHLhu41uZyBjaG8gc+G7sSBwaMOhdCB0cmnhu4NuIGPhu6dhIGzEqW5oIHbhu7FjIG7DoHkuIMSQ4bqndSB0acOqbiBsw6AgcGjGsMahbmcgcGjDoXAgY+G7p2EgKioqS2FwbGFuIHbDoCBNZWllcioqKioqLCoqIG5nxrDhu51pIMSRw6MgZ2nhu5tpIHRoaeG7h3UgbeG7mXQgY8O0bmcgY+G7pSAiKirGr+G7m2MgdMOtbmggeMOhYyBzdeG6pXQgc+G7kW5nIHPDs3QqKiIuIFRo4bupIGhhaSBsw6AgdOG7qyAqKipDb3gqKiwqIG5nxrDhu51pIMSRw6MgZ2nhu5tpIHRoaeG7h3UgbeG7mXQgbcO0IGjDrG5oIMSRxrDhu6NjIGfhu41pIGzDoCAiKipNw7QgaMOsbmggcuG7p2kgcm8gdGhlbyB04bu3IGzhu4cgQ294KioiIChDUEhNKSwgbMOgIG3hu5l0IG3DtCBow6xuaCBo4buTaSBxdXkuIFRo4bqtdCDEkeG6t2MgYmnhu4d0IGtoaSBj4bqjIGhhaSBtw7QgaMOsbmggbsOgeSDEkeG7gXUgxJHGsOG7o2Mgc+G7rSBk4bulbmcgbmhp4buBdSBjaG8gxJHhur9uIG5heSB2w6AgbHXDtG4gbMOgIGzhu7FjIGNo4buNbiBj4bunYSBt4buNaSBuaMOgIGtob2EgaOG7jWMga2hpIHBow6JuIHTDrWNoIHbhu4EgKipk4buvIGxp4buHdSBz4buRbmcgc8OzdCAoc3Vydml2YWwgZGF0YSkqKi4NCg0KwqDCoMKgVHJvbmcgbmjhu69uZyBuxINtIHF1YSwgbmhp4buBdSBiw6FvIGPDoW8gxJHDoyDEkcaw4bujYyB2aeG6v3QgduG7gSBraOG6o28gc8OhdCAqcGjDom4gdMOtY2ggdOG7tyBs4buHIHPhu5FuZyBzw7N0Ki4gVHV5IG5oacOqbiwgZG8gc+G7sSBwaOG7qWMgdOG6oXAgY+G7p2EgY8OhYyBwaMawxqFuZyBwaMOhcCwgxJHhurdjIGJp4buHdCBsw6AgxJHhu5FpIHbhu5tpIGThu68gbGnhu4d1IMSRYSBiaeG6v24sIGPDoWMgY3Xhu5ljIHRo4bqjbyBsdeG6rW4gZOG7hSBk4bqrbiDEkeG6v24gbmjhuqdtIGzhuqtuLiBOZ2/DoGkgcmEsIOG7nyBj4bqlcCDEkeG7mSBnaeG7m2kgdGhp4buHdSBjw7Mgc+G6tW4gY8OhYyDEkcOhbmggZ2nDoSwgxJHDonkgaG/DoG4gdG/DoG4gbMOgIGzDvSB0aHV54bq/dCBob+G6t2Mgc+G7rSBk4bulbmcgY8OhYyBuZ8O0biBuZ+G7ryBs4bqtcCB0csOsbmggKG5oxrAgc3RhdGEgaG/hurdjIFNBUykgxJHGsOG7o2Mgc+G7rSBk4bulbmcgY2jhu6cgeeG6v3UgdHJvbmcgY8OhYyB0aOG7kW5nIGvDqiBzaW5oIGjhu41jLg0KDQrCoMKgwqBOZ8aw4bujYyBs4bqhaSwgxJHDoW5oIGdpw6EgY+G7p2EgbeG7mXQgc+G7kSBuZ8aw4budaSDEkcOjIGvhur90IGjhu6NwIHRyw6xuaCBiw6B5IGzDvSB0aHV54bq/dCB24bubaSB0aOG7sWMgdOG6vyBz4butIGThu6VuZyAqKm5nw7RuIG5n4buvIGzhuq1wIHRyw6xuaCB0aOG7kW5nIGvDqiBSKiouIFIgbMOgIG5nw7RuIG5n4buvIMSRxrDhu6NjIHPhu60gZOG7pW5nIHLhu5luZyByw6NpIGNobyBjw6FjIHbhuqVuIMSR4buBIGNodW5nIHRyb25nIGtob2EgaOG7jWMgZOG7ryBsaeG7h3UgdsOsIG7DsyBr4bq/dCBo4bujcCBjw6FjIHTDrW5oIG7Eg25nIHThu6sgY8OhYyBtw7QgaMOsbmggbOG6rXAgdHLDrG5oIGtow6FjIG5oYXUuIENow7puZyB0YSBoxrDhu5tuZyB04bubaSBt4buZdCBjw6FjaCB0csOsbmggYsOgeSB0b8OgbiBkaeG7h24gdsOgIMSR4bunIHLhu5luZyDEkeG7gyBiYW8gZ+G7k20gdOG6pXQgY+G6oyBjw6FjIGNo4bunIMSR4buBIGPhuqduIHRoaeG6v3QgY2hvIHBow6JuIHTDrWNoIHPhu5FuZyBzw7N0IMSRYSBiaeG6v24gbmjGsG5nIMSR4buTbmcgdGjhu51pIGPFqW5nIGThu4UgaGnhu4N1Lg0KDQrCoMKgwqDEkOG7gyB0aOG7sWMgaGnhu4duIHThuqV0IGPhuqMgxJFp4buBdSBuw6B5LCBj4bqnbiBi4buVIHN1bmcgY2hvIHZp4buHYyB0csOsbmggYsOgeSBjw6FjIHBoxrDGoW5nIHBow6FwIHbhu5tpIMSR4bqneSDEkeG7pyB0aMO0bmcgdGluIGPGoSBi4bqjbi4gR2nhuqNpIHRow61jaCBjaGkgdGnhur90IHZp4buHYyBraeG7g20gY2jhu6luZyB2w6AgeOG7rSBsw70gZOG7ryBsaeG7h3UgduG7gSBjw6FjIHPhu7Ega2nhu4duIHRo4budaSBnaWFuLCBi4bufaSB2w6wgduG7gSBjxqEgYuG6o24gdOG6pXQgY+G6oyBjw6FjIHBoxrDGoW5nIHBow6FwIMSR4buBdSBz4butIGThu6VuZyBraeG7g20gY2jhu6luZyDEkeG7gyByw7p0IHJhIGPDoWMgxrDhu5tjIHTDrW5oIGhp4buHdSBxdeG6oy4gQ3Xhu5FpIGPDuW5nLCBjaMO6bmcgdGEgdGjDqm0gbeG7mXQgdsOtIGThu6UgxJHDoyBob+G6oXQgxJHhu5luZyBjaG8gdGjhuqV5IGPDoWNoICp0aOG7sWMgaGnhu4duIHBow6JuIHTDrWNoIGto4bqjIG7Eg25nIHPhu5FuZyBzw7N0IHRo4buxYyB04bq/IHbhu5tpIFIqLg0KDQrCoMKgwqBUcm9uZyBwaOG6p24gdGnhur9wIHRoZW8sIGNow7puZyB0YSBjdW5nIGPhuqVwIG3hu5l0IGThu68gbGnhu4d1IMSR4buDIHBow6JuIHTDrWNoIHPhu7Egc+G7kW5nIHPDs3QgdsOgIMO9IG5naMSpYSBj4bunYSB2aeG7h2MgcGjDom4gdMOtY2ggY2jDum5nLiBUaeG6v3AgdGhlbywgY2jDum5nIHRhIG3DtCB04bqjIGPDoWMgxJHhurdjIMSRaeG7g20gY2h1bmcgY+G7p2EgY8OhYyAqaMOgbSBzaW5oIHThu5NuLCDGsOG7m2MgbMaw4bujbmcgY2hvIGPDoWMgaMOgbSBzaW5oIHThu5NuIHbDoCBzbyBzw6FuaCBoYWkgxJHGsOG7nW5nIGNvbmcgc2luaCB04buTbiouIFNhdSDEkcOzLCBjaMO6bmcgdGEgZ2nhu5tpIHRoaeG7h3UgKk3DtCBow6xuaCBuZ3V5IGPGoSB0aGVvIHThu7cgbOG7hyBDb3gqLiBO4bq/dSBnaeG6oyDEkeG7i25oIHLhu6dpIHJvIHRoZW8gdOG7tyBs4buHIGtow7RuZyDEkcO6bmcsIG5nxrDhu51pIHRhIGPhuqduIHPhu60gZOG7pW5nIG3DtCBow6xuaCBDb3ggcGjDom4gdOG6p25nLiBDdeG7kWkgY8O5bmcsIGNow7puZyB0YSB0csOsbmggYsOgeSBt4buZdCBwaOG6p24gduG7gSBwaMOibiB0w61jaCB04bu3IGzhu4cgc+G7kW5nIHRo4buxYyB04bq/IGLhurFuZyBSLiBCw6BpIGLDoW8ga+G6v3QgdGjDumMgduG7m2kgcGjhuqduIHTDs20gdOG6r3Qgbmfhuq9uIGfhu41uIHbDoCBr4bq/dCBsdeG6rW4uDQoNCiMjIDIuMyBDw6FjIGjDoG0gY8ahIGLhuqNuIHRyb25nIFINCg0KwqDCoMKgRMaw4bubaSDEkcOieSBsw6AgKm3hu5l0IHPhu5EgaMOgbSBjxqEgYuG6o24qIHRyb25nIHBhY2thZ2UgYHN1cnZpdmFsYDoNCg0KLSAgIGBTdXJ2KHRpbWUsIGV2ZW50KWA6IMSQxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHThuqFvIHJhIMSR4buRaSB0xrDhu6NuZyBgU3VydmAgdHJvbmcgUi4gxJDhu5FpIHTGsOG7o25nIG7DoHkgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxJHhu4tuaCBuZ2jEqWEgdsOgIGzGsHUgdHLhu68gZOG7ryBsaeG7h3Ugc+G7kW5nIHPDs3QgdsOgIHRo4budaSBnaWFuIHRoZW8gZMO1aSB0xrDGoW5nIOG7qW5nLg0KDQotICAgYFN1cnZmaXQoZm9ybXVsYSwgZGF0YSlgOiDEkMaw4bujYyBz4butIGThu6VuZyDEkeG7gyB0w61uaCB0b8OhbiB04bu3IGzhu4cgc+G7kW5nIHPDs3QgaG/hurdjIHBow6JuIHTDrWNoIHRo4budaSBnaWFuIMSR4bq/biBz4buxIGtp4buHbiBjaG8gY8OhYyBuaMOzbSBk4buvIGxp4buHdSBraMOhYyBuaGF1Lg0KDQotICAgYENveHBoKFN1cnYgKHRpbWUsIGV2ZW50KSB+IEksIGRhdGEpYCA6IE3DtCBow6xuaCBjb3ggdGnDqnUgY2h14bqpbiwgbcO0IGjDrG5oIENveCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB4w6FjIMSR4buLbmggeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gdGjhu51pIGdpYW4gc+G7kW5nIHPDs3QgaG/hurdjIHRo4budaSBnaWFuIMSR4bq/biBz4buxIGtp4buHbi4NCg0KLSAgIGBTdXJ2cmVnKGZvcm11bGEsIGRhdGEpYDogSMOgbSBuw6B5IMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHBow6JuIHTDrWNoIGPDoWMgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gdGjhu51pIGdpYW4gc+G7kW5nIHPDs3QgaG/hurdjIHRo4budaSBnaWFuIMSR4bq/biBz4buxIGtp4buHbiB0cm9uZyBtw7QgaMOsbmggaOG7k2kgcXV5Lg0KDQotICAgYFN1cnZleHAoKWA6IEjDoG0gbsOgeSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB0w61uaCB0b8OhbiB04bu3IGzhu4cgc+G7kW5nIHPDs3QgaG/hurdjIHBow6JuIHTDrWNoIHRo4budaSBnaWFuIMSR4bq/biBz4buxIGtp4buHbiBjaG8gY8OhYyBuaMOzbSBk4buvIGxp4buHdSBraMOhYyBuaGF1IHRyb25nIG3DtCBow6xuaCBwaMOibiBwaOG7kWkgbcWpLg0KDQojIDMgTMOdIFRIVVnhur5UIFBIw4JOIFTDjUNIIFPhu5BORyBTw5NUIC0gU1VSVklWQUwgQU5BTFlTSVMNCg0KIyMgMy4xIFBow6JuIHTDrWNoIHPhu5FuZyBzw7N0IGzDoCBnw6w/DQoNCsKgwqDCoCoqUGjDom4gdMOtY2ggc+G7kW5nIHPDs3QgKHN1cnZpdmFsIGFuYWx5c2lzKSoqIGzDoCAqbeG7mXQgcGjGsMahbmcgcGjDoXAgdGjhu5FuZyBrw6oqIMSR4buDIMSRw6FuaCBnacOhIHbDoCAqZOG7sSDEkW/DoW4ga2jhuqMgbsSDbmcgc+G7kW5nIHPDs3QgaG/hurdjIHRo4budaSBnaWFuIMSR4bq/biBz4buxIGtp4buHbiogdHJvbmcgbeG7mXQgdOG6rXAgZOG7ryBsaeG7h3UuDQoNCsKgwqDCoCoqUGjDom4gdMOtY2ggc+G7kW5nIHPDs3QqKiDEkcaw4bujYyBz4butIGThu6VuZyBy4buZbmcgcsOjaSB0cm9uZyBuaGnhu4F1IGzEqW5oIHbhu7FjLCBiYW8gZ+G7k20geSBo4buNYywgeSB04bq/IGPDtG5nIGPhu5luZywga2luaCB04bq/IGjhu41jLCBraG9hIGjhu41jIHjDoyBo4buZaSwga2hvYSBo4buNYyBtw7RpIHRyxrDhu51uZywga2hvYSBo4buNYyBk4buvIGxp4buHdSB2w6AgbmdoacOqbiBj4bupdSB0aOG7iyB0csaw4budbmcuIE7DsyBjdW5nIGPhuqVwIG3hu5l0IGPDoWNoIHRp4bq/cCBj4bqtbiB0aOG7kW5nIGvDqiDEkeG7gyDEkcOhbmggZ2nDoSBraOG6oyBuxINuZyBz4buRbmcgc8OzdCBob+G6t2MgdGjhu51pIGdpYW4gxJHhur9uIHPhu7Ega2nhu4duIHRyb25nIG3hu5l0IHThuq1wIGThu68gbGnhu4d1LCB2w6AgxJHGsGEgcmEgY8OhYyBk4buxIMSRb8OhbiB24buBIGto4bqjIG7Eg25nIHPhu5FuZyBzw7N0IGhv4bq3YyB0aOG7nWkgZ2lhbiBz4buRbmcgY+G7p2EgbeG7mXQgbmjDs20gYuG7h25oIG5ow6JuIGhv4bq3YyBjw6EgbmjDom4gdHJvbmcgdMawxqFuZyBsYWkuDQoNCsKgwqDCoFbhuq15LCAqKnBow6JuIHTDrWNoIHPhu5FuZyBzw7N0IChTdXJ2aXZhbCBBbmFseXNpcykqKiBsacOqbiBxdWFuIMSR4bq/biAqYmnhur9uIHRo4budaSBnaWFuKi4gQmnhur9uIG7DoHkgZ2hpIG5o4bqtbiB0aOG7nWkgZ2lhbiB04burIGzDumMgYuG6r3QgxJHhuqd1IHRoZW8gZMO1aSBjaG8gxJHhur9uIGtoaSB44bqjeSByYSBz4buxIGtp4buHbiAoKnRpbWUtdG8tZmFpbHVyZS8gdGltZS10by1ldmVudCopLg0KDQrCoMKgwqAqKkPDoWMgdGh14bqtdCBuZ+G7ryBjxqEgYuG6o24qKiBj4bunYSBwaMOibiB0w61jaCBz4buRbmcgc8OzdCBiYW8gZ+G7k206DQoNCirigKIgROG7ryBsaeG7h3UgdGjhu51pIGdpYW4gdsOgIGJp4bq/biBj4buRICh0aW1lLXRvLWV2ZW50KSoNCg0KKuKAoiBOaMOzbSBraeG7g20gY2jhu6luZyAoY2Vuc29yaW5nKSoNCg0KKuKAoiBIw6BtIHNpbmggdOG7k24gdsOgIGjDoG0gbmd1eSBjxqEqDQoNCioqROG7ryBsaeG7h3UgdGjhu51pIGdpYW4gdsOgIGJp4bq/biBj4buRKioNCg0KwqDCoMKgVHJvbmcgbmdoacOqbiBj4bupdSB5IGjhu41jLCBy4bqldCBoYXkgZ+G6t3Agbmjhu69uZyB0csaw4budbmcgaOG7o3AgeOG6o3kgcmEgKnPhu7Ega2nhu4duIGxpw6puIHF1YW4gxJHhur9uIHRo4budaSBnaWFuKi4gVsOtIGThu6U6ICp0aOG7nWkgZ2lhbiBjaOG6v3QsIHRo4budaSBnaWFuIGto4buPaSBi4buHbmggc2F1IGtoaSDEkWnhu4F1IHRy4buLLCB0aOG7nWkgZ2lhbiB0w6FpIHBow6F0IHYudi4uLiogVOG6pXQgY+G6oyBjw6FjIHPhu5EgbGnhu4d1IGxpw6puIHF1YW4gxJHhur9uIG5o4buvbmcgYmnhur9uIHPhu5EgbmjGsCB24bqteSBn4buNaSBsw6AgKnPhu5EgbGnhu4d1IHPhu5FuZyBzw7N0ICgqKipzdXJ2aXZhbCBkYXRhKioqKSosIG3hurdjIGTDuSB0aHXhuq10IG5n4buvIG7DoHkgY8OzIHbhursgbcO0IHThuqMga2jDtG5nIGNow61uaCB4w6FjIGLhuqNuIGNo4bqldCBj4bunYSBz4buRIGxp4buHdS4NCg0KwqDCoMKgVsOtIGThu6UgduG7gSBjw6FjICpk4buvIGxp4buHdSB0aOG7nWkgZ2lhbiAtc+G7sSBraeG7h24gKHRpbWUtdG8tZXZlbnQpKg0KDQrigKIgYEJ1bGRgOiBUaOG7nWkgZ2lhbiBz4buRbmcgc8OzdCBj4bunYSBiw7NuZyDEkcOobiAodOG7qyBsw7pjIHPhuqNuIHh14bqldCDEkeG6v24ga2hpIGLhu4sgaOG7j25nKQ0KDQrigKIgYERlYXRgOiBU4butIHZvbmcgKCB0aOG7nWkgZ2lhbiB04burIGzDumMgYuG7h25oIG5ow6JuIMSRxrDhu6NjIGNodeG6qW4gxJFvw6FuIG3hu5l0IGxv4bqhaSBi4buHbmggbsOgbyDEkcOzIMSR4bq/biBraGkgaOG7jSB04butIHZvbmcpIE5o4buvbmcgduG6pW4gxJHhu4EgZ+G6t3AgcGjhuqNpIGtoaSBz4butIGThu6VuZyBTQQ0KDQrigKIgYERhdGEgY2Vuc29yaW5nIGFuZCB0cnVuY2F0aW9uYDogU+G7kSBsaeG7h3UgYuG7iyBj4bqvdCB4w6luLg0KDQrigKIgYENvbmRpdGlvbmFsIHByb2JhYmlsaXR5YDogWMOhYyBzdeG6pXQgY8OzIMSRaeG7gXUga2nhu4duLg0KDQrCoMKgwqAqKk5ow7NtIGtp4buDbSBjaOG7qW5nKioNCg0KwqDCoMKgxJDhu4MgKnRo4buxYyBoaeG7h24gcGjDom4gdMOtY2ggc+G7kW5nIHPDs3QqLCBuZ8aw4budaSB0YSBj4bqnbiBnaGkgbOG6oWkgdGjhu51pIGdpYW4gZGnhu4VuIHJhIHPhu7Ega2nhu4duICoq8J2RoWkqKiBjaG8gY8OhYyDEkeG7kWkgdMaw4bujbmcgKirwnZGW4oiIezEsLi4uLPCdkYF9KiogY+G7p2EgbeG7mXQgbmjDs20uIFR1eSBuaGnDqm4sIMSRaeG7gXUgbsOgeSBraMO0bmcgcGjhuqNpIGzDumMgbsOgbyBjxaluZyBraOG6oyB0aGkgdsOgIGNow7puZyB0YSBjaOG7iSBjw7MgbeG7mXQgcGjhuqduIHRow7RuZyB0aW4gduG7gSB0aOG7nWkgZ2lhbiBkaeG7hW4gcmEgc+G7sSBraeG7h24uIFRyb25nIHRyxrDhu51uZyBo4bujcCBuaMawIHbhuq15LCBuZ8aw4budaSB0YSBuw7NpIHbhu4EgKipraeG7g20gY2jhu6luZy4qKiBD4bulIHRo4buDLCBt4buZdCBi4buHbmggbmjDom4gY8OzIHRo4budaSBnaWFuIHPhu5FuZyBzw7N0IMSRxrDhu6NjIGtp4buDbSBjaOG7qW5nIG7hur91IHPhu7Ega2nhu4duIGNoxrBhIHjhuqN5IHJhIMSR4buRaSB24bubaSBi4buHbmggbmjDom4gbsOgeS4gxJBp4buBdSBuw6B5IGPDsyB0aOG7gyB44bqjeSByYSBraGk6DQoNCuKAoiBC4buHbmggbmjDom4gYuG7jyBuZ2hpw6puIGPhu6l1LCB2w60gZOG7pTogbmfhu6tuZyDEkeG6v24gcGjDsm5nIGtow6FtIMSR4buDIHTDoWkga2jDoW0uDQoNCuKAoiBOZ2hpw6puIGPhu6l1IGPDoWMgbeG7kWMgdGjhu51pIGdpYW4gY+G7kSDEkeG7i25oIHbDoCBz4buxIGtp4buHbiB44bqjeSByYSBzYXUgdGjhu51pIGjhuqFuLg0KDQrCoMKgwqBOaOG7r25nIHbDrSBk4bulIHRyw6puIMSRxrDhu6NjIGfhu41pIGzDoCBgcmlnaHQtY2Vuc29yaW5nYCAuVHJvbmcgaMOsbmggYsOqbiBkxrDhu5tpLCBjaMO6bmcgdGEgaMOsbmggZHVuZyDDvSBuZ2jEqWEgY+G7p2Egdmnhu4djIGtp4buDbSBjaOG7qW5nOg0KDQohW10oaGluaHRsLzIucG5nKQ0KDQrCoMKgwqBC4bqjbiB0w7NtIHThuq90IHbhu4EgKipjw6FjIGxv4bqhaSBraeG7g20gY2jhu6luZyoqOg0KDQrigKIgKipLaeG7g20gY2jhu6luZyBsb+G6oWkgSToqKiBU4bqldCBj4bqjIGPDoWMgxJHhu5FpIHTGsOG7o25nIGLhuq90IMSR4bqndSB2w6Aga+G6v3QgdGjDumMgbmdoacOqbiBj4bupdSBjw7luZyBt4buZdCBsw7pjICh0aOG7nWkgbMaw4bujbmcgbmdoacOqbiBj4bupdSBj4buRIMSR4buLbmgpLiBWw60gZOG7pSBsw6AgY8OhYyB0aMOtIG5naGnhu4dtIHRyb25nIHBow7JuZyB0aMOtIG5naGnhu4dtLg0KDQrigKIgKipLaeG7g20gY2jhu6luZyBsb+G6oWkgSUk6KiogVOG6pXQgY+G6oyBjw6FjIMSR4buRaSB0xrDhu6NuZyBi4bqvdCDEkeG6p3UgbmdoacOqbiBj4bupdSBjw7luZyBt4buZdCBsw7pjIG5oxrBuZyBuZ2hpw6puIGPhu6l1IGvhur90IHRow7pjIHRow6wgbeG7mXQgc+G7kSBsxrDhu6NuZyDEkeG7kWkgdMaw4bujbmcgY+G7kSDEkeG7i25oIMSRxrDhu6NjIHjDoWMgxJHhu4tuaCB0csaw4bubYyDEkcOjIHRy4bqjaSBxdWEgc+G7sSBraeG7h24gKHRo4budaSBsxrDhu6NuZyBuZ2hpw6puIGPhu6l1IGxpbmggaG/huqF0KS4gVsOtIGThu6UgbMOgIGPDoWMgdGjDrSBuZ2hp4buHbSB0cm9uZyBwaMOybmcgdGjDrSBuZ2hp4buHbS4NCg0K4oCiICoqS2nhu4NtIGNo4bupbmcgbG/huqFpIElJSToqKiBDw6FjIMSR4buRaSB0xrDhu6NuZyB0aGFtIGdpYSBuZ2hpw6puIGPhu6l1IHbDoG8gY8OhYyB0aOG7nWkgxJFp4buDbSBraMOhYyBuaGF1LCBuaMawbmcgdGjhu51pIGzGsOG7o25nIGPhu6dhIG5naGnDqm4gY+G7qXUgbMOgIGPhu5EgxJHhu4tuaC4gVsOtIGThu6UgbMOgIGPDoWMgdGjhu60gbmdoaeG7h20gbMOibSBzw6BuZy4NCg0KIyMgMy4yIEPDoWMgaMOgbSDEkcaw4bujYyBz4butIGThu6VuZyB0cm9uZyBwaMOibiB0w61jaCBz4buRbmcgc8OzdA0KDQrCoMKgwqAqKkjDoG0gc2luaCB04buTbioqDQoNCsKgwqDCoMSQxrDhu51uZyBjb25nIHThu7cgbOG7hyBz4buRbmcgc8OzdCAqKvCdkYYo8J2RoSkqKiBiaeG7g3UgdGjhu4sgdOG7tyBs4buHIHPhu5FuZyBzw7N0IGzDoCBt4buZdCBow6BtIGPhu6dhIHRo4budaSBnaWFuICoqKHQpKio6DQoNCioq8J2RhijwnZGhKT3wnZGD8J2RnyjwnZGHXD7wnZGhKSoqDQoNCsKgwqDCoEdpw6EgdHLhu4sgY+G7p2EgaMOgbSAqKlModCkqKiBsw6AgdOG7tyBs4buHIHPhu5FuZyBzw7N0IGPhu6dhIG3hu5l0IG5ow7NtIHbDoG8gdGjhu51pIMSRaeG7g20gKioodCkqKiBzbyB24bubaSB0aOG7nWkgxJFp4buDbSBi4bqvdCDEkeG6p3UgcXVhbiBzw6F0Lg0KDQrCoMKgwqBIw6BtIHNpbmggdOG7k24gY8OzIGPDoWMgdGh14buZYyB0w61uaCBzYXU6DQoNCi0gICBLaG/huqNuZyB4w6FjIMSR4buLbmggY+G7p2EgdGjhu51pIGdpYW4gbMOgICoq8J2RoSDiiIggWyAwICwg4oieICkqKiAuDQoNCi0gICAqKvCdkYYo8J2RoSkqKiBsdcO0biBnaeG6o20sIG5naMSpYSBsw6AgYPCdkYYo8J2RoTEp4oml8J2RhijwnZGhMilgIHbhu5tpICoq8J2RoTHiiaTwnZGhMioqDQoNCi0gICBU4bqhaSB0aOG7nWkgxJFp4buDbSDwnZGhPTAsIGDwnZGGKPCdkaE9MCk9MWAsIHThu6ljIGzDoCB4w6FjIHN14bqldCBz4buRbmcgc8OzdCBxdWEgdGjhu51pIMSRaeG7g20gMCBsw6AgMS4NCg0KwqDCoMKgKipDw7RuZyBj4bulIMaw4bubYyB0w61uaCBjaG8gaMOgbSBzaW5oIHThu5NuKioNCg0KLSAgICoqS2FwbGFuLS1NZWllcioqDQoNCsKgwqDCoEPDtG5nIHRo4bupYyDGsOG7m2MgbMaw4bujbmcgKkthcGxhbi0tTWVpZXIqICooS00pKiBj4bunYSBow6BtIHNpbmggdOG7k24g8J2RhvCdkL7wnZGAKPCdkaEpIMSRxrDhu6NjIHjDoWMgxJHhu4tuaCBi4bufaQ0KDQohW10oaGluaHRsLzMuMi4xLjcucG5nKQ0KDQrCoMKgwqDGr+G7m2MgbMaw4bujbmcgbsOgeSDEkcO6bmcgduG7m2kgbeG7jWkgKirwnZGhXD4wKiogdsOgIG7DsyBjaOG7iSBwaOG7pSB0aHXhu5ljIHbDoG8gaGFpIGJp4bq/biwgKirwnZGb8J2RlioqIHbDoCAqKvCdkZHwnZGWKiogbMOgOg0KDQotICAgYPCdkZvwnZGWYCA6IHPhu5EgcuG7p2kgcm8gdOG6oWkgdGjhu51pIMSRaeG7g20gKirwnZGh8J2RlioqLA0KDQotICAgYPCdkZHwnZGWYDogc+G7kSBz4buxIGtp4buHbiB04bqhaSB0aOG7nWkgxJFp4buDbSAqKvCdkaHwnZGWKioNCg0KwqDCoMKgKipIw6BtIG5ndXkgY8ahKioNCg0KwqDCoMKgSMOgbSBuZ3V5IGPGoSAoaGF6YXJkIGZ1bmN0aW9uKSBsw6AgbeG7mXQga2jDoWkgbmnhu4dtIHF1YW4gdHLhu41uZyB0cm9uZyBwaMOibiB0w61jaCBz4buRbmcgc8OzdCAoc3Vydml2YWwgYW5hbHlzaXMpLCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBtw7QgdOG6oyB04buRYyDEkeG7mSB44bqjeSByYSBz4buxIGtp4buHbiB0cm9uZyBt4buZdCBuaMOzbSBkw6JuIHPhu5EgdGhlbyB0aOG7nWkgZ2lhbi4NCg0KwqDCoMKgQ8O0bmcgdGjhu6ljIGPhu6dhIGjDoG0gbmd1eSBjxqEgdGjGsOG7nW5nIMSRxrDhu6NjIGJp4buDdSBkaeG7hW4gZMaw4bubaSBk4bqhbmc6DQoNCmgodCkgPSBsaW0gzpR0IOKGkiAwIFtQKHQg4omkIFQgXDwgdCArIM6UdCBcfCBUIOKJpSB0KSAvIM6UdF0NCg0KwqDCoMKgVHJvbmcgxJHDszoNCg0KLSAgIHQgbMOgIHRo4budaSBnaWFuIHF1YW4gc8OhdCwgVCBsw6AgdGjhu51pIGdpYW4geOG6o3kgcmEgc+G7sSBraeG7h24sIM6UdCBsw6AgbeG7mXQga2hv4bqjbmcgdGjhu51pIGdpYW4gcuG6pXQgbmjhu48sIHRp4bq/biB04bubaSAwLg0KDQotICAgUCh0IOKJpCBUIFw8IHQgKyDOlHQgXHwgVCDiiaUgdCkgbMOgIHjDoWMgc3XhuqV0IHjhuqN5IHJhIHPhu7Ega2nhu4duIHRyb25nIGtob+G6o25nIHRo4budaSBnaWFuIHThu6sgdCDEkeG6v24gdCArIM6UdCwgYmnhur90IHLhurFuZyBz4buxIGtp4buHbiDEkcOjIGtow7RuZyB44bqjeSByYSB0csaw4bubYyB0aOG7nWkgxJFp4buDbSB0DQoNCsKgwqDCoEdpw6EgdHLhu4sgY+G7p2EgaMOgbSBoKHQpIGzDoCB04buRYyDEkeG7mSB44bqjeSByYSBz4buxIGtp4buHbiAoZXZlbnQgcmF0ZSkgdOG6oWkgdGjhu51pIMSRaeG7g20gdC4gVsOtIGThu6UsIG7hur91IGgoMTApID0gMC4wNSBuZ2jEqWEgbMOgIHThuqFpIHRo4budaSDEkWnhu4NtIDEwIMSRxqFuIHbhu4sgdGjhu51pIGdpYW4gc2F1IGtoaSBi4bqvdCDEkeG6p3UgcXVhbiBzw6F0LCB04buRYyDEkeG7mSB44bqjeSByYSBz4buxIGtp4buHbiBsw6AgMC4wNSBz4buxIGtp4buHbiB0csOqbiBt4buZdCDEkcahbiB24buLIHRo4budaSBnaWFuLg0KDQrCoMKgwqBDw7Mgbmhp4buBdSBwaMawxqFuZyBwaMOhcCDEkeG7gyDGsOG7m2MgdMOtbmggaMOgbSBuZ3V5IGPGoSwgbmjGsG5nIHBoxrDGoW5nIHBow6FwIHBo4buVIGJp4bq/biBuaOG6pXQgbMOgICoqbcO0IGjDrG5oIENveCoqICoqUHJvcG9ydGlvbmFsIEhhemFyZHMqKiAoKm3DtCBow6xuaCB04bu3IGzhu4cgbmd1eSBjxqEgxJHhu5NuZyBuaOG6pXQqKQ0KDQotICAgKipNw7QgaMOsbmggQ294IFByb3BvcnRpb25hbCBIYXphcmRzOioqDQoNCsKgwqDCoMSQw6J5IGzDoCBt4buZdCBwaMawxqFuZyBwaMOhcCDEkeG7gyAqdMOtbmggdG/DoW4gaMOgbSBuZ3V5IGPGoS4qICoqTcO0IGjDrG5oIENveCBQcm9wb3J0aW9uYWwgSGF6YXJkcyoqIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIMSRw6FuaCBnacOhIHTDoWMgxJHhu5luZyBj4bunYSBjw6FjIHnhur91IHThu5EgxJHhur9uIHjDoWMgc3XhuqV0IHPhu5FuZyBzw7N0IGPhu6dhIG3hu5l0IMSR4buRaSB0xrDhu6NuZyBob+G6t2MgbeG7mXQgbmjDs20gxJHhu5FpIHTGsOG7o25nLiDEkOG7gyAqdMOtbmggdG/DoW4gaMOgbSBuZ3V5IGPGoSBi4bqxbmcgbcO0IGjDrG5oIENveCBQcm9wb3J0aW9uYWwgSGF6YXJkcyosIHRyxrDhu5tjIHRpw6puIHRhIHBo4bqjaSB4w6FjIMSR4buLbmggY8OhYyB54bq/dSB04buRIOG6o25oIGjGsOG7n25nIMSR4bq/biB4w6FjIHN14bqldCBz4buRbmcgc8OzdCB2w6AgdGh1IHRo4bqtcCBjw6FjIGThu68gbGnhu4d1IGxpw6puIHF1YW4gxJHhur9uIGPDoWMgeeG6v3UgdOG7kSDEkcOzLiBTYXUgxJHDsywgdGEgc+G7rSBk4bulbmcgY8OhYyBwaMawxqFuZyBwaMOhcCDGsOG7m2MgdMOtbmggaOG7o3AgbMO9IMSR4buDIHTDrW5oIHRvw6FuIGPDoWMgdGhhbSBz4buRIGPhu6dhICoqbcO0IGjDrG5oKiogKipDb3ggUHJvcG9ydGlvbmFsIEhhemFyZHMqKi4NCg0KIyA0IFRI4buwQyBIw4BOSCBW4buaSSBQQUNLQUdFIFNVUlZJVkFMIC0gUEjDgk4gVMONQ0ggU+G7kE5HIFPDk1QNCg0KIyMgNC4xIEPDoGkgxJHhurd0IHbDoCBz4butIGThu6VuZyBwYWNrYWdlIHN1cnZpdmFsDQoNCsKgwqDCoMSQ4buDIHPhu60gZOG7pW5nIHBhY2thZ2UgYHN1cnZpdmFsYCB0csOqbiAqKlJTdHVkaW8qKiwgdGEgdGjhu7FjIGhp4buHbiBjw6FjIGLGsOG7m2Mgc2F1Og0KDQoqKkLGsOG7m2MgMSoqOiBDw6BpIMSR4bq3dCBwYWNrYWdlIGBzdXJ2aXZhbGANCg0KwqDCoMKgQuG6oW4gY8OzIHRo4buDIGPDoGkgxJHhurd0IHBhY2thZ2UgYHN1cnZpdmFsYCBi4bqxbmcgY8OhY2ggY2jhuqF5IGzhu4duaCBzYXUgdHJvbmcgUlN0dWRpbzoNCg0KYGBgICAgICAgICAgDQppbnN0YWxsLnBhY2thZ2VzKCJzdXJ2aXZhbCIpDQpgYGANCg0KwqDCoMKgTuG6v3UgcGFja2FnZSDEkcOjIMSRxrDhu6NjIGPDoGkgxJHhurd0IHRyxrDhu5tjIMSRw7MsIGLhuqFuIGPDsyB0aOG7gyBi4buPIHF1YSBixrDhu5tjIG7DoHkuDQoNCioqQsaw4bubYyAyKio6IFThuqNpIHBhY2thZ2UgYHN1cnZpdmFsYA0KDQrCoMKgwqBTYXUga2hpIGPDoGkgxJHhurd0LCBi4bqhbiBj4bqnbiBn4buNaSBwYWNrYWdlIGBzdXJ2aXZhbGAgYuG6sW5nIGzhu4duaCBzYXU6DQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCiMgR+G7jWkgcGFja2FnZSBzdXJ2aXZhbCB04burIHRoxrAgdmnhu4duDQpsaWJyYXJ5KHN1cnZpdmFsKQ0KYGBgDQoNCioqQsaw4bubYyAzKio6IFPhu60gZOG7pW5nIGPDoWMgaMOgbSBj4bunYSBwYWNrYWdlIGBzdXJ2aXZhbGANCg0KwqDCoMKgU2F1IGtoaSDEkcOjIHThuqNpIHBhY2thZ2UgYHN1cnZpdmFsYCwgYuG6oW4gY8OzIHRo4buDIHPhu60gZOG7pW5nIGPDoWMgaMOgbSBj4bunYSBwYWNrYWdlIG7DoHkgxJHhu4MgcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgdGjhu51pIGdpYW4gxJHhur9uIHPhu7Ega2nhu4duLiBDw6FjIGjDoG0gbsOgeSBiYW8gZ+G7k206DQoNCi0gICBgc3VydmZpdCgpYDogVMOtbmggdG/DoW4gY8OhYyDGsOG7m2MgbMaw4bujbmcgc+G7kW5nIHPDs3QgYuG6sW5nICoqcGjGsMahbmcgcGjDoXAgS2FwbGFuLU1laWVyKiogaG/hurdjICoqcGjGsMahbmcgcGjDoXAgTmVsc29uLUFhbGVuKiouDQoNCi0gICBgY294cGgoKWA6IFBow6JuIHTDrWNoICoqbcO0IGjDrG5oIGjhu5NpIHF1eSBDb3gqKiDEkeG7gyB0w6xtIGPDoWMgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gdGjhu51pIGdpYW4gxJHhur9uIHPhu7Ega2nhu4duLg0KDQotICAgYHN1cnZyZWcoKWA6IFBow6JuIHTDrWNoICoqbcO0IGjDrG5oIGjhu5NpIHF1eSBDb3gqKiDEkeG7gyB0w6xtIGPDoWMgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gdGhhbmcgxJFvIHRo4budaSBnaWFuIMSR4bq/biBz4buxIGtp4buHbiBraMO0bmcgcGjhuqNpIGzDoCBk4bqhbmcgc+G7kSBuZ3V5w6puICh2w60gZOG7pTogdGjhu51pIGdpYW4gc+G7kW5nIHPDs3QgxJHGsOG7o2MgxJFvIGLhurFuZyBnaeG7nSwgbmfDoHksIHRow6FuZywuLi4pLg0KDQotICAgYGNveC56cGgoKWA6IEtp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90IHbhu4Egc+G7sSDEkeG7k25nIG5o4bqldCBj4bunYSBjw6FjICoqaOG7hyBz4buRIGjhu5NpIHF1eSBDb3gqKiB0aGVvIHRo4budaSBnaWFuLg0KDQojIyA0LjIgRGF0YXNldCBsdW5nIC0gZOG7ryBsaeG7h3UgduG7gSB1bmcgdGjGsCBwaOG7lWkNCg0KwqDCoMKgVHJvbmcgc3Xhu5F0IHBo4bqnbiBuw6B5LCBjaMO6bmcgdMO0aSBz4bq9IHPhu60gZOG7pW5nIGRhdGFzZXQgKipsdW5nKiogdOG7qyBwYWNrYWdlIGBzdXJ2aXZhbGAgbMOgbSBk4buvIGxp4buHdSBwaMOibiB0w61jaC4NCg0KwqDCoMKgRGF0YXNldCAqKmx1bmcqKiBsw6AgbeG7mXQgdHJvbmcgbmjhu69uZyB04bqtcCBk4buvIGxp4buHdSB0acOqdSBiaeG7g3UgY+G7p2EgcGFja2FnZSBgc3Vydml2YWxgIMSRxrDhu6NjIHPhu60gZOG7pW5nIHRyb25nIG5oaeG7gXUgdsOtIGThu6UgdsOgIGjGsOG7m25nIGThuqtuIHbhu4EgcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UuIERhdGFzZXQgbsOgeSDEkcaw4bujYyB04bqhbyByYSB04burICpuZ2hpw6puIGPhu6l1IGzDom0gc8OgbmcgduG7gSB1bmcgdGjGsCBwaOG7lWkqIHbDoCBiYW8gZ+G7k20gdGjDtG5nIHRpbiB24buBICoqMjI4IGLhu4duaCBuaMOibiB1bmcgdGjGsCBwaOG7lWkqKiB24bubaSBjw6FjIGJp4bq/biBuaMawIHR14buVaSwgZ2nhu5tpIHTDrW5oLCBt4bupYyDEkeG7mSBzdXkgZ2nhuqNtIGNo4bupYyBuxINuZyBwaOG7lWksLi4uDQoNCsKgwqDCoERhdGFzZXQgKipsdW5nKiogxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgbWluaCBo4buNYSBjaG8gbmhp4buBdSBraMOtYSBj4bqhbmgga2jDoWMgbmhhdSBj4bunYSBwaMOibiB0w61jaCBk4buvIGxp4buHdSwgYmFvIGfhu5NtIG3DtCBow6xuaCAqaOG7k2kgcXV5IHR1eeG6v24gdMOtbmgsIG3DtCBow6xuaCBo4buTaSBxdXkgbG9naXN0aWMsIHBow6JuIHTDrWNoIHBow6JuIG5ow7NtKiB2w6AgxJHhurdjIGJp4buHdCBsw6AgKioqcGjDom4gdMOtY2ggc+G7kW5nIHPDs3QqKi4qDQoNCsKgwqDCoMSQ4buDIHRydXkgY+G6rXAgZGF0YXNldCBsdW5nIHThu6sgcGFja2FnZSBgc3Vydml2YWxgIHRyb25nIFIsIHRhIHPhu60gZOG7pW5nIGzhu4duaCBzYXU6DQoNCmBgYHtyfQ0KIyBH4buNaSBkYXRhc2V0IHbhu4EgZOG7ryBsaeG7h3UgYuG7h25oIG5ow6JuIGPhu6dhIGPDoWNoIGLhu4duaCB1bmcgdGjGsCAtPiBjaOG7jW4gZGF0YXNldCBsdW5nDQpkYXRhKGNhbmNlcikNCmBgYA0KDQrCoMKgwqBE4buvIGxp4buHdSB1bmcgdGjGsCBwaOG7lWkgLSAqKmx1bmcqKiBjw7MgY+G6pXUgdHLDumMgbmjGsCBzYXU6DQoNCmBgYHtyfQ0KIyBIaeG7g24gdGjhu4sgY8OhYyB0aMOgbmggcGjhuqduIGPhu6dhIGThu68gbGnhu4d1DQpzdHIobHVuZykNCmBgYA0KDQrCoMKgwqBNw7QgdOG6oyBjw6FjIGJp4bq/biBj4bunYSBk4buvIGxp4buHdSB1bmcgdGjGsCBwaOG7lWkgLSAqKmx1bmcqKg0KDQoxLiAgKippbnN0Kio6ICpNw6Mgc+G7kSogY+G7p2EgYuG7h25oIG5ow6JuLg0KDQoyLiAgKip0aW1lKio6IFRo4budaSBnaWFuICpz4buRbmcgc8OzdCogaG/hurdjIHRo4budaSBnaWFuICp0aGVvIGTDtWkqICgqbmfDoHkqKS4NCg0KMy4gICoqc3RhdHVzKio6IFTDrG5oIHRy4bqhbmcgc+G7kW5nIHNhdSB0aOG7nWkgZ2lhbiB0aGVvIGTDtWkgKCoxID0gU+G7kW5nIHPDs3QsIDIgPSBRdWEgxJHhu51pKikuDQoNCjQuICAqKmFnZSoqOiBUdeG7lWkgY+G7p2EgYuG7h25oIG5ow6JuLg0KDQo1LiAgKipzZXgqKjogR2nhu5tpIHTDrW5oIGPhu6dhIGLhu4duaCBuaMOibiAoKjEgPSBOYW0sIDIgPSBO4buvKikuDQoNCjYuICAqKnBoLmVjb2cqKjogTeG7qWMgxJHhu5kgKnN1eSBnaeG6o20gcGjhu5VpKiBj4bunYSBi4buHbmggbmjDom4gKCowID0gVOG7kXQsIDEgPSBUw6BuIHBo4bq/IG5o4bq5LCAyID0gVMOgbiBwaOG6vyB0cnVuZyBiw6xuaCwgMyA9IFTDoG4gcGjhur8gbuG6t25nKikuDQoNCjcuICAqKnBoLmthcm5vKio6ICrEkGnhu4NtIEthcm5vZnNreSogY+G7p2EgYuG7h25oIG5ow6JuLCDEkW8gbMaw4budbmcgc+G7qWMga2jhu49lIHThu5VuZyB0aOG7gyAoKjEwMCDEkWnhu4NtIGzDoCBz4bupYyBraOG7j2UgdOG7kXQgbmjhuqV0LCAwIMSRaeG7g20gbMOgIGLhu4duaCBuaMOibiDEkcOjIHF1YSDEkeG7nWkqKQ0KDQo4LiAgKipwYXQua2Fybm8qKjogxJBp4buDbSAqS2Fybm9mc2t5KiBj4bunYSBi4buHbmggbmjDom4gZOG7sWEgdHLDqm4gbmfGsOG7nWkgY2jEg20gc8OzYyAobuG6v3UgY8OzKS4NCg0KOS4gICoqbWVhbC5jYWwqKjogKkzGsOG7o25nIGNhbG8gdGnDqnUgdGjhu6UqIGjDoG5nIG5nw6B5IGPhu6dhIGLhu4duaCBuaMOibi4NCg0KMTAuICoqd3QubG9zcyoqOiAqTeG7qWMgxJHhu5kgZ2nhuqNtIGPDom4qIGPhu6dhIGLhu4duaCBuaMOibiAqdHJvbmcgNiB0aMOhbmcgdHLGsOG7m2MqIMSRw7MuDQoNCsKgwqDCoEPDoWMgYmnhur9uICoqdGltZSoqIHbDoCAqKnN0YXR1cyoqIMSRxrDhu6NjIHPhu60gZOG7pW5nIHRyb25nIHBow6JuIHTDrWNoIHPhu5FuZyBzw7N0LCB0cm9uZyBraGkgY8OhYyBiaeG6v24gY8OybiBs4bqhaSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkcOhbmggZ2nDoSBjw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIHPhu5FuZyBzw7N0IGPhu6dhIGLhu4duaCBuaMOibi4gQ8OhYyBiaeG6v24gKipwaC5lY29nKiogdsOgICoqcGgua2Fybm8qKiBjdW5nIGPhuqVwIHRow7RuZyB0aW4gduG7gSBz4bupYyBraOG7j2UgdOG7lW5nIHRo4buDIGPhu6dhIGLhu4duaCBuaMOibiwgdHJvbmcga2hpIGPDoWMgYmnhur9uICoqbWVhbC5jYWwqKiB2w6AgKip3dC5sb3NzKiogY3VuZyBj4bqlcCB0aMO0bmcgdGluIHbhu4EgY2jhur8gxJHhu5kgxINuIHXhu5FuZyB2w6AgbeG7qWMgxJHhu5kgZ2nhuqNtIGPDom4gY+G7p2EgYuG7h25oIG5ow6JuLg0KDQojIyA0LjMgWOG7rSBsw70gZOG7ryBsaeG7h3UgdW5nIHRoxrAgcGjhu5VpIC0gbHVuZw0KDQrCoMKgwqBMxrB1IMO9IHLhurFuZyB0cuG6oW5nIHRow6FpICgqKnN0YXR1cyoqKSDEkcaw4bujYyBtw6MgaMOzYSB0aGVvIGPDoWNoIGtow7RuZyBjaHXhuqluIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeS4gVGjDtG5nIHRoxrDhu51uZywgZOG7ryBsaeG7h3UgY+G7p2EgYmnhur9uIHN0YXR1cyBn4buTbSAyIGdpw6EgdHLhu4s6ICoqMD0gY8OybiBz4buRbmcsIDE9IMSRw6MgY2jhur90KiouDQoNCsKgwqDCoMSQ4buDIHRoYXkgxJHhu5VpIGdpw6EgdHLhu4sgZOG7ryBsaeG7h3UgY+G7p2EgYmnhur9uIHbhu4EgZ2nDoSB0cuG7iyAqKjAqKiB2w6AgKioxKiosIGNow7puZyB0YSBz4bq9IGTDuW5nIGjDoG0gYG11dGF0ZSgpYCB0cm9uZyBwYWNrYWdlIGBkcGx5cmAuIEjDoG0gYG11dGF0ZSgpYCB0cm9uZyBwYWNrYWdlIGBkcGx5cmAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdGhheSDEkeG7lWkgZ2nDoSB0cuG7iyBj4bunYSBjw6FjIGJp4bq/biB0cm9uZyBt4buZdCB04bqtcCBk4buvIGxp4buHdS4gxJDhu4MgdGhheSDEkeG7lWkgZ2nDoSB0cuG7iyBj4bunYSBt4buZdCBiaeG6v24gYuG6sW5nIGBtdXRhdGUoKWAsIGLhuqFuIGPhuqduIHjDoWMgxJHhu4tuaCB0w6puIGJp4bq/biB2w6AgY3VuZyBj4bqlcCBjaG8gbsOzIG3hu5l0IGJp4buDdSB0aOG7qWMgaG/hurdjIGjDoG0gxJHhu4MgdMOtbmggdG/DoW4gZ2nDoSB0cuG7iyBt4bubaS4gUXXDoSB0csOsbmggdGhheSDEkeG7lWkgZ2nDoSB0cuG7iyBk4buvIGxp4buHdSBj4bunYSBiaeG6v24gxJHGsOG7o2MgdGjhu7FjIGhp4buHbiBuaMawIHNhdToNCg0KYGBge3IsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KIyBH4buNaSBwYWNrYWdlIGRwbHlyIHThu6sgdGjGsCB2aeG7h24NCmxpYnJhcnkoZHBseXIpDQojIENodXnhu4NuIMSR4buVaSBnacOhIHRy4buLIGPhu6dhIGJp4bq/biBzdGF0dXMgMSA9PiAwIHbDoCAyID0+IDEgDQpsdW5nIDwtIGx1bmcgJT4lIG11dGF0ZShzdGF0dXMgPSByZWNvZGUoc3RhdHVzLCAnMScgPSAwLCAnMicgPSAxKSkNCiMgSGnhu4NuIHRo4buLIDYgcXVhbiBzw6F0IMSR4bqndSB0acOqbiBj4bunYSAzIGJp4bq/biBxdWFuIHTDom0NCmhlYWQobHVuZ1tjKCJ0aW1lIiwic3RhdHVzIiwic2V4IildKQ0KYGBgDQoNCsKgwqDCoE5nb8OgaSByYSwgY2jDum5nIHRhIHPhur0gY2hpYSB0deG7lWkgY+G7p2EgYuG7h25oIG5ow6JuIHRow6BuaCAzIG5ow7NtIGNobyB0aeG7h24gcXXDoSB0csOsbmggcGjDom4gdMOtY2g6DQoNCmBgYHtyfQ0KIyBDaGlhIHR14buVaSB0aMOgbmggMyBuaMOzbSB0deG7lWkgDQpsdW5nIDwtIGx1bmcgJT4lbXV0YXRlKGFnZV9ncm91cCA9IGNhc2Vfd2hlbigNCiAgICBhZ2UgPCA1MCB+ICJkxrDhu5tpIDUwIHR14buVaSIsDQogICAgYWdlID49IDUwICYgYWdlIDw9IDY1IH4gIjUwIMSR4bq/biA2NSB0deG7lWkiLA0KICAgIGFnZSA+IDY1IH4gInRyw6puIDY1IHR14buVaSIsDQogICAgVFJVRSB+ICJraMO0bmcgcsO1IikpDQojIEhp4buDbiB0aOG7iyA2IHF1YW4gc8OhdCDEkeG6p3UgdGnDqm4gY+G7p2EgNCBiaeG6v24gcXVhbiB0w6JtDQpoZWFkKGx1bmdbYygidGltZSIsInN0YXR1cyIsInNleCIsICJhZ2VfZ3JvdXAiKV0pDQpgYGANCg0KwqDCoMKgQsOieSBnaeG7nSBjaMO6bmcgdGEgbeG7mXQgYuG7mSBk4buvIGxp4buHdSBt4bubaSB24bubaToNCg0KLSAgICoqdGltZSoqOiBUaOG7nWkgZ2lhbiBz4buRbmcgc8OzdCBob+G6t2MgdGjhu51pIGdpYW4gdGhlbyBkw7VpICgqKm5nw6B5KiopDQoNCi0gICAqKnN0YXR1cyoqOiBUw6xuaCB0cuG6oW5nIHPhu5FuZyBzYXUgdGjhu51pIGdpYW4gdGhlbyBkw7VpICgqKjAgPSBT4buRbmcgc8OzdCwgMSA9IMSQw6MgY2jhur90KiopDQoNCi0gICAqKmFnZV9ncm91cCoqOiBUdeG7lWkgY+G7p2EgYuG7h25oIG5ow6JuIHRoZW8gbmjDs20gdHXhu5VpICgqZMaw4bubaSA1MCB0deG7lWksIDUwIMSR4bq/biA2NSB0deG7lWksIHRyw6puIDY1IHR14buVaSopDQoNCsKgwqDCoCoqKkzGsHUgw70qKio6IGjDoG0gYFN1cnYoKWAgdHJvbmcgcGFja2FnZSBgc3Vydml2YWxgIG3hurdjIMSR4buLbmggY2jhuqVwIG5o4bqtbiBUUlVFL0ZBTFNFLCB0cm9uZyDEkcOzIFRSVUUgbMOgIHPhu7Ega2nhu4duIHbDoCBGQUxTRSBsw6Aga2nhu4NtIGR1eeG7h3Q7ICoxLzAgdHJvbmcgxJHDsyAxIGzDoCBz4buxIGtp4buHbiB2w6AgMCBsw6Aga2nhu4NtIGR1eeG7h3QqOyBob+G6t2MgMi8xIHRyb25nIMSRw7MgMiBsw6Agc+G7sSBraeG7h24gdsOgIDEgbMOgIGtp4buDbSBkdXnhu4d0LiBIw6N5IGPhuqluIHRo4bqtbiDEkeG7gyDEkeG6o20gYuG6o28gZOG7ryBsaeG7h3UgxJHGsOG7o2MgxJHhu4tuaCBk4bqhbmcgxJHDum5nLg0KDQojIyA0LjQgVOG6oW8gxJHhu5FpIHTGsOG7o25nIHNpbmggdOG7k24NCg0KwqDCoMKgVHJvbmcgcGjDom4gdMOtY2ggc+G7kW5nIHPDs3QsIMSR4buDIHRo4buxYyBoaeG7h24gY8OhYyBwaMawxqFuZyBwaMOhcCBwaMOibiB0w61jaCBk4buvIGxp4buHdSBz4buRbmcgc8OzdCwgdGEgY+G6p24gKnThuqFvIMSR4buRaSB0xrDhu6NuZyBz4buRbmcgc8OzdCogKCoqc3Vydml2YWwgb2JqZWN0KiopIGThu7FhIHRyw6puIGPDoWMgdGjDtG5nIHRpbiB24buBICp0aOG7nWkgZ2lhbiBz4buRbmcgc8OzdCogdsOgICp0cuG6oW5nIHRow6FpIHPhu7Ega2nhu4duKiBj4bunYSBjw6FjIMSR4buRaSB0xrDhu6NuZyB0cm9uZyBt4buZdCBuZ2hpw6puIGPhu6l1LiBTYXUgxJHDsywgdGEgY8OzIHRo4buDIHPhu60gZOG7pW5nIGPDoWMgaMOgbSDEkeG7gyB24bq9IMSRxrDhu51uZyBz4buRbmcgc8OzdCB2w6AgxrDhu5tjIGzGsOG7o25nIGPDoWMgbcO0IGjDrG5oIHPhu5FuZyBzw7N0Lg0KDQrCoMKgwqBUcm9uZyBSLCB0YSBjw7MgdGjhu4MgdOG6oW8gxJHhu5FpIHTGsOG7o25nIHPhu5FuZyBzw7N0IGLhurFuZyBow6BtIGBTdXJ2KClgLiBDw7ogcGjDoXAgY+G7p2EgaMOgbSBuw6B5IG5oxrAgc2F1Og0KDQpgYGAgICAgICAgICANClN1cnYodGltZSwgZXZlbnQsIHR5cGUgPSAicmlnaHQiKQ0KYGBgDQoNCsKgwqDCoFRyb25nIMSRw7M6DQoNCi0gICAqKnRpbWUqKjogTMOgIHZlY3RvciBjaOG7qWEgdGjDtG5nIHRpbiB24buBIHQqaOG7nWkgZ2lhbiBz4buRbmcgc8OzdCBob+G6t2MgdGjhu51pIGdpYW4gdGhlbyBkw7VpIGPhu6dhIGPDoWMgxJHhu5FpIHTGsOG7o25nKi4gxJDDonkgY8OzIHRo4buDIGzDoCB0aOG7nWkgZ2lhbiB04burIGzhuqduIGtow6FtIMSR4bqndSB0acOqbiDEkeG6v24gbOG6p24ga2jDoW0gY3Xhu5FpIGPDuW5nLCB0aOG7nWkgZ2lhbiB04burIMSRaeG7gXUgdHLhu4sgxJHhur9uIHPhu7Ega2nhu4duIHjhuqN5IHJhLCBob+G6t2MgdGjhu51pIGdpYW4gdOG7qyBs4bqnbiBwaMOhdCBoaeG7h24gY8SDbiBi4buHbmggxJHhur9uIHPhu7Ega2nhu4duIHjhuqN5IHJhLg0KDQotICAgKipldmVudCoqOiBMw6AgdmVjdG9yIGNo4bupYSB0aMO0bmcgdGluIHbhu4EgKnRy4bqhbmcgdGjDoWkgc+G7sSBraeG7h24qIGPhu6dhIGPDoWMgxJHhu5FpIHTGsOG7o25nLiBHacOhIHRy4buLIGPhu6dhIGV2ZW50IGPDsyB0aOG7gyBsw6AgKiowIChjw7JuIHPhu5FuZykqKiBob+G6t2MgKioxIChjaOG6v3QgaG/hurdjIHjhuqN5IHJhIHPhu7Ega2nhu4duIHF1YW4gdMOibSkqKi4NCg0KLSAgICoqdHlwZSoqOiBMw6AgKnRoYW0gc+G7kSB4w6FjIMSR4buLbmggY8OhY2ggdMOtbmggdG/DoW4gdGjhu51pIGdpYW4gc+G7kW5nIHPDs3QqLiBHacOhIHRy4buLIG3hurdjIMSR4buLbmggY+G7p2EgdHlwZSBsw6AgInJpZ2h0IiwgY8OzIG5naMSpYSBsw6AgdGjhu51pIGdpYW4gc+G7kW5nIHPDs3QgxJHGsOG7o2MgdMOtbmggdOG7qyB0aOG7nWkgxJFp4buDbSBraMOhbSBjdeG7kWkgY8O5bmcgdHLhu6sgxJFpIHRo4budaSDEkWnhu4NtIHjhuqN5IHJhIHPhu7Ega2nhu4duLiBO4bq/dSBnacOhIHRy4buLIGPhu6dhIHR5cGUgbMOgICJsZWZ0IiwgdGjhu51pIGdpYW4gc+G7kW5nIHPDs3Qgc+G6vSDEkcaw4bujYyB0w61uaCB04burIHRo4budaSDEkWnhu4NtIGtow6FtIMSR4bqndSB0acOqbiB0cuG7qyDEkWkgdGjhu51pIMSRaeG7g20geOG6o3kgcmEgc+G7sSBraeG7h24uDQoNCsKgwqDCoFbDrSBk4bulLCB0YSBjw7MgZCrhu68gbGnhu4d1IHbhu4EgdGjhu51pIGdpYW4gc+G7kW5nIHPDs3QgdsOgIHRy4bqhbmcgdGjDoWkgc+G7sSBraeG7h24qIGPhu6dhICoxMCBi4buHbmggbmjDom4gxJHhuqd1IHRpw6puKiBuaMawIHNhdToNCg0KYGBge3J9DQojIEzhuqV5IGJp4bq/biB0aW1lIHbDoCBzdGF0dXMgdOG7qyBkYXRhc2V0IGx1bmcgdsOgIHThuqFvIMSR4buRaSB0xrDhu6NuZyBzaW5oIHThu5NuIG3hu5tpDQpTdXJ2KGx1bmckdGltZSwgbHVuZyRzdGF0dXMpWzE6MTBdDQpgYGANCg0KwqDCoMKgVGEgdGjhuqV5IMSR4buRaSB0xrDhu6NuZyAqKjEqKiBjw7Mgc+G7sSBraeG7h24gdOG6oWkgdGjhu51pIMSRaeG7g20gKiozMDYgbmfDoHkqKiwgxJHhu5FpIHTGsOG7o25nICoqMioqIGPDsyBz4buxIGtp4buHbiB04bqhaSB0aOG7nWkgxJFp4buDbSAqKjQ1NSBuZ8OgeSoqLCDEkeG7kWkgdMaw4bujbmcgKiozKiogYuG7iyBraeG7g20gZHV54buHdCB04bqhaSB0aOG7nWkgxJFp4buDbSAqKjEwMTAgbmfDoHkqKiwgLi4uDQoNCiMjIDQuNSBUw61uaCB0b8OhbiDEkcaw4budbmcgY29uZyBz4buRbmcgc8OzdA0KDQrCoMKgwqBIw6BtIGBzdXJ2Zml0KClgIGzDoCBt4buZdCBow6BtIGTDuW5nIMSR4buDIHTDrW5oIHRvw6FuIHbDoCB24bq9IMSRxrDhu51uZyBz4buRbmcgc8OzdCDGsOG7m2MgdMOtbmggKCoqc3Vydml2YWwgY3VydmVzKiopIGThu7FhIHRyw6puIGThu68gbGnhu4d1IHbhu4EgdGjhu51pIGdpYW4gc+G7kW5nIHPDs3QgdsOgIHRy4bqhbmcgdGjDoWkgc+G7sSBraeG7h24gY+G7p2EgY8OhYyDEkeG7kWkgdMaw4bujbmcgdHJvbmcgbeG7mXQgbmdoacOqbiBj4bupdS4gSMOgbSBgc3VydmZpdCgpYCBsw6AgbeG7mXQgdHJvbmcgbmjhu69uZyBow6BtIGPGoSBi4bqjbiBj4bunYSBwYWNrYWdlIGBzdXJ2aXZhbGAgxJHGsOG7o2MgZMO5bmcgxJHhu4MgcGjDom4gdMOtY2ggc+G7kW5nIHPDs3QgdHLDqm4gUi4NCg0KwqDCoMKgQ8O6IHBow6FwIGPhu6dhIGjDoG0gYHN1cnZmaXQoKWAgbmjGsCBzYXU6DQoNCmBgYCAgICAgICAgIA0Kc3VydmZpdChmb3JtdWxhLCBkYXRhLCB3ZWlnaHRzLCAuLi4pDQpgYGANCg0KwqDCoMKgVHJvbmcgxJHDszoNCg0KLSAgICoqZm9ybXVsYSoqOiBsw6AgY8O0bmcgdGjhu6ljIG3DtCB04bqjIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgxJHhu5FpIHTGsOG7o25nIHPhu5FuZyBzw7N0IHbDoCBjw6FjIGJp4bq/biBnaeG6o2kgdGjDrWNoLiBDw7RuZyB0aOG7qWMgbsOgeSBjw7MgZOG6oW5nIGBTdXJ2KHRpbWUsIGV2ZW50KSB+IHgxICsgeDIgKyDigKZgDQoNCi0gICAqKmRhdGEqKjogbMOgIGRhdGEgZnJhbWUgY2jhu6lhIGPDoWMgYmnhur9uIHRyb25nIGPDtG5nIHRo4bupYy4NCg0KLSAgICoqd2VpZ2h0cyoqOiBsw6AgdmVjdG9yIGNo4bupYSBjw6FjIHRy4buNbmcgc+G7kSBjaG8gbeG7l2kgcXVhbiBzw6F0IHRyb25nIG3DtCBow6xuaC4NCg0KwqDCoMKgVMO0aSBz4bq9IGTDuW5nIGzhuqFpIMSR4buRaSB0xrDhu6NuZyBz4buRbmcgc8OzdCBgU3VydihsdW5nJHRpbWUsIGx1bmckc3RhdHVzKWAgxJHhu4MgdOG6oW8gY8OhYyDEkcaw4budbmcgY29uZyBz4buRbmcgc8OzdCBi4bqxbmcgcGjGsMahbmcgcGjDoXAgKipLYXBsYW4tTWVpZXIqKi4gVMO0aSB04bqhbyDEkcaw4budbmcgY29uZyBzaW5oIHThu5NuIHThu5VuZyB0aOG7gyB24bubaSB0aGFtIHPhu5EgKioiXH4xIioqIGNo4buJIMSR4buLbmggcuG6sW5nIGtow7RuZyBjw7MgYmnhur9uIMSR4buZYyBs4bqtcCBuw6BvIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHBow6JuIG5ow7NtLCBnw6FuIG7DsyBjaG8gxJHhu5FpIHTGsOG7o25nICoqc3VydmZpdF9sdW5nKiogdsOgIHhlbSB4w6l0IGPhuqV1IHRyw7pjIGLhurFuZyBow6BtIGBzdHIoKWA6DQoNCmBgYHtyfQ0KIyBUw61uaCB0b8OhbiDEkcaw4budbmcgY29uZyBz4buRbmcgc8OzdCBj4bunYSB04bqldCBj4bqjIGLhu4duaCBuaMOibg0Kc3VydmZpdF9sdW5nIDwtIHN1cnZmaXQoU3Vydih0aW1lLCBzdGF0dXMpIH4gMSwgZGF0YSA9IGx1bmcpDQojIEhp4buDbiB0aOG7iyBjw6FjIHRow6BuaCBwaOG6p24gY+G7p2EgZOG7ryBsaeG7h3UgbHVuZw0Kc3RyKHN1cnZmaXRfbHVuZykNCmBgYA0KDQrCoMKgwqBN4buZdCBz4buRIHRow6BuaCBwaOG6p24gY2jDrW5oIGPhu6dhIMSR4buRaSB0xrDhu6NuZyAqKnN1cnZmaXQqKiBuw6B5IHPhur0gxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gY8OhYyDEkcaw4budbmcgY29uZyBz4buRbmcgc8OzdCBiYW8gZ+G7k206DQoNCi0gICAqKnRpbWUqKjogKkPDoWMgbeG7kWMgdGjhu51pIGdpYW4qIG3DoCB04bqhaSDEkcOzIMSRxrDhu51uZyBjb25nIGPDsyBt4buZdCBixrDhu5tjLCB04bupYyBsw6Agw610IG5o4bqldCBt4buZdCBz4buxIGtp4buHbiDEkcOjIHjhuqN5IHJhLg0KDQotICAgKipzdXJ2Kio6ICpV4bubYyB0w61uaCB04bu3IGzhu4cgc+G7kW5nIHPDs3QqIHThuqFpIHRo4budaSDEkWnhu4NtIHTGsMahbmcg4bupbmcuDQoNCsKgwqDCoFR1eSBuaGnDqm4sIMSR4buDICpzbyBzw6FuaCB04buJIGzhu4cgc+G7kW5nIHPDs3QgZ2nhu69hIGhhaSBnaeG7m2kgdMOtbmggbmFtIHbDoCBu4buvKiwgdMO0aSBz4bq9IHRow6ptIHnhur91IHThu5EgZ2nhu5tpIHTDrW5oICoqIlx+c2V4IioqIHbDoG8gaMOgbSBgc3VydmZpdCgpYCAqcGjDom4gbmjDs20gdGjDoG5oIGPDoWMgxJHGsOG7nW5nIGNvbmcgc+G7kW5nIHPDs3QgdGhlbyBnaeG7m2kgdMOtbmgqLCBnw6FuIG7DsyBjaG8gxJHhu5FpIHTGsOG7o25nICoqc3VydmZpdF9sdW5nX2J5c2V4KiogdsOgIHhlbSBj4bqldSB0csO6YyBi4bqxbmcgaMOgbSBgc3RyKClgOg0KDQpgYGB7cn0NCiMgVMOtbmggdG/DoW4gxJHGsOG7nW5nIGNvbmcgc+G7kW5nIHPDs3QgdGhlbyBnaeG7m2kgdMOtbmgNCnN1cnZmaXRfbHVuZ19ieXNleCA8LSBzdXJ2Zml0KFN1cnYodGltZSwgc3RhdHVzKSB+IHNleCwgZGF0YSA9IGx1bmcpDQojIEhp4buDbiB0aOG7iyBjw6FjIHRow6BuaCBwaOG6p24gY+G7p2EgZOG7ryBsaeG7h3UgbHVuZw0Kc3RyKHN1cnZmaXRfbHVuZ19ieXNleCkNCmBgYA0KDQrCoMKgwqBOZ2/DoGkgcmEsIHTDtGkgc+G6vSDEkcawYSB2w6BvIDIgeeG6v3UgdOG7kSBraMOhYyB2w6BvIGjDoG0gYHN1cnZmaXQoKWAgxJHhu4MgcGjDom4gbmjDs20gdGjDoG5oIGPDoWMgxJHGsOG7nW5nIGNvbmcgc+G7kW5nIHPDs3QgdGhlbyAqKnN1eSBnaeG6o20gY2jhu6ljIG7Eg25nIHBo4buVaSoqICoqKHBoLmVjb2cpKiogdsOgICoqbmjDs20gdHXhu5VpKiogKiooYWdlX2dyb3VwKSoqOg0KDQpgYGB7cn0NCnN1cnZmaXRfbHVuZ19ieXBoIDwtIHN1cnZmaXQoU3Vydih0aW1lLCBzdGF0dXMpIH4gcGguZWNvZywgZGF0YSA9IGx1bmcpDQpzdXJ2Zml0X2x1bmdfYnlhZ2UgPC0gc3VydmZpdChTdXJ2KHRpbWUsIHN0YXR1cykgfiBhZ2VfZ3JvdXAsIGRhdGEgPSBsdW5nKQ0KYGBgDQoNCiMjIDQuNiDEkMaw4budbmcgY29uZyBz4buRbmcgc8OzdCBLYXBsYW4tTWVpZXINCg0KwqDCoMKgxJDhu4MgKnbhur0gxJHGsOG7nW5nIGNvbmcgc+G7kW5nIHPDs3QgS2FwbGFuLU1laWVyIMSRxqFuIGdp4bqjbiB0csOqbiBSKiwgdMO0aSBkw7luZyBow6BtIGPGoSBi4bqjbiBsw6AgaMOgbSBgcGxvdCgpYCDEkeG7gyB24bq9IMSR4buTIHRo4buLIG5oxrAgc2F1Og0KDQpgYGAgICAgICAgICANCnBsb3Qoc3Vydl9maXQsIG1haW4gPSAixJDGsOG7nW5nIGNvbmcgc2luaCB04buTbiBLYXBsYW4gTWVpZXIiLCB4bGFiID0gIlRo4budaSBnaWFuIiwgeWxhYiA9ICJYw6FjIHN14bqldCBz4buRbmcgc8OzdCIpDQpgYGANCg0KVHJvbmcgxJHDszoNCg0KLSAgIGBzdXJ2X2ZpdGA6IGzDoCBiaeG6v24gxJHGsOG7o2MgZ8OhbiBi4bufaSBow6BtIGBzdXJ2Zml0KClgIGTDuW5nIMSR4buDIHTDrW5oIHRvw6FuIMSRxrDhu51uZyBjb25nIHNpbmggdOG7k24gKHhlbSBwaOG6p24gNC40KQ0KDQrCoMKgwqAqKsSQxrDhu51uZyBjb25nIHPhu5FuZyBzw7N0IEthcGxhbiBNZWllciDEkcahbiBnaeG6o24qKg0KDQrCoMKgwqBUaeG6v3AgdOG7pWMgYuG7mSBk4buvIGxp4buHdSAqdW5nIHRoxrAgcGjhu5VpKiAtICoqbHVuZyoqLiBjaMO6bmcgdGEgY8OzIMSR4buTIHRo4buLIHbhu4EgKsSRxrDhu51uZyBjb25nIHPhu5FuZyBzw7N0IEthcGxhbi1NZWllciogxJHGoW4gZ2nhuqNuIG5oxrAgc2F1Og0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpwbG90KHN1cnZmaXRfbHVuZywgeGxhYiA9ICJUaOG7nWkgZ2lhbiAobmfDoHkpIiwgeWxhYiA9ICJYw6FjIHN14bqldCBz4buRbmcgc8OzdCIsIG1haW4gPSAixJDGsOG7nW5nIGNvbmcgc2luaCB04buTbiBLYXBsYW4gTWVpZXIiLCBjb2wgPSBjKCJibHVlIiksIGx3ZCA9IDIpDQpgYGANCg0KPVw+IE5o4bqtbiB4w6l0IMSR4buTIHRo4buLOiDEkcaw4budbmcgY29uZyBz4buRbmcgc8OzdCBj4bunYSBk4buvIGxp4buHdSB1bmcgdGjGsCBwaOG7lWkgLSBsdW5nIGzDoCBt4buZdCDEkcaw4budbmcgY29uZyB24bubaSB4dSBoxrDhu5tuZyBnaeG6o20gbGnDqm4gdOG7pWMuDQoNCsKgwqDCoE5nb8OgaSBow6BtIGBwbG90KClgIGPGoSBi4bqjbiB0cm9uZyBSLCB0YSBjw7MgdGjhu4Mgc+G7rSBk4bulbmcgcGFja2FnZSBgc3Vydm1pbmVyYCB2w6Agc+G7rSBk4bulbmcgaMOgbSBgZ2dzdXJ2cGxvdCgpYCDEkeG7gyB24bq9IMSR4buTIHRo4buLOg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KHN1cnZtaW5lcikNCmBgYA0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpnZ3N1cnZwbG90KHN1cnZmaXRfbHVuZywgZGF0YSA9IGx1bmcsIHJpc2sudGFibGUgPSBUUlVFLCBwdmFsID0gVFJVRSwgbGVnZW5kLnRpdGxlID0gIkdp4bubaSBUw61uaCIsIHhsYWIgPSAiVGjhu51pIGdpYW4gKG5nw6B5KSIsIHlsYWIgPSAiWMOhYyBzdeG6pXQgc+G7kW5nIHPDs3QiLCkNCmBgYA0KDQrCoMKgwqAqKsSQxrDhu51uZyBjb25nIHPhu5FuZyBzw7N0IEthcGxhbiBNZWllciB0aGVvIHnhur91IHThu5EgZ2nhu5tpIHTDrW5oKioNCg0KwqDCoMKgTsOibmcgY2FvIGjGoW4sIHRhIGPDsyB0aOG7gyB24bq9IMSRxrDhu51uZyBjb25nIHPhu5FuZyBzw7N0IEthcGxhbi1NZWllciBjaG8gdOG7q25nIG5ow7NtIMSRxrDhu6NjIHBow6JuIGxv4bqhaSB0aGVvIHnhur91IHThu5EuIFRyb25nIHbDrSBk4bulIG7DoHksIMSRxrDhu51uZyBjb25nIHPhu5FuZyBzw7N0IEthcGxhbi1NZWllciDEkcaw4bujYyB24bq9IG3hu5dpIG5ow7NtIGdp4bubaSB0w61uaCBraMOhYyBuaGF1IHRyb25nIGThu68gbGnhu4d1IHVuZyB0aMawIHBo4buVaToNCg0KYGBge3IsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KZ2dzdXJ2cGxvdChzdXJ2Zml0X2x1bmdfYnlzZXgsIGRhdGEgPSBsdW5nLCByaXNrLnRhYmxlID0gVFJVRSwgcHZhbCA9IFRSVUUsIGxlZ2VuZC50aXRsZSA9ICJHaeG7m2kgVMOtbmgiLCB4bGFiID0gIlRo4budaSBnaWFuIChuZ8OgeSkiLCB5bGFiID0gIljDoWMgc3XhuqV0IHPDs25nIHPDs3QiKQ0KYGBgDQoNCj1cPiBOaOG6rW4geMOpdCDEkeG7kyB0aOG7izogY8OzIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgeMOhYyBzdeG6pXQgc+G7kW5nIHPDs3QgZ2nhu69hIDIgbmjDs20gbmjhu5ttIHTDrW5oIChwPTAuMDAxMyBcPCAwLjA1KSB2w6AgZ2nhu5tpIHTDrW5oIG5hbSAoc2V4PTEpIGPDsyB4w6FjIHN14bqldCBzw7NuZyBzw7N0IHF1YSB0aOG7nWkgZ2lhbiB0aOG6pXAgaMahbiBnaeG7m2kgdMOtbmggbuG7ryAoc2V4PTEpDQoNCsKgwqDCoCoqxJDGsOG7nW5nIGNvbmcgc2luaCB04buTbiBLYXBsYW4gTWVpZXIgdGhlbyB54bq/dSB04buRIG3hu6ljIMSR4buZIHN1eSBnaeG6o20gY2jhu6ljIG7Eg25nIHBo4buVaSoqDQoNCsKgwqDCoMSQxrDhu51uZyBjb25nIHNpbmggdOG7k24gS2FwbGFuLU1laWVyIMSRxrDhu6NjIHbhur0gbeG7l2kgbmjDs20gc3V5IGdp4bqjbSBjaOG7qWMgbsSDbmcgcGjhu5VpIGtow6FjIG5oYXUgdHJvbmcgZOG7ryBsaeG7h3UgdW5nIHRoxrAgcGjhu5VpLWx1bmc6DQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmdnc3VydnBsb3Qoc3VydmZpdF9sdW5nX2J5cGgsIGRhdGEgPSBsdW5nLCByaXNrLnRhYmxlID0gVFJVRSwgcHZhbCA9IFRSVUUsIGxlZ2VuZC50aXRsZSA9ICJN4bupYyDEkeG7mSBzdXkgZ2nhuqNtIGNo4bupYyBuxINuZyBwaOG7lWkiLCB4bGFiID0gIlRo4budaSBnaWFuIChuZ8OgeSkiLCB5bGFiID0gIljDoWMgc3XhuqV0IHPDs25nIHPDs3QiKQ0KYGBgDQoNCj1cPiBOaOG6rW4geMOpdCDEkeG7kyB0aOG7izogY8OzIHPhu7Ega2jDoWMgYmnhu4d0IMSRw6FuZyBr4buDIGdp4buvYSBjw6FjIG3hu6ljIMSR4buZIHN1eSBnaeG6o20gY2jhu6ljIG7Eg25nIHBo4buVaSAocFx+MC4wMDAxIFw8IDAuMDUpIHbDoCBt4bupYyDEkeG7mSBzdXkgZ2nhuqNtIGNo4bupYyBuxINuZyBwaOG7lWkgY8OgbmcgY8OgbmcgY2FvIHRow6wgeHXhuqV0IHN14bqldCBzw7NuZyBz4buRdCBxdWEgdGjhu51pIGdpYW4gY8OgbmcgdGjhuqVwLg0KDQrCoMKgwqAqKsSQxrDhu51uZyBjb25nIHNpbmggdOG7k24gS2FwbGFuIE1laWVyIHRoZW8gdOG7q25nIG5ow7NtIHR14buVaSoqDQoNCsKgwqDCoMSQxrDhu51uZyBjb25nIHNpbmggdOG7k24gS2FwbGFuLU1laWVyIMSRxrDhu6NjIHbhur0gbeG7l2kgbmjDs20gbmjDs20gdHXhu5VpIGtow6FjIG5oYXUgdHJvbmcgZOG7ryBsaeG7h3UgdW5nIHRoxrAgcGjhu5VpOg0KDQpgYGB7cn0NCmdnc3VydnBsb3Qoc3VydmZpdF9sdW5nX2J5YWdlLCBkYXRhID0gbHVuZywgcmlzay50YWJsZSA9IFRSVUUsIHB2YWwgPSBUUlVFLCBsZWdlbmQudGl0bGUgPSAiTmjDs20gdHXhu5VpIiwgeGxhYiA9ICJUaOG7nWkgZ2lhbiAobmfDoHkpIiwgeWxhYiA9ICJYw6FjIHN14bqldCBzw7NuZyBzw7N0IikNCmBgYA0KDQo9XD4gTmjhuq1uIHjDqXQgxJHhu5MgdGjhu4s6IGtow7RuZyBjw7Mgc+G7sSBraMOhYyBuaGF1IMSRw6FuZyBr4buDIGdp4buvYSBjw6FjIG5ow7NtIHR14buVaSAocD0gMC4xOCBcPiAwLjA1KSBraGkgeMOhYyBzdeG6pXQgc+G7kW5nIHPDs3QgZ2nhu69hIGPDoWMgxJHhu5kgdHXhu5VpIHRyb25nIDUwMCBuZ8OgeSDEkeG6p3UgZ+G6p24gbmjGsCBraMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0Lg0KDQojIyA0LjcgU28gc8OhbmggY8OhYyDEkcaw4budbmcgY29uZyBzaW5oIHThu5NuDQoNCsKgwqDCoMSQ4buDIHNvIHPDoW5oIGPDoWMgxJHGsOG7nW5nIGNvbmcgc2luaCB04buTbiB0csOqbiBSIGLhurFuZyAqKmxvZy1yYW5rKiosIGLhuqFuIGPDsyB0aOG7gyBz4butIGThu6VuZyBow6BtICoqc3VydmRpZmYoKSoqIHRyb25nIGfDs2kgYHN1cnZpdmFsYC4gSMOgbSBuw6B5IGNobyBwaMOpcCBi4bqhbiB0w61uaCB0b8OhbiBnacOhIHRy4buLIHRo4buRbmcga8OqICoqbG9nLXJhbmsqKiB2w6AgKipnacOhIHRy4buLIHAqKiDEkeG7gyBzbyBzw6FuaCDEkcaw4budbmcgY29uZyBzaW5oIHThu5NuIGdp4buvYSBoYWkgaG/hurdjIG5oaeG7gXUgbmjDs20uIFNhdSDEkcOieSBsw6AgbeG7mXQgdsOtIGThu6UgY+G7pSB0aOG7gyB24buBIGPDoWNoIHRo4buxYyBoaeG7h24gc28gc8OhbmggY8OhYyDEkcaw4budbmcgY29uZyBzaW5oIHThu5NuIGLhurFuZyAqKmxvZy1yYW5rKiogdHLDqm4gUjoNCg0KYGBgICAgICAgICAgDQpzdXJ2ZGlmZihzdXJ2X29iaiB+IHgxLCBkYXRhKQ0KYGBgDQoNClRyb25nIMSRw7M6DQoNCi0gICBgc3Vydl9vYmpgOiBsw6AgxJHhu5FpIHTGsOG7o25nIHPhu5FuZyBzw7N0IMSRxrDhu6NjIHThuqFvIGLhu59pIGjDoG0gc3VydigpICh4ZW0gbeG7pWMgNC40KQ0KDQotICAgYHgxYDogbMOgIHnhur91IHThu5EgxJHGsOG7o2MgxJHGsGEgdsOgbyDEkeG7gyBwaMOibiBuaMOzbSB2w6Agc28gc8OhbmgNCg0KwqDCoMKgS+G6v3QgcXXhuqMgY+G7p2Ega2nhu4NtIMSR4buLbmggKipsb2ctcmFuayoqIGJhbyBn4buTbSAqKmdpw6EgdHLhu4sgY2hpLXNxdWFyZWQqKiB2w6AgKipnacOhIHRy4buLIHAqKi4gTuG6v3UgKipnacOhIHRy4buLIHAqKiBuaOG7jyBoxqFuIG3hu6ljIMO9IG5naMSpYSDEkcaw4bujYyBjaOG7jW4gdHLGsOG7m2MgKHRoxrDhu51uZyBsw6AgKiowLDA1KiopLCBi4bqhbiBjw7MgdGjhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4MgduG7gSB04bu3IGzhu4cgc+G7kW5nIHPDs3QgZ2nhu69hIGPDoWMgbmjDs20gxJHGsOG7o2Mgc28gc8OhbmguDQoNCsKgwqDCoFRyb25nIHbDrSBk4bulIG7DoHksICoqxJHGsOG7nW5nIGNvbmcgc2luaCB04buTbiBLYXBsYW4tTWVpZXIqKiDEkcaw4bujYyB0w61uaCB0b8OhbiBjaG8gKipt4buXaSBuaMOzbSBnaeG7m2kgdMOtbmggdsOgIG3hu6ljIMSR4buZIHN1eSBnaeG6o20gY2jhu6ljIG7Eg25nIHBo4buVaSB2w6AgbeG7l2kgbmjDs20gdHXhu5VpIGtow6FjIG5oYXUqKiB0cm9uZyBk4buvIGxp4buHdSB1bmcgdGjGsCBwaOG7lWkgbmjGsCBzYXU6DQoNCmBgYHtyfQ0KIyBTbyBzw6FuaCAyIG5ow7NtIGdp4bubaSB0w61uaCBj4bunYSBk4buvIGxp4buHdSBsdW5nDQpsb2dyYW5rX3Rlc3QxIDwtIHN1cnZkaWZmKHdpdGgobHVuZywgU3Vydih0aW1lLCBzdGF0dXMpKSB+IHNleCwgZGF0YSA9IGx1bmcpDQojIFNvIHPDoW5oIDQgbmjDs20gbeG7qWMgxJHhu5kgc3V5IGdp4bqjbSBjaOG7qWMgbsSDbmcgcGjhu5VpIA0KbG9ncmFua190ZXN0MiA8LSBzdXJ2ZGlmZih3aXRoKGx1bmcsIFN1cnYodGltZSwgc3RhdHVzKSkgfiBwaC5lY29nLCBkYXRhID0gbHVuZykNCiMgU28gc8OhbmggMyBuaMOzbSDEkeG7mSB0deG7lWkgDQpsb2dyYW5rX3Rlc3QzIDwtIHN1cnZkaWZmKHdpdGgobHVuZywgU3Vydih0aW1lLCBzdGF0dXMpKSB+IGFnZV9ncm91cCwgZGF0YSA9IGx1bmcpDQpwcmludChsb2dyYW5rX3Rlc3QxKQ0KcHJpbnQobG9ncmFua190ZXN0MikNCnByaW50KGxvZ3JhbmtfdGVzdDMpDQpgYGANCg0KwqDCoMKgS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmg6DQoNCi0gICAqKk5ow7NtIGdp4bubaSB0w61uaCAobWFsZS1mZW1hbGUpKio6IGdpw6EgdHLhu4sgKipwPSAwLjAwMSBcPCAwLjA1KiogbsOqbiBjw7MgdGjhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyAqY8OzIHPhu7Ega2jDoWMgYmnhu4d0IMSRw6FuZyBr4buDIGdp4buvYSBuaMOzbSBnaeG7m2kgdMOtbmggbmFtIHbDoCBu4buvIHbhu4EgdOG7iSBs4buHIHPhu5FuZyBzw7N0Ki4NCg0KLSAgICoqTmjDs20gTeG7qWMgxJHhu5kgc3V5IGdp4bqjbSBwaOG7lWkgY+G7p2EgYuG7h25oIG5ow6JuKiogKiooMCA9IFThu5F0LCAxID0gVMOgbiBwaOG6vyBuaOG6uSwgMiA9IFTDoG4gcGjhur8gdHJ1bmcgYsOsbmgsIDMgPSBUw6BuIHBo4bq/IG7hurduZykqKjogZ2nDoSB0cuG7iyAqKnA9IDdlLTA1IFw8IDAuMDUqKiBuw6puIGPDsyB0aOG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nICpjw7Mgc+G7sSBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4MgZ2nhu69hIGPDoWMgbmjDs20gbeG7qWMgxJHhu5kgduG7gSB04buJIGzhu4cgc+G7kW5nIHPDs3QuKg0KDQotICAgKipOaMOzbSDEkOG7mSB0deG7lWkgKCBkxrDhu5tpIDUwLCA1MCDEkeG6v24gNjUsIHRyw6puIDY1KSoqOiBnacOhIHRy4buLICoqcD0gMC4yIFw+IDAuMDUqKiBuw6puIGPDsyB0aOG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nICpraMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IMSRw6FuZyBr4buDIGdp4buvYSAzIG5ow7NtIHR14buVaSDEkcaw4bujYyB4w6l0LioNCg0KIyMgNC44IE3DtCBow6xuaCBo4buTaSBxdXkgQ294DQoNCsKgwqDCoE3DtCBow6xuaCAqKkNveCAoQ294IHByb3BvcnRpb25hbCBoYXphcmRzIG1vZGVsKSoqIGzDoCAqbeG7mXQgcGjGsMahbmcgcGjDoXAgaOG7k2kgcXV5IHRoZW8gdOG7iSBs4buHIG5ndXkgY8ahKiwgxJHGsOG7o2Mgc+G7rSBk4bulbmcgdHJvbmcgcGjDom4gdMOtY2ggc+G7kW5nIHPDs3QgxJHhu4MgxJHDoW5oIGdpw6EgdMOhYyDEkeG7mW5nIGPhu6dhIGPDoWMgYmnhur9uIMSR4buZYyBs4bqtcCDEkeG6v24gdOG7iSBs4buHIHPhu5FuZyBzw7N0LiBUcm9uZyBSLCBjaMO6bmcgdGEgY8OzIHRo4buDIHPhu60gZOG7pW5nIGjDoG0gYGNveHBoKClgIHRyb25nIHBhY2thZ2UgYHN1cnZpdmFsYCDEkeG7gyB04bqhbyBt4buZdCAqKm3DtCBow6xuaCBDb3gqKi4gxJDhu4MgdOG6oW8gbeG7mXQgbcO0IGjDrG5oIENveCB0csOqbiBSLCB0w7RpIGTDuW5nIGjDoG0gc2F1Og0KDQpgYGAgICAgICAgICANCmNveHBoKHN1cnZfb2JqIH4geDEgKyB4MiArIC4uLiwgZGF0YSA9IG15ZGF0YSkNCmBgYA0KDQpUcm9uZyDEkcOzOg0KDQotICAgKipzdXJ2X29iaioqOiBsw6AgKsSR4buRaSB0xrDhu6NuZyBzaW5oIHThu5NuKiDEkcaw4bujYyB04bqhbyB04burIGjDoG0gYHN1cnYoKWAgKHBo4bqnbiA0LjQpDQoNCi0gICAqKngqKjogbMOgICpjw6FjIHnhur91IHThu5EgxJHGsOG7o2MgxJHGsGEgdsOgbyBtw7QgaMOsbmgqIMSR4buDIHBow6JuIG5ow7NtIGPDoWMgxJHGsOG7nW5nIGNvbmcgc2luaCB04buTbiBraMOhYyBuaGF1Lg0KDQrCoMKgwqBUaeG6v3AgdOG7pWMgduG7m2kgZOG7ryBsaeG7h3UgdW5nIHRoxrAgcGjhu5VpIC0gKipsdW5nKiogdGhlbyBiaeG6v24gKipnaeG7m2kgdMOtbmgqKiwgY2jDum5nIHRhIGPDsyBtw7QgaMOsbmggQ294IG5oxrAgc2F1Og0KDQpgYGB7cn0NCiMgVOG6oW8gbcO0IGjDrG5oIGNveCB0aGVvIGdp4bubaSB0w61uaA0KY294Zml0IDwtIGNveHBoKFN1cnYodGltZSwgc3RhdHVzKSB+IHNleCwgZGF0YSA9IGx1bmcpDQpjb3hmaXQNCmBgYA0KDQojIyA0LjkgS2nhu4NtIMSR4buLbmggc+G7sSBwaMO5IGjhu6NwIGPhu6dhIG3DtCBow6xuaCBDb3gNCg0KwqDCoMKgVHJvbmcgUiwgxJHhu4MgKmtp4buDbSB0cmEgdMOtbmggcGjDuSBo4bujcCogY+G7p2EgKiptw7QgaMOsbmggQ294KiogduG7m2kgZ2nhuqMgxJHhu4tuaCAqKsSR4buZYyBs4bqtcCB24buBIHRo4budaSBnaWFuIChwcm9wb3J0aW9uYWwgaGF6YXJkcyBhc3N1bXB0aW9uKSoqLCBjaMO6bmcgdGEgY8OzIHRo4buDIHPhu60gZOG7pW5nIGjDoG0gYGNveC56cGgoKWAgdHJvbmcgcGFja2FnZSBgc3Vydml2YWxgLg0KDQpDw7ogcGjDoXAgc+G7rSBk4bulbmcgaMOgbSBgY294LnpwaCgpYCBuaMawIHNhdToNCg0KYGBgICAgICAgICAgDQpjb3guenBoKG1vZGVsLCB0cmFuc2Zvcm0gPSAia20iKQ0KYGBgDQoNClRyb25nIMSRw7M6DQoNCi0gICAqKm1vZGVsOioqIEzDoCDEkeG7kWkgdMaw4bujbmcgbcO0IGjDrG5oIENveCDEkcOjIMSRxrDhu6NjIMaw4bubYyBsxrDhu6NuZyBi4bqxbmcgaMOgbSBjb3hwaCgpIHRyb25nIGfDs2kgc3Vydml2YWwuDQoNCi0gICAqKnRyYW5zZm9ybToqKiBMw6AgcGjGsMahbmcgcGjDoXAgYmnhur9uIMSR4buVaSB0aOG7nWkgZ2lhbiAodGltZSB0cmFuc2Zvcm1hdGlvbikgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdMOtbmggdG/DoW4gY8OhYyB0aOG7kW5nIGvDqiBraeG7g20gxJHhu4tuaC4gR2nDoSB0cuG7iyBt4bq3YyDEkeG7i25oIGzDoCAia20iIHTGsMahbmcg4bupbmcgduG7m2kgcGjGsMahbmcgcGjDoXAgxJHGsOG7nW5nIGNow6lvIEthcGxhbi1NZWllci4NCg0KwqDCoMKgQ8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wIMSRxrDhu6NjIGtp4buDbSB0cmEgYuG6sW5nIGPDoWNoIHTDrW5oIHRvw6FuIGjhu4cgc+G7kSB0xrDGoW5nIHF1YW4gZ2nhu69hIGPDoWMgZ2nDoSB0cuG7iyBk4buxIMSRb8OhbiBj4bunYSAqKmjDoG0gQ294KiogdsOgICoqY8OhYyBow6BtIMSRxrDhu51uZyBjaMOpbyBLYXBsYW4tTWVpZXIqKiB0xrDGoW5nIOG7qW5nIHbhu5tpIHThu6tuZyBuaMOzbSBnacOhIHRy4buLIGPhu6dhIGJp4bq/biDEkeG7mWMgbOG6rXAgxJHDsy4gTuG6v3UgZ2nDoSB0cuG7iyBwIGPhu6dhIGtp4buDbSDEkeG7i25oIG5o4buPIGjGoW4gbeG7mXQgbmfGsOG7oW5nIHjDoWMgxJHhu4tuaCAodGjGsOG7nW5nIGzDoCAqKjAuMDUqKiksIHRhIGPDsyB0aOG7gyBiw6FjIGLhu48gZ2nhuqMgxJHhu4tuaCAqKsSR4buZYyBs4bqtcCB24buBIHRo4budaSBnaWFuKiogdsOgIGPhuqduIHBo4bqjaSB0w6xtIGPDoWNoIMSRaeG7gXUgY2jhu4luaCBtw7QgaMOsbmggQ294IMSR4buDIHBow7kgaOG7o3AgaMahbiB24bubaSBk4buvIGxp4buHdS4NCg0KVsOtIGThu6UgduG7m2kgbcO0IGjDrG5oIENveCDEkcOjIMSRxrDhu6NjIHThuqFvIHThu6sgaMOgbSBjb3hwaCgpICh4ZW0gcGjhuqduIDQuOCksIHRhIGtp4buDbSDEkeG7i25oIG5oxrAgc2F1Og0KDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmggbcO0IGjDrG5oIGNveA0KY294LnpwaChjb3hmaXQsIHRyYW5zZm9ybSA9ICJrbSIpDQpgYGANCg0KwqDCoMKgS+G6v3QgcXXhuqMgY2hvIHRo4bqleTogZ2nDoSB0cuG7iyAqKnA9IDAuMDkxIFw+IDAuMDUqKiBuw6puIG3DtCBow6xuaCBDb3ggxJHGsOG7o2MgdOG6oW8gdHLDqm4gbMOgIHBow7kgaOG7o3AuDQoNCiMjIDQuMTAgU28gc8OhbmggdOG7iSBs4buHIHThu60gdm9uZyBnaeG7r2EgaGFpIG5ow7NtIGLhurFuZyBtw7QgaMOsbmggQ294DQoNCsKgwqDCoCoqVOG7qyBtw7QgaMOsbmggQ294KiosIHTDtGkgY8OzIHRo4buDIHRodSDEkcaw4bujYyBjw6FjIGLhuqNuZyBr4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBnaeG7r2EgKipoYWkgbmjDs20gZ2nhu5tpIHTDrW5oKiogYuG6sW5nIGPDoWNoIHPhu60gZOG7pW5nIGjDoG0gYHRibF9yZWdyZXNzaW9uKClgIHThu6sgcGFja2FnZSBgZ3RzdW1tYXJ5YCwgduG7m2kgdMO5eSBjaOG7jW4gYGV4cCA9IFRSVUVgIMSR4buDIHRy4bqjIHbhu4EgdOG7tyBs4buHIHLhu6dpIHJvOg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQojIEfhu41pIHBhY2thZ2UgZ3RzdW1tYXJ5IHThu6sgdGjGsCB2aeG7h24NCmxpYnJhcnkoImd0c3VtbWFyeSIpDQojIFThuqFvIG3DtCBow6xuaCBjb3ggdGhlbyBnaeG7m2kgdMOtbmggdsOgIHRy4bqjIHbhu4EgdOG7tyBs4buHIHLhu6dpIHJvIEhSDQpjb3hwaChTdXJ2KHRpbWUsIHN0YXR1cykgfiBzZXgsIGRhdGEgPSBsdW5nKSAlPiUgdGJsX3JlZ3Jlc3Npb24oZXhwID0gVFJVRSkgDQpgYGANCg0KwqDCoMKgKipIUioqICpiaeG7g3UgdGjhu4sgdOG7tyBs4buHIG5ndXkgY8ahIGdp4buvYSBoYWkgbmjDs20qIHThuqFpIGLhuqV0IGvhu7MgdGjhu51pIMSRaeG7g20gY+G7pSB0aOG7gyBuw6BvLiAqKkhSIFw8IDEqKiBjaG8gdGjhuqV5IG5ndXkgY8ahIHThu60gdm9uZyBnaeG6o20gdHJvbmcga2hpICoqSFIgXD4gMSoqIGNobyB0aOG6pXkgbmd1eSBjxqEgdOG7rSB2b25nIHTEg25nIGzDqm4uDQoNCi0gICBL4bq/dCBxdeG6oyB04burIGjDoG0gYHRibF9yZWdyZXNzaW9uKClgIGNobyB0aOG6pXk6IEdpw6EgdHLhu4sgcD0wLjAwMVw8MC4wNSBuw6puIGvhur90IHF14bqjIHRyw6puIGzDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLiAqKkhSID0gMCw1OSoqIG5n4bulIMO9IHLhurFuZyBz4buRIG5hbSBnaeG7m2kgKnPhuq9wIGNo4bq/dCogbmhp4buBdSAqKmfhuqVwIDAsNTkqKiBs4bqnbiBzbyB24bubaSBu4buvIGdp4bubaSwgdOG6oWkgYuG6pXQga+G7syB0aOG7nWkgxJFp4buDbSBuw6BvLiBOw7NpIGPDoWNoIGtow6FjLCBwaOG7pSBu4buvIGPDsyBuZ3V5IGPGoSB04butIHZvbmcgdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgbmFtIGdp4bubaSB0cm9uZyBjw6FjIGThu68gbGnhu4d1IG7DoHkuDQoNCsKgwqDCoMOBcCBk4bulbmcgduG7m2kgeeG6v3UgdOG7kSBt4bupYyDEkeG7mSBzdXkgZ2nhuqNtIGNo4bupYyBuxINuZyBwaOG7lWkgcGguZWNvZzoNCg0KYGBge3IsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KIyBU4bqhbyBtw7QgaMOsbmggY294IHRoZW8gbeG7qWMgxJHhu5kgc3V5IGdp4bqjbSBjaOG7qWMgbsSDbmcgcGjhu5VpIHbDoCB0cuG6oyB24buBIHThu7cgbOG7hyBy4bunaSBybyBIUg0KY294cGgoU3Vydih0aW1lLCBzdGF0dXMpIH4gcGguZWNvZywgZGF0YSA9IGx1bmcpICU+JSB0YmxfcmVncmVzc2lvbihleHAgPSBUUlVFKSANCmBgYA0KDQotICAgS+G6v3QgcXXhuqMgdOG7qyBow6BtIGB0YmxfcmVncmVzc2lvbigpYCBjaG8gdGjhuqV5OiBHacOhIHRy4buLIHA9MC4wMDFcPDAuMDUgbsOqbiBr4bq/dCBxdeG6oyB0csOqbiBsw6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gKipIUiA9IDEuNjEqKiBuZ+G7pSDDvSBjaG8gdGjhuqV5IG5ndXkgY8ahIHThu60gdm9uZyB0xINuZyBsw6puIHRoZW8gbeG7qWMgxJHhu5kgc3V5IGdp4bqjbSBjaOG7qWMgbsSDbmcgcGjhu5VpIHbDoCB24bubaSBt4buXaSBt4bupYyBzdXkgZ2nhuqNtIGNo4bupYyBuxINuZyBwaOG7lWkgdMSDbmcgbMOqbiB0aMOsIHh14bqldCBz4bqvYyBi4buHbmggbmjDom4gc+G6r3AgY2jhur90IGPDsyB0aOG7gyB0xINuZyB0aGVvICoqMSw2MSBs4bqnbioqLg0KDQojIyA0LjExIEThu7EgxJFvw6FuIHThu4kgbOG7hyBz4buRbmcgc8OzdCB0cm9uZyB0xrDGoW5nIGxhaQ0KDQrEkMKgwqDCoOG7gyBk4buxIMSRb8OhbiB04buJIGzhu4cgc+G7kW5nIHPDs3QgY+G7p2EgbeG7mXQgY8OhIG5ow6JuIGThu7FhIHRyw6puIG3DtCBow6xuaCBDb3ggxJHDoyDEkcaw4bujYyDGsOG7m2MgbMaw4bujbmcgdHLDqm4gUiwgY2jDum5nIHRhIGPDsyB0aOG7gyBz4butIGThu6VuZyBow6BtIGBwcmVkaWN0KClgIHRyb25nIHBhY2thZ2UgYHN1cnZpdmFsYC4NCg0KQ8O6IHBow6FwIHPhu60gZOG7pW5nIGjDoG0gYHByZWRpY3QoKWAgxJHhu4MgZOG7sSDEkW/DoW4gdOG7iSBs4buHIHPhu5FuZyBzw7N0IGPhu6dhIG3hu5l0IGPDoSBuaMOibiBuaMawIHNhdToNCg0KYGBgICAgICAgICAgDQpwcmVkaWN0KG9iamVjdCwgbmV3ZGF0YSwgdHlwZSA9ICJzdXJ2aXZhbCIpDQpgYGANCg0KVHJvbmcgxJHDszoNCg0KLSAgICoqb2JqZWN0Kio6IEzDoCAqxJHhu5FpIHTGsOG7o25nIG3DtCBow6xuaCBDb3gqIMSRw6MgxJHGsOG7o2MgxrDhu5tjIGzGsOG7o25nIGLhurFuZyBow6BtIGBjb3hwaCgpYCB0cm9uZyBwYWNrYWdlICpzdXJ2aXZhbCouDQoNCi0gICAqKm5ld2RhdGEqKjogTMOgICpi4buZIGThu68gbGnhu4d1IGNo4bupYSB0aMO0bmcgdGluIHbhu4EgY8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wKiBj4bunYSBiaeG6v24gY+G6p24gZOG7sSDEkW/DoW4uIELhu5kgZOG7ryBsaeG7h3UgbsOgeSBwaOG6o2kgY8OzIGPDuW5nIHTDqm4gdsOgIMSR4buLbmggZOG6oW5nIHbhu5tpIGLhu5kgZOG7ryBsaeG7h3UgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxrDhu5tjIGzGsOG7o25nIG3DtCBow6xuaC4NCg0KLSAgICoqdHlwZSoqOiBMw6AgbG/huqFpIGThu7EgxJFvw6FuIGPhuqduIHRo4buxYyBoaeG7h24uIFRyb25nIHRyxrDhu51uZyBo4bujcCBuw6B5LCB0YSBz4butIGThu6VuZyBgdHlwZSA9ICJzdXJ2aXZhbCJgIMSR4buDIGThu7EgxJFvw6FuIHThu4kgbOG7hyBz4buRbmcgc8OzdC4NCg0KwqDCoMKgVsOtIGThu6U6IHTDtGkgbXXhu5FuIHPhu7EgYsOhbyB04buJIGzhu4cgc+G7kW5nIHPDs3QgY+G7p2EgbmjDs20gKipnaeG7m2kgdMOtbmggTmFtKiogdsOgbyAqKm5nw6B5IHRo4bupIDEwNTAqKiwgdMO0aSB0aOG7sWMgaGnhu4duIGPDoWMgYsaw4bubYyBk4buxIGLDoW8gbmjGsCBzYXU6DQoNCmBgYHtyfQ0KIyBU4bqhbyBtw7QgaMOsbmggY294IMSR4buDIGThu7EgYsOhbw0KbW9kIDwtIGNveHBoKFN1cnYodGltZSxzdGF0dXMpIH4rIHNleCwgZGF0YSA9IGNhbmNlcikNCiMgVOG6oW8gMSBkw7JuZyBxdWFuIHPDoXQgbeG7m2kgxJHhu4MgZOG7sSBiw6FvDQpwcmVkX2RhdCA8LSBkYXRhLmZyYW1lKHRpbWUgPSBjKDEwNTApLCBzdGF0dXMgPSBjKDApLCBzZXggPSBjKDApKQ0KIyBUaeG6v24gaMOgbmggZOG7sSBiw6FvIGLhurFuZyBow6BtIHByZWRpY3QNCnByZWRzIDwtIHByZWRpY3QobW9kLCBuZXdkYXRhID0gcHJlZF9kYXQsDQogICAgICAgICAgICAgICAgIHR5cGUgPSAic3Vydml2YWwiLCBzZS5maXQgPSBUUlVFKQ0KIyBM4buNYyB4w6FjIHN14bqldCBz4buRbmcgc8OzdCB04burIGJp4bq/biBwcmVkcw0KcHJlZF9kYXQkcHJvYiA8LSBwcmVkcyRmaXQNCnByZWRfZGF0DQpgYGANCg0KS+G6v3QgcXXhuqM6IHbDoG8gbmfDoHkgKioxMDUwKiosIHbhu5tpICoqdHLhuqFuZyB0aMOhaSBzw7NuZyBz4buRdCAoMCkqKiB2w6AgKipnaeG7m2kgdMOtbmggTmFtICgwKSoqIHRhIGPDsyB04buJIGzhu4cgc+G7kW5nIHPDs3QgbMOgICoqMC4wMDI1NyoqDQoNCiMjIDQuMTIgS+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgdW5nIHRoxrAgcGjhu5VpIC0gbHVuZw0KDQrCoMKgwqBUaMO0bmcgcXVhIGPDoWMgYsaw4bubYyB0aOG7sWMgaMOgbmggcGjDom4gdMOtY2ggc+G7kW5nIHPDs3QgdHLDqm4gUiB24bubaSBk4buvIGxp4buHdSB1bmcgdGjGsCBwaOG7lWkgLSBsdW5nLCBjaMO6bmcgdGEgY8OzIGLhuqNuIHTDs20gdOG6r3QgY8OhYyBr4bq/dCBxdeG6ozoNCg0KMS4gIERhdGFzZXQgKipsdW5nKiogbMOgIG3hu5l0IHRyb25nIG5o4buvbmcgdOG6rXAgZOG7ryBsaeG7h3UgdGnDqnUgYmnhu4N1IGPhu6dhIHBhY2thZ2UgYHN1cnZpdmFsYCDEkcaw4bujYyBz4butIGThu6VuZyB0cm9uZyBuaGnhu4F1IHbDrSBk4bulIHbDoCBoxrDhu5tuZyBk4bqrbiB24buBIHBow6JuIHTDrWNoIGThu68gbGnhu4d1LiBEYXRhc2V0IG7DoHkgxJHGsOG7o2MgdOG6oW8gcmEgdOG7qyAqbmdoacOqbiBj4bupdSBsw6JtIHPDoG5nIHbhu4EgdW5nIHRoxrAgcGjhu5VpKiB2w6AgYmFvIGfhu5NtIHRow7RuZyB0aW4gduG7gSAqKjIyOCBi4buHbmggbmjDom4gdW5nIHRoxrAgcGjhu5VpKiogduG7m2kgY8OhYyBiaeG6v24gbmjGsCB0deG7lWksIGdp4bubaSB0w61uaCwgbeG7qWMgxJHhu5kgc3V5IGdp4bqjbSBjaOG7qWMgbsSDbmcgcGjhu5VpLC4uLg0KMi4gIEJp4bq/biAqKnRpbWUsIHN0YXR1cyoqIGzDoCB04buVIGjhu6NwIGJp4bq/biAqKnRpbWUtdG8tZXZlbnQgKGThu68gbGnhu4d1IHRo4budaSBnaWFuIC0gc+G7sSBraeG7h24pKiogxJHGsOG7o2MgZMO5bmcgxJHhu4MgcGjDom4gdMOtY2ggc+G7kW5nIHPDs3QgdHJvbmcgUi4gQsOqbiBj4bqhbmggxJHDsywgYmnhur9uICoqYWdlLCBzZXgsIHBoLmVjb2cqKiBsw6AgKjMgYmnhur9uIHnhur91IHThu5EgZMO5bmcgxJHhu4MgcGjDom4gbmjDs20gdsOgIMSRw6FuaCBnacOhIOG6o25oIGjGsOG7n25nIGPhu6dhIGNow7puZyBsw6puIHThu4kgbOG7hyBz4buRbmcgc8OzdC4qDQozLiAgKirEkOG7kyB0aOG7iyBz4buRbmcgc8OzdCB04buVbmcgdGjhu4MqKiBj4bunYSBi4buHbmggbmjDom4gdW5nIHRoxrAgcGjhu5VpOg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0V9DQpwbG90KHN1cnZmaXRfbHVuZywgeGxhYiA9ICJUaOG7nWkgZ2lhbiAobmfDoHkpIiwgeWxhYiA9ICJYw6FjIHN14bqldCBz4buRbmcgc8OzdCIsIG1haW4gPSAixJDGr+G7nW5nIGNvbmcgc2luaCB04buTbiBLYXBsYW4gTWVpZXIiLCBjb2wgPSBjKCJibHVlIiksIGx3ZCA9IDIpDQpgYGANCg0KLSAgIMSQ4buTIHRo4buLIMSRxrDhu51uZyBjb25nIHPDs25nIHPDs3QgbMOgIMSR4buTIHRo4buLICpsacOqbiB04bulYyBnaeG6o20sIGtow7RuZyBjw7MgeHUgaMaw4bubbmcgdMSDbmcqIOG7nyBi4bqldCBr4buzIHRo4budaSDEkWnhu4NtIG7DoG8gdsOsIGLhu4duaCBuaMOibiBjaOG6v3QgxJFpIGtow7RuZyB0aOG7gyBz4buRbmcgbOG6oWkuDQoNCjQuICBZ4bq/dSB04buRICoqZ2nhu5tpIHTDrW5oIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24gdOG7iSBs4buHIHPDs25nIHPDs3QqKiBj4bunYSBi4buHbmggbmjDom4sIHRyb25nIMSRw7MgYuG7h25oIG5oYW5oIG1hbmcgZ2nhu5tpIHTDrW5oIG5hbSBjw7MgdOG7iSBs4buHIHPDs25nIHPDs3QgcXVhIHRo4budaSBnaWFuIHRo4bqlcCBoxqFuIHNvIHbhu5tpIGLhu4duaCBuaMOibiBtYW5nIGdp4bubaSB0w61uaCBu4buvLg0KDQo1LiAgWeG6v3UgdOG7kSAqKm3hu6ljIMSR4buZIHN1eSBnaeG6o20gY2jhu6ljIG7Eg25nIHBo4buVaSBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIHThu4kgbOG7hyBz4buRbmcgc8OzdCoqIGPhu6dhIGLhu4duaCBuaMOibiwgdHJvbmcgxJHDsyBi4buHbmggbmjDom4gY8OzIG3hu6ljIMSR4buZIHN1eSBnaeG6o20gcGjhu5VpIGPDoG5nIGzhu5tuIHRow6wgdOG7iSBs4buHIHPhu5FuZyBzw7N0IHF1YSB0aOG7nWkgZ2lhbiBjw6BuZyB0aOG6pXAuDQoNCjYuICBZ4bq/dSB04buRICoqxJHhu5kgdHXhu5VpIGfhuqduIG5oxrAga2jDtG5nIGPDsyDhuqNuaCBoxrDhu59uZyoqIMSR4bq/biB04buJIGzhu4cgc+G7kW5nIHPDs3QgY+G7p2EgYuG7h25oIG5ow6JuLg0KDQojIDUgVEjhu7BDIEjDgE5IIE7Dgk5HIENBTyBW4buaSSBQQUNLQUdFIFNVUlZJVkFMDQoNCiMjIDUuMSBOZ3V5IGPGoSBj4bqhbmggdHJhbmggLSBjb21wZXRpbmcgcmlza3MNCg0KwqDCoMKgKipDb21wZXRpbmcgcmlza3MgKG5ndXkgY8ahIGPhuqFuaCB0cmFuaCkqKiBsw6AgbeG7mXQga2jDoWkgbmnhu4dtIHRyb25nIHBow6JuIHTDrWNoIHPhu5FuZyBzw7N0LCDEkeG7gSBj4bqtcCDEkeG6v24gdmnhu4djIGPDsyAqbmhp4buBdSBoxqFuIG3hu5l0IHPhu7Ega2nhu4duIGPDsyB0aOG7gyB44bqjeSByYSDEkeG7kWkgduG7m2kgY8OhYyBjw6EgbmjDom4gdHJvbmcgcXXDoSB0csOsbmggdGhlbyBkw7VpKi4gVHJvbmcgcGjDom4gdMOtY2ggc+G7kW5nIHPDs3QsIHPhu7Ega2nhu4duIHF1YW4gdMOibSB0aMaw4budbmcgbMOgIHPhu7Ega2nhu4duIHPhu5ttIG5o4bqldCB44bqjeSByYSB0cm9uZyBxdcOhIHRyw6xuaCB0aGVvIGTDtWksIG5oxrBuZyB0cm9uZyB0csaw4budbmcgaOG7o3AgY8OzIG5oaeG7gXUgc+G7sSBraeG7h24gY8OzIHRo4buDIHjhuqN5IHJhLCB2w60gZOG7pSBuaMawOg0KDQotICAgKlTDoWkgcGjDoXQuKg0KDQotICAgKkNo4bq/dCBkbyBi4buHbmguKg0KDQotICAgKkNo4bq/dCB2w6wgeeG6v3UgdOG7kSBraMOhYy4qDQoNCsKgwqDCoE5oxrAgduG6rXksICpwaMOibiB0w61jaCBuZ3V5IGPGoSBj4bqhbmggdHJhbmgqIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHTDrW5oIHRvw6FuIHThu7cgbOG7hyBuZ3V5IGPGoSBj4bunYSAqY8OhYyBz4buxIGtp4buHbiBj4bqhbmggdHJhbmgqIHbDoCDEkW8gbMaw4budbmcg4bqjbmggaMaw4bufbmcgY+G7p2EgY2jDum5nIMSR4bq/biBz4buxIGtp4buHbiBxdWFuIHTDom0uDQoNCiMjIyA1LjEuMSBEYXRhc2V0IG1lbGFub21hIC0gdW5nIHRoxrAgZGENCg0KwqDCoMKgxJDhu4MgKnBow6JuIHTDrWNoIG5ndXkgY8ahIGPhuqFuaCB0cmFuaCosIGNow7puZyB0YSBz4bq9IHPhu60gZOG7pW5nIGThu68gbGnhu4d1IHbhu4EgKnVuZyB0aHUgZGEqIC0gKiptZWxhbm9tYSoqIHRyb25nIHBhY2thZ2UgYE1BU1NgIGLhurFuZyBjw6FjaCB0aOG7sWMgaGnhu4duIG5oxrAgc2F1Og0KDQpgYGB7cn0NCiMgU+G7rSBk4bulbmcgZGF0YXNldCBtZWxhbm9tYSB04burIHBhY2thZ2UgTUFTUw0KZGF0YShNZWxhbm9tYSwgcGFja2FnZSA9ICJNQVNTIikNCiMgSGnhu4NuIHRo4buLIDYgcXVhbiBzw6F0IMSR4bqndSB0acOqbg0KaGVhZChNZWxhbm9tYSkNCmBgYA0KDQrCoMKgwqBC4buZIGThu68gbGnhu4d1IGfhu5NtICoqMjA1IHF1YW4gc8OhdCoqIHbDoCAqKjcgYmnhur9uKiogc2F1Og0KDQotICAgKip0aW1lKio6ICpUaOG7nWkgZ2lhbiogKCpuZ8OgeSopIHThu6sgbMO6YyBjaOG6qW4gxJFvw6FuIHVuZyB0aMawIMSR4bq/biBz4buxIGtp4buHbiBxdWFuIHTDom0gKCp0w6FpIHBow6F0IHVuZyB0aMawIGhv4bq3YyB04butIHZvbmcqKSBob+G6t2Mga+G6v3QgdGjDumMgdGhlbyBkw7VpLg0KDQotICAgKipzdGF0dXMqKjogdMOsbmggdHLhuqFuZzogKjE9IGNo4bq/dCB2w6wgdW5nIHRoxrAgZGEsIDI9IGPDsm4gc+G7kW5nLCAzPSBjaOG6v3QgdsOsIG5ndXnDqm4gbmjDom4ga2jDoWMqLg0KDQotICAgKipzZXgqKjogR2nhu5tpIHTDrW5oIGPhu6dhIGLhu4duaCBuaMOibi4NCg0KLSAgICoqYWdlKio6IFR14buVaSBj4bunYSBi4buHbmggbmjDom4uDQoNCi0gICAqKnRow61ja25lc3MqKjogxJHhu5kgZMOgeSBraOG7kWkgdSBiYW4gxJHhuqd1ICgqdMOtbmggYuG6sW5nIG1tKikuDQoNCi0gICAqKnVsY2VyKio6IEPDsyBoYXkga2jDtG5nIHbhur90IGxvw6l0IHRyw6puIGRhIGJhbiDEkeG6p3UuDQoNCioqTcOjIGjDs2EgbOG6oWkgZOG7ryBsaeG7h3UgY+G7p2EgYmnhur9uIHN0YXR1cyoqDQoNCsKgwqDCoFbDrCBi4buZIGThu68gbGnhu4d1IHbhu4EgKnVuZyB0aMawIGRhKi0gKiptZWxhbm9tYSoqIGPDsyBiaeG6v24gKipzdGF0dXMqKiB24bubaSBnacOhIHRy4buLIGNoxrBhIMSRxrDhu6NjIG3DoyBow7NhIGNodeG6qW4sIGNow7puZyB0YSBz4bq9ICpjaHV54buDbiDEkeG7lWkgZ2nDoSB0cuG7iyB0cm9uZyBiaeG6v24qIHRow6BuaCBjw6FjIGdpw6EgdHLhu4sgbeG7m2kgxJHhu4MgdHLDoW5oIG5o4bqnbSBs4bqrbjoNCg0KYGBge3J9DQojIENodXnhu4NuIMSR4buVaSBk4buvIGxp4buHdSBj4bunYSBiaeG6v24gc3RhdHVzIDI9PjAsIDM9PjINCk1lbGFub21hIDwtIA0KICBNZWxhbm9tYSAlPiUgDQogIG11dGF0ZShzdGF0dXMgPSBhcy5mYWN0b3IocmVjb2RlKHN0YXR1cywgYDJgID0gMCwgYDFgID0gMSwgYDNgID0gMikpKQ0KIyBIaeG7g24gdGjhu4sgNiBxdWFuIHPDoXQgxJHhuqd1IHRpw6puDQpoZWFkKE1lbGFub21hKQ0KYGBgDQoNCkLDonkgZ2nhu50gY2jDum5nIHRhIGPDszoNCg0KLSAgICoqc3RhdHVzKio6ICowPSBjw7JuIHPhu5FuZywgMT0gY2jhur90IHbDrCB1bmcgdGjGsCBkYSwgMj0gY2jhur90IHbDrCBjw6FjIG5ndXnDqm4gbmjDom4ga2jDoWMqLg0KDQojIyMgNS4xLjIgVOG7tyBs4buHIHTDrWNoIGzFqXkgLSBDdW11bGF0aXZlIGluY2lkZW5jZQ0KDQrCoMKgwqAqKlThu7cgbOG7hyB0w61jaCBsxal5IC0gQ3VtdWxhdGl2ZSBpbmNpZGVuY2UqKiBsw6AgbeG7mXQga2jDoWkgbmnhu4dtIHRyb25nICpwaMOibiB0w61jaCBuZ3V5IGPGoSBj4bqhbmggdHJhbmgqLCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB0w61uaCB0b8OhbiB04bu3IGzhu4cgeOG6o3kgcmEgY+G7p2EgKm5oaeG7gXUgc+G7sSBraeG7h24gcXVhbiB0w6JtKiAodsOtIGThu6U6IHTDoWkgcGjDoXQgdW5nIHRoxrAgdsOgIGNo4bq/dCkgdHJvbmcgbeG7mXQgbmjDs20gY+G7pSB0aOG7gyB04bqhaSBt4buZdCB0aOG7nWkgxJFp4buDbSBuaOG6pXQgxJHhu4tuaCB0cm9uZyBxdcOhIHRyw6xuaCB0aGVvIGTDtWkuDQoNCkPDtG5nIHRo4bupYyB0w61uaCBU4bu3IGzhu4cgdMOtY2ggbMWpeSDEkcaw4bujYyBjaG8gYuG7n2k6ICoqQ3VtdWxhdGl2ZSBpbmNpZGVuY2UgPSB04buVbmcgc+G7kSBz4buxIGtp4buHbi9z4buRIG5ndXkgY8ahLioqDQoNCsSQ4buDIHXhu5tjIHTDrW5oIHThu7cgbOG7hyB0w61jaCBsxal5IHRyb25nIHLhu6dpIHJvIGPhuqFuaCB0cmFuaCwgY2jDum5nIHRhIHRo4buxYyBoaeG7h24gYuG6sW5nIGPDoWNoIHPhu60gZOG7pW5nIGjDoG0gYGN1bWluYygpYCB04burIHBhY2thZ2UgYHRpZHljbXByc2tgOg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQojIEfhu41pIHBhY2thZ2UgdHlkeWNtcHJzayB04burIHRoxrAgdmnhu4duDQpsaWJyYXJ5KCJ0aWR5Y21wcnNrIikNCiMgxq/hu5tjIHTDrW5oIHThu7cgbOG7hyB0w61jaCBsxal5DQpjdW1pbmMoU3Vydih0aW1lLCBzdGF0dXMpIH4gMSwgZGF0YSA9IE1lbGFub21hKQ0KYGBgDQoNCsKgwqDCoENow7puZyB0YSBjw7MgdGjhu4Mgc+G7rSBk4bulbmcgaMOgbSBgZ2djdW1pbmMoKWAgdOG7qyBwYWNrYWdlIGBnZ3N1cnZmaXRgIMSR4buDIHbhur0gYmnhu4N1IMSR4buTIHThu7cgbOG7hyB0w61jaCBsxal5LiBUaGVvIG3hurdjIMSR4buLbmgsIG7DsyBjaOG7iSB24bq9IHPGoSDEkeG7kyBsb+G6oWkgc+G7sSBraeG7h24gxJHhuqd1IHRpw6puLiBWw6wgduG6rXksIGJp4buDdSDEkeG7kyBzYXUgxJHDonkgY2hvIHRo4bqleSB04bu3IGzhu4cgdOG7rSB2b25nIHTDrWNoIGzFqXkgZG8gdW5nIHRoxrAgZGE6DQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCiMgR+G7jWkgcGFja2FnZSBnZ3N1cnZmaXQgdOG7qyB0aMawIHZp4buHbg0KbGlicmFyeSgiZ2dzdXJ2Zml0IikNCiMgVuG6vSDEkeG7kyB0aOG7iyB24bubaSBi4bqjbmcgYXQgcmljayB2w6Aga2hv4bqjbmcgdGluIGPhuq15IA0KY3VtaW5jKFN1cnYodGltZSwgc3RhdHVzKSB+IDEsIGRhdGEgPSBNZWxhbm9tYSkgJT4lIA0KICBnZ2N1bWluYygpICsgDQogIGxhYnMoDQogICAgeCA9ICJEYXlzIg0KICApICsgDQogIGFkZF9jb25maWRlbmNlX2ludGVydmFsKCkgKw0KICBhZGRfcmlza3RhYmxlKCkNCmBgYA0KDQrCoMKgwqBOZ2/DoGkgcmEsIGNow7puZyB0YSBjw7MgdGjhu4MgdGjhu4MgaGnhu4duIGPhuqMgaGFpIGxv4bqhaSBz4buxIGtp4buHbiBsw6AgY2jhur90IHbDrCB1bmcgdGjGsCBkYSB2w6AgY2jhur90IHbDrCBuZ3V5w6puIG5ow6JuIGtow6FjLCB0YSB0aOG7sWMgaGnhu4duIG5oxrAgc2F1Og0KDQpgYGB7cn0NCiMgdOG7tyBs4buHIHTDrWNoIGzFqXkgbmd1eSBjxqEgY+G7p2EgY2jhur90IHbDrCB1bmcgdGjGsCBkYSB2w6AgY2jhur90IHbDrCBuZ3V5w6puIG5ow6JuIGtow6FjDQpjdW1pbmMoU3Vydih0aW1lLCBzdGF0dXMpIH4gMSwgZGF0YSA9IE1lbGFub21hKSAlPiUgDQogIGdnY3VtaW5jKG91dGNvbWUgPSBjKCIxIiwgIjIiKSkgKw0KICB5bGltKGMoMCwgMSkpICsgbGFicyh4ID0gIkRheXMiKQ0KYGBgDQoNCsKgwqDCoELDonkgZ2nhu50sIGdp4bqjIHPhu60gY2jDum5nIHRhICptdeG7kW4ga2nhu4NtIHRyYSBjw6FpIGNo4bq/dCBkbyB1bmcgdGjGsCBkYSBob+G6t2MgY8OhYyBuZ3V5w6puIG5ow6JuIGtow6FjKiB0cm9uZyBk4buvIGxp4buHdSB0aGVvIGJp4bq/biAqKnVsY2VyKio6ICpDw7MgaGF5IGtow7RuZyB24bq/dCBsb8OpdCB0csOqbiBkYSBiYW4gxJHhuqd1KiAoKiowPWtow7RuZywgMT1jw7MqKikuIENow7puZyB0YSBjw7MgdGjhu4MgxrDhu5tjIHTDrW5oIHThu7cgbOG7hyB0w61jaCBsxal5IHThuqFpIGPDoWMgdGjhu51pIMSRaeG7g20ga2jDoWMgbmhhdSB0aGVvIG5ow7NtIHbDoCBoaeG7g24gdGjhu4sgdOG7tyBs4buHIMSRw7MgdHJvbmcgYuG6o25nIGPDoWNoIHPhu60gZOG7pW5nIGjDoG0gYHRibF9jdW1pbmMoKWAgdOG7qyBnw7NpIHBhY2thZ2UgYHRpZHljbXByc2tgIMSR4buDIGtp4buDbSB0cmEgc+G7sSBraMOhYyBiaeG7h3QgZ2nhu69hIGPDoWMgbmjDs20gdHJvbmcgdG/DoG4gYuG7mSB0aOG7nWkgZ2lhbiB0aGVvIGTDtWkgYuG6sW5nIGPDoWNoIHPhu60gZOG7pW5nIGjDoG0gYGFkZF9wKClgOg0KDQpgYGB7cn0NCiMgdOG7tyBs4buHIHTDrWNoIGzFqXkgbmd1eSBjxqEgY+G7p2EgY2jhur90IHbDrCB1bmcgdGjGsCBkYSB2w6AgY2jhur90IHbDrCBuZ3V5w6puIG5ow6JuIGtow6FjIG5oxrBuZyBjw7MgeeG6v3UgdOG7kSB24bq/dCBsb8OpdA0KY3VtaW5jKFN1cnYodGltZSwgc3RhdHVzKSB+IHVsY2VyLCBkYXRhID0gTWVsYW5vbWEpICU+JSANCiAgdGJsX2N1bWluYygNCiAgICB0aW1lcyA9IDE4MjYuMjUsIA0KICAgIGxhYmVsX2hlYWRlciA9ICIqKnt0aW1lLzM2NS4yNX0teWVhciBjdW1pbmMqKiIpICU+JSANCiAgYWRkX3AoKQ0KYGBgDQoNCsKgwqDCoFNhdSDEkcOzLCBjaMO6bmcgdGEgY8OzIHRo4buDIHRo4bqleSDEkeG7kyB0aOG7iyB24buBIGPDoWkgY2jhur90IGRvIHVuZyB0aMawIGRhLCB0aGVvIHTDrG5oIHRy4bqhbmcgduG6v3QgbG/DqXQsIGNow7puZyB0YSBz4butIGThu6VuZyBgZ2djdW1pbmMoKWAgdOG7qyBwYWNrYWdlIGBnZ3N1cnZmaXRgOg0KDQpgYGB7cn0NCmN1bWluYyhTdXJ2KHRpbWUsIHN0YXR1cykgfiB1bGNlciwgZGF0YSA9IE1lbGFub21hKSAlPiUgDQogIGdnY3VtaW5jKCkgKyANCiAgbGFicygNCiAgICB4ID0gIkRheXMiDQogICkgKyANCiAgYWRkX2NvbmZpZGVuY2VfaW50ZXJ2YWwoKSArDQogIGFkZF9yaXNrdGFibGUoKQ0KYGBgDQoNCiMjIyA1LjEuMyBI4buTaSBxdXkgQ294IHRyb25nIG5ndXkgY8ahIGPhuqFuaCB0cmFuaA0KDQrCoMKgwqBHaeG6oyBz4butIGNow7puZyB0YSBxdWFuIHTDom0gxJHhur9uIHZp4buHYyB4ZW0geMOpdCDhuqNuaCBoxrDhu59uZyBj4bunYSB0deG7lWkgdMOhYyB2w6AgZ2nhu5tpIHTDrW5oIMSR4buRaSB24bubaSBjw6FpIGNo4bq/dCBkbyB1bmcgdGjGsCBkYSwgduG7m2kgY8OhaSBjaOG6v3QgZG8gY8OhYyBuZ3V5w6puIG5ow6JuIGtow6FjIGzDoCBt4buZdCBz4buxIGtp4buHbiBj4bqhbmggdHJhbmguDQoNCkjDoG0gYGNycigpYCB04burIHBhY2thZ2UgYHRpZHljbXByc2tgIHPhur0gxrDhu5tjIHTDrW5oIGPDoWMgbmd1eSBjxqEgcGjDom4gcGjhu5FpIHBo4bulOg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQojIHThuqFvIG3DtCBow6xuaCBjb3ggduG7m2kgMiB54bq/dSB04buRIGzDoCBnaeG7m2kgdMOtbmggdsOgIHR14buVaQ0KY3JyKFN1cnYodGltZSwgc3RhdHVzKSB+IHNleCArIGFnZSwgZGF0YSA9IE1lbGFub21hKQ0KYGBgDQoNClbDoCBjaMO6bmcgdGEgY8OzIHRo4buDIHThuqFvIGPDoWMgYuG6o25nIGvhur90IHF14bqjIMSRxrDhu6NjIMSR4buLbmggZOG6oW5nIGLhurFuZyBjw6FjaCBz4butIGThu6VuZyBow6BtIGB0YmxfcmVncmVzc2lvbigpYCB04burIHBhY2thZ2UgYGd0c3VtbWFyeWAsIHbhu5tpIHTDuXkgY2jhu41uIGBleHAgPSBUUlVFYCDEkeG7gyBjw7MgxJHGsOG7o2MgxrDhu5tjIHTDrW5oIHThu7cgbOG7hyBy4bunaSBybzoNCg0KYGBge3J9DQojICsgdHLhuqMgduG7gSB04bu3IGzhu4cgbmd1eSBjxqEgdMOtY2ggbMWpeQ0KY3JyKFN1cnYodGltZSwgc3RhdHVzKSB+IHNleCArIGFnZSwgZGF0YSA9IE1lbGFub21hKSAlPiUgDQogIHRibF9yZWdyZXNzaW9uKGV4cCA9IFRSVUUpDQpgYGANCg0KwqDCoMKgS+G6v3QgcXXhuqMgY2hvIHRo4bqleTogKkdp4bubaSB0w61uaCBuYW0qICoqKDE9bmFtLCAwPW7hu68pKiogKmPDsyBsacOqbiBxdWFuIMSRw6FuZyBr4buDKiDEkeG6v24gdmnhu4djIHTEg25nIG5ndXkgY8ahIHThu60gdm9uZyBkbyBraOG7kWkgdSDDoWMgdMOtbmggKCoqdsOsIHAtdmFsdWU9MC4wM1w8MC4wNSoqKSwgdHJvbmcga2hpICp0deG7lWkgdMOhYyogKmtow7RuZyBsacOqbiBxdWFuIMSRw6FuZyBr4buDKiDEkeG6v24gdOG7rSB2b25nIGRvIGto4buRaSB1IMOhYyB0w61uaCAoKip2w6wgcC12YWx1ZT0wLjJcPjAuMDUqKikuDQoNCiMjIDUuMiBUcuG7sWMgcXVhbiBow7NhIMSRxrDhu51uZyBjb25nIHThu4kgbOG7hyB04butIHZvbmcgLSBGaXQgY29tcGxleCBzdXJ2aXZhbCBjdXJ2ZXMNCg0KwqDCoMKgKioiRml0IGNvbXBsZXggc3Vydml2YWwgY3VydmVzIioqIGPDsyB0aOG7gyDEkcaw4bujYyBk4buLY2ggc2FuZyB0aeG6v25nIFZp4buHdCBsw6AgKioixJDGsOG7nW5nIGNvbmcgdOG7iSBs4buHIHThu60gdm9uZyIqKi4gxJDDonkgbMOgIG3hu5l0IHRodeG6rXQgbmfhu68gdHJvbmcgcGjDom4gdMOtY2ggc+G7kW5nIGPDsm4gKCoqKnN1cnZpdmFsIGFuYWx5c2lzKioqKSDEkeG7gyBtw7QgaMOsbmggaMOzYSBk4buvIGxp4buHdSB0aOG7nWkgZ2lhbiBz4buxIGtp4buHbiBwaOG7qWMgdOG6oXAsIHRyb25nIMSRw7Mgc+G7sSBraeG7h24gY8OzIHRo4buDIHjhuqN5IHJhIOG7nyBuaGnhu4F1IGzhuqduIGtow6FjIG5oYXUgaG/hurdjIGPDsyBuaGnhu4F1IG5ndXnDqm4gbmjDom4ga2jDoWMgbmhhdSBk4bqrbiDEkeG6v24gc+G7sSBraeG7h24geOG6o3kgcmEuDQoNCsKgwqDCoENow7puZyB0YSB24bqrbiBz4bq9IHPhu60gZOG7pW5nIGThu68gbGnhu4d1IHVuZyB0aMawIHBo4buVaSAtIGx1bmcgY2hvIHZp4buHYyB0cuG7sWMgcXVhbiBow7NhIMSRxrDhu51uZyB04buJIGzhu4cgdOG7rSB2b25nLiBDaMO6bmcgdGEgc+G6vSB04bqhbyBt4buZdCBi4bqjbmcgY8OhYyDEkcaw4budbmcgY29uZyBz4buRbmcgc8OzdCB0aGVvIGdp4bubaSB0w61uaCDEkcaw4bujYyBwaMOibiBjaGlhIHRoZW8gMiB54bq/dSB04buRLiBC4bqjbmcgY8OhYyDEkeG7kyB0aOG7iyB0cuG7sWMgcXVhbiDEkcaw4bujYyB0aOG7sWMgaGnhu4duIG5oxrAgc2F1Og0KDQpgYGB7cn0NCmZpdHggPC0gc3VydmZpdCggU3Vydih0aW1lLCBzdGF0dXMpIH4gc2V4ICsgYWdlX2dyb3VwICsgcGguZWNvZywNCiAgICAgICAgICAgICAgICBkYXRhID0gbHVuZyApDQpgYGANCg0KYGBge3J9DQpnZ3N1cnYgPC0gZ2dzdXJ2cGxvdChmaXR4LCBmdW4gPSAiZXZlbnQiLCBjb25mLmludCA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICBnZ3RoZW1lID0gdGhlbWVfYncoKSkNCiAgIA0KZ2dzdXJ2JHBsb3QgK3RoZW1lX2J3KCkgKyANCiAgdGhlbWUgKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpKw0KICBmYWNldF9ncmlkKGFnZV9ncm91cCB+IHBoLmVjb2cpDQpgYGANCg0KwqDCoMKgVOG7qyBi4bqjbmcgY8OhYyDEkeG7kyB0aOG7iywgdGEgdGjhuqV5IMSR4buTIHRo4buLIDEgdGh14buZYyBuaMOzbSA1MCDEkeG6v24gNjAgdHXhu5VpIHbDoCBjw7MgbeG7qWMgxJHhu5kgc3V5IGdp4bqjbSBjaOG7qWMgbsSDbmcgcGjhu5VpID0gMCB2w6AgY8OzIDIgxJHGsOG7nW5nIGNvbmcgdOG7iSBs4buHIHThu60gdm9uZyBsw6AgZ2nhu5tpIHTDrW5oIG5hbSB2w6AgbuG7ry4NCg0KDQojIDYgw4FQIEThu6RORyBQSMOCTiBUw41DSCBT4buQTkcgU8OTVCBW4buaSSBQQUNLQUdFIFNVUlZJVkFMDQoNCg0KIyMgNi4xIMSQ4buLbmggcGjDrSBi4bqjbyBoaeG7g20NCg0KQ2jDum5nIHRhIHPhur0gc+G7rSBk4bulbmcgZOG7ryBsaeG7h3UgduG7gSB4w6FjIHN14bqldCBz4buRbmcgc8OzdCBj4bunYSBk4buvIGxp4buHdSB1bmcgdGjGsCBwaOG7lWkgKHhlbSBwaOG6p24gNC4xKSDEkeG7gyDDoXAgZOG7pW5nIHbDoG8gxJHhu4tuaCBnacOhIGLhuqNvIGhp4buDbSDEkWnhu4F1IHRy4buLIHVuZyB0aMawIHBo4buVaS4gDQoNCkLhurFuZyBjw6FjaCB4ZW0geMOpdCBjw6FjIMSR4buTIHRo4buLIMSRxrDhu51uZyBjb25nIHPhu5FuZyBzw7N0IHRyb25nIFIgdsOgIHBow6JuIHTDrWNoIGPDoWMgY2jhu4kgc+G7kSBsacOqbiBxdWFuLCB0w7RpIMSRw6MgeMOieSBk4buxbmcgbeG7mXQgbcO0IGjDrG5oIMSR4buLbmggZ2nDoSBi4bqjbyBoaeG7g20gaOG7lyB0cuG7oyDEkWnhu4F1IHRy4buLIHVuZyB0aMawIHBo4buVaSBt4buZdCBjw6FjaCBjaMOtbmggeMOhYy4gDQoNCk3DtCBow6xuaCBuw6B5IGNobyBwaMOpcCB0w61uaCB0b8OhbiBt4bupYyDEkeG7mSBy4bunaSBybyB2w6AgeMOhYyDEkeG7i25oIGPDoWMga2hv4bqjbiBi4buTaSB0aMaw4budbmcgcGjDuSBo4bujcCBk4buxYSB0csOqbiB4w6FjIHN14bqldCBz4buRbmcgc8OzdCBj4bunYSBuZ8aw4budaSDEkcaw4bujYyBi4bqjbyBoaeG7g20uIFZp4buHYyDDoXAgZOG7pW5nIGThu68gbGnhu4d1IHjDoWMgc3XhuqV0IHPhu5FuZyBzw7N0IHbDoG8gxJHhu4tuaCBnacOhIGLhuqNvIGhp4buDbSBnacO6cCB0xINuZyB0w61uaCBjw7RuZyBi4bqxbmcgdsOgIGNow61uaCB4w6FjIHRyb25nIHZp4buHYyDEkeG7i25oIGdpw6EgY8OhYyBjaMOtbmggc8OhY2ggYuG6o28gaGnhu4NtIMSRaeG7gXUgdHLhu4sgdW5nIHRoxrAuDQoNCk5oxrAgduG6rXksIGPDtG5nIHRo4bupYyDEkeG7i25oIHBow60gYuG6o28gaGnhu4NtIGjhu5cgdHLhu6MgxJFp4buBdSB0cuG7iyB1bmcgdGjGsCBwaOG7lWkgY8OzIHRo4buDIHPhu60gZOG7pW5nIG3hu5l0IHBoxrDGoW5nIHRyw6xuaCDEkcahbiBnaeG6o246DQoNClBow60gYuG6o28gaGnhu4NtID0gUGjDrSDEkWnhu4F1IHRy4buLIG3hu5dpIG5nw6B5IHggVGjhu51pIGdpYW4gc+G7kW5nIHPDs3QgdHJ1bmcgYsOsbmgNCg0KQ2jDum5nIHRhIHPhur0gxJHhurd0IGdp4bqjIHRoaeG6v3QgbmjGsCBzYXU6DQoNCi0gS2jDtG5nIGPDsyB0w6xuaCB0cuG6oW5nIGzhuqFtIHBow6F0IHjhuqN5IHJhLg0KDQotIFBow60gxJFp4buBdSB0cuG7iyBuaMawIG5oYXUgKCB2w60gZOG7pSA1MDBrL25nw6B5KQ0KDQotIMSQ4buRaSB0xrDhu6NuZyBtdWEgYuG6o28gaGnhu4NtOiBi4buHbmggbmjDom4gYuG7iyB1bmcgdGjGsCAtIGjhu5cgdHLhu6MgY2hpIHBow60gxJFp4buBdSB0cuG7iyBjaG8gdOG7m2kga2hpIGNo4bq/dC4NCg0KTmjGsCB24bqteSwgxJHhu4MgxJHhu4tuaCBwaMOtIGLhuqNvIGhp4buDbSBo4buXIHRy4bujIHVuZyB0aMawIHBo4buVaSwgdGEgY+G6p24gdMOtbmggdGjhu51pIGdpYW4gc+G7kW5nIHPDs3QgdHJ1bmcgYsOsbmg6DQoNCmBgYHtyfQ0KZml0IDwtIGNveHBoKFN1cnYodGltZSwgc3RhdHVzKSB+IDEsIGRhdGEgPSBsdW5nKQ0KcHJpbnQobWVkaWFuKHN1cnZmaXQoZml0KSR0aW1lKSkNCmBgYA0KDQpL4bq/dCBxdeG6ozogUGjDrSBi4bqjbyBoaeG7g20gPSA1MDAuMDAwKjI3ND0gMTM3LjAwMC4wMDANCg0KTmjGsCB24bqteSwgY2jDum5nIHRhIGPhuqduIGLDoW4gYuG6o28gaGnhu4NtIGjhu5cgdHLhu6MgxJFp4buBdSB0cuG7iyB1bmcgdGjGoSB24bubaSBt4bupYyBnacOhIHRyw6puIDEzNyB0cmnhu4d1DQoNCk5nb8OgaSByYSwgYuG6sW5nIGPDoWNoIHPhu60gZOG7pW5nIHBhY2thZ2Ugc3Vydml2YWwgdsOgIHBow6JuIHTDrWNoIHPhu5FuZyBzw7N0LCBjaMO6bmcgdGEgY8OzIHRo4buDIMSRxrBhIHJhIHBow60gYuG6o28gaGnhu4NtIGtow6FjIG5oYXUgY2hvIHThu6tuZyBuaMOzbSBraMOhY2ggaMOgbmcuDQoNCiMjIDYuMiBOZ8Ogbmggc+G6o24geHXhuqV0IHPhuqNuIHBo4bqpbQ0KDQpUcm9uZyBz4bqjbiB4deG6pXQgc+G6o24gcGjhuqltLCBwaMOibiB0w61jaCBz4buRbmcgc8OzdCBjw7MgdGjhu4MgxJHGsOG7o2Mgw6FwIGThu6VuZyDEkeG7gyB4w6FjIMSR4buLbmggY2jhuqV0IGzGsOG7o25nIGPhu6dhIHPhuqNuIHBo4bqpbSBk4buxYSB0csOqbiB2aeG7h2Mga2nhu4NtIHRyYSBt4buZdCBz4buRIGzGsOG7o25nIHPhuqNuIHBo4bqpbSBt4bqrdS4NCg0KxJDhu4MgdGjhu7FjIGhp4buHbiBwaMOibiB0w61jaCBz4buRbmcgc8OzdCBjaG8gbmfDoG5oIHPhuqNuIHh14bqldCBz4bqjbiBwaOG6qW0sIHTDtGkgc+G6vSBkw7luZyBk4buvIGxp4buHdSBsaWdodGJ1bGIgduG7gSAyIG5ow7NtIGLDs25nIMSRw6huOiBodeG7s25oIHF1YW5nIHbDoCBz4bujaSDEkeG7kXQNCg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KHJlYWR4bCkNCmxpZ2h0YnVsYiA8LSByZWFkX2V4Y2VsKCJsaWdodGJ1bGIueGxzeCIpDQpgYGANCg0KTGlnaHRidWxiIGzDoCBk4buvIGxp4buHdSAgxJHGsOG7o2MgdMO0aSBs4bqleSB04burIGThu68gbGnhu4d1IG3huqt1IGPhu6dhIHBo4bqnbiBt4buBbSBNQVRMQUIgKHBo4bqnbiBt4buBbSBjdW5nIGPhuqVwIG3DtGkgdHLGsOG7nW5nIHTDrW5oIHRvw6FuIHPhu5EgdsOgIGzhuq1wIHRyw6xuaCwgZG8gY8O0bmcgdHkgTWF0aFdvcmtzIHRoaeG6v3Qga+G6vykgdsOgIMSRw6MgxJHGsOG7o2MgdMO0aSBsxrB1IHbDoG8gZXhjZWwNCg0KDQoNCmBgYHtyfQ0KbGlnaHRidWxiIDwtIGxpZ2h0YnVsYiAlPiUgbXV0YXRlKHN0YXR1cyA9IHJlY29kZShzdGF0dXMsICcxJyA9IDAsICcwJyA9IDEpKQ0KaGVhZChsaWdodGJ1bGIpDQpgYGANClRyb25nIMSRw7M6DQoNCi0gVGltZTogROG7ryBsaeG7h3UgdHXhu5VpIHRo4buNICh0w61uaCBi4bqxbmcgZ2nhu50pIGPhu6dhIGhhaSBsb+G6oWkgYsOzbmcgxJHDqG4NCi0gU3RhdHVzOiBUaMO0bmcgdGluIGtp4buDbSBkdXnhu4d0IHbhu5tpIDA9IGNoxrBhIHh14bqldCBoaeG7h24gbOG7l2kgdsOgIDE9IMSRw6MgeHXhuqV0IGhp4buHbiBs4buXaQ0KLSBUeXBlOiBsb+G6oWkgYsOzbmcgxJHDqG4gduG7m2kgMD0gxJHDqG4gaHXhu7NuaCBxdWFuZywgMT0gxJHDqG4gc+G7o2kgxJHhu5F0DQoNClRhIGPDsyDEkeG7kyB0aOG7iyDEkcaw4budbmcgY29uZyBz4buRbmcgc8OzdCBj4bunYSAyIGxv4bqhaSBiw7NuZyDEkcOobiBuaMawIHNhdToNCg0KYGBge3J9DQpib25nZGVuIDwtIHN1cnZmaXQoU3Vydih0aW1lLCBzdGF0dXMpIH4gdHlwZSwgZGF0YSA9IGxpZ2h0YnVsYikNCnBsb3QoYm9uZ2RlbiwgbWFpbiA9ICLEkMaw4budbmcgY29uZyBraMO0bmcgZ+G6t3AgbOG7l2kgY+G7p2EgYsOzbmcgxJHDqG4gIiwgeGxhYiA9ICJUaOG7nWkgZ2lhbiAoZ2nhu50pIiwgeWxhYiA9ICJYw6FjIHN14bqldCBraMO0bmcgZ+G6t3AgbOG7l2kiKQ0KYGBgDQoNCkNow7puZyB0YSBjw7MgdGjhu4MgdGjhuqV5IHLhurFuZyB4w6FjIHN14bqldCBn4bq3cCBs4buXaSBj4bunYSBiw7NuZyDEkcOobiBz4bujaSDEkeG7kXQgY2FvIGjGoW4gbmhp4buBdSBzbyB24bubaSBiw7NuZyDEkcOobiBodeG7s25oIHF1YW5nLg0KDQoNCg0KIyA3IFBI4bqmTiBL4bq+VCBMVeG6rE4NCg0KIyMgNy4xIMavdSDEkWnhu4NtIGPhu6dhIHBhY2thZ2Ugc3Vydml2YWwNCg0KLSAgIFBow7kgaOG7o3AgduG7m2kgbmhp4buBdSBsb+G6oWkgZOG7ryBsaeG7h3U6IFBhY2thZ2UgInN1cnZpdmFsIiBjw7MgdGjhu4MgxJHGsOG7o2Mgc+G7rSBk4bulbmcgY2hvIG5oaeG7gXUgbG/huqFpIGThu68gbGnhu4d1IHBow6JuIHTDrWNoIHPhu5FuZyBjw7JuLCBiYW8gZ+G7k20gZOG7ryBsaeG7h3UgY2Vuc29yZWQsIGThu68gbGnhu4d1IHPhu7Ega2nhu4duIHLhu51pIHLhuqFjIHbDoCBk4buvIGxp4buHdSBraMO0bmcgY2Vuc29yZWQuDQoNCi0gICDEkOG7mSB0aW4gY+G6rXkgY2FvOiBDw6FjIG3DtCBow6xuaCBzdXJ2aXZhbCBwaMOibiB0w61jaCBk4buvIGxp4buHdSB0aOG7nWkgZ2lhbiDEkeG6v24gc+G7sSBraeG7h24gdGjGsOG7nW5nIMSRxrDhu6NjIHPhu60gZOG7pW5nIHRyb25nIGPDoWMgbmdoacOqbiBj4bupdSB5IHThur8gdsOgIGtpbmggdOG6vyBo4buNYywgdsOgIHBhY2thZ2UgInN1cnZpdmFsIiBjdW5nIGPhuqVwIGPDoWMgY8O0bmcgY+G7pSB2w6AgaMOgbSDEkeG7gyBwaMOibiB0w61jaCBjw6FjIG3DtCBow6xuaCBuw6B5IHbhu5tpIMSR4buZIHRpbiBj4bqteSBjYW8uDQoNCi0gICBDdW5nIGPhuqVwIGPDoWMgY8O0bmcgY+G7pSDEkeG7gyDEkcOhbmggZ2nDoSBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGPDoWMgYmnhur9uIHbDoCB0aOG7nWkgZ2lhbiBjaG8gxJHhur9uIHPhu7Ega2nhu4duOiBQYWNrYWdlICJzdXJ2aXZhbCIgY3VuZyBj4bqlcCBjw6FjIGPDtG5nIGPhu6UgxJHhu4MgxJHDoW5oIGdpw6EgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBjw6FjIGJp4bq/biB2w6AgdGjhu51pIGdpYW4gY2hvIMSR4bq/biBz4buxIGtp4buHbiwgYmFvIGfhu5NtIHBow6JuIHTDrWNoIENveCBwcm9wb3J0aW9uYWwgaGF6YXJkcyB2w6AgdMOtbmggdG/DoW4gc3Vydml2YWwgZnVuY3Rpb24uDQoNCi0gICBUw61jaCBo4bujcCB04buRdCB24bubaSBjw6FjIHBhY2thZ2Uga2jDoWMgdHJvbmcgUjogUGFja2FnZSAic3Vydml2YWwiIHTDrWNoIGjhu6NwIHThu5F0IHbhu5tpIGPDoWMgcGFja2FnZSBraMOhYyB0cm9uZyBSLCBjaG8gcGjDqXAgcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgcGjDom4gdMOtY2ggc+G7kW5nIGPDsm4gdsOgIMSRw6FuaCBnacOhIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgY8OhYyBiaeG6v24gdsOgIHRo4budaSBnaWFuIGNobyDEkeG6v24gc+G7sSBraeG7h24gdHJvbmcgbmhp4buBdSBuZ+G7ryBj4bqjbmgga2jDoWMgbmhhdS4NCg0KIyMgNy4yIE5oxrDhu6NjIMSRaeG7g20gY+G7p2EgcGFja2FnZSBzdXJ2aXZhbA0KDQotICAgS2jDsyBz4butIGThu6VuZyBjaG8gbmfGsOG7nWkgbeG7m2kgYuG6r3QgxJHhuqd1OiBQYWNrYWdlICJzdXJ2aXZhbCIgY8OzIG5oaeG7gXUgaMOgbSB2w6AgdGhhbSBz4buRIHBo4bupYyB04bqhcCwgZG8gxJHDsyBjw7MgdGjhu4Mga2jDsyBz4butIGThu6VuZyBjaG8gbmfGsOG7nWkgbeG7m2kgYuG6r3QgxJHhuqd1IHPhu60gZOG7pW5nIFIgaG/hurdjIHBow6JuIHTDrWNoIGThu68gbGnhu4d1IHRo4budaSBnaWFuIMSR4bq/biBz4buxIGtp4buHbi4NCg0KLSAgIMSQw7JpIGjhu49pIGtp4bq/biB0aOG7qWMgduG7gSBwaMOibiB0w61jaCBz4buRbmcgc8OzdDogUGFja2FnZSAic3Vydml2YWwiIMSRw7JpIGjhu49pIGtp4bq/biB0aOG7qWMgY2h1ecOqbiBzw6J1IHbhu4EgcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgcGjDom4gdMOtY2ggc+G7kW5nIHPDs3QgdsOgIGPDoWMgbcO0IGjDrG5oIHN1cnZpdmFsLCBkbyDEkcOzIGtow7RuZyBwaMO5IGjhu6NwIGNobyBuaOG7r25nIG5nxrDhu51pIGtow7RuZyBjw7MgbuG7gW4gdOG6o25nIGtp4bq/biB0aOG7qWMgxJHhuqd5IMSR4bunLg0KDQotICAgQ8OzIHRo4buDIGfhurdwIHbhuqVuIMSR4buBIHbhu5tpIGThu68gbGnhu4d1IHRoaeG6v3U6IFBhY2thZ2UgInN1cnZpdmFsIiBjw7MgdGjhu4MgZ+G6t3AgduG6pW4gxJHhu4Ega2hpIHBow6JuIHTDrWNoIGThu68gbGnhu4d1IHRo4budaSBnaWFuIMSR4bq/biBz4buxIGtp4buHbiBjw7MgZOG7ryBsaeG7h3UgdGhp4bq/dSBob+G6t2MgZOG7ryBsaeG7h3UgY2Vuc29yZWQgbmhp4buBdSwgZG8gxJHDsyBj4bqnbiBwaOG6o2kgeOG7rSBsw70ga+G7uSB0csaw4bubYyBraGkgcGjDom4gdMOtY2guDQoNCi0gICBLaMO0bmcgcGjDuSBo4bujcCBjaG8gY8OhYyBuZ2hpw6puIGPhu6l1IHF1YW4gc8OhdCBuZ+G6r24gaOG6oW46IFBhY2thZ2UgInN1cnZpdmFsIiB0aMaw4budbmcgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgdGjhu51pIGdpYW4gxJHhur9uIHPhu7Ega2nhu4duIHRyb25nIGPDoWMgbmdoacOqbiBj4bupdSBxdWFuIHPDoXQgZMOgaSBo4bqhbiwgZG8gxJHDsyBraMO0bmcgcGjDuSBo4bujcCBjaG8gY8OhYyBuZ2hpw6puIGPhu6l1IHF1YW4gc8OhdCBuZ+G6r24gaOG6oW4uDQoNCiMjIDcuMyDDnSBuZ2jEqWEgY+G7p2EgcGjDom4gdMOtY2ggc+G7kW5nIGPDsm4NCg0KLSAgICoqVHJvbmcgeSBo4buNYyoqOiBQaMOibiB0w61jaCBz4buRbmcgc8OzdCDEkcaw4bujYyBz4butIGThu6VuZyB0cm9uZyBuZ2hpw6puIGPhu6l1IHkgaOG7jWMgxJHhu4MgxJHDoW5oIGdpw6EgdMOhYyDEkeG7mW5nIGPhu6dhIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBuaGF1IMSR4bq/biBz4buxIGtp4buHbiBxdWFuIHRy4buNbmcgbmjGsCB04butIHZvbmcsIGLhu4duaCBsw70sIHTDoWkgcGjDoXQgYuG7h25oLCB2w6AgdGjhu51pIGdpYW4gc+G7kW5nIHPDs3QuIE7DsyBjw7MgdGjhu4MgZ2nDunAgY8OhYyBuaMOgIG5naGnDqm4gY+G7qXUgcGjDom4gdMOtY2ggdsOgIMSRxrBhIHJhIGThu7EgYsOhbyB24buBIG5ndXkgY8ahIG3huq9jIGLhu4duaCwgdOG7kWMgxJHhu5kgdGnhur9uIHRyaeG7g24gYuG7h25oIHbDoCBk4buxIGLDoW8gdGjhu51pIGdpYW4gc+G7kW5nIHPDs3QuDQoNCi0gICAqKlRyb25nIGtpbmggdOG6vyBo4buNYyoqOiBQaMOibiB0w61jaCBz4buRbmcgc8OzdCBjxaluZyDEkcaw4bujYyBz4butIGThu6VuZyB0cm9uZyBraW5oIHThur8gaOG7jWMgxJHhu4MgxJHDoW5oIGdpw6EgdMOhYyDEkeG7mW5nIGPhu6dhIGPDoWMgY2jDrW5oIHPDoWNoIHbDoCBjw6FjIHnhur91IHThu5Ega2jDoWMgxJHhur9uIHPhu7Ega2nhu4duIHF1YW4gdHLhu41uZyBuaMawIHRo4budaSBnaWFuIHRo4bqldCBuZ2hp4buHcCwgdGjhu51pIGdpYW4gbmdo4buJIGjGsHUsIHbDoCB0aOG7nWkgZ2lhbiBraW5oIGRvYW5oIGPhu6dhIG3hu5l0IGRvYW5oIG5naGnhu4dwLg0KDQotICAgKipUcm9uZyBuZ2hpw6puIGPhu6l1IHjDoyBo4buZaSoqOiBQaMOibiB0w61jaCBz4buRbmcgc8OzdCBjxaluZyBjw7MgZ2nDoSB0cuG7iyB0cm9uZyBuZ2hpw6puIGPhu6l1IHjDoyBo4buZaSwgZ2nDunAgY8OhYyBuaMOgIG5naGnDqm4gY+G7qXUgxJHDoW5oIGdpw6EgdMOhYyDEkeG7mW5nIGPhu6dhIGPDoWMgeeG6v3UgdOG7kSBraMOhYyDEkeG6v24gc+G7sSBraeG7h24gcXVhbiB0cuG7jW5nIG5oxrAgdGjhu51pIGdpYW4gY2h1eeG7g24gxJHhu5VpIHZp4buHYyBsw6BtLCB0aOG7nWkgZ2lhbiBr4bq/dCBow7RuIGhv4bq3YyBseSBow7RuLCB2w6AgdGjhu51pIGdpYW4gc+G7kW5nIHPDs3QgY+G7p2EgbeG7mXQgbmjDs20gbmfGsOG7nWkuDQoNCiAgICBUdXkgbmhpw6puLCBiw6BpIHRp4buDdSBsdeG6rW4gbsOgeSBjaOG7iSB0aOG7sWMgaMOgbmggcGjDom4gdMOtY2ggc3Vydml2YWwgYW5hbHlzaXMgduG7m2kgZOG7ryBsaeG7h3UgdGh14buZYyB24buBIHkgaOG7jWMuDQoNCiMgOCBUw4BJIExJ4buGVSBUSEFNIEtI4bqiTw0KDQoxLiAgUGjDom4gdMOtY2ggc+G7kW5nIGPDsm4gLSBD4bqpbSBuYW5nIGThu4tjaCB04buFIGjhu41jIHbhu5tpIFIgKEFwcGxpZWQgRXBpKQ0KDQoyLiAgQSBwYWNrYWdlIGZvciBzdXJ2aXZhbCBhbmFseXNpcyBpbiBSIC0gVGVycnkgVGhlcm5lYXUNCg0KMy4gIFN1cnZpdmFsIEFuYWx5c2lzIGluIFIgLSBFbWlseSBDLlphYm9yDQo=