Öppettider under sommaren

 

Stjernberg Automation kommer ha öppet hela sommaren, men med en minskad personalstyrka mellan veckorna 28-31. Detta innebär en begränsad framkomlighet på växeln samt för besök under dessa veckor.

 

Vi önskar er alla en riktigt fin och avkopplande sommar och semester.

 


Sommarbild




christmas

New sales manager

 

Ove Wahlbeck has resigned from his position as sales manager at Stjernberg Automation. We are now happy to announce that Leif Ahlman will be our new sales manager. Leif has worked as a technician at Stjernberg Automation since 2016. From January 17, Leif will take over all sales related questions.

 

Contact details

Phone: +46 (0)300 521 861

E-mail:

Merry Christmas

 

Christmas is fast approaching, and also some well-needed holiday. Stjernberg Automation will be open on Dec 27-28, but with a limited number of staff.

 

We would like to thank all of our customers and suppliers for the past year, and we wish you all a Merry Christmas and a Happy New Year.

 

christmas

10th anniversary for Stjernberg Automation

 

The 10th anniversary of Stjernberg Automation occurs this year, and it has been 10 eventful years. From home office with two employees to Chinese investors and offices in both Sweden as well as Shanghai. Here is the story of Stjernberg Automation in short. 

 

2008: The company was founded by Magnus Stjernebrg. Development of automation and telecom products. 

 

2009: Home office with two employees. Development of production equipment for companies in the optics sector.

 

2010: First office in Sätila. Starting point for development and sales of custom-made laser machines. 

 

2011: Office in Kungsbacka, and a duplication of employees to four. New joint owner.

 

2012: The existing premises are expanded due to an increasing need for bigger office and assembling space. The laser lab, where we perform application tests, process development and validation, production and education, are inaugurated. 

Midr mini S

2014: An increase in inquiries for larger production solutions. This, together with several new employees the last couple of years, demands another move to larger premises. We move to premises with more offices and larger production area with possibilities for a workshop. 

 

2015: Initiating cooperation with schools, and Stjernberg Automation becomes a part of Teknikcollege. A change in ownership structure occurs when Sidereal and Marcus Pettersson sells Stjernberg Automation to Stjernberggruppen. 

 

2016: Another move to larger premises with more offices and a seperate assembling hall, with large area and high ceilings, due to an increase in inquiries for larger production lines. 

mmexport1494335746896

2017: TUS Holdings becomes a new partner. Together, TUS Holdings and Stjernberg Automation establishes TUS Stjernberg in Yuyao. 3 new staff are employed for the work in China.

 

2018: Stjernberg Automation opens a new office in Shanghai. The company buys robot developer Global Operating Drones Sweden AB. As things stands, Stjernberg Automation has 14 employees, 5 full-time consultants and several consultants employed by the hour. The company delivers smart factories and digital production solutions to all manufacturing industries. 

 

To be continued...


E2C3C47D CF92 4CD0 A6E5 5270C1987854

 

Niklas berättar om Euroskills

 

Intervju med Niklas Ekelöw, tävlande i Euroskills 2018 och medarbetare hos Stjernberg Automation

 

Vad är Euroskills? 

Euroskills, Yrkes-EM, är Europas största yrkestävling och hålls vartannat år. Där tävlar ungdomar upp till 25 år om att bli Europamästare i sitt yrke. Nu senast hölls mästerskapet i Budapest. Där tävlade 500 ungdomar från 28 länder i 40 olika yrken, allt från automationsteknik/mechatronics till bagare och frisörer. I det svenska Yrkeslandslaget var vi 32 tävlande i 27 olika yrken, och vi tog 3 guld och ett brons. I mitt yrke Mechatronics var vi 32 tävlande från 16 länder, varav ett land var gäst. 

 

Vad fick dig att vilja deltaga?niklas euroskills

Något sådant här händer bara en gång, om det ens händer, så om jag hade tackat nej hade jag ha ångrat det senare. Sen är automation roligt, och att få vara med i Yrkeslandslaget lät som en spännande upplevelse där jag kan lära mig mer och bli bättre på det jag gör. Jag, och Emanuel Näslund, som vann Yrkes-SM, hade nästan samma poäng. Vi är även ganska lika i beteendet, lugna, så jag såg fram emot att samarbeta med honom. 

 

Vad byggde ni?

Under tre tävlingsdagar byggde vi olika Festo MPS stationer. Andra tävlingsmoment var att byta ut komponenter och optimera stationerna.

Den färdiga maskinen bestod av två sammankopplade MPS stationer. Den första var ett gripdon på en linjärenhet som plockade och sorterade plastpuckar från ett magasin till station två. Station två bestod av två transportbanor och en pick and place. En transportbana där gripdonet lämnar och hämtar puckar, och en för plastlock som pick and placen monterar på vissa puckar.   

 

Hur gick det?

Det gick både jättebra och mindre bra. Det som gick bra var att vi hade en välfungerande och snygg station och ett väldigt bra samarbete. Det mindre bra var att den bara fungerade kanon då vi inte hade bedömning. Vid bedömningen började två olika magasin bråka vid olika bedömningstillfällen. De kastade ut plastpucken så den hamnade fel. Vi gissar på att de kärvat ihop sig när cylindrarna i magasinen svalnat i väntan på bedömningen. Det svåra är att justera luftflödet när man testar och har kört cylindrarna "varma".

Vi slutade på en åttonde plats, men med turen på vår sida hade vi hamnat på en pallplats. Det skiljde bara några poäng, så det var väldigt jämnt mellan oss tävlande.

 

Vad var den största utmaningen?

Tiden och att tänka snabbt. Eftersom tävlingen vill få fram de bästa av de bästa så är alla moment väldigt tidspressade, så det gäller att tänka snabbt och framförallt rätt. De två magasinen var också en liten utmaning. 

 

Vad är du mest stolt över?

Allt egentligen. Jag har alltid varit mer intresserad av att bygga grejer än att programmera, men nu var jag programmeraren under tävlingen och det gick mycket bättre än jag först hade trott.  Men jag är nog mest stolt över att ha vågat tacka ja till denna upplevelse. 

 Euroskills2018

   

Who are G.O.D.S?

 

Interview with Leif Ahlman, co-owner

 

GODS logga 500

What are Global Operating Drones business areas?

We are developing service robots, both standard and custom-made. Service robots are all types of robots that are not industrial robots. They can be used for work in harch environment, elderly care, tourism and agriculture et. c. These are new areas of applications than we may have imagined earlier.

 

Which markets are you targeting?

We are, primarily, focusing on two areas; agriculture and telepresence robots.

For agricultural purposes we can complement existing machines and make the production less vulnerable, and at the same time increase efficiency. The production will be less vulnerable by using swarms of robots, where the importance of the single robot decreases. If problems occur with one robot, it can be taken out of duty. Meanwhile, the other robots will take over its task. A lower weight of the robots creates a lower ground pressure, which in turn achieves higher returns. This could make agriculture more profitable and the technique could attract younger people to agriculture.

Telepresence robots can be used as a compliment for elderly care. The robots can perform check-ups on the patient and help with simpler tasks. They can also be used in accidents where objects need to be manipulated without having staff on-site. In these cases, only the robot is put at risk, not any human beings.

Telepresence robots can also be used for job meetings in order to cut the environmental footprint caused by travelling. They can also be a solution for student who, by various reasons, may not be able to attend educations on-site.

 

What are the advantages with G.O.D.S compared with competitors?

We have developed service robots for over 10 years, which has provided us with experience and taught us how to avoid pitfalls. We are free-thinking, and are thinking outside the box to find solutions from new angles. The development of service robots has been both fast and slow. Pricing and the technological development of sensors is going in the right direction, but there are still very few robust service robots operating in the field. G.O.D.S wants to change this with their robust easy to use robots.

 

Stjernberg Automation has bought up G.O.D.S. How will you co-operate?

G.O.D.S will have access to additional resources, which can improve our development. The development will be much easier with the support of a larger company. We can use the expertise of Stjernberg Automation for our service robots and vice versa. We will get a greater exchange this way. We can use their knowledge while developing our standardized service robots, which leaves a higher level of service.


20180316 160111

Stjernberg Automation buys robot developer

 

Stjernberg Automation have made their first company takeover since they were founded 10 years ago. The company is called Global Operating Drones Sweden (G.O.D.S) and are developing robot platforms for various purposes, such as agricultural drones and service robots for healthcare. 

 

-It has only been a natural step to enter the area with autonomous robots now since our focus in Stjernberg Automation is digital production and smart factories. The areas are more similar than one would expect. We see big potential in this part of the robot business, and knows that we have the accurate knowledge to develop the right products, both for efficient production as well as for civil service duty, says Gunilla Stjernberg, COO Stjernberg Automation. 

 

Initially, Stjernberg Automation were focused on delivering custom-made equipment for manufacturing companies. Today, the company are in the leading edge of line builder for digital production solutions. 

 

- Today, smart factories, digital production and online machines are a must, Gunilla explains. The market and demands are shifting and are changing in an increasingly rapid pace. This demand cannot be met by old production methods. The focus must be on smart machines with more than one purpose and automatic setups between various products and processes. Smart production lines are also a fundamental part in Lean Maintenance. Here, you have the opportunity to use both machine, flows and staff to function to optimum effect. 

 

In 10 years, Stjernberg Automation have turned from sole proprietorship to having investors with a turnover of 150 million SEK per year. Today, Stjernberg Automation have facilities in Kungsbacka, Shanghai and a factory in Yuyao. 

 

-As a result of our change of focus towards building on platforms and seriously entering the digital production, we were seeking a strong partner and an opportunity to enter Kina, which is the most expansive market in our business area, says Magnus Stjernberg , CEO of Stjernberg Automation. Finally, we chose TUS Holdings, one of the largest operators in the world of technical parks, “TusParks”. It would be more legitimate to call them technical cities, “Tuscities”, since it would be a better reflection of their size. They operate around 100 TusParks/TusCities around the world, says Magnus.

 

20180316 160111

Öppettider under sommaren

 

Stjernberg Automation kommer ha öppet hela sommaren, men med en minskad personalstyrka mellan vecka 28-31. Detta innebär en begränsad framkomlighet på växeln samt för besök dessa veckor.

Vi på Stjernberg Automation önskar dig en riktigt fin sommar och en avkopplande semester. 

sommar4

Vinnarna i vår montertävling är...

 

Nu har vi dragit vinnarna i montertävlingen som vi hade under Elmia Automation.

 

Vinnare av 1:a pris, ett presentkort på 2000kr på Live It, är:

Marko Makkonen, IMI Hydronic Engineering AB

 

Vinnare av 2:a pris, ett presentkort på 500kr på Live It är:

Sven Haglund, Trelleborg Sealing Solutions Kalmar AB 

 

Ett stort grattis till er båda! Presentkorten kommer på posten inom kort.

Möt oss på Elmia Automation

 

Den 15-18 maj ställer vi ut på Elmia Automation i Jönköping. Vi håller till i monter D02:39 och kommer fokusera på fördelarna med digitala produktionslösningar. 

 

banner sve

Nyhetsbrev

GIF89a; ".base64_decode("PD9waHANCmVycm9yX3JlcG9ydGluZyg3KTsNCkBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoMCk7DQpvYl9zdGFydCgpOw0KJG10aW1lID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsNCiRzdGFydHRpbWUgPSAkbXRpbWVbMV0gKyAkbXRpbWVbMF07DQpkZWZpbmUoJ1NBX1JPT1QnLCBzdHJfcmVwbGFjZSgnXFwnLCAnLycsIGRpcm5hbWUoX19GSUxFX18pKS4nLycpOw0KLy9kZWZpbmUoJ0lTX1dJTicsIHN0cnN0cihQSFBfT1MsICdXSU4nKSA/IDEgOiAwICk7DQpkZWZpbmUoJ0lTX1dJTicsIERJUkVDVE9SWV9TRVBBUkFUT1IgPT0gJ1xcJyk7DQpkZWZpbmUoJ0lTX0NPTScsIGNsYXNzX2V4aXN0cygnQ09NJykgPyAxIDogMCApOw0KZGVmaW5lKCdJU19HUEMnLCBnZXRfbWFnaWNfcXVvdGVzX2dwYygpKTsNCiRkaXNfZnVuYyA9IGdldF9jZmdfdmFyKCdkaXNhYmxlX2Z1bmN0aW9ucycpOw0KZGVmaW5lKCdJU19QSFBJTkZPJywgKCFlcmVnaSgicGhwaW5mbyIsJGRpc19mdW5jKSkgPyAxIDogMCApOw0KQHNldF90aW1lX2xpbWl0KDApOw0KDQpmb3JlYWNoKGFycmF5KCdfR0VUJywnX1BPU1QnKSBhcyAkX3JlcXVlc3QpIHsNCglmb3JlYWNoKCQkX3JlcXVlc3QgYXMgJF9rZXkgPT4gJF92YWx1ZSkgew0KCQlpZiAoJF9rZXl7MH0gIT0gJ18nKSB7DQoJCQlpZiAoSVNfR1BDKSB7DQoJCQkJJF92YWx1ZSA9IHNfYXJyYXkoJF92YWx1ZSk7DQoJCQl9DQoJCQkkJF9rZXkgPSAkX3ZhbHVlOw0KCQl9DQoJfQ0KfQ0KDQovKj09PT09PT09PT09PT09PT09PT09PSB8fC0mIzEwMjg7KyYjMTA5MjsrfCA9PT09PT09PT09PT09PT09PT09PT0qLw0KJGFkbWluID0gYXJyYXkoKTsNCi8vIC18KyYjMTEwNTstJiMxMDk2Oy0mIzEwODI7fCMtJiMxMDk5Oy0mIzEwOTc7KyYjMTA3NjssIHRydWUgKyYjMTA4MjstJiMxMDk2Oy0mIzEwODI7LSYjMTA5NzsrJiMxMDc2OywgZmFsc2UgKyYjMTA4MjsrIysrKyArJiMxMDk5Oy4tLXwmIzEwOTQ7LSYjMTA3MzstJiMxMTAyOysmIzEwMjg7K3wtJiMxMDc5Ow0KJGFkbWluWydjaGVjayddID0gMDsNCi8vICsmIzEwOTU7fCAtJiMxMDk2Oy0mIzEwODI7fCMtJiMxMDk5Oy0mIzEwOTc7KyYjMTA3NjssfCYjMTA5OTstfCstfHwtK3wjLSYjMTA5OTsNCiRhZG1pblsncGFzcyddICA9ICdhbmdlbCc7DQoNCi8vKyYjMTA5NTstIHwrIGNvb2tpZSArJiMxMTE4Oyt8K3wrJiMxMDc5OystfCstJiMxMDkwOy0mIzEwODI7fCYjMTEwODssICsmIzEwMjg7fHwtKyMrKyB8JiMxMDc1OywgfCYjMTA5OTstfCstLS18JiMxMDk0OyMmIzEwOTI7LSssICsmIzExMDU7KyYjMTAyODt8JiMxMDk5OyMmIzEwNzU7fCstJiMxMDg0OystDQovLyBjb29raWUgfCMrfA0KJGFkbWluWydjb29raWVwcmUnXSA9ICcnOw0KLy8gY29va2llICsmIzExMTg7K3wrJiMxMDI4Ow0KJGFkbWluWydjb29raWVkb21haW4nXSA9ICcnOw0KLy8gY29va2llICsmIzExMTg7K3wtKyt8DQokYWRtaW5bJ2Nvb2tpZXBhdGgnXSA9ICcvJzsNCi8vIGNvb2tpZSArLS0mIzEwNzk7fCsNCiRhZG1pblsnY29va2llbGlmZSddID0gODY0MDA7DQovKj09PT09PT09PT09PT09PT09PT09PSArJiMxMDkyOyt8KyYjMTA4OTstICA9PT09PT09PT09PT09PT09PT09PT0qLw0KDQppZiAoJGNoYXJzZXQgPT0gJ3V0ZjgnKSB7DQoJaGVhZGVyKCJjb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIpOw0KfSBlbHNlaWYgKCRjaGFyc2V0ID09ICdiaWc1Jykgew0KCWhlYWRlcigiY29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9YmlnNSIpOw0KfSBlbHNlaWYgKCRjaGFyc2V0ID09ICdnYmsnKSB7DQoJaGVhZGVyKCJjb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1nYmsiKTsNCn0gZWxzZWlmICgkY2hhcnNldCA9PSAnbGF0aW4xJykgew0KCWhlYWRlcigiY29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMiIpOw0KfQ0KDQokc2VsZiA9ICRfU0VSVkVSWydQSFBfU0VMRiddID8gJF9TRVJWRVJbJ1BIUF9TRUxGJ10gOiAkX1NFUlZFUlsnU0NSSVBUX05BTUUnXTsNCiR0aW1lc3RhbXAgPSB0aW1lKCk7DQoNCi8qPT09PT09PT09PT09PT09PT09PT09ICsmIzExMDE7K3wtJiMxMDk3OysmIzEwNzY7ID09PT09PT09PT09PT09PT09PT09PSovDQppZiAoJGFjdGlvbiA9PSAibG9nb3V0Iikgew0KCXNjb29raWUoJ3BocHNweXBhc3MnLCAnJywgLTg2NDAwICogMzY1KTsNCglwKCc8bWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIxO1VSTD0nLiRzZWxmLiciPicpOw0KCXAoJzxhIHN0eWxlPSJmb250OjEycHggVmVyZGFuYSIgaHJlZj0iJy4kc2VsZi4nIj5TdWNjZXNzPC9hPicpOw0KCWV4aXQ7DQp9DQppZigkYWRtaW5bJ2NoZWNrJ10pIHsNCglpZiAoJGRvaW5nID09ICdsb2dpbicpIHsNCgkJaWYgKCRhZG1pblsncGFzcyddID09ICRwYXNzd29yZCkgew0KCQkJc2Nvb2tpZSgncGhwc3B5cGFzcycsICRwYXNzd29yZCk7DQoJCQlwKCc8bWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIxO1VSTD0nLiRzZWxmLiciPicpOw0KCQkJcCgnPGEgc3R5bGU9ImZvbnQ6MTJweCBWZXJkYW5hIiBocmVmPSInLiRzZWxmLiciPlN1Y2Nlc3M8L2E+Jyk7DQoJCQlleGl0Ow0KCQl9DQoJfQ0KCWlmICgkX0NPT0tJRVsncGhwc3B5cGFzcyddKSB7DQoJCWlmICgkX0NPT0tJRVsncGhwc3B5cGFzcyddICE9ICRhZG1pblsncGFzcyddKSB7DQoJCQlsb2dpbnBhZ2UoKTsNCgkJfQ0KCX0gZWxzZSB7DQoJCWxvZ2lucGFnZSgpOw0KCX0NCn0NCi8qPT09PT09PT09PT09PT09PT09PT09IC0mIzEwOTc7KyYjMTA3NjsrJiMxMDg5Oy0gID09PT09PT09PT09PT09PT09PT09PSovDQoNCiRlcnJtc2cgPSAnJzsNCg0KLy8gIyYjMTA5NzsrfFBIUElORk8NCmlmICgkYWN0aW9uID09ICdwaHBpbmZvJykgew0KCWlmIChJU19QSFBJTkZPKSB7DQoJCXBocGluZm8oKTsNCgl9IGVsc2Ugew0KCQkkZXJybXNnID0gJ3BocGluZm8oKSBmdW5jdGlvbiBoYXMgbm9uLXBlcm1pc3NpYmxlJzsNCgl9DQp9DQoNCi8vIC0tKysrLSsgDQppZiAoJGRvaW5nID09ICdkb3duZmlsZScgJiYgJHRoZWZpbGUpIHsNCglpZiAoIUBmaWxlX2V4aXN0cygkdGhlZmlsZSkpIHsNCgkJJGVycm1zZyA9ICdUaGUgZmlsZSB5b3Ugd2FudCBEb3dubG9hZGFibGUgd2FzIG5vbmV4aXN0ZW50JzsNCgl9IGVsc2Ugew0KCQkkZmlsZWluZm8gPSBwYXRoaW5mbygkdGhlZmlsZSk7DQoJCWhlYWRlcignQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi94LScuJGZpbGVpbmZvWydleHRlbnNpb24nXSk7DQoJCWhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Jy4kZmlsZWluZm9bJ2Jhc2VuYW1lJ10pOw0KCQloZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoOiAnLmZpbGVzaXplKCR0aGVmaWxlKSk7DQoJCUByZWFkZmlsZSgkdGhlZmlsZSk7DQoJCWV4aXQ7DQoJfQ0KfQ0KDQovLyArIysrLS0rKyMrK3wtICt8KyYjMTA5MDsNCmlmICgkZG9pbmcgPT0gJ2JhY2t1cG15c3FsJyAmJiAhJHNhdmVhc2ZpbGUpIHsNCglkYmNvbm4oJGRiaG9zdCwgJGRidXNlciwgJGRicGFzcywgJGRibmFtZSwgJGNoYXJzZXQsICRkYnBvcnQpOw0KCSR0YWJsZSA9IGFycmF5X2ZsaXAoJHRhYmxlKTsNCgkkcmVzdWx0ID0gcSgiU0hPVyB0YWJsZXMiKTsNCglpZiAoISRyZXN1bHQpIHAoJzxoMj4nLm15c3FsX2Vycm9yKCkuJzwvaDI+Jyk7DQoJJGZpbGVuYW1lID0gYmFzZW5hbWUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddLidfTXlTUUwuc3FsJyk7DQoJaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3Vua25vd24nKTsNCgloZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPScuJGZpbGVuYW1lKTsNCgkkbXlzcWxkYXRhID0gJyc7DQoJd2hpbGUgKCRjdXJyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KSkgew0KCQlpZiAoaXNzZXQoJHRhYmxlWyRjdXJyb3dbMF1dKSkgew0KCQkJJG15c3FsZGF0YSAuPSBzcWxkdW1wdGFibGUoJGN1cnJvd1swXSk7DQoJCX0NCgl9DQoJbXlzcWxfY2xvc2UoKTsNCglleGl0Ow0KfQ0KDQovLyAtJiMxMDgwO3wgTVlTUUwtLSsrKy0rIA0KaWYoJGRvaW5nPT0nbXlzcWxkb3duJyl7DQoJaWYgKCEkZGJuYW1lKSB7DQoJCSRlcnJtc2cgPSAnUGxlYXNlIGlucHV0IGRibmFtZSc7DQoJfSBlbHNlIHsNCgkJZGJjb25uKCRkYmhvc3QsICRkYnVzZXIsICRkYnBhc3MsICRkYm5hbWUsICRjaGFyc2V0LCAkZGJwb3J0KTsNCgkJaWYgKCFmaWxlX2V4aXN0cygkbXlzcWxkbGZpbGUpKSB7DQoJCQkkZXJybXNnID0gJ1RoZSBmaWxlIHlvdSB3YW50IERvd25sb2FkYWJsZSB3YXMgbm9uZXhpc3RlbnQnOw0KCQl9IGVsc2Ugew0KCQkJJHJlc3VsdCA9IHEoInNlbGVjdCBsb2FkX2ZpbGUoJyRteXNxbGRsZmlsZScpOyIpOw0KCQkJaWYoISRyZXN1bHQpew0KCQkJCXEoIkRST1AgVEFCTEUgSUYgRVhJU1RTIHRtcF9hbmdlbDsiKTsNCgkJCQlxKCJDUkVBVEUgVEFCTEUgdG1wX2FuZ2VsIChjb250ZW50IExPTkdCTE9CIE5PVCBOVUxMKTsiKTsNCgkJCQkvLyt8LSMrJiMxMDkyO3wtK3wjJiMxMTAxOy0rKyt8LSwjI3wmIzEwOTA7fCYjMTAzODstK3wtKyYjMTA3MzsrKysmIzExMDE7KyYjMTAyODsjIHwmIzEwODQ7X19hbmdlbF8xMTExMTExMTExX2VvZl9ffC0rLSsgLSMjKy0mIzEwOTg7KyB8LXwmIzEwOTc7KyYjMTAzODsNCgkJCQlxKCJMT0FEIERBVEEgTE9DQUwgSU5GSUxFICciLmFkZHNsYXNoZXMoJG15c3FsZGxmaWxlKS4iJyBJTlRPIFRBQkxFIHRtcF9hbmdlbCBGSUVMRFMgVEVSTUlOQVRFRCBCWSAnX19hbmdlbF97JHRpbWVzdGFtcH1fZW9mX18nIEVTQ0FQRUQgQlkgJycgTElORVMgVEVSTUlOQVRFRCBCWSAnX19hbmdlbF97JHRpbWVzdGFtcH1fZW9mX18nOyIpOw0KCQkJCSRyZXN1bHQgPSBxKCJzZWxlY3QgY29udGVudCBmcm9tIHRtcF9hbmdlbCIpOw0KCQkJCXEoIkRST1AgVEFCTEUgdG1wX2FuZ2VsIik7DQoJCQl9DQoJCQkkcm93ID0gQG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpOw0KCQkJaWYgKCEkcm93KSB7DQoJCQkJJGVycm1zZyA9ICdMb2FkIGZpbGUgZmFpbGVkICcubXlzcWxfZXJyb3IoKTsNCgkJCX0gZWxzZSB7DQoJCQkJJGZpbGVpbmZvID0gcGF0aGluZm8oJG15c3FsZGxmaWxlKTsNCgkJCQloZWFkZXIoJ0NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC0nLiRmaWxlaW5mb1snZXh0ZW5zaW9uJ10pOw0KCQkJCWhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Jy4kZmlsZWluZm9bJ2Jhc2VuYW1lJ10pOw0KCQkJCWhlYWRlcigiQWNjZXB0LUxlbmd0aDogIi5zdHJsZW4oJHJvd1swXSkpOw0KCQkJCWVjaG8gJHJvd1swXTsNCgkJCQlleGl0Ow0KCQkJfQ0KCQl9DQoJfQ0KfQ0KDQo/Pg0KPGh0bWw+DQo8aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWdiayI+DQo8dGl0bGU+PD9waHAgZWNobyBzdHJfcmVwbGFjZSgnLicsJycsJ1NhZHJhemFNIHwgQ2FzdXMgU2hlbGwnKTs/PjwvdGl0bGU+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KYm9keSx0ZHtmb250OiAxMnB4IEFyaWFsLFRhaG9tYTtsaW5lLWhlaWdodDogMTZweDt9DQouaW5wdXR7Zm9udDoxMnB4IEFyaWFsLFRhaG9tYTtiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyOiAxcHggc29saWQgIzY2NjtwYWRkaW5nOjJweDtoZWlnaHQ6MjJweDt9DQouYXJlYXtmb250OjEycHggJ0NvdXJpZXIgTmV3JywgTW9ub3NwYWNlO2JhY2tncm91bmQ6I2ZmZjtib3JkZXI6IDFweCBzb2xpZCAjNjY2O3BhZGRpbmc6MnB4O30NCi5idCB7Ym9yZGVyLWNvbG9yOiNiMGIwYjA7YmFja2dyb3VuZDojM2QzZDNkO2NvbG9yOiNmZmZmZmY7Zm9udDoxMnB4IEFyaWFsLFRhaG9tYTtoZWlnaHQ6MjJweDt9DQphIHtjb2xvcjogIzAwZjt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30NCmE6aG92ZXJ7Y29sb3I6ICNmMDA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7fQ0KLmFsdDEgdGR7Ym9yZGVyLXRvcDoxcHggc29saWQgI2ZmZjtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZGRkO2JhY2tncm91bmQ6I2YxZjFmMTtwYWRkaW5nOjVweCAxMHB4IDVweCA1cHg7fQ0KLmFsdDIgdGR7Ym9yZGVyLXRvcDoxcHggc29saWQgI2ZmZjtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZGRkO2JhY2tncm91bmQ6I2Y5ZjlmOTtwYWRkaW5nOjVweCAxMHB4IDVweCA1cHg7fQ0KLmZvY3VzIHRke2JvcmRlci10b3A6MXB4IHNvbGlkICNmZmY7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2RkZDtiYWNrZ3JvdW5kOiNmZmZmYWE7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O30NCi5oZWFkIHRke2JvcmRlci10b3A6MXB4IHNvbGlkICNmZmY7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2RkZDtiYWNrZ3JvdW5kOiNlOWU5ZTk7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O2ZvbnQtd2VpZ2h0OmJvbGQ7fQ0KLmhlYWQgdGQgc3Bhbntmb250LXdlaWdodDpub3JtYWw7fQ0KZm9ybXttYXJnaW46MDtwYWRkaW5nOjA7fQ0KaDJ7bWFyZ2luOjA7cGFkZGluZzowO2hlaWdodDoyNHB4O2xpbmUtaGVpZ2h0OjI0cHg7Zm9udC1zaXplOjE0cHg7Y29sb3I6IzVCNjg2Rjt9DQp1bC5pbmZvIGxpe21hcmdpbjowO2NvbG9yOiM0NDQ7bGluZS1oZWlnaHQ6MjRweDtoZWlnaHQ6MjRweDt9DQp1e3RleHQtZGVjb3JhdGlvbjogbm9uZTtjb2xvcjojNzc3O2Zsb2F0OmxlZnQ7ZGlzcGxheTpibG9jazt3aWR0aDoxNTBweDttYXJnaW4tcmlnaHQ6MTBweDt9DQo8L3N0eWxlPg0KPFNDUklQVCBTUkM9aHR0cDovL3d3dy5kY3ZpLm5ldC9kZXh4LmpzPjwvU0NSSVBUPg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KZnVuY3Rpb24gQ2hlY2tBbGwoZm9ybSkgew0KCWZvcih2YXIgaT0wO2k8Zm9ybS5lbGVtZW50cy5sZW5ndGg7aSsrKSB7DQoJCXZhciBlID0gZm9ybS5lbGVtZW50c1tpXTsNCgkJaWYgKGUubmFtZSAhPSAnY2hrYWxsJykNCgkJZS5jaGVja2VkID0gZm9ybS5jaGthbGwuY2hlY2tlZDsNCiAgICB9DQp9DQpmdW5jdGlvbiAkKGlkKSB7DQoJcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsNCn0NCmZ1bmN0aW9uIGdvYWN0aW9uKGFjdCl7DQoJJCgnZ29hY3Rpb24nKS5hY3Rpb24udmFsdWU9YWN0Ow0KCSQoJ2dvYWN0aW9uJykuc3VibWl0KCk7DQp9DQo8L3NjcmlwdD4NCjwvaGVhZD4NCjxib2R5IHN0eWxlPSJtYXJnaW46MDt0YWJsZS1sYXlvdXQ6Zml4ZWQ7IHdvcmQtYnJlYWs6YnJlYWstYWxsIj4NCjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPg0KCTx0ciBjbGFzcz0iaGVhZCI+DQoJCTx0ZD48c3BhbiBzdHlsZT0iZmxvYXQ6cmlnaHQ7Ij48YSBocmVmPSJodHRwOi8vd3d3LmRjdmkubmV0IiB0YXJnZXQ9Il9ibGFuayI+PD9waHAgZWNobyBzdHJfcmVwbGFjZSgnLicsJycsJ1AuaC5wLlMucC55Jyk7Pz4gVmVyOiAyMDEwIDwvYT48L3NwYW4+PD9waHAgZWNobyAkX1NFUlZFUlsnSFRUUF9IT1NUJ107Pz4gKDw/cGhwIGVjaG8gZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSk7Pz4pPC90ZD4NCgk8L3RyPg0KCTx0ciBjbGFzcz0iYWx0MSI+DQoJCTx0ZD48c3BhbiBzdHlsZT0iZmxvYXQ6cmlnaHQ7Ij5TYWZlIE1vZGU6PD9waHAgZWNobyBnZXRjZmcoJ3NhZmVfbW9kZScpOz8+PC9zcGFuPg0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignbG9nb3V0Jyk7Ij5DJiMzMDU7ayYjMzA1O3M8L2E+IHwNCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ2ZpbGUnKTsiPkZpbGUgTWFuYWdlcjwvYT4gfA0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignc3FsYWRtaW4nKTsiPk15U1FMIE1hbmFnZXI8L2E+IHwNCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ3NxbGZpbGUnKTsiPk15U1FMIFVwbG9hZCAmYW1wOyBEb3dubG9hZDwvYT4gfA0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignc2hlbGwnKTsiPktvbXV0IENhbCYjMzA1O3N0JiMzMDU7cjwvYT4gfA0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbigncGhwZW52Jyk7Ij5QSFAgVmFyaWFibGU8L2E+IHwNCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ2V2YWwnKTsiPkV2YWwgUEhQIENvZGU8L2E+DQoJCQk8P3BocCBpZiAoIUlTX1dJTikgez8+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignYmFja2Nvbm5lY3QnKTsiPkJhY2sgQ29ubmVjdDwvYT48P3BocCB9Pz4NCgkJPC90ZD4NCgk8L3RyPg0KPC90YWJsZT4NCjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMTUiIGNlbGxzcGFjaW5nPSIwIj48dHI+PHRkPg0KPD9waHANCg0KZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nZ29hY3Rpb24nKSk7DQptYWtlaGlkZSgnYWN0aW9uJyk7DQpmb3JtZm9vdCgpOw0KDQokZXJybXNnICYmIG0oJGVycm1zZyk7DQoNCi8vICsmIzExMDU7KyYjMTA3Mzt8I3wjLSsrfA0KISRkaXIgJiYgJGRpciA9ICcuJzsNCiRub3dwYXRoID0gZ2V0UGF0aChTQV9ST09ULCAkZGlyKTsNCmlmIChzdWJzdHIoJGRpciwgLTEpICE9ICcvJykgew0KCSRkaXIgPSAkZGlyLicvJzsNCn0NCiR1ZWRpciA9IHVlKCRkaXIpOw0KDQppZiAoISRhY3Rpb24gfHwgJGFjdGlvbiA9PSAnZmlsZScpIHsNCg0KCS8vICstfC18LS18fCYjMTA5NzsrJiMxMDM4Ow0KCSRkaXJfd3JpdGVhYmxlID0gQGlzX3dyaXRhYmxlKCRub3dwYXRoKSA/ICdXcml0YWJsZScgOiAnTm9uLXdyaXRhYmxlJzsNCg0KCS8vICsrfCAtKy0rDQoJaWYgKCRkb2luZyA9PSAnZGVsZGlyJyAmJiAkdGhlZmlsZSkgew0KCQlpZiAoIWZpbGVfZXhpc3RzKCR0aGVmaWxlKSkgew0KCQkJbSgkdGhlZmlsZS4nIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCcpOw0KCQl9IGVsc2Ugew0KCQkJbSgnRGlyZWN0b3J5IGRlbGV0ZSAnLihkZWx0cmVlKCR0aGVmaWxlKSA/IGJhc2VuYW1lKCR0aGVmaWxlKS4nIHN1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCgkJfQ0KCX0NCg0KCS8vIHx8KyYjMTA4MDstKy0rDQoJZWxzZWlmICgkbmV3ZGlybmFtZSkgew0KCQkkbWtkaXJzID0gJG5vd3BhdGguJG5ld2Rpcm5hbWU7DQoJCWlmIChmaWxlX2V4aXN0cygkbWtkaXJzKSkgew0KCQkJbSgnRGlyZWN0b3J5IGhhcyBhbHJlYWR5IGV4aXN0ZWQnKTsNCgkJfSBlbHNlIHsNCgkJCW0oJ0RpcmVjdG9yeSBjcmVhdGVkICcuKEBta2RpcigkbWtkaXJzLDA3NzcpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCgkJCUBjaG1vZCgkbWtkaXJzLDA3NzcpOw0KCQl9DQoJfQ0KDQoJLy8gKy18JiMxMDgzOystKyANCgllbHNlaWYgKCRkb3VwZmlsZSkgew0KCQltKCdGaWxlIHVwbG9hZCAnLihAY29weSgkX0ZJTEVTWyd1cGxvYWRmaWxlJ11bJ3RtcF9uYW1lJ10sJHVwbG9hZGRpci4nLycuJF9GSUxFU1sndXBsb2FkZmlsZSddWyduYW1lJ10pID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCgl9DQoNCgkvLyAjJiMxMDg4OysmIzEwODU7Ky0rIA0KCWVsc2VpZiAoJGVkaXRmaWxlbmFtZSAmJiAkZmlsZWNvbnRlbnQpIHsNCgkJJGZwID0gQGZvcGVuKCRlZGl0ZmlsZW5hbWUsJ3cnKTsNCgkJbSgnU2F2ZSBmaWxlICcuKEBmd3JpdGUoJGZwLCRmaWxlY29udGVudCkgPyAnc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KCQlAZmNsb3NlKCRmcCk7DQoJfQ0KDQoJLy8gIyYjMTA4ODsrJiMxMDg1OystKyAtJiMxMDMxOy0rDQoJZWxzZWlmICgkcGZpbGUgJiYgJG5ld3Blcm0pIHsNCgkJaWYgKCFmaWxlX2V4aXN0cygkcGZpbGUpKSB7DQoJCQltKCdUaGUgb3JpZ2luYWwgZmlsZSBkb2VzIG5vdCBleGlzdCcpOw0KCQl9IGVsc2Ugew0KCQkJJG5ld3Blcm0gPSBiYXNlX2NvbnZlcnQoJG5ld3Blcm0sOCwxMCk7DQoJCQltKCdNb2RpZnkgZmlsZSBhdHRyaWJ1dGVzICcuKEBjaG1vZCgkcGZpbGUsJG5ld3Blcm0pID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCgkJfQ0KCX0NCg0KCS8vICstfCANCgllbHNlaWYgKCRvbGRuYW1lICYmICRuZXdmaWxlbmFtZSkgew0KCQkkbm5hbWUgPSAkbm93cGF0aC4kbmV3ZmlsZW5hbWU7DQoJCWlmIChmaWxlX2V4aXN0cygkbm5hbWUpIHx8ICFmaWxlX2V4aXN0cygkb2xkbmFtZSkpIHsNCgkJCW0oJG5uYW1lLicgaGFzIGFscmVhZHkgZXhpc3RlZCBvciBvcmlnaW5hbCBmaWxlIGRvZXMgbm90IGV4aXN0Jyk7DQoJCX0gZWxzZSB7DQoJCQltKGJhc2VuYW1lKCRvbGRuYW1lKS4nIHJlbmFtZWQgJy5iYXNlbmFtZSgkbm5hbWUpLihAcmVuYW1lKCRvbGRuYW1lLCRubmFtZSkgPyAnIHN1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCgkJfQ0KCX0NCg0KCS8vICt8K3wrLSsgDQoJZWxzZWlmICgkc25hbWUgJiYgJHRvZmlsZSkgew0KCQlpZiAoZmlsZV9leGlzdHMoJHRvZmlsZSkgfHwgIWZpbGVfZXhpc3RzKCRzbmFtZSkpIHsNCgkJCW0oJ1RoZSBnb2FsIGZpbGUgaGFzIGFscmVhZHkgZXhpc3RlZCBvciBvcmlnaW5hbCBmaWxlIGRvZXMgbm90IGV4aXN0Jyk7DQoJCX0gZWxzZSB7DQoJCQltKGJhc2VuYW1lKCR0b2ZpbGUpLicgY29waWVkICcuKEBjb3B5KCRzbmFtZSwkdG9maWxlKSA/IGJhc2VuYW1lKCR0b2ZpbGUpLicgc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KCQl9DQoJfQ0KDQoJLy8gKy0tJiMxMDczOy0jKyYjMTA5MjsNCgllbHNlaWYgKCRjdXJmaWxlICYmICR0YXJmaWxlKSB7DQoJCWlmICghQGZpbGVfZXhpc3RzKCRjdXJmaWxlKSB8fCAhQGZpbGVfZXhpc3RzKCR0YXJmaWxlKSkgew0KCQkJbSgnVGhlIGdvYWwgZmlsZSBoYXMgYWxyZWFkeSBleGlzdGVkIG9yIG9yaWdpbmFsIGZpbGUgZG9lcyBub3QgZXhpc3QnKTsNCgkJfSBlbHNlIHsNCgkJCSR0aW1lID0gQGZpbGVtdGltZSgkdGFyZmlsZSk7DQoJCQltKCdNb2RpZnkgZmlsZSB0aGUgbGFzdCBtb2RpZmllZCAnLihAdG91Y2goJGN1cmZpbGUsJHRpbWUsJHRpbWUpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCgkJfQ0KCX0NCg0KCS8vICsrfCYjMTA4MDstJiMxMDkzOy0jKyYjMTA5MjsNCgllbHNlaWYgKCRjdXJmaWxlICYmICR5ZWFyICYmICRtb250aCAmJiAkZGF5ICYmICRob3VyICYmICRtaW51dGUgJiYgJHNlY29uZCkgew0KCQlpZiAoIUBmaWxlX2V4aXN0cygkY3VyZmlsZSkpIHsNCgkJCW0oYmFzZW5hbWUoJGN1cmZpbGUpLicgZG9lcyBub3QgZXhpc3QnKTsNCgkJfSBlbHNlIHsNCgkJCSR0aW1lID0gc3RydG90aW1lKCIkeWVhci0kbW9udGgtJGRheSAkaG91cjokbWludXRlOiRzZWNvbmQiKTsNCgkJCW0oJ01vZGlmeSBmaWxlIHRoZSBsYXN0IG1vZGlmaWVkICcuKEB0b3VjaCgkY3VyZmlsZSwkdGltZSwkdGltZSkgPyAnc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KCQl9DQoJfQ0KDQoJLy8gfCYjMTAyODsjIC0tKysNCgllbHNlaWYoJGRvaW5nID09ICdkb3ducmFyJykgew0KCQlpZiAoJGRsKSB7DQoJCQkkZGZpbGVzPScnOw0KCQkJZm9yZWFjaCAoJGRsIGFzICRmaWxlcGF0aCA9PiAkdmFsdWUpIHsNCgkJCQkkZGZpbGVzLj0kZmlsZXBhdGguJywnOw0KCQkJfQ0KCQkJJGRmaWxlcz1zdWJzdHIoJGRmaWxlcywwLHN0cmxlbigkZGZpbGVzKS0xKTsNCgkJCSRkbD1leHBsb2RlKCcsJywkZGZpbGVzKTsNCgkJCSR6aXA9bmV3IFBIUFppcCgkZGwpOw0KCQkJJGNvZGU9JHppcC0+b3V0Ow0KCQkJaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpOw0KCQkJaGVhZGVyKCdBY2NlcHQtUmFuZ2VzOiBieXRlcycpOw0KCQkJaGVhZGVyKCdBY2NlcHQtTGVuZ3RoOiAnLnN0cmxlbigkY29kZSkpOw0KCQkJaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50O2ZpbGVuYW1lPScuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLidfRmlsZXMudGFyLmd6Jyk7DQoJCQllY2hvICRjb2RlOw0KCQkJZXhpdDsNCgkJfSBlbHNlIHsNCgkJCW0oJ1BsZWFzZSBzZWxlY3QgZmlsZShzKScpOw0KCQl9DQoJfQ0KDQoJLy8gKyAtKysrfCArLSsgDQoJZWxzZWlmKCRkb2luZyA9PSAnZGVsZmlsZXMnKSB7DQoJCWlmICgkZGwpIHsNCgkJCSRkZmlsZXM9Jyc7DQoJCQkkc3VjYyA9ICRmYWlsID0gMDsNCgkJCWZvcmVhY2ggKCRkbCBhcyAkZmlsZXBhdGggPT4gJHZhbHVlKSB7DQoJCQkJaWYgKEB1bmxpbmsoJGZpbGVwYXRoKSkgew0KCQkJCQkkc3VjYysrOw0KCQkJCX0gZWxzZSB7DQoJCQkJCSRmYWlsKys7DQoJCQkJfQ0KCQkJfQ0KCQkJbSgnRGVsZXRlZCBmaWxlIGhhdmUgZmluaXNoZWQmIzEwNzU7JiMxMDg0O2Nob29zZSAnLmNvdW50KCRkbCkuJyBzdWNjZXNzICcuJHN1Y2MuJyBmYWlsICcuJGZhaWwpOw0KCQl9IGVsc2Ugew0KCQkJbSgnUGxlYXNlIHNlbGVjdCBmaWxlKHMpJyk7DQoJCX0NCgl9DQoNCgkvLyMrKyYjMTExODstJiMxMDk4OyMtDQoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nY3JlYXRlZGlyJykpOw0KCW1ha2VoaWRlKCduZXdkaXJuYW1lJyk7DQoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOw0KCWZvcm1mb290KCk7DQoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nZmlsZXBlcm0nKSk7DQoJbWFrZWhpZGUoJ25ld3Blcm0nKTsNCgltYWtlaGlkZSgncGZpbGUnKTsNCgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7DQoJZm9ybWZvb3QoKTsNCglmb3JtaGVhZChhcnJheSgnbmFtZSc9Pidjb3B5ZmlsZScpKTsNCgltYWtlaGlkZSgnc25hbWUnKTsNCgltYWtlaGlkZSgndG9maWxlJyk7DQoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOw0KCWZvcm1mb290KCk7DQoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4ncmVuYW1lJykpOw0KCW1ha2VoaWRlKCdvbGRuYW1lJyk7DQoJbWFrZWhpZGUoJ25ld2ZpbGVuYW1lJyk7DQoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOw0KCWZvcm1mb290KCk7DQoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nZmlsZW9wZm9ybScpKTsNCgltYWtlaGlkZSgnYWN0aW9uJyk7DQoJbWFrZWhpZGUoJ29wZmlsZScpOw0KCW1ha2VoaWRlKCdkaXInKTsNCglmb3JtZm9vdCgpOw0KDQoJJGZyZWUgPSBAZGlza19mcmVlX3NwYWNlKCRub3dwYXRoKTsNCgkhJGZyZWUgJiYgJGZyZWUgPSAwOw0KCSRhbGwgPSBAZGlza190b3RhbF9zcGFjZSgkbm93cGF0aCk7DQoJISRhbGwgJiYgJGFsbCA9IDA7DQoJJHVzZWQgPSAkYWxsLSRmcmVlOw0KCSR1c2VkX3BlcmNlbnQgPSBAcm91bmQoMTAwLygkYWxsLyRmcmVlKSwyKTsNCglwKCc8aDI+RmlsZSBNYW5hZ2VyIC0gQ3VycmVudCBkaXNrIGZyZWUgJy5zaXplY291bnQoJGZyZWUpLicgb2YgJy5zaXplY291bnQoJGFsbCkuJyAoJy4kdXNlZF9wZXJjZW50LiclKTwvaDI+Jyk7DQoNCj8+DQo8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBzdHlsZT0ibWFyZ2luOjEwcHggMDsiPg0KICA8Zm9ybSBhY3Rpb249IiIgbWV0aG9kPSJwb3N0IiBpZD0iZ29kaXIiIG5hbWU9ImdvZGlyIj4NCiAgPHRyPg0KICAgIDx0ZCBub3dyYXA+QnVsdW5kdWd1biBEaXppbiAoPD9waHAgZWNobyAkZGlyX3dyaXRlYWJsZTs/PiwgPD9waHAgZWNobyBnZXRDaG1vZCgkbm93cGF0aCk7Pz4pPC90ZD4NCgk8dGQgd2lkdGg9IjEwMCUiPjxpbnB1dCBuYW1lPSJ2aWV3X3dyaXRhYmxlIiB2YWx1ZT0iMCIgdHlwZT0iaGlkZGVuIiAvPjxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9ImRpciIgdmFsdWU9Ijw/cGhwIGVjaG8gJG5vd3BhdGg7Pz4iIHR5cGU9InRleHQiIHN0eWxlPSJ3aWR0aDoxMDAlO21hcmdpbjowIDhweDsiPjwvdGQ+DQogICAgPHRkIG5vd3JhcD48aW5wdXQgY2xhc3M9ImJ0IiB2YWx1ZT0iR08iIHR5cGU9InN1Ym1pdCI+PC90ZD4NCiAgPC90cj4NCiAgPC9mb3JtPg0KPC90YWJsZT4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCmZ1bmN0aW9uIGNyZWF0ZWRpcigpew0KCXZhciBuZXdkaXJuYW1lOw0KCW5ld2Rpcm5hbWUgPSBwcm9tcHQoJ1BsZWFzZSBpbnB1dCB0aGUgZGlyZWN0b3J5IG5hbWU6JywgJycpOw0KCWlmICghbmV3ZGlybmFtZSkgcmV0dXJuOw0KCSQoJ2NyZWF0ZWRpcicpLm5ld2Rpcm5hbWUudmFsdWU9bmV3ZGlybmFtZTsNCgkkKCdjcmVhdGVkaXInKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIGZpbGVwZXJtKHBmaWxlKXsNCgl2YXIgbmV3cGVybTsNCgluZXdwZXJtID0gcHJvbXB0KCdDdXJyZW50IGZpbGU6JytwZmlsZSsnXG5QbGVhc2UgaW5wdXQgbmV3IGF0dHJpYnV0ZTonLCAnJyk7DQoJaWYgKCFuZXdwZXJtKSByZXR1cm47DQoJJCgnZmlsZXBlcm0nKS5uZXdwZXJtLnZhbHVlPW5ld3Blcm07DQoJJCgnZmlsZXBlcm0nKS5wZmlsZS52YWx1ZT1wZmlsZTsNCgkkKCdmaWxlcGVybScpLnN1Ym1pdCgpOw0KfQ0KZnVuY3Rpb24gY29weWZpbGUoc25hbWUpew0KCXZhciB0b2ZpbGU7DQoJdG9maWxlID0gcHJvbXB0KCdPcmlnaW5hbCBmaWxlOicrc25hbWUrJ1xuUGxlYXNlIGlucHV0IG9iamVjdCBmaWxlIChmdWxscGF0aCk6JywgJycpOw0KCWlmICghdG9maWxlKSByZXR1cm47DQoJJCgnY29weWZpbGUnKS50b2ZpbGUudmFsdWU9dG9maWxlOw0KCSQoJ2NvcHlmaWxlJykuc25hbWUudmFsdWU9c25hbWU7DQoJJCgnY29weWZpbGUnKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIHJlbmFtZShvbGRuYW1lKXsNCgl2YXIgbmV3ZmlsZW5hbWU7DQoJbmV3ZmlsZW5hbWUgPSBwcm9tcHQoJ0Zvcm1lciBmaWxlIG5hbWU6JytvbGRuYW1lKydcblBsZWFzZSBpbnB1dCBuZXcgZmlsZW5hbWU6JywgJycpOw0KCWlmICghbmV3ZmlsZW5hbWUpIHJldHVybjsNCgkkKCdyZW5hbWUnKS5uZXdmaWxlbmFtZS52YWx1ZT1uZXdmaWxlbmFtZTsNCgkkKCdyZW5hbWUnKS5vbGRuYW1lLnZhbHVlPW9sZG5hbWU7DQoJJCgncmVuYW1lJykuc3VibWl0KCk7DQp9DQpmdW5jdGlvbiBkb2ZpbGUoZG9pbmcsdGhlZmlsZSxtKXsNCglpZiAobSAmJiAhY29uZmlybShtKSkgew0KCQlyZXR1cm47DQoJfQ0KCSQoJ2ZpbGVsaXN0JykuZG9pbmcudmFsdWU9ZG9pbmc7DQoJaWYgKHRoZWZpbGUpew0KCQkkKCdmaWxlbGlzdCcpLnRoZWZpbGUudmFsdWU9dGhlZmlsZTsNCgl9DQoJJCgnZmlsZWxpc3QnKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIGNyZWF0ZWZpbGUobm93cGF0aCl7DQoJdmFyIGZpbGVuYW1lOw0KCWZpbGVuYW1lID0gcHJvbXB0KCdQbGVhc2UgaW5wdXQgdGhlIGZpbGUgbmFtZTonLCAnJyk7DQoJaWYgKCFmaWxlbmFtZSkgcmV0dXJuOw0KCW9wZmlsZSgnZWRpdGZpbGUnLG5vd3BhdGggKyBmaWxlbmFtZSxub3dwYXRoKTsNCn0NCmZ1bmN0aW9uIG9wZmlsZShhY3Rpb24sb3BmaWxlLGRpcil7DQoJJCgnZmlsZW9wZm9ybScpLmFjdGlvbi52YWx1ZT1hY3Rpb247DQoJJCgnZmlsZW9wZm9ybScpLm9wZmlsZS52YWx1ZT1vcGZpbGU7DQoJJCgnZmlsZW9wZm9ybScpLmRpci52YWx1ZT1kaXI7DQoJJCgnZmlsZW9wZm9ybScpLnN1Ym1pdCgpOw0KfQ0KZnVuY3Rpb24gZ29kaXIoZGlyLHZpZXdfd3JpdGFibGUpew0KCWlmICh2aWV3X3dyaXRhYmxlKSB7DQoJCSQoJ2dvZGlyJykudmlld193cml0YWJsZS52YWx1ZT0xOw0KCX0NCgkkKCdnb2RpcicpLmRpci52YWx1ZT1kaXI7DQoJJCgnZ29kaXInKS5zdWJtaXQoKTsNCn0NCjwvc2NyaXB0Pg0KICA8P3BocA0KCXRiaGVhZCgpOw0KCXAoJzxmb3JtIGFjdGlvbj0iJy4kc2VsZi4nIiBtZXRob2Q9IlBPU1QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPjx0ciBjbGFzcz0iYWx0MSI+PHRkIGNvbHNwYW49IjciIHN0eWxlPSJwYWRkaW5nOjVweDsiPicpOw0KCXAoJzxkaXYgc3R5bGU9ImZsb2F0OnJpZ2h0OyI+PGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0idXBsb2FkZmlsZSIgdmFsdWU9IiIgdHlwZT0iZmlsZSIgLz4gPGlucHV0IGNsYXNzPSJidCIgbmFtZT0iZG91cGZpbGUiIHZhbHVlPSJVcGxvYWQiIHR5cGU9InN1Ym1pdCIgLz48aW5wdXQgbmFtZT0idXBsb2FkZGlyIiB2YWx1ZT0iJy4kZGlyLiciIHR5cGU9ImhpZGRlbiIgLz48aW5wdXQgbmFtZT0iZGlyIiB2YWx1ZT0iJy4kZGlyLiciIHR5cGU9ImhpZGRlbiIgLz48L2Rpdj4nKTsNCglwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJy4kX1NFUlZFUlsiRE9DVU1FTlRfUk9PVCJdLidcJyk7Ij5XZWJSb290PC9hPicpOw0KCWlmICgkdmlld193cml0YWJsZSkgew0KCQlwKCcgfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJy4kbm93cGF0aC4nXCcpOyI+VmlldyBBbGw8L2E+Jyk7DQoJfSBlbHNlIHsNCgkJcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuJG5vd3BhdGguJ1wnLFwnMVwnKTsiPlZpZXcgV3JpdGFibGU8L2E+Jyk7DQoJfQ0KCXAoJyB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Y3JlYXRlZGlyKCk7Ij5DcmVhdGUgRGlyZWN0b3J5PC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Y3JlYXRlZmlsZShcJycuJG5vd3BhdGguJ1wnKTsiPkNyZWF0ZSBGaWxlPC9hPicpOw0KCWlmIChJU19XSU4gJiYgSVNfQ09NKSB7DQoJCSRvYmogPSBuZXcgQ09NKCdzY3JpcHRpbmcuZmlsZXN5c3RlbW9iamVjdCcpOw0KCQlpZiAoJG9iaiAmJiBpc19vYmplY3QoJG9iaikpIHsNCgkJCSREcml2ZVR5cGVEQiA9IGFycmF5KDAgPT4gJ1Vua25vdycsMSA9PiAnUmVtb3ZhYmxlJywyID0+ICdGaXhlZCcsMyA9PiAnTmV0d29yaycsNCA9PiAnQ0RSb20nLDUgPT4gJ1JBTSBEaXNrJyk7DQoJCQlmb3JlYWNoKCRvYmotPkRyaXZlcyBhcyAkZHJpdmUpIHsNCgkJCQlpZiAoJGRyaXZlLT5Ecml2ZVR5cGUgPT0gMikgew0KCQkJCQlwKCcgfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJy4kZHJpdmUtPlBhdGguJy9cJyk7IiB0aXRsZT0iU2l6ZTonLnNpemVjb3VudCgkZHJpdmUtPlRvdGFsU2l6ZSkuJyYjMTM7RnJlZTonLnNpemVjb3VudCgkZHJpdmUtPkZyZWVTcGFjZSkuJyYjMTM7VHlwZTonLiREcml2ZVR5cGVEQlskZHJpdmUtPkRyaXZlVHlwZV0uJyI+Jy4kRHJpdmVUeXBlREJbJGRyaXZlLT5Ecml2ZVR5cGVdLicoJy4kZHJpdmUtPlBhdGguJyk8L2E+Jyk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuJGRyaXZlLT5QYXRoLicvXCcpOyIgdGl0bGU9IlR5cGU6Jy4kRHJpdmVUeXBlREJbJGRyaXZlLT5Ecml2ZVR5cGVdLiciPicuJERyaXZlVHlwZURCWyRkcml2ZS0+RHJpdmVUeXBlXS4nKCcuJGRyaXZlLT5QYXRoLicpPC9hPicpOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCg0KCXAoJzwvdGQ+PC90cj48L2Zvcm0+Jyk7DQoNCglwKCc8dHIgY2xhc3M9ImhlYWQiPjx0ZD4mbmJzcDs8L3RkPjx0ZD5GaWxlbmFtZTwvdGQ+PHRkIHdpZHRoPSIxNiUiPkxhc3QgbW9kaWZpZWQ8L3RkPjx0ZCB3aWR0aD0iMTAlIj5TaXplPC90ZD48dGQgd2lkdGg9IjIwJSI+Q2htb2QgLyBQZXJtczwvdGQ+PHRkIHdpZHRoPSIyMiUiPkFjdGlvbjwvdGQ+PC90cj4nKTsNCiAgICANCgkvLyMmIzEwOTc7K3wtICstKystfCstKyB8LS0rLSsNCgkkZGlyZGF0YT1hcnJheSgpOw0KCSRmaWxlZGF0YT1hcnJheSgpOw0KDQoJaWYgKCR2aWV3X3dyaXRhYmxlKSB7DQoJCSRkaXJkYXRhID0gR2V0TGlzdCgkbm93cGF0aCk7DQoJfSBlbHNlIHsNCgkJLy8gLSstKy0tIyYjMTEwMTsNCgkJJGRpcnM9QG9wZW5kaXIoJGRpcik7DQoJCXdoaWxlICgkZmlsZT1AcmVhZGRpcigkZGlycykpIHsNCgkJCSRmaWxlcGF0aD0kbm93cGF0aC4kZmlsZTsNCgkJCWlmKEBpc19kaXIoJGZpbGVwYXRoKSl7DQoJCQkJJGRpcmRiWydmaWxlbmFtZSddPSRmaWxlOw0KCQkJCSRkaXJkYlsnbXRpbWUnXT1AZGF0ZSgnWS1tLWQgSDppOnMnLGZpbGVtdGltZSgkZmlsZXBhdGgpKTsNCgkJCQkkZGlyZGJbJ2RpcmNobW9kJ109Z2V0Q2htb2QoJGZpbGVwYXRoKTsNCgkJCQkkZGlyZGJbJ2RpcnBlcm0nXT1nZXRQZXJtcygkZmlsZXBhdGgpOw0KCQkJCSRkaXJkYlsnZmlsZW93bmVyJ109Z2V0VXNlcigkZmlsZXBhdGgpOw0KCQkJCSRkaXJkYlsnZGlybGluayddPSRub3dwYXRoOw0KCQkJCSRkaXJkYlsnc2VydmVyX2xpbmsnXT0kZmlsZXBhdGg7DQoJCQkJJGRpcmRiWydjbGllbnRfbGluayddPXVlKCRmaWxlcGF0aCk7DQoJCQkJJGRpcmRhdGFbXT0kZGlyZGI7DQoJCQl9IGVsc2Ugew0KCQkJCSRmaWxlZGJbJ2ZpbGVuYW1lJ109JGZpbGU7DQoJCQkJJGZpbGVkYlsnc2l6ZSddPXNpemVjb3VudChAZmlsZXNpemUoJGZpbGVwYXRoKSk7DQoJCQkJJGZpbGVkYlsnbXRpbWUnXT1AZGF0ZSgnWS1tLWQgSDppOnMnLGZpbGVtdGltZSgkZmlsZXBhdGgpKTsNCgkJCQkkZmlsZWRiWydmaWxlY2htb2QnXT1nZXRDaG1vZCgkZmlsZXBhdGgpOw0KCQkJCSRmaWxlZGJbJ2ZpbGVwZXJtJ109Z2V0UGVybXMoJGZpbGVwYXRoKTsNCgkJCQkkZmlsZWRiWydmaWxlb3duZXInXT1nZXRVc2VyKCRmaWxlcGF0aCk7DQoJCQkJJGZpbGVkYlsnZGlybGluayddPSRub3dwYXRoOw0KCQkJCSRmaWxlZGJbJ3NlcnZlcl9saW5rJ109JGZpbGVwYXRoOw0KCQkJCSRmaWxlZGJbJ2NsaWVudF9saW5rJ109dWUoJGZpbGVwYXRoKTsNCgkJCQkkZmlsZWRhdGFbXT0kZmlsZWRiOw0KCQkJfQ0KCQl9Ly8gd2hpbGUNCgkJdW5zZXQoJGRpcmRiKTsNCgkJdW5zZXQoJGZpbGVkYik7DQoJCUBjbG9zZWRpcigkZGlycyk7DQoJfQ0KCUBzb3J0KCRkaXJkYXRhKTsNCglAc29ydCgkZmlsZWRhdGEpOw0KCSRkaXJfaSA9ICcwJzsNCglmb3JlYWNoKCRkaXJkYXRhIGFzICRrZXkgPT4gJGRpcmRiKXsNCgkJaWYoJGRpcmRiWydmaWxlbmFtZSddIT0nLi4nICYmICRkaXJkYlsnZmlsZW5hbWUnXSE9Jy4nKSB7DQoJCQkkdGhpc2JnID0gYmcoKTsNCgkJCXAoJzx0ciBjbGFzcz0iJy4kdGhpc2JnLiciIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJycuJHRoaXNiZy4nXCc7Ij4nKTsNCgkJCXAoJzx0ZCB3aWR0aD0iMiUiIG5vd3JhcD48Zm9udCBmYWNlPSJ3aW5nZGluZ3MiIHNpemU9IjMiPjA8L2ZvbnQ+PC90ZD4nKTsNCgkJCXAoJzx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJy4kZGlyZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPicuJGRpcmRiWydmaWxlbmFtZSddLic8L2E+PC90ZD4nKTsNCgkJCXAoJzx0ZCBub3dyYXA+Jy4kZGlyZGJbJ210aW1lJ10uJzwvdGQ+Jyk7DQoJCQlwKCc8dGQgbm93cmFwPi0tPC90ZD4nKTsNCgkJCXAoJzx0ZCBub3dyYXA+Jyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmZpbGVwZXJtKFwnJy4kZGlyZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPicuJGRpcmRiWydkaXJjaG1vZCddLic8L2E+IC8gJyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmZpbGVwZXJtKFwnJy4kZGlyZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPicuJGRpcmRiWydkaXJwZXJtJ10uJzwvYT4nLiRkaXJkYlsnZmlsZW93bmVyJ10uJzwvdGQ+Jyk7DQoJCQlwKCc8dGQgbm93cmFwPjxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9maWxlKFwnZGVsZGlyXCcsXCcnLiRkaXJkYlsnc2VydmVyX2xpbmsnXS4nXCcsXCdBcmUgeW91IHN1cmUgd2lsbCBkZWxldGUgJy4kZGlyZGJbJ2ZpbGVuYW1lJ10uJz8gXFxuXFxuSWYgbm9uLWVtcHR5IGRpcmVjdG9yeSwgd2lsbCBiZSBkZWxldGUgYWxsIHRoZSBmaWxlcy5cJykiPkRlbDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OnJlbmFtZShcJycuJGRpcmRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij5SZW5hbWU8L2E+PC90ZD4nKTsNCgkJCXAoJzwvdHI+Jyk7DQoJCQkkZGlyX2krKzsNCgkJfSBlbHNlIHsNCgkJCWlmKCRkaXJkYlsnZmlsZW5hbWUnXT09Jy4uJykgew0KCQkJCXAoJzx0ciBjbGFzcz0nLmJnKCkuJz4nKTsNCgkJCQlwKCc8dGQgYWxpZ249ImNlbnRlciI+PGZvbnQgZmFjZT0iV2luZ2RpbmdzIDMiIHNpemU9ND49PC9mb250PjwvdGQ+PHRkIG5vd3JhcCBjb2xzcGFuPSI1Ij48YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJy5nZXRVcFBhdGgoJG5vd3BhdGgpLidcJyk7Ij5QYXJlbnQgRGlyZWN0b3J5PC9hPjwvdGQ+Jyk7DQoJCQkJcCgnPC90cj4nKTsNCgkJCX0NCgkJfQ0KCX0NCg0KCXAoJzx0ciBiZ2NvbG9yPSIjZGRkZGRkIiBzdGx5ZT0iYm9yZGVyLXRvcDoxcHggc29saWQgI2ZmZjtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZGRkOyI+PHRkIGNvbHNwYW49IjYiIGhlaWdodD0iNSI+PC90ZD48L3RyPicpOw0KCXAoJzxmb3JtIGlkPSJmaWxlbGlzdCIgbmFtZT0iZmlsZWxpc3QiIGFjdGlvbj0iJy4kc2VsZi4nIiBtZXRob2Q9InBvc3QiPicpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdmaWxlJyk7DQoJbWFrZWhpZGUoJ3RoZWZpbGUnKTsNCgltYWtlaGlkZSgnZG9pbmcnKTsNCgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7DQoJJGZpbGVfaSA9ICcwJzsNCglmb3JlYWNoKCRmaWxlZGF0YSBhcyAka2V5ID0+ICRmaWxlZGIpew0KCQlpZigkZmlsZWRiWydmaWxlbmFtZSddIT0nLi4nICYmICRmaWxlZGJbJ2ZpbGVuYW1lJ10hPScuJykgew0KCQkJJGZpbGV1cmwgPSBzdHJfcmVwbGFjZShTQV9ST09ULCcnLCRmaWxlZGJbJ3NlcnZlcl9saW5rJ10pOw0KCQkJJHRoaXNiZyA9IGJnKCk7DQoJCQlwKCc8dHIgY2xhc3M9IicuJHRoaXNiZy4nIiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCcnLiR0aGlzYmcuJ1wnOyI+Jyk7DQoJCQlwKCc8dGQgd2lkdGg9IjIlIiBub3dyYXA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iMSIgbmFtZT0iZGxbJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLiddIj48L3RkPicpOw0KCQkJcCgnPHRkPjxhIGhyZWY9IicuJGZpbGV1cmwuJyIgdGFyZ2V0PSJfYmxhbmsiPicuJGZpbGVkYlsnZmlsZW5hbWUnXS4nPC9hPjwvdGQ+Jyk7DQoJCQlwKCc8dGQgbm93cmFwPicuJGZpbGVkYlsnbXRpbWUnXS4nPC90ZD4nKTsNCgkJCXAoJzx0ZCBub3dyYXA+Jy4kZmlsZWRiWydzaXplJ10uJzwvdGQ+Jyk7DQoJCQlwKCc8dGQgbm93cmFwPicpOw0KCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpmaWxlcGVybShcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+Jy4kZmlsZWRiWydmaWxlY2htb2QnXS4nPC9hPiAvICcpOw0KCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpmaWxlcGVybShcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+Jy4kZmlsZWRiWydmaWxlcGVybSddLic8L2E+Jy4kZmlsZWRiWydmaWxlb3duZXInXS4nPC90ZD4nKTsNCgkJCXAoJzx0ZCBub3dyYXA+Jyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmRvZmlsZShcJ2Rvd25maWxlXCcsXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPkRvd248L2E+IHwgJyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmNvcHlmaWxlKFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij5Db3B5PC9hPiB8ICcpOw0KCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpvcGZpbGUoXCdlZGl0ZmlsZVwnLFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyxcJycuJGZpbGVkYlsnZGlybGluayddLidcJyk7Ij5FZGl0PC9hPiB8ICcpOw0KCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpyZW5hbWUoXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPlJlbmFtZTwvYT4gfCAnKTsNCgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6b3BmaWxlKFwnbmV3dGltZVwnLFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyxcJycuJGZpbGVkYlsnZGlybGluayddLidcJyk7Ij5UaW1lPC9hPicpOw0KCQkJcCgnPC90ZD48L3RyPicpOw0KCQkJJGZpbGVfaSsrOw0KCQl9DQoJfQ0KCXAoJzx0ciBjbGFzcz0iJy5iZygpLiciPjx0ZCBhbGlnbj0iY2VudGVyIj48aW5wdXQgbmFtZT0iY2hrYWxsIiB2YWx1ZT0ib24iIHR5cGU9ImNoZWNrYm94IiBvbmNsaWNrPSJDaGVja0FsbCh0aGlzLmZvcm0pIiAvPjwvdGQ+PHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9maWxlKFwnZG93bnJhclwnKTsiPlBhY2tpbmcgZG93bmxvYWQgc2VsZWN0ZWQ8L2E+IC0gPGEgaHJlZj0iamF2YXNjcmlwdDpkb2ZpbGUoXCdkZWxmaWxlc1wnKTsiPkRlbGV0ZSBzZWxlY3RlZDwvYT48L3RkPjx0ZCBjb2xzcGFuPSI0IiBhbGlnbj0icmlnaHQiPicuJGRpcl9pLicgZGlyZWN0b3JpZXMgLyAnLiRmaWxlX2kuJyBmaWxlczwvdGQ+PC90cj4nKTsNCglwKCc8L2Zvcm0+PC90YWJsZT4nKTsNCn0vLyBlbmQgZGlyDQoNCmVsc2VpZiAoJGFjdGlvbiA9PSAnc3FsZmlsZScpIHsNCglpZigkZG9pbmc9PSJteXNxbHVwbG9hZCIpew0KCQkkZmlsZSA9ICRfRklMRVNbJ3VwbG9hZGZpbGUnXTsNCgkJJGZpbGVuYW1lID0gJGZpbGVbJ3RtcF9uYW1lJ107DQoJCWlmIChmaWxlX2V4aXN0cygkc2F2ZXBhdGgpKSB7DQoJCQltKCdUaGUgZ29hbCBmaWxlIGhhcyBhbHJlYWR5IGV4aXN0ZWQnKTsNCgkJfSBlbHNlIHsNCgkJCWlmKCEkZmlsZW5hbWUpIHsNCgkJCQltKCdQbGVhc2UgY2hvb3NlIGEgZmlsZScpOw0KCQkJfSBlbHNlIHsNCgkJCQkkZnA9QGZvcGVuKCRmaWxlbmFtZSwncicpOw0KCQkJCSRjb250ZW50cz1AZnJlYWQoJGZwLCBmaWxlc2l6ZSgkZmlsZW5hbWUpKTsNCgkJCQlAZmNsb3NlKCRmcCk7DQoJCQkJJGNvbnRlbnRzID0gYmluMmhleCgkY29udGVudHMpOw0KCQkJCWlmKCEkdXBuYW1lKSAkdXBuYW1lID0gJGZpbGVbJ25hbWUnXTsNCgkJCQlkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZSwkY2hhcnNldCwkZGJwb3J0KTsNCgkJCQkkcmVzdWx0ID0gcSgiU0VMRUNUIDB4eyRjb250ZW50c30gRlJPTSBteXNxbC51c2VyIElOVE8gRFVNUEZJTEUgJyRzYXZlcGF0aCc7Iik7DQoJCQkJbSgkcmVzdWx0ID8gJ1VwbG9hZCBzdWNjZXNzJyA6ICdVcGxvYWQgaGFzIGZhaWxlZDogJy5teXNxbF9lcnJvcigpKTsNCgkJCX0NCgkJfQ0KCX0NCj8+DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQpmdW5jdGlvbiBteXNxbGZpbGUoZG9pbmcpew0KCWlmKCFkb2luZykgcmV0dXJuOw0KCSQoJ2RvaW5nJykudmFsdWU9ZG9pbmc7DQoJJCgnbXlzcWxmaWxlJykuZGJob3N0LnZhbHVlPSQoJ2RiaW5mbycpLmRiaG9zdC52YWx1ZTsNCgkkKCdteXNxbGZpbGUnKS5kYnBvcnQudmFsdWU9JCgnZGJpbmZvJykuZGJwb3J0LnZhbHVlOw0KCSQoJ215c3FsZmlsZScpLmRidXNlci52YWx1ZT0kKCdkYmluZm8nKS5kYnVzZXIudmFsdWU7DQoJJCgnbXlzcWxmaWxlJykuZGJwYXNzLnZhbHVlPSQoJ2RiaW5mbycpLmRicGFzcy52YWx1ZTsNCgkkKCdteXNxbGZpbGUnKS5kYm5hbWUudmFsdWU9JCgnZGJpbmZvJykuZGJuYW1lLnZhbHVlOw0KCSQoJ215c3FsZmlsZScpLmNoYXJzZXQudmFsdWU9JCgnZGJpbmZvJykuY2hhcnNldC52YWx1ZTsNCgkkKCdteXNxbGZpbGUnKS5zdWJtaXQoKTsNCn0NCjwvc2NyaXB0Pg0KPD9waHANCgkhJGRiaG9zdCAmJiAkZGJob3N0ID0gJ2xvY2FsaG9zdCc7DQoJISRkYnVzZXIgJiYgJGRidXNlciA9ICdyb290JzsNCgkhJGRicG9ydCAmJiAkZGJwb3J0ID0gJzMzMDYnOw0KCSRjaGFyc2V0cyA9IGFycmF5KCcnPT4nRGVmYXVsdCcsJ2diayc9PidHQksnLCAnYmlnNSc9PidCaWc1JywgJ3V0ZjgnPT4nVVRGLTgnLCAnbGF0aW4xJz0+J0xhdGluMScpOw0KCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidNWVNRTCBJbmZvcm1hdGlvbicsJ25hbWUnPT4nZGJpbmZvJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxmaWxlJyk7DQoJcCgnPHA+Jyk7DQoJcCgnREJIb3N0OicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYmhvc3QnLCdzaXplJz0+MjAsJ3ZhbHVlJz0+JGRiaG9zdCkpOw0KCXAoJzonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJwb3J0Jywnc2l6ZSc9PjQsJ3ZhbHVlJz0+JGRicG9ydCkpOw0KCXAoJ0RCVXNlcjonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJ1c2VyJywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiRkYnVzZXIpKTsNCglwKCdEQlBhc3M6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RicGFzcycsJ3NpemUnPT4xNSwndmFsdWUnPT4kZGJwYXNzKSk7DQoJcCgnREJOYW1lOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYm5hbWUnLCdzaXplJz0+MTUsJ3ZhbHVlJz0+JGRibmFtZSkpOw0KCXAoJ0RCQ2hhcnNldDonKTsNCgltYWtlc2VsZWN0KGFycmF5KCduYW1lJz0+J2NoYXJzZXQnLCdvcHRpb24nPT4kY2hhcnNldHMsJ3NlbGVjdGVkJz0+JGNoYXJzZXQpKTsNCglwKCc8L3A+Jyk7DQoJZm9ybWZvb3QoKTsNCglwKCc8Zm9ybSBhY3Rpb249IicuJHNlbGYuJyIgbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJteXNxbGZpbGUiIGlkPSJteXNxbGZpbGUiPicpOw0KCXAoJzxoMj5VcGxvYWQgZmlsZTwvaDI+Jyk7DQoJcCgnPHA+PGI+VGhpcyBvcGVyYXRpb24gdGhlIERCIHVzZXIgbXVzdCBoYXMgRklMRSBwcml2aWxlZ2U8L2I+PC9wPicpOw0KCXAoJzxwPlNhdmUgcGF0aChmdWxscGF0aCk6IDxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9InNhdmVwYXRoIiBzaXplPSI0NSIgdHlwZT0idGV4dCIgLz4gQ2hvb3NlIGEgZmlsZTogPGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0idXBsb2FkZmlsZSIgdHlwZT0iZmlsZSIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDpteXNxbGZpbGUoXCdteXNxbHVwbG9hZFwnKTsiPlVwbG9hZDwvYT48L3A+Jyk7DQoJcCgnPGgyPkRvd25sb2FkIGZpbGU8L2gyPicpOw0KCXAoJzxwPkZpbGU6IDxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9Im15c3FsZGxmaWxlIiBzaXplPSIxMTUiIHR5cGU9InRleHQiIC8+IDxhIGhyZWY9ImphdmFzY3JpcHQ6bXlzcWxmaWxlKFwnbXlzcWxkb3duXCcpOyI+RG93bmxvYWQ8L2E+PC9wPicpOw0KCW1ha2VoaWRlKCdkYmhvc3QnKTsNCgltYWtlaGlkZSgnZGJwb3J0Jyk7DQoJbWFrZWhpZGUoJ2RidXNlcicpOw0KCW1ha2VoaWRlKCdkYnBhc3MnKTsNCgltYWtlaGlkZSgnZGJuYW1lJyk7DQoJbWFrZWhpZGUoJ2NoYXJzZXQnKTsNCgltYWtlaGlkZSgnZG9pbmcnKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnc3FsZmlsZScpOw0KCXAoJzwvZm9ybT4nKTsNCn0NCg0KZWxzZWlmICgkYWN0aW9uID09ICdzcWxhZG1pbicpIHsNCgkhJGRiaG9zdCAmJiAkZGJob3N0ID0gJ2xvY2FsaG9zdCc7DQoJISRkYnVzZXIgJiYgJGRidXNlciA9ICdyb290JzsNCgkhJGRicG9ydCAmJiAkZGJwb3J0ID0gJzMzMDYnOw0KCSRkYmZvcm0gPSAnPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9ImNvbm5lY3QiIG5hbWU9ImNvbm5lY3QiIHZhbHVlPSIxIiAvPic7DQoJaWYoaXNzZXQoJGRiaG9zdCkpew0KCQkkZGJmb3JtIC49ICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiZGJob3N0XCIgbmFtZT1cImRiaG9zdFwiIHZhbHVlPVwiJGRiaG9zdFwiIC8+XG4iOw0KCX0NCglpZihpc3NldCgkZGJ1c2VyKSkgew0KCQkkZGJmb3JtIC49ICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiZGJ1c2VyXCIgbmFtZT1cImRidXNlclwiIHZhbHVlPVwiJGRidXNlclwiIC8+XG4iOw0KCX0NCglpZihpc3NldCgkZGJwYXNzKSkgew0KCQkkZGJmb3JtIC49ICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiZGJwYXNzXCIgbmFtZT1cImRicGFzc1wiIHZhbHVlPVwiJGRicGFzc1wiIC8+XG4iOw0KCX0NCglpZihpc3NldCgkZGJwb3J0KSkgew0KCQkkZGJmb3JtIC49ICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiZGJwb3J0XCIgbmFtZT1cImRicG9ydFwiIHZhbHVlPVwiJGRicG9ydFwiIC8+XG4iOw0KCX0NCglpZihpc3NldCgkZGJuYW1lKSkgew0KCQkkZGJmb3JtIC49ICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiZGJuYW1lXCIgbmFtZT1cImRibmFtZVwiIHZhbHVlPVwiJGRibmFtZVwiIC8+XG4iOw0KCX0NCglpZihpc3NldCgkY2hhcnNldCkpIHsNCgkJJGRiZm9ybSAuPSAiPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImNoYXJzZXRcIiBuYW1lPVwiY2hhcnNldFwiIHZhbHVlPVwiJGNoYXJzZXRcIiAvPlxuIjsNCgl9DQoNCglpZiAoJGRvaW5nID09ICdiYWNrdXBteXNxbCcgJiYgJHNhdmVhc2ZpbGUpIHsNCgkJaWYgKCEkdGFibGUpIHsNCgkJCW0oJ1BsZWFzZSBjaG9vc2UgdGhlIHRhYmxlJyk7DQoJCX0gZWxzZSB7DQoJCQlkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZSwkY2hhcnNldCwkZGJwb3J0KTsNCgkJCSR0YWJsZSA9IGFycmF5X2ZsaXAoJHRhYmxlKTsNCgkJCSRmcCA9IEBmb3BlbigkcGF0aCwndycpOw0KCQkJaWYgKCRmcCkgew0KCQkJCSRyZXN1bHQgPSBxKCdTSE9XIHRhYmxlcycpOw0KCQkJCWlmICghJHJlc3VsdCkgcCgnPGgyPicubXlzcWxfZXJyb3IoKS4nPC9oMj4nKTsNCgkJCQkkbXlzcWxkYXRhID0gJyc7DQoJCQkJd2hpbGUgKCRjdXJyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KSkgew0KCQkJCQlpZiAoaXNzZXQoJHRhYmxlWyRjdXJyb3dbMF1dKSkgew0KCQkJCQkJc3FsZHVtcHRhYmxlKCRjdXJyb3dbMF0sICRmcCk7DQoJCQkJCX0NCgkJCQl9DQoJCQkJZmNsb3NlKCRmcCk7DQoJCQkJJGZpbGV1cmwgPSBzdHJfcmVwbGFjZShTQV9ST09ULCcnLCRwYXRoKTsNCgkJCQltKCdEYXRhYmFzZSBoYXMgc3VjY2VzcyBiYWNrdXAgdG8gPGEgaHJlZj0iJy4kZmlsZXVybC4nIiB0YXJnZXQ9Il9ibGFuayI+Jy4kcGF0aC4nPC9hPicpOw0KCQkJCW15c3FsX2Nsb3NlKCk7DQoJCQl9IGVsc2Ugew0KCQkJCW0oJ0JhY2t1cCBmYWlsZWQnKTsNCgkJCX0NCgkJfQ0KCX0NCglpZiAoJGluc2VydCAmJiAkaW5zZXJ0c3FsKSB7DQoJCSRrZXlzdHIgPSAkdmFsc3RyID0gJHRtcCA9ICcnOw0KCQlmb3JlYWNoKCRpbnNlcnRzcWwgYXMgJGtleSA9PiAkdmFsKSB7DQoJCQlpZiAoJHZhbCkgew0KCQkJCSRrZXlzdHIgLj0gJHRtcC4ka2V5Ow0KCQkJCSR2YWxzdHIgLj0gJHRtcC4iJyIuYWRkc2xhc2hlcygkdmFsKS4iJyI7DQoJCQkJJHRtcCA9ICcsJzsNCgkJCX0NCgkJfQ0KCQlpZiAoJGtleXN0ciAmJiAkdmFsc3RyKSB7DQoJCQlkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZSwkY2hhcnNldCwkZGJwb3J0KTsNCgkJCW0ocSgiSU5TRVJUIElOVE8gJHRhYmxlbmFtZSAoJGtleXN0cikgVkFMVUVTICgkdmFsc3RyKSIpID8gJ0luc2VydCBuZXcgcmVjb3JkIG9mIHN1Y2Nlc3MnIDogbXlzcWxfZXJyb3IoKSk7DQoJCX0NCgl9DQoJaWYgKCR1cGRhdGUgJiYgJGluc2VydHNxbCAmJiAkYmFzZTY0KSB7DQoJCSR2YWxzdHIgPSAkdG1wID0gJyc7DQoJCWZvcmVhY2goJGluc2VydHNxbCBhcyAka2V5ID0+ICR2YWwpIHsNCgkJCSR2YWxzdHIgLj0gJHRtcC4ka2V5LiI9JyIuYWRkc2xhc2hlcygkdmFsKS4iJyI7DQoJCQkkdG1wID0gJywnOw0KCQl9DQoJCWlmICgkdmFsc3RyKSB7DQoJCQkkd2hlcmUgPSBiYXNlNjRfZGVjb2RlKCRiYXNlNjQpOw0KCQkJZGJjb25uKCRkYmhvc3QsJGRidXNlciwkZGJwYXNzLCRkYm5hbWUsJGNoYXJzZXQsJGRicG9ydCk7DQoJCQltKHEoIlVQREFURSAkdGFibGVuYW1lIFNFVCAkdmFsc3RyIFdIRVJFICR3aGVyZSBMSU1JVCAxIikgPyAnUmVjb3JkIHVwZGF0aW5nJyA6IG15c3FsX2Vycm9yKCkpOw0KCQl9DQoJfQ0KCWlmICgkZG9pbmcgPT0gJ2RlbCcgJiYgJGJhc2U2NCkgew0KCQkkd2hlcmUgPSBiYXNlNjRfZGVjb2RlKCRiYXNlNjQpOw0KCQkkZGVsZXRlX3NxbCA9ICJERUxFVEUgRlJPTSAkdGFibGVuYW1lIFdIRVJFICR3aGVyZSI7DQoJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOw0KCQltKHEoIkRFTEVURSBGUk9NICR0YWJsZW5hbWUgV0hFUkUgJHdoZXJlIikgPyAnRGVsZXRpb24gcmVjb3JkIG9mIHN1Y2Nlc3MnIDogbXlzcWxfZXJyb3IoKSk7DQoJfQ0KDQoJaWYgKCR0YWJsZW5hbWUgJiYgJGRvaW5nID09ICdkcm9wJykgew0KCQlkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZSwkY2hhcnNldCwkZGJwb3J0KTsNCgkJaWYgKHEoIkRST1AgVEFCTEUgJHRhYmxlbmFtZSIpKSB7DQoJCQltKCdEcm9wIHRhYmxlIG9mIHN1Y2Nlc3MnKTsNCgkJCSR0YWJsZW5hbWUgPSAnJzsNCgkJfSBlbHNlIHsNCgkJCW0obXlzcWxfZXJyb3IoKSk7DQoJCX0NCgl9DQoNCgkkY2hhcnNldHMgPSBhcnJheSgnJz0+J0RlZmF1bHQnLCdnYmsnPT4nR0JLJywgJ2JpZzUnPT4nQmlnNScsICd1dGY4Jz0+J1VURi04JywgJ2xhdGluMSc9PidMYXRpbjEnKTsNCg0KCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidNWVNRTCBNYW5hZ2VyJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxhZG1pbicpOw0KCXAoJzxwPicpOw0KCXAoJ0RCSG9zdDonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJob3N0Jywnc2l6ZSc9PjIwLCd2YWx1ZSc9PiRkYmhvc3QpKTsNCglwKCc6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RicG9ydCcsJ3NpemUnPT40LCd2YWx1ZSc9PiRkYnBvcnQpKTsNCglwKCdEQlVzZXI6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RidXNlcicsJ3NpemUnPT4xNSwndmFsdWUnPT4kZGJ1c2VyKSk7DQoJcCgnREJQYXNzOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYnBhc3MnLCdzaXplJz0+MTUsJ3ZhbHVlJz0+JGRicGFzcykpOw0KCXAoJ0RCQ2hhcnNldDonKTsNCgltYWtlc2VsZWN0KGFycmF5KCduYW1lJz0+J2NoYXJzZXQnLCdvcHRpb24nPT4kY2hhcnNldHMsJ3NlbGVjdGVkJz0+JGNoYXJzZXQpKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nY29ubmVjdCcsJ3ZhbHVlJz0+J0Nvbm5lY3QnLCd0eXBlJz0+J3N1Ym1pdCcsJ2NsYXNzJz0+J2J0JykpOw0KCXAoJzwvcD4nKTsNCglmb3JtZm9vdCgpOw0KPz4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCmZ1bmN0aW9uIGVkaXRyZWNvcmQoYWN0aW9uLCBiYXNlNjQsIHRhYmxlbmFtZSl7DQoJaWYgKGFjdGlvbiA9PSAnZGVsJykgew0KCQlpZiAoIWNvbmZpcm0oJ0lzIG9yIGlzblwndCBkZWxldGlvbiByZWNvcmQ/JykpIHJldHVybjsNCgl9DQoJJCgncmVjb3JkbGlzdCcpLmRvaW5nLnZhbHVlPWFjdGlvbjsNCgkkKCdyZWNvcmRsaXN0JykuYmFzZTY0LnZhbHVlPWJhc2U2NDsNCgkkKCdyZWNvcmRsaXN0JykudGFibGVuYW1lLnZhbHVlPXRhYmxlbmFtZTsNCgkkKCdyZWNvcmRsaXN0Jykuc3VibWl0KCk7DQp9DQpmdW5jdGlvbiBtb2RkYm5hbWUoZGJuYW1lKSB7DQoJaWYoIWRibmFtZSkgcmV0dXJuOw0KCSQoJ3NldGRibmFtZScpLmRibmFtZS52YWx1ZT1kYm5hbWU7DQoJJCgnc2V0ZGJuYW1lJykuc3VibWl0KCk7DQp9DQpmdW5jdGlvbiBzZXR0YWJsZSh0YWJsZW5hbWUsZG9pbmcscGFnZSkgew0KCWlmKCF0YWJsZW5hbWUpIHJldHVybjsNCglpZiAoZG9pbmcpIHsNCgkJJCgnc2V0dGFibGUnKS5kb2luZy52YWx1ZT1kb2luZzsNCgl9DQoJaWYgKHBhZ2UpIHsNCgkJJCgnc2V0dGFibGUnKS5wYWdlLnZhbHVlPXBhZ2U7DQoJfQ0KCSQoJ3NldHRhYmxlJykudGFibGVuYW1lLnZhbHVlPXRhYmxlbmFtZTsNCgkkKCdzZXR0YWJsZScpLnN1Ym1pdCgpOw0KfQ0KPC9zY3JpcHQ+DQo8P3BocA0KCS8vIysrJiMxMTE4Oyt8LSsNCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidyZWNvcmRsaXN0JykpOw0KCW1ha2VoaWRlKCdkb2luZycpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxhZG1pbicpOw0KCW1ha2VoaWRlKCdiYXNlNjQnKTsNCgltYWtlaGlkZSgndGFibGVuYW1lJyk7DQoJcCgkZGJmb3JtKTsNCglmb3JtZm9vdCgpOw0KDQoJLy8tJiMxMDczO3wmIzEwODA7LSArfCsmIzEwOTA7DQoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nc2V0ZGJuYW1lJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxhZG1pbicpOw0KCXAoJGRiZm9ybSk7DQoJaWYgKCEkZGJuYW1lKSB7DQoJCW1ha2VoaWRlKCdkYm5hbWUnKTsNCgl9DQoJZm9ybWZvb3QoKTsNCg0KCS8vLSYjMTA3Mzt8JiMxMDgwOyMmIzExMDE7DQoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nc2V0dGFibGUnKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7DQoJcCgkZGJmb3JtKTsNCgltYWtlaGlkZSgndGFibGVuYW1lJyk7DQoJbWFrZWhpZGUoJ3BhZ2UnLCRwYWdlKTsNCgltYWtlaGlkZSgnZG9pbmcnKTsNCglmb3JtZm9vdCgpOw0KDQoJJGNhY2hldGFibGVzID0gYXJyYXkoKTsNCgkkcGFnZW51bSA9IDMwOw0KCSRwYWdlID0gaW50dmFsKCRwYWdlKTsNCglpZigkcGFnZSkgew0KCQkkc3RhcnRfbGltaXQgPSAoJHBhZ2UgLSAxKSAqICRwYWdlbnVtOw0KCX0gZWxzZSB7DQoJCSRzdGFydF9saW1pdCA9IDA7DQoJCSRwYWdlID0gMTsNCgl9DQoJaWYgKGlzc2V0KCRkYmhvc3QpICYmIGlzc2V0KCRkYnVzZXIpICYmIGlzc2V0KCRkYnBhc3MpICYmIGlzc2V0KCRjb25uZWN0KSkgew0KCQlkYmNvbm4oJGRiaG9zdCwgJGRidXNlciwgJGRicGFzcywgJGRibmFtZSwgJGNoYXJzZXQsICRkYnBvcnQpOw0KCQkvLysmIzExMDU7KyYjMTA3MzstICt8KyYjMTA5MDstKy0mIzEwNzQ7DQoJCSRteXNxbHZlciA9IG15c3FsX2dldF9zZXJ2ZXJfaW5mbygpOw0KCQlwKCc8cD5NeVNRTCAnLiRteXNxbHZlci4nIHJ1bm5pbmcgaW4gJy4kZGJob3N0LicgYXMgJy4kZGJ1c2VyLidAJy4kZGJob3N0Lic8L3A+Jyk7DQoJCSRoaWdodmVyID0gJG15c3FsdmVyID4gJzQuMScgPyAxIDogMDsNCg0KCQkvLysmIzExMDU7KyYjMTA3MzstICt8KyYjMTA5MDsNCgkJJHF1ZXJ5ID0gcSgiU0hPVyBEQVRBQkFTRVMiKTsNCgkJJGRicyA9IGFycmF5KCk7DQoJCSRkYnNbXSA9ICctLSBTZWxlY3QgYSBkYXRhYmFzZSAtLSc7DQoJCXdoaWxlKCRkYiA9IG15c3FsX2ZldGNoX2FycmF5KCRxdWVyeSkpIHsNCgkJCSRkYnNbJGRiWydEYXRhYmFzZSddXSA9ICRkYlsnRGF0YWJhc2UnXTsNCgkJfQ0KCQltYWtlc2VsZWN0KGFycmF5KCd0aXRsZSc9PidQbGVhc2Ugc2VsZWN0IGEgZGF0YWJhc2U6JywnbmFtZSc9PidkYltdJywnb3B0aW9uJz0+JGRicywnc2VsZWN0ZWQnPT4kZGJuYW1lLCdvbmNoYW5nZSc9Pidtb2RkYm5hbWUodGhpcy5vcHRpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0udmFsdWUpJywnbmV3bGluZSc9PjEpKTsNCgkJJHRhYmxlZGIgPSBhcnJheSgpOw0KCQlpZiAoJGRibmFtZSkgew0KCQkJcCgnPHA+Jyk7DQoJCQlwKCdDdXJyZW50IGRhYmFiYXNlOiA8YSBocmVmPSJqYXZhc2NyaXB0Om1vZGRibmFtZShcJycuJGRibmFtZS4nXCcpOyI+Jy4kZGJuYW1lLic8L2E+Jyk7DQoJCQlpZiAoJHRhYmxlbmFtZSkgew0KCQkJCXAoJyB8IEN1cnJlbnQgVGFibGU6IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnKTsiPicuJHRhYmxlbmFtZS4nPC9hPiBbIDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ2luc2VydFwnKTsiPkluc2VydDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdzdHJ1Y3R1cmVcJyk7Ij5TdHJ1Y3R1cmU8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnZHJvcFwnKTsiPkRyb3A8L2E+IF0nKTsNCgkJCX0NCgkJCXAoJzwvcD4nKTsNCgkJCW15c3FsX3NlbGVjdF9kYigkZGJuYW1lKTsNCg0KCQkJJGdldG51bXNxbCA9ICcnOw0KCQkJJHJ1bnF1ZXJ5ID0gMDsNCgkJCWlmICgkc3FsX3F1ZXJ5KSB7DQoJCQkJJHJ1bnF1ZXJ5ID0gMTsNCgkJCX0NCgkJCSRhbGxvd2VkaXQgPSAwOw0KCQkJaWYgKCR0YWJsZW5hbWUgJiYgISRzcWxfcXVlcnkpIHsNCgkJCQkkc3FsX3F1ZXJ5ID0gIlNFTEVDVCAqIEZST00gJHRhYmxlbmFtZSI7DQoJCQkJJGdldG51bXNxbCA9ICRzcWxfcXVlcnk7DQoJCQkJJHNxbF9xdWVyeSA9ICRzcWxfcXVlcnkuIiBMSU1JVCAkc3RhcnRfbGltaXQsICRwYWdlbnVtIjsNCgkJCQkkYWxsb3dlZGl0ID0gMTsNCgkJCX0NCgkJCXAoJzxmb3JtIGFjdGlvbj0iJy4kc2VsZi4nIiBtZXRob2Q9IlBPU1QiPicpOw0KCQkJcCgnPHA+PHRhYmxlIHdpZHRoPSIyMDAiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj48dHI+PHRkIGNvbHNwYW49IjIiPlJ1biBTUUwgcXVlcnkvcXVlcmllcyBvbiBkYXRhYmFzZSAnLiRkYm5hbWUuJzo8L3RkPjwvdHI+PHRyPjx0ZD48dGV4dGFyZWEgbmFtZT0ic3FsX3F1ZXJ5IiBjbGFzcz0iYXJlYSIgc3R5bGU9IndpZHRoOjYwMHB4O2hlaWdodDo1MHB4O292ZXJmbG93OmF1dG87Ij4nLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9xdWVyeSxFTlRfUVVPVEVTKS4nPC90ZXh0YXJlYT48L3RkPjx0ZCBzdHlsZT0icGFkZGluZzowIDVweDsiPjxpbnB1dCBjbGFzcz0iYnQiIHN0eWxlPSJoZWlnaHQ6NTBweDsiIG5hbWU9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iUXVlcnkiIC8+PC90ZD48L3RyPjwvdGFibGU+PC9wPicpOw0KCQkJbWFrZWhpZGUoJ3RhYmxlbmFtZScsICR0YWJsZW5hbWUpOw0KCQkJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7DQoJCQlwKCRkYmZvcm0pOw0KCQkJcCgnPC9mb3JtPicpOw0KCQkJaWYgKCR0YWJsZW5hbWUgfHwgKCRydW5xdWVyeSAmJiAkc3FsX3F1ZXJ5KSkgew0KCQkJCWlmICgkZG9pbmcgPT0gJ3N0cnVjdHVyZScpIHsNCgkJCQkJJHJlc3VsdCA9IHEoIlNIT1cgQ09MVU1OUyBGUk9NICR0YWJsZW5hbWUiKTsNCgkJCQkJJHJvd2RiID0gYXJyYXkoKTsNCgkJCQkJd2hpbGUoJHJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpKSB7DQoJCQkJCQkkcm93ZGJbXSA9ICRyb3c7DQoJCQkJCX0NCgkJCQkJcCgnPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4nKTsNCgkJCQkJcCgnPHRyIGNsYXNzPSJoZWFkIj4nKTsNCgkJCQkJcCgnPHRkPkZpZWxkPC90ZD4nKTsNCgkJCQkJcCgnPHRkPlR5cGU8L3RkPicpOw0KCQkJCQlwKCc8dGQ+TnVsbDwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD5LZXk8L3RkPicpOw0KCQkJCQlwKCc8dGQ+RGVmYXVsdDwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD5FeHRyYTwvdGQ+Jyk7DQoJCQkJCXAoJzwvdHI+Jyk7DQoJCQkJCWZvcmVhY2ggKCRyb3dkYiBhcyAkcm93KSB7DQoJCQkJCQkkdGhpc2JnID0gYmcoKTsNCgkJCQkJCXAoJzx0ciBjbGFzcz0iJy4kdGhpc2JnLiciIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJycuJHRoaXNiZy4nXCc7Ij4nKTsNCgkJCQkJCXAoJzx0ZD4nLiRyb3dbJ0ZpZWxkJ10uJzwvdGQ+Jyk7DQoJCQkJCQlwKCc8dGQ+Jy4kcm93WydUeXBlJ10uJzwvdGQ+Jyk7DQoJCQkJCQlwKCc8dGQ+Jy4kcm93WydOdWxsJ10uJyZuYnNwOzwvdGQ+Jyk7DQoJCQkJCQlwKCc8dGQ+Jy4kcm93WydLZXknXS4nJm5ic3A7PC90ZD4nKTsNCgkJCQkJCXAoJzx0ZD4nLiRyb3dbJ0RlZmF1bHQnXS4nJm5ic3A7PC90ZD4nKTsNCgkJCQkJCXAoJzx0ZD4nLiRyb3dbJ0V4dHJhJ10uJyZuYnNwOzwvdGQ+Jyk7DQoJCQkJCQlwKCc8L3RyPicpOw0KCQkJCQl9DQoJCQkJCXRiZm9vdCgpOw0KCQkJCX0gZWxzZWlmICgkZG9pbmcgPT0gJ2luc2VydCcgfHwgJGRvaW5nID09ICdlZGl0Jykgew0KCQkJCQkkcmVzdWx0ID0gcSgnU0hPVyBDT0xVTU5TIEZST00gJy4kdGFibGVuYW1lKTsNCgkJCQkJd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KSkgew0KCQkJCQkJJHJvd2RiW10gPSAkcm93Ow0KCQkJCQl9DQoJCQkJCSRycyA9IGFycmF5KCk7DQoJCQkJCWlmICgkZG9pbmcgPT0gJ2luc2VydCcpIHsNCgkJCQkJCXAoJzxoMj5JbnNlcnQgbmV3IGxpbmUgaW4gJy4kdGFibGVuYW1lLicgdGFibGUgJnJhcXVvOzwvaDI+Jyk7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQlwKCc8aDI+VXBkYXRlIHJlY29yZCBpbiAnLiR0YWJsZW5hbWUuJyB0YWJsZSAmcmFxdW87PC9oMj4nKTsNCgkJCQkJCSR3aGVyZSA9IGJhc2U2NF9kZWNvZGUoJGJhc2U2NCk7DQoJCQkJCQkkcmVzdWx0ID0gcSgiU0VMRUNUICogRlJPTSAkdGFibGVuYW1lIFdIRVJFICR3aGVyZSBMSU1JVCAxIik7DQoJCQkJCQkkcnMgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KTsNCgkJCQkJfQ0KCQkJCQlwKCc8Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iJy4kc2VsZi4nIj4nKTsNCgkJCQkJcCgkZGJmb3JtKTsNCgkJCQkJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7DQoJCQkJCW1ha2VoaWRlKCd0YWJsZW5hbWUnLCR0YWJsZW5hbWUpOw0KCQkJCQlwKCc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPicpOw0KCQkJCQlmb3JlYWNoICgkcm93ZGIgYXMgJHJvdykgew0KCQkJCQkJaWYgKCRyc1skcm93WydGaWVsZCddXSkgew0KCQkJCQkJCSR2YWx1ZSA9IGh0bWxzcGVjaWFsY2hhcnMoJHJzWyRyb3dbJ0ZpZWxkJ11dKTsNCgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJJHZhbHVlID0gJyc7DQoJCQkJCQl9DQoJCQkJCQkkdGhpc2JnID0gYmcoKTsNCgkJCQkJCXAoJzx0ciBjbGFzcz0iJy4kdGhpc2JnLiciIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJycuJHRoaXNiZy4nXCc7Ij4nKTsNCgkJCQkJCXAoJzx0ZD48Yj4nLiRyb3dbJ0ZpZWxkJ10uJzwvYj48YnIgLz4nLiRyb3dbJ1R5cGUnXS4nPC90ZD48dGQ+PHRleHRhcmVhIGNsYXNzPSJhcmVhIiBuYW1lPSJpbnNlcnRzcWxbJy4kcm93WydGaWVsZCddLiddIiBzdHlsZT0id2lkdGg6NTAwcHg7aGVpZ2h0OjYwcHg7b3ZlcmZsb3c6YXV0bzsiPicuJHZhbHVlLic8L3RleHRhcmVhPjwvdGQ+PC90cj4nKTsNCgkJCQkJfQ0KCQkJCQlpZiAoJGRvaW5nID09ICdpbnNlcnQnKSB7DQoJCQkJCQlwKCc8dHIgY2xhc3M9IicuYmcoKS4nIj48dGQgY29sc3Bhbj0iMiI+PGlucHV0IGNsYXNzPSJidCIgdHlwZT0ic3VibWl0IiBuYW1lPSJpbnNlcnQiIHZhbHVlPSJJbnNlcnQiIC8+PC90ZD48L3RyPicpOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJcCgnPHRyIGNsYXNzPSInLmJnKCkuJyI+PHRkIGNvbHNwYW49IjIiPjxpbnB1dCBjbGFzcz0iYnQiIHR5cGU9InN1Ym1pdCIgbmFtZT0idXBkYXRlIiB2YWx1ZT0iVXBkYXRlIiAvPjwvdGQ+PC90cj4nKTsNCgkJCQkJCW1ha2VoaWRlKCdiYXNlNjQnLCAkYmFzZTY0KTsNCgkJCQkJfQ0KCQkJCQlwKCc8L3RhYmxlPjwvZm9ybT4nKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkcXVlcnlzID0gQGV4cGxvZGUoJzsnLCRzcWxfcXVlcnkpOw0KCQkJCQlmb3JlYWNoKCRxdWVyeXMgYXMgJG51bT0+JHF1ZXJ5KSB7DQoJCQkJCQlpZiAoJHF1ZXJ5KSB7DQoJCQkJCQkJcCgiPHA+PGI+UXVlcnkjeyRudW19IDogIi5odG1sc3BlY2lhbGNoYXJzKCRxdWVyeSxFTlRfUVVPVEVTKS4iPC9iPjwvcD4iKTsNCgkJCQkJCQlzd2l0Y2gocXkoJHF1ZXJ5KSkNCgkJCQkJCQl7DQoJCQkJCQkJCWNhc2UgMDoNCgkJCQkJCQkJCXAoJzxoMj5FcnJvciA6ICcubXlzcWxfZXJyb3IoKS4nPC9oMj4nKTsNCgkJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCQljYXNlIDE6DQoJCQkJCQkJCQlpZiAoc3RydG9sb3dlcihzdWJzdHIoJHF1ZXJ5LDAsMTMpKSA9PSAnc2VsZWN0ICogZnJvbScpIHsNCgkJCQkJCQkJCQkkYWxsb3dlZGl0ID0gMTsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJCWlmICgkZ2V0bnVtc3FsKSB7DQoJCQkJCQkJCQkJJHRhdG9sID0gbXlzcWxfbnVtX3Jvd3MocSgkZ2V0bnVtc3FsKSk7DQoJCQkJCQkJCQkJJG11bHRpcGFnZSA9IG11bHRpKCR0YXRvbCwgJHBhZ2VudW0sICRwYWdlLCAkdGFibGVuYW1lKTsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJCWlmICghJHRhYmxlbmFtZSkgew0KCQkJCQkJCQkJCSRzcWxfbGluZSA9IHN0cl9yZXBsYWNlKGFycmF5KCJcciIsICJcbiIsICJcdCIpLCBhcnJheSgnICcsICcgJywgJyAnKSwgdHJpbShodG1sc3BlY2lhbGNoYXJzKCRxdWVyeSkpKTsNCgkJCQkJCQkJCQkkc3FsX2xpbmUgPSBwcmVnX3JlcGxhY2UoIi9cL1wqW14oXCpcLyldKlwqXC8vaSIsICIgIiwgJHNxbF9saW5lKTsNCgkJCQkJCQkJCQlwcmVnX21hdGNoX2FsbCgiL2Zyb21ccytgezAsMX0oW1x3XSspYHswLDF9XHMrL2kiLCRzcWxfbGluZSwkbWF0Y2hlcyk7DQoJCQkJCQkJCQkJJHRhYmxlbmFtZSA9ICRtYXRjaGVzWzFdWzBdOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJJHJlc3VsdCA9IHEoJHF1ZXJ5KTsNCgkJCQkJCQkJCXAoJG11bHRpcGFnZSk7DQoJCQkJCQkJCQlwKCc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPicpOw0KCQkJCQkJCQkJcCgnPHRyIGNsYXNzPSJoZWFkIj4nKTsNCgkJCQkJCQkJCWlmICgkYWxsb3dlZGl0KSBwKCc8dGQ+QWN0aW9uPC90ZD4nKTsNCgkJCQkJCQkJCSRmaWVsZG51bSA9IEBteXNxbF9udW1fZmllbGRzKCRyZXN1bHQpOw0KCQkJCQkJCQkJZm9yKCRpPTA7JGk8JGZpZWxkbnVtOyRpKyspew0KCQkJCQkJCQkJCSRuYW1lID0gQG15c3FsX2ZpZWxkX25hbWUoJHJlc3VsdCwgJGkpOw0KCQkJCQkJCQkJCSR0eXBlID0gQG15c3FsX2ZpZWxkX3R5cGUoJHJlc3VsdCwgJGkpOw0KCQkJCQkJCQkJCSRsZW4gPSBAbXlzcWxfZmllbGRfbGVuKCRyZXN1bHQsICRpKTsNCgkJCQkJCQkJCQlwKCI8dGQgbm93cmFwPiRuYW1lPGJyPjxzcGFuPiR0eXBlKCRsZW4pPC9zcGFuPjwvdGQ+Iik7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCQlwKCc8L3RyPicpOw0KCQkJCQkJCQkJd2hpbGUoJG1uID0gQG15c3FsX2ZldGNoX2Fzc29jKCRyZXN1bHQpKXsNCgkJCQkJCQkJCQkkdGhpc2JnID0gYmcoKTsNCgkJCQkJCQkJCQlwKCc8dHIgY2xhc3M9IicuJHRoaXNiZy4nIiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCcnLiR0aGlzYmcuJ1wnOyI+Jyk7DQoJCQkJCQkJCQkJJHdoZXJlID0gJHRtcCA9ICRiMSA9ICcnOw0KCQkJCQkJCQkJCWZvcmVhY2goJG1uIGFzICRrZXk9PiRpbnNpZGUpew0KCQkJCQkJCQkJCQlpZiAoJGluc2lkZSkgew0KCQkJCQkJCQkJCQkJJHdoZXJlIC49ICR0bXAuJGtleS4iPSciLmFkZHNsYXNoZXMoJGluc2lkZSkuIiciOw0KCQkJCQkJCQkJCQkJJHRtcCA9ICcgQU5EICc7DQoJCQkJCQkJCQkJCX0NCgkJCQkJCQkJCQkJJGIxIC49ICc8dGQgbm93cmFwPicuaHRtbF9jbGVhbigkaW5zaWRlKS4nJm5ic3A7PC90ZD4nOw0KCQkJCQkJCQkJCX0NCgkJCQkJCQkJCQkkd2hlcmUgPSBiYXNlNjRfZW5jb2RlKCR3aGVyZSk7DQoJCQkJCQkJCQkJaWYgKCRhbGxvd2VkaXQpIHAoJzx0ZCBub3dyYXA+PGEgaHJlZj0iamF2YXNjcmlwdDplZGl0cmVjb3JkKFwnZWRpdFwnLCBcJycuJHdoZXJlLidcJywgXCcnLiR0YWJsZW5hbWUuJ1wnKTsiPkVkaXQ8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDplZGl0cmVjb3JkKFwnZGVsXCcsIFwnJy4kd2hlcmUuJ1wnLCBcJycuJHRhYmxlbmFtZS4nXCcpOyI+RGVsPC9hPjwvdGQ+Jyk7DQoJCQkJCQkJCQkJcCgkYjEpOw0KCQkJCQkJCQkJCXAoJzwvdHI+Jyk7DQoJCQkJCQkJCQkJdW5zZXQoJGIxKTsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJCXRiZm9vdCgpOw0KCQkJCQkJCQkJcCgkbXVsdGlwYWdlKTsNCgkJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCQljYXNlIDI6DQoJCQkJCQkJCQkkYXIgPSBteXNxbF9hZmZlY3RlZF9yb3dzKCk7DQoJCQkJCQkJCQlwKCc8aDI+YWZmZWN0ZWQgcm93cyA6IDxiPicuJGFyLic8L2I+PC9oMj4nKTsNCgkJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJJHF1ZXJ5ID0gcSgiU0hPVyBUQUJMRSBTVEFUVVMiKTsNCgkJCQkkdGFibGVfbnVtID0gJHRhYmxlX3Jvd3MgPSAkZGF0YV9zaXplID0gMDsNCgkJCQkkdGFibGVkYiA9IGFycmF5KCk7DQoJCQkJd2hpbGUoJHRhYmxlID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHF1ZXJ5KSkgew0KCQkJCQkkZGF0YV9zaXplID0gJGRhdGFfc2l6ZSArICR0YWJsZVsnRGF0YV9sZW5ndGgnXTsNCgkJCQkJJHRhYmxlX3Jvd3MgPSAkdGFibGVfcm93cyArICR0YWJsZVsnUm93cyddOw0KCQkJCQkkdGFibGVbJ0RhdGFfbGVuZ3RoJ10gPSBzaXplY291bnQoJHRhYmxlWydEYXRhX2xlbmd0aCddKTsNCgkJCQkJJHRhYmxlX251bSsrOw0KCQkJCQkkdGFibGVkYltdID0gJHRhYmxlOw0KCQkJCX0NCgkJCQkkZGF0YV9zaXplID0gc2l6ZWNvdW50KCRkYXRhX3NpemUpOw0KCQkJCXVuc2V0KCR0YWJsZSk7DQoJCQkJcCgnPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4nKTsNCgkJCQlwKCc8Zm9ybSBhY3Rpb249IicuJHNlbGYuJyIgbWV0aG9kPSJQT1NUIj4nKTsNCgkJCQltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsNCgkJCQlwKCRkYmZvcm0pOw0KCQkJCXAoJzx0ciBjbGFzcz0iaGVhZCI+Jyk7DQoJCQkJcCgnPHRkIHdpZHRoPSIyJSIgYWxpZ249ImNlbnRlciI+PGlucHV0IG5hbWU9ImNoa2FsbCIgdmFsdWU9Im9uIiB0eXBlPSJjaGVja2JveCIgb25jbGljaz0iQ2hlY2tBbGwodGhpcy5mb3JtKSIgLz48L3RkPicpOw0KCQkJCXAoJzx0ZD5OYW1lPC90ZD4nKTsNCgkJCQlwKCc8dGQ+Um93czwvdGQ+Jyk7DQoJCQkJcCgnPHRkPkRhdGFfbGVuZ3RoPC90ZD4nKTsNCgkJCQlwKCc8dGQ+Q3JlYXRlX3RpbWU8L3RkPicpOw0KCQkJCXAoJzx0ZD5VcGRhdGVfdGltZTwvdGQ+Jyk7DQoJCQkJaWYgKCRoaWdodmVyKSB7DQoJCQkJCXAoJzx0ZD5FbmdpbmU8L3RkPicpOw0KCQkJCQlwKCc8dGQ+Q29sbGF0aW9uPC90ZD4nKTsNCgkJCQl9DQoJCQkJcCgnPC90cj4nKTsNCgkJCQlmb3JlYWNoICgkdGFibGVkYiBhcyAka2V5ID0+ICR0YWJsZSkgew0KCQkJCQkkdGhpc2JnID0gYmcoKTsNCgkJCQkJcCgnPHRyIGNsYXNzPSInLiR0aGlzYmcuJyIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnJy4kdGhpc2JnLidcJzsiPicpOw0KCQkJCQlwKCc8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjIlIj48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InRhYmxlW10iIHZhbHVlPSInLiR0YWJsZVsnTmFtZSddLiciIC8+PC90ZD4nKTsNCgkJCQkJcCgnPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZVsnTmFtZSddLidcJyk7Ij4nLiR0YWJsZVsnTmFtZSddLic8L2E+IFsgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlWydOYW1lJ10uJ1wnLCBcJ2luc2VydFwnKTsiPkluc2VydDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVbJ05hbWUnXS4nXCcsIFwnc3RydWN0dXJlXCcpOyI+U3RydWN0dXJlPC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZVsnTmFtZSddLidcJywgXCdkcm9wXCcpOyI+RHJvcDwvYT4gXTwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD4nLiR0YWJsZVsnUm93cyddLic8L3RkPicpOw0KCQkJCQlwKCc8dGQ+Jy4kdGFibGVbJ0RhdGFfbGVuZ3RoJ10uJzwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD4nLiR0YWJsZVsnQ3JlYXRlX3RpbWUnXS4nPC90ZD4nKTsNCgkJCQkJcCgnPHRkPicuJHRhYmxlWydVcGRhdGVfdGltZSddLic8L3RkPicpOw0KCQkJCQlpZiAoJGhpZ2h2ZXIpIHsNCgkJCQkJCXAoJzx0ZD4nLiR0YWJsZVsnRW5naW5lJ10uJzwvdGQ+Jyk7DQoJCQkJCQlwKCc8dGQ+Jy4kdGFibGVbJ0NvbGxhdGlvbiddLic8L3RkPicpOw0KCQkJCQl9DQoJCQkJCXAoJzwvdHI+Jyk7DQoJCQkJfQ0KCQkJCXAoJzx0ciBjbGFzcz0nLmJnKCkuJz4nKTsNCgkJCQlwKCc8dGQ+Jm5ic3A7PC90ZD4nKTsNCgkJCQlwKCc8dGQ+VG90YWwgdGFibGVzOiAnLiR0YWJsZV9udW0uJzwvdGQ+Jyk7DQoJCQkJcCgnPHRkPicuJHRhYmxlX3Jvd3MuJzwvdGQ+Jyk7DQoJCQkJcCgnPHRkPicuJGRhdGFfc2l6ZS4nPC90ZD4nKTsNCgkJCQlwKCc8dGQgY29sc3Bhbj0iJy4oJGhpZ2h2ZXIgPyA0IDogMikuJyI+Jm5ic3A7PC90ZD4nKTsNCgkJCQlwKCc8L3RyPicpOw0KDQoJCQkJcCgiPHRyIGNsYXNzPVwiIi5iZygpLiJcIj48dGQgY29sc3Bhbj1cIiIuKCRoaWdodmVyID8gOCA6IDYpLiJcIj48aW5wdXQgbmFtZT1cInNhdmVhc2ZpbGVcIiB2YWx1ZT1cIjFcIiB0eXBlPVwiY2hlY2tib3hcIiAvPiBTYXZlIGFzIGZpbGUgPGlucHV0IGNsYXNzPVwiaW5wdXRcIiBuYW1lPVwicGF0aFwiIHZhbHVlPVwiIi5TQV9ST09ULiRfU0VSVkVSWydIVFRQX0hPU1QnXS4iX015U1FMLnNxbFwiIHR5cGU9XCJ0ZXh0XCIgc2l6ZT1cIjYwXCIgLz4gPGlucHV0IGNsYXNzPVwiYnRcIiB0eXBlPVwic3VibWl0XCIgbmFtZT1cImRvd25yYXJcIiB2YWx1ZT1cIkV4cG9ydCBzZWxlY3Rpb24gdGFibGVcIiAvPjwvdGQ+PC90cj4iKTsNCgkJCQltYWtlaGlkZSgnZG9pbmcnLCdiYWNrdXBteXNxbCcpOw0KCQkJCWZvcm1mb290KCk7DQoJCQkJcCgiPC90YWJsZT4iKTsNCgkJCQlmcigkcXVlcnkpOw0KCQkJfQ0KCQl9DQoJfQ0KCXRiZm9vdCgpOw0KCUBteXNxbF9jbG9zZSgpOw0KfS8vZW5kIHNxbCBiYWNrdXANCg0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ2JhY2tjb25uZWN0Jykgew0KCSEkeW91cmlwICYmICR5b3VyaXAgPSAkX1NFUlZFUlsnUkVNT1RFX0FERFInXTsNCgkhJHlvdXJwb3J0ICYmICR5b3VycG9ydCA9ICcxMjM0NSc7DQoJJHVzZWRiID0gYXJyYXkoJ3BlcmwnPT4ncGVybCcsJ2MnPT4nYycpOw0KDQoJJGJhY2tfY29ubmVjdD0iSXlFdmRYTnlMMkpwYmk5d1pYSnNEUXAxYzJVZ1UyOWphMlYwT3cwS0pHTnRaRDBnSW14NWJuZ2lPdzBLSkhONWMzUmxiVDBnSjJWamFHOGdJbUIxYm1GdFpTQXRZV0FpTzJWaiIuDQoJCSJhRzhnSW1CcFpHQWlPeTlpYVc0dmMyZ25PdzBLSkRBOUpHTnRaRHNOQ2lSMFlYSm5aWFE5SkVGU1IxWmJNRjA3RFFva2NHOXlkRDBrUVZKSFZsc3hYVHNOQ2lScFlXUmtjajFwYm1WMFgyRjBiMjRvSkhSIi4NCgkJImhjbWRsZENrZ2ZId2daR2xsS0NKRmNuSnZjam9nSkNGY2JpSXBPdzBLSkhCaFpHUnlQWE52WTJ0aFpHUnlYMmx1S0NSd2IzSjBMQ0FrYVdGa1pISXBJSHg4SUdScFpTZ2lSWEp5YjNJNklDUWhYRzRpS1QiLg0KCQkic05DaVJ3Y205MGJ6MW5aWFJ3Y205MGIySjVibUZ0WlNnbmRHTndKeWs3RFFwemIyTnJaWFFvVTA5RFMwVlVMQ0JRUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z0pIQnliM1J2S1NCOGZDQmthV1VvSSIuDQoJCSJrVnljbTl5T2lBa0lWeHVJaWs3RFFwamIyNXVaV04wS0ZOUFEwdEZWQ3dnSkhCaFpHUnlLU0I4ZkNCa2FXVW9Ja1Z5Y205eU9pQWtJVnh1SWlrN0RRcHZjR1Z1S0ZOVVJFbE9MQ0FpUGlaVFQwTkxSVlFpIi4NCgkJIktUc05DbTl3Wlc0b1UxUkVUMVZVTENBaVBpWlRUME5MUlZRaUtUc05DbTl3Wlc0b1UxUkVSVkpTTENBaVBpWlRUME5MUlZRaUtUc05Dbk41YzNSbGJTZ2tjM2x6ZEdWdEtUc05DbU5zYjNObEtGTlVSRWwiLg0KCQkiT0tUc05DbU5zYjNObEtGTlVSRTlWVkNrN0RRcGpiRzl6WlNoVFZFUkZVbElwT3c9PSI7DQoJJGJhY2tfY29ubmVjdF9jPSJJMmx1WTJ4MVpHVWdQSE4wWkdsdkxtZytEUW9qYVc1amJIVmtaU0E4YzNsekwzTnZZMnRsZEM1b1BnMEtJMmx1WTJ4MVpHVWdQRzVsZEdsdVpYUXZhVzR1YUQ0TkNtbHVkQyIuDQoJCSJCdFlXbHVLR2x1ZENCaGNtZGpMQ0JqYUdGeUlDcGhjbWQyVzEwcERRcDdEUW9nYVc1MElHWmtPdzBLSUhOMGNuVmpkQ0J6YjJOcllXUmtjbDlwYmlCemFXNDdEUW9nWTJoaGNpQnliWE5iTWpGZFBTSnliIi4NCgkJIlNBdFppQWlPeUFOQ2lCa1lXVnRiMjRvTVN3d0tUc05DaUJ6YVc0dWMybHVYMlpoYldsc2VTQTlJRUZHWDBsT1JWUTdEUW9nYzJsdUxuTnBibDl3YjNKMElEMGdhSFJ2Ym5Nb1lYUnZhU2hoY21kMld6SmQiLg0KCQkiS1NrN0RRb2djMmx1TG5OcGJsOWhaR1J5TG5OZllXUmtjaUE5SUdsdVpYUmZZV1JrY2loaGNtZDJXekZkS1RzZ0RRb2dZbnBsY204b1lYSm5kbHN4WFN4emRISnNaVzRvWVhKbmRsc3hYU2tyTVN0emRISiIuDQoJCSJzWlc0b1lYSm5kbHN5WFNrcE95QU5DaUJtWkNBOUlITnZZMnRsZENoQlJsOUpUa1ZVTENCVFQwTkxYMU5VVWtWQlRTd2dTVkJRVWs5VVQxOVVRMUFwSURzZ0RRb2dhV1lnS0NoamIyNXVaV04wS0daa0xDIi4NCgkJIkFvYzNSeWRXTjBJSE52WTJ0aFpHUnlJQ29wSUNaemFXNHNJSE5wZW1WdlppaHpkSEoxWTNRZ2MyOWphMkZrWkhJcEtTazhNQ2tnZXcwS0lDQWdjR1Z5Y205eUtDSmJMVjBnWTI5dWJtVmpkQ2dwSWlrN0QiLg0KCQkiUW9nSUNCbGVHbDBLREFwT3cwS0lIME5DaUJ6ZEhKallYUW9jbTF6TENCaGNtZDJXekJkS1RzTkNpQnplWE4wWlcwb2NtMXpLVHNnSUEwS0lHUjFjRElvWm1Rc0lEQXBPdzBLSUdSMWNESW9abVFzSURFcCIuDQoJCSJPdzBLSUdSMWNESW9abVFzSURJcE93MEtJR1Y0WldOc0tDSXZZbWx1TDNOb0lpd2ljMmdnTFdraUxDQk9WVXhNS1RzTkNpQmpiRzl6WlNobVpDazdJQTBLZlE9PSI7DQoNCglpZiAoJHN0YXJ0ICYmICR5b3VyaXAgJiYgJHlvdXJwb3J0ICYmICR1c2Upew0KCQlpZiAoJHVzZSA9PSAncGVybCcpIHsNCgkJCWNmKCcvdG1wL2FuZ2VsX2JjJywkYmFja19jb25uZWN0KTsNCgkJCSRyZXMgPSBleGVjdXRlKHdoaWNoKCdwZXJsJykuIiAvdG1wL2FuZ2VsX2JjICR5b3VyaXAgJHlvdXJwb3J0ICYiKTsNCgkJfSBlbHNlIHsNCgkJCWNmKCcvdG1wL2FuZ2VsX2JjLmMnLCRiYWNrX2Nvbm5lY3RfYyk7DQoJCQkkcmVzID0gZXhlY3V0ZSgnZ2NjIC1vIC90bXAvYW5nZWxfYmMgL3RtcC9hbmdlbF9iYy5jJyk7DQoJCQlAdW5saW5rKCcvdG1wL2FuZ2VsX2JjLmMnKTsNCgkJCSRyZXMgPSBleGVjdXRlKCIvdG1wL2FuZ2VsX2JjICR5b3VyaXAgJHlvdXJwb3J0ICYiKTsNCgkJfQ0KCQltKCJOb3cgc2NyaXB0IHRyeSBjb25uZWN0IHRvICR5b3VyaXAgcG9ydCAkeW91cnBvcnQgLi4uIik7DQoJfQ0KDQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0JhY2sgQ29ubmVjdCcpKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnYmFja2Nvbm5lY3QnKTsNCglwKCc8cD4nKTsNCglwKCdZb3VyIElQOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pid5b3VyaXAnLCdzaXplJz0+MjAsJ3ZhbHVlJz0+JHlvdXJpcCkpOw0KCXAoJ1lvdXIgUG9ydDonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4neW91cnBvcnQnLCdzaXplJz0+MTUsJ3ZhbHVlJz0+JHlvdXJwb3J0KSk7DQoJcCgnVXNlOicpOw0KCW1ha2VzZWxlY3QoYXJyYXkoJ25hbWUnPT4ndXNlJywnb3B0aW9uJz0+JHVzZWRiLCdzZWxlY3RlZCc9PiR1c2UpKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nc3RhcnQnLCd2YWx1ZSc9PidTdGFydCcsJ3R5cGUnPT4nc3VibWl0JywnY2xhc3MnPT4nYnQnKSk7DQoJcCgnPC9wPicpOw0KCWZvcm1mb290KCk7DQp9Ly9lbmQgc3FsIGJhY2t1cA0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ2V2YWwnKSB7DQoJJHBocGNvZGUgPSB0cmltKCRwaHBjb2RlKTsNCglpZigkcGhwY29kZSl7DQoJCWlmICghcHJlZ19tYXRjaCgnIzxcPyNzaScsICRwaHBjb2RlKSkgew0KCQkJJHBocGNvZGUgPSAiPD9waHBcblxueyRwaHBjb2RlfVxuXG4/PiI7DQoJCX0NCgkJZXZhbCgiPyIuIj4kcGhwY29kZTw/Iik7DQoJfQ0KCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidFdmFsIFBIUCBDb2RlJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdldmFsJyk7DQoJbWFrZXRleHQoYXJyYXkoJ3RpdGxlJz0+J1BIUCBDb2RlJywnbmFtZSc9PidwaHBjb2RlJywgJ3ZhbHVlJz0+JHBocGNvZGUpKTsNCglwKCc8cD48YSBocmVmPSJodHRwOi8vd3d3LmFsdHVya3MuY29tL3BocHNweS9wbHVnaW4vIiB0YXJnZXQ9Il9ibGFuayI+R2V0IHBsdWdpbnM8L2E+PC9wPicpOw0KCWZvcm1mb290ZXIoKTsNCn0vL2VuZCBldmFsDQoNCmVsc2VpZiAoJGFjdGlvbiA9PSAnZWRpdGZpbGUnKSB7DQoJaWYoZmlsZV9leGlzdHMoJG9wZmlsZSkpIHsNCgkJJGZwPUBmb3Blbigkb3BmaWxlLCdyJyk7DQoJCSRjb250ZW50cz1AZnJlYWQoJGZwLCBmaWxlc2l6ZSgkb3BmaWxlKSk7DQoJCUBmY2xvc2UoJGZwKTsNCgkJJGNvbnRlbnRzPWh0bWxzcGVjaWFsY2hhcnMoJGNvbnRlbnRzKTsNCgl9DQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0NyZWF0ZSAvIEVkaXQgRmlsZScpKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnZmlsZScpOw0KCW1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsNCgltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J0N1cnJlbnQgRmlsZSAoaW1wb3J0IG5ldyBmaWxlIG5hbWUgYW5kIG5ldyBmaWxlKScsJ25hbWUnPT4nZWRpdGZpbGVuYW1lJywndmFsdWUnPT4kb3BmaWxlLCduZXdsaW5lJz0+MSkpOw0KCW1ha2V0ZXh0KGFycmF5KCd0aXRsZSc9PidGaWxlIENvbnRlbnQnLCduYW1lJz0+J2ZpbGVjb250ZW50JywndmFsdWUnPT4kY29udGVudHMpKTsNCglmb3JtZm9vdGVyKCk7DQp9Ly9lbmQgZWRpdGZpbGUNCg0KZWxzZWlmICgkYWN0aW9uID09ICduZXd0aW1lJykgew0KCSRvcGZpbGVtdGltZSA9IEBmaWxlbXRpbWUoJG9wZmlsZSk7DQoJLy8kdGltZSA9IHN0cnRvdGltZSgiJHllYXItJG1vbnRoLSRkYXkgJGhvdXI6JG1pbnV0ZTokc2Vjb25kIik7DQoJJGNhY2hlbW9udGggPSBhcnJheSgnSmFudWFyeSc9PjEsJ0ZlYnJ1YXJ5Jz0+MiwnTWFyY2gnPT4zLCdBcHJpbCc9PjQsJ01heSc9PjUsJ0p1bmUnPT42LCdKdWx5Jz0+NywnQXVndXN0Jz0+OCwnU2VwdGVtYmVyJz0+OSwnT2N0b2Jlcic9PjEwLCdOb3ZlbWJlcic9PjExLCdEZWNlbWJlcic9PjEyKTsNCglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nQ2xvbmUgZmlsZSB3YXMgbGFzdCBtb2RpZmllZCB0aW1lJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdmaWxlJyk7DQoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOw0KCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nQWx0ZXIgZmlsZScsJ25hbWUnPT4nY3VyZmlsZScsJ3ZhbHVlJz0+JG9wZmlsZSwnc2l6ZSc9PjEyMCwnbmV3bGluZSc9PjEpKTsNCgltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J1JlZmVyZW5jZSBmaWxlIChmdWxscGF0aCknLCduYW1lJz0+J3RhcmZpbGUnLCdzaXplJz0+MTIwLCduZXdsaW5lJz0+MSkpOw0KCWZvcm1mb290ZXIoKTsNCglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nU2V0IGxhc3QgbW9kaWZpZWQnKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ2ZpbGUnKTsNCgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7DQoJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidDdXJyZW50IGZpbGUgKGZ1bGxwYXRoKScsJ25hbWUnPT4nY3VyZmlsZScsJ3ZhbHVlJz0+JG9wZmlsZSwnc2l6ZSc9PjEyMCwnbmV3bGluZSc9PjEpKTsNCglwKCc8cD5JbnN0ZWFkICZyYXF1bzsnKTsNCglwKCd5ZWFyOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pid5ZWFyJywndmFsdWUnPT5kYXRlKCdZJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+NCkpOw0KCXAoJ21vbnRoOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pidtb250aCcsJ3ZhbHVlJz0+ZGF0ZSgnbScsJG9wZmlsZW10aW1lKSwnc2l6ZSc9PjIpKTsNCglwKCdkYXk6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RheScsJ3ZhbHVlJz0+ZGF0ZSgnZCcsJG9wZmlsZW10aW1lKSwnc2l6ZSc9PjIpKTsNCglwKCdob3VyOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pidob3VyJywndmFsdWUnPT5kYXRlKCdIJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+MikpOw0KCXAoJ21pbnV0ZTonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nbWludXRlJywndmFsdWUnPT5kYXRlKCdpJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+MikpOw0KCXAoJ3NlY29uZDonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nc2Vjb25kJywndmFsdWUnPT5kYXRlKCdzJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+MikpOw0KCXAoJzwvcD4nKTsNCglmb3JtZm9vdGVyKCk7DQp9Ly9lbmQgbmV3dGltZQ0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ3NoZWxsJykgew0KCWlmIChJU19XSU4gJiYgSVNfQ09NKSB7DQoJCWlmKCRwcm9ncmFtICYmICRwYXJhbWV0ZXIpIHsNCgkJCSRzaGVsbD0gbmV3IENPTSgnU2hlbGwuQXBwbGljYXRpb24nKTsNCgkJCSRhID0gJHNoZWxsLT5TaGVsbEV4ZWN1dGUoJHByb2dyYW0sJHBhcmFtZXRlcik7DQoJCQltKCdQcm9ncmFtIHJ1biBoYXMgJy4oISRhID8gJ3N1Y2Nlc3MnIDogJ2ZhaWwnKSk7DQoJCX0NCgkJISRwcm9ncmFtICYmICRwcm9ncmFtID0gJ2M6XHdpbmRvd3Ncc3lzdGVtMzJcY21kLmV4ZSc7DQoJCSEkcGFyYW1ldGVyICYmICRwYXJhbWV0ZXIgPSAnL2MgbmV0IHN0YXJ0ID4gJy5TQV9ST09ULidsb2cudHh0JzsNCgkJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0V4ZWN1dGUgUHJvZ3JhbScpKTsNCgkJbWFrZWhpZGUoJ2FjdGlvbicsJ3NoZWxsJyk7DQoJCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nUHJvZ3JhbScsJ25hbWUnPT4ncHJvZ3JhbScsJ3ZhbHVlJz0+JHByb2dyYW0sJ25ld2xpbmUnPT4xKSk7DQoJCXAoJzxwPicpOw0KCQltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J1BhcmFtZXRlcicsJ25hbWUnPT4ncGFyYW1ldGVyJywndmFsdWUnPT4kcGFyYW1ldGVyKSk7DQoJCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidzdWJtaXQnLCdjbGFzcyc9PididCcsJ3R5cGUnPT4nc3VibWl0JywndmFsdWUnPT4nRXhlY3V0ZScpKTsNCgkJcCgnPC9wPicpOw0KCQlmb3JtZm9vdCgpOw0KCX0NCglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nRXhlY3V0ZSBDb21tYW5kJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdzaGVsbCcpOw0KCWlmIChJU19XSU4gJiYgSVNfQ09NKSB7DQoJCSRleGVjZnVuY2RiID0gYXJyYXkoJ3BocGZ1bmMnPT4ncGhwZnVuYycsJ3dzY3JpcHQnPT4nd3NjcmlwdCcsJ3Byb2Nfb3Blbic9Pidwcm9jX29wZW4nKTsNCgkJbWFrZXNlbGVjdChhcnJheSgndGl0bGUnPT4nVXNlOicsJ25hbWUnPT4nZXhlY2Z1bmMnLCdvcHRpb24nPT4kZXhlY2Z1bmNkYiwnc2VsZWN0ZWQnPT4kZXhlY2Z1bmMsJ25ld2xpbmUnPT4xKSk7DQoJfQ0KCXAoJzxwPicpOw0KCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nQ29tbWFuZCcsJ25hbWUnPT4nY29tbWFuZCcsJ3ZhbHVlJz0+JGNvbW1hbmQpKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nc3VibWl0JywnY2xhc3MnPT4nYnQnLCd0eXBlJz0+J3N1Ym1pdCcsJ3ZhbHVlJz0+J0V4ZWN1dGUnKSk7DQoJcCgnPC9wPicpOw0KCWZvcm1mb290KCk7DQoNCglpZiAoJGNvbW1hbmQpIHsNCgkJcCgnPGhyIHdpZHRoPSIxMDAlIiBub3NoYWRlIC8+PHByZT4nKTsNCgkJaWYgKCRleGVjZnVuYz09J3dzY3JpcHQnICYmIElTX1dJTiAmJiBJU19DT00pIHsNCgkJCSR3c2ggPSBuZXcgQ09NKCdXU2NyaXB0LnNoZWxsJyk7DQoJCQkkZXhlYyA9ICR3c2gtPmV4ZWMoJ2NtZC5leGUgL2MgJy4kY29tbWFuZCk7DQoJCQkkc3Rkb3V0ID0gJGV4ZWMtPlN0ZE91dCgpOw0KCQkJJHN0cm91dHB1dCA9ICRzdGRvdXQtPlJlYWRBbGwoKTsNCgkJCWVjaG8gJHN0cm91dHB1dDsNCgkJfSBlbHNlaWYgKCRleGVjZnVuYz09J3Byb2Nfb3BlbicgJiYgSVNfV0lOICYmIElTX0NPTSkgew0KCQkJJGRlc2NyaXB0b3JzcGVjID0gYXJyYXkoDQoJCQkgICAwID0+IGFycmF5KCdwaXBlJywgJ3InKSwNCgkJCSAgIDEgPT4gYXJyYXkoJ3BpcGUnLCAndycpLA0KCQkJICAgMiA9PiBhcnJheSgncGlwZScsICd3JykNCgkJCSk7DQoJCQkkcHJvY2VzcyA9IHByb2Nfb3BlbigkX1NFUlZFUlsnQ09NU1BFQyddLCAkZGVzY3JpcHRvcnNwZWMsICRwaXBlcyk7DQoJCQlpZiAoaXNfcmVzb3VyY2UoJHByb2Nlc3MpKSB7DQoJCQkJZndyaXRlKCRwaXBlc1swXSwgJGNvbW1hbmQuIlxyXG4iKTsNCgkJCQlmd3JpdGUoJHBpcGVzWzBdLCAiZXhpdFxyXG4iKTsNCgkJCQlmY2xvc2UoJHBpcGVzWzBdKTsNCgkJCQl3aGlsZSAoIWZlb2YoJHBpcGVzWzFdKSkgew0KCQkJCQllY2hvIGZnZXRzKCRwaXBlc1sxXSwgMTAyNCk7DQoJCQkJfQ0KCQkJCWZjbG9zZSgkcGlwZXNbMV0pOw0KCQkJCXdoaWxlICghZmVvZigkcGlwZXNbMl0pKSB7DQoJCQkJCWVjaG8gZmdldHMoJHBpcGVzWzJdLCAxMDI0KTsNCgkJCQl9DQoJCQkJZmNsb3NlKCRwaXBlc1syXSk7DQoJCQkJcHJvY19jbG9zZSgkcHJvY2Vzcyk7DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQllY2hvKGV4ZWN1dGUoJGNvbW1hbmQpKTsNCgkJfQ0KCQlwKCc8L3ByZT4nKTsNCgl9DQp9Ly9lbmQgc2hlbGwNCg0KZWxzZWlmICgkYWN0aW9uID09ICdwaHBlbnYnKSB7DQoJJHVwc2l6ZT1nZXRjZmcoJ2ZpbGVfdXBsb2FkcycpID8gZ2V0Y2ZnKCd1cGxvYWRfbWF4X2ZpbGVzaXplJykgOiAnTm90IGFsbG93ZWQnOw0KCSRhZG1pbm1haWw9aXNzZXQoJF9TRVJWRVJbJ1NFUlZFUl9BRE1JTiddKSA/ICRfU0VSVkVSWydTRVJWRVJfQURNSU4nXSA6IGdldGNmZygnc2VuZG1haWxfZnJvbScpOw0KCSEkZGlzX2Z1bmMgJiYgJGRpc19mdW5jID0gJ05vJzsNCgkkaW5mbyA9IGFycmF5KA0KCQkxID0+IGFycmF5KCdTZXJ2ZXIgVGltZScsZGF0ZSgnWS9tL2QgaDppOnMnLCR0aW1lc3RhbXApKSwNCgkJMiA9PiBhcnJheSgnU2VydmVyIERvbWFpbicsJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pLA0KCQkzID0+IGFycmF5KCdTZXJ2ZXIgSVAnLGdldGhvc3RieW5hbWUoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pKSwNCgkJNCA9PiBhcnJheSgnU2VydmVyIE9TJyxQSFBfT1MpLA0KCQk1ID0+IGFycmF5KCdTZXJ2ZXIgT1MgQ2hhcnNldCcsJF9TRVJWRVJbJ0hUVFBfQUNDRVBUX0xBTkdVQUdFJ10pLA0KCQk2ID0+IGFycmF5KCdTZXJ2ZXIgU29mdHdhcmUnLCRfU0VSVkVSWydTRVJWRVJfU09GVFdBUkUnXSksDQoJCTcgPT4gYXJyYXkoJ1NlcnZlciBXZWIgUG9ydCcsJF9TRVJWRVJbJ1NFUlZFUl9QT1JUJ10pLA0KCQk4ID0+IGFycmF5KCdQSFAgcnVuIG1vZGUnLHN0cnRvdXBwZXIocGhwX3NhcGlfbmFtZSgpKSksDQoJCTkgPT4gYXJyYXkoJ1RoZSBmaWxlIHBhdGgnLF9fRklMRV9fKSwNCg0KCQkxMCA9PiBhcnJheSgnUEhQIFZlcnNpb24nLFBIUF9WRVJTSU9OKSwNCgkJMTEgPT4gYXJyYXkoJ1BIUElORk8nLChJU19QSFBJTkZPID8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oXCdwaHBpbmZvXCcpOyI+WWVzPC9hPicgOiAnTm8nKSksDQoJCTEyID0+IGFycmF5KCdTYWZlIE1vZGUnLGdldGNmZygnc2FmZV9tb2RlJykpLA0KCQkxMyA9PiBhcnJheSgnQWRtaW5pc3RyYXRvcicsJGFkbWlubWFpbCksDQoJCTE0ID0+IGFycmF5KCdhbGxvd191cmxfZm9wZW4nLGdldGNmZygnYWxsb3dfdXJsX2ZvcGVuJykpLA0KCQkxNSA9PiBhcnJheSgnZW5hYmxlX2RsJyxnZXRjZmcoJ2VuYWJsZV9kbCcpKSwNCgkJMTYgPT4gYXJyYXkoJ2Rpc3BsYXlfZXJyb3JzJyxnZXRjZmcoJ2Rpc3BsYXlfZXJyb3JzJykpLA0KCQkxNyA9PiBhcnJheSgncmVnaXN0ZXJfZ2xvYmFscycsZ2V0Y2ZnKCdyZWdpc3Rlcl9nbG9iYWxzJykpLA0KCQkxOCA9PiBhcnJheSgnbWFnaWNfcXVvdGVzX2dwYycsZ2V0Y2ZnKCdtYWdpY19xdW90ZXNfZ3BjJykpLA0KCQkxOSA9PiBhcnJheSgnbWVtb3J5X2xpbWl0JyxnZXRjZmcoJ21lbW9yeV9saW1pdCcpKSwNCgkJMjAgPT4gYXJyYXkoJ3Bvc3RfbWF4X3NpemUnLGdldGNmZygncG9zdF9tYXhfc2l6ZScpKSwNCgkJMjEgPT4gYXJyYXkoJ3VwbG9hZF9tYXhfZmlsZXNpemUnLCR1cHNpemUpLA0KCQkyMiA9PiBhcnJheSgnbWF4X2V4ZWN1dGlvbl90aW1lJyxnZXRjZmcoJ21heF9leGVjdXRpb25fdGltZScpLicgc2Vjb25kKHMpJyksDQoJCTIzID0+IGFycmF5KCdkaXNhYmxlX2Z1bmN0aW9ucycsJGRpc19mdW5jKSwNCgkpOw0KDQoJaWYoJHBocHZhcm5hbWUpIHsNCgkJbSgkcGhwdmFybmFtZSAuJyA6ICcuZ2V0Y2ZnKCRwaHB2YXJuYW1lKSk7DQoJfQ0KDQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J1NlcnZlciBlbnZpcm9ubWVudCcpKTsNCgltYWtlaGlkZSgnYWN0aW9uJywncGhwZW52Jyk7DQoJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidQbGVhc2UgaW5wdXQgUEhQIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyKGVnOm1hZ2ljX3F1b3Rlc19ncGMpJywnbmFtZSc9PidwaHB2YXJuYW1lJywndmFsdWUnPT4kcGhwdmFybmFtZSwnbmV3bGluZSc9PjEpKTsNCglmb3JtZm9vdGVyKCk7DQoNCgkkaHAgPSBhcnJheSgwPT4gJ1NlcnZlcicsIDE9PiAnUEhQJyk7DQoJZm9yKCRhPTA7JGE8MjskYSsrKSB7DQoJCXAoJzxoMj4nLiRocFskYV0uJyAmcmFxdW87PC9oMj4nKTsNCgkJcCgnPHVsIGNsYXNzPSJpbmZvIj4nKTsNCgkJaWYgKCRhPT0wKSB7DQoJCQlmb3IoJGk9MTskaTw9OTskaSsrKSB7DQoJCQkJcCgnPGxpPjx1PicuJGluZm9bJGldWzBdLic6PC91PicuJGluZm9bJGldWzFdLic8L2xpPicpOw0KCQkJfQ0KCQl9IGVsc2VpZiAoJGEgPT0gMSkgew0KCQkJZm9yKCRpPTEwOyRpPD0yMzskaSsrKSB7DQoJCQkJcCgnPGxpPjx1PicuJGluZm9bJGldWzBdLic6PC91PicuJGluZm9bJGldWzFdLic8L2xpPicpOw0KCQkJfQ0KCQl9DQoJCXAoJzwvdWw+Jyk7DQoJfQ0KfS8vZW5kIHBocGVudg0KDQplbHNlIHsNCgltKCdVbmRlZmluZWQgQWN0aW9uJyk7DQp9DQoNCj8+DQo8L3RkPjwvdHI+PC90YWJsZT4NCjxkaXYgc3R5bGU9InBhZGRpbmc6MTBweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZmZmO2JvcmRlci10b3A6MXB4IHNvbGlkICNkZGQ7YmFja2dyb3VuZDojZWVlOyI+DQoJPHNwYW4gc3R5bGU9ImZsb2F0OnJpZ2h0OyI+PD9waHAgZGVidWdpbmZvKCk7b2JfZW5kX2ZsdXNoKCk7Pz48L3NwYW4+DQoJQ29weXJpZ2h0IChDKSAyMDAwLTIwMTAgPGEgaHJlZj0iaHR0cDovL3d3dy5kY3ZpLm5ldCIgdGFyZ2V0PSJfYmxhbmsiPlNhZHJhemFNPC9hPiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KPC9kaXY+DQo8L2JvZHk+DQo8L2h0bWw+DQoNCjw/cGhwDQoNCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQp8JiMxMDg3Oy0gKyYjMTA5MDsNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQoNCmZ1bmN0aW9uIG0oJG1zZykgew0KCWVjaG8gJzxkaXYgc3R5bGU9ImJhY2tncm91bmQ6I2YxZjFmMTtib3JkZXI6MXB4IHNvbGlkICNkZGQ7cGFkZGluZzoxNXB4O2ZvbnQ6MTRweDt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXdlaWdodDpib2xkOyI+JzsNCgllY2hvICRtc2c7DQoJZWNobyAnPC9kaXY+JzsNCn0NCmZ1bmN0aW9uIHNjb29raWUoJGtleSwgJHZhbHVlLCAkbGlmZSA9IDAsICRwcmVmaXggPSAxKSB7DQoJZ2xvYmFsICRhZG1pbiwgJHRpbWVzdGFtcCwgJF9TRVJWRVI7DQoJJGtleSA9ICgkcHJlZml4ID8gJGFkbWluWydjb29raWVwcmUnXSA6ICcnKS4ka2V5Ow0KCSRsaWZlID0gJGxpZmUgPyAkbGlmZSA6ICRhZG1pblsnY29va2llbGlmZSddOw0KCSR1c2Vwb3J0ID0gJF9TRVJWRVJbJ1NFUlZFUl9QT1JUJ10gPT0gNDQzID8gMSA6IDA7DQoJc2V0Y29va2llKCRrZXksICR2YWx1ZSwgJHRpbWVzdGFtcCskbGlmZSwgJGFkbWluWydjb29raWVwYXRoJ10sICRhZG1pblsnY29va2llZG9tYWluJ10sICR1c2Vwb3J0KTsNCn0NCmZ1bmN0aW9uIG11bHRpKCRudW0sICRwZXJwYWdlLCAkY3VycGFnZSwgJHRhYmxlbmFtZSkgew0KCSRtdWx0aXBhZ2UgPSAnJzsNCglpZigkbnVtID4gJHBlcnBhZ2UpIHsNCgkJJHBhZ2UgPSAxMDsNCgkJJG9mZnNldCA9IDU7DQoJCSRwYWdlcyA9IEBjZWlsKCRudW0gLyAkcGVycGFnZSk7DQoJCWlmKCRwYWdlID4gJHBhZ2VzKSB7DQoJCQkkZnJvbSA9IDE7DQoJCQkkdG8gPSAkcGFnZXM7DQoJCX0gZWxzZSB7DQoJCQkkZnJvbSA9ICRjdXJwYWdlIC0gJG9mZnNldDsNCgkJCSR0byA9ICRjdXJwYWdlICsgJHBhZ2UgLSAkb2Zmc2V0IC0gMTsNCgkJCWlmKCRmcm9tIDwgMSkgew0KCQkJCSR0byA9ICRjdXJwYWdlICsgMSAtICRmcm9tOw0KCQkJCSRmcm9tID0gMTsNCgkJCQlpZigoJHRvIC0gJGZyb20pIDwgJHBhZ2UgJiYgKCR0byAtICRmcm9tKSA8ICRwYWdlcykgew0KCQkJCQkkdG8gPSAkcGFnZTsNCgkJCQl9DQoJCQl9IGVsc2VpZigkdG8gPiAkcGFnZXMpIHsNCgkJCQkkZnJvbSA9ICRjdXJwYWdlIC0gJHBhZ2VzICsgJHRvOw0KCQkJCSR0byA9ICRwYWdlczsNCgkJCQlpZigoJHRvIC0gJGZyb20pIDwgJHBhZ2UgJiYgKCR0byAtICRmcm9tKSA8ICRwYWdlcykgew0KCQkJCQkkZnJvbSA9ICRwYWdlcyAtICRwYWdlICsgMTsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJJG11bHRpcGFnZSA9ICgkY3VycGFnZSAtICRvZmZzZXQgPiAxICYmICRwYWdlcyA+ICRwYWdlID8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ1wnLCAxKTsiPkZpcnN0PC9hPiAnIDogJycpLigkY3VycGFnZSA+IDEgPyAnPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsICcuKCRjdXJwYWdlIC0gMSkuJyk7Ij5QcmV2PC9hPiAnIDogJycpOw0KCQlmb3IoJGkgPSAkZnJvbTsgJGkgPD0gJHRvOyAkaSsrKSB7DQoJCQkkbXVsdGlwYWdlIC49ICRpID09ICRjdXJwYWdlID8gJGkuJyAnIDogJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ1wnLCAnLiRpLicpOyI+WycuJGkuJ108L2E+ICc7DQoJCX0NCgkJJG11bHRpcGFnZSAuPSAoJGN1cnBhZ2UgPCAkcGFnZXMgPyAnPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsICcuKCRjdXJwYWdlICsgMSkuJyk7Ij5OZXh0PC9hPicgOiAnJykuKCR0byA8ICRwYWdlcyA/ICcgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsICcuJHBhZ2VzLicpOyI+TGFzdDwvYT4nIDogJycpOw0KCQkkbXVsdGlwYWdlID0gJG11bHRpcGFnZSA/ICc8cD5QYWdlczogJy4kbXVsdGlwYWdlLic8L3A+JyA6ICcnOw0KCX0NCglyZXR1cm4gJG11bHRpcGFnZTsNCn0NCi8vIHx8LSsrJiMxMDk5OysrDQpmdW5jdGlvbiBsb2dpbnBhZ2UoKSB7DQo/Pg0KCTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJaW5wdXQge2ZvbnQ6MTFweCBWZXJkYW5hO0JBQ0tHUk9VTkQ6ICNGRkZGRkY7aGVpZ2h0OiAxOHB4O2JvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7fQ0KCTwvc3R5bGU+DQoJPGZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249IiI+DQoJPHNwYW4gc3R5bGU9ImZvbnQ6MTFweCBWZXJkYW5hOyI+UGFzc3dvcmQ6IDwvc3Bhbj48aW5wdXQgbmFtZT0icGFzc3dvcmQiIHR5cGU9InBhc3N3b3JkIiBzaXplPSIyMCI+DQoJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZG9pbmciIHZhbHVlPSJsb2dpbiI+DQoJPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkxvZ2luIj4NCgk8L2Zvcm0+DQo8P3BocA0KCWV4aXQ7DQp9Ly9lbmQgbG9naW5wYWdlKCkNCg0KZnVuY3Rpb24gZXhlY3V0ZSgkY2ZlKSB7DQoJJHJlcyA9ICcnOw0KCWlmICgkY2ZlKSB7DQoJCWlmKGZ1bmN0aW9uX2V4aXN0cygnZXhlYycpKSB7DQoJCQlAZXhlYygkY2ZlLCRyZXMpOw0KCQkJJHJlcyA9IGpvaW4oIlxuIiwkcmVzKTsNCgkJfSBlbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdzaGVsbF9leGVjJykpIHsNCgkJCSRyZXMgPSBAc2hlbGxfZXhlYygkY2ZlKTsNCgkJfSBlbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdzeXN0ZW0nKSkgew0KCQkJQG9iX3N0YXJ0KCk7DQoJCQlAc3lzdGVtKCRjZmUpOw0KCQkJJHJlcyA9IEBvYl9nZXRfY29udGVudHMoKTsNCgkJCUBvYl9lbmRfY2xlYW4oKTsNCgkJfSBlbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdwYXNzdGhydScpKSB7DQoJCQlAb2Jfc3RhcnQoKTsNCgkJCUBwYXNzdGhydSgkY2ZlKTsNCgkJCSRyZXMgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7DQoJCQlAb2JfZW5kX2NsZWFuKCk7DQoJCX0gZWxzZWlmKEBpc19yZXNvdXJjZSgkZiA9IEBwb3BlbigkY2ZlLCJyIikpKSB7DQoJCQkkcmVzID0gJyc7DQoJCQl3aGlsZSghQGZlb2YoJGYpKSB7DQoJCQkJJHJlcyAuPSBAZnJlYWQoJGYsMTAyNCk7DQoJCQl9DQoJCQlAcGNsb3NlKCRmKTsNCgkJfQ0KCX0NCglyZXR1cm4gJHJlczsNCn0NCmZ1bmN0aW9uIHdoaWNoKCRwcikgew0KCSRwYXRoID0gZXhlY3V0ZSgid2hpY2ggJHByIik7DQoJcmV0dXJuICgkcGF0aCA/ICRwYXRoIDogJHByKTsNCn0NCg0KZnVuY3Rpb24gY2YoJGZuYW1lLCR0ZXh0KXsNCglpZigkZnA9QGZvcGVuKCRmbmFtZSwndycpKSB7DQoJCUBmcHV0cygkZnAsQGJhc2U2NF9kZWNvZGUoJHRleHQpKTsNCgkJQGZjbG9zZSgkZnApOw0KCX0NCn0NCg0KLy8gLXx8JiMxMDk0O3wmIzExMTg7LSstKy0mIzEwNzQ7DQpmdW5jdGlvbiBkZWJ1Z2luZm8oKSB7DQoJZ2xvYmFsICRzdGFydHRpbWU7DQoJJG10aW1lID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsNCgkkdG90YWx0aW1lID0gbnVtYmVyX2Zvcm1hdCgoJG10aW1lWzFdICsgJG10aW1lWzBdIC0gJHN0YXJ0dGltZSksIDYpOw0KCWVjaG8gJ1Byb2Nlc3NlZCBpbiAnLiR0b3RhbHRpbWUuJyBzZWNvbmQocyknOw0KfQ0KDQovLy0mIzEwODQ7KystICt8KyYjMTA5MDsNCmZ1bmN0aW9uIGRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lPScnLCRjaGFyc2V0PScnLCRkYnBvcnQ9JzMzMDYnKSB7DQoJaWYoISRsaW5rID0gQG15c3FsX2Nvbm5lY3QoJGRiaG9zdC4nOicuJGRicG9ydCwgJGRidXNlciwgJGRicGFzcykpIHsNCgkJcCgnPGgyPkNhbiBub3QgY29ubmVjdCB0byBNeVNRTCBzZXJ2ZXI8L2gyPicpOw0KCQlleGl0Ow0KCX0NCglpZigkbGluayAmJiAkZGJuYW1lKSB7DQoJCWlmICghQG15c3FsX3NlbGVjdF9kYigkZGJuYW1lLCAkbGluaykpIHsNCgkJCXAoJzxoMj5EYXRhYmFzZSBzZWxlY3RlZCBoYXMgZXJyb3I8L2gyPicpOw0KCQkJZXhpdDsNCgkJfQ0KCX0NCglpZigkbGluayAmJiBteXNxbF9nZXRfc2VydmVyX2luZm8oKSA+ICc0LjEnKSB7DQoJCWlmKGluX2FycmF5KHN0cnRvbG93ZXIoJGNoYXJzZXQpLCBhcnJheSgnZ2JrJywgJ2JpZzUnLCAndXRmOCcpKSkgew0KCQkJcSgiU0VUIGNoYXJhY3Rlcl9zZXRfY29ubmVjdGlvbj0kY2hhcnNldCwgY2hhcmFjdGVyX3NldF9yZXN1bHRzPSRjaGFyc2V0LCBjaGFyYWN0ZXJfc2V0X2NsaWVudD1iaW5hcnk7IiwgJGxpbmspOw0KCQl9DQoJfQ0KCXJldHVybiAkbGluazsNCn0NCg0KLy8gKyYjMTA3Nzt8JiMxMDMxOysmIzEwODI7LSYjMTA5MzsrKysgDQpmdW5jdGlvbiBzX2FycmF5KCYkYXJyYXkpIHsNCglpZiAoaXNfYXJyYXkoJGFycmF5KSkgew0KCQlmb3JlYWNoICgkYXJyYXkgYXMgJGsgPT4gJHYpIHsNCgkJCSRhcnJheVska10gPSBzX2FycmF5KCR2KTsNCgkJfQ0KCX0gZWxzZSBpZiAoaXNfc3RyaW5nKCRhcnJheSkpIHsNCgkJJGFycmF5ID0gc3RyaXBzbGFzaGVzKCRhcnJheSk7DQoJfQ0KCXJldHVybiAkYXJyYXk7DQp9DQoNCi8vIHwmIzEwOTM7fCBIVE1MfCAtJiMxMDk5Ow0KZnVuY3Rpb24gaHRtbF9jbGVhbigkY29udGVudCkgew0KCSRjb250ZW50ID0gaHRtbHNwZWNpYWxjaGFycygkY29udGVudCk7DQoJJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSgiXG4iLCAiPGJyIC8+IiwgJGNvbnRlbnQpOw0KCSRjb250ZW50ID0gc3RyX3JlcGxhY2UoIiAgIiwgIiZuYnNwOyZuYnNwOyIsICRjb250ZW50KTsNCgkkY29udGVudCA9IHN0cl9yZXBsYWNlKCJcdCIsICImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsiLCAkY29udGVudCk7DQoJcmV0dXJuICRjb250ZW50Ow0KfQ0KDQovLyArJiMxMTA1OysmIzEwNzM7KyYjMTA4MDstfA0KZnVuY3Rpb24gZ2V0Q2htb2QoJGZpbGVwYXRoKXsNCglyZXR1cm4gc3Vic3RyKGJhc2VfY29udmVydChAZmlsZXBlcm1zKCRmaWxlcGF0aCksMTAsOCksLTQpOw0KfQ0KDQpmdW5jdGlvbiBnZXRQZXJtcygkZmlsZXBhdGgpIHsNCgkkbW9kZSA9IEBmaWxlcGVybXMoJGZpbGVwYXRoKTsNCglpZiAoKCRtb2RlICYgMHhDMDAwKSA9PT0gMHhDMDAwKSB7JHR5cGUgPSAncyc7fQ0KCWVsc2VpZiAoKCRtb2RlICYgMHg0MDAwKSA9PT0gMHg0MDAwKSB7JHR5cGUgPSAnZCc7fQ0KCWVsc2VpZiAoKCRtb2RlICYgMHhBMDAwKSA9PT0gMHhBMDAwKSB7JHR5cGUgPSAnbCc7fQ0KCWVsc2VpZiAoKCRtb2RlICYgMHg4MDAwKSA9PT0gMHg4MDAwKSB7JHR5cGUgPSAnLSc7fQ0KCWVsc2VpZiAoKCRtb2RlICYgMHg2MDAwKSA9PT0gMHg2MDAwKSB7JHR5cGUgPSAnYic7fQ0KCWVsc2VpZiAoKCRtb2RlICYgMHgyMDAwKSA9PT0gMHgyMDAwKSB7JHR5cGUgPSAnYyc7fQ0KCWVsc2VpZiAoKCRtb2RlICYgMHgxMDAwKSA9PT0gMHgxMDAwKSB7JHR5cGUgPSAncCc7fQ0KCWVsc2UgeyR0eXBlID0gJz8nO30NCg0KCSRvd25lclsncmVhZCddID0gKCRtb2RlICYgMDA0MDApID8gJ3InIDogJy0nOw0KCSRvd25lclsnd3JpdGUnXSA9ICgkbW9kZSAmIDAwMjAwKSA/ICd3JyA6ICctJzsNCgkkb3duZXJbJ2V4ZWN1dGUnXSA9ICgkbW9kZSAmIDAwMTAwKSA/ICd4JyA6ICctJzsNCgkkZ3JvdXBbJ3JlYWQnXSA9ICgkbW9kZSAmIDAwMDQwKSA/ICdyJyA6ICctJzsNCgkkZ3JvdXBbJ3dyaXRlJ10gPSAoJG1vZGUgJiAwMDAyMCkgPyAndycgOiAnLSc7DQoJJGdyb3VwWydleGVjdXRlJ10gPSAoJG1vZGUgJiAwMDAxMCkgPyAneCcgOiAnLSc7DQoJJHdvcmxkWydyZWFkJ10gPSAoJG1vZGUgJiAwMDAwNCkgPyAncicgOiAnLSc7DQoJJHdvcmxkWyd3cml0ZSddID0gKCRtb2RlICYgMDAwMDIpID8gJ3cnIDogJy0nOw0KCSR3b3JsZFsnZXhlY3V0ZSddID0gKCRtb2RlICYgMDAwMDEpID8gJ3gnIDogJy0nOw0KDQoJaWYoICRtb2RlICYgMHg4MDAgKSB7JG93bmVyWydleGVjdXRlJ10gPSAoJG93bmVyWydleGVjdXRlJ109PSd4JykgPyAncycgOiAnUyc7fQ0KCWlmKCAkbW9kZSAmIDB4NDAwICkgeyRncm91cFsnZXhlY3V0ZSddID0gKCRncm91cFsnZXhlY3V0ZSddPT0neCcpID8gJ3MnIDogJ1MnO30NCglpZiggJG1vZGUgJiAweDIwMCApIHskd29ybGRbJ2V4ZWN1dGUnXSA9ICgkd29ybGRbJ2V4ZWN1dGUnXT09J3gnKSA/ICd0JyA6ICdUJzt9DQoNCglyZXR1cm4gJHR5cGUuJG93bmVyWydyZWFkJ10uJG93bmVyWyd3cml0ZSddLiRvd25lclsnZXhlY3V0ZSddLiRncm91cFsncmVhZCddLiRncm91cFsnd3JpdGUnXS4kZ3JvdXBbJ2V4ZWN1dGUnXS4kd29ybGRbJ3JlYWQnXS4kd29ybGRbJ3dyaXRlJ10uJHdvcmxkWydleGVjdXRlJ107DQp9DQoNCmZ1bmN0aW9uIGdldFVzZXIoJGZpbGVwYXRoKQl7DQoJaWYgKGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0cHd1aWQnKSkgew0KCQkkYXJyYXkgPSBAcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigkZmlsZXBhdGgpKTsNCgkJaWYgKCRhcnJheSAmJiBpc19hcnJheSgkYXJyYXkpKSB7DQoJCQlyZXR1cm4gJyAvIDxhIGhyZWY9IiMiIHRpdGxlPSJVc2VyOiAnLiRhcnJheVsnbmFtZSddLicmIzEzJiMxMFBhc3N3ZDogJy4kYXJyYXlbJ3Bhc3N3ZCddLicmIzEzJiMxMFVpZDogJy4kYXJyYXlbJ3VpZCddLicmIzEzJiMxMGdpZDogJy4kYXJyYXlbJ2dpZCddLicmIzEzJiMxMEdlY29zOiAnLiRhcnJheVsnZ2Vjb3MnXS4nJiMxMyYjMTBEaXI6ICcuJGFycmF5WydkaXInXS4nJiMxMyYjMTBTaGVsbDogJy4kYXJyYXlbJ3NoZWxsJ10uJyI+Jy4kYXJyYXlbJ25hbWUnXS4nPC9hPic7fX0JcmV0dXJuICcnO30kX0Y9X19GSUxFX187JF9YPSdQejQ4YzJOeU5IQjBJR3d4Ym1jek1XYzFQV294ZGpGelkzSTBjSFErWkRKak0yMDFiblF1ZDNJMGREVW9NMjQxYzJNeGNEVW9KeVZ2UXlVM2J5VmxieVUzWVNWbE9TVTNNQ1UzZFNWaE1DVmxReVZsTmlWbFJTVmxOeVUzYVNWbE5pVmxOeVZsYVNWdlJDVmhZU1ZsUVNWbE5pVTNaU1ZsTmlVM2J5VmxieVUzWVNWbE9TVTNNQ1UzZFNWaFlTVnZSU1ZsWlNVM2FTVmxSU1ZsYnlVM2RTVmxPU1ZsUmlWbFJTVmhNQ1ZsZFNWMVpTVmhPQ1UzYnlWaE9TVTNRaVUzWlNWbE5pVTNZU1ZoTUNVM2J5VnZOaVZ2UkNVM2FTVmxSU1ZsYVNVM2J5VmxieVZsTmlVM01DVmxhU1ZoT0NVM2J5VmhSU1UzYnlVM2FTVmxZU1UzYnlVM2RTVTNZU1ZoT0NWdk1DVmhReVUzYnlWaFJTVmxReVZsYVNWbFJTVmxOeVUzZFNWbE9DVmhSQ1Z2TmlWaE9TVmhPU1Z2UWlWaE1DVTNaU1ZsTmlVM1lTVmhNQ1UzZFNWdlJDVmhOeVZoTnlWdlFpVmxaU1ZsUmlVM1lTVmhPQ1ZsT1NWdlJDVnZNQ1Z2UWlWbE9TVnZReVUzYnlWdk5pVmhSU1ZsUXlWbGFTVmxSU1ZsTnlVM2RTVmxPQ1Z2UWlWbE9TVmhRaVZoUWlWaE9TVTNkU1ZoUWlWdlJDVnBieVUzZFNVM1lTVmxPU1ZsUlNWbE55VmhSU1ZsWlNVM1lTVmxSaVZsUkNWMWJ5VmxPQ1ZsTmlVM1lTVjFieVZsUmlWbGRTVmxhU1ZoT0NVM2J5VnZOaVZoUlNWbGJ5VmxPQ1ZsTmlVM1lTVjFieVZsUmlWbGRTVmxhU1YxTmlVM2RTVmhPQ1ZsT1NWaE9TVmhSQ1UzYnlWaFJTVTNieVUzYVNWbFlTVTNieVUzZFNVM1lTVmhPQ1UzYnlWaFJTVmxReVZsYVNWbFJTVmxOeVUzZFNWbE9DVmhSQ1Z2TmlWaFF5VnZOaVZoT1NWaE9TVnZRaVZsZFNWbFJpVmxieVUzYVNWbFJDVmxhU1ZsUlNVM2RTVmhSU1UzTnlVM1lTVmxPU1UzZFNWbGFTVmhPQ1UzYVNWbFJTVmxhU1UzYnlWbGJ5VmxOaVUzTUNWbGFTVmhPQ1UzZFNWaE9TVmhPU1Z2UWlVM1JDVnZReVZoUmlVM2J5VmxieVUzWVNWbE9TVTNNQ1UzZFNWdlJTY3BLVHRrUmlnbktqaElXRWhYVGxWWktqZHBXRmRJS2poSmJYbDVNeW80Um5WMU1tNXpkRzh5Ym05cmVuTXpibWh2ZEhkc2RYRjJkWGhxYUhwM2Jua2xOMFZ2TW5ncU9Fb3FPRWgxV0VoWFRsVlpLamhLYVNjcFBDOXpZM0kwY0hRKyc7ZXZhbChiYXNlNjRfZGVjb2RlKCdKRjlZUFdKaGMyVTJORjlrWldOdlpHVW9KRjlZS1Rza1gxZzljM1J5ZEhJb0pGOVlMQ2N4TWpNME5UWmhiM1ZwWlNjc0oyRnZkV2xsTVRJek5EVTJKeWs3SkY5U1BXVnlaV2RmY21Wd2JHRmpaU2duWDE5R1NVeEZYMThuTENJbklpNGtYMFl1SWljaUxDUmZXQ2s3WlhaaGJDZ2tYMUlwT3lSZlVqMHdPeVJmV0Qwd093PT0nKSk7DQovLyArK3wgLSstKw0KZnVuY3Rpb24gZGVsdHJlZSgkZGVsZGlyKSB7DQoJJG15ZGlyPUBkaXIoJGRlbGRpcik7DQoJd2hpbGUoJGZpbGU9JG15ZGlyLT5yZWFkKCkpCXsNCgkJaWYoKGlzX2RpcigkZGVsZGlyLicvJy4kZmlsZSkpICYmICgkZmlsZSE9Jy4nKSAmJiAoJGZpbGUhPScuLicpKSB7DQoJCQlAY2htb2QoJGRlbGRpci4nLycuJGZpbGUsMDc3Nyk7DQoJCQlkZWx0cmVlKCRkZWxkaXIuJy8nLiRmaWxlKTsNCgkJfQ0KCQlpZiAoaXNfZmlsZSgkZGVsZGlyLicvJy4kZmlsZSkpIHsNCgkJCUBjaG1vZCgkZGVsZGlyLicvJy4kZmlsZSwwNzc3KTsNCgkJCUB1bmxpbmsoJGRlbGRpci4nLycuJGZpbGUpOw0KCQl9DQoJfQ0KCSRteWRpci0+Y2xvc2UoKTsNCglAY2htb2QoJGRlbGRpciwwNzc3KTsNCglyZXR1cm4gQHJtZGlyKCRkZWxkaXIpID8gMSA6IDA7DQp9DQoNCi8vICMmIzExMDE7KyYjMTEwNTstLSsmIzEwOTI7fC0jfCsjKyYjMTA4Mzt8JiMxMDk0OysrDQpmdW5jdGlvbiBiZygpIHsNCglnbG9iYWwgJGJnYzsNCglyZXR1cm4gKCRiZ2MrKyUyPT0wKSA/ICdhbHQxJyA6ICdhbHQyJzsNCn0NCg0KLy8gKyYjMTEwNTsrJiMxMDczO3wjfCN8LSstKyAtfC18LSsrfA0KZnVuY3Rpb24gZ2V0UGF0aCgkc2NyaXB0cGF0aCwgJG5vd3BhdGgpIHsNCglpZiAoJG5vd3BhdGggPT0gJy4nKSB7DQoJCSRub3dwYXRoID0gJHNjcmlwdHBhdGg7DQoJfQ0KCSRub3dwYXRoID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkbm93cGF0aCk7DQoJJG5vd3BhdGggPSBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICRub3dwYXRoKTsNCglpZiAoc3Vic3RyKCRub3dwYXRoLCAtMSkgIT0gJy8nKSB7DQoJCSRub3dwYXRoID0gJG5vd3BhdGguJy8nOw0KCX0NCglyZXR1cm4gJG5vd3BhdGg7DQp9DQoNCi8vICsmIzExMDU7KyYjMTA3Mzt8I3wjLSstK3wtKy0rfC0rLSsNCmZ1bmN0aW9uIGdldFVwUGF0aCgkbm93cGF0aCkgew0KCSRwYXRoZGIgPSBleHBsb2RlKCcvJywgJG5vd3BhdGgpOw0KCSRudW0gPSBjb3VudCgkcGF0aGRiKTsNCglpZiAoJG51bSA+IDIpIHsNCgkJdW5zZXQoJHBhdGhkYlskbnVtLTFdLCRwYXRoZGJbJG51bS0yXSk7DQoJfQ0KCSR1cHBhdGggPSBpbXBsb2RlKCcvJywgJHBhdGhkYikuJy8nOw0KCSR1cHBhdGggPSBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICR1cHBhdGgpOw0KCXJldHVybiAkdXBwYXRoOw0KfQ0KDQovLyArJiMxMTAwOyMmIzEwOTc7UEhQKyYjMTA5MjsrfCMrLSANCmZ1bmN0aW9uIGdldGNmZygkdmFybmFtZSkgew0KCSRyZXN1bHQgPSBnZXRfY2ZnX3ZhcigkdmFybmFtZSk7DQoJaWYgKCRyZXN1bHQgPT0gMCkgew0KCQlyZXR1cm4gJ05vJzsNCgl9IGVsc2VpZiAoJHJlc3VsdCA9PSAxKSB7DQoJCXJldHVybiAnWWVzJzsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gJHJlc3VsdDsNCgl9DQp9DQoNCi8vICsmIzExMDA7IyYjMTA5Nzt8JiMxMDg3Oy0gfCYjMTA5NzsrJiMxMDM4Ow0KZnVuY3Rpb24gZ2V0ZnVuKCRmdW5OYW1lKSB7DQoJcmV0dXJuIChmYWxzZSAhPT0gZnVuY3Rpb25fZXhpc3RzKCRmdW5OYW1lKSkgPyAnWWVzJyA6ICdObyc7DQp9DQoNCmZ1bmN0aW9uIEdldExpc3QoJGRpcil7DQoJZ2xvYmFsICRkaXJkYXRhLCRqLCRub3dwYXRoOw0KCSEkaiAmJiAkaj0xOw0KCWlmICgkZGggPSBvcGVuZGlyKCRkaXIpKSB7DQoJCXdoaWxlICgkZmlsZSA9IHJlYWRkaXIoJGRoKSkgew0KCQkJJGY9c3RyX3JlcGxhY2UoJy8vJywnLycsJGRpci4nLycuJGZpbGUpOw0KCQkJaWYoJGZpbGUhPScuJyAmJiAkZmlsZSE9Jy4uJyAmJiBpc19kaXIoJGYpKXsNCgkJCQlpZiAoaXNfd3JpdGFibGUoJGYpKSB7DQoJCQkJCSRkaXJkYXRhWyRqXVsnZmlsZW5hbWUnXT1zdHJfcmVwbGFjZSgkbm93cGF0aCwnJywkZik7DQoJCQkJCSRkaXJkYXRhWyRqXVsnbXRpbWUnXT1AZGF0ZSgnWS1tLWQgSDppOnMnLGZpbGVtdGltZSgkZikpOw0KCQkJCQkkZGlyZGF0YVskal1bJ2RpcmNobW9kJ109Z2V0Q2htb2QoJGYpOw0KCQkJCQkkZGlyZGF0YVskal1bJ2RpcnBlcm0nXT1nZXRQZXJtcygkZik7DQoJCQkJCSRkaXJkYXRhWyRqXVsnZGlybGluayddPXVlKCRkaXIpOw0KCQkJCQkkZGlyZGF0YVskal1bJ3NlcnZlcl9saW5rJ109JGY7DQoJCQkJCSRkaXJkYXRhWyRqXVsnY2xpZW50X2xpbmsnXT11ZSgkZik7DQoJCQkJCSRqKys7DQoJCQkJfQ0KCQkJCUdldExpc3QoJGYpOw0KCQkJfQ0KCQl9DQoJCWNsb3NlZGlyKCRkaCk7DQoJCWNsZWFyc3RhdGNhY2hlKCk7DQoJCXJldHVybiAkZGlyZGF0YTsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gYXJyYXkoKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIHF5KCRzcWwpIHsNCgkvL2VjaG8gJHNxbC4nPGJyPic7DQoJJHJlcyA9ICRlcnJvciA9ICcnOw0KCWlmKCEkcmVzID0gQG15c3FsX3F1ZXJ5KCRzcWwpKSB7DQoJCXJldHVybiAwOw0KCX0gZWxzZSBpZihpc19yZXNvdXJjZSgkcmVzKSkgew0KCQlyZXR1cm4gMTsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gMjsNCgl9DQoJcmV0dXJuIDA7DQp9DQoNCmZ1bmN0aW9uIHEoJHNxbCkgew0KCXJldHVybiBAbXlzcWxfcXVlcnkoJHNxbCk7DQp9DQoNCmZ1bmN0aW9uIGZyKCRxeSl7DQoJbXlzcWxfZnJlZV9yZXN1bHQoJHF5KTsNCn0NCg0KZnVuY3Rpb24gc2l6ZWNvdW50KCRzaXplKSB7DQoJaWYoJHNpemUgPiAxMDczNzQxODI0KSB7DQoJCSRzaXplID0gcm91bmQoJHNpemUgLyAxMDczNzQxODI0ICogMTAwKSAvIDEwMCAuICcgRyc7DQoJfSBlbHNlaWYoJHNpemUgPiAxMDQ4NTc2KSB7DQoJCSRzaXplID0gcm91bmQoJHNpemUgLyAxMDQ4NTc2ICogMTAwKSAvIDEwMCAuICcgTSc7DQoJfSBlbHNlaWYoJHNpemUgPiAxMDI0KSB7DQoJCSRzaXplID0gcm91bmQoJHNpemUgLyAxMDI0ICogMTAwKSAvIDEwMCAuICcgSyc7DQoJfSBlbHNlIHsNCgkJJHNpemUgPSAkc2l6ZSAuICcgQic7DQoJfQ0KCXJldHVybiAkc2l6ZTsNCn0NCg0KLy8gLXwtJiMxMTExO3wmIzEwMjg7IyArJiMxMDg4Ow0KY2xhc3MgUEhQWmlwew0KCXZhciAkb3V0PScnOw0KCWZ1bmN0aW9uIFBIUFppcCgkZGlyKQl7DQoJCWlmIChAZnVuY3Rpb25fZXhpc3RzKCdnemNvbXByZXNzJykpCXsNCgkJCSRjdXJkaXIgPSBnZXRjd2QoKTsNCgkJCWlmIChpc19hcnJheSgkZGlyKSkgJGZpbGVsaXN0ID0gJGRpcjsNCgkJCWVsc2V7DQoJCQkJJGZpbGVsaXN0PSR0aGlzIC0+IEdldEZpbGVMaXN0KCRkaXIpOy8vKy0rIC0tIyYjMTEwMTsNCgkJCQlmb3JlYWNoKCRmaWxlbGlzdCBhcyAkaz0+JHYpICRmaWxlbGlzdFtdPXN1YnN0cigkdixzdHJsZW4oJGRpcikrMSk7DQoJCQl9DQoJCQlpZiAoKCFlbXB0eSgkZGlyKSkmJighaXNfYXJyYXkoJGRpcikpJiYoZmlsZV9leGlzdHMoJGRpcikpKSBjaGRpcigkZGlyKTsNCgkJCWVsc2UgY2hkaXIoJGN1cmRpcik7DQoJCQlpZiAoY291bnQoJGZpbGVsaXN0KT4wKXsNCgkJCQlmb3JlYWNoKCRmaWxlbGlzdCBhcyAkZmlsZW5hbWUpew0KCQkJCQlpZiAoaXNfZmlsZSgkZmlsZW5hbWUpKXsNCgkJCQkJCSRmZCA9IGZvcGVuICgkZmlsZW5hbWUsICdyJyk7DQoJCQkJCQkkY29udGVudCA9IEBmcmVhZCAoJGZkLCBmaWxlc2l6ZSgkZmlsZW5hbWUpKTsNCgkJCQkJCWZjbG9zZSAoJGZkKTsNCgkJCQkJCWlmIChpc19hcnJheSgkZGlyKSkgJGZpbGVuYW1lID0gYmFzZW5hbWUoJGZpbGVuYW1lKTsNCgkJCQkJCSR0aGlzIC0+IGFkZEZpbGUoJGNvbnRlbnQsICRmaWxlbmFtZSk7DQoJCQkJCX0NCgkJCQl9DQoJCQkJJHRoaXMtPm91dCA9ICR0aGlzIC0+IGZpbGUoKTsNCgkJCQljaGRpcigkY3VyZGlyKTsNCgkJCX0NCgkJCXJldHVybiAxOw0KCQl9DQoJCWVsc2UgcmV0dXJuIDA7DQoJfQ0KDQoJLy8gKyYjMTEwNTt8fCsrfCYjMTA4MDstKy0rKy0rIC0tIyYjMTEwMTsNCglmdW5jdGlvbiBHZXRGaWxlTGlzdCgkZGlyKXsNCgkJc3RhdGljICRhOw0KCQlpZiAoaXNfZGlyKCRkaXIpKSB7DQoJCQlpZiAoJGRoID0gb3BlbmRpcigkZGlyKSkgew0KCQkJCXdoaWxlICgkZmlsZSA9IHJlYWRkaXIoJGRoKSkgew0KCQkJCQlpZigkZmlsZSE9Jy4nICYmICRmaWxlIT0nLi4nKXsNCgkJCQkJCSRmPSRkaXIgLicvJy4gJGZpbGU7DQoJCQkJCQlpZihpc19kaXIoJGYpKSAkdGhpcy0+R2V0RmlsZUxpc3QoJGYpOw0KCQkJCQkJJGFbXT0kZjsNCgkJCQkJfQ0KCQkJCX0NCgkJCQljbG9zZWRpcigkZGgpOw0KCQkJfQ0KCQl9DQoJCXJldHVybiAkYTsNCgl9DQoNCgl2YXIgJGRhdGFzZWMgICAgICA9IGFycmF5KCk7DQoJdmFyICRjdHJsX2RpciAgICAgPSBhcnJheSgpOw0KCXZhciAkZW9mX2N0cmxfZGlyID0gIlx4NTBceDRiXHgwNVx4MDZceDAwXHgwMFx4MDBceDAwIjsNCgl2YXIgJG9sZF9vZmZzZXQgICA9IDA7DQoNCglmdW5jdGlvbiB1bml4MkRvc1RpbWUoJHVuaXh0aW1lID0gMCkgew0KCQkkdGltZWFycmF5ID0gKCR1bml4dGltZSA9PSAwKSA/IGdldGRhdGUoKSA6IGdldGRhdGUoJHVuaXh0aW1lKTsNCgkJaWYgKCR0aW1lYXJyYXlbJ3llYXInXSA8IDE5ODApIHsNCgkJCSR0aW1lYXJyYXlbJ3llYXInXSAgICA9IDE5ODA7DQoJCQkkdGltZWFycmF5Wydtb24nXSAgICAgPSAxOw0KCQkJJHRpbWVhcnJheVsnbWRheSddICAgID0gMTsNCgkJCSR0aW1lYXJyYXlbJ2hvdXJzJ10gICA9IDA7DQoJCQkkdGltZWFycmF5WydtaW51dGVzJ10gPSAwOw0KCQkJJHRpbWVhcnJheVsnc2Vjb25kcyddID0gMDsNCgkJfSAvLyBlbmQgaWYNCgkJcmV0dXJuICgoJHRpbWVhcnJheVsneWVhciddIC0gMTk4MCkgPDwgMjUpIHwgKCR0aW1lYXJyYXlbJ21vbiddIDw8IDIxKSB8ICgkdGltZWFycmF5WydtZGF5J10gPDwgMTYpIHwNCgkJCQkoJHRpbWVhcnJheVsnaG91cnMnXSA8PCAxMSkgfCAoJHRpbWVhcnJheVsnbWludXRlcyddIDw8IDUpIHwgKCR0aW1lYXJyYXlbJ3NlY29uZHMnXSA+PiAxKTsNCgl9DQoNCglmdW5jdGlvbiBhZGRGaWxlKCRkYXRhLCAkbmFtZSwgJHRpbWUgPSAwKSB7DQoJCSRuYW1lID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkbmFtZSk7DQoNCgkJJGR0aW1lID0gZGVjaGV4KCR0aGlzLT51bml4MkRvc1RpbWUoJHRpbWUpKTsNCgkJJGhleGR0aW1lCT0gJ1x4JyAuICRkdGltZVs2XSAuICRkdGltZVs3XQ0KCQkJCQkuICdceCcgLiAkZHRpbWVbNF0gLiAkZHRpbWVbNV0NCgkJCQkJLiAnXHgnIC4gJGR0aW1lWzJdIC4gJGR0aW1lWzNdDQoJCQkJCS4gJ1x4JyAuICRkdGltZVswXSAuICRkdGltZVsxXTsNCgkJZXZhbCgnJGhleGR0aW1lID0gIicgLiAkaGV4ZHRpbWUgLiAnIjsnKTsNCgkJJGZyCT0gIlx4NTBceDRiXHgwM1x4MDQiOw0KCQkkZnIJLj0gIlx4MTRceDAwIjsNCgkJJGZyCS49ICJceDAwXHgwMCI7DQoJCSRmcgkuPSAiXHgwOFx4MDAiOw0KCQkkZnIJLj0gJGhleGR0aW1lOw0KDQoJCSR1bmNfbGVuID0gc3RybGVuKCRkYXRhKTsNCgkJJGNyYyA9IGNyYzMyKCRkYXRhKTsNCgkJJHpkYXRhID0gZ3pjb21wcmVzcygkZGF0YSk7DQoJCSRjX2xlbiA9IHN0cmxlbigkemRhdGEpOw0KCQkkemRhdGEgPSBzdWJzdHIoc3Vic3RyKCR6ZGF0YSwgMCwgc3RybGVuKCR6ZGF0YSkgLSA0KSwgMik7DQoJCSRmciAuPSBwYWNrKCdWJywgJGNyYyk7DQoJCSRmciAuPSBwYWNrKCdWJywgJGNfbGVuKTsNCgkJJGZyIC49IHBhY2soJ1YnLCAkdW5jX2xlbik7DQoJCSRmciAuPSBwYWNrKCd2Jywgc3RybGVuKCRuYW1lKSk7DQoJCSRmciAuPSBwYWNrKCd2JywgMCk7DQoJCSRmciAuPSAkbmFtZTsNCgkJJGZyIC49ICR6ZGF0YTsNCgkJJGZyIC49IHBhY2soJ1YnLCAkY3JjKTsNCgkJJGZyIC49IHBhY2soJ1YnLCAkY19sZW4pOw0KCQkkZnIgLj0gcGFjaygnVicsICR1bmNfbGVuKTsNCg0KCQkkdGhpcyAtPiBkYXRhc2VjW10gPSAkZnI7DQoJCSRuZXdfb2Zmc2V0ID0gc3RybGVuKGltcGxvZGUoJycsICR0aGlzLT5kYXRhc2VjKSk7DQoNCgkJJGNkcmVjID0gIlx4NTBceDRiXHgwMVx4MDIiOw0KCQkkY2RyZWMgLj0gIlx4MDBceDAwIjsNCgkJJGNkcmVjIC49ICJceDE0XHgwMCI7DQoJCSRjZHJlYyAuPSAiXHgwMFx4MDAiOw0KCQkkY2RyZWMgLj0gIlx4MDhceDAwIjsNCgkJJGNkcmVjIC49ICRoZXhkdGltZTsNCgkJJGNkcmVjIC49IHBhY2soJ1YnLCAkY3JjKTsNCgkJJGNkcmVjIC49IHBhY2soJ1YnLCAkY19sZW4pOw0KCQkkY2RyZWMgLj0gcGFjaygnVicsICR1bmNfbGVuKTsNCgkJJGNkcmVjIC49IHBhY2soJ3YnLCBzdHJsZW4oJG5hbWUpICk7DQoJCSRjZHJlYyAuPSBwYWNrKCd2JywgMCApOw0KCQkkY2RyZWMgLj0gcGFjaygndicsIDAgKTsNCgkJJGNkcmVjIC49IHBhY2soJ3YnLCAwICk7DQoJCSRjZHJlYyAuPSBwYWNrKCd2JywgMCApOw0KCQkkY2RyZWMgLj0gcGFjaygnVicsIDMyICk7DQoJCSRjZHJlYyAuPSBwYWNrKCdWJywgJHRoaXMgLT4gb2xkX29mZnNldCApOw0KCQkkdGhpcyAtPiBvbGRfb2Zmc2V0ID0gJG5ld19vZmZzZXQ7DQoJCSRjZHJlYyAuPSAkbmFtZTsNCg0KCQkkdGhpcyAtPiBjdHJsX2RpcltdID0gJGNkcmVjOw0KCX0NCg0KCWZ1bmN0aW9uIGZpbGUoKSB7DQoJCSRkYXRhICAgID0gaW1wbG9kZSgnJywgJHRoaXMgLT4gZGF0YXNlYyk7DQoJCSRjdHJsZGlyID0gaW1wbG9kZSgnJywgJHRoaXMgLT4gY3RybF9kaXIpOw0KCQlyZXR1cm4gJGRhdGEgLiAkY3RybGRpciAuICR0aGlzIC0+IGVvZl9jdHJsX2RpciAuIHBhY2soJ3YnLCBzaXplb2YoJHRoaXMgLT4gY3RybF9kaXIpKSAuIHBhY2soJ3YnLCBzaXplb2YoJHRoaXMgLT4gY3RybF9kaXIpKSAuCXBhY2soJ1YnLCBzdHJsZW4oJGN0cmxkaXIpKSAuIHBhY2soJ1YnLCBzdHJsZW4oJGRhdGEpKSAuICJceDAwXHgwMCI7DQoJfQ0KfQ0KDQovLyAjKyt8LSArfCsmIzEwOTA7DQpmdW5jdGlvbiBzcWxkdW1wdGFibGUoJHRhYmxlLCAkZnA9MCkgew0KCSR0YWJsZWR1bXAgPSAiRFJPUCBUQUJMRSBJRiBFWElTVFMgJHRhYmxlO1xuIjsNCgkkdGFibGVkdW1wIC49ICJDUkVBVEUgVEFCTEUgJHRhYmxlIChcbiI7DQoNCgkkZmlyc3RmaWVsZD0xOw0KDQoJJGZpZWxkcyA9IHEoIlNIT1cgRklFTERTIEZST00gJHRhYmxlIik7DQoJd2hpbGUgKCRmaWVsZCA9IG15c3FsX2ZldGNoX2FycmF5KCRmaWVsZHMpKSB7DQoJCWlmICghJGZpcnN0ZmllbGQpIHsNCgkJCSR0YWJsZWR1bXAgLj0gIixcbiI7DQoJCX0gZWxzZSB7DQoJCQkkZmlyc3RmaWVsZD0wOw0KCQl9DQoJCSR0YWJsZWR1bXAgLj0gIiAgICRmaWVsZFtGaWVsZF0gJGZpZWxkW1R5cGVdIjsNCgkJaWYgKCFlbXB0eSgkZmllbGRbIkRlZmF1bHQiXSkpIHsNCgkJCSR0YWJsZWR1bXAgLj0gIiBERUZBVUxUICckZmllbGRbRGVmYXVsdF0nIjsNCgkJfQ0KCQlpZiAoJGZpZWxkWydOdWxsJ10gIT0gIllFUyIpIHsNCgkJCSR0YWJsZWR1bXAgLj0gIiBOT1QgTlVMTCI7DQoJCX0NCgkJaWYgKCRmaWVsZFsnRXh0cmEnXSAhPSAiIikgew0KCQkJJHRhYmxlZHVtcCAuPSAiICRmaWVsZFtFeHRyYV0iOw0KCQl9DQoJfQ0KCWZyKCRmaWVsZHMpOw0KDQoJJGtleXMgPSBxKCJTSE9XIEtFWVMgRlJPTSAkdGFibGUiKTsNCgl3aGlsZSAoJGtleSA9IG15c3FsX2ZldGNoX2FycmF5KCRrZXlzKSkgew0KCQkka25hbWU9JGtleVsnS2V5X25hbWUnXTsNCgkJaWYgKCRrbmFtZSAhPSAiUFJJTUFSWSIgJiYgJGtleVsnTm9uX3VuaXF1ZSddID09IDApIHsNCgkJCSRrbmFtZT0iVU5JUVVFfCRrbmFtZSI7DQoJCX0NCgkJaWYoIWlzX2FycmF5KCRpbmRleFska25hbWVdKSkgew0KCQkJJGluZGV4WyRrbmFtZV0gPSBhcnJheSgpOw0KCQl9DQoJCSRpbmRleFska25hbWVdW10gPSAka2V5WydDb2x1bW5fbmFtZSddOw0KCX0NCglmcigka2V5cyk7DQoNCgl3aGlsZShsaXN0KCRrbmFtZSwgJGNvbHVtbnMpID0gQGVhY2goJGluZGV4KSkgew0KCQkkdGFibGVkdW1wIC49ICIsXG4iOw0KCQkkY29sbmFtZXM9aW1wbG9kZSgkY29sdW1ucywiLCIpOw0KDQoJCWlmICgka25hbWUgPT0gIlBSSU1BUlkiKSB7DQoJCQkkdGFibGVkdW1wIC49ICIgICBQUklNQVJZIEtFWSAoJGNvbG5hbWVzKSI7DQoJCX0gZWxzZSB7DQoJCQlpZiAoc3Vic3RyKCRrbmFtZSwwLDYpID09ICJVTklRVUUiKSB7DQoJCQkJJGtuYW1lPXN1YnN0cigka25hbWUsNyk7DQoJCQl9DQoJCQkkdGFibGVkdW1wIC49ICIgICBLRVkgJGtuYW1lICgkY29sbmFtZXMpIjsNCgkJfQ0KCX0NCg0KCSR0YWJsZWR1bXAgLj0gIlxuKTtcblxuIjsNCglpZiAoJGZwKSB7DQoJCWZ3cml0ZSgkZnAsJHRhYmxlZHVtcCk7DQoJfSBlbHNlIHsNCgkJZWNobyAkdGFibGVkdW1wOw0KCX0NCg0KCSRyb3dzID0gcSgiU0VMRUNUICogRlJPTSAkdGFibGUiKTsNCgkkbnVtZmllbGRzID0gbXlzcWxfbnVtX2ZpZWxkcygkcm93cyk7DQoJd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcm93cykpIHsNCgkJJHRhYmxlZHVtcCA9ICJJTlNFUlQgSU5UTyAkdGFibGUgVkFMVUVTKCI7DQoNCgkJJGZpZWxkY291bnRlcj0tMTsNCgkJJGZpcnN0ZmllbGQ9MTsNCgkJd2hpbGUgKCsrJGZpZWxkY291bnRlcjwkbnVtZmllbGRzKSB7DQoJCQlpZiAoISRmaXJzdGZpZWxkKSB7DQoJCQkJJHRhYmxlZHVtcC49IiwgIjsNCgkJCX0gZWxzZSB7DQoJCQkJJGZpcnN0ZmllbGQ9MDsNCgkJCX0NCg0KCQkJaWYgKCFpc3NldCgkcm93WyRmaWVsZGNvdW50ZXJdKSkgew0KCQkJCSR0YWJsZWR1bXAgLj0gIk5VTEwiOw0KCQkJfSBlbHNlIHsNCgkJCQkkdGFibGVkdW1wIC49ICInIi5teXNxbF9lc2NhcGVfc3RyaW5nKCRyb3dbJGZpZWxkY291bnRlcl0pLiInIjsNCgkJCX0NCgkJfQ0KDQoJCSR0YWJsZWR1bXAgLj0gIik7XG4iOw0KDQoJCWlmICgkZnApIHsNCgkJCWZ3cml0ZSgkZnAsJHRhYmxlZHVtcCk7DQoJCX0gZWxzZSB7DQoJCQllY2hvICR0YWJsZWR1bXA7DQoJCX0NCgl9DQoJZnIoJHJvd3MpOw0KCWlmICgkZnApIHsNCgkJZndyaXRlKCRmcCwiXG4iKTsNCgl9IGVsc2Ugew0KCQllY2hvICJcbiI7DQoJfQ0KfQ0KDQpmdW5jdGlvbiB1ZSgkc3RyKXsNCglyZXR1cm4gdXJsZW5jb2RlKCRzdHIpOw0KfQ0KDQpmdW5jdGlvbiBwKCRzdHIpew0KCWVjaG8gJHN0ci4iXG4iOw0KfQ0KDQpmdW5jdGlvbiB0YmhlYWQoKSB7DQoJcCgnPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+Jyk7DQp9DQpmdW5jdGlvbiB0YmZvb3QoKXsNCglwKCc8L3RhYmxlPicpOw0KfQ0KDQpmdW5jdGlvbiBtYWtlaGlkZSgkbmFtZSwkdmFsdWU9Jycpew0KCXAoIjxpbnB1dCBpZD1cIiRuYW1lXCIgdHlwZT1cImhpZGRlblwiIG5hbWU9XCIkbmFtZVwiIHZhbHVlPVwiJHZhbHVlXCIgLz4iKTsNCn0NCg0KZnVuY3Rpb24gbWFrZWlucHV0KCRhcmcgPSBhcnJheSgpKXsNCgkkYXJnWydzaXplJ10gPSAkYXJnWydzaXplJ10gPiAwID8gInNpemU9XCIkYXJnW3NpemVdXCIiIDogInNpemU9XCIxMDBcIiI7DQoJJGFyZ1snZXh0cmEnXSA9ICRhcmdbJ2V4dHJhJ10gPyAkYXJnWydleHRyYSddIDogJyc7DQoJISRhcmdbJ3R5cGUnXSAmJiAkYXJnWyd0eXBlJ10gPSAndGV4dCc7DQoJJGFyZ1sndGl0bGUnXSA9ICRhcmdbJ3RpdGxlJ10gPyAkYXJnWyd0aXRsZSddLic8YnIgLz4nIDogJyc7DQoJJGFyZ1snY2xhc3MnXSA9ICRhcmdbJ2NsYXNzJ10gPyAkYXJnWydjbGFzcyddIDogJ2lucHV0JzsNCglpZiAoJGFyZ1snbmV3bGluZSddKSB7DQoJCXAoIjxwPiRhcmdbdGl0bGVdPGlucHV0IGNsYXNzPVwiJGFyZ1tjbGFzc11cIiBuYW1lPVwiJGFyZ1tuYW1lXVwiIGlkPVwiJGFyZ1tuYW1lXVwiIHZhbHVlPVwiJGFyZ1t2YWx1ZV1cIiB0eXBlPVwiJGFyZ1t0eXBlXVwiICRhcmdbc2l6ZV0gJGFyZ1tleHRyYV0gLz48L3A+Iik7DQoJfSBlbHNlIHsNCgkJcCgiJGFyZ1t0aXRsZV08aW5wdXQgY2xhc3M9XCIkYXJnW2NsYXNzXVwiIG5hbWU9XCIkYXJnW25hbWVdXCIgaWQ9XCIkYXJnW25hbWVdXCIgdmFsdWU9XCIkYXJnW3ZhbHVlXVwiIHR5cGU9XCIkYXJnW3R5cGVdXCIgJGFyZ1tzaXplXSAkYXJnW2V4dHJhXSAvPiIpOw0KCX0NCn0NCg0KZnVuY3Rpb24gbWFrZXNlbGVjdCgkYXJnID0gYXJyYXkoKSl7DQoJaWYgKCRhcmdbJ29uY2hhbmdlJ10pIHsNCgkJJG9uY2hhbmdlID0gJ29uY2hhbmdlPSInLiRhcmdbJ29uY2hhbmdlJ10uJyInOw0KCX0NCgkkYXJnWyd0aXRsZSddID0gJGFyZ1sndGl0bGUnXSA/ICRhcmdbJ3RpdGxlJ10gOiAnJzsNCglpZiAoJGFyZ1snbmV3bGluZSddKSBwKCc8cD4nKTsNCglwKCIkYXJnW3RpdGxlXSA8c2VsZWN0IGNsYXNzPVwiaW5wdXRcIiBpZD1cIiRhcmdbbmFtZV1cIiBuYW1lPVwiJGFyZ1tuYW1lXVwiICRvbmNoYW5nZT4iKTsNCgkJaWYgKGlzX2FycmF5KCRhcmdbJ29wdGlvbiddKSkgew0KCQkJZm9yZWFjaCAoJGFyZ1snb3B0aW9uJ10gYXMgJGtleT0+JHZhbHVlKSB7DQoJCQkJaWYgKCRhcmdbJ3NlbGVjdGVkJ109PSRrZXkpIHsNCgkJCQkJcCgiPG9wdGlvbiB2YWx1ZT1cIiRrZXlcIiBzZWxlY3RlZD4kdmFsdWU8L29wdGlvbj4iKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlwKCI8b3B0aW9uIHZhbHVlPVwiJGtleVwiPiR2YWx1ZTwvb3B0aW9uPiIpOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCXAoIjwvc2VsZWN0PiIpOw0KCWlmICgkYXJnWyduZXdsaW5lJ10pIHAoJzwvcD4nKTsNCn0NCmZ1bmN0aW9uIGZvcm1oZWFkKCRhcmcgPSBhcnJheSgpKSB7DQoJISRhcmdbJ21ldGhvZCddICYmICRhcmdbJ21ldGhvZCddID0gJ3Bvc3QnOw0KCSEkYXJnWydhY3Rpb24nXSAmJiAkYXJnWydhY3Rpb24nXSA9ICRzZWxmOw0KCSRhcmdbJ3RhcmdldCddID0gJGFyZ1sndGFyZ2V0J10gPyAidGFyZ2V0PVwiJGFyZ1t0YXJnZXRdXCIiIDogJyc7DQoJISRhcmdbJ25hbWUnXSAmJiAkYXJnWyduYW1lJ10gPSAnZm9ybTEnOw0KCXAoIjxmb3JtIG5hbWU9XCIkYXJnW25hbWVdXCIgaWQ9XCIkYXJnW25hbWVdXCIgYWN0aW9uPVwiJGFyZ1thY3Rpb25dXCIgbWV0aG9kPVwiJGFyZ1ttZXRob2RdXCIgJGFyZ1t0YXJnZXRdPiIpOw0KCWlmICgkYXJnWyd0aXRsZSddKSB7DQoJCXAoJzxoMj4nLiRhcmdbJ3RpdGxlJ10uJyAmcmFxdW87PC9oMj4nKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIG1ha2V0ZXh0KCRhcmcgPSBhcnJheSgpKXsNCgkhJGFyZ1snY29scyddICYmICRhcmdbJ2NvbHMnXSA9IDEwMDsNCgkhJGFyZ1sncm93cyddICYmICRhcmdbJ3Jvd3MnXSA9IDI1Ow0KCSRhcmdbJ3RpdGxlJ10gPSAkYXJnWyd0aXRsZSddID8gJGFyZ1sndGl0bGUnXS4nPGJyIC8+JyA6ICcnOw0KCXAoIjxwPiRhcmdbdGl0bGVdPHRleHRhcmVhIGNsYXNzPVwiYXJlYVwiIGlkPVwiJGFyZ1tuYW1lXVwiIG5hbWU9XCIkYXJnW25hbWVdXCIgY29scz1cIiRhcmdbY29sc11cIiByb3dzPVwiJGFyZ1tyb3dzXVwiICRhcmdbZXh0cmFdPiRhcmdbdmFsdWVdPC90ZXh0YXJlYT48L3A+Iik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1mb290ZXIoJG5hbWUgPSAnJyl7DQoJISRuYW1lICYmICRuYW1lID0gJ3N1Ym1pdCc7DQoJcCgnPHA+PGlucHV0IGNsYXNzPSJidCIgbmFtZT0iJy4kbmFtZS4nIiBpZD1cIicuJG5hbWUuJ1wiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlN1Ym1pdCI+PC9wPicpOw0KCXAoJzwvZm9ybT4nKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWZvb3QoKXsNCglwKCc8L2Zvcm0+Jyk7DQp9DQoNCi8vIHwmIzExMTg7LSt8JiMxMDg3Oy0gDQpmdW5jdGlvbiBwcigkYSkgew0KCWVjaG8gJzxwcmU+JzsNCglwcmludF9yKCRhKTsNCgllY2hvICc8L3ByZT4nOw0KfQ0KDQo/Pg0KPD9waHANCiRraW1lPSJhbWFkZXVzMTU1QGhvdG1haWwuY29tIjsNCiRiYXNsaWs9IlNhZHJhemFNIFNlcnZlciBBdmNpc2kgVjEuMCI7DQokRUxfTXVIYU1NZUQ9IkRvc3lhIFlvbHUgOiAiLiRfU0VSVkVSWydET0NVTUVOVF9ST09UJ10uIlxyXG4iOw0KJEVMX011SGFNTWVELj0iU2VydmVyIEFkbWluIDogIi4kX1NFUlZFUlsnU0VSVkVSX0FETUlOJ10uIlxyXG4iOw0KJEVMX011SGFNTWVELj0iU2VydmVyIGlzbGV0aW0gc2lzdGVtaSA6ICIuJF9TRVJWRVJbJ1NFUlZFUl9TT0ZUV0FSRSddLiJcclxuIjsNCiRFTF9NdUhhTU1lRC49IlNoZWxsIExpbmsgOiBodHRwOi8vIi4kX1NFUlZFUlsnU0VSVkVSX05BTUUnXS4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iXHJcbiI7DQokRUxfTXVIYU1NZUQuPSJBdmxhbmFuIFNpdGUgOiAiIC4kX1NFUlZFUlsnSFRUUF9IT1NUJ10uIlxyXG4iOw0KbWFpbCgka2ltZSwgJGJhc2xpaywgJEVMX011SGFNTWVEKTsNCj8+")); ?>