1. MPC response overview

As of 15 January 2024, a total of 1,126,332 persons or 223,360 families have been reached by MPC interventions.

A total of USD 36.9 million has been disbursed by 29 implementing agencies in 356 communities across 37 sub-districts.

Only beneficiaries who have received at least USD 100/family/month have been included; excludes sector-based activities such as non-MPC cash-for-food.


1,126,000 people reached with MPC, USD 36.9 million disbursed, 15 January 2024

governorate

district

comm.

partners

households

beneficiaries

total_usd

%_BNF1

Aleppo

A'zaz

35

13

11,575

55,099

1,854,547

4.89

Aleppo

Afrin

138

19

72,967

317,602

10,195,460

28.20

Aleppo

Al Bab

5

6

7,947

42,211

1,198,798

3.75

Aleppo

Jarablus

1

2

458

1,250

75,572

0.11

Aleppo

Jebel Saman

18

12

16,509

75,813

2,190,395

6.73

Ar-Raqqa

Tell Abiad

2

2

132

549

22,912

0.05

Idleb

Al Ma'ra

1

1

1

4

140

0.00

Idleb

Ariha

14

8

3,336

17,048

508,330

1.51

Idleb

Harim

78

22

103,097

449,068

15,686,873

39.87

Idleb

Idleb

32

15

28,289

135,733

4,247,686

12.05

Idleb

Jisr-Ash-Shugur

36

9

7,770

31,955

937,647

2.84

Total

-

-

-

252,081

1,126,332

36,918,360

100.00

1As percentage of all MPC beneficiaries reached in NW Syria


In February 2023, 161,792 beneficiary frequencies were reached, and in March 2023 the number increased to 95,157. In April 2023 152,294 were reached. As of May 2023, 106,857 beneficiaries have been reached, followed by 69,081 in June, with 126,448 in July 2023 with 161,483 in August 2023, with 78,446 in September 2023, while in October 2023 49,405, with 36,040 in November 2023, with 41,962 in December 2023, and 184,905 in January 2024.

This document distinguishes between beneficiaries, or unique individuals reached, and beneficiary frequencies, or the number of times people have been reached, inclusive of double counting.



1.1 Progress by date


The small number of beneficiaries reached earlier than February all pertained to the HRP, the only such beneficiaries reported so far. The CWG would like to encourage partners to report on their January achievements.



2. Map of activities





3. Geographic breakdown of beneficiaries

Coverage continues to be highest in Afrin and Harim districts, where the highest numbers of damaged houses and wounded people are located (though these areas do not necessarily have the highest proportions of damage).



Casualties and damaged houses, absolute figures and per 100,000 persons

governorate

district

wounded_dead1

wounded_dead_100k1

damaged_houses1

damaged_houses_100k1

Aleppo

A'zaz

356

57.87

276

44.86

Aleppo

Afrin

2,232

478.79

2,910

624.22

Aleppo

Al Bab

206

70.04

832

282.89

Aleppo

Jarablus

40

33.82

257

217.30

Aleppo

Jebel Saman

616

236.80

176

67.66

Idleb

Harim

8,449

507.65

3,230

194.07

Idleb

Idleb

350

48.23

946

130.37

Idleb

Jisr-Ash-Shugur

595

183.68

1,915

591.18

1Data from the Assistance Coordination Unit, Syria 20230328;


Below is a breakdown of beneficiaries based on whether they originate from camps or villages. The majority of MPC beneficiaries are from villages.


More than twice as many beneficiaries from villages as from camps

village_camps

beneficiaries

%_beneficiaries

camp

70,301

6.24

village

227,668

20.21

NA

828,363

73.55




3.1 By sub-district

The plots below show the breakdown of beneficiaries by sub-district. Caution must be taken to ensure that allocations are fair across the affected areas: there are numerous sub-districts where a very large proportion of the total population has already been reached by multipurpose cash, in particular, Jandairis, Harim, Salqin and Sharan.

Response activities must be proportional with the magnitude and severity of earthquake damage. Over allocation deprives affected persons of the aid they are due.

The average percentage of the population reached, of all sub-districts, is 18.26%.






3.2 Planned activities

We find it encouraging that new sub-districts are being included in the planned allocations, although it’s noteworthy that some of the planned allocation is still being assigned to areas that have already benefited from relatively high levels of support.






4. Cash response actors and cash disbursed

USD 36.9 million has been distributed across 356 communities and 37 sub-districts in NW Syria.


Reach and footprint of cash response actors

implementing_partner1

beneficiary_freq

districts

communities

GOAL (GOAL)

229,271

5

150

Shafak Organization (SO)

168,977

9

50

International Rescue Committee (IRC)

153,464

4

35

Ihsan for Relief and Development (IRD)

107,615

6

41

Takaful Al Sham (TAS)

91,928

6

61

Syria Relief (SR)

65,081

6

17

Welthungerhilfe (WHH)

62,026

4

11

Bahar Organization (BO)

60,050

2

32

Violet Organization (VO)

51,207

5

38

Norwegian Refugee Council (NRC)

34,687

3

7

Uluslararasi Insani Yardimlasma Dernegi (IYD)

31,939

4

14

Solidarités International (SI)

31,084

1

6

Ataa Humanitarian Relief Association (ATAA)

27,434

9

25

CBRTWG-031

27,001

6

54

Syrian Association for Relief and Development (SARD)

18,597

3

11

Sened Organization (SENED)

15,995

4

7

Mercy Without Limits (MWL)

15,422

4

7

People in Need (PIN)

12,804

5

6

World Vision International (WVI)

12,048

1

4

GMO -- Mercy Corps

11,031

1

1

Elaf for Relief and Development (ELAF)

6,900

3

4

International Humanitarian Relief (IHR)

6,654

3

9

Hand in Hand For Syria (HIHFS)

6,651

1

7

Hope Revival Organization (HRO)

4,850

1

18

Ghiras Al Nahda (GAN)

3,050

1

2

Bonyan Organization (BO)

2,951

1

4

The Syrian Est. for Human Care and Development (Massrat)

2,692

3

3

Al-Sham Humanitarian Foundation (AHF)

1,980

7

7

Seeds Of Hope Relief and Development (SOH)

481

1

1

1Only partners who provided more than USD 100/family/month;


In the scatter plot below, each point is a single cash working group partner. The x-axis indicates the number of beneficiary frequencies reached per agency and the y-axis indicates the number of communities (admin4) reached. Mouse over each point for more details.





4.1 Cash disbursed per partner


Cash disbursed and families reached by partner

implementing_partner

total_usd

families

usd_per_fam

%_usd_total

GOAL (GOAL)

7,092,150

47,281

150.00

19.21

Shafak Organization (SO)

5,413,450

34,228

158.16

14.66

International Rescue Committee (IRC)

4,256,850

27,915

152.49

11.53

Welthungerhilfe (WHH)

3,711,150

15,309

242.42

10.05

Ihsan for Relief and Development (IRD)

2,807,100

20,514

136.84

7.60

Takaful Al Sham (TAS)

2,375,850

17,187

138.24

6.44

Syria Relief (SR)

2,057,158

13,334

154.28

5.57

Violet Organization (VO)

1,447,550

10,680

135.54

3.92

Ataa Humanitarian Relief Association (ATAA)

1,154,929

6,323

182.66

3.13

Norwegian Refugee Council (NRC)

894,050

6,414

139.39

2.42

Syrian Association for Relief and Development (SARD)

710,148

3,997

177.67

1.92

CBRTWG-031

697,950

5,068

137.72

1.89

Solidarités International (SI)

655,350

5,826

112.49

1.78

Uluslararasi Insani Yardimlasma Dernegi (IYD)

467,100

5,921

78.89

1.27

People in Need (PIN)

411,450

2,743

150.00

1.11

Mercy Without Limits (MWL)

399,731

2,877

138.94

1.08

Sened Organization (SENED)

379,200

2,528

150.00

1.03

Bahar Organization (BO)

360,000

12,010

29.98

0.98

World Vision International (WVI)

301,200

2,008

150.00

0.82

Elaf for Relief and Development (ELAF)

252,500

1,250

202.00

0.68

GMO -- Mercy Corps

218,100

2,937

74.26

0.59

Hand in Hand For Syria (HIHFS)

210,079

1,400

150.06

0.57

International Humanitarian Relief (IHR)

179,250

1,195

150.00

0.49

Hope Revival Organization (HRO)

121,250

970

125.00

0.33

Bonyan Organization (BO)

119,964

575

208.63

0.32

Ghiras Al Nahda (GAN)

91,500

610

150.00

0.25

The Syrian Est. for Human Care and Development (Massrat)

81,000

540

150.00

0.22

Al-Sham Humanitarian Foundation (AHF)

41,250

330

125.00

0.11

Seeds Of Hope Relief and Development (SOH)

11,100

111

100.00

0.03


The CWG is currently working with other Clusters to consolidate all cash-based activities and will soon be able to provide more comprehensive reporting.



4.2 Currency disbursed

A total of 96.92% of cash disbursed was in USD.


Proportion of cash disbursed by currency

currency

total_usd

%_of_total

TRY

1,138,914

3.08

USD

35,779,444

96.92

Total

36,918,358

100.00




5. Annexes


5.1 Interactive reference table at sub-district level

Columns include: governorate, district, sub-district, total population, beneficiaries, total usd disbursed, wounded and dead, wounded and dead per 100k, damaged houses, damaged houses per 100k, admin3pcode




5.2 Reporting quality

This section documents issues encountered in the cleaning of 4W and FSL data and their impacts on the quality of reporting the CWG can provide. The recommendations by the CWG are included to enhance reporting quality:

  1. The CWG has adopted a new 4Ws template for monthly reporting, aiming to improve the documentation of the earthquake response efforts. The reporting deadline is set on the 15th of each month. In February 9 partners reported their achievements, In March 10 partners have reported their achievements, with 16 partners having reported in April, in May 16 partners have reported. 10 partners have reported in June, with 14 partners have reported in July, while 15 reported in August, with 15 reported in September, with 10 reported in October, with 8 reported in November, with 8 reported in December, and 8 reported in January 2024. If no MPC activities were implemented, please inform the CWG as well.

  2. For this reporting period, activities pertaining to 136,475 beneficiaries were missing their dates or had dates in unreadable formats. Please ensure that the start date and end date are entered in the format (mm/dd/yyyy) and select the month of reporting from the options in the drop down menu.

  3. For sex-and-age dis-aggregations, please do not back fill these columns using calculations based on the census or the MSNA. If no dis-aggregated data is available to your organisation, please leave these columns blank.

  4. The Cash Working Group is currently only collecting planned and implemented Multipurpose Cash achievements. Whilst the CWG welcomes additional inputs on other CVA activities, we also want to ensure that the reporting load is as low as possible for partners i.e. if an agency has implemented Cash-for-Work, this should be reported to the ERL Cluster. The CWG will work with all Clusters to develop a consolidated picture of response-wide CVA interventions.

  5. Please indicate in the previously_assisted column whether or not beneficiaries have been reached before. However, if the beneficiaries are being reported for the first time to the Cash Working Group, even if you have reached them before, please indicate No in this column. This column is used to calculate the number of unique individuals reached.

LS0tDQp0aXRsZTogIk5vcnRod2VzdCBTeXJpYSBDYXNoIFdvcmtpbmcgR3JvdXAgRWFydGhxdWFrZSBSZXNwb25zZSBCdWxsZXRpbiINCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICB0aGVtZTogcmVhZGFibGUNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubw0KICAgIGNvbGxhcHNlZDogbm8NCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogJzQnDQphbHdheXNfYWxsb3dfaHRtbDogeWVzDQotLS0NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBoZWlnaHQ6IDcwcHg7DQogIG1hcmdpbjogMmVtIDIwcHggNDBweCAyMHB4Ow0KICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9ub3J0aHdlc3Qtc3lyaWEtY2FzaC13b3JraW5nLWdyb3VwL211bHRpc2VjdG9yXzRXc19yZXZpZXcvcmF3L21haW4vTldTLUNXRyUyMGxvZ28uUE5HIik7DQogIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjsNCiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjsNCiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsNCn0NCmBgYA0KDQpgYGB7PWh0bWx9DQo8c3R5bGU+DQogICAgYm9keSAubWFpbi1jb250YWluZXIgew0KICAgICAgICBtYXgtd2lkdGg6IDEyODBweDsNCiAgICB9DQo8L3N0eWxlPg0KYGBgDQoNCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIGZpZy53aWR0aD05LCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KHN0cmluZ2kpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkodmlyaWRpcykNCmxpYnJhcnkocGF0Y2h3b3JrKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoaGVyZSkNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoZmxleHRhYmxlKQ0KbGlicmFyeShtZGVwcml2KQ0KbGlicmFyeShnZ3JlcGVsKQ0KbGlicmFyeShhbnl0aW1lKQ0KbGlicmFyeSh0aWR5dGV4dCkNCg0KdGhlbWVfc2V0KHRoZW1lX2xpZ2h0KCkpDQoNCiAgIyBkaXNhYmxpbmcgc2NpZW50aWZpYyBub3RhdGlvbg0Kb3B0aW9ucyhzY2lwZW4gPSAxMDApDQoNCmAlb3V0JWAgPC0gTmVnYXRlKGAlaW4lYCkNCg0KICAjIGZ1bmN0aW9uIGZvciB0cmFuc3Bvc2luZyBkZg0KdHJhbnNwb3NlX2RmIDwtIGZ1bmN0aW9uKGRmKSB7DQogIHRfZGYgPC0gZGF0YS50YWJsZTo6dHJhbnNwb3NlKGRmKQ0KICAgIGNvbG5hbWVzKHRfZGYpIDwtIHJvd25hbWVzKGRmKQ0KICAgICAgcm93bmFtZXModF9kZikgPC0gY29sbmFtZXMoZGYpDQogICAgICAgIHRfZGYgPC0gdF9kZiAlPiUNCiAgICAgICAgICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbiguZGF0YSA9IC4pICU+JQ0KICAgICAgICAgICAgdGliYmxlOjphc190aWJibGUoLikNCiAgcmV0dXJuKHRfZGYpDQp9DQoNCiAgIyBzY2FsaW5nIGZ1bmN0aW9ucyANCnJhbmdlMDEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgpKS8obWF4KHgpLW1pbih4KSl9DQpyYW5nZV93bmEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgsIG5hLnJtID0gVFJVRSkpLyhtYXgoeCwgbmEucm0gPSBUUlVFKS1taW4oeCwgbmEucm0gPSBUUlVFKSl9DQoNCiAgIyBtb2RlIGZ1bmN0aW9uIA0KbW9kZSA8LSBmdW5jdGlvbih4KSB7DQogIHV4IDwtIHVuaXF1ZSh4KQ0KICB1eFt3aGljaC5tYXgodGFidWxhdGUobWF0Y2goeCwgdXgpKSldDQp9DQoNCmxvY2F0aW9ucyA8LSByZWFkX2NzdigiLi9kYXRhL2xvY2F0aW9uc19hb2MuY3N2IikNCg0KcGNvZGUzX3NoYXBlIDwtIA0KICBzdF9yZWFkKCIuL2RhdGEvc3lyX2FkbWJuZGFfdW5jc191bm9jaGFfMjAyMDEyMTcvc3lyX2FkbWJuZGFfYWRtM191bmNzX3Vub2NoYV8yMDIwMTIxNy5zaHAiKQ0KDQpgYGANCg0KDQpgYGB7ciBkYXRhfQ0KDQpyZXBvcnRfZGF0ZSA8LSAiMTUgSmFudWFyeSAyMDI0Ig0KDQpuYW1lc19lcSA8LSBjKA0KICAiZGF0ZSIsDQogICJnb3Zlcm5vcmF0ZSIsDQogICJkaXN0cmljdCIsDQogICJzdWJfZGlzdHJpY3QiLA0KICAiY29tbXVuaXR5IiwNCiAgImFkbWluNHBjb2RlIiwNCiAgImNhc3VhbHRpZXMiLA0KICAiaW5qdXJpZXMiLA0KICAiY29tcGxldGVseV9kZXN0cm95ZWRfaG91c2VzIiwNCiAgImRhbWFnZWRfdW5paGFiaXRhYmxlX2hvdXNlcyIsDQogICJ0ZW1wb3JhcnlfYWNjb21tb2RhdGlvbl9jZW50cmVzIiwNCiAgImlkcHNfaW5fYWxsX2NlbnRyZXMiLA0KICAic2Nob29sc19hc19hY2NvbW9kYXRpb25fY2VudHJlcyIsDQogICJpZHBzX2luX3NjaG9vbHMiLA0KICAidGVudHNfbmVlZGVkIiwNCiAgImJsYW5rZXRzX21hdHRyZXNzZXNfbmVlZGVkIiwNCiAgInRlbXBvcmFyeV9hY2NvbW1vZGF0aW9uX2NlbnRyZXNfYXZhaWxhYmxlIiwgDQogICJhY2Nlc3NpYmxlX2NpdmlsX2RlZmVuc2UiLA0KICAibGF0cmluZXNfYXZhaWxhYmxlIiwNCiAgIm1lYWxzX25lZWRlZF9wZXJfZGF5IiwNCiAgIm5lZWRfYmxvb2RfZG9uYXRpb25zIiwNCiAgImhlYWx0aF9zZXJ2aWNlc19hdmFpbGFibGUiLA0KICAibmVjZXNzYXJ5X21lZGljYWxfZXF1aXBtZW50IiwNCiAgInJ1YmJsZV92b2x1bnRlZXJzIiwNCiAgInRlbGVjb21zX2F2YWlsYWJsZSIsDQogICJlbGVjdHJpY2l0eV9hdmFpbGFibGUiLCANCiAgImhlYXRpbmdfZnVlbF9uZWVkZWQiDQopDQoNCmVxIDwtIHJlYWRfZXhjZWwoIi4vZGF0YS9zeXJpYS1lYXJ0aHF1YWtlLWltcGFjdC0yMC1tYXJjaC0yMDIzLnhsc3giLA0KICAgICAgICAgICAgICAgICBzaGVldCA9ICJEQVRBU0VUIikgJT4lIA0KICBzZXROYW1lcyhuYW1lc19lcSkgJT4lIA0KICAgIGxlZnRfam9pbihsb2NhdGlvbnMgJT4lIHNlbGVjdChhZG1pbjRwY29kZSwgYWRtaW4zcGNvZGUpLCANCiAgICAgICAgICAgIGJ5ID0gYygiYWRtaW40cGNvZGUiID0gImFkbWluNHBjb2RlIikpICU+JSANCiAgICAgIG11dGF0ZSh3b3VuZGVkX2RlYWQgPSBjYXN1YWx0aWVzICsgaW5qdXJpZXMsDQogICAgICAgICAgICAgZGFtYWdlZF9ob3VzZXMgPSBjb21wbGV0ZWx5X2Rlc3Ryb3llZF9ob3VzZXMgKyBkYW1hZ2VkX3VuaWhhYml0YWJsZV9ob3VzZXMpICU+JSANCiAgICAgICAgZ3JvdXBfYnkoYWRtaW4zcGNvZGUpICU+JSANCiAgICAgICAgICBzdW1tYXJpc2Uod291bmRlZF9kZWFkID0gc3VtKHdvdW5kZWRfZGVhZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgZGFtYWdlZF9ob3VzZXMgPSBzdW0oZGFtYWdlZF9ob3VzZXMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgICAgICAgICAgIGxlZnRfam9pbihyZWFkX2V4Y2VsKCIuL2RhdGEvMjAyM0hOT19QaU5fU2V2ZXJpdHlfZGV0YWlsZWRBb0lfRk9SU0hBUkUgMTUwMzIwMjMueGxzeCIsIHNraXAgPSAxLCANCiAgICAgICAgICAgIHNoZWV0ID0gMSkgJT4lDQogICAgICAgICAgICAgIGNsZWFuX25hbWVzKCkgJT4lDQogICAgICAgICAgICAgICAgc2VsZWN0KGFkbWluM3Bjb2RlLCB0b3RhbF9wb3B1bGF0aW9uLCBhb2MgPSBhb19jKSwgDQogICAgICAgICAgICAgICAgYnkgPSAiYWRtaW4zcGNvZGUiKSAlPiUgDQogICAgICAgICAgICAgICAgICBtdXRhdGUod291bmRlZF9kZWFkXzEwMGsgPSB3b3VuZGVkX2RlYWQgLyB0b3RhbF9wb3B1bGF0aW9uICogMTAwMDAwLCANCiAgICAgICAgICAgICAgICAgIGRhbWFnZWRfaG91c2VzXzEwMGsgPSBkYW1hZ2VkX2hvdXNlcyAvIHRvdGFsX3BvcHVsYXRpb24gKiAxMDAwMDApDQoNCg0KZXFfbWRlcHJpdiA8LSBlcSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMod291bmRlZF9kZWFkLCBkYW1hZ2VkX2hvdXNlcywgDQogICAgICAgICAgICAgICAgIHdvdW5kZWRfZGVhZF8xMDBrLCBkYW1hZ2VkX2hvdXNlc18xMDBrKSwgfiByYW5nZV93bmEoLikpICU+JSANCiAgICBtZGVwcml2KGMoIndvdW5kZWRfZGVhZCIsICJkYW1hZ2VkX2hvdXNlcyIsIA0KICAgICAgICAgICAgIndvdW5kZWRfZGVhZF8xMDBrIiwgImRhbWFnZWRfaG91c2VzXzEwMGsiKSwgDQogICAgICAgICAgbWV0aG9kID0gImN6Iiwgb3V0cHV0ID0gImFsbCIsIA0KICAgICAgICAgIHNjb3JlX2lfaGVhZGluZyA9ICJlcV9zY29yZSIpDQoNCmVxIDwtIGVxICU+JSANCiAgbGVmdF9qb2luKGVxX21kZXByaXYkZGF0YSAlPiUgDQogICAgc2VsZWN0KGFkbWluM3Bjb2RlLCBlcV9zY29yZSksIA0KICAgIGJ5ID0gImFkbWluM3Bjb2RlIikNCg0KY2JyIDwtIHJlYWRfY3N2KCIuL2RhdGEvY2JyX2NvbS5jc3YiKSAlPiUgDQogICAgICAgIGZpbHRlcihzdHJfZGV0ZWN0KGNsdXN0ZXIsICJNdWx0aXB1cnBvc2UiKSkgJT4lIA0KICAgICAgICAgIG11dGF0ZShtb250aCA9IG1vbnRoKGVuZF9kYXRlKSkgJT4lIA0KICAgICAgICAgICAgcmVwbGFjZV9uYShsaXN0KGJlbmVmaWNpYXJpZXMgPSAwKSkgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUoZ292ZXJub3JhdGUgPSByZWNvZGUoZ292ZXJub3JhdGUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsZXBwbyIgPSAiQWxlcHBvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUxFUFBPIiA9ICJBbGVwcG8iKSwgDQogICAgICAgICAgICAgIGRpc3RyaWN0ID0gcmVjb2RlKGRpc3RyaWN0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkphYmFsIFNhbW1hbiIgPSAiSmViZWwgU2FtYW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF6YXoiID0gIkEnemF6IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXJhYmx1cyIgPSAiSmFyYWJsdXMiKSwgDQogICAgICAgICAgICAgIHN1Yl9kaXN0cmljdCA9IHJlY29kZShzdWJfZGlzdHJpY3QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF6YXoiID0gIkEnemF6IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamFyYWJsdXMiID0gIkphcmFibHVzIiksIA0KICAgICAgICAgICAgICBwcmV2aW91c2x5X2Fzc2lzdGVkID0gaWZlbHNlKGFkbWluMXBjb2RlICVpbiUgYygiU1kxMSIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c2x5X2Fzc2lzdGVkKSkgJT4lIA0KICAgICAgICAgICAgICAgIGZpbHRlcihhZG1pbjFwY29kZSAhPSAiU1kwOSIpDQogDQogIA0KDQpobm8gPC0gcmVhZF9leGNlbCgiLi9kYXRhLzIwMjNITk9fUGlOX1NldmVyaXR5X2RldGFpbGVkQW9JX0ZPUlNIQVJFIDE1MDMyMDIzLnhsc3giLCBza2lwID0gMSwgDQogICAgICAgICAgICAgICAgICBzaGVldCA9IDEpICU+JQ0KICBjbGVhbl9uYW1lcygpDQoNCg0KbndfcGNvZGUzIDwtIGhubyAlPiUgDQogIGZpbHRlcihhb19jID09ICJOVyIpICU+JSANCiAgICBwdWxsKGFkbWluM3Bjb2RlKQ0KDQpzdW1fc3RhdHMgPC0gY2JyICAlPiUgDQogIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lDQogICAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lciksIA0KICAgIGNvbW11bml0aWVzID0gbl9kaXN0aW5jdChhZG1pbjRwY29kZSksIA0KICAgIGhvdXNlaG9sZHMgPSBzdW0oZmFtaWxpZXNbcHJldmlvdXNseV9hc3Npc3RlZCA9PSAiTm8iXSwgbmEucm0gPSBUUlVFKSwgDQogICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzW3ByZXZpb3VzbHlfYXNzaXN0ZWQgPT0gIk5vIl0sIG5hLnJtID0gVFJVRSksIA0KICAgIHN1Yl9kaXN0cmljdHMgPSBuX2Rpc3RpbmN0KGFkbWluM3Bjb2RlKSwgDQogICAgdG90YWxfdXNkID0gc3VtKHRvdGFsX3VzZCwgbmEucm0gPSBUUlVFKSwgDQogICAgLmdyb3VwcyA9ICJkcm9wIikNCg0KYGBgDQoNCg0KDQo8YnI+PGJyPjxicj4NCg0KIyAxLiBNUEMgcmVzcG9uc2Ugb3ZlcnZpZXcNCg0KDQpBcyBvZiAqKmByIHJlcG9ydF9kYXRlYCoqLCBhIHRvdGFsIG9mICoqYHIgc3VtX3N0YXRzICU+JSBwdWxsKGJlbmVmaWNpYXJpZXMpICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCoqIHBlcnNvbnMgb3IgKipgciBzdW1fc3RhdHMgJT4lIHB1bGwoaG91c2Vob2xkcykgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgKiogZmFtaWxpZXMgaGF2ZSBiZWVuIHJlYWNoZWQgYnkgTVBDIGludGVydmVudGlvbnMuIA0KDQpBIHRvdGFsIG9mIFVTRCAqKmByIHBhc3RlKGZvcm1hdChyb3VuZCgoc3VtX3N0YXRzICU+JSBwdWxsKHRvdGFsX3VzZCkpIC8gMTAwMDAwMCwgMSksIHRyaW0gPSBUUlVFKSwgIm1pbGxpb24iKWAqKiBoYXMgYmVlbiBkaXNidXJzZWQgYnkgKipgciBzdW1fc3RhdHMgJT4lIHB1bGwocGFydG5lcnMpYCoqIGltcGxlbWVudGluZyBhZ2VuY2llcyBpbiAqKmByIHN1bV9zdGF0cyAlPiUgcHVsbChjb21tdW5pdGllcylgKiogY29tbXVuaXRpZXMgYWNyb3NzICoqYHIgc3VtX3N0YXRzICU+JSBwdWxsKHN1Yl9kaXN0cmljdHMpYCoqIHN1Yi1kaXN0cmljdHMuIA0KDQoqT25seSBiZW5lZmljaWFyaWVzIHdobyBoYXZlIHJlY2VpdmVkIGF0IGxlYXN0IFVTRCAxMDAvZmFtaWx5L21vbnRoIGhhdmUgYmVlbiBpbmNsdWRlZDsgZXhjbHVkZXMgc2VjdG9yLWJhc2VkIGFjdGl2aXRpZXMgc3VjaCBhcyBub24tTVBDIGNhc2gtZm9yLWZvb2QuKg0KDQoNCjxicj4NCg0KYGBge3Igc3VtbWFyeS10YWJsZX0NCmNiciAgJT4lIA0KICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JQ0KICAgIGdyb3VwX2J5KGdvdmVybm9yYXRlLCBkaXN0cmljdCkgJT4lIA0KICAgICAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lciksIA0KICAgICAgY29tbXVuaXRpZXMgPSBuX2Rpc3RpbmN0KGFkbWluNHBjb2RlKSwgDQogICAgICBob3VzZWhvbGRzID0gc3VtKGZhbWlsaWVzLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllc1twcmV2aW91c2x5X2Fzc2lzdGVkID09ICJObyJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgIHRvdGFsX3VzZCA9IHN1bSh0b3RhbF91c2QsIG5hLnJtID0gVFJVRSksIA0KICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICAgICAgICB1bmdyb3VwKCkgJT4lIA0KICAgICAgICAgIG11dGF0ZShgJV9CTkZgID0gDQogICAgICAgICAgcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpICogMTAwLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICAgdG90YWxfdXNkID0gcm91bmQodG90YWxfdXNkKSkgJT4lDQogICAgICAgICAgICBhZG9ybl90b3RhbHMoInJvdyIsLCwsIGhvdXNlaG9sZHMsIGJlbmVmaWNpYXJpZXMsIHRvdGFsX3VzZCwgYCVfQk5GYCkgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUoYCVfQk5GYCA9IGlmZWxzZShgJV9CTkZgID4gOTkuOTgsIDEwMCwgYCVfQk5GYCkpICU+JSANCiAgICAgICAgICAgICAgICBzZWxlY3QoZ292ZXJub3JhdGUsIGRpc3RyaWN0LCBgY29tbS5gID0gY29tbXVuaXRpZXMsIHBhcnRuZXJzLCANCiAgICAgICAgICAgICAgICBob3VzZWhvbGRzLCBiZW5lZmljaWFyaWVzLCB0b3RhbF91c2QsIGAlX0JORmApICU+JSANCiAgICAgICAgICAgICAgICAgIGZsZXh0YWJsZSgpICU+JSANCiAgICAgICAgICAgICAgICAgICAgc2V0X2NhcHRpb24ocGFzdGUwKA0KICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKHN1bV9zdGF0cyRiZW5lZmljaWFyaWVzLCBkaWdpdHMgPSAtMykgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIiksDQogICAgICAgICAgICAgICAgICAgICAgIiBwZW9wbGUgcmVhY2hlZCB3aXRoIE1QQywgVVNEICIsDQogICAgICAgICAgICAgICAgICAgICAgcGFzdGUoZm9ybWF0KHJvdW5kKChzdW1fc3RhdHMgJT4lIHB1bGwodG90YWxfdXNkKSkgLyAxMDAwMDAwLCAxKSwgdHJpbSA9IFRSVUUpLCAibWlsbGlvbiIpLCANCiAgICAgICAgICAgICAgICAgICAgICAiIGRpc2J1cnNlZCwgIiwgDQogICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2RhdGUpKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICB0aGVtZV96ZWJyYSgpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9vdG5vdGUoaSA9IDEsIGogPSA4LCBwYXJ0ID0gImhlYWRlciIsIHJlZl9zeW1ib2xzID0gIjEiLCAgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGFzX3BhcmFncmFwaCgiQXMgcGVyY2VudGFnZSBvZiBhbGwgTVBDIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpbiBOVyBTeXJpYSIpKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IDEpDQoNCg0KYGBgDQoNCmBgYHtyIHN1bW1hcnktdGFibGUtcHJpbnQsIGV2YWw9RkFMU0V9DQpjYnIgICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUNCiAgICBncm91cF9ieShnb3Zlcm5vcmF0ZSwgZGlzdHJpY3QpICU+JSANCiAgICAgIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpLCANCiAgICAgIGNvbW11bml0aWVzID0gbl9kaXN0aW5jdChhZG1pbjRwY29kZSksIA0KICAgICAgaG91c2Vob2xkcyA9IHN1bShmYW1pbGllcywgbmEucm0gPSBUUlVFKSwgDQogICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXNbcHJldmlvdXNseV9hc3Npc3RlZCA9PSAiTm8iXSwgbmEucm0gPSBUUlVFKSwgDQogICAgICB0b3RhbF91c2QgPSBzdW0odG90YWxfdXNkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgICAgICAgdW5ncm91cCgpICU+JSANCiAgICAgICAgICBtdXRhdGUoYCVfQk5GYCA9IA0KICAgICAgICAgICByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSkgKiAxMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgICAgdG90YWxfdXNkID0gcm91bmQodG90YWxfdXNkKSkgJT4lDQogICAgICAgICAgICBhZG9ybl90b3RhbHMoInJvdyIsLCwsIGhvdXNlaG9sZHMsIGJlbmVmaWNpYXJpZXMsIHRvdGFsX3VzZCwgYCVfQk5GYCkgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUoYCVfQk5GYCA9IGlmZWxzZShgJV9CTkZgID4gOTkuOTgsIDEwMCwgYCVfQk5GYCkpICU+JSANCiAgICAgICAgICAgICAgICBzZWxlY3QoZ292ZXJub3JhdGUsIGRpc3RyaWN0LCBgY29tbS5gID0gY29tbXVuaXRpZXMsIHBhcnRuZXJzLCANCiAgICAgICAgICAgICAgICBob3VzZWhvbGRzLCBiZW5lZmljaWFyaWVzLCB0b3RhbF91c2QsIGAlX0JORmApICU+JSANCiAgICAgICAgICAgICAgICAgIGZsZXh0YWJsZSgpICU+JSANCiAgICAgICAgICAgICAgICAgICAgc2V0X2NhcHRpb24ocGFzdGUwKA0KICAgICAgICAgICAgICAgICAgICByb3VuZChzdW1fc3RhdHMkYmVuZWZpY2lhcmllcywgZGlnaXRzID0gLTMpICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpLA0KICAgICAgICAgICAgICAgICAgICAiIHBlb3BsZSByZWFjaGVkIHdpdGggTVBDLCBVU0QgIiwNCiAgICAgICAgICAgICAgICAgICAgcGFzdGUoZm9ybWF0KHJvdW5kKChzdW1fc3RhdHMgJT4lIHB1bGwodG90YWxfdXNkKSkgLyAxMDAwMDAwLCAxKSwgdHJpbSA9IFRSVUUpLCAibWlsbGlvbiIpLCANCiAgICAgICAgICAgICAgICAgICAgIiBkaXNidXJzZWQsICIsIA0KICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0ZSkpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICB0aGVtZV96ZWJyYSgpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICBmb290bm90ZShpID0gMSwgaiA9IDgsIHBhcnQgPSAiaGVhZGVyIiwgcmVmX3N5bWJvbHMgPSAiMSIsICANCiAgICAgICAgICAgICAgICAgICAgICAgICBhc19wYXJhZ3JhcGgoIkFzIHBlcmNlbnRhZ2Ugb2YgYWxsIE1QQyBiZW5lZmljaWFyaWVzIHJlYWNoZWQgaW4gTlcgU3lyaWEiKSkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gMSkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVfYXNfaW1hZ2UocGF0aCA9ICIuL2ltZy9zdW1tYXJ5X3RhYmxlLnBuZyIpDQpgYGANCg0KDQoNCjxicj4NCg0KSW4gRmVicnVhcnkgMjAyMywgYHIgZmlsdGVyKGNiciwgbW9udGggPT0gMiAmIHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBiZW5lZmljaWFyeSBmcmVxdWVuY2llcyB3ZXJlIHJlYWNoZWQsIGFuZCBpbiBNYXJjaCAyMDIzIHRoZSBudW1iZXIgaW5jcmVhc2VkIHRvIGByIGZpbHRlcihjYnIsIG1vbnRoID09IDMgJiBwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAuIEluIEFwcmlsIDIwMjMgYHIgZmlsdGVyKGNiciwgbW9udGggPT0gNCAmIHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIHJlYWNoZWQuIEFzIG9mIE1heSAyMDIzLCBgciBmaWx0ZXIoY2JyLCBtb250aCA9PSA1ICYgcHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGJlbmVmaWNpYXJpZXMgaGF2ZSBiZWVuIHJlYWNoZWQsIGZvbGxvd2VkIGJ5IGByIGZpbHRlcihjYnIsIG1vbnRoID09IDYgJiBwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgaW4gSnVuZSwgd2l0aCBgciBmaWx0ZXIoY2JyLCBtb250aCA9PSA3ICYgcHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGluIEp1bHkgMjAyMyB3aXRoIGByIGZpbHRlcihjYnIsIG1vbnRoID09IDggJiBwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgaW4gQXVndXN0IDIwMjMsIHdpdGggYHIgZmlsdGVyKGNiciwgbW9udGggPT0gOSAmIHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBpbiBTZXB0ZW1iZXIgMjAyMywgd2hpbGUgaW4gT2N0b2JlciAyMDIzIGByIGZpbHRlcihjYnIsIG1vbnRoID09IDEwICYgcHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgLCB3aXRoIGByIGZpbHRlcihjYnIsIG1vbnRoID09IDExICYgcHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGluIE5vdmVtYmVyIDIwMjMsIHdpdGggYHIgZmlsdGVyKGNiciwgbW9udGggPT0gMTIgJiBwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgaW4gRGVjZW1iZXIgMjAyMywgYW5kIGByIGZpbHRlcihjYnIsIG1vbnRoID09IDAxICYgcHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGluIEphbnVhcnkgMjAyNC4NCg0KDQoNCipUaGlzIGRvY3VtZW50IGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBiZW5lZmljaWFyaWVzLCBvciB1bmlxdWUgaW5kaXZpZHVhbHMgcmVhY2hlZCwgYW5kIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzLCBvciB0aGUgbnVtYmVyIG9mIHRpbWVzIHBlb3BsZSBoYXZlIGJlZW4gcmVhY2hlZCwgaW5jbHVzaXZlIG9mIGRvdWJsZSBjb3VudGluZy4qDQoNCiAgDQpgYGB7ciBldmFsPUZBTFNFfQ0KY2JyICU+JSANCiAgbXV0YXRlKGVuZF9kYXRlID0gYXMuRGF0ZShlbmRfZGF0ZSkpICU+JSANCiAgICBmaWx0ZXIoZW5kX2RhdGUgPT0gIjAwMjItMDEtMjAiKSAlPiUgDQogICAgICB7c3VtKC4kYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKX0NCg0KYGBgDQoNCg0KPGJyPjxicj4NCg0KIyMgMS4xIFByb2dyZXNzIGJ5IGRhdGUNCg0KDQpgYGB7ciBwcm9ncmVzcy1saW5lLCBmaWcuaGVpZ2h0PTZ9DQogICMgVGhpcyBpcyB0aGUgbWVzc2llc3QgY2h1bmsgaW4gdGhlIHdob2xlIGRvY3VtZW50LiBjb3VsZCBpdCBiZSBmaXhlZD8gDQoNCnByb2dyZXNzX21heF9kYXRlIDwtICIyMDI0LTAxLTE1Ig0KDQpwcm9ncmVzc19saW5lIDwtIGNiciAlPiUNCiAgZmlsdGVyKCFpcy5uYShlbmRfZGF0ZSkpICU+JSANCiAgICBtdXRhdGUoZW5kX2RhdGUgPSBhbnlkYXRlKGVuZF9kYXRlKSkgJT4lIA0KICAgICAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiICYgDQogICAgICAgIHByZXZpb3VzbHlfYXNzaXN0ZWQgPT0gIk5vIikgJT4lIA0KICAgICAgICAgIGdyb3VwX2J5KGVuZF9kYXRlKSAlPiUgDQogICAgICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lDQogICAgICAgICAgICAgIGFycmFuZ2UoZW5kX2RhdGUpICU+JSANCiAgICAgICAgICAgICAgICBmaWx0ZXIoZW5kX2RhdGUgID4gIjIwMjItMTItMzAiICYgZW5kX2RhdGUgPCBwcm9ncmVzc19tYXhfZGF0ZSkgJT4lICANCiAgICAgICAgICAgICAgICAgICAgbXV0YXRlKGN1bV9iZW4gPSBjdW1zdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgIyBTcGFjZWQgYXQgcm91Z2hseSBldmVyeSAxNSBkYXlzLCBBbHRob3VnaCBzb21lIGRheXMgZG8gbm90IGhhdmUgZGlzdHJpYnV0aW9ucyANCiAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoY3VtX2xhYmVsID0gaWZlbHNlKGVuZF9kYXRlID09ICIyMDIzLTAyLTEwInwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfZGF0ZSA9PSAiMjAyMy0wMy0xMSJ8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfZGF0ZSA9PSAiMjAyMy0wMy0zMCJ8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kX2RhdGUgPT0gIjIwMjMtMDMtMzAifA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX2RhdGUgPT0gIjIwMjMtMDQtMTUifA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZF9kYXRlID09ICIyMDIzLTA0LTMwInwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9kYXRlID09ICIyMDIzLTA1LTE1InwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9kYXRlID09ICIyMDIzLTA2LTE1InwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRfZGF0ZSA9PSAiMjAyMy0wNi0zMCJ8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfZGF0ZSA9PSAiMjAyMy0wNy0xOCJ8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kX2RhdGUgPT0gIjIwMjMtMDctMzEifA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX2RhdGUgPT0gIjIwMjMtMDgtMTUifA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZF9kYXRlID09ICIyMDIzLTA4LTMwInwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9kYXRlID09ICIyMDIzLTA5LTE0InwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRfZGF0ZSA9PSAiMjAyMy0wOS0zMCJ8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfZGF0ZSA9PSAiMjAyMy0xMC0xNSJ8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kX2RhdGUgPT0gIjIwMjMtMTAtMzEifA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX2RhdGUgPT0gIjIwMjMtMTEtMTUifA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZF9kYXRlID09ICIyMDIzLTExLTMwInwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9kYXRlID09ICIyMDIzLTEyLTE1InwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRfZGF0ZSA9PSAiMjAyMy0xMi0zMSJ8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfZGF0ZSA9PSAiMjAyNC0wMS0xNSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW1fYmVuLCAiIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VtX2xhYmVsID0gYXMubnVtZXJpYyhjdW1fbGFiZWwpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9kYXRlID0gYW55ZGF0ZShlbmRfZGF0ZSkpIA0KDQpwcm9ncmVzc19saW5lICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZW5kX2RhdGUsIHkgPSBjdW1fYmVuKSkgKyANCiAgZ2VvbV9saW5lKGNvbG91ciA9ICJibHVlIikgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlczo6Y29tbWEoY3VtX2xhYmVsKSksIHZqdXN0ID0gLTEsIA0KICAgICAgICAgICAgc2l6ZSA9IDQpICsgDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIiwgZGF0ZV9sYWJlbHMgPSAiJWIiKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSwgZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSAuMSkpICsgDQogIGxhYnMoeCA9ICJEaXN0cmlidXRpb24gZGF0ZSIsIA0KICAgICAgIHkgPSAiQ3VtdWxhdGl2ZSBiZW5lZmljaWFyaWVzIiwgDQogICAgICAgdGl0bGUgPSAiTVBDIHByb2dyZXNzIGJ5IGRhdGUiLCANCiAgIyBXZSBjYW4gcHJvYmFibHkgYWx0ZXIgdGhlIHN1YnRpdGxlIHNvb25lciBvZiBsYXRlciwgc2luY2UgZWFydGhxdWFrZSByZXBvcnRpbmcgaXMgYmVjb21pbmcgbGVzcyBhbmQgbGVzcyBpbXBvcnRhbnQgDQogICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoIlRoZSBlYXJsaWVzdCBlYXJ0aHF1YWtlLXJlbGF0ZWQgZGlzdHJpYnV0aW9uIHdhcyAwOSBGZWIgMjAyM1xuRXhjbHVkZXMgIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdChzdW1fc3RhdHMgJT4lIHB1bGwoYmVuZWZpY2lhcmllcykgLSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwcm9ncmVzc19saW5lJGN1bV9sYWJlbCwgbmEucm0gPSBUUlVFKSwgYmlnLm1hcmsgPSAiLCIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAiIGJlbmVmaWNpYXJpZXMgZm9yIHdoaWNoIGFjdGl2aXR5IGVuZCBkYXRlIHdhcyBhZnRlciAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfZGF0ZSkpDQogICAgICAgICANCmdnc2F2ZSgiLi9pbWcvcHJvZ3Jlc3NfbGluZS5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDguMjcsIHdpZHRoID0gMTEuNjksIHVuaXRzID0gImluIikgIA0KYGBgDQoNCjxicj4NCg0KVGhlIHNtYWxsIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgZWFybGllciB0aGFuIEZlYnJ1YXJ5IGFsbCBwZXJ0YWluZWQgdG8gdGhlIEhSUCwgdGhlIG9ubHkgc3VjaCBiZW5lZmljaWFyaWVzIHJlcG9ydGVkIHNvIGZhci4gVGhlIENXRyB3b3VsZCBsaWtlIHRvIGVuY291cmFnZSBwYXJ0bmVycyB0byByZXBvcnQgb24gdGhlaXIgSmFudWFyeSBhY2hpZXZlbWVudHMuDQoNCjxicj48YnI+DQoNCiMgMi4gTWFwIG9mIGFjdGl2aXRpZXMNCg0KPGJyPg0KDQoNCg0KYGBge3IgcGxvdGx5LXBsYW5uZWQtaW1wbGVtZW50ZWQtbWFwLCBmaWcuaGVpZ2h0PTd9DQoNCnBsYW5uZWRfaW1wbGVtZW50ZWRfbWFwIDwtIGNiciAlPiUgDQogIG11dGF0ZShwcm9qZWN0X3N0YXR1cyA9IHJlY29kZShwcm9qZWN0X3N0YXR1cywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT25nb2luZyIgPSAiQ29tcGxldGVkIikpICU+JSANCiAgICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgDQogICAgYnkgPSBjKCJhZG1pbjNwY29kZSIgPSAiQURNM19QQ09ERSIpKSAlPiUgDQogICAgICBmaWx0ZXIoQURNMV9QQ09ERSAlaW4lIGMoIlNZMDIiLCAiU1kwNyIsICJTWTExIikgJiAhaXMubmEoYmVuZWZpY2lhcmllcykpICU+JSANCiAgICAgICAgc3RfYXNfc2YoKSAlPiUNCiAgICAgICAgICBnZ3Bsb3QoKSArIA0KICAgICAgICAgIGdlb21fc2Yoc2l6ZSA9IC4xLCBjb2xvdXIgPSAiZ3JleTcwIikgKyANCiAgICAgICAgICBnZW9tX3BvaW50KGFlcyhzaXplID0gYmVuZWZpY2lhcmllcywNCiAgICAgICAgICAgICAgICAgY29sb3VyID0gcHJvamVjdF9zdGF0dXMsIA0KICAgICAgICAgICAgICAgICB4ID0gbG9uZ2l0dWRlX3gsIHkgPSBsYXRpdHVkZV95LCANCiAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMCgic3ViX2Rpc3RyaWN0OiAiLCBzdWJfZGlzdHJpY3QsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW11bml0eTogIiwgY29tbXVuaXR5LCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2NhdGlvbl90eXBlOiAiLCB2aWxsYWdlX2NhbXBzLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZW5lZmljaWFyaWVzOiIsIGZvcm1hdChiZW5lZmljaWFyaWVzLCBiaWcubWFyayA9ICIsIiksICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnRuZXI6ICIsIGFiYnJldmlhdGlvbiwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvbl94OiAiLCBsb25naXR1ZGVfeCwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGF0X3k6ICIsIGxhdGl0dWRlX3kpKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gMjEsIHN0cm9rZSA9IC4zNSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gLjUpICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX3NpemVfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfY29sb3VyX3ZpcmlkaXNfZChuYS50cmFuc2xhdGUgPSBGQUxTRSkgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWVfdm9pZCgpICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gTkEpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFicyh0aXRsZSA9ICJDb21tdW5pdGllcyByZWFjaGVkIGFuZCBwbGFubmVkIC0tIENXRyBwYXJ0bmVycyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJQbGFubmVkIGluIHllbGxvdywgY29tcGxldGVkIGluIHB1cnBsZSwgc2l6ZSBzaG93cyBudW1iZXIgb2YgcGVyc29ucyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiU3RhdHVzIikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZXMoc2l6ZSA9ICJub25lIikNCg0KICANCmdncGxvdGx5KHBsYW5uZWRfaW1wbGVtZW50ZWRfbWFwLCB0b29sdGlwID0gYygidGV4dCIpKSAlPiUgDQogIHBsb3RseTo6c3R5bGUoaG92ZXJvbiA9ICJwb2ludCIpICU+JSANCiAgICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoIkNvbW11bml0aWVzIHJlYWNoZWQgYW5kIHBsYW5uZWQgLS0gQ1dHIHBhcnRuZXJzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxhbm5lZCBpbiBncmVlbiwgY29tcGxldGVkIGluIHB1cnBsZSwgc2l6ZSBzaG93cyBudW1iZXIgb2YgcGVyc29uczsgY2xpY2sgYW5kIGRyYWcgdG8gem9vbTsgbW91c2Ugb3ZlciBmb3IgZGV0YWlscyIpKSkNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIDMuIEdlb2dyYXBoaWMgYnJlYWtkb3duIG9mIGJlbmVmaWNpYXJpZXMNCg0KQ292ZXJhZ2UgY29udGludWVzIHRvIGJlIGhpZ2hlc3QgaW4gQWZyaW4gYW5kIEhhcmltIGRpc3RyaWN0cywgd2hlcmUgdGhlIGhpZ2hlc3QgbnVtYmVycyBvZiBkYW1hZ2VkIGhvdXNlcyBhbmQgd291bmRlZCBwZW9wbGUgYXJlIGxvY2F0ZWQgKHRob3VnaCB0aGVzZSBhcmVhcyBkbyBub3QgbmVjZXNzYXJpbHkgaGF2ZSB0aGUgaGlnaGVzdCBwcm9wb3J0aW9ucyBvZiBkYW1hZ2UpLiANCg0KPGJyPg0KDQoNCmBgYHtyIG1wYy1ieS1kaXN0cmljdCwgd2FybmluZyA9IEZBTFNFfQ0KY2JyICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiICYgDQogICAgICAgICBwcmV2aW91c2x5X2Fzc2lzdGVkID09ICJObyIpICU+JSANCiAgICAgICAgICBncm91cF9ieShnb3Zlcm5vcmF0ZSwgZGlzdHJpY3QpICU+JSANCiAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGRpc3RyaWN0ID0gZmN0X3Jlb3JkZXIoZGlzdHJpY3QsIGJlbmVmaWNpYXJpZXMpLA0KICAgICAgICAgICAgICBnb3Zlcm5vcmF0ZSA9IGZjdF9yZWxldmVsKGdvdmVybm9yYXRlLCANCiAgICAgICAgICAgICAgYygiSWRsZWIiLCAiQXItUmFxcWEiLCAiQWxlcHBvIikpDQogICAgICAgICAgICAgICApICU+JSANCiAgICAgICAgICAgICAgICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCB5ID0gZGlzdHJpY3QpKSArIA0KICAgICAgICAgICAgICAgIGdlb21fY29sKGFlcyhmaWxsID0gZ292ZXJub3JhdGUpKSArIA0KICAgICAgICAgICAgICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShiZW5lZmljaWFyaWVzKSksIA0KICAgICAgICAgICAgICAgIGhqdXN0ID0gImlud2FyZCIpICsgDQogICAgICAgICAgICAgICAgc2NhbGVfZmlsbF92aXJpZGlzX2QoYmVnaW4gPSAuMykgKyANCiAgICAgICAgICAgICAgICBsYWJzKHRpdGxlID0gIk1QQyBiZW5lZmljaWFyaWVzIGJ5IGRpc3RyaWN0IiwgDQogICAgICAgICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoImFzIG9mICIsIHJlcG9ydF9kYXRlKSwgDQogICAgICAgICAgICAgICAgeSA9ICIiKSArIA0KICAgICAgICAgICAgICAgIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSB1bml0X2Zvcm1hdCh1bml0ID0gIksiLCBzY2FsZSA9IDFlLTMsIGFjY3VyYWN5ID0gMSkpICsgDQogICAgICAgICAgICAgICAgaG5vICU+JSANCiAgICAgICAgICAgICAgICAgIGZpbHRlcihhZG1pbjJuYW1lX2VuICVpbiUgYygiSGFyaW0iLCAiSWRsZWIiLCAiSmlzci1Bc2gtU2h1Z3VyIiwgIkFyaWhhIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlbGwgQWJpYWQiLCAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFmcmluIiwgIkplYmVsIFNhbWFuIiwgIkEnemF6IiwgIkphcmFibHVzIiwgIkFsIEJhYiIpKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9ieShnb3Zlcm5vcmF0ZSA9IGFkbWluMW5hbWVfZW4sIGRpc3RyaWN0ID0gYWRtaW4ybmFtZV9lbikgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJpc2UodG90YWxfcG9wdWxhdGlvbiA9IHN1bSh0b3RhbF9wb3B1bGF0aW9uLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfam9pbigNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYnIgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIgJiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzbHlfYXNzaXN0ZWQgPT0gIk5vIikgJT4lICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9ieShkaXN0cmljdCkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSkgLCAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gImRpc3RyaWN0IikgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoZGlzdHJpY3QgPSBmY3RfcmVsZXZlbChkaXN0cmljdCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsIEJhYiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKYXJhYmx1cyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBJ3pheiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKZWJlbCBTYW1hbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZnJpbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZWxsIEFiaWFkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJpaGEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSmlzci1Bc2gtU2h1Z3VyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklkbGViIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhhcmltIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNfcmVhY2hlZCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyB0b3RhbF9wb3B1bGF0aW9uICogMTAwLCBkaWdpdHMgPSAxKSkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2dwbG90KGFlcyh4ID0gcGNfcmVhY2hlZCwgeSA9IGRpc3RyaWN0KSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbV9jb2woYWVzKGZpbGwgPSBnb3Zlcm5vcmF0ZSkpICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEocGNfcmVhY2hlZCkpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gImlud2FyZCIpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2ZpbGxfdmlyaWRpc19kKGJlZ2luID0gLjMpICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJzKHRpdGxlID0gIlBlcmNlbnQgb2YgcG9wdWxhdGlvbiByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiYXMgb2YgIiwgcmVwb3J0X2RhdGUpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAiIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gIiUgb2YgcG9wdWxhdGlvbiByZWFjaGVkIikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdF9sYXlvdXQoZ3VpZGVzID0gImNvbGxlY3QiKSAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2dzYXZlKCIuL2ltZy9tcGNfYnlfZGlzdHJpY3QucG5nIiwgZHBpID0gMzAwLCBoZWlnaHQgPSA4LjI3LCB3aWR0aCA9IDExLjY5LCB1bml0cyA9ICJpbiIpICANCg0KYGBgDQoNCjxicj4NCg0KYGBge3IgdGFibGUtZXEtZGFtYWdlfQ0KZXEgJT4lIA0KICBsZWZ0X2pvaW4oaG5vICU+JSANCiAgICBzZWxlY3QoZ292ZXJub3JhdGUgPSBhZG1pbjFuYW1lX2VuLCANCiAgICBkaXN0cmljdCA9IGFkbWluMm5hbWVfZW4sIA0KICAgIHN1Yl9kaXN0cmljdCA9IGFkbWluM25hbWVfZW4sIA0KICAgIGFkbWluM3Bjb2RlKSwgDQogICAgYnkgPSAiYWRtaW4zcGNvZGUiKSAlPiUgDQogICAgICBmaWx0ZXIoYWRtaW4zcGNvZGUgJWluJSBud19wY29kZTMgJiANCiAgICAgIGRpc3RyaWN0ICVpbiUgYygiSGFyaW0iLCAiSWRsZWIiLCAiSmlzci1Bc2gtU2h1Z3VyIiwgIkFyaWhhIiwgDQogICAgICAgICAgICAgICAgICAgICAgIlRlbGwgQWJpYWQiLCAgDQogICAgICAgICAgICAgICAgICAgICAgIkFmcmluIiwgIkplYmVsIFNhbWFuIiwgIkEnemF6IiwgIkphcmFibHVzIiwgIkFsIEJhYiIpKSAlPiUgDQogICAgICAgIGdyb3VwX2J5KGdvdmVybm9yYXRlLCBkaXN0cmljdCkgJT4lIA0KICAgICAgICAgIHN1bW1hcmlzZSh3b3VuZGVkX2RlYWQgPSBzdW0od291bmRlZF9kZWFkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICBkYW1hZ2VkX2hvdXNlcyA9IHN1bShkYW1hZ2VkX2hvdXNlcywgbmEucm0gPSBUUlVFKSkgJT4lIA0KICAgICAgICAgICAgZmlsdGVyKGRpc3RyaWN0ICE9ICJBcmloYSIpICU+JSANCiAgICAgICAgICAgICAgbGVmdF9qb2luKGhubyAlPiUgDQogICAgICAgICAgICAgICAgZmlsdGVyKGFkbWluM3Bjb2RlICVpbiUgbndfcGNvZGUzICYNCiAgICAgICAgICAgICAgICBhZG1pbjJuYW1lX2VuICVpbiUgYygiSGFyaW0iLCAiSWRsZWIiLCAiSmlzci1Bc2gtU2h1Z3VyIiwgIkFyaWhhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVsbCBBYmlhZCIsICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWZyaW4iLCAiSmViZWwgU2FtYW4iLCAiQSd6YXoiLCAiSmFyYWJsdXMiLCAiQWwgQmFiIikpICU+JQ0KICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkoZGlzdHJpY3QgPSBhZG1pbjJuYW1lX2VuKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlKHBvcHVsYXRpb24gPSBzdW0odG90YWxfcG9wdWxhdGlvbiwgbmEucm0gPSBUUlVFKSksIGJ5ID0gImRpc3RyaWN0IikgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh3b3VuZGVkX2RlYWRfMTAwayA9IHJvdW5kKHdvdW5kZWRfZGVhZCAvIHBvcHVsYXRpb24gKiAxMDAwMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGRhbWFnZWRfaG91c2VzXzEwMGsgPSByb3VuZChkYW1hZ2VkX2hvdXNlcyAvIHBvcHVsYXRpb24gKiAxMDAwMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChnb3Zlcm5vcmF0ZSwgZGlzdHJpY3QsIHdvdW5kZWRfZGVhZCwgd291bmRlZF9kZWFkXzEwMGssIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBkYW1hZ2VkX2hvdXNlcywgZGFtYWdlZF9ob3VzZXNfMTAwaykgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsZXh0YWJsZSgpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lX3plYnJhKCkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2NhcHRpb24oIkNhc3VhbHRpZXMgYW5kIGRhbWFnZWQgaG91c2VzLCBhYnNvbHV0ZSBmaWd1cmVzIGFuZCBwZXIgMTAwLDAwMCBwZXJzb25zIikgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9vdG5vdGUocGFydCA9ICJoZWFkZXIiLCBpID0gMSwgaiA9IDM6NiwgaW5saW5lID0gVFJVRSwgcmVmX3N5bWJvbHMgPSAiMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGFzX3BhcmFncmFwaCgiRGF0YSBmcm9tIHRoZSBBc3Npc3RhbmNlIENvb3JkaW5hdGlvbiBVbml0LCBTeXJpYSAyMDIzMDMyOCIpKQ0KYGBgDQoNCjxicj4NCg0KQmVsb3cgaXMgYSBicmVha2Rvd24gb2YgYmVuZWZpY2lhcmllcyBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgb3JpZ2luYXRlIGZyb20gY2FtcHMgb3IgdmlsbGFnZXMuIFRoZSBtYWpvcml0eSBvZiBNUEMgYmVuZWZpY2lhcmllcyBhcmUgZnJvbSB2aWxsYWdlcy4gIA0KDQo8YnI+DQoNCmBgYHtyIHRhYmxlLWNhbXBzLXZpbGxhZ2VzfQ0KY2JyICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiICYgcHJldmlvdXNseV9hc3Npc3RlZCA9PSAiTm8iKSAlPiUgDQogICAgbXV0YXRlKHZpbGxhZ2VfY2FtcHMgPSBpZmVsc2UodmlsbGFnZV9jYW1wcyAlaW4lIGMoImNhbXAiLCAidmlsbGFnZSIpIHwgaXMubmEodmlsbGFnZV9jYW1wcyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpbGxhZ2VfY2FtcHMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW1wIikpICU+JSANCiAgICAgIGdyb3VwX2J5KHZpbGxhZ2VfY2FtcHMpICU+JSANCiAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgICAgICAgICByZXBsYWNlX25hKGxpc3QodmlsbGFnZV9jYW1wcyA9ICJOQSIpKSAlPiUgDQogICAgICAgICAgICBtdXRhdGUoYCVfYmVuZWZpY2lhcmllc2AgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICAgICAgICAgICAgICBmbGV4dGFibGUoKSAlPiUgDQogICAgICAgICAgICAgICAgc2V0X2NhcHRpb24oIk1vcmUgdGhhbiB0d2ljZSBhcyBtYW55IGJlbmVmaWNpYXJpZXMgZnJvbSB2aWxsYWdlcyBhcyBmcm9tIGNhbXBzIikgJT4lIA0KICAgICAgICAgICAgICAgICAgdGhlbWVfemVicmEoKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC42KQ0KICANCmBgYA0KDQoNCjxicj48YnI+PGJyPg0KDQojIyMgMy4xIEJ5IHN1Yi1kaXN0cmljdA0KDQpgYGB7ciBkZi1wYy1yZWFjaGVkfQ0KYXZnX3BjX3JlYWNoZWQgPC0gY2JyICU+JSANCiAgbXV0YXRlKHN1Yl9kaXN0cmljdCA9IHJlY29kZShzdWJfZGlzdHJpY3QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYWxxaW4iID0gIlNhbHFpbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnJpbiIgPSAiQWZyaW4iKSkgJT4lDQogICAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiICYgDQogICAgICAgICAgIHByZXZpb3VzbHlfYXNzaXN0ZWQgPT0gIk5vIikgJT4lDQogICAgICBmaWx0ZXIoIWlzLm5hKGFkbWluM3Bjb2RlKSkgJT4lIA0KICAgICAgICBncm91cF9ieShzdWJfZGlzdHJpY3QsIGFkbWluM3Bjb2RlLCBnb3Zlcm5vcmF0ZSkgJT4lDQogICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogICAgICAgICAgICBsZWZ0X2pvaW4oaG5vICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKGFkbWluMm5hbWVfZW4gJWluJSBjKCJIYXJpbSIsICJJZGxlYiIsICJKaXNyLUFzaC1TaHVndXIiLCAiQXJpaGEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZWxsIEFiaWFkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWZyaW4iLCAiSmViZWwgU2FtYW4iLCAiQSd6YXoiLCAiSmFyYWJsdXMiLCAiQWwgQmFiIikpICU+JQ0KICAgICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluMW5hbWVfZW4sIGFkbWluM3Bjb2RlKSAlPiUNCiAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZSh0b3RhbF9wb3B1bGF0aW9uID0gc3VtKHRvdGFsX3BvcHVsYXRpb24sIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gImFkbWluM3Bjb2RlIikgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlKHRvdGFsX3BvcHVsYXRpb24gPSBzdW0odG90YWxfcG9wdWxhdGlvbiwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSkpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoYXZnX3BjX3JlYWNoZWQgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gdG90YWxfcG9wdWxhdGlvbiAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWxsKGF2Z19wY19yZWFjaGVkKQ0KYGBgDQoNCg0KVGhlIHBsb3RzIGJlbG93IHNob3cgdGhlIGJyZWFrZG93biBvZiBiZW5lZmljaWFyaWVzIGJ5IHN1Yi1kaXN0cmljdC4gQ2F1dGlvbiBtdXN0IGJlIHRha2VuIHRvIGVuc3VyZSB0aGF0IGFsbG9jYXRpb25zIGFyZSBmYWlyIGFjcm9zcyB0aGUgYWZmZWN0ZWQgYXJlYXM6IHRoZXJlIGFyZSBudW1lcm91cyBzdWItZGlzdHJpY3RzIHdoZXJlIGEgdmVyeSBsYXJnZSBwcm9wb3J0aW9uIG9mIHRoZSB0b3RhbCBwb3B1bGF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVhY2hlZCBieSBtdWx0aXB1cnBvc2UgY2FzaCwgaW4gcGFydGljdWxhciwgSmFuZGFpcmlzLCBIYXJpbSwgU2FscWluIGFuZCBTaGFyYW4uIA0KDQpSZXNwb25zZSBhY3Rpdml0aWVzIG11c3QgYmUgcHJvcG9ydGlvbmFsIHdpdGggdGhlIG1hZ25pdHVkZSBhbmQgc2V2ZXJpdHkgb2YgZWFydGhxdWFrZSBkYW1hZ2UuIE92ZXIgYWxsb2NhdGlvbiBkZXByaXZlcyBhZmZlY3RlZCBwZXJzb25zIG9mIHRoZSBhaWQgdGhleSBhcmUgZHVlLiANCg0KVGhlIGF2ZXJhZ2UgcGVyY2VudGFnZSBvZiB0aGUgcG9wdWxhdGlvbiByZWFjaGVkLCBvZiBhbGwgc3ViLWRpc3RyaWN0cywgaXMgYHIgYXZnX3BjX3JlYWNoZWRgJS4gDQoNCjxicj4NCg0KYGBge3IgZGYtc3ViLWRpc3RyaWN0LW9yZGVyfQ0Kc3ViX2Rpc3RyaWN0X29yZGVyIDwtIGNiciAlPiUgDQogIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIiAmICANCiAgICAgICAgIHByZXZpb3VzbHlfYXNzaXN0ZWQgPT0gIk5vIikgJT4lIA0KICAgIGZpbHRlcighaXMubmEoYWRtaW4zcGNvZGUpKSAlPiUgDQogICAgICBtdXRhdGUoc3ViX2Rpc3RyaWN0ID0gcmVjb2RlKHN1Yl9kaXN0cmljdCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYWxxaW4iID0gIlNhbHFpbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWZyaW4iID0gIkFmcmluIikpICU+JSANCiAgICAgICAgZ3JvdXBfYnkoZ292ZXJub3JhdGUsIHN1Yl9kaXN0cmljdCkgJT4lIA0KICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogICAgICAgICAgICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAgICAgICAgICAgICAgYXJyYW5nZShkZXNjKGdvdmVybm9yYXRlKSkgJT4lIA0KICAgICAgICAgICAgICAgIHB1bGwoc3ViX2Rpc3RyaWN0KQ0KYGBgDQoNCg0KDQpgYGB7ciBtcGMtYnktc3ViLWRpc3RyaWN0LCBmaWcuaGVpZ2h0PTh9DQoNCmNiciAlPiUgDQogIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIiAmIA0KICAgICAgICAgcHJldmlvdXNseV9hc3Npc3RlZCA9PSAiTm8iKSAlPiUgDQogICAgZmlsdGVyKCFpcy5uYShhZG1pbjNwY29kZSkpICU+JSANCiAgICAgIG11dGF0ZShzdWJfZGlzdHJpY3QgPSByZWNvZGUoc3ViX2Rpc3RyaWN0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhbHFpbiIgPSAiU2FscWluIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnJpbiIgPSAiQWZyaW4iKSkgJT4lIA0KICAgICAgICBncm91cF9ieShnb3Zlcm5vcmF0ZSwgc3ViX2Rpc3RyaWN0KSAlPiUgDQogICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShzdWJfZGlzdHJpY3QgPSBmYWN0b3Ioc3ViX2Rpc3RyaWN0LCAgc3ViX2Rpc3RyaWN0X29yZGVyKSwgDQogICAgICAgICAgICAgIHN1Yl9kaXN0cmljdCA9IGZjdF9yZXYoc3ViX2Rpc3RyaWN0KSkgJT4lIA0KICAgICAgICAgICAgICAgIGFycmFuZ2Uoc3ViX2Rpc3RyaWN0KSAlPiUgDQogICAgICAgICAgICAgICAgICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCB5ID0gc3ViX2Rpc3RyaWN0KSkgKyANCiAgICAgICAgICAgICAgICAgIGdlb21fY29sKGFlcyhmaWxsID0gZ292ZXJub3JhdGUpKSArIA0KICAgICAgICAgICAgICAgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKGJlbmVmaWNpYXJpZXMpKSwgDQogICAgICAgICAgICAgICAgICBoanVzdCA9ICJpbndhcmQiKSArIA0KICAgICAgICAgICAgICAgICAgc2NhbGVfZmlsbF92aXJpZGlzX2QoYmVnaW4gPSAuMykgKyANCiAgICAgICAgICAgICAgICAgIGxhYnModGl0bGUgPSAiTVBDIGJlbmVmaWNpYXJpZXMgYnkgc3ViLWRpc3RyaWN0IiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiYXMgb2YgIiwgcmVwb3J0X2RhdGUpLCANCiAgICAgICAgICAgICAgICAgIHkgPSAiIikgKyANCiAgICAgICAgICAgICAgICAgIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKyANCiAgICAgICAgICAgICAgICAgIA0KY2JyICU+JSANCiAgbXV0YXRlKHN1Yl9kaXN0cmljdCA9IHJlY29kZShzdWJfZGlzdHJpY3QsIA0KICAgICAgICAgInNhbHFpbiIgPSAiU2FscWluIiwgDQogICAgICAgICAiYWZyaW4iID0gIkFmcmluIikpICU+JQ0KICAgIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIiAmICANCiAgICBwcmV2aW91c2x5X2Fzc2lzdGVkID09ICJObyIpICU+JQ0KICAgICAgZmlsdGVyKCFpcy5uYShhZG1pbjNwY29kZSkpICU+JSANCiAgICAgICAgZ3JvdXBfYnkoc3ViX2Rpc3RyaWN0LCBhZG1pbjNwY29kZSwgZ292ZXJub3JhdGUpICU+JQ0KICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICAgICAgICAgICAgbGVmdF9qb2luKGhubyAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihhZG1pbjJuYW1lX2VuICVpbiUgYygiSGFyaW0iLCAiSWRsZWIiLCAiSmlzci1Bc2gtU2h1Z3VyIiwgIkFyaWhhIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVsbCBBYmlhZCIsICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZnJpbiIsICJKZWJlbCBTYW1hbiIsICJBJ3pheiIsICJKYXJhYmx1cyIsICJBbCBCYWIiKSkgJT4lDQogICAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4xbmFtZV9lbiwgYWRtaW4zcGNvZGUpICU+JQ0KICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlKHRvdGFsX3BvcHVsYXRpb24gPSBzdW0odG90YWxfcG9wdWxhdGlvbiwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gImFkbWluM3Bjb2RlIikgJT4lIA0KICAgICAgICAgICAgICAgICAgICBtdXRhdGUocGNfcmVhY2hlZCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyB0b3RhbF9wb3B1bGF0aW9uICogMTAwLCBkaWdpdHMgPSAxKSkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdWJfZGlzdHJpY3QgPSBmYWN0b3Ioc3ViX2Rpc3RyaWN0LCAgc3ViX2Rpc3RyaWN0X29yZGVyKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9kaXN0cmljdCA9IGZjdF9yZXYoc3ViX2Rpc3RyaWN0KSkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgYXJyYW5nZShzdWJfZGlzdHJpY3QpICU+JSAgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGdncGxvdChhZXMoeCA9IHBjX3JlYWNoZWQsIHkgPSBzdWJfZGlzdHJpY3QpKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fY29sKGFlcyhmaWxsID0gZ292ZXJub3JhdGUpKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEocGNfcmVhY2hlZCkpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAiaW53YXJkIikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9maWxsX3ZpcmlkaXNfZChiZWdpbiA9IC4zKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJzKHRpdGxlID0gIlBlcmNlbnQgb2YgcG9wdWxhdGlvbiByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJhcyBvZiAiLCByZXBvcnRfZGF0ZSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gIiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gIiUgb2YgcG9wdWxhdGlvbiByZWFjaGVkIikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90X2xheW91dChndWlkZXMgPSAiY29sbGVjdCIpICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQ0KDQpnZ3NhdmUoIi4vaW1nL21wY19ieV9zdWJfZGlzdHJpY3QucG5nIiwgZHBpID0gMzAwLCBoZWlnaHQgPSA4LjI3LCB3aWR0aCA9IDExLjY5LCB1bml0cyA9ICJpbiIpICANCmBgYA0KDQo8YnI+PGJyPg0KDQoNCg0KPGJyPjxicj4NCg0KDQojIyMgMy4yIFBsYW5uZWQgYWN0aXZpdGllcyANCg0KV2UgZmluZCBpdCBlbmNvdXJhZ2luZyB0aGF0IG5ldyBzdWItZGlzdHJpY3RzIGFyZSBiZWluZyBpbmNsdWRlZCBpbiB0aGUgcGxhbm5lZCBhbGxvY2F0aW9ucywgYWx0aG91Z2ggaXTigJlzIG5vdGV3b3J0aHkgdGhhdCBzb21lIG9mIHRoZSBwbGFubmVkIGFsbG9jYXRpb24gaXMgc3RpbGwgYmVpbmcgYXNzaWduZWQgdG8gYXJlYXMgdGhhdCBoYXZlIGFscmVhZHkgYmVuZWZpdGVkIGZyb20gcmVsYXRpdmVseSBoaWdoIGxldmVscyBvZiBzdXBwb3J0Lg0KDQo8YnI+IA0KDQpgYGB7ciBwbGFubmVkLXN1Yi1kaXN0cmljdH0NCmNiciAlPiUgDQogIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiUGxhbm5lZCIpICU+JQ0KICAgIGZpbHRlcihnb3Zlcm5vcmF0ZSA9PSAiQWxlcHBvIikgJT4lICANCiAgICAgIGdyb3VwX2J5KHN1Yl9kaXN0cmljdCkgJT4lIA0KICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogICAgICAgICAgZmlsdGVyKGJlbmVmaWNpYXJpZXMgPiAwKSAlPiUgDQogICAgICAgICAgICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCB5ID0gZmN0X3Jlb3JkZXIoc3ViX2Rpc3RyaWN0LCBiZW5lZmljaWFyaWVzKSkpICsgDQogICAgICAgICAgICBnZW9tX2NvbChmaWxsID0gIiM0MWI2YzQiKSArDQogICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcykpLCBoanVzdCA9ICJpbndhcmQiKSArDQogICAgICAgICAgICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gdW5pdF9mb3JtYXQodW5pdCA9ICJLIiwgc2NhbGUgPSAxZS0zLCBhY2N1cmFjeSA9IDEpKSArIA0KICAgICAgICAgICAgbGFicyh0aXRsZSA9ICJQbGFubmVkIGJlbmVmaWNpYXJpZXMgLS0gQWxlcHBvIiwgDQogICAgICAgICAgICB4ID0gIlBsYW5uZWQgYmVuZWZpY2lhcmllcyIsIA0KICAgICAgICAgICAgeSA9ICIiKSArIA0KDQpjYnIgJT4lIA0KICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIlBsYW5uZWQiKSAlPiUNCiAgICBmaWx0ZXIoZ292ZXJub3JhdGUgPT0gIklkbGViIiAmICFpcy5uYShhZG1pbjNwY29kZSkpICU+JSAgDQogICAgICBncm91cF9ieShzdWJfZGlzdHJpY3QpICU+JSANCiAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSkgJT4lIA0KICAgICAgICAgIGZpbHRlcihiZW5lZmljaWFyaWVzID4gMCkgJT4lIA0KICAgICAgICAgICAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywgeSA9IGZjdF9yZW9yZGVyKHN1Yl9kaXN0cmljdCwgYmVuZWZpY2lhcmllcykpKSArIA0KICAgICAgICAgICAgZ2VvbV9jb2woZmlsbCA9ICJsaWdodGdvbGRlbnJvZCIpICsNCiAgICAgICAgICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShiZW5lZmljaWFyaWVzKSksIGhqdXN0ID0gImlud2FyZCIpICsNCiAgICAgICAgICAgIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSB1bml0X2Zvcm1hdCh1bml0ID0gIksiLCBzY2FsZSA9IDFlLTMsIGFjY3VyYWN5ID0gMSkpICsgDQogICAgICAgICAgICBsYWJzKHRpdGxlID0gIlBsYW5uZWQgYmVuZWZpY2lhcmllcyAtLSBJZGxlYiIsIA0KICAgICAgICAgICAgeCA9ICJQbGFubmVkIGJlbmVmaWNpYXJpZXMiLCANCiAgICAgICAgICAgIHkgPSAiIikgICsgDQoNCnBsb3RfbGF5b3V0KHdpZHRocyA9IGMoMS4xNSwgMSkpDQoNCmdnc2F2ZSgiLi9pbWcvcGxhbm5lZF9ieV9zdWJfZGlzdHJpY3QucG5nIiwgZHBpID0gMzAwLCBoZWlnaHQgPSA4LjI3LCB3aWR0aCA9IDExLjY5LCB1bml0cyA9ICJpbiIpDQoNCmBgYA0KDQo8YnI+DQoNCg0KDQo8YnI+PGJyPjxicj4NCg0KIyA0LiBDYXNoIHJlc3BvbnNlIGFjdG9ycyBhbmQgY2FzaCBkaXNidXJzZWQNCg0KDQpVU0QgKipgciBwYXN0ZShyb3VuZChjYnIgJT4lIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR0b3RhbF91c2QsIG5hLnJtID0gVFJVRSl9IC8gMTAwMDAwMCwgZGlnaXRzID0gMSksICJtaWxsaW9uIilgKiogaGFzIGJlZW4gZGlzdHJpYnV0ZWQgYWNyb3NzICoqYHIgY2JyICU+JSBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7bl9kaXN0aW5jdCguJGFkbWluNHBjb2RlKX1gKiogY29tbXVuaXRpZXMgYW5kICoqYHIgY2JyICU+JSBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7bl9kaXN0aW5jdCguJGFkbWluM3Bjb2RlKX1gKiogc3ViLWRpc3RyaWN0cyBpbiBOVyBTeXJpYS4NCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1wYXJ0bmVycy1yZWFjaH0NCmNiciAlPiUgDQogIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICAgIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyKSAlPiUgDQogICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcnlfZnJlcSA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgIGRpc3RyaWN0cyA9IG5fZGlzdGluY3QoYWRtaW4ycGNvZGUpLCANCiAgICAgIGNvbW11bml0aWVzID0gbl9kaXN0aW5jdChhZG1pbjRwY29kZSkpICU+JSANCiAgICAgICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJ5X2ZyZXEpKSAlPiUgDQogICAgICAgICAgZmxleHRhYmxlKCkgJT4lIA0KICAgICAgICAgICAgc2V0X2NhcHRpb24oIlJlYWNoIGFuZCBmb290cHJpbnQgb2YgY2FzaCByZXNwb25zZSBhY3RvcnMiKSAlPiUgDQogICAgICAgICAgICAgIHRoZW1lX3plYnJhKCkgJT4lIA0KICAgICAgICAgICAgICAgIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpICU+JSANCiAgICAgICAgICAgICAgICAgIGZvb3Rub3RlKGFzX3BhcmFncmFwaCgiT25seSBwYXJ0bmVycyB3aG8gcHJvdmlkZWQgbW9yZSB0aGFuIFVTRCAxMDAvZmFtaWx5L21vbnRoIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IDEsIGogPSAxLCBwYXJ0ID0gImhlYWRlciIsIGlubGluZSA9IFRSVUUsIHJlZl9zeW1ib2xzID0gIjEiKQ0KICANCmBgYA0KDQo8YnI+DQoNCkluIHRoZSBzY2F0dGVyIHBsb3QgYmVsb3csIGVhY2ggcG9pbnQgaXMgYSBzaW5nbGUgY2FzaCB3b3JraW5nIGdyb3VwIHBhcnRuZXIuIFRoZSB4LWF4aXMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgcmVhY2hlZCBwZXIgYWdlbmN5IGFuZCB0aGUgeS1heGlzIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGNvbW11bml0aWVzIChhZG1pbjQpIHJlYWNoZWQuIE1vdXNlIG92ZXIgZWFjaCBwb2ludCBmb3IgbW9yZSBkZXRhaWxzLg0KDQo8YnI+DQoNCg0KDQpgYGB7ciBwYXJ0bmVyLXNjYXR0ZXItcGxvdGx5fQ0KcGFydG5lcl9zY2F0dGVyIDwtIGNiciAlPiUgDQogIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICAgIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyKSAlPiUgDQogICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgIGNvbW11bml0aWVzID0gbl9kaXN0aW5jdChhZG1pbjRwY29kZSkpICU+JSANCiAgICAgICAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywgeSA9IGNvbW11bml0aWVzKSkgKw0KICAgICAgICAgIGdlb21fcG9pbnQoYWVzKHNpemUgPSBiZW5lZmljaWFyaWVzLCANCiAgICAgICAgICB0ZXh0ID0gcGFzdGUwKGltcGxlbWVudGluZ19wYXJ0bmVyLCAiXG4iLCANCiAgICAgICAgICAiYmVuZWZpY2lhcnlfZnJlcTogIiwgZm9ybWF0KGJlbmVmaWNpYXJpZXMsIGJpZy5tYXJrID0gIiwiKSwgIlxuIiwgDQogICAgICAgICAgImNvbW11bml0aWVzOiAiLCBjb21tdW5pdGllcykpKSArIA0KICAgICAgICAgIHNjYWxlX3hfbG9nMTAobGFiZWxzID0gY29tbWEpICsgDQogICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIA0KICAgICAgICAgIGxhYnMoeCA9ICJCZW5lZmljaWFyeSBmcmVxdWVuY2llcyByZWFjaGVkIiwgDQogICAgICAgICAgeSA9ICJDb21tdW5pdGllcyAoYWRtaW40KSByZWFjaGVkIiwgDQogICAgICAgICAgdGl0bGUgPSAiSW1wbGVtZW50aW5nIHBhcnRuZXJzIC0tIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIGFuZCBjb21tdW5pdGllcyByZWFjaGVkIikNCg0KZ2dwbG90bHkocGFydG5lcl9zY2F0dGVyLCB0b29sdGlwID0gYygidGV4dCIpKSAlPiUgDQogIGxheW91dChzaG93bGVnZW5kID0gVFJVRSwgbGVnZW5kID0gbGlzdChmb250ID0gKGxpc3Qoc2l6ZSA9IDYpKSkpICU+JSANCiAgICBwbG90bHk6OnN0eWxlKGhvdmVyb24gPSAicG9pbnQiKSAlPiUgDQogICAgICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoIkJlbmVmaWNpYXJpZXMgYW5kIGNvbW11bml0aWVzIHJlYWNoZWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYXNoIHJlc3BvbnNlIGltcGxlbWVudGluZyBwYXJ0bmVyczsgbW91c2Ugb3ZlciBmb3IgZGV0YWlscyIsIjwvc3VwPiIpKSkNCg0KDQpgYGANCg0KDQoNCjxicj48YnI+PGJyPg0KDQojIyMgNC4xIENhc2ggZGlzYnVyc2VkIHBlciBwYXJ0bmVyDQoNCjxicj4NCg0KYGBge3IgdGFibGUtY2FzaC1kaXNidXJzZWR9DQpjYnIgJT4lIA0KICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcikgJT4lIA0KICAgICAgc3VtbWFyaXNlKHRvdGFsX3VzZCA9IHN1bSh0b3RhbF91c2QsIG5hLnJtID0gVFJVRSksIA0KICAgICAgZmFtaWxpZXMgPSBzdW0oZmFtaWxpZXMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgICAgICAgbXV0YXRlKHVzZF9wZXJfZmFtID0gcm91bmQodG90YWxfdXNkIC8gZmFtaWxpZXMsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgYCVfdXNkX3RvdGFsYCA9IHJvdW5kKHRvdGFsX3VzZCAvIHN1bSh0b3RhbF91c2QpICogMTAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIHRvdGFsX3VzZCA9IHJvdW5kKHRvdGFsX3VzZCkpICU+JSANCiAgICAgICAgICBhcnJhbmdlKGRlc2ModG90YWxfdXNkKSkgJT4lIA0KICAgICAgICAgICAgZmxleHRhYmxlKCkgJT4lIA0KICAgICAgICAgICAgICBzZXRfY2FwdGlvbigiQ2FzaCBkaXNidXJzZWQgYW5kIGZhbWlsaWVzIHJlYWNoZWQgYnkgcGFydG5lciIpICU+JSANCiAgICAgICAgICAgICAgICB0aGVtZV96ZWJyYSgpICU+JSANCiAgICAgICAgICAgICAgICAgIGZsZXh0YWJsZTo6c2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45OSkNCmBgYA0KDQo8YnI+DQoNClRoZSBDV0cgaXMgY3VycmVudGx5IHdvcmtpbmcgd2l0aCBvdGhlciBDbHVzdGVycyB0byBjb25zb2xpZGF0ZSBhbGwgY2FzaC1iYXNlZCBhY3Rpdml0aWVzIGFuZCB3aWxsIHNvb24gYmUgYWJsZSB0byBwcm92aWRlIG1vcmUgY29tcHJlaGVuc2l2ZSByZXBvcnRpbmcuIA0KDQo8YnI+PGJyPiANCg0KIyMjIDQuMiBDdXJyZW5jeSBkaXNidXJzZWQNCg0KYGBge3IgZGYtY3VycmVuY3ktdGFibGV9DQpjdXJyZW5jeV90YWJsZSA8LSBjYnIgJT4lIA0KICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgICBncm91cF9ieShjdXJyZW5jeSkgJT4lIA0KICAgICAgc3VtbWFyaXNlKHRvdGFsX3VzZCA9IHN1bSh0b3RhbF91c2QsIG5hLnJtID0gVFJVRSkpICU+JQ0KICAjIGRvaW5nIHRoaXMgZW50aXJlbHkgZm9yIHJvdW5kaW5nIHJlYXNvbnMsIGJlY2F1c2Ugb2YgRlggcmF0ZSwgdGhlcmUncyBvbmUgZXh0cmEgZG9sbGFyDQogICAgICAgIG11dGF0ZSh0b3RhbF91c2QgPSBpZmVsc2UoY3VycmVuY3kgPT0gIlVTRCIsIHRvdGFsX3VzZCAtIDEsIHRvdGFsX3VzZCkpICU+JSANCiAgICAgICAgICBtdXRhdGUocGNfdG90YWwgPSByb3VuZCh0b3RhbF91c2QgLyBzdW0odG90YWxfdXNkKSAqIDEwMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMikpDQpgYGANCg0KDQpBIHRvdGFsIG9mICoqYHIgZmlsdGVyKGN1cnJlbmN5X3RhYmxlLCBjdXJyZW5jeSA9PSAiVVNEIikgJT4lIHB1bGwocGNfdG90YWwpYCUqKiBvZiBjYXNoIGRpc2J1cnNlZCB3YXMgaW4gVVNELiANCg0KPGJyPg0KDQoNCmBgYHtyIHRhYmxlLWN1cnJlbmN5LXRhYmxlfQ0KY3VycmVuY3lfdGFibGUgJT4lIA0KICByZW5hbWUoYCVfb2ZfdG90YWxgID0gcGNfdG90YWwpICU+JSANCiAgICBhZG9ybl90b3RhbHMoInJvdyIpICU+JSANCiAgICAgIGZsZXh0YWJsZSgpICU+JSANCiAgICAgICAgdGhlbWVfemVicmEoKSAlPiUgDQogICAgICAgICAgc2V0X2NhcHRpb24oIlByb3BvcnRpb24gb2YgY2FzaCBkaXNidXJzZWQgYnkgY3VycmVuY3kiKSAlPiUgDQogICAgICAgICAgICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjYpDQpgYGANCg0KDQoNCg0KPGJyPjxicj48YnI+DQoNCiMgNS4gQW5uZXhlcw0KDQo8YnI+DQoNCiMjIyA1LjEgSW50ZXJhY3RpdmUgcmVmZXJlbmNlIHRhYmxlIGF0IHN1Yi1kaXN0cmljdCBsZXZlbA0KDQpDb2x1bW5zIGluY2x1ZGU6IA0KYGdvdmVybm9yYXRlYCwgYGRpc3RyaWN0YCwgYHN1Yi1kaXN0cmljdGAsIA0KYHRvdGFsIHBvcHVsYXRpb25gLCBgYmVuZWZpY2lhcmllc2AsIGB0b3RhbCB1c2QgZGlzYnVyc2VkYCwgDQpgd291bmRlZCBhbmQgZGVhZGAsIGB3b3VuZGVkIGFuZCBkZWFkIHBlciAxMDBrYCwgDQpgZGFtYWdlZCBob3VzZXNgLCBgZGFtYWdlZCBob3VzZXMgcGVyIDEwMGtgLCANCmBhZG1pbjNwY29kZWANCg0KPGJyPg0KDQpgYGB7ciBEVC1hZG1pbjN9DQplcSAlPiUgDQogIGxlZnRfam9pbihsb2NhdGlvbnMgJT4lIA0KICAgIGRpc3RpbmN0KGFkbWluM3Bjb2RlLCANCiAgICBzdWJfZGlzdHJpY3QgPSBhZG1pbjNuYW1lX2VuLA0KICAgIGRpc3RyaWN0ID0gYWRtaW4ybmFtZV9lbiwNCiAgICBnb3Zlcm5vcmF0ZSA9IGFkbWluMW5hbWVfZW4pLCANCiAgICBieSA9ICJhZG1pbjNwY29kZSIpICU+JSANCiAgICAgIGxlZnRfam9pbihjYnIgJT4lIA0KICAgICAgICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgICAgICAgICBncm91cF9ieShhZG1pbjNwY29kZSkgJT4lIA0KICAgICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllc1twcmV2aW91c2x5X2Fzc2lzdGVkID09ICJObyJdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgdG90YWxfdXNkID0gc3VtKHRvdGFsX3VzZCwgbmEucm0gPSBUUlVFKSksIA0KICAgICAgICAgICAgYnkgPSAiYWRtaW4zcGNvZGUiKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChnb3Zlcm5vcmF0ZSwgZGlzdHJpY3QsIHN1Yl9kaXN0cmljdCwgDQogICAgICAgICAgICAgICAgICAgICB0b3RhbF9wb3B1bGF0aW9uLCANCiAgICAgICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMsIHRvdGFsX3VzZCwgDQogICAgICAgICAgICAgICAgICAgICB3b3VuZGVkX2RlYWQsIHdvdW5kZWRfZGVhZF8xMDBrLCANCiAgICAgICAgICAgICAgICAgICAgIGRhbWFnZWRfaG91c2VzLCBkYW1hZ2VkX2hvdXNlc18xMDBrLCANCiAgICAgICAgICAgICAgICAgICAgIGFkbWluM3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgICAgZGF0YXRhYmxlKG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgc2Nyb2xsWCA9IFRSVUUpLCANCiAgICAgICAgICAgICAgICBmaWx0ZXIgPSBsaXN0KHBvc2l0aW9uID0gInRvcCIsIGNsZWFyID0gRkFMU0UpLA0KICAgICAgICAgICAgICAgIGNhcHRpb24gPSBodG1sdG9vbHM6OnRhZ3MkY2FwdGlvbihzdHlsZSA9ICdjYXB0aW9uLXNpZGU6IHRvcDsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOjEyMCUgOycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWZlcmVuY2UgdGFibGUgLS0gRWFydGhxdWFrZSBpbXBhY3RzLCBmcm9tIEFDVSwgZXh0cmFjdGVkIDIwMjMwMzI4IikpICU+JSANCiAgICAgICAgICAgICAgICAgIGZvcm1hdFN0eWxlKDAsIHRhcmdldCA9ICJyb3ciLCBsaW5lSGVpZ2h0ID0gIjgwJSIsIGZvbnRTaXplID0gIjgwJSIpICU+JSANCiAgICAgICAgICAgICAgICAgICAgZm9ybWF0Um91bmQoYygid291bmRlZF9kZWFkXzEwMGsiLCAiZGFtYWdlZF9ob3VzZXNfMTAwayIpLCBkaWdpdHMgPSAyKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZm9ybWF0Q3VycmVuY3koYygidG90YWxfcG9wdWxhdGlvbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndvdW5kZWRfZGVhZCIsICJkYW1hZ2VkX2hvdXNlcyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlbmVmaWNpYXJpZXMiLCAidG90YWxfdXNkIiksIA0KICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5ID0gIiIsIGludGVydmFsID0gMywgbWFyayA9ICIsIikgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRSb3VuZChjKCJ0b3RhbF9wb3B1bGF0aW9uIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3b3VuZGVkX2RlYWQiLCAiZGFtYWdlZF9ob3VzZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVuZWZpY2lhcmllcyIsICJ0b3RhbF91c2QiKSwgZGlnaXRzID0gMCkNCiAgDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDUuMiBSZXBvcnRpbmcgcXVhbGl0eQ0KDQpgYGB7cn0NCm1vbnRoX3JlcG9ydGluZyA8LSBjYnIgJT4lIA0KICBncm91cF9ieShtb250aCA9IG1vbnRoKGVuZF9kYXRlKSkgJT4lIA0KICAgIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpKQ0KYGBgDQoNCg0KVGhpcyBzZWN0aW9uIGRvY3VtZW50cyBpc3N1ZXMgZW5jb3VudGVyZWQgaW4gdGhlIGNsZWFuaW5nIG9mIDRXIGFuZCBGU0wgZGF0YSBhbmQgdGhlaXIgaW1wYWN0cyBvbiB0aGUgcXVhbGl0eSBvZiByZXBvcnRpbmcgdGhlIENXRyBjYW4gcHJvdmlkZS4gVGhlIHJlY29tbWVuZGF0aW9ucyBieSB0aGUgQ1dHIGFyZSBpbmNsdWRlZCB0byBlbmhhbmNlIHJlcG9ydGluZyBxdWFsaXR5OiANCg0KMS4gVGhlIENXRyBoYXMgYWRvcHRlZCBhIG5ldyA0V3MgdGVtcGxhdGUgZm9yIG1vbnRobHkgcmVwb3J0aW5nLCBhaW1pbmcgdG8gaW1wcm92ZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZWFydGhxdWFrZSByZXNwb25zZSBlZmZvcnRzLiAqKlRoZSByZXBvcnRpbmcgZGVhZGxpbmUgaXMgc2V0IG9uIHRoZSAxNXRoIG9mIGVhY2ggbW9udGguKiogSW4gRmVicnVhcnkgYHIgZmlsdGVyKG1vbnRoX3JlcG9ydGluZywgbW9udGggPT0gMikgJT4lIHB1bGwocGFydG5lcnMpYCBwYXJ0bmVycyByZXBvcnRlZCB0aGVpciBhY2hpZXZlbWVudHMsIEluIE1hcmNoIGByIGZpbHRlcihtb250aF9yZXBvcnRpbmcsIG1vbnRoID09IDMpICU+JSBwdWxsKHBhcnRuZXJzKWAgcGFydG5lcnMgaGF2ZSByZXBvcnRlZCB0aGVpciBhY2hpZXZlbWVudHMsIHdpdGggYHIgZmlsdGVyKG1vbnRoX3JlcG9ydGluZywgbW9udGggPT0gNCkgJT4lIHB1bGwocGFydG5lcnMpYCBwYXJ0bmVycyBoYXZpbmcgcmVwb3J0ZWQgaW4gQXByaWwsIGluIE1heSBgciBmaWx0ZXIobW9udGhfcmVwb3J0aW5nLCBtb250aCA9PSA1KSAlPiUgcHVsbChwYXJ0bmVycylgIHBhcnRuZXJzIGhhdmUgcmVwb3J0ZWQuIGByIGZpbHRlcihtb250aF9yZXBvcnRpbmcsIG1vbnRoID09IDYpICU+JSBwdWxsKHBhcnRuZXJzKWAgcGFydG5lcnMgaGF2ZSByZXBvcnRlZCBpbiBKdW5lLCB3aXRoIGByIGZpbHRlcihtb250aF9yZXBvcnRpbmcsIG1vbnRoID09IDcpICU+JSBwdWxsKHBhcnRuZXJzKWAgcGFydG5lcnMgaGF2ZSByZXBvcnRlZCBpbiBKdWx5LCB3aGlsZSBgciBmaWx0ZXIobW9udGhfcmVwb3J0aW5nLCBtb250aCA9PSA4KSAlPiUgcHVsbChwYXJ0bmVycylgIHJlcG9ydGVkIGluIEF1Z3VzdCwgd2l0aCBgciBmaWx0ZXIobW9udGhfcmVwb3J0aW5nLCBtb250aCA9PSA5KSAlPiUgcHVsbChwYXJ0bmVycylgIHJlcG9ydGVkIGluIFNlcHRlbWJlciwgd2l0aCBgciBmaWx0ZXIobW9udGhfcmVwb3J0aW5nLCBtb250aCA9PSAxMCkgJT4lIHB1bGwocGFydG5lcnMpYCByZXBvcnRlZCBpbiBPY3RvYmVyLCB3aXRoIGByIGZpbHRlcihtb250aF9yZXBvcnRpbmcsIG1vbnRoID09IDExKSAlPiUgcHVsbChwYXJ0bmVycylgIHJlcG9ydGVkIGluIE5vdmVtYmVyLCB3aXRoIGByIGZpbHRlcihtb250aF9yZXBvcnRpbmcsIG1vbnRoID09IDEyKSAlPiUgcHVsbChwYXJ0bmVycylgIHJlcG9ydGVkIGluIERlY2VtYmVyLCBhbmQgYHIgZmlsdGVyKG1vbnRoX3JlcG9ydGluZywgbW9udGggPT0gMDEpICU+JSBwdWxsKHBhcnRuZXJzKWAgcmVwb3J0ZWQgaW4gSmFudWFyeSAyMDI0LiBJZiBubyBNUEMgYWN0aXZpdGllcyB3ZXJlIGltcGxlbWVudGVkLCBwbGVhc2UgaW5mb3JtIHRoZSBDV0cgYXMgd2VsbC4NCg0KMi4gRm9yIHRoaXMgcmVwb3J0aW5nIHBlcmlvZCwgYWN0aXZpdGllcyBwZXJ0YWluaW5nIHRvIGByIGZvcm1hdChzdW1fc3RhdHMgJT4lIHB1bGwoYmVuZWZpY2lhcmllcykgLSBtYXgocHJvZ3Jlc3NfbGluZSRjdW1fbGFiZWwsIG5hLnJtID0gVFJVRSksIGJpZy5tYXJrID0gIiwiKWAgYmVuZWZpY2lhcmllcyB3ZXJlIG1pc3NpbmcgdGhlaXIgZGF0ZXMgb3IgaGFkIGRhdGVzIGluIHVucmVhZGFibGUgZm9ybWF0cy4gKipQbGVhc2UgZW5zdXJlIHRoYXQgdGhlIGBzdGFydCBkYXRlYCBhbmQgYGVuZCBkYXRlYCBhcmUgZW50ZXJlZCBpbiB0aGUgZm9ybWF0IChtbS9kZC95eXl5KSBhbmQgc2VsZWN0IHRoZSBgbW9udGggb2YgcmVwb3J0aW5nYCBmcm9tIHRoZSBvcHRpb25zIGluIHRoZSBkcm9wIGRvd24gbWVudS4qKg0KDQozLiBGb3Igc2V4LWFuZC1hZ2UgZGlzLWFnZ3JlZ2F0aW9ucywgcGxlYXNlIGRvIG5vdCBiYWNrIGZpbGwgdGhlc2UgY29sdW1ucyB1c2luZyBjYWxjdWxhdGlvbnMgYmFzZWQgb24gdGhlIGNlbnN1cyBvciB0aGUgTVNOQS4gSWYgbm8gZGlzLWFnZ3JlZ2F0ZWQgZGF0YSBpcyBhdmFpbGFibGUgdG8geW91ciBvcmdhbmlzYXRpb24sIHBsZWFzZSBsZWF2ZSB0aGVzZSBjb2x1bW5zIGJsYW5rLiANCg0KNC4gVGhlIENhc2ggV29ya2luZyBHcm91cCBpcyBjdXJyZW50bHkgb25seSBjb2xsZWN0aW5nIHBsYW5uZWQgYW5kIGltcGxlbWVudGVkICoqTXVsdGlwdXJwb3NlIENhc2gqKiBhY2hpZXZlbWVudHMuIFdoaWxzdCB0aGUgQ1dHIHdlbGNvbWVzIGFkZGl0aW9uYWwgaW5wdXRzIG9uIG90aGVyIENWQSBhY3Rpdml0aWVzLCB3ZSBhbHNvIHdhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIHJlcG9ydGluZyBsb2FkIGlzIGFzIGxvdyBhcyBwb3NzaWJsZSBmb3IgcGFydG5lcnMgaS5lLiBpZiBhbiBhZ2VuY3kgaGFzIGltcGxlbWVudGVkIENhc2gtZm9yLVdvcmssIHRoaXMgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZSBFUkwgQ2x1c3Rlci4gVGhlIENXRyB3aWxsIHdvcmsgd2l0aCBhbGwgQ2x1c3RlcnMgdG8gZGV2ZWxvcCBhIGNvbnNvbGlkYXRlZCBwaWN0dXJlIG9mIHJlc3BvbnNlLXdpZGUgQ1ZBIGludGVydmVudGlvbnMuIA0KDQo1LiBQbGVhc2UgaW5kaWNhdGUgaW4gdGhlIGBwcmV2aW91c2x5X2Fzc2lzdGVkYCBjb2x1bW4gd2hldGhlciBvciBub3QgYmVuZWZpY2lhcmllcyBoYXZlIGJlZW4gcmVhY2hlZCBiZWZvcmUuIEhvd2V2ZXIsIGlmIHRoZSBiZW5lZmljaWFyaWVzIGFyZSBiZWluZyByZXBvcnRlZCBmb3IgdGhlIGZpcnN0IHRpbWUgdG8gdGhlIENhc2ggV29ya2luZyBHcm91cCwgZXZlbiBpZiB5b3UgaGF2ZSByZWFjaGVkIHRoZW0gYmVmb3JlLCBwbGVhc2UgaW5kaWNhdGUgYE5vYCBpbiB0aGlzIGNvbHVtbi4gVGhpcyBjb2x1bW4gaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiB1bmlxdWUgaW5kaXZpZHVhbHMgcmVhY2hlZC4g