Code
SYNTAX and CONTROL FLOW
SYNTAX and CONTROL FLOW ~ Week 4
<div class="logo-inner">
<img src="C:/Users/Nurul Iffah/Downloads/fotoku.jpg" alt="Nurul Iffah">
</div>
STUDY CASES
SYNTAX and CONTROL FLOW~ Week 4
Program Studi Sains Data
Universitas INSTITUT TEKNOLOGI SAINS BANDUNG
Dosen Pengampu Bakti Siregar, M Sc., CSD
DATASET PRACTICUM
ID
Name
Age
Salary
Position
Performance
1
Bagas
25
5000
Staff
Good
2
Joan
30
7000
Supervisior
Very Good
3
Alya
27
6500
Staff
Averange
4
Dwi
35
10000
Manager
Good
5
Nabil
40
12000
Direktor
Very Good
BONUS MEMBERS
👤
Joan
$1,400
Very Good · 20%
👤
Nabil
$2,400
Very Good · 20%
FOR LOOP
CONCEPT of FOR
LOOP
A for loop is used to repeat a command for each item in a
dataset. In this task, the for loop checks the salary
of each employee one by one.
The program reads the employee data row by row and examines whether
the salary is greater than 6000. If the condition is
true, the program will display the employee’s name and
salary. If the salary is 6000 or less, the employee will not be shown in
the result.
Therefore, the for loop helps the program automatically go through
all employees and select only those who meet the condition without
checking each one manually.
WHILE LOOP
CONCEPT of WHILE
LOOP
A while loop is used to** repeat a command as long as a certain
condition is true.** In this task, the while loop goes through
the employee list one by one.
The program starts from the first employee and displays the
name and position. After showing the information, the
program checks whether the employee’s position is
“Manager.”
If the position is not Manager *, the loop continues
to the next employee. However, when the program finds an employee with
the position Manager, the loop stops.
Therefore, the while loop allows the program to process the data step
by step and stop automatically when a specific condition is met, without
checking all employees manually.
👤
Dwi
Manager
✔ Manager found
the output ends at Dwi, because Dwi is the first employee
with the position Manager.
BREAK
CONCEPT of BREAK
The break statement is used to immediately stop a loop when a
specific condition is met.
In this task, the program checks each employee’s salary one
by one using a loop. The loop continues to display the
employee’s name and salary until it finds an employee whose
salary is above 10,000.
Therefore, the break statement allows the program to exit the loop
early once the required condition is found, making the process more
efficient.
👤
Nabil
$ 12000
Loop Stopped
When the program reaches Nabil , whose salary is
12,000, the condition becomes true. At this point, the break
command stops the loop, so the program does not continue checking the
remaining data.
LS0tDQp0aXRsZTogIlNZTlRBWCBhbmQgQ09OVFJPTCBGTE9XIiAgICAgICAgICAgIA0Kc3VidGl0bGU6ICJTWU5UQVggYW5kIENPTlRST0wgRkxPVyB+IFdlZWsgNCAiICANCmF1dGhvcjogIk51cnVsIElmZmFoIiAgICAgIA0KZGF0ZTogICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCIgDQpvdXRwdXQ6ICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAgICANCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZSAgICAgICAgIA0KICAgIHRodW1ibmFpbHM6IHRydWUgICAgICAgICAgICANCiAgICBsaWdodGJveDogdHJ1ZSAgICAgICAgICAgICAgDQogICAgZ2FsbGVyeTogdHJ1ZSAgICAgICAgICAgICAgIA0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZSAgICAgICANCiAgICBsaWJfZGlyOiBsaWJzICAgICAgICAgICAgICAgDQogICAgZGZfcHJpbnQ6ICJwYWdlZCIgICAgICAgICAgIA0KICAgIGNvZGVfZm9sZGluZzogIm5vIiAgICAgICAgIA0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjc3M6IGFwYWxhaA0KICAgICAgICAgICAgDQotLS0NCg0KYGBge2NzcyBlY2hvPUZBTFNFfQ0KLyogPT09PSBGT05UIEdFTUVTIChHb29nbGUgRm9udHMpID09PT0gKi8NCkBpbXBvcnQgdXJsKCdodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PVF1aWNrc2FuZDp3Z2h0QDMwMDs0MDA7NTAwOzYwMDs3MDAmZmFtaWx5PUZyZWRva2E6d2dodEA0MDA7NTAwOzYwMCZkaXNwbGF5PXN3YXAnKTsNCmBgYA0KDQo8ZGl2IGlkPSJzaWRlYmFyLXRvZ2dsZSI+DQogIDxzcGFuPjwvc3Bhbj4NCjwvZGl2Pg0KDQoNCjxkaXYgaWQ9Im1vZGUtdG9nZ2xlIiB0aXRsZT0iR2FudGkgTGlnaHQgLyBEYXJrIj4NCiAgPHNwYW4gY2xhc3M9InN1biIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj4NCiAgPHNwYW4gY2xhc3M9Im1vb24iIGFyaWEtaGlkZGVuPSJ0cnVlIj48L3NwYW4+DQo8L2Rpdj4NCg0KDQo8ZGl2IGNsYXNzPSJsb2dvLXdyYXBwZXIiPg0KICA8ZGl2IGNsYXNzPSJsb2dvLWZyYW1lIj4NCiAgICA8ZGl2IGNsYXNzPSJsb2dvLWlubmVyIj4NCiAgICAgIDxpbWcgc3JjPSJDOi9Vc2Vycy9OdXJ1bCBJZmZhaC9Eb3dubG9hZHMvZm90b2t1LmpwZyIgYWx0PSJOdXJ1bCBJZmZhaCI+DQogICAgPC9kaXY+DQogIDwvZGl2Pg0KPC9kaXY+DQoNCjxkaXYgY2xhc3M9ImxvZ28tY2FwdGlvbiI+DQogIE5VUlVMIElGRkFIDQo8L2Rpdj4NCg0KPGRpdiBjbGFzcz0ibnVydWwtdGl0bGUtc2VjdGlvbiI+DQogIDxkaXYgY2xhc3M9Im51cnVsLXRpdGxlLXRleHQiPlNUVURZIENBU0VTPC9kaXY+DQogIDxkaXYgY2xhc3M9Im51cnVsLXN1YnRpdGxlLXRleHQiPlNZTlRBWCBhbmQgQ09OVFJPTCBGTE9XfiBXZWVrIDQ8L2Rpdj4NCjwvZGl2Pg0KDQo8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiAxLjhyZW07IHRleHQtYWxpZ246IGNlbnRlcjsiPg0KDQo8IS0tIEtPVEFLIDEg4oCTIFNhaW5zIERhdGEgKHBpbmsgbGVtYnV0KSAtLT4NCjxwIGNsYXNzPSJpbmZvLXBpbGwiIHN0eWxlPSINCiAgZGlzcGxheTogaW5saW5lLWJsb2NrOw0KICBtaW4td2lkdGg6IDE3MHB4Ow0KICBwYWRkaW5nOiAwLjdyZW0gMS40cmVtOw0KICBib3JkZXItcmFkaXVzOiAxNnB4Ow0KICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjZmZlYWY0LCAjZmZkNmVhKTsNCiAgYm94LXNoYWRvdzogMCA4cHggMThweCByZ2JhKDAsMCwwLDAuMTIpOw0KICBmb250LWZhbWlseTogJ1F1aWNrc2FuZCcsIHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzI0MzAzZTsNCiAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogNjAwOw0KICBsaW5lLWhlaWdodDogMS40Ow0KICBtYXJnaW46IDAgMC42cmVtIDAuNnJlbSAwLjZyZW07DQoiPg0KICBQcm9ncmFtIFN0dWRpPGJyPlNhaW5zIERhdGENCjwvcD4NCg0KPCEtLSBLT1RBSyAyIOKAkyBVbml2ZXJzaXRhcyAobGlsYWMgLyB1bmd1IG11ZGEpIC0tPg0KPHAgY2xhc3M9ImluZm8tcGlsbCIgc3R5bGU9Ig0KICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7DQogIG1pbi13aWR0aDogMTcwcHg7DQogIHBhZGRpbmc6IDAuN3JlbSAxLjRyZW07DQogIGJvcmRlci1yYWRpdXM6IDE2cHg7DQogIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNmMmVjZmYsICNlMGQ3ZmYpOw0KICBib3gtc2hhZG93OiAwIDhweCAxOHB4IHJnYmEoMCwwLDAsMC4xMik7DQogIGZvbnQtZmFtaWx5OiAnUXVpY2tzYW5kJywgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIHNhbnMtc2VyaWY7DQogIGNvbG9yOiAjMjQzMDNlOw0KICBmb250LXNpemU6IDE0cHg7DQogIGZvbnQtd2VpZ2h0OiA2MDA7DQogIGxpbmUtaGVpZ2h0OiAxLjQ7DQogIG1hcmdpbjogMCAwLjZyZW0gMC42cmVtIDAuNnJlbTsNCiI+DQogIFVuaXZlcnNpdGFzPGJyPklOU1RJVFVUIFRFS05PTE9HSSBTQUlOUyBCQU5EVU5HDQo8L3A+DQoNCjwhLS0gS09UQUsgMyDigJMgRG9zZW4gUGVuZ2FtcHUgKGJpcnUgcGFzdGVsKSAtLT4NCjxwIGNsYXNzPSJpbmZvLXBpbGwiIHN0eWxlPSINCiAgZGlzcGxheTogaW5saW5lLWJsb2NrOw0KICBtaW4td2lkdGg6IDE3MHB4Ow0KICBwYWRkaW5nOiAwLjdyZW0gMS40cmVtOw0KICBib3JkZXItcmFkaXVzOiAxNnB4Ow0KICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjZTZmMmZmLCAjYzlkZGZmKTsNCiAgYm94LXNoYWRvdzogMCA4cHggMThweCByZ2JhKDAsMCwwLDAuMTIpOw0KICBmb250LWZhbWlseTogJ1F1aWNrc2FuZCcsIHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzI0MzAzZTsNCiAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogNjAwOw0KICBsaW5lLWhlaWdodDogMS40Ow0KICBtYXJnaW46IDAgMC42cmVtIDAuNnJlbSAwLjZyZW07DQoiPg0KICBEb3NlbiBQZW5nYW1wdTxicj5CYWt0aSBTaXJlZ2FyLCBNIFNjLiwgQ1NEDQo8L3A+DQoNCg0KDQo8L2Rpdj4NCg0KDQojIERBVEFTRVQgUFJBQ1RJQ1VNIA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KbmFtZXMgPC0gYygiQmFnYXMiLCJKb2FuIiwiQWx5YSIsIkR3aSIsIk5hYmlsIikNCmFnZSA8LSBjKDI1LDMwLDI3LDM1LDQwKQ0Kc2FsYXJ5IDwtIGMoNTAwMCw3MDAwLDY1MDAsMTAwMDAsMTIwMDApDQpwb3NpdGlvbiA8LSBjKCJTdGFmZiIsIlN1cGVydmlzaW9yIiwiU3RhZmYiLCJNYW5hZ2VyIiwiRGlyZWt0b3IiKQ0KcGVyZm9ybWFuY2UgPC0gYygiR29vZCIsIlZlcnkgR29vZCIsIkF2ZXJhbmdlIiwiR29vZCIsIlZlcnkgR29vZCIpDQoNCmVtcGxveWVlIDwtIGRhdGEuZnJhbWUoDQogIElEID0gMTo1LA0KICBOYW1lID0gbmFtZXMsDQogIEFnZSA9IGFnZSwNCiAgU2FsYXJ5ID0gc2FsYXJ5LA0KICBQb3NpdGlvbiA9IHBvc2l0aW9uLA0KICBQZXJmb3JtYW5jZSA9IHBlcmZvcm1hbmNlDQopDQoNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQprYWJsZShlbXBsb3llZSwgYWxpZ249ImMiKSAlPiUNCiAga2FibGVfc3R5bGluZygNCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCJob3ZlciIpLA0KICAgIGZ1bGxfd2lkdGggPSBGQUxTRSwNCiAgICBwb3NpdGlvbiA9ICJjZW50ZXIiDQogICkNCg0KYGBgDQoNCjxzdHlsZT4NCg0KdGFibGUgew0KICBib3JkZXItcmFkaXVzOjEwcHg7DQogIG92ZXJmbG93OmhpZGRlbjsNCiAgZm9udC1zaXplOjE2cHg7DQp9DQoNCnRoZWFkIHsNCiAgYmFja2dyb3VuZDojZWVmMWY3Ow0KICBmb250LXdlaWdodDpib2xkOw0KfQ0KDQp0Ym9keSB0cjpob3ZlciB7DQogIGJhY2tncm91bmQ6I2Y1ZjdmYjsNCn0NCg0KPC9zdHlsZT4NCg0KDQotLS0NCg0KDQojIyBCT05VUyBSVUxFUw0KDQo8ZGl2IGNsYXNzPSJib251cy1ydWxlcy1ib3giPg0KDQo8ZGl2IGNsYXNzPSJib251cy10aXRsZSI+DQpCb251cyBSdWxlcw0KPC9kaXY+DQoNCjxkaXYgY2xhc3M9ImJvbnVzLWdyaWQiPg0KDQo8ZGl2IGNsYXNzPSJib251cy1jYXJkIj4NCjxkaXYgY2xhc3M9ImJvbnVzLWxhYmVsIHZlcnlnb29kIj5WZXJ5IEdvb2Q8L2Rpdj4NCjxkaXYgY2xhc3M9ImJvbnVzLXZhbHVlIj4yMCU8L2Rpdj4NCjwvZGl2Pg0KDQo8ZGl2IGNsYXNzPSJib251cy1jYXJkIj4NCjxkaXYgY2xhc3M9ImJvbnVzLWxhYmVsIGdvb2QiPkdvb2Q8L2Rpdj4NCjxkaXYgY2xhc3M9ImJvbnVzLXZhbHVlIj4xMCU8L2Rpdj4NCjwvZGl2Pg0KDQo8ZGl2IGNsYXNzPSJib251cy1jYXJkIj4NCjxkaXYgY2xhc3M9ImJvbnVzLWxhYmVsIGF2ZXJhZ2UiPkF2ZXJhZ2U8L2Rpdj4NCjxkaXYgY2xhc3M9ImJvbnVzLXZhbHVlIj41JTwvZGl2Pg0KPC9kaXY+DQoNCjwvZGl2Pg0KDQo8L2Rpdj4NCg0KYGBge2NzcyBlY2hvPUZBTFNFfQ0KLmJvbnVzLXJ1bGVzLWJveHsNCiAgbWFyZ2luLXRvcDoyMHB4Ow0KfQ0KDQouYm9udXMtdGl0bGV7DQogIGZvbnQtc2l6ZToxNnB4Ow0KICBtYXJnaW4tYm90dG9tOjE1cHg7DQogIGNvbG9yOiMyNDMwM2U7DQp9DQoNCi8qIEdSSUQgc3VwYXlhIGNhcmQgYmVyamFqYXIgKi8NCi5ib251cy1ncmlkew0KICBkaXNwbGF5OmZsZXg7DQogIGdhcDoyMnB4Ow0KICBqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOw0KICBtYXJnaW4tdG9wOjEwcHg7DQp9DQoNCi8qIENBUkQgKi8NCi5ib251cy1jYXJkew0KICBiYWNrZ3JvdW5kOiNmNGY2ZmI7DQogIHBhZGRpbmc6MjBweCAzMHB4Ow0KICBib3JkZXItcmFkaXVzOjE2cHg7DQogIHRleHQtYWxpZ246Y2VudGVyOw0KICBtaW4td2lkdGg6MTMwcHg7DQogIGJveC1zaGFkb3c6MCA2cHggMTZweCByZ2JhKDAsMCwwLDAuMDgpOw0KICB0cmFuc2l0aW9uOjAuMnM7DQp9DQoNCi5ib251cy1jYXJkOmhvdmVyew0KICB0cmFuc2Zvcm06dHJhbnNsYXRlWSgtM3B4KTsNCn0NCg0KLyogTEFCRUwgKi8NCi5ib251cy1sYWJlbHsNCiAgZm9udC13ZWlnaHQ6NzAwOw0KICBmb250LWZhbWlseTonUXVpY2tzYW5kJywgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIHNhbnMtc2VyaWY7DQogIG1hcmdpbi1ib3R0b206NnB4Ow0KfQ0KDQovKiBXQVJOQSBTRVNVQUkgVEVNQSAqLw0KLnZlcnlnb29kew0KICBjb2xvcjojZTY0OTgwOyAgIC8qIHBpbmsgKi8NCn0NCg0KLmdvb2R7DQogIGNvbG9yOiM3YjVjZmY7ICAgLyogdW5ndSAqLw0KfQ0KDQouYXZlcmFnZXsNCiAgY29sb3I6IzNiODJmNjsgICAvKiBiaXJ1ICovDQp9DQoNCi8qIEFOR0tBIEJPTlVTICovDQouYm9udXMtdmFsdWV7DQogIGZvbnQtc2l6ZToyNHB4Ow0KICBmb250LXdlaWdodDo4MDA7DQogIGNvbG9yOiMxZjJkNGQ7DQp9DQpgYGANCg0KDQotLS0NCg0KIyMgQk9OVVMgTUVNQkVSUw0KDQo8ZGl2IGNsYXNzPSJib251cy1yZXN1bHRzLXdyYXBwZXIiPg0KDQo8ZGl2IGNsYXNzPSJib251cy1yZXN1bHRzLXRpdGxlIj4NCkJvbnVzIE1lbWJlciBSZXN1bHRzDQo8L2Rpdj4NCg0KPGRpdiBjbGFzcz0iYm9udXMtcmVzdWx0cy1ncmlkIj4NCg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtY2FyZCI+DQo8ZGl2IGNsYXNzPSJlbXBsb3llZS1pY29uIj7wn5GkPC9kaXY+DQo8ZGl2IGNsYXNzPSJlbXBsb3llZS1uYW1lIj5CYWdhczwvZGl2Pg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtYm9udXMiPiQ1MDA8L2Rpdj4NCjxkaXYgY2xhc3M9ImVtcGxveWVlLXRhZyBnb29kIj5Hb29kIMK3IDEwJTwvZGl2Pg0KPC9kaXY+DQoNCjxkaXYgY2xhc3M9ImVtcGxveWVlLWNhcmQiPg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtaWNvbiI+8J+RpDwvZGl2Pg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtbmFtZSI+Sm9hbjwvZGl2Pg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtYm9udXMiPiQxLDQwMDwvZGl2Pg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtdGFnIHZlcnlnb29kIj5WZXJ5IEdvb2QgwrcgMjAlPC9kaXY+DQo8L2Rpdj4NCg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtY2FyZCI+DQo8ZGl2IGNsYXNzPSJlbXBsb3llZS1pY29uIj7wn5GkPC9kaXY+DQo8ZGl2IGNsYXNzPSJlbXBsb3llZS1uYW1lIj5BbHlhPC9kaXY+DQo8ZGl2IGNsYXNzPSJlbXBsb3llZS1ib251cyI+JDMyNTwvZGl2Pg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtdGFnIGF2ZXJhZ2UiPkF2ZXJhZ2UgwrcgNSU8L2Rpdj4NCjwvZGl2Pg0KDQo8ZGl2IGNsYXNzPSJlbXBsb3llZS1jYXJkIj4NCjxkaXYgY2xhc3M9ImVtcGxveWVlLWljb24iPvCfkaQ8L2Rpdj4NCjxkaXYgY2xhc3M9ImVtcGxveWVlLW5hbWUiPkR3aTwvZGl2Pg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtYm9udXMiPiQxLDAwMDwvZGl2Pg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtdGFnIGdvb2QiPkdvb2QgwrcgMTAlPC9kaXY+DQo8L2Rpdj4NCg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtY2FyZCI+DQo8ZGl2IGNsYXNzPSJlbXBsb3llZS1pY29uIj7wn5GkPC9kaXY+DQo8ZGl2IGNsYXNzPSJlbXBsb3llZS1uYW1lIj5OYWJpbDwvZGl2Pg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtYm9udXMiPiQyLDQwMDwvZGl2Pg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtdGFnIHZlcnlnb29kIj5WZXJ5IEdvb2QgwrcgMjAlPC9kaXY+DQo8L2Rpdj4NCg0KPC9kaXY+DQo8L2Rpdj4NCg0KDQotLS0NCg0KIyBGT1IgTE9PUA0KDQojIyBDT05DRVBUIG9mIEZPUiBMT09QDQoNCg0KQSBmb3IgbG9vcCBpcyB1c2VkIHRvICoqcmVwZWF0IGEgY29tbWFuZCBmb3IgZWFjaCBpdGVtIGluIGEgZGF0YXNldC4qKiBJbiB0aGlzIHRhc2ssIHRoZSBmb3IgbG9vcCAqKmNoZWNrcyB0aGUgc2FsYXJ5IG9mIGVhY2ggZW1wbG95ZWUgb25lIGJ5IG9uZS4qKg0KDQpUaGUgcHJvZ3JhbSByZWFkcyB0aGUgZW1wbG95ZWUgZGF0YSByb3cgYnkgcm93IGFuZCBleGFtaW5lcyB3aGV0aGVyIHRoZSAqKnNhbGFyeSBpcyBncmVhdGVyIHRoYW4gNjAwMC4qKiBJZiB0aGUgY29uZGl0aW9uIGlzICoqdHJ1ZSwqKiB0aGUgcHJvZ3JhbSB3aWxsIGRpc3BsYXkgdGhlIGVtcGxveWVl4oCZcyBuYW1lIGFuZCBzYWxhcnkuIElmIHRoZSBzYWxhcnkgaXMgNjAwMCBvciBsZXNzLCB0aGUgZW1wbG95ZWUgd2lsbCBub3QgYmUgc2hvd24gaW4gdGhlIHJlc3VsdC4NCg0KVGhlcmVmb3JlLCB0aGUgZm9yIGxvb3AgaGVscHMgdGhlIHByb2dyYW0gYXV0b21hdGljYWxseSBnbyB0aHJvdWdoIGFsbCBlbXBsb3llZXMgYW5kIHNlbGVjdCBvbmx5IHRob3NlIHdobyBtZWV0IHRoZSBjb25kaXRpb24gd2l0aG91dCBjaGVja2luZyBlYWNoIG9uZSBtYW51YWxseS4NCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30NCg0KY2F0KCI8ZGl2IGNsYXNzPSdzYWxhcnktZ3JpZCc+IikNCg0KZm9yKGkgaW4gMTpucm93KGVtcGxveWVlKSl7DQogIA0KICBpZihlbXBsb3llZSRTYWxhcnlbaV0gPiA2MDAwKXsNCiAgICANCiAgICBzdGF0dXMgPC0gIuKclCINCiAgICBjbGFzc19zdGF0dXMgPC0gInNhbGFyeS1wYXNzIg0KICAgIA0KICB9IGVsc2V7DQogICAgDQogICAgc3RhdHVzIDwtICLinJYiDQogICAgY2xhc3Nfc3RhdHVzIDwtICJzYWxhcnktZmFpbCINCiAgICANCiAgfQ0KICANCiAgY2F0KA0KICAgICI8ZGl2IGNsYXNzPSdzYWxhcnktY2FyZCc+IiwNCiAgICAiPGRpdiBjbGFzcz0nc2FsYXJ5LWljb24nPvCfkaQ8L2Rpdj4iLA0KICAgICI8ZGl2IGNsYXNzPSdzYWxhcnktbmFtZSc+IiwgZW1wbG95ZWUkTmFtZVtpXSwgIjwvZGl2PiIsDQogICAgIjxkaXYgY2xhc3M9J3NhbGFyeS12YWx1ZSc+JCAiLCBlbXBsb3llZSRTYWxhcnlbaV0sICI8L2Rpdj4iLA0KICAgICI8ZGl2IGNsYXNzPSdzYWxhcnktc3RhdHVzICIsIGNsYXNzX3N0YXR1cywgIic+Iiwgc3RhdHVzLCAiPC9kaXY+IiwNCiAgICAiPC9kaXY+Ig0KICApDQp9DQoNCmNhdCgiPC9kaXY+IikNCg0KYGBgDQoNCmBgYHtjc3MgZWNobz1GQUxTRX0NCi5zYWxhcnktZ3JpZHsNCiAgZGlzcGxheTpmbGV4Ow0KICBnYXA6MThweDsNCiAgZmxleC13cmFwOndyYXA7DQogIGp1c3RpZnktY29udGVudDpjZW50ZXI7DQogIG1hcmdpbi10b3A6MTJweDsNCn0NCg0KLnNhbGFyeS1jYXJkew0KICBiYWNrZ3JvdW5kOiNmZmY2ZWI7DQogIGJvcmRlci1yYWRpdXM6MjJweDsNCiAgcGFkZGluZzoxOHB4Ow0KICB3aWR0aDoxNDBweDsNCiAgdGV4dC1hbGlnbjpjZW50ZXI7DQogIGJvcmRlcjoycHggc29saWQgI2U4ZGJmZjsNCiAgYm94LXNoYWRvdzowIDhweCAxNnB4IHJnYmEoMCwwLDAsMC4wOCk7DQp9DQoNCi5zYWxhcnktaWNvbnsNCiAgd2lkdGg6NDBweDsNCiAgaGVpZ2h0OjQwcHg7DQogIG1hcmdpbjphdXRvOw0KICBib3JkZXItcmFkaXVzOjUwJTsNCiAgYmFja2dyb3VuZDojZjFlY2ZmOw0KICBkaXNwbGF5OmZsZXg7DQogIGFsaWduLWl0ZW1zOmNlbnRlcjsNCiAganVzdGlmeS1jb250ZW50OmNlbnRlcjsNCiAgbWFyZ2luLWJvdHRvbTo2cHg7DQp9DQoNCi5zYWxhcnktbmFtZXsNCiAgZm9udC13ZWlnaHQ6NzAwOw0KICBjb2xvcjojMmIzNDQ1Ow0KfQ0KDQouc2FsYXJ5LXZhbHVlew0KICBmb250LXNpemU6MThweDsNCiAgZm9udC13ZWlnaHQ6ODAwOw0KICBjb2xvcjojNDI2M2ViOw0KICBtYXJnaW46NnB4IDA7DQp9DQoNCi5zYWxhcnktc3RhdHVzew0KICBmb250LXNpemU6MTZweDsNCiAgZm9udC13ZWlnaHQ6NzAwOw0KfQ0KDQouc2FsYXJ5LXBhc3N7DQogIGNvbG9yOiMyZjllNDQ7DQp9DQoNCi5zYWxhcnktZmFpbHsNCiAgY29sb3I6I2UwMzEzMTsNCn0NCmBgYA0KDQoNCi0tLQ0KDQojIFdISUxFIExPT1ANCg0KIyMgQ09OQ0VQVCBvZiBXSElMRSBMT09QDQoNCkEgd2hpbGUgbG9vcCBpcyB1c2VkIHRvKiogcmVwZWF0IGEgY29tbWFuZCBhcyBsb25nIGFzIGEgY2VydGFpbiBjb25kaXRpb24gaXMgdHJ1ZS4qKiBJbiB0aGlzIHRhc2ssIHRoZSAqKndoaWxlIGxvb3AgZ29lcyB0aHJvdWdoIHRoZSBlbXBsb3llZSBsaXN0IG9uZSBieSBvbmUuKioNCg0KVGhlIHByb2dyYW0gKipzdGFydHMgZnJvbSB0aGUgZmlyc3QgZW1wbG95ZWUgYW5kIGRpc3BsYXlzIHRoZSBuYW1lIGFuZCBwb3NpdGlvbi4qKiBBZnRlciBzaG93aW5nIHRoZSBpbmZvcm1hdGlvbiwgKip0aGUgcHJvZ3JhbSBjaGVja3Mgd2hldGhlciB0aGUgZW1wbG95ZWXigJlzIHBvc2l0aW9uIGlzIOKAnE1hbmFnZXIu4oCdKioNCg0KKipJZiB0aGUgcG9zaXRpb24gaXMgbm90IE1hbmFnZXIqKiosIHRoZSBsb29wIGNvbnRpbnVlcyB0byB0aGUgbmV4dCBlbXBsb3llZS4gSG93ZXZlciwgd2hlbiB0aGUgcHJvZ3JhbSBmaW5kcyBhbiBlbXBsb3llZSB3aXRoIHRoZSBwb3NpdGlvbiBNYW5hZ2VyLCB0aGUgbG9vcCBzdG9wcy4gDQoNClRoZXJlZm9yZSwgdGhlIHdoaWxlIGxvb3AgYWxsb3dzIHRoZSBwcm9ncmFtIHRvIHByb2Nlc3MgdGhlIGRhdGEgc3RlcCBieSBzdGVwIGFuZCBzdG9wIGF1dG9tYXRpY2FsbHkgd2hlbiBhIHNwZWNpZmljIGNvbmRpdGlvbiBpcyBtZXQsIHdpdGhvdXQgY2hlY2tpbmcgYWxsIGVtcGxveWVlcyBtYW51YWxseS4NCg0KYGBge3IgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9DQoNCmNhdCgiPGRpdiBjbGFzcz0nc2FsYXJ5LWdyaWQnPiIpDQoNCmkgPC0gMQ0KDQp3aGlsZShpIDw9IG5yb3coZW1wbG95ZWUpKXsNCiAgDQogIG5hbWUgPC0gZW1wbG95ZWUkTmFtZVtpXQ0KICBwb3MgIDwtIGVtcGxveWVlJFBvc2l0aW9uW2ldDQogIA0KICBpZihwb3MgPT0gIk1hbmFnZXIiKXsNCiAgICANCiAgICBzdGF0dXMgPC0gIuKclCINCiAgICBjbGFzc19zdGF0dXMgPC0gInNhbGFyeS1wYXNzIg0KICAgIA0KICAgIGNhdCgNCiAgICAgICI8ZGl2IGNsYXNzPSdzYWxhcnktY2FyZCc+IiwNCiAgICAgICI8ZGl2IGNsYXNzPSdzYWxhcnktaWNvbic+8J+RpDwvZGl2PiIsDQogICAgICAiPGRpdiBjbGFzcz0nc2FsYXJ5LW5hbWUnPiIsIG5hbWUsICI8L2Rpdj4iLA0KICAgICAgIjxkaXYgY2xhc3M9J3NhbGFyeS12YWx1ZSc+IiwgcG9zLCAiPC9kaXY+IiwNCiAgICAgICI8ZGl2IGNsYXNzPSdzYWxhcnktc3RhdHVzICIsIGNsYXNzX3N0YXR1cywgIic+Iiwgc3RhdHVzLCAiIE1hbmFnZXIgZm91bmQ8L2Rpdj4iLA0KICAgICAgIjwvZGl2PiINCiAgICApDQogICAgDQogICAgYnJlYWsNCiAgICANCiAgfSBlbHNlew0KICAgIA0KICAgIHN0YXR1cyA8LSAi4pyWIg0KICAgIGNsYXNzX3N0YXR1cyA8LSAic2FsYXJ5LWZhaWwiDQogICAgDQogICAgY2F0KA0KICAgICAgIjxkaXYgY2xhc3M9J3NhbGFyeS1jYXJkJz4iLA0KICAgICAgIjxkaXYgY2xhc3M9J3NhbGFyeS1pY29uJz7wn5GkPC9kaXY+IiwNCiAgICAgICI8ZGl2IGNsYXNzPSdzYWxhcnktbmFtZSc+IiwgbmFtZSwgIjwvZGl2PiIsDQogICAgICAiPGRpdiBjbGFzcz0nc2FsYXJ5LXZhbHVlJz4iLCBwb3MsICI8L2Rpdj4iLA0KICAgICAgIjxkaXYgY2xhc3M9J3NhbGFyeS1zdGF0dXMgIiwgY2xhc3Nfc3RhdHVzLCAiJz4iLCBzdGF0dXMsICI8L2Rpdj4iLA0KICAgICAgIjwvZGl2PiINCiAgICApDQogICAgDQogIH0NCiAgDQogIGkgPC0gaSArIDENCn0NCg0KY2F0KCI8L2Rpdj4iKQ0KDQpgYGANCg0KDQpgYGB7Q1NTIGVjaG89RkFMU0V9DQoud2hpbGUtZ3JpZHsNCiAgZGlzcGxheTpmbGV4Ow0KICBnYXA6MThweDsNCiAgZmxleC13cmFwOndyYXA7DQogIGp1c3RpZnktY29udGVudDpjZW50ZXI7DQogIG1hcmdpbi10b3A6MTVweDsNCn0NCg0KLndoaWxlLWNhcmR7DQogIGJhY2tncm91bmQ6I2ZmZjZlYjsNCiAgYm9yZGVyLXJhZGl1czoyMHB4Ow0KICBwYWRkaW5nOjE2cHg7DQogIHdpZHRoOjE0MHB4Ow0KICB0ZXh0LWFsaWduOmNlbnRlcjsNCiAgYm9yZGVyOjJweCBzb2xpZCAjZThkYmZmOw0KICBib3gtc2hhZG93OjAgNnB4IDE0cHggcmdiYSgwLDAsMCwwLjA4KTsNCn0NCg0KLndoaWxlLWljb257DQogIGZvbnQtc2l6ZToyMHB4Ow0KICBtYXJnaW4tYm90dG9tOjRweDsNCn0NCg0KLndoaWxlLW5hbWV7DQogIGZvbnQtd2VpZ2h0OjcwMDsNCn0NCg0KLndoaWxlLXBvc3sNCiAgZm9udC1zaXplOjE0cHg7DQogIGNvbG9yOiM0MjYzZWI7DQp9DQoNCi5zdG9wLWNhcmR7DQogIGJvcmRlci1jb2xvcjojZmY4Nzg3Ow0KfQ0KDQoud2hpbGUtc3RvcHsNCiAgZm9udC1zaXplOjEycHg7DQogIGNvbG9yOiNlMDMxMzE7DQogIGZvbnQtd2VpZ2h0OjcwMDsNCn0NCg0KYGBgDQoNCi0tLQ0KDQoqKnRoZSBvdXRwdXQgZW5kcyBhdCBEd2ksIGJlY2F1c2UgRHdpIGlzIHRoZSBmaXJzdCBlbXBsb3llZSB3aXRoIHRoZSBwb3NpdGlvbiBNYW5hZ2VyLioqDQoNCg0KLS0tDQoNCg0KIyBCUkVBSw0KDQojIyBDT05DRVBUIG9mIEJSRUFLDQoNClRoZSBicmVhayBzdGF0ZW1lbnQgaXMgKip1c2VkIHRvIGltbWVkaWF0ZWx5IHN0b3AgYSBsb29wIHdoZW4gYSBzcGVjaWZpYyBjb25kaXRpb24gaXMgbWV0LioqDQoNCkluIHRoaXMgdGFzaywgKip0aGUgcHJvZ3JhbSBjaGVja3MgZWFjaCBlbXBsb3llZeKAmXMgc2FsYXJ5IG9uZSBieSBvbmUgdXNpbmcgYSBsb29wLioqIFRoZSBsb29wIGNvbnRpbnVlcyB0byBkaXNwbGF5IHRoZSBlbXBsb3llZeKAmXMgbmFtZSBhbmQgc2FsYXJ5ICoqdW50aWwgaXQgZmluZHMgYW4gZW1wbG95ZWUgd2hvc2Ugc2FsYXJ5IGlzIGFib3ZlIDEwLDAwMC4qKg0KDQpUaGVyZWZvcmUsIHRoZSBicmVhayBzdGF0ZW1lbnQgYWxsb3dzIHRoZSBwcm9ncmFtIHRvIGV4aXQgdGhlIGxvb3AgZWFybHkgb25jZSB0aGUgcmVxdWlyZWQgY29uZGl0aW9uIGlzIGZvdW5kLCBtYWtpbmcgdGhlIHByb2Nlc3MgbW9yZSBlZmZpY2llbnQuDQoNCmBgYHtyIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQ0KDQpjYXQoIjxkaXYgY2xhc3M9J3NhbGFyeS1ncmlkJz4iKQ0KDQpmb3IoaSBpbiAxOm5yb3coZW1wbG95ZWUpKXsNCiAgDQogIGlmKGVtcGxveWVlJFNhbGFyeVtpXSA+IDEwMDAwKXsNCiAgICANCiAgICBjYXQoDQogICAgICAiPGRpdiBjbGFzcz0nc2FsYXJ5LWNhcmQgc3RvcC1jYXJkJz4iLA0KICAgICAgIjxkaXYgY2xhc3M9J3NhbGFyeS1pY29uJz7wn5GkPC9kaXY+IiwNCiAgICAgICI8ZGl2IGNsYXNzPSdzYWxhcnktbmFtZSc+IiwgZW1wbG95ZWUkTmFtZVtpXSwgIjwvZGl2PiIsDQogICAgICAiPGRpdiBjbGFzcz0nc2FsYXJ5LXZhbHVlJz4kICIsIGVtcGxveWVlJFNhbGFyeVtpXSwgIjwvZGl2PiIsDQogICAgICAiPGRpdiBjbGFzcz0nc2FsYXJ5LXN0b3AnPkxvb3AgU3RvcHBlZDwvZGl2PiIsDQogICAgICAiPC9kaXY+Ig0KICAgICkNCiAgICANCiAgICBicmVhaw0KICB9DQogIA0KICBjYXQoDQogICAgIjxkaXYgY2xhc3M9J3NhbGFyeS1jYXJkJz4iLA0KICAgICI8ZGl2IGNsYXNzPSdzYWxhcnktaWNvbic+8J+RpDwvZGl2PiIsDQogICAgIjxkaXYgY2xhc3M9J3NhbGFyeS1uYW1lJz4iLCBlbXBsb3llZSROYW1lW2ldLCAiPC9kaXY+IiwNCiAgICAiPGRpdiBjbGFzcz0nc2FsYXJ5LXZhbHVlJz4kICIsIGVtcGxveWVlJFNhbGFyeVtpXSwgIjwvZGl2PiIsDQogICAgIjwvZGl2PiINCiAgKQ0KICANCn0NCg0KY2F0KCI8L2Rpdj4iKQ0KDQpgYGANCg0KYGBge0NTUyBlY2hvPUZBTFNFfQ0KLnN0b3AtY2FyZHsNCiAgYm9yZGVyLWNvbG9yOiNmZjg3ODc7DQp9DQoNCi5zdG9wLWNhcmQgLnNhbGFyeS1pY29uew0KICBiYWNrZ3JvdW5kOiNmZmUzZTM7DQp9DQoNCmBgYA0KDQotLS0NCg0KV2hlbiB0aGUgcHJvZ3JhbSByZWFjaGVzICoqTmFiaWwqKiwgd2hvc2Ugc2FsYXJ5IGlzIDEyLDAwMCwgdGhlIGNvbmRpdGlvbiBiZWNvbWVzIHRydWUuIEF0IHRoaXMgcG9pbnQsICoqdGhlIGJyZWFrIGNvbW1hbmQgc3RvcHMgdGhlIGxvb3AsIHNvIHRoZSBwcm9ncmFtIGRvZXMgbm90IGNvbnRpbnVlIGNoZWNraW5nIHRoZSByZW1haW5pbmcgZGF0YS4qKg0KDQotLS0NCg0KIyBDT05USU5VRSB0byBTS0lQIChlbXBsb3llZXMgd2l0aCBhdmVyYWdlIHBlcmZvcm1hbmNlKQ0KDQojIyBUSEUgQ09OQ0VQVCANCg0KVGhlIGNvbnRpbnVlIHN0YXRlbWVudCBpcyAqKnVzZWQgdG8gc2tpcCB0aGUgY3VycmVudCBpdGVyYXRpb24gb2YgYSBsb29wIGFuZCBtb3ZlIGRpcmVjdGx5IHRvIHRoZSBuZXh0IG9uZS4qKg0KDQpJbiB0aGlzIHRhc2ssICoqdGhlIHByb2dyYW0gY2hlY2tzIHRoZSBwZXJmb3JtYW5jZSBvZiBlYWNoIGVtcGxveWVlLiBJZiBhbiBlbXBsb3llZSBoYXMg4oCcQXZlcmFnZeKAnSBwZXJmb3JtYW5jZSwgdGhlIHByb2dyYW0gd2lsbCBza2lwIHRoYXQgZW1wbG95ZWUgYW5kIGNvbnRpbnVlIHRvIHRoZSBuZXh0IG9uZS4qKg0KDQpUaGVyZWZvcmUsIHRoZSBjb250aW51ZSBzdGF0ZW1lbnQgaGVscHMgdGhlIHByb2dyYW0gaWdub3JlIGNlcnRhaW4gZGF0YSB3aGlsZSBzdGlsbCBjb250aW51aW5nIHRoZSBsb29wIGZvciB0aGUgcmVzdCBvZiB0aGUgZGF0YXNldC4NCg0KYGBge3IgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9DQoNCmNhdCgiPGRpdiBjbGFzcz0nc2FsYXJ5LWdyaWQnPiIpDQoNCmZvcihpIGluIDE6bnJvdyhlbXBsb3llZSkpew0KICANCiAgaWYoZW1wbG95ZWUkUGVyZm9ybWFuY2VbaV0gPT0gIkF2ZXJhbmdlIil7DQogICAgDQogICAgY2F0KA0KICAgICAgIjxkaXYgY2xhc3M9J3NhbGFyeS1jYXJkIHNraXAtY2FyZCc+IiwNCiAgICAgICI8ZGl2IGNsYXNzPSdzYWxhcnktaWNvbic+8J+RpDwvZGl2PiIsDQogICAgICAiPGRpdiBjbGFzcz0nc2FsYXJ5LW5hbWUnPiIsIGVtcGxveWVlJE5hbWVbaV0sICI8L2Rpdj4iLA0KICAgICAgIjxkaXYgY2xhc3M9J3NhbGFyeS12YWx1ZSc+QXZlcmFnZTwvZGl2PiIsDQogICAgICAiPGRpdiBjbGFzcz0nc2FsYXJ5LXN0b3AnPlNraXBwZWQ8L2Rpdj4iLA0KICAgICAgIjwvZGl2PiINCiAgICApDQogICAgDQogICAgbmV4dA0KICB9DQogIA0KICBjYXQoDQogICAgIjxkaXYgY2xhc3M9J3NhbGFyeS1jYXJkJz4iLA0KICAgICI8ZGl2IGNsYXNzPSdzYWxhcnktaWNvbic+8J+RpDwvZGl2PiIsDQogICAgIjxkaXYgY2xhc3M9J3NhbGFyeS1uYW1lJz4iLCBlbXBsb3llZSROYW1lW2ldLCAiPC9kaXY+IiwNCiAgICAiPGRpdiBjbGFzcz0nc2FsYXJ5LXZhbHVlJz4iLCBlbXBsb3llZSRQZXJmb3JtYW5jZVtpXSwgIjwvZGl2PiIsDQogICAgIjwvZGl2PiINCiAgKQ0KICANCn0NCg0KY2F0KCI8L2Rpdj4iKQ0KDQpgYGANCg0KYGBge2NzcyBlY2hvPUZBTFNFfQ0KLnNraXAtY2FyZHsNCiAgYm9yZGVyLWNvbG9yOiNmZmQ0M2I7DQp9DQoNCi5za2lwLWNhcmQgLnNhbGFyeS1zdG9wew0KICBjb2xvcjojZjA4YzAwOw0KfQ0KDQpgYGAgICAgICAgICAgICAgICAgIA0KDQotLS0NCg0KVGhpcyBtZWFucyB0aGUgZW1wbG95ZWUgd2l0aCAqKkF2ZXJhZ2UgcGVyZm9ybWFuY2UgKEFseWEpKiogd2lsbCBub3QgYmUgZGlzcGxheWVkIGluIHRoZSByZXN1bHQuIFRoZSBsb29wIGNvbnRpbnVlcyB0byBwcm9jZXNzIHRoZSByZW1haW5pbmcgZW1wbG95ZWVzIG5vcm1hbGx5Lg0KDQotLS0NCg0KPHNjcmlwdD4NCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsNCg0KICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7DQoNCiAgLyogPT09PT09IFNUQVJUOiBTSURFQkFSIE9UT01BVElTIEtFVFVUVVAgPT09PT09ICovDQogIC8vIHBhcyBwZXJ0YW1hIGthbGkgaGFsYW1hbiBzZWxlc2FpIGRpLWxvYWQsIGxhbmdzdW5nIG1vZGUgImNvbGxhcHNlZCINCiAgYm9keS5jbGFzc0xpc3QuYWRkKCJzaWRlYmFyLWNvbGxhcHNlZCIpOw0KICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCg0KICAvLyA9PT09IFRPR0dMRSBTSURFQkFSIChIQU1CVVJHRVIpID09PT0NCiAgdmFyIG1lbnVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2lkZWJhci10b2dnbGUiKTsNCiAgaWYgKG1lbnVCdG4pIHsNCiAgICBtZW51QnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKCkgew0KICAgICAgLy8ga2xpayA9IGJ1a2EgLyB0dXR1cCBhcmVhIHBpbmsNCiAgICAgIGJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgic2lkZWJhci1jb2xsYXBzZWQiKTsNCiAgICB9KTsNCiAgfQ0KDQogIC8vID09PT0gVE9HR0xFIExJR0hUIC8gREFSSyBNT0RFID09PT0NCiAgdmFyIG1vZGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibW9kZS10b2dnbGUiKTsNCiAgaWYgKG1vZGVCdG4pIHsNCg0KICAgIC8vIGNvYmEgYmFjYSBtb2RlIHlhbmcgZGlzaW1wYW4gKGthbGF1IGFkYSkNCiAgICB2YXIgc2F2ZWRNb2RlID0gbnVsbDsNCiAgICB0cnkgew0KICAgICAgc2F2ZWRNb2RlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIm51cnVsLXRoZW1lLW1vZGUiKTsNCiAgICB9IGNhdGNoIChlKSB7DQogICAgICBzYXZlZE1vZGUgPSBudWxsOw0KICAgIH0NCiAgICBpZiAoc2F2ZWRNb2RlID09PSAiZGFyayIpIHsNCiAgICAgIGJvZHkuY2xhc3NMaXN0LmFkZCgiZGFyay1tb2RlIik7DQogICAgfQ0KDQogICAgbW9kZUJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsNCiAgICAgIGJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgiZGFyay1tb2RlIik7DQogICAgICB0cnkgew0KICAgICAgICB2YXIgaXNEYXJrID0gYm9keS5jbGFzc0xpc3QuY29udGFpbnMoImRhcmstbW9kZSIpOw0KICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgibnVydWwtdGhlbWUtbW9kZSIsIGlzRGFyayA/ICJkYXJrIiA6ICJsaWdodCIpOw0KICAgICAgfSBjYXRjaCAoZSkgew0KICAgICAgICAvLyBrYWxhdSBsb2NhbFN0b3JhZ2UgbmdnYWsgYmlzYSwgZGllbSBhamENCiAgICAgIH0NCiAgICB9KTsNCiAgfQ0KDQp9KTsNCjwvc2NyaXB0Pg0KDQoNCg==