F1 Abu Dhabi Grand Prix hospitality and tickets · 3 to 6 Dec 2026
Feel the speed, soak up the atmosphere and experience every moment live at the F1 season finale.
First GP 2009 Formula 1 at Yas Marina since
Corners 16 Across 5.281 km of circuit
Laps 58 From daylight into the floodlit night
Champions 05 Titles decided at Yas Marina since 2010
LyogZXNWaW1lb0xvb3A6IHNlYW1sZXNzIGhlcm8gbG9vcCwgQ0wtMjAyNjA5MzAtMDQsIGxlYW4gc3RhbmRieSBhbmQgcXVhbGl0eSBjYXAgQ0wtMjAyNjEw
MDctMDUsIDcyMHAgQ0wtMjAyNjEwMDctMDggKi8oZnVuY3Rpb24oKXt2YXIgTz0iaHR0cHM6Ly9wbGF5ZXIudmltZW8uY29tIixtbT13aW5kb3cubWF0Y2hN
ZWRpYT9mdW5jdGlvbihxKXtyZXR1cm4gbWF0Y2hNZWRpYShxKS5tYXRjaGVzfTpmdW5jdGlvbigpe3JldHVybiBmYWxzZX07dmFyIFJNPW1tKCIocHJlZmVy
cy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSIpLFE9IjcyMHAiO3ZhciB3cmFwcz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuaGVyby12aWRlby13cmFw
Iik7Zm9yKHZhciB3PTA7dzx3cmFwcy5sZW5ndGg7dysrKShmdW5jdGlvbih3cmFwKXt2YXIgYT13cmFwLnF1ZXJ5U2VsZWN0b3IoImlmcmFtZSIpO2lmKCFh
fHwoYS5nZXRBdHRyaWJ1dGUoInNyYyIpfHwiIikuaW5kZXhPZihPKSE9PTB8fHdyYXAuaGFzQXR0cmlidXRlKCJkYXRhLWVzdmwiKSlyZXR1cm47d3JhcC5z
ZXRBdHRyaWJ1dGUoImRhdGEtZXN2bCIsIjEiKTtpZihSTSYmd3JhcC5jbG9zZXN0JiZ3cmFwLmNsb3Nlc3QoIi5wYWdlLWhlcm8iKSl7YS5wYXJlbnROb2Rl
LnJlbW92ZUNoaWxkKGEpO3JldHVybn12YXIgUD1be2Y6YSxkdXI6MCx0aWNrczowLHE6MH0sbnVsbF0sYWN0PTAsZmFkaW5nPTAsaGVsZD0wLExFQUQ9MS4x
LEZBREU9OTAwLFBSRVA9MTA7ZnVuY3Rpb24gc2VuZChwLG0sdil7aWYoIXApcmV0dXJuO3RyeXt2YXIgbz17bWV0aG9kOm19O2lmKHYhPT12b2lkIDApby52
YWx1ZT12O3AuZi5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KG8pLE8pfWNhdGNoKGUpe319ZnVuY3Rpb24gYXJtKHApe2lmKCFw
LnEpc2VuZChwLCJzZXRRdWFsaXR5IixRKTtpZihSTSlyZXR1cm47c2VuZChwLCJhZGRFdmVudExpc3RlbmVyIiwidGltZXVwZGF0ZSIpO3NlbmQocCwiZ2V0
RHVyYXRpb24iKX1mdW5jdGlvbiBwYXJrKHApe3NlbmQocCwicGF1c2UiKTtzZW5kKHAsInNldEN1cnJlbnRUaW1lIiwwKX1mdW5jdGlvbiBtYWtlKCl7dmFy
IGI9YS5jbG9uZU5vZGUoZmFsc2UpO2IucmVtb3ZlQXR0cmlidXRlKCJpZCIpO2Iuc2V0QXR0cmlidXRlKCJsb2FkaW5nIiwiZWFnZXIiKTtiLnNldEF0dHJp
YnV0ZSgidGFiaW5kZXgiLCItMSIpO2Iuc2V0QXR0cmlidXRlKCJkYXRhLWVzdmwiLCJvZmYiKTt2YXIgcD17ZjpiLGR1cjowLHRpY2tzOjAscTowfTtQWzEt
YWN0XT1wO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZnVuY3Rpb24oKXthcm0ocCl9KTt3cmFwLmFwcGVuZENoaWxkKGIpO3ZhciBuPTAsdD1zZXRJbnRl
cnZhbChmdW5jdGlvbigpe2lmKHAudGlja3N8fCsrbj44KXtjbGVhckludGVydmFsKHQpO3JldHVybn1hcm0ocCl9LDE1MDApfWZ1bmN0aW9uIHN3YXAoKXt2
YXIgbj1QWzEtYWN0XSxjPVBbYWN0XTtpZihmYWRpbmd8fGhlbGR8fCFufHwhbi50aWNrcylyZXR1cm47ZmFkaW5nPTE7c2VuZChuLCJzZXRDdXJyZW50VGlt
ZSIsMCk7c2VuZChuLCJwbGF5Iik7Yy5mLnNldEF0dHJpYnV0ZSgiZGF0YS1lc3ZsIiwidW5kZXIiKTtuLmYuc2V0QXR0cmlidXRlKCJkYXRhLWVzdmwiLCJv
biIpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtwYXJrKGMpO2MuZi5zZXRBdHRyaWJ1dGUoImRhdGEtZXN2bCIsIm9mZiIpO2FjdD0xLWFjdDtmYWRpbmc9MH0s
RkFERSl9YS5zZXRBdHRyaWJ1dGUoImRhdGEtZXN2bCIsIm9uIik7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixmdW5jdGlvbigpe2FybShQWzBdKX0pO2Fy
bShQWzBdKTt2YXIgbjA9MCx0MD1zZXRJbnRlcnZhbChmdW5jdGlvbigpe2lmKChQWzBdLnRpY2tzfHxSTSkmJlBbMF0ucXx8KytuMD4xMil7Y2xlYXJJbnRl
cnZhbCh0MCk7cmV0dXJufWFybShQWzBdKX0sMTUwMCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGUpe2lmKGUub3JpZ2lu
IT09TylyZXR1cm47dmFyIGk9LTE7Zm9yKHZhciBrPTA7azwyO2srKylpZihQW2tdJiZlLnNvdXJjZT09PVBba10uZi5jb250ZW50V2luZG93KWk9aztpZihp
PDApcmV0dXJuO3ZhciBkPWUuZGF0YTtpZih0eXBlb2YgZD09PSJzdHJpbmciKXt0cnl7ZD1KU09OLnBhcnNlKGQpfWNhdGNoKHgpe3JldHVybn19aWYoIWQp
cmV0dXJuO3ZhciBwPVBbaV07aWYoZC5ldmVudD09PSJyZWFkeSIpe2FybShwKTtyZXR1cm59aWYoZC5tZXRob2Q9PT0ic2V0UXVhbGl0eSIpe3AucT0xO3Jl
dHVybn1pZihkLm1ldGhvZD09PSJnZXREdXJhdGlvbiIpe3AuZHVyPStkLnZhbHVlfHxwLmR1cjtyZXR1cm59aWYoUk0pcmV0dXJuO2lmKChkLmV2ZW50PT09
InBsYXlQcm9ncmVzcyJ8fGQuZXZlbnQ9PT0idGltZXVwZGF0ZSIpJiZkLmRhdGEpe3AudGlja3MrKztpZihkLmRhdGEuZHVyYXRpb24pcC5kdXI9ZC5kYXRh
LmR1cmF0aW9uO2lmKGk9PT1hY3Qpe3ZhciBsZWZ0PXAuZHVyLWQuZGF0YS5zZWNvbmRzO2lmKHAuZHVyJiYhaGVsZCYmIWZhZGluZyYmIVBbMS1hY3RdJiZs
ZWZ0PkxFQUQmJmxlZnQ8PU1hdGgubWluKFBSRVAscC5kdXIvMikpbWFrZSgpO2lmKCFmYWRpbmcmJnAuZHVyJiZsZWZ0PD1MRUFEKXN3YXAoKX1lbHNlIGlm
KCFmYWRpbmcmJiFoZWxkJiZkLmRhdGEuc2Vjb25kcz4uMDUpcGFyayhwKX19KTt2YXIgaGVybz13cmFwLmNsb3Nlc3Q/d3JhcC5jbG9zZXN0KCIucGFnZS1o
ZXJvLC5oZXJvIik6bnVsbCxidG49aGVybyYmaGVyby5xdWVyeVNlbGVjdG9yKCIuaGVyby12aWQtdG9nZ2xlIik7aWYoYnRuKWJ0bi5hZGRFdmVudExpc3Rl
bmVyKCJjbGljayIsZnVuY3Rpb24oKXtoZWxkPWJ0bi5nZXRBdHRyaWJ1dGUoImFyaWEtcHJlc3NlZCIpPT09InRydWUiO2lmKGhlbGQpe3NlbmQoUFswXSwi
cGF1c2UiKTtzZW5kKFBbMV0sInBhdXNlIil9ZWxzZXtzZW5kKFBbYWN0XSwicGxheSIpO2lmKFBbMS1hY3RdKXBhcmsoUFsxLWFjdF0pfX0pO30pKHdyYXBz
W3ddKTt9KSgpOw==
F1 Abu Dhabi Grand Prix · 3 to 6 Dec 2026 · Packages Now Live
Race Weekend
Where The ChampionshipIs Decided.
The final race of the F1 season lands in Abu Dhabi, bringing three days of speed,
spectacle and high-stakes racing to Yas Marina.
Be there for every moment. This is where championships are decided, rivalries reach their climax and
the world’s best drivers go head-to-head one last time. Add the marina, the atmosphere and the after-race
concerts and you’ve got a race weekend that goes well beyond the track.
As an official Abu Dhabi Grand Prix reseller, we put you closer to the action. Choose from
grandstand and Abu Dhabi Hill tickets through to the Sunset Lounge and trackside suites,
with hotels and transfers available through our team.
One race. One finale. One weekend you’ll be talking about for years.
Yas Marina Circuit, Abu Dhabi Grand Prix
Yas Marina Circuit · 3 to 6 Dec 2026
On Sale Now
Buy Official F1 Abu Dhabi Grand Prix Tickets
←
→
Grandstand Main Grandstand The grid, the pit lane and the podium
Over the starting grid, the pit stops, the finish line and the podium celebrations, with the F1 Fanzone, Oasis areas and After-Race Concerts included.
Hospitality Sunset Lounge Indoor lounge and terrace over Turn 5
An indoor lounge with an outdoor terrace over the Turn 5 braking zone, with food and drink included. Part of our private hospitality range at Yas Marina.
Grandstand West Grandstand The end of the longest straight, into Turns 6 and 7
The cars arrive flat out at the end of the longest straight on the circuit and brake hard for Turns 6 and 7 in front of you. Fanzone, Oasis areas and After-Race Concerts included.
General Admission Abu Dhabi Hill The grass hill inside the North section
Laid-back open-air viewing across Turns 2 to 6, with the freedom to roam between vantage points. Fanzone, Oasis areas and After-Race Concerts included.
Grandstand North Grandstand Over the Turn 5 braking zone
Watch the cars arrive at full speed, hard on the brakes, and fight for the corner at one of the best overtaking spots on the circuit. Fanzone, Oasis areas and After-Race Concerts included.
→ Enquire Now
Grandstand North Straight Grandstand Cars at full speed below
Above the straight, with the cars passing at full speed below you. Pure pace across the race weekend, with the Fanzone, Oasis areas and After-Race Concerts included.
→ Enquire Now
Grandstand West Straight Grandstand Inside the DRS zone, into Turns 6 and 7
Inside the DRS zone on the back straight, where the cars run flat out toward Turns 6 and 7 and the overtakes are set up in front of you. Fanzone, Oasis areas and After-Race Concerts included.
→ Enquire Now
Private hospitality
Private Suites.
Private hospitality at the Abu Dhabi Grand Prix deserves its own space. Our trackside
suites, lounges and private hosted spaces are detailed on our private hospitality page, with full
inventory, floor plans and everything you need to choose the right space.
Shams Suite, Yas Marina Circuit
Most circuits earn a reputation lap by lap over decades. This one opened with a title decider and has crowned world champions ever since.
Read the full story Close the story
Yas Marina opened in 2009 with a season finale and has closed the Formula 1 calendar in most years since. The race begins in daylight and finishes under floodlights, and the transition through sunset is the circuit's signature: track temperature drops sharply through the race and shifts the balance of the cars. The layout was substantially reprofiled in 2021, opening out the hairpin and the marina section, and the racing has been better for it ever since.
ES Sport holds confirmed allocation across the hospitality inventory here , which makes this the one round on the calendar where availability questions get an immediate answer.
First Grand Prix 2009
Location Yas Island, Abu Dhabi
Circuit length 5.281 km
Corners 16
Race laps 58
Capacity Around 60,000
Season finale Every year since 2014
Lap record 1:25.637, Magnussen, 2024
Reprofiled 2021
2026 dates 3 to 6 December
Full house. The Main Grandstand runs the length of the start/finish straight, with the grid and the podium playing out in front of it.
Race configuration. Sixteen corners from daylight into the floodlit night. This is the circuit the 2026 season will be decided on.
Key corners
T1
Turn 1 A tight left immediately after the start, and a regular first lap flashpoint.
T5
Turn 5 Heavy braking at the end of the long back straight and the primary overtaking point on the lap.
T9
Turn 9 Reprofiled in 2021 into a faster, more open corner that improved the following section considerably.
T12–14
Marina section Through the harbour past the yachts and under the Yas Hotel, the most recognisable stretch of the circuit.
T16
Final corner Onto the start/finish straight, deciding the run to the line.
Yasalam Concerts
After-race concerts at Etihad Live every night of the event, with Lewis Capaldi and Zara Larsson leading the 2026 line-up. General admission included.
F1 Fanzone
Access to the F1 Fanzone and all Oasis areas across the circuit throughout the weekend.
Yas Theme Parks
A one day pass to a Yas Island theme park, from Ferrari World to Yas Waterworld.
Museum Entry
Entry to selected museums, making a race weekend an Abu Dhabi weekend.
✓ Included with every ES Sport F1 Abu Dhabi ticket package. Not an upgrade, not an add-on.
Travel How do you get to Yas Marina Circuit?
The circuit is on Yas Island, around 15 minutes from Zayed International Airport and 40 minutes from the city centre. Yas Island accommodation puts you within walking distance of a gate, which is the reason it books out first.
If walking is not an option, taxis and ride-hailing services run to Yas Island throughout the weekend, and there are designated drop-off points close to the gates. Shuttle buses also operate from Yas Island hotels and from set points in Abu Dhabi and Dubai on race days. We can arrange private transfers as part of your package. Tell us your hotel and any accessibility requirements when you enquire and we will confirm the best route in.
Travel First time at the Abu Dhabi GP?
December in the UAE is the most comfortable weather of any round on the calendar. The weekend extends well beyond the circuit: concerts, the island's hotels and the after race programme are a substantial part of what people come for.
FAQ When is the 2026 Abu Dhabi GP?
The race weekend runs 4 to 6 December 2026 at Yas Marina Circuit, with the event opening on 3 December. It closes the Formula 1 season.
FAQ Does ES Sport hold allocation here?
Yes. Abu Dhabi is our home round and we work across suites, lounges, terraces and grandstand seating. Enquiries here get a fast, direct answer on availability.
FAQ Which hospitality option should I choose?
It depends on whether you want the racing or the occasion. Trackside lounges and terrace collections put you at the circuit; suites are the full hosted weekend. Tell us the party and the priority and we will match it.
FAQ Are grandstand tickets sold separately?
Some Yas Marina inventory carries a hotel stay condition rather than being available standalone. We will tell you which applies before you commit to anything.
FAQ What about the concerts?
The Yasalam After-Race Concerts are included with most weekend tickets and are a significant part of the event, with Lewis Capaldi and Zara Larsson leading the 2026 line-up. We can advise on which packages carry which access.
×
Enquire
Secure YourRace Weekend.
We'll get back to you.
LyogRjEgbWFwLCAxMSBTZXAgMjAyNjogY2xvc2UgY29udHJvbCBmb3IgdGhlIGRlc2t0b3Agem9uZSBwYW5lbCwgYW5kIHRoZSBtYXAgcmVkdWNlZCB0byB0
aGUKICAgem9uZXMgd2Ugc3RvY2sgYW5kIHJlZHJhd24gc28gZWFjaCBvbmUgcmVhZHMuIERvbmUgaGVyZSByYXRoZXIgdGhhbiBpbiB0aGUgbWluaWZpZWQg
bWFwIGNvZGUKICAgaW5zaWRlICNlc01haW5Kcy4KCiAgIFNoaXBwZWQgYXMgYmFzZTY0IGZvciB0aGUgc2FtZSByZWFzb24gI2VzTWFpbkpzIGlzOiBzZXJ2
ZWQgdGhyb3VnaCBXb3JkUHJlc3MsIGEgcGxhaW4gaW5saW5lCiAgIHNjcmlwdCBjb21lcyBiYWNrIHdpdGggc29tZSBvZiBpdHMgJiYgcmV3cml0dGVuIHRv
ICYjMDM4OyYjMDM4Oywgd2hpY2ggaXMgYSBzeW50YXggZXJyb3IgYW5kCiAgIHRha2VzIHRoZSB3aG9sZSBibG9jayBkb3duLiBJdCBtYW5nbGVkIHRocmVl
IG9mIHRoZSBzaXh0ZWVuIGhlcmUgYW5kIGxlZnQgdGhlIHJlc3QgYWxvbmUuICovCihmdW5jdGlvbigpewogIHZhciBaT05FUz1bWyJiZDdhOTQ4YTRlNjI0
MWFjYTZlY2M5ZmY1N2Q4YzBmN19jdGciLCJBYnUgRGhhYmkgSGlsbCIsIkFCVSBESEFCSSBISUxMIiwiZ2EiLC02LDE3Ml0sWyJmYTM0OWFmYzUxODY0Y2Fj
Yjk1YTM5OTU1ZDgyYjM3OV9jdGciLCJNYWluIEdyYW5kc3RhbmQiLCJNQUlOIEdSQU5EU1RBTkQiLCJncmFuZHN0YW5kIiwtMTI2LDQ2XSxbIjA5MGUxNjUy
YmQyYTRmYmFiMzBjY2ZhYzk4YzZmYzNjX2N0ZyIsIldlc3QgR3JhbmRzdGFuZCIsIldFU1QgR1JBTkRTVEFORCIsImdyYW5kc3RhbmQiLDIxMCwtNDBdLFsi
ZGRhNDc0ZTU3YzcyNGJmNzk2MDZhNmJhMzJkMjYyZDJfY3RnIiwiU3Vuc2V0IExvdW5nZSIsIlNVTlNFVCBMT1VOR0UiLCJsb3VuZ2UiLDAsLTY2XV0sIEhJ
TEw9ImJkN2E5NDhhNGU2MjQxYWNhNmVjYzlmZjU3ZDhjMGY3X2N0ZyIsIE5TPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7CiAgLyogc3VidGxlOiB0
aGUgYmFuZCBhIHNoYWRlIGFib3ZlIHRoZSBpbnNpZGUsIHRoZSBlZGdlcyBhIHNoYWRlIGFib3ZlIHRoZSBiYW5kICovCiAgdmFyIFJJTkdfVz0xOCwgUklO
R19UPSIjMkUzNjUwIiwgUklOR19MPSIjNUE2Njg0IiwgUklOR19JPSIjMUIyMTMwIjsKICB2YXIgQlk9e307IFpPTkVTLmZvckVhY2goZnVuY3Rpb24oeil7
IEJZW3pbMF1dPXo7IH0pOwoKICAvKiAtLS0tLS0tLS0tIDEuIGNsb3NlIGNvbnRyb2wgb24gdGhlIGRlc2t0b3Agem9uZSBwYW5lbCAtLS0tLS0tLS0tICov
CiAgdmFyIHBhbmVsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6b25lUGFuZWwiKTsgaWYoIXBhbmVsKSByZXR1cm47CiAgdmFyIHRpdGxlPWRvY3VtZW50
LmdldEVsZW1lbnRCeUlkKCJ6cFRpdGxlIiksIGRlc2M9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInpwRGVzYyIpLAogICAgICB0aWVyPWRvY3VtZW50Lmdl
dEVsZW1lbnRCeUlkKCJ6cFRpZXIiKSwgY29kZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBDb2RlIiksCiAgICAgIG1lZGlhPWRvY3VtZW50LmdldEVs
ZW1lbnRCeUlkKCJ6cE1lZGlhIiksIHBrZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBQa2ciKTsKICBpZighdGl0bGUpIHJldHVybjsKICB2YXIgYmFz
ZT17dGl0bGU6dGl0bGUudGV4dENvbnRlbnQsZGVzYzpkZXNjP2Rlc2MudGV4dENvbnRlbnQ6IiIsdGllcjp0aWVyP3RpZXIudGV4dENvbnRlbnQ6IiIsY29k
ZTpjb2RlP2NvZGUudGV4dENvbnRlbnQ6IiJ9OwogIHZhciBidG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7CiAgYnRuLnR5cGU9ImJ1dHRv
biI7IGJ0bi5jbGFzc05hbWU9InpwLXgiOyBidG4uc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwiQ2xvc2Ugem9uZSBkZXRhaWxzIik7CiAgYnRuLmlubmVy
SFRNTD0iJnRpbWVzOyI7CiAgcGFuZWwuaW5zZXJ0QmVmb3JlKGJ0bixwYW5lbC5maXJzdENoaWxkKTsKICBmdW5jdGlvbiBjbG9zZVBhbmVsKCl7CiAgICB0
aXRsZS50ZXh0Q29udGVudD1iYXNlLnRpdGxlOwogICAgaWYoZGVzYykgZGVzYy50ZXh0Q29udGVudD1iYXNlLmRlc2M7CiAgICBpZih0aWVyKSB0aWVyLnRl
eHRDb250ZW50PWJhc2UudGllcjsKICAgIGlmKGNvZGUpIGNvZGUudGV4dENvbnRlbnQ9YmFzZS5jb2RlOwogICAgaWYobWVkaWEpIG1lZGlhLmhpZGRlbj10
cnVlOwogICAgaWYocGtnKSBwa2cuaGlkZGVuPXRydWU7CiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JB
bGwoIi5lcy16b25lLmVzLWFjdGl2ZSIpLGZ1bmN0aW9uKHope3ouY2xhc3NMaXN0LnJlbW92ZSgiZXMtYWN0aXZlIik7fSk7CiAgICAvKiB0aGUgbWFwIGRy
YXdzIGl0cyBvd24gY29ybmVyIGJyYWNrZXRzIGludG8gYSA8ZyBpZD0iZXMtbG9jayI+LCBzZXBhcmF0ZWx5IGZyb20gLmVzLWFjdGl2ZSwKICAgICAgIHNv
IGNsZWFyaW5nIHRoZSBjbGFzcyBhbG9uZSBsZWZ0IHRoZSBzdGFuZCBzdGlsbCBsb29raW5nIHBpY2tlZCAqLwogICAgdmFyIGxvY2s9ZG9jdW1lbnQuZ2V0
RWxlbWVudEJ5SWQoImVzLWxvY2siKTsKICAgIGlmKGxvY2spIGxvY2suc3R5bGUuZGlzcGxheT0ibm9uZSI7CiAgICBwYW5lbC5jbGFzc0xpc3QucmVtb3Zl
KCJ6cC1vcGVuIik7CiAgfQogIGJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsY2xvc2VQYW5lbCk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigi
a2V5ZG93biIsZnVuY3Rpb24oZSl7CiAgICB2YXIgbW9kYWw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInpvbmVNb2RhbCIpOwogICAgaWYoZS5rZXk9PT0i
RXNjYXBlIiAmJiBwYW5lbC5jbGFzc0xpc3QuY29udGFpbnMoInpwLW9wZW4iKSAmJiAoIW1vZGFsfHxtb2RhbC5oaWRkZW4pKSBjbG9zZVBhbmVsKCk7CiAg
fSk7CiAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKXsKICAgIHBhbmVsLmNsYXNzTGlzdC50b2dnbGUoInpwLW9wZW4iLCB0aXRsZS50ZXh0Q29u
dGVudCE9PWJhc2UudGl0bGUpOwogIH0pLm9ic2VydmUodGl0bGUse2NoaWxkTGlzdDp0cnVlLGNoYXJhY3RlckRhdGE6dHJ1ZSxzdWJ0cmVlOnRydWV9KTsK
CiAgLyogLS0tLS0tLS0tLSAyLiB0aGUgbWFwIGl0c2VsZiAtLS0tLS0tLS0tICovCiAgZnVuY3Rpb24gYm94KGVsKXsgdHJ5eyB2YXIgYj1lbC5nZXRCQm94
KCk7IGlmKCFiLndpZHRoJiYhYi5oZWlnaHQpIHJldHVybiBudWxsOyByZXR1cm4gYjsgfWNhdGNoKGUpeyByZXR1cm4gbnVsbDsgfSB9CiAgZnVuY3Rpb24g
aGlkZShlbCl7IGVsLnN0eWxlLmRpc3BsYXk9Im5vbmUiOyBlbC5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpOyBlbC5yZW1vdmVBdHRyaWJ1
dGUoInRhYmluZGV4Iik7IH0KCiAgLyogQWJ1IERoYWJpIEhpbGwgc2hpcHMgYXMgYSBuYXJyb3cgYmFuZCBodWdnaW5nIHRoZSB0cmFjayBlZGdlLiBUaGUg
b2ZmaWNpYWwgbWFwIGRyYXdzIGl0IGFzCiAgICAgdGhlIGxhcmdlIGFyZWEgaXQgaXMsIHNvIHRoZSB0cmFjay1zaWRlIGVkZ2UgaXMgbGVmdCBleGFjdGx5
IHdoZXJlIGl0IGlzIGFuZCB0aGUgZmFyIGVkZ2UgaXMKICAgICBwdXNoZWQgYXdheSBmcm9tIGl0LiAqLwogIGZ1bmN0aW9uIGQyKGEsYil7IHJldHVybiAo
YS54LWIueCkqKGEueC1iLngpKyhhLnktYi55KSooYS55LWIueSk7IH0KICBmdW5jdGlvbiB4eShhKXsgcmV0dXJuIGEueC50b0ZpeGVkKDIpKyIgIithLnku
dG9GaXhlZCgyKTsgfQogIGZ1bmN0aW9uIHdpZGVuKGVsLGYpewogICAgdmFyIEw9ZWwuZ2V0VG90YWxMZW5ndGgmJmVsLmdldFRvdGFsTGVuZ3RoKCk7IGlm
KCFMKSByZXR1cm47CiAgICB2YXIgTj0xMjAscD1bXSxpLGo7CiAgICBmb3IoaT0wO2k8TjtpKyspeyB2YXIgcT1lbC5nZXRQb2ludEF0TGVuZ3RoKEwqaS9O
KTsgcC5wdXNoKHt4OnEueCx5OnEueX0pOyB9CiAgICB2YXIgZmFyPTAsYmVzdD0tMTsKICAgIGZvcihpPTE7aTxOO2krKyl7IHZhciBkPWQyKHBbaV0scFsw
XSk7IGlmKGQ+YmVzdCl7IGJlc3Q9ZDsgZmFyPWk7IH0gfQogICAgaWYoZmFyPDEwfHxmYXI+Ti0xMCkgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgIC8q
IG5vdCBhIGJhbmQsIGxlYXZlIGl0IGFsb25lICovCiAgICB2YXIgb3V0ZXI9cC5zbGljZSgwLGZhcisxKSwgaW5uZXI9cC5zbGljZShmYXIrMSk7CiAgICBp
Zihpbm5lci5sZW5ndGg8NikgcmV0dXJuOwoKICAgIC8qIG91dHdhcmQgZGlyZWN0aW9uIGFuZCBsb2NhbCBiYW5kIHdpZHRoLCB0YWtlbiBmcm9tIHRoZSBu
ZWFyZXN0IHBvaW50IG9uIHRoZSB0cmFjay1zaWRlIGVkZ2UgKi8KICAgIHZhciBkaXI9W10sd2lkPVtdOwogICAgb3V0ZXIuZm9yRWFjaChmdW5jdGlvbihh
KXsKICAgICAgdmFyIHE9aW5uZXJbMF0sYmQ9SW5maW5pdHk7CiAgICAgIGlubmVyLmZvckVhY2goZnVuY3Rpb24oYyl7IHZhciBkPWQyKGMsYSk7IGlmKGQ8
YmQpeyBiZD1kOyBxPWM7IH0gfSk7CiAgICAgIHZhciBkeD1hLngtcS54LCBkeT1hLnktcS55LCBtPU1hdGguc3FydChkeCpkeCtkeSpkeSl8fDE7CiAgICAg
IGRpci5wdXNoKHt4OmR4L20seTpkeS9tfSk7IHdpZC5wdXNoKG0pOwogICAgfSk7CiAgICAvKiB0aGUgdHdvIGVuZCBjYXBzIGZsaXAgdGhhdCBkaXJlY3Rp
b24gYW5kIHNwaWtlIHRoZSBvZmZzZXQsIHNvIHNtb290aCBpdCBhbG9uZyB0aGUgcnVuICovCiAgICB2YXIgc209W107CiAgICBmb3IoaT0wO2k8ZGlyLmxl
bmd0aDtpKyspewogICAgICB2YXIgc3g9MCxzeT0wOwogICAgICBmb3Ioaj1NYXRoLm1heCgwLGktNCk7ajw9TWF0aC5taW4oZGlyLmxlbmd0aC0xLGkrNCk7
aisrKXsgc3grPWRpcltqXS54OyBzeSs9ZGlyW2pdLnk7IH0KICAgICAgdmFyIG0yPU1hdGguc3FydChzeCpzeCtzeSpzeSl8fDE7CiAgICAgIHNtLnB1c2go
e3g6c3gvbTIseTpzeS9tMn0pOwogICAgfQogICAgdmFyIG1lZD13aWQuc2xpY2UoKS5zb3J0KGZ1bmN0aW9uKGEsYil7IHJldHVybiBhLWI7IH0pW01hdGgu
Zmxvb3Iod2lkLmxlbmd0aC8yKV07CiAgICB2YXIgcHVzaD1tZWQqKGYtMSksIG49b3V0ZXIubGVuZ3RoOwogICAgdmFyIG1vdmVkPW91dGVyLm1hcChmdW5j
dGlvbihhLGkpewogICAgICAvKiB0YXBlciB0byBub3RoaW5nIGF0IGJvdGggZW5kcyBzbyB0aGUgYXJlYSBjbG9zZXMgYmFjayBvbnRvIHRoZSBiYW5kICov
CiAgICAgIHZhciBnPU1hdGgubWluKDEsTWF0aC5tYXgoMCxNYXRoLm1pbihpLG4tMS1pKS8obiowLjE4KSkpOwogICAgICBnPWcqZyooMy0yKmcpOwogICAg
ICByZXR1cm4ge3g6YS54K3NtW2ldLngqcHVzaCpnLCB5OmEueStzbVtpXS55KnB1c2gqZ307CiAgICB9KTsKICAgIGVsLnNldEF0dHJpYnV0ZSgiZCIsIk0g
Iittb3ZlZC5tYXAoeHkpLmpvaW4oIiBMICIpKyIgTCAiK2lubmVyLm1hcCh4eSkuam9pbigiIEwgIikrIiBaIik7CiAgfQoKICBmdW5jdGlvbiBsYWJlbChz
dmcsdGV4dCx4LHksc2l6ZSl7CiAgICB2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoTlMsInRleHQiKTsKICAgIHQuc2V0QXR0cmlidXRlKCJkYXRh
LWVzLWxhYmVsIiwiMSIpOwogICAgdC5zZXRBdHRyaWJ1dGUoIngiLHgpOyB0LnNldEF0dHJpYnV0ZSgieSIseSk7CiAgICB0LnNldEF0dHJpYnV0ZSgidGV4
dC1hbmNob3IiLCJtaWRkbGUiKTsKICAgIHQuc2V0QXR0cmlidXRlKCJwb2ludGVyLWV2ZW50cyIsIm5vbmUiKTsKICAgIC8qIEltcGFjdCBpbiBvcmFuZ2Us
IG5vIG91dGxpbmU6IHRoZSBzYW1lIGZhY2UgdGhlIGNhcmQgaGVhZGluZ3MgdXNlICovCiAgICB0LnN0eWxlLmZpbGw9IiNGRjQ3MTMiOyB0LnN0eWxlLnN0
cm9rZT0ibm9uZSI7CiAgICB0LnN0eWxlLmZvbnRGYW1pbHk9IkltcGFjdCwnQW50b24nLCdBcmlhbCBOYXJyb3cnLHNhbnMtc2VyaWYiOyB0LnN0eWxlLmZv
bnRXZWlnaHQ9IjQwMCI7CiAgICB0LnN0eWxlLmZvbnRTaXplPXNpemUrInB4IjsgdC5zdHlsZS5sZXR0ZXJTcGFjaW5nPShzaXplKjAuMDMpKyJweCI7CiAg
ICAvKiB0d28gbGluZXMsIHNvIGEgZnVsbCBzdGFuZCBuYW1lIHNpdHMgYmVzaWRlIGl0cyBoYXRjaCBpbnN0ZWFkIG9mIGFjcm9zcyB0aGUgY2lyY3VpdCAq
LwogICAgdmFyIHc9dGV4dC5zcGxpdCgiICIpLCBsaW5lcz1bdGV4dF07CiAgICBpZih0ZXh0Lmxlbmd0aD4xMCYmdy5sZW5ndGg+MSl7CiAgICAgIHZhciBj
dXQ9MTsKICAgICAgaWYody5sZW5ndGg+MikgY3V0PSh3WzBdKyIgIit3WzFdKS5sZW5ndGg8PTEwPzI6MTsKICAgICAgbGluZXM9W3cuc2xpY2UoMCxjdXQp
LmpvaW4oIiAiKSwgdy5zbGljZShjdXQpLmpvaW4oIiAiKV07CiAgICB9CiAgICBsaW5lcy5mb3JFYWNoKGZ1bmN0aW9uKGxpbmUsaSl7CiAgICAgIHZhciBz
PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhOUywidHNwYW4iKTsKICAgICAgcy5zZXRBdHRyaWJ1dGUoIngiLHgpOwogICAgICBzLnNldEF0dHJpYnV0ZSgi
eSIseSsoaS0obGluZXMubGVuZ3RoLTEpLzIpKnNpemUqMS4wOCk7CiAgICAgIHMuc2V0QXR0cmlidXRlKCJkb21pbmFudC1iYXNlbGluZSIsIm1pZGRsZSIp
OwogICAgICBzLnRleHRDb250ZW50PWxpbmU7CiAgICAgIHQuYXBwZW5kQ2hpbGQocyk7CiAgICB9KTsKICAgIHN2Zy5hcHBlbmRDaGlsZCh0KTsKICAgIHJl
dHVybiB0OwogIH0KCiAgZnVuY3Rpb24gZWwodGFnLGF0dHJzKXsKICAgIHZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhOUyx0YWcpOwogICAgT2Jq
ZWN0LmtleXMoYXR0cnMpLmZvckVhY2goZnVuY3Rpb24oayl7IGUuc2V0QXR0cmlidXRlKGssYXR0cnNba10pOyB9KTsKICAgIGUuc2V0QXR0cmlidXRlKCJk
YXRhLWVzLXJpbmciLCIxIik7CiAgICByZXR1cm4gZTsKICB9CiAgLyogVGhlIGdyb3VuZHMgb3V0bGluZSwgY29udHJhY3RlZCBieSBSSU5HX1cgYW5kIHRo
ZSBkaWZmZXJlbmNlIHJlY29sb3VyZWQuIERvbmUgd2l0aCBjbGlwcGVkCiAgICAgc3Ryb2tlcyByYXRoZXIgdGhhbiBhbiBvZmZzZXQgcGF0aDogYSBzdHJv
a2Ugc2l0cyBoYWxmIGluc2lkZSB0aGUgZWRnZSwgYW5kIGNsaXBwaW5nIHRvIHRoZQogICAgIG91dGxpbmUga2VlcHMgb25seSB0aGF0IGlubmVyIGhhbGYs
IHdoaWNoIGlzIGV4YWN0bHkgdGhlIGJhbmQgYmV0d2VlbiB0aGUgb3V0bGluZSBhbmQgaXRzCiAgICAgY29udHJhY3Rpb24uIExpZ2h0IGF0IGJvdGggZWRn
ZXMgb2YgdGhlIGJhbmQgc28gaXQgcmVhZHMgYXMgYSByb2FkLiAqLwogIGZ1bmN0aW9uIHJpbmcoc3ZnKXsKICAgIHZhciBiYXNlPXN2Zy5xdWVyeVNlbGVj
dG9yKCIudHJhY2stZHJpdmUiKTsgaWYoIWJhc2UpIHJldHVybjsKICAgIHZhciBkPWJhc2UuZ2V0QXR0cmlidXRlKCJkIik7IGlmKCFkKSByZXR1cm47CiAg
ICBbXS5zbGljZS5jYWxsKHN2Zy5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1lcy1yaW5nXSIpKS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyBlLnJlbW92ZSgpOyB9
KTsKICAgIHZhciBkZWZzPXN2Zy5xdWVyeVNlbGVjdG9yKCJkZWZzIik7CiAgICBpZighZGVmcyl7IGRlZnM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKE5T
LCJkZWZzIik7IHN2Zy5pbnNlcnRCZWZvcmUoZGVmcyxzdmcuZmlyc3RDaGlsZCk7IH0KICAgIHZhciBjcD1lbCgiY2xpcFBhdGgiLHtpZDoiZXNSaW5nQ2xp
cCJ9KTsgY3AuYXBwZW5kQ2hpbGQoZWwoInBhdGgiLHtkOmR9KSk7IGRlZnMuYXBwZW5kQ2hpbGQoY3ApOwogICAgdmFyIGc9ZWwoImciLHt9KTsKICAgIGcu
YXBwZW5kQ2hpbGQoZWwoInBhdGgiLHtkOmQsZmlsbDpSSU5HX0l9KSk7CiAgICB2YXIgYz1lbCgiZyIseyJjbGlwLXBhdGgiOiJ1cmwoI2VzUmluZ0NsaXAp
In0pOwogICAgYy5hcHBlbmRDaGlsZChlbCgicGF0aCIse2Q6ZCxmaWxsOiJub25lIixzdHJva2U6UklOR19MLCJzdHJva2Utd2lkdGgiOjIqUklOR19XLCJz
dHJva2UtbGluZWpvaW4iOiJyb3VuZCJ9KSk7CiAgICBjLmFwcGVuZENoaWxkKGVsKCJwYXRoIix7ZDpkLGZpbGw6Im5vbmUiLHN0cm9rZTpSSU5HX1QsInN0
cm9rZS13aWR0aCI6MipSSU5HX1ctMywic3Ryb2tlLWxpbmVqb2luIjoicm91bmQifSkpOwogICAgYy5hcHBlbmRDaGlsZChlbCgicGF0aCIse2Q6ZCxmaWxs
OiJub25lIixzdHJva2U6UklOR19MLCJzdHJva2Utd2lkdGgiOjMsInN0cm9rZS1saW5lam9pbiI6InJvdW5kIn0pKTsKICAgIGcuYXBwZW5kQ2hpbGQoYyk7
CgogICAgLyogc21hbGwgZ29sZCBwb2ludGVycyBhbG9uZyB0aGUgbWlkZGxlIG9mIHRoZSBiYW5kLiBUaGUgb3V0bGluZSBpcyB0cmFjZWQgaW4gdGhlIGRy
aXZpbmcKICAgICAgIGRpcmVjdGlvbiAoZG93biB0aGUgcGl0IHN0cmFpZ2h0IHRoZSB3YXkgdGhlIHZlbnVlJ3Mgb3duIGFycm93IHBvaW50cykgd2l0aCB0
aGUgZ3JvdW5kcyBvbgogICAgICAgaXRzIGxlZnQsIHNvIHRoZSB0YW5nZW50IGlzIHRoZSBkaXJlY3Rpb24gYW5kIHRoZSBsZWZ0IG5vcm1hbCBwb2ludHMg
aW50byB0aGUgYmFuZC4gVGhlCiAgICAgICBjb3B5IGluIHRoZSBjbGlwUGF0aCBpcyBtZWFzdXJlZCByYXRoZXIgdGhhbiB0aGUgaGlkZGVuIG9yaWdpbmFs
LiAqLwogICAgdmFyIGdlbz1jcC5maXJzdENoaWxkLCBMPWdlby5nZXRUb3RhbExlbmd0aCgpOwogICAgaWYoTCl7CiAgICAgIHZhciBuPTE0LCBzdGVwPUwv
biwgb2ZmPVJJTkdfVy8yLCBwdD1zdmcuY3JlYXRlU1ZHUG9pbnQoKSwgaW5zaWRlPTAsIGNhbmQ9W107CiAgICAgIGZvcih2YXIgaT0wO2k8bjtpKyspewog
ICAgICAgIHZhciBhdD1pKnN0ZXArc3RlcC8yLCBwPWdlby5nZXRQb2ludEF0TGVuZ3RoKGF0KSwgcT1nZW8uZ2V0UG9pbnRBdExlbmd0aCgoYXQrMyklTCk7
CiAgICAgICAgdmFyIGR4PXEueC1wLngsIGR5PXEueS1wLnksIG09TWF0aC5zcXJ0KGR4KmR4K2R5KmR5KXx8MTsgZHgvPW07IGR5Lz1tOwogICAgICAgIHZh
ciBjeD1wLngrZHkqb2ZmLCBjeT1wLnktZHgqb2ZmOwogICAgICAgIHB0Lng9Y3g7IHB0Lnk9Y3k7IGlmKGdlby5pc1BvaW50SW5GaWxsKHB0KSkgaW5zaWRl
Kys7CiAgICAgICAgY2FuZC5wdXNoKHt4OmN4LHk6Y3ksYTpNYXRoLmF0YW4yKGR5LGR4KSoxODAvTWF0aC5QSSxweDpwLngscHk6cC55LGR4OmR4LGR5OmR5
fSk7CiAgICAgIH0KICAgICAgdmFyIGZsaXA9aW5zaWRlPG4vMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBvdXRsaW5lIHJhbiB0aGUg
b3RoZXIgd2F5IHJvdW5kICovCiAgICAgIHZhciBib3hlcz1bXS5zbGljZS5jYWxsKHN2Zy5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1lcy1sYWJlbF0iKSku
bWFwKGZ1bmN0aW9uKHQpeyByZXR1cm4gdC5nZXRCQm94KCk7IH0pOwogICAgICBjYW5kLmZvckVhY2goZnVuY3Rpb24oYzIpewogICAgICAgIHZhciBjeD1m
bGlwP2MyLnB4LWMyLmR5Km9mZjpjMi54LCBjeT1mbGlwP2MyLnB5K2MyLmR4Km9mZjpjMi55OwogICAgICAgIGlmKE1hdGguc3FydCgoY3gtMjYyKSooY3gt
MjYyKSsoY3ktMTQzKSooY3ktMTQzKSk8NjApIHJldHVybjsgICAvKiBsZWF2ZSB0aGUgZmxhZyBhbG9uZSAqLwogICAgICAgIGlmKGJveGVzLnNvbWUoZnVu
Y3Rpb24oYil7IHJldHVybiBjeD5iLngtOCYmY3g8Yi54K2Iud2lkdGgrOCYmY3k+Yi55LTgmJmN5PGIueStiLmhlaWdodCs4OyB9KSkgcmV0dXJuOwogICAg
ICAgIGcuYXBwZW5kQ2hpbGQoZWwoInBvbHlnb24iLHtwb2ludHM6IjUuNSwwIC00LDMuOCAtNCwtMy44IixmaWxsOiIjRjRCMjIzIiwKICAgICAgICAgIHRy
YW5zZm9ybToidHJhbnNsYXRlKCIrY3gudG9GaXhlZCgxKSsiICIrY3kudG9GaXhlZCgxKSsiKSByb3RhdGUoIitjMi5hLnRvRml4ZWQoMSkrIikifSkpOwog
ICAgICB9KTsKICAgIH0KICAgIGJhc2UucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiYXNlLm5leHRTaWJsaW5nKTsKICB9CgogIHZhciBkcmF3bj1mYWxz
ZTsKICBmdW5jdGlvbiBwcnVuZSgpewogICAgdmFyIHdyYXA9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1hcFdyYXAiKTsKICAgIHZhciBzdmc9d3JhcCYm
d3JhcC5xdWVyeVNlbGVjdG9yKCJzdmciKTsKICAgIHZhciB6b25lcz1zdmc/W10uc2xpY2UuY2FsbChzdmcucXVlcnlTZWxlY3RvckFsbCgiLmVzLXpvbmUi
KSk6W107CiAgICBpZighem9uZXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICB2YXIga2VlcD1bXSxkcm9wPVtdOwogICAgem9uZXMuZm9yRWFjaChmdW5j
dGlvbih6KXsgKHouZGF0YXNldC5lc0lkJiZCWVt6LmRhdGFzZXQuZXNJZF0/a2VlcDpkcm9wKS5wdXNoKHopOyB9KTsKICAgIGlmKCFrZWVwLmxlbmd0aCkg
cmV0dXJuIGZhbHNlOwoKICAgIC8qIHRoZSB2ZW51ZSBmaWxlIGRyYXdzIHRoZSBIaWxsIGFzIGFuIG91dGxpbmUgYW5kIHRoZSByZXN0IGhhdGNoZWQ7IExv
dWlzIHdhbnRzIHRoZW0gYWxpa2UgKi8KICAgIGtlZXAuZm9yRWFjaChmdW5jdGlvbih6KXsgei5jbGFzc0xpc3QucmVtb3ZlKCJlcy1vdXRsaW5lIik7IH0p
OwoKICAgIGtlZXAuZm9yRWFjaChmdW5jdGlvbih6KXsKICAgICAgaWYoei5kYXRhc2V0LmVzSWQ9PT1ISUxMJiYhei5oYXNBdHRyaWJ1dGUoImRhdGEtZXMt
d2lkZSIpKXsKICAgICAgICB3aWRlbih6LDMuNSk7IHouc2V0QXR0cmlidXRlKCJkYXRhLWVzLXdpZGUiLCIxIik7CiAgICAgIH0KICAgIH0pOwoKICAgIC8q
IG9uZSBib3ggcGVyIHpvbmUuIFRoZSB2ZW51ZSBmaWxlIGdpdmVzIHRoZSBNYWluIEdyYW5kc3RhbmQgYSBzdHJheSAyMXgyMSBkb3Qgb24gdGhlIGZhcgog
ICAgICAgc2lkZSBvZiB0aGUgY2lyY3VpdCwgd2hpY2ggc2hhcmVkIHRoZSB6b25lIGlkIGFuZCBzbyBsaXQgdXAgd2hlbiB0aGUgc3RhbmQgd2FzIHNlbGVj
dGVkLAogICAgICAgYW5kIHRoZSBTdW5zZXQgTG91bmdlIGEgc2Vjb25kIHF1YWQgYXdheSBmcm9tIHRoZSBsb3VuZ2UgaXRzZWxmLiBMb3VpcyB3YW50cyBl
YWNoIHN0YW5kCiAgICAgICByZWFkaW5nIGFzIGEgc2luZ2xlIGJveCwgc28gb25seSB0aGUgbGFyZ2VzdCBzaGFwZSBvZiBlYWNoIHpvbmUgaXMga2VwdC4g
Ki8KICAgIHZhciBiaWc9e307CiAgICBrZWVwLmZvckVhY2goZnVuY3Rpb24oeil7CiAgICAgIHZhciBiPWJveCh6KTsgaWYoIWIpIHJldHVybjsKICAgICAg
dmFyIGE9Yi53aWR0aCpiLmhlaWdodCwgaWQ9ei5kYXRhc2V0LmVzSWQ7CiAgICAgIGlmKCEoaWQgaW4gYmlnKXx8YT5iaWdbaWRdKSBiaWdbaWRdPWE7CiAg
ICB9KTsKICAgIHZhciBsaXZlPVtdLGJlc3Q9e307CiAgICBrZWVwLmZvckVhY2goZnVuY3Rpb24oeil7CiAgICAgIHZhciBiPWJveCh6KSwgaWQ9ei5kYXRh
c2V0LmVzSWQ7CiAgICAgIGlmKCFifHxiZXN0W2lkXXx8Yi53aWR0aCpiLmhlaWdodDxiaWdbaWRdKXsgaGlkZSh6KTsgcmV0dXJuOyB9CiAgICAgIGJlc3Rb
aWRdPTE7IGxpdmUucHVzaCh6KTsKICAgIH0pOwoKICAgIC8qIGxhYmVsIGFuY2hvcjogdGhlIGNlbnRyZSBvZiBlYWNoIHpvbmUncyBsYXJnZXN0IHNoYXBl
LiBOb3QgdGhlIHVuaW9uIG9mIGl0cyBzaGFwZXMsIHdoaWNoCiAgICAgICBmb3IgYSB6b25lIGRyYXduIGFzIHR3byBibG9ja3MgbGFuZHMgb24gdGhlIGVt
cHR5IHRyYWNrIGJldHdlZW4gdGhlbS4gKi8KICAgIHZhciBzcGFucz17fTsKICAgIGxpdmUuZm9yRWFjaChmdW5jdGlvbih6KXsKICAgICAgdmFyIGI9Ym94
KHopOyBpZighYikgcmV0dXJuOwogICAgICB2YXIgaWQ9ei5kYXRhc2V0LmVzSWQsIGE9Yi53aWR0aCpiLmhlaWdodCwgcz1zcGFuc1tpZF07CiAgICAgIGlm
KCFzfHxhPnMuYXJlYSkgc3BhbnNbaWRdPXt4OmIueCtiLndpZHRoLzIseTpiLnkrYi5oZWlnaHQvMixhcmVhOmF9OwogICAgfSk7CgogICAgZHJvcC5mb3JF
YWNoKGhpZGUpOwoKICAgIC8qIHRoZSB2ZW51ZSdzIG93biBsYWJlbHMgbmFtZSB6b25lcyB3ZSBubyBsb25nZXIgc2hvdyBhbmQgc2l0IG91dHNpZGUgdGhl
IHpvbmUgcGF0aHMsIHNvIHRoZXkKICAgICAgIGNhbm5vdCBiZSBtYXRjaGVkIGJhY2sgcmVsaWFibHkuIEhpZGUgdGhlbSBhbGwgYW5kIGRyYXcgb3VyIG93
bi4gKi8KICAgIFtdLnNsaWNlLmNhbGwoc3ZnLnF1ZXJ5U2VsZWN0b3JBbGwoInRleHQiKSkuZm9yRWFjaChmdW5jdGlvbih0KXsKICAgICAgaWYoIXQuZ2V0
QXR0cmlidXRlKCJkYXRhLWVzLWxhYmVsIikpIHQuc3R5bGUuZGlzcGxheT0ibm9uZSI7CiAgICB9KTsKICAgIGRyYXdMYWJlbHMoc3ZnLHNwYW5zKTsKICAg
IHJpbmcoc3ZnKTsKCiAgICAvKiBwcmlvcml0eS16b25lIHF1aWNrIGxpbmtzOiBrZWVwIG9ubHkgem9uZXMgc3RpbGwgb24gdGhlIG1hcCAqLwogICAgdmFy
IGxpbmtzPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6cFF1aWNrTGlua3MiKTsKICAgIGlmKGxpbmtzKXsKICAgICAgdmFyIG5hbWVzPXt9OyBPYmplY3Qu
a2V5cyhzcGFucykuZm9yRWFjaChmdW5jdGlvbihpZCl7IG5hbWVzW0JZW2lkXVsxXS50b0xvd2VyQ2FzZSgpXT0xOyB9KTsKICAgICAgW10uc2xpY2UuY2Fs
bChsaW5rcy5xdWVyeVNlbGVjdG9yQWxsKCJidXR0b24iKSkuZm9yRWFjaChmdW5jdGlvbihiKXsKICAgICAgICBpZighbmFtZXNbKGIudGV4dENvbnRlbnR8
fCIiKS50cmltKCkudG9Mb3dlckNhc2UoKV0pIGIuc3R5bGUuZGlzcGxheT0ibm9uZSI7CiAgICAgIH0pOwogICAgfQogICAgZHJhd249dHJ1ZTsKICAgIGxh
c3RTcGFucz1zcGFuczsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgdmFyIGxhc3RTcGFucz1udWxsOwogIGZ1bmN0aW9uIGRyYXdMYWJlbHMoc3ZnLHNwYW5z
KXsKICAgIFtdLnNsaWNlLmNhbGwoc3ZnLnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWVzLWxhYmVsXSIpKS5mb3JFYWNoKGZ1bmN0aW9uKHQpeyB0LnJlbW92
ZSgpOyB9KTsKICAgIC8qIHNpemVkIGZyb20gdGhlIGxpdmUgc2NhbGU6IHRoZSB2aWV3Qm94IGlzIGFib3V0IDE1MDkgdW5pdHMgd2lkZSBhbmQgcmVuZGVy
cyBuZWFyIDg2MHB4LCBzbwogICAgICAgYSBDU1MtcGl4ZWwgZm9udC1zaXplIGhlcmUgd291bGQgZHJhdyBhdCByb3VnaGx5IGhhbGYgb2Ygd2hhdCBpdCBz
YXlzICovCiAgICB2YXIgdmI9c3ZnLnZpZXdCb3gmJnN2Zy52aWV3Qm94LmJhc2VWYWwsIHI9c3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgdmFy
IGs9KHZiJiZ2Yi53aWR0aCYmci53aWR0aCk/ci53aWR0aC92Yi53aWR0aDoxOwogICAgaWYoIWt8fCFpc0Zpbml0ZShrKSkgaz0xOwogICAgdmFyIHNpemU9
TWF0aC5taW4oMTgvayw0OCk7CiAgICBPYmplY3Qua2V5cyhzcGFucykuZm9yRWFjaChmdW5jdGlvbihpZCl7CiAgICAgIHZhciBzPXNwYW5zW2lkXSwgej1C
WVtpZF07CiAgICAgIGxhYmVsKHN2Zyx6WzJdLHMueCt6WzRdLHMueSt6WzVdLHNpemUpOwogICAgfSk7CiAgfQoKICBpZighcHJ1bmUoKSl7CiAgICB2YXIg
dHJpZXM9MCwgaXY9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsgaWYocHJ1bmUoKXx8Kyt0cmllcz40MCkgY2xlYXJJbnRlcnZhbChpdik7IH0sNDAwKTsKICB9
CiAgdmFyIHJ0PW51bGw7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsZnVuY3Rpb24oKXsKICAgIGlmKCFkcmF3bnx8IWxhc3RTcGFucykg
cmV0dXJuOwogICAgY2xlYXJUaW1lb3V0KHJ0KTsKICAgIHJ0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgdmFyIHN2Zz1kb2N1bWVudC5xdWVyeVNl
bGVjdG9yKCIjbWFwV3JhcCBzdmciKTsKICAgICAgaWYoc3ZnKSBkcmF3TGFiZWxzKHN2ZyxsYXN0U3BhbnMpOwogICAgfSwyMDApOwogIH0pOwovKiAtLS0t
LS0tLS0tIDMuIHRocmVlIHN1aXRlcyBvbiB0aGUgbWFwIChDTC0yMDI2MTAwNi0wNSwgdjIgQ0wtMjAyNjEwMDYtMDksIHYzIENMLTIwMjYxMDA2LTEwKSAt
LS0tLS0tLS0tICovCiAgLyogVGhlIE1haW4gR3JhbmRzdGFuZCBiYW5kIGluIHRoZSB2ZW51ZSBmaWxlIHJ1bnMgZnJvbSBpdHMgdG9wIGVkZ2UgKDI4OSw3
NCktKDI2Niw4MykgdG8gdGhlIGJvdHRvbS1sZWZ0IGNvcm5lcgogICAgICgzNzYsMzEwKTsgaXRzIGNlbnRyZWxpbmUsIG1lYXN1cmVkIG9uIDYgT2N0IDIw
MjYsIGdvZXMgZnJvbSAoMjc3LDc3LjUpIHRvICgzODcsMzA0LjUpLCAyNSB1bml0cyB3aWRlLCBhdCA2NAogICAgIGRlZ3JlZXMuIFR3byBzb2xpZCBvcmFu
Z2UgYm94ZXMgc2l0IG9uIHRoYXQgbGluZSBhdCAyNy41JSBhbmQgNjklIG9mIGl0cyBsZW5ndGgsIHRoZSBwb3NpdGlvbnMgTG91aXMgbWFya2VkLiBUaGUK
ICAgICBTaGFtcyBTdWl0ZSBib3ggc2l0cyBhYm92ZSB0aGUgYmFjayBzdHJhaWdodCwgd2hpY2ggcnVucyBhbG9uZyB5ID0gLTYwLCB0byB0aGUgbGVmdCBv
ZiB0aGUgU3Vuc2V0IExvdW5nZS4gKi8KICB2YXIgU1VJVEVfTElORT17eDA6Mjc3LHkwOjc3LjUseDE6Mzg3LHkxOjMwNC41LGFuZ2xlOjYzLjl9OwogIHZh
ciBTVUlURVM9WwogICAge2lkOiJlcy1zdWl0ZS1tMTciLG5hbWU6Ik0xNyBQb2RpdW0gU3VpdGUiLGxhYmVsVGV4dDoiTTE3IFBPRElVTSIsY29kZToiU1RF
LTAxIix0OjAuMjc1LHNvbGlkOnRydWUsCiAgICAgY2F0OiJNMTcgUG9kaXVtIFN1aXRlIixkZXNjOiJBIGdsYXNzLWZyb250ZWQgc3VpdGUgaW4gdGhlIE1h
aW4gR3JhbmRzdGFuZCBidWlsZGluZyBvdmVyIHRoZSBzdGFydC1maW5pc2ggbGluZSwgd2l0aCB0aGUgcGl0IGxhbmUgb3Bwb3NpdGUgYW5kIHRoZSBwb2Rp
dW0gY2VyZW1vbnkgaW4gZnJvbnQgb2YgeW91LiIsCiAgICAgc3VtOiJIb3N0ZWQgZGluaW5nIGluc2lkZSwgcmVzZXJ2ZWQgc2VhdHMgb3V0c2lkZSwgdGhl
IGdyaWQsIHRoZSBwaXQgc3RvcHMgYW5kIHRoZSBwb2RpdW0gZnJvbSBvbmUgc3BvdC4iLAogICAgIGluYzpbIkZvdXItZGF5IGFjY2VzcywgVGh1cnNkYXkg
dG8gU3VuZGF5IiwiSG9zdGVkIGRpbmluZyBhbmQgYmV2ZXJhZ2VzIGluIHRoZSBzdWl0ZSIsIlJlc2VydmVkIHNlYXRpbmcgb3ZlciB0aGUgc3RhcnQtZmlu
aXNoIGxpbmUiLCJHZW5lcmFsIGFkbWlzc2lvbiB0byB0aGUgQWZ0ZXItUmFjZSBDb25jZXJ0cyIsIk9uZSBkYXkgYXQgdGVhbUxhYiBQaGVub21lbmEgb3Ig
YSBZYXMgSXNsYW5kIHRoZW1lIHBhcmsiLCJGMSBGYW56b25lIGFuZCBhbGwgT2FzaXMgYXJlYXMiXSwKICAgICBpZGVhbDpbIlBvZGl1bSB2aWV3cyIsIkNs
aWVudCBob3N0aW5nIiwiUmFjZS1sb25nIGNvbWZvcnQiXSxub3RlOiJGdWxsIGluY2x1c2lvbnMgYW5kIHByaWNpbmcgY29uZmlybWVkIG9uIGVucXVpcnku
IiwKICAgICBzaG90czpbe3NyYzoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDYvQURHUF9XZWJfTWFpbl9HcmFu
ZHN0YW5kXzE5MjB4Njk0cHhfVjIuanBnIixjYXA6IlRoZSBwaXQgc3RyYWlnaHQsIHBpdCBidWlsZGluZyBhbmQgcG9kaXVtIGZyb20gdGhlIE1haW4gR3Jh
bmRzdGFuZCJ9LHtzcmM6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA2LzE4MDQyMTU2NDkuanBnIixjYXA6IlRo
ZSBwb2RpdW0gY2VyZW1vbnkgYWNyb3NzIHRoZSBzdGFydC1maW5pc2ggc3RyYWlnaHQifSx7c3JjOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250
ZW50L3VwbG9hZHMvMjAyNi8wNy8zMTI5OS1tYWluX2dyYW5kc3RhbmRfeWFzX21hcmluYS03ZmZlYmZjMjBhOTU1ODRhOWRkZWI4ODExOWJkNDhiZi0xLmpw
ZyIsY2FwOiJUaGUgcmFjZSBzdGFydCBmcm9tIHRoZSBNYWluIEdyYW5kc3RhbmQifV0sdXJsOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS9mMS1tMTctcG9k
aXVtLXN1aXRlLyIsbGFiZWxEeDotNDAsbGFiZWxEeTotMzYsbGFiZWxBbmNob3I6ImVuZCJ9LAogICAge2lkOiJlcy1zdWl0ZS1waXRsYW5lIixuYW1lOiJQ
aXRsYW5lIFZpZXdzIFN1aXRlIixsYWJlbFRleHQ6IlBJVExBTkV8VklFV1MiLGNvZGU6IlNURS0wMiIsdDowLjY5LHNvbGlkOnRydWUsCiAgICAgY2F0OiJQ
aXRsYW5lIFZpZXdzIE0yMCBTdWl0ZSIsZGVzYzoiQW4gZWxlZ2FudCBpbmRvb3IgbG91bmdlIHdpdGggZ291cm1ldCBkaW5pbmcgYW5kIHByZW1pdW0gYmV2
ZXJhZ2VzLCBhbmQgYSBiYWxjb255IG92ZXIgdGhlIGdyaWQgZm9yIHJhY2UgbGF1bmNoZXMgYW5kIHBpdCBzdG9wcy4iLAogICAgIHN1bToiQSByZWZpbmVk
IHZhbnRhZ2UgcG9pbnQgb3ZlciB0aGUgc3RhcnRpbmcgZ3JpZCwgd2hlcmUgYW50aWNpcGF0aW9uIGJ1aWxkcyBhbmQgd2lubmVycyBhcmUgZGVjaWRlZC4i
LAogICAgIGluYzpbIkZvdXItZGF5IGFjY2VzcywgVGh1cnNkYXkgdG8gU3VuZGF5IiwiSW5kb29yIGxvdW5nZSB3aXRoIGdvdXJtZXQgZGluaW5nIGFuZCBw
cmVtaXVtIGJldmVyYWdlcyIsIkJhbGNvbnkgb3Zlcmxvb2tpbmcgdGhlIHBpdCBsYW5lIGdhcmFnZXMiLCJHZW5lcmFsIGFkbWlzc2lvbiB0byB0aGUgQWZ0
ZXItUmFjZSBDb25jZXJ0cyIsIk9uZSBkYXkgYXQgdGVhbUxhYiBQaGVub21lbmEgb3IgYSBZYXMgSXNsYW5kIHRoZW1lIHBhcmsiLCJFbnRyeSB0byB0aGUg
TG91dnJlIEFidSBEaGFiaSwgUWFzciBBbCBXYXRhbiwgWmF5ZWQgTmF0aW9uYWwgTXVzZXVtIGFuZCB0aGUgTmF0dXJhbCBIaXN0b3J5IE11c2V1bSIsIkYx
IEZhbnpvbmUgYW5kIGFsbCBPYXNpcyBhcmVhcyJdLAogICAgIGlkZWFsOlsiR3JpZCBhbmQgcGl0IGxhbmUiLCJDYWxtLCByZWZpbmVkIHNldHRpbmciLCJD
bGllbnQgaG9zdGluZyJdLG5vdGU6IlByaWNpbmcgYW5kIGF2YWlsYWJpbGl0eSBjb25maXJtZWQgb24gZW5xdWlyeS4iLAogICAgIHNob3RzOlt7c3JjOiJo
dHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wNi8xODA0MjE1NjQ5LmpwZyIsY2FwOiJQaXRsYW5lIFZpZXdzIFN1aXRl
In1dLAogICAgIHVybDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvZjEtcGl0bGFuZS12aWV3cy1zdWl0ZS8iLGxhYmVsRHg6LTYwLGxhYmVsRHk6MTAwLGxh
YmVsQW5jaG9yOiJtaWRkbGUifSwKICAgIHtpZDoiZXMtc3VpdGUtc2hhbXMiLG5hbWU6IlNoYW1zIFN1aXRlIixsYWJlbFRleHQ6IlNIQU1TfFNVSVRFIixj
b2RlOiJTVEUtMDMiLHg6Nzk0LHk6LTkyLHc6NDQsaDoyMixzb2xpZDpmYWxzZSwKICAgICBjYXQ6IlNoYW1zIFN1aXRlIixkZXNjOiJNaWRkbGUgRWFzdGVy
biBhbmQgTm9ydGggQWZyaWNhbiBmbGF2b3VycyBieSBOaW5pdmUgaW4gYSBwbHVzaCwgYWlyLWNvbmRpdGlvbmVkIGxvdW5nZSwgd2l0aCBhIGJhbGNvbnkg
b3ZlciB0aGUgVHVybiA1IGhhaXJwaW4gYW5kIGdlbmVyYWwgYWRtaXNzaW9uIHRvIHRoZSBBZnRlci1SYWNlIENvbmNlcnRzLiIsCiAgICAgc3VtOiJOaW5p
dmUncyBzaWduYXR1cmUgZGlzaGVzIGFuZCBjcmFmdGVkIGNvY2t0YWlscywgd2l0aCB0aGUgaGFpcnBpbiBiZWxvdyB0aGUgYmFsY29ueS4iLAogICAgIGlu
YzpbIkZvdXItZGF5IGFjY2VzcywgVGh1cnNkYXkgdG8gU3VuZGF5IiwiTmluaXZlJ3MgTWlkZGxlIEVhc3Rlcm4gYW5kIE5vcnRoIEFmcmljYW4gbWVudSB3
aXRoIGNyYWZ0ZWQgY29ja3RhaWxzIiwiQWlyLWNvbmRpdGlvbmVkIGxvdW5nZSBhbmQgYmFsY29ueSBvdmVyIFR1cm4gNSIsIkxpdmUgZW50ZXJ0YWlubWVu
dCIsIkdlbmVyYWwgYWRtaXNzaW9uIHRvIHRoZSBBZnRlci1SYWNlIENvbmNlcnRzIiwiT25lIGRheSBhdCB0ZWFtTGFiIFBoZW5vbWVuYSBvciBhIFlhcyBJ
c2xhbmQgdGhlbWUgcGFyayIsIkVudHJ5IHRvIHRoZSBMb3V2cmUgQWJ1IERoYWJpLCBRYXNyIEFsIFdhdGFuLCBaYXllZCBOYXRpb25hbCBNdXNldW0gYW5k
IHRoZSBOYXR1cmFsIEhpc3RvcnkgTXVzZXVtIiwiRjEgRmFuem9uZSBhbmQgYWxsIE9hc2lzIGFyZWFzIl0sCiAgICAgaWRlYWw6WyJGb29kIGFuZCBhdG1v
c3BoZXJlIiwiVGhlIGhhaXJwaW4iLCJHcm91cHMgYW5kIGNlbGVicmF0aW9ucyJdLG5vdGU6IlByaWNpbmcgYW5kIGF2YWlsYWJpbGl0eSBjb25maXJtZWQg
b24gZW5xdWlyeS4iLAogICAgIHNob3RzOlt7c3JjOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOS9zaGFtcy1p
bmRvb3Itd2l0aC1jcm93ZC5wbmciLGNhcDoiSW5zaWRlIHRoZSBTaGFtcyBTdWl0ZSJ9XSwKICAgICB1cmw6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL2Yx
LXNoYW1zLXN1aXRlLyIsbGFiZWxEeDo0MCxsYWJlbER5Oi00MCxsYWJlbEFuY2hvcjoic3RhcnQifQogIF07CiAgdmFyIHN1aXRlQWN0aXZlPW51bGw7CiAg
ZnVuY3Rpb24gc3VpdGVDZW50cmUocyl7CiAgICBpZihzLnQ9PW51bGwpIHJldHVybiB7eDpzLngseTpzLnl9OwogICAgcmV0dXJuIHt4OlNVSVRFX0xJTkUu
eDArKFNVSVRFX0xJTkUueDEtU1VJVEVfTElORS54MCkqcy50LCB5OlNVSVRFX0xJTkUueTArKFNVSVRFX0xJTkUueTEtU1VJVEVfTElORS55MCkqcy50fTsK
ICB9CiAgZnVuY3Rpb24gc3VpdGVMYWJlbChzdmcsdGV4dCx4LHksYW5jaG9yLHNpemUpewogICAgdmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKE5T
LCJ0ZXh0Iik7CiAgICB0LnNldEF0dHJpYnV0ZSgiZGF0YS1lcy1sYWJlbCIsIjEiKTsgdC5zZXRBdHRyaWJ1dGUoImRhdGEtZXMtc3VpdGUtbGFiZWwiLCIx
Iik7CiAgICB0LnNldEF0dHJpYnV0ZSgieCIseCk7IHQuc2V0QXR0cmlidXRlKCJ5Iix5KTsgdC5zZXRBdHRyaWJ1dGUoInRleHQtYW5jaG9yIixhbmNob3Ip
OyB0LnNldEF0dHJpYnV0ZSgicG9pbnRlci1ldmVudHMiLCJub25lIik7CiAgICB0LnN0eWxlLmZpbGw9IiNGRjQ3MTMiOyB0LnN0eWxlLnN0cm9rZT0ibm9u
ZSI7IHQuc3R5bGUuZm9udEZhbWlseT0iSW1wYWN0LCdBbnRvbicsJ0FyaWFsIE5hcnJvdycsc2Fucy1zZXJpZiI7IHQuc3R5bGUuZm9udFdlaWdodD0iNDAw
IjsKICAgIHQuc3R5bGUuZm9udFNpemU9c2l6ZSsicHgiOyB0LnN0eWxlLmxldHRlclNwYWNpbmc9KHNpemUqMC4wMykrInB4IjsKICAgIHZhciBsaW5lcz10
ZXh0LnNwbGl0KCJ8Iik7CiAgICBsaW5lcy5mb3JFYWNoKGZ1bmN0aW9uKGxpbmUsaSl7CiAgICAgIHZhciBzcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMo
TlMsInRzcGFuIik7IHNwLnNldEF0dHJpYnV0ZSgieCIseCk7CiAgICAgIHNwLnNldEF0dHJpYnV0ZSgieSIseSsoaS0obGluZXMubGVuZ3RoLTEpLzIpKnNp
emUqMS4wOCk7IHNwLnNldEF0dHJpYnV0ZSgiZG9taW5hbnQtYmFzZWxpbmUiLCJtaWRkbGUiKTsKICAgICAgc3AudGV4dENvbnRlbnQ9bGluZTsgdC5hcHBl
bmRDaGlsZChzcCk7CiAgICB9KTsKICAgIHN2Zy5hcHBlbmRDaGlsZCh0KTsgcmV0dXJuIHQ7CiAgfQogIGZ1bmN0aW9uIGNsZWFyU3VpdGVBY3RpdmUoKXsK
ICAgIHN1aXRlQWN0aXZlPW51bGw7CiAgICB2YXIgcGtnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6cFBrZyIpOwogICAgaWYocGtnKXsgW10uc2xpY2Uu
Y2FsbChwa2cucXVlcnlTZWxlY3RvckFsbCgiLnpwLXBrZy1oZWFkLC56cC1wcmljZSIpKS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyBlLmhpZGRlbj1mYWxzZTsg
ZS5zdHlsZS5kaXNwbGF5PSIiOyB9KTsgfQogICAgW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuZXMtem9uZVtkYXRhLWVzLXN1
aXRlXS5lcy1hY3RpdmUiKSkuZm9yRWFjaChmdW5jdGlvbih6KXsgei5jbGFzc0xpc3QucmVtb3ZlKCJlcy1hY3RpdmUiKTsgfSk7CiAgfQogIGZ1bmN0aW9u
IG9wZW5TdWl0ZShzLHNoYXBlKXsKICAgIC8qIHRoZSBtYWluIHNjcmlwdCdzIHBhbmVsIHJvdXRpbmUgaXMgcHJpdmF0ZTsgYSBxdWljay1saW5rIGJ1dHRv
biBydW5zIGl0IChhbmQgb3BlbnMgdGhlIG1vZGFsIG9uIHBob25lcyksCiAgICAgICB0aGVuIHRoZSBwYW5lbCBpcyByZXdyaXR0ZW4gZm9yIHRoZSBzdWl0
ZSAqLwogICAgdmFyIHFsPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiN6cFF1aWNrTGlua3MgYnV0dG9uIik7IGlmKHFsKSBxbC5jbGljaygpOwogICAgW10u
c2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuZXMtem9uZS5lcy1hY3RpdmUiKSkuZm9yRWFjaChmdW5jdGlvbih6KXsgei5jbGFzc0xp
c3QucmVtb3ZlKCJlcy1hY3RpdmUiKTsgfSk7CiAgICB2YXIgbG9jaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXMtbG9jayIpOyBpZihsb2NrKSBsb2Nr
LnN0eWxlLmRpc3BsYXk9Im5vbmUiOwogICAgaWYoc2hhcGUpIHNoYXBlLmNsYXNzTGlzdC5hZGQoImVzLWFjdGl2ZSIpOwogICAgc3VpdGVBY3RpdmU9cy5p
ZDsKICAgIHZhciBnPWZ1bmN0aW9uKGlkKXsgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsgfTsKICAgIGlmKGcoInpwVGllciIpKSBnKCJ6
cFRpZXIiKS50ZXh0Q29udGVudD0iU3VpdGUiOwogICAgaWYoZygienBDb2RlIikpIGcoInpwQ29kZSIpLnRleHRDb250ZW50PXMuY29kZTsKICAgIGlmKGco
InpwRGVzYyIpKSBnKCJ6cERlc2MiKS50ZXh0Q29udGVudD1zLmRlc2M7CiAgICB2YXIgc2hvdHM9ZygienBTaG90cyIpLCBtZWRpYUJveD1nKCJ6cE1lZGlh
Iik7CiAgICBpZihzaG90cyl7CiAgICAgIHNob3RzLmlubmVySFRNTD0iIjsgc2hvdHMuc2Nyb2xsTGVmdD0wOwogICAgICBzLnNob3RzLmZvckVhY2goZnVu
Y3Rpb24oc2gpewogICAgICAgIHZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOyBkLmNsYXNzTmFtZT0ienAtc2hvdCI7CiAgICAgICAgdmFy
IGltPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpOyBpbS5sb2FkaW5nPSJsYXp5IjsgaW0uZGVjb2Rpbmc9ImFzeW5jIjsgaW0uYWx0PXMubmFtZSso
c2guY2FwPyIsICIrc2guY2FwOiIiKTsgaW0uc3JjPXNoLnNyYzsKICAgICAgICBpbS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXsgZC5y
ZW1vdmUoKTsgaWYobWVkaWFCb3gmJiFzaG90cy5xdWVyeVNlbGVjdG9yKCIuenAtc2hvdCIpKSBtZWRpYUJveC5oaWRkZW49dHJ1ZTsgfSk7CiAgICAgICAg
ZC5hcHBlbmRDaGlsZChpbSk7CiAgICAgICAgaWYoc2guY2FwKXsgdmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7IGMuY2xhc3NOYW1lPSJj
YXAiOyBjLnRleHRDb250ZW50PXNoLmNhcDsgZC5hcHBlbmRDaGlsZChjKTsgfQogICAgICAgIHNob3RzLmFwcGVuZENoaWxkKGQpOwogICAgICB9KTsKICAg
ICAgaWYobWVkaWFCb3gpIG1lZGlhQm94LmhpZGRlbj1zLnNob3RzLmxlbmd0aD09PTA7CiAgICB9CiAgICAvKiB0aGUgcGFja2FnZSBibG9jayB3aXRob3V0
IHN0b2NrIG9yIHByaWNlOiBzdW1tYXJ5LCBpbmNsdXNpb25zLCB3aG8gaXQgc3VpdHMsIGEgbm90ZSAqLwogICAgdmFyIHBrZz1nKCJ6cFBrZyIpOwogICAg
aWYocGtnKXsKICAgICAgcGtnLmhpZGRlbj1mYWxzZTsKICAgICAgdmFyIGhlYWQ9cGtnLnF1ZXJ5U2VsZWN0b3IoIi56cC1wa2ctaGVhZCIpOyBpZihoZWFk
KXsgaGVhZC5oaWRkZW49dHJ1ZTsgaGVhZC5zdHlsZS5kaXNwbGF5PSJub25lIjsgfQogICAgICB2YXIgcHJpY2U9cGtnLnF1ZXJ5U2VsZWN0b3IoIi56cC1w
cmljZSIpOyBpZihwcmljZSl7IHByaWNlLmhpZGRlbj10cnVlOyBwcmljZS5zdHlsZS5kaXNwbGF5PSJub25lIjsgfQogICAgICBpZihnKCJ6cFN1bSIpKSBn
KCJ6cFN1bSIpLnRleHRDb250ZW50PXMuc3VtfHwiIjsKICAgICAgaWYoZygienBUaXAiKSl7IGcoInpwVGlwIikudGV4dENvbnRlbnQ9IiI7IGcoInpwVGlw
IikuaGlkZGVuPXRydWU7IH0KICAgICAgdmFyIGluYz1nKCJ6cEluYyIpOyBpZihpbmMpeyBpbmMuaW5uZXJIVE1MPSIiOyAocy5pbmN8fFtdKS5mb3JFYWNo
KGZ1bmN0aW9uKHgpeyB2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsgZC50ZXh0Q29udGVudD14OyBpbmMuYXBwZW5kQ2hpbGQoZCk7IH0p
OyB9CiAgICAgIHZhciBpZGVhbD1nKCJ6cElkZWFsIik7IGlmKGlkZWFsKXsgaWRlYWwuaW5uZXJIVE1MPSIiOyAocy5pZGVhbHx8W10pLmZvckVhY2goZnVu
Y3Rpb24oeCl7IHZhciBzcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7IHNwLnRleHRDb250ZW50PXg7IGlkZWFsLmFwcGVuZENoaWxkKHNwKTsg
fSk7IH0KICAgICAgaWYoZygienBOb3RlIikpeyBnKCJ6cE5vdGUiKS5oaWRkZW49IXMubm90ZTsgZygienBOb3RlIikudGV4dENvbnRlbnQ9cy5ub3RlfHwi
IjsgfQogICAgfQogICAgW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIjem9uZVBhbmVsIFtkYXRhLWVzLWhvdGVsLWN0YV0iKSku
Zm9yRWFjaChmdW5jdGlvbihjKXsgYy5oaWRkZW49dHJ1ZTsgYy5zdHlsZS5kaXNwbGF5PSJub25lIjsgfSk7CiAgICB2YXIgYm9vaz1nKCJ6cEN0YUJvb2si
KTsKICAgIGlmKGJvb2spewogICAgICBpZihzLnVybCl7IGJvb2suaGlkZGVuPWZhbHNlOyBib29rLnRleHRDb250ZW50PSJWaWV3IHRoZSBzdWl0ZSI7IGJv
b2suaHJlZj1zLnVybDsgYm9vay5yZW1vdmVBdHRyaWJ1dGUoInRhcmdldCIpOyBib29rLm9uY2xpY2s9bnVsbDsgfQogICAgICBlbHNlIHsgYm9vay5oaWRk
ZW49dHJ1ZTsgYm9vay5yZW1vdmVBdHRyaWJ1dGUoImhyZWYiKTsgfQogICAgfQogICAgdmFyIGVucT1nKCJ6cEN0YUVucXVpcmUiKTsKICAgIGlmKGVucSl7
CiAgICAgIGVucS5oaWRkZW49ZmFsc2U7IGVucS5zdHlsZS5kaXNwbGF5PSIiOyBlbnEudGV4dENvbnRlbnQ9IkVucXVpcmUgYWJvdXQgdGhpcyBzdWl0ZSI7
CiAgICAgIGVucS5zZXRBdHRyaWJ1dGUoImhyZWYiLCIjZW5xdWlyZSIpOyBlbnEuc2V0QXR0cmlidXRlKCJkYXRhLW9wZW4tcmZpIiwiIik7IGVucS5zZXRB
dHRyaWJ1dGUoImRhdGEtY2F0IixzLmNhdCk7CiAgICAgIGVucS5vbmNsaWNrPWZ1bmN0aW9uKGV2KXsKICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpOyBl
di5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICB2YXIgc2VsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmLWNhdCIpOwogICAgICAgIGlmKHNlbCl7IGZv
cih2YXIgaz0wO2s8c2VsLm9wdGlvbnMubGVuZ3RoO2srKyl7IGlmKHNlbC5vcHRpb25zW2tdLnRleHQ9PT1zLmNhdCl7IHNlbC5zZWxlY3RlZEluZGV4PWs7
IGJyZWFrOyB9IH0gfQogICAgICAgIHZhciBoPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNyZmkgaW5wdXRbbmFtZT1lZWJfY2F0ZWdvcnldIik7IGlmKGgp
IGgudmFsdWU9cy5jYXQ7CiAgICAgICAgdmFyIG9wZW5lcj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubmF2LWN0YVtkYXRhLW9wZW4tcmZpXSIpfHxkb2N1
bWVudC5xdWVyeVNlbGVjdG9yKCJbZGF0YS1vcGVuLXJmaV0iKTsKICAgICAgICBpZihvcGVuZXIpIG9wZW5lci5jbGljaygpOwogICAgICB9OwogICAgfQog
ICAgLyogdGhlIHRpdGxlIGxhc3Q6IHRoZSBwYW5lbCBvcGVucywgYW5kIHRoZSBkZXZlbG9wZXIncyBzeW5jIHJlYWRzIGl0LCBvbiB0aGlzIGNoYW5nZSAq
LwogICAgaWYoZygienBUaXRsZSIpKSBnKCJ6cFRpdGxlIikudGV4dENvbnRlbnQ9cy5uYW1lOwogICAgdmFyIHNjPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Io
IiN6b25lUGFuZWwgLnpwLXNjcm9sbCIpOyBpZihzYykgc2Muc2Nyb2xsVG9wPTA7CiAgfQogIGZ1bmN0aW9uIGRyYXdTdWl0ZXMoc3ZnKXsKICAgIGlmKCFz
dmcpIHJldHVybjsKICAgIFtdLnNsaWNlLmNhbGwoc3ZnLnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWVzLXN1aXRlXSxbZGF0YS1lcy1zdWl0ZS1sYWJlbF0i
KSkuZm9yRWFjaChmdW5jdGlvbihlKXsgZS5yZW1vdmUoKTsgfSk7CiAgICB2YXIgcmVmPXN2Zy5xdWVyeVNlbGVjdG9yKCJ0ZXh0W2RhdGEtZXMtbGFiZWxd
Om5vdChbZGF0YS1lcy1zdWl0ZS1sYWJlbF0pIik7CiAgICB2YXIgc2l6ZT1yZWY/cGFyc2VGbG9hdChyZWYuc3R5bGUuZm9udFNpemUpOjM2OyAgIC8qIHRo
ZSBzdGFuZCBsYWJlbHMnIHNpemU6IGV2ZXJ5IGxhYmVsIG9uIHRoZSBtYXAgcmVhZHMgYWxpa2UgKi8KICAgIFNVSVRFUy5mb3JFYWNoKGZ1bmN0aW9uKHMp
ewogICAgICB2YXIgYz1zdWl0ZUNlbnRyZShzKSwgc2hhcGU7CiAgICAgIGlmKHMudCE9bnVsbCl7CiAgICAgICAgLyogYSAzNCB4IDE2IGJveCB0dXJuZWQg
dG8gdGhlIGJhbmQncyBhbmdsZSwgYXMgYWJzb2x1dGUgcG9pbnRzIHNvIG5vIHRyYW5zZm9ybSBydWxlIGNhbiBtb3ZlIGl0ICovCiAgICAgICAgdmFyIGE9
U1VJVEVfTElORS5hbmdsZSpNYXRoLlBJLzE4MCwgY2E9TWF0aC5jb3MoYSksIHNhPU1hdGguc2luKGEpLCBodz0xNywgaGg9ODsKICAgICAgICB2YXIgcHRz
PVtbLWh3LC1oaF0sW2h3LC1oaF0sW2h3LGhoXSxbLWh3LGhoXV0ubWFwKGZ1bmN0aW9uKHApeyByZXR1cm4gKGMueCtwWzBdKmNhLXBbMV0qc2EpLnRvRml4
ZWQoMSkrIiwiKyhjLnkrcFswXSpzYStwWzFdKmNhKS50b0ZpeGVkKDEpOyB9KTsKICAgICAgICBzaGFwZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoTlMs
InBvbHlnb24iKTsKICAgICAgICBzaGFwZS5zZXRBdHRyaWJ1dGUoInBvaW50cyIscHRzLmpvaW4oIiAiKSk7IHNoYXBlLnNldEF0dHJpYnV0ZSgic3Ryb2tl
LWxpbmVqb2luIiwicm91bmQiKTsKICAgICAgfWVsc2V7CiAgICAgICAgc2hhcGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKE5TLCJyZWN0Iik7CiAgICAg
ICAgc2hhcGUuc2V0QXR0cmlidXRlKCJ4IiwoYy54LXMudy8yKS50b0ZpeGVkKDEpKTsgc2hhcGUuc2V0QXR0cmlidXRlKCJ5IiwoYy55LXMuaC8yKS50b0Zp
eGVkKDEpKTsgc2hhcGUuc2V0QXR0cmlidXRlKCJ3aWR0aCIscy53KTsgc2hhcGUuc2V0QXR0cmlidXRlKCJoZWlnaHQiLHMuaCk7IHNoYXBlLnNldEF0dHJp
YnV0ZSgicngiLDEuNSk7CiAgICAgIH0KICAgICAgc2hhcGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsImVzLXpvbmUgZXMtcGtnIisocy5zb2xpZD8iIGVzLXN1
aXRlLXNvbGlkIjoiIikpOwogICAgICBzaGFwZS5zZXRBdHRyaWJ1dGUoImRhdGEtZXMtc3VpdGUiLCIxIik7IHNoYXBlLmRhdGFzZXQuZXNJZD1zLmlkOwog
ICAgICBzaGFwZS5zZXRBdHRyaWJ1dGUoInJvbGUiLCJidXR0b24iKTsgc2hhcGUuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIjAiKTsgc2hhcGUuc2V0QXR0
cmlidXRlKCJhcmlhLWxhYmVsIixzLm5hbWUrIiwgIitzLmNvZGUpOwogICAgICBzaGFwZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLGZ1bmN0aW9u
KGUpeyBlLnByZXZlbnREZWZhdWx0KCk7IH0pOwogICAgICBzaGFwZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oZSl7IGUuc3RvcFByb3Bh
Z2F0aW9uKCk7IG9wZW5TdWl0ZShzLHNoYXBlKTsgfSk7CiAgICAgIHNoYXBlLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGZ1bmN0aW9uKGUpeyBpZihl
LmtleT09PSJFbnRlciJ8fGUua2V5PT09IiAiKXsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyBvcGVuU3VpdGUocyxzaGFwZSk7
IH0gfSk7CiAgICAgIGlmKHN1aXRlQWN0aXZlPT09cy5pZCkgc2hhcGUuY2xhc3NMaXN0LmFkZCgiZXMtYWN0aXZlIik7CiAgICAgIHN2Zy5hcHBlbmRDaGls
ZChzaGFwZSk7CiAgICAgIC8qIHBvc2l0aW9ucyBmcm9tIGEgZml0IHNlYXJjaCBvbiB0aGUgbGl2ZSBtYXAgKDYgT2N0IDIwMjYpOiBjbGVhciBvZiBldmVy
eSB6b25lLCBsYWJlbCBhbmQgdGhlIG1hcCBlZGdlIGF0CiAgICAgICAgIHRoZSBzdGFuZC1sYWJlbCBzaXplLCB3aXRoIHRoZSBNYWluIEdyYW5kc3RhbmQg
bGFiZWwgbW92ZWQgNDAgdW5pdHMgZG93biB0byBtYWtlIHJvb20gKi8KICAgICAgc3VpdGVMYWJlbChzdmcscy5sYWJlbFRleHQsYy54K3MubGFiZWxEeCxj
Lnkrcy5sYWJlbER5LHMubGFiZWxBbmNob3Isc2l6ZSk7CiAgICB9KTsKICAgIC8qIHRoZSB0aWVyIGZpbHRlciBjaGlwcyBkaW0gZXZlcnkgem9uZSB0aGUg
bWFpbiBzY3JpcHQgZG9lcyBub3Qga25vdzsgdGhlIHN1aXRlcyBmb2xsb3cgdGhlIFN1aXRlIGNoaXAgKi8KICAgIHZhciBjaGlwcz1kb2N1bWVudC5xdWVy
eVNlbGVjdG9yQWxsKCIjbWFwRmlsdGVycyAubWFwLWNoaXAiKTsKICAgIGlmKGNoaXBzLmxlbmd0aCYmIXN2Zy5oYXNBdHRyaWJ1dGUoImRhdGEtZXMtc3Vp
dGUtY2hpcHMiKSl7CiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoImRhdGEtZXMtc3VpdGUtY2hpcHMiLCIxIik7CiAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JF
YWNoLmNhbGwoY2hpcHMsZnVuY3Rpb24oY2gpewogICAgICAgIGNoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpewogICAgICAgICAgdmFy
IHQ9Y2guZGF0YXNldC50aWVyOwogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICBbXS5zbGljZS5jYWxsKHN2Zy5xdWVyeVNl
bGVjdG9yQWxsKCIuZXMtem9uZVtkYXRhLWVzLXN1aXRlXSIpKS5mb3JFYWNoKGZ1bmN0aW9uKHopeyB6LmNsYXNzTGlzdC50b2dnbGUoImVzLWRpbSIsISgi
YWxsIj09PXR8fCJzdWl0ZSI9PT10KSk7IH0pOwogICAgICAgICAgfSwwKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CiAgfQogIC8qIHJlZHJhdyBh
ZnRlciBldmVyeSBsYWJlbCBwYXNzIChmaXJzdCBkcmF3IGFuZCBldmVyeSByZXNpemUpOyB0aGUgbGFiZWxzIGFyZSByZWRyYXduIHRoZSBzYW1lIHdheSAq
LwogIHZhciBfZHJhd0xhYmVscz1kcmF3TGFiZWxzOwogIGRyYXdMYWJlbHM9ZnVuY3Rpb24oc3ZnLHNwYW5zKXsgX2RyYXdMYWJlbHMoc3ZnLHNwYW5zKTsg
dHJ5eyBkcmF3U3VpdGVzKHN2Zyk7IH1jYXRjaChlKXt9IH07CiAgLyogYSBzdGFuZCBvciBsb3VuZ2UgcGlja2VkIGFmdGVyIGEgc3VpdGU6IHRoZSBzdWl0
ZSdzIGhpZ2hsaWdodCBnb2VzICovCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGUpewogICAgaWYoZS5pc1RydXN0ZWQ9
PT1mYWxzZSkgcmV0dXJuOyAgIC8qIG9wZW5TdWl0ZSBwcmVzc2VzIGEgcXVpY2sgbGluayBpdHNlbGYgKi8KICAgIHZhciB6PWUudGFyZ2V0JiZlLnRhcmdl
dC5jbG9zZXN0JiZlLnRhcmdldC5jbG9zZXN0KCIuZXMtem9uZTpub3QoW2RhdGEtZXMtc3VpdGVdKSwjenBRdWlja0xpbmtzIGJ1dHRvbiwjc3RhbmRBY2Mg
LmFjYy1xOm5vdChbZGF0YS1lcy1zdWl0ZS1yb3ddKSIpOwogICAgaWYoeikgc2V0VGltZW91dChjbGVhclN1aXRlQWN0aXZlLDApOwogIH0sdHJ1ZSk7CiAg
LyogdGhlIHRocmVlIHJvd3MgaW4gdGhlIFN0YW5kcyBhbmQgTG91bmdlcyBsaXN0ICovCiAgW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9y
QWxsKCIjc3RhbmRBY2MgLmFjYy1xW2RhdGEtZXMtc3VpdGUtcm93XSIpKS5mb3JFYWNoKGZ1bmN0aW9uKGJ0bil7CiAgICB2YXIgcz1udWxsOyBTVUlURVMu
Zm9yRWFjaChmdW5jdGlvbih4KXsgaWYoeC5pZD09PWJ0bi5nZXRBdHRyaWJ1dGUoImRhdGEtZXMtc3VpdGUtcm93IikpIHM9eDsgfSk7CiAgICBpZighcykg
cmV0dXJuOwogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihlKXsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9w
YWdhdGlvbigpOwogICAgICB2YXIgc3ZnPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNtYXBXcmFwIHN2ZyIpOwogICAgICBvcGVuU3VpdGUocyxzdmcmJnN2
Zy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1lcy1pZD0iJytzLmlkKyciXScpKTsKICAgIH0sdHJ1ZSk7CiAgfSk7Cn0pKCk7Cg==
IWZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVzLXBhZ2UiKTtlJiZlLmNsYXNzTGlzdC5hZGQoImpzIiksZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LHQ9bnVsbDt0cnl7dD1sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiZXNUaGVtZSIpfWNhdGNoKEEpe30ibGlnaHQiPT09dHx8ImRhcmsiPT09dD9lLnNldEF0dHJpYnV0ZSgiZGF0YS10aGVtZSIsdCk6d2luZG93Lm1hdGNoTWVkaWEmJndpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGxpZ2h0KSIpLm1hdGNoZXMmJmUuc2V0QXR0cmlidXRlKCJkYXRhLXRoZW1lIiwibGlnaHQiKTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGhlbWVCdG4iKSxuPXdpbmRvdy5tYXRjaE1lZGlhJiZ3aW5kb3cubWF0Y2hNZWRpYSgiKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkiKS5tYXRjaGVzO2Z1bmN0aW9uIGkodCl7ZS5zZXRBdHRyaWJ1dGUoImRhdGEtdGhlbWUiLHQpO3RyeXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiZXNUaGVtZSIsdCl9Y2F0Y2goQSl7fX1hLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3ZhciB0PSJsaWdodCI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aGVtZSIpPyJkYXJrIjoibGlnaHQiO2lmKGEuY2xhc3NMaXN0LmFkZCgic3BpbiIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXthLmNsYXNzTGlzdC5yZW1vdmUoInNwaW4iKX0sNTIwKSwhbiYmZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbil7dmFyIG89YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPW8ubGVmdCtvLndpZHRoLzIscj1vLnRvcCtvLmhlaWdodC8yLHM9TWF0aC5oeXBvdChNYXRoLm1heChjLHdpbmRvdy5pbm5lcldpZHRoLWMpLE1hdGgubWF4KHIsd2luZG93LmlubmVySGVpZ2h0LXIpKTtkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKGZ1bmN0aW9uKCl7aSh0KX0pLnJlYWR5LnRoZW4oZnVuY3Rpb24oKXtlLmFuaW1hdGUoe2NsaXBQYXRoOlsiY2lyY2xlKDBweCBhdCAiK2MrInB4ICIrcisicHgpIiwiY2lyY2xlKCIrcysicHggYXQgIitjKyJweCAiK3IrInB4KSJdfSx7ZHVyYXRpb246NjIwLGVhc2luZzoiY3ViaWMtYmV6aWVyKC40LDAsLjIsMSkiLHBzZXVkb0VsZW1lbnQ6Ijo6dmlldy10cmFuc2l0aW9uLW5ldyhyb290KSJ9KX0pLmNhdGNoKGZ1bmN0aW9uKCl7fSl9ZWxzZSFmdW5jdGlvbih0KXtlLmNsYXNzTGlzdC5hZGQoInRoZW1pbmciKSxpKHQpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmNsYXNzTGlzdC5yZW1vdmUoInRoZW1pbmciKX0sNTYwKX0odCl9KTt2YXIgbz1mdW5jdGlvbigpe307IWZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImhlcm9UaXRsZSIpLHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmhlcm8tcGlsbGFycyIpO2lmKGUmJnQmJiFuJiZlLmFuaW1hdGUpe3ZhciBhPTI0MCxpPWZ1bmN0aW9uKGUpe3ZhciB0PVtdLGE9W10sbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLmNoaWxkTm9kZXMpO2Z1bmN0aW9uIGkoZSxuKXtlLnNwbGl0KC8oXHMrKS8pLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSlpZigvXlxzKyQvLnRlc3QoZSkpbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpKTtlbHNle3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtpLmNsYXNzTmFtZT0idyIsQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTt0LmNsYXNzTmFtZT0iYyIsdC50ZXh0Q29udGVudD1lLGkuYXBwZW5kQ2hpbGQodCksYS5wdXNoKHQpfSksbi5hcHBlbmRDaGlsZChpKSx0LnB1c2goaSl9fSl9cmV0dXJuIGUuaW5uZXJIVE1MPSIiLG4uZm9yRWFjaChmdW5jdGlvbih0KXtpZigzPT09dC5ub2RlVHlwZSlpKHQudGV4dENvbnRlbnQsZSk7ZWxzZXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKTthLmNsYXNzTmFtZT10LmNsYXNzTmFtZSxlLmFwcGVuZENoaWxkKGEpLGkodC50ZXh0Q29udGVudCxhKX19KSx7d29yZHM6dCxjaGFyczphfX0oZSksYz10LnF1ZXJ5U2VsZWN0b3JBbGwoImEiKTt0LmNsYXNzTGlzdC5hZGQoImxpZnQiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGMsZnVuY3Rpb24oZSl7ZS5zdHlsZS5vcGFjaXR5PSIwIn0pLG89ZnVuY3Rpb24oKXtkb2N1bWVudC5mb250cyYmZG9jdW1lbnQuZm9udHMucmVhZHk/ZG9jdW1lbnQuZm9udHMucmVhZHkudGhlbihyKS5jYXRjaChyKTpyKCl9fWZ1bmN0aW9uIHIoKXt2YXIgbj1mdW5jdGlvbigpe3ZhciB0PWUucXVlcnlTZWxlY3RvcigiZW0iKTtpZighdClyZXR1cm4gbnVsbDt2YXIgYT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi53Iik7aWYoYS5sZW5ndGg8MilyZXR1cm4gbnVsbDtmb3IodmFyIG49YVswXS5xdWVyeVNlbGVjdG9yQWxsKCIuYyIpLGk9YVsxXS5xdWVyeVNlbGVjdG9yQWxsKCIuYyIpLG89bnVsbCxjPWkubGVuZ3RoLTE7Yz49MDtjLS0paWYoInQiPT09aVtjXS50ZXh0Q29udGVudC50b0xvd2VyQ2FzZSgpKXtvPWlbY107YnJlYWt9cmV0dXJuIG5bMF0mJm5bMV0mJm8/W25bMF0sblsxXSxvXTpudWxsfSgpO2lmKCFufHxjLmxlbmd0aDwzKXJldHVybiBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGMsZnVuY3Rpb24oZSl7ZS5zdHlsZS5vcGFjaXR5PSIifSksdm9pZCB0LmNsYXNzTGlzdC5yZW1vdmUoImxpZnQiKTtpLmNoYXJzLmZvckVhY2goZnVuY3Rpb24oZSx0KXtlLmFuaW1hdGUoW3t0cmFuc2Zvcm06InRyYW5zbGF0ZVkoNDZweCkiLG9wYWNpdHk6MH0se3RyYW5zZm9ybToidHJhbnNsYXRlWSgwKSIsb3BhY2l0eToxfV0se2R1cmF0aW9uOjg2MCxkZWxheToyNCp0LGVhc2luZzoiY3ViaWMtYmV6aWVyKC4xNiwxLC4zLDEpIixmaWxsOiJib3RoIn0pfSk7dmFyIG89W107QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChjLGZ1bmN0aW9uKGUsdCl7dmFyIGE9blt0XS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxpPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7by5wdXNoKHtlbDplLGR4OmEubGVmdC1pLmxlZnQsZHk6YS50b3AtaS50b3B9KX0pO3ZhciByPTExODAscz0wO28uZm9yRWFjaChmdW5jdGlvbihlLHQpe3ZhciBpPTFlMyszODAqdDtzPU1hdGgubWF4KHMsaSs1MCtyKTt2YXIgbz1nZXRDb21wdXRlZFN0eWxlKG5bdF0pLmNvbG9yO25bdF0uYW5pbWF0ZShbe3RyYW5zZm9ybToic2NhbGUoMSkiLGNvbG9yOm99LHt0cmFuc2Zvcm06InNjYWxlKDEuMykiLGNvbG9yOiIjRUJCNDQ2IixvZmZzZXQ6LjMzLGVhc2luZzoiY3ViaWMtYmV6aWVyKC4yNSwuNDYsLjQ1LC45NCkifSx7dHJhbnNmb3JtOiJzY2FsZSgxKSIsY29sb3I6byxlYXNpbmc6ImN1YmljLWJlemllciguMzQsMS41NiwuNjQsMSkifV0se2R1cmF0aW9uOjQ1MCxkZWxheTppLGZpbGw6Im5vbmUifSk7dmFyIGM9InRyYW5zbGF0ZSgiK2UuZHgrInB4LCIrZS5keSsicHgpIHNjYWxlKDEuNCwxLjQpIjtlLmVsLmFuaW1hdGUoW3t0cmFuc2Zvcm06YyxvcGFjaXR5OjAsb2Zmc2V0OjB9LHt0cmFuc2Zvcm06YyxvcGFjaXR5OjEsb2Zmc2V0OjEzMC9yfSx7dHJhbnNmb3JtOmMsb3BhY2l0eToxLG9mZnNldDphL3IsZWFzaW5nOiJjdWJpYy1iZXppZXIoLjU1LC4wODUsLjY4LC41MykifSx7dHJhbnNmb3JtOiJ0cmFuc2xhdGUoMHB4LDBweCkgc2NhbGUoMSwxKSIsb3BhY2l0eToxLG9mZnNldDo4ODAvcixlYXNpbmc6ImVhc2Utb3V0In0se3RyYW5zZm9ybToidHJhbnNsYXRlKDBweCwwcHgpIHNjYWxlKDEsMC44NSkiLG9wYWNpdHk6MSxvZmZzZXQ6OTcwL3IsZWFzaW5nOiJlYXNlLW91dCJ9LHt0cmFuc2Zvcm06InRyYW5zbGF0ZSgwcHgsMHB4KSBzY2FsZSgxLDEpIixvcGFjaXR5OjEsb2Zmc2V0OjF9XSx7ZHVyYXRpb246cixkZWxheTppKzUwLGZpbGw6ImJvdGgifSl9KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChjLGZ1bmN0aW9uKGUpe2UuZ2V0QW5pbWF0aW9ucygpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jYW5jZWwoKX0pLGUuc3R5bGUub3BhY2l0eT0iIixlLnN0eWxlLnRyYW5zZm9ybT0iIn0pLHQuY2xhc3NMaXN0LnJlbW92ZSgibGlmdCIpfSxzKzQwKX19KCk7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVzTG9hZGVyIikscj1kb2N1bWVudC5ib2R5LHM9ITA7dHJ5e3M9ITB9Y2F0Y2goQSl7fWZ1bmN0aW9uIGQoKXtjLmNsYXNzTGlzdC5hZGQoImlzLW91dCIpLHIuY2xhc3NMaXN0LnJlbW92ZSgiZXNsLWxvY2siKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy5oaWRkZW49ITB9LDcwMCk7dHJ5e3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oImVzU2VlbkxvYWRlciIsIjEiKX1jYXRjaChBKXt9c2V0VGltZW91dChvLDMwMCl9cz8oYy5oaWRkZW49ITAsci5jbGFzc0xpc3QucmVtb3ZlKCJlc2wtbG9jayIpLHNldFRpbWVvdXQobywyNjApKTooc2V0VGltZW91dChkLDIwNTApLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGQpKSxkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuY2FyLWJ0biIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlLmRhdGFzZXQudGFyZ2V0KTtpZih0KXt2YXIgYT10LmZpcnN0RWxlbWVudENoaWxkLG49YT9hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKzQ6LjgqdC5jbGllbnRXaWR0aDt0LnNjcm9sbEJ5KHtsZWZ0Om4qK2UuZGF0YXNldC5kaXIsYmVoYXZpb3I6InNtb290aCJ9KX19KX0pO3ZhciBsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZmlNb2RhbCIpLHU9bC5xdWVyeVNlbGVjdG9yKCIucmZpLWRsZyIpLHA9bnVsbCxmPW51bGwsaD0wO2Z1bmN0aW9uIG0oKXtpZighKGgrKz4wKSl7dmFyIGU9d2luZG93LmlubmVyV2lkdGgtZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO2U+MCYmKGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0PWUrInB4IiksZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIn19ZnVuY3Rpb24gZygpeyhoPU1hdGgubWF4KDAsaC0xKSk+MHx8KGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c9IiIsZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ9IiIpfWZ1bmN0aW9uIGIoKXtsLmhpZGRlbnx8KGwuY2xhc3NMaXN0LnJlbW92ZSgiaXMtb3BlbiIpLGwuY2xhc3NMaXN0LmFkZCgiaXMtY2xvc2luZyIpLGNsZWFyVGltZW91dChmKSxmPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtsLmhpZGRlbj0hMCxsLmNsYXNzTGlzdC5yZW1vdmUoImlzLWNsb3NpbmciKSxnKCkscCYmcC5mb2N1cyYmcC5mb2N1cygpLHA9bnVsbH0sbj8wOjI0MCkpfWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLW9wZW4tcmZpXSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpO3ZhciBhLGk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5hdlBhbmVsIik7aWYoaSYmIWkuaGlkZGVuKXtpLmNsYXNzTGlzdC5yZW1vdmUoImlzLW9wZW4iKSxpLmNsYXNzTGlzdC5hZGQoImlzLWNsb3NpbmciKTt2YXIgbz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibmF2QnVyZ2VyIik7byYmKG8uc2V0QXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIiwiZmFsc2UiKSxvLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsIk9wZW4gbWVudSIpKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aS5oaWRkZW49ITAsaS5jbGFzc0xpc3QucmVtb3ZlKCJpcy1jbG9zaW5nIiksZygpfSxuPzA6MjYwKX1hPWUsY2xlYXJUaW1lb3V0KGYpLHA9YXx8bnVsbCxsLmNsYXNzTGlzdC5yZW1vdmUoImlzLWNsb3NpbmciKSxsLmhpZGRlbj0hMSxtKCksbC5vZmZzZXRXaWR0aCxsLmNsYXNzTGlzdC5hZGQoImlzLW9wZW4iKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImYtZmlyc3QiKTtpZihlKXRyeXtlLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSl9Y2F0Y2goQSl7ZS5mb2N1cygpfX0sbj8wOjI2MCl9KX0pLGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWNsb3NlLXJmaV0iKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7YigpfSl9KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixmdW5jdGlvbihlKXsiRXNjYXBlIiE9PWUua2V5fHxsLmhpZGRlbnx8YigpfSksbC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixmdW5jdGlvbihlKXtpZigiVGFiIj09PWUua2V5KXtmb3IodmFyIHQ9dS5xdWVyeVNlbGVjdG9yQWxsKCJhW2hyZWZdLCBidXR0b246bm90KFtkaXNhYmxlZF0pLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSIpLGE9W10sbj0wO248dC5sZW5ndGg7bisrKW51bGwhPT10W25dLm9mZnNldFBhcmVudCYmYS5wdXNoKHRbbl0pO2lmKGEubGVuZ3RoKXt2YXIgaT1hWzBdLG89YVthLmxlbmd0aC0xXTtlLnNoaWZ0S2V5JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09aT8oZS5wcmV2ZW50RGVmYXVsdCgpLG8uZm9jdXMoKSk6ZS5zaGlmdEtleXx8ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PW98fChlLnByZXZlbnREZWZhdWx0KCksaS5mb2N1cygpKX19fSksZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJmaSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpO3ZhciB0PWUudGFyZ2V0O2lmKHQuY2hlY2tWYWxpZGl0eSgpKXt2YXIgYT10LmRhdGFzZXQuZW5kcG9pbnQsbj1mdW5jdGlvbigpe3ZhciBzPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZW50Iik7cy5jbGFzc0xpc3QuYWRkKCJvbiIpO3QucmVzZXQoKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cy5jbGFzc0xpc3QucmVtb3ZlKCJvbiIpfSw3MDAwKX07YT9mZXRjaChhLHttZXRob2Q6IlBPU1QiLGJvZHk6bmV3IEZvcm1EYXRhKHQpfSkudGhlbihuKS5jYXRjaChuKTpuKCl9ZWxzZSB0LnJlcG9ydFZhbGlkaXR5KCl9KTt2YXIgdj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibmF2QnVyZ2VyIikseT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibmF2UGFuZWwiKSx3PW51bGw7ZnVuY3Rpb24gRSgpe3kuaGlkZGVufHwoeS5jbGFzc0xpc3QucmVtb3ZlKCJpcy1vcGVuIikseS5jbGFzc0xpc3QuYWRkKCJpcy1jbG9zaW5nIiksdi5zZXRBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiLCJmYWxzZSIpLHYuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwiT3BlbiBtZW51IiksY2xlYXJUaW1lb3V0KHcpLHc9c2V0VGltZW91dChmdW5jdGlvbigpe3kuaGlkZGVuPSEwLHkuY2xhc3NMaXN0LnJlbW92ZSgiaXMtY2xvc2luZyIpLGcoKX0sbj8wOjI2MCkpfXYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7eS5oaWRkZW4/KGNsZWFyVGltZW91dCh3KSx5LmNsYXNzTGlzdC5yZW1vdmUoImlzLWNsb3NpbmciKSx5LmhpZGRlbj0hMSxtKCkseS5vZmZzZXRXaWR0aCx5LmNsYXNzTGlzdC5hZGQoImlzLW9wZW4iKSx2LnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsInRydWUiKSx2LnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsIkNsb3NlIG1lbnUiKSk6RSgpfSkseS5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1jbG9zZS1tZW51XSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtFKCl9KX0pLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGZ1bmN0aW9uKGUpeyJFc2NhcGUiIT09ZS5rZXl8fHkuaGlkZGVufHwoRSgpLHYuZm9jdXMoKSl9KTt2YXIgUz13aW5kb3cubWF0Y2hNZWRpYSgiKG1pbi13aWR0aDogMTAwMXB4KSIpLEw9ZnVuY3Rpb24oZSl7ZS5tYXRjaGVzJiZFKCl9O1MuYWRkRXZlbnRMaXN0ZW5lcj9TLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsTCk6Uy5hZGRMaXN0ZW5lciYmUy5hZGRMaXN0ZW5lcihMKTt2YXIgaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibmF2Iik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZnVuY3Rpb24oKXtrLmNsYXNzTGlzdC50b2dnbGUoInNjcm9sbGVkIix3aW5kb3cuc2Nyb2xsWT42MCl9KTt2YXIgeD1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oZSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuaXNJbnRlcnNlY3RpbmcmJihlLnRhcmdldC5jbGFzc0xpc3QuYWRkKCJ2IikseC51bm9ic2VydmUoZS50YXJnZXQpKX0pfSx7dGhyZXNob2xkOi4wOH0pO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5yLCAuc2VjdGlvbi1oZWFkZXIiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3gub2JzZXJ2ZShlKX0pfSgpLGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBlPXdpbmRvdy5tYXRjaE1lZGlhJiZ3aW5kb3cubWF0Y2hNZWRpYSgiKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkiKS5tYXRjaGVzLHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVzeFRpdGxlIiksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXN4UGlsbGFycyIpO2lmKHQmJmEmJiFlJiZ0LmFuaW1hdGUpe3ZhciBuPTI0MCxpPWZ1bmN0aW9uKGUpe3ZhciB0PVtdLGE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5jaGlsZE5vZGVzKTtmdW5jdGlvbiBuKGUsYSl7ZS5zcGxpdCgvKFxzKykvKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKGUpaWYoL15ccyskLy50ZXN0KGUpKWEuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiAiKSk7ZWxzZXt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7bi5jbGFzc05hbWU9InciLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSxmdW5jdGlvbihlKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7YS5jbGFzc05hbWU9ImMiLGEudGV4dENvbnRlbnQ9ZSxuLmFwcGVuZENoaWxkKGEpLHQucHVzaChhKX0pLGEuYXBwZW5kQ2hpbGQobil9fSl9cmV0dXJuIGUuaW5uZXJIVE1MPSIiLGEuZm9yRWFjaChmdW5jdGlvbih0KXtpZigzPT09dC5ub2RlVHlwZSluKHQudGV4dENvbnRlbnQsZSk7ZWxzZXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKTthLmNsYXNzTmFtZT10LmNsYXNzTmFtZSxlLmFwcGVuZENoaWxkKGEpLG4odC50ZXh0Q29udGVudCxhKX19KSx0fSh0KSxvPWEucXVlcnlTZWxlY3RvcigiYSIpO2EuY2xhc3NMaXN0LmFkZCgibGlmdCIpLG8mJihvLnN0eWxlLm9wYWNpdHk9IjAiKTt2YXIgYz1hLnF1ZXJ5U2VsZWN0b3IoImxpOm50aC1jaGlsZCgyKSIpO2MmJmMuY2xhc3NMaXN0LmFkZCgidGFnLXdhaXQiKTt2YXIgcj0hMDt0cnl7cj0hMH1jYXRjaChkKXt9c2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LmZvbnRzJiZkb2N1bWVudC5mb250cy5yZWFkeT9kb2N1bWVudC5mb250cy5yZWFkeS50aGVuKHMpLmNhdGNoKHMpOnMoKX0scj8yNjA6MjM1MCl9ZnVuY3Rpb24gcygpe3ZhciBlPWZ1bmN0aW9uKCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCJlbSIpO2lmKCFlKXJldHVybiBudWxsO3ZhciBuPWUucXVlcnlTZWxlY3RvckFsbCgiLnciKTtpZighbi5sZW5ndGgpcmV0dXJuIG51bGw7dmFyIGk9cGFyc2VJbnQoYS5nZXRBdHRyaWJ1dGUoImRhdGEtc3JjLWluZGV4Iil8fCIwIiwxMCl8fDAsbz1uWzBdLnF1ZXJ5U2VsZWN0b3JBbGwoIi5jIik7cmV0dXJuIG9baV18fG9bMF18fG51bGx9KCk7aWYoIWV8fCFvKXJldHVybiBvJiYoby5zdHlsZS5vcGFjaXR5PSIiKSxjJiZjLmNsYXNzTGlzdC5yZW1vdmUoInRhZy13YWl0Iiksdm9pZCBhLmNsYXNzTGlzdC5yZW1vdmUoImxpZnQiKTtpLmZvckVhY2goZnVuY3Rpb24oZSx0KXtlLmFuaW1hdGUoW3t0cmFuc2Zvcm06InRyYW5zbGF0ZVkoNDZweCkiLG9wYWNpdHk6MH0se3RyYW5zZm9ybToidHJhbnNsYXRlWSgwKSIsb3BhY2l0eToxfV0se2R1cmF0aW9uOjg2MCxkZWxheToyNCp0LGVhc2luZzoiY3ViaWMtYmV6aWVyKC4xNiwxLC4zLDEpIixmaWxsOiJib3RoIn0pfSk7dmFyIHI9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxzPW8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD1NYXRoLm1pbigxLjQsTWF0aC5tYXgoLjIsci5oZWlnaHQvcy5oZWlnaHQqMS4xNSkpLGw9ci5sZWZ0LXMubGVmdCx1PXIuYm90dG9tLXMuYm90dG9tLHA9MTE4MCxmPTFlMyxoPWdldENvbXB1dGVkU3R5bGUoZSkuY29sb3I7ZS5hbmltYXRlKFt7dHJhbnNmb3JtOiJzY2FsZSgxKSIsY29sb3I6aH0se3RyYW5zZm9ybToic2NhbGUoMS4zKSIsY29sb3I6IiNFQkI0NDYiLG9mZnNldDouMzMsZWFzaW5nOiJjdWJpYy1iZXppZXIoLjI1LC40NiwuNDUsLjk0KSJ9LHt0cmFuc2Zvcm06InNjYWxlKDEpIixjb2xvcjpoLGVhc2luZzoiY3ViaWMtYmV6aWVyKC4zNCwxLjU2LC42NCwxKSJ9XSx7ZHVyYXRpb246NDUwLGRlbGF5OmYsZmlsbDoibm9uZSJ9KTt2YXIgbT0idHJhbnNsYXRlKCIrbCsicHgsIit1KyJweCkgc2NhbGUoIitkKyIsIitkKyIpIjtvLmFuaW1hdGUoW3t0cmFuc2Zvcm06bSxvcGFjaXR5OjAsb2Zmc2V0OjB9LHt0cmFuc2Zvcm06bSxvcGFjaXR5OjEsb2Zmc2V0OjEzMC9wfSx7dHJhbnNmb3JtOm0sb3BhY2l0eToxLG9mZnNldDpuL3AsZWFzaW5nOiJjdWJpYy1iZXppZXIoLjU1LC4wODUsLjY4LC41MykifSx7dHJhbnNmb3JtOiJ0cmFuc2xhdGUoMHB4LDBweCkgc2NhbGUoMSwxKSIsb3BhY2l0eToxLG9mZnNldDo4ODAvcCxlYXNpbmc6ImVhc2Utb3V0In0se3RyYW5zZm9ybToidHJhbnNsYXRlKDBweCwwcHgpIHNjYWxlKDEsMC44NSkiLG9wYWNpdHk6MSxvZmZzZXQ6OTcwL3AsZWFzaW5nOiJlYXNlLW91dCJ9LHt0cmFuc2Zvcm06InRyYW5zbGF0ZSgwcHgsMHB4KSBzY2FsZSgxLDEpIixvcGFjaXR5OjEsb2Zmc2V0OjF9XSx7ZHVyYXRpb246cCxkZWxheToxMDUwLGZpbGw6ImJvdGgifSksc2V0VGltZW91dChmdW5jdGlvbigpe28uZ2V0QW5pbWF0aW9ucygpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jYW5jZWwoKX0pLG8uc3R5bGUub3BhY2l0eT0iIixvLnN0eWxlLnRyYW5zZm9ybT0iIixhLmNsYXNzTGlzdC5yZW1vdmUoImxpZnQiKSxjJiYoYy5jbGFzc0xpc3QucmVtb3ZlKCJ0YWctd2FpdCIpLGMuY2xhc3NMaXN0LmFkZCgidGFnLWluIikpfSwyMjcwKX19KCksZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInZlbnVlRmlsZSIpO2lmKGUpe3ZhciB0PWUucXVlcnlTZWxlY3RvcigiLmFiLXRvZ2dsZSIpLGE9ZS5xdWVyeVNlbGVjdG9yKCIuYWItbGVhZCIpLG49ZnVuY3Rpb24oKXt2YXIgYT1lLmNsYXNzTGlzdC50b2dnbGUoIm9wZW4iKTt0LnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsYT8idHJ1ZSI6ImZhbHNlIil9O2EuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLG4pLHQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oZSl7IkVudGVyIiE9PWUua2V5JiYiICIhPT1lLmtleXx8KGUucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpLG4oKSl9KX1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuYWNjLWl0ZW0iKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUucXVlcnlTZWxlY3RvcigiLmFjYy1xIik7dC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt2YXIgYT1lLmNsYXNzTGlzdC50b2dnbGUoIm9wZW4iKTt0LnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsYT8idHJ1ZSI6ImZhbHNlIil9KX0pfSgpLGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBlPSJodHRwczovL2Nkbi54czJldmVudC5jb20vdmVudWVzL2VmOGU0ODViZDY0MTQ2MzJiYjEwYmFhMGU2ZTIzMWZlX3ZueC5zdmciLHQ9e2ZhMzQ5YWZjNTE4NjRjYWNiOTVhMzk5NTVkODJiMzc5X2N0Zzp7bmFtZToiTWFpbiBHcmFuZHN0YW5kIix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJEaXJlY3RseSBvcHBvc2l0ZSB0aGUgcGl0IGxhbmUgb24gdGhlIHN0YXJ04oCTZmluaXNoIHN0cmFpZ2h0IOKAlCB0aGUgZ3JpZCwgcGl0IHN0b3BzLCBhbmQgdGhlIHBvZGl1bSBhbGwgcGxheSBvdXQgaW4gZnJvbnQgb2YgeW91LiJ9LGQyZmZiMTczNjczYzQ5Nzg5ZTcxOWM2OTU2YzAyNjVmX2N0Zzp7bmFtZToiTWFpbiBHcmFuZHN0YW5kIFByZW1pdW0iLHRpZXI6ImdyYW5kc3RhbmQiLGRlc2M6IlByZW1pdW0gc2VhdGluZyBibG9ja3Mgb24gdGhlIG1haW4gc3RyYWlnaHQgd2l0aCBlbGV2YXRlZCBzaWdodGxpbmVzIG92ZXIgdGhlIGdyaWQgYW5kIHBpdCBsYW5lLiJ9LCI4ZmY1OGZlYWZlNzA0YmUwYmQ3MDI1YWM3ZGMyODkxMV9jdGciOntuYW1lOiJOb3J0aCBHcmFuZHN0YW5kIix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJPdmVybG9va2luZyB0aGUgaGVhdnkgYnJha2luZyB6b25lIGF0IHRoZSBlbmQgb2YgdGhlIGJhY2sgc3RyYWlnaHQg4oCUIG9uZSBvZiB0aGUgYmVzdCBvdmVydGFraW5nIHNwb3RzIG9uIHRoZSBjaXJjdWl0LiJ9LGFkMDExZDhmMzk2MzQ1N2E5ZTJiODM1MDlmOTE5OWUyX2N0Zzp7bmFtZToiTm9ydGggR3JhbmRzdGFuZCBQcmVtaXVtIix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJQcmVtaXVtIGJsb2NrcyBhYm92ZSB0aGUgTm9ydGggaGFpcnBpbiBicmFraW5nIHpvbmUsIHByaW1lIHRlcnJpdG9yeSBmb3IgbGF0ZS1yYWNlIG92ZXJ0YWtlcy4ifSxkM2NiMjU4ZDI5ZTM0MDBhYWE2MDllNzFmMmZkNDg0YV9jdGc6e25hbWU6Ik5vcnRoIFN0cmFpZ2h0Iix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJTZWF0aW5nIGFsb25nIHRoZSBydW4gZG93biB0byB0aGUgTm9ydGggY29ybmVyIGNvbXBsZXgsIHdpdGggY2FycyBhdCBmdWxsIHNwZWVkIGRpcmVjdGx5IGJlbG93LiJ9LCI2OWM2M2NiMjM3Y2E0ZjZkODQ4NWVhZjU1MGYxYjYyMF9jdGciOntuYW1lOiJOb3J0aCBTdHJhaWdodCBQcmVtaXVtIix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJQcmVtaXVtIHBvc2l0aW9ucyBvbiB0aGUgYXBwcm9hY2ggdG8gdGhlIE5vcnRoIGNvcm5lcnMuIn0sIjA5MGUxNjUyYmQyYTRmYmFiMzBjY2ZhYzk4YzZmYzNjX2N0ZyI6e25hbWU6Ildlc3QgR3JhbmRzdGFuZCIsdGllcjoiZ3JhbmRzdGFuZCIsZGVzYzoiU2V0IGFnYWluc3QgdGhlIHN3ZWVwaW5nIFdlc3Qgc2VjdGlvbiBiZW5lYXRoIHRoZSBXIEFidSBEaGFiaSBob3RlbCwgY2F0Y2hpbmcgdGhlIGNhcnMgdGhyb3VnaCB0aGUgdHdpbGlnaHQgc3dpdGNoYmFja3MuIn0sIjUwYTA1NjZmMDAzNjQyMDY5MGVmN2Q3NGQxMTYyMzg2X2N0ZyI6e25hbWU6Ildlc3QgR3JhbmRzdGFuZCBQcmVtaXVtIix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJQcmVtaXVtIGJsb2NrcyBvbiB0aGUgV2VzdCBzZWN0aW9uIHdpdGggdmlld3MgdG93YXJkcyB0aGUgaG90ZWwgYW5kIG1hcmluYS4ifSwiNjQ0NzkyMjdmN2M4NGEzYzgyNjVhMGVmNmM1N2IzOTJfY3RnIjp7bmFtZToiV2VzdCBTdHJhaWdodCIsdGllcjoiZ3JhbmRzdGFuZCIsZGVzYzoiU2VhdGluZyBhbG9uZyB0aGUgd2VzdGVybiBzdHJhaWdodCBhcyB0aGUgY2FycyBidWlsZCBzcGVlZCB0b3dhcmRzIHRoZSBmaW5hbCBzZWN0b3IuIn0sZWJhNzk3ODEzZWZhNDUyNDk1ZjE2YTZmMTg5N2RkYzNfY3RnOntuYW1lOiJTb3V0aCBHcmFuZHN0YW5kIix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJQb3NpdGlvbmVkIG92ZXIgdGhlIHNvdXRoZXJuIGNvcm5lciBzZXF1ZW5jZSwgd2l0aCBsb25nIHNpZ2h0bGluZXMgYWNyb3NzIG11bHRpcGxlIHR1cm5zLiJ9LCI3NDRiNDY5ZTEyYjc0MmIzYWRiYTA4YzIyMjBiODc1Zl9jdGciOntuYW1lOiJTb3V0aCBHcmFuZHN0YW5kIExvd2VyIix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJMb3dlci10aWVyIHNlYXRpbmcgaW4gdGhlIFNvdXRoIHN0YW5kLCBjbG9zZSB0byB0aGUgYWN0aW9uIHRocm91Z2ggdGhlIHNvdXRoZXJuIGNvcm5lcnMuIn0sIjk1NWVmOTgxZGIyODQ1NmJiMGFjZThhNDk1YWJmOThiX2N0ZyI6e25hbWU6Ik1hcmluYSBHcmFuZHN0YW5kIix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJUaGUgc2lnbmF0dXJlIFlhcyBNYXJpbmEgYmFja2Ryb3Ag4oCUIHN1cGVyeWFjaHRzIG9uIG9uZSBzaWRlLCB0aGUgY2lyY3VpdCBvbiB0aGUgb3RoZXIuIn0sIjdkY2MyNDM2ODEzNzRjYTA4Y2Q3ZDkxOWQ5YTI3NmZlX2N0ZyI6e25hbWU6Ik1haW4gQ2x1YiIsdGllcjoibG91bmdlIixkZXNjOiJDbHViIGhvc3BpdGFsaXR5IGJlaGluZCB0aGUgTWFpbiBHcmFuZHN0YW5kIHBhaXJpbmcgcHJlbWl1bSBzZWF0aW5nIHdpdGggYWxsLWRheSBsb3VuZ2UgYWNjZXNzLiJ9LGQ0MTVjODE1ZWNjZjQyODk4ZDU0ODI2ZTA0YmVkOTM3X2N0Zzp7bmFtZToiV2VzdCBDbHViIix0aWVyOiJsb3VuZ2UiLGRlc2M6IkNsdWIgaG9zcGl0YWxpdHkgb24gdGhlIFdlc3Qgc2VjdGlvbiDigJQgbG91bmdlIGFjY2VzcyB3aXRoIGdyYW5kc3RhbmQgc2VhdGluZyBvdmVyIHRoZSBzd2l0Y2hiYWNrcy4ifSxlZDE2NDhlZWM2Mjg0NGUzYjJlZjZiYmI0ZmQxYzk5NF9jdGc6e25hbWU6IlNvdXRoIENsdWIiLHRpZXI6ImxvdW5nZSIsZGVzYzoiQ2x1Yi1sZXZlbCBob3NwaXRhbGl0eSBwYWlyZWQgd2l0aCBTb3V0aCBHcmFuZHN0YW5kIHNlYXRpbmcuIn0sZjU1YjIwMjVlMzkzNDcxMTljNzNhYTMwZWJjYjU0NWJfY3RnOntuYW1lOiJDaGFtcGlvbnMgQ2x1YiIsdGllcjoibG91bmdlIixkZXNjOiJFbGV2YXRlZCBjbHViIGhvc3BpdGFsaXR5IHdpdGggcHJlbWl1bSBkaW5pbmcgYW5kIHNvbWUgb2YgdGhlIGJyb2FkZXN0IHZpZXdzIG9uIHRoZSBjaXJjdWl0LiJ9LGI4NTQxY2I4ZTI0MDRmZjk4MTJmZTgzZDMyNjI4Y2M2X2N0Zzp7bmFtZToiWWFzIExvdW5nZSBOb3J0aCIsdGllcjoibG91bmdlIixkZXNjOiJMb3VuZ2UgaG9zcGl0YWxpdHkgYWJvdmUgdGhlIE5vcnRoIHNlY3Rpb24gYnJha2luZyB6b25lLiJ9LCI2NmJlMzQ2OTlmY2U0MmQ5OTI2ZDg1NGUwYjc1ZmI3N19jdGciOntuYW1lOiJZYXMgTG91bmdlIFdlc3QiLHRpZXI6ImxvdW5nZSIsZGVzYzoiTG91bmdlIGhvc3BpdGFsaXR5IG92ZXJsb29raW5nIHRoZSBXZXN0IHNlY3Rpb24uIn0sIjg1NDA5ZDFjYzFhOTQ3OTY5NDg5ZjRjMDVjMWUzMmQ3X2N0ZyI6e25hbWU6IlRlcnJhY2UgSG9zcGl0YWxpdHkg4oCUIFR1cm4gMSIsdGllcjoibG91bmdlIixkZXNjOiJPcGVuIHRlcnJhY2UgaG9zcGl0YWxpdHkgYWJvdmUgVHVybiAxLCB3YXRjaGluZyB0aGUgZmllbGQgZnVubmVsIGluIG9uIHRoZSBvcGVuaW5nIGxhcC4ifSxhZmM2N2JkOTE0ODY0ODQ4OGMxNDgzNTNiYzY4OTdhMF9jdGc6e25hbWU6IlRlcnJhY2UgSG9zcGl0YWxpdHkg4oCUIEhhaXJwaW4iLHRpZXI6ImxvdW5nZSIsZGVzYzoiVGVycmFjZSBwb3NpdGlvbnMgb3ZlciB0aGUgaGFpcnBpbiwgdGhlIHNsb3dlc3QgYW5kIG1vc3QgZHJhbWF0aWMgY29ybmVyIG9uIHRoZSBsYXAuIn0sY2JmM2Q3NTExOTZiNDM3ZDhiM2E3ODFmMWI5ZTU1MjdfY3RnOntuYW1lOiJNYXJpbmEgTG91bmdlIix0aWVyOiJsb3VuZ2UiLGRlc2M6IkxvdW5nZSBob3NwaXRhbGl0eSBzZXQgYWdhaW5zdCB0aGUgbWFyaW5hLCBjb21iaW5pbmcgdHJhY2tzaWRlIHZpZXdzIHdpdGggdGhlIHdhdGVyZnJvbnQgc2V0dGluZy4ifSxkZGE0NzRlNTdjNzI0YmY3OTYwNmE2YmEzMmQyNjJkMl9jdGc6e25hbWU6IlN1bnNldCBMb3VuZ2UiLHRpZXI6ImxvdW5nZSIsZGVzYzoiV2VzdC1mYWNpbmcgbG91bmdlIGJ1aWx0IGFyb3VuZCB0aGUgdHdpbGlnaHQtaW50by1uaWdodCBjaGFyYWN0ZXIgb2YgdGhlIHJhY2UuIn0sIjRhMTJiZGU0MmI2NTQ0NDE5OGY5NDcxZGVjMWM4NDY0X2N0ZyI6e25hbWU6IlRoZSBEZWNrIEAgTmluZSIsdGllcjoibG91bmdlIixkZXNjOiJUZXJyYWNlIGhvc3BpdGFsaXR5IHBvc2l0aW9uZWQgb3ZlciB0aGUgVHVybiA5IGNvbXBsZXguIn0sIjI5M2JjYzIwZjE4OTRkMzFhYjBiNTU2YmE0NTA0MjRhX2N0ZyI6e25hbWU6Ik1hcmluYSDigJQgVmVsb2NpdHkgRXhwZXJpZW5jZSIsdGllcjoibG91bmdlIixkZXNjOiJNYXJpbmEtc2lkZSBob3NwaXRhbGl0eSBleHBlcmllbmNlIHdpdGggcHJlbWl1bSB2aWV3aW5nIGFjcm9zcyB0aGUgY2lyY3VpdCBiYXNpbi4ifSxjYWJlZWEyNmJjNTg0YTVkYjMwNjY0Y2NjNGZjYTRiYV9jdGc6e25hbWU6IllhcyBTdWl0ZSDigJQgTWFpbiIsdGllcjoic3VpdGUiLGRlc2M6IlByaXZhdGUgc3VpdGUgaG9zcGl0YWxpdHkgYWJvdmUgdGhlIG1haW4gc3RyYWlnaHQsIHdpdGggdGhlIGdyaWQgYW5kIHBpdCBsYW5lIGxhaWQgb3V0IGJlbG93LiJ9LGYyMmRlY2EzZDQzNzQ2MTRiMzI0YTA4YzQ1ODA4YmQwX2N0Zzp7bmFtZToiWWFzIFN1aXRlIOKAlCBNYWluIFByZW1pdW0iLHRpZXI6InN1aXRlIixkZXNjOiJUaGUgcHJlbWl1bSB0aWVyIG9mIE1haW4gc3VpdGVzLCBkaXJlY3RseSBvdmVyIHRoZSBzdGFydOKAk2ZpbmlzaCBsaW5lLiJ9LCI0MTVkZmViM2JmNzE0YTNmOGVjYzg3MmI3Y2ViODJlZV9jdGciOntuYW1lOiJZYXMgU3VpdGUg4oCUIFdlc3QiLHRpZXI6InN1aXRlIixkZXNjOiJQcml2YXRlIHN1aXRlcyBvbiB0aGUgV2VzdCBzZWN0aW9uIHdpdGggaG90ZWwgYW5kIG1hcmluYSB2aWV3cy4ifSwiNDA1ZGQzZmVlZDc1NGMzYjhmYjdkNWRiZTAwNzJhMTBfY3RnIjp7bmFtZToiWWFzIFN1aXRlIOKAlCBXZXN0IFByZW1pdW0iLHRpZXI6InN1aXRlIixkZXNjOiJQcmVtaXVtIFdlc3Qgc3VpdGVzIG92ZXIgdGhlIHN3aXRjaGJhY2sgc2VxdWVuY2UuIn0sIjZmNTMzMzk2ODJhZjQ1NTFiZWZlYTg3MzRkZmE2MTJiX2N0ZyI6e25hbWU6IllhcyBTdWl0ZSDigJQgTm9ydGgiLHRpZXI6InN1aXRlIixkZXNjOiJQcml2YXRlIHN1aXRlcyBhYm92ZSB0aGUgTm9ydGggYnJha2luZyB6b25lLiJ9LCI3ODQzODM1MDgwNDM0NDdkOTNjMjViZGNhNWJhOTE5NF9jdGciOntuYW1lOiJZYXMgU3VpdGUg4oCUIE5vcnRoIFByZW1pdW0iLHRpZXI6InN1aXRlIixkZXNjOiJQcmVtaXVtIE5vcnRoIHN1aXRlcyBvdmVyIHRoZSBjaXJjdWl04oCZcyBiZXN0IG92ZXJ0YWtpbmcgcG9pbnQuIn0sYjVjZDZhMDY2YjFiNDBmNzk1ODA0MTlkOTI2Njg3NThfY3RnOntuYW1lOiJNYXJzYSBTdWl0ZXMiLHRpZXI6InN1aXRlIixkZXNjOiJTdWl0ZSBob3NwaXRhbGl0eSBvbiB0aGUgbWFyaW5hIHNpZGUgb2YgdGhlIGNpcmN1aXQuIn0sYWJkMGYxMzQ3YjIzNDNjNGEzNWQ4YjNiMDU5ZTNmYjBfY3RnOntuYW1lOiJNYXJzYSBCb3hlcyIsdGllcjoic3VpdGUiLGRlc2M6IlByaXZhdGUgYm94ZXMgd2l0aCBtYXJpbmEtc2lkZSBwb3NpdGlvbmluZy4ifSwiOGYyYzgxZDhlNDY2NDk5MGJkMWZjYjA1MGQ5OWU3NTVfY3RnIjp7bmFtZToiTWFyaW5hIFZpZXdzIFN1aXRlIix0aWVyOiJzdWl0ZSIsZGVzYzoiU3VpdGUgaG9zcGl0YWxpdHkgbG9va2luZyBhY3Jvc3MgdGhlIG1hcmluYSBiYXNpbiB0byB0aGUgY2lyY3VpdC4ifSwiNzE3NzhhNDk0YTk3NGMxZjkxMzRmMGY2MzE4NTA3MWNfY3RnIjp7bmFtZToiVHVybiAxIEhvc3BpdGFsaXR5IFN1aXRlIix0aWVyOiJzdWl0ZSIsZGVzYzoiU3VpdGUgcG9zaXRpb25zIGRpcmVjdGx5IGFib3ZlIFR1cm4gMS4ifSwiOGJkZGU5YzFjZmFjNGVhYmExYTE0NDUzNDllNDhiMjNfY3RnIjp7bmFtZToiWWFzIFlhY2h0Iix0aWVyOiJzdWl0ZSIsZGVzYzoiSG9zcGl0YWxpdHkgaG9zdGVkIGFib2FyZCBhIHlhY2h0IGJlcnRoZWQgaW4gWWFzIE1hcmluYSDigJQgdGhlIG1vc3QgZGlzdGluY3RpdmUgc2V0dGluZyBvbiB0aGUgY2lyY3VpdC4ifSxiZDdhOTQ4YTRlNjI0MWFjYTZlY2M5ZmY1N2Q4YzBmN19jdGc6e25hbWU6IkFidSBEaGFiaSBIaWxsIix0aWVyOiJnYSIsZGVzYzoiVGhlIGdyYXNzIGhpbGwgaW5zaWRlIHRoZSBOb3J0aCBzZWN0aW9uIOKAlCBnZW5lcmFsIGFkbWlzc2lvbiB3aXRoIGEgZmVzdGl2YWwgYXRtb3NwaGVyZSBhbmQgY2xlYXIgdHJhY2sgdmlld3MuIn19LGE9e2ZhMzQ5YWZjNTE4NjRjYWNiOTVhMzk5NTVkODJiMzc5X2N0Zzp7ZnJvbTo2MTAwLHN0b2NrOiJpbiIsdXJsOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS9wcm9kdWN0L2YxLWFidS1kaGFiaS1tYWluLWdyYW5kc3RhbmQtdGlja2V0LyIsc3VtOiJIZWFydCBvZiB0aGUgR3JhbmQgUHJpeCDigJQgc3RhcnRpbmcgZ3JpZCwgcGl0IHN0b3BzLCBmaW5pc2gtbGluZSBkcmFtYSBhbmQgdGhlIHBvZGl1bSBkaXJlY3RseSBpbiBmcm9udCBvZiB5b3UuIix0aXA6IlRJUCAvLyBCUklORyBIRUFEUEhPTkVTIEZPUiBZT1VORyBGQU5TIOKAlCBHUklELVNJREUgTk9JU0UgUEVBS1MgSEVSRS4iLGluYzpbIkYxwq4gRmFuem9uZSArIGFsbCBPYXNpcyBhcmVhcyIsIkFmdGVyLVJhY2UgQ29uY2VydHMgYXQgRXRpaGFkIFBhcmsgKEdBKSIsIjEtZGF5IFlhcyB0aGVtZS1wYXJrIGFjY2VzcyIsIkVudHJ5IHRvIHNlbGVjdGVkIG11c2V1bXMiXSxpZGVhbDpbIlN0YXJ0LXRvLWZpbmlzaCBkcmFtYSIsIkZpcnN0LXRpbWVycyIsIkNlbnRyYWwgcmFjZSB2aWV3cyJdLG5vdGU6Ik1hbmRhdG9yeSAyLW5pZ2h0IEFidSBEaGFiaSBob3RlbCBzdGF5IOKAlCBhZGRlZCBhdCB0aGUgbmV4dCBzdGVwOyBwcmljZSBzaG93biBpcyB0aWNrZXQgb25seS4ifSwiOGZmNThmZWFmZTcwNGJlMGJkNzAyNWFjN2RjMjg5MTFfY3RnIjp7ZnJvbTo1MTAwLHN0b2NrOiJpbiIsdXJsOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS9wcm9kdWN0L25vcnRoLWdyYW5kc3RhbmQvIixzdW06IlJpZ2h0IGJ5IHRoZSBUdXJuIDUgYnJha2luZyB6b25lIOKAlCBoYXJkIGJyYWtpbmcsIHBvc2l0aW9uIGJhdHRsZXMsIHRoZW4gdGhlIGxhdW5jaCBvbnRvIHRoZSBsb25nZXN0IHN0cmFpZ2h0LiIsdGlwOiJUSVAgLy8gSEVBRFBIT05FUyBBRFZJU0VEIOKAlCBFTkdJTkUgTk9JU0UgUEVBS1MgT05UTyBUSEUgU1RSQUlHSFQuIixpbmM6WyJGMcKuIEZhbnpvbmUgKyBhbGwgT2FzaXMgYXJlYXMiLCJBZnRlci1SYWNlIENvbmNlcnRzIGF0IEV0aWhhZCBQYXJrIChHQSkiLCIxLWRheSBZYXMgdGhlbWUtcGFyayBhY2Nlc3MiLCJFbnRyeSB0byBzZWxlY3RlZCBtdXNldW1zIl0saWRlYWw6WyJUZWNobmljYWwgY29ybmVyaW5nIiwiQnJha2luZyArIG92ZXJ0YWtlcyIsIk5lYXIgRXRpaGFkIFBhcmsgY29uY2VydHMiXX0sZDNjYjI1OGQyOWUzNDAwYWFhNjA5ZTcxZjJmZDQ4NGFfY3RnOntmcm9tOjM3MDAsc3RvY2s6ImluIix1cmw6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3Byb2R1Y3Qvbm9ydGgtc3RyYWlnaHQvIixzdW06IkJlc2lkZSB0aGUgbG9uZ2VzdCBzdHJhaWdodCDigJQgY2FycyBhdCBtYXhpbXVtIHZlbG9jaXR5IG1ha2luZyBkZWNpc2l2ZSBvdmVydGFraW5nIG1vdmVzLiIsdGlwOiJUSVAgLy8gV0FUQ0ggRk9SIFNQQVJLUyBBUyBDQVJTIFJJREUgVEhFIEtFUkJTIEFUIEZVTEwgU1BFRUQuIixpbmM6WyJGMcKuIEZhbnpvbmUgKyBhbGwgT2FzaXMgYXJlYXMiLCJBZnRlci1SYWNlIENvbmNlcnRzIGF0IEV0aWhhZCBQYXJrIChHQSkiLCIxLWRheSBZYXMgdGhlbWUtcGFyayBhY2Nlc3MiLCJFbnRyeSB0byBzZWxlY3RlZCBtdXNldW1zIl0saWRlYWw6WyJTdHJhaWdodC1saW5lIHNwZWVkIiwiRnVsbC10aHJvdHRsZSBvdmVydGFrZXMiLCJDb25jZXJ0IHByb3hpbWl0eSJdfSwiMDkwZTE2NTJiZDJhNGZiYWIzMGNjZmFjOThjNmZjM2NfY3RnIjp7ZnJvbTo1MjAwLHN0b2NrOiJpbiIsdXJsOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS9wcm9kdWN0L3dlc3QtZ3JhbmRzdGFuZC8iLHN1bToiVHJhY2tzaWRlIG9uIHRoZSBsb25nZXN0IHN0cmFpZ2h0IOKAlCB0b3Agc3BlZWQgYmVmb3JlIHRoZSBoZWF2eSBicmFraW5nIHBvaW50IGludG8gVHVybnMgNuKAkzcuIix0aXA6IlRJUCAvLyBUSEUgQklHIE1PVkVTIExBTkQgQVQgVEhFIFQ24oCTVDcgQlJBS0lORyBQT0lOVCwgRElSRUNUTFkgSU4gVklFVy4iLGluYzpbIkYxwq4gRmFuem9uZSArIGFsbCBPYXNpcyBhcmVhcyIsIkFmdGVyLVJhY2UgQ29uY2VydHMgYXQgRXRpaGFkIFBhcmsgKEdBKSIsIjEtZGF5IFlhcyB0aGVtZS1wYXJrIGFjY2VzcyIsIkVudHJ5IHRvIHNlbGVjdGVkIG11c2V1bXMiXSxpZGVhbDpbIlB1cmUgc3BlZWQgem9uZXMiLCJPdmVydGFraW5nIGFjdGlvbiIsIk1heGltdW0gcGFjZSJdfSwiNjQ0NzkyMjdmN2M4NGEzYzgyNjVhMGVmNmM1N2IzOTJfY3RnIjp7ZnJvbTozNDUwLHN0b2NrOiJpbiIsdXJsOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS9wcm9kdWN0L3dlc3Qtc3RyYWlnaHQvIixzdW06IkFsb25nIHRoZSBydW4gdG8gVHVybnMgNuKAkzcg4oCUIHByZWNpc2lvbiBkcml2aW5nIGFuZCB3aGVlbC10by13aGVlbCByYWNpbmcgYXQgc3BlZWQuIix0aXA6IlRJUCAvLyBUUkFDSyBUSEUgQlJBS0lORyBNQVJLRVJTIOKAlCBBUEVYIFBSRUNJU0lPTiBBVCBUVVJOIDYuIixpbmM6WyJGMcKuIEZhbnpvbmUgKyBhbGwgT2FzaXMgYXJlYXMiLCJBZnRlci1SYWNlIENvbmNlcnRzIGF0IEV0aWhhZCBQYXJrIChHQSkiLCIxLWRheSBZYXMgdGhlbWUtcGFyayBhY2Nlc3MiLCJFbnRyeSB0byBzZWxlY3RlZCBtdXNldW1zIl0saWRlYWw6WyJMYXRlLWJyYWtpbmcgYWN0aW9uIiwiSGlnaC1zcGVlZCBvdmVydGFrZXMiLCJXaGVlbC10by13aGVlbCByYWNpbmciXX0sZGRhNDc0ZTU3YzcyNGJmNzk2MDZhNmJhMzJkMjYyZDJfY3RnOntmcm9tOjEyMzk1LHN0b2NrOiJpbiIsdXJsOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS9wcm9kdWN0L3N1bnNldC1sb3VuZ2UvIixzdW06IkluZG9vciBsb3VuZ2UgYW5kIHRlcnJhY2Ugb3ZlciBUdXJuIDUg4oCUIHJhY2luZyBieSBkYXksIERKLWxlZCBsb3VuZ2UgZW5lcmd5IGFzIHRoZSBzdW4gZHJvcHMuIix0aXA6IlRJUCAvLyBURVJSQUNFIEFUIExBVEUgQUZURVJOT09OIEZPUiBTVU5TRVQgU0hPVFMgT1ZFUiBUSEUgQ0lSQ1VJVC4iLGluYzpbIkxpdmUgY29va2luZyBzdGF0aW9ucyArIGZyZWUtZmxvd2luZyBiZXZlcmFnZXMiLCJJbmRvb3IgbG91bmdlICsgc3Vuc2V0IHRlcnJhY2UiLCJESi1sZWQgZW50ZXJ0YWlubWVudCIsIkYxwq4gRmFuem9uZSArIGFsbCBPYXNpcyBhcmVhcyIsIkFmdGVyLVJhY2UgQ29uY2VydHMgYXQgRXRpaGFkIFBhcmsgKEdBKSIsIjEtZGF5IFlhcyB0aGVtZS1wYXJrIGFjY2VzcyIsIkVudHJ5IHRvIHNlbGVjdGVkIG11c2V1bXMiXSxpZGVhbDpbIlJhY2luZyB3aXRoIGEgcGFydHkgdmliZSIsIlN1bnNldCArIHNvY2lhbCBlbmVyZ3kiLCJNdXNpYy1sZWQgaG9zcGl0YWxpdHkiXX0sYmQ3YTk0OGE0ZTYyNDFhY2E2ZWNjOWZmNTdkOGMwZjdfY3RnOntmcm9tOjE4MDAsc3RvY2s6ImluIix1cmw6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3Byb2R1Y3QvZjEtYWJ1LWRoYWJpLWhpbGwtdGlja2V0LyIsc3VtOiJMYWlkLWJhY2sgb3Blbi1haXIgdmlld2luZyBhY3Jvc3MgVHVybnMgMuKAkzYsIHdpdGggdGhlIGZyZWVkb20gdG8gcm9hbSBiZXR3ZWVuIHZhbnRhZ2UgcG9pbnRzLiIsdGlwOiJUSVAgLy8gQVJSSVZFIEVBUkxZIOKAlCBUSEUgQkVTVCBTUE9UUyBPTiBUSEUgSElMTCBHTyBGSVJTVC4iLGluYzpbIkYxwq4gRmFuem9uZSArIGFsbCBPYXNpcyBhcmVhcyIsIkFmdGVyLVJhY2UgQ29uY2VydHMgYXQgRXRpaGFkIFBhcmsgKEdBKSIsIjEtZGF5IFlhcyB0aGVtZS1wYXJrIGFjY2VzcyIsIkVudHJ5IHRvIHNlbGVjdGVkIG11c2V1bXMiXSxpZGVhbDpbIlJlbGF4ZWQgb3V0ZG9vciB2aWV3aW5nIiwiUGFub3JhbWljIG11bHRpLXR1cm4gdmlld3MiLCJGYW1pbHkgcGljbmljIHN0eWxlIl0sbm90ZToiTWFuZGF0b3J5IDItbmlnaHQgQWJ1IERoYWJpIGhvdGVsIHN0YXkgYXBwbGllcyB0byBIaWxsIHRpY2tldHMuIn19LG49e2ZhMzQ5YWZjNTE4NjRjYWNiOTVhMzk5NTVkODJiMzc5X2N0Zzpbe3NyYzoiMjAyNi8wNy9NQUlOLUdTLTEucG5nIixjYXA6Ik1haW4gR3JhbmRzdGFuZCJ9LHtzcmM6IjIwMjYvMDcvMzEyOTktbWFpbl9ncmFuZHN0YW5kX3lhc19tYXJpbmEtN2ZmZWJmYzIwYTk1NTg0YTlkZGViODgxMTliZDQ4YmYtMS5qcGciLGNhcDoiR3JpZCBWaWV3In0se2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0wNS5qcGciLGNhcDoiUGFub3JhbWljIHZpZXcgb3ZlciB0aGUgc3RhcnQvZmluaXNoIHN0cmFpZ2h0In1dLCI4ZmY1OGZlYWZlNzA0YmUwYmQ3MDI1YWM3ZGMyODkxMV9jdGciOlt7c3JjOiIyMDI2LzA3L25vcnRoLWdyYW5kc3RhbmQtOTczMzEuanBnIixjYXA6Ik5vcnRoIEdyYW5kc3RhbmQifV0sIjA5MGUxNjUyYmQyYTRmYmFiMzBjY2ZhYzk4YzZmYzNjX2N0ZyI6W3tzcmM6IjIwMjQvMDkvd2VzdC1ncmFuZHN0YW5kLTEucG5nIixjYXA6Ildlc3QgR3JhbmRzdGFuZCJ9LHtkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMDYuanBnIixjYXA6IlRyYWNrc2lkZSB2aWV3In1dLGJkN2E5NDhhNGU2MjQxYWNhNmVjYzlmZjU3ZDhjMGY3X2N0Zzpbe2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0wMS5qcGciLGNhcDoiR2VuZXJhbCBhZG1pc3Npb24gbGF3biJ9XSxkZGE0NzRlNTdjNzI0YmY3OTYwNmE2YmEzMmQyNjJkMl9jdGc6W3tkOiJodHRwczovL2Nkbi5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8xMC9zdW5zZXQtbG91bmdlLWNvbGxhZ2UuanBnIixjYXA6IlN1bnNldCBMb3VuZ2UifSx7c3JjOiIyMDI1LzA1L3RhYl8yX2ltYWdlLTEuanBnIixjYXA6IlN1bnNldCBUZXJyYWNlIn1dLCI2NDQ3OTIyN2Y3Yzg0YTNjODI2NWEwZWY2YzU3YjM5Ml9jdGciOlt7c3JjOiIyMDI0LzA5L3dlc3Qtc3RyYWlnaHQucG5nIixjYXA6Ildlc3QgU3RyYWlnaHQifSx7ZDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvZXNwLWYxLTA0LmpwZyIsY2FwOiJVbmRlciB0aGUgbGlnaHRzIn1dLGViYTc5NzgxM2VmYTQ1MjQ5NWYxNmE2ZjE4OTdkZGMzX2N0Zzpbe3NyYzoiMjAyNC8wOS93ZXN0LWdyYW5kc3RhbmQucG5nIixjYXA6IlNvdXRoIEdyYW5kc3RhbmQifSx7ZDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvZXNwLWYxLTA4LmpwZyIsY2FwOiJUcmFja3NpZGUgdmlldyJ9XSwiNTBhMDU2NmYwMDM2NDIwNjkwZWY3ZDc0ZDExNjIzODZfY3RnIjpbe3NyYzoiMjAyNC8wOS93ZXN0LWdyYW5kc3RhbmQtcHJlbWl1bS12aWV3MS5hdmlmIixjYXA6IlByZW1pdW0gVmlldyJ9XSwiOTU1ZWY5ODFkYjI4NDU2YmIwYWNlOGE0OTVhYmY5OGJfY3RnIjpbe3NyYzoiMjAyNC8wOS9ZYXMtTWFyaW5hLUNpcmN1aXQtMDA3LXNjYWxlZC5qcGciLGNhcDoiWWFzIE1hcmluYSJ9XSxjYWJlZWEyNmJjNTg0YTVkYjMwNjY0Y2NjNGZjYTRiYV9jdGc6W3tkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMTEuanBnIixjYXA6IlRyYWNrc2lkZSB2aWV3In0se2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0xMi5qcGciLGNhcDoiU3VpdGUgaW50ZXJpb3IifSx7ZDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvZXNwLWYxLTEzLmpwZyIsY2FwOiJTaGFtcyBTdWl0ZSJ9LHtkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMTQuanBnIixjYXA6IlNoYW1zIFN1aXRlIn0se2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0xNS5qcGciLGNhcDoiU2hhbXMgU3VpdGUifV0sIjQwNWRkM2ZlZWQ3NTRjM2I4ZmI3ZDVkYmUwMDcyYTEwX2N0ZyI6W3tkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMTIuanBnIixjYXA6IlByZW1pdW0gc3VpdGUifV0sIjQxNWRmZWIzYmY3MTRhM2Y4ZWNjODcyYjdjZWI4MmVlX2N0ZyI6W3tkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMTYuanBnIixjYXA6IlRyYWNrc2lkZSB2aWV3In0se2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0xNy5qcGciLGNhcDoiU3VpdGUgaW50ZXJpb3IifV0sIjZmNTMzMzk2ODJhZjQ1NTFiZWZlYTg3MzRkZmE2MTJiX2N0ZyI6W3tkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMTguanBnIixjYXA6IlRyYWNrc2lkZSB2aWV3In0se2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0xOS5qcGciLGNhcDoiVGVycmFjZSJ9LHtkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMjAuanBnIixjYXA6IlN1aXRlIGludGVyaW9yIn1dLCI2NmJlMzQ2OTlmY2U0MmQ5OTI2ZDg1NGUwYjc1ZmI3N19jdGciOlt7ZDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvZXNwLWYxLTIxLmpwZyIsY2FwOiJMb3VuZ2UgYW5kIHRlcnJhY2UifV0sYjg1NDFjYjhlMjQwNGZmOTgxMmZlODNkMzI2MjhjYzZfY3RnOlt7ZDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvZXNwLWYxLTIyLmpwZyIsY2FwOiJMb3VuZ2UgYW5kIHRlcnJhY2UifV0sZDNjYjI1OGQyOWUzNDAwYWFhNjA5ZTcxZjJmZDQ4NGFfY3RnOlt7ZDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvZXNwLWYxLTIzLmpwZyIsY2FwOiJBZXJpYWwgb3ZlciB0aGUgYnJha2luZyB6b25lIn0se2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0yNC5qcGciLGNhcDoiQWVyaWFsIn1dLCI4NTQwOWQxY2MxYTk0Nzk2OTQ4OWY0YzA1YzFlMzJkN19jdGciOlt7ZDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvZXNwLWYxLTI1LmpwZyIsY2FwOiJUcmFja3NpZGUifSx7ZDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvZXNwLWYxLTI2LmpwZyIsY2FwOiJEZWNrIn1dLGFmYzY3YmQ5MTQ4NjQ4NDg4YzE0ODM1M2JjNjg5N2EwX2N0Zzpbe2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0yNy5qcGciLGNhcDoiVHJhY2tzaWRlIn0se2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0yOC5qcGciLGNhcDoiRGVjayJ9XSxmNTViMjAyNWUzOTM0NzExOWM3M2FhMzBlYmNiNTQ1Yl9jdGc6W3tkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMjkuanBnIixjYXA6IkludGVyaW9yIn0se2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0yNC5qcGciLGNhcDoiQWVyaWFsIn1dfSxpPXtiZDdhOTQ4YTRlNjI0MWFjYTZlY2M5ZmY1N2Q4YzBmN19jdGc6Im91dGxpbmUifSxvPXtncmFuZHN0YW5kOiJHcmFuZHN0YW5kIixsb3VuZ2U6IkxvdW5nZSAmIFRlcnJhY2UiLHN1aXRlOiJTdWl0ZSIsZ2E6IkdlbmVyYWwgQWRtaXNzaW9uIn0sYz17Z3JhbmRzdGFuZDoiR1JEIixsb3VuZ2U6IkxORyIsc3VpdGU6IlNURSIsZ2E6IkdBIn0scj0iaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLyIscz1bImZhMzQ5YWZjNTE4NjRjYWNiOTVhMzk5NTVkODJiMzc5X2N0ZyIsIjk1NWVmOTgxZGIyODQ1NmJiMGFjZThhNDk1YWJmOThiX2N0ZyIsImJkN2E5NDhhNGU2MjQxYWNhNmVjYzlmZjU3ZDhjMGY3X2N0ZyIsImYyMmRlY2EzZDQzNzQ2MTRiMzI0YTA4YzQ1ODA4YmQwX2N0ZyIsImFhMWFhMDc3MzNjOTRlMWI4OTdmZTAyNTQxMDZiYTk4X2N0ZyJdLGQ9ZnVuY3Rpb24oZSl7cmV0dXJuIkFFRCAiK2UudG9Mb2NhbGVTdHJpbmcoImVuLVVTIil9LGw9d2luZG93Lm1hdGNoTWVkaWEmJndpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSIpLm1hdGNoZXMsdT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHA9LyhbMC05YS1mXXszMn1fY3RnKS9nLGY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1hcFdyYXAiKSxoPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtYXBTdGF0dXMiKTtpZihmKXt2YXIgbT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBUaWVyIiksZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBDb2RlIiksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBUaXRsZSIpLHY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInpwRGVzYyIpLHk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInpwTWVkaWEiKSx3PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6cFNob3RzIiksRT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBQa2ciKSxTPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6cFN0b2NrIiksTD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBQcmljZSIpLGs9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInpwU3VtIikseD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBUaXAiKSxBPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6cEluYyIpLFQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInpwSWRlYWwiKSxDPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6cE5vdGUiKSxJPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6cEN0YUJvb2siKSxCPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6cEN0YUVucXVpcmUiKSxNPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6cFF1aWNrTGlua3MiKSxob3RlbEN0YT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJbZGF0YS1lcy1ob3RlbC1jdGFdIiksXz1udWxsLFA9bnVsbCxOPW51bGw7IWZ1bmN0aW9uKCl7dmFyIGU9e307T2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgbj10W2FdO2Vbbi50aWVyXT0oZVtuLnRpZXJdfHwwKSsxLG4uY29kZT0oY1tuLnRpZXJdfHwiWk4iKSsiLSIrU3RyaW5nKGVbbi50aWVyXSkucGFkU3RhcnQoMiwiMCIpfSk7dmFyIGE9T2JqZWN0LmtleXModCkubGVuZ3RoO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIiNtYXBGaWx0ZXJzIFtkYXRhLWNvdW50XSIpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49dC5kYXRhc2V0LmNvdW50O3QudGV4dENvbnRlbnQ9U3RyaW5nKCJhbGwiPT09bj9hOmVbbl18fDApLnBhZFN0YXJ0KDIsIjAiKX0pfSgpLHkucXVlcnlTZWxlY3RvcigiLnByZXYiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt3LnNjcm9sbEJ5KHtsZWZ0Oi13LmNsaWVudFdpZHRoLGJlaGF2aW9yOmw/ImF1dG8iOiJzbW9vdGgifSl9KSx5LnF1ZXJ5U2VsZWN0b3IoIi5uZXh0IikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dy5zY3JvbGxCeSh7bGVmdDp3LmNsaWVudFdpZHRoLGJlaGF2aW9yOmw/ImF1dG8iOiJzbW9vdGgifSl9KSxzLmZvckVhY2goZnVuY3Rpb24oZSl7aWYodFtlXSl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7YS50eXBlPSJidXR0b24iLGEudGV4dENvbnRlbnQ9dFtlXS5uYW1lLGEuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dmFyIGE9TiYmTi5xdWVyeVNlbGVjdG9yKCdbZGF0YS1lcy1pZD0iJytlKyciXScpO0soT2JqZWN0LmFzc2lnbih7aWQ6ZX0sdFtlXSksYXx8bnVsbCl9KSxNLmFwcGVuZENoaWxkKGEpfX0pLGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5waWNrLWNhcmRbZGF0YS16b25lXSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt2YXIgYT1lLmRhdGFzZXQuem9uZS50b0xvd2VyQ2FzZSgpLG49bnVsbDtpZihPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe258fDA9PT10W2VdLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKGEpJiYobj1lKX0pLG4pe3ZhciBpPU4mJk4ucXVlcnlTZWxlY3RvcignW2RhdGEtZXMtaWQ9IicrbisnIl0nKTtLKE9iamVjdC5hc3NpZ24oe2lkOm59LHRbbl0pLGl8fG51bGwpLGYuc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOmw/ImF1dG8iOiJzbW9vdGgiLGJsb2NrOiJjZW50ZXIifSl9fSl9KSxkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIjbWFwRmlsdGVycyAubWFwLWNoaXAiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiI21hcEZpbHRlcnMgLm1hcC1jaGlwIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpfSksZS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKTt2YXIgdD1lLmRhdGFzZXQudGllcjtmLnF1ZXJ5U2VsZWN0b3JBbGwoIi5lcy16b25lIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgYT1XKGUpO2UuY2xhc3NMaXN0LnRvZ2dsZSgiZXMtZGltIiwiYWxsIiE9PXQmJighYXx8YS50aWVyIT09dCkpfSksUCYmXyYmKFAuc3R5bGUuZGlzcGxheT1fLmNsYXNzTGlzdC5jb250YWlucygiZXMtZGltIik/Im5vbmUiOiIiKX0pfSk7dmFyIHE9bnVsbCxPPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6b25lUGFuZWwiKSxSPU8ucGFyZW50RWxlbWVudDsiUmVzaXplT2JzZXJ2ZXIiaW4gd2luZG93P25ldyBSZXNpemVPYnNlcnZlcihaKS5vYnNlcnZlKGYpOndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLFopO3ZhciB6PXdpbmRvdy5tYXRjaE1lZGlhKCIobWF4LXdpZHRoOiA5ODBweCkiKSxIPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6b25lTW9kYWwiKSxqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6bUhvc3QiKSxHPW51bGw7SC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1jbG9zZS16bV0iKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLFgpfSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oZSl7IkVzY2FwZSIhPT1lLmtleXx8SC5oaWRkZW58fFgoKX0pLEkmJkkuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLFgpLEImJkIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLFgpO3ZhciBGPWZ1bmN0aW9uKCl7SC5oaWRkZW58fFgoKSxRKCl9O3ouYWRkRXZlbnRMaXN0ZW5lcj96LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsRik6ei5hZGRMaXN0ZW5lciYmei5hZGRMaXN0ZW5lcihGKSxRKCksZnVuY3Rpb24gdCgpe2lmKCFoKXtyZXR1cm59aC5pbm5lckhUTUw9IjxzcGFuPkxvYWRpbmcgY2lyY3VpdCBnZW9tZXRyeTwvc3Bhbj4iLGZldGNoKGUpLnRoZW4oZnVuY3Rpb24oZSl7aWYoIWUub2spdGhyb3cgbmV3IEVycm9yKCJIVFRQICIrZS5zdGF0dXMpO3JldHVybiBlLnRleHQoKX0pLnRoZW4oZnVuY3Rpb24oZSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5pbm5lckhUTUw9ZS5yZXBsYWNlKC88XD94bWxbXHNcU10qP1w/Pi9nLCIiKS5yZXBsYWNlKC88IURPQ1RZUEVbXHNcU10qPz4vZ2ksIiIpO3ZhciBhPXQucXVlcnlTZWxlY3Rvcigic3ZnIik7aWYoIWEpdGhyb3cgbmV3IEVycm9yKCJObyBTVkcgaW4gcmVzcG9uc2UiKTtoLnJlbW92ZSgpLGYuaW5zZXJ0QmVmb3JlKGEsZi5maXJzdENoaWxkKSxKKGEpLFooKTt2YXIgbj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWFwU2NhbiIpO24mJiFsJiYobi5jbGFzc0xpc3QuYWRkKCJydW4iKSxuLmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmVuZCIsZnVuY3Rpb24oKXtuLmNsYXNzTGlzdC5yZW1vdmUoInJ1biIpfSx7b25jZTohMH0pKX0pLmNhdGNoKGZ1bmN0aW9uKCl7aC5pbm5lckhUTUw9IjxzcGFuPlRoZSBjaXJjdWl0IG1hcCBjb3VsZCBub3QgYmUgbG9hZGVkLiBDaGVjayB0aGUgY29ubmVjdGlvbiBhbmQgdHJ5IGFnYWluLjwvc3Bhbj4iO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpO2UudHlwZT0iYnV0dG9uIixlLnRleHRDb250ZW50PSJSZWxvYWQgdGhlIG1hcCIsZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdCksaC5hcHBlbmRDaGlsZChlKX0pfSgpfWZ1bmN0aW9uIEQoZSl7dmFyIHQsYT0oZS5pZHx8IiIpKyIgIisoZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKSxuPVtdO2ZvcihwLmxhc3RJbmRleD0wO3Q9cC5leGVjKGEpOyluLmluZGV4T2YodFsxXSk8MCYmbi5wdXNoKHRbMV0pO3JldHVybiBufWZ1bmN0aW9uIFcoZSl7Zm9yKHZhciBhPUQoZSksbj0wO248YS5sZW5ndGg7bisrKWlmKHRbYVtuXV0pcmV0dXJuIE9iamVjdC5hc3NpZ24oe2lkOmFbbl19LHRbYVtuXV0pO3JldHVybiBudWxsfWZ1bmN0aW9uIFkoZSl7dHJ5e2lmKCFQKXJldHVybjtpZighZSlyZXR1cm4gdm9pZChQLnN0eWxlLmRpc3BsYXk9Im5vbmUiKTt2YXIgdD1QLm93bmVyU1ZHRWxlbWVudCxhPXQudmlld0JveC5iYXNlVmFsLG49ZnVuY3Rpb24oZSx0KXt2YXIgYT10LmdldEJCb3goKSxuPWUuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpLm11bHRpcGx5KHQuZ2V0U2NyZWVuQ1RNKCkpLGk9W1thLngsYS55XSxbYS54K2Eud2lkdGgsYS55XSxbYS54LGEueSthLmhlaWdodF0sW2EueCthLndpZHRoLGEueSthLmhlaWdodF1dLm1hcChmdW5jdGlvbih0KXt2YXIgYT1lLmNyZWF0ZVNWR1BvaW50KCk7cmV0dXJuIGEueD10WzBdLGEueT10WzFdLGEubWF0cml4VHJhbnNmb3JtKG4pfSksbz1pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS54fSksYz1pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS55fSk7cmV0dXJue3g6TWF0aC5taW4uYXBwbHkoMCxvKSx5Ok1hdGgubWluLmFwcGx5KDAsYyksdzpNYXRoLm1heC5hcHBseSgwLG8pLU1hdGgubWluLmFwcGx5KDAsbyksaDpNYXRoLm1heC5hcHBseSgwLGMpLU1hdGgubWluLmFwcGx5KDAsYyl9fSh0LGUpLGk9LjAwNiooYSYmYS53aWR0aD9hLndpZHRoOjkwMCksbz1uLngtaSxjPW4ueS1pLHI9bi53KzIqaSxzPW4uaCsyKmksZD0uMypNYXRoLm1pbihyLHMpO1AuaW5uZXJIVE1MPSc8cGF0aCBkPSJNJytvKyIgIisoYytkKSsiIFYiK2MrIiBIIisobytkKSsiIE0iKyhvK3ItZCkrIiAiK2MrIiBIIisobytyKSsiIFYiKyhjK2QpKyIgTSIrKG8rcikrIiAiKyhjK3MtZCkrIiBWIisoYytzKSsiIEgiKyhvK3ItZCkrIiBNIisobytkKSsiICIrKGMrcykrIiBIIitvKyIgViIrKGMrcy1kKSsnIiBmaWxsPSJub25lIi8+PGNpcmNsZSBjeD0iJysobytyLzIpKyciIGN5PSInKyhjK3MvMikrJyIgcj0iJysuNSppKyciLz4nLFAuc3R5bGUuZGlzcGxheT0iIixsfHwoUC5jbGFzc0xpc3QucmVtb3ZlKCJvbiIpLFAuZ2V0QkJveCgpLFAuY2xhc3NMaXN0LmFkZCgib24iKSl9Y2F0Y2godSl7UCYmKFAuc3R5bGUuZGlzcGxheT0ibm9uZSIpfX1mdW5jdGlvbiBWKGUpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmLWNhdCIpLGE9IkFub3RoZXIgem9uZSI7aWYodClmb3IodmFyIG49MDtuPHQub3B0aW9ucy5sZW5ndGg7bisrKWlmKHQub3B0aW9uc1tuXS50ZXh0PT09ZSl7YT1lO2JyZWFrfUImJkIuc2V0QXR0cmlidXRlKCJkYXRhLWNhdCIsYSl9ZnVuY3Rpb24gZXNFRUJjYXQoZSl7dmFyIGF2PXdpbmRvdy5FRUJfYXZhaWxhYmlsaXR5JiZ3aW5kb3cuRUVCX2F2YWlsYWJpbGl0eSgpLG5tPWZ1bmN0aW9uKHMpe3JldHVybiBTdHJpbmcoc3x8IiIpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXCtccypob3RlbFxzKiQvLCIiKS5yZXBsYWNlKC9bXmEtejAtOV0vZywiIil9LG91dD1udWxsO2lmKGF2JiZhdi5jYXRlZ29yaWVzKU9iamVjdC5rZXlzKGF2LmNhdGVnb3JpZXMpLmZvckVhY2goZnVuY3Rpb24oayl7dmFyIGM9YXYuY2F0ZWdvcmllc1trXTshb3V0JiZubShjLm5hbWUpPT09bm0oZS5uYW1lKSYmKG91dD17aWQ6ayxjOmN9KX0pO3JldHVybiBvdXR9ZnVuY3Rpb24gZXNFRUJjdGEoZSx0LG4sZCl7dmFyIGNhdD1lc0VFQmNhdChlKSxjaWQ9Y2F0JiZjYXQuaWQsYz1jYXQmJmNhdC5jLGVucT0iaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvY29udGFjdC8/ZWViX2V2ZW50PWYxYWQyNiZlZWJfcmVhc29uPW9uLXJlcXVlc3QiKyhjaWQ/IiZlZWJfY2F0ZWdvcnk9IitjaWQ6IiIpO2lmKEkpe0kub25jbGljaz1udWxsO0kuaGlkZGVuPSEwO0kucmVtb3ZlQXR0cmlidXRlKCJocmVmIik7fWlmKCFCKXJldHVybjtpZihlJiZlLmlkPT09ImZhMzQ5YWZjNTE4NjRjYWNiOTVhMzk5NTVkODJiMzc5X2N0ZyIpe0IuaGlkZGVuPSEwO3JldHVybn1CLmhpZGRlbj0hMTtCLnRleHRDb250ZW50PSJFbnF1aXJlIGFib3V0IHRoaXMgem9uZSI7Qi5ocmVmPShjJiZjLmVucXVpcnkpfHxlbnF9ZnVuY3Rpb24gVShlKXt2YXIgdD1lJiZhW2UuaWRdO2lmKGhvdGVsQ3RhKWhvdGVsQ3RhLmhpZGRlbj0hKGUmJmUuaWQ9PT0iZmEzNDlhZmM1MTg2NGNhY2I5NWEzOTk1NWQ4MmIzNzlfY3RnIik7aWYoIXQpcmV0dXJuIEUuaGlkZGVuPSEwLEkmJihJLmhpZGRlbj0hMCksQiYmKEIuaGlkZGVuPSExLEIudGV4dENvbnRlbnQ9IkVucXVpcmUgYWJvdXQgdGhpcyB6b25lIiksdm9pZCBWKGU/ZS5uYW1lOiIiKTtFLmhpZGRlbj0hMTt2YXIgZWM9ZXNFRUJjYXQoZSkscGY9KGUmJmUuaWQ9PT0iZmEzNDlhZmM1MTg2NGNhY2I5NWEzOTk1NWQ4MmIzNzlfY3RnIik/NjEwMDooZWMmJmVjLmMuZnJvbT9lYy5jLmZyb206dC5mcm9tKSxuPSJvdXQiPT09dC5zdG9jaztlYyYmKG49InNvbGQtb3V0Ij09PWVjLmMuc3RhdGUpO1MudGV4dENvbnRlbnQ9bj8iU29sZCBvdXQiOiJBdmFpbGFibGUiLFMuY2xhc3NMaXN0LnRvZ2dsZSgib3V0IixuKSxmdW5jdGlvbihlKXtxJiZjYW5jZWxBbmltYXRpb25GcmFtZShxKTtpZihsKXJldHVybiB2b2lkKEwudGV4dENvbnRlbnQ9ZChlKSk7dmFyIHQ9bnVsbCxhPTYwMCxuPWZ1bmN0aW9uKGUpe3JldHVybiAxLU1hdGgucG93KDEtZSwzKX0saT1mdW5jdGlvbihvKXtudWxsPT09dCYmKHQ9byk7dmFyIGM9TWF0aC5taW4oMSwoby10KS9hKTtMLnRleHRDb250ZW50PWQoTWF0aC5yb3VuZChlKm4oYykpKSxjPDE/cT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaSk6KEwudGV4dENvbnRlbnQ9ZChlKSxxPW51bGwpfTtxPXJlcXVlc3RBbmltYXRpb25GcmFtZShpKX0ocGYpLGsudGV4dENvbnRlbnQ9dC5zdW0seC50ZXh0Q29udGVudD0odC50aXB8fCIiKS5yZXBsYWNlKC9eVElQXHMqXC9cL1xzKi9pLCJUaXA6ICIpLEEuaW5uZXJIVE1MPSIiLCh0LmluY3x8W10pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC50ZXh0Q29udGVudD1lLEEuYXBwZW5kQ2hpbGQodCl9KSxULmlubmVySFRNTD0iIiwodC5pZGVhbHx8W10pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO3QudGV4dENvbnRlbnQ9ZSxULmFwcGVuZENoaWxkKHQpfSksQy5oaWRkZW49IXQubm90ZSx0Lm5vdGUmJihDLnRleHRDb250ZW50PXQubm90ZSksZXNFRUJjdGEoZSx0LG4sZCl9ZnVuY3Rpb24gSyhlLHQpe18mJl8uY2xhc3NMaXN0LnJlbW92ZSgiZXMtYWN0aXZlIiksKF89dHx8bnVsbCkmJl8uY2xhc3NMaXN0LmFkZCgiZXMtYWN0aXZlIiksWShfKSxtLnRleHRDb250ZW50PW9bZS50aWVyXXx8IlpvbmUiLGcudGV4dENvbnRlbnQ9ZS5jb2RlLGIudGV4dENvbnRlbnQ9ZS5uYW1lLHYudGV4dENvbnRlbnQ9ZS5kZXNjLGZ1bmN0aW9uKGUpe3ZhciB0PWUmJm5bZS5pZF07aWYody5pbm5lckhUTUw9IiIsdy5zY3JvbGxMZWZ0PTAsdCYmdC5sZW5ndGgpe3ZhciBhPTA7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO24uY2xhc3NOYW1lPSJ6cC1zaG90Ijt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTtpZihpLmxvYWRpbmc9ImxhenkiLGkuZGVjb2Rpbmc9ImFzeW5jIixpLmFsdD1lLm5hbWUrKHQuY2FwPyIsICIrdC5jYXA6IiIpLGkuc3JjPXQuZD90LmQ6L14oZGF0YTp8aHR0cHM/OikvLnRlc3QodC5zcmMpP3Quc3JjOnIrdC5zcmMsaS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtuLnJlbW92ZSgpLHcucXVlcnlTZWxlY3RvcigiLnpwLXNob3QiKXx8KHkuaGlkZGVuPSEwKX0pLG4uYXBwZW5kQ2hpbGQoaSksdC5jYXApe3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO28uY2xhc3NOYW1lPSJjYXAiLG8udGV4dENvbnRlbnQ9dC5jYXAsbi5hcHBlbmRDaGlsZChvKX13LmFwcGVuZENoaWxkKG4pLGErK30pLHkuaGlkZGVuPTA9PT1hfWVsc2UgeS5oaWRkZW49ITB9KGUpLFUoZSk7dmFyIGEsaT1PLnF1ZXJ5U2VsZWN0b3IoIi56cC1zY3JvbGwiKTtpJiYoaS5zY3JvbGxUb3A9MCxsfHwoaS5jbGFzc0xpc3QucmVtb3ZlKCJzd2FwIiksaS5vZmZzZXRXaWR0aCxpLmNsYXNzTGlzdC5hZGQoInN3YXAiKSkpLHoubWF0Y2hlcyYmKFEoKSxjbGVhclRpbWVvdXQoRyksSC5jbGFzc0xpc3QucmVtb3ZlKCJpcy1jbG9zaW5nIiksSC5oaWRkZW49ITEsKGE9d2luZG93LmlubmVyV2lkdGgtZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKT4wJiYoZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ9YSsicHgiKSxkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLEgub2Zmc2V0V2lkdGgsSC5jbGFzc0xpc3QuYWRkKCJpcy1vcGVuIikpfWZ1bmN0aW9uICQoZSl7dmFyIHQ9ZS52aWV3Qm94JiZlLnZpZXdCb3guYmFzZVZhbDshZnVuY3Rpb24oZSx0KXt0cnl7dmFyIGE9WyJHRU5FUkFMIEFETUlTU0lPTiIsIkdFTkVSQUwiLCJBRE1JU1NJT04iLCJHUkFORFNUQU5EUyIsIkdSQU5EU1RBTkQiLCJIT1NQSVRBTElUWSIsIkxPVU5HRVMiLCJTVUlURVMiLCJMRUdFTkQiLCJLRVkiXSxuPWZ1bmN0aW9uKGUpe3JldHVybiBhLmluZGV4T2YoZnVuY3Rpb24oZSl7cmV0dXJuKGV8fCIiKS5yZXBsYWNlKC9ccysvZywiICIpLnRyaW0oKS50b1VwcGVyQ2FzZSgpfShlKSk+PTB9LGk9dCYmdC53aWR0aD90LndpZHRoOjkwMDtlLnF1ZXJ5U2VsZWN0b3JBbGwoInRleHQsIHRzcGFuIikuZm9yRWFjaChmdW5jdGlvbihlKXtpZihuKGUudGV4dENvbnRlbnQpKXt2YXIgdD1lLmNsb3Nlc3QoInRleHQiKXx8ZTt0LnN0eWxlLmRpc3BsYXk9Im5vbmUiO3ZhciBhPXQucHJldmlvdXNFbGVtZW50U2libGluZzthJiYvXihyZWN0fHBhdGh8cG9seWdvbnxjaXJjbGUpJC9pLnRlc3QoYS50YWdOYW1lKSYmKGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpfX0pLGUucXVlcnlTZWxlY3RvckFsbCgiZyIpLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoImVzLWxvY2siIT09ZS5pZCl7dmFyIHQ9ZS5xdWVyeVNlbGVjdG9yQWxsKCJ0ZXh0Iik7aWYodC5sZW5ndGgpe3ZhciBhPUFycmF5LnByb3RvdHlwZS5ldmVyeS5jYWxsKHQsZnVuY3Rpb24oZSl7cmV0dXJuIG4oZS50ZXh0Q29udGVudCl9KSxpPWUucXVlcnlTZWxlY3RvcignW2NsYXNzKj0iX2N0ZyJdJyl8fC9fY3RnLy50ZXN0KGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIik7YSYmIWkmJihlLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX19fSksZS5xdWVyeVNlbGVjdG9yQWxsKCJyZWN0LCBwYXRoLCBwb2x5Z29uLCBjaXJjbGUiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKCFlLmNsb3Nlc3QoJ1tjbGFzcyo9Il9jdGciXScpJiYhZS5jbG9zZXN0KCJkZWZzIikpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIjtpZighL3RyYWNrLXxjdXJ2ZS18ZmxhZy18ZXMtem9uZS8udGVzdCh0KSl0cnl7dmFyIGE9ZS5nZXRCQm94KCk7aWYoYS53aWR0aD49LjAzNSppfHxhLmhlaWdodD49LjAzNSppKXJldHVybjt2YXIgbj0oZ2V0Q29tcHV0ZWRTdHlsZShlKS5maWxsfHwiIikubWF0Y2goL3JnYmE/XCgoXGQrKSxccyooXGQrKSxccyooXGQrKS8pO2lmKCFuKXJldHVybjsuMjEyNipuWzFdKy43MTUyKm5bMl0rLjA3MjIqblszXTw0OCYmKGUuc3R5bGUuZGlzcGxheT0ibm9uZSIpfWNhdGNoKG8pe319fSl9Y2F0Y2gobyl7fX0oZSx0KTt0cnl7dmFyIGE9ZS5nZXRCQm94KCk7aWYoYSYmYS53aWR0aD41MCYmYS5oZWlnaHQ+NTApe3ZhciBuPS4wMjUqYS53aWR0aCxpPS4wNDUqYS5oZWlnaHQ7ZS5zZXRBdHRyaWJ1dGUoInZpZXdCb3giLGEueC1uKyIgIisoYS55LWkpKyIgIisoYS53aWR0aCsyKm4pKyIgIisoYS5oZWlnaHQrMippKSksdD1lLnZpZXdCb3guYmFzZVZhbH19Y2F0Y2gocil7fXZhciBvPU1hdGgubWF4KDQsKHQmJnQud2lkdGg/dC53aWR0aDo5MDApLzE2MCk7ZS5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1oYXRjaFNoaWZ0IiwuOCpvKyJweCIpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh1LCJkZWZzIik7Yy5pbm5lckhUTUw9JzxwYXR0ZXJuIGlkPSJlc0hhdGNoIiB3aWR0aD0iJytvKyciIGhlaWdodD0iJytvKyciIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiIHBhdHRlcm5UcmFuc2Zvcm09InJvdGF0ZSg0NSkiPjxyZWN0IHdpZHRoPSInK28rJyIgaGVpZ2h0PSInK28rJyIgZmlsbD0icmdiYSgyMzUsMTgwLDcwLDAuMjApIi8+PGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IicrbysnIiBzdHJva2U9InJnYmEoMjM1LDE4MCw3MCwwLjU1KSIgc3Ryb2tlLXdpZHRoPSInKy4xOCpvKyciLz48L3BhdHRlcm4+PHBhdHRlcm4gaWQ9ImVzSGF0Y2hIb3QiIHdpZHRoPSInKy44Km8rJyIgaGVpZ2h0PSInKy44Km8rJyIgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcGF0dGVyblRyYW5zZm9ybT0icm90YXRlKDQ1KSI+PHJlY3Qgd2lkdGg9IicrLjgqbysnIiBoZWlnaHQ9IicrLjgqbysnIiBmaWxsPSJyZ2JhKDIzNSwxODAsNzAsMC4zNCkiLz48bGluZSB4MT0iMCIgeTE9IjAiIHgyPSIwIiB5Mj0iJysuOCpvKyciIHN0cm9rZT0icmdiYSgyMzUsMTgwLDcwLDAuOTUpIiBzdHJva2Utd2lkdGg9IicrLjIyKm8rJyIvPjwvcGF0dGVybj4nLGUuaW5zZXJ0QmVmb3JlKGMsZS5maXJzdENoaWxkKX1mdW5jdGlvbiBKKGUpe2UuY2xhc3NMaXN0LmFkZCgidmVudWUiKSxlLnJlbW92ZUF0dHJpYnV0ZSgid2lkdGgiKSxlLnJlbW92ZUF0dHJpYnV0ZSgiaGVpZ2h0IiksJChlKTt2YXIgbj0icGF0aCxwb2x5Z29uLHJlY3QsY2lyY2xlIixvPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChlLnF1ZXJ5U2VsZWN0b3JBbGwoIioiKSxmdW5jdGlvbihlKXtpZighRChlKS5sZW5ndGgpcmV0dXJuITE7dmFyIHQ9ZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImciPT09dD8hIWUucXVlcnlTZWxlY3RvcihuKTpuLmluZGV4T2YodCk+PTB9KSxjPW8uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiJnIj09PWUudGFnTmFtZS50b0xvd2VyQ2FzZSgpJiYhby5zb21lKGZ1bmN0aW9uKHQpe3JldHVybiB0IT09ZSYmZS5jb250YWlucyh0KSYmRCh0KS5qb2luKCkhPT1EKGUpLmpvaW4oKX0pfSkscj1jLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hYy5zb21lKGZ1bmN0aW9uKHQpe3JldHVybiB0IT09ZSYmdC5jb250YWlucyhlKX0pfSkscz1yLmNvbmNhdChvLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4iZyIhPT1lLnRhZ05hbWUudG9Mb3dlckNhc2UoKSYmIXIuc29tZShmdW5jdGlvbih0KXtyZXR1cm4gdC5jb250YWlucyhlKX0pfSkpO2Z1bmN0aW9uIGQoZSx0KXtlLmNsYXNzTGlzdC5hZGQoImVzLXpvbmUiKSx0JiYoZS5kYXRhc2V0LmVzSWQ9dC5pZCxhW3QuaWRdJiZlLmNsYXNzTGlzdC5hZGQoImVzLXBrZyIpLCJvdXRsaW5lIj09PWlbdC5pZF0mJmUuY2xhc3NMaXN0LmFkZCgiZXMtb3V0bGluZSIpLGUuc2V0QXR0cmlidXRlKCJyb2xlIiwiYnV0dG9uIiksZS5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiMCIpLGUuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIix0Lm5hbWUrIiwgIit0LmNvZGUpLGUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCl9KSxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpLEsodCxlKX0pLGUuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oYSl7IkVudGVyIiE9PWEua2V5JiYiICIhPT1hLmtleXx8KGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpLEsodCxlKSl9KSl9cy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2QoZSxXKGUpKX0pO3ZhciBsPXt9O3MuZm9yRWFjaChmdW5jdGlvbihlKXtEKGUpLmZvckVhY2goZnVuY3Rpb24oZSl7bFtlXT0hMH0pfSksT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihlKXtpZighbFtlXSl7dmFyIGE9by5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIEQodCkuaW5kZXhPZihlKT49MH0pO2EubGVuZ3RoJiZkKGFbYS5sZW5ndGgtMV0sT2JqZWN0LmFzc2lnbih7aWQ6ZX0sdFtlXSkpfX0pLE49ZSxQPWZ1bmN0aW9uKGUpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh1LCJnIik7cmV0dXJuIHQuc2V0QXR0cmlidXRlKCJpZCIsImVzLWxvY2siKSx0LnN0eWxlLmRpc3BsYXk9Im5vbmUiLGUuYXBwZW5kQ2hpbGQodCksdH0oZSl9ZnVuY3Rpb24gWigpe3oubWF0Y2hlc3x8Ty5wYXJlbnRFbGVtZW50IT09Uj9PLnN0eWxlLmhlaWdodD0iIjpPLnN0eWxlLmhlaWdodD1mLm9mZnNldEhlaWdodCsicHgifWZ1bmN0aW9uIFEoKXt6Lm1hdGNoZXM/Ty5wYXJlbnRFbGVtZW50IT09aiYmai5hcHBlbmRDaGlsZChPKTooTy5wYXJlbnRFbGVtZW50IT09UiYmUi5hcHBlbmRDaGlsZChPKSxaKCkpfWZ1bmN0aW9uIFgoKXtILmhpZGRlbnx8KEguY2xhc3NMaXN0LnJlbW92ZSgiaXMtb3BlbiIpLEguY2xhc3NMaXN0LmFkZCgiaXMtY2xvc2luZyIpLGNsZWFyVGltZW91dChHKSxHPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgZTtILmhpZGRlbj0hMCxILmNsYXNzTGlzdC5yZW1vdmUoImlzLWNsb3NpbmciKSwoZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmZpTW9kYWwiKSkmJiFlLmhpZGRlbnx8KGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c9IiIsZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ9IiIpfSxsPzA6MjYwKSl9fSgpLGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmLWNhdCIpO2UmJmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWNhdF0iKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7Zm9yKHZhciBhPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWNhdCIpLG49MDtuPGUub3B0aW9ucy5sZW5ndGg7bisrKWlmKGUub3B0aW9uc1tuXS50ZXh0PT09YSlyZXR1cm4gdm9pZChlLnNlbGVjdGVkSW5kZXg9bil9KX0pfSgpLGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBlPXdpbmRvdy5tYXRjaE1lZGlhJiZ3aW5kb3cubWF0Y2hNZWRpYSgiKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkiKS5tYXRjaGVzLHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnN0YXRzIC5zdGF0IC5uIikpO2lmKHQubGVuZ3RoJiYhZSYmIkludGVyc2VjdGlvbk9ic2VydmVyImluIHdpbmRvdyl7dmFyIGE9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50ZXh0Q29udGVudC50cmltKCksYT10Lm1hdGNoKC9eKFxkKykoSz9cKz8pJC8pO2lmKGEpe3ZhciBuPXBhcnNlSW50KGFbMV0sMTApLGk9YVsyXXx8IiIsbz1hWzFdLmxlbmd0aCxjPW51bGwscj1mdW5jdGlvbihhKXtudWxsPT09YyYmKGM9YSk7Zm9yKHZhciBzLGQ9TWF0aC5taW4oMSwoYS1jKS8xNDAwKSxsPU1hdGgucm91bmQobioocz1kLDEtTWF0aC5wb3coMS1zLDMpKSksdT1TdHJpbmcobCk7dS5sZW5ndGg8bzspdT0iMCIrdTtlLnRleHRDb250ZW50PXUraSxkPDE/cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHIpOmUudGV4dENvbnRlbnQ9dH07cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHIpfX0sbj1uZXcgV2Vha1NldCxpPW5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbihlKXtlLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5pc0ludGVyc2VjdGluZyYmIW4uaGFzKGUudGFyZ2V0KSYmKG4uYWRkKGUudGFyZ2V0KSxhKGUudGFyZ2V0KSxpLnVub2JzZXJ2ZShlLnRhcmdldCkpfSl9LHt0aHJlc2hvbGQ6LjV9KTt0LmZvckVhY2goZnVuY3Rpb24oZSl7aS5vYnNlcnZlKGUpfSl9fSgpLGZ1bmN0aW9uKCl7aWYoKCF3aW5kb3cubWF0Y2hNZWRpYXx8IXdpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSIpLm1hdGNoZXMpJiYiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiaW4gd2luZG93KXtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgibW8iKTt2YXIgZT1bIi5zdGFjayA+IC5pdGVtIiwiLmFjYy1pdGVtIiwiLmZhcS1pdGVtIiwiLmJvdXQiLCIudnN0b3J5IiwiLnRrYm94IiwiLmFiLWZyYW1lIiwiLmNtcCB0Ym9keSB0ZCIsIi5jbXAgdGhlYWQgdGgiLCIudGFwZS1jZWxsIiwiLnZzLXJvdyIsIi52ZW51ZS1zcGVjcyA+ICoiLCIuenAtdGllciIsIi50a2dyaWQgdGQiLCIuc3RhdHMgPiAuc3RhdCIsIi5zdGF0cyA+IC5zdCIsIi52aXRhbHMgPiAudml0YWwiLCIuaGVyby1tZXRhID4gLmhtIiwiLnRpZXJzID4gLnRpZXIiLCIudmdyaWQgPiAudmJsb2NrIiwiLmtjLWNhcmQiLCIuYWItc3BlYyIsIi5pbmMtbGlzdCA+IGxpIiwiLmFydHMgPiAuYXJ0IiwiLmZvcmsgPiAucm91dGUiLCIuY2F0YWxvZ3VlIC5uY2FyZCIsIi5vY2FyZCIsIi5wY2FyZCIsIi5iY2FyZCIsIi5wY2FyZHAiLCIuZml2ZXctZ3JpZCA+ICoiLCIubG9nb3MgPiAubG9nbyIsIi5lc20tYmFuZCIsIi5tYXAtY2hpcCIsIi50YXBlLWdyaWQgPiAudGFwZS1jZWxsIiwiLmdjYXJkIl0sdD1lLmpvaW4oIiwiKTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1tb10iKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UubWF0Y2hlcyh0KXx8ZS5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtbW8iKX0pO3ZhciBhPVtdO2lmKGUuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdCxuPW51bGwsaT0wO3RyeXt0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZSl9Y2F0Y2gobyl7cmV0dXJufXQuZm9yRWFjaChmdW5jdGlvbihlKXtpZighZS5oYXNBdHRyaWJ1dGUoImRhdGEtbW8iKSl7dmFyIHQ9ZS5wYXJlbnROb2RlO2k9dD09PW4/aSsxOjAsbj10LGUuc2V0QXR0cmlidXRlKCJkYXRhLW1vIiwiIiksZS5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1tby1kIixNYXRoLm1pbig1MCppLDMwMCkrIm1zIiksYS5wdXNoKGUpfX0pfSksYS5sZW5ndGgpe3ZhciBuPW5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbihlKXtlLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5pc0ludGVyc2VjdGluZyYmKGUudGFyZ2V0LmNsYXNzTGlzdC5hZGQoIm1vLWxpdCIpLG4udW5vYnNlcnZlKGUudGFyZ2V0KSl9KX0se3Jvb3RNYXJnaW46IjBweCAwcHggLTYlIDBweCIsdGhyZXNob2xkOi4wNX0pO2EuZm9yRWFjaChmdW5jdGlvbihlKXtuLm9ic2VydmUoZSl9KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKCFlLmNsYXNzTGlzdC5jb250YWlucygibW8tbGl0Iikpe3ZhciB0PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dC50b3A8aW5uZXJIZWlnaHQmJnQuYm90dG9tPjAmJmUuY2xhc3NMaXN0LmFkZCgibW8tbGl0Iil9fSl9LDRlMyksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe2EuZm9yRWFjaChmdW5jdGlvbihlKXtpZighZS5jbGFzc0xpc3QuY29udGFpbnMoIm1vLWxpdCIpKXt2YXIgdD1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3QudG9wPGlubmVySGVpZ2h0JiZ0LmJvdHRvbT4wJiZ0LmhlaWdodCYmZS5jbGFzc0xpc3QuYWRkKCJtby1saXQiKX19KX0sNjApfSl9fX0oKSxmdW5jdGlvbigpe1sieHFGb3JtIiwicmZpIl0uZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKTt0JiZ0LmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsZnVuY3Rpb24oZSl7dC5jaGVja1ZhbGlkaXR5KCkmJigodC5nZXRBdHRyaWJ1dGUoImRhdGEtZW5kcG9pbnQiKXx8IiIpLnRyaW0oKXx8KHdpbmRvdy5sb2NhdGlvbi5ocmVmPWZ1bmN0aW9uKGUpe3ZhciB0PVtdLGE9ZS5xdWVyeVNlbGVjdG9yKCJbbmFtZT1ldmVudC1uYW1lXSIpO3JldHVybiBhJiZ0LnB1c2goIkVucXVpcnk6ICIrYS52YWx1ZSksZS5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dDpub3QoW3R5cGU9aGlkZGVuXSksc2VsZWN0LHRleHRhcmVhIikuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgbj1lLnF1ZXJ5U2VsZWN0b3IoJ2xhYmVsW2Zvcj0iJythLmlkKyciXScpLGk9bj9uLnRleHRDb250ZW50LnRyaW0oKTphLm5hbWV8fGEuaWQ7YS52YWx1ZSYmdC5wdXNoKGkrIjogIithLnZhbHVlKX0pLCJtYWlsdG86aW5mb0Blcy1zcG9ydC5hZT9zdWJqZWN0PSIrZW5jb2RlVVJJQ29tcG9uZW50KChhP2EudmFsdWU6IldlYnNpdGUgZW5xdWlyeSIpKyIgLSBlbnF1aXJ5IikrIiZib2R5PSIrZW5jb2RlVVJJQ29tcG9uZW50KHQuam9pbigiXG4iKSl9KHQpKSl9LCEwKX0pO3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ4cU1vZGFsIik7aWYoZSYmIWRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKCJkYXRhLXhxLW5hdGl2ZSIpKXt2YXIgdCxhPXdpbmRvdy5tYXRjaE1lZGlhJiZtYXRjaE1lZGlhKCIocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSIpLm1hdGNoZXMsbj1udWxsO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLW9wZW4teHFdIikuZm9yRWFjaChmdW5jdGlvbihpKXtpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihvKXtvLnByZXZlbnREZWZhdWx0KCksZnVuY3Rpb24oaSl7Y2xlYXJUaW1lb3V0KHQpLG49aSxlLmhpZGRlbj0hMSxkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLGUub2Zmc2V0V2lkdGgsZS5jbGFzc0xpc3QuYWRkKCJpcy1vcGVuIiksc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciB0PWUucXVlcnlTZWxlY3RvcigiaW5wdXQ6bm90KFt0eXBlPWhpZGRlbl0pIik7dCYmdC5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pfSxhPzA6MjYwKX0oaSl9KX0pLGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWNsb3NlLXhxXSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsbyl9KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixmdW5jdGlvbih0KXsiRXNjYXBlIiE9PXQua2V5fHxlLmhpZGRlbnx8bygpfSk7dmFyIGk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInhxRm9ybSIpO2kmJmkuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IixmdW5jdGlvbihlKXtpZihlLnByZXZlbnREZWZhdWx0KCksaS5jaGVja1ZhbGlkaXR5KCkpe3ZhciB0PWkuZ2V0QXR0cmlidXRlKCJkYXRhLWVuZHBvaW50IiksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgieHFTZW50Iiksbj1mdW5jdGlvbigpe2EmJmEuY2xhc3NMaXN0LmFkZCgib24iKTtpLnJlc2V0KCk7c2V0VGltZW91dChmdW5jdGlvbigpe2EmJmEuY2xhc3NMaXN0LnJlbW92ZSgib24iKX0sNzAwMCl9O3Q/ZmV0Y2godCx7bWV0aG9kOiJQT1NUIixib2R5Om5ldyBGb3JtRGF0YShpKX0pLnRoZW4obikuY2F0Y2gobik6bigpfWVsc2UgaS5yZXBvcnRWYWxpZGl0eSgpfSl9ZnVuY3Rpb24gbygpe2UuaGlkZGVufHwoZS5jbGFzc0xpc3QucmVtb3ZlKCJpcy1vcGVuIiksY2xlYXJUaW1lb3V0KHQpLHQ9c2V0VGltZW91dChmdW5jdGlvbigpe2UuaGlkZGVuPSEwLGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c9IiIsbiYmbi5mb2N1cyYmbi5mb2N1cygpLG49bnVsbH0sYT8wOjM2MCkpfX0oKX0oKTsKOyhmdW5jdGlvbigpe3ZhciBuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJuYXYiKTtpZighbilyZXR1cm47dmFyIGY9ZnVuY3Rpb24oKXtuLmNsYXNzTGlzdC50b2dnbGUoInNjcm9sbGVkIix3aW5kb3cuc2Nyb2xsWT42MCl9O2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicGFnZXNob3ciLGYpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixmKTt9KSgpOwovKiBWZW51ZSBtYXAgem9vbSwgb25lIHJvdXRpbmUgZm9yIHRoZSBGMSBodWIgKDczMjksIC5tYXAtd3JhcCA+IHN2Zy52ZW51ZSkgYW5kIHRoZSBEdWJhaSA3cyBzcGVjdGF0b3IgbWFwCiAgICg3MzIzLCAuZDctbWFwLXdyYXAgPiBzdmcuZDctdmVudWUpOiB0aGUgVUZDIHNlYXQgbWFwJ3MgYmVoYXZpb3VyIChMb3VpcywgOCBPY3QgMjAyNjogInRoZSB6b29taW5nIGluIG9yIG91dAogICBmZWF0dXJlIGlzIGRvbmUgYnkgYnV0dG9ucywgd2hlcmVhcyB5b3UgY2FuIHNjcm9sbCBvbiB0aGUgdWZjIG1hcC4gY2FuIHRoZSBmdW5jdGlvbiBiZSB0aGUgc2FtZSBvbiB0aGUgN3MgYW5kIGYxCiAgIG1hcHMgYXMgdGhlIHVmYyIpLiBDaGFuZ2UgbG9nIENMLTIwMjYxMDA4LTA0OyBDdHJsICsgc2Nyb2xsIGFuZCB0aGUgaGludHMgQ0wtMjAyNjEwMDgtMTQgKCJjYW4gYWxsIG1hcHMgYmUKICAgY3RybCtzY3JvbGwgYW5kIGJlIHNob3duIHRoYXQgdGhhdHMgdGhlIGNhc2UsIGFsc28gZW5zdXJpbmcgdGhhdCBhIG5vcm1hbCBtb3VzZSBob3ZlciBhbmQgc2Nyb2xsIHdoaWxzdCBjdXJzb3IgaXMKICAgb3ZlciBhbGwgdGhlIG1hcHMgcmVzdWx0cyBpbiB0aGUgcGFnZSBzY3JvbGxpbmcgYXMgbm9ybWFsIikuIEFwcGxpZWQgYnkgc2NyaXB0cy9tYXBfem9vbV8yMDI2LTEwLTA4LnB5IGFuZAogICBzY3JpcHRzL21hcF93aGVlbF8yMDI2LTEwLTA4LnB5LgogICAtIEN0cmwgKyBzY3JvbGwgKG9yIENtZCwgb3IgYSB0cmFja3BhZCBwaW5jaCwgd2hpY2ggYnJvd3NlcnMgcmVwb3J0IGFzIGEgd2hlZWwgd2l0aCBjdHJsS2V5KSB6b29tcyBhYm91dCB0aGUKICAgICBjdXJzb3I7IGEgcGxhaW4gc2Nyb2xsIGlzIGxlZnQgdG8gdGhlIHBhZ2UgYW5kIHRoZSBtYXAgc2hvd3MgIkN0cmwgKyBzY3JvbGwgdG8gem9vbSIgZm9yIGEgbW9tZW50OwogICAtIGRyYWcgcGFucyBvbmNlIHpvb21lZDsgYSBkcmFnIG9mIG1vcmUgdGhhbiA0cHggaXMgbm90IGEgY2xpY2ssIHNvIGEgem9uZSBpcyBub3QgcGlja2VkIGJ5IGFjY2lkZW50OwogICAtIHR3byBwb2ludGVycyBwaW5jaCBhYm91dCB0aGVpciBtaWRwb2ludDsgb24gdG91Y2ggdGhlIHdyYXAgYWxsb3dzIHBhZ2Ugc2Nyb2xsaW5nIChwYW4teSkgdW50aWwgdGhlIG1hcCBpcwogICAgIHpvb21lZCwgdGhlbiB0YWtlcyB0aGUgdG91Y2ggZm9yIHBhbm5pbmc7CiAgIC0gKyAvIG1pbnVzIC8gcmVzZXQgYnV0dG9ucyBhdCB0aGUgbWFwJ3MgdG9wLXJpZ2h0IGNvcm5lciwgaW5zaWRlIHRoZSB3cmFwLCB3aXRoIHRoZSBoaW50IHVuZGVyIHRoZW0gb24gZGV2aWNlcwogICAgIHRoYXQgaGF2ZSBhIHBvaW50ZXIgdGhhdCBob3ZlcnM7CiAgIC0gdGhlIGRyYXdpbmcgaXMgc2NhbGVkIHdpdGggYSBDU1MgdHJhbnNmb3JtIGFuZCBjbGlwcGVkIGJ5IHRoZSB3cmFwIChvdmVyZmxvdyBoaWRkZW4gaW4gdGhlIENTUyBibG9jayksIGFuZAogICAgIGNsYW1wZWQgc28gdGhlIG1hcCBhbHdheXMg
ZmlsbHMgaXRzIGJveDsgYSB3aWR0aCBjaGFuZ2UgcHV0cyBpdCBiYWNrIHRvIDEgKHRoZSBGMSBtYXAgc2NyaXB0IHNpemVzIGl0cwogICAgIGxhYmVscyBmcm9tIHRoZSByZW5kZXJlZCB3aWR0aCksIGEgaGVpZ2h0LW9ubHkgY2hhbmdlIChhIHBob25lJ3MgYWRkcmVzcyBiYXIpIGxlYXZlcyBpdCBhbG9uZS4gKi8KOyhmdW5jdGlvbigpewp2YXIgdHJpZXM9MDsKZnVuY3Rpb24gZmxhc2goZWwsbXNnKXsKICB2YXIgZj1lbC5xdWVyeVNlbGVjdG9yKCIubWFwLWZsYXNoIik7CiAgaWYoIWYpe2Y9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc05hbWU9Im1hcC1mbGFzaCI7Zi5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpO2VsLmFwcGVuZENoaWxkKGYpfQogIGYudGV4dENvbnRlbnQ9bXNnO2YuY2xhc3NMaXN0LmFkZCgib24iKTtjbGVhclRpbWVvdXQoZi5fdCk7Zi5fdD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5jbGFzc0xpc3QucmVtb3ZlKCJvbiIpfSwxNDAwKTsKfQp3aW5kb3cuZXNNYXBGbGFzaD1mbGFzaDsKZnVuY3Rpb24gZ28oKXsKICB2YXIgdz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuZXMtcGcgLm1hcC13cmFwLC5lcy1wZyAuZDctbWFwLXdyYXAiKSxzPXcmJncucXVlcnlTZWxlY3Rvcigic3ZnLnZlbnVlLHN2Zy5kNy12ZW51ZSIpOwogIGlmKCF3fHwhcyl7aWYodHJpZXMrKzwxMDApc2V0VGltZW91dChnbywxMDApO3JldHVybn0KICBpZih3LnF1ZXJ5U2VsZWN0b3IoIi5tYXB6IikpcmV0dXJuOwogIHZhciBrPTEseD0wLHk9MCxNQVg9NixjdGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgY3RsLmNsYXNzTmFtZT0ibWFweiI7Y3RsLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsIk1hcCB6b29tIik7CiAgY3RsLmlubmVySFRNTD0nPGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtej0iKyIgYXJpYS1sYWJlbD0iWm9vbSBpbiIgdGl0bGU9Ilpvb20gaW4gKEN0cmwgKyBzY3JvbGwpIj4rPC9idXR0b24+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtej0iLSIgYXJpYS1sYWJlbD0iWm9vbSBvdXQiIHRpdGxlPSJab29tIG91dCAoQ3RybCArIHNjcm9sbCkiPiZtaW51czs8L2J1dHRvbj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS16PSIwIiBhcmlhLWxhYmVsPSJSZXNldCBtYXAiIHRpdGxlPSJSZXNldCBtYXAiPiYjODYzNDs8L2J1dHRvbj48c3BhbiBjbGFzcz0ibWFwei1oaW50Ij5DdHJsICsgc2Nyb2xsIHRvIHpvb208L3NwYW4+JzsKICB3LmFwcGVuZENoaWxkKGN0bCk7CiAgcy5zdHlsZS50cmFuc2Zvcm1PcmlnaW49IjAgMCI7CiAgLyogdGhlIGRyYXdpbmcncyB1bnRyYW5zZm9ybWVkIGJveDogaXRzIHJlbmRlcmVkIGJveCB3aXRoIHRoZSBjdXJyZW50IHRyYW5zZm9ybSB0YWtlbiBvZmYgKi8KICBmdW5jdGlvbiBiYXNlKCl7dmFyIHI9cy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm57bDpyLmxlZnQteCx0OnIudG9wLXksdzpyLndpZHRoL2ssaDpyLmhlaWdodC9rfX0KICAvKiBjbGFtcCBhZ2FpbnN0IHRoZSB3cmFwJ3MgYm94OiBvbmNlIHRoZSBzY2FsZWQgZHJhd2luZyBpcyBsYXJnZXIgdGhhbiB0aGUgYm94IGl0IG11c3QgY292ZXIgaXQgKG5vIGJsYW5rCiAgICAgYmFuZCBhdCBhbiBlZGdlKTsgd2hpbGUgaXQgaXMgc21hbGxlciwgYXMgdGhlIDdzIG1hcCBpcyBhdCBmaXJzdCBpbiBpdHMgdGFsbGVyIHdyYXAsIGl0IHN0YXlzIGluc2lkZSAqLwogIGZ1bmN0aW9uIGNsYW1wKHYsYSxiKXt2YXIgbG89TWF0aC5taW4oYSxiKSxoaT1NYXRoLm1heChhLGIpO3JldHVybiBNYXRoLm1pbihoaSxNYXRoLm1heChsbyx2KSl9CiAgZnVuY3Rpb24gYXAoKXsKICAgIHZhciBiPWJhc2UoKSxXPXcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICBpZihrPDEuMDAxKXtrPTE7eD0wO3k9MH0KICAgIGVsc2V7eD1jbGFtcCh4LFcubGVmdC1iLmwsVy5yaWdodC1iLncqay1iLmwpO3k9Y2xhbXAoeSxXLnRvcC1iLnQsVy5ib3R0b20tYi5oKmstYi50KX0KICAgIHMuc3R5bGUudHJhbnNmb3JtPWs9PT0xPyIiOiJ0cmFuc2xhdGUoIit4KyJweCwiK3krInB4KSBzY2FsZSgiK2srIikiOwogICAgdmFyIHdhcz13LmNsYXNzTGlzdC5jb250YWlucygiaXMtem9vbSIpOwogICAgdy5jbGFzc0xpc3QudG9nZ2xlKCJpcy16b29tIixrPjEpOwogICAgLyogdW56b29tZWQsIGEgZmluZ2VyIG9uIHRoZSBtYXAgc2Nyb2xscyB0aGUgcGFnZTsgem9vbWVkLCBpdCBwYW5zIHRoZSBtYXAgKi8KICAgIHcuc3R5bGUudG91Y2hBY3Rpb249az4xPyJub25lIjoicGFuLXkiOwogICAgLyogYmFjayBhdCAxOiB0aGUgRjEgbWFwIHNjcmlwdCBzaXplcyBpdHMgbGFiZWxzIGZyb20gdGhlIHJlbmRlcmVkIHdpZHRoIG9uIHJlc2l6ZSwgc28gbGV0IGl0IG1lYXN1cmUgYWdhaW4gKi8KICAgIGlmKHdhcyYmaz09PTEpc2V0VGltZW91dChmdW5jdGlvbigpe3dpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgicmVzaXplIikpfSwwKTsKICB9CiAgZnVuY3Rpb24gem9vbShmLGN4LGN5KXsKICAgIHZhciBiPWJhc2UoKSxuaz1NYXRoLm1pbihNQVgsTWF0aC5tYXgoMSxrKmYpKTsKICAgIGlmKG5rPT09aylyZXR1cm47CiAgICB2YXIgcHg9KGN4LWIubC14KS9rLHB5PShjeS1iLnQteSkvazsKICAgIHgtPXB4Kihuay1rKTt5LT1weSoobmstayk7az1uazthcCgpOwogIH0KICBmdW5jdGlvbiBtaWQoKXt2YXIgcj13LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybltyLmxlZnQrci53aWR0aC8yLHIudG9wK3IuaGVpZ2h0LzJdfQogIGN0bC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oZSl7CiAgICB2YXIgYj1lLnRhcmdldC5jbG9zZXN0KCJidXR0b24iKTtpZighYilyZXR1cm47CiAgICB2YXIgej1iLmdldEF0dHJpYnV0ZSgiZGF0YS16IiksYz1taWQoKTsKICAgIGlmKCIwIj09PXope2s9MTt4PTA7eT0wO2FwKCl9ZWxzZSB6b29tKCIrIj09PXo/MS40NToxLzEuNDUsY1swXSxjWzFdKTsKICB9KTsKICB3LmFkZEV2ZW50TGlzdGVuZXIoIndoZWVsIixmdW5jdGlvbihlKXsKICAgIGlmKCFlLmN0cmxLZXkmJiFlLm1ldGFLZXkpe2ZsYXNoKHcsIkN0cmwgKyBzY3JvbGwgdG8gem9vbSIpO3JldHVybn0KICAgIGUucHJldmVudERlZmF1bHQoKTt6b29tKGUuZGVsdGFZPDA/MS4xODoxLzEuMTgsZS5jbGllbnRYLGUuY2xpZW50WSk7CiAgfSx7cGFzc2l2ZTpmYWxzZX0pOwogIHZhciBwdHM9e30sZDA9bnVsbCxkcmFnPWZhbHNlLGxhc3Q9bnVsbCxtb3ZlZD0wLHN3YWxsb3c9ZmFsc2U7CiAgdy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsZnVuY3Rpb24oZSl7CiAgICBpZihlLnRhcmdldC5jbG9zZXN0KCIubWFweiIpKXJldHVybjsKICAgIHB0c1tlLnBvaW50ZXJJZF09e3g6ZS5jbGllbnRYLHk6ZS5jbGllbnRZfTsKICAgIHZhciBpZHM9T2JqZWN0LmtleXMocHRzKTsKICAgIGlmKGlkcy5sZW5ndGg9PT0yKXt2YXIgYT1wdHNbaWRzWzBdXSxiPXB0c1tpZHNbMV1dO2QwPU1hdGguaHlwb3QoYS54LWIueCxhLnktYi55KTtkcmFnPWZhbHNlO3JldHVybn0KICAgIGRyYWc9dHJ1ZTttb3ZlZD0wO2xhc3Q9e3g6ZS5jbGllbnRYLHk6ZS5jbGllbnRZfTsKICB9KTsKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLGZ1bmN0aW9uKGUpewogICAgaWYoIXB0c1tlLnBvaW50ZXJJZF0pcmV0dXJuOwogICAgcHRzW2UucG9pbnRlcklkXT17eDplLmNsaWVudFgseTplLmNsaWVudFl9OwogICAgdmFyIGlkcz1PYmplY3Qua2V5cyhwdHMpOwogICAgaWYoaWRzLmxlbmd0aD09PTImJmQwKXsKICAgICAgdmFyIGE9cHRzW2lkc1swXV0sYj1wdHNbaWRzWzFdXSxkPU1hdGguaHlwb3QoYS54LWIueCxhLnktYi55KTsKICAgICAgem9vbShkL2QwLChhLngrYi54KS8yLChhLnkrYi55KS8yKTtkMD1kO21vdmVkPTk5O2UucHJldmVudERlZmF1bHQoKTtyZXR1cm47CiAgICB9CiAgICBpZighZHJhZylyZXR1cm47CiAgICB2YXIgZHg9ZS5jbGllbnRYLWxhc3QueCxkeT1lLmNsaWVudFktbGFzdC55O2xhc3Q9e3g6ZS5jbGllbnRYLHk6ZS5jbGllbnRZfTsKICAgIG1vdmVkKz1NYXRoLmFicyhkeCkrTWF0aC5hYnMoZHkpOwogICAgaWYobW92ZWQ+NCl3LmNsYXNzTGlzdC5hZGQoImlzLXBhbm5pbmciKTsKICAgIGlmKGs+MSl7eCs9ZHg7eSs9ZHk7YXAoKX0KICB9LHtwYXNzaXZlOmZhbHNlfSk7CiAgZnVuY3Rpb24gdXAoZSl7CiAgICBpZighcHRzW2UucG9pbnRlcklkXSlyZXR1cm47CiAgICBkZWxldGUgcHRzW2UucG9pbnRlcklkXTsKICAgIGlmKE9iamVjdC5rZXlzKHB0cykubGVuZ3RoPDIpZDA9bnVsbDsKICAgIGRyYWc9ZmFsc2U7dy5jbGFzc0xpc3QucmVtb3ZlKCJpcy1wYW5uaW5nIik7CiAgICBpZihtb3ZlZD40KXtzd2FsbG93PXRydWU7c2V0VGltZW91dChmdW5jdGlvbigpe3N3YWxsb3c9ZmFsc2V9LDApfQogIH0KICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIix1cCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJjYW5jZWwiLHVwKTsKICB3LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihlKXtpZihzd2FsbG93KXtlLnN0b3BQcm9wYWdhdGlvbigpO2UucHJldmVudERlZmF1bHQoKX19LHRydWUpOwogIC8qIGEgd2lkdGggY2hhbmdlIChyb3RhdGlvbiwgYSB3aW5kb3cgcmVzaXplZCkgcmVzZXRzIHRoZSBtYXA7IGEgaGVpZ2h0LW9ubHkgY2hhbmdlIGRvZXMgbm90LCBiZWNhdXNlIGEgcGhvbmUncwogICAgIGFkZHJlc3MgYmFyIHNob3dpbmcgYW5kIGhpZGluZyBmaXJlcyByZXNpemUgYXMgdGhlIHBhZ2Ugc2Nyb2xscyAqLwogIHZhciBsYXN0Vz13aW5kb3cuaW5uZXJXaWR0aDsKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIixmdW5jdGlvbigpe2lmKHdpbmRvdy5pbm5lcldpZHRoPT09bGFzdFcpcmV0dXJuO2xhc3RXPXdpbmRvdy5pbm5lcldpZHRoO2s9MTt4PTA7eT0wO2FwKCl9KTsKICBhcCgpOwp9CmdvKCk7Cn0pKCk7Cg0K
LyogZXNDYXJKczogY2Fyb3VzZWwgYXJyb3dzIGZvbGxvdyB0aGUgRXhwZXJpZW5jZXMgc3RhbmRhcmQgb24gZXZlcnkgcGFnZSAoQ0wtMjAyNjEwMDUtMDMs
IDUgT2N0IDIwMjYpLgogICBBIGNhcm91c2VsIHdob3NlIGNhcmRzIGFsbCBmaXQgc2hvd3Mgbm8gYXJyb3dzOiBlYWNoIC5jYXItbmF2IGdldHMgLm5vLXNj
cm9sbCB3aGlsZSB0aGUgdHJhY2sgaXRzIGJ1dHRvbnMgcG9pbnQgYXQKICAgKGRhdGEtdGFyZ2V0KSBoYXMgbm90aGluZyB0byBzY3JvbGwuIFJlLWNoZWNr
ZWQgd2hlbiB0aGUgdHJhY2sgb3IgYSBjYXJkIGNoYW5nZXMgc2l6ZSAod2luZG93IHJlc2l6ZSwgdGhlCiAgIEV4cGVyaWVuY2VzIGZpbHRlciBjaGlwcyBo
aWRpbmcgY2FyZHMpIGFuZCBvbiBsb2FkLCB3aGVuIGxhdGUgZm9udHMgYW5kIGltYWdlcyBoYXZlIHNldHRsZWQuCiAgIFNvdXJjZSBvZiB0cnV0aDogdGVt
cGxhdGUvZnJhZ21lbnRzL2Nhcm91c2VsLWpzLmpzLCBzaGlwcGVkIGJ5IHNjcmlwdHMvY2Fyb3VzZWxfYXJyb3dzXzIwMjYtMTAtMDUucHkuICovCihmdW5j
dGlvbiAoKSB7CiAgdmFyIG5hdnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY2FyLW5hdicpOwogIGlmICghbmF2cy5sZW5ndGgpIHJldHVybjsK
ICBmdW5jdGlvbiB3YXRjaChuYXYpIHsKICAgIHZhciBidG4gPSBuYXYucXVlcnlTZWxlY3RvcignLmNhci1idG5bZGF0YS10YXJnZXRdJyk7CiAgICB2YXIg
dHJhY2sgPSBidG4gPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidG4uZ2V0QXR0cmlidXRlKCdkYXRhLXRhcmdldCcpKSA6IG51bGw7CiAgICBpZiAoIXRy
YWNrKSByZXR1cm47CiAgICBmdW5jdGlvbiBzeW5jKCkgeyBuYXYuY2xhc3NMaXN0LnRvZ2dsZSgnbm8tc2Nyb2xsJywgdHJhY2suc2Nyb2xsV2lkdGggLSB0
cmFjay5jbGllbnRXaWR0aCA8PSA0KTsgfQogICAgc3luYygpOwogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHN5bmMpOwogICAgd2lu
ZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBzeW5jKTsKICAgIGlmICh3aW5kb3cuUmVzaXplT2JzZXJ2ZXIpIHsKICAgICAgdmFyIHJvID0gbmV3IFJl
c2l6ZU9ic2VydmVyKHN5bmMpOwogICAgICByby5vYnNlcnZlKHRyYWNrKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFjay5jaGlsZHJlbi5sZW5n
dGg7IGkrKykgcm8ub2JzZXJ2ZSh0cmFjay5jaGlsZHJlbltpXSk7CiAgICB9CiAgfQogIGZvciAodmFyIGkgPSAwOyBpIDwgbmF2cy5sZW5ndGg7IGkrKykg
d2F0Y2gobmF2c1tpXSk7Cn0pKCk7Cg==
LyogZXNGb3JtSnM6IGVucXVpcnkgZm9ybXMgZGVsaXZlciBzb21ld2hlcmUgYW5kIHRlbGwgdGhlIHRydXRoIChDTC0yMDI2MTAwMi0xMiwgMiBPY3QgMjAy
Njsgc3RhdHVzIG5hbWVzIGZpeGVkIGluCiAgIENMLTIwMjYxMDAyLTE0IHRoZSBzYW1lIG5pZ2h0KS4KICAgVGFrZXMgdGhlIHN1Ym1pdCBvZiAjcmZpIGFu
ZCAjeHFGb3JtIGF0IHRoZSBjYXB0dXJlIHBoYXNlLCBhaGVhZCBvZiB0aGUgb2xkZXIgaGFuZGxlcnMgaW4gdGhlIG1haW4gYW5kIGV2ZW50CiAgIHBheWxv
YWRzICh3aGljaCBzaG93ZWQgUmVjZWl2ZWQgd2l0aCBubyBkZWxpdmVyeSwgb3IgaGFuZGVkIGEgbWFpbHRvOiBsaW5rIHRvIHRoZSBtYWlsIGNsaWVudCku
CiAgIFJvdXRlIDE6IGRhdGEtZW5kcG9pbnQgc2V0IChhbiBodHRwcyBVUkwsIGUuZy4gdGhlIG44biB3ZWJob29rKTogUE9TVCB0aGUgRm9ybURhdGEgdGhl
cmUsIHN1Y2Nlc3Mgb24gYSAyeHguCiAgIFJvdXRlIDI6IG5vIGVuZHBvaW50OiBoYW5kIHRoZSBlbnF1aXJ5IHRvIHRoZSBzaXRlJ3Mgb3duIENvbnRhY3Qg
Rm9ybSA3IGZvcm0gODY3LCB3aGljaCBpcyBpbiB0aGUgcGFnZSAodGhlIG9sZAogICB0aGVtZSdzIGVucXVpcnkgcG9wdXApLCB3aXRoIENGNydzIHJlQ0FQ
VENIQSB2MyBhbmQgQWtpc21ldCBjaGVja3MsIGFuZCByZWFkIENGNydzIG91dGNvbWUuCiAgIENGNyByZXBvcnRzIHRoZSBvdXRjb21lIHR3aWNlOiB0aGUg
d3BjZjdzdWJtaXQgZXZlbnQgb24gdGhlIGZvcm0ncyB3cmFwcGVyIGNhcnJpZXMgdGhlIEFQSSBzdGF0dXMgKG1haWxfc2VudCwKICAgbWFpbF9mYWlsZWQs
IHZhbGlkYXRpb25fZmFpbGVkLCBhY2NlcHRhbmNlX21pc3NpbmcsIHNwYW0sIGFib3J0ZWQpLCBhbmQgdGhlIHdwY2Y3c3RhdHVzY2hhbmdlZCBldmVudCBv
biB0aGUgZm9ybQogICBjYXJyaWVzIHRoZSBzaG9ydCBmb3JtIChzZW50LCBmYWlsZWQsIGludmFsaWQsIHVuYWNjZXB0ZWQsIHNwYW0sIGFib3J0ZWQpLiBC
b3RoIGFyZSBhY2NlcHRlZCBoZXJlOyB0aGUgZmlyc3QKICAgdmVyc2lvbiBsaXN0ZW5lZCBmb3IgdGhlIGxvbmcgbmFtZXMgb24gdGhlIHNlY29uZCBldmVu
dCwgc28gc2VudCBhbmQgZmFpbGVkIHdlcmUgbmV2ZXIgc2VlbiBhbmQgdGhlIGZvcm0gd2FpdGVkCiAgIGZvciB0aGUgdGltZW91dC4gQW55dGhpbmcgYnV0
IHN1Y2Nlc3Mgc2hvd3MgYW4gZXJyb3Igd2l0aCB0aGUgb2ZmaWNlIGVtYWlsIGFuZCBwaG9uZSBhbmQga2VlcHMgdGhlIHZhbHVlcy4gKi8KKGZ1bmN0aW9u
ICgpIHsKICB2YXIgRk9STVMgPSAnZm9ybSNyZmksIGZvcm0jeHFGb3JtJzsKICB2YXIgRU1BSUwgPSAnaW5mb0Blcy1zcG9ydC5hZScsIFBIT05FID0gJys5
NzEgNCA0MzUgNjYxMicsIENGN19JRCA9ICc4NjcnLCBXQUlUID0gNDUwMDA7CiAgdmFyIE9LID0geyBtYWlsX3NlbnQ6IDEsIHNlbnQ6IDEgfTsKICB2YXIg
QkFEID0geyBtYWlsX2ZhaWxlZDogMSwgZmFpbGVkOiAxLCBzcGFtOiAxLCB2YWxpZGF0aW9uX2ZhaWxlZDogMSwgaW52YWxpZDogMSwgYWNjZXB0YW5jZV9t
aXNzaW5nOiAxLCB1bmFjY2VwdGVkOiAxLCBhYm9ydGVkOiAxLCBwYXltZW50X3JlcXVpcmVkOiAxLCAncGF5bWVudC1yZXF1aXJlZCc6IDEgfTsKICB2YXIg
TE9ORyA9IHsgc2VudDogJ21haWxfc2VudCcsIGZhaWxlZDogJ21haWxfZmFpbGVkJywgaW52YWxpZDogJ3ZhbGlkYXRpb25fZmFpbGVkJywgdW5hY2NlcHRl
ZDogJ2FjY2VwdGFuY2VfbWlzc2luZycsICdwYXltZW50LXJlcXVpcmVkJzogJ3BheW1lbnRfcmVxdWlyZWQnIH07CiAgdmFyIFJFQVNPTiA9IHsgdmFsaWRh
dGlvbl9mYWlsZWQ6ICdhIGZpZWxkIHdhcyByZWplY3RlZCcsIHNwYW06ICd0aGUgc3BhbSBmaWx0ZXIgYmxvY2tlZCBpdCcsIG1haWxfZmFpbGVkOiAndGhl
IG1haWwgc2VydmVyIGRpZCBub3QgYWNjZXB0IGl0JywKICAgICAgICAgICAgICAgICBhY2NlcHRhbmNlX21pc3Npbmc6ICdjb25zZW50IHdhcyBtaXNzaW5n
JywgYWJvcnRlZDogJ2l0IHdhcyBpbnRlcnJ1cHRlZCcsIHBheW1lbnRfcmVxdWlyZWQ6ICdwYXltZW50IHdhcyByZXF1ZXN0ZWQnLCB0aW1lb3V0OiAnbm8g
cmVwbHkgaW4gdGltZScsCiAgICAgICAgICAgICAgICAgbmV0d29yazogJ2EgY29ubmVjdGlvbiBwcm9ibGVtJywgZXhjZXB0aW9uOiAnYSBzY3JpcHQgZXJy
b3InLCAnbm8gZGVzdGluYXRpb24nOiAndGhlIGZvcm0gaGFzIG5vd2hlcmUgdG8gc2VuZCcgfTsKICB2YXIgRklFTEQgPSB7ICd5b3VyLW5hbWUnOiAnZmly
c3QgbmFtZScsICdsYXN0LW5hbWUnOiAnbGFzdCBuYW1lJywgJ3RleHQtOTk4JzogJ2NvbXBhbnknLCAneW91ci1lbWFpbCc6ICdlbWFpbCcsICd5b3VyLXRl
bCc6ICdwaG9uZScsICd5b3VyLW1lc3NhZ2UnOiAnbWVzc2FnZScgfTsKICBmdW5jdGlvbiBsb2coeCkgeyB0cnkgeyAod2luZG93LmVzRm9ybUxvZyA9IHdp
bmRvdy5lc0Zvcm1Mb2cgfHwgW10pLnB1c2goeCk7IH0gY2F0Y2ggKGVycikge30gfQogIGZ1bmN0aW9uIHNlbnRFbChmKSB7IHJldHVybiBmLnF1ZXJ5U2Vs
ZWN0b3IoJy5zZW50JykgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbnQnKTsgfQogIGZ1bmN0aW9uIHNob3coZiwgb2ssIG1zZykgewogICAgdmFy
IHMgPSBzZW50RWwoZik7IGlmICghcykgcmV0dXJuOwogICAgaWYgKCFzLmdldEF0dHJpYnV0ZSgnZGF0YS1vcmlnJykpIHMuc2V0QXR0cmlidXRlKCdkYXRh
LW9yaWcnLCBzLnRleHRDb250ZW50KTsKICAgIHMudGV4dENvbnRlbnQgPSBvayA/IHMuZ2V0QXR0cmlidXRlKCdkYXRhLW9yaWcnKSA6IG1zZzsKICAgIHMu
Y2xhc3NMaXN0LnRvZ2dsZSgnaXMtZXJyJywgIW9rKTsgcy5jbGFzc0xpc3QuYWRkKCdvbicpOwogICAgY2xlYXJUaW1lb3V0KHMuX2VzVCk7CiAgICBzLl9l
c1QgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcy5jbGFzc0xpc3QucmVtb3ZlKCdvbicpOyBzLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWVycicpOyBzLnRl
eHRDb250ZW50ID0gcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtb3JpZycpOyB9LCBvayA/IDcwMDAgOiAyNTAwMCk7CiAgfQogIGZ1bmN0aW9uIGJ1c3koZiwgb24p
IHsKICAgIHZhciBiID0gZi5xdWVyeVNlbGVjdG9yKCdbdHlwZT0ic3VibWl0Il0nKTsgaWYgKCFiKSByZXR1cm47CiAgICBiLmRpc2FibGVkID0gb247CiAg
ICBpZiAob24pIHsgaWYgKCFiLmdldEF0dHJpYnV0ZSgnZGF0YS1sYWJlbCcpKSBiLnNldEF0dHJpYnV0ZSgnZGF0YS1sYWJlbCcsIGIudGV4dENvbnRlbnQp
OyBiLnRleHRDb250ZW50ID0gJ1NlbmRpbmcnOyB9CiAgICBlbHNlIGlmIChiLmdldEF0dHJpYnV0ZSgnZGF0YS1sYWJlbCcpKSBiLnRleHRDb250ZW50ID0g
Yi5nZXRBdHRyaWJ1dGUoJ2RhdGEtbGFiZWwnKTsKICB9CiAgZnVuY3Rpb24gdmFsKGYsIG4pIHsgdmFyIGUgPSBmLnF1ZXJ5U2VsZWN0b3IoJ1tuYW1lPSIn
ICsgbiArICciXScpOyByZXR1cm4gZSA/IFN0cmluZyhlLnZhbHVlIHx8ICcnKS5yZXBsYWNlKC9eXHMrfFxzKyQvZywgJycpIDogJyc7IH0KICBmdW5jdGlv
biBjb25zZW50KGYpIHsgdmFyIGMgPSBmLnF1ZXJ5U2VsZWN0b3IoJ1tuYW1lPSJjb25zZW50Il0nKTsgcmV0dXJuIGMgJiYgYy5jaGVja2VkID8gJ3llcycg
OiAnbm8nOyB9CiAgZnVuY3Rpb24gY2Y3Zm9ybSgpIHsgdmFyIGkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPSJfd3BjZjciXVt2YWx1
ZT0iJyArIENGN19JRCArICciXScpOyByZXR1cm4gaSA/IGkuY2xvc2VzdCgnZm9ybScpIDogbnVsbDsgfQogIGZ1bmN0aW9uIHZpYUNmNyhmLCBkb25lKSB7
CiAgICB2YXIgYyA9IGNmN2Zvcm0oKTsKICAgIGlmICghYyB8fCAhd2luZG93LndwY2Y3IHx8IHR5cGVvZiB3aW5kb3cud3BjZjcuc3VibWl0ICE9PSAnZnVu
Y3Rpb24nKSByZXR1cm4gZmFsc2U7CiAgICBmdW5jdGlvbiBzZXQobiwgdikgeyB2YXIgZSA9IGMucXVlcnlTZWxlY3RvcignW25hbWU9IicgKyBuICsgJyJd
Jyk7IGlmIChlKSBlLnZhbHVlID0gdjsgfQogICAgdmFyIGludGVyZXN0ID0gdmFsKGYsICdpbnRlcmVzdCcpLCBldiA9IHZhbChmLCAnZXZlbnQtbmFtZScp
IHx8ICdXZWJzaXRlIGVucXVpcnknOwogICAgc2V0KCd5b3VyLW5hbWUnLCB2YWwoZiwgJ2ZpcnN0LW5hbWUnKSB8fCAnV2Vic2l0ZScpOyBzZXQoJ2xhc3Qt
bmFtZScsIHZhbChmLCAnbGFzdC1uYW1lJykgfHwgJ0VucXVpcnknKTsKICAgIHNldCgndGV4dC05OTgnLCB2YWwoZiwgJ2NvbXBhbnknKSB8fCAnTm90IGdp
dmVuJyk7IHNldCgneW91ci1lbWFpbCcsIHZhbChmLCAnZW1haWwnKSk7IHNldCgneW91ci10ZWwnLCB2YWwoZiwgJ3Bob25lJykpOwogICAgc2V0KCdpbnRl
cmVzdGVkLWluJywgaW50ZXJlc3QpOyBzZXQoJ2V2ZW50LW5hbWUnLCBldik7CiAgICBzZXQoJ3lvdXItbWVzc2FnZScsIFt2YWwoZiwgJ21lc3NhZ2UnKSB8
fCAnTm8gbWVzc2FnZSBsZWZ0LicsICcnLCAnSW50ZXJlc3RlZCBpbjogJyArIGludGVyZXN0LCAnRXZlbnQ6ICcgKyBldiwKICAgICAgJ1JvdXRpbmc6ICcg
KyB2YWwoZiwgJ2VlYl9ldmVudCcpICsgJyAvICcgKyB2YWwoZiwgJ2VlYl9jYXRlZ29yeScpICsgJyAvICcgKyB2YWwoZiwgJ2VlYl9yZWFzb24nKSwKICAg
ICAgJ0NvbnNlbnQgdG8gY29udGFjdDogJyArIGNvbnNlbnQoZiksICdTZW50IGZyb206ICcgKyBsb2NhdGlvbi5ocmVmXS5qb2luKCdcbicpKTsKICAgIHZh
ciBzZXR0bGVkID0gZmFsc2UsIHQ7CiAgICBmdW5jdGlvbiBmaW5pc2gob2ssIHN0YXR1cywgZXh0cmEpIHsKICAgICAgaWYgKHNldHRsZWQpIHJldHVybjsg
c2V0dGxlZCA9IHRydWU7IGNsZWFyVGltZW91dCh0KTsKICAgICAgYy5yZW1vdmVFdmVudExpc3RlbmVyKCd3cGNmN3N0YXR1c2NoYW5nZWQnLCBvblN0YXR1
cyk7IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3dwY2Y3c3VibWl0Jywgb25TdWJtaXQpOwogICAgICBkb25lKG9rLCBzdGF0dXMsIGV4dHJhKTsK
ICAgIH0KICAgIGZ1bmN0aW9uIHNldHRsZShzdCwgZCkgewogICAgICBzdCA9IFN0cmluZyhzdCB8fCAnJyk7CiAgICAgIGlmIChPS1tzdF0pIHsgZmluaXNo
KHRydWUsICdtYWlsX3NlbnQnKTsgcmV0dXJuOyB9CiAgICAgIGlmICghQkFEW3N0XSkgcmV0dXJuOwogICAgICB2YXIgZXh0cmEgPSAnJywgaW52ID0gZCAm
JiBkLmFwaVJlc3BvbnNlICYmIGQuYXBpUmVzcG9uc2UuaW52YWxpZF9maWVsZHM7CiAgICAgIGlmIChpbnYgJiYgaW52Lmxlbmd0aCkgeyB2YXIgbmFtZXMg
PSBbXTsgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnYubGVuZ3RoOyBpKyspIG5hbWVzLnB1c2goRklFTERbaW52W2ldLmZpZWxkXSB8fCBpbnZbaV0uZmllbGQp
OyBleHRyYSA9IG5hbWVzLmpvaW4oJywgJyk7IH0KICAgICAgaWYgKGQgJiYgZC5hcGlSZXNwb25zZSAmJiBkLmFwaVJlc3BvbnNlLm1lc3NhZ2UpIGxvZygn
Y2Y3OiAnICsgZC5hcGlSZXNwb25zZS5tZXNzYWdlKTsKICAgICAgZmluaXNoKGZhbHNlLCBMT05HW3N0XSB8fCBzdCwgZXh0cmEpOwogICAgfQogICAgLyog
c3RhdHVzY2hhbmdlZCBmaXJlcyBmaXJzdCwgaW5zaWRlIENGNydzIHNldFN0YXR1czsgYSB0aWNrIGxhdGVyIHRoZSBzdWJtaXQgZXZlbnQgYnJpbmdzIHRo
ZSBkZXRhaWwgKHJlamVjdGVkCiAgICAgICBmaWVsZHMsIG1lc3NhZ2UpLCBzbyBsZXQgdGhhdCBvbmUgc2V0dGxlIGZpcnN0IHdoZW4gaXQgY29tZXMgKi8K
ICAgIGZ1bmN0aW9uIG9uU3RhdHVzKGUpIHsgdmFyIHN0ID0gKGUuZGV0YWlsICYmIGUuZGV0YWlsLnN0YXR1cykgfHwgYy5nZXRBdHRyaWJ1dGUoJ2RhdGEt
c3RhdHVzJyk7IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBzZXR0bGUoc3QpOyB9LCAwKTsgfQogICAgZnVuY3Rpb24gb25TdWJtaXQoZSkgeyB2YXIgZCA9
IGUuZGV0YWlsIHx8IHt9OyBpZiAoU3RyaW5nKGQuY29udGFjdEZvcm1JZCkgIT09IENGN19JRCkgcmV0dXJuOyBzZXR0bGUoZC5zdGF0dXMsIGQpOyB9CiAg
ICBjLmFkZEV2ZW50TGlzdGVuZXIoJ3dwY2Y3c3RhdHVzY2hhbmdlZCcsIG9uU3RhdHVzKTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3dwY2Y3
c3VibWl0Jywgb25TdWJtaXQpOwogICAgdCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBmaW5pc2goZmFsc2UsICd0aW1lb3V0Jyk7IH0sIFdBSVQpOwog
ICAgdHJ5IHsgd2luZG93LndwY2Y3LnN1Ym1pdChjKTsgfSBjYXRjaCAoZXJyKSB7IGZpbmlzaChmYWxzZSwgJ2V4Y2VwdGlvbicpOyB9CiAgICByZXR1cm4g
dHJ1ZTsKICB9CiAgZnVuY3Rpb24gdmlhRW5kcG9pbnQoZiwgdXJsLCBkb25lKSB7CiAgICB2YXIgY3RsID0gKCdBYm9ydENvbnRyb2xsZXInIGluIHdpbmRv
dykgPyBuZXcgQWJvcnRDb250cm9sbGVyKCkgOiBudWxsOwogICAgdmFyIHQgPSBjdGwgPyBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgY3RsLmFib3J0KCk7
IH0sIFdBSVQpIDogbnVsbDsKICAgIHZhciBvcHRzID0geyBtZXRob2Q6ICdQT1NUJywgYm9keTogbmV3IEZvcm1EYXRhKGYpIH07IGlmIChjdGwpIG9wdHMu
c2lnbmFsID0gY3RsLnNpZ25hbDsKICAgIGZldGNoKHVybCwgb3B0cykudGhlbihmdW5jdGlvbiAocikgeyBpZiAodCkgY2xlYXJUaW1lb3V0KHQpOyBkb25l
KHIub2ssICdodHRwICcgKyByLnN0YXR1cyk7IH0pCiAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7IGlmICh0KSBjbGVhclRpbWVvdXQodCk7IGRvbmUoZmFs
c2UsICduZXR3b3JrJyk7IH0pOwogIH0KICBmdW5jdGlvbiBmYWlsKGYsIHN0YXR1cywgZXh0cmEpIHsKICAgIGJ1c3koZiwgZmFsc2UpOwogICAgdmFyIHdo
eSA9IChSRUFTT05bc3RhdHVzXSB8fCBzdGF0dXMpICsgKGV4dHJhID8gJzogJyArIGV4dHJhIDogJycpOwogICAgc2hvdyhmLCBmYWxzZSwgJ1NvcnJ5LCB0
aGF0IGRpZCBub3Qgc2VuZCAoJyArIHdoeSArICcpLiBFbWFpbCAnICsgRU1BSUwgKyAnIG9yIGNhbGwgJyArIFBIT05FICsgJy4nKTsKICAgIGxvZyhzdGF0
dXMpOwogIH0KICBmdW5jdGlvbiBzdWNjZXNzKGYpIHsgYnVzeShmLCBmYWxzZSk7IHNob3coZiwgdHJ1ZSk7IGYucmVzZXQoKTsgbG9nKCdtYWlsX3NlbnQn
KTsgfQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIGZ1bmN0aW9uIChlKSB7CiAgICB2YXIgZiA9IGUudGFyZ2V0OwogICAgaWYgKCFm
IHx8ICFmLm1hdGNoZXMgfHwgIWYubWF0Y2hlcyhGT1JNUykpIHJldHVybjsKICAgIGUucHJldmVudERlZmF1bHQoKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsg
ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgIGlmICghZi5jaGVja1ZhbGlkaXR5KCkpIHsgZi5yZXBvcnRWYWxpZGl0eSgpOyByZXR1cm47IH0K
ICAgIGlmIChmLmdldEF0dHJpYnV0ZSgnZGF0YS1zZW5kaW5nJykgPT09ICcxJykgcmV0dXJuOwogICAgZi5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2VuZGluZycs
ICcxJyk7IGJ1c3koZiwgdHJ1ZSk7CiAgICB2YXIgZG9uZSA9IGZ1bmN0aW9uIChvaywgc3RhdHVzLCBleHRyYSkgeyBmLnJlbW92ZUF0dHJpYnV0ZSgnZGF0
YS1zZW5kaW5nJyk7IGlmIChvaykgc3VjY2VzcyhmKTsgZWxzZSBmYWlsKGYsIHN0YXR1cywgZXh0cmEpOyB9OwogICAgdmFyIHVybCA9IChmLmdldEF0dHJp
YnV0ZSgnZGF0YS1lbmRwb2ludCcpIHx8ICcnKS5yZXBsYWNlKC9eXHMrfFxzKyQvZywgJycpOwogICAgaWYgKHVybCkgeyB2aWFFbmRwb2ludChmLCB1cmws
IGRvbmUpOyByZXR1cm47IH0KICAgIGlmICh2aWFDZjcoZiwgZG9uZSkpIHJldHVybjsKICAgIGRvbmUoZmFsc2UsICdubyBkZXN0aW5hdGlvbicpOwogIH0s
IHRydWUpOwogIC8qIHRoZSBvZmZpY2UgZm9ybSB0aGF0IHJlY2VpdmVzIHRoZSBlbnF1aXJ5IHJlcXVpcmVzIGEgcGhvbmUgbnVtYmVyICovCiAgdmFyIGZv
cm1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChGT1JNUyk7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb3Jtcy5sZW5ndGg7IGkrKykgeyB2YXIgcCA9
IGZvcm1zW2ldLnF1ZXJ5U2VsZWN0b3IoJ1tuYW1lPSJwaG9uZSJdJyk7IGlmIChwKSBwLnJlcXVpcmVkID0gdHJ1ZTsgfQp9KSgpOwo=
LyogZXNSZmlKczogb3BlbmluZyB0aGUgZW5xdWlyeSBmb3JtIGtlZXBzIHRoZSBwYWdlIHdoZXJlIGl0IGlzIChDTC0yMDI2MTAwNi0wMSwgNiBPY3QgMjAy
NikuCiAgIEV2ZXJ5IGNvbnRyb2wgdGhhdCBvcGVucyBhIGZvcm0gaXMgYW4gYW5jaG9yIHRvICNlbnF1aXJlLCB0aGUgaW4tcGFnZSBmYWxsYmFjayBmb3Ig
cmVhZGVycyB3aXRob3V0IHNjcmlwdC4KICAgVGhlIG9sZCB0aGVtZSdzIGN1c3RvbS1zY3JpcHQuanMgbGlzdGVucyBvbiBkb2N1bWVudCBmb3IgZXZlcnkg
Y2xpY2sgb24gYVtocmVmKj0iIyJdIGFuZCBzbW9vdGgtc2Nyb2xscyB0bwogICB0aGF0IHNlY3Rpb24sIHNvIHRoZSBwYWdlIHNsaWQgdG8gdGhlIGJvdHRv
bSB1bmRlciB0aGUgb3BlbiBmb3JtLiBPdXIgb3BlbmVyIHJ1bnMgb24gdGhlIGVsZW1lbnQgYW5kIGNhbGxzCiAgIHByZXZlbnREZWZhdWx0LCB3aGljaCBk
b2VzIG5vdCBzdG9wIGEgZGVsZWdhdGVkIGhhbmRsZXIgb24gZG9jdW1lbnQ7IHN0b3BwaW5nIHRoZSBjbGljayBmcm9tIHJlYWNoaW5nIGRvY3VtZW50CiAg
IGRvZXMuIFRoZSBzdG9wIGhhcHBlbnMgb24gYm9keSwgYWZ0ZXIgZXZlcnkgaGFuZGxlciBvbiB0aGUgZWxlbWVudCBpdHNlbGYgaGFzIHJ1biAodGhlIG9w
ZW5lciwgdGhlCiAgICJJbnRlcmVzdGVkIGluIiBwcmVzZWxlY3QpLCBhbmQgb25seSBmb3IgY2xpY2tzIG9uIGEgZm9ybSBvcGVuZXIuIExpbmtzIHRoYXQg
b25seSBwb2ludCBhdCAjZW5xdWlyZSBzdGlsbCBzY3JvbGwuCiAgIFNvdXJjZSBvZiB0cnV0aDogdGVtcGxhdGUvZnJhZ21lbnRzL3JmaS1qcy5qcywgc2hp
cHBlZCBieSBzY3JpcHRzL3JmaV9ub19zY3JvbGxfMjAyNi0xMC0wNi5weS4gKi8KKGZ1bmN0aW9uICgpIHsKICB2YXIgU0VMID0gJ1tkYXRhLW9wZW4tcmZp
XSwgW2RhdGEtb3Blbi14cV0nOwogIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keTsKICBpZiAoIWJvZHkgfHwgIWJvZHkuYWRkRXZlbnRMaXN0ZW5lcikgcmV0
dXJuOwogIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgewogICAgdmFyIGVsID0gZS50YXJnZXQ7CiAgICB3aGlsZSAoZWwg
JiYgZWwgIT09IGJvZHkpIHsKICAgICAgaWYgKGVsLm1hdGNoZXMgJiYgZWwubWF0Y2hlcyhTRUwpKSB7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IHJldHVybjsg
fQogICAgICBlbCA9IGVsLnBhcmVudE5vZGU7CiAgICB9CiAgfSwgZmFsc2UpOwp9KSgpOwo=
LyogZXNDYXJ0SnM6IHRoZSBjYXJ0IGljb24gaW4gdGhlIG5hdiBzaG93cyBob3cgbWFueSBpdGVtcyBhcmUgaW4gdGhlIHZpc2l0b3IncyBiYXNrZXQgKENM
LTIwMjYxMDA5LTAyLCA5IE9jdCAyMDI2KS4KICAgTG91aXM6ICJDYW4gd2UgYWRkIGEgY2FydCBpY29uIHRvIHRoZSB0b3AgcmlnaHQgb2YgdGhlIG5ldyBz
aXRlIHNvIHRoYXQgcGVvcGxlIGNhbiBuYXZpZ2F0ZSB0aGUgd2Vic2l0ZSBhZnRlcgogICBhZGRlZCB0byBjYXJ0IGFuZCB0aGVuIGdvIGJhY2sgdG8gcGF5
PyBPdGhlcndpc2UgaXQncyBub3Qgb2J2aW91cyBob3cgeW91J2Qgc2VlIHdoYXQncyBpbiB5b3VyIGJhc2tldCBpZiB5b3UKICAgbmF2aWdhdGVkIGF3YXkg
ZnJvbSB0aGUgY2hlY2tvdXQgcGFnZSIuIFRoZSBpY29uIGl0c2VsZiBpcyBwbGFpbiBtYXJrdXAgKGEgbGluayB0byAvY2FydC8pLCBzbyBpdCB3b3JrcyB3
aXRob3V0CiAgIHNjcmlwdC4gVGhpcyByZWFkcyB0aGUgV29vQ29tbWVyY2UgU3RvcmUgQVBJIGZvciB0aGUgdmlzaXRvcidzIG93biBzZXNzaW9uIChzYW1l
LW9yaWdpbiBjb29raWVzLCBubyBub25jZSBuZWVkZWQKICAgZm9yIGEgcmVhZCkgYW5kIHNob3dzIHRoZSBjb3VudCBiYWRnZSB3aGVuIHRoZSBiYXNrZXQg
aGFzIGFueXRoaW5nIGluIGl0OyBhIGZhaWxlZCBvciBlbXB0eSByZWFkIGxlYXZlcyB0aGUgYmFkZ2UKICAgaGlkZGVuLiBSZS1yZWFkIHdoZW4gdGhlIHBh
Z2UgaXMgc2hvd24gYWdhaW4gZnJvbSB0aGUgYmFjay1mb3J3YXJkIGNhY2hlLCB3aGljaCBpcyBob3cgcGVvcGxlIGNvbWUgYmFjayBmcm9tIHRoZQogICBj
YXJ0LiBTb3VyY2Ugb2YgdHJ1dGg6IHRlbXBsYXRlL2ZyYWdtZW50cy9jYXJ0LWpzLmpzLCBzaGlwcGVkIGJ5IHNjcmlwdHMvY2FydF9pY29uXzIwMjYtMTAt
MDkucHkuICovCihmdW5jdGlvbiAoKSB7CiAgdmFyIGJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25hdkNhcnROJyk7CiAgaWYgKCFiYWRnZSkg
cmV0dXJuOwogIHZhciBVUkwgPSAnaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtanNvbi93Yy9zdG9yZS92MS9jYXJ0JzsKICBmdW5jdGlvbiBzaG93KG4p
IHsKICAgIG4gPSBwYXJzZUludChuLCAxMCkgfHwgMDsKICAgIGJhZGdlLnRleHRDb250ZW50ID0gbiA+IDk5ID8gJzk5KycgOiBTdHJpbmcobik7CiAgICBi
YWRnZS5oaWRkZW4gPSBuIDwgMTsKICAgIHZhciBhID0gYmFkZ2UucGFyZW50Tm9kZTsKICAgIGlmIChhKSBhLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcs
IG4gPiAwID8gJ1lvdXIgY2FydCwgJyArIG4gKyAobiA9PT0gMSA/ICcgaXRlbScgOiAnIGl0ZW1zJykgOiAnWW91ciBjYXJ0Jyk7CiAgfQogIGZ1bmN0aW9u
IHJlYWQoKSB7CiAgICBpZiAoIXdpbmRvdy5mZXRjaCkgcmV0dXJuOwogICAgLy8gMTIgT2N0IDIwMjYgKENMLTIwMjYxMDEyLTExKTogTGl0ZVNwZWVkIHNl
cnZlZCB0aGUgU3RvcmUgQVBJIGNhcnQgZnJvbSBpdHMgcGFnZSBjYWNoZSAoeC1saXRlc3BlZWQtY2FjaGU6IGhpdCksCiAgICAvLyBzbyBhIG5ldyB2aXNp
dG9yIGNvdWxkIHNlZSBhbm90aGVyIHZpc2l0b3IncyBjb3VudC4gQSB1bmlxdWUgcXVlcnkgcGVyIHJlYWQgbmV2ZXIgbWF0Y2hlcyBhIGNhY2hlZCBjb3B5
LgogICAgZmV0Y2goVVJMICsgJz9fPScgKyBEYXRlLm5vdygpLCB7IGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLCBjYWNoZTogJ25vLXN0b3JlJywgaGVh
ZGVyczogeyAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nIH0gfSkKICAgICAgLnRoZW4oZnVuY3Rpb24gKHIpIHsgcmV0dXJuIHIub2sgPyByLmpzb24o
KSA6IG51bGw7IH0pCiAgICAgIC50aGVuKGZ1bmN0aW9uIChjKSB7IGlmIChjKSBzaG93KGMuaXRlbXNfY291bnQpOyB9KQogICAgICAuY2F0Y2goZnVuY3Rp
b24gKCkge30pOwogIH0KICByZWFkKCk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2VzaG93JywgZnVuY3Rpb24gKGUpIHsgaWYgKGUucGVyc2lz
dGVkKSByZWFkKCk7IH0pOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBmdW5jdGlvbiAoKSB7IGlmIChkb2N1bWVu
dC52aXNpYmlsaXR5U3RhdGUgPT09ICd2aXNpYmxlJykgcmVhZCgpOyB9KTsKfSkoKTsK
Step 1 of 5
When are you staying?
Your package includes a minimum two-night stay by default. Please adjust the dates if you’re planning to stay a longer..
Dates and guests
Check in – check out
Select dates
Mo Tu We Th Fr Sa Su
Select check-in, then check-out · min 2 nights
Guests and rooms
1 adult · 1 room
Adults
18 and over · one race ticket each
Children
2–12 · circuit entry is free
Rooms
Max 4 guests per room
Step 2 of 5
Pick your hotel
← Back to all hotels
Step 3 of 5
Choose a room
Step 4 of 5
Who is travelling?
Names must match the passport or Emirates ID used at check-in and at the circuit gate. Tickets are issued in the lead guest's name.
Step 5 of 5
Check it over
Nothing is charged yet. The cart holds your rate for 20 minutes.
I've checked the guest names and dates, and I accept the ticket and hotel terms. ES Sport can contact me about this booking.